Changeset 5776
- Timestamp:
- Jul 15, 2025, 2:13:19 PM (2 days ago)
- Location:
- LMDZ6/trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/DefLists/field_def_lmdz.xml
r5709 r5776 709 709 <field id="tke_buoy" long_name="TKE Buoyancy term" unit="m2/s3" /> 710 710 <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" /> 712 713 <field id="tke_ter" long_name="Max Turb. Kinetic Energy ter" unit="m2/s2" /> 713 714 <field id="tke_lic" long_name="Max Turb. Kinetic Energy lic" unit="m2/s2" /> -
LMDZ6/trunk/libf/phylmd/clesphys_mod_h.f90
r5685 r5776 34 34 , ok_suntime_rrtm & 35 35 , overlap & 36 , ok_kzmin 36 , ok_kzmin, ok_advtke & 37 37 , lev_histhf, lev_histday, lev_histmth & 38 38 , lev_histins, lev_histLES & … … 144 144 LOGICAL :: ok_new_lscp 145 145 LOGICAL :: ok_bs, ok_rad_bs 146 LOGICAL :: ok_advtke 146 147 ! flag to bypass or not the phytrac module 147 148 INTEGER :: iflag_phytrac … … 188 189 !$OMP , ok_suntime_rrtm & 189 190 !$OMP , overlap & 190 !$OMP , ok_kzmin 191 !$OMP , ok_kzmin, ok_advtke & 191 192 !$OMP , lev_histhf, lev_histday, lev_histmth & 192 193 !$OMP , lev_histins, lev_histLES & -
LMDZ6/trunk/libf/phylmd/conf_phys_m.f90
r5773 r5776 255 255 INTEGER,SAVE :: kz0_omp 256 256 LOGICAL, SAVE :: ok_bs_omp, ok_rad_bs_omp 257 LOGICAL, SAVE :: ok_advtke_omp 257 258 LOGICAL, SAVE :: ok_mass_dtcon_omp, ok_mass_dqcon_omp, ok_mass_duvcon_omp 258 259 … … 2330 2331 2331 2332 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 = ... 2332 2340 2333 2341 ok_bs_omp = .FALSE. … … 2509 2517 ok_bs = ok_bs_omp 2510 2518 ok_rad_bs=ok_rad_bs_omp 2519 ok_advtke=ok_advtke_omp 2511 2520 rad_froid = rad_froid_omp 2512 2521 rad_chau1 = rad_chau1_omp … … 3000 3009 WRITE(lunout,*) ' inertie_lic = ', inertie_lic 3001 3010 WRITE(lunout,*) ' inertie_sno = ', inertie_sno 3011 WRITE(lunout,*) ' ok_advtke = ', ok_advtke 3002 3012 WRITE(lunout,*) ' ok_bs = ', ok_bs 3003 3013 WRITE(lunout,*) ' ok_rad_bs = ', ok_rad_bs -
LMDZ6/trunk/libf/phylmd/create_etat0_unstruct_mod.f90
r5719 r5776 264 264 cf_ancien = 0. 265 265 rvc_ancien = 0. 266 ! TKE when advected 267 tke_ancien = 0. 266 268 267 269 wake_delta_pbl_TKE(:,:,:)=0 -
LMDZ6/trunk/libf/phylmd/infotrac_phy.F90
r5756 r5776 15 15 PUBLIC :: init_infotrac_phy !--- Initialization of the tracers 16 16 PUBLIC :: tracers, type_trac !--- Full tracers database, tracers type keyword 17 PUBLIC :: nqtot, nbtr, nqo, nqCO2, nqtottr!--- Main dimensions17 PUBLIC :: nqtot, nbtr, nqo, nqCO2, nqtottr, nqtke !--- Main dimensions 18 18 PUBLIC :: conv_flg, pbl_flg !--- Convection & boundary layer activation keys 19 19 PUBLIC :: new2oldH2O !--- For backwards compatibility in phyetat0 … … 27 27 !=== FOR ISOTOPES: Specific to water 28 28 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 30 30 !=== FOR ISOTOPES: Depending on the selected isotopes family 31 31 PUBLIC :: isotope !--- Selected isotopes database (argument of getKey) … … 103 103 104 104 !=== 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) 107 107 108 108 !=== DIMENSIONS OF THE TRACERS TABLES, TRACERS TYPE(S) … … 112 112 INTEGER, SAVE :: nqtottr !--- Number of tracers passed to phytrac (TO BE DELETED ?) 113 113 INTEGER, SAVE :: nqCO2 !--- Number of tracers of CO2 (ThL) 114 INTEGER, SAVE :: nqtke !--- Number of TKE tracers 114 115 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) 116 117 117 118 !=== VARIABLES FOR INCA … … 252 253 nqtrue = SIZE(tracers) !--- "true" tracers 253 254 nqo = COUNT(tracers(:)%component == 'lmdz' .AND. delPhase(tracers(:)%name) == 'H2O') !--- Water phases 255 nqtke = COUNT(tracers(:)%component == 'lmdz' .AND. tracers(:)%name == 'TKE') !--- TKE tracers 254 256 nbtr = nqtrue-COUNT(tracers(:)%component == 'lmdz' .AND. delPhase(tracers(:)%gen0Name) == 'H2O') !--- Passed to phytrac 255 257 nqCO2 = COUNT( [type_trac == 'inco', type_trac == 'co2i'] ) … … 316 318 jq = jq + nm 317 319 END DO 320 318 321 DEALLOCATE(hadv, vadv) 319 322 CALL MOVE_ALLOC(FROM=ttr, TO=tracers) … … 347 350 isoFamilies = isoF(:) 348 351 352 353 349 354 !--- Convection / boundary layer activation for all tracers 350 355 IF(.NOT.ALLOCATED(conv_flg)) ALLOCATE(conv_flg(nbtr)); conv_flg(1:nbtr) = 1 … … 363 368 icf = strIdx(tracers(:)%name, addPhase('H2O', 'f')) 364 369 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 365 376 366 377 IF(CPPKEY_STRATAER .AND. type_trac == 'coag') THEN … … 383 394 CALL msg('niso = '//TRIM(num2str(niso)), modname) 384 395 CALL msg('ntiso = '//TRIM(num2str(ntiso)), modname) 396 CALL msg('nqtke = '//TRIM(num2str(nqtke)), modname) 385 397 CALL msg('nqCO2 = '//TRIM(num2str(nqCO2)), modname, CPPKEY_INCA) 386 398 CALL msg('nqINCA = '//TRIM(num2str(nqINCA)), modname, CPPKEY_INCA) -
LMDZ6/trunk/libf/phylmd/phyetat0_mod.f90
r5662 r5776 26 26 falb_dir, falb_dif, prw_ancien, prlw_ancien, prsw_ancien, prbsw_ancien, & 27 27 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, & 29 29 rnebcon, rugoro, sig1, snow_fall, bs_fall, solaire_etat0, sollw, sollwdown, & 30 30 solsw, solswfdiff, t_ancien, u_ancien, v_ancien, w01, wake_cstar, wake_deltaq, & … … 518 518 ENDIF 519 519 520 520 521 found=phyetat0_get(clwcon,"CLWCON","CLWCON",0.) 521 522 found=phyetat0_get(rnebcon,"RNEBCON","RNEBCON",0.) … … 528 529 !================================== 529 530 ! 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 531 545 found=phyetat0_srf(pbl_tke,"TKE","Turb. Kinetic. Energ. ",1.e-8) 532 546 ENDIF -
LMDZ6/trunk/libf/phylmd/phyredem.f90
r5663 r5776 23 23 prw_ancien, prlw_ancien, prsw_ancien, prbsw_ancien, & 24 24 ql_ancien, qs_ancien, qbs_ancien, cf_ancien, & 25 rvc_ancien, u_ancien, v_ancien, 25 rvc_ancien, u_ancien, v_ancien, tke_ancien, & 26 26 clwcon, rnebcon, ratqs, pbl_tke, & 27 27 wake_delta_pbl_tke, zmax0, f0, sig1, w01, & … … 327 327 ! DEB TKE PBL ! 328 328 329 IF (ok_advtke) THEN 330 CALL put_field(pass,"TKEANCIEN", "TKEANCIEN", tke_ancien) 331 ENDIF 332 333 329 334 IF (iflag_pbl>1) then 330 335 CALL put_field_srf3(pass,"TKE", "Energ. Cineti. Turb.", & -
LMDZ6/trunk/libf/phylmd/phys_local_var_mod.F90
r5662 r5776 45 45 REAL, SAVE, ALLOCATABLE :: d_cf_dyn(:,:), d_rvc_dyn(:,:) 46 46 !$OMP THREADPRIVATE(d_cf_dyn, d_rvc_dyn) 47 REAL, SAVE, ALLOCATABLE :: d_tke_dyn(:,:) 48 !$OMP THREADPRIVATE(d_tke_dyn) 47 49 REAL, SAVE, ALLOCATABLE :: d_tr_dyn(:,:,:) 48 50 !$OMP THREADPRIVATE(d_tr_dyn) … … 882 884 ALLOCATE(d_u_dyn(klon,klev),d_v_dyn(klon,klev)) 883 885 ALLOCATE(d_cf_dyn(klon,klev),d_rvc_dyn(klon,klev)) 886 ALLOCATE(d_tke_dyn(klon,klev+1)) 884 887 ALLOCATE(d_tr_dyn(klon,klev,nbtr)) !RomP 885 888 ALLOCATE(d_t_con(klon,klev),d_q_con(klon,klev)) … … 1364 1367 DEALLOCATE(d_u_dyn,d_v_dyn) 1365 1368 DEALLOCATE(d_cf_dyn,d_rvc_dyn) 1369 DEALLOCATE(d_tke_dyn) 1366 1370 DEALLOCATE(d_tr_dyn) !RomP 1367 1371 DEALLOCATE(d_t_con,d_q_con) -
LMDZ6/trunk/libf/phylmd/phys_output_ctrlout_mod.F90
r5709 r5776 1535 1535 TYPE(ctrl_out), SAVE :: o_tke_dissip = ctrl_out((/ 10, 10, 10, 10, 10, 10, 11, 11, 11, 11/), & 1536 1536 '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) /)) 1538 1539 TYPE(ctrl_out), SAVE :: o_tke_max = ctrl_out((/ 4, 10, 10, 10, 10, 10, 11, 11, 11, 11/), & 1539 1540 'tke_max', 'TKE max', 'm2/s2', & -
LMDZ6/trunk/libf/phylmd/phys_output_write_mod.F90
r5763 r5776 156 156 o_dqsphy, o_dqsphy2d, o_dqbsphy, o_dqbsphy2d, o_albe_srf, o_z0m_srf, o_z0h_srf, & 157 157 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, & 159 159 o_dtdyn, o_dqdyn, o_dqdyn2d, o_dqldyn, o_dqldyn2d, & 160 160 o_dqsdyn, o_dqsdyn2d, o_dqbsdyn, o_dqbsdyn2d, o_dudyn, o_dvdyn, & … … 386 386 wdtrainA, wdtrainS, wdtrainM, n2, s2, strig, zcong, zlcl_th, proba_notrig, & 387 387 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,& 389 389 qsub, qissr, qcld, subfra, issrfra, gamma_cond, & 390 390 dcf_sub, dcf_con, dcf_mix, & … … 1622 1622 1623 1623 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 1624 1628 1625 1629 ENDIF -
LMDZ6/trunk/libf/phylmd/phys_state_var_mod.F90
r5685 r5776 140 140 REAL, ALLOCATABLE, SAVE :: cf_ancien(:,:), rvc_ancien(:,:) 141 141 !$OMP THREADPRIVATE(cf_ancien, rvc_ancien) 142 REAL, ALLOCATABLE, SAVE :: tke_ancien(:,:) 143 !$OMP THREADPRIVATE(tke_ancien) 142 144 !!! RomP >>> 143 145 REAL, ALLOCATABLE, SAVE :: tr_ancien(:,:,:) … … 673 675 ALLOCATE(u_ancien(klon,klev), v_ancien(klon,klev)) 674 676 ALLOCATE(cf_ancien(klon,klev), rvc_ancien(klon,klev)) 677 ALLOCATE(tke_ancien(klon,klev+1)) 675 678 !!! Rom P >>> 676 679 ALLOCATE(tr_ancien(klon,klev,nbtr)) … … 941 944 DEALLOCATE(u_ancien, v_ancien) 942 945 DEALLOCATE(cf_ancien, rvc_ancien) 946 DEALLOCATE(tke_ancien) 943 947 DEALLOCATE(tr_ancien) !RomP 944 948 DEALLOCATE(ratqs, pbl_tke,coefh,coefm) -
LMDZ6/trunk/libf/phylmd/physiq_mod.F90
r5768 r5776 39 39 USE ioipsl_getin_p_mod, ONLY : getin_p 40 40 USE indice_sol_mod 41 USE infotrac_phy, ONLY: nqtot, nbtr, nqo, tracers, type_trac, addPhase, ivap, iliq, isol, ibs, icf, irvc41 USE infotrac_phy, ONLY: nqtot, nbtr, nqo, nqtke, tracers, type_trac, addPhase, ivap, iliq, isol, ibs, icf, irvc, itke 42 42 USE strings_mod, ONLY: strIdx 43 43 USE iophy … … 155 155 ! Dynamic tendencies (diagnostics) 156 156 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_t r_dyn, &157 d_u_dyn,d_v_dyn,d_cf_dyn,d_rvc_dyn,d_tke_dyn,d_tr_dyn, & 158 158 d_q_dyn2d,d_ql_dyn2d,d_qs_dyn2d,d_qbs_dyn2d, & 159 159 ! Physic tendencies … … 1429 1429 ENDIF 1430 1430 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 1431 1441 Ncvpaseq1 = 0 1432 1442 dnwd0=0.0 … … 2450 2460 ENDDO 2451 2461 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 2453 2478 !--OB water mass fixer 2454 2479 IF (ok_water_mass_fixer) THEN … … 2467 2492 !--fin mass fixer 2468 2493 2469 tke0(:,:)=pbl_tke(:,:,is_ave) 2470 IF (nqtot > nqo) THEN 2494 IF (nqtot > (nqo+nqtke)) THEN 2471 2495 ! water isotopes are not included in tr_seri 2472 2496 itr = 0 … … 2521 2545 d_cf_dyn(:,:) = (cf_seri(:,:)-cf_ancien(:,:))/phys_tstep 2522 2546 d_rvc_dyn(:,:)= (rvc_seri(:,:)-rvc_ancien(:,:))/phys_tstep 2547 d_tke_dyn(:,:)= (pbl_tke(:,:,is_ave)-tke_ancien(:,:))/phys_tstep 2523 2548 CALL water_int(klon,klev,q_seri,zmasse,zx_tmp_fi2d) 2524 2549 d_q_dyn2d(:)=(zx_tmp_fi2d(:)-prw_ancien(:))/phys_tstep … … 2530 2555 d_qbs_dyn2d(:)=(zx_tmp_fi2d(:)-prbsw_ancien(:))/phys_tstep 2531 2556 ! !! RomP >>> td dyn traceur 2532 IF (nqtot > nqo) d_tr_dyn(:,:,:)=(tr_seri(:,:,:)-tr_ancien(:,:,:))/phys_tstep2557 IF (nqtot > (nqo+nqtke)) d_tr_dyn(:,:,:)=(tr_seri(:,:,:)-tr_ancien(:,:,:))/phys_tstep 2533 2558 ! !! RomP <<< 2534 2559 ELSE … … 2542 2567 d_cf_dyn(:,:) = 0.0 2543 2568 d_rvc_dyn(:,:)= 0.0 2569 d_tke_dyn(:,:)= 0.0 2544 2570 d_q_dyn2d(:) = 0.0 2545 2571 d_ql_dyn2d(:) = 0.0 … … 2547 2573 d_qbs_dyn2d(:)= 0.0 2548 2574 ! !! RomP >>> td dyn traceur 2549 IF (nqtot > nqo) d_tr_dyn(:,:,:)= 0.02575 IF (nqtot > (nqo+nqtke)) d_tr_dyn(:,:,:)= 0.0 2550 2576 ! !! RomP <<< 2551 2577 ancien_ok = .TRUE. … … 5672 5698 ENDDO 5673 5699 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 5674 5709 ! 5675 5710 ! DC: All iterations are cycled if nqtot==nqo, so no nqtot>nqo condition required … … 5700 5735 cf_ancien(:,:) = cf_seri(:,:) 5701 5736 rvc_ancien(:,:)= rvc_seri(:,:) 5737 tke_ancien(:,:)= pbl_tke(:,:,is_ave) 5738 5702 5739 CALL water_int(klon,klev,q_ancien,zmasse,prw_ancien) 5703 5740 CALL water_int(klon,klev,ql_ancien,zmasse,prlw_ancien)
Note: See TracChangeset
for help on using the changeset viewer.