LMDZ
mod_phys_lmdz_para.F90
Go to the documentation of this file.
1 !
2 !$Header$
3 !
8 
9  INTEGER,SAVE :: klon_loc
10  LOGICAL,SAVE :: is_sequential
11  LOGICAL,SAVE :: is_parallel
12  LOGICAL,SAVE :: is_master
13 
14 !$OMP THREADPRIVATE(klon_loc,is_master)
15 
16 CONTAINS
17 
18  SUBROUTINE init_phys_lmdz_para(nbp,nbp_lon,nbp_lat,communicator)
19  IMPLICIT NONE
20  INTEGER,INTENT(in) :: nbp
21  INTEGER,INTENT(in) :: nbp_lon
22  INTEGER,INTENT(in) :: nbp_lat
23  INTEGER,INTENT(in) :: communicator
24 
25  CALL init_phys_lmdz_mpi_data(nbp,nbp_lon,nbp_lat,communicator)
26 !$OMP PARALLEL
29  IF (is_mpi_root .AND. is_omp_root) THEN
30  is_master=.true.
31  ELSE
33  ENDIF
34  CALL test_transfert
35 !$OMP END PARALLEL
36  IF (is_using_mpi .OR. is_using_omp) THEN
39  ELSE
42  ENDIF
43 
44  END SUBROUTINE init_phys_lmdz_para
45 
46  SUBROUTINE test_transfert
48  IMPLICIT NONE
49  include "iniprint.h"
50 
51  REAL :: Test_Field1d_glo(klon_glo,nbp_lev)
52  REAL :: tmp1d_glo(klon_glo,nbp_lev)
53  REAL :: Test_Field2d_glo(nbp_lon,nbp_lat,nbp_lev)
54  REAL :: tmp2d_glo(nbp_lon,nbp_lat,nbp_lev)
55  REAL :: Test_Field1d_loc(klon_loc,nbp_lev)
56  REAL :: Test_Field2d_loc(nbp_lon,jj_nb,nbp_lev)
57  REAL :: CheckSum
58 
59  INTEGER :: i,l
60 
61  test_field1d_glo = 0.
62  test_field2d_glo = 0.
63  test_field1d_loc = 0.
64  test_field2d_loc = 0.
65 
66  IF (is_mpi_root) THEN
67 !$OMP MASTER
68  DO l=1,nbp_lev
69  DO i=1,klon_glo
70 ! Test_Field1d_glo(i,l)=MOD(i,10)+10*(l-1)
71  test_field1d_glo(i,l)=1
72  ENDDO
73  ENDDO
74 !$OMP END MASTER
75  ENDIF
76 
77  CALL scatter(test_field1d_glo,test_field1d_loc)
78  CALL gather(test_field1d_loc,tmp1d_glo)
79 
80  IF (is_mpi_root) THEN
81 !$OMP MASTER
82  checksum=sum(test_field1d_glo-tmp1d_glo)
83  WRITE(lunout,*) "------> Checksum =",checksum," MUST BE 0"
84 !$OMP END MASTER
85  ENDIF
86 
87  CALL grid1dto2d_glo(test_field1d_glo,test_field2d_glo)
88  CALL scatter2d(test_field2d_glo,test_field1d_loc)
89  CALL gather2d(test_field1d_loc,test_field2d_glo)
90  CALL grid2dto1d_glo(test_field2d_glo,tmp1d_glo)
91 
92  IF (is_mpi_root) THEN
93 !$OMP MASTER
94  checksum=sum(test_field1d_glo-tmp1d_glo)
95  WRITE(lunout,*) "------> Checksum =",checksum," MUST BE 0"
96 !$OMP END MASTER
97  ENDIF
98 
99  CALL bcast(test_field1d_glo)
100  CALL reduce_sum(test_field1d_glo,tmp1d_glo)
101 
102  IF (is_mpi_root) THEN
103 !$OMP MASTER
104  checksum=sum(test_field1d_glo*omp_size*mpi_size-tmp1d_glo)
105  WRITE(lunout,*) "------> Checksum =",checksum," MUST BE 0"
106 !$OMP END MASTER
107  ENDIF
108 
109 
110  END SUBROUTINE test_transfert
111 
112 END MODULE mod_phys_lmdz_para
113 
integer, save klon_glo
!$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
Definition: calcul_STDlev.h:26
subroutine init_phys_lmdz_omp_data(klon_mpi)
!$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 init_phys_lmdz_para(nbp, nbp_lon, nbp_lat, communicator)
subroutine init_phys_lmdz_mpi_data(nbp, nbp_lon, nbp_lat, communicator)
logical, save is_sequential
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout
Definition: iniprint.h:7