GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/rrtm/yomoml.F90 Lines: 0 34 0.0 %
Date: 2023-06-30 12:51:15 Branches: 0 12 0.0 %

Line Branch Exec Source
1
MODULE YOMOML
2
3
!-- the following system specific omp_lib-module is not always available (e.g. pgf90)
4
!! use omp_lib
5
6
USE PARKIND1  ,ONLY : JPIM, JPIB
7
8
!**SS/18-Feb-2005
9
!--Dr.Hook references removed, because these locks may also be
10
!  called from within drhook.c itself !!
11
!--Also, there could be considerable & unjustified overhead
12
!  when using Dr.Hook in such a low level
13
14
!**SS/15-Dec-2005
15
!--The size of lock-variables are now OMP_LOCK_KIND as of in OMP_LIB,
16
!  and OMP_LOCK_KIND is aliased to OML_LOCK_KIND
17
!  OMP_LOCK_KIND is usually 4 in 32-bit addressing mode
18
!                           8 in 64-bit addressing mode
19
!--M_OML_LOCK changed to M_EVENT and kept as 32-bit int
20
!--OML_FUNCT changed to OML_TEST_EVENT
21
!--M_LOCK initialized to -1
22
!--M_EVENT initialized to 0
23
!--Added intent(s)
24
!--Support for omp_lib (but not always available)
25
!--Locks can now also be set/unset OUTSIDE the parallel regions
26
!--Added routine OML_TEST_LOCK (attempts to set lock, but if *un*successful, does NOT  block)
27
!--Buffer-zone for M_LOCK; now a vector of 2 elements in case problems/inconsistencies with OMP_LOCK_KIND 4/8
28
29
!**SS/22-Feb-2006
30
!--Locking routines are doing nothing unless OMP_GET_MAX_THREADS() > 1
31
!  This is to avoid unacceptable deadlocks/timeouts with signal handlers when
32
!  the only thread receives signal while inside locked region
33
!--Affected routines: OML_TEST_LOCK()  --> always receives .TRUE.
34
!                     OML_SET_LOCK()   --> sets nothing
35
!                     OML_UNSET_LOCK() --> unsets nothing
36
!                     OML_INIT_LOCK()  --> inits nothing
37
38
!**SS/11-Sep-2006
39
!--Added OML_DEBUG feature
40
41
IMPLICIT NONE
42
43
SAVE
44
45
PRIVATE
46
47
LOGICAL :: OML_DEBUG = .FALSE.
48
!$OMP THREADPRIVATE(OML_DEBUG)
49
50
PUBLIC OML_WAIT_EVENT, OML_SET_EVENT, OML_INCR_EVENT, &
51
   &   OML_MY_THREAD,  OML_MAX_THREADS , OML_OMP, &
52
   &   OML_IN_PARALLEL, OML_TEST_EVENT, &
53
   &   OML_UNSET_LOCK, OML_INIT_LOCK, OML_SET_LOCK, OML_DESTROY_LOCK, &
54
   &   OML_LOCK_KIND, OML_TEST_LOCK, OML_DEBUG
55
56
!-- The following should normally be 4 in 32-bit addressing mode
57
!                                    8 in 64-bit addressing mode
58
! Since system specific omp_lib-module is not always available (e.g. pgf90)
59
! we hardcode OML_LOCK_KIND to JPIB (usually 8) for now
60
!!INTEGER(KIND=JPIM), PARAMETER :: OML_LOCK_KIND = OMP_LOCK_KIND
61
INTEGER(KIND=JPIM), PARAMETER :: OML_LOCK_KIND = JPIB
62
63
!-- Note: Still JPIM !!
64
INTEGER(KIND=JPIM) :: M_EVENT = 0
65
!$OMP THREADPRIVATE(M_EVENT)
66
67
!-- Note: OML_LOCK_KIND, not JPIM !!
68
INTEGER(KIND=OML_LOCK_KIND) :: M_LOCK(2) = (/-1, -1/)
69
!$OMP THREADPRIVATE(M_LOCK)
70
71
CONTAINS
72
73
FUNCTION OML_OMP()
74
LOGICAL :: OML_OMP
75
OML_OMP=.FALSE.
76
!$ OML_OMP=.TRUE.
77
END FUNCTION OML_OMP
78
79
FUNCTION OML_IN_PARALLEL()
80
LOGICAL :: OML_IN_PARALLEL
81
!$ LOGICAL :: OMP_IN_PARALLEL
82
!$ INTEGER(KIND=JPIM) OMP_GET_MAX_THREADS
83
OML_IN_PARALLEL=.FALSE.
84
!$ OML_IN_PARALLEL=((OMP_GET_MAX_THREADS() > 1).AND.OMP_IN_PARALLEL())
85
END FUNCTION OML_IN_PARALLEL
86
87
FUNCTION OML_TEST_LOCK(MYLOCK)
88
INTEGER(KIND=OML_LOCK_KIND),intent(inout),optional :: MYLOCK
89
LOGICAL :: OML_TEST_LOCK
90
!$ LOGICAL :: OMP_TEST_LOCK
91
!$ INTEGER(KIND=JPIM) OMP_GET_MAX_THREADS
92
OML_TEST_LOCK = .TRUE.
93
!$ IF(OMP_GET_MAX_THREADS() > 1) THEN
94
!$   IF(PRESENT(MYLOCK))THEN
95
!$     OML_TEST_LOCK = OMP_TEST_LOCK(MYLOCK)
96
!$   ELSE
97
!$     OML_TEST_LOCK = OMP_TEST_LOCK(M_LOCK(1))
98
!$   ENDIF
99
!$ ENDIF
100
END FUNCTION OML_TEST_LOCK
101
102
SUBROUTINE OML_UNSET_LOCK(MYLOCK)
103
INTEGER(KIND=OML_LOCK_KIND),intent(inout),optional :: MYLOCK
104
!$ INTEGER(KIND=JPIM) OMP_GET_MAX_THREADS
105
!$ IF(OMP_GET_MAX_THREADS() > 1) THEN
106
!$   IF(PRESENT(MYLOCK))THEN
107
!$     CALL OMP_UNSET_LOCK(MYLOCK)
108
!$   ELSE
109
!$     CALL OMP_UNSET_LOCK(M_LOCK(1))
110
!$   ENDIF
111
!$ ENDIF
112
END SUBROUTINE OML_UNSET_LOCK
113
114
SUBROUTINE OML_SET_LOCK(MYLOCK)
115
INTEGER(KIND=OML_LOCK_KIND),intent(inout),optional :: MYLOCK
116
!$ INTEGER(KIND=JPIM) OMP_GET_MAX_THREADS
117
!$ IF(OMP_GET_MAX_THREADS() > 1) THEN
118
!$   IF(PRESENT(MYLOCK))THEN
119
!$     CALL OMP_SET_LOCK(MYLOCK)
120
!$   ELSE
121
!$     CALL OMP_SET_LOCK(M_LOCK(1))
122
!$   ENDIF
123
!$ ENDIF
124
END SUBROUTINE OML_SET_LOCK
125
126
SUBROUTINE OML_INIT_LOCK(MYLOCK)
127
INTEGER(KIND=OML_LOCK_KIND),intent(inout),optional :: MYLOCK
128
!$ INTEGER(KIND=JPIM) OMP_GET_MAX_THREADS
129
!$ IF(OMP_GET_MAX_THREADS() > 1) THEN
130
!$   IF(PRESENT(MYLOCK))THEN
131
!$     CALL OMP_INIT_LOCK(MYLOCK)
132
!$   ELSE
133
!$     CALL OMP_INIT_LOCK(M_LOCK(1))
134
!$   ENDIF
135
!$ ENDIF
136
END SUBROUTINE OML_INIT_LOCK
137
138
SUBROUTINE OML_DESTROY_LOCK(MYLOCK)
139
INTEGER(KIND=OML_LOCK_KIND),intent(inout),optional :: MYLOCK
140
!$ IF(PRESENT(MYLOCK))THEN
141
!$   CALL OMP_DESTROY_LOCK(MYLOCK)
142
!$ ELSE
143
!$   CALL OMP_DESTROY_LOCK(M_LOCK(1))
144
!$ ENDIF
145
END SUBROUTINE OML_DESTROY_LOCK
146
147
FUNCTION OML_TEST_EVENT(K,MYEVENT)
148
LOGICAL :: OML_TEST_EVENT
149
INTEGER(KIND=JPIM),intent(in) :: K,MYEVENT
150
IF(K.EQ.MYEVENT) THEN
151
 OML_TEST_EVENT =.TRUE.
152
ELSE
153
 OML_TEST_EVENT=.FALSE.
154
ENDIF
155
END FUNCTION OML_TEST_EVENT
156
157
SUBROUTINE OML_WAIT_EVENT(K,MYEVENT)
158
INTEGER(KIND=JPIM),intent(in) :: K
159
INTEGER(KIND=JPIM),intent(in),OPTIONAL :: MYEVENT
160
IF(PRESENT(MYEVENT))THEN
161
  DO
162
    IF(OML_TEST_EVENT(K,MYEVENT)) EXIT
163
  ENDDO
164
ELSE
165
  DO
166
    IF(OML_TEST_EVENT(K,M_EVENT)) EXIT
167
  ENDDO
168
ENDIF
169
END SUBROUTINE OML_WAIT_EVENT
170
171
SUBROUTINE OML_SET_EVENT(K,MYEVENT)
172
INTEGER(KIND=JPIM),intent(in) :: K
173
INTEGER(KIND=JPIM),intent(out),OPTIONAL :: MYEVENT
174
IF(PRESENT(MYEVENT))THEN
175
  MYEVENT=K
176
ELSE
177
  M_EVENT=K
178
ENDIF
179
END SUBROUTINE OML_SET_EVENT
180
181
SUBROUTINE OML_INCR_EVENT(K,MYEVENT)
182
INTEGER(KIND=JPIM) :: K
183
INTEGER(KIND=JPIM),intent(inout),OPTIONAL :: MYEVENT
184
IF(PRESENT(MYEVENT))THEN
185
  MYEVENT=MYEVENT+K
186
ELSE
187
  M_EVENT=M_EVENT+K
188
ENDIF
189
END SUBROUTINE OML_INCR_EVENT
190
191
FUNCTION OML_MY_THREAD()
192
INTEGER(KIND=JPIM) :: OML_MY_THREAD
193
!$ INTEGER(KIND=JPIM) OMP_GET_THREAD_NUM
194
OML_MY_THREAD = 1
195
!$ OML_MY_THREAD = OMP_GET_THREAD_NUM() + 1
196
END FUNCTION OML_MY_THREAD
197
198
FUNCTION OML_MAX_THREADS()
199
INTEGER(KIND=JPIM) :: OML_MAX_THREADS
200
!$ INTEGER(KIND=JPIM) OMP_GET_MAX_THREADS
201
OML_MAX_THREADS = 1
202
!$ OML_MAX_THREADS = OMP_GET_MAX_THREADS()
203
END FUNCTION OML_MAX_THREADS
204
205
END MODULE YOMOML