source: LMDZ6/trunk/libf/phylmdiso/add_phys_tend_mod.F90 @ 5274

Last change on this file since 5274 was 5274, checked in by abarral, 18 hours ago

Replace yomcst.h by existing module

  • Property svn:keywords set to Id
File size: 39.1 KB
RevLine 
[3927]1!
2! $Id: add_phys_tend_mod.F90 5274 2024-10-25 13:41:23Z abarral $
3!
4!
5MODULE 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
16CONTAINS
17
[4523]18SUBROUTINE add_pbl_tend(zdu, zdv, zdt, zdq, zdql, zdqi, zdqbs, paprs, text,abortphy,flag_inhib_tend, itap &
[3927]19#ifdef ISO
20        ,zdxt,zdxtl,zdxti &
21#endif
22        )
23  ! ======================================================================
24  ! Ajoute les tendances de couche limite, soit determinees par la
25  ! parametrisation
26  ! physique, soit forcees,  aux variables d etat de la dynamique t_seri,
27  ! q_seri ...
28  ! ======================================================================
29
30
31  ! ======================================================================
32  ! Declarations
33  ! ======================================================================
34
35  USE dimphy, ONLY: klon, klev
36!  USE dimphy
37  USE phys_local_var_mod
38  USE phys_state_var_mod
39  USE mod_grid_phy_lmdz, ONLY: nbp_lev
40#ifdef ISO
[4143]41  USE infotrac_phy, ONLY: ntraciso=>ntiso
[3927]42  USE isotopes_mod, ONLY: iso_eau
43#endif
44  IMPLICIT NONE
45  REAL,SAVE,ALLOCATABLE :: hthturb_gcssold(:)
46  REAL,SAVE,ALLOCATABLE :: hqturb_gcssold(:)
47!$OMP THREADPRIVATE(hthturb_gcssold,hqturb_gcssold)
48  REAL,SAVE :: dtime_frcg
49  LOGICAL,SAVE :: turb_fcg_gcssold
50  LOGICAL,SAVE :: firstcall=.true.
51!$OMP THREADPRIVATE(firstcall,turb_fcg_gcssold,dtime_frcg)
52  INTEGER abortphy
53!  COMMON /turb_forcing/dtime_frcg, hthturb_gcssold, hqturb_gcssold, &
54!    turb_fcg_gcssold
55#ifdef ISO
56  REAL,SAVE,ALLOCATABLE :: hxtturb_gcssold(:,:)
57!$OMP THREADPRIVATE(hxtturb_gcssold)
58        ! variable à définir dans le 1D
59#endif
60
61  ! Arguments :
62  ! ------------
63  REAL zdu(klon, klev), zdv(klon, klev)
[4523]64  REAL zdt(klon, klev), zdq(klon, klev), zdql(klon, klev), zdqi(klon, klev), zdqbs(klon,klev)
[3927]65  CHARACTER *(*) text
66  REAL paprs(klon,klev+1)
67  INTEGER flag_inhib_tend ! if flag_inhib_tend != 0, tendencies are not added
68  INTEGER itap ! time step number
69#ifdef ISO
70  REAL zdxt(ntraciso,klon, klev), zdxtl(ntraciso,klon, klev), zdxti(ntraciso,klon, klev)
71#endif
72
73  ! Local :
74  ! --------
75  REAL zzdt(klon, klev), zzdq(klon, klev)
76  INTEGER i, k
77#ifdef ISO
78  REAL zzdxt(ntraciso,klon, klev)
79  INTEGER ixt
80#endif
81
82  IF (firstcall) THEN
83    ALLOCATE(hthturb_gcssold(nbp_lev))
84    ALLOCATE(hqturb_gcssold(nbp_lev))
85#ifdef ISO
86    ALLOCATE(hxtturb_gcssold(ntraciso,nbp_lev))
87#endif
88    firstcall=.false.
89  ENDIF
90
91  IF (turb_fcg_gcssold) THEN
92    DO k = 1, klev
93      DO i = 1, klon
94        zzdt(i, k) = hthturb_gcssold(k)*dtime_frcg
95        zzdq(i, k) = hqturb_gcssold(k)*dtime_frcg
96#ifdef ISO
97        do ixt=1,ntraciso
98          zzdxt(ixt,i, k) = hxtturb_gcssold(ixt,k)*dtime_frcg
99        enddo
100#endif
101      END DO
102    END DO
103    PRINT *, ' add_pbl_tend, dtime_frcg ', dtime_frcg
104    PRINT *, ' add_pbl_tend, zzdt ', zzdt
105    PRINT *, ' add_pbl_tend, zzdq ', zzdq
[4523]106    CALL add_phys_tend(zdu, zdv, zzdt, zzdq, zdql, zdqi, zdqbs, paprs, text,abortphy,flag_inhib_tend, itap, 0 &
[3927]107#ifdef ISO
108        ,zzdxt,zdxtl,zdxti &
109#endif
110        )
111  ELSE
[4523]112    CALL add_phys_tend(zdu, zdv, zdt, zdq, zdql, zdqi, zdqbs, paprs, text,abortphy,flag_inhib_tend, itap, 0 &
[3927]113#ifdef ISO
114        ,zdxt,zdxtl,zdxti &
115#endif
116        )
117  END IF
118
119
120  RETURN
121END SUBROUTINE add_pbl_tend
122!
[4004]123! $Id: add_phys_tend_mod.F90 5274 2024-10-25 13:41:23Z abarral $
[3927]124!
[4523]125SUBROUTINE add_phys_tend (zdu,zdv,zdt,zdq,zdql,zdqi,zdqbs,paprs,text, &
[3927]126                          abortphy,flag_inhib_tend, itap, diag_mode &
127#ifdef ISO
128        ,zdxt,zdxtl,zdxti &
129#endif
130        )
131!======================================================================
132! Ajoute les tendances des variables physiques aux variables
133! d'etat de la dynamique t_seri, q_seri ...
134! On en profite pour faire des tests sur les tendances en question.
135!======================================================================
136
137
138!======================================================================
139! Declarations
140!======================================================================
141
142USE dimphy, ONLY: klon, klev
143USE phys_state_var_mod, ONLY : phys_tstep
[4523]144USE phys_local_var_mod, ONLY: u_seri, v_seri, ql_seri, qs_seri, qbs_seri, q_seri, t_seri
[3927]145#ifdef ISO
146USE phys_local_var_mod, ONLY: xtl_seri, xts_seri, xt_seri
147#endif
148USE phys_state_var_mod, ONLY: ftsol
149USE geometry_mod, ONLY: longitude_deg, latitude_deg
150USE print_control_mod, ONLY: prt_level
151USE cmp_seri_mod
[4523]152USE phys_output_var_mod, ONLY : d_qw_col, d_ql_col, d_qs_col, d_qbs_col, d_qt_col, d_ek_col, d_h_dair_col &
153  &           , d_h_qw_col, d_h_ql_col, d_h_qs_col, d_h_qbs_col, d_h_col
[3927]154
155#ifdef ISO
[4143]156    USE infotrac_phy, ONLY: ntraciso=>ntiso
[3927]157#ifdef ISOVERIF
158    USE isotopes_mod, ONLY: iso_eau
159    USE isotopes_verif_mod
160#endif 
161#endif
[5274]162USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
163          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
164          , R_ecc, R_peri, R_incl                                      &
165          , RA, RG, R1SA                                         &
166          , RSIGMA                                                     &
167          , R, RMD, RMV, RD, RV, RCPD                    &
168          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
169          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
170          , RCW, RCS                                                 &
171          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
172          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
173          , RALPD, RBETD, RGAMD
[3927]174IMPLICIT none
[5274]175
[3927]176  include "clesphys.h"
177
178! Arguments :
179!------------
180REAL, DIMENSION(klon,klev),     INTENT(IN)    :: zdu, zdv
[4523]181REAL, DIMENSION(klon,klev),     INTENT(IN)    :: zdt, zdql, zdqi, zdqbs
[3927]182REAL, DIMENSION(klon,klev+1),   INTENT(IN)    :: paprs
183CHARACTER*(*),                  INTENT(IN)    :: text
184INTEGER,                        INTENT(IN)    :: abortphy
185INTEGER,                        INTENT(IN)    :: flag_inhib_tend ! if not 0, tendencies are not added
186INTEGER,                        INTENT(IN)    :: itap            ! time step number
187INTEGER,                        INTENT(IN)    :: diag_mode       ! 0 -> normal effective mode
188                                                                 ! 1 -> only conservation stats are computed
189!
190REAL, DIMENSION(klon,klev),     INTENT(INOUT) :: zdq
191#ifdef ISO
192REAL zdxt(ntraciso,klon,klev),zdxtl(ntraciso,klon,klev) &
193        ,zdxti(ntraciso,klon,klev)
194integer ixt
195#endif
196
197! Local :
198!--------
199REAL zt,zq
200#ifdef ISO
201REAL zxt(ntraciso)
202real qprec(klon,klev)
203REAL zxt_int(ntraciso), zxtp_int(ntraciso), zxtp(ntraciso,klev),zxt_new
204#endif
205REAL zq_int, zqp_int, zq_new
206
207REAL zqp(klev)
208
209! Save variables, used in diagnostic mode (diag_mode=1).
210REAL, DIMENSION(klon,klev)   :: sav_u_seri, sav_v_seri
[4523]211REAL, DIMENSION(klon,klev)   :: sav_ql_seri, sav_qs_seri, sav_qbs_seri, sav_q_seri
[3927]212REAL, DIMENSION(klon,klev)   :: sav_t_seri
213REAL, DIMENSION(klon,klev)   :: sav_zdq
214#ifdef ISO
215REAL, DIMENSION(ntraciso,klon,klev)   :: sav_zdxt
216REAL, DIMENSION(ntraciso,klon,klev)   :: sav_xtl_seri, sav_xts_seri, sav_xt_seri
217#endif
218!
219INTEGER i, k,j, n
220INTEGER jadrs(klon*klev), jbad
221INTEGER jqadrs(klon*klev), jqbad
222INTEGER kadrs(klon*klev)
223INTEGER kqadrs(klon*klev)
224
225LOGICAL done(klon)
226
227integer debug_level
228logical, save :: first=.true.
229!$OMP THREADPRIVATE(first)
230!
231!======================================================================
232! Variables for energy conservation tests
233!======================================================================
234!
235
236! zh_col-------  total enthalpy of vertical air column
237! (air with watter vapour, liquid and solid) (J/m2)
238! zh_dair_col--- total enthalpy of dry air (J/m2)
239! zh_qw_col----  total enthalpy of watter vapour (J/m2)
240! zh_ql_col----  total enthalpy of liquid watter (J/m2)
241! zh_qs_col----  total enthalpy of solid watter  (J/m2)
[4523]242! zh_qbs_col----  total enthalpy of blowing snow  (J/m2)
[3927]243! zqw_col------  total mass of watter vapour (kg/m2)
244! zql_col------  total mass of liquid watter (kg/m2)
[4523]245! zqs_col------  total mass of cloud ice (kg/m2)
246! zqbs_col------  total mass of blowing snow (kg/m2)
[3927]247! zek_col------  total kinetic energy (kg/m2)
248!
249REAL zairm(klon, klev) ! layer air mass (kg/m2)
250REAL zqw_col(klon,2)
251REAL zql_col(klon,2)
252REAL zqs_col(klon,2)
[4523]253REAL zqbs_col(klon,2)
[3927]254REAL zek_col(klon,2)
255REAL zh_dair_col(klon,2)
[4523]256REAL zh_qw_col(klon,2), zh_ql_col(klon,2), zh_qs_col(klon,2), zh_qbs_col(klon,2)
[3927]257REAL zh_col(klon,2)
258
259REAL zcpvap, zcwat, zcice
260
261!======================================================================
262! Initialisations
263
264     IF (prt_level >= 5) then
265        write (*,*) "In add_phys_tend, after ",text
266        call flush
267     end if
268
269     ! if flag_inhib_tend != 0, tendencies are not added
270     IF (flag_inhib_tend /= 0) then
271        ! If requiered, diagnostics are shown
272        IF (flag_inhib_tend > 0) then
273           ! print some diagnostics if xxx_seri have changed
274           call cmp_seri(flag_inhib_tend,text)
275        END IF
276        RETURN ! on n ajoute pas les tendance
277     END IF
278
279     IF (abortphy==1) RETURN ! on n ajoute pas les tendance si le modele
280                              ! a deja plante.
281
282     debug_level=10
283     if (first) then
284        print *,"TestJLD rcpv, rcw, rcs",rcpv, rcw, rcs
285        first=.false.
286     endif
287!
288!  print *,'add_phys_tend: paprs ',paprs
289! When in diagnostic mode, save initial values of out variables
290  IF (diag_mode == 1) THEN
291    sav_u_seri(:,:)  = u_seri(:,:)
292    sav_v_seri(:,:)  = v_seri(:,:)
293    sav_ql_seri(:,:) = ql_seri(:,:)
294    sav_qs_seri(:,:) = qs_seri(:,:)
[4523]295    sav_qbs_seri(:,:) = qbs_seri(:,:)
[3927]296    sav_q_seri(:,:)  = q_seri(:,:)
297    sav_t_seri(:,:)  = t_seri(:,:)
298    sav_zdq(:,:)     = zdq(:,:)   
299#ifdef ISO
300    sav_zdxt(:,:,:)     = zdxt(:,:,:)
301#endif
302  ENDIF ! (diag_mode == 1)
303!======================================================================
304! Diagnostics for energy conservation tests
305!======================================================================
306  DO k = 1, klev
307    ! layer air mass
308    zairm(:, k) = (paprs(:,k)-paprs(:,k+1))/rg
309  END DO
310
311  if (fl_ebil .GT. 0) then
312    ! ------------------------------------------------
313    ! Compute vertical sum for each atmospheric column
314    ! ------------------------------------------------
315    n=1   ! begining of time step
316
317    zcpvap = rcpv
318    zcwat = rcw
319    zcice = rcs
320
321    CALL integr_v(klon, klev, zcpvap, &
[4523]322                  t_seri, q_seri, ql_seri, qs_seri, qbs_seri, u_seri, v_seri, zairm, &
323                    zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zqbs_col(:,n), zek_col(:,n), zh_dair_col(:,n), &
324                    zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_qbs_col(:,n), zh_col(:,n))
[3927]325
326  end if ! end if (fl_ebil .GT. 0)
327
328!======================================================================
329! Ajout des tendances sur le vent et l'eau liquide
330!======================================================================
331
[4491]332#ifdef ISO
333#ifdef ISOVERIF
334        if (iso_eau.gt.0) then
335          call iso_verif_egalite_vect2D( &
336                xt_seri,q_seri, &
337                'add_phys_tend 321a: '//text,ntraciso,klon,klev)
338          call iso_verif_egalite_vect2D( &
339                xtl_seri,ql_seri, &
340                'add_phys_tend 321b: '//text,ntraciso,klon,klev)
341         endif !if (iso_eau.gt.0) then
342#ifdef ISOTRAC
343        call iso_verif_traceur_vect(xt_seri,klon,klev, &
344     &           'add_phys_tend 328a: '//text)
345        call iso_verif_traceur_vect(xtl_seri,klon,klev, &
346     &           'add_phys_tend 328b: '//text)
347#endif
348#endif
349#endif
350
[3927]351     u_seri(:,:)=u_seri(:,:)+zdu(:,:)
352     v_seri(:,:)=v_seri(:,:)+zdv(:,:)
353     ql_seri(:,:)=ql_seri(:,:)+zdql(:,:)
354     qs_seri(:,:)=qs_seri(:,:)+zdqi(:,:)
[4523]355     qbs_seri(:,:)=qbs_seri(:,:)+zdqbs(:,:)
[3927]356#ifdef ISO
357     xtl_seri(:,:,:)=xtl_seri(:,:,:)+zdxtl(:,:,:)
358     xts_seri(:,:,:)=xts_seri(:,:,:)+zdxti(:,:,:) 
359#endif
360
361!======================================================================
362! On ajoute les tendances de la temperature et de la vapeur d'eau
363! en verifiant que ca ne part pas dans les choux
364!======================================================================
365
366      jbad=0
367      jqbad=0
368      DO k = 1, klev
369         DO i = 1, klon
370            zt=t_seri(i,k)+zdt(i,k)
371            zq=q_seri(i,k)+zdq(i,k)
372#ifdef ISO
373            do ixt=1,ntraciso   
374              zxt(ixt)=xt_seri(ixt,i,k)+zdxt(ixt,i,k)
375            enddo !do ixt=1,ntraciso
376            qprec(i,k)=q_seri(i,k)
377#endif
378            IF ( zt>370. .or. zt<130. .or. abs(zdt(i,k))>50. ) then
379            jbad = jbad + 1
380            jadrs(jbad) = i
381            kadrs(jbad) = k
382            ENDIF
383            IF ( zq<0. .or. zq>0.1 .or. abs(zdq(i,k))>1.e-2 ) then
384            jqbad = jqbad + 1
385            jqadrs(jqbad) = i
386            kqadrs(jqbad) = k
387            ENDIF
388            t_seri(i,k)=zt
389            q_seri(i,k)=zq
390#ifdef ISO           
391            do ixt=1,ntraciso   
392              xt_seri(ixt,i,k)=zxt(ixt)
393            enddo !do ixt=1,ntraciso
394#endif
395         ENDDO
396      ENDDO
397
398#ifdef ISO
399#ifdef ISOVERIF
400        if (iso_eau.gt.0) then
401          call iso_verif_egalite_vect2D( &
402                xt_seri,q_seri, &
403                'add_phys_tend 122: '//text,ntraciso,klon,klev)
404          call iso_verif_egalite_vect2D( &
405                xtl_seri,ql_seri, &
406                'add_phys_tend 138: '//text,ntraciso,klon,klev)
407         endif !if (iso_eau.gt.0) then
[4491]408#ifdef ISOTRAC
409        call iso_verif_traceur_vect(xt_seri,klon,klev, &
410     &           'add_phys_tend 374a: '//text)
411        call iso_verif_traceur_vect(xtl_seri,klon,klev, &
412     &           'add_phys_tend 374b: '//text)
[3927]413#endif
414#endif
[4491]415#endif
[3927]416
417
418!=====================================================================================
419! Impression et stop en cas de probleme important
420!=====================================================================================
421
422IF (jbad .GT. 0) THEN
423      DO j = 1, jbad
424         i=jadrs(j)
425         if(prt_level.ge.debug_level) THEN
426          print*,'PLANTAGE POUR LE POINT i lon lat =',&
427                 i,longitude_deg(i),latitude_deg(i),text
428          print*,'l    T     dT       Q     dQ    '
429          DO k = 1, klev
430             write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
431          ENDDO
432          call print_debug_phys(i,debug_level,text)
433         endif
434      ENDDO
435ENDIF
436!
437!=====================================================================================
438! Impression, warning et correction en cas de probleme moins important
439!=====================================================================================
440IF (jqbad .GT. 0) THEN
441      done(:) = .false.                         !jyg
442      DO j = 1, jqbad
443        i=jqadrs(j)
444          if(prt_level.ge.debug_level) THEN
445           print*,'WARNING  : EAU POUR LE POINT i lon lat =',&
446                  i,longitude_deg(i),latitude_deg(i),text
447           print*,'l    T     dT       Q     dQ    '
448           DO k = 1, klev
449              write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
450           ENDDO
451          endif
452          IF (ok_conserv_q) THEN
453!jyg<20140228 Corrections pour conservation de l'eau
454            IF (.NOT.done(i)) THEN                  !jyg
455              DO k = 1, klev
456                zqp(k) = max(q_seri(i,k),1.e-15)
457#ifdef ISO
458                do ixt=1,ntraciso
459                  zxtp(ixt,k)=xt_seri(ixt,i,k)*max(1.0,1.e-15/qprec(i,k))
460                enddo
461#endif
462              ENDDO
463              zq_int  = 0.
464              zqp_int = 0.
465              DO k = 1, klev
466                zq_int  = zq_int  + q_seri(i,k)*(paprs(i,k)-paprs(i,k+1))/Rg
467                zqp_int = zqp_int + zqp(k)     *(paprs(i,k)-paprs(i,k+1))/Rg
468              ENDDO
469#ifdef ISO
470              do ixt=1,ntraciso
471              zxt_int(ixt)  = 0.
472              zxtp_int(ixt) = 0.
473              DO k = 1, klev
474                zxt_int(ixt)  = zxt_int(ixt)  + xt_seri(ixt,i,k)*(paprs(i,k)-paprs(i,k+1))/Rg
475                zxtp_int(ixt) = zxtp_int(ixt) + zxtp(ixt,k)     *(paprs(i,k)-paprs(i,k+1))/Rg
476              ENDDO
477              enddo
478#endif
479              if(prt_level.ge.debug_level) THEN
480               print*,' cas q_seri<1.e-15 i k zq_int zqp_int zq_int/zqp_int :', &
481                                    i, kqadrs(j), zq_int, zqp_int, zq_int/zqp_int
482              endif
483              DO k = 1, klev
484                zq_new = zqp(k)*zq_int/zqp_int
485                zdq(i,k) = zdq(i,k) + zq_new - q_seri(i,k)
486                q_seri(i,k) = zq_new
487#ifdef ISO
488                do ixt=1,ntraciso
489                  zxt_new = zxtp(ixt,k)*zxt_int(ixt)/zxtp_int(ixt)
490                  zdxt(ixt,i,k) = zdxt(ixt,i,k) + zxt_new - xt_seri(ixt,i,k)
491                  xt_seri(ixt,i,k) = zxt_new
492                enddo !ixt=1,ntraciso
493#endif
494              ENDDO
495              done(i) = .true.
496            ENDIF !(.NOT.done(i))
497          ELSE
498!jyg>
499            DO k = 1, klev
500              zq=q_seri(i,k)+zdq(i,k)
501              if (zq.lt.1.e-15) then
502                 if (q_seri(i,k).lt.1.e-15) then
503                  if(prt_level.ge.debug_level) THEN
504                   print*,' cas q_seri<1.e-15 i k q_seri zq zdq :',i,k,q_seri(i,k),zq,zdq(i,k)
505                  endif
506                  q_seri(i,k)=1.e-15
507                  zdq(i,k)=(1.e-15-q_seri(i,k))
508#ifdef ISO
509               do ixt=1,ntraciso     
510                xt_seri(ixt,i,k)=1.e-15*(xt_seri(ixt,i,k)/qprec(i,k))
511                  ! xt_seri(ixt,i,k)=1.e-15*(Rdefault(index_iso(ixt)))
512                  ! zdxt(ixt,i,k)=0.0
513                zdxt(ixt,i,k)=xt_seri(ixt,i,k)*(1.e-15/qprec(i,k)-1)
514               enddo !do ixt=1,ntraciso   
515#endif
516                 endif
517              endif
518!              zq=q_seri(i,k)+zdq(i,k)
519!              if (zq.lt.1.e-15) then
520!                 zdq(i,k)=(1.e-15-q_seri(i,k))
521!              endif
522            ENDDO
523!jyg<20140228
524          ENDIF   !  (ok_conserv_q)
525!jyg>
526      ENDDO ! j = 1, jqbad
527ENDIF
528
529#ifdef ISO
530#ifdef ISOVERIF
531     if (iso_eau.gt.0) then
532        call iso_verif_egalite_vect2D( &
533                xt_seri,q_seri, &
534                        'add_phys_tend 173'//text,ntraciso,klon,klev)
535        call iso_verif_egalite_vect2D( &
536                zdxt,zdq, &
537                        'add_phys_tend 175'//text,ntraciso,klon,klev)
538      endif !if (iso_eau.gt.0) then
[4491]539#ifdef ISOTRAC
540        call iso_verif_traceur_vect(xt_seri,klon,klev, &
541     &           'add_phys_tend 499'//text)
[3927]542#endif
543#endif
[4491]544#endif
[3927]545!
546
547!IM ajout memes tests pour reverifier les jbad, jqbad beg
548      jbad=0
549      jqbad=0
550      DO k = 1, klev
551         DO i = 1, klon
552            IF ( t_seri(i,k)>370. .or. t_seri(i,k)<130. .or. abs(zdt(i,k))>50. ) then
553            jbad = jbad + 1
554            jadrs(jbad) = i
555!            if(prt_level.ge.debug_level) THEN
556!             print*,'cas2 i k t_seri zdt',i,k,t_seri(i,k),zdt(i,k)
557!            endif
558            ENDIF
559            IF ( q_seri(i,k)<0. .or. q_seri(i,k)>0.1 .or. abs(zdq(i,k))>1.e-2 ) then
560            jqbad = jqbad + 1
561            jqadrs(jqbad) = i
562            kqadrs(jqbad) = k
563!            if(prt_level.ge.debug_level) THEN
564!             print*,'cas2 i k q_seri zdq',i,k,q_seri(i,k),zdq(i,k)
565!            endif
566            ENDIF
567         ENDDO
568      ENDDO
569IF (jbad .GT. 0) THEN
570      DO j = 1, jbad
571         i=jadrs(j)
572         k=kadrs(j)
573         if(prt_level.ge.debug_level) THEN
574          print*,'PLANTAGE2 POUR LE POINT i itap lon lat txt jbad zdt t',&
575                 i,itap,longitude_deg(i),latitude_deg(i),text,jbad, &
576       &        zdt(i,k),t_seri(i,k)-zdt(i,k)
577!!!       if(prt_level.ge.10.and.itap.GE.229.and.i.EQ.3027) THEN
578          print*,'l    T     dT       Q     dQ    '
579          DO k = 1, klev
580             write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
581          ENDDO
582          call print_debug_phys(i,debug_level,text)
583         endif
584      ENDDO
585ENDIF
586!
587IF (jqbad .GT. 0) THEN
588      DO j = 1, jqbad
589         i=jqadrs(j)
590         k=kqadrs(j)
591         if(prt_level.ge.debug_level) THEN
592          print*,'WARNING  : EAU2 POUR LE POINT i itap lon lat txt jqbad zdq q zdql ql',&
593                 i,itap,longitude_deg(i),latitude_deg(i),text,jqbad,&
594       &        zdq(i,k), q_seri(i,k)-zdq(i,k), zdql(i,k), ql_seri(i,k)-zdql(i,k)
595!!!       if(prt_level.ge.10.and.itap.GE.229.and.i.EQ.3027) THEN
596          print*,'l    T     dT       Q     dQ    '
597          DO k = 1, klev
598            write(*,'(i3,2f14.4,2e14.2)') k,t_seri(i,k),zdt(i,k),q_seri(i,k),zdq(i,k)
599          ENDDO
600          call print_debug_phys(i,debug_level,text)
601         endif
602      ENDDO
603ENDIF
604
605!======================================================================
606! Contrôle des min/max pour arrêt du modèle
607! Si le modele est en mode abortphy, on retire les tendances qu'on
608! vient d'ajouter. Pas exactement parce qu'on ne tient pas compte des
609! seuils.
610!======================================================================
611
612      CALL hgardfou(t_seri,ftsol,text,abortphy)
613      IF (abortphy==1) THEN
614        Print*,'ERROR ABORT hgardfou dans ',text
615! JLD pourquoi on ne modifie pas de meme t_seri et q_seri ?
616        u_seri(:,:)=u_seri(:,:)-zdu(:,:)
617        v_seri(:,:)=v_seri(:,:)-zdv(:,:)
618        ql_seri(:,:)=ql_seri(:,:)-zdql(:,:)
619        qs_seri(:,:)=qs_seri(:,:)-zdqi(:,:)
[4523]620        qbs_seri(:,:)=qbs_seri(:,:)-zdqbs(:,:)
[3927]621      ENDIF
622
623!======================================================================
624! Diagnostics for energy conservation tests
625!======================================================================
626
627  if (fl_ebil .GT. 0) then
628 
629    ! ------------------------------------------------
630    ! Compute vertical sum for each atmospheric column
631    ! ------------------------------------------------
632    n=2   ! end of time step
633
634    CALL integr_v(klon, klev, zcpvap, &
[4523]635                  t_seri, q_seri, ql_seri, qs_seri, qbs_seri, u_seri, v_seri, zairm, &
636                    zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zqbs_col(:,n), zek_col(:,n), zh_dair_col(:,n), &
637                    zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_qbs_col(:,n), zh_col(:,n))
[3927]638
639    ! ------------------------------------------------
640    ! Compute the changes by unit of time
641    ! ------------------------------------------------
642
643    d_qw_col(:) = (zqw_col(:,2)-zqw_col(:,1))/phys_tstep
644    d_ql_col(:) = (zql_col(:,2)-zql_col(:,1))/phys_tstep
645    d_qs_col(:) = (zqs_col(:,2)-zqs_col(:,1))/phys_tstep
[4523]646    d_qbs_col(:) = (zqbs_col(:,2)-zqbs_col(:,1))/phys_tstep
647    d_qt_col(:) = d_qw_col(:) + d_ql_col(:) + d_qs_col(:) + d_qbs_col(:)
[3927]648
649    d_ek_col(:) = (zek_col(:,2)-zek_col(:,1))/phys_tstep
650
651    d_h_dair_col(:) = (zh_dair_col(:,2)-zh_dair_col(:,1))/phys_tstep
652    d_h_qw_col(:) = (zh_qw_col(:,2)-zh_qw_col(:,1))/phys_tstep
653    d_h_ql_col(:) = (zh_ql_col(:,2)-zh_ql_col(:,1))/phys_tstep
654    d_h_qs_col(:) = (zh_qs_col(:,2)-zh_qs_col(:,1))/phys_tstep
[4523]655    d_h_qbs_col(:) = (zh_qbs_col(:,2)-zh_qbs_col(:,1))/phys_tstep
[3927]656
657    d_h_col = (zh_col(:,2)-zh_col(:,1))/phys_tstep
658
659  end if ! end if (fl_ebil .GT. 0)
660!
661! When in diagnostic mode, restore "out" variables to initial values.
662  IF (diag_mode == 1) THEN
663    u_seri(:,:)  = sav_u_seri(:,:)
664    v_seri(:,:)  = sav_v_seri(:,:)
665    ql_seri(:,:) = sav_ql_seri(:,:)
666    qs_seri(:,:) = sav_qs_seri(:,:)
[4523]667    qbs_seri(:,:) = sav_qbs_seri(:,:)
[3927]668    q_seri(:,:)  = sav_q_seri(:,:)
669    t_seri(:,:)  = sav_t_seri(:,:)
670    zdq(:,:)     = sav_zdq(:,:)   
671#ifdef ISO
672    xtl_seri(:,:,:) = sav_xtl_seri(:,:,:)
673    xts_seri(:,:,:) = sav_xts_seri(:,:,:)
674    xt_seri(:,:,:)  = sav_xt_seri(:,:,:)
675    zdxt(:,:,:)     = sav_zdxt(:,:,:)
676#endif
677  ENDIF ! (mode == 1)
678
679  RETURN
680END SUBROUTINE add_phys_tend
681
[4523]682SUBROUTINE diag_phys_tend (nlon, nlev, uu, vv, temp, qv, ql, qs, qbs, &
683                          zdu,zdv,zdt,zdq,zdql,zdqs,zdqbs,paprs,text)
[3927]684!======================================================================
685! Ajoute les tendances des variables physiques aux variables
686! d'etat de la dynamique t_seri, q_seri ...
687! On en profite pour faire des tests sur les tendances en question.
688!======================================================================
689! C Risi: on ne met pas les isos dedans car elle n'est jamais apelée.
690
691!======================================================================
692! Declarations
693!======================================================================
694
695USE phys_state_var_mod, ONLY : phys_tstep, ftsol
696USE geometry_mod, ONLY: longitude_deg, latitude_deg
697USE print_control_mod, ONLY: prt_level
698USE cmp_seri_mod
[4523]699USE phys_output_var_mod, ONLY : d_qw_col, d_ql_col, d_qs_col, d_qbs_col, d_qt_col, d_ek_col, d_h_dair_col &
700  &           , d_h_qw_col, d_h_ql_col, d_h_qs_col, d_h_qbs_col, d_h_col
[5274]701USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
702          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
703          , R_ecc, R_peri, R_incl                                      &
704          , RA, RG, R1SA                                         &
705          , RSIGMA                                                     &
706          , R, RMD, RMV, RD, RV, RCPD                    &
707          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
708          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
709          , RCW, RCS                                                 &
710          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
711          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
712          , RALPD, RBETD, RGAMD
[3927]713IMPLICIT none
[5274]714
[3927]715  include "clesphys.h"
716
717! Arguments :
718!------------
719INTEGER, INTENT(IN)                           :: nlon, nlev
720REAL, DIMENSION(nlon,nlev),     INTENT(IN)    :: uu, vv
[4523]721REAL, DIMENSION(nlon,nlev),     INTENT(IN)    :: temp, qv, ql, qs, qbs
[3927]722REAL, DIMENSION(nlon,nlev),     INTENT(IN)    :: zdu, zdv
[4523]723REAL, DIMENSION(nlon,nlev),     INTENT(IN)    :: zdt, zdq, zdql, zdqs, zdqbs
[3927]724REAL, DIMENSION(nlon,nlev+1),   INTENT(IN)    :: paprs
725CHARACTER*(*),                  INTENT(IN)    :: text
726
727! Local :
728!--------
729REAL, DIMENSION(nlon,nlev)      :: uu_n, vv_n
[4523]730REAL, DIMENSION(nlon,nlev)      :: temp_n, qv_n, ql_n, qs_n, qbs_n
[3927]731
732
733!
734INTEGER k, n
735
736integer debug_level
737logical, save :: first=.true.
738!$OMP THREADPRIVATE(first)
739!
740!======================================================================
741! Variables for energy conservation tests
742!======================================================================
743!
744
745! zh_col-------  total enthalpy of vertical air column
746! (air with watter vapour, liquid and solid) (J/m2)
747! zh_dair_col--- total enthalpy of dry air (J/m2)
748! zh_qw_col----  total enthalpy of watter vapour (J/m2)
749! zh_ql_col----  total enthalpy of liquid watter (J/m2)
750! zh_qs_col----  total enthalpy of solid watter  (J/m2)
751! zqw_col------  total mass of watter vapour (kg/m2)
752! zql_col------  total mass of liquid watter (kg/m2)
[4523]753! zqs_col------  total mass of cloud ice (kg/m2)
754! zqbs_col------  total mass of blowing snow (kg/m2)
[3927]755! zek_col------  total kinetic energy (kg/m2)
756!
757REAL zairm(nlon, nlev) ! layer air mass (kg/m2)
758REAL zqw_col(nlon,2)
759REAL zql_col(nlon,2)
760REAL zqs_col(nlon,2)
[4523]761REAL zqbs_col(nlon,2)
[3927]762REAL zek_col(nlon,2)
763REAL zh_dair_col(nlon,2)
[4523]764REAL zh_qw_col(nlon,2), zh_ql_col(nlon,2), zh_qs_col(nlon,2), zh_qbs_col(nlon,2)
[3927]765REAL zh_col(nlon,2)
766
767!======================================================================
768! Initialisations
769
770     IF (prt_level >= 5) then
771        write (*,*) "In diag_phys_tend, after ",text
772        call flush
773     end if
774
775     debug_level=10
776     if (first) then
777        print *,"TestJLD rcpv, rcw, rcs",rcpv, rcw, rcs
778        first=.false.
779     endif
780!
781!  print *,'add_phys_tend: paprs ',paprs
782!======================================================================
783! Diagnostics for energy conservation tests
784!======================================================================
785  DO k = 1, nlev
786    ! layer air mass
787    zairm(:, k) = (paprs(:,k)-paprs(:,k+1))/rg
788  END DO
789
790  if (fl_ebil .GT. 0) then
791    ! ------------------------------------------------
792    ! Compute vertical sum for each atmospheric column
793    ! ------------------------------------------------
794    n=1   ! begining of time step
795
796    CALL integr_v(nlon, nlev, rcpv, &
[4523]797                  temp, qv, ql, qs, qbs, uu, vv, zairm, &
798                    zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zqbs_col(:,n), zek_col(:,n), zh_dair_col(:,n), &
799                    zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_qbs_col(:,n), zh_col(:,n))
[3927]800
801  end if ! end if (fl_ebil .GT. 0)
802
803!======================================================================
804! Ajout des tendances sur le vent, la temperature et les diverses phases de l'eau
805!======================================================================
806
807     uu_n(:,:)=uu(:,:)+zdu(:,:)
808     vv_n(:,:)=vv(:,:)+zdv(:,:)
809     qv_n(:,:)=qv(:,:)+zdq(:,:)
810     ql_n(:,:)=ql(:,:)+zdql(:,:)
811     qs_n(:,:)=qs(:,:)+zdqs(:,:)
[4523]812     qbs_n(:,:)=qbs(:,:)+zdqbs(:,:)
[3927]813     temp_n(:,:)=temp(:,:)+zdt(:,:)
814
815
816
817!======================================================================
818! Diagnostics for energy conservation tests
819!======================================================================
820
821  if (fl_ebil .GT. 0) then
822 
823    ! ------------------------------------------------
824    ! Compute vertical sum for each atmospheric column
825    ! ------------------------------------------------
826    n=2   ! end of time step
827
828    CALL integr_v(nlon, nlev, rcpv, &
[4523]829                  temp_n, qv_n, ql_n, qs_n, qbs_n, uu_n, vv_n, zairm, &
830                    zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zqbs_col(:,n), zek_col(:,n), zh_dair_col(:,n), &
831                    zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_qbs_col(:,n), zh_col(:,n))
[3927]832
833    ! ------------------------------------------------
834    ! Compute the changes by unit of time
835    ! ------------------------------------------------
836
837    d_qw_col(:) = (zqw_col(:,2)-zqw_col(:,1))/phys_tstep
838    d_ql_col(:) = (zql_col(:,2)-zql_col(:,1))/phys_tstep
839    d_qs_col(:) = (zqs_col(:,2)-zqs_col(:,1))/phys_tstep
[4523]840    d_qbs_col(:) = (zqbs_col(:,2)-zqbs_col(:,1))/phys_tstep
841    d_qt_col(:) = d_qw_col(:) + d_ql_col(:) + d_qs_col(:) + d_qbs_col(:)
[3927]842
843    d_ek_col(:) = (zek_col(:,2)-zek_col(:,1))/phys_tstep
844
845   print *,'zdu ', zdu
846   print *,'zdv ', zdv
847   print *,'d_ek_col, zek_col(2), zek_col(1) ',d_ek_col(1), zek_col(1,2), zek_col(1,1)
848
849    d_h_dair_col(:) = (zh_dair_col(:,2)-zh_dair_col(:,1))/phys_tstep
850    d_h_qw_col(:) = (zh_qw_col(:,2)-zh_qw_col(:,1))/phys_tstep
851    d_h_ql_col(:) = (zh_ql_col(:,2)-zh_ql_col(:,1))/phys_tstep
852    d_h_qs_col(:) = (zh_qs_col(:,2)-zh_qs_col(:,1))/phys_tstep
[4523]853    d_h_qbs_col(:) = (zh_qbs_col(:,2)-zh_qbs_col(:,1))/phys_tstep
[3927]854
855    d_h_col = (zh_col(:,2)-zh_col(:,1))/phys_tstep
856
857  end if ! end if (fl_ebil .GT. 0)
858!
859
860  RETURN
861END SUBROUTINE diag_phys_tend
862
863SUBROUTINE integr_v(nlon, nlev, zcpvap, &
[4523]864                    temp, qv, ql, qs, qbs, uu, vv, zairm,  &
865                    zqw_col, zql_col, zqs_col, zqbs_col, zek_col, zh_dair_col, &
866                    zh_qw_col, zh_ql_col, zh_qs_col, zh_qbs_col, zh_col)
[3927]867
[5274]868USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
869          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
870          , R_ecc, R_peri, R_incl                                      &
871          , RA, RG, R1SA                                         &
872          , RSIGMA                                                     &
873          , R, RMD, RMV, RD, RV, RCPD                    &
874          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
875          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
876          , RCW, RCS                                                 &
877          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
878          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
879          , RALPD, RBETD, RGAMD
[3927]880IMPLICIT none
881
[5274]882
[3927]883INTEGER,                    INTENT(IN)    :: nlon,nlev
884REAL,                       INTENT(IN)    :: zcpvap
[4523]885REAL, DIMENSION(nlon,nlev), INTENT(IN)    :: temp, qv, ql, qs, qbs, uu, vv
[3927]886REAL, DIMENSION(nlon,nlev), INTENT(IN)    :: zairm
887REAL, DIMENSION(nlon),      INTENT(OUT)   :: zqw_col
888REAL, DIMENSION(nlon),      INTENT(OUT)   :: zql_col
[4523]889REAL, DIMENSION(nlon),      INTENT(OUT)   :: zqs_col, zqbs_col
[3927]890REAL, DIMENSION(nlon),      INTENT(OUT)   :: zek_col
891REAL, DIMENSION(nlon),      INTENT(OUT)   :: zh_dair_col
892REAL, DIMENSION(nlon),      INTENT(OUT)   :: zh_qw_col
893REAL, DIMENSION(nlon),      INTENT(OUT)   :: zh_ql_col
[4523]894REAL, DIMENSION(nlon),      INTENT(OUT)   :: zh_qs_col, zh_qbs_col
[3927]895REAL, DIMENSION(nlon),      INTENT(OUT)   :: zh_col
896
897INTEGER          :: i, k
898
899
900  ! Reset variables
901    zqw_col(:) = 0.
902    zql_col(:) = 0.
903    zqs_col(:) = 0.
[4523]904    zqbs_col(:) = 0.
[3927]905    zek_col(:) = 0.
906    zh_dair_col(:) = 0.
907    zh_qw_col(:) = 0.
908    zh_ql_col(:) = 0.
909    zh_qs_col(:) = 0.
[4523]910    zh_qbs_col(:) = 0.
[3927]911
912!JLD    write (*,*) "rcpd, zcpvap, zcwat, zcice ",rcpd, zcpvap, zcwat, zcice
913 
914    ! ------------------------------------------------
915    ! Compute vertical sum for each atmospheric column
916    ! ------------------------------------------------
917    DO k = 1, nlev
918      DO i = 1, nlon
919        ! Watter mass
920        zqw_col(i) = zqw_col(i) + qv(i, k)*zairm(i, k)
921        zql_col(i) = zql_col(i) + ql(i, k)*zairm(i, k)
922        zqs_col(i) = zqs_col(i) + qs(i, k)*zairm(i, k)
[4523]923        zqbs_col(i)= zqbs_col(i) + qbs(i,k)*zairm(i,k)
[3927]924        ! Kinetic Energy
925        zek_col(i) = zek_col(i) + 0.5*(uu(i,k)**2+vv(i,k)**2)*zairm(i, k)
926        ! Air enthalpy : dry air, water vapour, liquid, solid
927        zh_dair_col(i) = zh_dair_col(i) + rcpd*(1.-qv(i,k)-ql(i,k)-qs(i,k))* &
928                                               zairm(i, k)*temp(i, k)
929        zh_qw_col(i) = zh_qw_col(i) +  zcpvap*temp(i, k)         *qv(i, k)*zairm(i, k)    !jyg
930        zh_ql_col(i) = zh_ql_col(i) + (zcpvap*temp(i, k) - rlvtt)*ql(i, k)*zairm(i, k)   !jyg
931        zh_qs_col(i) = zh_qs_col(i) + (zcpvap*temp(i, k) - rlstt)*qs(i, k)*zairm(i, k)   !jyg
[4523]932        zh_qbs_col(i) = zh_qbs_col(i) + (zcpvap*temp(i, k) - rlstt)*qbs(i, k)*zairm(i, k)   !jyg
[3927]933      END DO
934    END DO
935    ! compute total air enthalpy
[4523]936    zh_col(:) = zh_dair_col(:) + zh_qw_col(:) + zh_ql_col(:) + zh_qs_col(:) + zh_qbs_col(:)
[3927]937
938END SUBROUTINE integr_v
939
940SUBROUTINE prt_enerbil (text, itap)
941!======================================================================
942! Print enenrgy budget diagnotics for the 1D case
943!======================================================================
944
945!======================================================================
946! Declarations
947!======================================================================
948
949USE dimphy, ONLY: klon, klev
950USE phys_state_var_mod, ONLY : phys_tstep
[4523]951USE phys_state_var_mod, ONLY : topsw, toplw, solsw, sollw, rain_con, snow_con, bs_fall
[3927]952USE geometry_mod, ONLY: longitude_deg, latitude_deg
953USE print_control_mod, ONLY: prt_level
954USE cmp_seri_mod
[4523]955USE phys_output_var_mod, ONLY : d_qw_col, d_ql_col, d_qs_col, d_qbs_col, d_qt_col, d_ek_col, d_h_dair_col &
956  &           , d_h_qw_col, d_h_ql_col, d_h_qs_col, d_h_qbs_col, d_h_col
[3927]957USE phys_local_var_mod, ONLY: evap, sens
[4523]958USE phys_local_var_mod, ONLY: u_seri, v_seri, ql_seri, qs_seri, qbs_seri, q_seri, t_seri &
[3927]959   &  , rain_lsc, snow_lsc
960USE climb_hq_mod, ONLY : d_h_col_vdf, f_h_bnd
[5274]961USE yomcst_mod_h, ONLY: RPI, RCLUM, RHPLA, RKBOL, RNAVO                   &
962          , RDAY, REA, REPSM, RSIYEA, RSIDAY, ROMEGA                  &
963          , R_ecc, R_peri, R_incl                                      &
964          , RA, RG, R1SA                                         &
965          , RSIGMA                                                     &
966          , R, RMD, RMV, RD, RV, RCPD                    &
967          , RMO3, RMCO2, RMC, RMCH4, RMN2O, RMCFC11, RMCFC12        &
968          , RCPV, RCVD, RCVV, RKAPPA, RETV, eps_w                    &
969          , RCW, RCS                                                 &
970          , RLVTT, RLSTT, RLMLT, RTT, RATM                           &
971          , RESTT, RALPW, RBETW, RGAMW, RALPS, RBETS, RGAMS            &
972          , RALPD, RBETD, RGAMD
[3927]973IMPLICIT none
974
[5274]975
[3927]976! Arguments :
977!------------
978CHARACTER*(*) text ! text specifing the involved parametrization
979integer itap        ! time step number
980! local variables
981! ---------------
982real bilq_seuil,  bilh_seuil ! thresold on error in Q and H budget
983real bilq_error,  bilh_error ! erros in Q and H budget
984real bilq_bnd,  bilh_bnd     ! Q and H budget due to exchange with boundaries
985integer bilq_ok,  bilh_ok
986CHARACTER*(12) status
987
988bilq_seuil = 1.E-10
989bilh_seuil = 1.E-1
990bilq_ok=0
991bilh_ok=0
992
993!!print *,'prt_level:',prt_level,' fl_ebil:',fl_ebil,' fl_cor_ebil:',fl_cor_ebil
994if ( (fl_ebil .GT. 0) .and. (klon .EQ. 1)) then
995
996  bilq_bnd = 0.
997  bilh_bnd = 0.
998
999  param: SELECT CASE (text)
1000  CASE("vdf") param
1001      bilq_bnd = evap(1)
1002      bilh_bnd = sens(1)+(rcpv-rcpd)*evap(1)*t_seri(1,1)
1003  CASE("lsc") param
1004      bilq_bnd = - rain_lsc(1) - snow_lsc(1)
1005      bilh_bnd = (-(rcw-rcpd)*t_seri(1,1) + rlvtt) * rain_lsc(1) &
1006    &         + (-(rcs-rcpd)*t_seri(1,1) + rlstt) * snow_lsc(1)
[5051]1007  CASE("bsss") param
[4523]1008      bilq_bnd = - bs_fall(1)
1009      bilh_bnd = (-(rcs-rcpd)*t_seri(1,1) + rlstt) * bs_fall(1)
[3927]1010  CASE("convection") param
1011      bilq_bnd = - rain_con(1) - snow_con(1)
1012      bilh_bnd = (-(rcw-rcpd)*t_seri(1,1) + rlvtt) * rain_con(1) &
1013    &         + (-(rcs-rcpd)*t_seri(1,1) + rlstt) * snow_con(1)
1014  CASE("SW") param
1015      bilh_bnd = topsw(1) - solsw(1)
1016  CASE("LW") param
1017      bilh_bnd = -(toplw(1) + sollw(1))
1018  CASE DEFAULT param
1019      bilq_bnd = 0.
1020      bilh_bnd = 0.
1021  END SELECT param
1022
1023  bilq_error = d_qt_col(1) - bilq_bnd
1024  bilh_error = d_h_col(1) - bilh_bnd
1025! are the errors too large?
1026  if ( abs(bilq_error) .gt. bilq_seuil) bilq_ok=1
1027  if ( abs(bilh_error) .gt. bilh_seuil) bilh_ok=1
1028!
1029! Print diagnostics
1030! =================
1031  if ( (bilq_ok .eq. 0).and.(bilh_ok .eq. 0) ) then
1032    status="enerbil-OK"
1033  else
1034    status="enerbil-PB"
1035  end if
1036
1037  if ( prt_level .GE. 3) then
1038    write(*,9010) text,status," itap:",itap,"enerbilERROR: Q", bilq_error,"  H", bilh_error
10399010  format (1x,A8,2x,A12,A6,I4,A18,E15.6,A5,E15.6)
1040  end if
1041  if ( prt_level .GE. 3) then
1042    write(*,9000) text,"enerbil: Q,H,KE budget", d_qt_col(1), d_h_col(1),d_ek_col(1)
1043  end if
1044  if ( prt_level .GE. 5) then
1045    write(*,9000) text,"enerbil at boundaries: Q, H",bilq_bnd, bilh_bnd
[4523]1046    write(*,9000) text,"enerbil: water budget",d_qt_col(1),d_qw_col(1),d_ql_col(1),d_qs_col(1), d_qbs_col(1)
1047    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),d_h_qbs_col(1)
[3927]1048  end if
1049
1050  specific_diag: SELECT CASE (text)
1051  CASE("vdf") specific_diag
1052    if ( prt_level .GE. 5) then
1053      write(*,9000) text,"enerbil: d_h, bilh, sens,t_seri", d_h_col(1), bilh_bnd, sens(1), t_seri(1,1)
1054      write(*,9000) text,"enerbil: d_h_col_vdf, f_h, diff",d_h_col_vdf, f_h_bnd, bilh_bnd-sens(1)
1055    end if
1056  CASE("lsc") specific_diag
1057    if ( prt_level .GE. 5) then
1058      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)
1059      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)
1060    end if
1061  CASE("convection") specific_diag
1062    if ( prt_level .GE. 5) then
1063      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)
1064      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)
1065    end if
1066  END SELECT specific_diag
1067
10689000 format (1x,A8,2x,A35,10E15.6)
1069
1070end if ! end if (fl_ebil .GT. 0)
1071
1072END SUBROUTINE prt_enerbil
1073
1074END MODULE add_phys_tend_mod
Note: See TracBrowser for help on using the repository browser.