4 logical,
save :: use_mpi_alloc
5 integer,
parameter :: MaxRequest=200
6 integer,
parameter :: MaxProc=512
7 integer,
parameter :: MaxBufferSize=1024*1024*100
8 integer,
parameter :: ListSize=1000
10 integer,
save :: MaxBufferSize_Used
13 real,
save,
pointer,
dimension(:) :: Buffer
16 integer,
save,
dimension(Listsize) :: Buffer_Pos
17 integer,
save :: Index_Pos
21 real,
dimension(:,:),
pointer :: Field
29 integer :: NbRequest=0
33 type(hallo),
dimension(MaxRequest) :: Hallo
34 integer :: MSG_Request
67 integer :: jj_nb_gather(0:mpi_size-1)
70 buffer_pos(index_pos)=1
73 IF (use_mpi_alloc .AND. using_mpi)
THEN
89 ALLOCATE(buffer(maxbuffersize))
98 pointer(pbuffer,mpi_buffer(maxbuffersize))
101 INTEGER(KIND=MPI_ADDRESS_KIND) :: bs
103 INTEGER(KIND=8) :: bs
111 CALL mpi_alloc_mem(bs,mpi_info_null,pbuffer,ierr)
124 REAL,
DIMENSION(:),
target :: mpi_buffer
139 if (buffer_pos(index_pos)+size>maxbuffersize_used) maxbuffersize_used=buffer_pos(index_pos)+
Size
140 if (buffer_pos(index_pos)+size>maxbuffersize)
then
141 print *,
'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!'
145 if (index_pos>=listsize)
then
146 print *,
'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!'
150 pos=buffer_pos(index_pos)
151 buffer_pos(index_pos+1)=buffer_pos(index_pos)+
Size
152 index_pos=index_pos+1
163 do while (buffer_pos(index_pos)==-1 .and. index_pos>1)
164 index_pos=index_pos-1
178 subroutine init_hallo(Field,Stride,NbLevel,offset,size,NewHallo)
183 real,
dimension(Stride,NbLevel),
target :: field
184 type(hallo) :: newhallo
186 newhallo%Field=>field
187 newhallo%Stride=stride
188 newhallo%NbLevel=nblevel
190 newhallo%offset=offset
200 INTEGER ::
ij,
ll,offset,size,target
201 REAL,
dimension(ij,ll) :: field
202 type(request),
target :: a_request
205 ptr_request=>a_request%RequestSend(
target)
206 ptr_request%NbRequest=ptr_request%NbRequest+1
207 if (ptr_request%NbRequest>=maxrequest)
then
208 print *,
'STOP :: La taille de MaxRequest dans mod_hallo.F90 est trop petite !!!!'
211 call
init_hallo(field,
ij,
ll,offset,
size,ptr_request%Hallo(ptr_request%NbRequest))
220 INTEGER ::
ij,
ll,offset,size,target
221 REAL,
dimension(ij,ll) :: field
222 type(request),
target :: a_request
225 ptr_request=>a_request%RequestRecv(
target)
226 ptr_request%NbRequest=ptr_request%NbRequest+1
228 if (ptr_request%NbRequest>=maxrequest)
then
229 print *,
'STOP :: La taille de MaxRequest dans mod_hallo.F90 est trop petite !!!!'
233 call
init_hallo(field,
ij,
ll,offset,
size,ptr_request%Hallo(ptr_request%NbRequest))
244 REAL,
dimension(ij,ll) :: fields
245 REAL,
dimension(ij,ll) :: fieldr
247 integer,
dimension(0:MPI_Size-1) :: jj_nb_new
248 integer,
dimension(0:MPI_Size-1) :: jj_begin_new,jj_end_new
253 jj_end_new(0)=jj_nb_new(0)
255 jj_begin_new(
i)=jj_end_new(
i-1)+1
256 jj_end_new(
i)=jj_begin_new(
i)+jj_nb_new(
i)-1
260 if (
i /= mpi_rank)
then
261 jjb=max(jj_begin_new(
i),jj_begin)
262 jje=min(jj_end_new(
i),jj_end)
270 jjb=max(jj_begin_new(mpi_rank),jj_begin_para(
i))
271 jje=min(jj_end_new(mpi_rank),jj_end_para(
i))
291 INTEGER ::
ij,
ll,up,down
292 REAL,
dimension(ij,ll) :: fields
293 REAL,
dimension(ij,ll) :: fieldr
295 integer,
dimension(0:MPI_Size-1) :: jj_nb_new
296 integer,
dimension(0:MPI_Size-1) :: jj_begin_new,jj_end_new
301 jj_end_new(0)=jj_nb_new(0)
303 jj_begin_new(
i)=jj_end_new(
i-1)+1
304 jj_end_new(
i)=jj_begin_new(
i)+jj_nb_new(
i)-1
308 jj_begin_new(
i)=max(1,jj_begin_new(
i)-up)
309 jj_end_new(
i)=min(
jjp1,jj_end_new(
i)+down)
313 if (
i /= mpi_rank)
then
314 jjb=max(jj_begin_new(
i),jj_begin)
315 jje=min(jj_end_new(
i),jj_end)
323 jjb=max(jj_begin_new(mpi_rank),jj_begin_para(
i))
324 jje=min(jj_end_new(mpi_rank),jj_end_para(
i))
344 REAL,
DIMENSION(:),
INTENT(IN) :: fields
345 REAL,
DIMENSION(:),
INTENT(OUT) :: fieldr
346 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
347 TYPE(distrib),
INTENT(IN) :: new_dist
348 INTEGER,
OPTIONAL,
INTENT(IN) :: up
349 INTEGER,
OPTIONAL,
INTENT(IN) :: down
350 TYPE(request),
INTENT(INOUT) :: a_request
358 IF (present(up)) halo_up=up
359 IF (present(down)) halo_down=down
361 IF (present(old_dist))
THEN
375 REAL,
DIMENSION(:,:),
INTENT(IN) :: fields
376 REAL,
DIMENSION(:,:),
INTENT(OUT) :: fieldr
377 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
378 TYPE(distrib),
INTENT(IN) :: new_dist
379 INTEGER,
OPTIONAL,
INTENT(IN) :: up
380 INTEGER,
OPTIONAL,
INTENT(IN) :: down
381 TYPE(request),
INTENT(INOUT) :: a_request
390 IF (present(up)) halo_up=up
391 IF (present(down)) halo_down=down
395 IF (present(old_dist))
THEN
409 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: fields
410 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: fieldr
411 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
412 TYPE(distrib),
INTENT(IN) :: new_dist
413 INTEGER,
OPTIONAL,
INTENT(IN) :: up
414 INTEGER,
OPTIONAL,
INTENT(IN) :: down
415 TYPE(request),
INTENT(INOUT) :: a_request
424 IF (present(up)) halo_up=up
425 IF (present(down)) halo_down=down
427 ll=
size(fields,2)*
size(fields,3)
429 IF (present(old_dist))
THEN
445 REAL,
DIMENSION(:,:),
INTENT(IN) :: fields
446 REAL,
DIMENSION(:,:),
INTENT(OUT) :: fieldr
447 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
448 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: new_dist
449 INTEGER,
OPTIONAL,
INTENT(IN) :: up
450 INTEGER,
OPTIONAL,
INTENT(IN) :: down
451 TYPE(request),
INTENT(INOUT) :: a_request
459 IF (present(up)) halo_up=up
460 IF (present(down)) halo_down=down
462 IF (present(old_dist))
THEN
477 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: fields
478 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: fieldr
479 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
480 TYPE(distrib),
INTENT(IN) :: new_dist
481 INTEGER,
OPTIONAL,
INTENT(IN) :: up
482 INTEGER,
OPTIONAL,
INTENT(IN) :: down
483 TYPE(request),
INTENT(INOUT) :: a_request
492 IF (present(up)) halo_up=up
493 IF (present(down)) halo_down=down
497 IF (present(old_dist))
THEN
511 REAL,
DIMENSION(:,:,:,:),
INTENT(IN) :: fields
512 REAL,
DIMENSION(:,:,:,:),
INTENT(OUT) :: fieldr
513 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
514 TYPE(distrib),
INTENT(IN) :: new_dist
515 INTEGER,
OPTIONAL,
INTENT(IN) :: up
516 INTEGER,
OPTIONAL,
INTENT(IN) :: down
517 TYPE(request),
INTENT(INOUT) :: a_request
526 IF (present(up)) halo_up=up
527 IF (present(down)) halo_down=down
529 ll=
size(fields,3)*
size(fields,4)
531 IF (present(old_dist))
THEN
550 REAL,
DIMENSION(:),
INTENT(IN) :: fields
551 REAL,
DIMENSION(:),
INTENT(OUT) :: fieldr
552 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
553 TYPE(distrib),
INTENT(IN) :: new_dist
554 INTEGER,
OPTIONAL,
INTENT(IN) :: up
555 INTEGER,
OPTIONAL,
INTENT(IN) :: down
556 TYPE(request),
INTENT(INOUT) :: a_request
564 IF (present(up)) halo_up=up
565 IF (present(down)) halo_down=down
567 IF (present(old_dist))
THEN
581 REAL,
DIMENSION(:,:),
INTENT(IN) :: fields
582 REAL,
DIMENSION(:,:),
INTENT(OUT) :: fieldr
583 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
584 TYPE(distrib),
INTENT(IN) :: new_dist
585 INTEGER,
OPTIONAL,
INTENT(IN) :: up
586 INTEGER,
OPTIONAL,
INTENT(IN) :: down
587 TYPE(request),
INTENT(INOUT) :: a_request
596 IF (present(up)) halo_up=up
597 IF (present(down)) halo_down=down
601 IF (present(old_dist))
THEN
615 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: fields
616 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: fieldr
617 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
618 TYPE(distrib),
INTENT(IN) :: new_dist
619 INTEGER,
OPTIONAL,
INTENT(IN) :: up
620 INTEGER,
OPTIONAL,
INTENT(IN) :: down
621 TYPE(request),
INTENT(INOUT) :: a_request
630 IF (present(up)) halo_up=up
631 IF (present(down)) halo_down=down
633 ll=
size(fields,2)*
size(fields,3)
635 IF (present(old_dist))
THEN
651 REAL,
DIMENSION(:,:),
INTENT(IN) :: fields
652 REAL,
DIMENSION(:,:),
INTENT(OUT) :: fieldr
653 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
654 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: new_dist
655 INTEGER,
OPTIONAL,
INTENT(IN) :: up
656 INTEGER,
OPTIONAL,
INTENT(IN) :: down
657 TYPE(request),
INTENT(INOUT) :: a_request
665 IF (present(up)) halo_up=up
666 IF (present(down)) halo_down=down
668 IF (present(old_dist))
THEN
682 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: fields
683 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: fieldr
684 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
685 TYPE(distrib),
INTENT(IN) :: new_dist
686 INTEGER,
OPTIONAL,
INTENT(IN) :: up
687 INTEGER,
OPTIONAL,
INTENT(IN) :: down
688 TYPE(request),
INTENT(INOUT) :: a_request
697 IF (present(up)) halo_up=up
698 IF (present(down)) halo_down=down
702 IF (present(old_dist))
THEN
716 REAL,
DIMENSION(:,:,:,:),
INTENT(IN) :: fields
717 REAL,
DIMENSION(:,:,:,:),
INTENT(OUT) :: fieldr
718 TYPE(distrib),
OPTIONAL,
INTENT(IN) :: old_dist
719 TYPE(distrib),
INTENT(IN) :: new_dist
720 INTEGER,
OPTIONAL,
INTENT(IN) :: up
721 INTEGER,
OPTIONAL,
INTENT(IN) :: down
722 TYPE(request),
INTENT(INOUT) :: a_request
731 IF (present(up)) halo_up=up
732 IF (present(down)) halo_down=down
734 ll=
size(fields,3)*
size(fields,4)
736 IF (present(old_dist))
THEN
751 INTEGER ::
ll,up,down
754 REAL,
DIMENSION(old_dist%ijb_u:old_dist%ije_u,ll) :: fields
755 REAL,
DIMENSION(new_dist%ijb_u:new_dist%ije_u,ll) :: fieldr
757 INTEGER,
DIMENSION(0:MPI_Size-1) :: jj_nb_new
758 INTEGER,
DIMENSION(0:MPI_Size-1) :: jj_begin_new,jj_end_new
760 INTEGER ::
i,
l,jje,jjb,ijb,ije
763 jj_begin_new(
i)=max(1,new_dist%jj_begin_para(
i)-up)
764 jj_end_new(
i)=min(
jjp1,new_dist%jj_end_para(
i)+down)
768 IF (
i /= mpi_rank)
THEN
769 jjb=max(jj_begin_new(
i),old_dist%jj_begin)
770 jje=min(jj_end_new(
i),old_dist%jj_end)
776 jjb=max(jj_begin_new(mpi_rank),old_dist%jj_begin_Para(
i))
777 jje=min(jj_end_new(mpi_rank),old_dist%jj_end_Para(
i))
783 jjb=max(jj_begin_new(
i),old_dist%jj_begin)
784 jje=min(jj_end_new(
i),old_dist%jj_end)
789 fieldr(ijb:ije,:)=fields(ijb:ije,:)
804 INTEGER ::
ll,up,down
807 REAL,
DIMENSION(old_dist%ijb_v:old_dist%ije_v,ll) :: fields
808 REAL,
DIMENSION(new_dist%ijb_v:new_dist%ije_v,ll) :: fieldr
810 INTEGER,
DIMENSION(0:MPI_Size-1) :: jj_nb_new
811 INTEGER,
DIMENSION(0:MPI_Size-1) :: jj_begin_new,jj_end_new
813 INTEGER ::
i,
l,jje,jjb,ijb,ije
816 jj_begin_new(
i)=max(1,new_dist%jj_begin_para(
i)-up)
817 jj_end_new(
i)=min(
jjp1,new_dist%jj_end_para(
i)+down)
821 IF (
i /= mpi_rank)
THEN
822 jjb=max(jj_begin_new(
i),old_dist%jj_begin)
823 jje=min(jj_end_new(
i),old_dist%jj_end)
825 IF (jje==
jjp1) jje=jjm
831 jjb=max(jj_begin_new(mpi_rank),old_dist%jj_begin_Para(
i))
832 jje=min(jj_end_new(mpi_rank),old_dist%jj_end_Para(
i))
834 IF (jje==
jjp1) jje=jjm
840 jjb=max(jj_begin_new(
i),old_dist%jj_begin)
841 jje=min(jj_end_new(
i),old_dist%jj_end)
842 IF (jje==
jjp1) jje=jjm
847 fieldr(ijb:ije,
l)=fields(ijb:ije,
l)
867 REAL,
dimension(ij,ll) :: field
868 INTEGER :: sup,sdown,rup,rdown
870 type(hallo),
pointer :: ptrhallo
871 LOGICAL :: sendup,senddown
872 LOGICAL :: recvup,recvdown
933 REAL,
dimension(ijb_u:ije_u,ll) :: field
934 INTEGER :: sup,sdown,rup,rdown
936 type(hallo),
pointer :: ptrhallo
937 LOGICAL :: sendup,senddown
938 LOGICAL :: recvup,recvdown
998 REAL,
dimension(ijb_v:ije_v,ll) :: field
999 INTEGER :: sup,sdown,rup,rdown
1001 type(hallo),
pointer :: ptrhallo
1002 LOGICAL :: sendup,senddown
1003 LOGICAL :: recvup,recvdown
1025 if (sdown.eq.0)
then
1033 if (rdown.eq.0)
then
1064 type(request),
target :: a_request
1066 type(hallo),
pointer :: ptrhallo
1067 integer :: sizebuffer
1068 integer ::
i,rank,
l,
ij,pos,ierr
1070 real,
dimension(:,:),
pointer :: field
1073 do rank=0,mpi_size-1
1075 req=>a_request%RequestSend(rank)
1078 do i=1,req%NbRequest
1079 ptrhallo=>req%Hallo(
i)
1081 DO l=1,ptrhallo%NbLevel
1082 sizebuffer=sizebuffer+ptrhallo%size*iip1
1087 req%BufferSize=sizebuffer
1088 if (req%NbRequest>0)
then
1093 do i=1,req%NbRequest
1094 ptrhallo=>req%Hallo(
i)
1095 offset=(ptrhallo%offset-1)*iip1+1
1096 nb=iip1*ptrhallo%size-1
1097 field=>ptrhallo%Field
1100 do l=1,ptrhallo%NbLevel
1103 buffer(pos+
ij)=field(offset+
ij,
l)
1111 if (sizebuffer>0)
then
1115 call mpi_issend(buffer(req%Pos),sizebuffer,mpi_real_lmdz,rank,a_request%tag+1000*omp_rank, &
1116 comm_lmdz,req%MSG_Request,ierr)
1118 IF (.NOT.using_mpi)
THEN
1119 print *,
'Erreur, echange MPI en mode sequentiel !!!'
1133 do rank=0,mpi_size-1
1135 req=>a_request%RequestRecv(rank)
1138 do i=1,req%NbRequest
1139 ptrhallo=>req%Hallo(
i)
1142 DO l=1,ptrhallo%NbLevel
1143 sizebuffer=sizebuffer+ptrhallo%size*iip1
1148 req%BufferSize=sizebuffer
1150 if (req%NbRequest>0)
then
1153 if (sizebuffer>0)
then
1158 call mpi_irecv(buffer(req%Pos),sizebuffer,mpi_real_lmdz,rank,a_request%tag+1000*omp_rank, &
1159 comm_lmdz,req%MSG_Request,ierr)
1161 IF (.NOT.using_mpi)
THEN
1162 print *,
'Erreur, echange MPI en mode sequentiel !!!'
1188 type(request),
target :: a_request
1190 type(hallo),
pointer :: ptrhallo
1191 integer,
dimension(2*mpi_size) :: tabrequest
1193 integer,
dimension(MPI_STATUS_SIZE,2*mpi_size) :: tabstatus
1195 integer,
dimension(1,2*mpi_size) :: tabstatus
1197 integer :: nbrequest
1198 integer ::
i,rank,pos,
ij,
l,ierr
1204 do rank=0,mpi_size-1
1205 req=>a_request%RequestSend(rank)
1206 if (req%NbRequest>0 .AND. req%BufferSize > 0)
then
1207 nbrequest=nbrequest+1
1208 tabrequest(nbrequest)=req%MSG_Request
1212 do rank=0,mpi_size-1
1213 req=>a_request%RequestRecv(rank)
1214 if (req%NbRequest>0 .AND. req%BufferSize > 0 )
then
1215 nbrequest=nbrequest+1
1216 tabrequest(nbrequest)=req%MSG_Request
1220 if (nbrequest>0)
then
1226 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
1232 do rank=0,mpi_size-1
1233 req=>a_request%RequestRecv(rank)
1234 if (req%NbRequest>0)
then
1236 do i=1,req%NbRequest
1237 ptrhallo=>req%Hallo(
i)
1238 offset=(ptrhallo%offset-1)*iip1+1
1239 nb=iip1*ptrhallo%size-1
1242 do l=1,ptrhallo%NbLevel
1245 ptrhallo%Field(offset+
ij,
l)=buffer(pos+
ij)
1255 do rank=0,mpi_size-1
1256 req=>a_request%RequestSend(rank)
1257 if (req%NbRequest>0)
then
1263 do rank=0,mpi_size-1
1264 req=>a_request%RequestRecv(rank)
1265 if (req%NbRequest>0)
then
1281 type(request),
target :: a_request
1283 type(hallo),
pointer :: ptrhallo
1284 integer,
dimension(mpi_size) :: tabrequest
1286 integer,
dimension(MPI_STATUS_SIZE,mpi_size) :: tabstatus
1288 integer,
dimension(1,mpi_size) :: tabstatus
1290 integer :: nbrequest
1291 integer ::
i,rank,pos,
ij,
l,ierr
1296 do rank=0,mpi_size-1
1297 req=>a_request%RequestSend(rank)
1298 if (req%NbRequest>0)
then
1299 nbrequest=nbrequest+1
1300 tabrequest(nbrequest)=req%MSG_Request
1305 if (nbrequest>0 .AND. req%BufferSize > 0 )
THEN
1311 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
1319 do rank=0,mpi_size-1
1320 req=>a_request%RequestSend(rank)
1321 if (req%NbRequest>0)
then
1338 type(request),
target :: a_request
1340 type(hallo),
pointer :: ptrhallo
1341 integer,
dimension(mpi_size) :: tabrequest
1343 integer,
dimension(MPI_STATUS_SIZE,mpi_size) :: tabstatus
1345 integer,
dimension(1,mpi_size) :: tabstatus
1347 integer :: nbrequest
1348 integer ::
i,rank,pos,
ij,
l,ierr
1349 integer :: offset,nb
1354 do rank=0,mpi_size-1
1355 req=>a_request%RequestRecv(rank)
1356 if (req%NbRequest>0 .AND. req%BufferSize > 0 )
then
1357 nbrequest=nbrequest+1
1358 tabrequest(nbrequest)=req%MSG_Request
1363 if (nbrequest>0)
then
1369 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
1376 do rank=0,mpi_size-1
1377 req=>a_request%RequestRecv(rank)
1378 if (req%NbRequest>0)
then
1380 do i=1,req%NbRequest
1381 ptrhallo=>req%Hallo(
i)
1382 offset=(ptrhallo%offset-1)*iip1+1
1383 nb=iip1*ptrhallo%size-1
1385 do l=1,ptrhallo%NbLevel
1388 ptrhallo%Field(offset+
ij,
l)=buffer(pos+
ij)
1398 do rank=0,mpi_size-1
1399 req=>a_request%RequestRecv(rank)
1400 if (req%NbRequest>0)
then
1417 REAL,
dimension(ij,ll) :: fields
1418 REAL,
dimension(ij,ll) :: fieldr
1419 integer,
dimension(0:MPI_Size-1) :: jj_nb_new
1420 integer,
dimension(0:MPI_Size-1) :: jj_begin_new,jj_end_new
1422 integer ::
i,jje,jjb,ijb,ije
1425 jj_end_new(0)=jj_nb_new(0)
1427 jj_begin_new(
i)=jj_end_new(
i-1)+1
1428 jj_end_new(
i)=jj_begin_new(
i)+jj_nb_new(
i)-1
1431 jjb=max(jj_begin,jj_begin_new(mpi_rank))
1432 jje=min(jj_end,jj_end_new(mpi_rank))
1433 if (
ij==
ip1jm) jje=min(jje,jjm)
1435 if (jje >= jjb)
then
1441 fieldr(ijb:ije,
l)=fields(ijb:ije,
l)
1454 INTEGER ::
ij,
ll,up,down
1455 REAL,
dimension(ij,ll) :: fields
1456 REAL,
dimension(ij,ll) :: fieldr
1457 integer,
dimension(0:MPI_Size-1) :: jj_nb_new
1458 integer,
dimension(0:MPI_Size-1) :: jj_begin_new,jj_end_new
1460 integer ::
i,jje,jjb,ijb,ije,
l
1464 jj_end_new(0)=jj_nb_new(0)
1466 jj_begin_new(
i)=jj_end_new(
i-1)+1
1467 jj_end_new(
i)=jj_begin_new(
i)+jj_nb_new(
i)-1
1471 jjb=max(jj_begin,jj_begin_new(mpi_rank)-up)
1472 jje=min(jj_end,jj_end_new(mpi_rank)+down)
1473 if (
ij==
ip1jm) jje=min(jje,jjm)
1476 if (jje >= jjb)
then
1482 fieldr(ijb:ije,
l)=fields(ijb:ije,
l)
1493 real :: field_loc(ijb_u:ije_u,
ll)
1495 type(request) :: request_gather
1501 field_glo(ij_begin:ij_end,
l)=field_loc(ij_begin:ij_end,
l)
1516 real :: field_loc(ijb_v:ije_v,
ll)
1518 type(request) :: request_gather
1525 if (pole_sud) ije=ij_end-iip1
1529 field_glo(ijb:ije,
l)=field_loc(ijb:ije,
l)
1545 real :: field_loc(ijb_u:ije_u,
ll)
1546 type(request) :: request_gather
1569 field_loc(ij_begin:ij_end,
l)=field_glo(ij_begin:ij_end,
l)
1579 real :: field_loc(ijb_v:ije_v,
ll)
1580 type(request) :: request_gather
1582 integer :: ijb,ije,
l
1602 if (pole_sud) ije=ij_end-iip1
1606 field_loc(ijb:ije,
l)=field_glo(ijb:ije,
l)