Ignore:
Timestamp:
Sep 27, 2016, 6:02:46 PM (8 years ago)
Author:
jyg
Message:

Some cleaning in the wake routines: (i) the wake
number per unit area (wdens) is now a state
variable (held constant for the time being);
(ii) wake state variable changes are computed in
subroutine 'physiq' if iflag_wake_tend=1 (it is
computed within wake routines if
iflag_wake_tend=0, consistent with earlier
versions); (iii) the new routine 'add_wake_tend'
adds tendencies to wake state variables; (iv)
tendencies due to various processes (pbl, wakes,
thermals) are named and added separately.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/physiq_mod.F90

    r2630 r2635  
    133133       dtvdf_x, dtvdf_w, &
    134134       dqvdf_x, dqvdf_w, &
    135        undi_tke, wake_tke, &
    136135       pbl_tke_input, &
    137136       t_therm, q_therm, u_therm, v_therm, &
     
    141140       !
    142141       ale_wake, alp_wake, &
    143        wake_h, wbeff, zmax_th, &
     142       wake_h, wake_omg, &
     143                       ! tendencies of delta T and delta q:
     144       d_deltat_wk, d_deltaq_wk, &         ! due to wakes
     145       d_deltat_wk_gw, d_deltaq_wk_gw, &   ! due to wake induced gravity waves
     146       d_deltat_vdf, d_deltaq_vdf, &       ! due to vertical diffusion
     147       d_deltat_the, d_deltaq_the, &       ! due to thermals
     148       d_deltat_ajs_cv, d_deltaq_ajs_cv, & ! due to dry adjustment of (w) before convection
     149                       ! tendencies of wake fractional area and wake number per unit area:
     150       d_s_wk,  d_dens_wk, &             ! due to wakes
     151!!!       d_s_vdf, d_dens_vdf, &            ! due to vertical diffusion
     152!!!       d_s_the, d_dens_the, &            ! due to thermals
     153       !                                 
     154       wbeff, zmax_th, &
    144155       sens, flwp, fiwp,  &
    145156       ale_bl_stat,alp_bl_conv,alp_bl_det,  &
     
    157168       ref_liq, ref_ice, theta,  &
    158169       ref_liq_pi, ref_ice_pi,  &
    159        zphi, wake_omg, zx_rh,  &
     170       zphi, zx_rh,  &
    160171       pmfd, pmfu,  &
    161172       !
     
    529540    !RC
    530541    ! Variables li\'ees \`a la poche froide (jyg et rr)
    531     ! Version diagnostique pour l'instant : pas de r\'etroaction sur
    532     ! la convection
    533 
    534     REAL t_wake(klon,klev),q_wake(klon,klev) ! wake pour la convection
     542
     543    INTEGER,  SAVE               :: iflag_wake_tend  ! wake: if =0, then wake state variables are
     544                                                     ! updated within calwake
     545    !$OMP THREADPRIVATE(iflag_wake_tend)
     546    REAL t_w(klon,klev),q_w(klon,klev) ! temperature and moisture profiles in the wake region
     547    REAL t_x(klon,klev),q_x(klon,klev) ! temperature and moisture profiles in the off-wake region
    535548
    536549    REAL wake_dth(klon,klev)        ! wake : temp pot difference
    537550
    538     REAL wake_d_deltat_gw(klon,klev)! wake : delta T tendency due to
    539     ! Gravity Wave (/s)
    540551    REAL wake_omgbdth(klon,klev)    ! Wake : flux of Delta_Theta
    541552    ! transported by LS omega
     
    546557    REAL wake_dqKE(klon,klev)       ! Wake : differential moistening
    547558    ! (wake - unpertubed) CONV
    548     REAL wake_dtPBL(klon,klev)      ! Wake : differential heating
    549     ! (wake - unpertubed) PBL
    550     REAL wake_dqPBL(klon,klev)      ! Wake : differential moistening
    551     ! (wake - unpertubed) PBL
    552     REAL wake_ddeltat(klon,klev),wake_ddeltaq(klon,klev)
    553559    REAL wake_dp_deltomg(klon,klev) ! Wake : gradient vertical de wake_omg
    554560    REAL wake_spread(klon,klev)     ! spreading term in wake_delt
     
    557563    !
    558564    INTEGER wake_k(klon)            ! Wake sommet
    559     !
    560     REAL t_undi(klon,klev)          ! temperature moyenne dans la zone
    561     ! non perturbee
    562     REAL q_undi(klon,klev)          ! humidite moyenne dans la zone
    563     ! non perturbee
    564565    !
    565566    !jyg<
     
    568569
    569570    REAL wake_gfl(klon)             ! Gust Front Length
    570     REAL wake_dens(klon)
     571!!!    REAL wake_dens(klon)         ! moved to phys_state_var_mod
    571572    !
    572573    !
    573574    REAL dt_dwn(klon,klev)
    574575    REAL dq_dwn(klon,klev)
    575     REAL wdt_PBL(klon,klev)
    576     REAL udt_PBL(klon,klev)
    577     REAL wdq_PBL(klon,klev)
    578     REAL udq_PBL(klon,klev)
    579576    REAL M_dwn(klon,klev)
    580577    REAL M_up(klon,klev)
     
    589586    REAL, SAVE :: alp_offset
    590587    !$OMP THREADPRIVATE(alp_offset)
    591 
    592     ! !!
    593     !=================================================================
    594     !         PROVISOIRE : DECOUPLAGE PBL/WAKE
    595     !         --------------------------------
    596     REAL wake_deltat_sav(klon,klev)
    597     REAL wake_deltaq_sav(klon,klev)
    598     !=================================================================
    599588
    600589    !
     
    815804    ! tendance nulles
    816805    REAL, dimension(klon,klev):: du0, dv0, dt0, dq0, dql0, dqi0
     806    REAL, dimension(klon)     :: dsig0, ddens0
     807    INTEGER, dimension(klon)  :: wkoccur1
    817808    !
    818809    ! Flag pour pouvoir ne pas ajouter les tendances.
     
    12091200       CALL getin_p('ratqsp0',ratqsp0)
    12101201       CALL getin_p('ratqsdp',ratqsdp)
     1202       iflag_wake_tend = 0
     1203       CALL getin_p('iflag_wake_tend',iflag_wake_tend)
    12111204    ENDIF
    12121205
     
    16981691    dql0(:,:)=0.
    16991692    dqi0(:,:)=0.
     1693    dsig0(:) = 0.
     1694    ddens0(:) = 0.
     1695    wkoccur1(:)=1
    17001696    !
    17011697    ! Mettre a zero des variables de sortie (pour securite)
     
    21352131       ENDIF
    21362132       ! !!
    2137        !=================================================================
    2138        !         PROVISOIRE : DECOUPLAGE PBL/WAKE
    2139        !         --------------------------------
    2140        !
    2141        !!      wake_deltat_sav(:,:)=wake_deltat(:,:)
    2142        !!      wake_deltaq_sav(:,:)=wake_deltaq(:,:)
    2143        !!      wake_deltat(:,:)=0.
    2144        !!      wake_deltaq(:,:)=0.
    2145        !=================================================================
    21462133       !>jyg+nrlmd
    21472134       !
     
    22182205            )
    22192206       !
    2220        !=================================================================
    2221        !         PROVISOIRE : DECOUPLAGE PBL/WAKE
    2222        !         --------------------------------
    2223        !
    2224        !!      wake_deltat(:,:)=wake_deltat_sav(:,:)
    2225        !!      wake_deltaq(:,:)=wake_deltaq_sav(:,:)
    2226        !=================================================================
    2227        !
    22282207       !  Add turbulent diffusion tendency to the wake difference variables
    22292208       IF (mod(iflag_pbl_split,2) .NE. 0) THEN
    2230           wake_deltat(:,:) = wake_deltat(:,:) + (d_t_vdf_w(:,:)-d_t_vdf_x(:,:))
    2231           wake_deltaq(:,:) = wake_deltaq(:,:) + (d_q_vdf_w(:,:)-d_q_vdf_x(:,:))
     2209!jyg<
     2210          d_deltat_vdf(:,:) = d_t_vdf_w(:,:)-d_t_vdf_x(:,:)
     2211          d_deltaq_vdf(:,:) = d_q_vdf_w(:,:)-d_q_vdf_x(:,:)
     2212          CALL add_wake_tend &
     2213             (d_deltat_vdf, d_deltaq_vdf, dsig0, ddens0, wkoccur1, 'vdf', abortphy)
     2214       ELSE
     2215          d_deltat_vdf(:,:) = 0.
     2216          d_deltaq_vdf(:,:) = 0.
     2217!>jyg
    22322218       ENDIF
    22332219
     
    24042390       !=======================================================================
    24052391       !ajout pour la parametrisation des poches froides: calcul de
    2406        !t_wake et t_undi: si pas de poches froides, t_wake=t_undi=t_seri
    2407        do k=1,klev
    2408           do i=1,klon
    2409              if (iflag_wake>=1) then
    2410                 t_wake(i,k) = t_seri(i,k) &
     2392       !t_w et t_x: si pas de poches froides, t_w=t_x=t_seri
     2393       if (iflag_wake>=1) then
     2394         do k=1,klev
     2395            do i=1,klon
     2396                t_w(i,k) = t_seri(i,k) &
    24112397                     +(1-wake_s(i))*wake_deltat(i,k)
    2412                 q_wake(i,k) = q_seri(i,k) &
     2398                q_w(i,k) = q_seri(i,k) &
    24132399                     +(1-wake_s(i))*wake_deltaq(i,k)
    2414                 t_undi(i,k) = t_seri(i,k) &
     2400                t_x(i,k) = t_seri(i,k) &
    24152401                     -wake_s(i)*wake_deltat(i,k)
    2416                 q_undi(i,k) = q_seri(i,k) &
     2402                q_x(i,k) = q_seri(i,k) &
    24172403                     -wake_s(i)*wake_deltaq(i,k)
    2418              else
    2419                 t_wake(i,k) = t_seri(i,k)
    2420                 q_wake(i,k) = q_seri(i,k)
    2421                 t_undi(i,k) = t_seri(i,k)
    2422                 q_undi(i,k) = q_seri(i,k)
    2423              endif
    2424           enddo
    2425        enddo
     2404            enddo
     2405         enddo
     2406       else
     2407                t_w(:,:) = t_seri(:,:)
     2408                q_w(:,:) = q_seri(:,:)
     2409                t_x(:,:) = t_seri(:,:)
     2410                q_x(:,:) = q_seri(:,:)
     2411       endif
    24262412       !
    24272413       !jyg<
     
    24322418          IF (ok_adjwk) THEN
    24332419             limbas(:) = 1
    2434              CALL ajsec(paprs, pplay, t_wake, q_wake, limbas, &
     2420             CALL ajsec(paprs, pplay, t_w, q_w, limbas, &
    24352421                  d_t_adjwk, d_q_adjwk)
    24362422          ENDIF
     
    24392425             DO i=1,klon
    24402426                IF (wake_s(i) .GT. 1.e-3) THEN
    2441                    t_wake(i,k) = t_wake(i,k) + d_t_adjwk(i,k)
    2442                    q_wake(i,k) = q_wake(i,k) + d_q_adjwk(i,k)
    2443                    wake_deltat(i,k) = wake_deltat(i,k) + d_t_adjwk(i,k)
    2444                    wake_deltaq(i,k) = wake_deltaq(i,k) + d_q_adjwk(i,k)
     2427                   t_w(i,k) = t_w(i,k) + d_t_adjwk(i,k)
     2428                   q_w(i,k) = q_w(i,k) + d_q_adjwk(i,k)
     2429                   d_deltat_ajs_cv(i,k) = d_t_adjwk(i,k)
     2430                   d_deltaq_ajs_cv(i,k) = d_q_adjwk(i,k)
     2431                ELSE
     2432                   d_deltat_ajs_cv(i,k) = 0.
     2433                   d_deltaq_ajs_cv(i,k) = 0.
    24452434                ENDIF
    24462435             ENDDO
    24472436          ENDDO
     2437          CALL add_wake_tend &
     2438              (d_deltat_ajs_cv, d_deltaq_ajs_cv, dsig0, ddens0, wkoccur1, 'ajs_cv', abortphy)
    24482439       ENDIF ! (iflag_wake>=1)
    24492440       !>jyg
     
    24862477          !jyg   iflag_con est dans clesphys
    24872478          !c          CALL concvl (iflag_con,iflag_clos,
    2488           clw=0.
    24892479          CALL concvl (iflag_clos, &
    2490                dtime, paprs, pplay, k_upper_cv, t_undi,q_undi, &
    2491                t_wake,q_wake,wake_s, &
     2480               dtime, paprs, pplay, k_upper_cv, t_x,q_x, &
     2481               t_w,q_w,wake_s, &
    24922482               u_seri,v_seri,tr_seri,nbtr_tmp, &
    24932483               ALE,ALP, &
     
    27052695          ENDDO
    27062696       ENDDO
    2707        !nrlmd+jyg<
    2708        DO k=1,klev
    2709           DO i=1,klon
    2710              wdt_PBL(i,k) =  0.
    2711              wdq_PBL(i,k) =  0.
    2712              udt_PBL(i,k) =  0.
    2713              udq_PBL(i,k) =  0.
    2714           ENDDO
    2715        ENDDO
    2716        !
    2717        IF (mod(iflag_pbl_split,2) .EQ. 1) THEN
    2718           DO k=1,klev
    2719              DO i=1,klon
    2720                 wdt_PBL(i,k) = wdt_PBL(i,k) + d_t_vdf_w(i,k)/dtime
    2721                 wdq_PBL(i,k) = wdq_PBL(i,k) + d_q_vdf_w(i,k)/dtime
    2722                 udt_PBL(i,k) = udt_PBL(i,k) + d_t_vdf_x(i,k)/dtime
    2723                 udq_PBL(i,k) = udq_PBL(i,k) + d_q_vdf_x(i,k)/dtime
    2724                 !!        dt_dwn(i,k)  = dt_dwn(i,k) + d_t_vdf_w(i,k)/dtime
    2725                 !!        dq_dwn(i,k)  = dq_dwn(i,k) + d_q_vdf_w(i,k)/dtime
    2726                 !!        dt_a  (i,k)    = dt_a(i,k) + d_t_vdf_x(i,k)/dtime
    2727                 !!        dq_a  (i,k)    = dq_a(i,k) + d_q_vdf_x(i,k)/dtime
    2728              ENDDO
    2729           ENDDO
    2730        ENDIF
    2731        IF (mod(iflag_pbl_split/2,2) .EQ. 1) THEN
    2732           DO k=1,klev
    2733              DO i=1,klon
    2734                 !!        dt_dwn(i,k)  = dt_dwn(i,k) + 0.
    2735                 !!        dq_dwn(i,k)  = dq_dwn(i,k) + 0.
    2736                 !!        dt_a(i,k)   = dt_a(i,k)   + d_t_ajs(i,k)/dtime
    2737                 !!        dq_a(i,k)   = dq_a(i,k)   + d_q_ajs(i,k)/dtime
    2738                 udt_PBL(i,k)   = udt_PBL(i,k)   + d_t_ajs(i,k)/dtime
    2739                 udq_PBL(i,k)   = udq_PBL(i,k)   + d_q_ajs(i,k)/dtime
    2740              ENDDO
    2741           ENDDO
    2742        ENDIF
    2743        !>nrlmd+jyg
    27442697
    27452698       IF (iflag_wake==2) THEN
     
    27702723       !
    27712724       !calcul caracteristiques de la poche froide
    2772        call calWAKE (paprs,pplay,dtime &
    2773             ,t_seri,q_seri,omega &
    2774             ,dt_dwn,dq_dwn,M_dwn,M_up &
    2775             ,dt_a,dq_a,sigd &
    2776             ,wdt_PBL,wdq_PBL &
    2777             ,udt_PBL,udq_PBL &
    2778             ,wake_deltat,wake_deltaq,wake_dth &
    2779             ,wake_h,wake_s,wake_dens &
    2780             ,wake_pe,wake_fip,wake_gfl &
    2781             ,dt_wake,dq_wake &
    2782             ,wake_k, t_undi,q_undi &
    2783             ,wake_omgbdth,wake_dp_omgb &
    2784             ,wake_dtKE,wake_dqKE &
    2785             ,wake_dtPBL,wake_dqPBL &
    2786             ,wake_omg,wake_dp_deltomg &
    2787             ,wake_spread,wake_Cstar,wake_d_deltat_gw &
    2788             ,wake_ddeltat,wake_ddeltaq)
     2725       call calWAKE (iflag_wake_tend, paprs, pplay, dtime, &
     2726            t_seri, q_seri, omega,  &
     2727            dt_dwn, dq_dwn, M_dwn, M_up,  &
     2728            dt_a, dq_a,  &
     2729            sigd,  &
     2730            wake_deltat, wake_deltaq, wake_s, wake_dens,  &
     2731            wake_dth, wake_h,  &
     2732            wake_pe, wake_fip, wake_gfl,  &
     2733            d_t_wake, d_q_wake,  &
     2734            wake_k, t_x, q_x,  &
     2735            wake_omgbdth, wake_dp_omgb,  &
     2736            wake_dtKE, wake_dqKE,  &
     2737            wake_omg, wake_dp_deltomg,  &
     2738            wake_spread, wake_Cstar, d_deltat_wk_gw,  &
     2739            d_deltat_wk, d_deltaq_wk, d_s_wk, d_dens_wk)
    27892740       !
    27902741       !-----------------------------------------------------------------------
    27912742       ! ajout des tendances des poches froides
    2792        ! Faire rapidement disparaitre l'ancien dt_wake pour garder un d_t_wake
    2793        ! coherent avec les autres d_t_...
    2794        d_t_wake(:,:)=dt_wake(:,:)*dtime
    2795        d_q_wake(:,:)=dq_wake(:,:)*dtime
    27962743       CALL add_phys_tend(du0,dv0,d_t_wake,d_q_wake,dql0,dqi0,paprs,'wake', &
    27972744            abortphy,flag_inhib_tend)
    27982745       !------------------------------------------------------------------------
     2746
     2747!       Increment Wake state variables
     2748       IF (iflag_wake_tend .GT. 0.) THEN
     2749
     2750         CALL add_wake_tend &
     2751            (d_deltat_wk, d_deltaq_wk, d_s_wk, d_dens_wk, wake_k, &
     2752             'wake', abortphy)
     2753
     2754       ENDIF   ! (iflag_wake_tend .GT. 0.)
    27992755
    28002756    endif  ! (iflag_wake>=1)
     
    29192875                DO i=1,klon
    29202876                   !
    2921                    wake_deltat(i,k) = wake_deltat(i,k) - d_t_ajs(i,k)
    2922                    wake_deltaq(i,k) = wake_deltaq(i,k) - d_q_ajs(i,k)
    2923                    !
    2924                    !!!t_seri(i,k) = t_therm(i,k) + wake_s(i)*wake_deltat(i,k)
    2925                    !!!q_seri(i,k) = q_therm(i,k) + wake_s(i)*wake_deltaq(i,k)
     2877                   d_deltat_the(i,k) = - d_t_ajs(i,k)
     2878                   d_deltaq_the(i,k) = - d_q_ajs(i,k)
    29262879                   !
    29272880                   d_u_ajs(i,k) = d_u_ajs(i,k)*(1.-wake_s(i))
     
    29322885                ENDDO
    29332886             ENDDO
    2934 !!!          ELSE
    2935 !!!             DO k=1,klev
    2936 !!!                DO i=1,klon
    2937 !!!                   t_seri(i,k) = t_therm(i,k)
    2938 !!!                   q_seri(i,k) = q_therm(i,k)
    2939 !!!                ENDDO
    2940 !!!             ENDDO
    29412887          ENDIF
     2888!
     2889          CALL add_wake_tend &
     2890              (d_deltat_the, d_deltaq_the, dsig0, ddens0, wkoccur1, 'the', abortphy)
     2891!
    29422892          !
    29432893          CALL add_phys_tend(d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs,  &
    29442894                             dql0,dqi0,paprs,'thermals', abortphy,flag_inhib_tend)
    29452895          !
    2946           !>jyg
    2947 !jyg<
    29482896!
    29492897          CALL alpale_th( dtime, lmax_th, t_seri, cell_area,  &
     
    29522900                          alp_bl, alp_bl_stat, &
    29532901                          proba_notrig, random_notrig)
     2902          !>jyg
    29542903
    29552904          ! ------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.