16 real,
save,
pointer,
dimension(:) ::
buffer
24 real,
dimension(:,:),
pointer :: field
32 integer :: nbrequest=0
36 integer :: msg_request
40 type(
request_sr),
dimension(0:MaxProc-1) :: requestsend
41 type(
request_sr),
dimension(0:MaxProc-1) :: requestrecv
78 INTEGER(KIND=MPI_ADDRESS_KIND) :: bs
88 CALL mpi_alloc_mem(bs,mpi_info_null,pbuffer,ierr)
101 REAL,
DIMENSION(:),
target :: MPI_Buffer
118 print *,
'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!'
123 print *,
'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!'
146 subroutine settag(a_request,tag)
155 subroutine init_hallo(Field,Stride,NbLevel,offset,size,NewHallo)
160 real,
dimension(Stride,NbLevel),
target :: Field
161 type(
hallo) :: NewHallo
163 newhallo%Field=>field
164 newhallo%Stride=stride
165 newhallo%NbLevel=nblevel
167 newhallo%offset=offset
175 #include "dimensions.h"
178 INTEGER :: ij,ll,offset,size,target
179 REAL,
dimension(ij,ll) :: Field
180 type(
request),
target :: a_request
183 ptr_request=>a_request%RequestSend(
target)
184 ptr_request%NbRequest=ptr_request%NbRequest+1
186 print *,
'STOP :: La taille de MaxRequest dans mod_hallo.F90 est trop petite !!!!'
189 call init_hallo(field,ij,ll,offset,
size,ptr_request%Hallo(ptr_request%NbRequest))
196 #include "dimensions.h"
199 INTEGER :: ij,ll,offset,size,target
200 REAL,
dimension(ij,ll) :: Field
201 type(
request),
target :: a_request
204 ptr_request=>a_request%RequestRecv(
target)
205 ptr_request%NbRequest=ptr_request%NbRequest+1
208 print *,
'STOP :: La taille de MaxRequest dans mod_hallo.F90 est trop petite !!!!'
212 call init_hallo(field,ij,ll,offset,
size,ptr_request%Hallo(ptr_request%NbRequest))
220 #include "dimensions.h"
224 REAL,
dimension(ij,ll) :: FieldS
225 REAL,
dimension(ij,ll) :: FieldR
227 integer,
dimension(0:MPI_Size-1) :: jj_Nb_New
228 integer,
dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
233 jj_end_new(0)=jj_nb_new(0)
235 jj_begin_new(i)=jj_end_new(i-1)+1
236 jj_end_new(i)=jj_begin_new(i)+jj_nb_new(i)-1
242 jje=min(jj_end_new(i),
jj_end)
268 #include "dimensions.h"
271 INTEGER :: ij,ll,Up,Down
272 REAL,
dimension(ij,ll) :: FieldS
273 REAL,
dimension(ij,ll) :: FieldR
275 integer,
dimension(0:MPI_Size-1) :: jj_Nb_New
276 integer,
dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
281 jj_end_new(0)=jj_nb_new(0)
283 jj_begin_new(i)=jj_end_new(i-1)+1
284 jj_end_new(i)=jj_begin_new(i)+jj_nb_new(i)-1
288 jj_begin_new(i)=max(1,jj_begin_new(i)-up)
289 jj_end_new(i)=min(
jjp1,jj_end_new(i)+down)
295 jje=min(jj_end_new(i),
jj_end)
317 subroutine register_hallo(Field,ij,ll,RUp,Rdown,SUp,SDown,a_request)
320 #include "dimensions.h"
326 REAL,
dimension(ij,ll) :: Field
327 INTEGER :: Sup,Sdown,rup,rdown
329 type(
hallo),
pointer :: PtrHallo
330 LOGICAL :: SendUp,SendDown
331 LOGICAL :: RecvUp,RecvDown
387 #include "dimensions.h"
393 type(
request),
target :: a_request
395 type(
hallo),
pointer :: PtrHallo
396 integer :: SizeBuffer
397 integer :: i,rank,l,ij,Pos,ierr
399 real,
dimension(:,:),
pointer :: Field
404 req=>a_request%RequestSend(rank)
408 ptrhallo=>req%Hallo(i)
410 DO l=1,ptrhallo%NbLevel
411 sizebuffer=sizebuffer+ptrhallo%size*iip1
416 if (sizebuffer>0)
then
422 ptrhallo=>req%Hallo(i)
423 offset=(ptrhallo%offset-1)*iip1+1
424 nb=iip1*ptrhallo%size-1
425 field=>ptrhallo%Field
428 do l=1,ptrhallo%NbLevel
431 buffer(pos+ij)=field(offset+ij,l)
446 print *,
'Erreur, echange MPI en mode sequentiel !!!'
462 req=>a_request%RequestRecv(rank)
466 ptrhallo=>req%Hallo(i)
469 DO l=1,ptrhallo%NbLevel
470 sizebuffer=sizebuffer+ptrhallo%size*iip1
475 if (sizebuffer>0)
then
485 print *,
'Erreur, echange MPI en mode sequentiel !!!'
505 #include "dimensions.h"
511 type(
request),
target :: a_request
513 type(
hallo),
pointer :: PtrHallo
514 integer,
dimension(2*mpi_size) :: TabRequest
516 integer,
dimension(MPI_STATUS_SIZE,2*mpi_size) :: TabStatus
518 integer,
dimension(1,2*mpi_size) :: TabStatus
521 integer :: i,rank,pos,ij,l,ierr
528 req=>a_request%RequestSend(rank)
529 if (req%NbRequest>0)
then
530 nbrequest=nbrequest+1
531 tabrequest(nbrequest)=req%MSG_Request
536 req=>a_request%RequestRecv(rank)
537 if (req%NbRequest>0)
then
538 nbrequest=nbrequest+1
539 tabrequest(nbrequest)=req%MSG_Request
543 if (nbrequest>0)
then
549 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
556 req=>a_request%RequestRecv(rank)
557 if (req%NbRequest>0)
then
560 ptrhallo=>req%Hallo(i)
561 offset=(ptrhallo%offset-1)*iip1+1
562 nb=iip1*ptrhallo%size-1
565 do l=1,ptrhallo%NbLevel
568 ptrhallo%Field(offset+ij,l)=
buffer(pos+ij)
579 req=>a_request%RequestSend(rank)
580 if (req%NbRequest>0)
then
587 req=>a_request%RequestRecv(rank)
588 if (req%NbRequest>0)
then
600 #include "dimensions.h"
605 type(
request),
target :: a_request
607 type(
hallo),
pointer :: PtrHallo
608 integer,
dimension(mpi_size) :: TabRequest
610 integer,
dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus
612 integer,
dimension(1,mpi_size) :: TabStatus
615 integer :: i,rank,pos,ij,l,ierr
621 req=>a_request%RequestSend(rank)
622 if (req%NbRequest>0)
then
623 nbrequest=nbrequest+1
624 tabrequest(nbrequest)=req%MSG_Request
629 if (nbrequest>0)
THEN
635 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
644 req=>a_request%RequestSend(rank)
645 if (req%NbRequest>0)
then
657 #include "dimensions.h"
663 type(
request),
target :: a_request
665 type(
hallo),
pointer :: PtrHallo
666 integer,
dimension(mpi_size) :: TabRequest
668 integer,
dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus
670 integer,
dimension(1,mpi_size) :: TabStatus
673 integer :: i,rank,pos,ij,l,ierr
680 req=>a_request%RequestRecv(rank)
681 if (req%NbRequest>0)
then
682 nbrequest=nbrequest+1
683 tabrequest(nbrequest)=req%MSG_Request
688 if (nbrequest>0)
then
694 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
702 req=>a_request%RequestRecv(rank)
703 if (req%NbRequest>0)
then
706 ptrhallo=>req%Hallo(i)
707 offset=(ptrhallo%offset-1)*iip1+1
708 nb=iip1*ptrhallo%size-1
710 do l=1,ptrhallo%NbLevel
713 ptrhallo%Field(offset+ij,l)=
buffer(pos+ij)
724 req=>a_request%RequestRecv(rank)
725 if (req%NbRequest>0)
then
736 subroutine copyfield(FieldS,FieldR,ij,ll,jj_Nb_New)
739 #include "dimensions.h"
743 REAL,
dimension(ij,ll) :: FieldS
744 REAL,
dimension(ij,ll) :: FieldR
745 integer,
dimension(0:MPI_Size-1) :: jj_Nb_New
746 integer,
dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
748 integer ::i,jje,jjb,ijb,ije
751 jj_end_new(0)=jj_nb_new(0)
753 jj_begin_new(i)=jj_end_new(i-1)+1
754 jj_end_new(i)=jj_begin_new(i)+jj_nb_new(i)-1
759 if (ij==
ip1jm) jje=min(jje,jjm)
767 fieldr(ijb:ije,l)=fields(ijb:ije,l)
778 #include "dimensions.h"
781 INTEGER :: ij,ll,Up,Down
782 REAL,
dimension(ij,ll) :: FieldS
783 REAL,
dimension(ij,ll) :: FieldR
784 integer,
dimension(0:MPI_Size-1) :: jj_Nb_New
785 integer,
dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
787 integer ::i,jje,jjb,ijb,ije,l
791 jj_end_new(0)=jj_nb_new(0)
793 jj_begin_new(i)=jj_end_new(i-1)+1
794 jj_end_new(i)=jj_begin_new(i)+jj_nb_new(i)-1
800 if (ij==
ip1jm) jje=min(jje,jjm)
809 fieldr(ijb:ije,l)=fields(ijb:ije,l)
integer, save maxbuffersize_used
subroutine associate_buffer(MPI_Buffer)
subroutine register_hallo(Field, ij, ll, RUp, Rdown, SUp, SDown, a_request)
subroutine register_sendfield(Field, ij, ll, offset, size, target, a_request)
integer, parameter maxrequest
subroutine register_recvfield(Field, ij, ll, offset, size, target, a_request)
subroutine allocate_buffer(Size, Index, Pos)
integer, parameter listsize
!$Id klon initialisation mois suivants day_rain itap ENDIF!Calcul fin de nday_rain calcul nday_rain itap DO i
integer, parameter maxproc
subroutine init_mod_hallo
subroutine create_global_mpi_buffer
!$Header llmm1 INTEGER ip1jm
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 create_standard_mpi_buffer
integer, dimension(:), allocatable, save jj_begin_para
subroutine init_hallo(Field, Stride, NbLevel, offset, size, NewHallo)
subroutine sendrequest(a_Request)
subroutine deallocate_buffer(Index)
!$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 copyfieldhallo(FieldS, FieldR, ij, ll, jj_Nb_New, Up, Down)
subroutine waitsendrequest(a_Request)
real, dimension(:), pointer, save buffer
integer, dimension(listsize), save buffer_pos
subroutine register_swapfield(FieldS, FieldR, ij, ll, jj_Nb_New, a_request)
subroutine settag(a_request, tag)
subroutine waitrequest(a_Request)
integer, dimension(:), allocatable, save jj_end_para