41 use mpi,
only: mpi_datatype_null
53 integer :: domainid = 0
59 integer :: numnodestoreceive = 0
63 integer,
allocatable :: nodestoreceive(:)
66 integer :: numnodestosend = 0
70 integer,
allocatable :: nodestosend(:)
75 integer :: p1drsendtype_zero = mpi_datatype_null
76 integer :: p1drrecvtype_zero = mpi_datatype_null
79 integer :: p2drsendtype_zero = mpi_datatype_null
80 integer :: p2drrecvtype_zero = mpi_datatype_null
84 integer :: p1drsendtype = mpi_datatype_null
85 integer :: p1drrecvtype = mpi_datatype_null
87 integer :: p2drsendtype1 = mpi_datatype_null
88 integer :: p2drrecvtype1 = mpi_datatype_null
89 integer :: p2drsendtype2 = mpi_datatype_null
90 integer :: p2drrecvtype2 = mpi_datatype_null
117 subroutine finalize(this)
124 if(
allocated(this%nodesToSend))
deallocate(this%nodesToSend)
125 if(
allocated(this%nodesToReceive))
deallocate(this%nodesToReceive)
127 call mpi_type_free(this%p1DRsendType_zero, ierr)
129 call mpi_type_free(this%p1DRrecvType_zero, ierr)
131 call mpi_type_free(this%p2DRsendType_zero, ierr)
133 call mpi_type_free(this%p2DRrecvType_zero, ierr)
135 call mpi_type_free(this%p1DRsendType, ierr)
137 call mpi_type_free(this%p1DRrecvType, ierr)
139 call mpi_type_free(this%p2DRsendType1, ierr)
141 call mpi_type_free(this%p2DRrecvType1, ierr)
143 call mpi_type_free(this%p2DRsendType2, ierr)
145 call mpi_type_free(this%p2DRrecvType2, ierr)
147 end subroutine finalize
159 integer :: dsplSend(this%numNodesToSend)
160 integer :: dsplRecv(this%numNodesToReceive)
163 dsplsend =
ipgl(this%nodesToSend)
164 dsplrecv =
ghostgl(this%nodesToReceive) +
np
167 call mpi_type_create_indexed_block(this%numNodesToSend, 1, dsplsend,
rtype, this%p1DRsendType_zero, ierr)
168 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
169 call mpi_type_commit(this%p1DRsendType_zero,ierr)
170 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
172 call mpi_type_create_indexed_block(this%numNodesToReceive, 1, dsplrecv,
rtype, this%p1DRrecvType_zero, ierr)
173 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
174 call mpi_type_commit(this%p1DRrecvType_zero,ierr)
175 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
178 dsplsend(:) = dsplsend(:) - 1
179 dsplrecv(:) = dsplrecv(:) - 1
182 call mpi_type_create_indexed_block(this%numNodesToSend, 1, dsplsend,
rtype, this%p1DRsendType,ierr)
183 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
184 call mpi_type_commit(this%p1DRsendType,ierr)
185 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
187 call mpi_type_create_indexed_block(this%numNodesToReceive, 1, dsplrecv,
rtype, this%p1DRrecvType,ierr)
188 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
189 call mpi_type_commit(this%p1DRrecvType,ierr)
190 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
196 call mpi_type_create_indexed_block(this%numNodesToSend,
n2nddim, dsplsend,
rtype, this%p2DRsendType_zero,ierr)
197 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
198 call mpi_type_commit(this%p2DRsendType_zero,ierr)
199 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
201 call mpi_type_create_indexed_block(this%numNodesToReceive,
n2nddim, dsplrecv,
rtype, this%p2DRrecvType_zero,ierr)
202 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
203 call mpi_type_commit(this%p2DRrecvType_zero,ierr)
204 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
210 call mpi_type_create_indexed_block(this%numNodesToSend,
n2nddim, dsplsend,
rtype, this%p2DRsendType1,ierr)
211 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
212 call mpi_type_commit(this%p2DRsendType1,ierr)
213 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
215 call mpi_type_create_indexed_block(this%numNodesToReceive,
n2nddim, dsplrecv,
rtype, this%p2DRrecvType1,ierr)
216 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
217 call mpi_type_commit(this%p2DRrecvType1,ierr)
218 if(ierr /= mpi_success)
CALL parallel_abort(
"createMPIType", ierr)
226 integer,
intent(in) :: nconnd
232 if(stat/=0)
CALL abort(
'neighborDomains allocation failure')
256 real(kind=
rkind),
intent(inout) :: u(:)
258 integer :: i, ierr, tag
261 character(len=140) :: errmsg
263 if(
size(u) /=
npa)
then
264 WRITE(errmsg, *)
'size(U)=',
size(u),
' but npa=',
npa
274 if(ierr/=mpi_success)
then
285 if(ierr/=mpi_success)
then
309 real(kind=
rkind),
intent(inout) :: u(:,:)
311 integer :: i, ierr, tag
317 WRITE(740+
iaproc,*)
'PDLIB_exchange2Dreal, step 3'
323 WRITE(740+
iaproc,*)
'PDLIB_exchange2Dreal, step 4'
331 if(ierr/=mpi_success)
then
336 WRITE(740+
iaproc,*)
'PDLIB_exchange2Dreal, step 5'
346 if(ierr/=mpi_success)
then
351 WRITE(740+
iaproc,*)
'PDLIB_exchange2Dreal, step 6'
359 WRITE(740+
iaproc,*)
'PDLIB_exchange2Dreal, step 11'
365 WRITE(740+
iaproc,*)
'PDLIB_exchange2Dreal, step 12'
376 integer,
intent(in) :: second
397 subroutine pdlib_exchange1dreal_zero(U)
403 real(kind=
rkind),
intent(inout) :: u(0:
npa)
405 integer :: i, ierr, tag
408 character(len=200) errstr
438 if(ierr/=mpi_success)
then
454 if(ierr/=mpi_success)
then
464 end subroutine pdlib_exchange1dreal_zero
475 integer :: i, ierr, tag
478 character(len=200) errstr
512 if(ierr/=mpi_success)
then
528 if(ierr/=mpi_success)
then