source: LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/mod_phys_lmdz_para.F90 @ 2661

Last change on this file since 2661 was 1318, checked in by yann meurdesoif, 15 years ago

YM : Parallelisation COSP MPI+OpenMP

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