22 use ctlblk_mod, only: num_procs, jend, iup, jsta, idn, mpi_comm_comp, im,&
23 icoords,ibcoords,bufs,ibufs,me,numx, &
24 jsta_2l, jend_2u,ileft,iright,ista_2l,iend_2u,ista,iend,jm,modelname
30 real,
intent(inout) :: a ( ista_2l:iend_2u,jsta_2l:jend_2u )
31 real,
allocatable :: coll(:), colr(:)
32 integer,
allocatable :: icoll(:), icolr(:)
33 integer status(mpi_status_size)
34 integer ierr, jstam1, jendp1,j
35 integer size,ubound,lbound
36 integer msglenl, msglenr
37 integer i,ii,jj, ibl,ibu,jbl,jbu,icc,jcc
41 logical,
parameter :: checkcoords = .false.
57 if ( num_procs <= 1 )
return
61 IF(modelname ==
'GFS')
then
62 if(ifirst .le. 0 .and. me .eq. 0) print *,
' CYCLIC BC APPLIED'
63 if(ileft .eq. mpi_proc_null) iwest=1
64 if(iright .eq. mpi_proc_null) ieast=1
65 if(ileft .eq. mpi_proc_null) ileft=me+(numx-1)
66 if(iright .eq. mpi_proc_null) iright=(me-numx) +1
69 jstam1 = max(jsta_2l,jsta-1)
73 call mpi_sendrecv(a(ista,jend),iend-ista+1,mpi_real,iup,1, &
74 & a(ista,jstam1),iend-ista+1,mpi_real,idn,1, &
75 & mpi_comm_comp,status,ierr)
78 print *,
' problem with first sendrecv in exch, ierr = ',ierr
83 if(ifirst .le. 0)
then
84 call mpi_sendrecv(ibcoords(ista,jend),iend-ista+1,mpi_integer,iup,1, &
85 & ibcoords(ista,jstam1),iend-ista+1,mpi_integer,idn,1, &
86 & mpi_comm_comp,status,ierr)
88 print *,
' problem with second sendrecv in exch, ierr = ',ierr
92 ii=ibcoords(i,jstam1)/10000
93 jj=ibcoords(i,jstam1)-(ii*10000)
94 if(ii .ne. i .or. jj .ne. jstam1 ) print *,
' GWVX JEXCH CHECK FAIL ',ii,jj,ibcoords(i,jstam1),i
103 if(iright .lt. 0) msglenr=1
104 if(ileft .lt. 0) msglenl=1
110 call mpi_barrier(mpi_comm_comp,ierr)
114 call mpi_sendrecv(coll(jsta),msglenl ,mpi_real,ileft,1, &
115 & colr(jsta),msglenr ,mpi_real,iright,1, &
116 & mpi_comm_comp,status,ierr)
118 if ( ierr /= 0 )
then
119 print *,
' problem with third sendrecv in exch, ierr = ',ierr
123 if(ifirst .le. 0)
then
124 call mpi_sendrecv(icoll(jsta),msglenl ,mpi_integer,ileft,1, &
125 & icolr(jsta),msglenr ,mpi_integer,iright,1, &
126 & mpi_comm_comp,status,ierr)
127 if ( ierr /= 0 )
then
128 print *,
' problem with fourth sendrecv in exch, ierr = ',ierr
133 if(iright .ge. 0)
then
137 if(ifirst .le. 0)
then
138 ibcoords(iend+1,j)=icolr(j)
139 ii=ibcoords(iend+1,j)/10000
140 jj=ibcoords( iend+1,j)-(ii*10000)
141 if( j .ne. jj .or. ii .ne. iend+1 .and. ii .ne. im .and. ii .ne. 1) &
142 write(*,921) j,iend+1,ii,jj,ibcoords(iend+1,j),
'IEXCH COORD FAIL j,iend+1,ii,jj,ibcoord '
152 if ( ierr /= 0 )
then
153 print *,
' problem with fifth sendrecv in exch, ierr = ',ierr
156 jendp1 = min(jend+1,jend_2u)
166 call mpi_sendrecv(a(ista,jsta),iend-ista+1,mpi_real,idn,1, &
167 & a(ista,jendp1),iend-ista+1,mpi_real,iup,1, &
168 & mpi_comm_comp,status,ierr)
169 if ( ierr /= 0 )
then
170 print *,
' problem with sixth sendrecv in exch, ierr = ',ierr
174 if (checkcoords)
then
175 if (ifirst .le. 0)
then
176 call mpi_sendrecv(ibcoords(ista,jsta),iend-ista+1,mpi_integer,idn,1, &
177 & ibcoords(ista,jendp1),iend-ista+1,mpi_integer,iup,1, &
178 & mpi_comm_comp,status,ierr)
179 if ( ierr /= 0 )
then
180 print *,
' problem with seventh sendrecv in exch, ierr = ',ierr
188 call mpi_sendrecv(colr(jsta),msglenr ,mpi_real,iright,1 , &
189 & coll(jsta),msglenl ,mpi_real,ileft ,1, &
190 & mpi_comm_comp,status,ierr)
192 if ( ierr /= 0 )
then
193 print *,
' problem with eighth sendrecv in exch, ierr = ',ierr
197 if (ifirst .le. 0)
then
198 call mpi_sendrecv(icolr(jsta),msglenr ,mpi_integer,iright,1 , &
199 & icoll(jsta),msglenl ,mpi_integer,ileft ,1, &
200 & mpi_comm_comp,status,ierr)
201 if ( ierr /= 0 )
then
202 print *,
' problem with ninth sendrecv in exch, ierr = ',ierr
207 if(ileft .ge. 0)
then
211 if(ifirst .le. 0)
then
212 ibcoords(ista-1,j)=icoll(j)
213 ii=ibcoords(ista-1,j)/10000
214 jj=ibcoords( ista-1,j)-(ii*10000)
215 if( j .ne. jj .or. ii .ne. ista-1 .and. ii .ne. im .and. ii .ne. 1) &
216 write(*,921) j,ista-1,ii,jj,ibcoords(ista-1,j),
'EXCH COORD FAIL j,ista-1,ii,jj,ibcoord '
225 if(ifirst .le. 0)
then
228 ii=ibcoords(i,j)/10000
229 jj=ibcoords( i,j)-(ii*10000)
230 if(ii .ne. i .or. jj .ne. j)
write(*,151)
'INFAILED IJ ',i,j,ibcoords(i,j),ibl,jbl,ibu,jbu
248 if(modelname ==
'GFS')
then
256 call mpi_sendrecv(a(iend,jbl ),1, mpi_real,iright,1 , &
257 & a(ibl ,jbl ),1, mpi_real,ileft ,1, &
258 & mpi_comm_comp,status,ierr)
259 if ( ierr /= 0 )
then
260 print *,
' problem with tenth sendrecv in exch, ierr = ',ierr
264 call mpi_sendrecv(a(iend,jbu ),1, mpi_real,iright,1 , &
265 & a(ibl ,jbu ),1, mpi_real,ileft ,1, &
266 & mpi_comm_comp,status,ierr)
268 if ( ierr /= 0 )
then
269 print *,
' problem with eleventh sendrecv in exch, ierr = ',ierr
273 call mpi_sendrecv(a(ista,jbl ),1, mpi_real,ileft ,1, &
274 & a(ibu ,jbl ),1, mpi_real,iright,1, &
275 & mpi_comm_comp,status,ierr)
277 if ( ierr /= 0 )
then
278 print *,
' problem with twelft sendrecv in exch, ierr = ',ierr
282 call mpi_sendrecv(a(ista,jbu ),1, mpi_real,ileft ,1 , &
283 & a(ibu ,jbu ),1, mpi_real,iright,1, &
284 & mpi_comm_comp,status,ierr)
286 if ( ierr /= 0 )
then
287 print *,
' problem with thirteenth sendrecv in exch, ierr = ',ierr
291 139
format(a20,5(i10,i6,i6,
'<>'))
294 if(ifirst .le. 0)
then
295 call mpi_sendrecv(ibcoords(iend,jbl ),1 ,mpi_integer,iright,1 , &
296 & ibcoords(ibl ,jbl ),1 ,mpi_integer,ileft ,1, &
297 & mpi_comm_comp,status,ierr)
299 call mpi_sendrecv(ibcoords(iend,jbu ),1 ,mpi_integer,iright,1, &
300 & ibcoords(ibl ,jbu ),1 ,mpi_integer,ileft ,1, &
301 & mpi_comm_comp,status,ierr)
302 call mpi_sendrecv(ibcoords(ista,jbl ),1 ,mpi_integer,ileft ,1, &
303 & ibcoords(ibu ,jbl ),1 ,mpi_integer,iright,1, &
304 & mpi_comm_comp,status,ierr)
305 call mpi_sendrecv(ibcoords(ista,jbu ),1 ,mpi_integer,ileft ,1 , &
306 & ibcoords(ibu ,jbu ),1 ,mpi_integer,iright,1, &
307 mpi_comm_comp,status,ierr)
313 ii=ibcoords(icc,jcc)/10000
314 jj=ibcoords(icc,jcc)-(ii*10000)
316 if(ii .ne. icc .and. icc .ne. 0)
write(*,151)
' CORNER FAILI ilb ll ',icc,jcc,ibcoords(icc,jcc),ii,jj
317 if( jj .ne. jcc)
write(*,151)
' CORNER FAILJ ilb ll ',icc,jcc,ibcoords(icc,jcc),ii,jj
321 ii=ibcoords(icc,jcc)/10000
322 jj=ibcoords(icc,jcc)-(ii*10000)
323 if(ii .ne. icc .and. icc .ne. im+1 )
write(*,151)
' CORNER FAILI ilb ul ',icc,jcc,ibcoords(icc,jcc),ii,jj
324 if( jj .ne. jcc )
write(*,151)
' CORNER FAILJ ilb ul ',icc,jcc,ibcoords(icc,jcc),ii,jj
328 ii=ibcoords(icc,jcc)/10000
329 jj=ibcoords(icc,jcc)-(ii*10000)
330 if(ii .ne. icc .and. icc .ne. im+1)
write(*,151)
' CORNER FAILI ilb uu ',icc,jcc,ibcoords(icc,jcc),ii,jj
331 if( jj .ne. jcc )
write(*,151)
' CORNER FAILJ ilb ul ',icc,jcc,ibcoords(icc,jcc),ii,jj
335 ii=ibcoords(icc,jcc)/10000.
336 jj=ibcoords(icc,jcc)-(ii*10000)
337 if(ii .ne. icc .and. icc .ne. 0 )
write(*,151)
' CORNER FAILI ilb lu ',icc,jcc,ibcoords(icc,jcc),ii,jj
338 if( jj .ne. jcc )
write(*,151)
' CORNER FAILJ ilb ul ',icc,jcc,ibcoords(icc,jcc),ii,jj
355 ii=ibcoords(i,j)/10000
356 jj=ibcoords( i,j)-(ii*10000)
357 if(ii .ne. i .or. jj .ne. j)
write(*,151)
'GWVX FAILED IJ ',i,j,ibcoords(i,j),ibl,jbl,ibu,jbu
361 151
format(a70,10i10)
368 ii=ibcoords(i,j)/10000
369 jj=ibcoords( i,j)-(ii*10000)
370 if(ii .ne. i .or. jj .ne. j)
write(*,151)
'GWVX FAILEDI JBU IJ ',i,j,ibcoords(i,j),ibl,jbl,ibu,jbu
375 ii=ibcoords(i,j)/10000
376 jj=ibcoords( i,j)-(ii*10000)
377 if(ii .ne. i .or. jj .ne. j)
write(*,151)
'GWVX FAILEDI JBL IJ ',i,j,ibcoords(i,j),ibl,jbl,ibu,jbu
384 ii=ibcoords(i,j)/10000
385 jj=ibcoords( i,j)-(ii*10000)
386 if(ii .ne. i .and. ii .ne. im .or. jj .ne. j)
write(*,151)
'GWVX FAILED IBL IJ ',ii,i,j,ibcoords(i,j),ibl,jbl,ibu,jbu
391 ii=ibcoords(i,j)/10000
392 jj=ibcoords( i,j)-(ii*10000)
393 if(ii .ne. i .and. ii .ne. 1 .or. jj .ne. j)
write(*,151)
'GWVX FAILED IBU ii i j ibcoords ibl,jbl,ibu,jbu',ii,i,j,ibcoords(i,j),ibl,jbl,ibu,jbu
396 if(me .eq. 0)
write(*,*)
' IFIRST CHECK'
402 if ( ierr /= 0 )
then
403 print *,
' problem with second sendrecv in exch, ierr = ',ierr
406 call mpi_barrier(mpi_comm_comp,ierr)
419 use ctlblk_mod, only: num_procs, jend, iup, jsta, idn, &
420 & mpi_comm_comp, im, jsta_2l, jend_2u
426 real,
intent(inout) :: a ( im,jsta_2l:jend_2u )
427 integer status(mpi_status_size)
428 integer ierr, jstam1, jendp1
430 if ( num_procs == 1 )
return
432 jstam1 = max(jsta_2l,jsta-1)
433 call mpi_sendrecv(a(1,jend),im,mpi_real,iup,1, &
434 & a(1,jstam1),im,mpi_real,idn,1, &
435 & mpi_comm_comp,status,ierr)
436 if ( ierr /= 0 )
then
437 print *,
' problem with first sendrecv in exch, ierr = ',ierr
440 jendp1=min(jend+1,jend_2u)
441 call mpi_sendrecv(a(1,jsta),im,mpi_real,idn,1, &
442 & a(1,jendp1),im,mpi_real,iup,1, &
443 & mpi_comm_comp,status,ierr)
444 if ( ierr /= 0 )
then
445 print *,
' problem with second sendrecv in exch, ierr = ',ierr