7 KL1, KIMAX1,KJMAX1,PX1,PY1,PDX1,PDY1, &
8 KXOR, KYOR, KDXRATIO, KDYRATIO, &
10 KL2, KIMAX_C_ll,KJMAX_C_ll,PX2,PY2,PDX2,PDY2 )
57 USE mode_modeln_handler
59 USE mode_splitting_ll
, ONLY : split2, def_splitting2
60 USE modd_var_ll
, ONLY :
nproc, ip, ysplitting
61 USE modd_structure_ll
, ONLY : zone_ll, crspd_ll
62 USE modd_parameters
, ONLY : jphext
63 USE mode_tools_ll
, ONLY : intersection
64 USE mode_exchange_ll
, ONLY : send_recv_field
65 USE modi_update_nhalo1d
74 INTEGER,
INTENT(IN) :: KLUOUT
75 INTEGER,
INTENT(IN) :: KL1
76 INTEGER,
INTENT(IN) :: KIMAX1
77 INTEGER,
INTENT(IN) :: KJMAX1
78 REAL,
DIMENSION(KL1),
INTENT(IN) :: PX1
79 REAL,
DIMENSION(KL1),
INTENT(IN) :: PY1
80 REAL,
DIMENSION(KL1),
INTENT(IN) :: PDX1
81 REAL,
DIMENSION(KL1),
INTENT(IN) :: PDY1
82 INTEGER,
INTENT(IN) :: KXOR
83 INTEGER,
INTENT(IN) :: KYOR
84 INTEGER,
INTENT(IN) :: KXSIZE
85 INTEGER,
INTENT(IN) :: KYSIZE
86 INTEGER,
INTENT(IN) :: KDXRATIO
87 INTEGER,
INTENT(IN) :: KDYRATIO
88 INTEGER,
INTENT(IN) :: KL2
89 INTEGER,
INTENT(INOUT) :: KIMAX_C_ll
90 INTEGER,
INTENT(INOUT) :: KJMAX_C_ll
91 REAL,
DIMENSION(:),
ALLOCATABLE,
INTENT(OUT) :: PX2
92 REAL,
DIMENSION(:),
ALLOCATABLE,
INTENT(OUT) :: PY2
93 REAL,
DIMENSION(:),
ALLOCATABLE,
INTENT(OUT) :: PDX2
94 REAL,
DIMENSION(:),
ALLOCATABLE,
INTENT(OUT) :: PDY2
101 REAL,
DIMENSION(:),
ALLOCATABLE :: ZXM1
102 REAL,
DIMENSION(:),
ALLOCATABLE :: ZYM1
103 REAL,
DIMENSION(:),
ALLOCATABLE :: ZXHAT1
104 REAL,
DIMENSION(:),
ALLOCATABLE :: ZYHAT1
105 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZXHAT1_3D, ZYHAT1_3D
109 REAL,
DIMENSION(:),
ALLOCATABLE :: ZXHAT2
110 REAL,
DIMENSION(:),
ALLOCATABLE :: ZYHAT2
111 REAL,
DIMENSION(:),
ALLOCATABLE :: ZXHAT2_F_TMP
112 REAL,
DIMENSION(:),
ALLOCATABLE :: ZYHAT2_F_TMP
113 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: ZXHAT2_F, ZYHAT2_F
120 INTEGER :: JIBOX,JJBOX
123 REAL(KIND=JPRB) :: ZHOOK_HANDLE
126 INTEGER :: IXDOMAINS, IYDOMAINS
128 INTEGER :: IXOR_F_ll, IYOR_F_ll
129 INTEGER :: IXDIM_C, IYDIM_C
130 INTEGER :: IXOR_C_ll, IYOR_C_ll
131 INTEGER :: IXEND_C_ll, IYEND_C_ll
132 INTEGER :: IXOR_C_COARSE_ll, IYOR_C_COARSE_ll
135 REAL,
DIMENSION(KDXRATIO) :: ZCOEFX
136 REAL,
DIMENSION(KDYRATIO) :: ZCOEFY
141 TYPE(zone_ll),
DIMENSION(NPROC) :: TZSPLITTING_C
142 TYPE(zone_ll),
ALLOCATABLE,
DIMENSION(:) :: TZCOARSEFATHER
143 TYPE(zone_ll),
ALLOCATABLE,
DIMENSION(:) :: TZCOARSESONSPLIT
147 TYPE(zone_ll),
ALLOCATABLE,
DIMENSION(:) :: TZSEND, TZRECV
148 TYPE(crspd_ll),
POINTER :: TZCRSPDSEND, TZCRSPDRECV
149 TYPE(crspd_ll),
ALLOCATABLE,
DIMENSION(:),
TARGET :: TZCRSPDSENDTAB, TZCRSPDRECVTAB
164 IF (
lhook)
CALL dr_hook(
'REGULAR_GRID_SPAWN',0,zhook_handle)
166 IF ( kxor+kxsize-1 > u%NIMAX_SURF_ll )
THEN 167 WRITE(kluout,*)
'spawned domain is not contained in the input domain' 168 WRITE(kluout,*)
'IXOR = ', kxor,
' IXSIZE = ', kxsize,&
169 ' with NIMAX(file) = ', u%NIMAX_SURF_ll
170 CALL abor1_sfx(
'REGULAR_GRID_SPAWN: (1) SPAWNED DOMAIN NOT CONTAINED IN INPUT DOMAIN' 172 IF ( kyor+kysize-1 > u%NJMAX_SURF_ll )
THEN 173 WRITE(kluout,*)
'spawned domain is not contained in the input domain' 174 WRITE(kluout,*)
'IYOR = ', kyor,
' IYSIZE = ', kysize,&
175 ' with NJMAX(file) = ', u%NJMAX_SURF_ll
176 CALL abor1_sfx(
'REGULAR_GRID_SPAWN: (2) SPAWNED DOMAIN NOT CONTAINED IN INPUT DOMAIN' 179 IF ( kxor+kxsize-1 > kimax1 )
THEN 180 WRITE(kluout,*)
'spawned domain is not contained in the input domain' 181 WRITE(kluout,*)
'IXOR = ', kxor,
' IXSIZE = ', kxsize,&
182 ' with NIMAX(file) = ', kimax1
183 CALL abor1_sfx(
'REGULAR_GRID_SPAWN: (1) SPAWNED DOMAIN NOT CONTAINED IN INPUT DOMAIN' 185 IF ( kyor+kysize-1 > kjmax1 )
THEN 186 WRITE(kluout,*)
'spawned domain is not contained in the input domain' 187 WRITE(kluout,*)
'IYOR = ', kyor,
' IYSIZE = ', kysize,&
188 ' with NJMAX(file) = ', kjmax1
189 CALL abor1_sfx(
'REGULAR_GRID_SPAWN: (2) SPAWNED DOMAIN NOT CONTAINED IN INPUT DOMAIN' 202 CALL get_or_ll(
"B", ixor_f_ll, iyor_f_ll )
208 ixor_c_coarse_ll = max( ixor_f_ll-1, kxor )
209 iyor_c_coarse_ll = max( iyor_f_ll-1, kyor )
211 ALLOCATE(tzcoarsefather(
nproc))
212 ALLOCATE(tzcoarsesonsplit(
nproc))
216 CALL split2( u%NIMAX_SURF_ll, u%NJMAX_SURF_ll, 1,
nproc,tzcoarsefather
219 tzcoarsefather(j)%NXOR = tzcoarsefather(j)%NXOR - jphext
220 tzcoarsefather(j)%NYOR = tzcoarsefather(j)%NYOR - jphext
221 tzcoarsefather(j)%NXEND = tzcoarsefather(j)%NXEND - jphext
222 tzcoarsefather(j)%NYEND = tzcoarsefather(j)%NYEND - jphext
235 CALL def_splitting2(ixdomains,iydomains, u%NIMAX_SURF_ll, u%NJMAX_SURF_ll
236 CALL split2(kxsize, kysize, 1,
nproc, tzcoarsesonsplit, ysplitting, ixdomains
240 iimax_c = ( tzcoarsesonsplit(ip)%NXEND - tzcoarsesonsplit(ip)%NXOR + 1 )
244 tzcoarsesonsplit(j)%NXOR = tzcoarsesonsplit(j)%NXOR + kxor - jphext -
272 ALLOCATE(tzsend(
nproc))
273 CALL intersection( tzcoarsesonsplit,
nproc, tzcoarsefather(ip), tzsend
277 IF ( tzsend(j)%NUMBER > 0 )
THEN 278 IF (tzsend(j)%NUMBER == 1)
THEN 279 tzsend(j)%MSSGTAG = ip * 10 + 1
281 tzsend(j)%MSSGTAG = ip * 10**(ceiling(log10(
real(tzsend(j)%
number))))
287 IF ( tzsend(j)%NUMBER > 0 )
THEN 288 tzsend(j)%NXOR = tzsend(j)%NXOR - ixor_f_ll + 1
289 tzsend(j)%NXEND = tzsend(j)%NXEND - ixor_f_ll + 1
290 tzsend(j)%NYOR = tzsend(j)%NYOR - iyor_f_ll + 1
291 tzsend(j)%NYEND = tzsend(j)%NYEND - iyor_f_ll + 1
296 IF ( tzsend(j)%NUMBER > 0 )
THEN 304 IF ( tzsend(j)%NUMBER > 0 )
THEN 308 IF ( inbmsg > 0 )
THEN 309 ALLOCATE( tzcrspdsendtab(inbmsg) )
313 IF ( tzsend(j)%NUMBER > 0 )
THEN 315 IF ( tzsend(icard)%NUMBER /= ip )
THEN 316 icarddif = icarddif+1
318 tzcrspdsendtab(icard)%TELT = tzsend(j)
319 IF ( icard == inbmsg )
THEN 320 tzcrspdsendtab(icard)%TNEXT => null()
322 tzcrspdsendtab(icard)%TNEXT => tzcrspdsendtab(icard+1)
327 tzcrspdsendtab(j)%NCARD = icard
328 tzcrspdsendtab(j)%NCARDDIF = icarddif
333 ALLOCATE( tzcrspdsendtab(1) )
336 tzcrspdsendtab(1)%TELT = tzsend(1)
337 tzcrspdsendtab(1)%TNEXT => null()
338 tzcrspdsendtab(1)%NCARD = 0
339 tzcrspdsendtab(1)%NCARDDIF = 0
342 tzcrspdsend => tzcrspdsendtab(1)
344 tzcrspdsend => null()
349 ALLOCATE(tzrecv(
nproc))
350 CALL intersection( tzcoarsefather,
nproc, tzcoarsesonsplit(ip), tzrecv
354 IF ( tzrecv(j)%NUMBER > 0 )
THEN 356 tzrecv(j)%MSSGTAG = tzrecv(j)%NUMBER * 10 + 1
358 tzrecv(j)%MSSGTAG = tzrecv(j)%NUMBER * 10**(ceiling(log10(
real(ip))))
364 IF ( tzrecv(j)%NUMBER > 0 )
THEN 365 tzrecv(j)%NXOR = tzrecv(j)%NXOR - tzcoarsesonsplit(ip)%NXOR + 1
366 tzrecv(j)%NXEND = tzrecv(j)%NXEND - tzcoarsesonsplit(ip)%NXOR + 1
367 tzrecv(j)%NYOR = tzrecv(j)%NYOR - tzcoarsesonsplit(ip)%NYOR + 1
368 tzrecv(j)%NYEND = tzrecv(j)%NYEND - tzcoarsesonsplit(ip)%NYOR + 1
373 IF ( tzrecv(j)%NUMBER > 0 )
THEN 381 IF ( tzrecv(j)%NUMBER > 0 )
THEN 385 IF ( inbmsg > 0 )
THEN 386 ALLOCATE( tzcrspdrecvtab(inbmsg) )
390 IF ( tzrecv(j)%NUMBER > 0 )
THEN 392 IF ( tzrecv(icard)%NUMBER /= ip )
THEN 393 icarddif = icarddif+1
395 tzcrspdrecvtab(icard)%TELT = tzrecv(j)
396 IF ( icard == inbmsg )
THEN 397 tzcrspdrecvtab(icard)%TNEXT => null()
399 tzcrspdrecvtab(icard)%TNEXT => tzcrspdrecvtab(icard+1)
404 tzcrspdrecvtab(j)%NCARD = icard
405 tzcrspdrecvtab(j)%NCARDDIF = icarddif
410 ALLOCATE( tzcrspdrecvtab(1) )
413 tzcrspdrecvtab(1)%TELT = tzsend(1)
414 tzcrspdrecvtab(1)%TNEXT => null()
415 tzcrspdrecvtab(1)%NCARD = 0
416 tzcrspdrecvtab(1)%NCARDDIF = 0
419 tzcrspdrecv => tzcrspdrecvtab(1)
421 tzcrspdrecv => null()
436 ALLOCATE(px2(iimax_c*ijmax_c))
437 ALLOCATE(py2(iimax_c*ijmax_c))
438 ALLOCATE(pdx2(iimax_c*ijmax_c))
439 ALLOCATE(pdy2(iimax_c*ijmax_c))
447 ALLOCATE(zxhat2(iimax_c+1))
448 ALLOCATE(zyhat2(ijmax_c+1))
452 ALLOCATE(zxm1(kimax1))
453 ALLOCATE(zym1(kjmax1))
454 ALLOCATE(zxhat1(kimax1+1))
455 ALLOCATE(zyhat1(kjmax1+1))
457 zxm1(:) = px1(1:kimax1)
459 IF (mod(jl,kimax1)==0) zym1(jl/kimax1) = py1(jl)
469 zxhat1(1) = zxm1(1) - 0.5 * pdx1(1)
470 zxhat1(2) = zxm1(1) + 0.5 * pdx1(1)
472 zxhat1(1) = 1.5 * zxm1(1) - 0.5 * zxm1(2)
474 zxhat1(ji) = 0.5 * zxm1(ji-1) + 0.5 * zxm1(ji)
476 zxhat1(kimax1+1) = 1.5 * zxm1(kimax1) - 0.5 * zxm1(kimax1-1)
480 zyhat1(1) = zym1(1) - 0.5 * pdy1(1)
481 zyhat1(2) = zym1(1) + 0.5 * pdy1(1)
483 zyhat1(1) = 1.5 * zym1(1) - 0.5 * zym1(2)
485 zyhat1(jj) = 0.5 * zym1(jj-1) + 0.5 * zym1(jj)
487 zyhat1(kjmax1+1) = 1.5 * zym1(kjmax1) - 0.5 * zym1(kjmax1-1)
493 ixdim_c = tzcoarsesonsplit(ip)%NXEND-tzcoarsesonsplit(ip)%NXOR+1
494 iydim_c = tzcoarsesonsplit(ip)%NYEND-tzcoarsesonsplit(ip)%NYOR+1
495 ALLOCATE(zxhat2_f(ixdim_c,iydim_c,1))
496 ALLOCATE(zyhat2_f(ixdim_c,iydim_c,1))
497 ALLOCATE(zxhat1_3d(kimax1,kjmax1,1))
498 ALLOCATE(zyhat1_3d(kimax1,kjmax1,1))
504 zxhat1_3d(:,j,1) = zxhat1(1:kimax1)
507 zyhat1_3d(j,:,1) = zyhat1(1:kjmax1)
509 CALL send_recv_field( tzcrspdsend, tzcrspdrecv, zxhat1_3d, zxhat2_f, iinfo_ll
510 CALL send_recv_field( tzcrspdsend, tzcrspdrecv, zyhat1_3d, zyhat2_f, iinfo_ll
515 IF ( tzsend(ip)%NUMBER /= 0 )
THEN 517 zxhat2_f( tzrecv(ip)%NXOR:tzrecv(ip)%NXEND, 1, 1) = zxhat1_3d( tzsend
520 zyhat2_f( 1,tzrecv(ip)%NYOR:tzrecv(ip)%NYEND, 1) = zyhat1_3d( 1,tzsend
526 ALLOCATE( zxhat2_f_tmp(ixdim_c+1) )
527 ALLOCATE( zyhat2_f_tmp(iydim_c+1) )
530 zxhat2_f_tmp(1:ixdim_c) = zxhat2_f(:,1,1)
531 zyhat2_f_tmp(1:iydim_c) = zyhat2_f(1,:,1)
533 CALL def_splitting2(ixdomains,iydomains, u%NIMAX_SURF_ll, u%NJMAX_SURF_ll
534 CALL split2(kxsize, kysize, 1,
nproc, tzcoarsesonsplit, ysplitting, ixdomains
535 CALL update_nhalo1d( 1, zxhat2_f_tmp, kxsize, kysize,tzcoarsesonsplit(ip
537 CALL update_nhalo1d( 1, zyhat2_f_tmp, kxsize, kysize,tzcoarsesonsplit(ip
550 jibox=(ji-1)/kdxratio + kxor
551 zcoef= float(mod(ji-1,kdxratio))/float(kdxratio)
552 zxhat2(ji)=(1.-zcoef)*zxhat1(jibox)+zcoef*zxhat1(jibox+1)
555 zxhat2(iimax_c+1) = zxhat2(iimax_c) + zxhat1(jibox+1) - zxhat1(jibox)
557 zxhat2(iimax_c+1) = 2. * zxhat2(iimax_c) - zxhat2(iimax_c-1)
561 zcoefx(j+1) = float(j)/float(kdxratio)
565 zxhat2((ji-1)*kdxratio+jj)=(1.-zcoefx(jj))*zxhat2_f(ji,1,1)+zcoefx(jj
569 zxhat2(iimax_c+1) = zxhat2(iimax_c) + zxhat2_f(ji,1,1) - zxhat2_f(ji,1
571 IF ( least_ll() )
THEN 572 zxhat2(iimax_c+1) = 2. * zxhat2(iimax_c) - zxhat2(iimax_c-1)
574 zxhat2(iimax_c+1)=(1.-zcoefx(1))*zxhat2_f_tmp(ixdim_c)+zcoefx(1)*zxhat2_f_tmp
583 jjbox=(jj-1)/kdyratio + kyor
584 zcoef= float(mod(jj-1,kdyratio))/float(kdyratio)
585 zyhat2(jj)=(1.-zcoef)*zyhat1(jjbox)+zcoef*zyhat1(jjbox+1)
588 zyhat2(ijmax_c+1) = zyhat2(ijmax_c) + zyhat1(jjbox+1) - zyhat1(jjbox)
590 zyhat2(ijmax_c+1) = 2. * zyhat2(ijmax_c) - zyhat2(ijmax_c-1)
594 zcoefy(j+1) = float(j)/float(kdyratio)
598 zyhat2((ji-1)*kdyratio+jj)=(1.-zcoefy(jj))*zyhat2_f(1,ji,1)+zcoefy(jj
602 zyhat2(ijmax_c+1) = zyhat2(ijmax_c) + zyhat2_f(1,ji,1) - zyhat2_f(1,ji
604 IF ( lnorth_ll() )
THEN 605 zyhat2(ijmax_c+1) = 2. * zyhat2(ijmax_c) - zyhat2(ijmax_c-1)
607 zyhat2(ijmax_c+1)=(1.-zcoefy(1))*zyhat2_f_tmp(iydim_c)+zcoefy(1)*zyhat2_f_tmp
617 DEALLOCATE(zxhat1_3d)
618 DEALLOCATE(zyhat1_3d)
627 jl = (jj-1) * iimax_c + ji
628 px2(jl) = 0.5 * zxhat2(ji) + 0.5 * zxhat2(ji+1)
629 pdx2(jl) = zxhat2(ji+1) - zxhat2(ji)
630 py2(jl) = 0.5 * zyhat2(jj) + 0.5 * zyhat2(jj+1)
631 pdy2(jl) = zyhat2(jj+1) - zyhat2(jj)
643 DEALLOCATE(tzcrspdsendtab)
644 DEALLOCATE(tzcrspdrecvtab)
647 DEALLOCATE(tzcoarsefather)
648 DEALLOCATE(tzcoarsesonsplit)
652 IF (
lhook)
CALL dr_hook(
'REGULAR_GRID_SPAWN',1,zhook_handle)
subroutine regular_grid_spawn(U, KLUOUT,
subroutine abor1_sfx(YTEXT)
integer, parameter nundef