Changeset 5776


Ignore:
Timestamp:
Jul 15, 2025, 2:13:19 PM (2 days ago)
Author:
evignon
Message:

ajout de l'advection horizontale de la TKE. Travaux dans le cadre de la these de Valentin Wiener

Location:
LMDZ6/trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/DefLists/field_def_lmdz.xml

    r5709 r5776  
    709709        <field id="tke_buoy" long_name="TKE Buoyancy term" unit="m2/s3" />
    710710        <field id="tke_shear" long_name="TKE Shear term" unit="m2/s3" />
    711     <field id="tke_trans" long_name="TKE Transport term" unit="m2/s3" />
     711        <field id="tke_trans" long_name="TKE Transport term" unit="m2/s3" />
     712        <field id="tke_adv" long_name="TKE advection term" unit="m2/s3" />
    712713        <field id="tke_ter"    long_name="Max Turb. Kinetic Energy ter"    unit="m2/s2" />
    713714        <field id="tke_lic"    long_name="Max Turb. Kinetic Energy lic"    unit="m2/s2" />
  • LMDZ6/trunk/libf/phylmd/clesphys_mod_h.f90

    r5685 r5776  
    3434          , ok_suntime_rrtm                                            &
    3535          , overlap                                                    &
    36           , ok_kzmin                                                   &
     36          , ok_kzmin, ok_advtke                                        &
    3737          , lev_histhf, lev_histday, lev_histmth                       &
    3838          , lev_histins, lev_histLES                                   &
     
    144144  LOGICAL :: ok_new_lscp
    145145  LOGICAL :: ok_bs, ok_rad_bs
     146  LOGICAL :: ok_advtke
    146147  ! flag to bypass or not the phytrac module
    147148  INTEGER :: iflag_phytrac
     
    188189  !$OMP      , ok_suntime_rrtm                                            &
    189190  !$OMP      , overlap                                                    &
    190   !$OMP      , ok_kzmin                                                   &
     191  !$OMP      , ok_kzmin, ok_advtke                                        &
    191192  !$OMP      , lev_histhf, lev_histday, lev_histmth                       &
    192193  !$OMP      , lev_histins, lev_histLES                                   &
  • LMDZ6/trunk/libf/phylmd/conf_phys_m.f90

    r5773 r5776  
    255255    INTEGER,SAVE  :: kz0_omp
    256256    LOGICAL, SAVE :: ok_bs_omp, ok_rad_bs_omp
     257    LOGICAL, SAVE :: ok_advtke_omp
    257258    LOGICAL, SAVE :: ok_mass_dtcon_omp, ok_mass_dqcon_omp, ok_mass_duvcon_omp
    258259
     
    23302331
    23312332
     2333    ok_advtke_omp = .FALSE.
     2334    CALL getin('ok_advtke', ok_advtke_omp)
     2335    !
     2336    !Config Key  = ok_advtke_omp
     2337    !Config Desc = advect tke
     2338    !Config Def  = .FALSE.
     2339    !Config Help = ...
    23322340
    23332341    ok_bs_omp = .FALSE.
     
    25092517    ok_bs = ok_bs_omp
    25102518    ok_rad_bs=ok_rad_bs_omp
     2519    ok_advtke=ok_advtke_omp
    25112520    rad_froid = rad_froid_omp
    25122521    rad_chau1 = rad_chau1_omp
     
    30003009    WRITE(lunout,*) ' inertie_lic = ', inertie_lic
    30013010    WRITE(lunout,*) ' inertie_sno = ', inertie_sno
     3011    WRITE(lunout,*) ' ok_advtke = ', ok_advtke
    30023012    WRITE(lunout,*) ' ok_bs = ', ok_bs
    30033013    WRITE(lunout,*) ' ok_rad_bs = ', ok_rad_bs
  • LMDZ6/trunk/libf/phylmd/create_etat0_unstruct_mod.f90

    r5719 r5776  
    264264    cf_ancien = 0.
    265265    rvc_ancien = 0.
     266    ! TKE when advected
     267    tke_ancien = 0.
    266268
    267269    wake_delta_pbl_TKE(:,:,:)=0
  • LMDZ6/trunk/libf/phylmd/infotrac_phy.F90

    r5756 r5776  
    1515   PUBLIC :: init_infotrac_phy                             !--- Initialization of the tracers
    1616   PUBLIC :: tracers, type_trac                            !--- Full tracers database, tracers type keyword
    17    PUBLIC :: nqtot,   nbtr,   nqo,   nqCO2,   nqtottr      !--- Main dimensions
     17   PUBLIC :: nqtot, nbtr, nqo, nqCO2, nqtottr, nqtke       !--- Main dimensions
    1818   PUBLIC :: conv_flg, pbl_flg                             !--- Convection & boundary layer activation keys
    1919   PUBLIC :: new2oldH2O                                    !--- For backwards compatibility in phyetat0
     
    2727   !=== FOR ISOTOPES: Specific to water
    2828   PUBLIC :: iH2O                                          !--- Value of "ixIso" for "H2O" isotopes class
    29    PUBLIC :: ivap, iliq, isol, ibs, icf, irvc
     29   PUBLIC :: ivap, iliq, isol, ibs, icf, irvc, itke
    3030   !=== FOR ISOTOPES: Depending on the selected isotopes family
    3131   PUBLIC :: isotope                                       !--- Selected isotopes database (argument of getKey)
     
    103103
    104104   !=== INDICES FOR WATER
    105    INTEGER, SAVE :: ivap, iliq, isol, ibs, icf, irvc
    106 !$OMP THREADPRIVATE(ivap, iliq, isol, ibs, icf, irvc)
     105   INTEGER, SAVE :: ivap, iliq, isol, ibs, icf, irvc, itke
     106!$OMP THREADPRIVATE(ivap, iliq, isol, ibs, icf, irvc, itke)
    107107
    108108   !=== DIMENSIONS OF THE TRACERS TABLES, TRACERS TYPE(S)
     
    112112   INTEGER, SAVE :: nqtottr                                     !--- Number of tracers passed to phytrac (TO BE DELETED ?)
    113113   INTEGER, SAVE :: nqCO2                                       !--- Number of tracers of CO2  (ThL)
     114   INTEGER, SAVE :: nqtke                                       !--- Number of TKE tracers
    114115   CHARACTER(LEN=maxlen), SAVE :: type_trac                     !--- Keyword for tracers type(s)
    115 !$OMP THREADPRIVATE(nqtot, nbtr, nqo, nqtottr, nqCO2, type_trac)
     116!$OMP THREADPRIVATE(nqtot, nbtr, nqo, nqtottr, nqCO2, nqtke, type_trac)
    116117
    117118   !=== VARIABLES FOR INCA
     
    252253   nqtrue = SIZE(tracers)                                                                               !--- "true" tracers
    253254   nqo    =      COUNT(tracers(:)%component == 'lmdz' .AND. delPhase(tracers(:)%name)     == 'H2O')     !--- Water phases
     255   nqtke  =      COUNT(tracers(:)%component == 'lmdz' .AND. tracers(:)%name               == 'TKE')     !--- TKE tracers
    254256   nbtr = nqtrue-COUNT(tracers(:)%component == 'lmdz' .AND. delPhase(tracers(:)%gen0Name) == 'H2O')     !--- Passed to phytrac
    255257   nqCO2  =      COUNT( [type_trac == 'inco', type_trac == 'co2i'] )
     
    316318      jq = jq + nm
    317319   END DO
     320
    318321   DEALLOCATE(hadv, vadv)
    319322   CALL MOVE_ALLOC(FROM=ttr, TO=tracers)
     
    347350   isoFamilies = isoF(:)
    348351
     352
     353
    349354   !--- Convection / boundary layer activation for all tracers
    350355   IF(.NOT.ALLOCATED(conv_flg)) ALLOCATE(conv_flg(nbtr)); conv_flg(1:nbtr) = 1
     
    363368   icf  = strIdx(tracers(:)%name, addPhase('H2O', 'f'))
    364369   irvc = strIdx(tracers(:)%name, addPhase('H2O', 'c'))
     370   !--- Compute indices for TKE when it is advected
     371   itke = strIdx(tracers(:)%name, 'TKE')
     372   !--- For TKE, we force isInPhysics=.False.
     373   tracers(itke)%isInPhysics = .FALSE.
     374
     375
    365376
    366377   IF(CPPKEY_STRATAER .AND. type_trac == 'coag') THEN
     
    383394   CALL msg('niso   = '//TRIM(num2str(niso)),   modname)
    384395   CALL msg('ntiso  = '//TRIM(num2str(ntiso)),  modname)
     396   CALL msg('nqtke  = '//TRIM(num2str(nqtke)),  modname)
    385397   CALL msg('nqCO2  = '//TRIM(num2str(nqCO2)),  modname, CPPKEY_INCA)
    386398   CALL msg('nqINCA = '//TRIM(num2str(nqINCA)), modname, CPPKEY_INCA)
  • LMDZ6/trunk/libf/phylmd/phyetat0_mod.f90

    r5662 r5776  
    2626       falb_dir, falb_dif, prw_ancien, prlw_ancien, prsw_ancien, prbsw_ancien, &
    2727       ftsol, pbl_tke, pctsrf, q_ancien, ql_ancien, qs_ancien, qbs_ancien, &
    28        cf_ancien, rvc_ancien, radpas, radsol, rain_fall, ratqs, &
     28       cf_ancien, rvc_ancien, tke_ancien, radpas, radsol, rain_fall, ratqs, &
    2929       rnebcon, rugoro, sig1, snow_fall, bs_fall, solaire_etat0, sollw, sollwdown, &
    3030       solsw, solswfdiff, t_ancien, u_ancien, v_ancien, w01, wake_cstar, wake_deltaq, &
     
    518518  ENDIF
    519519
     520
    520521  found=phyetat0_get(clwcon,"CLWCON","CLWCON",0.)
    521522  found=phyetat0_get(rnebcon,"RNEBCON","RNEBCON",0.)
     
    528529!==================================
    529530!
    530   IF (iflag_pbl>1) then
     531  ! cas specifique de l'advection de TKE
     532  IF (ok_advtke) THEN
     533       ancien_ok=ancien_ok.AND.phyetat0_get(tke_ancien,"TKEANCIEN","TKEANCIEN",0.)
     534  ELSE
     535    tke_ancien(:,:)=0.
     536  ENDIF
     537
     538  IF (ok_advtke) THEN
     539    IF ( (maxval(tke_ancien).EQ.minval(tke_ancien))) THEN
     540       ancien_ok=.false.
     541    ENDIF
     542  ENDIF
     543
     544  IF ((iflag_pbl>1)) then
    531545     found=phyetat0_srf(pbl_tke,"TKE","Turb. Kinetic. Energ. ",1.e-8)
    532546  ENDIF
  • LMDZ6/trunk/libf/phylmd/phyredem.f90

    r5663 r5776  
    2323                                prw_ancien, prlw_ancien, prsw_ancien, prbsw_ancien,      &
    2424                                ql_ancien, qs_ancien, qbs_ancien, cf_ancien, &
    25                                 rvc_ancien, u_ancien, v_ancien,              &
     25                                rvc_ancien, u_ancien, v_ancien, tke_ancien,  &
    2626                                clwcon, rnebcon, ratqs, pbl_tke,             &
    2727                                wake_delta_pbl_tke, zmax0, f0, sig1, w01,    &
     
    327327    ! DEB TKE PBL !
    328328
     329    IF (ok_advtke) THEN
     330      CALL put_field(pass,"TKEANCIEN", "TKEANCIEN", tke_ancien)
     331    ENDIF
     332
     333
    329334    IF (iflag_pbl>1) then
    330335      CALL put_field_srf3(pass,"TKE", "Energ. Cineti. Turb.", &
  • LMDZ6/trunk/libf/phylmd/phys_local_var_mod.F90

    r5662 r5776  
    4545      REAL, SAVE, ALLOCATABLE :: d_cf_dyn(:,:), d_rvc_dyn(:,:)
    4646      !$OMP THREADPRIVATE(d_cf_dyn, d_rvc_dyn)
     47      REAL, SAVE, ALLOCATABLE :: d_tke_dyn(:,:)
     48      !$OMP THREADPRIVATE(d_tke_dyn)
    4749      REAL, SAVE, ALLOCATABLE :: d_tr_dyn(:,:,:)
    4850      !$OMP THREADPRIVATE(d_tr_dyn)
     
    882884      ALLOCATE(d_u_dyn(klon,klev),d_v_dyn(klon,klev))
    883885      ALLOCATE(d_cf_dyn(klon,klev),d_rvc_dyn(klon,klev))
     886      ALLOCATE(d_tke_dyn(klon,klev+1))
    884887      ALLOCATE(d_tr_dyn(klon,klev,nbtr))                   !RomP
    885888      ALLOCATE(d_t_con(klon,klev),d_q_con(klon,klev))
     
    13641367      DEALLOCATE(d_u_dyn,d_v_dyn)
    13651368      DEALLOCATE(d_cf_dyn,d_rvc_dyn)
     1369      DEALLOCATE(d_tke_dyn)
    13661370      DEALLOCATE(d_tr_dyn)                      !RomP
    13671371      DEALLOCATE(d_t_con,d_q_con)
  • LMDZ6/trunk/libf/phylmd/phys_output_ctrlout_mod.F90

    r5709 r5776  
    15351535  TYPE(ctrl_out), SAVE :: o_tke_dissip = ctrl_out((/ 10, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    15361536    'tke_dissip ', 'TKE dissipation term', 'm2/s3', (/ ('', i=1, 10) /))
    1537 
     1537  TYPE(ctrl_out), SAVE :: o_tke_adv = ctrl_out((/ 10, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
     1538    'tke_adv ', 'TKE advection term', 'm2/s3', (/ ('', i=1, 10) /))
    15381539  TYPE(ctrl_out), SAVE :: o_tke_max = ctrl_out((/ 4, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    15391540    'tke_max', 'TKE max', 'm2/s2',                                  &
  • LMDZ6/trunk/libf/phylmd/phys_output_write_mod.F90

    r5763 r5776  
    156156         o_dqsphy, o_dqsphy2d, o_dqbsphy, o_dqbsphy2d, o_albe_srf, o_z0m_srf, o_z0h_srf, &
    157157         o_ages_srf, o_snow_srf, o_alb1, o_alb2, o_tke, o_tke_dissip, &
    158          o_tke_max, o_kz, o_kz_max, o_clwcon, o_tke_shear, o_tke_buoy, o_tke_trans, &
     158         o_tke_max, o_kz, o_kz_max, o_clwcon, o_tke_shear, o_tke_buoy, o_tke_trans, o_tke_adv, &
    159159         o_dtdyn, o_dqdyn, o_dqdyn2d, o_dqldyn, o_dqldyn2d, &
    160160         o_dqsdyn, o_dqsdyn2d, o_dqbsdyn, o_dqbsdyn2d, o_dudyn, o_dvdyn, &
     
    386386         wdtrainA, wdtrainS, wdtrainM, n2, s2, strig, zcong, zlcl_th, proba_notrig, &
    387387         random_notrig, &
    388          cf_seri, d_cf_dyn, rvc_seri, d_rvc_dyn, &
     388         cf_seri, d_cf_dyn, rvc_seri, d_rvc_dyn, d_tke_dyn,&
    389389         qsub, qissr, qcld, subfra, issrfra, gamma_cond, &
    390390         dcf_sub, dcf_con, dcf_mix, &
     
    16221622
    16231623          CALL histwrite_phy(o_tke_trans, zx_tmp_fi3d)
     1624
     1625          IF (ok_advtke) THEN
     1626             CALL histwrite_phy(o_tke_adv, d_tke_dyn(:,1 : klev))
     1627          ENDIF
    16241628
    16251629       ENDIF
  • LMDZ6/trunk/libf/phylmd/phys_state_var_mod.F90

    r5685 r5776  
    140140      REAL, ALLOCATABLE, SAVE :: cf_ancien(:,:), rvc_ancien(:,:)
    141141!$OMP THREADPRIVATE(cf_ancien, rvc_ancien)
     142       REAL, ALLOCATABLE, SAVE :: tke_ancien(:,:)
     143!$OMP THREADPRIVATE(tke_ancien)
    142144!!! RomP >>>
    143145      REAL, ALLOCATABLE, SAVE :: tr_ancien(:,:,:)
     
    673675      ALLOCATE(u_ancien(klon,klev), v_ancien(klon,klev))
    674676      ALLOCATE(cf_ancien(klon,klev), rvc_ancien(klon,klev))
     677      ALLOCATE(tke_ancien(klon,klev+1))
    675678!!! Rom P >>>
    676679      ALLOCATE(tr_ancien(klon,klev,nbtr))
     
    941944      DEALLOCATE(u_ancien, v_ancien)
    942945      DEALLOCATE(cf_ancien, rvc_ancien)
     946      DEALLOCATE(tke_ancien)
    943947      DEALLOCATE(tr_ancien)                           !RomP
    944948      DEALLOCATE(ratqs, pbl_tke,coefh,coefm)
  • LMDZ6/trunk/libf/phylmd/physiq_mod.F90

    r5768 r5776  
    3939    USE ioipsl_getin_p_mod, ONLY : getin_p
    4040    USE indice_sol_mod
    41     USE infotrac_phy, ONLY: nqtot, nbtr, nqo, tracers, type_trac, addPhase, ivap, iliq, isol, ibs, icf, irvc
     41    USE infotrac_phy, ONLY: nqtot, nbtr, nqo, nqtke, tracers, type_trac, addPhase, ivap, iliq, isol, ibs, icf, irvc, itke
    4242    USE strings_mod,  ONLY: strIdx
    4343    USE iophy
     
    155155       ! Dynamic tendencies (diagnostics)
    156156       d_t_dyn,d_q_dyn,d_ql_dyn,d_qs_dyn,d_qbs_dyn, &
    157        d_u_dyn,d_v_dyn,d_cf_dyn,d_rvc_dyn,d_tr_dyn, &
     157       d_u_dyn,d_v_dyn,d_cf_dyn,d_rvc_dyn,d_tke_dyn,d_tr_dyn, &
    158158       d_q_dyn2d,d_ql_dyn2d,d_qs_dyn2d,d_qbs_dyn2d, &
    159159       ! Physic tendencies
     
    14291429        ENDIF
    14301430
     1431        IF (ok_advtke) THEN
     1432         IF (nqtke .LT. 1) THEN
     1433             WRITE (lunout, *) 'activation of TKE advection need a specific TKE tracer', &
     1434                               'but nqtke=', nqtke
     1435             abort_message='see above'
     1436             CALL abort_physic(modname,abort_message, 1)
     1437         ENDIF
     1438        ENDIF
     1439
     1440
    14311441       Ncvpaseq1 = 0
    14321442       dnwd0=0.0
     
    24502460       ENDDO
    24512461    ENDDO
    2452     !
     2462
     2463    ! in case of TKE advection, we interpolate vertically
     2464    ! since TKE is defined at the bottom interface of layers but
     2465    ! it is interpolated onto middle layers for advection
     2466
     2467    IF (ok_advtke) THEN
     2468      DO k=2,klev
     2469        DO i=1,klon
     2470           pbl_tke(i,k,:)=(qx(i,k-1,itke)*zmasse(i,k-1)+qx(i,k,itke)*zmasse(i,k))/(zmasse(i,k-1)+zmasse(i,k))
     2471        ENDDO
     2472      ENDDO
     2473    ENDIF
     2474
     2475    tke0(:,:)=pbl_tke(:,:,is_ave)
     2476
     2477
    24532478    !--OB water mass fixer
    24542479    IF (ok_water_mass_fixer) THEN
     
    24672492    !--fin mass fixer
    24682493
    2469     tke0(:,:)=pbl_tke(:,:,is_ave)
    2470     IF (nqtot > nqo) THEN
     2494    IF (nqtot > (nqo+nqtke)) THEN
    24712495       ! water isotopes are not included in tr_seri
    24722496       itr = 0
     
    25212545       d_cf_dyn(:,:) = (cf_seri(:,:)-cf_ancien(:,:))/phys_tstep
    25222546       d_rvc_dyn(:,:)= (rvc_seri(:,:)-rvc_ancien(:,:))/phys_tstep
     2547       d_tke_dyn(:,:)= (pbl_tke(:,:,is_ave)-tke_ancien(:,:))/phys_tstep
    25232548       CALL water_int(klon,klev,q_seri,zmasse,zx_tmp_fi2d)
    25242549       d_q_dyn2d(:)=(zx_tmp_fi2d(:)-prw_ancien(:))/phys_tstep
     
    25302555       d_qbs_dyn2d(:)=(zx_tmp_fi2d(:)-prbsw_ancien(:))/phys_tstep
    25312556       ! !! RomP >>>   td dyn traceur
    2532        IF (nqtot > nqo) d_tr_dyn(:,:,:)=(tr_seri(:,:,:)-tr_ancien(:,:,:))/phys_tstep
     2557       IF (nqtot > (nqo+nqtke)) d_tr_dyn(:,:,:)=(tr_seri(:,:,:)-tr_ancien(:,:,:))/phys_tstep
    25332558       ! !! RomP <<<
    25342559    ELSE
     
    25422567       d_cf_dyn(:,:) = 0.0
    25432568       d_rvc_dyn(:,:)= 0.0
     2569       d_tke_dyn(:,:)= 0.0
    25442570       d_q_dyn2d(:)  = 0.0
    25452571       d_ql_dyn2d(:) = 0.0
     
    25472573       d_qbs_dyn2d(:)= 0.0
    25482574       ! !! RomP >>>   td dyn traceur
    2549        IF (nqtot > nqo) d_tr_dyn(:,:,:)= 0.0
     2575       IF (nqtot > (nqo+nqtke)) d_tr_dyn(:,:,:)= 0.0
    25502576       ! !! RomP <<<
    25512577       ancien_ok = .TRUE.
     
    56725698       ENDDO
    56735699    ENDDO
     5700
     5701    ! in case of advection of TKE
     5702    IF (ok_advtke) THEN
     5703      DO k=1,klev
     5704         DO i=1,klon
     5705           d_qx(i,k,itke)=((pbl_tke(i,k,is_ave)+pbl_tke(i,k+1,is_ave))/2. - qx(i,k,itke)) / phys_tstep
     5706         ENDDO
     5707      ENDDO
     5708    ENDIF
    56745709    !
    56755710    ! DC: All iterations are cycled if nqtot==nqo, so no nqtot>nqo condition required
     
    57005735    cf_ancien(:,:) = cf_seri(:,:)
    57015736    rvc_ancien(:,:)= rvc_seri(:,:)
     5737    tke_ancien(:,:)= pbl_tke(:,:,is_ave)
     5738
    57025739    CALL water_int(klon,klev,q_ancien,zmasse,prw_ancien)
    57035740    CALL water_int(klon,klev,ql_ancien,zmasse,prlw_ancien)
Note: See TracChangeset for help on using the changeset viewer.