SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
modd_surfex_omp.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! ######################
7 ! ######################
8 !
9 !!**** *MODD_SURFEX_OMP
10 !!
11 !! PURPOSE
12 !! -------
13 !
14 !!
15 !!** IMPLICIT ARGUMENTS
16 !! ------------------
17 !! None
18 !!
19 !! REFERENCE
20 !! ---------
21 !!
22 !! AUTHOR
23 !! ------
24 !! S. Faroux *Meteo France*
25 !!
26 !! MODIFICATIONS
27 !! -------------
28 !! Original 26/06/12
29 !! Modified 11/2013 by J.Escobar :add !$ to inhibit completly omp
30 !! dependency
31 !
32 !* 0. DECLARATIONS
33 ! ------------
34 !
35 USE yomhook ,ONLY : lhook, dr_hook
36 USE parkind1 ,ONLY : jprb
37 !
38 #ifdef AIX64
39  USE omp_lib
40 #endif
41 !
42 IMPLICIT NONE
43 !
44 #ifndef AIX64
45  include 'omp_lib.h'
46 #endif
47 !
48 !RJ: this broke non openmp version before
49 !RJ: OMP_GET_THREAD_NUM() returns 0 for first omp thread
50 !RJ: OMP_GET_NUM_THREADS() returns 1 for omp thread count
51 #ifdef RJ_OFIX
52 INTEGER :: NBLOCKTOT = 1
53 INTEGER :: NBLOCK = 0
54 #else
55 INTEGER :: NBLOCKTOT = 1
56 INTEGER :: NBLOCK = 1
57 #endif
58 !$OMP THREADPRIVATE(NBLOCK)
59 INTEGER :: NINDX1SFX = 1
60 !$OMP THREADPRIVATE(NINDX1SFX)
61 INTEGER :: NINDX2SFX = 1
62 !$OMP THREADPRIVATE(NINDX2SFX)
63 INTEGER :: IDC = 0
64 !
65  CHARACTER(LEN=100) :: CWORK0, CWORKB
66 LOGICAL :: LWORK0
67 LOGICAL, DIMENSION(:), POINTER :: LWORKD
68 INTEGER :: NWORK0, NWORKVAR, NWORKB, NWORKDIMS
69 INTEGER, DIMENSION(4) :: NWORKLEN
70 INTEGER, DIMENSION(4) :: NWORKIDS
71 INTEGER, DIMENSION(:), POINTER :: NWORK_FULL
72 INTEGER, DIMENSION(:), POINTER :: NWORKD
73 INTEGER, DIMENSION(:), POINTER :: NWORK
74 INTEGER, DIMENSION(:,:), POINTER :: NWORK2_FULL
75 INTEGER, DIMENSION(:,:), POINTER :: NWORKD2
76 INTEGER, DIMENSION(:,:), POINTER :: NWORK2
77 INTEGER, DIMENSION(:,:,:), POINTER :: NWORKD3
78 REAL :: XWORK0
79 REAL, DIMENSION(:), POINTER :: XWORK_FULL
80 REAL, DIMENSION(:), POINTER :: XWORKD
81 REAL, DIMENSION(:), POINTER :: XWORK
82 REAL, DIMENSION(:,:), POINTER :: XWORK2_FULL
83 REAL, DIMENSION(:,:), POINTER :: XWORKD2
84 REAL, DIMENSION(:,:), POINTER :: XWORK2
85 REAL, DIMENSION(:,:,:), POINTER :: XWORKD3
86 REAL, DIMENSION(:,:,:), POINTER :: XWORK3
87 !
88  CONTAINS
89 !
90 !*********************************************************
91 !
92 SUBROUTINE init_dim(KSIZE_OMP,KBLOCK,KKPROMA,KINDX1,KINDX2)
93 !
94 !RJ: work around to detect serial regions
95 !RJ INTEGER, DIMENSION(0:NBLOCKTOT-1), INTENT(IN) :: KSIZE_OMP
96 INTEGER, DIMENSION(0:), INTENT(IN) :: ksize_omp
97 INTEGER, INTENT(IN) :: kblock
98 INTEGER, INTENT(OUT) :: kkproma
99 INTEGER, INTENT(OUT) :: kindx1
100 INTEGER, INTENT(OUT) :: kindx2
101 !
102 REAL(KIND=JPRB) :: zhook_handle
103 !
104 IF (lhook) CALL dr_hook('MODD_SURFEX_OMP:INIT_DIM',0,zhook_handle)
105 !
106 IF((kblock<SIZE(ksize_omp)).AND.(kblock<nblocktot)) THEN
107 kkproma = ksize_omp(kblock)
108 kindx2 = sum(ksize_omp(0:kblock))
109 kindx1 = kindx2 - kkproma + 1
110 ELSE
111 write(0,*) "Warning[OMP]: dummy dim init for KBLOCK=",kblock
112 kkproma=0
113 kindx2=-666
114 kindx1=-666
115 ENDIF
116 !
117 IF (lhook) CALL dr_hook('MODD_SURFEX_OMP:INIT_DIM',1,zhook_handle)
118 !
119 END SUBROUTINE init_dim
120 !
121 !*********************************************************
122 !
123 SUBROUTINE reset_dim(KNI,KKPROMA,KINDX1,KINDX2)
124 !
125 INTEGER, INTENT(IN) :: kni
126 INTEGER, INTENT(OUT) :: kkproma
127 INTEGER, INTENT(OUT) :: kindx1
128 INTEGER, INTENT(OUT) :: kindx2
129 !
130 REAL(KIND=JPRB) :: zhook_handle
131 !
132 IF (lhook) CALL dr_hook('MODD_SURFEX_OMP:RESET_DIM',0,zhook_handle)
133 !
134 kkproma = kni
135 kindx2 = kni
136 kindx1 = 1
137 !
138 IF (lhook) CALL dr_hook('MODD_SURFEX_OMP:RESET_DIM',1,zhook_handle)
139 !
140 END SUBROUTINE reset_dim
141 !
142 !*********************************************************
143 !
144 SUBROUTINE plog_omp(HLOG,RLOG,KLOG,KLOG2,OLOG)
145 !
146  CHARACTER(LEN=*), INTENT(IN) :: hlog
147 REAL, INTENT(IN),OPTIONAL :: rlog
148 INTEGER, INTENT(IN), OPTIONAL :: klog
149 INTEGER, INTENT(IN), OPTIONAL :: klog2
150 LOGICAL, INTENT(IN), OPTIONAL :: olog
151 !
152 INTEGER :: me
153 REAL(KIND=JPRB) :: zhook_handle
154 !
155 IF (lhook) CALL dr_hook('MODD_SURFEX_OMP:PLOG_OMP',0,zhook_handle)
156 !
157 !$ ME = OMP_GET_THREAD_NUM()
158 !
159 IF (present(olog)) THEN
160  IF (present(rlog)) THEN
161  IF (present(klog)) THEN
162  IF (present(klog2)) THEN
163  print*,me, hlog, klog, klog2, rlog, olog
164  ELSE
165  print*,me, hlog, klog, rlog, olog
166  ENDIF
167  ELSE
168  print*,me, hlog, rlog, olog
169  ENDIF
170  ELSEIF (present(klog)) THEN
171  IF (present(klog2)) THEN
172  print*,me, hlog, klog, klog2, olog
173  ELSE
174  print*,me, hlog, klog, olog
175  ENDIF
176  ELSE
177  print*,me, hlog, olog
178  ENDIF
179 ELSEIF (present(rlog)) THEN
180  IF (present(klog)) THEN
181  IF (present(klog2)) THEN
182  print*,me, hlog, klog, klog2, rlog
183  ELSE
184  print*,me, hlog, klog, rlog
185  ENDIF
186  ELSE
187  print*,me, hlog, rlog
188  ENDIF
189 ELSEIF (present(klog)) THEN
190  IF (present(klog2)) THEN
191  print*,me, hlog, klog, klog2
192  ELSE
193  print*,me, hlog, klog
194  ENDIF
195 ELSE
196  print*,me, hlog
197 ENDIF
198 !
199 IF (lhook) CALL dr_hook('MODD_SURFEX_OMP:PLOG_OMP',1,zhook_handle)
200 !
201 END SUBROUTINE plog_omp
202 !
203 !*********************************************************
204 !
205 END MODULE modd_surfex_omp
206 
subroutine plog_omp(HLOG, RLOG, KLOG, KLOG2, OLOG)
subroutine init_dim(KSIZE_OMP, KBLOCK, KKPROMA, KINDX1, KINDX2)
subroutine reset_dim(KNI, KKPROMA, KINDX1, KINDX2)