79 INTERFACE assignment (=)
92 #include "dimensions.h"
99 integer,
dimension(3) :: blocklen,type
101 character(len=4) :: num
102 character(len=20) :: filename
105 INTEGER :: OMP_GET_NUM_THREADS
106 EXTERNAL omp_get_num_threads
107 INTEGER :: OMP_GET_THREAD_NUM
108 EXTERNAL omp_get_thread_num
140 filename=
'lmdz.out_'//num
142 OPEN(
unit=
lunout,file=trim(filename),action=
'write', &
143 status=
'unknown',form=
'formatted',iostat=ierr)
158 write(
lunout,*)
"Arret : le nombre de bande de lattitude par process est trop faible (<2)."
159 write(
lunout,*)
" ---> diminuez le nombre de CPU ou augmentez la taille en lattitude"
255 include
"dimensions.h"
258 INTEGER,
INTENT(IN) :: jj_Nb_New(0:
mpi_size-1)
259 TYPE(
distrib),
INTENT(INOUT) :: d
262 IF (.NOT.
ASSOCIATED(d%jj_nb_para))
ALLOCATE(d%jj_nb_para(0:
mpi_size-1))
263 IF (.NOT.
ASSOCIATED(d%jj_begin_para))
ALLOCATE(d%jj_begin_para(0:
mpi_size-1))
264 IF (.NOT.
ASSOCIATED(d%jj_end_para))
ALLOCATE(d%jj_end_para(0:
mpi_size-1))
266 d%jj_Nb_Para=jj_nb_new
269 d%jj_end_para(0)=d%jj_Nb_Para(0)
273 d%jj_begin_para(i)=d%jj_end_para(i-1)+1
274 d%jj_end_para(i)=d%jj_begin_para(i)+d%jj_Nb_para(i)-1
278 d%jj_begin = d%jj_begin_para(
mpi_rank)
282 d%ij_begin=(d%jj_begin-1)*iip1+1
283 d%ij_end=d%jj_end*iip1
287 d%jjnb_u=d%jje_u-d%jjb_u+1
291 d%jjnb_v=d%jje_v-d%jjb_v+1
293 d%ijb_u=max(d%ij_begin-
halo_max*iip1,1)
295 d%ijnb_u=d%ije_u-d%ijb_u+1
297 d%ijb_v=max(d%ij_begin-
halo_max*iip1,1)
299 d%ijnb_v=d%ije_v-d%ijb_v+1
307 include
"dimensions.h"
343 include
"dimensions.h"
345 TYPE(
distrib),
INTENT(INOUT) :: dist
346 TYPE(
distrib),
INTENT(IN) :: new_dist
348 dist%jj_begin = new_dist%jj_begin
349 dist%jj_end = new_dist%jj_end
350 dist%jj_nb = new_dist%jj_nb
351 dist%ij_begin = new_dist%ij_begin
352 dist%ij_end = new_dist%ij_end
354 dist%jjb_u = new_dist%jjb_u
355 dist%jje_u = new_dist%jje_u
356 dist%jjnb_u = new_dist%jjnb_u
357 dist%jjb_v = new_dist%jjb_v
358 dist%jje_v = new_dist%jje_v
359 dist%jjnb_v = new_dist%jjnb_v
361 dist%ijb_u = new_dist%ijb_u
362 dist%ije_u = new_dist%ije_u
363 dist%ijnb_u = new_dist%ijnb_u
365 dist%ijb_v = new_dist%ijb_v
366 dist%ije_v = new_dist%ije_v
367 dist%ijnb_v = new_dist%ijnb_v
370 dist%jj_begin_para(:) = new_dist%jj_begin_para(:)
371 dist%jj_end_para(:) = new_dist%jj_end_para(:)
372 dist%jj_nb_para(:) = new_dist%jj_nb_para(:)
380 include
"dimensions.h"
406 character(len=6),
parameter :: type_ocean=
"dummy"
410 include
"dimensions.h"
423 if (type_ocean ==
'couple')
then
429 call prism_terminate_proto(ierr)
430 IF (ierr .ne. prism_ok)
THEN
431 call abort_gcm(
'Finalize_parallel',
' Probleme dans prism_terminate_proto ',1)
447 subroutine pack_data(Field,ij,ll,row,Buffer)
450 #include "dimensions.h"
453 integer,
intent(in) :: ij,ll,row
454 real,
dimension(ij,ll),
intent(in) ::Field
455 real,
dimension(ll*iip1*row),
intent(out) :: Buffer
464 buffer(pos)=field(i,l)
473 #include "dimensions.h"
476 integer,
intent(in) :: ij,ll,row
477 real,
dimension(ij,ll),
intent(out) ::Field
478 real,
dimension(ll*iip1*row),
intent(in) :: Buffer
488 field(i,l)=buffer(pos)
514 #include "dimensions.h"
520 REAL,
dimension(ij,ll) :: Field
524 LOGICAL :: SendUp,SendDown
525 LOGICAL :: RecvUp,RecvDown
526 INTEGER,
DIMENSION(4) :: Request
528 INTEGER,
DIMENSION(MPI_STATUS_SIZE,4) :: Status
530 INTEGER,
DIMENSION(1,4) :: Status
533 REAL,
dimension(:),
allocatable :: Buffer_Send_up,Buffer_Send_down
534 REAL,
dimension(:),
allocatable :: Buffer_Recv_up,Buffer_Recv_down
535 INTEGER :: Buffer_size
571 nbrequest=nbrequest+1
572 buffer_size=down*iip1*ll
573 allocate(buffer_send_up(buffer_size))
577 call mpi_issend(buffer_send_up,buffer_size,mpi_real8,
mpi_rank-1,1, &
584 nbrequest=nbrequest+1
586 buffer_size=up*iip1*ll
587 allocate(buffer_send_down(buffer_size))
592 call mpi_issend(buffer_send_down,buffer_size,mpi_real8,
mpi_rank+1,1, &
600 nbrequest=nbrequest+1
601 buffer_size=up*iip1*ll
602 allocate(buffer_recv_up(buffer_size))
606 call mpi_irecv(buffer_recv_up,buffer_size,mpi_real8,
mpi_rank-1,1, &
615 nbrequest=nbrequest+1
616 buffer_size=down*iip1*ll
617 allocate(buffer_recv_down(buffer_size))
621 call mpi_irecv(buffer_recv_down,buffer_size,mpi_real8,
mpi_rank+1,1, &
629 if (nbrequest > 0)
call mpi_waitall(nbrequest,request,status,ierr)
646 #include "dimensions.h"
648 #include "iniprint.h"
652 INTEGER :: ij,ll,rank
653 REAL,
dimension(ij,ll) :: Field
654 REAL,
dimension(:),
allocatable :: Buffer_send
655 REAL,
dimension(:),
allocatable :: Buffer_Recv
656 INTEGER,
dimension(0:MPI_Size-1) :: Recv_count, displ
665 else if (ij==
ip1jm)
then
670 stop
'erreur dans Gather_Field'
674 allocate(buffer_recv(ij*ll))
681 else if (ij==
ip1jm)
then
684 stop
'erreur dans Gather_Field'
690 displ(i)=displ(i-1)+recv_count(i-1)
699 allocate(buffer_recv(1))
704 call mpi_gatherv(buffer_send,(min(
ij_end,ij)-
ij_begin+1)*ll,mpi_real8, &
705 buffer_recv,recv_count,displ,mpi_real8,rank,
comm_lmdz,ierr)
716 else if (ij==
ip1jm)
then
730 #include "dimensions.h"
736 REAL,
dimension(ij,ll) :: Field
743 call mpi_bcast(field,ij*ll,mpi_real8,0,
comm_lmdz,ierr)
752 #include "dimensions.h"
758 REAL,
dimension(ij,ll) :: Field
766 call mpi_bcast(field,ij*ll,mpi_real8,rank,
comm_lmdz,ierr)
!$Header llmm1 INTEGER ip1jmp1
subroutine gather_field(Field, ij, ll, rank)
subroutine get_current_distrib(d)
subroutine abort_gcm(modname, message, ierr)
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
subroutine exchange_hallo(Field, ij, ll, up, down)
!$Header llmm1 INTEGER ip1jm
subroutine create_distrib(jj_nb_new, d)
!$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
subroutine pack_data(Field, ij, ll, row, Buffer)
subroutine finalize_parallel
integer, dimension(:), allocatable, save jj_begin_para
integer, parameter vthallo
subroutine copy_distrib(dist, new_dist)
integer, parameter halo_max
subroutine set_distrib(d)
subroutine allgather_field(Field, ij, 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
integer, dimension(:), allocatable, save jj_nb_para
character(len=6), save type_ocean
subroutine unpack_data(Field, ij, ll, row, Buffer)
type(distrib), save current_dist
!$Header!integer nvarmx s s unit
subroutine broadcast_field(Field, ij, ll, rank)
integer, dimension(:), allocatable, save jj_end_para
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout