13 real,
save,
pointer,
dimension(:) ::
buffer
21 real,
dimension(:,:),
pointer :: field
29 integer :: nbrequest=0
30 integer :: nbrequestmax=0
35 integer :: msg_request
69 integer :: jj_nb_gather(0:
mpi_size-1)
111 INTEGER(KIND=MPI_ADDRESS_KIND) :: BS
113 INTEGER(KIND=8) :: BS
121 CALL mpi_alloc_mem(bs,mpi_info_null,pbuffer,ierr)
134 REAL,
DIMENSION(:),
target :: MPI_Buffer
151 print *,
'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!'
156 print *,
'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!'
179 subroutine settag(a_request,tag)
188 subroutine new_hallo(Field,Stride,NbLevel,offset,size,Ptr_request)
193 real,
dimension(Stride,NbLevel),
target :: Field
195 type(
hallo),
POINTER :: NewHallos(:),HalloSwitch(:), NewHallo
197 ptr_request%NbRequest=ptr_request%NbRequest+1
198 IF(ptr_request%NbRequestMax==0)
THEN
199 ptr_request%NbRequestMax=10
200 ALLOCATE(ptr_request%Hallo(ptr_request%NbRequestMax))
201 ELSE IF ( ptr_request%NbRequest > ptr_request%NbRequestMax)
THEN
202 ptr_request%NbRequestMax=int(ptr_request%NbRequestMax*1.2)
203 ALLOCATE(newhallos(ptr_request%NbRequestMax))
204 newhallos(1:ptr_request%NbRequest-1)=ptr_request%hallo(1:ptr_request%NbRequest-1)
205 halloswitch=>ptr_request%hallo
206 ptr_request%hallo=>newhallos
207 DEALLOCATE(halloswitch)
210 newhallo=>ptr_request%hallo(ptr_request%NbRequest)
212 newhallo%Field=>field
213 newhallo%Stride=stride
214 newhallo%NbLevel=nblevel
216 newhallo%offset=offset
225 INTEGER :: ij,ll,offset,size,target
226 REAL,
dimension(ij,ll) :: Field
227 type(
request),
target :: a_request
230 ptr_request=>a_request%RequestSend(
target)
232 call new_hallo(field,ij,ll,offset,
size,ptr_request)
241 INTEGER :: ij,ll,offset,size,target
242 REAL,
dimension(ij,ll) :: Field
243 type(
request),
target :: a_request
246 ptr_request=>a_request%RequestRecv(
target)
248 call new_hallo(field,ij,ll,offset,
size,ptr_request)
259 REAL,
dimension(ij,ll) :: FieldS
260 REAL,
dimension(ij,ll) :: FieldR
262 integer,
dimension(0:MPI_Size-1) :: jj_Nb_New
263 integer,
dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
268 jj_end_new(0)=jj_nb_new(0)
270 jj_begin_new(i)=jj_end_new(i-1)+1
271 jj_end_new(i)=jj_begin_new(i)+jj_nb_new(i)-1
277 jje=min(jj_end_new(i),
jj_end)
306 INTEGER :: ij,ll,Up,Down
307 REAL,
dimension(ij,ll) :: FieldS
308 REAL,
dimension(ij,ll) :: FieldR
310 integer,
dimension(0:MPI_Size-1) :: jj_Nb_New
311 integer,
dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
316 jj_end_new(0)=jj_nb_new(0)
318 jj_begin_new(i)=jj_end_new(i-1)+1
319 jj_end_new(i)=jj_begin_new(i)+jj_nb_new(i)-1
323 jj_begin_new(i)=max(1,jj_begin_new(i)-up)
324 jj_end_new(i)=min(
jjp1,jj_end_new(i)+down)
330 jje=min(jj_end_new(i),
jj_end)
359 REAL,
DIMENSION(:),
INTENT(IN) :: FieldS
360 REAL,
DIMENSION(:),
INTENT(OUT) :: FieldR
361 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
362 TYPE(
distrib),
INTENT(IN) :: new_dist
363 INTEGER,
OPTIONAL,
INTENT(IN) :: up
364 INTEGER,
OPTIONAL,
INTENT(IN) :: down
365 TYPE(
request),
INTENT(INOUT) :: a_request
373 IF (
PRESENT(up)) halo_up=up
374 IF (
PRESENT(down)) halo_down=down
376 IF (
PRESENT(old_dist))
THEN
390 REAL,
DIMENSION(:,:),
INTENT(IN) :: FieldS
391 REAL,
DIMENSION(:,:),
INTENT(OUT) :: FieldR
392 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
393 TYPE(
distrib),
INTENT(IN) :: new_dist
394 INTEGER,
OPTIONAL,
INTENT(IN) :: up
395 INTEGER,
OPTIONAL,
INTENT(IN) :: down
396 TYPE(
request),
INTENT(INOUT) :: a_request
405 IF (
PRESENT(up)) halo_up=up
406 IF (
PRESENT(down)) halo_down=down
410 IF (
PRESENT(old_dist))
THEN
424 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: FieldS
425 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: FieldR
426 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
427 TYPE(
distrib),
INTENT(IN) :: new_dist
428 INTEGER,
OPTIONAL,
INTENT(IN) :: up
429 INTEGER,
OPTIONAL,
INTENT(IN) :: down
430 TYPE(
request),
INTENT(INOUT) :: a_request
439 IF (
PRESENT(up)) halo_up=up
440 IF (
PRESENT(down)) halo_down=down
442 ll=
size(fields,2)*
size(fields,3)
444 IF (
PRESENT(old_dist))
THEN
460 REAL,
DIMENSION(:,:),
INTENT(IN) :: FieldS
461 REAL,
DIMENSION(:,:),
INTENT(OUT) :: FieldR
462 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
463 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: new_dist
464 INTEGER,
OPTIONAL,
INTENT(IN) :: up
465 INTEGER,
OPTIONAL,
INTENT(IN) :: down
466 TYPE(
request),
INTENT(INOUT) :: a_request
474 IF (
PRESENT(up)) halo_up=up
475 IF (
PRESENT(down)) halo_down=down
477 IF (
PRESENT(old_dist))
THEN
492 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: FieldS
493 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: FieldR
494 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
495 TYPE(
distrib),
INTENT(IN) :: new_dist
496 INTEGER,
OPTIONAL,
INTENT(IN) :: up
497 INTEGER,
OPTIONAL,
INTENT(IN) :: down
498 TYPE(
request),
INTENT(INOUT) :: a_request
507 IF (
PRESENT(up)) halo_up=up
508 IF (
PRESENT(down)) halo_down=down
512 IF (
PRESENT(old_dist))
THEN
526 REAL,
DIMENSION(:,:,:,:),
INTENT(IN) :: FieldS
527 REAL,
DIMENSION(:,:,:,:),
INTENT(OUT) :: FieldR
528 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
529 TYPE(
distrib),
INTENT(IN) :: new_dist
530 INTEGER,
OPTIONAL,
INTENT(IN) :: up
531 INTEGER,
OPTIONAL,
INTENT(IN) :: down
532 TYPE(
request),
INTENT(INOUT) :: a_request
541 IF (
PRESENT(up)) halo_up=up
542 IF (
PRESENT(down)) halo_down=down
544 ll=
size(fields,3)*
size(fields,4)
546 IF (
PRESENT(old_dist))
THEN
565 REAL,
DIMENSION(:),
INTENT(IN) :: FieldS
566 REAL,
DIMENSION(:),
INTENT(OUT) :: FieldR
567 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
568 TYPE(
distrib),
INTENT(IN) :: new_dist
569 INTEGER,
OPTIONAL,
INTENT(IN) :: up
570 INTEGER,
OPTIONAL,
INTENT(IN) :: down
571 TYPE(
request),
INTENT(INOUT) :: a_request
579 IF (
PRESENT(up)) halo_up=up
580 IF (
PRESENT(down)) halo_down=down
582 IF (
PRESENT(old_dist))
THEN
596 REAL,
DIMENSION(:,:),
INTENT(IN) :: FieldS
597 REAL,
DIMENSION(:,:),
INTENT(OUT) :: FieldR
598 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
599 TYPE(
distrib),
INTENT(IN) :: new_dist
600 INTEGER,
OPTIONAL,
INTENT(IN) :: up
601 INTEGER,
OPTIONAL,
INTENT(IN) :: down
602 TYPE(
request),
INTENT(INOUT) :: a_request
611 IF (
PRESENT(up)) halo_up=up
612 IF (
PRESENT(down)) halo_down=down
616 IF (
PRESENT(old_dist))
THEN
630 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: FieldS
631 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: FieldR
632 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
633 TYPE(
distrib),
INTENT(IN) :: new_dist
634 INTEGER,
OPTIONAL,
INTENT(IN) :: up
635 INTEGER,
OPTIONAL,
INTENT(IN) :: down
636 TYPE(
request),
INTENT(INOUT) :: a_request
645 IF (
PRESENT(up)) halo_up=up
646 IF (
PRESENT(down)) halo_down=down
648 ll=
size(fields,2)*
size(fields,3)
650 IF (
PRESENT(old_dist))
THEN
666 REAL,
DIMENSION(:,:),
INTENT(IN) :: FieldS
667 REAL,
DIMENSION(:,:),
INTENT(OUT) :: FieldR
668 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
669 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: new_dist
670 INTEGER,
OPTIONAL,
INTENT(IN) :: up
671 INTEGER,
OPTIONAL,
INTENT(IN) :: down
672 TYPE(
request),
INTENT(INOUT) :: a_request
680 IF (
PRESENT(up)) halo_up=up
681 IF (
PRESENT(down)) halo_down=down
683 IF (
PRESENT(old_dist))
THEN
697 REAL,
DIMENSION(:,:,:),
INTENT(IN) :: FieldS
698 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: FieldR
699 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
700 TYPE(
distrib),
INTENT(IN) :: new_dist
701 INTEGER,
OPTIONAL,
INTENT(IN) :: up
702 INTEGER,
OPTIONAL,
INTENT(IN) :: down
703 TYPE(
request),
INTENT(INOUT) :: a_request
712 IF (
PRESENT(up)) halo_up=up
713 IF (
PRESENT(down)) halo_down=down
717 IF (
PRESENT(old_dist))
THEN
731 REAL,
DIMENSION(:,:,:,:),
INTENT(IN) :: FieldS
732 REAL,
DIMENSION(:,:,:,:),
INTENT(OUT) :: FieldR
733 TYPE(
distrib),
OPTIONAL,
INTENT(IN) :: old_dist
734 TYPE(
distrib),
INTENT(IN) :: new_dist
735 INTEGER,
OPTIONAL,
INTENT(IN) :: up
736 INTEGER,
OPTIONAL,
INTENT(IN) :: down
737 TYPE(
request),
INTENT(INOUT) :: a_request
746 IF (
PRESENT(up)) halo_up=up
747 IF (
PRESENT(down)) halo_down=down
749 ll=
size(fields,3)*
size(fields,4)
751 IF (
PRESENT(old_dist))
THEN
766 INTEGER :: ll,Up,Down
769 REAL,
DIMENSION(old_dist%ijb_u:old_dist%ije_u,ll) :: FieldS
770 REAL,
DIMENSION(new_dist%ijb_u:new_dist%ije_u,ll) :: FieldR
772 INTEGER,
DIMENSION(0:MPI_Size-1) :: jj_Nb_New
773 INTEGER,
DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
775 INTEGER ::i,l,jje,jjb,ijb,ije
778 jj_begin_new(i)=max(1,new_dist%jj_begin_para(i)-up)
779 jj_end_new(i)=min(
jjp1,new_dist%jj_end_para(i)+down)
784 jjb=max(jj_begin_new(i),old_dist%jj_begin)
785 jje=min(jj_end_new(i),old_dist%jj_end)
788 CALL register_sendfield(fields,old_dist%ijnb_u,ll,jjb-old_dist%jjb_u+1,jje-jjb+1,i,a_request)
791 jjb=max(jj_begin_new(
mpi_rank),old_dist%jj_begin_Para(i))
792 jje=min(jj_end_new(
mpi_rank),old_dist%jj_end_Para(i))
795 CALL register_recvfield(fieldr,new_dist%ijnb_u,ll,jjb-new_dist%jjb_u+1,jje-jjb+1,i,a_request)
798 jjb=max(jj_begin_new(i),old_dist%jj_begin)
799 jje=min(jj_end_new(i),old_dist%jj_end)
804 fieldr(ijb:ije,l)=fields(ijb:ije,l)
819 INTEGER :: ll,Up,Down
822 REAL,
DIMENSION(old_dist%ijb_v:old_dist%ije_v,ll) :: FieldS
823 REAL,
DIMENSION(new_dist%ijb_v:new_dist%ije_v,ll) :: FieldR
825 INTEGER,
DIMENSION(0:MPI_Size-1) :: jj_Nb_New
826 INTEGER,
DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
828 INTEGER ::i,l,jje,jjb,ijb,ije
831 jj_begin_new(i)=max(1,new_dist%jj_begin_para(i)-up)
832 jj_end_new(i)=min(
jjp1,new_dist%jj_end_para(i)+down)
837 jjb=max(jj_begin_new(i),old_dist%jj_begin)
838 jje=min(jj_end_new(i),old_dist%jj_end)
840 IF (jje==
jjp1) jje=jjm
843 CALL register_sendfield(fields,old_dist%ijnb_v,ll,jjb-old_dist%jjb_v+1,jje-jjb+1,i,a_request)
846 jjb=max(jj_begin_new(
mpi_rank),old_dist%jj_begin_Para(i))
847 jje=min(jj_end_new(
mpi_rank),old_dist%jj_end_Para(i))
849 IF (jje==
jjp1) jje=jjm
852 CALL register_recvfield(fieldr,new_dist%ijnb_v,ll,jjb-new_dist%jjb_v+1,jje-jjb+1,i,a_request)
855 jjb=max(jj_begin_new(i),old_dist%jj_begin)
856 jje=min(jj_end_new(i),old_dist%jj_end)
857 IF (jje==
jjp1) jje=jjm
862 fieldr(ijb:ije,l)=fields(ijb:ije,l)
874 subroutine register_hallo(Field,ij,ll,RUp,Rdown,SUp,SDown,a_request)
882 REAL,
dimension(ij,ll) :: Field
883 INTEGER :: Sup,Sdown,rup,rdown
885 type(
hallo),
pointer :: PtrHallo
886 LOGICAL :: SendUp,SendDown
887 LOGICAL :: RecvUp,RecvDown
948 REAL,
dimension(ijb_u:ije_u,ll) :: Field
949 INTEGER :: Sup,Sdown,rup,rdown
951 type(
hallo),
pointer :: PtrHallo
952 LOGICAL :: SendUp,SendDown
953 LOGICAL :: RecvUp,RecvDown
1013 REAL,
dimension(ijb_v:ije_v,ll) :: Field
1014 INTEGER :: Sup,Sdown,rup,rdown
1016 type(
hallo),
pointer :: PtrHallo
1017 LOGICAL :: SendUp,SendDown
1018 LOGICAL :: RecvUp,RecvDown
1040 if (sdown.eq.0)
then
1048 if (rdown.eq.0)
then
1079 type(
request),
target :: a_request
1081 type(
hallo),
pointer :: PtrHallo
1082 integer :: SizeBuffer
1083 integer :: i,rank,l,ij,Pos,ierr
1085 real,
dimension(:,:),
pointer :: Field
1090 req=>a_request%RequestSend(rank)
1093 do i=1,req%NbRequest
1094 ptrhallo=>req%Hallo(i)
1096 DO l=1,ptrhallo%NbLevel
1097 sizebuffer=sizebuffer+ptrhallo%size*iip1
1102 req%BufferSize=sizebuffer
1103 if (req%NbRequest>0)
then
1108 do i=1,req%NbRequest
1109 ptrhallo=>req%Hallo(i)
1110 offset=(ptrhallo%offset-1)*iip1+1
1111 nb=iip1*ptrhallo%size-1
1112 field=>ptrhallo%Field
1115 do l=1,ptrhallo%NbLevel
1118 buffer(pos+ij)=field(offset+ij,l)
1126 if (sizebuffer>0)
then
1130 call mpi_issend(
buffer(req%Pos),sizebuffer,mpi_real_lmdz,rank,a_request%tag+1000*
omp_rank, &
1131 comm_lmdz,req%MSG_Request,ierr)
1134 print *,
'Erreur, echange MPI en mode sequentiel !!!'
1150 req=>a_request%RequestRecv(rank)
1153 do i=1,req%NbRequest
1154 ptrhallo=>req%Hallo(i)
1157 DO l=1,ptrhallo%NbLevel
1158 sizebuffer=sizebuffer+ptrhallo%size*iip1
1163 req%BufferSize=sizebuffer
1165 if (req%NbRequest>0)
then
1168 if (sizebuffer>0)
then
1173 call mpi_irecv(
buffer(req%Pos),sizebuffer,mpi_real_lmdz,rank,a_request%tag+1000*
omp_rank, &
1174 comm_lmdz,req%MSG_Request,ierr)
1177 print *,
'Erreur, echange MPI en mode sequentiel !!!'
1203 type(
request),
target :: a_request
1205 type(
hallo),
pointer :: PtrHallo
1206 integer,
dimension(2*mpi_size) :: TabRequest
1208 integer,
dimension(MPI_STATUS_SIZE,2*mpi_size) :: TabStatus
1210 integer,
dimension(1,2*mpi_size) :: TabStatus
1212 integer :: NbRequest
1213 integer :: i,rank,pos,ij,l,ierr
1220 req=>a_request%RequestSend(rank)
1221 if (req%NbRequest>0 .AND. req%BufferSize > 0)
then
1222 nbrequest=nbrequest+1
1223 tabrequest(nbrequest)=req%MSG_Request
1228 req=>a_request%RequestRecv(rank)
1229 if (req%NbRequest>0 .AND. req%BufferSize > 0 )
then
1230 nbrequest=nbrequest+1
1231 tabrequest(nbrequest)=req%MSG_Request
1235 if (nbrequest>0)
then
1241 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
1248 req=>a_request%RequestRecv(rank)
1249 if (req%NbRequest>0)
then
1251 do i=1,req%NbRequest
1252 ptrhallo=>req%Hallo(i)
1253 offset=(ptrhallo%offset-1)*iip1+1
1254 nb=iip1*ptrhallo%size-1
1257 do l=1,ptrhallo%NbLevel
1260 ptrhallo%Field(offset+ij,l)=
buffer(pos+ij)
1271 req=>a_request%RequestSend(rank)
1272 if (req%NbRequest>0)
then
1279 req=>a_request%RequestRecv(rank)
1280 if (req%NbRequest>0)
then
1296 type(
request),
target :: a_request
1298 type(
hallo),
pointer :: PtrHallo
1299 integer,
dimension(mpi_size) :: TabRequest
1301 integer,
dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus
1303 integer,
dimension(1,mpi_size) :: TabStatus
1305 integer :: NbRequest
1306 integer :: i,rank,pos,ij,l,ierr
1312 req=>a_request%RequestSend(rank)
1313 if (req%NbRequest>0)
then
1314 nbrequest=nbrequest+1
1315 tabrequest(nbrequest)=req%MSG_Request
1320 if (nbrequest>0 .AND. req%BufferSize > 0 )
THEN
1326 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
1335 req=>a_request%RequestSend(rank)
1336 if (req%NbRequest>0)
then
1353 type(
request),
target :: a_request
1355 type(
hallo),
pointer :: PtrHallo
1356 integer,
dimension(mpi_size) :: TabRequest
1358 integer,
dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus
1360 integer,
dimension(1,mpi_size) :: TabStatus
1362 integer :: NbRequest
1363 integer :: i,rank,pos,ij,l,ierr
1364 integer :: offset,Nb
1370 req=>a_request%RequestRecv(rank)
1371 if (req%NbRequest>0 .AND. req%BufferSize > 0 )
then
1372 nbrequest=nbrequest+1
1373 tabrequest(nbrequest)=req%MSG_Request
1378 if (nbrequest>0)
then
1384 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
1392 req=>a_request%RequestRecv(rank)
1393 if (req%NbRequest>0)
then
1395 do i=1,req%NbRequest
1396 ptrhallo=>req%Hallo(i)
1397 offset=(ptrhallo%offset-1)*iip1+1
1398 nb=iip1*ptrhallo%size-1
1400 do l=1,ptrhallo%NbLevel
1403 ptrhallo%Field(offset+ij,l)=
buffer(pos+ij)
1414 req=>a_request%RequestRecv(rank)
1415 if (req%NbRequest>0)
then
1426 subroutine copyfield(FieldS,FieldR,ij,ll,jj_Nb_New)
1432 REAL,
dimension(ij,ll) :: FieldS
1433 REAL,
dimension(ij,ll) :: FieldR
1434 integer,
dimension(0:MPI_Size-1) :: jj_Nb_New
1435 integer,
dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
1437 integer ::i,jje,jjb,ijb,ije
1440 jj_end_new(0)=jj_nb_new(0)
1442 jj_begin_new(i)=jj_end_new(i-1)+1
1443 jj_end_new(i)=jj_begin_new(i)+jj_nb_new(i)-1
1448 if (ij==
ip1jm) jje=min(jje,jjm)
1450 if (jje >= jjb)
then
1456 fieldr(ijb:ije,l)=fields(ijb:ije,l)
1469 INTEGER :: ij,ll,Up,Down
1470 REAL,
dimension(ij,ll) :: FieldS
1471 REAL,
dimension(ij,ll) :: FieldR
1472 integer,
dimension(0:MPI_Size-1) :: jj_Nb_New
1473 integer,
dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
1475 integer ::i,jje,jjb,ijb,ije,l
1479 jj_end_new(0)=jj_nb_new(0)
1481 jj_begin_new(i)=jj_end_new(i-1)+1
1482 jj_end_new(i)=jj_begin_new(i)+jj_nb_new(i)-1
1488 if (ij==
ip1jm) jje=min(jje,jjm)
1491 if (jje >= jjb)
then
1497 fieldr(ijb:ije,l)=fields(ijb:ije,l)
1510 type(
request) :: request_gather
1532 real :: field_glo(
ip1jm,ll)
1533 type(
request) :: request_gather
1544 field_glo(ijb:ije,l)=field_loc(ijb:ije,l)
1561 type(
request) :: request_gather
1595 type(
request) :: request_gather
1597 integer :: ijb,ije,l
1621 field_loc(ijb:ije,l)=field_glo(ijb:ije,l)
integer, save maxbuffersize_used
subroutine associate_buffer(MPI_Buffer)
subroutine register_swapfield_gen_u(FieldS, FieldR, ll, old_dist, new_dist, Up, Down, a_request)
!$Header llmm1 INTEGER ip1jmp1
subroutine register_swapfield2d_v2d(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine register_swapfield_gen_v(FieldS, FieldR, ll, old_dist, new_dist, Up, Down, a_request)
subroutine register_hallo(Field, ij, ll, RUp, Rdown, SUp, SDown, a_request)
subroutine register_sendfield(Field, ij, ll, offset, size, target, a_request)
subroutine register_recvfield(Field, ij, ll, offset, size, target, a_request)
subroutine get_current_distrib(d)
subroutine allocate_buffer(Size, Index, Pos)
subroutine register_swapfield3d_v(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
integer, parameter listsize
subroutine register_swapfield1d_u(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
integer, parameter maxproc
subroutine scatter_field_u(field_glo, field_loc, ll)
subroutine init_mod_hallo
subroutine create_global_mpi_buffer
!$Header llmm1 INTEGER ip1jm
subroutine create_distrib(jj_nb_new, d)
logical, save use_mpi_alloc
subroutine register_swapfieldhallo(FieldS, FieldR, ij, ll, jj_Nb_New, Up, Down, a_request)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
integer, save maxbuffersize
subroutine register_swapfield1d_v2d(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine new_hallo(Field, Stride, NbLevel, offset, size, Ptr_request)
subroutine create_standard_mpi_buffer
subroutine scatter_field_v(field_glo, field_loc, ll)
subroutine register_swapfield1d_u2d(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
integer, dimension(:), allocatable, save jj_begin_para
subroutine register_swapfield3d_u2d(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine register_hallo_u(Field, ll, RUp, Rdown, SUp, SDown, a_request)
integer, parameter defaultmaxbuffersize
subroutine register_swapfield2d_v1d(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine gather_field_v(field_loc, field_glo, ll)
subroutine set_distrib(d)
subroutine sendrequest(a_Request)
subroutine register_swapfield3d_v2d(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine deallocate_buffer(Index)
subroutine gather_field_u(field_loc, field_glo, ll)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
subroutine waitrecvrequest(a_Request)
subroutine copyfield(FieldS, FieldR, ij, ll, jj_Nb_New)
subroutine register_swapfield2d_u2d(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine copyfieldhallo(FieldS, FieldR, ij, ll, jj_Nb_New, Up, Down)
type(distrib), save distrib_gather
subroutine waitsendrequest(a_Request)
real, dimension(:), pointer, save buffer
type(distrib), save current_dist
integer, dimension(listsize), save buffer_pos
subroutine register_swapfield2d_u1d(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine register_swapfield(FieldS, FieldR, ij, ll, jj_Nb_New, a_request)
subroutine settag(a_request, tag)
subroutine register_swapfield1d_v(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine register_hallo_v(Field, ll, RUp, Rdown, SUp, SDown, a_request)
subroutine register_swapfield3d_u(FieldS, FieldR, new_dist, a_request, old_dist, up, down)
subroutine waitrequest(a_Request)
integer, dimension(:), allocatable, save jj_end_para