4 logical,
save :: use_mpi_alloc
5 integer,
parameter :: maxrequest=200
6 integer,
parameter :: maxproc=80
7 integer,
parameter :: maxbuffersize=1024*1024*16
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 integer :: msg_request
37 type(request_sr),
dimension(0:MaxProc-1) :: requestsend
38 type(request_sr),
dimension(0:MaxProc-1) :: requestrecv
49 buffer_pos(index_pos)=1
52 IF (use_mpi_alloc .AND. using_mpi)
THEN
63 ALLOCATE(buffer(maxbuffersize))
72 pointer(pbuffer,mpi_buffer(maxbuffersize))
75 INTEGER(KIND=MPI_ADDRESS_KIND) :: bs
85 CALL mpi_alloc_mem(bs,mpi_info_null,pbuffer,ierr)
98 REAL,
DIMENSION(:),
target :: mpi_buffer
113 if (buffer_pos(index_pos)+size>maxbuffersize_used) maxbuffersize_used=buffer_pos(index_pos)+
Size
114 if (buffer_pos(index_pos)+size>maxbuffersize)
then
115 print *,
'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!'
119 if (index_pos>=listsize)
then
120 print *,
'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!'
124 pos=buffer_pos(index_pos)
125 buffer_pos(index_pos+1)=buffer_pos(index_pos)+
Size
126 index_pos=index_pos+1
137 do while (buffer_pos(index_pos)==-1 .and. index_pos>1)
138 index_pos=index_pos-1
152 subroutine init_hallo(Field,Stride,NbLevel,offset,size,NewHallo)
157 real,
dimension(Stride,NbLevel),
target :: field
158 type(hallo) :: newhallo
160 newhallo%Field=>field
161 newhallo%Stride=stride
162 newhallo%NbLevel=nblevel
164 newhallo%offset=offset
172 #include "dimensions.h"
175 INTEGER ::
ij,
ll,offset,size,target
176 REAL,
dimension(ij,ll) :: field
177 type(request),
target :: a_request
180 ptr_request=>a_request%RequestSend(
target)
181 ptr_request%NbRequest=ptr_request%NbRequest+1
182 if (ptr_request%NbRequest>=maxrequest)
then
183 print *,
'STOP :: La taille de MaxRequest dans mod_hallo.F90 est trop petite !!!!'
186 call
init_hallo(field,
ij,
ll,offset,
size,ptr_request%Hallo(ptr_request%NbRequest))
193 #include "dimensions.h"
196 INTEGER ::
ij,
ll,offset,size,target
197 REAL,
dimension(ij,ll) :: field
198 type(request),
target :: a_request
201 ptr_request=>a_request%RequestRecv(
target)
202 ptr_request%NbRequest=ptr_request%NbRequest+1
204 if (ptr_request%NbRequest>=maxrequest)
then
205 print *,
'STOP :: La taille de MaxRequest dans mod_hallo.F90 est trop petite !!!!'
209 call
init_hallo(field,
ij,
ll,offset,
size,ptr_request%Hallo(ptr_request%NbRequest))
217 #include "dimensions.h"
221 REAL,
dimension(ij,ll) :: fields
222 REAL,
dimension(ij,ll) :: fieldr
224 integer,
dimension(0:MPI_Size-1) :: jj_nb_new
225 integer,
dimension(0:MPI_Size-1) :: jj_begin_new,jj_end_new
230 jj_end_new(0)=jj_nb_new(0)
232 jj_begin_new(
i)=jj_end_new(
i-1)+1
233 jj_end_new(
i)=jj_begin_new(
i)+jj_nb_new(
i)-1
237 if (
i /= mpi_rank)
then
238 jjb=max(jj_begin_new(
i),jj_begin)
239 jje=min(jj_end_new(
i),jj_end)
247 jjb=max(jj_begin_new(mpi_rank),jj_begin_para(
i))
248 jje=min(jj_end_new(mpi_rank),jj_end_para(
i))
265 #include "dimensions.h"
268 INTEGER ::
ij,
ll,up,down
269 REAL,
dimension(ij,ll) :: fields
270 REAL,
dimension(ij,ll) :: fieldr
272 integer,
dimension(0:MPI_Size-1) :: jj_nb_new
273 integer,
dimension(0:MPI_Size-1) :: jj_begin_new,jj_end_new
278 jj_end_new(0)=jj_nb_new(0)
280 jj_begin_new(
i)=jj_end_new(
i-1)+1
281 jj_end_new(
i)=jj_begin_new(
i)+jj_nb_new(
i)-1
285 jj_begin_new(
i)=max(1,jj_begin_new(
i)-up)
286 jj_end_new(
i)=min(
jjp1,jj_end_new(
i)+down)
290 if (
i /= mpi_rank)
then
291 jjb=max(jj_begin_new(
i),jj_begin)
292 jje=min(jj_end_new(
i),jj_end)
300 jjb=max(jj_begin_new(mpi_rank),jj_begin_para(
i))
301 jje=min(jj_end_new(mpi_rank),jj_end_para(
i))
317 #include "dimensions.h"
323 REAL,
dimension(ij,ll) :: field
324 INTEGER :: sup,sdown,rup,rdown
326 type(hallo),
pointer :: ptrhallo
327 LOGICAL :: sendup,senddown
328 LOGICAL :: recvup,recvdown
384 #include "dimensions.h"
390 type(request),
target :: a_request
392 type(hallo),
pointer :: ptrhallo
393 integer :: sizebuffer
394 integer ::
i,rank,
l,
ij,pos,ierr
396 real,
dimension(:,:),
pointer :: field
401 req=>a_request%RequestSend(rank)
405 ptrhallo=>req%Hallo(
i)
407 DO l=1,ptrhallo%NbLevel
408 sizebuffer=sizebuffer+ptrhallo%size*iip1
413 if (sizebuffer>0)
then
419 ptrhallo=>req%Hallo(
i)
420 offset=(ptrhallo%offset-1)*iip1+1
421 nb=iip1*ptrhallo%size-1
422 field=>ptrhallo%Field
425 do l=1,ptrhallo%NbLevel
428 buffer(pos+
ij)=field(offset+
ij,
l)
439 call mpi_issend(buffer(req%Pos),sizebuffer,mpi_real_lmdz,rank,a_request%tag+1000*omp_rank, &
440 comm_lmdz,req%MSG_Request,ierr)
442 IF (.NOT.using_mpi)
THEN
443 print *,
'Erreur, echange MPI en mode sequentiel !!!'
459 req=>a_request%RequestRecv(rank)
463 ptrhallo=>req%Hallo(
i)
466 DO l=1,ptrhallo%NbLevel
467 sizebuffer=sizebuffer+ptrhallo%size*iip1
472 if (sizebuffer>0)
then
478 call mpi_irecv(buffer(req%Pos),sizebuffer,mpi_real_lmdz,rank,a_request%tag+1000*omp_rank, &
479 comm_lmdz,req%MSG_Request,ierr)
481 IF (.NOT.using_mpi)
THEN
482 print *,
'Erreur, echange MPI en mode sequentiel !!!'
502 #include "dimensions.h"
508 type(request),
target :: a_request
510 type(hallo),
pointer :: ptrhallo
511 integer,
dimension(2*mpi_size) :: tabrequest
513 integer,
dimension(MPI_STATUS_SIZE,2*mpi_size) :: tabstatus
515 integer,
dimension(1,2*mpi_size) :: tabstatus
518 integer ::
i,rank,pos,
ij,
l,ierr
525 req=>a_request%RequestSend(rank)
526 if (req%NbRequest>0)
then
527 nbrequest=nbrequest+1
528 tabrequest(nbrequest)=req%MSG_Request
533 req=>a_request%RequestRecv(rank)
534 if (req%NbRequest>0)
then
535 nbrequest=nbrequest+1
536 tabrequest(nbrequest)=req%MSG_Request
540 if (nbrequest>0)
then
546 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
553 req=>a_request%RequestRecv(rank)
554 if (req%NbRequest>0)
then
557 ptrhallo=>req%Hallo(
i)
558 offset=(ptrhallo%offset-1)*iip1+1
559 nb=iip1*ptrhallo%size-1
562 do l=1,ptrhallo%NbLevel
565 ptrhallo%Field(offset+
ij,
l)=buffer(pos+
ij)
576 req=>a_request%RequestSend(rank)
577 if (req%NbRequest>0)
then
584 req=>a_request%RequestRecv(rank)
585 if (req%NbRequest>0)
then
597 #include "dimensions.h"
602 type(request),
target :: a_request
604 type(hallo),
pointer :: ptrhallo
605 integer,
dimension(mpi_size) :: tabrequest
607 integer,
dimension(MPI_STATUS_SIZE,mpi_size) :: tabstatus
609 integer,
dimension(1,mpi_size) :: tabstatus
612 integer ::
i,rank,pos,
ij,
l,ierr
618 req=>a_request%RequestSend(rank)
619 if (req%NbRequest>0)
then
620 nbrequest=nbrequest+1
621 tabrequest(nbrequest)=req%MSG_Request
626 if (nbrequest>0)
THEN
632 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
641 req=>a_request%RequestSend(rank)
642 if (req%NbRequest>0)
then
654 #include "dimensions.h"
660 type(request),
target :: a_request
662 type(hallo),
pointer :: ptrhallo
663 integer,
dimension(mpi_size) :: tabrequest
665 integer,
dimension(MPI_STATUS_SIZE,mpi_size) :: tabstatus
667 integer,
dimension(1,mpi_size) :: tabstatus
670 integer ::
i,rank,pos,
ij,
l,ierr
677 req=>a_request%RequestRecv(rank)
678 if (req%NbRequest>0)
then
679 nbrequest=nbrequest+1
680 tabrequest(nbrequest)=req%MSG_Request
685 if (nbrequest>0)
then
691 call mpi_waitall(nbrequest,tabrequest,tabstatus,ierr)
699 req=>a_request%RequestRecv(rank)
700 if (req%NbRequest>0)
then
703 ptrhallo=>req%Hallo(
i)
704 offset=(ptrhallo%offset-1)*iip1+1
705 nb=iip1*ptrhallo%size-1
707 do l=1,ptrhallo%NbLevel
710 ptrhallo%Field(offset+
ij,
l)=buffer(pos+
ij)
721 req=>a_request%RequestRecv(rank)
722 if (req%NbRequest>0)
then
736 #include "dimensions.h"
740 REAL,
dimension(ij,ll) :: fields
741 REAL,
dimension(ij,ll) :: fieldr
742 integer,
dimension(0:MPI_Size-1) :: jj_nb_new
743 integer,
dimension(0:MPI_Size-1) :: jj_begin_new,jj_end_new
745 integer ::
i,jje,jjb,ijb,ije
748 jj_end_new(0)=jj_nb_new(0)
750 jj_begin_new(
i)=jj_end_new(
i-1)+1
751 jj_end_new(
i)=jj_begin_new(
i)+jj_nb_new(
i)-1
754 jjb=max(jj_begin,jj_begin_new(mpi_rank))
755 jje=min(jj_end,jj_end_new(mpi_rank))
756 if (
ij==
ip1jm) jje=min(jje,jjm)
764 fieldr(ijb:ije,
l)=fields(ijb:ije,
l)
775 #include "dimensions.h"
778 INTEGER ::
ij,
ll,up,down
779 REAL,
dimension(ij,ll) :: fields
780 REAL,
dimension(ij,ll) :: fieldr
781 integer,
dimension(0:MPI_Size-1) :: jj_nb_new
782 integer,
dimension(0:MPI_Size-1) :: jj_begin_new,jj_end_new
784 integer ::
i,jje,jjb,ijb,ije,
l
788 jj_end_new(0)=jj_nb_new(0)
790 jj_begin_new(
i)=jj_end_new(
i-1)+1
791 jj_end_new(
i)=jj_begin_new(
i)+jj_nb_new(
i)-1
795 jjb=max(jj_begin,jj_begin_new(mpi_rank)-up)
796 jje=min(jj_end,jj_end_new(mpi_rank)+down)
797 if (
ij==
ip1jm) jje=min(jje,jjm)
806 fieldr(ijb:ije,
l)=fields(ijb:ije,
l)