source: trunk/LMDZ.COMMON/libf/phy_common/mod_phys_lmdz_omp_data.F90 @ 1672

Last change on this file since 1672 was 1572, checked in by emillour, 9 years ago

All GCMs:
Further adaptations to keep up with changes in LMDZ5 concerning
physics/dynamics separation (up to rev r2500 of LMDZ5)

  • arch:
  • remove ifort debug option '-check all', replace it with '-check bounds,format,output_conversion,pointers,uninit' (i.e. get it to stop complaining about copying into temporary arrays)
  • dyn3d_common:
  • comconst_mod.F90 : add ngroup
  • dyn3d:
  • gcm.F90 : minor bug fix (arguments to a call_abort())
  • leapfrog.F90 : recompute geopotential for bilan_dyn outputs
  • conf_gcm.F90 : read "ngroup" from run.def
  • groupe.F , groupeun.F : ngroup no longer a local parameter
  • dyn3d_par:
  • conf_gcm.F90 : read "ngroup" from run.def
  • groupe_p.F , groupeun_p.F : ngroup no longer a local parameter
  • misc:
  • regr1_step_av_m.F90 : removed (not used)
  • phy_common:
  • mod_phys_lmdz_mpi_transfert.F90 , mod_phys_lmdz_mpi_data.F90 : change is_north_pole and is_south_pole to is_north_pole_dyn and is_south_pole_dyn
  • mod_phys_lmdz_omp_data.F90 : introduce is_nort_pole_phy and is_south_pole_phy
  • dynphy_lonlat:
  • mod_interface_dyn_phys.F90 : use is_north_pole_dyn and is_south_pole_dyn
  • calfis_p.F : use is_north_pole_dyn and is_south_pole_dyn
  • phyvenus:
  • physiq_mod , write_hist*.h : use is_north_pole_phy and is_south_pole_phy to correctly compute mesh area at poles to send to hist*nc files.
  • phytitan:
  • physiq_mod , write_hist*.h : use is_north_pole_phy and is_south_pole_phy to correctly compute mesh area at poles to send to hist*nc files.

EM

File size: 3.3 KB
Line 
1!
2!$Id: mod_phys_lmdz_omp_data.F90 2429 2016-01-27 12:43:09Z fairhead $
3!
4MODULE mod_phys_lmdz_omp_data
5
6  INTEGER,SAVE :: omp_size
7  INTEGER,SAVE :: omp_rank
8  LOGICAL,SAVE :: is_omp_root
9  LOGICAL,SAVE :: is_using_omp
10  LOGICAL,SAVE :: is_north_pole_phy, is_south_pole_phy
11 
12  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: klon_omp_para_nb
13  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: klon_omp_para_begin
14  INTEGER,SAVE,DIMENSION(:),ALLOCATABLE :: klon_omp_para_end   
15 
16  INTEGER,SAVE :: klon_omp
17  INTEGER,SAVE :: klon_omp_begin
18  INTEGER,SAVE :: klon_omp_end
19!$OMP  THREADPRIVATE(omp_rank,klon_omp,is_omp_root,klon_omp_begin,klon_omp_end)
20!$OMP  THREADPRIVATE(is_north_pole_phy, is_south_pole_phy)
21
22CONTAINS
23 
24  SUBROUTINE Init_phys_lmdz_omp_data(klon_mpi)
25    USE dimphy
26    USE mod_phys_lmdz_mpi_data, ONLY : is_north_pole_dyn, is_south_pole_dyn
27    IMPLICIT NONE
28    INTEGER, INTENT(in) :: klon_mpi
29
30    INTEGER :: i
31
32    CHARACTER (LEN=20) :: modname='Init_phys_lmdz_omp_data'
33    CHARACTER (LEN=80) :: abort_message
34
35
36#ifdef CPP_OMP   
37    INTEGER :: OMP_GET_NUM_THREADS
38    EXTERNAL OMP_GET_NUM_THREADS
39    INTEGER :: OMP_GET_THREAD_NUM
40    EXTERNAL OMP_GET_THREAD_NUM
41#endif 
42
43#ifdef CPP_OMP
44!$OMP MASTER
45        is_using_omp=.TRUE.
46        omp_size=OMP_GET_NUM_THREADS()
47!$OMP END MASTER
48!$OMP BARRIER
49        omp_rank=OMP_GET_THREAD_NUM()   
50#else   
51    is_using_omp=.FALSE.
52    omp_size=1
53    omp_rank=0
54#endif
55
56   is_omp_root=.FALSE.
57!$OMP MASTER
58   IF (omp_rank==0) THEN
59     is_omp_root=.TRUE.
60   ELSE
61     abort_message = 'ANORMAL : OMP_MASTER /= 0'
62     CALL abort_gcm (modname,abort_message,1)
63   ENDIF
64!$OMP END MASTER
65
66
67!$OMP MASTER
68
69    ALLOCATE(klon_omp_para_nb(0:omp_size-1))
70    ALLOCATE(klon_omp_para_begin(0:omp_size-1))
71    ALLOCATE(klon_omp_para_end(0:omp_size-1))
72   
73    DO i=0,omp_size-1
74      klon_omp_para_nb(i)=klon_mpi/omp_size
75      IF (i<MOD(klon_mpi,omp_size)) klon_omp_para_nb(i)=klon_omp_para_nb(i)+1
76    ENDDO
77   
78    klon_omp_para_begin(0) = 1
79    klon_omp_para_end(0) = klon_omp_para_nb(0)
80   
81    DO i=1,omp_size-1
82      klon_omp_para_begin(i)=klon_omp_para_end(i-1)+1
83      klon_omp_para_end(i)=klon_omp_para_begin(i)+klon_omp_para_nb(i)-1
84    ENDDO
85!$OMP END MASTER
86!$OMP BARRIER
87
88   if ((is_north_pole_dyn) .AND. (omp_rank == 0 )) then
89      is_north_pole_phy = .TRUE.
90    else
91      is_north_pole_phy = .FALSE.
92    endif
93    if ((is_south_pole_dyn) .AND. (omp_rank == omp_size-1)) then
94      is_south_pole_phy = .TRUE.
95    else
96      is_south_pole_phy = .FALSE.
97    endif
98   
99    klon_omp=klon_omp_para_nb(omp_rank)
100    klon_omp_begin=klon_omp_para_begin(omp_rank)
101    klon_omp_end=klon_omp_para_end(omp_rank)
102   
103    CALL Print_module_data
104   
105  END SUBROUTINE Init_phys_lmdz_omp_data
106
107  SUBROUTINE Print_module_data
108  IMPLICIT NONE
109  INCLUDE "iniprint.h"
110
111!$OMP CRITICAL 
112  WRITE(lunout,*)'--------> TASK ',omp_rank
113  WRITE(lunout,*)'omp_size =',omp_size
114  WRITE(lunout,*)'omp_rank =',omp_rank
115  WRITE(lunout,*)'is_omp_root =',is_omp_root
116  WRITE(lunout,*)'klon_omp_para_nb =',klon_omp_para_nb
117  WRITE(lunout,*)'klon_omp_para_begin =',klon_omp_para_begin
118  WRITE(lunout,*)'klon_omp_para_end =',klon_omp_para_end   
119  WRITE(lunout,*)'klon_omp =',klon_omp
120  WRITE(lunout,*)'klon_omp_begin =',klon_omp_begin
121  WRITE(lunout,*)'klon_omp_end =',klon_omp_end   
122!$OMP END CRITICAL
123
124  END SUBROUTINE Print_module_data
125END MODULE mod_phys_lmdz_omp_data
Note: See TracBrowser for help on using the repository browser.