source: LMDZ6/branches/Amaury_dev/libf/phylmdiso/add_phys_tend_mod.F90 @ 5144

Last change on this file since 5144 was 5144, checked in by abarral, 8 weeks ago

Put YOMCST.h into modules

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