source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/phystd/mod_phys_lmdz_para.F90 @ 245

Last change on this file since 245 was 245, checked in by ymipsl, 10 years ago
  • One call for initialize physics from dynamico
  • mpi_root renamed into mpi_master due to conflict with an existaing symbol from the mpi library

==> mpi_root => mpi_master, is_mpi_root => is_mpi_master, is_omp_root => is_omp_master

YM

File size: 3.0 KB
Line 
1!
2!$Header$
3!
4MODULE mod_phys_lmdz_para
5  USE mod_phys_lmdz_transfert_para
6  USE mod_phys_lmdz_mpi_data
7  USE mod_phys_lmdz_omp_data
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!$OMP THREADPRIVATE(is_sequential,is_parallel)
16 
17CONTAINS
18
19  SUBROUTINE Init_phys_lmdz_para(iim,jjp1,comm_lmdz, nb_proc,distrib)
20  IMPLICIT NONE
21    INTEGER,INTENT(in) :: iim
22    INTEGER,INTENT(in) :: jjp1
23    INTEGER,INTENT(in) :: comm_lmdz
24    INTEGER,INTENT(in) :: nb_proc
25    INTEGER,INTENT(in) :: distrib(0:nb_proc-1)
26
27    CALL Init_phys_lmdz_mpi_data(iim,jjp1,comm_lmdz, nb_proc, distrib)
28!$OMP PARALLEL
29    CALL Init_phys_lmdz_omp_data(klon_mpi)
30    klon_loc=klon_omp
31    IF (is_mpi_master .AND. is_omp_master) THEN
32       is_master=.TRUE.
33     ELSE
34       is_master=.FALSE.
35     ENDIF
36     CALL Test_transfert
37!$OMP END PARALLEL   
38     IF (is_using_mpi .OR. is_using_omp) THEN
39       is_sequential=.FALSE.
40       is_parallel=.TRUE.
41     ELSE
42       is_sequential=.TRUE.
43       is_parallel=.FALSE.
44     ENDIF
45     
46  END SUBROUTINE Init_phys_lmdz_para
47
48  SUBROUTINE Test_transfert
49  USE mod_grid_phy_lmdz, only: klon_glo, nbp_lev, nbp_lon, nbp_lat, &
50                               grid1dTo2d_glo, grid2dTo1d_glo
51  IMPLICIT NONE
52!    INCLUDE "iniprint.h"
53 
54    REAL :: Test_Field1d_glo(klon_glo,nbp_lev)
55    REAL :: tmp1d_glo(klon_glo,nbp_lev)
56    REAL :: Test_Field2d_glo(nbp_lon,nbp_lat,nbp_lev)
57    REAL :: tmp2d_glo(nbp_lon,nbp_lat,nbp_lev)
58    REAL :: Test_Field1d_loc(klon_loc,nbp_lev)
59    REAL :: Test_Field2d_loc(nbp_lon,jj_nb,nbp_lev)
60    REAL :: CheckSum
61   
62    INTEGER :: i,l
63 
64    Test_Field1d_glo = 0.
65    Test_Field2d_glo = 0.
66    Test_Field1d_loc = 0.
67    Test_Field2d_loc = 0.
68 
69    IF (is_mpi_master) THEN
70!$OMP MASTER
71      DO l=1,nbp_lev
72        DO i=1,klon_glo
73!          Test_Field1d_glo(i,l)=MOD(i,10)+10*(l-1)
74           Test_Field1d_glo(i,l)=1
75        ENDDO
76      ENDDO
77!$OMP END MASTER 
78    ENDIF
79 
80    CALL Scatter(Test_Field1d_glo,Test_Field1d_loc)
81    CALL Gather(Test_Field1d_loc,tmp1d_glo)
82 
83    IF (is_mpi_master) THEN
84!$OMP MASTER 
85      Checksum=sum(Test_Field1d_glo-tmp1d_glo)
86      WRITE(*,*) "------> Checksum =",Checksum," MUST BE 0"
87!$OMP END MASTER
88    ENDIF
89   
90    CALL grid1dTo2d_glo(Test_Field1d_glo,Test_Field2d_glo)
91    CALL scatter2D(Test_Field2d_glo,Test_Field1d_loc)
92    CALL gather2d(Test_Field1d_loc,Test_Field2d_glo)
93    CALL grid2dTo1d_glo(Test_Field2d_glo,tmp1d_glo)
94
95    IF (is_mpi_master) THEN
96!$OMP MASTER 
97      Checksum=sum(Test_Field1d_glo-tmp1d_glo)
98      WRITE(*,*) "------> Checksum =",Checksum," MUST BE 0"
99!$OMP END MASTER
100    ENDIF
101
102    CALL bcast(Test_Field1d_glo)
103    CALL reduce_sum(Test_Field1d_glo,tmp1d_glo)
104
105    IF (is_mpi_master) THEN
106!$OMP MASTER 
107      Checksum=sum(Test_Field1d_glo*omp_size*mpi_size-tmp1d_glo)
108      WRITE(*,*) "------> Checksum =",Checksum," MUST BE 0"
109!$OMP END MASTER
110    ENDIF
111   
112     
113   END SUBROUTINE Test_transfert
114 
115END MODULE mod_phys_lmdz_para
116   
Note: See TracBrowser for help on using the repository browser.