My Project
 All Classes Files Functions Variables Macros
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(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 
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
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