source: codes/icosagcm/trunk/src/omp_para.F90 @ 151

Last change on this file since 151 was 151, checked in by ymipsl, 11 years ago

Implementation of mixte parallelism MPI/OpenMP into src directory

YM

File size: 1.8 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
20CONTAINS
21
22
23  SUBROUTINE init_omp_para
24  USE grid_param
25#ifdef CPP_USING_OPENMP
26  USE omp_lib
27#endif
28  IMPLICIT NONE
29  INTEGER :: ll_nb,i
30
31#ifdef CPP_USING_OPENMP
32  using_openmp=.TRUE.
33#else
34  using_openmp=.FALSE.
35#endif
36
37  IF (using_openmp) THEN   
38!$OMP PARALLEL PRIVATE(ll_nb,i)
39 
40!$OMP MASTER
41#ifdef CPP_USING_OPENMP
42    omp_size=OMP_GET_NUM_THREADS()
43#endif
44!$OMP END MASTER
45!$OMP BARRIER
46#ifdef CPP_USING_OPENMP
47    omp_rank=OMP_GET_THREAD_NUM()
48#endif
49    omp_first=.FALSE.
50    omp_last=.FALSE.
51    omp_master=.FALSE.
52   
53    IF (omp_rank==0) THEN
54      omp_first=.TRUE.
55      omp_master=.TRUE.
56    ENDIF
57   
58    IF (omp_rank==omp_size-1) omp_last=.TRUE.
59   
60    ll_end=0
61    DO i=0,omp_rank
62      ll_begin=ll_end+1
63      ll_nb=llm/omp_size
64      IF (MOD(llm,omp_size)>i) ll_nb=ll_nb+1
65      ll_end=ll_begin+ll_nb-1
66    ENDDO
67   
68    ll_beginp1=ll_begin
69    ll_endp1=ll_end
70    ll_endm1=ll_end
71
72    IF (omp_first) ll_beginp1=ll_begin+1
73    IF (omp_last) ll_endp1=ll_endp1+1
74    IF (omp_last) ll_endm1=ll_endm1-1
75
76!$OMP END PARALLEL
77
78   ELSE
79     omp_size=1
80     omp_rank=0
81     omp_first=.TRUE.
82     omp_last=.TRUE.
83     omp_master=.TRUE.
84     ll_begin=1
85     ll_beginp1=2
86     ll_end=llm
87     ll_endm1=llm-1
88     ll_endp1=llm+1
89   ENDIF
90   
91  END SUBROUTINE init_omp_para
92
93 
94END MODULE omp_para
95   
96   
97     
98             
99 
100   
Note: See TracBrowser for help on using the repository browser.