GCC Code Coverage Report


Directory: ./
File: phys/add_phys_tend_mod.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 60 291 20.6%
Branches: 54 348 15.5%

Line Branch Exec Source
1 !
2 ! $Id$
3 !
4 !
5 MODULE add_phys_tend_mod
6
7 IMPLICIT NONE
8 ! flag to compute diagnostics to check energy conservation. If fl_ebil==0, no check
9 INTEGER, SAVE :: fl_ebil
10 !$OMP THREADPRIVATE(fl_ebil)
11 ! flag to include modifcations to ensure energy conservation. If fl_cor_ebil==0, no corrections
12 ! Note that with time, all these modifications should be included by default
13 INTEGER, SAVE :: fl_cor_ebil
14 !$OMP THREADPRIVATE(fl_cor_ebil)
15
16 CONTAINS
17
18 SUBROUTINE add_pbl_tend(zdu, zdv, zdt, zdq, zdql, zdqi, paprs, text,abortphy,flag_inhib_tend, itap)
19 ! ======================================================================
20 ! Ajoute les tendances de couche limite, soit determinees par la
21 ! parametrisation
22 ! physique, soit forcees, aux variables d etat de la dynamique t_seri,
23 ! q_seri ...
24 ! ======================================================================
25
26
27 ! ======================================================================
28 ! Declarations
29 ! ======================================================================
30
31 USE dimphy, ONLY: klon, klev
32 ! USE dimphy
33 USE phys_local_var_mod
34 USE phys_state_var_mod
35 USE mod_grid_phy_lmdz, ONLY: nbp_lev
36 IMPLICIT NONE
37 REAL,SAVE,ALLOCATABLE :: hthturb_gcssold(:)
38 REAL,SAVE,ALLOCATABLE :: hqturb_gcssold(:)
39 !$OMP THREADPRIVATE(hthturb_gcssold,hqturb_gcssold)
40 REAL,SAVE :: dtime_frcg
41 LOGICAL,SAVE :: turb_fcg_gcssold
42 LOGICAL,SAVE :: firstcall=.true.
43 !$OMP THREADPRIVATE(firstcall,turb_fcg_gcssold,dtime_frcg)
44 INTEGER abortphy
45 ! COMMON /turb_forcing/dtime_frcg, hthturb_gcssold, hqturb_gcssold, &
46 ! turb_fcg_gcssold
47
48 ! Arguments :
49 ! ------------
50 REAL zdu(klon, klev), zdv(klon, klev)
51 REAL zdt(klon, klev), zdq(klon, klev), zdql(klon, klev), zdqi(klon, klev)
52 CHARACTER *(*) text
53 REAL paprs(klon,klev+1)
54 INTEGER flag_inhib_tend ! if flag_inhib_tend != 0, tendencies are not added
55 INTEGER itap ! time step number
56
57 ! Local :
58 ! --------
59 REAL zzdt(klon, klev), zzdq(klon, klev)
60 INTEGER i, k
61
62 IF (firstcall) THEN
63 ALLOCATE(hthturb_gcssold(nbp_lev))
64 ALLOCATE(hqturb_gcssold(nbp_lev))
65 firstcall=.false.
66 ENDIF
67
68 IF (turb_fcg_gcssold) THEN
69 DO k = 1, klev
70 DO i = 1, klon
71 zzdt(i, k) = hthturb_gcssold(k)*dtime_frcg
72 zzdq(i, k) = hqturb_gcssold(k)*dtime_frcg
73 END DO
74 END DO
75 PRINT *, ' add_pbl_tend, dtime_frcg ', dtime_frcg
76 PRINT *, ' add_pbl_tend, zzdt ', zzdt
77 PRINT *, ' add_pbl_tend, zzdq ', zzdq
78 CALL add_phys_tend(zdu, zdv, zzdt, zzdq, zdql, zdqi, paprs, text,abortphy,flag_inhib_tend, itap, 0)
79 ELSE
80 CALL add_phys_tend(zdu, zdv, zdt, zdq, zdql, zdqi, paprs, text,abortphy,flag_inhib_tend, itap, 0)
81 END IF
82
83
84 RETURN
85 END SUBROUTINE add_pbl_tend
86 !
87 ! $Id: add_phys_tend.F90 2611 2016-08-03 15:41:26Z jyg $
88 !
89 6240 SUBROUTINE add_phys_tend (zdu,zdv,zdt,zdq,zdql,zdqi,paprs,text, &
90 abortphy,flag_inhib_tend, itap, diag_mode)
91 !======================================================================
92 ! Ajoute les tendances des variables physiques aux variables
93 ! d'etat de la dynamique t_seri, q_seri ...
94 ! On en profite pour faire des tests sur les tendances en question.
95 !======================================================================
96
97
98 !======================================================================
99 ! Declarations
100 !======================================================================
101
102 USE dimphy, ONLY: klon, klev
103 USE phys_state_var_mod, ONLY : phys_tstep
104 USE phys_local_var_mod, ONLY: u_seri, v_seri, ql_seri, qs_seri, q_seri, t_seri
105 USE phys_state_var_mod, ONLY: ftsol
106 USE geometry_mod, ONLY: longitude_deg, latitude_deg
107 USE print_control_mod, ONLY: prt_level
108 USE cmp_seri_mod
109 USE phys_output_var_mod, ONLY : d_qw_col, d_ql_col, d_qs_col, d_qt_col, d_ek_col, d_h_dair_col &
110 & , d_h_qw_col, d_h_ql_col, d_h_qs_col, d_h_col
111 IMPLICIT none
112 include "YOMCST.h"
113 include "clesphys.h"
114
115 ! Arguments :
116 !------------
117 REAL, DIMENSION(klon,klev), INTENT(IN) :: zdu, zdv
118 REAL, DIMENSION(klon,klev), INTENT(IN) :: zdt, zdql, zdqi
119 REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs
120 CHARACTER*(*), INTENT(IN) :: text
121 INTEGER, INTENT(IN) :: abortphy
122 INTEGER, INTENT(IN) :: flag_inhib_tend ! if not 0, tendencies are not added
123 INTEGER, INTENT(IN) :: itap ! time step number
124 INTEGER, INTENT(IN) :: diag_mode ! 0 -> normal effective mode
125 ! 1 -> only conservation stats are computed
126 !
127 REAL, DIMENSION(klon,klev), INTENT(INOUT) :: zdq
128
129 ! Local :
130 !--------
131 REAL zt,zq
132 REAL zq_int, zqp_int, zq_new
133
134 12480 REAL zqp(klev)
135
136 ! Save variables, used in diagnostic mode (diag_mode=1).
137 12480 REAL, DIMENSION(klon,klev) :: sav_u_seri, sav_v_seri
138 12480 REAL, DIMENSION(klon,klev) :: sav_ql_seri, sav_qs_seri, sav_q_seri
139 12480 REAL, DIMENSION(klon,klev) :: sav_t_seri
140 12480 REAL, DIMENSION(klon,klev) :: sav_zdq
141 !
142 INTEGER i, k,j, n
143 12480 INTEGER jadrs(klon*klev), jbad
144 12480 INTEGER jqadrs(klon*klev), jqbad
145 12480 INTEGER kadrs(klon*klev)
146 12480 INTEGER kqadrs(klon*klev)
147
148 12480 LOGICAL done(klon)
149
150 integer debug_level
151 logical, save :: first=.true.
152 !$OMP THREADPRIVATE(first)
153 !
154 !======================================================================
155 ! Variables for energy conservation tests
156 !======================================================================
157 !
158
159 ! zh_col------- total enthalpy of vertical air column
160 ! (air with watter vapour, liquid and solid) (J/m2)
161 ! zh_dair_col--- total enthalpy of dry air (J/m2)
162 ! zh_qw_col---- total enthalpy of watter vapour (J/m2)
163 ! zh_ql_col---- total enthalpy of liquid watter (J/m2)
164 ! zh_qs_col---- total enthalpy of solid watter (J/m2)
165 ! zqw_col------ total mass of watter vapour (kg/m2)
166 ! zql_col------ total mass of liquid watter (kg/m2)
167 ! zqs_col------ total mass of solid watter (kg/m2)
168 ! zek_col------ total kinetic energy (kg/m2)
169 !
170 12480 REAL zairm(klon, klev) ! layer air mass (kg/m2)
171 12480 REAL zqw_col(klon,2)
172 12480 REAL zql_col(klon,2)
173 12480 REAL zqs_col(klon,2)
174 12480 REAL zek_col(klon,2)
175 12480 REAL zh_dair_col(klon,2)
176 12480 REAL zh_qw_col(klon,2), zh_ql_col(klon,2), zh_qs_col(klon,2)
177 12480 REAL zh_col(klon,2)
178
179 REAL zcpvap, zcwat, zcice
180
181 !======================================================================
182 ! Initialisations
183
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 IF (prt_level >= 5) then
185 write (*,*) "In add_phys_tend, after ",text
186 call flush
187 end if
188
189 ! if flag_inhib_tend != 0, tendencies are not added
190
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 IF (flag_inhib_tend /= 0) then
191 ! If requiered, diagnostics are shown
192 IF (flag_inhib_tend > 0) then
193 ! print some diagnostics if xxx_seri have changed
194 call cmp_seri(flag_inhib_tend,text)
195 END IF
196 RETURN ! on n ajoute pas les tendance
197 END IF
198
199
1/2
✓ Branch 0 taken 6240 times.
✗ Branch 1 not taken.
6240 IF (abortphy==1) RETURN ! on n ajoute pas les tendance si le modele
200 ! a deja plante.
201
202 6240 debug_level=10
203
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6239 times.
6240 if (first) then
204 1 print *,"TestJLD rcpv, rcw, rcs",rcpv, rcw, rcs
205 1 first=.false.
206 endif
207 !
208 ! print *,'add_phys_tend: paprs ',paprs
209 ! When in diagnostic mode, save initial values of out variables
210
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 IF (diag_mode == 1) THEN
211 sav_u_seri(:,:) = u_seri(:,:)
212 sav_v_seri(:,:) = v_seri(:,:)
213 sav_ql_seri(:,:) = ql_seri(:,:)
214 sav_qs_seri(:,:) = qs_seri(:,:)
215 sav_q_seri(:,:) = q_seri(:,:)
216 sav_t_seri(:,:) = t_seri(:,:)
217 sav_zdq(:,:) = zdq(:,:)
218 ENDIF ! (diag_mode == 1)
219 !======================================================================
220 ! Diagnostics for energy conservation tests
221 !======================================================================
222
2/2
✓ Branch 0 taken 243360 times.
✓ Branch 1 taken 6240 times.
249600 DO k = 1, klev
223 ! layer air mass
224
2/2
✓ Branch 0 taken 241899840 times.
✓ Branch 1 taken 243360 times.
242149440 zairm(:, k) = (paprs(:,k)-paprs(:,k+1))/rg
225 END DO
226
227
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 if (fl_ebil .GT. 0) then
228 ! ------------------------------------------------
229 ! Compute vertical sum for each atmospheric column
230 ! ------------------------------------------------
231 n=1 ! begining of time step
232
233 zcpvap = rcpv
234 zcwat = rcw
235 zcice = rcs
236
237 CALL integr_v(klon, klev, zcpvap, &
238 t_seri, q_seri, ql_seri, qs_seri, u_seri, v_seri, zairm, &
239 zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zek_col(:,n), zh_dair_col(:,n), &
240 zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_col(:,n))
241
242 end if ! end if (fl_ebil .GT. 0)
243
244 !======================================================================
245 ! Ajout des tendances sur le vent et l'eau liquide
246 !======================================================================
247
248
4/4
✓ Branch 0 taken 243360 times.
✓ Branch 1 taken 6240 times.
✓ Branch 2 taken 241899840 times.
✓ Branch 3 taken 243360 times.
242149440 u_seri(:,:)=u_seri(:,:)+zdu(:,:)
249
4/4
✓ Branch 0 taken 243360 times.
✓ Branch 1 taken 6240 times.
✓ Branch 2 taken 241899840 times.
✓ Branch 3 taken 243360 times.
242149440 v_seri(:,:)=v_seri(:,:)+zdv(:,:)
250
4/4
✓ Branch 0 taken 243360 times.
✓ Branch 1 taken 6240 times.
✓ Branch 2 taken 241899840 times.
✓ Branch 3 taken 243360 times.
242149440 ql_seri(:,:)=ql_seri(:,:)+zdql(:,:)
251
4/4
✓ Branch 0 taken 243360 times.
✓ Branch 1 taken 6240 times.
✓ Branch 2 taken 241899840 times.
✓ Branch 3 taken 243360 times.
242149440 qs_seri(:,:)=qs_seri(:,:)+zdqi(:,:)
252
253 !======================================================================
254 ! On ajoute les tendances de la temperature et de la vapeur d'eau
255 ! en verifiant que ca ne part pas dans les choux
256 !======================================================================
257
258 6240 jbad=0
259 6240 jqbad=0
260
2/2
✓ Branch 0 taken 243360 times.
✓ Branch 1 taken 6240 times.
249600 DO k = 1, klev
261
2/2
✓ Branch 0 taken 241899840 times.
✓ Branch 1 taken 243360 times.
242149440 DO i = 1, klon
262 241899840 zt=t_seri(i,k)+zdt(i,k)
263 241899840 zq=q_seri(i,k)+zdq(i,k)
264
3/6
✓ Branch 0 taken 241899840 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 241899840 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 241899840 times.
241899840 IF ( zt>370. .or. zt<130. .or. abs(zdt(i,k))>50. ) then
265 jbad = jbad + 1
266 jadrs(jbad) = i
267 kadrs(jbad) = k
268 ENDIF
269
3/6
✓ Branch 0 taken 241899840 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 241899840 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 241899840 times.
241899840 IF ( zq<0. .or. zq>0.1 .or. abs(zdq(i,k))>1.e-2 ) then
270 jqbad = jqbad + 1
271 jqadrs(jqbad) = i
272 kqadrs(jqbad) = k
273 ENDIF
274 241899840 t_seri(i,k)=zt
275 242143200 q_seri(i,k)=zq
276 ENDDO
277 ENDDO
278
279 !=====================================================================================
280 ! Impression et stop en cas de probleme important
281 !=====================================================================================
282
283
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 IF (jbad .GT. 0) THEN
284 DO j = 1, jbad
285 i=jadrs(j)
286 if(prt_level.ge.debug_level) THEN
287 print*,'PLANTAGE POUR LE POINT i lon lat =',&
288 i,longitude_deg(i),latitude_deg(i),text
289 print*,'l T dT Q dQ '
290 DO k = 1, klev
291 write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
292 ENDDO
293 call print_debug_phys(i,debug_level,text)
294 endif
295 ENDDO
296 ENDIF
297 !
298 !=====================================================================================
299 ! Impression, warning et correction en cas de probleme moins important
300 !=====================================================================================
301
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 IF (jqbad .GT. 0) THEN
302 done(:) = .false. !jyg
303 DO j = 1, jqbad
304 i=jqadrs(j)
305 if(prt_level.ge.debug_level) THEN
306 print*,'WARNING : EAU POUR LE POINT i lon lat =',&
307 i,longitude_deg(i),latitude_deg(i),text
308 print*,'l T dT Q dQ '
309 DO k = 1, klev
310 write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
311 ENDDO
312 endif
313 IF (ok_conserv_q) THEN
314 !jyg<20140228 Corrections pour conservation de l'eau
315 IF (.NOT.done(i)) THEN !jyg
316 DO k = 1, klev
317 zqp(k) = max(q_seri(i,k),1.e-15)
318 ENDDO
319 zq_int = 0.
320 zqp_int = 0.
321 DO k = 1, klev
322 zq_int = zq_int + q_seri(i,k)*(paprs(i,k)-paprs(i,k+1))/Rg
323 zqp_int = zqp_int + zqp(k) *(paprs(i,k)-paprs(i,k+1))/Rg
324 ENDDO
325 if(prt_level.ge.debug_level) THEN
326 print*,' cas q_seri<1.e-15 i k zq_int zqp_int zq_int/zqp_int :', &
327 i, kqadrs(j), zq_int, zqp_int, zq_int/zqp_int
328 endif
329 DO k = 1, klev
330 zq_new = zqp(k)*zq_int/zqp_int
331 zdq(i,k) = zdq(i,k) + zq_new - q_seri(i,k)
332 q_seri(i,k) = zq_new
333 ENDDO
334 done(i) = .true.
335 ENDIF !(.NOT.done(i))
336 ELSE
337 !jyg>
338 DO k = 1, klev
339 zq=q_seri(i,k)+zdq(i,k)
340 if (zq.lt.1.e-15) then
341 if (q_seri(i,k).lt.1.e-15) then
342 if(prt_level.ge.debug_level) THEN
343 print*,' cas q_seri<1.e-15 i k q_seri zq zdq :',i,k,q_seri(i,k),zq,zdq(i,k)
344 endif
345 q_seri(i,k)=1.e-15
346 zdq(i,k)=(1.e-15-q_seri(i,k))
347 endif
348 endif
349 ! zq=q_seri(i,k)+zdq(i,k)
350 ! if (zq.lt.1.e-15) then
351 ! zdq(i,k)=(1.e-15-q_seri(i,k))
352 ! endif
353 ENDDO
354 !jyg<20140228
355 ENDIF ! (ok_conserv_q)
356 !jyg>
357 ENDDO ! j = 1, jqbad
358 ENDIF
359 !
360
361 !IM ajout memes tests pour reverifier les jbad, jqbad beg
362 6240 jbad=0
363 6240 jqbad=0
364
2/2
✓ Branch 0 taken 243360 times.
✓ Branch 1 taken 6240 times.
249600 DO k = 1, klev
365
2/2
✓ Branch 0 taken 241899840 times.
✓ Branch 1 taken 243360 times.
242149440 DO i = 1, klon
366
3/6
✓ Branch 0 taken 241899840 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 241899840 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 241899840 times.
241899840 IF ( t_seri(i,k)>370. .or. t_seri(i,k)<130. .or. abs(zdt(i,k))>50. ) then
367 jbad = jbad + 1
368 jadrs(jbad) = i
369 ! if(prt_level.ge.debug_level) THEN
370 ! print*,'cas2 i k t_seri zdt',i,k,t_seri(i,k),zdt(i,k)
371 ! endif
372 ENDIF
373
3/6
✓ Branch 0 taken 241899840 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 241899840 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 241899840 times.
242143200 IF ( q_seri(i,k)<0. .or. q_seri(i,k)>0.1 .or. abs(zdq(i,k))>1.e-2 ) then
374 jqbad = jqbad + 1
375 jqadrs(jqbad) = i
376 kqadrs(jqbad) = k
377 ! if(prt_level.ge.debug_level) THEN
378 ! print*,'cas2 i k q_seri zdq',i,k,q_seri(i,k),zdq(i,k)
379 ! endif
380 ENDIF
381 ENDDO
382 ENDDO
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 IF (jbad .GT. 0) THEN
384 DO j = 1, jbad
385 i=jadrs(j)
386 k=kadrs(j)
387 if(prt_level.ge.debug_level) THEN
388 print*,'PLANTAGE2 POUR LE POINT i itap lon lat txt jbad zdt t',&
389 i,itap,longitude_deg(i),latitude_deg(i),text,jbad, &
390 & zdt(i,k),t_seri(i,k)-zdt(i,k)
391 !!! if(prt_level.ge.10.and.itap.GE.229.and.i.EQ.3027) THEN
392 print*,'l T dT Q dQ '
393 DO k = 1, klev
394 write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
395 ENDDO
396 call print_debug_phys(i,debug_level,text)
397 endif
398 ENDDO
399 ENDIF
400 !
401
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 IF (jqbad .GT. 0) THEN
402 DO j = 1, jqbad
403 i=jqadrs(j)
404 k=kqadrs(j)
405 if(prt_level.ge.debug_level) THEN
406 print*,'WARNING : EAU2 POUR LE POINT i itap lon lat txt jqbad zdq q zdql ql',&
407 i,itap,longitude_deg(i),latitude_deg(i),text,jqbad,&
408 & zdq(i,k), q_seri(i,k)-zdq(i,k), zdql(i,k), ql_seri(i,k)-zdql(i,k)
409 !!! if(prt_level.ge.10.and.itap.GE.229.and.i.EQ.3027) THEN
410 print*,'l T dT Q dQ '
411 DO k = 1, klev
412 write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
413 ENDDO
414 call print_debug_phys(i,debug_level,text)
415 endif
416 ENDDO
417 ENDIF
418
419 !======================================================================
420 ! Contrôle des min/max pour arrêt du modèle
421 ! Si le modele est en mode abortphy, on retire les tendances qu'on
422 ! vient d'ajouter. Pas exactement parce qu'on ne tient pas compte des
423 ! seuils.
424 !======================================================================
425
426 6240 CALL hgardfou(t_seri,ftsol,text,abortphy)
427 IF (abortphy==1) THEN
428 Print*,'ERROR ABORT hgardfou dans ',text
429 ! JLD pourquoi on ne modifie pas de meme t_seri et q_seri ?
430 u_seri(:,:)=u_seri(:,:)-zdu(:,:)
431 v_seri(:,:)=v_seri(:,:)-zdv(:,:)
432 ql_seri(:,:)=ql_seri(:,:)-zdql(:,:)
433 qs_seri(:,:)=qs_seri(:,:)-zdqi(:,:)
434 ENDIF
435
436 !======================================================================
437 ! Diagnostics for energy conservation tests
438 !======================================================================
439
440
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 if (fl_ebil .GT. 0) then
441
442 ! ------------------------------------------------
443 ! Compute vertical sum for each atmospheric column
444 ! ------------------------------------------------
445 n=2 ! end of time step
446
447 CALL integr_v(klon, klev, zcpvap, &
448 t_seri, q_seri, ql_seri, qs_seri, u_seri, v_seri, zairm, &
449 zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zek_col(:,n), zh_dair_col(:,n), &
450 zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_col(:,n))
451
452 ! ------------------------------------------------
453 ! Compute the changes by unit of time
454 ! ------------------------------------------------
455
456 d_qw_col(:) = (zqw_col(:,2)-zqw_col(:,1))/phys_tstep
457 d_ql_col(:) = (zql_col(:,2)-zql_col(:,1))/phys_tstep
458 d_qs_col(:) = (zqs_col(:,2)-zqs_col(:,1))/phys_tstep
459 d_qt_col(:) = d_qw_col(:) + d_ql_col(:) + d_qs_col(:)
460
461 d_ek_col(:) = (zek_col(:,2)-zek_col(:,1))/phys_tstep
462
463 d_h_dair_col(:) = (zh_dair_col(:,2)-zh_dair_col(:,1))/phys_tstep
464 d_h_qw_col(:) = (zh_qw_col(:,2)-zh_qw_col(:,1))/phys_tstep
465 d_h_ql_col(:) = (zh_ql_col(:,2)-zh_ql_col(:,1))/phys_tstep
466 d_h_qs_col(:) = (zh_qs_col(:,2)-zh_qs_col(:,1))/phys_tstep
467
468 d_h_col = (zh_col(:,2)-zh_col(:,1))/phys_tstep
469
470 end if ! end if (fl_ebil .GT. 0)
471 !
472 ! When in diagnostic mode, restore "out" variables to initial values.
473
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6240 times.
6240 IF (diag_mode == 1) THEN
474 u_seri(:,:) = sav_u_seri(:,:)
475 v_seri(:,:) = sav_v_seri(:,:)
476 ql_seri(:,:) = sav_ql_seri(:,:)
477 qs_seri(:,:) = sav_qs_seri(:,:)
478 q_seri(:,:) = sav_q_seri(:,:)
479 t_seri(:,:) = sav_t_seri(:,:)
480 zdq(:,:) = sav_zdq(:,:)
481 ENDIF ! (mode == 1)
482
483 RETURN
484 END SUBROUTINE add_phys_tend
485
486 SUBROUTINE diag_phys_tend (nlon, nlev, uu, vv, temp, qv, ql, qs, &
487 zdu,zdv,zdt,zdq,zdql,zdqs,paprs,text)
488 !======================================================================
489 ! Ajoute les tendances des variables physiques aux variables
490 ! d'etat de la dynamique t_seri, q_seri ...
491 ! On en profite pour faire des tests sur les tendances en question.
492 !======================================================================
493
494
495 !======================================================================
496 ! Declarations
497 !======================================================================
498
499 USE phys_state_var_mod, ONLY : phys_tstep, ftsol
500 USE geometry_mod, ONLY: longitude_deg, latitude_deg
501 USE print_control_mod, ONLY: prt_level
502 USE cmp_seri_mod
503 USE phys_output_var_mod, ONLY : d_qw_col, d_ql_col, d_qs_col, d_qt_col, d_ek_col, d_h_dair_col &
504 & , d_h_qw_col, d_h_ql_col, d_h_qs_col, d_h_col
505 IMPLICIT none
506 include "YOMCST.h"
507 include "clesphys.h"
508
509 ! Arguments :
510 !------------
511 INTEGER, INTENT(IN) :: nlon, nlev
512 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: uu, vv
513 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: temp, qv, ql, qs
514 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: zdu, zdv
515 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: zdt, zdq, zdql, zdqs
516 REAL, DIMENSION(nlon,nlev+1), INTENT(IN) :: paprs
517 CHARACTER*(*), INTENT(IN) :: text
518
519 ! Local :
520 !--------
521 REAL, DIMENSION(nlon,nlev) :: uu_n, vv_n
522 REAL, DIMENSION(nlon,nlev) :: temp_n, qv_n, ql_n, qs_n
523
524
525 !
526 INTEGER k, n
527
528 integer debug_level
529 logical, save :: first=.true.
530 !$OMP THREADPRIVATE(first)
531 !
532 !======================================================================
533 ! Variables for energy conservation tests
534 !======================================================================
535 !
536
537 ! zh_col------- total enthalpy of vertical air column
538 ! (air with watter vapour, liquid and solid) (J/m2)
539 ! zh_dair_col--- total enthalpy of dry air (J/m2)
540 ! zh_qw_col---- total enthalpy of watter vapour (J/m2)
541 ! zh_ql_col---- total enthalpy of liquid watter (J/m2)
542 ! zh_qs_col---- total enthalpy of solid watter (J/m2)
543 ! zqw_col------ total mass of watter vapour (kg/m2)
544 ! zql_col------ total mass of liquid watter (kg/m2)
545 ! zqs_col------ total mass of solid watter (kg/m2)
546 ! zek_col------ total kinetic energy (kg/m2)
547 !
548 REAL zairm(nlon, nlev) ! layer air mass (kg/m2)
549 REAL zqw_col(nlon,2)
550 REAL zql_col(nlon,2)
551 REAL zqs_col(nlon,2)
552 REAL zek_col(nlon,2)
553 REAL zh_dair_col(nlon,2)
554 REAL zh_qw_col(nlon,2), zh_ql_col(nlon,2), zh_qs_col(nlon,2)
555 REAL zh_col(nlon,2)
556
557 !======================================================================
558 ! Initialisations
559
560 IF (prt_level >= 5) then
561 write (*,*) "In diag_phys_tend, after ",text
562 call flush
563 end if
564
565 debug_level=10
566 if (first) then
567 print *,"TestJLD rcpv, rcw, rcs",rcpv, rcw, rcs
568 first=.false.
569 endif
570 !
571 ! print *,'add_phys_tend: paprs ',paprs
572 !======================================================================
573 ! Diagnostics for energy conservation tests
574 !======================================================================
575 DO k = 1, nlev
576 ! layer air mass
577 zairm(:, k) = (paprs(:,k)-paprs(:,k+1))/rg
578 END DO
579
580 if (fl_ebil .GT. 0) then
581 ! ------------------------------------------------
582 ! Compute vertical sum for each atmospheric column
583 ! ------------------------------------------------
584 n=1 ! begining of time step
585
586 CALL integr_v(nlon, nlev, rcpv, &
587 temp, qv, ql, qs, uu, vv, zairm, &
588 zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zek_col(:,n), zh_dair_col(:,n), &
589 zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_col(:,n))
590
591 end if ! end if (fl_ebil .GT. 0)
592
593 !======================================================================
594 ! Ajout des tendances sur le vent, la temperature et les diverses phases de l'eau
595 !======================================================================
596
597 uu_n(:,:)=uu(:,:)+zdu(:,:)
598 vv_n(:,:)=vv(:,:)+zdv(:,:)
599 qv_n(:,:)=qv(:,:)+zdq(:,:)
600 ql_n(:,:)=ql(:,:)+zdql(:,:)
601 qs_n(:,:)=qs(:,:)+zdqs(:,:)
602 temp_n(:,:)=temp(:,:)+zdt(:,:)
603
604
605
606 !======================================================================
607 ! Diagnostics for energy conservation tests
608 !======================================================================
609
610 if (fl_ebil .GT. 0) then
611
612 ! ------------------------------------------------
613 ! Compute vertical sum for each atmospheric column
614 ! ------------------------------------------------
615 n=2 ! end of time step
616
617 CALL integr_v(nlon, nlev, rcpv, &
618 temp_n, qv_n, ql_n, qs_n, uu_n, vv_n, zairm, &
619 zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zek_col(:,n), zh_dair_col(:,n), &
620 zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_col(:,n))
621
622 ! ------------------------------------------------
623 ! Compute the changes by unit of time
624 ! ------------------------------------------------
625
626 d_qw_col(:) = (zqw_col(:,2)-zqw_col(:,1))/phys_tstep
627 d_ql_col(:) = (zql_col(:,2)-zql_col(:,1))/phys_tstep
628 d_qs_col(:) = (zqs_col(:,2)-zqs_col(:,1))/phys_tstep
629 d_qt_col(:) = d_qw_col(:) + d_ql_col(:) + d_qs_col(:)
630
631 d_ek_col(:) = (zek_col(:,2)-zek_col(:,1))/phys_tstep
632
633 print *,'zdu ', zdu
634 print *,'zdv ', zdv
635 print *,'d_ek_col, zek_col(2), zek_col(1) ',d_ek_col(1), zek_col(1,2), zek_col(1,1)
636
637 d_h_dair_col(:) = (zh_dair_col(:,2)-zh_dair_col(:,1))/phys_tstep
638 d_h_qw_col(:) = (zh_qw_col(:,2)-zh_qw_col(:,1))/phys_tstep
639 d_h_ql_col(:) = (zh_ql_col(:,2)-zh_ql_col(:,1))/phys_tstep
640 d_h_qs_col(:) = (zh_qs_col(:,2)-zh_qs_col(:,1))/phys_tstep
641
642 d_h_col = (zh_col(:,2)-zh_col(:,1))/phys_tstep
643
644 end if ! end if (fl_ebil .GT. 0)
645 !
646
647 RETURN
648 END SUBROUTINE diag_phys_tend
649
650 SUBROUTINE integr_v(nlon, nlev, zcpvap, &
651 temp, qv, ql, qs, uu, vv, zairm, &
652 zqw_col, zql_col, zqs_col, zek_col, zh_dair_col, &
653 zh_qw_col, zh_ql_col, zh_qs_col, zh_col)
654
655 IMPLICIT none
656 include "YOMCST.h"
657
658 INTEGER, INTENT(IN) :: nlon,nlev
659 REAL, INTENT(IN) :: zcpvap
660 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: temp, qv, ql, qs, uu, vv
661 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: zairm
662 REAL, DIMENSION(nlon), INTENT(OUT) :: zqw_col
663 REAL, DIMENSION(nlon), INTENT(OUT) :: zql_col
664 REAL, DIMENSION(nlon), INTENT(OUT) :: zqs_col
665 REAL, DIMENSION(nlon), INTENT(OUT) :: zek_col
666 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_dair_col
667 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_qw_col
668 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_ql_col
669 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_qs_col
670 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_col
671
672 INTEGER :: i, k
673
674
675 ! Reset variables
676 zqw_col(:) = 0.
677 zql_col(:) = 0.
678 zqs_col(:) = 0.
679 zek_col(:) = 0.
680 zh_dair_col(:) = 0.
681 zh_qw_col(:) = 0.
682 zh_ql_col(:) = 0.
683 zh_qs_col(:) = 0.
684
685 !JLD write (*,*) "rcpd, zcpvap, zcwat, zcice ",rcpd, zcpvap, zcwat, zcice
686
687 ! ------------------------------------------------
688 ! Compute vertical sum for each atmospheric column
689 ! ------------------------------------------------
690 DO k = 1, nlev
691 DO i = 1, nlon
692 ! Watter mass
693 zqw_col(i) = zqw_col(i) + qv(i, k)*zairm(i, k)
694 zql_col(i) = zql_col(i) + ql(i, k)*zairm(i, k)
695 zqs_col(i) = zqs_col(i) + qs(i, k)*zairm(i, k)
696 ! Kinetic Energy
697 zek_col(i) = zek_col(i) + 0.5*(uu(i,k)**2+vv(i,k)**2)*zairm(i, k)
698 ! Air enthalpy : dry air, water vapour, liquid, solid
699 zh_dair_col(i) = zh_dair_col(i) + rcpd*(1.-qv(i,k)-ql(i,k)-qs(i,k))* &
700 zairm(i, k)*temp(i, k)
701 zh_qw_col(i) = zh_qw_col(i) + zcpvap*temp(i, k) *qv(i, k)*zairm(i, k) !jyg
702 zh_ql_col(i) = zh_ql_col(i) + (zcpvap*temp(i, k) - rlvtt)*ql(i, k)*zairm(i, k) !jyg
703 zh_qs_col(i) = zh_qs_col(i) + (zcpvap*temp(i, k) - rlstt)*qs(i, k)*zairm(i, k) !jyg
704 END DO
705 END DO
706 ! compute total air enthalpy
707 zh_col(:) = zh_dair_col(:) + zh_qw_col(:) + zh_ql_col(:) + zh_qs_col(:)
708
709 END SUBROUTINE integr_v
710
711 6720 SUBROUTINE prt_enerbil (text, itap)
712 !======================================================================
713 ! Print enenrgy budget diagnotics for the 1D case
714 !======================================================================
715
716 !======================================================================
717 ! Declarations
718 !======================================================================
719
720 USE dimphy, ONLY: klon, klev
721 USE phys_state_var_mod, ONLY : phys_tstep
722 USE phys_state_var_mod, ONLY : topsw, toplw, solsw, sollw, rain_con, snow_con
723 USE geometry_mod, ONLY: longitude_deg, latitude_deg
724 USE print_control_mod, ONLY: prt_level
725 USE cmp_seri_mod
726 USE phys_output_var_mod, ONLY : d_qw_col, d_ql_col, d_qs_col, d_qt_col, d_ek_col, d_h_dair_col &
727 & , d_h_qw_col, d_h_ql_col, d_h_qs_col, d_h_col
728 USE phys_local_var_mod, ONLY: evap, sens
729 USE phys_local_var_mod, ONLY: u_seri, v_seri, ql_seri, qs_seri, q_seri, t_seri &
730 & , rain_lsc, snow_lsc
731 USE climb_hq_mod, ONLY : d_h_col_vdf, f_h_bnd
732 IMPLICIT none
733 include "YOMCST.h"
734
735 ! Arguments :
736 !------------
737 CHARACTER*(*) text ! text specifing the involved parametrization
738 integer itap ! time step number
739 ! local variables
740 ! ---------------
741 real bilq_seuil, bilh_seuil ! thresold on error in Q and H budget
742 real bilq_error, bilh_error ! erros in Q and H budget
743 real bilq_bnd, bilh_bnd ! Q and H budget due to exchange with boundaries
744 integer bilq_ok, bilh_ok
745 CHARACTER*(12) status
746
747 bilq_seuil = 1.E-10
748 bilh_seuil = 1.E-1
749 bilq_ok=0
750 bilh_ok=0
751
752 !!print *,'prt_level:',prt_level,' fl_ebil:',fl_ebil,' fl_cor_ebil:',fl_cor_ebil
753
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6720 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6720 if ( (fl_ebil .GT. 0) .and. (klon .EQ. 1)) then
754
755 bilq_bnd = 0.
756 bilh_bnd = 0.
757
758 param: SELECT CASE (text)
759 CASE("vdf") param
760 bilq_bnd = evap(1)
761 bilh_bnd = sens(1)+(rcpv-rcpd)*evap(1)*t_seri(1,1)
762 CASE("lsc") param
763 bilq_bnd = - rain_lsc(1) - snow_lsc(1)
764 bilh_bnd = (-(rcw-rcpd)*t_seri(1,1) + rlvtt) * rain_lsc(1) &
765 & + (-(rcs-rcpd)*t_seri(1,1) + rlstt) * snow_lsc(1)
766 CASE("convection") param
767 bilq_bnd = - rain_con(1) - snow_con(1)
768 bilh_bnd = (-(rcw-rcpd)*t_seri(1,1) + rlvtt) * rain_con(1) &
769 & + (-(rcs-rcpd)*t_seri(1,1) + rlstt) * snow_con(1)
770 CASE("SW") param
771 bilh_bnd = topsw(1) - solsw(1)
772 CASE("LW") param
773 bilh_bnd = -(toplw(1) + sollw(1))
774 CASE DEFAULT param
775 bilq_bnd = 0.
776 bilh_bnd = 0.
777 END SELECT param
778
779 bilq_error = d_qt_col(1) - bilq_bnd
780 bilh_error = d_h_col(1) - bilh_bnd
781 ! are the errors too large?
782 if ( abs(bilq_error) .gt. bilq_seuil) bilq_ok=1
783 if ( abs(bilh_error) .gt. bilh_seuil) bilh_ok=1
784 !
785 ! Print diagnostics
786 ! =================
787 if ( (bilq_ok .eq. 0).and.(bilh_ok .eq. 0) ) then
788 status="enerbil-OK"
789 else
790 status="enerbil-PB"
791 end if
792
793 if ( prt_level .GE. 3) then
794 write(*,9010) text,status," itap:",itap,"enerbilERROR: Q", bilq_error," H", bilh_error
795 9010 format (1x,A8,2x,A12,A6,I4,A18,E15.6,A5,E15.6)
796 end if
797 if ( prt_level .GE. 3) then
798 write(*,9000) text,"enerbil: Q,H,KE budget", d_qt_col(1), d_h_col(1),d_ek_col(1)
799 end if
800 if ( prt_level .GE. 5) then
801 write(*,9000) text,"enerbil at boundaries: Q, H",bilq_bnd, bilh_bnd
802 write(*,9000) text,"enerbil: water budget",d_qt_col(1),d_qw_col(1),d_ql_col(1),d_qs_col(1)
803 write(*,9000) text,"enerbil: enthalpy budget",d_h_col(1),d_h_dair_col(1),d_h_qw_col(1),d_h_ql_col(1),d_h_qs_col(1)
804 end if
805
806 specific_diag: SELECT CASE (text)
807 CASE("vdf") specific_diag
808 if ( prt_level .GE. 5) then
809 write(*,9000) text,"enerbil: d_h, bilh, sens,t_seri", d_h_col(1), bilh_bnd, sens(1), t_seri(1,1)
810 write(*,9000) text,"enerbil: d_h_col_vdf, f_h, diff",d_h_col_vdf, f_h_bnd, bilh_bnd-sens(1)
811 end if
812 CASE("lsc") specific_diag
813 if ( prt_level .GE. 5) then
814 write(*,9000) text,"enerbil: rain, bil_lat, bil_sens", rain_lsc(1), rlvtt * rain_lsc(1), -(rcw-rcpd)*t_seri(1,1) * rain_lsc(1)
815 write(*,9000) text,"enerbil: snow, bil_lat, bil_sens", snow_lsc(1), rlstt * snow_lsc(1), -(rcs-rcpd)*t_seri(1,1) * snow_lsc(1)
816 end if
817 CASE("convection") specific_diag
818 if ( prt_level .GE. 5) then
819 write(*,9000) text,"enerbil: rain, bil_lat, bil_sens", rain_con(1), rlvtt * rain_con(1), -(rcw-rcpd)*t_seri(1,1) * rain_con(1)
820 write(*,9000) text,"enerbil: snow, bil_lat, bil_sens", snow_con(1), rlstt * snow_con(1), -(rcs-rcpd)*t_seri(1,1) * snow_con(1)
821 end if
822 END SELECT specific_diag
823
824 9000 format (1x,A8,2x,A35,10E15.6)
825
826 end if ! end if (fl_ebil .GT. 0)
827
828 6720 END SUBROUTINE prt_enerbil
829
830 END MODULE add_phys_tend_mod
831