7 LOGICAL,
SAVE :: using_mpi=.true.
8 LOGICAL,
SAVE :: using_omp
10 integer,
save :: mpi_size
11 integer,
save :: mpi_rank
12 integer,
save :: jj_begin
13 integer,
save :: jj_end
14 integer,
save ::
jj_nb
15 integer,
save :: ij_begin
16 integer,
save :: ij_end
17 logical,
save :: pole_nord
18 logical,
save :: pole_sud
20 integer,
allocatable,
save,
dimension(:) :: jj_begin_para
21 integer,
allocatable,
save,
dimension(:) :: jj_end_para
22 integer,
allocatable,
save,
dimension(:) :: jj_nb_para
23 integer,
save :: omp_chunk
24 integer,
save :: omp_rank
25 integer,
save :: omp_size
36 #include "dimensions.h"
43 integer,
dimension(3) :: blocklen,type
45 character(len=4) :: num
46 character(len=20) :: filename
49 INTEGER :: omp_get_num_threads
50 EXTERNAL omp_get_num_threads
51 INTEGER :: omp_get_thread_num
52 EXTERNAL omp_get_thread_num
72 call mpi_comm_size(comm_lmdz,mpi_size,ierr)
73 call mpi_comm_rank(comm_lmdz,mpi_rank,ierr)
83 WRITE(num,
'(I4.4)') mpi_rank
84 filename=
'lmdz.out_'//num
85 IF (mpi_rank .NE. 0)
THEN
86 OPEN(
unit=
lunout,file=trim(filename),action=
'write', &
87 status=
'unknown',form=
'formatted',iostat=ierr)
92 allocate(jj_begin_para(0:mpi_size-1))
93 allocate(jj_end_para(0:mpi_size-1))
94 allocate(jj_nb_para(0:mpi_size-1))
97 jj_nb_para(
i)=(jjm+1)/mpi_size
98 if (
i < mod((jjm+1),mpi_size) ) jj_nb_para(
i)=jj_nb_para(
i)+1
100 if (jj_nb_para(
i) <= 2 )
then
102 write(
lunout,*)
"Arret : le nombre de bande de lattitude par process est trop faible (<2)."
103 write(
lunout,*)
" ---> diminuez le nombre de CPU ou augmentez la taille en lattitude"
106 IF (using_mpi) call mpi_abort(comm_lmdz,-1, ierr)
122 jj_end_para(
i)=
j+jj_nb_para(
i)-1
127 jj_begin = jj_begin_para(mpi_rank)
128 jj_end = jj_end_para(mpi_rank)
129 jj_nb = jj_nb_para(mpi_rank)
131 ij_begin=(jj_begin-1)*iip1+1
134 if (mpi_rank.eq.0)
then
140 if (mpi_rank.eq.mpi_size-1)
then
146 write(
lunout,*)
"init_parallel: jj_begin",jj_begin
147 write(
lunout,*)
"init_parallel: jj_end",jj_end
148 write(
lunout,*)
"init_parallel: ij_begin",ij_begin
149 write(
lunout,*)
"init_parallel: ij_end",ij_end
155 omp_size=omp_get_num_threads()
157 omp_rank=omp_get_thread_num()
170 #include "dimensions.h"
173 INTEGER,
dimension(0:MPI_Size-1) :: jj_nb_new
179 jj_end_para(0)=jj_nb_para(0)
183 jj_begin_para(
i)=jj_end_para(
i-1)+1
184 jj_end_para(
i)=jj_begin_para(
i)+jj_nb_para(
i)-1
188 jj_begin = jj_begin_para(mpi_rank)
189 jj_end = jj_end_para(mpi_rank)
190 jj_nb = jj_nb_para(mpi_rank)
192 ij_begin=(jj_begin-1)*iip1+1
211 character(len=6),
parameter :: type_ocean=
"dummy"
215 include
"dimensions.h"
224 if (
allocated(jj_begin_para))
deallocate(jj_begin_para)
225 if (
allocated(jj_end_para))
deallocate(jj_end_para)
226 if (
allocated(jj_nb_para))
deallocate(jj_nb_para)
228 if (type_ocean ==
'couple')
then
230 call prism_terminate_proto(ierr)
231 IF (ierr .ne. prism_ok)
THEN
232 call
abort_gcm(
'Finalize_parallel',
' Probleme dans prism_terminate_proto ',1)
237 IF (using_mpi) call mpi_finalize(ierr)
246 #include "dimensions.h"
249 integer,
intent(in) ::
ij,
ll,row
250 real,
dimension(ij,ll),
intent(in) ::field
251 real,
dimension(ll*iip1*row),
intent(out) :: buffer
260 buffer(pos)=field(
i,
l)
269 #include "dimensions.h"
272 integer,
intent(in) ::
ij,
ll,row
273 real,
dimension(ij,ll),
intent(out) ::field
274 real,
dimension(ll*iip1*row),
intent(in) :: buffer
284 field(
i,
l)=buffer(pos)
300 IF (using_mpi) CALL mpi_barrier(comm_lmdz,ierr)
310 #include "dimensions.h"
316 REAL,
dimension(ij,ll) :: field
320 LOGICAL :: sendup,senddown
321 LOGICAL :: recvup,recvdown
322 INTEGER,
DIMENSION(4) ::
request
324 INTEGER,
DIMENSION(MPI_STATUS_SIZE,4) :: status
326 INTEGER,
DIMENSION(1,4) :: status
329 REAL,
dimension(:),
allocatable :: buffer_send_up,buffer_send_down
330 REAL,
dimension(:),
allocatable :: buffer_recv_up,buffer_recv_down
331 INTEGER :: buffer_size
367 nbrequest=nbrequest+1
368 buffer_size=down*iip1*
ll
369 allocate(buffer_send_up(buffer_size))
373 call mpi_issend(buffer_send_up,buffer_size,mpi_real8,mpi_rank-1,1, &
374 comm_lmdz,
request(nbrequest),ierr)
380 nbrequest=nbrequest+1
382 buffer_size=up*iip1*
ll
383 allocate(buffer_send_down(buffer_size))
384 call
pack_data(field(ij_end+1-up*iip1,1),
ij,
ll,up,buffer_send_down)
388 call mpi_issend(buffer_send_down,buffer_size,mpi_real8,mpi_rank+1,1, &
389 comm_lmdz,
request(nbrequest),ierr)
396 nbrequest=nbrequest+1
397 buffer_size=up*iip1*
ll
398 allocate(buffer_recv_up(buffer_size))
402 call mpi_irecv(buffer_recv_up,buffer_size,mpi_real8,mpi_rank-1,1, &
403 comm_lmdz,
request(nbrequest),ierr)
411 nbrequest=nbrequest+1
412 buffer_size=down*iip1*
ll
413 allocate(buffer_recv_down(buffer_size))
417 call mpi_irecv(buffer_recv_down,buffer_size,mpi_real8,mpi_rank+1,1, &
418 comm_lmdz,
request(nbrequest),ierr)
425 if (nbrequest > 0) call mpi_waitall(nbrequest,
request,status,ierr)
427 IF (recvup) call
unpack_data(field(ij_begin-up*iip1,1),
ij,
ll,up,buffer_recv_up)
428 IF (recvdown) call
unpack_data(field(ij_end+1,1),
ij,
ll,down,buffer_recv_down)
442 #include "dimensions.h"
444 #include "iniprint.h"
448 INTEGER ::
ij,
ll,rank
449 REAL,
dimension(ij,ll) :: field
450 REAL,
dimension(:),
allocatable :: buffer_send
451 REAL,
dimension(:),
allocatable :: buffer_recv
452 INTEGER,
dimension(0:MPI_Size-1) :: recv_count, displ
459 allocate(buffer_send(iip1*
ll*(jj_end-jj_begin+1)))
460 call
pack_data(field(ij_begin,1),
ij,
ll,jj_end-jj_begin+1,buffer_send)
462 allocate(buffer_send(iip1*
ll*(min(jj_end,jjm)-jj_begin+1)))
463 call
pack_data(field(ij_begin,1),
ij,
ll,min(jj_end,jjm)-jj_begin+1,buffer_send)
466 stop
'erreur dans Gather_Field'
469 if (mpi_rank==rank)
then
470 allocate(buffer_recv(
ij*
ll))
476 recv_count(
i)=(jj_end_para(
i)-jj_begin_para(
i)+1)*
ll*iip1
478 recv_count(
i)=(min(jj_end_para(
i),jjm)-jj_begin_para(
i)+1)*
ll*iip1
480 stop
'erreur dans Gather_Field'
486 displ(
i)=displ(
i-1)+recv_count(
i-1)
495 allocate(buffer_recv(1))
500 call mpi_gatherv(buffer_send,(min(ij_end,
ij)-ij_begin+1)*
ll,mpi_real8, &
501 buffer_recv,recv_count,displ,mpi_real8,rank,comm_lmdz,ierr)
505 if (mpi_rank==rank)
then
510 jj_end_para(
i)-jj_begin_para(
i)+1,buffer_recv(displ(
i)+1))
515 min(jj_end_para(
i),jjm)-jj_begin_para(
i)+1,buffer_recv(displ(
i)+1))
526 #include "dimensions.h"
532 REAL,
dimension(ij,ll) :: field
539 call mpi_bcast(field,
ij*
ll,mpi_real8,0,comm_lmdz,ierr)
548 #include "dimensions.h"
554 REAL,
dimension(ij,ll) :: field
562 call mpi_bcast(field,
ij*
ll,mpi_real8,rank,comm_lmdz,ierr)