source: codes/icosagcm/branches/SATURN_DYNAMICO/ICOSAGCM/src/omp_para.F90 @ 316

Last change on this file since 316 was 221, checked in by ymipsl, 10 years ago

Creating temporary dynamico/lmdz/saturn branche

YM

File size: 2.5 KB
Line 
1MODULE omp_para
2
3  INTEGER,SAVE :: omp_size
4  INTEGER,SAVE :: omp_rank
5!$OMP THREADPRIVATE(omp_rank)
6
7  LOGICAL,SAVE :: omp_first
8  LOGICAL,SAVE :: omp_last
9  LOGICAL,SAVE :: omp_master
10!$OMP THREADPRIVATE(omp_first, omp_last,omp_master)
11
12  INTEGER,SAVE :: ll_begin
13  INTEGER,SAVE :: ll_beginp1
14  INTEGER,SAVE :: ll_end
15  INTEGER,SAVE :: ll_endm1
16  INTEGER,SAVE :: ll_endp1
17!$OMP THREADPRIVATE(ll_begin,ll_beginp1,ll_end,ll_endm1,ll_endp1)
18  LOGICAL,SAVE :: using_openmp
19
20  LOGICAL,PARAMETER :: omp_by_domain=.TRUE. 
21
22CONTAINS
23
24
25  SUBROUTINE init_omp_para
26  USE grid_param
27#ifdef CPP_USING_OMP
28  USE omp_lib
29#endif
30  IMPLICIT NONE
31  INTEGER :: ll_nb,i
32
33#ifdef CPP_USING_OMP
34  using_openmp=.TRUE.
35#else
36  using_openmp=.FALSE.
37#endif
38
39  IF (using_openmp) THEN   
40!$OMP PARALLEL PRIVATE(ll_nb,i)
41 
42!$OMP MASTER
43#ifdef CPP_USING_OMP
44    omp_size=OMP_GET_NUM_THREADS()
45#endif
46!$OMP END MASTER
47!$OMP BARRIER
48#ifdef CPP_USING_OMP
49    omp_rank=OMP_GET_THREAD_NUM()
50#endif
51
52    IF (omp_by_domain) THEN
53      omp_first=.TRUE.
54      omp_last=.TRUE.
55      IF (omp_rank==0) THEN
56        omp_master=.TRUE.
57      ELSE
58        omp_master=.FALSE.
59      ENDIF
60     
61      ll_begin=1
62      ll_beginp1=2
63      ll_end=llm
64      ll_endm1=llm-1
65      ll_endp1=llm+1
66     
67    ELSE   
68   
69      omp_first=.FALSE.
70      omp_last=.FALSE.
71      omp_master=.FALSE.
72   
73      IF (omp_rank==0) THEN
74        omp_first=.TRUE.
75        omp_master=.TRUE.
76      ENDIF
77   
78      IF (omp_rank==omp_size-1) omp_last=.TRUE.
79   
80      ll_end=0
81      DO i=0,omp_rank
82        ll_begin=ll_end+1
83        ll_nb=llm/omp_size
84        IF (MOD(llm,omp_size)>i) ll_nb=ll_nb+1
85        ll_end=ll_begin+ll_nb-1
86      ENDDO
87   
88      ll_beginp1=ll_begin
89      ll_endp1=ll_end
90      ll_endm1=ll_end
91
92      IF (omp_first) ll_beginp1=ll_begin+1
93      IF (omp_last) ll_endp1=ll_endp1+1
94      IF (omp_last) ll_endm1=ll_endm1-1
95   
96    ENDIF
97!$OMP END PARALLEL
98
99   ELSE
100     omp_size=1
101     omp_rank=0
102     omp_first=.TRUE.
103     omp_last=.TRUE.
104     omp_master=.TRUE.
105     ll_begin=1
106     ll_beginp1=2
107     ll_end=llm
108     ll_endm1=llm-1
109     ll_endp1=llm+1
110   ENDIF
111   
112  END SUBROUTINE init_omp_para
113
114  FUNCTION omp_in_parallel()
115#ifdef CPP_USING_OMP
116  USE omp_lib, ONLY : omp_in_parallel_=>omp_in_parallel
117#endif
118  IMPLICIT NONE
119    LOGICAL :: omp_in_parallel
120   
121#ifdef CPP_USING_OMP
122    omp_in_parallel=omp_in_parallel_()
123#else
124    omp_in_parallel=.FALSE.
125#endif
126
127  END FUNCTION  omp_in_parallel 
128     
129END MODULE omp_para
130   
131   
132     
133             
134 
135   
Note: See TracBrowser for help on using the repository browser.