diff --git a/CODEOWNERS b/CODEOWNERS index 189fabd95..8f53a50bc 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -11,26 +11,28 @@ # https://docs.google.com/spreadsheets/d/14y0Th_sSpCqlssEMNfSZ_Ni9wrpPqfpPY0kRG7jCZB8/edit#gid=0 # (Internal NOAA document.) -smoke/* @haiqinli @grantfirl @Qingfu-Liu @dustinswales -physics/aerclm_def.F @AnningCheng-NOAA @andrewgettelman @grantfirl @Qingfu-Liu @dustinswales +smoke_dust/* @haiqinli @grantfirl @Qingfu-Liu @dustinswales physics/aer_cloud.F @AnningCheng-NOAA @andrewgettelman @grantfirl @Qingfu-Liu @dustinswales +physics/aerclm_def.F @AnningCheng-NOAA @andrewgettelman @grantfirl @Qingfu-Liu @dustinswales physics/aerinterp.F90 @AnningCheng-NOAA @andrewgettelman @grantfirl @Qingfu-Liu @dustinswales physics/bl_mynn_common.f90 @joeolson42 @grantfirl @Qingfu-Liu @dustinswales physics/calpreciptype.f90 @grantfirl @Qingfu-Liu @dustinswales -physics/cires_orowam2017.f @grantfirl @Qingfu-Liu @dustinswales -physics/cires_tauamf_data.F90 @grantfirl @Qingfu-Liu @dustinswales -physics/cires_ugwp* @ValeryYudin-NOAA @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales +physics/cires_orowam2017.f @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales +physics/cires_tauamf_data.F90 @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales +physics/cires_ugwp* @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales physics/cldmacro.F @AnningCheng-NOAA @andrewgettelman @grantfirl @Qingfu-Liu @dustinswales physics/cldwat2m_micro.F @AnningCheng-NOAA @andrewgettelman @grantfirl @Qingfu-Liu @dustinswales +physics/clm_lake.* @tanyasmirnova @SamuelTrahanNOAA @grantfirl @Qingfu-Liu @dustinswales physics/cnvc90.* @grantfirl @Qingfu-Liu @dustinswales physics/cs_conv_aw_adj.* @AnningCheng-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/cs_conv.* @AnningCheng-NOAA @grantfirl @Qingfu-Liu @dustinswales -physics/cu_gf* @hannahcbarnes @haiqinli @grantfirl @Qingfu-Liu @dustinswales -physics/cu_ntiedtke* @grantfirl @Qingfu-Liu @dustinswales +physics/cu_gf* @haiqinli @grantfirl @Qingfu-Liu @dustinswales +physics/cu_ntiedtke* @JongilHan66 @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales +physics/cu_c3* @lisa-bengtsson @haiqinli @grantfirl @Qingfu-Liu @dustinswales physics/date_def.f @XuLi-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/dcyc2t3.* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/drag_suite.* @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales -physics/flake* @YihuaWu-NOAA @grantfirl @Qingfu-Liu @dustinswales +physics/flake* @barlage @grantfirl @Qingfu-Liu @dustinswales physics/funcphys.f90 @grantfirl @Qingfu-Liu @dustinswales physics/fv_sat_adj.* @RuiyuSun @grantfirl @Qingfu-Liu @dustinswales physics/gcycle.F90 @grantfirl @Qingfu-Liu @dustinswales @@ -39,7 +41,7 @@ physics/get_prs_fv3.* physics/gfdl_cloud_microphys.* @RuiyuSun @grantfirl @Qingfu-Liu @dustinswales physics/GFDL_parse_tracers.F90 @grantfirl @Qingfu-Liu @dustinswales physics/gfdl_sfc_layer.* @ZhanZhang-NOAA @grantfirl @Qingfu-Liu @dustinswales -physics/GFS_cloud_diagnostics.* @dustinswales @grantfirl @Qingfu-Liu @dustinswales +physics/GFS_cloud_diagnostics.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/GFS_DCNV_generic_post.* @grantfirl @Qingfu-Liu @dustinswales physics/GFS_DCNV_generic_pre.* @grantfirl @Qingfu-Liu @dustinswales physics/GFS_debug.* @grantfirl @Qingfu-Liu @dustinswales @@ -58,13 +60,11 @@ physics/GFS_rad_time_vary.fv3.* physics/GFS_rad_time_vary.scm.* @grantfirl @Qingfu-Liu @dustinswales physics/GFS_rrtmgp_cloud_mp.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/GFS_rrtmgp_cloud_overlap.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales -physics/GFS_rrtmgp_lw_post.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/GFS_rrtmg_post.* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/GFS_rrtmgp_pre.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/GFS_rrtmg_pre.* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/GFS_rrtmgp_setup.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales -physics/GFS_rrtmgp_sw_post.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales -physics/GFS_rrtmgp_sw_pre.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales +physics/GFS_rrtmgp_post.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/GFS_rrtmg_setup.* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/GFS_SCNV_generic_post.* @grantfirl @Qingfu-Liu @dustinswales physics/GFS_SCNV_generic_pre.* @grantfirl @Qingfu-Liu @dustinswales @@ -92,7 +92,7 @@ physics/gwdc.* @Songyou184 physics/gwdps.* @Songyou184 @grantfirl @Qingfu-Liu @dustinswales physics/h2o_def.* @grantfirl @Qingfu-Liu @dustinswales physics/h2ointerp.f90 @grantfirl @Qingfu-Liu @dustinswales -physics/h2ophys.* @SMoorthi-emc @grantfirl @Qingfu-Liu @dustinswales +physics/h2ophys.* @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/hedmf.* @JongilHan66 @WeiguoWang-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/iccn_def.F @grantfirl @Qingfu-Liu @dustinswales physics/iccninterp.F90 @grantfirl @Qingfu-Liu @dustinswales @@ -114,18 +114,18 @@ physics/module_BL_MYJPBL.* @Qingfu-Liu physics/module_bl_mynn.* @joeolson42 @grantfirl @Qingfu-Liu @dustinswales physics/module_gfdl_cloud_microphys.* @RuiyuSun @grantfirl @Qingfu-Liu @dustinswales physics/module_MP_FER_HIRES.* @ericaligo-NOAA @grantfirl @Qingfu-Liu @dustinswales -physics/module_mp_nssl_2mom.F90 @grantfirl @Qingfu-Liu @dustinswales +physics/module_mp_nssl_2mom.F90 @MicroTed @grantfirl @Qingfu-Liu @dustinswales physics/module_mp_radar.* @gthompsnWRF @RuiyuSun @grantfirl @Qingfu-Liu @dustinswales physics/module_mp_thompson* @gthompsnWRF @RuiyuSun @AndersJensen-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/module_nst* @XuLi-NOAA @grantfirl @Qingfu-Liu @dustinswales -physics/module_sf_exchcoef.f90 @grantfirl @Qingfu-Liu @dustinswales +physics/module_sf_exchcoef.f90 @ZhanZhang-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/module_SF_JSFC.F90 @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/module_sf_mynn.F90 @joeolson42 @grantfirl @Qingfu-Liu @dustinswales physics/module_sf_ruclsm.* @tanyasmirnova @grantfirl @Qingfu-Liu @dustinswales physics/module_soil_pre.* @tanyasmirnova @grantfirl @Qingfu-Liu @dustinswales -physics/moninshoc.* @SMoorthi-emc @grantfirl @Qingfu-Liu @dustinswales +physics/moninshoc.* @grantfirl @Qingfu-Liu @dustinswales physics/mp_fer_hires.* @ericaligo-NOAA @grantfirl @Qingfu-Liu @dustinswales -physics/mp_nssl.* @grantfirl @Qingfu-Liu @dustinswales +physics/mp_nssl.* @MicroTed @grantfirl @Qingfu-Liu @dustinswales physics/mp_thompson* @gthompsnWRF @RuiyuSun @AndersJensen-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/multi_gases.F90 @RuiyuSun @grantfirl @Qingfu-Liu @dustinswales physics/myjpbl_wrapper.* @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales @@ -137,35 +137,34 @@ physics/namelist_soilveg_ruc.* @tanyasmirnova physics/*noahmp* @barlage @cenlinhe @grantfirl @Qingfu-Liu @dustinswales physics/ozinterp.f90 @grantfirl @Qingfu-Liu @dustinswales physics/ozne_def.* @grantfirl @Qingfu-Liu @dustinswales -physics/ozphys* @SMoorthi-emc @grantfirl @Qingfu-Liu @dustinswales +physics/ozphys* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/physcons.F90 @grantfirl @Qingfu-Liu @dustinswales physics/phys_tend.* @grantfirl @Qingfu-Liu @dustinswales physics/progsigma_calc.f90 @lisa-bengtsson @grantfirl @Qingfu-Liu @dustinswales physics/radcons.f90 @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales -physics/radiation_aerosols.f @Qingfu-Liu @dustinswales @AnningCheng-NOAA @grantfirl @Qingfu-Liu @dustinswales +physics/radiation_aerosols.f @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/radiation_astronomy.f @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales -physics/radiation_cloud_overlap.F90 @dustinswales @mjiacono @grantfirl @Qingfu-Liu @dustinswales +physics/radiation_cloud_overlap.F90 @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/radiation_clouds.f @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/radiation_gases.f @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/radiation_surface.* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/radiation_tools.F90 @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/radlw_* @mjiacono @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/radsw_* @mjiacono @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales -physics/rad_sw_pre.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales -physics/rascnv.* @SMoorthi-emc @grantfirl @Qingfu-Liu @dustinswales +physics/rascnv.* @haiqinli @JongilHan66 @grantfirl @Qingfu-Liu @dustinswales physics/rayleigh_damp.* @yangfanglin @grantfirl @Qingfu-Liu @dustinswales -physics/rrtmg_lw_cloud_optics.F90 @dustinswales @grantfirl @Qingfu-Liu @dustinswales +physics/rrtmg_lw_cloud_optics.F90 @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/rrtmg_lw_post.* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales physics/rrtmg_lw_pre.* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales -physics/rrtmgp_aerosol_optics.* @dustinswales @grantfirl @Qingfu-Liu @dustinswales -physics/rrtmgp_lw_* @dustinswales @grantfirl @Qingfu-Liu @dustinswales -physics/rrtmgp_sw_* @dustinswales @grantfirl @Qingfu-Liu @dustinswales -physics/rrtmg_sw_cloud_optics.F90 @dustinswales @grantfirl @Qingfu-Liu @dustinswales +physics/rrtmgp_aerosol_optics.* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales +physics/rrtmgp_lw_* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales +physics/rrtmgp_sw_* @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales +physics/rrtmg_sw_cloud_optics.F90 @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/rrtmg_sw_post.* @Qingfu-Liu @dustinswales @grantfirl @Qingfu-Liu @dustinswales -physics/rte-rrtmgp @RobertPincus @dustinswales @grantfirl @Qingfu-Liu @dustinswales +physics/rte-rrtmgp @dustinswales @Qingfu-Liu @grantfirl @Qingfu-Liu @dustinswales physics/samfdeepcnv.* @JongilHan66 @lisa-bengtsson @grantfirl @Qingfu-Liu @dustinswales physics/samfshalcnv.* @JongilHan66 @lisa-bengtsson @grantfirl @Qingfu-Liu @dustinswales -physics/samfaerosols.* @JongilHan66 @grantfirl @Qingfu-Liu @dustinswales +physics/samfaerosols.* @JongilHan66 @lisa-bengtsson @grantfirl @Qingfu-Liu @dustinswales physics/sascnvn.* @JongilHan66 @grantfirl @Qingfu-Liu @dustinswales physics/satmedmfvdif.* @JongilHan66 @grantfirl @Qingfu-Liu @dustinswales physics/satmedmfvdifq.* @JongilHan66 @grantfirl @Qingfu-Liu @dustinswales @@ -179,21 +178,21 @@ physics/sfc_diff.* @JongilHan66 physics/sfc_nst* @XuLi-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/sfc_ocean.* @HelinWei-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/sfc_sice.* @wd20xw @grantfirl @Qingfu-Liu @dustinswales -#physics/sfcsub.F @grantfirl @Qingfu-Liu @dustinswales +physics/sfcsub.F @grantfirl @Qingfu-Liu @dustinswales physics/sflx.f @HelinWei-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/sgscloud_radpost.* @grantfirl @Qingfu-Liu @dustinswales physics/sgscloud_radpre.* @grantfirl @Qingfu-Liu @dustinswales physics/shalcnv.* @JongilHan66 @grantfirl @Qingfu-Liu @dustinswales -physics/shinhongvdif.* @grantfirl @Qingfu-Liu @dustinswales -physics/shoc.* @SMoorthi-emc @grantfirl @Qingfu-Liu @dustinswales +physics/shinhongvdif.* @Qingfu-Liu @WeiguoWang-NOAA @grantfirl @Qingfu-Liu @dustinswales +physics/shoc.* @grantfirl @Qingfu-Liu @dustinswales physics/surface_perturbation.* @HelinWei-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/tridi.f @JongilHan66 @WeiguoWang-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/ugwp_driver_v0.F @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales physics/ugwpv1_gsldrag.* @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales -physics/ugwpv1_gsldrag_post.* @grantfirl @Qingfu-Liu @dustinswales +physics/ugwpv1_gsldrag_post.* @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales physics/unified_ugwp* @mdtoyNOAA @grantfirl @Qingfu-Liu @dustinswales physics/wv_saturation.F @AnningCheng-NOAA @andrewgettelman @grantfirl @Qingfu-Liu @dustinswales -physics/ysuvdif.* @grantfirl @Qingfu-Liu @dustinswales +physics/ysuvdif.* @Qingfu-Liu @WeiguoWang-NOAA @grantfirl @Qingfu-Liu @dustinswales physics/zhaocarr_gscond.* @RuiyuSun @grantfirl @Qingfu-Liu @dustinswales physics/zhaocarr_precpd.* @RuiyuSun @grantfirl @Qingfu-Liu @dustinswales diff --git a/physics/GFS_debug.F90 b/physics/GFS_debug.F90 index 7a2ece18d..fe63c1cea 100644 --- a/physics/GFS_debug.F90 +++ b/physics/GFS_debug.F90 @@ -488,6 +488,10 @@ subroutine GFS_diagtoscreen_run (Model, Statein, Stateout, Sfcprop, Coupling, call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%vtype_save', Sfcprop%vtype_save) call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%stype' , Sfcprop%stype) call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%stype_save', Sfcprop%stype_save) + + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%scolor' , Sfcprop%scolor) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%scolore_save', Sfcprop%scolor_save) + call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%uustar' , Sfcprop%uustar) call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%oro' , Sfcprop%oro) call print_var(mpirank, omprank, blkno, Grid%xlat_d, Grid%xlon_d, 'Sfcprop%oro_uf' , Sfcprop%oro_uf) @@ -1531,7 +1535,7 @@ module GFS_checkland !! \htmlinclude GFS_checkland_run.html !! subroutine GFS_checkland_run (me, master, blkno, im, kdt, iter, flag_iter, flag_guess, & - flag_init, flag_restart, frac_grid, isot, ivegsrc, stype, vtype, slope, & + flag_init, flag_restart, frac_grid, isot, ivegsrc, stype,scolor, vtype, slope, & dry, icy, wet, lake, ocean, oceanfrac, landfrac, lakefrac, slmsk, islmsk, & zorl, zorlw, zorll, zorli, fice, errmsg, errflg ) @@ -1554,6 +1558,8 @@ subroutine GFS_checkland_run (me, master, blkno, im, kdt, iter, flag_iter, flag_ integer, intent(in ) :: isot integer, intent(in ) :: ivegsrc integer, intent(in ) :: stype(:) + integer, intent(in ) :: scolor(:) + integer, intent(in ) :: vtype(:) integer, intent(in ) :: slope(:) logical, intent(in ) :: dry(:) @@ -1598,6 +1604,8 @@ subroutine GFS_checkland_run (me, master, blkno, im, kdt, iter, flag_iter, flag_ write(0,'(a,2i5,1x,1x,l)') 'YYY: i, blk, flag_iter(i) :', i, blkno, flag_iter(i) write(0,'(a,2i5,1x,1x,l)') 'YYY: i, blk, flag_guess(i) :', i, blkno, flag_guess(i) write(0,'(a,2i5,1x,e16.7)')'YYY: i, blk, stype(i) :', i, blkno, stype(i) + + write(0,'(a,2i5,1x,e16.7)')'YYY: i, blk, scolor(i) :', i, blkno, scolor(i) write(0,'(a,2i5,1x,e16.7)')'YYY: i, blk, vtype(i) :', i, blkno, vtype(i) write(0,'(a,2i5,1x,e16.7)')'YYY: i, blk, slope(i) :', i, blkno, slope(i) write(0,'(a,2i5,1x,1x,l)') 'YYY: i, blk, dry(i) :', i, blkno, dry(i) diff --git a/physics/GFS_debug.meta b/physics/GFS_debug.meta index 23175ce0f..1ad24e1d6 100644 --- a/physics/GFS_debug.meta +++ b/physics/GFS_debug.meta @@ -543,6 +543,13 @@ dimensions = (horizontal_loop_extent) type = integer intent = in +[scolor] + standard_name = soil_color_classification + long_name = soil color for lsm + units = index + dimensions = (horizontal_loop_extent) + type = integer + intent = in [vtype] standard_name = vegetation_type_classification long_name = vegetation type for lsm diff --git a/physics/GFS_phys_time_vary.fv3.F90 b/physics/GFS_phys_time_vary.fv3.F90 index 5760cee2f..d82f22399 100644 --- a/physics/GFS_phys_time_vary.fv3.F90 +++ b/physics/GFS_phys_time_vary.fv3.F90 @@ -33,7 +33,8 @@ module GFS_phys_time_vary use set_soilveg_mod, only: set_soilveg ! --- needed for Noah MP init - use noahmp_tables, only: laim_table,saim_table,sla_table, & + use noahmp_tables, only: read_mp_table_parameters, & + laim_table,saim_table,sla_table, & bexp_table,smcmax_table,smcwlt_table, & dwsat_table,dksat_table,psisat_table, & isurban_table,isbarren_table, & @@ -169,6 +170,7 @@ subroutine GFS_phys_time_vary_init ( real(kind_phys), intent(in) :: canopy(:) real(kind_phys), intent(in) :: tg3(:) integer, intent(in) :: stype(:) + real(kind_phys), intent(in) :: con_t0c integer, intent(in) :: nthrds @@ -270,6 +272,10 @@ subroutine GFS_phys_time_vary_init ( !> - Initialize soil vegetation (needed for sncovr calculation further down) call set_soilveg(me, isot, ivegsrc, nlunit, errmsg, errflg) +!$OMP section +!> - read in NoahMP table (needed for NoahMP init) + call read_mp_table_parameters(errmsg, errflg) + !$OMP end sections ! Need an OpenMP barrier here (implicit in "end sections") @@ -439,8 +445,8 @@ subroutine GFS_phys_time_vary_init ( !$OMP shared(isbarren_table,isice_table,isurban_table) & !$omp shared(iswater_table,laim_table,sla_table,bexp_table) & !$omp shared(stc,smc,slc,tg3,snowxy,tsnoxy,snicexy,snliqxy) & -!$omp shared(zsnsoxy,STYPE,SMCMAX_TABLE,SMCWLT_TABLE,zs,dzs) & -!$omp shared(DWSAT_TABLE,DKSAT_TABLE,PSISAT_TABLE,smoiseq) & +!$omp shared(zsnsoxy,stype,smcmax_table,smcwlt_table,zs,dzs) & +!$omp shared(dwsat_table,dksat_table,psisat_table,smoiseq) & !$OMP shared(smcwtdxy,deeprechxy,rechxy,errmsg,errflg) & !$OMP private(vegtyp,masslai,masssai,snd,dzsno,dzsnso,isnow) & !$OMP private(soiltyp,bexp,smcmax,smcwlt,dwsat,dksat,psisat,ddz) @@ -712,7 +718,7 @@ subroutine GFS_phys_time_vary_timestep_init ( kice, ialb, isot, ivegsrc, input_nml_file, use_ufo, nst_anl, frac_grid, fhcyc, phour, & lakefrac, min_seaice, min_lakeice, smc, slc, stc, smois, sh2o, tslb, tiice, tg3, tref, & tsfc, tsfco, tisfc, hice, fice, facsf, facwf, alvsf, alvwf, alnsf, alnwf, zorli, zorll, & - zorlo, weasd, slope, snoalb, canopy, vfrac, vtype, stype, shdmin, shdmax, snowd, & + zorlo, weasd, slope, snoalb, canopy, vfrac, vtype, stype,scolor, shdmin, shdmax, snowd, & cv, cvb, cvt, oro, oro_uf, xlat_d, xlon_d, slmsk, landfrac, & do_ugwp_v1, jindx1_tau, jindx2_tau, ddy_j1tau, ddy_j2tau, tau_amf, errmsg, errflg) @@ -759,7 +765,7 @@ subroutine GFS_phys_time_vary_timestep_init ( zorli(:), zorll(:), zorlo(:), weasd(:), snoalb(:), & canopy(:), vfrac(:), shdmin(:), shdmax(:), & snowd(:), cv(:), cvb(:), cvt(:), oro(:), oro_uf(:), slmsk(:) - integer, intent(inout) :: vtype(:), stype(:), slope(:) + integer, intent(inout) :: vtype(:), stype(:),scolor(:), slope(:) character(len=*), intent(out) :: errmsg integer, intent(out) :: errflg @@ -875,7 +881,10 @@ subroutine GFS_phys_time_vary_timestep_init ( fhour, iflip, jindx1_aer, jindx2_aer, & ddy_aer, iindx1_aer, & iindx2_aer, ddx_aer, & - levs, prsl, aer_nm) + levs, prsl, aer_nm, errmsg, errflg) + if(errflg /= 0) then + return + endif endif !> - Call gcycle() to repopulate specific time-varying surface properties for AMIP/forecast runs @@ -887,7 +896,7 @@ subroutine GFS_phys_time_vary_timestep_init ( frac_grid, smc, slc, stc, smois, sh2o, tslb, tiice, tg3, tref, tsfc, & tsfco, tisfc, hice, fice, facsf, facwf, alvsf, alvwf, alnsf, alnwf, & zorli, zorll, zorlo, weasd, slope, snoalb, canopy, vfrac, vtype, & - stype, shdmin, shdmax, snowd, cv, cvb, cvt, oro, oro_uf, & + stype, scolor, shdmin, shdmax, snowd, cv, cvb, cvt, oro, oro_uf, & xlat_d, xlon_d, slmsk, imap, jmap, errmsg, errflg) endif endif diff --git a/physics/GFS_phys_time_vary.fv3.meta b/physics/GFS_phys_time_vary.fv3.meta index 2c5a383ae..6ef6e226c 100644 --- a/physics/GFS_phys_time_vary.fv3.meta +++ b/physics/GFS_phys_time_vary.fv3.meta @@ -1720,6 +1720,13 @@ dimensions = (horizontal_dimension) type = integer intent = inout +[scolor] + standard_name = soil_color_classification + long_name = soil color for lsm + units = index + dimensions = (horizontal_dimension) + type = integer + intent = inout [shdmin] standard_name = min_vegetation_area_fraction long_name = min fractional coverage of green vegetation diff --git a/physics/GFS_rrtmg_pre.F90 b/physics/GFS_rrtmg_pre.F90 index cf9bbb6aa..4a2c3b290 100644 --- a/physics/GFS_rrtmg_pre.F90 +++ b/physics/GFS_rrtmg_pre.F90 @@ -18,7 +18,7 @@ module GFS_rrtmg_pre !! !>\section rrtmg_pre_gen General Algorithm subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,& - ltp, imfdeepcnv, imfdeepcnv_gf, imfdeepcnv_unified, me, ncnd, ntrac, & + ltp, imfdeepcnv, imfdeepcnv_gf, imfdeepcnv_c3, me, ncnd, ntrac, & num_p3d, npdf3d, & ncnvcld3d,ntqv, ntcw,ntiw, ntlnc, ntinc, ntrnc, ntsnc, ntccn, top_at_1,& ntrw, ntsw, ntgl, nthl, ntwa, ntoz, ntsmoke, ntdust, ntcoarsepm, & @@ -44,7 +44,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,& gasvmr_o2, gasvmr_co, gasvmr_cfc11, gasvmr_cfc12, gasvmr_cfc22, & gasvmr_ccl4, gasvmr_cfc113, aerodp,ext550, clouds6, clouds7, clouds8, & clouds9, cldsa, cldfra, cldfra2d, lwp_ex,iwp_ex, lwp_fc,iwp_fc, & - faersw1, faersw2, faersw3, faerlw1, faerlw2, faerlw3, alpha, & + faersw1, faersw2, faersw3, faerlw1, faerlw2, faerlw3, alpha, rrfs_sd & aero_dir_fdb, fdb_coef, spp_wts_rad, spp_rad, ico2, latsozc, levozc, & blatc, dphiozc, errmsg, errflg) @@ -85,7 +85,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,& integer, intent(in) :: im, levs, lm, lmk, lmp, ltp, & n_var_lndp, imfdeepcnv, & - imfdeepcnv_gf, imfdeepcnv_unified, & + imfdeepcnv_gf, imfdeepcnv_c3, & me, ncnd, ntrac, & num_p3d, npdf3d, ncnvcld3d, ntqv, & ntcw, ntiw, ntlnc, ntinc, & @@ -128,7 +128,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,& uni_cld, effr_in, do_mynnedmf, & lmfshal, lmfdeep2, pert_clds, lcrick,& lcnorm, top_at_1, lextop, mraerosol - logical, intent(in) :: aero_dir_fdb + logical, intent(in) :: rrfs_sd, aero_dir_fdb logical, intent(in) :: nssl_ccn_on, nssl_invertccn integer, intent(in) :: spp_rad @@ -641,7 +641,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,& endif !>--- add smoke and dust --- - if (aero_dir_fdb) then + if (rrfs_sd .and. aero_dir_fdb) then do k=1,lmk do i=1,im aer_nm(i,k,1 )=aer_nm(i,k,1 )+ qgrs(i,k,ntdust)*fdb_coef(1)*1.e-9 ! dust bin1 @@ -820,7 +820,7 @@ subroutine GFS_rrtmg_pre_run (im, levs, lm, lmk, lmp, n_var_lndp, lextop,& enddo endif elseif (imp_physics == imp_physics_gfdl) then ! GFDL MP - if ((imfdeepcnv==imfdeepcnv_gf .or. imfdeepcnv==imfdeepcnv_unified) .and. kdt>1) then + if ((imfdeepcnv==imfdeepcnv_gf .or. imfdeepcnv==imfdeepcnv_c3) .and. kdt>1) then do k=1,lm k1 = k + kd do i=1,im diff --git a/physics/GFS_rrtmg_pre.meta b/physics/GFS_rrtmg_pre.meta index 3b4d35c6d..038f59c27 100644 --- a/physics/GFS_rrtmg_pre.meta +++ b/physics/GFS_rrtmg_pre.meta @@ -79,9 +79,9 @@ dimensions = () type = integer intent = in -[imfdeepcnv_unified] - standard_name = identifier_for_unified_deep_convection - long_name = flag for Unified deep convection scheme +[imfdeepcnv_c3] + standard_name = identifier_for_c3_deep_convection + long_name = flag for C3 deep convection scheme units = flag dimensions = () type = integer @@ -1466,6 +1466,13 @@ dimensions = () type = integer intent = in +[rrfs_sd] + standard_name = do_smoke_coupling + long_name = flag controlling rrfs_sd collection (default off) + units = flag + dimensions = () + type = logical + intent = in [aero_dir_fdb] standard_name = do_smoke_aerosol_direct_feedback long_name = flag for smoke and dust radiation feedback diff --git a/physics/GFS_rrtmgp_cloud_mp.F90 b/physics/GFS_rrtmgp_cloud_mp.F90 index 32104b7f8..79ae1559a 100644 --- a/physics/GFS_rrtmgp_cloud_mp.F90 +++ b/physics/GFS_rrtmgp_cloud_mp.F90 @@ -875,17 +875,12 @@ subroutine cmp_reff_Thompson(nLev, nCol, i_cldliq, i_cldice, i_cldsnow, i_cldice qi_mp(iCol,iLay) = tracer(iCol,iLay,i_cldice) / (1.-q_lay(iCol,iLay)) qs_mp(iCol,iLay) = tracer(iCol,iLay,i_cldsnow) / (1.-q_lay(iCol,iLay)) ni_mp(iCol,iLay) = tracer(iCol,iLay,i_cldice_nc) / (1.-q_lay(iCol,iLay)) - if (ltaerosol) then + if (ltaerosol .or. mraerosol) then nc_mp(iCol,iLay) = tracer(iCol,iLay,i_cldliq_nc) / (1.-q_lay(iCol,iLay)) nwfa(iCol,iLay) = tracer(iCol,iLay,i_twa) if (qc_mp(iCol,iLay) > 1.e-12 .and. nc_mp(iCol,iLay) < 100.) then nc_mp(iCol,iLay) = make_DropletNumber(qc_mp(iCol,iLay)*rho, nwfa(iCol,iLay)*rho) * orho endif - elseif (mraerosol) then - nc_mp(iCol,iLay) = tracer(iCol,iLay,i_cldliq_nc) / (1.-q_lay(iCol,iLay)) - if (qc_mp(iCol,iLay) > 1.e-12 .and. nc_mp(iCol,iLay) < 100.) then - nc_mp(iCol,iLay) = make_DropletNumber(qc_mp(iCol,iLay)*rho, nwfa(iCol,iLay)*rho) * orho - endif else if (nint(lsmask(iCol)) == 1) then !land nc_mp(iCol,iLay) = nt_c_l*orho diff --git a/physics/GFS_suite_interstitial_3.F90 b/physics/GFS_suite_interstitial_3.F90 index ca82f20aa..5ca20ffc1 100644 --- a/physics/GFS_suite_interstitial_3.F90 +++ b/physics/GFS_suite_interstitial_3.F90 @@ -10,8 +10,8 @@ module GFS_suite_interstitial_3 !! subroutine GFS_suite_interstitial_3_run (otsptflag, & im, levs, nn, cscnv,imfshalcnv, imfdeepcnv, & - imfshalcnv_samf, imfdeepcnv_samf, imfdeepcnv_unified, & - imfshalcnv_unified,progsigma, & + imfshalcnv_samf, imfdeepcnv_samf, imfdeepcnv_c3, & + imfshalcnv_c3,progsigma, & first_time_step, restart, & satmedmf, trans_trac, do_shoc, ltaerosol, ntrac, ntcw, & ntiw, ntclamt, ntrw, ntsw, ntrnc, ntsnc, ntgl, ntgnc, & @@ -40,7 +40,7 @@ subroutine GFS_suite_interstitial_3_run (otsptflag, & logical, intent(in ) :: cscnv, satmedmf, trans_trac, do_shoc, ltaerosol, ras, progsigma logical, intent(in ) :: first_time_step, restart integer, intent(in ) :: imfshalcnv, imfdeepcnv, imfshalcnv_samf,imfdeepcnv_samf - integer, intent(in ) :: imfshalcnv_unified,imfdeepcnv_unified + integer, intent(in ) :: imfshalcnv_c3,imfdeepcnv_c3 integer, intent(in) :: ntinc, ntlnc logical, intent(in) :: ldiag3d, qdiag3d integer, dimension(:,:), intent(in) :: dtidx @@ -84,7 +84,7 @@ subroutine GFS_suite_interstitial_3_run (otsptflag, & ! In case of using prognostic updraf area fraction, initialize area fraction here ! since progsigma_calc is called from both deep and shallow schemes. if(((imfshalcnv == imfshalcnv_samf) .or. (imfdeepcnv == imfdeepcnv_samf) & - .or. (imfshalcnv == imfshalcnv_unified) .or. (imfdeepcnv == imfdeepcnv_unified)) & + .or. (imfshalcnv == imfshalcnv_c3) .or. (imfdeepcnv == imfdeepcnv_c3)) & .and. progsigma)then if(first_time_step .and. .not. restart)then do k=1,levs diff --git a/physics/GFS_suite_interstitial_3.meta b/physics/GFS_suite_interstitial_3.meta index a6d656a75..e8f9fe889 100644 --- a/physics/GFS_suite_interstitial_3.meta +++ b/physics/GFS_suite_interstitial_3.meta @@ -57,9 +57,9 @@ dimensions = () type = integer intent = in -[imfdeepcnv_unified] - standard_name = identifier_for_unified_deep_convection - long_name = flag for Unified deep convection scheme +[imfdeepcnv_c3] + standard_name = identifier_for_c3_deep_convection + long_name = flag for C3 deep convection scheme units = flag dimensions = () type = integer @@ -78,9 +78,9 @@ dimensions = () type = integer intent = in -[imfshalcnv_unified] - standard_name = identifier_for_unified_shallow_convection - long_name = flag for Unified shallow convection scheme +[imfshalcnv_c3] + standard_name = identifier_for_c3_shallow_convection + long_name = flag for C3 shallow convection scheme units = flag dimensions = () type = integer @@ -542,4 +542,4 @@ units = 1 dimensions = () type = integer - intent = out \ No newline at end of file + intent = out diff --git a/physics/GFS_surface_generic_post.F90 b/physics/GFS_surface_generic_post.F90 index 76d3f570c..9faebc8cf 100644 --- a/physics/GFS_surface_generic_post.F90 +++ b/physics/GFS_surface_generic_post.F90 @@ -21,10 +21,10 @@ module GFS_surface_generic_post !> \section arg_table_GFS_surface_generic_post_init Argument Table !! \htmlinclude GFS_surface_generic_post_init.html !! - subroutine GFS_surface_generic_post_init (vtype, stype, slope, vtype_save, stype_save, slope_save, errmsg, errflg) + subroutine GFS_surface_generic_post_init (vtype, stype,scolor, slope, vtype_save, stype_save,scolor_save, slope_save, errmsg, errflg) - integer, dimension(:), intent(in) :: vtype_save, stype_save, slope_save - integer, dimension(:), intent(out) :: vtype, stype, slope + integer, dimension(:), intent(in) :: vtype_save, stype_save,scolor_save, slope_save + integer, dimension(:), intent(out) :: vtype, stype, scolor,slope ! CCPP error handling character(len=*), intent(out) :: errmsg @@ -37,6 +37,7 @@ subroutine GFS_surface_generic_post_init (vtype, stype, slope, vtype_save, stype ! Restore vegetation, soil and slope type vtype(:) = vtype_save(:) stype(:) = stype_save(:) + scolor(:) = scolor_save(:) slope(:) = slope_save(:) end subroutine GFS_surface_generic_post_init @@ -53,7 +54,7 @@ subroutine GFS_surface_generic_post_run (im, cplflx, cplaqm, cplchm, cplwav, cpl v10mi_cpl, tsfci_cpl, psurfi_cpl, nnirbmi_cpl, nnirdfi_cpl, nvisbmi_cpl, nvisdfi_cpl, nswsfci_cpl, nswsfc_cpl, nnirbm_cpl, & nnirdf_cpl, nvisbm_cpl, nvisdf_cpl, gflux, evbsa, evcwa, transa, sbsnoa, snowca, snohfa, paha, ep, ecan, etran, edir, waxy, & runoff, srunoff, runof, drain, tecan, tetran, tedir, twa, lheatstrg, h0facu, h0facs, zvfun, hflx, evap, hflxq, hffac, & - isot, ivegsrc, islmsk, vtype, stype, slope, vtype_save, stype_save, slope_save, errmsg, errflg) + isot, ivegsrc, islmsk, vtype, stype,scolor, slope, vtype_save, stype_save,scolor_save, slope_save, errmsg, errflg) implicit none @@ -85,8 +86,8 @@ subroutine GFS_surface_generic_post_run (im, cplflx, cplaqm, cplchm, cplwav, cpl real(kind=kind_phys), dimension(:), intent(out) :: hflxq real(kind=kind_phys), dimension(:), intent(out) :: hffac - integer, intent(in) :: isot, ivegsrc, islmsk(:), vtype_save(:), stype_save(:), slope_save(:) - integer, intent(out) :: vtype(:), stype(:), slope(:) + integer, intent(in) :: isot, ivegsrc, islmsk(:), vtype_save(:), stype_save(:),scolor_save(:), slope_save(:) + integer, intent(out) :: vtype(:), stype(:),scolor(:), slope(:) ! CCPP error handling variables character(len=*), intent(out) :: errmsg @@ -274,6 +275,7 @@ subroutine GFS_surface_generic_post_run (im, cplflx, cplaqm, cplchm, cplwav, cpl ! Restore vegetation, soil and slope type vtype(:) = vtype_save(:) stype(:) = stype_save(:) + scolor(:) = scolor_save(:) slope(:) = slope_save(:) end subroutine GFS_surface_generic_post_run diff --git a/physics/GFS_surface_generic_post.meta b/physics/GFS_surface_generic_post.meta index aeb5c9754..9658be7d8 100644 --- a/physics/GFS_surface_generic_post.meta +++ b/physics/GFS_surface_generic_post.meta @@ -22,6 +22,13 @@ dimensions = (horizontal_dimension) type = integer intent = out +[scolor] + standard_name = soil_color_classification + long_name = soil color for lsm + units = index + dimensions = (horizontal_dimension) + type = integer + intent = out [slope] standard_name = surface_slope_classification long_name = sfc slope type for lsm @@ -43,6 +50,13 @@ dimensions = (horizontal_dimension) type = integer intent = in +[scolor_save] + standard_name = soil_color_classification_save + long_name = soil color for lsm save + units = index + dimensions = (horizontal_dimension) + type = integer + intent = in [slope_save] standard_name = surface_slope_classification_save long_name = sfc slope type for lsm save @@ -988,6 +1002,13 @@ dimensions = (horizontal_loop_extent) type = integer intent = out +[scolor] + standard_name = soil_color_classification + long_name = soil color for lsm + units = index + dimensions = (horizontal_loop_extent) + type = integer + intent = out [slope] standard_name = surface_slope_classification long_name = sfc slope type for lsm @@ -1009,6 +1030,13 @@ dimensions = (horizontal_loop_extent) type = integer intent = in +[scolor_save] + standard_name = soil_color_classification_save + long_name = soil color for lsm save + units = index + dimensions = (horizontal_loop_extent) + type = integer + intent = in [slope_save] standard_name = surface_slope_classification_save long_name = sfc slope type for lsm save diff --git a/physics/GFS_surface_generic_pre.F90 b/physics/GFS_surface_generic_pre.F90 index 6ecb2f713..5d321814c 100644 --- a/physics/GFS_surface_generic_pre.F90 +++ b/physics/GFS_surface_generic_pre.F90 @@ -21,16 +21,16 @@ module GFS_surface_generic_pre !> \section arg_table_GFS_surface_generic_pre_init Argument Table !! \htmlinclude GFS_surface_generic_pre_init.html !! - subroutine GFS_surface_generic_pre_init (nthreads, im, slmsk, isot, ivegsrc, stype, vtype, slope, & - vtype_save, stype_save, slope_save, errmsg, errflg) + subroutine GFS_surface_generic_pre_init (nthreads, im, slmsk, isot, ivegsrc, stype,scolor, vtype, slope, & + vtype_save, stype_save,scolor_save, slope_save, errmsg, errflg) implicit none ! Interface variables integer, intent(in) :: nthreads, im, isot, ivegsrc real(kind_phys), dimension(:), intent(in) :: slmsk - integer, dimension(:), intent(inout) :: vtype, stype, slope - integer, dimension(:), intent(out) :: vtype_save, stype_save, slope_save + integer, dimension(:), intent(inout) :: vtype, stype, scolor,slope + integer, dimension(:), intent(out) :: vtype_save, stype_save,scolor_save, slope_save ! CCPP error handling character(len=*), intent(out) :: errmsg @@ -49,22 +49,23 @@ subroutine GFS_surface_generic_pre_init (nthreads, im, slmsk, isot, ivegsrc, sty ! Save current values of vegetation, soil and slope type vtype_save(:) = vtype(:) stype_save(:) = stype(:) + scolor_save(:) = scolor(:) slope_save(:) = slope(:) - call update_vegetation_soil_slope_type(nthreads, im, isot, ivegsrc, islmsk, vtype, stype, slope) + call update_vegetation_soil_slope_type(nthreads, im, isot, ivegsrc, islmsk, vtype, stype,scolor, slope) end subroutine GFS_surface_generic_pre_init !> \section arg_table_GFS_surface_generic_pre_run Argument Table !! \htmlinclude GFS_surface_generic_pre_run.html !! - subroutine GFS_surface_generic_pre_run (nthreads, im, levs, vfrac, islmsk, isot, ivegsrc, stype, vtype, slope, & + subroutine GFS_surface_generic_pre_run (nthreads, im, levs, vfrac, islmsk, isot, ivegsrc, stype, scolor,vtype, slope, & prsik_1, prslk_1, tsfc, phil, con_g, sigmaf, work3, zlvl, & drain_cpl, dsnow_cpl, rain_cpl, snow_cpl, lndp_type, n_var_lndp, sfc_wts, & lndp_var_list, lndp_prt_list, & z01d, zt1d, bexp1d, xlai1d, vegf1d, lndp_vgf, & cplflx, flag_cice, islmsk_cice, slimskin_cpl, & - wind, u1, v1, cnvwind, smcwlt2, smcref2, vtype_save, stype_save, slope_save, & + wind, u1, v1, cnvwind, smcwlt2, smcref2, vtype_save, stype_save,scolor_save, slope_save, & errmsg, errflg) use surface_perturbation, only: cdfnor @@ -77,8 +78,8 @@ subroutine GFS_surface_generic_pre_run (nthreads, im, levs, vfrac, islmsk, isot, real(kind=kind_phys), intent(in) :: con_g real(kind=kind_phys), dimension(:), intent(in) :: vfrac, prsik_1, prslk_1 - integer, dimension(:), intent(inout) :: vtype, stype, slope - integer, dimension(:), intent(out) :: vtype_save(:), stype_save(:), slope_save(:) + integer, dimension(:), intent(inout) :: vtype, stype,scolor, slope + integer, dimension(:), intent(out) :: vtype_save(:), stype_save(:),scolor_save(:), slope_save(:) real(kind=kind_phys), dimension(:), intent(inout) :: tsfc real(kind=kind_phys), dimension(:,:), intent(in) :: phil @@ -159,9 +160,10 @@ subroutine GFS_surface_generic_pre_run (nthreads, im, levs, vfrac, islmsk, isot, ! Save current values of vegetation, soil and slope type vtype_save(:) = vtype(:) stype_save(:) = stype(:) + scolor_save(:) = scolor(:) slope_save(:) = slope(:) - call update_vegetation_soil_slope_type(nthreads, im, isot, ivegsrc, islmsk, vtype, stype, slope) + call update_vegetation_soil_slope_type(nthreads, im, isot, ivegsrc, islmsk, vtype, stype,scolor, slope) do i=1,im sigmaf(i) = max(vfrac(i), 0.01_kind_phys) @@ -191,16 +193,19 @@ subroutine GFS_surface_generic_pre_run (nthreads, im, levs, vfrac, islmsk, isot, end subroutine GFS_surface_generic_pre_run - subroutine update_vegetation_soil_slope_type(nthreads, im, isot, ivegsrc, islmsk, vtype, stype, slope) + subroutine update_vegetation_soil_slope_type(nthreads, im, isot, ivegsrc, islmsk, vtype, stype,scolor, slope) implicit none integer, intent(in) :: nthreads, im, isot, ivegsrc, islmsk(:) - integer, intent(inout) :: vtype(:), stype(:), slope(:) + integer, intent(inout) :: vtype(:), stype(:),scolor(:), slope(:) integer :: i !$OMP parallel do num_threads(nthreads) default(none) private(i) & -!$OMP shared(im, isot, ivegsrc, islmsk, vtype, stype, slope) +!$OMP shared(im, isot, ivegsrc, islmsk, vtype, stype,scolor, slope) + +! scolor is a place holder now, how to update soil color based on the mask/veg/sot src + do i=1,im if (islmsk(i) == 2) then if (isot == 1) then diff --git a/physics/GFS_surface_generic_pre.meta b/physics/GFS_surface_generic_pre.meta index f5b7f7f27..d78988787 100644 --- a/physics/GFS_surface_generic_pre.meta +++ b/physics/GFS_surface_generic_pre.meta @@ -50,6 +50,13 @@ dimensions = (horizontal_dimension) type = integer intent = inout +[scolor] + standard_name = soil_color_classification + long_name = soil color for lsm + units = index + dimensions = (horizontal_dimension) + type = integer + intent = inout [vtype] standard_name = vegetation_type_classification long_name = vegetation type for lsm @@ -71,6 +78,13 @@ dimensions = (horizontal_dimension) type = integer intent = out +[scolor_save] + standard_name = soil_color_classification_save + long_name = soil color for lsm save + units = index + dimensions = (horizontal_dimension) + type = integer + intent = out [vtype_save] standard_name = vegetation_type_classification_save long_name = vegetation type for lsm save @@ -162,6 +176,13 @@ dimensions = (horizontal_loop_extent) type = integer intent = inout +[scolor] + standard_name = soil_color_classification + long_name = soil color for lsm + units = index + dimensions = (horizontal_loop_extent) + type = integer + intent = inout [vtype] standard_name = vegetation_type_classification long_name = vegetation type for lsm @@ -190,6 +211,13 @@ dimensions = (horizontal_loop_extent) type = integer intent = out +[scolor_save] + standard_name = soil_color_classification_save + long_name = soil color for lsm save + units = index + dimensions = (horizontal_loop_extent) + type = integer + intent = out [slope_save] standard_name = surface_slope_classification_save long_name = sfc slope type for lsm save @@ -470,4 +498,4 @@ units = 1 dimensions = () type = integer - intent = out \ No newline at end of file + intent = out diff --git a/physics/aerinterp.F90 b/physics/aerinterp.F90 index 8ad446f30..4e2dc9047 100644 --- a/physics/aerinterp.F90 +++ b/physics/aerinterp.F90 @@ -15,6 +15,26 @@ module aerinterp contains + logical function netcdf_check(status, errmsg, errflg, why) + use netcdf + implicit none + character(len=*), intent(inout) :: errmsg + integer, intent(out) :: errflg + integer, intent(in) :: status + character(len=*), intent(in) :: why + + netcdf_check = (status == NF90_NOERR) + + if(netcdf_check) then + errflg = 0 + errmsg = ' ' + else + errflg = 1 + errmsg = trim(why) // ': ' // trim(nf90_strerror(status)) + endif + + END function netcdf_check + SUBROUTINE read_aerdata (me, master, iflip, idate, errmsg, errflg) use machine, only: kind_phys, kind_io4, kind_io8 use aerclm_def @@ -26,12 +46,16 @@ SUBROUTINE read_aerdata (me, master, iflip, idate, errmsg, errflg) integer, intent(inout) :: errflg !--- locals - integer :: ncid, varid, ndims, dim1, dim2, dim3, hmx + integer :: ncid, varid, ndims, hmx integer :: i, j, k, n, ii, imon, klev character :: fname*50, mn*2, vname*10 logical :: file_exist + integer :: dimids(NF90_MAX_VAR_DIMS) + integer :: dimlen(NF90_MAX_VAR_DIMS) + + errflg = 0 + errmsg = ' ' - integer, allocatable :: invardims(:) ! !! =================================================================== if (me == master) then @@ -60,25 +84,37 @@ SUBROUTINE read_aerdata (me, master, iflip, idate, errmsg, errflg) !! fetch dim spec and lat/lon from m01 data set !! =================================================================== fname=trim("aeroclim.m"//'01'//".nc") - call nf_open(fname , nf90_NOWRITE, ncid) + ncid = -1 + if(.not.netcdf_check(nf90_open(fname , nf90_NOWRITE, ncid), & + errmsg, errflg, 'open '//trim(fname))) then + return + endif vname = trim(specname(1)) - call nf_inq_varid(ncid, vname, varid) - call nf_inq_varndims(ncid, varid, ndims) - - if(.not. allocated(invardims)) allocate(invardims(3)) - call nf_inq_vardimid(ncid,varid,invardims) - call nf_inq_dimlen(ncid, invardims(1), dim1) - call nf_inq_dimlen(ncid, invardims(2), dim2) - call nf_inq_dimlen(ncid, invardims(3), dim3) + varid = -1 + if(.not.netcdf_check(nf90_inq_varid(ncid, vname, varid), & + errmsg, errflg, 'find id of '//trim(vname)//' var')) then + return + endif + ndims = 0 + if(.not.netcdf_check(nf90_inquire_variable(ncid, varid, ndims=ndims, dimids=dimids), & + errmsg, errflg, 'inquire details about '//trim(vname)//' var')) then + return + endif + do i=1,ndims + if(.not.netcdf_check(nf90_inquire_dimension(ncid, dimids(i), len=dimlen(i)), & + errmsg, errflg, 'inquire details about dimension')) then + return + endif + enddo ! specify latsaer, lonsaer, hmx - lonsaer = dim1 - latsaer = dim2 - levsw = dim3 + lonsaer = dimlen(1) + latsaer = dimlen(2) + levsw = dimlen(3) if(me==master) then - print *, 'MERRA2 dim: ',dim1, dim2, dim3 + print *, 'MERRA2 dim: ',dimlen(1:ndims) endif ! allocate arrays @@ -89,11 +125,29 @@ SUBROUTINE read_aerdata (me, master, iflip, idate, errmsg, errflg) endif ! construct lat/lon array - call nf_inq_varid(ncid, 'lat', varid) - call nf_get_var(ncid, varid, aer_lat) - call nf_inq_varid(ncid, 'lon', varid) - call nf_get_var(ncid, varid, aer_lon) - call nf_close(ncid) + varid = -1 + if(.not.netcdf_check(nf90_inq_varid(ncid, 'lat', varid), & + errmsg, errflg, 'find id of lat var')) then + return + endif + aer_lat = 0 + if(.not.netcdf_check(nf90_get_var(ncid, varid, aer_lat, (/ 1, 1, 1 /), (/latsaer, 1, 1/)), & + errmsg, errflg, 'read lat var')) then + return + endif + varid = -1 + if(.not.netcdf_check(nf90_inq_varid(ncid, 'lon', varid), & + errmsg, errflg, 'find id of lon var')) then + return + endif + aer_lon = 0 + if(.not.netcdf_check(nf90_get_var(ncid, varid, aer_lon, (/ 1, 1, 1 /), (/lonsaer, 1, 1/)), & + errmsg, errflg, 'read lon var')) then + return + endif + if(.not.netcdf_check(nf90_close(ncid), errmsg, errflg, 'close '//trim(fname))) then + return + endif END SUBROUTINE read_aerdata ! !********************************************************************** @@ -157,8 +211,10 @@ SUBROUTINE read_aerdataf ( me, master, iflip, idate, FHOUR, errmsg, errflg) n1 = n2 - 1 if (n2 > 12) n2 = n2 -12 !! =================================================================== - call read_netfaer(n1, iflip, 1) - call read_netfaer(n2, iflip, 2) + call read_netfaer(n1, iflip, 1, errmsg, errflg) + if(errflg/=0) return + call read_netfaer(n2, iflip, 2, errmsg, errflg) + if(errflg/=0) return !! =================================================================== n1sv=n1 n2sv=n2 @@ -224,12 +280,14 @@ END SUBROUTINE setindxaer !********************************************************************** ! SUBROUTINE aerinterpol( me,master,nthrds,npts,IDATE,FHOUR,iflip, jindx1,jindx2, & - ddy,iindx1,iindx2,ddx,lev,prsl,aerout) + ddy,iindx1,iindx2,ddx,lev,prsl,aerout, errmsg,errflg) ! use machine, only: kind_phys, kind_io4, kind_io8 use aerclm_def implicit none + integer, intent(inout) :: errflg + character(*), intent(inout) :: errmsg integer, intent(in) :: iflip integer i1,i2, iday,j,j1,j2,l,npts,nc,n1,n2,lev,k,i,ii, klev real(kind=kind_phys) fhour,temj, tx1, tx2,temi, tem @@ -252,6 +310,8 @@ SUBROUTINE aerinterpol( me,master,nthrds,npts,IDATE,FHOUR,iflip, jindx1,jindx2, integer w3kindreal,w3kindint ! + errflg = 0 + errmsg = ' ' IDAT = 0 IDAT(1) = IDATE(4) IDAT(2) = IDATE(2) @@ -298,7 +358,7 @@ SUBROUTINE aerinterpol( me,master,nthrds,npts,IDATE,FHOUR,iflip, jindx1,jindx2, enddo !j-loop (lat) ENDDO ! ii-loop (ntracaerm) !! =================================================================== - call read_netfaer(n2, iflip, 2) + call read_netfaer(n2, iflip, 2, errmsg, errflg) n1sv=n1 n2sv=n2 end if @@ -390,11 +450,13 @@ SUBROUTINE aerinterpol( me,master,nthrds,npts,IDATE,FHOUR,iflip, jindx1,jindx2, RETURN END SUBROUTINE aerinterpol - subroutine read_netfaer(nf, iflip,nt) + subroutine read_netfaer(nf, iflip,nt, errmsg,errflg) use machine, only: kind_phys, kind_io4, kind_io8 use aerclm_def use netcdf integer, intent(in) :: iflip, nf, nt + integer, intent(inout) :: errflg + character(*), intent(inout) :: errmsg integer :: ncid, varid, i,j,k,ii,klev character :: fname*50, mn*2, vname*10 real(kind=kind_io4),allocatable,dimension(:,:,:) :: buff @@ -406,13 +468,30 @@ subroutine read_netfaer(nf, iflip,nt) allocate (pres_tmp(lonsaer, levsw)) allocate (buffx(lonsaer, latsaer, levsw, 1)) + errflg = 0 + errmsg = ' ' + buff = 0 + pres_tmp = 0 + buffx = 0 + write(mn,'(i2.2)') nf fname=trim("aeroclim.m"//mn//".nc") - call nf_open(fname , nf90_NOWRITE, ncid) + ncid = -1 + if(.not.netcdf_check(nf90_open(fname , nf90_NOWRITE, ncid), & + errmsg, errflg, 'open '//trim(fname))) then + return + endif ! ====> construct 3-d pressure array (Pa) - call nf_inq_varid(ncid, "DELP", varid) - call nf_get_var(ncid, varid, buff) + varid = -1 + if(.not.netcdf_check(nf90_inq_varid(ncid, "DELP", varid), & + errmsg, errflg, 'find id of DELP var')) then + return + endif + if(.not.netcdf_check(nf90_get_var(ncid, varid, buff), & + errmsg, errflg, 'read DELP var')) then + return + endif do j = jamin, jamax do i = iamin, iamax @@ -441,8 +520,15 @@ subroutine read_netfaer(nf, iflip,nt) ! for GFS, iflip 0: toa to sfc; 1: sfc to toa DO ii = 1, ntrcaerm vname=trim(specname(ii)) - call nf_inq_varid(ncid, vname, varid) - call nf_get_var(ncid, varid, buffx) + varid = -1 + if(.not.netcdf_check(nf90_inq_varid(ncid, vname, varid), & + errmsg, errflg, 'get id of '//trim(vname)//' var')) then + return + endif + if(.not.netcdf_check(nf90_get_var(ncid, varid, buffx), & + errmsg, errflg, 'read '//trim(vname)//' var')) then + return + endif do j = jamin, jamax do k = 1, levsaer @@ -464,10 +550,11 @@ subroutine read_netfaer(nf, iflip,nt) ENDDO ! ii-loop (ntracaerm) ! close the file - call nf_close(ncid) + if(.not.netcdf_check(nf90_close(ncid), errmsg, errflg, 'close '//trim(fname))) then + return + endif deallocate (buff, pres_tmp) deallocate (buffx) - return END SUBROUTINE read_netfaer end module aerinterp diff --git a/physics/cu_unified_deep.F90 b/physics/cu_c3_deep.F90 similarity index 94% rename from physics/cu_unified_deep.F90 rename to physics/cu_c3_deep.F90 index a6be5c450..c3a4b2c4e 100644 --- a/physics/cu_unified_deep.F90 +++ b/physics/cu_c3_deep.F90 @@ -1,7 +1,7 @@ -!>\file cu_unified_deep.F90 -!! This file is the unified deep convection scheme. +!>\file cu_c3_deep.F90 +!! This file is the C3 deep convection scheme. -module cu_unified_deep +module cu_c3_deep use machine , only : kind_phys use progsigma, only : progsigma_calc @@ -27,9 +27,10 @@ module cu_unified_deep real(kind=kind_phys), parameter :: pgcd = 0.1 ! !> aerosol awareness, do not use yet! - integer, parameter :: autoconv=1 - integer, parameter :: aeroevap=1 + integer, parameter :: autoconv=1 !2 + integer, parameter :: aeroevap=1 !3 real(kind=kind_phys), parameter :: scav_factor = 0.5 + real(kind=kind_phys), parameter :: dx_thresh = 6500. !> still 16 ensembles for clousres integer, parameter:: maxens3=16 @@ -46,9 +47,9 @@ module cu_unified_deep contains -!>\defgroup cu_unified_deep_group Unified Deep Convection Module -!>\ingroup cu_unified_group -!! This is Unified deep convection scheme module +!>\defgroup cu_c3_deep_group C3 Deep Convection Module +!>\ingroup cu_c3_group +!! This is C3 deep convection scheme module !> @{ integer function my_maxloc1d(A,N) !$acc routine vector @@ -72,8 +73,8 @@ integer function my_maxloc1d(A,N) end function my_maxloc1d !>Driver for the deep or congestus routine. -!! \section general_unified_deep Unified Deep Convection General Algorithm - subroutine cu_unified_deep_run( & +!! \section general_c3_deep C3 Deep Convection General Algorithm + subroutine cu_c3_deep_run( & itf,ktf,its,ite, kts,kte & ,flag_init & ,flag_restart & @@ -461,10 +462,7 @@ subroutine cu_unified_deep_run( & el2orc=xlv*xlv/(r_v*cp) evfact=0.25 ! .4 evfactl=0.25 ! .2 - !evfact=.0 ! for 4F5f - !evfactl=.4 -!cc rainevap(:)=0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! @@ -527,10 +525,7 @@ subroutine cu_unified_deep_run( & zws(i) = zws(i)*rho(i,kpbl(i)) !check if zrho is correct enddo !$acc end kernels -! cap_maxs=225. -! if(imid.eq.1)cap_maxs=150. cap_maxs=75. ! 150. -! if(imid.eq.1)cap_maxs=100. !$acc kernels do i=its,itf edto(i)=0. @@ -538,13 +533,10 @@ subroutine cu_unified_deep_run( & xmb_out(i)=0. cap_max(i)=cap_maxs cap_max_increment(i)=20. -! if(imid.eq.1)cap_max_increment(i)=10. ! ! for water or ice ! if (xland1(i)==0) then -! if(imid.eq.0)cap_max(i)=cap_maxs-25. -! if(imid.eq.1)cap_max(i)=cap_maxs-50. cap_max_increment(i)=20. else if(ztexec(i).gt.0.)cap_max(i)=cap_max(i)+25. @@ -553,7 +545,6 @@ subroutine cu_unified_deep_run( & #ifndef _OPENACC ierrc(i)=" " #endif -! cap_max_increment(i)=1. enddo !$acc end kernels if(use_excess == 0 )then @@ -588,8 +579,8 @@ subroutine cu_unified_deep_run( & c1d(i,:)= 0. !c1 ! 0. ! c1 ! max(.003,c1+float(csum(i))*.0001) entr_rate(i)=7.e-5 - min(20.,float(csum(i))) * 3.e-6 if(xland1(i) == 0)entr_rate(i)=7.e-5 + if(dx(i) frh_thresh)then @@ -598,7 +589,9 @@ subroutine cu_unified_deep_run( & entr_rate(i)=.2/radius endif sig(i)=(1.-frh)**2 - frh_out(i) = frh + !frh_out(i) = frh + if(forcing(i,7).eq.0.)sig(i)=1. + frh_out(i) = frh*sig(i) enddo !$acc end kernels sig_thresh = (1.-frh_thresh)**2 @@ -635,14 +628,15 @@ subroutine cu_unified_deep_run( & ! !$acc kernels edtmax(:)=1. - if(imid.eq.1)edtmax(:)=.15 +! if(imid.eq.1)edtmax(:)=.15 edtmin(:)=.1 - if(imid.eq.1)edtmin(:)=.05 +! if(imid.eq.1)edtmin(:)=.05 !$acc end kernels ! !--- minimum depth (m), clouds must have ! depth_min=3000. + if(dx(its) - Compute downdraft moist static energy + moisture budget do k=2,jmin(i)+1 @@ -1454,7 +1309,6 @@ subroutine cu_unified_deep_run( & dbydo(i,ki)=hcdo(i,ki)-heso_cup(i,ki) bud(i)=bud(i)+dbydo(i,ki)*dzo enddo - ! endif if(bud(i).gt.0)then ierr(i)=7 @@ -1470,29 +1324,10 @@ subroutine cu_unified_deep_run( & ! call cup_dd_moisture(ierrc,zdo,hcdo,heso_cup,qcdo,qeso_cup, & pwdo,qo_cup,zo_cup,dd_massentro,dd_massdetro,jmin,ierr,gammao_cup, & - pwevo,bu,qrcdo,qo,heo,1, & + pwevo,bu,qrcdo,po_cup,qo,heo,1, & itf,ktf, & its,ite, kts,kte) ! -!---meltglac------------------------------------------------- -!--- calculate moisture properties of updraft -! -! if(imid.eq.1)then -! call cup_up_moisture('mid',ierr,zo_cup,qco,qrco,pwo,pwavo, & -! p_cup,kbcon,ktop,dbyo,clw_all,xland1, & -! qo,gammao_cup,zuo,qeso_cup,k22,qo_cup,c0, & -! zqexec,ccn,rho,c1d,tn_cup,up_massentr,up_massdetr,psum,psumh, & -! 1,itf,ktf, & -! its,ite, kts,kte) -! else -! call cup_up_moisture('deep',ierr,zo_cup,qco,qrco,pwo,pwavo, & -! p_cup,kbcon,ktop,dbyo,clw_all,xland1, & -! qo,gammao_cup,zuo,qeso_cup,k22,qo_cup,c0, & -! zqexec,ccn,rho,c1d,tn_cup,up_massentr,up_massdetr,psum,psumh, & -! 1,itf,ktf, & -! its,ite, kts,kte) -! endif -!---meltglac------------------------------------------------- !$acc kernels do i=its,itf if(ierr(i)/=0)cycle @@ -1517,7 +1352,7 @@ subroutine cu_unified_deep_run( & !> - Call cup_up_aa0() to calculate workfunctions for updrafts - + call cup_up_aa0(aa0,z,zu,dby,gamma_cup,t_cup, & kbcon,ktop,ierr, & itf,ktf, & @@ -1537,7 +1372,6 @@ subroutine cu_unified_deep_run( & #endif endif enddo - !$acc end kernels @@ -1555,8 +1389,8 @@ subroutine cu_unified_deep_run( & tau_ecmwf (:) = 0. !$acc end kernels !- way to calculate the fraction of cape consumed by shallow convection - iversion=1 ! ecmwf - !iversion=0 ! orig + !iversion=1 ! ecmwf + iversion=0 ! orig ! ! betchold et al 2008 time-scale of cape removal ! @@ -1596,6 +1430,29 @@ subroutine cu_unified_deep_run( & endif enddo !$acc end kernels +!$acc kernels + !-get the profiles modified only by bl tendencies + do i=its,itf + tn_bl(i,:)=0.;qo_bl(i,:)=0. + if ( ierr(i) == 0 )then + !below kbcon -> modify profiles + tn_bl(i,1:kbcon(i)) = tn(i,1:kbcon(i)) + qo_bl(i,1:kbcon(i)) = qo(i,1:kbcon(i)) + !above kbcon -> keep environment profiles + tn_bl(i,kbcon(i)+1:ktf) = t(i,kbcon(i)+1:ktf) + qo_bl(i,kbcon(i)+1:ktf) = q(i,kbcon(i)+1:ktf) + endif + enddo +!$acc end kernels + !> - Call cup_env() to calculate moist static energy, heights, qes, ... only by bl tendencies + call cup_env(zo,qeso_bl,heo_bl,heso_bl,tn_bl,qo_bl,po,z1, & + psur,ierr,tcrit,-1, & + itf,ktf, its,ite, kts,kte) + !> - Call cup_env_clev() to calculate environmental values on cloud levels only by bl tendencies + call cup_env_clev(tn_bl,qeso_bl,qo_bl,heo_bl,heso_bl,zo,po,qeso_cup_bl,qo_cup_bl, & + heo_cup_bl,heso_cup_bl,zo_cup,po_cup,gammao_cup_bl,tn_cup_bl,psur,& + ierr,z1, & + itf,ktf,its,ite, kts,kte) if(iversion == 1) then !-- version ecmwf @@ -1628,29 +1485,6 @@ subroutine cu_unified_deep_run( & !- version for real cloud-work function -!$acc kernels - !-get the profiles modified only by bl tendencies - do i=its,itf - tn_bl(i,:)=0.;qo_bl(i,:)=0. - if ( ierr(i) == 0 )then - !below kbcon -> modify profiles - tn_bl(i,1:kbcon(i)) = tn(i,1:kbcon(i)) - qo_bl(i,1:kbcon(i)) = qo(i,1:kbcon(i)) - !above kbcon -> keep environment profiles - tn_bl(i,kbcon(i)+1:ktf) = t(i,kbcon(i)+1:ktf) - qo_bl(i,kbcon(i)+1:ktf) = q(i,kbcon(i)+1:ktf) - endif - enddo -!$acc end kernels - !> - Call cup_env() to calculate moist static energy, heights, qes, ... only by bl tendencies - call cup_env(zo,qeso_bl,heo_bl,heso_bl,tn_bl,qo_bl,po,z1, & - psur,ierr,tcrit,-1, & - itf,ktf, its,ite, kts,kte) - !> - Call cup_env_clev() to calculate environmental values on cloud levels only by bl tendencies - call cup_env_clev(tn_bl,qeso_bl,qo_bl,heo_bl,heso_bl,zo,po,qeso_cup_bl,qo_cup_bl, & - heo_cup_bl,heso_cup_bl,zo_cup,po_cup,gammao_cup_bl,tn_cup_bl,psur, & - ierr,z1, & - itf,ktf,its,ite, kts,kte) !$acc kernels do i=its,itf if(ierr(i).eq.0)then @@ -1689,7 +1523,6 @@ subroutine cu_unified_deep_run( & enddo endif enddo - !$acc end kernels !> - Call cup_ip_aa0() to calculate workfunctions for updrafts call cup_up_aa0(aa1_bl,zo,zuo,dbyo_bl,gammao_cup_bl,tn_cup_bl, & @@ -1709,7 +1542,7 @@ subroutine cu_unified_deep_run( & aa1_bl(i) = aa1_bl(i)* tau_bl(i)/ dtime !endif #ifndef _OPENACC - print*,'aa0,aa1bl=',aa0(i),aa1_bl(i),aa0(i)-aa1_bl(i),tau_bl(i)!,dtime,xland(i) +! print*,'aa0,aa1bl=',aa0(i),aa1_bl(i),aa0(i)-aa1_bl(i),tau_bl(i)!,dtime,xland(i) #endif endif enddo @@ -1724,9 +1557,9 @@ subroutine cu_unified_deep_run( & ! !> - Call cup_dd_edt() to determine downdraft strength in terms of windshear ! - call cup_dd_edt(ierr,us,vs,zo,ktop,kbcon,edt,po,pwavo, & - pwo,ccn,ccnclean,pwevo,edtmax,edtmin,edtc,psum,psumh, & - rho,aeroevap,pefc,itf,ktf, & + call cup_dd_edt(ierr,us,vs,zo,ktop,kbcon,edt,po,pwavo, & + pwo,ccn,ccnclean,pwevo,edtmax,edtmin,edtc,psum,psumh, & + rho,aeroevap,pefc,xland1,itf,ktf, & its,ite, kts,kte) do i=its,itf if(ierr(i)/=0)cycle @@ -1735,8 +1568,8 @@ subroutine cu_unified_deep_run( & !> - Call get_melting_profile() to get melting profile call get_melting_profile(ierr,tn_cup,po_cup, p_liq_ice,melting_layer,qrco & - ,pwo,edto,pwdo,melting & - ,itf,ktf,its,ite, kts,kte, cumulus ) + ,pwo,edto,pwdo,melting & + ,itf,ktf,its,ite,kts,kte,cumulus) !$acc kernels do k=kts,ktf do i=its,itf @@ -1912,16 +1745,12 @@ subroutine cu_unified_deep_run( & !-- take out cloud liquid water for detrainment detup=up_massdetro(i,k) dz=zo_cup(i,k)-zo_cup(i,k-1) -!! if(k.lt.ktop(i) .and. k.ge.jmin(i)) then -!! if(k.lt.ktop(i) .and. c1d(i,k).gt.0) then if(k.lt.ktop(i)) then dellaqc(i,k) = zuo(i,k)*c1d(i,k)*qrco(i,k)*dz/dp*g else dellaqc(i,k)= detup*0.5*(qrco(i,k+1)+qrco(i,k)) *g/dp endif -!! if(imid.eq.1) dellaqc(i,k)= detup*0.5*(qrco(i,k+1)+qrco(i,k)) *g/dp -! if(k.eq.ktop(i))dellaqc(i,k)= detup*0.5*(qrco(i,k+1)+qrco(i,k)) *g/dp -! !--- + !--- g_rain= 0.5*(pwo (i,k)+pwo (i,k+1))*g/dp e_dn = -0.5*(pwdo(i,k)+pwdo(i,k+1))*g/dp*edto(i) ! pwdo < 0 and e_dn must > 0 !-- condensation source term = detrained + flux divergence of @@ -2230,6 +2059,8 @@ subroutine cu_unified_deep_run( & xff_mid(i,1)=min(0.1,xff_mid(i,1)) endif xff_mid(i,2)=min(0.1,.03*zws(i)) + forcing(i,1)=xff_mid(i,1) + forcing(i,2)=xff_mid(i,2) endif enddo !$acc end kernels @@ -2255,6 +2086,7 @@ subroutine cu_unified_deep_run( & !$acc kernels do i=its,itf if(ierr(i).eq.0 .and.pre(i).gt.0.) then + forcing(i,6)=sig(i) pre(i)=max(pre(i),0.) xmb_out(i)=xmb(i) outu(i,1)=dellu(i,1)*xmb(i) @@ -2385,7 +2217,7 @@ subroutine cu_unified_deep_run( & !---------------------------done------------------------------ ! - end subroutine cu_unified_deep_run + end subroutine cu_c3_deep_run !> Calculates tracer fluxes due to subsidence, only up-stream differencing @@ -2665,9 +2497,9 @@ end subroutine rain_evap_below_cloudbase !> Calculates strength of downdraft based on windshear and/or !! aerosol content. - subroutine cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & - pw,ccn,ccnclean,pwev,edtmax,edtmin,edtc,psum2,psumh, & - rho,aeroevap,pefc,itf,ktf, & + subroutine cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & + pw,ccn,ccnclean,pwev,edtmax,edtmin,edtc,psum2,psumh, & + rho,aeroevap,pefc,xland1,itf,ktf, & its,ite, kts,kte ) implicit none @@ -2696,7 +2528,7 @@ subroutine cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & pwav,pwev,psum2,psumh,edtmax,edtmin integer, dimension (its:ite) & ,intent (in ) :: & - ktop,kbcon + ktop,kbcon,xland1 real(kind=kind_phys), intent (in ) :: & !HCB ccnclean real(kind=kind_phys), dimension (its:ite) & @@ -2777,30 +2609,30 @@ subroutine cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & edt(i)=1.-.5*(pefb+pef) if(aeroevap.gt.1)then + pefb=.5 + if(xland1(i) == 1)pefb=.3 aeroadd=0. if((psumh(i)>0.).and.(psum2(i)>0.))then - aeroadd=((1.e-2*ccnclean)**beta3)*(psumh(i)**(alpha3-1)) - prop_c=.5*(pefb+pef)/aeroadd - aeroadd=((1.e-2*ccn(i))**beta3)*(psum2(i)**(alpha3-1)) + aeroadd=((ccnclean)**beta3)*(psumh(i)**(alpha3-1)) + prop_c=pefb/aeroadd + aeroadd=((ccn(i))**beta3)*(psum2(i)**(alpha3-1)) aeroadd=prop_c*aeroadd pefc(i)=aeroadd if(pefc(i).gt.0.9)pefc(i)=0.9 if(pefc(i).lt.0.1)pefc(i)=0.1 edt(i)=1.-pefc(i) - if(aeroevap.eq.2)edt(i)=1.-.25*(pefb+pef+2.*pefc(i)) endif endif !--- edt here is 1-precipeff! - einc=.2*edt(i) - edtc(i,1)=edt(i)-einc + edtc(i,1)=edt(i) endif enddo do i=its,itf if(ierr(i).eq.0)then - edtc(i,1)=-edtc(i,1)*pwav(i)/pwev(i) + edtc(i,1)=-edtc(i,1)*psum2(i)/pwev(i) if(edtc(i,1).gt.edtmax(i))edtc(i,1)=edtmax(i) if(edtc(i,1).lt.edtmin(i))edtc(i,1)=edtmin(i) endif @@ -2812,7 +2644,7 @@ end subroutine cup_dd_edt !> Calcultes moisture properties of downdrafts. subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & pwd,q_cup,z_cup,dd_massentr,dd_massdetr,jmin,ierr, & - gamma_cup,pwev,bu,qrcd, & + gamma_cup,pwev,bu,qrcd,p_cup, & q,he,iloop, & itf,ktf, & its,ite, kts,kte ) @@ -2842,7 +2674,7 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & real(kind=kind_phys), dimension (its:ite,kts:kte) & ,intent (in ) :: & zd,hes_cup,hcd,qes_cup,q_cup,z_cup, & - dd_massentr,dd_massdetr,gamma_cup,q,he + dd_massentr,dd_massdetr,gamma_cup,q,he,p_cup !$acc declare copyin(zd,hes_cup,hcd,qes_cup,q_cup,z_cup,dd_massentr,dd_massdetr,gamma_cup,q,he) integer & ,intent (in ) :: & @@ -2870,7 +2702,7 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & integer :: & i,k,ki real(kind=kind_phys) :: & - denom,dh,dz,dqeva + denom,dp,dh,dz,dqeva !$acc kernels do i=its,itf @@ -2891,6 +2723,7 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & if(ierr(i).eq.0)then k=jmin(i) dz=z_cup(i,k+1)-z_cup(i,k) + dp=-100.*(p_cup(i,k+1)-p_cup(i,k)) qcd(i,k)=q_cup(i,k) dh=hcd(i,k)-hes_cup(i,k) if(dh.lt.0)then @@ -2901,12 +2734,13 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & endif pwd(i,jmin(i))=zd(i,jmin(i))*min(0.,qcd(i,k)-qrcd(i,k)) qcd(i,k)=qrcd(i,k) - pwev(i)=pwev(i)+pwd(i,jmin(i)) ! *dz + pwev(i)=pwev(i)+pwd(i,jmin(i))*g/dp ! *dz ! bu(i)=dz*dh !$acc loop seq do ki=jmin(i)-1,1,-1 dz=z_cup(i,ki+1)-z_cup(i,ki) + dp=-100.*(p_cup(i,ki+1)-p_cup(i,ki)) ! qcd(i,ki)=(qcd(i,ki+1)*(1.-.5*cdd(i,ki+1)*dz) & ! +entr*dz*q(i,ki) & ! )/(1.+entr*dz-.5*cdd(i,ki+1)*dz) @@ -2939,10 +2773,7 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & endif pwd(i,ki)=zd(i,ki)*dqeva qcd(i,ki)=qrcd(i,ki) - pwev(i)=pwev(i)+pwd(i,ki) ! *dz -! if(iloop.eq.1.and.i.eq.102.and.j.eq.62)then -! print *,'in cup_dd_moi ', hcd(i,ki),hes_cup(i,ki),dh,dqeva -! endif + pwev(i)=pwev(i)+pwd(i,ki)*g/dp enddo ! !--- end loop over i @@ -3390,11 +3221,11 @@ subroutine cup_forcing_ens_3d(closure_n,xland,aa0,aa1,xaa0,mbdt,dtime,ierr,ierr2 xff_ens3(4)=betajb*xff_ens3(4) xff_ens3(5)=xff_ens3(4) xff_ens3(6)=xff_ens3(4) + forcing(i,2)=xff_ens3(4) if(xff_ens3(4).lt.0.)xff_ens3(4)=0. if(xff_ens3(5).lt.0.)xff_ens3(5)=0. if(xff_ens3(6).lt.0.)xff_ens3(6)=0. xff_ens3(14)=xff_ens3(4) - forcing(i,2)=xff_ens3(4) ! !--- more like krishnamurti et al.; pick max and average values ! @@ -3410,7 +3241,8 @@ subroutine cup_forcing_ens_3d(closure_n,xland,aa0,aa1,xaa0,mbdt,dtime,ierr,ierr2 xff_ens3(11)=aa1(i)/tau_ecmwf(i) xff_ens3(12)=aa1(i)/tau_ecmwf(i) xff_ens3(13)=(aa1(i))/tau_ecmwf(i) !(60.*15.) !tau_ecmwf(i) -! forcing(i,4)=xff_ens3(10) + forcing(i,4)=xff_ens3(10) +! forcing(i,5)= aa1_bl(i)/tau_ecmwf(i) !!- more like bechtold et al. (jas 2014) !! if(dicycle == 1) xff_dicycle = max(0.,aa1_bl(i)/tau_ecmwf(i)) !(60.*30.) !tau_ecmwf(i) @@ -3431,13 +3263,16 @@ subroutine cup_forcing_ens_3d(closure_n,xland,aa0,aa1,xaa0,mbdt,dtime,ierr,ierr2 endif ! ichoice xk(1)=(xaa0(i,1)-aa1(i))/mbdt - forcing(i,4)=aa0(i) - forcing(i,5)=aa1(i) - forcing(i,6)=xaa0(i,1) - forcing(i,7)=xk(1) - if(xk(1).le.0.and.xk(1).gt.-.01*mbdt) & + forcing(i,8)=mbdt*xk(1)/aa1(i) +! if(forcing(i,1).lt.0. .or. forcing(i,8).gt.-4.)ierr(i)=333 +! if(forcing(i,2).lt.-0.05)ierr(i)=333 +! forcing(i,4)=aa0(i) +! forcing(i,5)=aa1(i) +! forcing(i,6)=xaa0(i,1) +! forcing(i,7)=xk(1) + if(xk(1).lt.0.and.xk(1).gt.-.01*mbdt) & xk(1)=-.01*mbdt - if(xk(1).gt.0.and.xk(1).lt.1.e-2) & + if(xk(1).ge.0.and.xk(1).lt.1.e-2) & xk(1)=1.e-2 ! enddo ! @@ -3528,13 +3363,13 @@ subroutine cup_forcing_ens_3d(closure_n,xland,aa0,aa1,xaa0,mbdt,dtime,ierr,ierr2 xf_ens(i,11)=xf_ens(i,11)+xf_ens(i,11)*rand_clos(i,4) xf_ens(i,12)=xf_ens(i,12)+xf_ens(i,12)*rand_clos(i,4) xf_ens(i,13)=xf_ens(i,13)+xf_ens(i,13)*rand_clos(i,4) - forcing(i,8)=xf_ens(i,11) +! forcing(i,8)=xf_ens(i,11) else xf_ens(i,10)=0. xf_ens(i,11)=0. xf_ens(i,12)=0. xf_ens(i,13)=0. - forcing(i,8)=0. + !forcing(i,8)=0. endif !srf-begin !! if(xk(1).lt.0.)then @@ -3586,13 +3421,16 @@ subroutine cup_forcing_ens_3d(closure_n,xland,aa0,aa1,xaa0,mbdt,dtime,ierr,ierr2 if(ierr(i) /= 0)cycle xk(1)=(xaa0(i,1)-aa1(i))/mbdt - if(xk(1).le.0.and.xk(1).gt.-.01*mbdt) xk(1)=-.01*mbdt - if(xk(1).gt.0.and.xk(1).lt.1.e-2) xk(1)=1.e-2 - +! forcing(i,8)=xk(1) + if(xk(1).lt.0.and.xk(1).gt.-.01*mbdt) xk(1)=-.01*mbdt + if(xk(1).ge.0.and.xk(1).lt.1.e-2) xk(1)=1.e-2 + xff_dicycle = (aa1(i)-aa1_bl(i))/tau_ecmwf(i) +! forcing(i,8)=xff_dicycle if(xk(1).lt.0) xf_dicycle(i)= max(0.,-xff_dicycle/xk(1)) - + xf_dicycle(i)= xf_ens(i,10)-xf_dicycle(i) +! forcing(i,6)=xf_dicycle(i) enddo !$acc end kernels else @@ -4266,7 +4104,7 @@ subroutine cup_output_ens_3d(xff_mid,xf_ens,ierr,dellat,dellaq,dellaqc, & ! --- now use proper count of how many closures were actually ! used in cup_forcing_ens (including screening of some ! closures over water) to properly normalize xmb - clos_wei=16./max(1.,closure_n(i)) + clos_wei=16./max(1.,closure_n(i)) xmb_ave(i)=min(xmb_ave(i),100.) xmb(i)=clos_wei*sig(i)*xmb_ave(i) @@ -4473,13 +4311,15 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & iprop,iall,i,k integer :: start_level(its:ite),kklev(its:ite) !$acc declare create(start_level,kklev) - real(kind=kind_phys) :: & - prop_ave,qrcb_h,bdsp,dp,rhoc,qrch,qaver,clwdet, & + real(kind=kind_phys) :: & + prop_ave,qrcb_h,dp,rhoc,qrch,qaver,clwdet, & dz,berryc0,q1,berryc - real(kind=kind_phys) :: & + real(kind=kind_phys) :: & denom, c0t, c0_iceconv - real(kind=kind_phys), dimension (kts:kte) :: & + real(kind=kind_phys), dimension (kts:kte) :: & prop_b + real(kind=kind_phys), dimension (its:ite) :: & + bdsp !$acc declare create(prop_b) ! real(kind=kind_phys), parameter:: zero = 0 @@ -4495,7 +4335,7 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & clwdet=0.1 !0.02 c0_iceconv=0.01 c1d_b=c1d - bdsp=bdispm + bdsp(:)=bdispm ! !--- no precip for small clouds @@ -4509,6 +4349,11 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & pwavh(i)=0. psum(i)=0. psumh(i)=0. + if (xland1(i) .eq. 0) then + bdsp(i)=bdispm + else + bdsp(i)=bdispc + endif enddo do k=kts,ktf do i=its,itf @@ -4575,6 +4420,10 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & qc(i,k)=qrch+qrc(i,k) clw_all(i,k)=qrc(i,k) endif + clw_allh(i,k)=clw_all(i,k) + qrcb(i,k)=qrc(i,k) + pwh(i,k)=pw(i,k) + qch(i,k)=qc(i,k) enddo ! endif ! @@ -4590,6 +4439,7 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & endif if(is_mid)c0t=0.004 + if(autoconv .gt.1) c0t=c0(i) denom=zu(i,k-1)-.5*up_massdetr(i,k-1)+up_massentr(i,k-1) if(denom.lt.1.e-16)then ierr(i)=51 @@ -4599,7 +4449,7 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & rhoc=.5*(rho(i,k)+rho(i,k-1)) dz=z_cup(i,k)-z_cup(i,k-1) - dp=p_cup(i,k)-p_cup(i,k-1) + dp=-100.*(p_cup(i,k)-p_cup(i,k-1)) ! !--- saturation in cloud, this is what is allowed to be in it ! @@ -4632,10 +4482,10 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & qrcb(i,k)=max(0.,(qch(i,k)-qrch)) ! /(1.+c0(i)*dz*zu(i,k)) if(is_deep)then clwdet=0.1 !0.02 ! 05/11/2021 - if(k.lt.kklev(i)) clwdet=0. ! 05/05/2021 + !if(k.lt.kklev(i)) clwdet=0. ! 05/05/2021 else clwdet=0.1 !0.02 ! 05/05/2021 - if(k.lt.kklev(i)) clwdet=0. ! 05/25/2021 + !if(k.lt.kklev(i)) clwdet=0. ! 05/25/2021 endif if(k.gt.kbcon(i)+1)c1d(i,k)=clwdet*up_massdetr(i,k-1) if(k.gt.kbcon(i)+1)c1d_b(i,k)=clwdet*up_massdetr(i,k-1) @@ -4648,50 +4498,52 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & ! this will also determine proportionality constant prop_b, which, if applied, ! would give the same results as c0 under these conditions ! - q1=1.e3*rhoc*clw_allh(i,k) ! g/m^3 ! g[h2o]/cm^3 - berryc0=q1*q1/(60.0*(5.0 + 0.0366*ccnclean/ & - ( q1 * bdsp) ) ) !/( +! Berry conversion for clean atmosphere +! + q1=1.e3*rhoc*clw_allh(i,k) +! pwh units are kg/kg, but normalized by mass flux. So with massflux kg/m^2/s + pwh(i,k)=c0t*dz*zu(i,k)*clw_allh(i,k) qrcb_h=(qch(i,k)-qrch)/(1.+(c1d_b(i,k)+c0t)*dz) - prop_b(k)=(c0t*qrcb_h)/max(1.e-8,(1.e-3*berryc0)) - if(prop_b(k)>5.) prop_b(k)=5. - pwh(i,k)=zu(i,k)*1.e-3*berryc0*dz*prop_b(k) ! 2. - qrcb(i,k)=(max(0.,(qch(i,k)-qrch))*zu(i,k)-pwh(i,k))/(zu(i,k)*(1+c1d_b(i,k)*dz)) - if(qrcb(i,k).lt.0.)then - berryc0=max(0.,(qch(i,k)-qrch))/(1.e-3*dz*prop_b(k)) - pwh(i,k)=zu(i,k)*1.e-3*berryc0*dz*prop_b(k) - qrcb(i,k)=0. + qrcb(i,k)=0. +! unit (B) = g/m^3/s + berryc0=(q1*q1/(60.0*(5.0 + 0.0366*ccnclean*1.e1/ & + ( q1 * bdsp(i)) ) )) +! normalize Berry: berryc0=berryc0*g/dp*dz*zu = pwh, unts become kg/kg +! set 1: + berryc0=1.e-3*berryc0*g/dp*dz + prop_b(k)=pwh(i,k)/berryc0 + qrcb(i,k)=qrcb_h + if(qrcb(i,k).le.0.)then + pwh(i,k)=0. endif qch(i,k)=qrcb(i,k)+qrch pwavh(i)=pwavh(i)+pwh(i,k) - psumh(i)=psumh(i)+pwh(i,k) ! HCB - !psumh(i)=psumh(i)+clw_allh(i,k)*zu(i,k) *dz - ! + psumh(i)=psumh(i)+pwh(i,k)*g/dp !dz !dp/g !*dp ! HCB ! then the real berry ! - q1=1.e3*rhoc*clw_all(i,k) ! g/m^3 ! g[h2o]/cm^3 - berryc0=q1*q1/(60.0*(5.0 + 0.0366*ccn(i)/ & - ( q1 * bdsp) ) ) !/( - berryc0=1.e-3*berryc0*dz*prop_b(k) ! 2. - qrc(i,k)=(max(0.,(qc(i,k)-qrch))*zu(i,k)-zu(i,k)*berryc0)/(zu(i,k)*(1+c1d(i,k)*dz)) + q1=1.e3*rhoc*clw_all(i,k) + berryc=(q1*q1/(60.0*(5.0 + 0.0366*ccn(i)*1.e1/ & + ( q1 * bdsp(i)) ) )) + berryc=1.e-3*berryc*g/dp*dz + pw(i,k)=prop_b(k)*berryc !*dz/zu(i,k) +! use berryc now as new c0 for this level + berryc=pw(i,k)/(dz*zu(i,k)*clw_all(i,k)) + if(qrc(i,k).le.0.)then + berryc=0. + endif + qrc(i,k)=(max(0.,(qc(i,k)-qrch))/(1+(c1d(i,k)+berryc)*dz)) if(qrc(i,k).lt.0.)then - berryc0=max(0.,(qc(i,k)-qrch))/(1.e-3*dz*prop_b(k)) qrc(i,k)=0. + pw(i,k)=0. endif - pw(i,k)=berryc0*zu(i,k) qc(i,k)=qrc(i,k)+qrch ! if not running with berry at all, do the following ! - else !c0=.002 - if(iall.eq.1)then - qrc(i,k)=0. - pw(i,k)=(qc(i,k)-qrch)*zu(i,k) - if(pw(i,k).lt.0.)pw(i,k)=0. - else + else ! create clw detrainment profile that depends on mass detrainment and ! in-cloud clw/ice ! - !c1d(i,k)=clwdet*up_massdetr(i,k-1)*qrc(i,k-1) qrc(i,k)=(qc(i,k)-qrch)/(1.+(c1d(i,k)+c0t)*dz) if(qrc(i,k).lt.0.)then ! hli new test 02/12/19 qrc(i,k)=0. @@ -4705,11 +4557,10 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & qrc(i,k)=0. pw(i,k)=0. endif - endif - qc(i,k)=qrc(i,k)+qrch - endif !autoconv + qc(i,k)=qrc(i,k)+qrch + endif !autoconv pwav(i)=pwav(i)+pw(i,k) - psum(i)=psum(i)+pw(i,k) ! HCB + psum(i)=psum(i)+pw(i,k)*g/dp ! HCB enddo ! k=kbcon,ktop ! do not include liquid/ice in qc !$acc loop independent @@ -4885,9 +4736,6 @@ subroutine rates_up_pdf(rand_vmas,ipr,name,ktop,ierr,p_cup,entr_rate_2d,hkbo,heo ierr(i)=41 ktop(i)= 0 else -! call get_zu_zd_pdf_fim(ipr,xland(i),zuh2,"up",ierr(i),start_level(i), & -! call get_zu_zd_pdf_fim(rand_vmas(i),zubeg,ipr,xland(i),zuh2,"up",ierr(i),kbcon(i), & -! kfinalzu,zuo(i,kts:kte),kts,kte,ktf,beta_u,kpbl(i),csum(i),pmin_lev(i)) call get_zu_zd_pdf_fim(kklev,p_cup(i,:),rand_vmas(i),zubeg,ipr,xland(i),zuh2,1,ierr(i),k22(i), & kfinalzu+1,zuo(i,kts:kte),kts,kte,ktf,beta_u,kbcon(i),csum(i),pmin_lev(i)) endif @@ -5365,7 +5213,7 @@ subroutine get_inversion_layers(ierr,p_cup,t_cup,z_cup,qo_cup,qeso_cup,k_inv_lay end subroutine get_inversion_layers !----------------------------------------------------------------------------------- ! DH* 20220604 - this isn't used at all -!!!!>\ingroup cu_unified_deep_group +!!!!>\ingroup cu_c3_deep_group !!!!> This function calcualtes !!! function deriv3(xx, xi, yi, ni, m) !!!!$acc routine vector @@ -6049,4 +5897,4 @@ end subroutine calculate_updraft_velocity !------------------------------------------------------------------------------------ !> @} -end module cu_unified_deep +end module cu_c3_deep diff --git a/physics/cu_unified_driver.F90 b/physics/cu_c3_driver.F90 similarity index 91% rename from physics/cu_unified_driver.F90 rename to physics/cu_c3_driver.F90 index 0e76af979..fd4d37b0b 100644 --- a/physics/cu_unified_driver.F90 +++ b/physics/cu_c3_driver.F90 @@ -1,41 +1,41 @@ -!>\file cu_unified_driver.F90 -!! This file is the unified cumulus scheme driver. +!>\file cu_c3_driver.F90 +!! This file is the Community Convective Cloud (C3) scheme driver. -module cu_unified_driver +module cu_c3_driver - ! DH* TODO: replace constants with arguments to cu_unified_driver_run + ! DH* TODO: replace constants with arguments to cu_c3_driver_run !use physcons , g => con_g, cp => con_cp, xlv => con_hvap, r_v => con_rv use machine , only: kind_phys - use cu_unified_deep, only: cu_unified_deep_run,neg_check,fct1d3 - use cu_unified_sh , only: cu_unified_sh_run + use cu_c3_deep, only: cu_c3_deep_run,neg_check,fct1d3 + use cu_c3_sh , only: cu_c3_sh_run use progsigma , only: progsigma_calc implicit none private - public :: cu_unified_driver_init, cu_unified_driver_run, progsigma_calc + public :: cu_c3_driver_init, cu_c3_driver_run, progsigma_calc contains -!> \defgroup cu_unified_group Grell-Freitas Convection Module +!> \defgroup cu_c3_group Grell-Freitas Convection Module !! This is the Grell-Freitas scale and aerosol aware scheme. !>@{ -!>\defgroup cu_unified_driver Grell-Freitas Convection Driver Module -!> \ingroup cu_unified_group +!>\defgroup cu_c3_driver Grell-Freitas Convection Driver Module +!> \ingroup cu_c3_group !> This is Grell-Freitas cumulus scheme driver module. !! -!! \section arg_table_cu_unified_driver_init Argument Table -!! \htmlinclude cu_unified_driver_init.html +!! \section arg_table_cu_c3_driver_init Argument Table +!! \htmlinclude cu_c3_driver_init.html !! - subroutine cu_unified_driver_init(imfshalcnv, imfshalcnv_unified, imfdeepcnv, & - imfdeepcnv_unified,mpirank, mpiroot, errmsg, errflg) + subroutine cu_c3_driver_init(imfshalcnv, imfshalcnv_c3, imfdeepcnv, & + imfdeepcnv_c3,mpirank, mpiroot, errmsg, errflg) implicit none - integer, intent(in) :: imfshalcnv, imfshalcnv_unified - integer, intent(in) :: imfdeepcnv, imfdeepcnv_unified + integer, intent(in) :: imfshalcnv, imfshalcnv_c3 + integer, intent(in) :: imfdeepcnv, imfdeepcnv_c3 integer, intent(in) :: mpirank integer, intent(in) :: mpiroot character(len=*), intent( out) :: errmsg @@ -45,7 +45,7 @@ subroutine cu_unified_driver_init(imfshalcnv, imfshalcnv_unified, imfdeepcnv, & errmsg = '' errflg = 0 - end subroutine cu_unified_driver_init + end subroutine cu_c3_driver_init ! ! t2di is temp after advection, but before physics @@ -53,11 +53,11 @@ end subroutine cu_unified_driver_init !=================== !> This is the Grell-Freitas convection scheme driver module. -!! \section arg_table_cu_unified_driver_run Argument Table -!! \htmlinclude cu_unified_driver_run.html +!! \section arg_table_cu_c3_driver_run Argument Table +!! \htmlinclude cu_c3_driver_run.html !! -!>\section gen_unified_driver Grell-Freitas Cumulus Scheme Driver General Algorithm - subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& +!>\section gen_c3_driver Grell-Freitas Cumulus Scheme Driver General Algorithm + subroutine cu_c3_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& do_ca,progsigma,cactiv,cactiv_m,g,cp,fv,r_d,xlv,r_v,forcet, & forceqv_spechum,phil,delp,raincv,tmf,qmicro,sigmain, & qv_spechum,t,cld1d,us,vs,t2di,w,qv2di_spechum,p2di,psuri, & @@ -68,7 +68,8 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& index_of_y_wind,index_of_process_scnv,index_of_process_dcnv, & fhour,fh_dfi_radar,ix_dfi_radar,num_dfi_radar,cap_suppress, & dfi_radar_max_intervals,ldiag3d,qci_conv,do_cap_suppress, & - sigmaout,errmsg,errflg) + sigmaout,maxupmf,maxMF,do_mynnedmf,ichoice_in,ichoicem_in, & + ichoice_s_in,errmsg,errflg) !------------------------------------------------------------- implicit none integer, parameter :: maxiens=1 @@ -76,12 +77,11 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& integer, parameter :: maxens2=1 integer, parameter :: maxens3=16 integer, parameter :: ensdim=16 - integer, parameter :: imid_gf=1 ! testgf2 turn on middle gf conv. + integer :: imid_gf=1 ! gf congest conv. integer, parameter :: ideep=1 - integer, parameter :: ichoice=0 ! 0 2 5 13 8 - !integer, parameter :: ichoicem=5 ! 0 2 5 13 - integer, parameter :: ichoicem=13 ! 0 2 5 13 - integer, parameter :: ichoice_s=3 ! 0 1 2 3 + integer :: ichoice=0 ! 0 2 5 13 8 + integer :: ichoicem=13 ! 0 2 5 13 + integer :: ichoice_s=3 ! 0 1 2 3 logical, intent(in) :: do_cap_suppress real(kind=kind_phys), parameter :: aodc0=0.14 @@ -93,7 +93,8 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& !------------------------------------------------------------- integer :: its,ite, jts,jte, kts,kte integer, intent(in ) :: im,km,ntracer - logical, intent(in ) :: flag_init, flag_restart + integer, intent(in ) :: ichoice_in,ichoicem_in,ichoice_s_in + logical, intent(in ) :: flag_init, flag_restart, do_mynnedmf logical, intent(in ) :: flag_for_scnv_generic_tend,flag_for_dcnv_generic_tend, & do_ca,progsigma real (kind=kind_phys), intent(in) :: g,cp,fv,r_d,xlv,r_v @@ -127,7 +128,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& integer, dimension (:), intent(out) :: hbot,htop,kcnv integer, dimension (:), intent(in) :: xland - real(kind=kind_phys), dimension (:), intent(in) :: pbl + real(kind=kind_phys), dimension (:), intent(in) :: pbl,maxMF !$acc declare copyout(hbot,htop,kcnv) !$acc declare copyin(xland,pbl) integer, dimension (im) :: tropics @@ -135,7 +136,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& ! ruc variable real(kind=kind_phys), dimension (:), intent(in) :: hfx2,qfx2,psuri,ca_deep real(kind=kind_phys), dimension (:,:), intent(out) :: ud_mf,dd_mf,dt_mf - real(kind=kind_phys), dimension (:), intent(out) :: raincv,cld1d,rainevap + real(kind=kind_phys), dimension (:), intent(out) :: raincv,cld1d,maxupmf,rainevap real(kind=kind_phys), dimension (:,:), intent(in) :: t2di,p2di !$acc declare copyin(hfx2,qfx2,psuri,t2di,p2di) !$acc declare copyout(ud_mf,dd_mf,dt_mf,raincv,cld1d) @@ -234,7 +235,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& ! gf needs them in w/m2. define hfx and qfx after simple unit conversion real(kind=kind_phys), dimension (im) :: hfx,qfx !$acc declare create(hfx,qfx) - real(kind=kind_phys) tem,tem1,tf,tcr,tcrf + real(kind=kind_phys) tem,tem1,tf,tcr,tcrf,psum real(kind=kind_phys) :: cliw_shal,clcw_shal,tem_shal, cliw_both, weight_sum real(kind=kind_phys) :: cliw_deep,clcw_deep,tem_deep, clcw_both integer :: cliw_deep_idx, clcw_deep_idx, cliw_shal_idx, clcw_shal_idx @@ -252,6 +253,10 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& errmsg = '' errflg = 0 + ichoice = ichoice_in + ichoicem = ichoicem_in + ichoice_s = ichoice_s_in + if(do_cap_suppress) then !$acc serial do itime=1,num_dfi_radar @@ -343,10 +348,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& edtd(:)=0. zdd(:,:)=0. flux_tun(:)=5. -! 10/11/2016 dx and tscl_kf are replaced with input dx(i), is dlength. ! dx for scale awareness -! dx=40075000./float(lonf) -! tscl_kf=dx/25000. !$acc end kernels if (imfshalcnv == 5) then @@ -550,6 +552,9 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& subm(:,:)=0. dhdt(:,:)=0. + frhm(:)=0. + frhd(:)=0. + do k=kts,ktf do i=its,itf p2d(i,k)=0.01*p2di(i,k) @@ -614,17 +619,34 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& endif enddo enddo + do i = its,itf + psum=0. + do k=kts,ktf-3 + if (clcw(i,k) .gt. -999.0 .and. clcw(i,k+1) .gt. -999.0 )then + dp=(p2d(i,k)-p2d(i,k+1)) + psum=psum+dp + clwtot = cliw(i,k) + clcw(i,k) + if(clwtot.lt.1.e-32)clwtot=0. + forcing(i,7)=forcing(i,7)+clwtot*dp + endif + enddo + if(psum.gt.0)forcing(i,7)=forcing(i,7)/psum + forcing2(i,7)=forcing(i,7) + enddo do k=kts,ktf-1 do i = its,itf omeg(i,k)= w(i,k) !-g*rhoi(i,k)*w(i,k) -! dq=(q2d(i,k+1)-q2d(i,k)) -! mconv(i)=mconv(i)+omeg(i,k)*dq/g enddo enddo do i = its,itf if(mconv(i).lt.0.)mconv(i)=0. + if((dx(i)<6500.).and.do_mynnedmf.and.(maxMF(i).gt.0.))ierr(i)=555 enddo !$acc end kernels + if (dx(its)<6500.) then + ichoice=10 + imid_gf=0 + endif ! !---- call cumulus parameterization ! @@ -637,16 +659,16 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& enddo !$acc end kernels ! -!> - Call shallow: cu_unified_sh_run() +!> - Call shallow: cu_c3_sh_run() ! - call cu_unified_sh_run (us,vs, & + call cu_c3_sh_run (us,vs, & ! input variables, must be supplied zo,t2d,q2d,ter11,tshall,qshall,p2d,psur,dhdt,kpbli, & rhoi,hfx,qfx,xlandi,ichoice_s,tcrit,dt, & ! input variables. ierr should be initialized to zero or larger than zero for ! turning off shallow convection for grid points zus,xmbs,kbcons,ktops,k22s,ierrs,ierrcs, & -!Prog closure +! Prog closure flag_init, flag_restart,fv,r_d,delp,tmfq,qmicro, & forceqv_spechum,sigmain,sigmaout,progsigma,dx, & ! output tendencies @@ -656,7 +678,13 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& !$acc kernels do i=its,itf - if(xmbs(i).gt.0.)cutens(i)=1. + if(xmbs(i).gt.0.)then + cutens(i)=1. + if (dx(i)<6500.) then + ierrm(i)=555 + ierr (i)=555 + endif + endif enddo !$acc end kernels !> - Call neg_check() for GF shallow convection @@ -666,9 +694,9 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& ipr=0 jpr_deep=0 !340765 -!> - Call cu_unified_deep_run() for middle GF convection +!> - Call cu_c3_deep_run() for middle GF convection if(imid_gf == 1)then - call cu_unified_deep_run( & + call cu_c3_deep_run( & itf,ktf,its,ite, kts,kte & ,flag_init & ,flag_restart & @@ -685,7 +713,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& ,xlandi & ,delp & ,zo & - ,forcing2 & + ,forcing & ,t2d & ,q2d & ,tmfq & @@ -696,14 +724,14 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& ,ter11 & ,tshall & ,qshall & - ,p2d & + ,p2d & ,psur & ,us & ,vs & ,rhoi & ,hfx & ,qfx & - ,dx & !hj dx(im) + ,dx & ,do_ca & ,progsigma & ,ca_deep & @@ -757,9 +785,9 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& call neg_check('mid',ipn,dt,qcheck,outqm,outtm,outum,outvm, & outqcm,pretm,its,ite,kts,kte,itf,ktf,ktopm) endif -!> - Call cu_unified_deep_run() for deep GF convection +!> - Call cu_c3_deep_run() for deep GF convection if(ideep.eq.1)then - call cu_unified_deep_run( & + call cu_c3_deep_run( & itf,ktf,its,ite, kts,kte & ,flag_init & ,flag_restart & @@ -776,7 +804,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& ,xlandi & ,delp & ,zo & - ,forcing & + ,forcing2 & ,t2d & ,q2d & ,tmfq & @@ -794,7 +822,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& ,rhoi & ,hfx & ,qfx & - ,dx & !hj replace dx(im) + ,dx & ,do_ca & ,progsigma & ,ca_deep & @@ -852,25 +880,6 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& outqc,pret,its,ite,kts,kte,itf,ktf,ktop) ! endif -! do i=its,itf -! kcnv(i)=0 -! if(pret(i).gt.0.)then -! cuten(i)=1. -! kcnv(i)= 1 !jmin(i) -! else -! kbcon(i)=0 -! ktop(i)=0 -! cuten(i)=0. -! endif ! pret > 0 -! if(pretm(i).gt.0.)then -! kcnv(i)= 1 !jmin(i) -! cutenm(i)=1. -! else -! kbconm(i)=0 -! ktopm(i)=0 -! cutenm(i)=0. -! endif ! pret > 0 -! enddo !$acc kernels do i=its,itf kcnv(i)=0 @@ -917,6 +926,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& endif dtime_max=dt + forcing2(i,3)=0. do k=kts,kstop cnvc(i,k) = 0.04 * log(1. + 675. * zu(i,k) * xmb(i)) + & 0.04 * log(1. + 675. * zum(i,k) * xmbm(i)) + & @@ -934,8 +944,8 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& gdc(i,k,1)= max(0.,tun_rad_shall(i)*cupclws(i,k)*cutens(i)) ! my mod !gdc2(i,k,1)=max(0.,tun_rad_deep(i)*(cupclwm(i,k)*cutenm(i)+cupclw(i,k)*cuten(i))) - !gdc2(i,k,1)=max(0.,tun_rad_mid(i)*cupclwm(i,k)*cutenm(i)+tun_rad_deep(i)*cupclw(i,k)*cuten(i)+tun_rad_shall(i)*cupclws(i,k)*cutens(i)) - gdc2(i,k,1) = min(0.1, max(0.01, tun_rad_mid(i)*frhm(i)))*cupclwm(i,k)*cutenm(i) + min(0.1, max(0.01, tun_rad_deep(i)*(frhd(i))))*cupclw(i,k)*cuten(i) + tun_rad_shall(i)*cupclws(i,k)*cutens(i) + gdc2(i,k,1)=max(0.,tun_rad_mid(i)*cupclwm(i,k)*cutenm(i)+tun_rad_deep(i)*cupclw(i,k)*cuten(i)+tun_rad_shall(i)*cupclws(i,k)*cutens(i)) + !gdc2(i,k,1) = min(0.1, max(0.01, tun_rad_mid(i)*frhm(i)))*cupclwm(i,k)*cutenm(i) + min(0.1, max(0.01, tun_rad_deep(i)*(frhd(i))))*cupclw(i,k)*cuten(i) + tun_rad_shall(i)*cupclws(i,k)*cutens(i) qci_conv(i,k)=gdc2(i,k,1) gdc(i,k,2)=(outt(i,k))*86400. gdc(i,k,3)=(outtm(i,k))*86400. @@ -991,6 +1001,7 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& -(xmbm(i)*(zdm(i,k)-edtm(i)*zdm(i,k))) & -(xmbs(i)*zus(i,k)) trcflx_in1(k)=massflx(k)*.5*(clwtot+clwtot1) + forcing2(i,3)=forcing2(i,3)+clwtot endif enddo @@ -1028,6 +1039,12 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& gdc(i,13,10)=hfx(i) gdc(i,15,10)=qfx(i) gdc(i,16,10)=pret(i)*3600. + + maxupmf(i)=0. + if(forcing(i,6).gt.0.)then + maxupmf(i)=maxval(xmb(i)*zu(i,kts:ktf)/forcing(i,6)) + endif + if(ktop(i).gt.2 .and.pret(i).gt.0.)dt_mf(i,ktop(i)-1)=ud_mf(i,ktop(i)) endif enddo @@ -1192,6 +1209,6 @@ subroutine cu_unified_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& !$acc end parallel endif endif - end subroutine cu_unified_driver_run + end subroutine cu_c3_driver_run !>@} -end module cu_unified_driver +end module cu_c3_driver diff --git a/physics/cu_unified_driver.meta b/physics/cu_c3_driver.meta similarity index 92% rename from physics/cu_unified_driver.meta rename to physics/cu_c3_driver.meta index 3a2e28c66..999b5c2bc 100644 --- a/physics/cu_unified_driver.meta +++ b/physics/cu_c3_driver.meta @@ -1,11 +1,11 @@ [ccpp-table-properties] - name = cu_unified_driver + name = cu_c3_driver type = scheme - dependencies = cu_unified_deep.F90,cu_unified_sh.F90,machine.F,physcons.F90,progsigma_calc.f90 + dependencies = cu_c3_deep.F90,cu_c3_sh.F90,machine.F,physcons.F90,progsigma_calc.f90 ######################################################################## [ccpp-arg-table] - name = cu_unified_driver_init + name = cu_c3_driver_init type = scheme [imfshalcnv] standard_name = control_for_shallow_convection_scheme @@ -14,9 +14,9 @@ dimensions = () type = integer intent = in -[imfshalcnv_unified] - standard_name = identifier_for_unified_shallow_convection - long_name = flag for Unified shallow convection scheme +[imfshalcnv_c3] + standard_name = identifier_for_c3_shallow_convection + long_name = flag for C3 shallow convection scheme units = flag dimensions = () type = integer @@ -28,9 +28,9 @@ dimensions = () type = integer intent = in -[imfdeepcnv_unified] - standard_name = identifier_for_unified_deep_convection - long_name = flag for Unified deep convection scheme +[imfdeepcnv_c3] + standard_name = identifier_for_c3_deep_convection + long_name = flag for C3 deep convection scheme units = flag dimensions = () type = integer @@ -67,7 +67,7 @@ ######################################################################## [ccpp-arg-table] - name = cu_unified_driver_run + name = cu_c3_driver_run type = scheme [ntracer] standard_name = number_of_tracers @@ -639,6 +639,50 @@ type = real kind = kind_phys intent = out +[maxupmf] + standard_name = maximum_convective_updraft_mass_flux + long_name = maximum convective updraft mass flux within a column + units = m s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = out +[maxMF] + standard_name = maximum_mass_flux + long_name = maximum mass flux within a column + units = m s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in +[do_mynnedmf] + standard_name = flag_for_mellor_yamada_nakanishi_niino_pbl_scheme + long_name = flag to activate MYNN-EDMF + units = flag + dimensions = () + type = logical + intent = in +[ichoice_in] + standard_name = identifier_for_c3_or_gf_deep_convection_closure + long_name = flag for C3 or GF deep convection closure + units = flag + dimensions = () + type = integer + intent = in +[ichoicem_in] + standard_name = identifier_for_c3_or_gf_mid_convection_closure + long_name = flag for C3 or GF mid convection closure + units = flag + dimensions = () + type = integer + intent = in +[ichoice_s_in] + standard_name = identifier_for_c3_or_gf_shallow_convection_closure + long_name = flag for C3 or GF shallow convection closure + units = flag + dimensions = () + type = integer + intent = in [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/cu_c3_driver_post.F90 b/physics/cu_c3_driver_post.F90 new file mode 100644 index 000000000..74957a6b2 --- /dev/null +++ b/physics/cu_c3_driver_post.F90 @@ -0,0 +1,88 @@ +!> \file cu_c3_driver_post.F90 +!! Contains code related to C3 convective schemes to be used within the GFS physics suite. + +module cu_c3_driver_post + + implicit none + + private + + public :: cu_c3_driver_post_run + + contains + +!>\ingroup cu_c3_group +!> \section arg_table_cu_c3_driver_post_run Argument Table +!! \htmlinclude cu_c3_driver_post_run.html +!! + subroutine cu_c3_driver_post_run (im, km, t, q, prevst, prevsq, cactiv, cactiv_m, conv_act, conv_act_m, dt, garea, raincv, maxupmf, refl_10cm, errmsg, errflg) + + use machine, only: kind_phys + + implicit none + + ! Interface variables + integer, intent(in) :: im, km + real(kind_phys), intent(in) :: t(:,:) + real(kind_phys), intent(in) :: q(:,:) + real(kind_phys), dimension(:),intent(in) :: garea + real(kind_phys), intent(out) :: prevst(:,:) + real(kind_phys), intent(out) :: prevsq(:,:) + integer, intent(in) :: cactiv(:) + integer, intent(in) :: cactiv_m(:) + real(kind_phys), intent(out) :: conv_act(:) + real(kind_phys), intent(out) :: conv_act_m(:) + ! for Radar reflectivity + real(kind_phys), intent(in) :: dt + real(kind_phys), intent(in) :: raincv(:), maxupmf(:) + real(kind_phys), intent(inout) :: refl_10cm(:,:) + character(len=*), intent(out) :: errmsg +!$acc declare copyin(t,q,cactiv,cactiv_m) copyout(prevst,prevsq,conv_act,conv_act_m) + integer, intent(out) :: errflg + + ! Local variables + real(kind_phys), parameter :: dbzmin=-10.0 + real(kind_phys) :: cuprate + real(kind_phys) :: ze, ze_conv, dbz_sum + integer :: i, k + + ! Initialize CCPP error handling variables + errmsg = '' + errflg = 0 + +!$acc kernels + prevst(:,:) = t(:,:) + prevsq(:,:) = q(:,:) + + do i = 1, im + if (cactiv(i).gt.0) then + conv_act(i) = conv_act(i)+1.0 + else + conv_act(i)=0.0 + endif + if (cactiv_m(i).gt.0) then + conv_act_m(i) = conv_act_m(i)+1.0 + else + conv_act_m(i)=0.0 + endif + ! reflectivity parameterization for parameterized convection (reference:Unipost MDLFLD.f) + if(sqrt(garea(i)).lt.6500.)then + ze = 0.0 + ze_conv = 0.0 + dbz_sum = 0.0 + cuprate = raincv(i) * 3600.0 / dt ! cu precip rate (mm/h) + ze_conv = 300.0 * cuprate**1.4 + if (maxupmf(i).gt.0.05) then + do k = 1, km + ze = 10._kind_phys ** (0.1 * refl_10cm(i,k)) + dbz_sum = max(dbzmin, 10.0 * log10(ze + ze_conv)) + refl_10cm(i,k) = dbz_sum + enddo + endif + endif + enddo +!$acc end kernels + + end subroutine cu_c3_driver_post_run + +end module cu_c3_driver_post diff --git a/physics/cu_unified_driver_post.meta b/physics/cu_c3_driver_post.meta similarity index 66% rename from physics/cu_unified_driver_post.meta rename to physics/cu_c3_driver_post.meta index 5266b86e2..c53972f09 100644 --- a/physics/cu_unified_driver_post.meta +++ b/physics/cu_c3_driver_post.meta @@ -1,11 +1,11 @@ [ccpp-table-properties] - name = cu_unified_driver_post + name = cu_c3_driver_post type = scheme dependencies = machine.F ######################################################################## [ccpp-arg-table] - name = cu_unified_driver_post_run + name = cu_c3_driver_post_run type = scheme [im] standard_name = horizontal_loop_extent @@ -14,6 +14,13 @@ dimensions = () type = integer intent = in +[km] + standard_name = vertical_layer_dimension + long_name = number of vertical levels + units = count + dimensions = () + type = integer + intent = in [t] standard_name = air_temperature_of_new_state long_name = temperature updated by physics @@ -76,6 +83,46 @@ type = real kind = kind_phys intent = out +[dt] + standard_name = timestep_for_physics + long_name = physics time step + units = s + dimensions = () + type = real + kind = kind_phys + intent = in +[garea] + standard_name = cell_area + long_name = grid cell area + units = m2 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in +[raincv] + standard_name = lwe_thickness_of_deep_convective_precipitation_amount + long_name = deep convective rainfall amount on physics timestep + units = m + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in +[maxupmf] + standard_name = maximum_convective_updraft_mass_flux + long_name = maximum convective updraft mass flux within a column + units = m s-1 + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys + intent = in +[refl_10cm] + standard_name = radar_reflectivity_10cm + long_name = instantaneous refl_10cm + units = dBZ + dimensions = (horizontal_loop_extent,vertical_layer_dimension) + type = real + kind = kind_phys + intent = inout [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/cu_unified_driver_pre.F90 b/physics/cu_c3_driver_pre.F90 similarity index 80% rename from physics/cu_unified_driver_pre.F90 rename to physics/cu_c3_driver_pre.F90 index 69d6d9be4..c6e79059b 100644 --- a/physics/cu_unified_driver_pre.F90 +++ b/physics/cu_c3_driver_pre.F90 @@ -1,21 +1,21 @@ -!> \file cu_unified_driver_pre.F90 -!! Contains code related to the unified convective schemes to be used within the GFS physics suite. +!> \file cu_c3_driver_pre.F90 +!! Contains code related to the C3 convective schemes to be used within the GFS physics suite. -module cu_unified_driver_pre +module cu_c3_driver_pre implicit none private - public :: cu_unified_driver_pre_run + public :: cu_c3_driver_pre_run contains -!>\ingroup cu_unified_group -!> \section arg_table_cu_unified_driver_pre_run Argument Table -!! \htmlinclude cu_unified_driver_pre_run.html +!>\ingroup cu_c3_group +!> \section arg_table_cu_c3_driver_pre_run Argument Table +!! \htmlinclude cu_c3_driver_pre_run.html !! - subroutine cu_unified_driver_pre_run (flag_init, flag_restart, kdt, fhour, dtp, t, q, prevst, prevsq, & + subroutine cu_c3_driver_pre_run (flag_init, flag_restart, kdt, fhour, dtp, t, q, prevst, prevsq, & forcet, forceq, cactiv, cactiv_m, conv_act, conv_act_m, & errmsg, errflg) @@ -79,6 +79,6 @@ subroutine cu_unified_driver_pre_run (flag_init, flag_restart, kdt, fhour, dtp, cactiv_m(:)=nint(conv_act_m(:)) !$acc end kernels - end subroutine cu_unified_driver_pre_run + end subroutine cu_c3_driver_pre_run -end module cu_unified_driver_pre +end module cu_c3_driver_pre diff --git a/physics/cu_unified_driver_pre.meta b/physics/cu_c3_driver_pre.meta similarity index 98% rename from physics/cu_unified_driver_pre.meta rename to physics/cu_c3_driver_pre.meta index aa8b870db..c018bee9f 100644 --- a/physics/cu_unified_driver_pre.meta +++ b/physics/cu_c3_driver_pre.meta @@ -1,11 +1,11 @@ [ccpp-table-properties] - name = cu_unified_driver_pre + name = cu_c3_driver_pre type = scheme dependencies = machine.F ######################################################################## [ccpp-arg-table] - name = cu_unified_driver_pre_run + name = cu_c3_driver_pre_run type = scheme [flag_init] standard_name = flag_for_first_timestep diff --git a/physics/cu_unified_sh.F90 b/physics/cu_c3_sh.F90 similarity index 98% rename from physics/cu_unified_sh.F90 rename to physics/cu_c3_sh.F90 index 84e5cc6da..0ea0f28ae 100644 --- a/physics/cu_unified_sh.F90 +++ b/physics/cu_c3_sh.F90 @@ -1,7 +1,7 @@ -!>\file cu_unified_sh.F90 -!! This file contains unified shallow convection scheme. +!>\file cu_c3_sh.F90 +!! This file contains C3 shallow convection scheme. -module cu_unified_sh +module cu_c3_sh use machine , only : kind_phys use progsigma, only : progsigma_calc @@ -16,9 +16,9 @@ module cu_unified_sh contains -!>\defgroup cu_unified_sh_group Grell-Freitas Shallow Convection Module +!>\defgroup cu_c3_sh_group Grell-Freitas Shallow Convection Module !! This module contains Grell-Freitas shallow convection scheme. -!> \ingroup cu_unified_group +!> \ingroup cu_c3_group !> @{ !> GF shallow convection as described in Grell and !! Freitas (2014) \cite grell_and_freitas_2014. input variables are: @@ -62,8 +62,8 @@ module cu_unified_sh !!\param itf,ktf,its,ite, kts,kte are dimensions !!\param ipr horizontal index of printed column !!\param tropics =0 -!>\section gen_cu_unified_sh_run Grell-Freitas Shallow Convection General Algorithm - subroutine cu_unified_sh_run ( & +!>\section gen_cu_c3_sh_run Grell-Freitas Shallow Convection General Algorithm + subroutine cu_c3_sh_run ( & us,vs,zo,t,q,z1,tn,qo,po,psur,dhdt,kpbl,rho, & ! input variables, must be supplied hfx,qfx,xland,ichoice,tcrit,dtime, & zuo,xmb_out,kbcon,ktop,k22,ierr,ierrc, & @@ -74,7 +74,7 @@ subroutine cu_unified_sh_run ( & ! ! this module needs some subroutines from gf_deep ! - use cu_unified_deep,only:cup_env,cup_env_clev,get_cloud_bc,cup_minimi, & + use cu_c3_deep,only:cup_env,cup_env_clev,get_cloud_bc,cup_minimi, & get_inversion_layers,rates_up_pdf,get_cloud_bc, & cup_up_aa0,cup_kbcon,get_lateral_massflux, & calculate_updraft_velocity @@ -1116,6 +1116,6 @@ subroutine cu_unified_sh_run ( & ! print*,'hlisq',qco(1,k),qrco(1,k),pwo(1,k) ! enddo - end subroutine cu_unified_sh_run + end subroutine cu_c3_sh_run !> @} -end module cu_unified_sh +end module cu_c3_sh diff --git a/physics/cu_gf_deep.F90 b/physics/cu_gf_deep.F90 index 2335a2308..67dd9bd3f 100644 --- a/physics/cu_gf_deep.F90 +++ b/physics/cu_gf_deep.F90 @@ -554,7 +554,6 @@ subroutine cu_gf_deep_run( & if(xland1(i) == 0)entr_rate(i)=7.e-5 if(dx(i) frh_thresh)then @@ -563,8 +562,9 @@ subroutine cu_gf_deep_run( & entr_rate(i)=.2/radius endif sig(i)=(1.-frh)**2 - frh_out(i) = frh - if((dx(i) Calculates strength of downdraft based on windshear and/or !! aerosol content. - subroutine cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & - pw,ccn,ccnclean,pwev,edtmax,edtmin,edtc,psum2,psumh, & - rho,aeroevap,pefc,itf,ktf, & + subroutine cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & + pw,ccn,ccnclean,pwev,edtmax,edtmin,edtc,psum2,psumh, & + rho,aeroevap,pefc,xland1,itf,ktf, & its,ite, kts,kte ) implicit none @@ -2455,7 +2453,7 @@ subroutine cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & pwav,pwev,psum2,psumh,edtmax,edtmin integer, dimension (its:ite) & ,intent (in ) :: & - ktop,kbcon + ktop,kbcon,xland1 real(kind=kind_phys), intent (in ) :: & !HCB ccnclean real(kind=kind_phys), dimension (its:ite) & @@ -2536,30 +2534,30 @@ subroutine cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & edt(i)=1.-.5*(pefb+pef) if(aeroevap.gt.1)then + pefb=.5 + if(xland1(i) == 1)pefb=.3 aeroadd=0. if((psumh(i)>0.).and.(psum2(i)>0.))then - aeroadd=((1.e-2*ccnclean)**beta3)*(psumh(i)**(alpha3-1)) - prop_c=.5*(pefb+pef)/aeroadd - aeroadd=((1.e-2*ccn(i))**beta3)*(psum2(i)**(alpha3-1)) + aeroadd=((ccnclean)**beta3)*(psumh(i)**(alpha3-1)) + prop_c=pefb/aeroadd + aeroadd=((ccn(i))**beta3)*(psum2(i)**(alpha3-1)) aeroadd=prop_c*aeroadd pefc(i)=aeroadd if(pefc(i).gt.0.9)pefc(i)=0.9 if(pefc(i).lt.0.1)pefc(i)=0.1 edt(i)=1.-pefc(i) - if(aeroevap.eq.2)edt(i)=1.-.25*(pefb+pef+2.*pefc(i)) endif endif !--- edt here is 1-precipeff! - einc=.2*edt(i) - edtc(i,1)=edt(i)-einc + edtc(i,1)=edt(i) endif enddo do i=its,itf if(ierr(i).eq.0)then - edtc(i,1)=-edtc(i,1)*pwav(i)/pwev(i) + edtc(i,1)=-edtc(i,1)*psum2(i)/pwev(i) if(edtc(i,1).gt.edtmax(i))edtc(i,1)=edtmax(i) if(edtc(i,1).lt.edtmin(i))edtc(i,1)=edtmin(i) endif @@ -2571,7 +2569,7 @@ end subroutine cup_dd_edt !> Calcultes moisture properties of downdrafts. subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & pwd,q_cup,z_cup,dd_massentr,dd_massdetr,jmin,ierr, & - gamma_cup,pwev,bu,qrcd, & + gamma_cup,pwev,bu,qrcd,p_cup, & q,he,iloop, & itf,ktf, & its,ite, kts,kte ) @@ -2601,7 +2599,7 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & real(kind=kind_phys), dimension (its:ite,kts:kte) & ,intent (in ) :: & zd,hes_cup,hcd,qes_cup,q_cup,z_cup, & - dd_massentr,dd_massdetr,gamma_cup,q,he + dd_massentr,dd_massdetr,gamma_cup,q,he,p_cup !$acc declare copyin(zd,hes_cup,hcd,qes_cup,q_cup,z_cup,dd_massentr,dd_massdetr,gamma_cup,q,he) integer & ,intent (in ) :: & @@ -2629,7 +2627,7 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & integer :: & i,k,ki real(kind=kind_phys) :: & - denom,dh,dz,dqeva + denom,dp,dh,dz,dqeva !$acc kernels do i=its,itf @@ -2650,6 +2648,7 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & if(ierr(i).eq.0)then k=jmin(i) dz=z_cup(i,k+1)-z_cup(i,k) + dp=-100.*(p_cup(i,k+1)-p_cup(i,k)) qcd(i,k)=q_cup(i,k) dh=hcd(i,k)-hes_cup(i,k) if(dh.lt.0)then @@ -2660,12 +2659,13 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & endif pwd(i,jmin(i))=zd(i,jmin(i))*min(0.,qcd(i,k)-qrcd(i,k)) qcd(i,k)=qrcd(i,k) - pwev(i)=pwev(i)+pwd(i,jmin(i)) ! *dz + pwev(i)=pwev(i)+pwd(i,jmin(i))*g/dp ! *dz ! bu(i)=dz*dh !$acc loop seq do ki=jmin(i)-1,1,-1 dz=z_cup(i,ki+1)-z_cup(i,ki) + dp=-100.*(p_cup(i,ki+1)-p_cup(i,ki)) ! qcd(i,ki)=(qcd(i,ki+1)*(1.-.5*cdd(i,ki+1)*dz) & ! +entr*dz*q(i,ki) & ! )/(1.+entr*dz-.5*cdd(i,ki+1)*dz) @@ -2698,10 +2698,7 @@ subroutine cup_dd_moisture(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & endif pwd(i,ki)=zd(i,ki)*dqeva qcd(i,ki)=qrcd(i,ki) - pwev(i)=pwev(i)+pwd(i,ki) ! *dz -! if(iloop.eq.1.and.i.eq.102.and.j.eq.62)then -! print *,'in cup_dd_moi ', hcd(i,ki),hes_cup(i,ki),dh,dqeva -! endif + pwev(i)=pwev(i)+pwd(i,ki)*g/dp enddo ! !--- end loop over i @@ -3990,11 +3987,7 @@ subroutine cup_output_ens_3d(xff_mid,xf_ens,ierr,dellat,dellaq,dellaqc, & ! --- now use proper count of how many closures were actually ! used in cup_forcing_ens (including screening of some ! closures over water) to properly normalize xmb - if (dx(i).ge.dx_thresh)then - clos_wei=16./max(1.,closure_n(i)) - else - clos_wei=1. - endif + clos_wei=16./max(1.,closure_n(i)) xmb_ave(i)=min(xmb_ave(i),100.) xmb(i)=clos_wei*sig(i)*xmb_ave(i) @@ -4199,13 +4192,15 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & iprop,iall,i,k integer :: start_level(its:ite),kklev(its:ite) !$acc declare create(start_level,kklev) - real(kind=kind_phys) :: & - prop_ave,qrcb_h,bdsp,dp,rhoc,qrch,qaver,clwdet, & + real(kind=kind_phys) :: & + prop_ave,qrcb_h,dp,rhoc,qrch,qaver,clwdet, & dz,berryc0,q1,berryc - real(kind=kind_phys) :: & + real(kind=kind_phys) :: & denom, c0t, c0_iceconv - real(kind=kind_phys), dimension (kts:kte) :: & + real(kind=kind_phys), dimension (kts:kte) :: & prop_b + real(kind=kind_phys), dimension (its:ite) :: & + bdsp !$acc declare create(prop_b) ! real(kind=kind_phys), parameter:: zero = 0 @@ -4221,7 +4216,7 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & clwdet=0.1 !0.02 c0_iceconv=0.01 c1d_b=c1d - bdsp=bdispm + bdsp(:)=bdispm ! !--- no precip for small clouds @@ -4235,6 +4230,11 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & pwavh(i)=0. psum(i)=0. psumh(i)=0. + if (xland1(i) .eq. 0) then + bdsp(i)=bdispm + else + bdsp(i)=bdispc + endif enddo do k=kts,ktf do i=its,itf @@ -4301,6 +4301,10 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & qc(i,k)=qrch+qrc(i,k) clw_all(i,k)=qrc(i,k) endif + clw_allh(i,k)=clw_all(i,k) + qrcb(i,k)=qrc(i,k) + pwh(i,k)=pw(i,k) + qch(i,k)=qc(i,k) enddo ! endif ! @@ -4316,6 +4320,7 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & endif if(is_mid)c0t=0.004 + if(autoconv .gt.1) c0t=c0(i) denom=zu(i,k-1)-.5*up_massdetr(i,k-1)+up_massentr(i,k-1) if(denom.lt.1.e-16)then ierr(i)=51 @@ -4325,7 +4330,7 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & rhoc=.5*(rho(i,k)+rho(i,k-1)) dz=z_cup(i,k)-z_cup(i,k-1) - dp=p_cup(i,k)-p_cup(i,k-1) + dp=-100.*(p_cup(i,k)-p_cup(i,k-1)) ! !--- saturation in cloud, this is what is allowed to be in it ! @@ -4358,10 +4363,10 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & qrcb(i,k)=max(0.,(qch(i,k)-qrch)) ! /(1.+c0(i)*dz*zu(i,k)) if(is_deep)then clwdet=0.1 !0.02 ! 05/11/2021 - if(k.lt.kklev(i)) clwdet=0. ! 05/05/2021 + !if(k.lt.kklev(i)) clwdet=0. ! 05/05/2021 else clwdet=0.1 !0.02 ! 05/05/2021 - if(k.lt.kklev(i)) clwdet=0. ! 05/25/2021 + !if(k.lt.kklev(i)) clwdet=0. ! 05/25/2021 endif if(k.gt.kbcon(i)+1)c1d(i,k)=clwdet*up_massdetr(i,k-1) if(k.gt.kbcon(i)+1)c1d_b(i,k)=clwdet*up_massdetr(i,k-1) @@ -4374,50 +4379,52 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & ! this will also determine proportionality constant prop_b, which, if applied, ! would give the same results as c0 under these conditions ! - q1=1.e3*rhoc*clw_allh(i,k) ! g/m^3 ! g[h2o]/cm^3 - berryc0=q1*q1/(60.0*(5.0 + 0.0366*ccnclean/ & - ( q1 * bdsp) ) ) !/( +! Berry conversion for clean atmosphere +! + q1=1.e3*rhoc*clw_allh(i,k) +! pwh units are kg/kg, but normalized by mass flux. So with massflux kg/m^2/s + pwh(i,k)=c0t*dz*zu(i,k)*clw_allh(i,k) qrcb_h=(qch(i,k)-qrch)/(1.+(c1d_b(i,k)+c0t)*dz) - prop_b(k)=(c0t*qrcb_h)/max(1.e-8,(1.e-3*berryc0)) - if(prop_b(k)>5.) prop_b(k)=5. - pwh(i,k)=zu(i,k)*1.e-3*berryc0*dz*prop_b(k) ! 2. - qrcb(i,k)=(max(0.,(qch(i,k)-qrch))*zu(i,k)-pwh(i,k))/(zu(i,k)*(1+c1d_b(i,k)*dz)) - if(qrcb(i,k).lt.0.)then - berryc0=max(0.,(qch(i,k)-qrch))/(1.e-3*dz*prop_b(k)) - pwh(i,k)=zu(i,k)*1.e-3*berryc0*dz*prop_b(k) qrcb(i,k)=0. +! unit (B) = g/m^3/s + berryc0=(q1*q1/(60.0*(5.0 + 0.0366*ccnclean*1.e1/ & + ( q1 * bdsp(i)) ) )) +! normalize Berry: berryc0=berryc0*g/dp*dz*zu = pwh, unts become kg/kg +! set 1: + berryc0=1.e-3*berryc0*g/dp*dz + prop_b(k)=pwh(i,k)/berryc0 + qrcb(i,k)=qrcb_h + if(qrcb(i,k).le.0.)then + pwh(i,k)=0. endif qch(i,k)=qrcb(i,k)+qrch pwavh(i)=pwavh(i)+pwh(i,k) - psumh(i)=psumh(i)+pwh(i,k) ! HCB - !psumh(i)=psumh(i)+clw_allh(i,k)*zu(i,k) *dz - ! + psumh(i)=psumh(i)+pwh(i,k)*g/dp !dz !dp/g !*dp ! HCB ! then the real berry ! - q1=1.e3*rhoc*clw_all(i,k) ! g/m^3 ! g[h2o]/cm^3 - berryc0=q1*q1/(60.0*(5.0 + 0.0366*ccn(i)/ & - ( q1 * bdsp) ) ) !/( - berryc0=1.e-3*berryc0*dz*prop_b(k) ! 2. - qrc(i,k)=(max(0.,(qc(i,k)-qrch))*zu(i,k)-zu(i,k)*berryc0)/(zu(i,k)*(1+c1d(i,k)*dz)) + q1=1.e3*rhoc*clw_all(i,k) + berryc=(q1*q1/(60.0*(5.0 + 0.0366*ccn(i)*1.e1/ & + ( q1 * bdsp(i)) ) )) + berryc=1.e-3*berryc*g/dp*dz + pw(i,k)=prop_b(k)*berryc !*dz/zu(i,k) +! use berryc now as new c0 for this level + berryc=pw(i,k)/(dz*zu(i,k)*clw_all(i,k)) + if(qrc(i,k).le.0.)then + berryc=0. + endif + qrc(i,k)=(max(0.,(qc(i,k)-qrch))/(1+(c1d(i,k)+berryc)*dz)) if(qrc(i,k).lt.0.)then - berryc0=max(0.,(qc(i,k)-qrch))/(1.e-3*dz*prop_b(k)) qrc(i,k)=0. + pw(i,k)=0. endif - pw(i,k)=berryc0*zu(i,k) qc(i,k)=qrc(i,k)+qrch ! if not running with berry at all, do the following ! - else !c0=.002 - if(iall.eq.1)then - qrc(i,k)=0. - pw(i,k)=(qc(i,k)-qrch)*zu(i,k) - if(pw(i,k).lt.0.)pw(i,k)=0. - else + else ! create clw detrainment profile that depends on mass detrainment and ! in-cloud clw/ice ! - !c1d(i,k)=clwdet*up_massdetr(i,k-1)*qrc(i,k-1) qrc(i,k)=(qc(i,k)-qrch)/(1.+(c1d(i,k)+c0t)*dz) if(qrc(i,k).lt.0.)then ! hli new test 02/12/19 qrc(i,k)=0. @@ -4431,11 +4438,10 @@ subroutine cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & qrc(i,k)=0. pw(i,k)=0. endif - endif - qc(i,k)=qrc(i,k)+qrch - endif !autoconv + qc(i,k)=qrc(i,k)+qrch + endif !autoconv pwav(i)=pwav(i)+pw(i,k) - psum(i)=psum(i)+pw(i,k) ! HCB + psum(i)=psum(i)+pw(i,k)*g/dp ! HCB enddo ! k=kbcon,ktop ! do not include liquid/ice in qc !$acc loop independent @@ -4611,9 +4617,6 @@ subroutine rates_up_pdf(rand_vmas,ipr,name,ktop,ierr,p_cup,entr_rate_2d,hkbo,heo ierr(i)=41 ktop(i)= 0 else -! call get_zu_zd_pdf_fim(ipr,xland(i),zuh2,"up",ierr(i),start_level(i), & -! call get_zu_zd_pdf_fim(rand_vmas(i),zubeg,ipr,xland(i),zuh2,"up",ierr(i),kbcon(i), & -! kfinalzu,zuo(i,kts:kte),kts,kte,ktf,beta_u,kpbl(i),csum(i),pmin_lev(i)) call get_zu_zd_pdf_fim(kklev,p_cup(i,:),rand_vmas(i),zubeg,ipr,xland(i),zuh2,1,ierr(i),k22(i), & kfinalzu+1,zuo(i,kts:kte),kts,kte,ktf,beta_u,kbcon(i),csum(i),pmin_lev(i)) endif diff --git a/physics/cu_gf_driver.F90 b/physics/cu_gf_driver.F90 index ca9f0bec2..f82569b99 100644 --- a/physics/cu_gf_driver.F90 +++ b/physics/cu_gf_driver.F90 @@ -66,7 +66,8 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& index_of_y_wind,index_of_process_scnv,index_of_process_dcnv, & fhour,fh_dfi_radar,ix_dfi_radar,num_dfi_radar,cap_suppress, & dfi_radar_max_intervals,ldiag3d,qci_conv,do_cap_suppress, & - maxupmf,maxMF,errmsg,errflg) + maxupmf,maxMF,do_mynnedmf,ichoice_in,ichoicem_in,ichoice_s_in, & + errmsg,errflg) !------------------------------------------------------------- implicit none integer, parameter :: maxiens=1 @@ -76,10 +77,9 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& integer, parameter :: ensdim=16 integer :: imid_gf=1 ! gf congest conv. integer, parameter :: ideep=1 - integer :: ichoice=0 ! 0 2 5 13 8 - !integer, parameter :: ichoicem=5 ! 0 2 5 13 - integer, parameter :: ichoicem=13 ! 0 2 5 13 - integer, parameter :: ichoice_s=3 ! 0 1 2 3 + integer :: ichoice=0 ! 0 2 5 13 8 + integer :: ichoicem=13 ! 0 2 5 13 + integer :: ichoice_s=3 ! 0 1 2 3 logical, intent(in) :: do_cap_suppress real(kind=kind_phys), parameter :: aodc0=0.14 @@ -91,7 +91,8 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& !------------------------------------------------------------- integer :: its,ite, jts,jte, kts,kte integer, intent(in ) :: im,km,ntracer - logical, intent(in ) :: flag_init, flag_restart + integer, intent(in ) :: ichoice_in,ichoicem_in,ichoice_s_in + logical, intent(in ) :: flag_init, flag_restart, do_mynnedmf logical, intent(in ) :: flag_for_scnv_generic_tend,flag_for_dcnv_generic_tend real (kind=kind_phys), intent(in) :: g,cp,xlv,r_v logical, intent(in ) :: ldiag3d @@ -246,6 +247,9 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& errmsg = '' errflg = 0 + ichoice = ichoice_in + ichoicem = ichoicem_in + ichoice_s = ichoice_s_in if(do_cap_suppress) then !$acc serial do itime=1,num_dfi_radar @@ -337,10 +341,7 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& edtd(:)=0. zdd(:,:)=0. flux_tun(:)=5. -! 10/11/2016 dx and tscl_kf are replaced with input dx(i), is dlength. ! dx for scale awareness -! dx=40075000./float(lonf) -! tscl_kf=dx/25000. !$acc end kernels if (imfshalcnv == 3) then @@ -625,7 +626,7 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& enddo do i = its,itf if(mconv(i).lt.0.)mconv(i)=0. - if(maxMF(i).gt.0.)ierr(i)=555 + if((dx(i)<6500.).and.do_mynnedmf.and.(maxMF(i).gt.0.))ierr(i)=555 enddo !$acc end kernels if (dx(its)<6500.) then @@ -660,7 +661,13 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& !$acc kernels do i=its,itf - if(xmbs(i).gt.0.)cutens(i)=1. + if(xmbs(i).gt.0.)then + cutens(i)=1. + if (dx(i)<6500.) then + ierrm(i)=555 + ierr (i)=555 + endif + endif enddo !$acc end kernels !> - Call neg_check() for GF shallow convection @@ -897,8 +904,8 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& gdc(i,k,1)= max(0.,tun_rad_shall(i)*cupclws(i,k)*cutens(i)) ! my mod !gdc2(i,k,1)=max(0.,tun_rad_deep(i)*(cupclwm(i,k)*cutenm(i)+cupclw(i,k)*cuten(i))) - !gdc2(i,k,1)=max(0.,tun_rad_mid(i)*cupclwm(i,k)*cutenm(i)+tun_rad_deep(i)*cupclw(i,k)*cuten(i)+tun_rad_shall(i)*cupclws(i,k)*cutens(i)) - gdc2(i,k,1) = min(0.1, max(0.01, tun_rad_mid(i)*frhm(i)))*cupclwm(i,k)*cutenm(i) + min(0.1, max(0.01, tun_rad_deep(i)*(frhd(i))))*cupclw(i,k)*cuten(i) + tun_rad_shall(i)*cupclws(i,k)*cutens(i) + gdc2(i,k,1)=max(0.,tun_rad_mid(i)*cupclwm(i,k)*cutenm(i)+frhd(i)*cupclw(i,k)*cuten(i)+tun_rad_shall(i)*cupclws(i,k)*cutens(i)) + !gdc2(i,k,1) = min(0.1, max(0.01, tun_rad_mid(i)*frhm(i)))*cupclwm(i,k)*cutenm(i) + min(0.1, max(0.01, tun_rad_deep(i)*(frhd(i))))*cupclw(i,k)*cuten(i) + tun_rad_shall(i)*cupclws(i,k)*cutens(i) qci_conv(i,k)=gdc2(i,k,1) gdc(i,k,2)=(outt(i,k))*86400. gdc(i,k,3)=(outtm(i,k))*86400. @@ -993,10 +1000,9 @@ subroutine cu_gf_driver_run(ntracer,garea,im,km,dt,flag_init,flag_restart,& gdc(i,15,10)=qfx(i) gdc(i,16,10)=pret(i)*3600. + maxupmf(i)=0. if(forcing(i,6).gt.0.)then maxupmf(i)=maxval(xmb(i)*zu(i,kts:ktf)/forcing(i,6)) - else - maxupmf(i)=0. endif if(ktop(i).gt.2 .and.pret(i).gt.0.)dt_mf(i,ktop(i)-1)=ud_mf(i,ktop(i)) diff --git a/physics/cu_gf_driver.meta b/physics/cu_gf_driver.meta index 60c7e7fe5..8b1a46e2d 100644 --- a/physics/cu_gf_driver.meta +++ b/physics/cu_gf_driver.meta @@ -569,6 +569,34 @@ type = real kind = kind_phys intent = in +[do_mynnedmf] + standard_name = flag_for_mellor_yamada_nakanishi_niino_pbl_scheme + long_name = flag to activate MYNN-EDMF + units = flag + dimensions = () + type = logical + intent = in +[ichoice_in] + standard_name = identifier_for_c3_or_gf_deep_convection_closure + long_name = flag for C3 or GF deep convection closure + units = flag + dimensions = () + type = integer + intent = in +[ichoicem_in] + standard_name = identifier_for_c3_or_gf_mid_convection_closure + long_name = flag for C3 or GF mid convection closure + units = flag + dimensions = () + type = integer + intent = in +[ichoice_s_in] + standard_name = identifier_for_c3_or_gf_shallow_convection_closure + long_name = flag for C3 or GF shallow convection closure + units = flag + dimensions = () + type = integer + intent = in [errmsg] standard_name = ccpp_error_message long_name = error message for error handling in CCPP diff --git a/physics/cu_unified_driver_post.F90 b/physics/cu_unified_driver_post.F90 deleted file mode 100644 index 821992bff..000000000 --- a/physics/cu_unified_driver_post.F90 +++ /dev/null @@ -1,65 +0,0 @@ -!> \file cu_unified_driver_post.F90 -!! Contains code related to unified convective schemes to be used within the GFS physics suite. - -module cu_unified_driver_post - - implicit none - - private - - public :: cu_unified_driver_post_run - - contains - -!>\ingroup cu_unified_group -!> \section arg_table_cu_unified_driver_post_run Argument Table -!! \htmlinclude cu_unified_driver_post_run.html -!! - subroutine cu_unified_driver_post_run (im, t, q, prevst, prevsq, cactiv, cactiv_m, conv_act, conv_act_m, errmsg, errflg) - - use machine, only: kind_phys - - implicit none - - ! Interface variables - integer, intent(in) :: im - real(kind_phys), intent(in) :: t(:,:) - real(kind_phys), intent(in) :: q(:,:) - real(kind_phys), intent(out) :: prevst(:,:) - real(kind_phys), intent(out) :: prevsq(:,:) - integer, intent(in) :: cactiv(:) - integer, intent(in) :: cactiv_m(:) - real(kind_phys), intent(out) :: conv_act(:) - real(kind_phys), intent(out) :: conv_act_m(:) - character(len=*), intent(out) :: errmsg -!$acc declare copyin(t,q,cactiv,cactiv_m) copyout(prevst,prevsq,conv_act,conv_act_m) - integer, intent(out) :: errflg - - ! Local variables - integer :: i - - ! Initialize CCPP error handling variables - errmsg = '' - errflg = 0 - -!$acc kernels - prevst(:,:) = t(:,:) - prevsq(:,:) = q(:,:) - - do i = 1, im - if (cactiv(i).gt.0) then - conv_act(i) = conv_act(i)+1.0 - else - conv_act(i)=0.0 - endif - if (cactiv_m(i).gt.0) then - conv_act_m(i) = conv_act_m(i)+1.0 - else - conv_act_m(i)=0.0 - endif - enddo -!$acc end kernels - - end subroutine cu_unified_driver_post_run - -end module cu_unified_driver_post diff --git a/physics/docs/pdftxt/suite_input.nml.txt b/physics/docs/pdftxt/suite_input.nml.txt index f37383f24..be3785b74 100644 --- a/physics/docs/pdftxt/suite_input.nml.txt +++ b/physics/docs/pdftxt/suite_input.nml.txt @@ -394,11 +394,14 @@ show some variables in the namelist that must match the SDF. cnvcld see \a GFS_typedefs.F90 flag for convective cloud .false. lgfdlmprad gfs_rrtmg_pre flag for GFDL mp scheme and radiation consistency .false. nssl_cccn mp_nssl CCN concentration (m^-3) 0.6e9 -nssl_alphah mp_nssl graupel shape parameter 0.0 -nssl_alphahl mp_nssl hail shape parameter 1.0 +nssl_alphar mp_nssl rain PSD shape parameter 0.0 +nssl_alphah mp_nssl graupel PSD shape parameter 0.0 +nssl_alphahl mp_nssl hail PSD shape parameter 1.0 nssl_hail_on mp_nssl NSSL flag to activate the hail category .false. nssl_ccn_on mp_nssl NSSL flag to activate the CCN category .true. nssl_invertccn mp_nssl NSSL flag to treat CCN as activated or unactivated .true. +nssl_ehw0 mp_nssl NSSL graupel-droplet collection efficiency 0.9 +nssl_ehlw0 mp_nssl NSSL hail-droplet collection efficiency 0.9 \b Parameters \b related \b to \b gravity \b drag \b scheme \b options knob_ugwp_version cires_ugwp parameter selects a version of the UGWP implementation in FV3GFS-127L \n
    diff --git a/physics/gcycle.F90 b/physics/gcycle.F90 index 16e446b27..f5eecbd18 100644 --- a/physics/gcycle.F90 +++ b/physics/gcycle.F90 @@ -21,7 +21,7 @@ subroutine gcycle (me, nthrds, nx, ny, isc, jsc, nsst, tile_num, nlunit, fn_nml, frac_grid, smc, slc, stc, smois, sh2o, tslb, tiice, tg3, tref, tsfc, & tsfco, tisfc, hice, fice, facsf, facwf, alvsf, alvwf, alnsf, alnwf, & zorli, zorll, zorlo, weasd, slope, snoalb, canopy, vfrac, vtype, & - stype, shdmin, shdmax, snowd, cv, cvb, cvt, oro, oro_uf, & + stype, scolor, shdmin, shdmax, snowd, cv, cvb, cvt, oro, oro_uf, & xlat_d, xlon_d, slmsk, imap, jmap, errmsg, errflg) ! ! @@ -75,6 +75,7 @@ subroutine gcycle (me, nthrds, nx, ny, isc, jsc, nsst, tile_num, nlunit, fn_nml, slmsk(:) integer, intent(inout) :: vtype(:), & stype(:), & + scolor(:), & slope(:) integer, intent(in) :: imap(:), jmap(:) @@ -91,6 +92,7 @@ subroutine gcycle (me, nthrds, nx, ny, isc, jsc, nsst, tile_num, nlunit, fn_nml, slpfcs (nx*ny), & vegfcs (nx*ny), & sltfcs (nx*ny), & + slcfcs (nx*ny), & !soil color TSFFCS (nx*ny), & ZORFCS (nx*ny), & AISFCS (nx*ny), & @@ -137,6 +139,7 @@ subroutine gcycle (me, nthrds, nx, ny, isc, jsc, nsst, tile_num, nlunit, fn_nml, slpfcs = real(slope) vegfcs = real(vtype) sltfcs = real(stype) + slcfcs = real(scolor) !soil color ! if (frac_grid) then do ix=1,npts @@ -238,7 +241,7 @@ subroutine gcycle (me, nthrds, nx, ny, isc, jsc, nsst, tile_num, nlunit, fn_nml, shdmin, shdmax, slpfcs, snoalb, tsffcs, & weasd, zorfcs, albfc1, tg3, canopy, & smcfc1, stcfc1, slmsk, aisfcs, & - vfrac, vegfcs, sltfcs, alffc1, cv, & + vfrac, vegfcs, sltfcs, slcfcs,alffc1, cv, & !slcfcs: soil color cvb, cvt, me, nthrds, & nlunit, size(input_nml_file), input_nml_file, & min_ice, ialb, isot, ivegsrc, & @@ -258,6 +261,7 @@ subroutine gcycle (me, nthrds, nx, ny, isc, jsc, nsst, tile_num, nlunit, fn_nml, slope = int(slpfcs) vtype = int(vegfcs) stype = int(sltfcs) + scolor = int(slcfcs) !soil color ! do ix=1,npts zorll(ix) = ZORFCS(ix) diff --git a/physics/module_mp_nssl_2mom.F90 b/physics/module_mp_nssl_2mom.F90 index d190e94b4..409bf4019 100644 --- a/physics/module_mp_nssl_2mom.F90 +++ b/physics/module_mp_nssl_2mom.F90 @@ -1228,7 +1228,7 @@ SUBROUTINE nssl_2mom_init( & rho_qh = nssl_params(8) rho_qhl = nssl_params(9) rho_qs = nssl_params(10) - alphar = nssl_params(14) + alphar = nssl_params(15) ! ipelec = Nint(nssl_params(11)) ! isaund = Nint(nssl_params(12)) diff --git a/physics/module_mp_thompson.F90 b/physics/module_mp_thompson.F90 index 6a4ef5e02..0c708cb3d 100644 --- a/physics/module_mp_thompson.F90 +++ b/physics/module_mp_thompson.F90 @@ -3400,8 +3400,8 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, & tcond(k) = (5.69 + 0.0168*tempc)*1.0E-5 * 418.936 ocp(k) = 1./(Cp*(1.+0.887*qv(k))) lvt2(k)=lvap(k)*lvap(k)*ocp(k)*oRv*otemp*otemp - - nwfa(k) = MAX(11.1E6*rho(k), (nwfa1d(k) + nwfaten(k)*DT)*rho(k)) + if (is_aerosol_aware) & + nwfa(k) = MAX(11.1E6*rho(k), (nwfa1d(k) + nwfaten(k)*DT)*rho(k)) enddo do k = kts, kte @@ -3654,7 +3654,8 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, & qvten(k) = qvten(k) - prw_vcd(k) qcten(k) = qcten(k) + prw_vcd(k) ncten(k) = ncten(k) + pnc_wcd(k) - nwfaten(k) = nwfaten(k) - pnc_wcd(k) + if (is_aerosol_aware) & + nwfaten(k) = nwfaten(k) - pnc_wcd(k) tten(k) = tten(k) + lvap(k)*ocp(k)*prw_vcd(k)*(1-IFDRY) rc(k) = MAX(R1, (qc1d(k) + DT*qcten(k))*rho(k)) if (rc(k).eq.R1) L_qc(k) = .false. @@ -3743,7 +3744,8 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, & qrten(k) = qrten(k) - prv_rev(k) qvten(k) = qvten(k) + prv_rev(k) nrten(k) = nrten(k) - pnr_rev(k) - nwfaten(k) = nwfaten(k) + pnr_rev(k) + if (is_aerosol_aware) & + nwfaten(k) = nwfaten(k) + pnr_rev(k) tten(k) = tten(k) - lvap(k)*ocp(k)*prv_rev(k)*(1-IFDRY) rr(k) = MAX(R1, (qr1d(k) + DT*qrten(k))*rho(k)) @@ -4232,10 +4234,12 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, & qv1d(k) = MAX(1.E-10, qv1d(k) + qvten(k)*DT) qc1d(k) = qc1d(k) + qcten(k)*DT nc1d(k) = MAX(2./rho(k), MIN(nc1d(k) + ncten(k)*DT, Nt_c_max)) - nwfa1d(k) = MAX(11.1E6, MIN(9999.E6, & - (nwfa1d(k)+nwfaten(k)*DT))) - nifa1d(k) = MAX(naIN1*0.01, MIN(9999.E6, & - (nifa1d(k)+nifaten(k)*DT))) + if (is_aerosol_aware) then + nwfa1d(k) = MAX(11.1E6, MIN(9999.E6, & + (nwfa1d(k)+nwfaten(k)*DT))) + nifa1d(k) = MAX(naIN1*0.01, MIN(9999.E6, & + (nifa1d(k)+nifaten(k)*DT))) + end if if (qc1d(k) .le. R1) then qc1d(k) = 0.0 nc1d(k) = 0.0 diff --git a/physics/module_sf_noahmp_glacier.F90 b/physics/module_sf_noahmp_glacier.F90 index bd6b016f1..6e34c43af 100644 --- a/physics/module_sf_noahmp_glacier.F90 +++ b/physics/module_sf_noahmp_glacier.F90 @@ -126,7 +126,7 @@ subroutine noahmp_glacier (& thsfc_loc ,prslkix ,prsik1x ,prslk1x , & psfc ,pblhx ,iz0tlnd ,itime , & sigmaf1 ,garea1 ,psi_opt , & ! in : - ep_1 ,ep_2 ,cp , & + ep_1 ,ep_2 ,epsm1 ,cp , & qsnow ,sneqvo ,albold ,cm ,ch ,isnow , & ! in/out : sneqv ,smc ,zsnso ,snowh ,snice ,snliq , & ! in/out : tg ,stc ,sh2o ,tauss ,qsfc , & ! in/out : @@ -177,6 +177,7 @@ subroutine noahmp_glacier (& real (kind=kind_phys) , intent(in) :: pblhx ! pbl height real (kind=kind_phys) , intent(in) :: ep_1 real (kind=kind_phys) , intent(in) :: ep_2 + real (kind=kind_phys) , intent(in) :: epsm1 real (kind=kind_phys) , intent(in) :: cp integer , intent(in) :: iz0tlnd ! integer , intent(in) :: itime !< timestep @@ -267,7 +268,7 @@ subroutine noahmp_glacier (& ! -------------------------------------------------------------------------------------------------- ! re-process atmospheric forcing - call atm_glacier (sfcprs ,sfctmp ,q2 ,soldn ,cosz ,thair , & + call atm_glacier (ep_2, epsm1,sfcprs ,sfctmp ,q2 ,soldn ,cosz ,thair , & qair ,eair ,rhoair ,solad ,solai ,swdown ) beg_wb = sneqv @@ -290,7 +291,7 @@ subroutine noahmp_glacier (& tbot ,zbot ,zsnso ,dzsnso ,sigmaf1 ,garea1 , & !in thsfc_loc ,prslkix ,prsik1x ,prslk1x , & !in psfc ,pblhx ,iz0tlnd ,itime ,psi_opt , & - ep_1, ep_2, cp, & + ep_1, ep_2, epsm1, cp, & tg ,stc ,snowh ,sneqv ,sneqvo ,sh2o , & !inout smc ,snice ,snliq ,albold ,cm ,ch , & !inout #ifdef CCPP @@ -363,7 +364,7 @@ end subroutine noahmp_glacier ! ================================================================================================== !>\ingroup NoahMP_LSM !! re-process atmospheric forcing - subroutine atm_glacier (sfcprs ,sfctmp ,q2 ,soldn ,cosz ,thair , & + subroutine atm_glacier (ep_2, epsm1, sfcprs ,sfctmp ,q2 ,soldn ,cosz ,thair , & qair ,eair ,rhoair ,solad ,solai , & swdown ) ! -------------------------------------------------------------------------------------------------- @@ -373,6 +374,8 @@ subroutine atm_glacier (sfcprs ,sfctmp ,q2 ,soldn ,cosz ,thair , & ! -------------------------------------------------------------------------------------------------- ! inputs + real (kind=kind_phys) , intent(in) :: ep_2 + real (kind=kind_phys) , intent(in) :: epsm1 real (kind=kind_phys) , intent(in) :: sfcprs !< pressure (pa) real (kind=kind_phys) , intent(in) :: sfctmp !< surface air temperature [k] real (kind=kind_phys) , intent(in) :: q2 !< mixing ratio (kg/kg) @@ -399,8 +402,8 @@ subroutine atm_glacier (sfcprs ,sfctmp ,q2 ,soldn ,cosz ,thair , & ! qair = q2 / (1.0+q2) ! mixing ratio to specific humidity [kg/kg] qair = q2 ! in wrf, driver converts to specific humidity - eair = qair*sfcprs / (0.622+0.378*qair) - rhoair = (sfcprs-0.378*eair) / (rair*sfctmp) + eair = qair*sfcprs / (ep_2-epsm1*qair) + rhoair = (sfcprs+epsm1*eair) / (rair*sfctmp) if(cosz <= 0.) then swdown = 0. @@ -424,7 +427,7 @@ subroutine energy_glacier (nsnow ,nsoil ,isnow ,dt ,qsnow ,rhoair tbot ,zbot ,zsnso ,dzsnso ,sigmaf1 ,garea1 , & !in thsfc_loc ,prslkix ,prsik1x ,prslk1x , & !in psfc ,pblhx ,iz0tlnd ,itime ,psi_opt , & - ep_1, ep_2, cp, & + ep_1, ep_2, epsm1, cp, & tg ,stc ,snowh ,sneqv ,sneqvo ,sh2o , & !inout smc ,snice ,snliq ,albold ,cm ,ch , & !inout #ifdef CCPP @@ -478,6 +481,7 @@ subroutine energy_glacier (nsnow ,nsoil ,isnow ,dt ,qsnow ,rhoair real (kind=kind_phys) , intent(in) :: psfc !< surface pressure real (kind=kind_phys) , intent(in) :: ep_1 real (kind=kind_phys) , intent(in) :: ep_2 + real (kind=kind_phys) , intent(in) :: epsm1 real (kind=kind_phys) , intent(in) :: cp integer , intent(in) :: iz0tlnd !< z0t option integer , intent(in) :: itime !< integration time @@ -584,7 +588,7 @@ subroutine energy_glacier (nsnow ,nsoil ,isnow ,dt ,qsnow ,rhoair ! set psychrometric constant lathea = hsub - gamma = cpair*sfcprs/(0.622*lathea) + gamma = cpair*sfcprs/(ep_2*lathea) ! surface temperatures of the ground and energy fluxes @@ -594,7 +598,7 @@ subroutine energy_glacier (nsnow ,nsoil ,isnow ,dt ,qsnow ,rhoair eair ,stc ,sag ,snowh ,lathea ,sh2o , & !in thsfc_loc ,prslkix ,prsik1x ,prslk1x , & psfc ,pblhx ,iz0tlnd ,itime ,uu ,vv , & - sigmaf1 ,garea1 ,psi_opt ,ep_1, ep_2, cp, & !in + sigmaf1 ,garea1 ,psi_opt ,ep_1, ep_2, epsm1, cp, & !in #ifdef CCPP cm ,ch ,tg ,qsfc ,errmsg ,errflg , & !inout #else @@ -1034,7 +1038,7 @@ subroutine glacier_flux (nsoil ,nsnow ,emg ,isnow ,df ,dzsnso eair ,stc ,sag ,snowh ,lathea ,sh2o , & !in thsfc_loc ,prslkix ,prsik1x ,prslk1x , & psfc ,pblhx ,iz0tlnd ,itime ,uu ,vv , & - sigmaf1 ,garea1 ,psi_opt ,ep_1, ep_2, cp, & !in + sigmaf1 ,garea1 ,psi_opt ,ep_1, ep_2, epsm1, cp, & !in #ifdef CCPP cm ,ch ,tgb ,qsfc ,errmsg ,errflg , & !inout #else @@ -1092,6 +1096,7 @@ subroutine glacier_flux (nsoil ,nsnow ,emg ,isnow ,df ,dzsnso real (kind=kind_phys) , intent(in) :: psfc !< real (kind=kind_phys) , intent(in) :: ep_1 real (kind=kind_phys) , intent(in) :: ep_2 + real (kind=kind_phys) , intent(in) :: epsm1 real (kind=kind_phys) , intent(in) :: cp integer , intent(in) :: iz0tlnd !< integer , intent(in) :: itime !< integration time @@ -1266,11 +1271,11 @@ subroutine glacier_flux (nsoil ,nsnow ,emg ,isnow ,df ,dzsnso call sfcdif1_glacier(iter ,zlvl ,zpd ,z0h ,z0m , & !in qair ,sfctmp ,h ,rhoair ,mpe ,ur , & !in #ifdef CCPP - & moz ,mozsgn ,fm ,fh ,fm2 ,fh2 ,errmsg, errflg, & !inout + & moz ,mozsgn ,fm ,fh ,fm2 ,fh2,fv, errmsg, errflg, & !inout #else - & moz ,mozsgn ,fm ,fh ,fm2 ,fh2 , & !inout + & moz ,mozsgn ,fm ,fh ,fm2 ,fh2,fv , & !inout #endif - & fv ,cm ,ch ,ch2) !out + & cm ,ch ,ch2) !out #ifdef CCPP if (errflg /= 0) return @@ -1364,7 +1369,7 @@ subroutine glacier_flux (nsoil ,nsnow ,emg ,isnow ,df ,dzsnso else estg = esati end if - qsfc = 0.622*(estg*rhsur)/(sfcprs-0.378*(estg*rhsur)) + qsfc = ep_2*(estg*rhsur)/(sfcprs+epsm1*(estg*rhsur)) qfx = (qsfc-qair)*cev*gamma/cpair end do loop3 ! end stability iteration @@ -1437,7 +1442,7 @@ subroutine glacier_flux (nsoil ,nsnow ,emg ,isnow ,df ,dzsnso else estg = esati end if - qsfc = 0.622*(estg*rhsur)/(sfcprs-0.378*(estg*rhsur)) + qsfc = ep_2*(estg*rhsur)/(sfcprs+epsm1*(estg*rhsur)) end do !sfc_diff3 iter end if !sfc_diff3 @@ -1453,7 +1458,7 @@ subroutine glacier_flux (nsoil ,nsnow ,emg ,isnow ,df ,dzsnso t = tdc(tgb) ! mb: recalculate estg call esat(t, esatw, esati, dsatw, dsati) estg = esati - qsfc = 0.622*(estg*rhsur)/(sfcprs-0.378*(estg*rhsur)) + qsfc = ep_2*(estg*rhsur)/(sfcprs+epsm1*(estg*rhsur)) irb = cir * tgb**4 - emg*lwdn shb = csh * (tgb - sfctmp) evb = cev * (estg*rhsur - eair ) !estg reevaluate ? @@ -1545,12 +1550,12 @@ end subroutine esat subroutine sfcdif1_glacier(iter ,zlvl ,zpd ,z0h ,z0m , & !in qair ,sfctmp ,h ,rhoair ,mpe ,ur , & !in #ifdef CCPP - & moz ,mozsgn ,fm ,fh ,fm2 ,fh2 , & !inout - & errmsg ,errflg , & !inout + & moz ,mozsgn ,fm ,fh ,fm2 ,fh2 , fv, & !inout + & errmsg ,errflg , & !inout #else - & moz ,mozsgn ,fm ,fh ,fm2 ,fh2 , & !inout + & moz ,mozsgn ,fm ,fh ,fm2 ,fh2 , fv, & !inout #endif - & fv ,cm ,ch ,ch2 ) !out + & cm ,ch ,ch2 ) !out ! ------------------------------------------------------------------------------------------------- ! computing surface drag coefficient cm for momentum and ch for heat ! ------------------------------------------------------------------------------------------------- @@ -1576,6 +1581,7 @@ subroutine sfcdif1_glacier(iter ,zlvl ,zpd ,z0h ,z0m , & !in real (kind=kind_phys), intent(inout) :: fh !< sen heat stability correction, weighted by prior iters real (kind=kind_phys), intent(inout) :: fm2 !< sen heat stability correction, weighted by prior iters real (kind=kind_phys), intent(inout) :: fh2 !< sen heat stability correction, weighted by prior iters + real (kind=kind_phys), intent(inout) :: fv !< friction velocity (m/s) #ifdef CCPP character(len=*), intent(inout) :: errmsg @@ -1583,7 +1589,6 @@ subroutine sfcdif1_glacier(iter ,zlvl ,zpd ,z0h ,z0m , & !in #endif ! outputs - real (kind=kind_phys), intent(out) :: fv !< friction velocity (m/s) real (kind=kind_phys), intent(out) :: cm !< drag coefficient for momentum real (kind=kind_phys), intent(out) :: ch !< drag coefficient for heat real (kind=kind_phys), intent(out) :: ch2 !< drag coefficient for heat @@ -2603,6 +2608,7 @@ subroutine snowwater_glacier (nsnow ,nsoil ,imelt ,dt ,sfctmp , & !in ! local integer :: iz real (kind=kind_phys) :: bdsnow !< bulk density of snow (kg/m3) + real (kind=kind_phys),parameter :: mwd = 100. !< maximum water depth (mm) ! ---------------------------------------------------------------------- snoflow = 0.0 ponding1 = 0.0 @@ -2646,9 +2652,9 @@ subroutine snowwater_glacier (nsnow ,nsoil ,imelt ,dt ,sfctmp , & !in !to obtain equilibrium state of snow in glacier region - if(sneqv > 2000.) then ! 2000 mm -> maximum water depth + if(sneqv > mwd) then ! 100 mm -> maximum water depth bdsnow = snice(0) / dzsnso(0) - snoflow = (sneqv - 2000.) + snoflow = (sneqv - mwd) snice(0) = snice(0) - snoflow dzsnso(0) = dzsnso(0) - snoflow/bdsnow snoflow = snoflow / dt diff --git a/physics/module_sf_noahmplsm.F90 b/physics/module_sf_noahmplsm.F90 index 7807ee475..86853dabe 100644 --- a/physics/module_sf_noahmplsm.F90 +++ b/physics/module_sf_noahmplsm.F90 @@ -8,7 +8,6 @@ module module_sf_noahmplsm use module_wrf_utl #endif use machine , only : kind_phys -use sfc_diff, only : stability implicit none @@ -163,10 +162,19 @@ module module_sf_noahmplsm ! 1 -> liu, et al. 2016 integer :: opt_trs !< options for thermal roughness scheme - ! **1 -> z0h=z0 - ! 2 -> czil - ! 3 -> ec style - ! 4 -> kb inversed + ! **1 -> z0h=z0m + ! 2 -> czil = f(canopy height) from Chen09 + ! 3 -> ec style from TESSEL + ! 4 -> kb inverse from Blumel99 + integer :: opt_diag !< options for surface 2m/q diagnostic approach + ! 1 -> external GFS sfc_diag + ! **2 -> original NoahMP 2-title + ! 3 -> NoahMP 2-title + internal GFS sfc_diag + + integer :: opt_z0m !< options for momentum roughness length + ! **1 -> use z0m from MPTABLE + ! 2 -> z0m = f(canopy height, LAI/SAI) + !------------------------------------------------------------------------------------------! ! physical constants: ! !------------------------------------------------------------------------------------------! @@ -211,10 +219,12 @@ module module_sf_noahmplsm real (kind=kind_phys) :: z0mvt !< momentum roughness length (m) real (kind=kind_phys) :: hvt !< top of canopy (m) real (kind=kind_phys) :: hvb !< bottom of canopy (m) + real (kind=kind_phys) :: z0mhvt !< ratio of z0m to hvt real (kind=kind_phys) :: den !< tree density (no. of trunks per m2) real (kind=kind_phys) :: rc !< tree crown radius (m) real (kind=kind_phys) :: mfsno !< snowmelt m parameter () real (kind=kind_phys) :: scffac !< snow cover factor (m) + real (kind=kind_phys) :: cbiom !< canopy biomass heat capacity parameter (m) real (kind=kind_phys) :: saim(12) !< monthly stem area index, one-sided real (kind=kind_phys) :: laim(12) !< monthly leaf area index, one-sided real (kind=kind_phys) :: sla !< single-side leaf area per kg [m2/kg] @@ -416,7 +426,7 @@ subroutine noahmp_sflx (parameters, & pblhx , iz0tlnd , itime ,psi_opt ,& prcpconv, prcpnonc, prcpshcv, prcpsnow, prcpgrpl, prcphail, & ! in : forcing tbot , co2air , o2air , foln , ficeold , zlvl , & ! in : forcing - ep_1 , ep_2 , cp , & ! in : constants + ep_1 , ep_2 , epsm1 , cp , & ! in : constants albold , sneqvo , & ! in/out : stc , sh2o , smc , tah , eah , fwet , & ! in/out : canliq , canice , tv , tg , qsfc, qsnow, qrain, & ! in/out : @@ -438,7 +448,8 @@ subroutine noahmp_sflx (parameters, & shg , shc , shb , evg , evb , ghv , & ! out : ghb , irg , irc , irb , tr , evc , & ! out : chleaf , chuc , chv2 , chb2 , fpice , pahv , & - pahg , pahb , pah , esnow , laisun , laisha , rb & + pahg , pahb , pah , esnow , canhs , laisun , & + laisha , rb , qsfcveg , qsfcbare & #ifdef CCPP ,errmsg, errflg) #else @@ -464,6 +475,7 @@ subroutine noahmp_sflx (parameters, & integer , intent(in) :: jloc !< grid index real (kind=kind_phys) , intent(in) :: ep_1 !< real (kind=kind_phys) , intent(in) :: ep_2 !< + real (kind=kind_phys) , intent(in) :: epsm1 !< real (kind=kind_phys) , intent(in) :: cp !< real (kind=kind_phys) , intent(in) :: dt !< time step [sec] real (kind=kind_phys), dimension( 1:nsoil), intent(in) :: zsoil !< layer-bottom depth from soil surf (m) @@ -582,6 +594,8 @@ subroutine noahmp_sflx (parameters, & real (kind=kind_phys) , intent(out) :: rb !< leaf boundary layer resistance (s/m) real (kind=kind_phys) , intent(out) :: laisun !< sunlit leaf area index (m2/m2) real (kind=kind_phys) , intent(out) :: laisha !< shaded leaf area index (m2/m2) + real (kind=kind_phys) , intent(out) :: qsfcveg !< effective spec humid over vegetation + real (kind=kind_phys) , intent(out) :: qsfcbare !< effective spec humid over bare soil !jref:start; output real (kind=kind_phys) , intent(out) :: t2mv !< 2-m air temperature over vegetated part [k] @@ -719,7 +733,7 @@ subroutine noahmp_sflx (parameters, & logical :: dveg_active !< flag to run dynamic vegetation logical :: crop_active !< flag to run crop model ! add canopy heat storage (C.He added based on GY Niu's communication) - real (kind=kind_phys) :: canhs ! canopy heat storage change w/m2 + real (kind=kind_phys) , intent(out) :: canhs ! canopy heat storage change w/m2 ! intent (out) variables need to be assigned a value. these normally get assigned values ! only if dveg == 2. @@ -735,7 +749,7 @@ subroutine noahmp_sflx (parameters, & ! -------------------------------------------------------------------------------------------------- ! re-process atmospheric forcing - call atm (parameters,sfcprs ,sfctmp ,q2 , & + call atm (parameters,ep_2, epsm1, sfcprs ,sfctmp ,q2 , & prcpconv, prcpnonc,prcpshcv,prcpsnow,prcpgrpl,prcphail, & soldn ,cosz ,thair ,qair , & eair ,rhoair ,qprecc ,qprecl ,solad ,solai , & @@ -818,7 +832,7 @@ subroutine noahmp_sflx (parameters, & fveg ,shdfac, pahv ,pahg ,pahb , & !in qsnow ,dzsnso ,lat ,canliq ,canice ,iloc, jloc , & !in thsfc_loc, prslkix,prsik1x,prslk1x,garea1, & !in - pblhx ,iz0tlnd, itime ,psi_opt, ep_1, ep_2, cp, & + pblhx ,iz0tlnd, itime ,psi_opt, ep_1, ep_2, epsm1,cp, & z0wrf ,z0hwrf , & !out imelt ,snicev ,snliqv ,epore ,t2m ,fsno , & !out sav ,sag ,qmelt ,fsa ,fsr ,taux , & !out @@ -842,7 +856,9 @@ subroutine noahmp_sflx (parameters, & emissi ,pah ,canhs, & shg,shc,shb,evg,evb,ghv,ghb,irg,irc,irb,tr,evc,chleaf,chuc,chv2,chb2 ) !out - qsfc = q1 ! + qsfcveg = eah*ep_2/(sfcprs + epsm1*eah) + qsfcbare = qsfc + qsfc = q1 !jref:end #ifdef CCPP if (errflg /= 0) return @@ -944,7 +960,7 @@ end subroutine noahmp_sflx !>\ingroup NoahMP_LSM !! re-precess atmospheric forcing. - subroutine atm (parameters,sfcprs ,sfctmp ,q2 , & + subroutine atm (parameters,ep_2,epsm1,sfcprs ,sfctmp ,q2 , & prcpconv,prcpnonc ,prcpshcv,prcpsnow,prcpgrpl,prcphail , & soldn ,cosz ,thair ,qair , & eair ,rhoair ,qprecc ,qprecl ,solad , solai , & @@ -957,6 +973,8 @@ subroutine atm (parameters,sfcprs ,sfctmp ,q2 , ! inputs type (noahmp_parameters), intent(in) :: parameters + real (kind=kind_phys) , intent(in) :: ep_2 !< + real (kind=kind_phys) , intent(in) :: epsm1 !< real (kind=kind_phys) , intent(in) :: sfcprs !< pressure (pa) real (kind=kind_phys) , intent(in) :: sfctmp !< surface air temperature [k] real (kind=kind_phys) , intent(in) :: q2 !< mixing ratio (kg/kg) @@ -1001,8 +1019,8 @@ subroutine atm (parameters,sfcprs ,sfctmp ,q2 , qair = q2 ! in wrf, driver converts to specific humidity - eair = qair*sfcprs / (0.622+0.378*qair) - rhoair = (sfcprs-0.378*eair) / (rair*sfctmp) + eair = qair*sfcprs / (ep_2-epsm1*qair) + rhoair = (sfcprs+epsm1*eair) / (rair*sfctmp) if(cosz <= 0.) then swdown = 0. @@ -1658,7 +1676,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in fveg ,shdfac, pahv ,pahg ,pahb , & !in qsnow ,dzsnso ,lat ,canliq ,canice ,iloc , jloc, & !in thsfc_loc, prslkix,prsik1x,prslk1x,garea1, & !in - pblhx , iz0tlnd, itime,psi_opt,ep_1, ep_2, cp, & + pblhx , iz0tlnd, itime,psi_opt,ep_1, ep_2, epsm1, cp, & z0wrf ,z0hwrf , & !out imelt ,snicev ,snliqv ,epore ,t2m ,fsno , & !out sav ,sag ,qmelt ,fsa ,fsr ,taux , & !out @@ -1742,6 +1760,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in real (kind=kind_phys) , intent(in) :: pblhx !< pbl height real (kind=kind_phys) , intent(in) :: ep_1 !< real (kind=kind_phys) , intent(in) :: ep_2 !< + real (kind=kind_phys) , intent(in) :: epsm1 !< real (kind=kind_phys) , intent(in) :: cp !< integer , intent(in) :: iz0tlnd !< integer , intent(in) :: itime !< @@ -1963,6 +1982,9 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in real (kind=kind_phys) :: ezpd real (kind=kind_phys) :: aone + real (kind=kind_phys) :: canopy_density_factor + real (kind=kind_phys) :: vai_limited + !jref:end real (kind=kind_phys), parameter :: mpe = 1.e-6 @@ -2001,6 +2023,9 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in csigmaf1 = 0.0 csigmaf0 = 0.0 aone = 0.0 + + canopy_density_factor = 1.0 + vai_limited = 2.0 ! @@ -2043,12 +2068,32 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in zpdg = snowh if(veg) then - z0m = parameters%z0mvt - zpd = 0.65 * parameters%hvt - if(snowh.gt.zpd) zpd = snowh + + if(opt_z0m == 1) then + + z0m = parameters%z0mvt + zpd = 0.65 * parameters%hvt + + elseif(opt_z0m == 2) then + + z0m = parameters%z0mhvt * parameters%hvt + zpd = 0.65 * parameters%hvt + if(vegtyp /= 13) then + vai_limited = min(vai, 2.0) + canopy_density_factor = (1.0 - exp(-vai_limited)) / (1.0 - exp(-2.0)) + z0m = exp(canopy_density_factor * log(z0m) + (1.0 - canopy_density_factor) * log(z0mg)) + zpd = canopy_density_factor * zpd + end if + + end if + + if(snowh.gt.zpd) zpd = snowh + else + z0m = z0mg zpd = zpdg + end if ! special case for urban @@ -2169,7 +2214,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in latheav = hsub frozen_canopy = .true. end if - gammav = cpair*sfcprs/(0.622*latheav) + gammav = cpair*sfcprs/(ep_2*latheav) if (tg .gt. tfrz) then latheag = hvap @@ -2178,14 +2223,14 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in latheag = hsub frozen_ground = .true. end if - gammag = cpair*sfcprs/(0.622*latheag) + gammag = cpair*sfcprs/(ep_2*latheag) ! if (sfctmp .gt. tfrz) then ! lathea = hvap ! else ! lathea = hsub ! end if -! gamma = cpair*sfcprs/(0.622*lathea) +! gamma = cpair*sfcprs/(ep_2*lathea) ! surface temperatures of the ground and canopy and energy fluxes @@ -2205,7 +2250,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in foln ,co2air ,o2air ,btran ,sfcprs , & !in rhsur ,iloc ,jloc ,q2 ,pahv ,pahg , & !in thsfc_loc, prslkix,prsik1x,prslk1x, garea1, & !in - pblhx ,iz0tlnd ,itime ,psi_opt ,ep_1, ep_2, cp, & + pblhx ,iz0tlnd ,itime ,psi_opt ,ep_1, ep_2, epsm1, cp, & eah ,tah ,tv ,tgv ,cmv, ustarx , & !inout #ifdef CCPP chv ,dx ,dz8w ,errmsg ,errflg , & !inout @@ -2242,7 +2287,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in emg ,stc ,df ,rsurf ,latheag , & !in gammag ,rhsur ,iloc ,jloc ,q2 ,pahb , & !in thsfc_loc, prslkix,prsik1x,prslk1x,vegtyp,fveg,shdfac,garea1, & !in - pblhx ,iz0tlnd ,itime ,psi_opt ,ep_1, ep_2, cp, & + pblhx ,iz0tlnd ,itime ,psi_opt ,ep_1, ep_2, epsm1, cp, & #ifdef CCPP tgb ,cmb ,chb, ustarx,errmsg ,errflg , & !inout #else @@ -2292,7 +2337,7 @@ subroutine energy (parameters,ice ,vegtyp ,ist ,nsnow ,nsoil , & !in ts = fveg * tah + (1.0 - fveg) * tgb cm = fveg * cmv + (1.0 - fveg) * cmb ! better way to average? ch = fveg * chv + (1.0 - fveg) * chb - q1 = fveg * (eah*0.622/(sfcprs - 0.378*eah)) + (1.0 - fveg)*qsfc + q1 = fveg * (eah*ep_2/(sfcprs + epsm1*eah)) + (1.0 - fveg)*qsfc q2e = fveg * q2v + (1.0 - fveg) * q2b ! effectibe skin temperature @@ -3559,7 +3604,7 @@ subroutine twostream (parameters,ib ,ic ,vegtyp ,cosz ,vai , & ! tmp1 = b*b - c*c h = sqrt(tmp1) / avmu sigma = tmp0*tmp0 - tmp1 - if ( abs (sigma) < 1.e-6 ) sigma = sign(1.e-6,sigma) + if ( abs (sigma) < 1.e-6 ) sigma = sign(1.e-6_kind_phys,sigma) p1 = b + avmu*h p2 = b - avmu*h p3 = b + tmp0 @@ -3653,7 +3698,7 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & foln ,co2air ,o2air ,btran ,sfcprs , & !in rhsur ,iloc ,jloc ,q2 ,pahv ,pahg , & !in thsfc_loc, prslkix,prsik1x,prslk1x, garea1, & !in - pblhx ,iz0tlnd ,itime ,psi_opt ,ep_1, ep_2, cp, & + pblhx ,iz0tlnd ,itime ,psi_opt ,ep_1, ep_2, epsm1, cp, & eah ,tah ,tv ,tg ,cm,ustarx,& !inout #ifdef CCPP ch ,dx ,dz8w ,errmsg ,errflg , & !inout @@ -3675,6 +3720,7 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & ! -sav + irc[tv] + shc[tv] + evc[tv] + tr[tv] + canhs[tv] = 0 ! -sag + irg[tg] + shg[tg] + evg[tg] + gh[tg] = 0 ! -------------------------------------------------------------------------------------------------- + use funcphys, only : fpvs implicit none ! -------------------------------------------------------------------------------------------------- ! input @@ -3704,6 +3750,7 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & real (kind=kind_phys) , intent(in) :: pblhx !< pbl height real (kind=kind_phys) , intent(in) :: ep_1 !< real (kind=kind_phys) , intent(in) :: ep_2 !< + real (kind=kind_phys) , intent(in) :: epsm1 !< real (kind=kind_phys) , intent(in) :: cp !< integer , intent(in) :: iz0tlnd !< integer , intent(in) :: itime !< @@ -3915,6 +3962,10 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & real (kind=kind_phys) :: t, tdc !kelvin to degree celsius with limit -50 to +50 + real(kind=kind_phys) :: evpot ! 0. .and. fwet > 0.) then + if (tv > tfrz) then + cew = min(fwet,canliq*latheav/dt/evpot) * vaie/rb + else + cew = min(fwet,canice*latheav/dt/evpot) * vaie/rb + endif + else + cew= fwet * vaie/rb + endif ctw = (1.-fwet)*(laisune/(rb+rssun) + laishae/(rb+rssha)) cgw = 1./(rawg+rsurf) cond = caw + cew + ctw + cgw @@ -4188,7 +4248,7 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & end if ! canopy heat capacity - hcv = 0.02*vaie*cwat + canliq*cwat/denh2o + canice*cice/denice !j/m2/k + hcv = fveg*(parameters%cbiom*vaie*cwat + canliq*cwat/denh2o + canice*cice/denice) !j/m2/k b = sav-irc-shc-evc-tr+pahv !additional w/m2 ! a = fveg*(4.*cir*tv**3 + csh + (cev+ctr)*destv) !volumetric heat capacity @@ -4210,7 +4270,7 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & hg = rhoair*cpair*(tg - tah) /rahg ! consistent specific humidity from canopy air vapor pressure - qsfc = (0.622*eah)/(sfcprs-0.378*eah) + qsfc = (ep_2*eah)/(sfcprs+epsm1*eah) if ( opt_sfc == 4 ) then qfx = (qsfc-qair)*rhoair*caw @@ -4321,6 +4381,34 @@ subroutine vege_flux(parameters,nsnow ,nsoil ,isnow ,vegtyp ,veg , & q2v = qsfc - ((evc+tr)/fveg+evg)/(latheav*rhoair) * 1./cq2v endif +! use sfc_diag to calculate t2mv and q2v for opt_sfc=1&3 + if(opt_diag ==3) then + if(opt_sfc == 1 .or. opt_sfc == 3) then + + fhi = fh2/fh + wrk = 1.0 - fhi + if(thsfc_loc) then ! Use local potential temperature + t2mv = tah*wrk + sfctmp*prslkix*fhi - (grav+grav)/cp + else ! Use potential temperature referenced to 1000 hPa + t2mv = tah*wrk + sfctmp*fhi - (grav+grav)/cp + endif + + if((evc+tr)/fveg+evg >= 0.) then ! for evaporation>0, use inferred qsurf to deduce q2v + q2v = qsfc*wrk + max(qmin,qair)*fhi + else ! for dew formation, use saturated q at tskin + qss = fpvs(tah) + qss = ep_2 * qss / (psfc + epsm1 * qss) + q2v= qss*wrk + max(qmin,qair)*fhi + endif + qss = fpvs(t2mv) + qss = ep_2 * qss / (psfc + epsm1 * qss) + q2v = min(q2v,qss) + else + errmsg = 'Problem :opt_diag=3 is only applied for opt_sfc=1&3' + errflg = 1 + return + endif + endif ! update ch for output ch = cah chleaf = cvh @@ -4340,7 +4428,7 @@ subroutine bare_flux (parameters,nsnow ,nsoil ,isnow ,dt ,sag , & emg ,stc ,df ,rsurf ,lathea , & !in gamma ,rhsur ,iloc ,jloc ,q2 ,pahb , & !in thsfc_loc, prslkix,prsik1x,prslk1x,vegtyp,fveg,shdfac,garea1, & !in - pblhx , iz0tlnd , itime ,psi_opt,ep_1,ep_2,cp ,& + pblhx , iz0tlnd , itime ,psi_opt,ep_1,ep_2,epsm1,cp ,& #ifdef CCPP tgb ,cm ,ch,ustarx,errmsg ,errflg , & !inout #else @@ -4359,6 +4447,7 @@ subroutine bare_flux (parameters,nsnow ,nsoil ,isnow ,dt ,sag , & ! bare soil: ! -sab + irb[tg] + shb[tg] + evb[tg] + ghb[tg] = 0 ! ---------------------------------------------------------------------- + use funcphys, only : fpvs implicit none ! ---------------------------------------------------------------------- ! input @@ -4396,6 +4485,7 @@ subroutine bare_flux (parameters,nsnow ,nsoil ,isnow ,dt ,sag , & real (kind=kind_phys), intent(in) :: pblhx !< pbl height (m) real (kind=kind_phys), intent(in) :: ep_1 !< real (kind=kind_phys), intent(in) :: ep_2 !< + real (kind=kind_phys), intent(in) :: epsm1 !< real (kind=kind_phys), intent(in) :: cp !< integer, intent(in) :: iz0tlnd !< integer, intent(in) :: itime !< @@ -4544,6 +4634,10 @@ subroutine bare_flux (parameters,nsnow ,nsoil ,isnow ,dt ,sag , & real (kind=kind_phys) :: temptrs real (kind=kind_phys) :: t, tdc !kelvin to degree celsius with limit -50 to +50 + + real(kind=kind_phys) :: fhi, qss, wrk + real(kind=kind_phys), parameter :: qmin=1.0e-8 + tdc(t) = min( 50., max(-50.,(t-tfrz)) ) ! ----------------------------------------------------------------- @@ -4593,7 +4687,7 @@ subroutine bare_flux (parameters,nsnow ,nsoil ,isnow ,dt ,sag , & ! z0h = z0m !* exp(-czil*0.4*258.2*sqrt(fv*z0m)) ! end if call thermalz0(parameters,fveg,z0m,z0m,zlvl,zpd,zpd,ustarx, & !in - vegtyp,0.,ur,csigmaf0,csigmaf1,temptrs,temptrs,temptrs,0, & !in + vegtyp,0._kind_phys,ur,csigmaf0,csigmaf1,temptrs,temptrs,temptrs,0, & !in z0mo,z0h) if(opt_sfc == 1) then @@ -4601,11 +4695,11 @@ subroutine bare_flux (parameters,nsnow ,nsoil ,isnow ,dt ,sag , & zlvl ,zpd ,z0m ,z0h ,ur , & !in mpe ,iloc ,jloc , & !in #ifdef CCPP - moz ,mozsgn ,fm ,fh ,fm2 ,fh2 ,errmsg ,errflg ,& !inout + moz ,mozsgn ,fm ,fh ,fm2 ,fh2 ,fv,errmsg ,errflg ,& !inout #else - moz ,mozsgn ,fm ,fh ,fm2 ,fh2 , & !inout + moz ,mozsgn ,fm ,fh ,fm2 ,fh2 ,fv, & !inout #endif - cm ,ch ,fv ,ch2 ) !out + cm ,ch ,ch2 ) !out #ifdef CCPP if (errflg /= 0) return #endif @@ -4722,7 +4816,7 @@ subroutine bare_flux (parameters,nsnow ,nsoil ,isnow ,dt ,sag , & else estg = esati end if - qsfc = 0.622*(estg*rhsur)/(psfc-0.378*(estg*rhsur)) + qsfc = ep_2*(estg*rhsur)/(psfc+epsm1*(estg*rhsur)) qfx = (qsfc-qair)*cev*gamma/cpair @@ -4794,6 +4888,34 @@ subroutine bare_flux (parameters,nsnow ,nsoil ,isnow ,dt ,sag , & end if endif ! 4 +! use sfc_diag to calculate t2mv and q2v for opt_sfc=1&3 + if(opt_diag ==3) then + if(opt_sfc == 1 .or. opt_sfc == 3) then + + fhi = fh2/fh + wrk = 1.0 - fhi + if(thsfc_loc) then ! Use local potential temperature + t2mb = tgb*wrk + sfctmp*prslkix*fhi - (grav+grav)/cp + else ! Use potential temperature referenced to 1000 hPa + t2mb = tgb*wrk + sfctmp*fhi - (grav+grav)/cp + endif + + if(evb >= 0.) then ! for evaporation>0, use inferred qsurf to deduce q2v + q2b = qsfc*wrk + max(qmin,qair)*fhi + else ! for dew formation, use saturated q at tskin + qss = fpvs(tgb) + qss = ep_2 * qss / (psfc + epsm1 * qss) + q2b= qss*wrk + max(qmin,qair)*fhi + endif + qss = fpvs(t2mb) + qss = ep_2 * qss / (psfc + epsm1 * qss) + q2b = min(q2b,qss) + else + errmsg = 'Problem :opt_diag=3 is only applied for opt_sfc=1&3' + errflg = 1 + return + endif + endif if (parameters%urban_flag) q2b = qsfc ! update ch @@ -4909,8 +5031,7 @@ subroutine ragrb(parameters,iter ,vai ,rhoair ,hg ,tah , & !in tmprb = cwpc*50. / (1. - exp(-cwpc/2.)) rb = tmprb * sqrt(parameters%dleaf/uc) - rb = max(rb,20.0) -! rb = 200 + rb = min(max(rb, 5.0),50.0) ! limit rb to 5-50, typically rb<50 end subroutine ragrb @@ -4922,11 +5043,11 @@ subroutine sfcdif1(parameters,iter ,sfctmp ,rhoair ,h ,qair , & !in & zlvl ,zpd ,z0m ,z0h ,ur , & !in & mpe ,iloc ,jloc , & !in #ifdef CCPP - & moz ,mozsgn ,fm ,fh ,fm2,fh2,errmsg,errflg, & !inout + & moz ,mozsgn ,fm ,fh ,fm2,fh2,fv,errmsg,errflg, & !inout #else - & moz ,mozsgn ,fm ,fh ,fm2,fh2, & !inout + & moz ,mozsgn ,fm ,fh ,fm2,fh2, fv, & !inout #endif - & cm ,ch ,fv ,ch2 ) !out + & cm ,ch ,ch2 ) !out ! ------------------------------------------------------------------------------------------------- ! computing surface drag coefficient cm for momentum and ch for heat ! ------------------------------------------------------------------------------------------------- @@ -4956,6 +5077,7 @@ subroutine sfcdif1(parameters,iter ,sfctmp ,rhoair ,h ,qair , & !in real (kind=kind_phys), intent(inout) :: fh !< sen heat stability correction, weighted by prior iters real (kind=kind_phys), intent(inout) :: fm2 !< sen heat stability correction, weighted by prior iters real (kind=kind_phys), intent(inout) :: fh2 !< sen heat stability correction, weighted by prior iters + real (kind=kind_phys), intent(inout) :: fv !< friction velocity (m/s) #ifdef CCPP character(len=*), intent(inout) :: errmsg integer, intent(inout) :: errflg @@ -4965,7 +5087,6 @@ subroutine sfcdif1(parameters,iter ,sfctmp ,rhoair ,h ,qair , & !in real (kind=kind_phys), intent(out) :: cm !< drag coefficient for momentum real (kind=kind_phys), intent(out) :: ch !< drag coefficient for heat - real (kind=kind_phys), intent(out) :: fv !< friction velocity (m/s) real (kind=kind_phys), intent(out) :: ch2 !< drag coefficient for heat ! locals @@ -5120,7 +5241,7 @@ subroutine sfcdif2(parameters,iter ,z0 ,thz0 ,thlm ,sfcspd , & !in real (kind=kind_phys), intent(inout) :: akhs real (kind=kind_phys), intent(inout) :: rlmo real (kind=kind_phys), intent(inout) :: wstar2 - real (kind=kind_phys), intent(out) :: ustar + real (kind=kind_phys), intent(inout) :: ustar real (kind=kind_phys) zz, pslmu, pslms, pslhu, pslhs real (kind=kind_phys) xx, pspmu, yy, pspms, psphu, psphs @@ -5382,6 +5503,9 @@ subroutine sfcdif3(parameters,iloc ,jloc ,iter ,sfctmp ,qair ,ur tem2 = max(fveg, 0.1_kind_phys) zvfun1 = sqrt(tem1 * tem2) gdx = sqrt(garea1) + + gdx = 3000.0 ! this will remove gdx effect + zvfun1 = 1.0 ! this will remove zvfun effect if(thsfc_loc) then ! Use local potential temperature tvs = tgb * virtfac @@ -5389,153 +5513,421 @@ subroutine sfcdif3(parameters,iloc ,jloc ,iter ,sfctmp ,qair ,ur tvs = tgb/prsik1x * virtfac endif - call stability (zlvlb, zvfun1, gdx, tv1, thv1, ur, z0m, z0h, tvs, grav, thsfc_loc, & + call gfs_stability (zlvlb, zvfun1, gdx, tv1, thv1, ur, z0m, z0h, tvs, grav, thsfc_loc, & rb1, fm,fh,fm10,fh2,cm,ch,stress1,fv) end subroutine sfcdif3 +!== begin gfs_stability ================================================================================== + +subroutine gfs_stability & +! --- inputs: + ( z1, zvfun, gdx, tv1, thv1, wind, z0max, ztmax, tvs, grav, & + thsfc_loc, & +! --- outputs: + rb, fm, fh, fm10, fh2, cm, ch, stress, ustar) + +! Documentation below refers to UTN and STN which are: +! UTN (Unstable Tech Note) : NCEP Office Note 356 +! STN (Stable Tech Note) : NCEP Office Note 321 + +real (kind=kind_phys), parameter :: ca=0.4_kind_phys ! ca - von karman constant + +real(kind=kind_phys), intent(in) :: z1 ! height model level +real(kind=kind_phys), intent(in) :: zvfun ! vegetation adjustment factor +real(kind=kind_phys), intent(in) :: gdx ! grid spatial dimension +real(kind=kind_phys), intent(in) :: tv1 ! virtual temperature at model level +real(kind=kind_phys), intent(in) :: thv1 ! virtual potential temperature at model level +real(kind=kind_phys), intent(in) :: wind ! wind speed at model level +real(kind=kind_phys), intent(in) :: z0max ! momentum roughness length +real(kind=kind_phys), intent(in) :: ztmax ! thermal roughness length +real(kind=kind_phys), intent(in) :: tvs ! surface virtual temperature +real(kind=kind_phys), intent(in) :: grav ! local gravity +logical, intent(in) :: thsfc_loc ! use local theta reference flag + +real(kind=kind_phys), intent(out) :: rb ! bulk richardson number [-] +real(kind=kind_phys), intent(out) :: fm ! phi momentum function (UTN 1.1) [-] +real(kind=kind_phys), intent(out) :: fh ! phi heat function (UTN 1.2) [-] +real(kind=kind_phys), intent(out) :: fm10 ! 10-meter phi momentum function [-] +real(kind=kind_phys), intent(out) :: fh2 ! 2-meter phi heat function [-] +real(kind=kind_phys), intent(out) :: cm ! momentum exchange coeficient [-] +real(kind=kind_phys), intent(out) :: ch ! heat exchange coeficient [-] +real(kind=kind_phys), intent(out) :: stress ! surface stress [m2/s2] +real(kind=kind_phys), intent(out) :: ustar ! friction velocity [m/s] + +! --- locals: +real(kind=kind_phys), parameter :: a0 = -3.975 ! UTN 2.37 +real(kind=kind_phys), parameter :: a1 = 12.32 ! UTN 2.37 +real(kind=kind_phys), parameter :: b1 = -7.755 ! UTN 2.37 +real(kind=kind_phys), parameter :: b2 = 6.041 ! UTN 2.37 +real(kind=kind_phys), parameter :: a0p = -7.941 ! UTN 2.38 +real(kind=kind_phys), parameter :: a1p = 24.75 ! UTN 2.38 +real(kind=kind_phys), parameter :: b1p = -8.705 ! UTN 2.38 +real(kind=kind_phys), parameter :: b2p = 7.899 ! UTN 2.38 + +real(kind=kind_phys), parameter :: alpha = 5.0 ! alpha in e.g., STN 1.10 +real(kind=kind_phys), parameter :: alpha4 = 4.0 * alpha ! term in aa +real(kind=kind_phys), parameter :: xkrefsqr = 0.3 ! baseline maximum z/L +real(kind=kind_phys), parameter :: xkmin = 0.05 ! min multiplier for grid size and vegetation +real(kind=kind_phys), parameter :: xkgdx = 3000.0 ! critical grid scale for diffusivity[m^0.5] +real(kind=kind_phys), parameter :: zolmin = -10.0 ! minimum z/L +real(kind=kind_phys), parameter :: zero = 0.0 +real(kind=kind_phys), parameter :: one = 1.0 + +real(kind=kind_phys) :: aa +real(kind=kind_phys) :: aa0 +real(kind=kind_phys) :: bb +real(kind=kind_phys) :: bb0 +real(kind=kind_phys) :: dtv +real(kind=kind_phys) :: adtv +real(kind=kind_phys) :: hl1 +real(kind=kind_phys) :: hl12 +real(kind=kind_phys) :: pm +real(kind=kind_phys) :: ph +real(kind=kind_phys) :: pm10 +real(kind=kind_phys) :: ph2 +real(kind=kind_phys) :: z1i +real(kind=kind_phys) :: fms +real(kind=kind_phys) :: fhs +real(kind=kind_phys) :: hl0 +real(kind=kind_phys) :: hl0inf +real(kind=kind_phys) :: hlinf +real(kind=kind_phys) :: hl110 +real(kind=kind_phys) :: hlt +real(kind=kind_phys) :: hltinf +real(kind=kind_phys) :: olinf +real(kind=kind_phys) :: tem1 +real(kind=kind_phys) :: tem2 +real(kind=kind_phys) :: zolmax + +real(kind=kind_phys) xkzo + +z1i = one / z1 ! inverse of model height + +! +! set background diffusivities with one for gdx >= xkgdx and +! as a function of horizontal grid size for gdx < xkgdx +! (i.e., gdx/xkgdx for gdx < xkgdx) +! + +if(gdx >= xkgdx) then + xkzo = one +else + xkzo = gdx / xkgdx +endif + +tem1 = tv1 - tvs +if(tem1 > zero) then ! for stable case, adjust for vegetation cover + tem2 = xkzo * zvfun + xkzo = min(max(tem2, xkmin), xkzo) +endif + +zolmax = xkrefsqr / sqrt(xkzo) ! maximum z/L + +! compute stability indices (rb and hlinf) + + dtv = thv1 - tvs + adtv = max(abs(dtv),0.001_kind_phys) + dtv = sign(1.0_kind_phys,dtv) * adtv + + if(thsfc_loc) then ! Use local potential temperature + rb = max(-5000.0_kind_phys, (grav+grav) * dtv * z1 & + / ((thv1 + tvs) * wind * wind)) + else ! Use potential temperature referenced to 1000 hPa + rb = max(-5000.0_kind_phys, grav * dtv * z1 & + / (tv1 * wind * wind)) + endif + + tem1 = one / z0max ! 1/z0m + tem2 = one / ztmax ! 1/z0t + fm = log((z0max+z1) * tem1) ! neutral phi_m + fh = log((ztmax+z1) * tem2) ! neutral phi_h + fm10 = log((z0max+10.0_kind_phys) * tem1) ! neutral phi_m at 10 meters + fh2 = log((ztmax+2.0_kind_phys) * tem2) ! neutral phi_h at 2 meters + hlinf = rb * fm * fm / fh ! z/L STN 2.7 + hlinf = min(max(hlinf,zolmin),zolmax) ! z/L, xi in STN/UTN +! +! stable case +! + if (dtv >= zero) then + hl1 = hlinf ! z/L, xi in STN + if(hlinf > 0.25_kind_phys) then ! z/L > 0.25, do two iterations + tem1 = hlinf * z1i ! 1/L + hl0inf = z0max * tem1 ! z0m/z1, zi_0 in STN + hltinf = ztmax * tem1 ! z0t/z1, zi_0 in STN + aa = sqrt(one + alpha4 * hlinf) ! sqrt term of STN 2.16 with z + aa0 = sqrt(one + alpha4 * hl0inf) ! sqrt term of STN 2.16 with z0m + bb = aa ! sqrt term of STN 2.16 with z + bb0 = sqrt(one + alpha4 * hltinf) ! sqrt term of STN 2.16 with z0t + pm = aa0 - aa + log( (aa + one)/(aa0 + one) ) ! psi_m STN 3.11 + ph = bb0 - bb + log( (bb + one)/(bb0 + one) ) ! psi_h STN 3.11 + fms = fm - pm ! phi_m STN 3.10 + fhs = fh - ph ! phi_h STN 3.10 + hl1 = fms * fms * rb / fhs ! z/L iteration STN 3.8 + hl1 = min(hl1, zolmax) ! z/L iteration + endif +! +! second iteration +! + tem1 = hl1 * z1i ! 1/L + hl0 = z0max * tem1 ! z0m/z1 + hlt = ztmax * tem1 ! z0t/z1 + aa = sqrt(one + alpha4 * hl1) ! sqrt term of STN 2.16 with z + aa0 = sqrt(one + alpha4 * hl0) ! sqrt term of STN 2.16 with z0m + bb = aa ! sqrt term of STN 2.16 with z + bb0 = sqrt(one + alpha4 * hlt) ! sqrt term of STN 2.16 with z0t + pm = aa0 - aa + log( (one+aa)/(one+aa0) ) ! psi_m STN 3.11 + ph = bb0 - bb + log( (one+bb)/(one+bb0) ) ! psi_h STN 3.11 + hl110 = hl1 * 10.0_kind_phys * z1i ! 10/L + aa = sqrt(one + alpha4 * hl110) ! sqrt term of STN 2.16 with z=10m + pm10 = aa0 - aa + log( (one+aa)/(one+aa0) ) ! psi_m STN 3.11 with z=10m + hl12 = (hl1+hl1) * z1i ! 2/L +! aa = sqrt(one + alpha4 * hl12) + bb = sqrt(one + alpha4 * hl12) ! sqrt term of STN 2.16 with z=2m + ph2 = bb0 - bb + log( (one+bb)/(one+bb0) ) ! psi_m STN 3.11 with z=2m +! +! unstable case - check for unphysical obukhov length +! see steps in UTN Sec. D +! + else ! dtv < 0 case + + olinf = z1 / hlinf ! z/L, xi in UTN + tem1 = 50.0_kind_phys * z0max ! 50 * z0m, z/L limit for calc methods, see UTN Sec. E + if(abs(olinf) <= tem1) then ! + hlinf = -z1 / tem1 ! + hlinf = max(hlinf, zolmin) + endif +! +! get pm and ph +! + if (hlinf >= -0.5_kind_phys) then + hl1 = hlinf + pm = (a0 + a1*hl1) * hl1 / (one+ (b1+b2*hl1) *hl1) ! psi_m UTN 2.37 + ph = (a0p + a1p*hl1) * hl1 / (one+ (b1p+b2p*hl1)*hl1) ! psi_h UTN 2.38 + hl110 = hl1 * 10.0_kind_phys * z1i ! 10/L + pm10 = (a0 + a1*hl110) * hl110/(one+(b1+b2*hl110)*hl110) ! psi_m UTN 2.37 with z=10m + hl12 = (hl1+hl1) * z1i ! 2/L + ph2 = (a0p + a1p*hl12) * hl12/(one+(b1p+b2p*hl12)*hl12) ! psi_h UTN 2.38 with z=2m + else ! z/L < -0.5 + hl1 = -hlinf ! -z/L + tem1 = one / sqrt(hl1) ! sqrt(-z/L) + pm = log(hl1) + 2.0_kind_phys * sqrt(tem1) - 0.8776_kind_phys ! UTN 2.64, first three terms + ph = log(hl1) + 0.5_kind_phys * tem1 + 1.386_kind_phys ! UTN 2.65, first three terms + hl110 = hl1 * 10.0_kind_phys * z1i ! 10/L + pm10 = log(hl110) + 2.0_kind_phys/sqrt(sqrt(hl110)) - 0.8776_kind_phys ! psi_m UTN 2.64 with z=10m + hl12 = (hl1+hl1) * z1i ! 2/L + ph2 = log(hl12) + 0.5_kind_phys / sqrt(hl12) + 1.386_kind_phys ! psi_h UTN 2.65 with z=2m + endif + + endif ! end of if (dtv >= 0 ) then loop +! +! finish the exchange coefficient computation to provide fm and fh +! + fm = fm - pm ! phi_m + fh = fh - ph ! phi_h + fm10 = fm10 - pm10 ! phi_m at 10m + fh2 = fh2 - ph2 ! phi_h at 2m + cm = ca * ca / (fm * fm) ! momentum exchange coef = k^2/phi_m^2 + ch = ca * ca / (fm * fh) ! heat exchange coef = k^2/phi_m/phi_h + tem1 = 0.00001_kind_phys/z1 ! minimum exhange coef (?) + cm = max(cm, tem1) + ch = max(ch, tem1) + stress = cm * wind * wind ! surface stress = Cm*U*U + ustar = sqrt(stress) ! friction velocity + + return +!................................. + end subroutine gfs_stability +!--------------------------------- + !== begin thermalz0 !================================================================================== !>\ingroup NoahMP_LSM ! compute thermal roughness length based on option opt_trs. - subroutine thermalz0(parameters,fveg,z0m,z0mg,zlvl,zpd,ezpd,ustarx, & !in - vegtyp,vaie,ur,csigmaf0,csigmaf1,aone,cdmnv,cdmng,icom, & !in - z0mt,z0ht) !out + + subroutine thermalz0(parameters, fveg, z0m, z0mg, zlvl, zpd, ezpd, & !in + ustarx, vegtyp, vaie, ur, c_sigma_f0, c_sigma_f1, a1, & !in + cdmn_v, cdmn_g, surface_flag, & !in + z0m_out, z0h_out ) !out + ! compute thermal roughness length based on option opt_trs. ! ------------------------------------------------------------------------------------------------- implicit none ! ------------------------------------------------------------------------------------------------- ! inputs - type (noahmp_parameters), intent(in) :: parameters !< - integer , intent(in ) :: vegtyp !< vegetation type - integer , intent(in ) :: icom !< 0=bared 1=vege 2=composition - real (kind=kind_phys), intent(in ) :: fveg !< green vegetation fraction [0.0-1.0] - real (kind=kind_phys), intent(in ) :: z0m !< z0 momentum (m) - real (kind=kind_phys), intent(in ) :: z0mg !< z0 momentum, ground (m) - real (kind=kind_phys), intent(in ) :: zlvl !< reference height [m] - real (kind=kind_phys), intent(in ) :: zpd !< zero plane displacement (m) - real (kind=kind_phys), intent(in ) :: ezpd !< zero plane displacement (m) - real (kind=kind_phys), intent(in ) :: ustarx !< friction velocity (m/s) - real (kind=kind_phys), intent(in ) :: vaie !< reference height [m] - real (kind=kind_phys), intent(in ) :: ur !< wind speed [m/s] - real (kind=kind_phys), intent(inout) :: csigmaf0 !< - real (kind=kind_phys), intent(inout) :: csigmaf1 !< - real (kind=kind_phys), intent(in ) :: aone !< - real (kind=kind_phys), intent(in ) :: cdmnv !< - real (kind=kind_phys), intent(in ) :: cdmng !< - real (kind=kind_phys), intent(out ) :: z0mt !< composited z0 momentum (m) - real (kind=kind_phys), intent(out ) :: z0ht !< composited z0 momentum (m) + type (noahmp_parameters),intent(in ) :: parameters ! parameters data structure + integer , intent(in ) :: vegtyp ! vegetation type + integer , intent(in ) :: surface_flag ! 0=bare 1=vegetation 2=composite + real (kind=kind_phys), intent(in ) :: fveg ! vegetation fraction [0.0-1.0] + real (kind=kind_phys), intent(in ) :: z0m ! z0 momentum [m] + real (kind=kind_phys), intent(in ) :: z0mg ! z0 momentum, ground [m] + real (kind=kind_phys), intent(in ) :: zlvl ! reference height [m] + real (kind=kind_phys), intent(in ) :: zpd ! zero plane displacement [m] + real (kind=kind_phys), intent(in ) :: ezpd ! grid zero plane displacement [m] + real (kind=kind_phys), intent(in ) :: ustarx ! friction velocity [m/s] + real (kind=kind_phys), intent(in ) :: vaie ! exposed LAI + SAI [m2/m2] + real (kind=kind_phys), intent(in ) :: ur ! wind speed [m/s] + real (kind=kind_phys), intent(in ) :: a1 ! Blumel 99 eqn 43 + real (kind=kind_phys), intent(in ) :: cdmn_v ! neutral momentum drag coefficient for vegetation + real (kind=kind_phys), intent(in ) :: cdmn_g ! neutral momentum drag coefficient for bare ground + real (kind=kind_phys), intent(inout) :: c_sigma_f0 ! C factor for no vegetation Blumel99 eqn 35 + real (kind=kind_phys), intent(inout) :: c_sigma_f1 ! C factor for full vegetation Blumel99 eqn 39 + real (kind=kind_phys), intent(out ) :: z0m_out ! output z0 momentum [m] + real (kind=kind_phys), intent(out ) :: z0h_out ! output z0 heat [m] ! local - real (kind=kind_phys) :: czil1 ! canopy based czil - real (kind=kind_phys) :: coeffa - real (kind=kind_phys) :: coeffb - real (kind=kind_phys) :: csigmafveg - real (kind=kind_phys) :: gsigma - real (kind=kind_phys) :: sigmaa - real (kind=kind_phys) :: cdmn - real (kind=kind_phys) :: kbsigmafveg - real (kind=kind_phys) :: reyn - real (kind=kind_phys) :: kbsigmaf0 - real (kind=kind_phys) :: kbsigmaf1 + real (kind=kind_phys) :: czil ! Zilitinkevich factor + real (kind=kind_phys) :: coeff_a ! slope of Blumel99 eqn 40 Blumel99 eqn 41 + real (kind=kind_phys) :: coeff_b ! intercept of Blumel99 eqn 40 Blumel99 eqn 42 + real (kind=kind_phys) :: c_sigma_fveg ! estimated C factor Blumel99 eqn 40 + real (kind=kind_phys) :: g_sigma ! weighting function Blumel99 eqn 22 + real (kind=kind_phys) :: sigma_a ! momentum partition factor Blumel99 eqn 8 + real (kind=kind_phys) :: cdmn ! grid neutral momentum drag coefficient Blumel99 eqn 21 + real (kind=kind_phys) :: reyn ! roughness Reynolds number Blumel99 eqn 36c + real (kind=kind_phys) :: kb_sigma_f0 ! bare ground kb^-1 Blumel99 eqn 36ab + real (kind=kind_phys) :: kb_sigma_f1 ! vegetated kb^-1 Blumel99 eqn 38 + real (kind=kind_phys) :: kb_sigma_fveg! grid estimated kb^-1 Blumel99 eqn 34 + + integer, parameter :: bare_flag = 0, vegetated_flag = 1, composite_flag = 2 + integer, parameter :: z0heqz0m = 1, & + chen09 = 2, & + tessel = 3, & + blumel99 = 4 + real (kind=kind_phys), parameter :: blumel_gamma = 0.5, & + blumel_zeta = 1.0, & + viscosity = 1.5e-5 ! ------------------------------------------------------------------------------------------------- - czil1 = 0.5 - coeffa = 0.0 - coeffb = 0.0 - csigmafveg= 0.0 - gsigma = 0.0 - cdmn = 0.0 - reyn = 0.0 - sigmaa = 0.0 - kbsigmafveg = 0.0 - kbsigmaf0 = 0.0 - kbsigmaf1 = 0.0 - if( icom == 2 )then - if (opt_trs == 1) then - z0mt = fveg * z0m + (1.0 - fveg) * z0mg - z0ht = z0mt - elseif (opt_trs == 2) then - z0mt = fveg * z0m + (1.0 - fveg) * z0mg - czil1=10.0 ** (- 0.4 * parameters%hvt) - z0ht = fveg * z0m*exp(-czil1*0.4*258.2*sqrt(ustarx*z0m)) & - +(1.0 - fveg) * z0mg*exp(-czil1*0.4*258.2*sqrt(ustarx*z0mg)) - elseif (opt_trs == 3) then - z0mt = fveg * z0m + (1.0 - fveg) * z0mg - if (vegtyp.le.5) then - z0ht = fveg * z0m + (1.0 - fveg) * z0mg*0.1 + czil = 0.5 + coeff_a = 0.0 + coeff_b = 0.0 + c_sigma_fveg = 0.0 + g_sigma = 0.0 + cdmn = 0.0 + reyn = 0.0 + sigma_a = 0.0 + kb_sigma_fveg = 0.0 + kb_sigma_f0 = 0.0 + kb_sigma_f1 = 0.0 + + surface_flag_select : select case(surface_flag) + + case (composite_flag) ! calculate grid based z0m and z0h + + if (opt_trs == z0heqz0m) then + + z0m_out = exp(fveg * log(z0m) + (1.0 - fveg) * log(z0mg)) + z0h_out = z0m_out + + elseif (opt_trs == chen09) then + + z0m_out = exp(fveg * log(z0m) + (1.0 - fveg) * log(z0mg)) + czil = 10.0 ** (- 0.4 * parameters%hvt) + + reyn = ustarx*z0m_out/viscosity ! Blumel99 eqn 36c + if (reyn > 2.0) then + kb_sigma_f0 = 2.46*reyn**0.25 - log(7.4) ! Blumel99 eqn 36a else - z0ht = fveg * z0m*0.01 + (1.0 - fveg) * z0mg*0.1 + kb_sigma_f0 = - log(0.397) ! Blumel99 eqn 36b endif - elseif (opt_trs == 4) then - coeffa = (csigmaf0 - csigmaf1)/(1.0 - exp(-1.0*aone)) - coeffb = csigmaf0 - coeffa - csigmafveg = coeffa * exp(-1.0*aone*fveg) + coeffb - gsigma = fveg**0.5 + fveg*(1.0-fveg)*1.0 -! -! 0.5 ~ 1.0 for the 0.5 place; 0 ~ 1.0 for the 1.0 place, adjustable empirical + z0h_out = exp( fveg * log(z0m * exp(-czil*0.4*258.2*sqrt(ustarx*z0m))) + & + (1.0 - fveg) * log(max(z0m/exp(kb_sigma_f0),1.0e-6)) ) + + elseif (opt_trs == tessel) then + + z0m_out = exp(fveg * log(z0m) + (1.0 - fveg) * log(z0mg)) + if (vegtyp <= 5) then + z0h_out = fveg * log(z0m) + (1.0 - fveg) * log(z0mg * 0.1) + else + z0h_out = fveg * log(z0m * 0.01) + (1.0 - fveg) * log(z0mg * 0.1) + endif + + elseif (opt_trs == blumel99) then + + coeff_a = (c_sigma_f0 - c_sigma_f1)/(1.0 - exp(-1.0*a1)) ! Blumel99 eqn 41 + coeff_b = c_sigma_f0 - coeff_a ! Blumel99 eqn 42 + c_sigma_fveg = coeff_a * exp(-1.0*a1*fveg) + coeff_b ! Blumel99 eqn 40 + +! blumel_gamma = 0.5 ~ 1.0 and blumel_zeta = 0 ~ 1.0, adjustable empirical ! canopy roughness geometry parameter; currently fveg = 0.78 has the largest ! momentum flux; can test the fveg-based average by setting 0.5 to 1.0 and 1.0 -! to 0.0 ! see Blumel; JAM,1998 -! +! to 0.0 ! see Blumel; JAM,1999 - cdmn = gsigma*cdmnv + (1.0-gsigma)*cdmng - z0mt = (zlvl - ezpd)*exp(-0.4/sqrt(cdmn)) + g_sigma = fveg**blumel_gamma + fveg*(1.0-fveg)*blumel_zeta ! Blumel99 eqn 22 + cdmn = g_sigma*cdmn_v + (1.0-g_sigma)*cdmn_g ! Blumel99 eqn 21 + z0m_out = (zlvl - ezpd)*exp(-0.4/sqrt(cdmn)) ! Blumel99 eqn 24 + kb_sigma_fveg = c_sigma_fveg/log((zlvl-ezpd)/z0m_out) - & + log((zlvl-ezpd)/z0m_out) ! Blumel99 eqn 34 + z0h_out = z0m_out/exp(kb_sigma_fveg) - kbsigmafveg = csigmafveg/log((zlvl-ezpd)/z0mt) - log((zlvl-ezpd)/z0mt) - z0ht = z0mt/exp(kbsigmafveg) - endif - - elseif( icom == 0 )then - - z0mt = z0mg - if (opt_trs == 1) then - z0ht = z0mt - elseif (opt_trs == 2) then - czil1=10.0 ** (- 0.4 * parameters%hvt) - z0ht =z0mt*exp(-czil1*0.4*258.2*sqrt(ustarx*z0mt)) - elseif (opt_trs == 3) then - if (vegtyp.le.5) then - z0ht = z0mt - else - z0ht = z0mt*0.01 endif - elseif (opt_trs == 4) then - reyn = ustarx*z0mt/(1.5e-05) - if (reyn .gt. 2.0) then - kbsigmaf0 = 2.46*reyn**0.25 - log(7.4) - else - kbsigmaf0 = - log(0.397) + + case (bare_flag) ! calculate z0m and z0h over bare tile + + z0m_out = z0mg + + if (opt_trs == z0heqz0m) then + + z0h_out = z0m_out + + elseif (opt_trs == tessel) then + + if (vegtyp <= 5) then + z0h_out = z0m_out + else + z0h_out = z0m_out * 0.01 + endif + + elseif (opt_trs == blumel99 .or. opt_trs == chen09) then + + reyn = ustarx*z0m_out/viscosity ! Blumel99 eqn 36c + if (reyn > 2.0) then + kb_sigma_f0 = 2.46*reyn**0.25 - log(7.4) ! Blumel99 eqn 36a + else + kb_sigma_f0 = - log(0.397) ! Blumel99 eqn 36b + endif + + z0h_out = max(z0m_out/exp(kb_sigma_f0),1.0e-6) + c_sigma_f0 = log((zlvl-zpd)/z0m_out) * & + (log((zlvl-zpd)/z0m_out) + kb_sigma_f0) ! Blumel99 eqn 35 + endif - z0ht = max(z0mt/exp(kbsigmaf0),1.0e-6) - csigmaf0 = log((zlvl-zpd)/z0mt)*(log((zlvl-zpd)/z0mt) + kbsigmaf0) - endif + case (vegetated_flag) ! calculate z0m and z0h over vegetated tile - elseif( icom == 1 )then - - z0mt = z0m - if (opt_trs == 1) then - z0ht = z0mt - elseif (opt_trs == 2) then - czil1= 10.0 ** (- 0.4 * parameters%hvt) - z0ht = z0mt*exp(-czil1*0.4*258.2*sqrt(ustarx*z0mt)) - elseif (opt_trs == 3) then - if (vegtyp.le.5) then - z0ht = z0mt - else - z0ht = z0mt*0.01 - endif - elseif (opt_trs == 4) then - sigmaa = 1.0 - (0.5/(0.5+vaie))*exp(-vaie**2/8.0) - kbsigmaf1 = 16.4*(sigmaa*vaie**3)**(-0.25)*sqrt(parameters%dleaf*ur/log((zlvl-zpd)/z0mt)) - z0ht = z0mt/exp(kbsigmaf1) - csigmaf1 = log((zlvl-zpd)/z0mt)*(log((zlvl-zpd)/z0mt)+kbsigmaf1) ! for output for interpolation + z0m_out = z0m + + if (opt_trs == z0heqz0m) then + + z0h_out = z0m_out + + elseif (opt_trs == chen09) then + + czil = 10.0 ** (- 0.4 * parameters%hvt) + z0h_out = z0m_out * exp(-czil*0.4*258.2*sqrt(ustarx*z0m_out)) + + elseif (opt_trs == tessel) then + + if (vegtyp <= 5) then + z0h_out = z0m_out + else + z0h_out = z0m_out*0.01 endif - endif + + elseif (opt_trs == blumel99) then + + sigma_a = 1.0 - (0.5/(0.5+vaie)) * exp(-vaie**2/8.0) ! Blumel99 eqn 8 + kb_sigma_f1 = 16.4 * (sigma_a*vaie**3)**(-0.25) * & ! Blumel99 eqn 38 + sqrt(parameters%dleaf*ur/log((zlvl-zpd)/z0m_out)) + z0h_out = z0m_out/exp(kb_sigma_f1) + c_sigma_f1 = log((zlvl-zpd)/z0m_out)*(log((zlvl-zpd)/z0m_out)+kb_sigma_f1) ! Blumel99 eqn 39 + + endif + + end select surface_flag_select end subroutine thermalz0 @@ -5737,7 +6129,7 @@ end subroutine stomata !! air temperature, atmospheric water vapor pressure deficit at the lowest !! model level, and soil moisture (preferably unfrozen soil moisture rather !! than total). - subroutine canres (parameters,par ,sfctmp,rcsoil ,eah ,sfcprs , & !in + subroutine canres (parameters,ep_2,epsm1,par ,sfctmp,rcsoil ,eah ,sfcprs , & !in rc ,psn ,iloc ,jloc ) !out ! -------------------------------------------------------------------------------------------------- @@ -5759,6 +6151,8 @@ subroutine canres (parameters,par ,sfctmp,rcsoil ,eah ,sfcprs , & !in type (noahmp_parameters), intent(in) :: parameters !< integer, intent(in) :: iloc !< grid index integer, intent(in) :: jloc !< grid index + real (kind=kind_phys), intent(in) :: ep_2 !< + real (kind=kind_phys), intent(in) :: epsm1 !< real (kind=kind_phys), intent(in) :: par !< par absorbed per unit sunlit lai (w/m2) real (kind=kind_phys), intent(in) :: sfctmp !< canopy air temperature real (kind=kind_phys), intent(in) :: sfcprs !< surface pressure (pa) @@ -5791,8 +6185,8 @@ subroutine canres (parameters,par ,sfctmp,rcsoil ,eah ,sfcprs , & !in ! compute q2 and q2sat - q2 = 0.622 * eah / (sfcprs - 0.378 * eah) !specific humidity [kg/kg] - q2 = q2 / (1.0 + q2) !mixing ratio [kg/kg] + q2 = ep_2 * eah / (sfcprs + epsm1 * eah) !specific humidity [kg/kg] + q2 = q2 / (1.0 - q2) !mixing ratio [kg/kg] call calhum(parameters,sfctmp, sfcprs, q2sat, dqsdt2) @@ -8248,7 +8642,7 @@ subroutine infil (parameters,nsoil ,dt ,zsoil ,sh2o ,sice , & !in call wdfcnd2 (parameters,wdf,wcnd,sh2o(1),sicemax,1) infmax = max (infmax,wcnd) - infmax = min (infmax,px) + infmax = min (infmax,px/dt) runsrf= max(0., qinsur - infmax) pddum = qinsur - runsrf @@ -8715,7 +9109,8 @@ subroutine groundwater(parameters,nsnow ,nsoil ,dt ,sice ,zsoil , & !in fff = parameters%bexp(iwt) / 3.0 ! calibratable, c.he changed based on gy niu's update rsbmx = hk(iwt) * 1.0e3 * exp(3.0) ! mm/s, calibratable, c.he changed based on gy niu's update - qdis = (1.0-fcrmax)*rsbmx*exp(-parameters%timean)*exp(-fff*(zwt-2.0)) +! qdis = (1.0-fcrmax)*rsbmx*exp(-parameters%timean)*exp(-fff*(zwt-2.0)) + qdis = (1.0-fcrmax)*rsbmx*exp(-parameters%timean)*exp(-fff*zwt) ! c.he changed based on gy niu's update ! matric potential at the layer above the water table @@ -8726,7 +9121,9 @@ subroutine groundwater(parameters,nsnow ,nsoil ,dt ,sice ,zsoil , & !in ! recharge rate qin to groundwater - ka = hk(iwt) +! ka = hk(iwt) +! harmonic average, c.he changed based on gy niu's update + ka = 2.0*(hk(iwt)*parameters%dksat(iwt)*1.0e3) / (hk(iwt)+parameters%dksat(iwt)*1.0e3) wh_zwt = - zwt * 1.e3 !(mm) wh = smpfz - znode(iwt)*1.e3 !(mm) @@ -10023,9 +10420,10 @@ end subroutine psn_crop !>\ingroup NoahMP_LSM !! - subroutine noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz , & - iopt_inf ,iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot, iopt_stc, & - iopt_rsf , iopt_soil, iopt_pedo, iopt_crop ,iopt_trs ) + subroutine noahmp_options(idveg , iopt_crs , iopt_btr , iopt_run , iopt_sfc , iopt_frz , & + iopt_inf, iopt_rad , iopt_alb , iopt_snf , iopt_tbot, iopt_stc , & + iopt_rsf, iopt_soil, iopt_pedo, iopt_crop, iopt_trs , iopt_diag, & + iopt_z0m ) implicit none @@ -10048,6 +10446,8 @@ subroutine noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc integer, intent(in) :: iopt_pedo !< pedo-transfer function (1->saxton and rawls) integer, intent(in) :: iopt_crop !< crop model option (0->none; 1->liu et al.) integer, intent(in) :: iopt_trs !< thermal roughness scheme option (1->z0h=z0; 2->rb reversed) + integer, intent(in) :: iopt_diag !< surface 2m t/q diagnostic approach + integer, intent(in) :: iopt_z0m !< momentum roughness length option ! ------------------------------------------------------------------------------------------------- @@ -10069,6 +10469,8 @@ subroutine noahmp_options(idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc opt_pedo = iopt_pedo opt_crop = iopt_crop opt_trs = iopt_trs + opt_diag = iopt_diag + opt_z0m = iopt_z0m end subroutine noahmp_options @@ -10370,13 +10772,13 @@ subroutine sfcdif4(iloc ,jloc ,ux ,vx ,t1d , & if ( present(iz0tlnd) ) then if ( iz0tlnd .le. 1 ) then call zilitinkevich_1995(znt,zt,zq,restar,& - ust,vkc,1.0,iz0tlnd,0,0.0) + ust,vkc,1.0_kind_phys,iz0tlnd,0,0.0_kind_phys) elseif ( iz0tlnd .eq. 2 ) then call yang_2008(znt,zt,zq,ust,molx,& qstar,restar,visc) elseif ( iz0tlnd .eq. 3 ) then !original mynn in wrf-arw used this form: - call garratt_1992(zt,zq,znt,restar,1.0) + call garratt_1992(zt,zq,znt,restar,1.0_kind_phys) endif ! the GFS option is removed along with gfs_z0_lnd @@ -10385,7 +10787,7 @@ subroutine sfcdif4(iloc ,jloc ,ux ,vx ,t1d , & !default to zilitinkevich call zilitinkevich_1995(znt,zt,zq,restar,& - ust,vkc,1.0,0,0,0.0) + ust,vkc,1.0_kind_phys,0,0,0.0_kind_phys) endif endif @@ -11120,7 +11522,7 @@ real*8 function psim_unstable_full(zolf) x=(1.-16.*zolf)**.25 !psimk=2*alog(0.5*(1+x))+alog(0.5*(1+x*x))-2.*atan(x)+2.*atan(1.) - psimk=2.*alog(0.5*(1+x))+alog(0.5*(1+x*x))-2.*atan(x)+2.*atan1 + psimk=2.*log(0.5*(1+x))+log(0.5*(1+x*x))-2.*atan(x)+2.*atan1 ym=(1.-10.*zolf)**onethird !psimc=(3./2.)*log((ym**2.+ym+1.)/3.)-sqrt(3.)*atan((2.*ym+1)/sqrt(3.))+4.*atan(1.)/sqrt(3.) diff --git a/physics/mp_nssl.F90 b/physics/mp_nssl.F90 index 4e0e323ce..59ca877fa 100644 --- a/physics/mp_nssl.F90 +++ b/physics/mp_nssl.F90 @@ -31,7 +31,7 @@ subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, & con_t0c, con_cliq, con_csol, con_eps, & imp_physics, imp_physics_nssl, & nssl_cccn, nssl_alphah, nssl_alphahl, & - nssl_alphar, nssl_ehw0_in, nssl_ehlw0_in, & + nssl_alphar, nssl_ehw0, nssl_ehlw0, & nssl_ccn_on, nssl_hail_on, nssl_invertccn ) @@ -53,7 +53,7 @@ subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, & integer, intent(in) :: imp_physics integer, intent(in) :: imp_physics_nssl real(kind_phys), intent(in) :: nssl_cccn, nssl_alphah, nssl_alphahl - real(kind_phys), intent(in) :: nssl_alphar, nssl_ehw0_in, nssl_ehlw0_in + real(kind_phys), intent(in) :: nssl_alphar, nssl_ehw0, nssl_ehlw0 logical, intent(in) :: nssl_ccn_on, nssl_hail_on, nssl_invertccn ! Local variables: dimensions used in nssl_init @@ -117,7 +117,7 @@ subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, & nssl_params(11) = 0 ! nssl_ipelec_tmp nssl_params(12) = 11 ! nssl_isaund nssl_params(13) = 0 ! 1= turn on cccna; 0 = turn off - nssl_params(14) = nssl_alphar + nssl_params(15) = nssl_alphar nssl_qccn = nssl_cccn/1.225 ! if (mpirank==mpiroot) then @@ -132,7 +132,7 @@ subroutine mp_nssl_init(ncol, nlev, errflg, errmsg, threads, restart, & ! write(0,*) 'call nssl_2mom_init' CALL nssl_2mom_init(ims,ime, jms,jme, kms,kme,nssl_params,ipctmp=5,mixphase=0, & - ihvol=ihailv,nssl_ehw0=nssl_ehw0_in,nssl_ehlw0=nssl_ehlw0_in,errmsg=errmsg,errflg=errflg,myrank=mpirank,mpiroot=mpiroot) + ihvol=ihailv,nssl_ehw0=nssl_ehw0,nssl_ehlw0=nssl_ehlw0,errmsg=errmsg,errflg=errflg,myrank=mpirank,mpiroot=mpiroot) ! For restart runs, the init is done here if (restart) then diff --git a/physics/mp_nssl.meta b/physics/mp_nssl.meta index c7e398f0a..6bbf92c73 100644 --- a/physics/mp_nssl.meta +++ b/physics/mp_nssl.meta @@ -173,7 +173,7 @@ type = real kind = kind_phys intent = in -[nssl_ehw0_in] +[nssl_ehw0] standard_name = nssl_graupel_collection_efficiency long_name = graupel droplet collection efficiency in NSSL microphysics scheme units = none @@ -181,7 +181,7 @@ type = real kind = kind_phys intent = in -[nssl_ehlw0_in] +[nssl_ehlw0] standard_name = nssl_hail_collection_efficiency long_name = hail droplet collection efficiency in NSSL microphysics scheme units = none diff --git a/physics/mp_thompson.F90 b/physics/mp_thompson.F90 index e62e8a596..6a95a706c 100644 --- a/physics/mp_thompson.F90 +++ b/physics/mp_thompson.F90 @@ -151,6 +151,10 @@ subroutine mp_thompson_init(ncol, nlev, con_g, con_rd, con_eps, & !> - Convert specific humidity to water vapor mixing ratio. !> - Also, hydrometeor variables are mass or number mixing ratio !> - either kg of species per kg of dry air, or per kg of (dry + vapor). + if (merra2_aerosol_aware) then + call get_niwfa(aerfld, nifa, nwfa, ncol, nlev) + end if + qv = spechum/(1.0_kind_phys-spechum) @@ -163,7 +167,7 @@ subroutine mp_thompson_init(ncol, nlev, con_g, con_rd, con_eps, & ni = ni/(1.0_kind_phys-spechum) nr = nr/(1.0_kind_phys-spechum) - if (is_aerosol_aware) then + if (is_aerosol_aware .or. merra2_aerosol_aware) then nc = nc/(1.0_kind_phys-spechum) nwfa = nwfa/(1.0_kind_phys-spechum) nifa = nifa/(1.0_kind_phys-spechum) @@ -208,8 +212,6 @@ subroutine mp_thompson_init(ncol, nlev, con_g, con_rd, con_eps, & nwfa(i,k) = naCCN1+naCCN0*exp(-((hgt(i,k)-hgt(i,1))/1000.)*niCCN3) enddo enddo - else if (merra2_aerosol_aware) then - call get_niwfa(aerfld, nifa, nwfa, ncol, nlev) else if (mpirank==mpiroot) write(*,*) ' Apparently initial CCN aerosols are present.' if (MAXVAL(nwfa2d) .lt. eps) then @@ -555,6 +557,9 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & else dtstep = dtp end if + if (merra2_aerosol_aware) then + call get_niwfa(aerfld, nifa, nwfa, ncol, nlev) + end if !> - Convert specific humidity to water vapor mixing ratio. !> - Also, hydrometeor variables are mass or number mixing ratio @@ -574,7 +579,7 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & ni = ni/(1.0_kind_phys-spechum) nr = nr/(1.0_kind_phys-spechum) - if (is_aerosol_aware) then + if (is_aerosol_aware .or. merra2_aerosol_aware) then nc = nc/(1.0_kind_phys-spechum) nwfa = nwfa/(1.0_kind_phys-spechum) nifa = nifa/(1.0_kind_phys-spechum) @@ -681,9 +686,6 @@ subroutine mp_thompson_run(ncol, nlev, con_g, con_rd, & ncten3 => diag3d(:,:,36:36) qcten3 => diag3d(:,:,37:37) end if set_extended_diagnostic_pointers - if (merra2_aerosol_aware) then - call get_niwfa(aerfld, nifa, nwfa, ncol, nlev) - end if !> - Call mp_gt_driver() with or without aerosols, with or without effective radii, ... if (is_aerosol_aware .or. merra2_aerosol_aware) then call mp_gt_driver(qv=qv, qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, & @@ -921,8 +923,8 @@ subroutine get_niwfa(aerfld, nifa, nwfa, ncol, nlev) aerfld(:,:,4)/1011.5142+ aerfld(:,:,5)/5683.3501)*1.e15 nwfa=((aerfld(:,:,6)/0.0045435214+aerfld(:,:,7)/0.2907854+aerfld(:,:,8)/12.91224+ & - aerfld(:,:,9)/206.2216+ aerfld(:,:,10)/4326.23)*1.+aerfld(:,:,11)/0.3053104*5+ & - aerfld(:,:,15)/0.3232698*1)*1.e15 + aerfld(:,:,9)/206.2216+ aerfld(:,:,10)/4326.23)*9.+aerfld(:,:,11)/0.3053104*5+ & + aerfld(:,:,15)/0.3232698*8)*1.e15 end subroutine get_niwfa end module mp_thompson diff --git a/physics/noahmp_tables.f90 b/physics/noahmp_tables.f90 index 2e3e2920e..3b06d7f53 100644 --- a/physics/noahmp_tables.f90 +++ b/physics/noahmp_tables.f90 @@ -8,983 +8,250 @@ !! only the data in the noah_mp_modis_parameters section of MPTABLE.TBL and the STAS section of !! SOILPARM.TBL are included in this module. module noahmp_tables - +use machine , only : kind_phys implicit none integer, private, parameter :: mvt = 30 ! use 30 instead of 27 integer, private, parameter :: mband = 2 - integer, private, parameter :: msc = 8 + integer, private, parameter :: msc = 20 integer, private, parameter :: max_soiltyp = 30 integer, private, parameter :: ncrop = 5 integer, private, parameter :: nstage = 8 - - integer :: i - integer, private, parameter :: slcats = 30 + integer, private, parameter :: num_slope = 9 ! mptable.tbl vegetation parameters - integer :: isurban_table = 13 - integer :: iswater_table = 17 - integer :: isbarren_table = 16 - integer :: isice_table = 15 - integer :: iscrop_table = 12 - integer :: eblforest_table = 2 - integer :: natural_table = 14 - integer :: low_density_residential_table = 31 - integer :: high_density_residential_table = 32 - integer :: high_intensity_industrial_table = 33 - -! - real :: ch2op_table(mvt) !< maximum intercepted h2o per unit lai+sai (mm) - - data ( ch2op_table(i),i=1,mvt) / 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, & - & 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, & - & 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, & - & 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: dleaf_table(mvt) !< characteristic leaf dimension (m) - data ( dleaf_table(i),i=1,mvt) / 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, & - & 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, & - & 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, & - & 0.04, 0.04, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: z0mvt_table(mvt) !< momentum roughness length (m) - data ( z0mvt_table(i),i=1,mvt) / 1.09, 1.10, 0.85, 0.80, 0.80, 0.20, & - & 0.06, 0.60, 0.50, 0.12, 0.30, 0.15, & - & 1.00, 0.14, 0.00, 0.00, 0.00, 0.30, & - & 0.20, 0.03, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - -! - - real :: hvt_table(mvt) !< top of canopy (m) - data ( hvt_table(i),i=1,mvt) / 20.0, 20.0, 18.0, 16.0, 16.0, 1.10, & - & 1.10, 13.0, 10.0, 1.00, 5.00, 2.00, & - & 15.0, 1.50, 0.00, 0.00, 0.00, 4.00, & - & 2.00, 0.50, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: hvb_table(mvt) !< bottom of canopy (m) - data ( hvb_table(i),i=1,mvt) / 8.50, 8.00, 7.00, 11.5, 10.0, 0.10, & - & 0.10, 0.10, 0.10, 0.05, 0.10, 0.10, & - & 1.00, 0.10, 0.00, 0.00, 0.00, 0.30, & - & 0.20, 0.10, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: den_table(mvt) !< tree density (no. of trunks per m2) - data ( den_table (i),i=1,mvt) / 0.28, 0.02, 0.28, 0.10, 0.10, 10.0, & - & 10.0, 10.0, 0.02, 100., 5.05, 25.0, & - & 0.01, 25.0, 0.00, 0.01, 0.01, 1.00, & - & 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / -! - real :: rc_table(mvt) !< tree crown radius (m) - - data ( rc_table (i),i=1,mvt) / 1.20, 3.60, 1.20, 1.40, 1.40, 0.12, & - & 0.12, 0.12, 3.00, 0.03, 0.75, 0.08, & - & 1.00, 0.08, 0.00, 0.01, 0.01, 0.30, & - & 0.30, 0.30, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: mfsno_table(mvt) !< snowmelt curve parameter () - data ( mfsno_table(i),i=1,mvt) / 1.00, 1.00, 1.00, 1.00, 1.00, 2.00, & - & 2.00, 2.00, 2.00, 2.00, 3.00, 3.00, & - & 4.00, 4.00, 2.50, 3.00, 3.00, 3.50, & - & 3.50, 3.50, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: scffac_table(mvt) !< snow cover factor (m) - data (scffac_table(i),i=1,mvt) / 0.005, 0.005, 0.005, 0.005, 0.005, & - & 0.008, 0.008, 0.010, 0.010, 0.010, & - & 0.010, 0.007, 0.021, 0.013, 0.015, & - & 0.008, 0.015, 0.015, 0.015, 0.015, & - & 0.000, 0.000, 0.000, 0.000, 0.000, & - & 0.000, 0.000, 0.000, 0.000, 0.000 / - -! - - real :: saim_table(mvt,12) !< monthly stem area index, one-sided - - data (saim_table (i,1),i=1,mvt) / 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, & - & 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, & - & 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - -! &_______________________________________________________________________& - - data (saim_table (i,2),i=1,mvt) / 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, & - & 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, & - & 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (saim_table (i,3),i=1,mvt) / 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, & - & 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, & - & 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (saim_table (i,4),i=1,mvt) / 0.3, 0.5, 0.4, 0.4, 0.4, 0.3, & - & 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, & - & 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -! &_______________________________________________________________________& - - data (saim_table (i,5),i=1,mvt) / 0.4, 0.5, 0.4, 0.4, 0.4, 0.3, & - & 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, & - & 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (saim_table (i,6),i=1,mvt) / 0.5, 0.5, 0.7, 0.4, 0.4, 0.3, & - & 0.2, 0.4, 0.4, 0.4, 0.4, 0.3, & - & 0.0, 0.4, 0.0, 0.0, 0.0, 0.2, & - & 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (saim_table (i,7),i=1,mvt) / 0.5, 0.5, 1.3, 0.9, 0.7, 0.6, & - & 0.4, 0.7, 0.8, 0.8, 0.6, 0.4, & - & 0.0, 0.6, 0.0, 0.0, 0.0, 0.4, & - & 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -! &_______________________________________________________________________& - - data (saim_table (i,8),i=1,mvt) / 0.6, 0.5, 1.2, 1.2, 0.8, 0.9, & - & 0.6, 1.2, 1.2, 1.3, 0.9, 0.5, & - & 0.0, 0.9, 0.0, 0.0, 0.0, 0.6, & - & 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (saim_table (i,9),i=1,mvt) / 0.6, 0.5, 1.0, 1.6, 1.0, 1.2, & - & 0.8, 1.4, 1.3, 1.1, 0.9, 0.4, & - & 0.0, 0.7, 0.0, 0.0, 0.0, 0.8, & - & 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (saim_table (i,10),i=1,mvt) / 0.7, 0.5, 0.8, 1.4, 1.0, 0.9, & - & 0.7, 1.1, 0.7, 0.4, 0.6, 0.3, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 0.7, & - & 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -! &_______________________________________________________________________& - - data (saim_table (i,11),i=1,mvt) / 0.6, 0.5, 0.6, 0.6, 0.5, 0.4, & - & 0.3, 0.5, 0.4, 0.4, 0.4, 0.3, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 0.3, & - & 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (saim_table (i,12),i=1,mvt) / 0.5, 0.5, 0.5, 0.4, 0.4, 0.3, & - & 0.2, 0.4, 0.4, 0.4, 0.3, 0.3, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, & - & 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -!! lai - real :: laim_table(mvt,12) !< monthly leaf area index, one-sided - - data (laim_table (i,1),i=1,mvt) / 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, & - & 0.0, 0.2, 0.3, 0.4, 0.2, 0.0, & - & 0.0, 0.2, 0.0, 0.0, 0.0, 1.0, & - & 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -! &_______________________________________________________________________& - - data (laim_table (i,2),i=1,mvt) / 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, & - & 0.0, 0.2, 0.3, 0.5, 0.3, 0.0, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 1.0, & - & 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (laim_table (i,3),i=1,mvt) / 4.0, 4.5, 0.0, 0.3, 2.2, 0.3, & - & 0.2, 0.4, 0.5, 0.6, 0.3, 0.0, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 1.1, & - & 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (laim_table (i,4),i=1,mvt) / 4.0, 4.5, 0.6, 1.2, 2.6, 0.9, & - & 0.6, 1.0, 0.8, 0.7, 0.5, 0.0, & - & 0.0, 0.4, 0.0, 0.0, 0.0, 1.3, & - & 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -! &_______________________________________________________________________& - - data (laim_table (i,5),i=1,mvt) / 4.0, 4.5, 1.2, 3.0, 3.5, 2.2, & - & 1.5, 2.4, 1.8, 1.2, 1.5, 1.0, & - & 0.0, 1.1, 0.0, 0.0, 0.0, 1.7, & - & 1.2, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (laim_table (i,6),i=1,mvt) / 4.0, 4.5, 2.0, 4.7, 4.3, 3.5, & - & 2.3, 4.1, 3.6, 3.0, 2.9, 2.0, & - & 0.0, 2.5, 0.0, 0.0, 0.0, 2.1, & - & 1.8, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (laim_table (i,7),i=1,mvt) / 4.0, 4.5, 2.6, 4.5, 4.3, 3.5, & - & 2.3, 4.1, 3.8, 3.5, 3.5, 3.0, & - & 0.0, 3.2, 0.0, 0.0, 0.0, 2.1, & - & 1.8, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -! &_______________________________________________________________________& - - data (laim_table (i,8),i=1,mvt) / 4.0, 4.5, 1.7, 3.4, 3.7, 2.5, & - & 1.7, 2.7, 2.1, 1.5, 2.7, 3.0, & - & 0.0, 2.2, 0.0, 0.0, 0.0, 1.8, & - & 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (laim_table (i,9),i=1,mvt) / 4.0, 4.5, 1.0, 1.2, 2.6, 0.9, & - & 0.6, 1.0, 0.9, 0.7, 1.2, 1.5, & - & 0.0, 1.1, 0.0, 0.0, 0.0, 1.3, & - & 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (laim_table (i,10),i=1,mvt) / 4.0, 4.5, 0.5, 0.3, 2.2, 0.3, & - & 0.2, 0.4, 0.5, 0.6, 0.3, 0.0, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 1.1, & - & 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -! &_______________________________________________________________________& - - data (laim_table (i,11),i=1,mvt) / 4.0, 4.5, 0.2, 0.0, 2.0, 0.0, & - & 0.0, 0.2, 0.3, 0.5, 0.3, 0.0, & - & 0.0, 0.3, 0.0, 0.0, 0.0, 1.0, & - & 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - data (laim_table (i,12),i=1,mvt) / 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, & - & 0.0, 0.2, 0.3, 0.4, 0.2, 0.0, & - & 0.0, 0.2, 0.0, 0.0, 0.0, 1.0, & - & 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: sla_table(mvt) !< single-side leaf area per kg [m2/kg] - data ( sla_table (i),i=1,mvt) / 80, 80, 80, 80, 80, 60, & - & 60, 60, 50, 60, 80, 80, & - & 60, 80, 0, 0, 0, 80, & - & 80, 80, 0, 0, 0, 0, & - & 0, 0, 0, 0, 0, 0 / - - real :: dilefc_table(mvt) !< coeficient for leaf stress death [1/s] - data (dilefc_table (i),i=1,mvt) / 1.20, 0.50, 1.80, 0.60, 0.80, 0.20, & - & 0.20, 0.20, 0.50, 0.20, 0.4, 0.50, & - & 0.00, 0.35, 0.00, 0.00, 0.00, 0.30, & - & 0.40, 0.30, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: dilefw_table(mvt) !< coeficient for leaf stress death [1/s] - data (dilefw_table(i),i=1,mvt) / 0.20, 4.00, 0.20, 0.20, 0.20, 0.20, & - & 0.20, 0.20, 0.50, 0.10, 0.2, 0.20, & - & 0.00, 0.20, 0.00, 0.00, 0.00, 0.20, & - & 0.20, 0.20, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: fragr_table(mvt) !< fraction of growth respiration !original was 0.3 - data ( fragr_table(i),i=1,mvt) / 0.10, 0.20, 0.10, 0.20, 0.10, 0.20, & - & 0.20, 0.20, 0.20, 0.20, 0.1, 0.20, & - & 0.00, 0.20, 0.00, 0.10, 0.00, 0.10, & - & 0.10, 0.10, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: ltovrc_table(mvt) !< leaf turnover [1/s] - data ( ltovrc_table(i),i=1,mvt) / 0.5, 0.55, 0.2, 0.55, 0.5, 0.65, & - & 0.65, 0.65, 0.65, 0.50, 1.4, 1.6, & - & 0.0, 1.2, 0.0, 0.0, 0.0, 1.3, & - & 1.4, 1.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -! - real :: c3psn_table(mvt) !< photosynthetic pathway: 0. = c4, 1. = c3 - data ( c3psn_table (i),i=1,mvt) / 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, & - & 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, & - & 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, & - & 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: kc25_table(mvt) !< co2 michaelis-menten constant at 25c (pa) - data ( kc25_table (i),i=1,mvt) / 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, & - & 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, & - & 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, & - & 30.0, 30.0, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: akc_table(mvt) !< q10 for kc25 - data ( akc_table (i),i=1,mvt) / 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, & - & 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, & - & 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, & - & 2.1, 2.1, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - - real :: ko25_table(mvt) !< o2 michaelis-menten constant at 25c (pa) - data ( ko25_table (i),i=1,mvt) / 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, & - & 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, & - & 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, & - & 3.e4, 3.e4, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - - real :: ako_table(mvt) !< q10 for ko25 - data ( ako_table (i),i=1,mvt) / 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, & - & 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, & - & 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, & - & 1.2, 1.2, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: vcmx25_table(mvt) !< maximum rate of carboxylation at 25c (umol co2/m**2/s) - data ( vcmx25_table(i),i=1,mvt) / 50.0, 60.0, 60.0, 60.0, 55.0, 40.0, & - & 40.0, 40.0, 40.0, 40.0, 50.0, 80.0, & - & 0.00, 60.0, 0.00, 0.00, 0.00, 50.0, & - & 50.0, 50.0, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - - real :: avcmx_table(mvt) !< q10 for vcmx25 - data ( avcmx_table (i),i=1,mvt) / 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, & - & 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, & - & 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, & - & 2.4, 2.4, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - - - real :: bp_table(mvt) !< minimum leaf conductance (umol/m**2/s) - data ( bp_table (i),i=1,mvt) / 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, & - & 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, & - & 1.e15, 2.e3,1.e15, 2.e3,1.e15, 2.e3, & - & 2.e3, 2.e3, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: mp_table(mvt) !< slope of conductance-to-photosynthesis relationship - data ( mp_table (i),i=1,mvt) / 6., 9., 6., 9., 9., 9., & - & 9., 9., 9., 9., 9., 9., & - & 9., 9., 9., 9., 9., 9., & - & 9., 9., 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: qe25_table(mvt) !< quantum efficiency at 25c (umol co2 / umo photon) - data ( qe25_table (i),i=1,mvt) / 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, & - & 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, & - & 0.00, 0.06, 0.00, 0.06, 0.00, 0.06, & - & 0.06, 0.06, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: aqe_table(mvt) !< q10 for qe25 - data ( aqe_table (i),i=1,mvt) / 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, & - & 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, & - & 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, & - & 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: rmf25_table(mvt) !< leaf maintenance respiration at 25c (umol co2/m**2/s) - data ( rmf25_table (i),i=1,mvt) / 3.00, 0.65, 4.00, 3.00, 3.00, 0.26, & - & 0.26, 0.26, 0.80, 1.80, 3.2, 1.00, & - & 0.00, 1.45, 0.00, 0.00, 0.00, 3.00, & - & 3.00, 3.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: rms25_table(mvt) !< stem maintenance respiration at 25c (umol co2/kg bio/s) - data ( rms25_table (i),i=1,mvt) / 0.90, 0.30, 0.64, 0.10, 0.80, 0.10, & - & 0.10, 0.10, 0.32, 0.10, 0.10, 0.10, & - & 0.00, 0.10, 0.00, 0.00, 0.00, 0.10, & - & 0.10, 0.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: rmr25_table(mvt) !< root maintenance respiration at 25c (umol co2/kg bio/s) - data ( rmr25_table (i),i=1,mvt) / 0.36, 0.05, 0.05, 0.01, 0.03, 0.00, & - & 0.00, 0.00, 0.01, 1.20, 0.0, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 2.11, & - & 2.11, 0.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: arm_table(mvt) !< q10 for maintenance respiration - data ( arm_table (i),i=1,mvt) / 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, & - & 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, & - & 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, & - & 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: folnmx_table(mvt) !< foliage nitrogen concentration when f(n)=1 (%) - data (folnmx_table (i),i=1,mvt) / 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, & - & 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, & - & 0.00, 1.5, 0.00, 1.5, 0.00, 1.5, & - & 1.5, 1.5, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: tmin_table(mvt) !< minimum temperature for photosynthesis (k) - data ( tmin_table (i),i=1,mvt) / 265, 273, 268, 273, 268, 273, & - & 273, 273, 273, 273, 268, 273, & - & 0, 273, 0, 0, 0, 268, & - & 268, 268, 0, 0, 0, 0, & - & 0, 0, 0, 0, 0, 0 / - - -! - real :: xl_table(mvt) !< leaf/stem orientation index - data ( xl_table (i),i=1,mvt) / 0.010,0.010,0.010,0.250,0.250,0.010, & - & 0.010, 0.010, 0.010, -0.30, -0.025, -0.30, & - & 0.000, -0.30, 0.000, 0.000, 0.000, 0.250, & - & 0.250, 0.250, 0.000, 0.000, 0.000, 0.000, & - & 0.001, 0.001, 0.000, 0.000, 0.000, 0.000 / -! - real :: rhol_table(mvt,mband) !< leaf reflectance: 1=vis, 2=nir - - data ( rhol_table (i,1),i=1,mvt) / 0.07, 0.10, 0.07, 0.10, 0.10, 0.07, & - & 0.07, 0.07, 0.10, 0.11, 0.105, 0.11, & - & 0.00, 0.11, 0.00, 0.00, 0.00, 0.10, & - & 0.10, 0.10, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - -! &_______________________________________________________________________& - - data ( rhol_table (i,2),i=1,mvt) / 0.35, 0.45, 0.35, 0.45, 0.45, 0.35, & - & 0.35, 0.35, 0.45, 0.58, 0.515, 0.58, & - & 0.00, 0.58, 0.00, 0.00, 0.00, 0.45, & - & 0.45, 0.45, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: rhos_table(mvt,mband) !< stem reflectance: 1=vis, 2=nir - - data ( rhos_table (i,1),i=1,mvt) / 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, & - & 0.16, 0.16, 0.16, 0.36, 0.26, 0.36, & - & 0.00, 0.36, 0.00, 0.00, 0.00, 0.16, & - & 0.16,0.16, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - data ( rhos_table (i,2),i=1,mvt) / 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, & - & 0.39, 0.39, 0.39, 0.58, 0.485, 0.58, & - & 0.00, 0.58, 0.00, 0.00, 0.00, 0.39, & - & 0.39, 0.39, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - -! &_______________________________________________________________________& - - real :: taul_table(mvt,mband) !< leaf transmittance: 1=vis, 2=nir -! - data ( taul_table (i,1),i=1,mvt) / 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, & - & 0.05, 0.05, 0.05, 0.07, 0.06, 0.07, & - & 0.00, 0.07, 0.00, 0.00, 0.00, 0.05, & - & 0.05, 0.05,0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - data ( taul_table (i,2),i=1,mvt) / 0.10, 0.25, 0.10, 0.25, 0.25, 0.10, & - & 0.10, 0.10, 0.25, 0.25, 0.25, 0.25, & - & 0.00, 0.25, 0.00, 0.00, 0.00, 0.25, & - & 0.25, 0.25, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: taus_table(mvt,mband) !< stem transmittance: 1=vis, 2=nir - data(taus_table (i,1),i=1,mvt) / 0.001,0.001,0.001,0.001,0.001, 0.001, & - & 0.001, 0.001, 0.001, 0.220, 0.1105,0.220, & - & 0.000, 0.220, 0.000, 0.000, 0.000, 0.001, & - & 0.001, 0.001, 0.000, 0.000, 0.000, 0.000, & - & 0.001, 0.001, 0.000, 0.000, 0.000, 0.000 / - - - data(taus_table (i,2),i=1,mvt) / 0.001,0.001,0.001,0.001,0.001, 0.001, & - & 0.001, 0.001, 0.001, 0.380, 0.1905, 0.380, & - & 0.000, 0.380, 0.000, 0.000, 0.000, 0.001, & - & 0.001, 0.001, 0.000, 0.000, 0.000, 0.000, & - & 0.001, 0.001, 0.000, 0.000, 0.000, 0.000 / - - - real :: mrp_table(mvt) !< microbial respiration parameter (umol co2 /kg c/ s) - data ( mrp_table (i),i=1,mvt) / 0.37, 0.23, 0.37, 0.40, 0.30, 0.19, & - & 0.19, 0.19, 0.40, 0.17,0.285, 0.23, & - & 0.00, 0.23, 0.00, 0.00, 0.00, 0.23, & - & 0.20, 0.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - -! - real :: cwpvt_table(mvt) !< empirical canopy wind parameter - data ( cwpvt_table (i),i=1,mvt) / 0.09, 0.335, 0.09, 0.335, 0.145, 0.50, & - & 1.00, 0.65, 0.50, 2.50, 0.585, 0.835, & - & 0.835, 0.835, 0.09, 0.09, 0.09, 0.335, & - & 0.50, 0.09, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - - real :: wrrat_table(mvt) !< wood to non-wood ratio - data ( wrrat_table (i),i=1,mvt) / 30.0, 30.0, 30.0, 30.0, 30.0, 3.00, & - & 3.00, 3.00, 3.00, 0.00, 15.0, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 3.00, & - & 3.00, 0.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: wdpool_table(mvt) !< wood pool (switch 1 or 0) depending on woody or not [-] - data ( wdpool_table(i),i=1,mvt) / 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, & - & 1.00, 1.00, 1.00, 0.00, 0.5, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, & - & 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: tdlef_table(mvt) !< characteristic t for leaf freezing [k] - data ( tdlef_table (i),i=1,mvt) / 278, 278, 268, 278, 268, 278, & - & 278, 278, 278, 278, 268, 278, & - & 278, 278, 0, 0, 0, 268, & - & 268, 268, 0, 0, 0, 0, & - & 0, 0, 0, 0, 0, 0 / - - - real :: nroot_table(mvt) !< number of soil layers with root present - data ( nroot_table (i),i=1,mvt) / 4, 4, 4, 4, 4, 3, & - & 3, 3, 3, 3, 2, 3, & - & 1, 3, 1, 1, 0, 3, & - & 3, 2, 0, 0, 0, 0, & - & 0, 0, 0, 0, 0, 0 / - - real :: rgl_table(mvt) !< parameter used in radiation stress function - data ( rgl_table (i),i=1,mvt) / 30.0, 30.0, 30.0, 30.0, 30.0, 100.0,& - & 100.0, 100.0, 65.0, 100.0, 65.0, 100.0, & - & 999.0, 100.0, 999.0, 999.0, 30.0, 100.0, & - & 100.0, 100.0, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: rs_table(mvt) !< minimum stomatal resistance [s m-1] - data ( rs_table (i),i=1,mvt) / 125.0, 150.0,150.0,100.0,125.0,300.0,& - & 170.0,300.0, 70.0, 40.0, 70.0, 40.0, & - & 200.0, 40.0, 999.0,999.0,100.0,150.0, & - & 150.0, 200.0,0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: hs_table(mvt) !< parameter used in vapor pressure deficit function - data ( hs_table (i),i=1,mvt) / 47.35,41.69,47.35,54.53,51.93,42.00, & - & 39.18, 42.00, 54.53, 36.35, 55.97, 36.25, & - & 999.0, 36.25, 999.0, 999.0, 51.75, 42.00, & - & 42.00, 42.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - - real :: topt_table(mvt) !< optimum transpiration air temperature [k] - data ( topt_table (i),i=1,mvt) / 298.0,298.0,298.0,298.0,298.0,298.0, & - & 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, & - & 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, & - & 298.0, 298.0, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: rsmax_table(mvt) !< maximal stomatal resistance [s m-1] - data ( rsmax_table (i),i=1,mvt) / 5000., 5000.,5000.,5000.,5000.,5000.,& - & 5000., 5000., 5000., 5000., 5000., 5000., & - & 5000., 5000., 5000., 5000., 5000., 5000., & - & 5000., 5000., 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - -!!!!!!!!!!!!!! Wield not defined but read !!!!!!!!!!!!!!!!1 - - real :: slarea_table(mvt) - - data (slarea_table (i),i=1,mvt) / 0.0090,0.0200,0.0200,0.0258,0.0223, & - & 0.0227, 0.0188, 0.0227, 0.0236, 0.0060, & - & 0.0295, 0.0200, 0.0228, 0.0223, 0.02, & - & 0.02, 0.0422, 0.02, 0.02, 0.02, & - & 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0 / - -! &_______________________________________________________________________& - - real :: esp1_table(mvt) - - data (esp1_table (i),i=1,mvt) / 0.46, 0.00, 0.00,46.86,30.98, 21.62, & - & 0.11, 21.62, 22.80, 0.02, 0.815, 0.00, & - & 41.87, 0.04, 0.0, 0.0, 2.31, 0.0, & - & 0.0, 0.0,0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - real :: esp2_table(mvt) - - data (esp2_table (i),i=1,mvt) / 3.34, 0.00, 0.00, 0.38, 0.96, 0.92, & - & 0.22, 0.92, 0.59, 0.05, 0.535, 0.00, & - & 0.98, 0.09, 0.0, 0.0, 1.47, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - - real :: esp3_table(mvt) - - data (esp3_table (i),i=1,mvt) / 1.85, 0.00, 0.00, 1.84, 1.84, 1.73, & - & 1.26, 1.73, 1.37, 0.03, 0.605, 0.00, & - & 1.82, 0.05, 0.0, 0.0, 1.70, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - - -! &_______________________________________________________________________& - - real :: esp4_table(mvt) - - data (esp4_table (i),i=1,mvt) / 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - real :: esp5_table(mvt) - - data (esp5_table (i),i=1,mvt) / 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, & - & 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 / - -!!!!!!!!!!!!!!!!!!! what are the tables used for !!!!!!!!!!!!!! + integer :: isurban_table + integer :: iswater_table + integer :: isbarren_table + integer :: isice_table + integer :: iscrop_table + integer :: eblforest_table + integer :: natural_table + integer :: lcz_1_table + integer :: lcz_2_table + integer :: lcz_3_table + integer :: lcz_4_table + integer :: lcz_5_table + integer :: lcz_6_table + integer :: lcz_7_table + integer :: lcz_8_table + integer :: lcz_9_table + integer :: lcz_10_table + integer :: lcz_11_table + real (kind=kind_phys) :: ch2op_table(mvt) !< maximum intercepted h2o per unit lai+sai (mm) + real (kind=kind_phys) :: dleaf_table(mvt) !< characteristic leaf dimension (m) + real (kind=kind_phys) :: z0mvt_table(mvt) !< momentum roughness length (m) + real (kind=kind_phys) :: hvt_table(mvt) !< top of canopy (m) + real (kind=kind_phys) :: hvb_table(mvt) !< bottom of canopy (m) + real (kind=kind_phys) :: z0mhvt_table(mvt) !< ratio of z0m to hvt + real (kind=kind_phys) :: den_table(mvt) !< tree density (no. of trunks per m2) + real (kind=kind_phys) :: rc_table(mvt) !< tree crown radius (m) + real (kind=kind_phys) :: mfsno_table(mvt) !< snowmelt curve parameter () + real (kind=kind_phys) :: scffac_table(mvt) !< snow cover factor (m) + real (kind=kind_phys) :: cbiom_table(mvt) !< canopy biomass heat capacity parameter (m) + real (kind=kind_phys) :: saim_table(mvt,12) !< monthly stem area index, one-sided + real (kind=kind_phys) :: laim_table(mvt,12) !< monthly leaf area index, one-sided + real (kind=kind_phys) :: sla_table(mvt) !< single-side leaf area per kg [m2/kg] + real (kind=kind_phys) :: dilefc_table(mvt) !< coeficient for leaf stress death [1/s] + real (kind=kind_phys) :: dilefw_table(mvt) !< coeficient for leaf stress death [1/s] + real (kind=kind_phys) :: fragr_table(mvt) !< fraction of growth respiration !original was 0.3 + real (kind=kind_phys) :: ltovrc_table(mvt) !< leaf turnover [1/s] + + real (kind=kind_phys) :: c3psn_table(mvt) !< photosynthetic pathway: 0. = c4, 1. = c3 + real (kind=kind_phys) :: kc25_table(mvt) !< co2 michaelis-menten constant at 25c (pa) + real (kind=kind_phys) :: akc_table(mvt) !< q10 for kc25 + real (kind=kind_phys) :: ko25_table(mvt) !< o2 michaelis-menten constant at 25c (pa) + real (kind=kind_phys) :: ako_table(mvt) !< q10 for ko25 + real (kind=kind_phys) :: vcmx25_table(mvt) !< maximum rate of carboxylation at 25c (umol co2/m**2/s) + real (kind=kind_phys) :: avcmx_table(mvt) !< q10 for vcmx25 + real (kind=kind_phys) :: bp_table(mvt) !< minimum leaf conductance (umol/m**2/s) + real (kind=kind_phys) :: mp_table(mvt) !< slope of conductance-to-photosynthesis relationship + real (kind=kind_phys) :: qe25_table(mvt) !< quantum efficiency at 25c (umol co2 / umo photon) + real (kind=kind_phys) :: aqe_table(mvt) !< q10 for qe25 + real (kind=kind_phys) :: rmf25_table(mvt) !< leaf maintenance respiration at 25c (umol co2/m**2/s) + real (kind=kind_phys) :: rms25_table(mvt) !< stem maintenance respiration at 25c (umol co2/kg bio/s) + real (kind=kind_phys) :: rmr25_table(mvt) !< root maintenance respiration at 25c (umol co2/kg bio/s) + real (kind=kind_phys) :: arm_table(mvt) !< q10 for maintenance respiration + real (kind=kind_phys) :: folnmx_table(mvt) !< foliage nitrogen concentration when f(n)=1 (%) + real (kind=kind_phys) :: tmin_table(mvt) !< minimum temperature for photosynthesis (k) + + real (kind=kind_phys) :: xl_table(mvt) !< leaf/stem orientation index + real (kind=kind_phys) :: rhol_table(mvt,mband) !< leaf reflectance: 1=vis, 2=nir + real (kind=kind_phys) :: rhos_table(mvt,mband) !< stem reflectance: 1=vis, 2=nir + real (kind=kind_phys) :: taul_table(mvt,mband) !< leaf transmittance: 1=vis, 2=nir + real (kind=kind_phys) :: taus_table(mvt,mband) !< stem transmittance: 1=vis, 2=nir + + real (kind=kind_phys) :: mrp_table(mvt) !< microbial respiration parameter (umol co2 /kg c/ s) + real (kind=kind_phys) :: cwpvt_table(mvt) !< empirical canopy wind parameter + + real (kind=kind_phys) :: wrrat_table(mvt) !< wood to non-wood ratio + real (kind=kind_phys) :: wdpool_table(mvt) !< wood pool (switch 1 or 0) depending on woody or not [-] + real (kind=kind_phys) :: tdlef_table(mvt) !< characteristic t for leaf freezing [k] + + real (kind=kind_phys) :: nroot_table(mvt) !< number of soil layers with root present + real (kind=kind_phys) :: rgl_table(mvt) !< parameter used in radiation stress function + real (kind=kind_phys) :: rs_table(mvt) !< minimum stomatal resistance [s m-1] + real (kind=kind_phys) :: hs_table(mvt) !< parameter used in vapor pressure deficit function + real (kind=kind_phys) :: topt_table(mvt) !< optimum transpiration air temperature [k] + real (kind=kind_phys) :: rsmax_table(mvt) !< maximal stomatal resistance [s m-1] ! soilparm.tbl parameters - real :: bexp_table(max_soiltyp) - - data (bexp_table(i), i=1,slcats) /2.79, 4.26, 4.74, 5.33, 3.86, 5.25,& - & 6.77, 8.72, 8.17, 10.73, 10.39, 11.55, & - & 5.25, 0.0, 2.79, 4.26, 11.55, 2.79, & - & 2.79, 0.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: smcdry_table(max_soiltyp) - data (smcdry_table(i), i=1,slcats) /0.010, 0.028, 0.047, 0.084, 0.061,& - & 0.066, 0.069, 0.120, 0.103, 0.100, 0.126, 0.138, & - & 0.066, 0.0, 0.006, 0.028, 0.030, 0.006, & - & 0.010, 0.000, 0.000, 0.000, 0.000, 0.000, & - & 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 / - - real :: f1_table(max_soiltyp) - - data (f1_table(i), i=1,slcats) /-0.472, -1.044, -0.569, 0.162, 0.162, & - & -0.327, -1.491, -1.118, -1.297, -3.209, -1.916, -2.138, & - & -0.327, 0.000, -1.111, -1.044, -10.472, -0.472, & - & -0.472, 0.000, 0.000, 0.000, 0.000, 0.000, & - & 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 / - - real :: smcmax_table(max_soiltyp) - - data (smcmax_table(i), i=1,slcats) /0.339, 0.421, 0.434, 0.476, 0.484,& - & 0.439, 0.404, 0.464, 0.465, 0.406, 0.468, 0.468, & - & 0.439, 1.000, 0.200, 0.421, 0.468, 0.200, & - & 0.339, 0.339, 0.000, 0.000, 0.000, 0.000, & - & 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 / - - real :: smcref_table(max_soiltyp) - - data (smcref_table(i), i=1,slcats) /0.192, 0.283, 0.312, 0.360, 0.347, & - & 0.329, 0.315, 0.387, 0.382, 0.338, 0.404, 0.412, & - & 0.329, 0.000, 0.170, 0.283, 0.454, 0.170, & - & 0.192, 0.000, 0.000, 0.000, 0.000, 0.000, & - & 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 / - - real :: psisat_table(max_soiltyp) - - data (psisat_table(i), i=1,slcats) /0.069, 0.036, 0.141, 0.759, 0.955, & - & 0.355, 0.135, 0.617, 0.263, 0.098, 0.324, 0.468, & - & 0.355, 0.00, 0.069, 0.036, 0.468, 0.069, & - & 0.069, 0.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: dksat_table(max_soiltyp) - - data (dksat_table(i), i=1,slcats) /4.66e-5, 1.41e-5, 5.23e-6, 2.81e-6, & - & 2.18e-6, 3.38e-6, 4.45e-6, 2.03e-6, 2.45e-6,7.22e-6, & - & 1.34e-6, 9.74e-7, 3.38e-6, 0.00, 1.41e-4, & - & 1.41e-5, 9.74e-7, 1.41e-4, 4.66e-5,0.0, & - & 0.00, 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: dwsat_table(max_soiltyp) - - data (dwsat_table(i), i=1,slcats) / 2.65e-5, 5.14e-6, 8.05e-6, & - & 2.39e-5, 1.66e-5, 1.43e-5, 1.01e-5, 2.35e-5, 1.13e-5, 1.87e-5, & - & 9.64e-6, 1.12e-5, 1.43e-5, 0.00, 1.36e-4, 5.14e-6, & - & 1.12e-5, 1.36e-4, 2.65e-5, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00 / - - real :: smcwlt_table(max_soiltyp) - - data (smcwlt_table(i), i=1,slcats) /0.010, 0.028, 0.047, 0.084, 0.061,& - & 0.066, 0.069, 0.120, 0.103, 0.100, 0.126, 0.138, & - & 0.066, 0.000, 0.006, 0.028, 0.030, 0.006, & - & 0.010, 0.000, 0.000, 0.000, 0.000, 0.000, & - & 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 / - - real :: quartz_table(max_soiltyp) - - data (quartz_table(i), i=1,slcats) /0.92, 0.82, 0.60, 0.25, 0.10, & - & 0.40, 0.60, 0.10, 0.35, 0.52, 0.10, & - & 0.25, 0.05, 0.60, 0.07, 0.25, 0.60, & - & 0.52, 0.92, 0.00, 0.00, 0.00, 0.00,0.00, & - & 0.00, 0.00, 0.00, 0.00, 0.00, 0.00 / - + integer :: slcats + + real (kind=kind_phys) :: bexp_table(max_soiltyp) + real (kind=kind_phys) :: smcdry_table(max_soiltyp) + real (kind=kind_phys) :: f1_table(max_soiltyp) + real (kind=kind_phys) :: smcmax_table(max_soiltyp) + real (kind=kind_phys) :: smcref_table(max_soiltyp) + real (kind=kind_phys) :: psisat_table(max_soiltyp) + real (kind=kind_phys) :: dksat_table(max_soiltyp) + real (kind=kind_phys) :: dwsat_table(max_soiltyp) + real (kind=kind_phys) :: smcwlt_table(max_soiltyp) + real (kind=kind_phys) :: quartz_table(max_soiltyp) + real (kind=kind_phys) :: bvic_table(max_soiltyp) !vic model infiltration parameter (-) for opt_run=6 + real (kind=kind_phys) :: axaj_table(max_soiltyp) !Xinanjiang: Tension water distribution inflection parameter [-] for opt_run=7 + real (kind=kind_phys) :: bxaj_table(max_soiltyp) !Xinanjiang: Tension water distribution shape parameter [-] for opt_run=7 + real (kind=kind_phys) :: xxaj_table(max_soiltyp) !Xinanjiang: Free water distribution shape parameter [-] for opt_run=7 + real (kind=kind_phys) :: bdvic_table(max_soiltyp) !VIC model infiltration parameter (-) + real (kind=kind_phys) :: gdvic_table(max_soiltyp) !mean capilary drive (m) + real (kind=kind_phys) :: bbvic_table(max_soiltyp) !heterogeniety parameter for DVIC infiltration [-] ! genparm.tbl parameters - real :: slope_table(9) !< slope factor for soil drainage - data (slope_table(i), i=1,9) /0.1, 0.6, 1.0, 0.35, 0.55, 0.8, & - & 0.63, 0.0, 0.0 / + real (kind=kind_phys) :: slope_table(num_slope) !< slope factor for soil drainage - real :: csoil_table = 2.00e+6 !< soil heat capacity [j m-3 k-1] - real :: refdk_table = 2.0e-6 !< parameter in the surface runoff parameterization - real :: refkdt_table = 3.0 !< parameter in the surface runoff parameterization - real :: frzk_table =0.15 !< frozen ground parameter - real :: zbot_table = -8.0 !< depth [m] of lower boundary soil temperature - real :: czil_table = 0.1 !< parameter used in the calculation of the roughness length for heat + real (kind=kind_phys) :: csoil_table !< soil heat capacity [j m-3 k-1] + real (kind=kind_phys) :: refdk_table !< parameter in the surface runoff parameterization + real (kind=kind_phys) :: refkdt_table !< parameter in the surface runoff parameterization + real (kind=kind_phys) :: frzk_table !< frozen ground parameter + real (kind=kind_phys) :: zbot_table !< depth [m] of lower boundary soil temperature + real (kind=kind_phys) :: czil_table !< parameter used in the calculation of the roughness length for heat ! mptable.tbl radiation parameters -! &_______________________________________________________________________& - real :: albsat_table(msc,mband) !< saturated soil albedos: 1=vis, 2=nir - data(albsat_table(i,1),i=1,8)/0.15,0.11,0.10,0.09,0.08,0.07,0.06,0.05/ - data(albsat_table(i,2),i=1,8)/0.30,0.22,0.20,0.18,0.16,0.14,0.12,0.10/ - - real :: albdry_table(msc,mband) !< dry soil albedos: 1=vis, 2=nir - data(albdry_table(i,1),i=1,8)/0.27,0.22,0.20,0.18,0.16,0.14,0.12,0.10/ - data(albdry_table(i,2),i=1,8)/0.54,0.44,0.40,0.36,0.32,0.28,0.24,0.20/ - - real :: albice_table(mband) !< albedo land ice: 1=vis, 2=nir - data (albice_table(i),i=1,mband) /0.80, 0.55/ - - real :: alblak_table(mband) !< albedo frozen lakes: 1=vis, 2=nir - data (alblak_table(i),i=1,mband) /0.60, 0.40/ - - real :: omegas_table(mband) !< two-stream parameter omega for snow - data (omegas_table(i),i=1,mband) /0.8, 0.4/ - - real :: betads_table = 0.5 !< two-stream parameter betad for snow - real :: betais_table = 0.5 !< two-stream parameter betad for snow - - real :: eg_table(2) !< emissivity - data eg_table /0.97, 0.98 / - - real :: betads, betais - data betads, betais /0.5, 0.5/ - + real (kind=kind_phys) :: albsat_table(msc,mband) !< saturated soil albedos: 1=vis, 2=nir + real (kind=kind_phys) :: albdry_table(msc,mband) !< dry soil albedos: 1=vis, 2=nir + real (kind=kind_phys) :: albice_table(mband) !< albedo land ice: 1=vis, 2=nir + real (kind=kind_phys) :: alblak_table(mband) !< albedo frozen lakes: 1=vis, 2=nir + real (kind=kind_phys) :: omegas_table(mband) !< two-stream parameter omega for snow + real (kind=kind_phys) :: betads_table !< two-stream parameter betad for snow + real (kind=kind_phys) :: betais_table !< two-stream parameter betad for snow + real (kind=kind_phys) :: eg_table(2) !< emissivity ! mptable.tbl global parameters - real :: co2_table = 395.e-06 !< co2 partial pressure - real :: o2_table = 0.209 !< o2 partial pressure - real :: timean_table = 10.5 !< gridcell mean topgraphic index (global mean) - real :: fsatmx_table = 0.38 !< maximum surface saturated fraction (global mean) - - real :: z0sno_table = 0.002 !< snow surface roughness length (m) (0.002) - real :: ssi_table = 0.03 !< liquid water holding capacity for snowpack (m3/m3) (0.03) - real :: snow_ret_fac_table = 5.e-5 !< snowpack water release timescale factor (1/s) - real :: swemx_table = 1.00 !< new snow mass to fully cover old snow (mm) - - real :: tau0_table = 1.e6 !< tau0 from yang97 eqn. 10a - real :: grain_growth_table = 5000. !< growth from vapor diffusion yang97 eqn. 10b - real :: extra_growth_table = 10. !< extra growth near freezing yang97 eqn. 10c - real :: dirt_soot_table = 0.3 !< dirt and soot term yang97 eqn. 10d - real :: bats_cosz_table = 2.0 !< zenith angle snow albedo adjustment; b in yang97 eqn. 15 - real :: bats_vis_new_table = 0.95 !< new snow visible albedo - real :: bats_nir_new_table = 0.65 !< new snow nir albedo - real :: bats_vis_age_table = 0.2 !< age factor for diffuse visible snow albedo yang97 eqn. 17 - real :: bats_nir_age_table = 0.5 !< age factor for diffuse nir snow albedo yang97 eqn. 18 - real :: bats_vis_dir_table = 0.4 !< cosz factor for direct visible snow albedo yang97 eqn. 15 - real :: bats_nir_dir_table = 0.4 !< cosz factor for direct nir snow albedo yang97 eqn. 16 - real :: rsurf_snow_table = 50.0 !< surface resistance for snow(s/m) - real :: rsurf_exp_table = 5.0 !< exponent in the shape parameter for soil resistance option 1 - real :: snow_emis_table = 0.95 !< surface emissivity - - -! Noah mp crops -! mptable.tbl crop parameters -! ! NCROP = 5 -! 1: Corn -! 2: Soybean -! 3: Sorghum -! 4: Rice -! 5: Winter wheat + real (kind=kind_phys) :: co2_table !< co2 partial pressure + real (kind=kind_phys) :: o2_table !< o2 partial pressure + real (kind=kind_phys) :: timean_table !< gridcell mean topgraphic index (global mean) + real (kind=kind_phys) :: fsatmx_table !< maximum surface saturated fraction (global mean) + real (kind=kind_phys) :: z0sno_table !< snow surface roughness length (m) (0.002) + real (kind=kind_phys) :: ssi_table !< liquid water holding capacity for snowpack (m3/m3) (0.03) + real (kind=kind_phys) :: snow_ret_fac_table !< snowpack water release timescale factor (1/s) + real (kind=kind_phys) :: snow_emis_table !< surface emissivity + real (kind=kind_phys) :: swemx_table !< new snow mass to fully cover old snow (mm) + real (kind=kind_phys) :: tau0_table !< tau0 from yang97 eqn. 10a + real (kind=kind_phys) :: grain_growth_table !< growth from vapor diffusion yang97 eqn. 10b + real (kind=kind_phys) :: extra_growth_table !< extra growth near freezing yang97 eqn. 10c + real (kind=kind_phys) :: dirt_soot_table !< dirt and soot term yang97 eqn. 10d + real (kind=kind_phys) :: bats_cosz_table !< zenith angle snow albedo adjustment; b in yang97 eqn. 15 + real (kind=kind_phys) :: bats_vis_new_table !< new snow visible albedo + real (kind=kind_phys) :: bats_nir_new_table !< new snow nir albedo + real (kind=kind_phys) :: bats_vis_age_table !< age factor for diffuse visible snow albedo yang97 eqn. 17 + real (kind=kind_phys) :: bats_nir_age_table !< age factor for diffuse nir snow albedo yang97 eqn. 18 + real (kind=kind_phys) :: bats_vis_dir_table !< cosz factor for direct visible snow albedo yang97 eqn. 15 + real (kind=kind_phys) :: bats_nir_dir_table !< cosz factor for direct nir snow albedo yang97 eqn. 16 + real (kind=kind_phys) :: rsurf_snow_table !< surface resistance for snow(s/m) + real (kind=kind_phys) :: rsurf_exp_table !< exponent in the shape parameter for soil resistance option 1 + +! mptable.tbl irrigation parameters + + real (kind=kind_phys) :: irr_frac_table ! irrigation Fraction + integer :: irr_har_table ! number of days before harvest date to stop irrigation + real (kind=kind_phys) :: irr_lai_table ! Minimum lai to trigger irrigation + real (kind=kind_phys) :: irr_mad_table ! management allowable deficit (0-1) + real (kind=kind_phys) :: filoss_table ! fraction of flood irrigation loss (0-1) + real (kind=kind_phys) :: sprir_rate_table ! mm/h, sprinkler irrigation rate + real (kind=kind_phys) :: micir_rate_table ! mm/h, micro irrigation rate + real (kind=kind_phys) :: firtfac_table ! flood application rate factor + real (kind=kind_phys) :: ir_rain_table ! maximum precipitation to stop irrigation trigger +! mptable.tbl crop parameters -! &_______________________________________________________________________& + integer :: default_crop_table ! Default crop index integer :: pltday_table(ncrop) !< planting date - data (pltday_table(i), i=1,5) /130,111,111,111,111/ - integer :: hsday_table(ncrop) !< harvest date - data (hsday_table(i),i=1,5) /280,300,300,300,300/ - - real :: plantpop_table(ncrop) !< plant density [per ha] - used? - data (plantpop_table(i),i=1,5) /78.0,78.0,78.0,78.0,78.0/ - - real :: irri_table(ncrop) !< irrigation strategy 0= non-irrigation 1=irrigation (no water-stress) - data (irri_table(i),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - real :: gddtbase_table(ncrop) !< base temperature for gdd accumulation [c] - data (gddtbase_table(i),i=1,5) /10.0,10.0,10.0,10.0,10.0/ - - real :: gddtcut_table(ncrop) !< upper temperature for gdd accumulation [c] - data (gddtcut_table(i),i=1,5) /30.0,30.0,30.0,30.0,30.0/ - - real :: gdds1_table(ncrop) !< gdd from seeding to emergence - data (gdds1_table(i),i=1,5) /60.0,50.0,50.0,50.0,50.0/ - - real :: gdds2_table(ncrop) !< gdd from seeding to initial vegetative - data (gdds2_table(i),i=1,5) /675.0,718.0,718.0,718.0,718.0/ - - real :: gdds3_table(ncrop) !< gdd from seeding to post vegetative - data (gdds3_table(i),i=1,5) /1183.0,933.0,933.0,933.0,933.0/ - - real :: gdds4_table(ncrop) !< gdd from seeding to intial reproductive - data (gdds4_table(i),i=1,5) /1253.0,1103.0,1103.0,1103.0,1103.0/ - - real :: gdds5_table(ncrop) !< gdd from seeding to pysical maturity - data (gdds5_table(i),i=1,5) /1605.0,1555.0,1555.0,1555.0,1555.0/ + real (kind=kind_phys) :: plantpop_table(ncrop) !< plant density [per ha] - used? + real (kind=kind_phys) :: irri_table(ncrop) !< irrigation strategy 0= non-irrigation 1=irrigation (no water-stress) + + real (kind=kind_phys) :: gddtbase_table(ncrop) !< base temperature for gdd accumulation [c] + real (kind=kind_phys) :: gddtcut_table(ncrop) !< upper temperature for gdd accumulation [c] + real (kind=kind_phys) :: gdds1_table(ncrop) !< gdd from seeding to emergence + real (kind=kind_phys) :: gdds2_table(ncrop) !< gdd from seeding to initial vegetative + real (kind=kind_phys) :: gdds3_table(ncrop) !< gdd from seeding to post vegetative + real (kind=kind_phys) :: gdds4_table(ncrop) !< gdd from seeding to intial reproductive + real (kind=kind_phys) :: gdds5_table(ncrop) !< gdd from seeding to pysical maturity + + real (kind=kind_phys) :: c3psni_table(ncrop) !photosynthetic pathway: 0. = c4, 1. = c3 ! Zhe Zhang 2020-07-03 + real (kind=kind_phys) :: kc25i_table(ncrop) !co2 michaelis-menten constant at 25c (pa) + real (kind=kind_phys) :: akci_table(ncrop) !q10 for kc25 + real (kind=kind_phys) :: ko25i_table(ncrop) !o2 michaelis-menten constant at 25c (pa) + real (kind=kind_phys) :: akoi_table(ncrop) !q10 for ko25 + real (kind=kind_phys) :: vcmx25i_table(ncrop) !maximum rate of carboxylation at 25c (umol co2/m**2/s) + real (kind=kind_phys) :: avcmxi_table(ncrop) !q10 for vcmx25 + real (kind=kind_phys) :: bpi_table(ncrop) !minimum leaf conductance (umol/m**2/s) + real (kind=kind_phys) :: mpi_table(ncrop) !slope of conductance-to-photosynthesis relationship + real (kind=kind_phys) :: qe25i_table(ncrop) !quantum efficiency at 25c (umol co2 / umol photon) + real (kind=kind_phys) :: folnmxi_table(ncrop) !foliage nitrogen concentration when integer :: c3c4_table(ncrop) !< photosynthetic pathway: 1. = c3 2. = c4 - data (c3c4_table(i),i=1,5) /2.0,1.0,2.0,2.0,2.0/ - - real :: aref_table(ncrop) !< reference maximum co2 assimulation rate - data (aref_table(i),i=1,5) /7.0,7.0,7.0,7.0,7.0/ - - real :: psnrf_table(ncrop) !< co2 assimulation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) - data (psnrf_table(i),i=1,5) /0.85,0.85,0.85,0.85,0.85/ - - real :: i2par_table(ncrop) !< fraction of incoming solar radiation to photosynthetically active radiation - data (i2par_table(i),i=1,5) / 0.5,0.5,0.5,0.5,0.5/ - - real :: tassim0_table(ncrop) !< minimum temperature for co2 assimulation [c] - data (tassim0_table(i),i=1,5) /8.0,8.0,8.0,8.0,8.0/ - - real :: tassim1_table(ncrop) !< co2 assimulation linearly increasing until temperature reaches t1 [c] - data (tassim1_table(i),i=1,5) /18.0,18.0,18.0,18.0,18.0/ - - real :: tassim2_table(ncrop) !< co2 assmilation rate remain at aref until temperature reaches t2 [c] - data (tassim2_table(i),i=1,5) /30.0,30.0,30.0,30.0,30.0/ - - real :: k_table(ncrop) !< light extinction coefficient - data ( k_table(i),i=1,5) /0.55,0.55,0.55,0.55,0.55/ - - real :: epsi_table(ncrop) !< initial light use efficiency - data (epsi_table(i),i=1,5) /12.5,12.5,12.5,12.5,12.5/ - - real :: q10mr_table(ncrop) !< q10 for maintainance respiration - data (q10mr_table(i),i=1,5) /2.0,2.0,2.0,2.0,2.0/ - - real :: foln_mx_table(ncrop) !< foliage nitrogen concentration when f(n)=1 (%) - data (foln_mx_table(i),i=1,5) /1.5,1.5,1.5,1.5,1.5/ - - real :: lefreez_table(ncrop) !< characteristic t for leaf freezing [k] - data (lefreez_table(i),i=1,5) /268,268,268,268,268/ - - - real :: dile_fc_table(ncrop,nstage) !< coeficient for temperature leaf stress death [1/s] - data (dile_fc_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fc_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fc_table(i,3),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fc_table(i,4),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fc_table(i,5),i=1,5) /0.5,0.5,0.5,0.5,0.5/ - data (dile_fc_table(i,6),i=1,5) /0.5,0.5,0.5,0.5,0.5/ - data (dile_fc_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fc_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - real :: dile_fw_table(ncrop,nstage) !< coeficient for water leaf stress death [1/s] - data (dile_fw_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fw_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fw_table(i,3),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fw_table(i,4),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fw_table(i,5),i=1,5) /0.2,0.2,0.2,0.2,0.2/ - data (dile_fw_table(i,6),i=1,5) /0.2,0.2,0.2,0.2,0.2/ - data (dile_fw_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (dile_fw_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - real :: fra_gr_table(ncrop) !< fraction of growth respiration - data (fra_gr_table(i),i=1,5) /0.2,0.2,0.2,0.2,0.2/ - - real :: lf_ovrc_table(ncrop,nstage) !< fraction of leaf turnover [1/s] - data (lf_ovrc_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lf_ovrc_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lf_ovrc_table(i,3),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lf_ovrc_table(i,4),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lf_ovrc_table(i,5),i=1,5) /0.2,0.48,0.48,0.48,0.48/ - data (lf_ovrc_table(i,6),i=1,5) /0.3,0.48,0.48,0.48,0.48/ - data (lf_ovrc_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lf_ovrc_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - real :: st_ovrc_table(ncrop,nstage) !< fraction of stem turnover [1/s] - data (st_ovrc_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (st_ovrc_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (st_ovrc_table(i,3),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (st_ovrc_table(i,4),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (st_ovrc_table(i,5),i=1,5) /0.12,0.12,0.12,0.12,0.12/ - data (st_ovrc_table(i,6),i=1,5) /0.06,0.06,0.06,0.06,0.06/ - data (st_ovrc_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (st_ovrc_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - real :: rt_ovrc_table(ncrop,nstage) !< fraction of root tunrover [1/s] - data (rt_ovrc_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (rt_ovrc_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (rt_ovrc_table(i,3),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (rt_ovrc_table(i,4),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (rt_ovrc_table(i,5),i=1,5) /0.12,0.12,0.12,0.12,0.12/ - data (rt_ovrc_table(i,6),i=1,5) /0.06,0.06,0.06,0.06,0.06/ - data (rt_ovrc_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (rt_ovrc_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - real :: lfmr25_table(ncrop) !< leaf maintenance respiration at 25c [umol co2/m**2 /s] - data (lfmr25_table(i),i=1,5) /1.0,1.0,1.0,1.0,1.0/ - - real :: stmr25_table(ncrop) !< stem maintenance respiration at 25c [umol co2/kg bio/s] - data (stmr25_table(i),i=1,5) /0.05,0.1,0.1,0.1,0.1/ - - real :: rtmr25_table(ncrop) !< root maintenance respiration at 25c [umol co2/kg bio/s] - data (rtmr25_table(i),i=1,5) /0.05,0.0,0.0,0.0,0.0/ - - real :: grainmr25_table(ncrop) !< grain maintenance respiration at 25c [umol co2/kg bio/s] - data (grainmr25_table(i),i=1,5) /0.0,0.1,0.1,0.1,0.1/ - - real :: lfpt_table(ncrop,nstage) !< fraction of carbohydrate flux to leaf - data (lfpt_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lfpt_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lfpt_table(i,3),i=1,5) /0.4,0.4,0.4,0.4,0.4/ - data (lfpt_table(i,4),i=1,5) /0.2,0.2,0.2,0.2,0.2/ - data (lfpt_table(i,5),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lfpt_table(i,6),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lfpt_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (lfpt_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - - real :: stpt_table(ncrop,nstage) !< fraction of carbohydrate flux to stem - data (stpt_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (stpt_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (stpt_table(i,3),i=1,5) /0.2,0.2,0.2,0.2,0.2/ - data (stpt_table(i,4),i=1,5) /0.5,0.5,0.5,0.5,0.5/ - data (stpt_table(i,5),i=1,5) /0.0,0.15,0.15,0.15,0.15/ - data (stpt_table(i,6),i=1,5) /0.0,0.05,0.05,0.05,0.05/ - data (stpt_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (stpt_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - - real :: rtpt_table(ncrop,nstage) !< fraction of carbohydrate flux to root - data (rtpt_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (rtpt_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (rtpt_table(i,3),i=1,5) /0.34,0.4,0.4,0.4,0.4/ - data (rtpt_table(i,4),i=1,5) /0.3,0.3,0.3,0.3,0.3/ - data (rtpt_table(i,5),i=1,5) /0.05,0.05,0.05,0.05,0.05/ - data (rtpt_table(i,6),i=1,5) /0.0,0.05,0.05,0.05,0.05/ - data (rtpt_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (rtpt_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - real :: grainpt_table(ncrop,nstage) !< fraction of carbohydrate flux to grain - data (grainpt_table(i,1),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (grainpt_table(i,2),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (grainpt_table(i,3),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (grainpt_table(i,4),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (grainpt_table(i,5),i=1,5) /0.95,0.8,0.8,0.8,0.8/ - data (grainpt_table(i,6),i=1,5) /1.0,0.9,0.9,0.9,0.9/ - data (grainpt_table(i,7),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - data (grainpt_table(i,8),i=1,5) /0.0,0.0,0.0,0.0,0.0/ - - real :: bio2lai_table(ncrop) !< leaf are per living leaf biomass [m^2/kg] - data (bio2lai_table(i),i=1,5) /0.035,0.015,0.015,0.015,0.015/ + real (kind=kind_phys) :: aref_table(ncrop) !< reference maximum co2 assimulation rate + real (kind=kind_phys) :: psnrf_table(ncrop) !< co2 assimulation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) + real (kind=kind_phys) :: i2par_table(ncrop) !< fraction of incoming solar radiation to photosynthetically active radiation + real (kind=kind_phys) :: tassim0_table(ncrop) !< minimum temperature for co2 assimulation [c] + real (kind=kind_phys) :: tassim1_table(ncrop) !< co2 assimulation linearly increasing until temperature reaches t1 [c] + real (kind=kind_phys) :: tassim2_table(ncrop) !< co2 assmilation rate remain at aref until temperature reaches t2 [c] + real (kind=kind_phys) :: k_table(ncrop) !< light extinction coefficient + real (kind=kind_phys) :: epsi_table(ncrop) !< initial light use efficiency + + real (kind=kind_phys) :: q10mr_table(ncrop) !< q10 for maintainance respiration + real (kind=kind_phys) :: foln_mx_table(ncrop) !< foliage nitrogen concentration when f(n)=1 (%) + real (kind=kind_phys) :: lefreez_table(ncrop) !< characteristic t for leaf freezing [k] + + real (kind=kind_phys) :: dile_fc_table(ncrop,nstage) !< coeficient for temperature leaf stress death [1/s] + real (kind=kind_phys) :: dile_fw_table(ncrop,nstage) !< coeficient for water leaf stress death [1/s] + real (kind=kind_phys) :: fra_gr_table(ncrop) !< fraction of growth respiration + + real (kind=kind_phys) :: lf_ovrc_table(ncrop,nstage) !< fraction of leaf turnover [1/s] + real (kind=kind_phys) :: st_ovrc_table(ncrop,nstage) !< fraction of stem turnover [1/s] + real (kind=kind_phys) :: rt_ovrc_table(ncrop,nstage) !< fraction of root tunrover [1/s] + real (kind=kind_phys) :: lfmr25_table(ncrop) !< leaf maintenance respiration at 25c [umol co2/m**2 /s] + real (kind=kind_phys) :: stmr25_table(ncrop) !< stem maintenance respiration at 25c [umol co2/kg bio/s] + real (kind=kind_phys) :: rtmr25_table(ncrop) !< root maintenance respiration at 25c [umol co2/kg bio/s] + real (kind=kind_phys) :: grainmr25_table(ncrop) !< grain maintenance respiration at 25c [umol co2/kg bio/s] + + real (kind=kind_phys) :: lfpt_table(ncrop,nstage) !< fraction of carbohydrate flux to leaf + real (kind=kind_phys) :: stpt_table(ncrop,nstage) !< fraction of carbohydrate flux to stem + real (kind=kind_phys) :: rtpt_table(ncrop,nstage) !< fraction of carbohydrate flux to root + real (kind=kind_phys) :: grainpt_table(ncrop,nstage) !< fraction of carbohydrate flux to grain + real (kind=kind_phys) :: lfct_table(ncrop,nstage) ! fraction of carbohydrate translocation from leaf to grain ! Zhe Zhang 2020-07-13 + real (kind=kind_phys) :: stct_table(ncrop,nstage) ! stem to grain + real (kind=kind_phys) :: rtct_table(ncrop,nstage) ! root to grain + real (kind=kind_phys) :: bio2lai_table(ncrop) !< leaf are per living leaf biomass [m^2/kg] + +! tile drainage parameters + real (kind=kind_phys) :: tdsmc_fac_table(max_soiltyp) + real (kind=kind_phys) :: td_dc_table(max_soiltyp) + integer :: td_depth_table(max_soiltyp) + integer :: drain_layer_opt_table + real (kind=kind_phys) :: td_dcoef_table(max_soiltyp) + real (kind=kind_phys) :: td_d_table(max_soiltyp) + real (kind=kind_phys) :: td_adepth_table(max_soiltyp) + real (kind=kind_phys) :: td_radi_table(max_soiltyp) + real (kind=kind_phys) :: td_spac_table(max_soiltyp) + real (kind=kind_phys) :: td_ddrain_table(max_soiltyp) + real (kind=kind_phys) :: klat_fac_table(max_soiltyp) ! mptable.tbl optional parameters @@ -992,55 +259,1076 @@ module noahmp_tables ! Saxton and Rawls 2006 Pedo-transfer function coefficients !------------------------------------------------------------------------------ - real :: sr2006_theta_1500t_a = -0.024 !< sand coefficient - real :: sr2006_theta_1500t_b = 0.487 !< clay coefficient - real :: sr2006_theta_1500t_c = 0.006 !< orgm coefficient - real :: sr2006_theta_1500t_d = 0.005 !< sand*orgm coefficient - real :: sr2006_theta_1500t_e = -0.013 !< clay*orgm coefficient - real :: sr2006_theta_1500t_f = 0.068 !< sand*clay coefficient - real :: sr2006_theta_1500t_g = 0.031 !< constant adjustment - - real :: sr2006_theta_1500_a = 0.14 !< theta_1500t coefficient - real :: sr2006_theta_1500_b = -0.02 !< constant adjustment - - real :: sr2006_theta_33t_a = -0.251 !< sand coefficient - real :: sr2006_theta_33t_b = 0.195 !< clay coefficient - real :: sr2006_theta_33t_c = 0.011 !< orgm coefficient - real :: sr2006_theta_33t_d = 0.006 !< sand*orgm coefficient - real :: sr2006_theta_33t_e = -0.027 !< clay*orgm coefficient - real :: sr2006_theta_33t_f = 0.452 !< sand*clay coefficient - real :: sr2006_theta_33t_g = 0.299 !< constant adjustment - - real :: sr2006_theta_33_a = 1.283 !< theta_33t*theta_33t coefficient - real :: sr2006_theta_33_b = -0.374 !< theta_33t coefficient - real :: sr2006_theta_33_c = -0.015 !< constant adjustment - - real :: sr2006_theta_s33t_a = 0.278 !< sand coefficient - real :: sr2006_theta_s33t_b = 0.034 !< clay coefficient - real :: sr2006_theta_s33t_c = 0.022 !< orgm coefficient - real :: sr2006_theta_s33t_d = -0.018 !< sand*orgm coefficient - real :: sr2006_theta_s33t_e = -0.027 !< clay*orgm coefficient - real :: sr2006_theta_s33t_f = -0.584 !< sand*clay coefficient - real :: sr2006_theta_s33t_g = 0.078 !< constant adjustment - - real :: sr2006_theta_s33_a = 0.636 !< theta_s33t coefficient - real :: sr2006_theta_s33_b = -0.107 !< constant adjustment - - real :: sr2006_psi_et_a = -21.67 !< sand coefficient - real :: sr2006_psi_et_b = -27.93 !< clay coefficient - real :: sr2006_psi_et_c = -81.97 !< theta_s33 coefficient - real :: sr2006_psi_et_d = 71.12 !< sand*theta_s33 coefficient - real :: sr2006_psi_et_e = 8.29 !< clay*theta_s33 coefficient - real :: sr2006_psi_et_f = 14.05 !< sand*clay coefficient - real :: sr2006_psi_et_g = 27.16 !< constant adjustment - - real :: sr2006_psi_e_a = 0.02 !< psi_et*psi_et coefficient - real :: sr2006_psi_e_b = -0.113 !< psi_et coefficient - real :: sr2006_psi_e_c = -0.7 !< constant adjustment - - real :: sr2006_smcmax_a = -0.097 !< sand adjustment - real :: sr2006_smcmax_b = 0.043 !< constant adjustment + real (kind=kind_phys) :: sr2006_theta_1500t_a !< sand coefficient + real (kind=kind_phys) :: sr2006_theta_1500t_b !< clay coefficient + real (kind=kind_phys) :: sr2006_theta_1500t_c !< orgm coefficient + real (kind=kind_phys) :: sr2006_theta_1500t_d !< sand*orgm coefficient + real (kind=kind_phys) :: sr2006_theta_1500t_e !< clay*orgm coefficient + real (kind=kind_phys) :: sr2006_theta_1500t_f !< sand*clay coefficient + real (kind=kind_phys) :: sr2006_theta_1500t_g !< constant adjustment + + real (kind=kind_phys) :: sr2006_theta_1500_a !< theta_1500t coefficient + real (kind=kind_phys) :: sr2006_theta_1500_b !< constant adjustment + + real (kind=kind_phys) :: sr2006_theta_33t_a !< sand coefficient + real (kind=kind_phys) :: sr2006_theta_33t_b !< clay coefficient + real (kind=kind_phys) :: sr2006_theta_33t_c !< orgm coefficient + real (kind=kind_phys) :: sr2006_theta_33t_d !< sand*orgm coefficient + real (kind=kind_phys) :: sr2006_theta_33t_e !< clay*orgm coefficient + real (kind=kind_phys) :: sr2006_theta_33t_f !< sand*clay coefficient + real (kind=kind_phys) :: sr2006_theta_33t_g !< constant adjustment + + real (kind=kind_phys) :: sr2006_theta_33_a !< theta_33t*theta_33t coefficient + real (kind=kind_phys) :: sr2006_theta_33_b !< theta_33t coefficient + real (kind=kind_phys) :: sr2006_theta_33_c !< constant adjustment + + real (kind=kind_phys) :: sr2006_theta_s33t_a !< sand coefficient + real (kind=kind_phys) :: sr2006_theta_s33t_b !< clay coefficient + real (kind=kind_phys) :: sr2006_theta_s33t_c !< orgm coefficient + real (kind=kind_phys) :: sr2006_theta_s33t_d !< sand*orgm coefficient + real (kind=kind_phys) :: sr2006_theta_s33t_e !< clay*orgm coefficient + real (kind=kind_phys) :: sr2006_theta_s33t_f !< sand*clay coefficient + real (kind=kind_phys) :: sr2006_theta_s33t_g !< constant adjustment + + real (kind=kind_phys) :: sr2006_theta_s33_a !< theta_s33t coefficient + real (kind=kind_phys) :: sr2006_theta_s33_b !< constant adjustment + + real (kind=kind_phys) :: sr2006_psi_et_a !< sand coefficient + real (kind=kind_phys) :: sr2006_psi_et_b !< clay coefficient + real (kind=kind_phys) :: sr2006_psi_et_c !< theta_s33 coefficient + real (kind=kind_phys) :: sr2006_psi_et_d !< sand*theta_s33 coefficient + real (kind=kind_phys) :: sr2006_psi_et_e !< clay*theta_s33 coefficient + real (kind=kind_phys) :: sr2006_psi_et_f !< sand*clay coefficient + real (kind=kind_phys) :: sr2006_psi_et_g !< constant adjustment + + real (kind=kind_phys) :: sr2006_psi_e_a !< psi_et*psi_et coefficient + real (kind=kind_phys) :: sr2006_psi_e_b !< psi_et coefficient + real (kind=kind_phys) :: sr2006_psi_e_c !< constant adjustment + + real (kind=kind_phys) :: sr2006_smcmax_a !< sand adjustment + real (kind=kind_phys) :: sr2006_smcmax_b !< constant adjustment + +contains + + subroutine read_mp_table_parameters(errmsg, errflg) + implicit none + + character(len=*), intent(out) :: errmsg + integer, intent(out) :: errflg + + ! vegetation parameters + character(len=256) :: dataset_identifier + character(len=256) :: veg_dataset_description + logical :: file_named + integer :: ierr, ik, im + integer :: nveg, isurban, iswater, isbarren, isice, iscrop, eblforest, natural + integer :: lcz_1, lcz_2, lcz_3, lcz_4, lcz_5, lcz_6, lcz_7, lcz_8, lcz_9, lcz_10, lcz_11 + real (kind=kind_phys), dimension(mvt) :: sai_jan, sai_feb, sai_mar, sai_apr, sai_may, sai_jun, sai_jul, sai_aug, & + sai_sep, sai_oct, sai_nov, sai_dec, lai_jan, lai_feb, lai_mar, lai_apr, & + lai_may, lai_jun, lai_jul, lai_aug, lai_sep, lai_oct, lai_nov, lai_dec, & + rhol_vis, rhol_nir, rhos_vis, rhos_nir, taul_vis, taul_nir, taus_vis, taus_nir,& + ch2op, dleaf, z0mvt, hvt, hvb, z0mhvt, & + den, rc, mfsno, scffac, cbiom, xl, cwpvt, c3psn, kc25, & + akc, ko25, ako, avcmx, aqe, ltovrc, dilefc, dilefw, rmf25, sla, fragr, tmin, & + vcmx25, tdlef, bp, mp, qe25, rms25, rmr25, arm, folnmx, wdpool, wrrat, mrp, & + nroot, rgl, rs, hs, topt, rsmax, rtovrc, rswoodc, bf, wstrc, laimin, & + xsamin, eps1, eps2, eps3, eps4, eps5 + namelist / noahmp_usgs_veg_categories / veg_dataset_description, nveg + namelist / noahmp_usgs_parameters / isurban, iswater, isbarren, isice, iscrop, eblforest, natural, & + lcz_1, lcz_2, lcz_3, lcz_4, lcz_5, lcz_6, lcz_7, lcz_8, lcz_9, lcz_10, lcz_11, & + ch2op, dleaf, z0mvt, hvt, hvb, z0mhvt, & + den, rc, mfsno, scffac, cbiom, xl, cwpvt, c3psn, kc25, & + akc, ko25, ako, avcmx, aqe, ltovrc, dilefc, dilefw, rmf25, sla, fragr, tmin, & + vcmx25, tdlef, bp, mp, qe25, rms25, rmr25, arm, folnmx, wdpool, wrrat, mrp, & + nroot, rgl, rs, hs, topt, rsmax, rtovrc, rswoodc, bf, wstrc, laimin, & + xsamin, sai_jan, sai_feb, sai_mar, sai_apr, sai_may, & + sai_jun, sai_jul, sai_aug, sai_sep, sai_oct, sai_nov, sai_dec, lai_jan, & + lai_feb, lai_mar, lai_apr, lai_may, lai_jun, lai_jul, lai_aug, lai_sep, & + lai_oct, lai_nov, lai_dec, rhol_vis, rhol_nir, rhos_vis, rhos_nir, taul_vis, & + taul_nir, taus_vis, taus_nir, eps1, eps2, eps3, eps4, eps5 + namelist / noahmp_modis_veg_categories / veg_dataset_description, nveg + namelist / noahmp_modis_parameters / isurban, iswater, isbarren, isice, iscrop, eblforest, natural, & + lcz_1, lcz_2, lcz_3, lcz_4, lcz_5, lcz_6, lcz_7, lcz_8, lcz_9, lcz_10, lcz_11, & + ch2op, dleaf, z0mvt, hvt, hvb, z0mhvt, & + den, rc, mfsno, scffac, cbiom, xl, cwpvt, c3psn, kc25, & + akc, ko25, ako, avcmx, aqe, ltovrc, dilefc, dilefw, rmf25, sla, fragr, tmin, & + vcmx25, tdlef, bp, mp, qe25, rms25, rmr25, arm, folnmx, wdpool, wrrat, mrp, & + nroot, rgl, rs, hs, topt, rsmax, rtovrc, rswoodc, bf, wstrc, laimin, & + xsamin, sai_jan, sai_feb, sai_mar, sai_apr, sai_may, & + sai_jun, sai_jul, sai_aug, sai_sep, sai_oct, sai_nov, sai_dec, lai_jan, & + lai_feb, lai_mar, lai_apr, lai_may, lai_jun, lai_jul, lai_aug, lai_sep, & + lai_oct, lai_nov, lai_dec, rhol_vis, rhol_nir, rhos_vis, rhos_nir, taul_vis, & + taul_nir, taus_vis, taus_nir, eps1, eps2, eps3, eps4, eps5 + ! soil parameters + character(len=256) :: message + character(len=10) :: sltype + integer :: slcats + real (kind=kind_phys), dimension(max_soiltyp) :: bb, drysmc, maxsmc, refsmc, satpsi, satdk, satdw, wltsmc, qtz, & + bvic, axaj, bxaj, xxaj, bdvic, bbvic, gdvic, hc + namelist / noahmp_stas_soil_categories / sltype, slcats + namelist / noahmp_soil_stas_parameters / bb, drysmc, maxsmc, refsmc, satpsi, satdk, satdw, wltsmc, qtz, & + bvic, axaj, bxaj, xxaj, bdvic, bbvic, gdvic + namelist / noahmp_soil_stas_ruc_parameters / bb, drysmc, hc, maxsmc, refsmc, satpsi, satdk, satdw, wltsmc, qtz, & + bvic, axaj, bxaj, xxaj, bdvic, bbvic, gdvic + + ! general parameters + real (kind=kind_phys) :: csoil_data, refdk_data, refkdt_data, frzk_data, zbot_data, czil_data + real (kind=kind_phys), dimension(num_slope) :: slope_data + namelist / noahmp_general_parameters / slope_data, csoil_data, refdk_data, refkdt_data, frzk_data, zbot_data, & + czil_data + + ! radiation parameters + real (kind=kind_phys) :: betads, betais, eice + real (kind=kind_phys), dimension(mband) :: albice, alblak, omegas + real (kind=kind_phys), dimension(2) :: eg + real (kind=kind_phys), dimension(msc) :: albsat_vis, albsat_nir, albdry_vis, albdry_nir + namelist / noahmp_rad_parameters / albsat_vis, albsat_nir, albdry_vis, albdry_nir, albice, alblak, omegas, & + betads, betais, eg, eice + + ! global parameters + real (kind=kind_phys) :: co2, o2, timean, fsatmx, z0sno, ssi, snow_ret_fac ,snow_emis, swemx, tau0, & + grain_growth, extra_growth, dirt_soot, bats_cosz, bats_vis_new, & + bats_nir_new, bats_vis_age, bats_nir_age, bats_vis_dir, bats_nir_dir, & + rsurf_snow, rsurf_exp, c2_snowcompact, c3_snowcompact, c4_snowcompact, & + c5_snowcompact, dm_snowcompact, eta0_snowcompact, snliqmaxfrac, swemaxgla, & + wslmax, rous, cmic, snowden_max, class_alb_ref, class_sno_age, class_alb_new,& + psiwlt, z0soil, z0lake + namelist / noahmp_global_parameters / co2, o2, timean, fsatmx, z0sno, ssi, snow_ret_fac ,snow_emis, swemx, tau0, & + grain_growth, extra_growth, dirt_soot, bats_cosz, bats_vis_new, & + bats_nir_new, bats_vis_age, bats_nir_age, bats_vis_dir, bats_nir_dir, & + rsurf_snow, rsurf_exp, c2_snowcompact, c3_snowcompact, c4_snowcompact, & + c5_snowcompact, dm_snowcompact, eta0_snowcompact, snliqmaxfrac, swemaxgla, & + wslmax, rous, cmic, snowden_max, class_alb_ref, class_sno_age, class_alb_new,& + psiwlt, z0soil, z0lake + + ! irrigation parameters + integer :: irr_har + real (kind=kind_phys) :: irr_frac, irr_lai, irr_mad, filoss, sprir_rate, micir_rate, firtfac, ir_rain + namelist / noahmp_irrigation_parameters / irr_frac, irr_har, irr_lai, irr_mad, filoss, sprir_rate, micir_rate, firtfac,& + ir_rain + + ! crop parameters + integer :: default_crop + integer , dimension(ncrop) :: pltday, hsday + real (kind=kind_phys), dimension(ncrop) :: plantpop, irri, gddtbase, gddtcut, gdds1, gdds2, gdds3, gdds4, gdds5, c3psni,& + kc25i, akci, ko25i, akoi, avcmxi, vcmx25i, bpi, mpi, folnmxi, qe25i, aref, & + psnrf, i2par, tassim0, tassim1, tassim2, k, epsi, q10mr, lefreez, & + dile_fc_s1, dile_fc_s2, dile_fc_s3, dile_fc_s4, dile_fc_s5, dile_fc_s6, & + dile_fc_s7, dile_fc_s8, dile_fw_s1, dile_fw_s2, dile_fw_s3, dile_fw_s4, & + dile_fw_s5, dile_fw_s6, dile_fw_s7, dile_fw_s8, fra_gr, lf_ovrc_s1, & + lf_ovrc_s2, lf_ovrc_s3, lf_ovrc_s4, lf_ovrc_s5, lf_ovrc_s6, lf_ovrc_s7, & + lf_ovrc_s8, st_ovrc_s1, st_ovrc_s2, st_ovrc_s3, st_ovrc_s4, st_ovrc_s5, & + st_ovrc_s6, st_ovrc_s7, st_ovrc_s8, rt_ovrc_s1, rt_ovrc_s2, rt_ovrc_s3, & + rt_ovrc_s4, rt_ovrc_s5, rt_ovrc_s6, rt_ovrc_s7, rt_ovrc_s8, lfmr25, stmr25, & + rtmr25, grainmr25, lfpt_s1, lfpt_s2, lfpt_s3, lfpt_s4, lfpt_s5, lfpt_s6, & + lfpt_s7, lfpt_s8, stpt_s1, stpt_s2, stpt_s3, stpt_s4, stpt_s5, stpt_s6, & + stpt_s7, stpt_s8, rtpt_s1, rtpt_s2, rtpt_s3, rtpt_s4, rtpt_s5, rtpt_s6, & + rtpt_s7, rtpt_s8, grainpt_s1, grainpt_s2, grainpt_s3, grainpt_s4, grainpt_s5,& + grainpt_s6, grainpt_s7, grainpt_s8, lfct_s1, lfct_s2, lfct_s3, lfct_s4, & + lfct_s5, lfct_s6, lfct_s7, lfct_s8, stct_s1, stct_s2, stct_s3, stct_s4, & + stct_s5, stct_s6, stct_s7, stct_s8, rtct_s1, rtct_s2, rtct_s3, rtct_s4, & + rtct_s5, rtct_s6, rtct_s7, rtct_s8, bio2lai + namelist / noahmp_crop_parameters / default_crop, pltday, hsday, plantpop, irri, gddtbase, gddtcut, gdds1, gdds2,& + gdds3, gdds4, gdds5, c3psni, kc25i, akci, ko25i, akoi, avcmxi, vcmx25i, bpi, & + mpi, folnmxi, qe25i, aref, psnrf, i2par, tassim0, tassim1, tassim2, k, & + epsi,q10mr, lefreez, dile_fc_s1, dile_fc_s2, dile_fc_s3, dile_fc_s4, & + dile_fc_s5, dile_fc_s6, dile_fc_s7, dile_fc_s8, dile_fw_s1, dile_fw_s2, & + dile_fw_s3, dile_fw_s4, dile_fw_s5, dile_fw_s6, dile_fw_s7, dile_fw_s8, & + fra_gr, lf_ovrc_s1, lf_ovrc_s2, lf_ovrc_s3, lf_ovrc_s4, lf_ovrc_s5, & + lf_ovrc_s6, lf_ovrc_s7, lf_ovrc_s8, st_ovrc_s1, st_ovrc_s2, st_ovrc_s3, & + st_ovrc_s4, st_ovrc_s5, st_ovrc_s6, st_ovrc_s7, st_ovrc_s8, rt_ovrc_s1, & + rt_ovrc_s2, rt_ovrc_s3, rt_ovrc_s4, rt_ovrc_s5, rt_ovrc_s6, rt_ovrc_s7, & + rt_ovrc_s8, lfmr25, stmr25, rtmr25, grainmr25, lfpt_s1, lfpt_s2, lfpt_s3, & + lfpt_s4, lfpt_s5, lfpt_s6, lfpt_s7, lfpt_s8, stpt_s1, stpt_s2, stpt_s3, & + stpt_s4, stpt_s5, stpt_s6, stpt_s7, stpt_s8, rtpt_s1, rtpt_s2, rtpt_s3, & + rtpt_s4, rtpt_s5, rtpt_s6, rtpt_s7, rtpt_s8, grainpt_s1, grainpt_s2, & + grainpt_s3, grainpt_s4, grainpt_s5, grainpt_s6, grainpt_s7, grainpt_s8, & + lfct_s1, lfct_s2, lfct_s3, lfct_s4, lfct_s5, lfct_s6, lfct_s7, lfct_s8, & + stct_s1, stct_s2, stct_s3, stct_s4, stct_s5, stct_s6, stct_s7, stct_s8, & + rtct_s1, rtct_s2, rtct_s3, rtct_s4, rtct_s5, rtct_s6, rtct_s7, rtct_s8, & + bio2lai + + ! tile drainage parameters + integer :: nsoiltype, drain_layer_opt + integer , dimension(max_soiltyp) :: td_depth + real (kind=kind_phys), dimension(max_soiltyp) :: tdsmc_fac, td_dc, td_dcoef, td_d, td_adepth, td_radi, td_spac, & + td_ddrain, klat_fac + namelist / noahmp_tiledrain_parameters / nsoiltype, drain_layer_opt, tdsmc_fac, td_depth, td_dc, td_dcoef, td_d,& + td_adepth, td_radi, td_spac, td_ddrain, klat_fac + + ! optional parameters + real (kind=kind_phys) :: sr2006_theta_1500t_a, sr2006_theta_1500t_b, sr2006_theta_1500t_c, & + sr2006_theta_1500t_d, sr2006_theta_1500t_e, sr2006_theta_1500t_f, & + sr2006_theta_1500t_g, sr2006_theta_1500_a , sr2006_theta_1500_b, & + sr2006_theta_33t_a, sr2006_theta_33t_b, sr2006_theta_33t_c, & + sr2006_theta_33t_d, sr2006_theta_33t_e, sr2006_theta_33t_f, & + sr2006_theta_33t_g, sr2006_theta_33_a, sr2006_theta_33_b, & + sr2006_theta_33_c, sr2006_theta_s33t_a, sr2006_theta_s33t_b, & + sr2006_theta_s33t_c, sr2006_theta_s33t_d, sr2006_theta_s33t_e, & + sr2006_theta_s33t_f, sr2006_theta_s33t_g, sr2006_theta_s33_a, & + sr2006_theta_s33_b, sr2006_psi_et_a, sr2006_psi_et_b, sr2006_psi_et_c, & + sr2006_psi_et_d, sr2006_psi_et_e, sr2006_psi_et_f, sr2006_psi_et_g, & + sr2006_psi_e_a, sr2006_psi_e_b, sr2006_psi_e_c, sr2006_smcmax_a, & + sr2006_smcmax_b + namelist / noahmp_optional_parameters / sr2006_theta_1500t_a, sr2006_theta_1500t_b, sr2006_theta_1500t_c, & + sr2006_theta_1500t_d, sr2006_theta_1500t_e, sr2006_theta_1500t_f, & + sr2006_theta_1500t_g, sr2006_theta_1500_a, sr2006_theta_1500_b, & + sr2006_theta_33t_a, sr2006_theta_33t_b, sr2006_theta_33t_c, & + sr2006_theta_33t_d, sr2006_theta_33t_e, sr2006_theta_33t_f, & + sr2006_theta_33t_g, sr2006_theta_33_a, sr2006_theta_33_b, & + sr2006_theta_33_c, sr2006_theta_s33t_a, sr2006_theta_s33t_b, & + sr2006_theta_s33t_c, sr2006_theta_s33t_d, sr2006_theta_s33t_e, & + sr2006_theta_s33t_f, sr2006_theta_s33t_g, sr2006_theta_s33_a, & + sr2006_theta_s33_b, sr2006_psi_et_a, sr2006_psi_et_b, sr2006_psi_et_c, & + sr2006_psi_et_d, sr2006_psi_et_e, sr2006_psi_et_f, sr2006_psi_et_g, & + sr2006_psi_e_a, sr2006_psi_e_b, sr2006_psi_e_c, sr2006_smcmax_a, & + sr2006_smcmax_b + + ! initialize our variables to bad values, so that if the namelist read fails, we come to a screeching halt as soon as we try to use anything. + ! vegetation parameters + isurban_table = -99999 + iswater_table = -99999 + isbarren_table = -99999 + isice_table = -99999 + iscrop_table = -99999 + eblforest_table = -99999 + natural_table = -99999 + lcz_1_table = -99999 + lcz_2_table = -99999 + lcz_3_table = -99999 + lcz_4_table = -99999 + lcz_5_table = -99999 + lcz_6_table = -99999 + lcz_7_table = -99999 + lcz_8_table = -99999 + lcz_9_table = -99999 + lcz_10_table = -99999 + lcz_11_table = -99999 + ch2op_table = -1.0e36 + dleaf_table = -1.0e36 + z0mvt_table = -1.0e36 + hvt_table = -1.0e36 + hvb_table = -1.0e36 + z0mhvt_table = -1.0e36 + den_table = -1.0e36 + rc_table = -1.0e36 + mfsno_table = -1.0e36 + scffac_table = -1.0e36 + cbiom_table = -1.0e36 + rhol_table = -1.0e36 + rhos_table = -1.0e36 + taul_table = -1.0e36 + taus_table = -1.0e36 + xl_table = -1.0e36 + cwpvt_table = -1.0e36 + c3psn_table = -1.0e36 + kc25_table = -1.0e36 + akc_table = -1.0e36 + ko25_table = -1.0e36 + ako_table = -1.0e36 + avcmx_table = -1.0e36 + aqe_table = -1.0e36 + ltovrc_table = -1.0e36 + dilefc_table = -1.0e36 + dilefw_table = -1.0e36 + rmf25_table = -1.0e36 + sla_table = -1.0e36 + fragr_table = -1.0e36 + tmin_table = -1.0e36 + vcmx25_table = -1.0e36 + tdlef_table = -1.0e36 + bp_table = -1.0e36 + mp_table = -1.0e36 + qe25_table = -1.0e36 + rms25_table = -1.0e36 + rmr25_table = -1.0e36 + arm_table = -1.0e36 + folnmx_table = -1.0e36 + wdpool_table = -1.0e36 + wrrat_table = -1.0e36 + mrp_table = -1.0e36 + saim_table = -1.0e36 + laim_table = -1.0e36 + nroot_table = -1.0e36 + rgl_table = -1.0e36 + rs_table = -1.0e36 + hs_table = -1.0e36 + topt_table = -1.0e36 + rsmax_table = -1.0e36 + ! not used in the current ufs version +! rtovrc_table = -1.0e36 +! rswoodc_table = -1.0e36 +! bf_table = -1.0e36 +! wstrc_table = -1.0e36 +! laimin_table = -1.0e36 +! xsamin_table = -1.0e36 + + ! soil parameters + + bexp_table = -1.0e36 + smcdry_table = -1.0e36 + f1_table = -1.0e36 + smcmax_table = -1.0e36 + smcref_table = -1.0e36 + psisat_table = -1.0e36 + dksat_table = -1.0e36 + dwsat_table = -1.0e36 + smcwlt_table = -1.0e36 + quartz_table = -1.0e36 + bvic_table = -1.0e36 + axaj_table = -1.0e36 + bxaj_table = -1.0e36 + xxaj_table = -1.0e36 + bdvic_table = -1.0e36 + gdvic_table = -1.0e36 + bbvic_table = -1.0e36 + + ! general parameters + slope_table = -1.0e36 + csoil_table = -1.0e36 + refdk_table = -1.0e36 + refkdt_table = -1.0e36 + frzk_table = -1.0e36 + zbot_table = -1.0e36 + czil_table = -1.0e36 + + ! radiation parameters + albsat_table = -1.0e36 + albdry_table = -1.0e36 + albice_table = -1.0e36 + alblak_table = -1.0e36 + omegas_table = -1.0e36 + betads_table = -1.0e36 + betais_table = -1.0e36 + eg_table = -1.0e36 +! eice_table = -1.0e36 + + ! global parameters + co2_table = -1.0e36 + o2_table = -1.0e36 + timean_table = -1.0e36 + fsatmx_table = -1.0e36 + z0sno_table = -1.0e36 + ssi_table = -1.0e36 +snow_ret_fac_table = -1.0e36 + snow_emis_table = -1.0e36 + swemx_table = -1.0e36 + tau0_table = -1.0e36 +grain_growth_table = -1.0e36 +extra_growth_table = -1.0e36 + dirt_soot_table = -1.0e36 + bats_cosz_table = -1.0e36 +bats_vis_new_table = -1.0e36 +bats_nir_new_table = -1.0e36 +bats_vis_age_table = -1.0e36 +bats_nir_age_table = -1.0e36 +bats_vis_dir_table = -1.0e36 +bats_nir_dir_table = -1.0e36 +rsurf_snow_table = -1.0e36 + rsurf_exp_table = -1.0e36 + +! c2_snowcompact_table = -1.0e36 +! c3_snowcompact_table = -1.0e36 +! c4_snowcompact_table = -1.0e36 +! c5_snowcompact_table = -1.0e36 +! dm_snowcompact_table = -1.0e36 +! eta0_snowcompact_table = -1.0e36 +! snliqmaxfrac_table = -1.0e36 +! swemaxgla_table = -1.0e36 +! wslmax_table = -1.0e36 +! rous_table = -1.0e36 +! cmic_table = -1.0e36 +! snowden_max_table = -1.0e36 +! class_alb_ref_table = -1.0e36 +! class_sno_age_table = -1.0e36 +! class_alb_new_table = -1.0e36 +! psiwlt_table = -1.0e36 +! z0soil_table = -1.0e36 +! z0lake_table = -1.0e36 + + ! irrigation parameters + irr_har_table = -99999 ! number of days before harvest date to stop irrigation + irr_frac_table = -1.0e36 ! irrigation fraction + irr_lai_table = -1.0e36 ! minimum lai to trigger irrigation + irr_mad_table = -1.0e36 ! management allowable deficit (0-1) + filoss_table = -1.0e36 ! fraction of flood irrigation loss (0-1) + sprir_rate_table = -1.0e36 ! mm/h, sprinkler irrigation rate + micir_rate_table = -1.0e36 ! mm/h, micro irrigation rate + firtfac_table = -1.0e36 ! flood application rate factor + ir_rain_table = -1.0e36 ! maximum precipitation to stop irrigation trigger + + ! crop parameters + default_crop_table = -99999 + pltday_table = -99999 + hsday_table = -99999 + plantpop_table = -1.0e36 + irri_table = -1.0e36 + gddtbase_table = -1.0e36 + gddtcut_table = -1.0e36 + gdds1_table = -1.0e36 + gdds2_table = -1.0e36 + gdds3_table = -1.0e36 + gdds4_table = -1.0e36 + gdds5_table = -1.0e36 + c3psni_table = -1.0e36 ! parameter from psn copied from stomata ! zhe zhang 2020-07-13 + kc25i_table = -1.0e36 + akci_table = -1.0e36 + ko25i_table = -1.0e36 + akoi_table = -1.0e36 + avcmxi_table = -1.0e36 + vcmx25i_table = -1.0e36 + bpi_table = -1.0e36 + mpi_table = -1.0e36 + folnmxi_table = -1.0e36 + qe25i_table = -1.0e36 ! ends here +!??? c3c4_table = -99999 + aref_table = -1.0e36 + psnrf_table = -1.0e36 + i2par_table = -1.0e36 + tassim0_table = -1.0e36 + tassim1_table = -1.0e36 + tassim2_table = -1.0e36 + k_table = -1.0e36 + epsi_table = -1.0e36 + q10mr_table = -1.0e36 + foln_mx_table = -1.0e36 + lefreez_table = -1.0e36 + dile_fc_table = -1.0e36 + dile_fw_table = -1.0e36 + fra_gr_table = -1.0e36 + lf_ovrc_table = -1.0e36 + st_ovrc_table = -1.0e36 + rt_ovrc_table = -1.0e36 + lfmr25_table = -1.0e36 + stmr25_table = -1.0e36 + rtmr25_table = -1.0e36 + grainmr25_table = -1.0e36 + lfpt_table = -1.0e36 + stpt_table = -1.0e36 + rtpt_table = -1.0e36 + grainpt_table = -1.0e36 + lfct_table = -1.0e36 ! convert start + stct_table = -1.0e36 + rtct_table = -1.0e36 ! convert end + bio2lai_table = -1.0e36 + + ! tile drainage parameters + + drain_layer_opt_table = -99999 + td_depth_table = -99999 + tdsmc_fac_table = -1.0e36 + td_dc_table = -1.0e36 + td_dcoef_table = -1.0e36 + td_d_table = -1.0e36 + td_adepth_table = -1.0e36 + td_radi_table = -1.0e36 + td_spac_table = -1.0e36 + td_ddrain_table = -1.0e36 + klat_fac_table = -1.0e36 + + ! optional parameters +! sr2006_theta_1500t_a_table = -1.0e36 +! sr2006_theta_1500t_b_table = -1.0e36 +! sr2006_theta_1500t_c_table = -1.0e36 +! sr2006_theta_1500t_d_table = -1.0e36 +! sr2006_theta_1500t_e_table = -1.0e36 +! sr2006_theta_1500t_f_table = -1.0e36 +! sr2006_theta_1500t_g_table = -1.0e36 +! sr2006_theta_1500_a_table = -1.0e36 +! sr2006_theta_1500_b_table = -1.0e36 +! sr2006_theta_33t_a_table = -1.0e36 +! sr2006_theta_33t_b_table = -1.0e36 +! sr2006_theta_33t_c_table = -1.0e36 +! sr2006_theta_33t_d_table = -1.0e36 +! sr2006_theta_33t_e_table = -1.0e36 +! sr2006_theta_33t_f_table = -1.0e36 +! sr2006_theta_33t_g_table = -1.0e36 +! sr2006_theta_33_a_table = -1.0e36 +! sr2006_theta_33_b_table = -1.0e36 +! sr2006_theta_33_c_table = -1.0e36 +! sr2006_theta_s33t_a_table = -1.0e36 +! sr2006_theta_s33t_b_table = -1.0e36 +! sr2006_theta_s33t_c_table = -1.0e36 +! sr2006_theta_s33t_d_table = -1.0e36 +! sr2006_theta_s33t_e_table = -1.0e36 +! sr2006_theta_s33t_f_table = -1.0e36 +! sr2006_theta_s33t_g_table = -1.0e36 +! sr2006_theta_s33_a_table = -1.0e36 +! sr2006_theta_s33_b_table = -1.0e36 +! sr2006_psi_et_a_table = -1.0e36 +! sr2006_psi_et_b_table = -1.0e36 +! sr2006_psi_et_c_table = -1.0e36 +! sr2006_psi_et_d_table = -1.0e36 +! sr2006_psi_et_e_table = -1.0e36 +! sr2006_psi_et_f_table = -1.0e36 +! sr2006_psi_et_g_table = -1.0e36 +! sr2006_psi_e_a_table = -1.0e36 +! sr2006_psi_e_b_table = -1.0e36 +! sr2006_psi_e_c_table = -1.0e36 +! sr2006_smcmax_a_table = -1.0e36 +! sr2006_smcmax_b_table = -1.0e36 + + !--------------------------------------------------------------- + ! transfer values from table to input variables + !--------------------------------------------------------------- + + !---------------- noahmptable.tbl vegetation parameters + + dataset_identifier = "modified_igbp_modis_noah" + + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if ( ierr /= 0 ) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + + if ( trim(dataset_identifier) == "usgs" ) then + read(15, noahmp_usgs_veg_categories) + read(15, noahmp_usgs_parameters) + elseif ( trim(dataset_identifier) == "modified_igbp_modis_noah" ) then + read(15,noahmp_modis_veg_categories) + read(15,noahmp_modis_parameters) + else + write(*,'("warning: unrecognized dataset_identifier in subroutine readnoahmptable")') + write(*,'("warning: dataset_identifier = ''", a, "''")') trim(dataset_identifier) + endif + close(15) + + + ! assign values + isurban_table = isurban + iswater_table = iswater + isbarren_table = isbarren + isice_table = isice + iscrop_table = iscrop + eblforest_table = eblforest + natural_table = natural + lcz_1_table = lcz_1 + lcz_2_table = lcz_2 + lcz_3_table = lcz_3 + lcz_4_table = lcz_4 + lcz_5_table = lcz_5 + lcz_6_table = lcz_6 + lcz_7_table = lcz_7 + lcz_8_table = lcz_8 + lcz_9_table = lcz_9 + lcz_10_table = lcz_10 + lcz_11_table = lcz_11 + ch2op_table (1:nveg) = ch2op (1:nveg) + dleaf_table (1:nveg) = dleaf (1:nveg) + z0mvt_table (1:nveg) = z0mvt (1:nveg) + hvt_table (1:nveg) = hvt (1:nveg) + hvb_table (1:nveg) = hvb (1:nveg) + z0mhvt_table (1:nveg) = z0mhvt (1:nveg) + den_table (1:nveg) = den (1:nveg) + rc_table (1:nveg) = rc (1:nveg) + mfsno_table (1:nveg) = mfsno (1:nveg) + scffac_table (1:nveg) = scffac (1:nveg) + cbiom_table (1:nveg) = cbiom (1:nveg) + xl_table (1:nveg) = xl (1:nveg) + cwpvt_table (1:nveg) = cwpvt (1:nveg) + c3psn_table (1:nveg) = c3psn (1:nveg) + kc25_table (1:nveg) = kc25 (1:nveg) + akc_table (1:nveg) = akc (1:nveg) + ko25_table (1:nveg) = ko25 (1:nveg) + ako_table (1:nveg) = ako (1:nveg) + avcmx_table (1:nveg) = avcmx (1:nveg) + aqe_table (1:nveg) = aqe (1:nveg) + ltovrc_table (1:nveg) = ltovrc (1:nveg) + dilefc_table (1:nveg) = dilefc (1:nveg) + dilefw_table (1:nveg) = dilefw (1:nveg) + rmf25_table (1:nveg) = rmf25 (1:nveg) + sla_table (1:nveg) = sla (1:nveg) + fragr_table (1:nveg) = fragr (1:nveg) + tmin_table (1:nveg) = tmin (1:nveg) + vcmx25_table (1:nveg) = vcmx25 (1:nveg) + tdlef_table (1:nveg) = tdlef (1:nveg) + bp_table (1:nveg) = bp (1:nveg) + mp_table (1:nveg) = mp (1:nveg) + qe25_table (1:nveg) = qe25 (1:nveg) + rms25_table (1:nveg) = rms25 (1:nveg) + rmr25_table (1:nveg) = rmr25 (1:nveg) + arm_table (1:nveg) = arm (1:nveg) + folnmx_table (1:nveg) = folnmx (1:nveg) + wdpool_table (1:nveg) = wdpool (1:nveg) + wrrat_table (1:nveg) = wrrat (1:nveg) + mrp_table (1:nveg) = mrp (1:nveg) + nroot_table (1:nveg) = nroot (1:nveg) + rgl_table (1:nveg) = rgl (1:nveg) + rs_table (1:nveg) = rs (1:nveg) + hs_table (1:nveg) = hs (1:nveg) + topt_table (1:nveg) = topt (1:nveg) + rsmax_table (1:nveg) = rsmax (1:nveg) +! rtovrc_table (1:nveg) = rtovrc (1:nveg) +! rswoodc_table(1:nveg) = rswoodc(1:nveg) +! bf_table (1:nveg) = bf (1:nveg) +! wstrc_table (1:nveg) = wstrc (1:nveg) +! laimin_table (1:nveg) = laimin (1:nveg) +! xsamin_table (1:nveg) = xsamin (1:nveg) + + saim_table(1:nveg, 1) = sai_jan(1:nveg) + saim_table(1:nveg, 2) = sai_feb(1:nveg) + saim_table(1:nveg, 3) = sai_mar(1:nveg) + saim_table(1:nveg, 4) = sai_apr(1:nveg) + saim_table(1:nveg, 5) = sai_may(1:nveg) + saim_table(1:nveg, 6) = sai_jun(1:nveg) + saim_table(1:nveg, 7) = sai_jul(1:nveg) + saim_table(1:nveg, 8) = sai_aug(1:nveg) + saim_table(1:nveg, 9) = sai_sep(1:nveg) + saim_table(1:nveg,10) = sai_oct(1:nveg) + saim_table(1:nveg,11) = sai_nov(1:nveg) + saim_table(1:nveg,12) = sai_dec(1:nveg) + laim_table(1:nveg, 1) = lai_jan(1:nveg) + laim_table(1:nveg, 2) = lai_feb(1:nveg) + laim_table(1:nveg, 3) = lai_mar(1:nveg) + laim_table(1:nveg, 4) = lai_apr(1:nveg) + laim_table(1:nveg, 5) = lai_may(1:nveg) + laim_table(1:nveg, 6) = lai_jun(1:nveg) + laim_table(1:nveg, 7) = lai_jul(1:nveg) + laim_table(1:nveg, 8) = lai_aug(1:nveg) + laim_table(1:nveg, 9) = lai_sep(1:nveg) + laim_table(1:nveg,10) = lai_oct(1:nveg) + laim_table(1:nveg,11) = lai_nov(1:nveg) + laim_table(1:nveg,12) = lai_dec(1:nveg) + rhol_table(1:nveg,1) = rhol_vis(1:nveg) !leaf reflectance: 1=vis, 2=nir + rhol_table(1:nveg,2) = rhol_nir(1:nveg) !leaf reflectance: 1=vis, 2=nir + rhos_table(1:nveg,1) = rhos_vis(1:nveg) !stem reflectance: 1=vis, 2=nir + rhos_table(1:nveg,2) = rhos_nir(1:nveg) !stem reflectance: 1=vis, 2=nir + taul_table(1:nveg,1) = taul_vis(1:nveg) !leaf transmittance: 1=vis, 2=nir + taul_table(1:nveg,2) = taul_nir(1:nveg) !leaf transmittance: 1=vis, 2=nir + taus_table(1:nveg,1) = taus_vis(1:nveg) !stem transmittance: 1=vis, 2=nir + taus_table(1:nveg,2) = taus_nir(1:nveg) !stem transmittance: 1=vis, 2=nir + + !---------------- noahmptable.tbl soil parameters + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if ( ierr /= 0 ) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + read(15, noahmp_stas_soil_categories) + if ( trim(sltype) == "stas" ) then + read(15, noahmp_soil_stas_parameters) + elseif ( trim(sltype) == "stas_ruc" ) then + read(15, noahmp_soil_stas_ruc_parameters) + else + write(*,'("warning: unrecognized soiltype in subroutine readnoahmptable")') + write(*,'("warning: dataset_identifier = ''", a, "''")') trim(sltype) + endif + close(15) + + ! assign values +! slcats_table = slcats + bexp_table (1:slcats) = bb (1:slcats) + smcdry_table(1:slcats) = drysmc(1:slcats) + smcmax_table(1:slcats) = maxsmc(1:slcats) + smcref_table(1:slcats) = refsmc(1:slcats) + psisat_table(1:slcats) = satpsi(1:slcats) + dksat_table (1:slcats) = satdk (1:slcats) + dwsat_table (1:slcats) = satdw (1:slcats) + smcwlt_table(1:slcats) = wltsmc(1:slcats) + quartz_table(1:slcats) = qtz (1:slcats) + bvic_table (1:slcats) = bvic (1:slcats) + axaj_table (1:slcats) = axaj (1:slcats) + bxaj_table (1:slcats) = bxaj (1:slcats) + xxaj_table (1:slcats) = xxaj (1:slcats) + bdvic_table (1:slcats) = bdvic (1:slcats) + gdvic_table (1:slcats) = gdvic (1:slcats) + bbvic_table (1:slcats) = bbvic (1:slcats) + + !---------------- noahmptable.tbl general parameters + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if ( ierr /= 0 ) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + read(15, noahmp_general_parameters) + close(15) + + ! assign values + slope_table(1:num_slope) = slope_data(1:num_slope) + csoil_table = csoil_data + refdk_table = refdk_data + refkdt_table = refkdt_data + frzk_table = frzk_data + zbot_table = zbot_data + czil_table = czil_data + + !---------------- noahmptable.tbl radiation parameters + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if (ierr /= 0) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + read(15,noahmp_rad_parameters) + close(15) + + ! assign values + albsat_table(:,1) = albsat_vis ! saturated soil albedos: 1=vis, 2=nir + albsat_table(:,2) = albsat_nir ! saturated soil albedos: 1=vis, 2=nir + albdry_table(:,1) = albdry_vis ! dry soil albedos: 1=vis, 2=nir + albdry_table(:,2) = albdry_nir ! dry soil albedos: 1=vis, 2=nir + albice_table = albice + alblak_table = alblak + omegas_table = omegas + betads_table = betads + betais_table = betais + eg_table = eg +! eice_table = eice + + !---------------- noahmptable.tbl global parameters + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if (ierr /= 0) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + read(15,noahmp_global_parameters) + close(15) + + ! assign values + co2_table = co2 + o2_table = o2 + timean_table = timean + fsatmx_table = fsatmx + z0sno_table = z0sno + ssi_table = ssi + snow_ret_fac_table = snow_ret_fac + snow_emis_table = snow_emis + swemx_table = swemx + tau0_table = tau0 + grain_growth_table = grain_growth + extra_growth_table = extra_growth + dirt_soot_table = dirt_soot + bats_cosz_table = bats_cosz + bats_vis_new_table = bats_vis_new + bats_nir_new_table = bats_nir_new + bats_vis_age_table = bats_vis_age + bats_nir_age_table = bats_nir_age + bats_vis_dir_table = bats_vis_dir + bats_nir_dir_table = bats_nir_dir + rsurf_snow_table = rsurf_snow + rsurf_exp_table = rsurf_exp +! c2_snowcompact_table = c2_snowcompact +! c3_snowcompact_table = c3_snowcompact +! c4_snowcompact_table = c4_snowcompact +! c5_snowcompact_table = c5_snowcompact +! dm_snowcompact_table = dm_snowcompact +! eta0_snowcompact_table = eta0_snowcompact +! snliqmaxfrac_table = snliqmaxfrac +! swemaxgla_table = swemaxgla +! wslmax_table = wslmax +! rous_table = rous +! cmic_table = cmic +! snowden_max_table = snowden_max +! class_alb_ref_table = class_alb_ref +! class_sno_age_table = class_sno_age +! class_alb_new_table = class_alb_new +! psiwlt_table = psiwlt +! z0soil_table = z0soil +! z0lake_table = z0lake + + !---------------- noahmptable.tbl irrigation parameters + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if (ierr /= 0) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + read(15,noahmp_irrigation_parameters) + close(15) + + ! assign values + irr_frac_table = irr_frac + irr_har_table = irr_har + irr_lai_table = irr_lai + irr_mad_table = irr_mad + filoss_table = filoss + sprir_rate_table = sprir_rate + micir_rate_table = micir_rate + firtfac_table = firtfac + ir_rain_table = ir_rain + + !---------------- noahmptable.tbl crop parameters + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if (ierr /= 0) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + read(15,noahmp_crop_parameters) + close(15) + + ! assign values + default_crop_table = default_crop + pltday_table = pltday + hsday_table = hsday + plantpop_table = plantpop + irri_table = irri + gddtbase_table = gddtbase + gddtcut_table = gddtcut + gdds1_table = gdds1 + gdds2_table = gdds2 + gdds3_table = gdds3 + gdds4_table = gdds4 + gdds5_table = gdds5 + c3psni_table (1:5) = c3psni (1:5) + kc25i_table (1:5) = kc25i (1:5) + akci_table (1:5) = akci (1:5) + ko25i_table (1:5) = ko25i (1:5) + akoi_table (1:5) = akoi (1:5) + avcmxi_table (1:5) = avcmxi (1:5) + vcmx25i_table(1:5) = vcmx25i(1:5) + bpi_table (1:5) = bpi (1:5) + mpi_table (1:5) = mpi (1:5) + folnmxi_table(1:5) = folnmxi(1:5) + qe25i_table (1:5) = qe25i (1:5) + aref_table = aref + psnrf_table = psnrf + i2par_table = i2par + tassim0_table = tassim0 + tassim1_table = tassim1 + tassim2_table = tassim2 + k_table = k + epsi_table = epsi + q10mr_table = q10mr + lefreez_table = lefreez + fra_gr_table = fra_gr + lfmr25_table = lfmr25 + stmr25_table = stmr25 + rtmr25_table = rtmr25 + grainmr25_table = grainmr25 + bio2lai_table = bio2lai + dile_fc_table(:,1) = dile_fc_s1 + dile_fc_table(:,2) = dile_fc_s2 + dile_fc_table(:,3) = dile_fc_s3 + dile_fc_table(:,4) = dile_fc_s4 + dile_fc_table(:,5) = dile_fc_s5 + dile_fc_table(:,6) = dile_fc_s6 + dile_fc_table(:,7) = dile_fc_s7 + dile_fc_table(:,8) = dile_fc_s8 + dile_fw_table(:,1) = dile_fw_s1 + dile_fw_table(:,2) = dile_fw_s2 + dile_fw_table(:,3) = dile_fw_s3 + dile_fw_table(:,4) = dile_fw_s4 + dile_fw_table(:,5) = dile_fw_s5 + dile_fw_table(:,6) = dile_fw_s6 + dile_fw_table(:,7) = dile_fw_s7 + dile_fw_table(:,8) = dile_fw_s8 + lf_ovrc_table(:,1) = lf_ovrc_s1 + lf_ovrc_table(:,2) = lf_ovrc_s2 + lf_ovrc_table(:,3) = lf_ovrc_s3 + lf_ovrc_table(:,4) = lf_ovrc_s4 + lf_ovrc_table(:,5) = lf_ovrc_s5 + lf_ovrc_table(:,6) = lf_ovrc_s6 + lf_ovrc_table(:,7) = lf_ovrc_s7 + lf_ovrc_table(:,8) = lf_ovrc_s8 + st_ovrc_table(:,1) = st_ovrc_s1 + st_ovrc_table(:,2) = st_ovrc_s2 + st_ovrc_table(:,3) = st_ovrc_s3 + st_ovrc_table(:,4) = st_ovrc_s4 + st_ovrc_table(:,5) = st_ovrc_s5 + st_ovrc_table(:,6) = st_ovrc_s6 + st_ovrc_table(:,7) = st_ovrc_s7 + st_ovrc_table(:,8) = st_ovrc_s8 + rt_ovrc_table(:,1) = rt_ovrc_s1 + rt_ovrc_table(:,2) = rt_ovrc_s2 + rt_ovrc_table(:,3) = rt_ovrc_s3 + rt_ovrc_table(:,4) = rt_ovrc_s4 + rt_ovrc_table(:,5) = rt_ovrc_s5 + rt_ovrc_table(:,6) = rt_ovrc_s6 + rt_ovrc_table(:,7) = rt_ovrc_s7 + rt_ovrc_table(:,8) = rt_ovrc_s8 + lfpt_table (:,1) = lfpt_s1 + lfpt_table (:,2) = lfpt_s2 + lfpt_table (:,3) = lfpt_s3 + lfpt_table (:,4) = lfpt_s4 + lfpt_table (:,5) = lfpt_s5 + lfpt_table (:,6) = lfpt_s6 + lfpt_table (:,7) = lfpt_s7 + lfpt_table (:,8) = lfpt_s8 + stpt_table (:,1) = stpt_s1 + stpt_table (:,2) = stpt_s2 + stpt_table (:,3) = stpt_s3 + stpt_table (:,4) = stpt_s4 + stpt_table (:,5) = stpt_s5 + stpt_table (:,6) = stpt_s6 + stpt_table (:,7) = stpt_s7 + stpt_table (:,8) = stpt_s8 + rtpt_table (:,1) = rtpt_s1 + rtpt_table (:,2) = rtpt_s2 + rtpt_table (:,3) = rtpt_s3 + rtpt_table (:,4) = rtpt_s4 + rtpt_table (:,5) = rtpt_s5 + rtpt_table (:,6) = rtpt_s6 + rtpt_table (:,7) = rtpt_s7 + rtpt_table (:,8) = rtpt_s8 + grainpt_table(:,1) = grainpt_s1 + grainpt_table(:,2) = grainpt_s2 + grainpt_table(:,3) = grainpt_s3 + grainpt_table(:,4) = grainpt_s4 + grainpt_table(:,5) = grainpt_s5 + grainpt_table(:,6) = grainpt_s6 + grainpt_table(:,7) = grainpt_s7 + grainpt_table(:,8) = grainpt_s8 + lfct_table (:,1) = lfct_s1 + lfct_table (:,2) = lfct_s2 + lfct_table (:,3) = lfct_s3 + lfct_table (:,4) = lfct_s4 + lfct_table (:,5) = lfct_s5 + lfct_table (:,6) = lfct_s6 + lfct_table (:,7) = lfct_s7 + lfct_table (:,8) = lfct_s8 + stct_table (:,1) = stct_s1 + stct_table (:,2) = stct_s2 + stct_table (:,3) = stct_s3 + stct_table (:,4) = stct_s4 + stct_table (:,5) = stct_s5 + stct_table (:,6) = stct_s6 + stct_table (:,7) = stct_s7 + stct_table (:,8) = stct_s8 + rtct_table (:,1) = rtct_s1 + rtct_table (:,2) = rtct_s2 + rtct_table (:,3) = rtct_s3 + rtct_table (:,4) = rtct_s4 + rtct_table (:,5) = rtct_s5 + rtct_table (:,6) = rtct_s6 + rtct_table (:,7) = rtct_s7 + rtct_table (:,8) = rtct_s8 + + !---------------- noahmptable.tbl tile drainage parameters + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if (ierr /= 0) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + read(15,noahmp_tiledrain_parameters) + close(15) + + ! assign values + drain_layer_opt_table = drain_layer_opt + tdsmc_fac_table(1:nsoiltype) = tdsmc_fac(1:nsoiltype) + td_depth_table (1:nsoiltype) = td_depth (1:nsoiltype) + td_dc_table (1:nsoiltype) = td_dc (1:nsoiltype) + td_dcoef_table (1:nsoiltype) = td_dcoef (1:nsoiltype) + td_d_table (1:nsoiltype) = td_d (1:nsoiltype) + td_adepth_table(1:nsoiltype) = td_adepth(1:nsoiltype) + td_radi_table (1:nsoiltype) = td_radi (1:nsoiltype) + td_spac_table (1:nsoiltype) = td_spac (1:nsoiltype) + td_ddrain_table(1:nsoiltype) = td_ddrain(1:nsoiltype) + klat_fac_table (1:nsoiltype) = klat_fac (1:nsoiltype) + + !---------------- noahmptable.tbl optional parameters + inquire( file='noahmptable.tbl', exist=file_named ) + if ( file_named ) then + open(15, file="noahmptable.tbl", status='old', form='formatted', action='read', iostat=ierr) + else + open(15, status='old', form='formatted', action='read', iostat=ierr) + end if + if (ierr /= 0) then + errmsg = 'warning: cannot find file noahmptable.tb' + errflg = 1 + return +! write(*,'("warning: cannot find file noahmptable.tbl")') + endif + read(15,noahmp_optional_parameters) + close(15) + + ! assign values +! sr2006_theta_1500t_a_table = sr2006_theta_1500t_a +! sr2006_theta_1500t_b_table = sr2006_theta_1500t_b +! sr2006_theta_1500t_c_table = sr2006_theta_1500t_c +! sr2006_theta_1500t_d_table = sr2006_theta_1500t_d +! sr2006_theta_1500t_e_table = sr2006_theta_1500t_e +! sr2006_theta_1500t_f_table = sr2006_theta_1500t_f +! sr2006_theta_1500t_g_table = sr2006_theta_1500t_g +! sr2006_theta_1500_a_table = sr2006_theta_1500_a +! sr2006_theta_1500_b_table = sr2006_theta_1500_b +! sr2006_theta_33t_a_table = sr2006_theta_33t_a +! sr2006_theta_33t_b_table = sr2006_theta_33t_b +! sr2006_theta_33t_c_table = sr2006_theta_33t_c +! sr2006_theta_33t_d_table = sr2006_theta_33t_d +! sr2006_theta_33t_e_table = sr2006_theta_33t_e +! sr2006_theta_33t_f_table = sr2006_theta_33t_f +! sr2006_theta_33t_g_table = sr2006_theta_33t_g +! sr2006_theta_33_a_table = sr2006_theta_33_a +! sr2006_theta_33_b_table = sr2006_theta_33_b +! sr2006_theta_33_c_table = sr2006_theta_33_c +! sr2006_theta_s33t_a_table = sr2006_theta_s33t_a +! sr2006_theta_s33t_b_table = sr2006_theta_s33t_b +! sr2006_theta_s33t_c_table = sr2006_theta_s33t_c +! sr2006_theta_s33t_d_table = sr2006_theta_s33t_d +! sr2006_theta_s33t_e_table = sr2006_theta_s33t_e +! sr2006_theta_s33t_f_table = sr2006_theta_s33t_f +! sr2006_theta_s33t_g_table = sr2006_theta_s33t_g +! sr2006_theta_s33_a_table = sr2006_theta_s33_a +! sr2006_theta_s33_b_table = sr2006_theta_s33_b +! sr2006_psi_et_a_table = sr2006_psi_et_a +! sr2006_psi_et_b_table = sr2006_psi_et_b +! sr2006_psi_et_c_table = sr2006_psi_et_c +! sr2006_psi_et_d_table = sr2006_psi_et_d +! sr2006_psi_et_e_table = sr2006_psi_et_e +! sr2006_psi_et_f_table = sr2006_psi_et_f +! sr2006_psi_et_g_table = sr2006_psi_et_g +! sr2006_psi_e_a_table = sr2006_psi_e_a +! sr2006_psi_e_b_table = sr2006_psi_e_b +! sr2006_psi_e_c_table = sr2006_psi_e_c +! sr2006_smcmax_a_table = sr2006_smcmax_a +! sr2006_smcmax_b_table = sr2006_smcmax_b + + end subroutine read_mp_table_parameters - end module noahmp_tables diff --git a/physics/noahmpdrv.F90 b/physics/noahmpdrv.F90 index 771cfa0f6..4500d51a8 100644 --- a/physics/noahmpdrv.F90 +++ b/physics/noahmpdrv.F90 @@ -37,6 +37,7 @@ subroutine noahmpdrv_init(lsm, lsm_noahmp, me, isot, ivegsrc, & use machine, only: kind_phys use set_soilveg_mod, only: set_soilveg use namelist_soilveg + use noahmp_tables implicit none integer, intent(in) :: lsm @@ -88,6 +89,8 @@ subroutine noahmpdrv_init(lsm, lsm_noahmp, me, isot, ivegsrc, & !--- initialize soil vegetation call set_soilveg(me, isot, ivegsrc, nlunit, errmsg, errflg) + !--- read in noahmp table + call read_mp_table_parameters(errmsg, errflg) ! initialize psih and psim @@ -124,13 +127,13 @@ end subroutine noahmpdrv_init subroutine noahmpdrv_run & !................................... ! --- inputs: - ( im, km, lsnowl, itime, ps, u1, v1, t1, q1, soiltyp, & + ( im, km, lsnowl, itime, ps, u1, v1, t1, q1, soiltyp,soilcol,& vegtype, sigmaf, dlwflx, dswsfc, snet, delt, tg3, cm, ch, & - prsl1, prslk1, prslki, prsik1, zf,pblh, dry, wind, slopetyp, & + prsl1, prslk1, prslki, prsik1, zf,pblh, dry, wind, slopetyp,& shdmin, shdmax, snoalb, sfalb, flag_iter,con_g, & idveg, iopt_crs, iopt_btr, iopt_run, iopt_sfc, iopt_frz, & - iopt_inf, iopt_rad, iopt_alb, iopt_snf, iopt_tbot, & - iopt_stc, iopt_trs,xlatin, xcoszin, iyrlen, julian, garea, & + iopt_inf, iopt_rad, iopt_alb, iopt_snf, iopt_tbot,iopt_stc,& + iopt_trs,iopt_diag,xlatin, xcoszin, iyrlen, julian, garea, & rainn_mp, rainc_mp, snow_mp, graupel_mp, ice_mp, rhonewsn1,& con_hvap, con_cp, con_jcal, rhoh2o, con_eps, con_epsm1, & con_fvirt, con_rd, con_hfus, thsfc_loc, & @@ -154,18 +157,55 @@ subroutine noahmpdrv_run & sncovr1, qsurf, gflux, drain, evap, hflx, ep, runoff, & cmm, chh, evbs, evcw, sbsno, pah, ecan, etran, edir, snowc,& stm, snohf,smcwlt2, smcref2, wet1, t2mmp, q2mp,zvfun, & - ztmax, errmsg, errflg) + ztmax, errmsg, errflg, & + canopy_heat_storage_ccpp, & + rainfall_ccpp, & + sw_absorbed_total_ccpp, & + sw_reflected_total_ccpp, & + lw_absorbed_total_ccpp, & + temperature_bare_grd_ccpp, & + temperature_veg_grd_ccpp, & + temperature_veg_2m_ccpp, & + temperature_bare_2m_ccpp, & + spec_humidity_veg_2m_ccpp, & + spec_humidity_bare_2m_ccpp, & + sw_absorbed_veg_ccpp, & + sw_absorbed_ground_ccpp, & + snowmelt_out_ccpp, & + snowmelt_shallow_ccpp, & + albedo_direct_snow_ccpp, & + albedo_diffuse_snow_ccpp, & + ch_vegetated_ccpp, & + ch_bare_ground_ccpp, & + sensible_heat_grd_veg_ccpp, & + sensible_heat_leaf_ccpp, & + sensible_heat_grd_bar_ccpp, & + latent_heat_grd_veg_ccpp, & + latent_heat_grd_bare_ccpp, & + ground_heat_veg_ccpp, & + ground_heat_bare_ccpp, & + lw_absorbed_grd_veg_ccpp, & + lw_absorbed_leaf_ccpp, & + lw_absorbed_grd_bare_ccpp, & + latent_heat_trans_ccpp, & + latent_heat_leaf_ccpp, & + ch_leaf_ccpp, & + ch_below_canopy_ccpp, & + ch_vegetated_2m_ccpp, & + ch_bare_ground_2m_ccpp, & + precip_adv_heat_veg_ccpp, & + precip_adv_heat_grd_v_ccpp, & + precip_adv_heat_grd_b_ccpp, & + spec_humid_sfc_veg_ccpp, & + spec_humid_sfc_bare_ccpp & + ) use machine , only : kind_phys use funcphys, only : fpvs - use sfc_diff, only : stability -! use module_sf_noahmplsm + use module_sf_noahmplsm, only : gfs_stability use module_sf_noahmp_glacier - use noahmp_tables, only : isice_table, co2_table, o2_table, & - isurban_table, smcref_table, smcdry_table, & - smcmax_table, co2_table, o2_table, & - saim_table, laim_table + use noahmp_tables implicit none @@ -199,6 +239,7 @@ subroutine noahmpdrv_run & real(kind=kind_phys), dimension(:) , intent(in) :: t1 ! layer 1 temperature [K] real(kind=kind_phys), dimension(:) , intent(in) :: q1 ! layer 1 specific humidity [kg/kg] integer , dimension(:) , intent(in) :: soiltyp ! soil type (integer index) + integer , dimension(:) , intent(in) :: soilcol ! soil color (integer index) integer , dimension(:) , intent(in) :: vegtype ! vegetation type (integer index) real(kind=kind_phys), dimension(:) , intent(in) :: sigmaf ! areal fractional cover of green vegetation real(kind=kind_phys), dimension(:) , intent(in) :: dlwflx ! downward longwave radiation [W/m2] @@ -245,6 +286,7 @@ subroutine noahmpdrv_run & integer , intent(in) :: iopt_tbot ! option for lower boundary condition of soil temperature integer , intent(in) :: iopt_stc ! option for snow/soil temperature time scheme (only layer 1) integer , intent(in) :: iopt_trs ! option for thermal roughness scheme + integer , intent(in) :: iopt_diag ! option for surface diagnose approach real(kind=kind_phys), dimension(:) , intent(in) :: xlatin ! latitude real(kind=kind_phys), dimension(:) , intent(in) :: xcoszin ! cosine of zenith angle integer , intent(in) :: iyrlen ! year length [days] @@ -358,6 +400,47 @@ subroutine noahmpdrv_run & character(len=*) , intent(out) :: errmsg integer , intent(out) :: errflg + real(kind=kind_phys), dimension(:) , intent(out), optional :: canopy_heat_storage_ccpp ! within-canopy heat [W/m2] + real(kind=kind_phys), dimension(:) , intent(out), optional :: rainfall_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: sw_absorbed_total_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: sw_reflected_total_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: lw_absorbed_total_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: temperature_bare_grd_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: temperature_veg_grd_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: temperature_veg_2m_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: temperature_bare_2m_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: spec_humidity_veg_2m_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: spec_humidity_bare_2m_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: sw_absorbed_veg_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: sw_absorbed_ground_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: snowmelt_out_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: snowmelt_shallow_ccpp + real(kind=kind_phys), dimension(:,:), intent(out), optional :: albedo_direct_snow_ccpp + real(kind=kind_phys), dimension(:,:), intent(out), optional :: albedo_diffuse_snow_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: ch_vegetated_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: ch_bare_ground_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: sensible_heat_grd_veg_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: sensible_heat_leaf_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: sensible_heat_grd_bar_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: latent_heat_grd_veg_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: latent_heat_grd_bare_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: ground_heat_veg_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: ground_heat_bare_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: lw_absorbed_grd_veg_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: lw_absorbed_leaf_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: lw_absorbed_grd_bare_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: latent_heat_trans_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: latent_heat_leaf_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: ch_leaf_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: ch_below_canopy_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: ch_vegetated_2m_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: ch_bare_ground_2m_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: precip_adv_heat_veg_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: precip_adv_heat_grd_v_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: precip_adv_heat_grd_b_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: spec_humid_sfc_veg_ccpp + real(kind=kind_phys), dimension(:) , intent(out), optional :: spec_humid_sfc_bare_ccpp + ! ! --- some new options, hard code for now ! @@ -367,6 +450,7 @@ subroutine noahmpdrv_run & integer :: iopt_pedo = 1 ! option for pedotransfer function integer :: iopt_crop = 0 ! option for crop model integer :: iopt_gla = 2 ! option for glacier treatment + integer :: iopt_z0m = 2 ! option for z0m treatment ! ! --- local inputs to noah-mp and glacier subroutines; listed in order in noah-mp call @@ -533,6 +617,10 @@ subroutine noahmpdrv_run & real (kind=kind_phys) :: lai_shaded ! out | shaded leaf area index [m2/m2] real (kind=kind_phys) :: leaf_air_resistance ! out | leaf boundary layer resistance [s/m] + real (kind=kind_phys) :: canopy_heat_storage ! out | within-canopy heat [W/m2] + real (kind=kind_phys) :: spec_humid_sfc_veg ! out | surface specific humidty over vegetation [kg/kg] + real (kind=kind_phys) :: spec_humid_sfc_bare ! out | surface specific humidty over bare soil [kg/kg] + real (kind=kind_phys) :: ustarx ! inout |surface friction velocity real (kind=kind_phys) :: prslkix ! in exner function real (kind=kind_phys) :: prsik1x ! in exner function @@ -556,6 +644,7 @@ subroutine noahmpdrv_run & integer :: soil_category(nsoil) integer :: slope_category integer :: soil_color_category + character(len=256) :: dataset_identifier real (kind=kind_phys) :: spec_humidity_sat ! saturation specific humidity real (kind=kind_phys) :: vapor_pressure_sat ! saturation vapor pressure @@ -613,6 +702,8 @@ subroutine noahmpdrv_run & ! --- noah-mp input variables (except snow_ice_frac_old done later) ! + dataset_identifier = "modified_igbp_modis_noah" + i_location = i j_location = -9999 latitude = xlatin(i) @@ -747,7 +838,9 @@ subroutine noahmpdrv_run & soil_category = soiltyp(i) slope_category = slopetyp(i) - soil_color_category = 4 + soil_color_category = soilcol(i) +! soil_color_category = 4 + call transfer_mp_parameters(vegetation_category, soil_category, & slope_category, soil_color_category, crop_type,parameters) @@ -755,7 +848,8 @@ subroutine noahmpdrv_run & call noahmp_options(idveg ,iopt_crs, iopt_btr , iopt_run, iopt_sfc, & iopt_frz, iopt_inf , iopt_rad, iopt_alb, & iopt_snf, iopt_tbot, iopt_stc, iopt_rsf, & - iopt_soil,iopt_pedo, iopt_crop,iopt_trs ) + iopt_soil,iopt_pedo, iopt_crop,iopt_trs, & + iopt_diag,iopt_z0m) if ( vegetation_category == isice_table ) then @@ -780,7 +874,7 @@ subroutine noahmpdrv_run & thsfc_loc ,prslkix ,prsik1x ,prslk1x , & air_pressure_surface ,pblhx ,iz0tlnd ,itime , & vegetation_frac ,area_grid ,psi_opt , & - con_fvirt ,con_eps ,con_cp , & + con_fvirt ,con_eps ,con_epsm1 ,con_cp , & snowfall ,snow_water_equiv_old ,snow_albedo_old , & cm_noahmp ,ch_noahmp ,snow_levels ,snow_water_equiv , & soil_moisture_vol ,interface_depth ,snow_depth ,snow_level_ice , & @@ -845,6 +939,7 @@ subroutine noahmpdrv_run & vegetation_fraction = vegetation_frac ch_vegetated = 0.0 ch_bare_ground = ch_noahmp + canopy_heat_storage = 0.0 else ! not glacier @@ -869,7 +964,7 @@ subroutine noahmpdrv_run & precip_graupel ,precip_hail ,temperature_soil_bot , & co2_air ,o2_air ,foliage_nitrogen , & snow_ice_frac_old ,forcing_height , & - con_fvirt ,con_eps ,con_cp , & + con_fvirt ,con_eps, con_epsm1 ,con_cp , & snow_albedo_old ,snow_water_equiv_old , & temperature_snow_soil ,soil_liquid_vol ,soil_moisture_vol , & temperature_canopy_air,vapor_pres_canopy_air ,canopy_wet_fraction , & @@ -909,12 +1004,13 @@ subroutine noahmpdrv_run & latent_heat_leaf ,ch_leaf ,ch_below_canopy , & ch_vegetated_2m ,ch_bare_ground_2m ,precip_frozen_frac , & precip_adv_heat_veg ,precip_adv_heat_grd_v ,precip_adv_heat_grd_b , & - precip_adv_heat_total ,snow_sublimation ,lai_sunlit , & + precip_adv_heat_total ,snow_sublimation ,canopy_heat_storage , & + lai_sunlit ,lai_shaded ,leaf_air_resistance , & #ifdef CCPP - lai_shaded ,leaf_air_resistance , & + spec_humid_sfc_veg ,spec_humid_sfc_bare , & errmsg ,errflg ) #else - lai_shaded ,leaf_air_resistance ) + spec_humid_sfc_veg ,spec_humid_sfc_bare ) #endif #ifdef CCPP @@ -1004,6 +1100,47 @@ subroutine noahmpdrv_run & zsnsoxy (i,:) = interface_depth + if(present(canopy_heat_storage_ccpp )) canopy_heat_storage_ccpp (i) = canopy_heat_storage + if(present(rainfall_ccpp )) rainfall_ccpp (i) = rainfall + if(present(sw_absorbed_total_ccpp )) sw_absorbed_total_ccpp (i) = sw_absorbed_total + if(present(sw_reflected_total_ccpp )) sw_reflected_total_ccpp (i) = sw_reflected_total + if(present(lw_absorbed_total_ccpp )) lw_absorbed_total_ccpp (i) = lw_absorbed_total + if(present(temperature_bare_grd_ccpp )) temperature_bare_grd_ccpp (i) = temperature_bare_grd + if(present(temperature_veg_grd_ccpp )) temperature_veg_grd_ccpp (i) = temperature_veg_grd + if(present(temperature_veg_2m_ccpp )) temperature_veg_2m_ccpp (i) = temperature_veg_2m + if(present(temperature_bare_2m_ccpp )) temperature_bare_2m_ccpp (i) = temperature_bare_2m + if(present(spec_humidity_veg_2m_ccpp )) spec_humidity_veg_2m_ccpp (i) = spec_humidity_veg_2m + if(present(spec_humidity_bare_2m_ccpp)) spec_humidity_bare_2m_ccpp(i) = spec_humidity_bare_2m + if(present(sw_absorbed_veg_ccpp )) sw_absorbed_veg_ccpp (i) = sw_absorbed_veg + if(present(sw_absorbed_ground_ccpp )) sw_absorbed_ground_ccpp (i) = sw_absorbed_ground + if(present(snowmelt_out_ccpp )) snowmelt_out_ccpp (i) = snowmelt_out + if(present(snowmelt_shallow_ccpp )) snowmelt_shallow_ccpp (i) = snowmelt_shallow + if(present(albedo_direct_snow_ccpp )) albedo_direct_snow_ccpp (i,:) = albedo_direct_snow + if(present(albedo_diffuse_snow_ccpp )) albedo_diffuse_snow_ccpp (i,:) = albedo_diffuse_snow + if(present(ch_vegetated_ccpp )) ch_vegetated_ccpp (i) = ch_vegetated + if(present(ch_bare_ground_ccpp )) ch_bare_ground_ccpp (i) = ch_bare_ground + if(present(sensible_heat_grd_veg_ccpp)) sensible_heat_grd_veg_ccpp(i) = sensible_heat_grd_veg + if(present(sensible_heat_leaf_ccpp )) sensible_heat_leaf_ccpp (i) = sensible_heat_leaf + if(present(sensible_heat_grd_bar_ccpp)) sensible_heat_grd_bar_ccpp(i) = sensible_heat_grd_bar + if(present(latent_heat_grd_veg_ccpp )) latent_heat_grd_veg_ccpp (i) = latent_heat_grd_veg + if(present(latent_heat_grd_bare_ccpp )) latent_heat_grd_bare_ccpp (i) = latent_heat_grd_bare + if(present(ground_heat_veg_ccpp )) ground_heat_veg_ccpp (i) = ground_heat_veg + if(present(ground_heat_bare_ccpp )) ground_heat_bare_ccpp (i) = ground_heat_bare + if(present(lw_absorbed_grd_veg_ccpp )) lw_absorbed_grd_veg_ccpp (i) = lw_absorbed_grd_veg + if(present(lw_absorbed_leaf_ccpp )) lw_absorbed_leaf_ccpp (i) = lw_absorbed_leaf + if(present(lw_absorbed_grd_bare_ccpp )) lw_absorbed_grd_bare_ccpp (i) = lw_absorbed_grd_bare + if(present(latent_heat_trans_ccpp )) latent_heat_trans_ccpp (i) = latent_heat_trans + if(present(latent_heat_leaf_ccpp )) latent_heat_leaf_ccpp (i) = latent_heat_leaf + if(present(ch_leaf_ccpp )) ch_leaf_ccpp (i) = ch_leaf + if(present(ch_below_canopy_ccpp )) ch_below_canopy_ccpp (i) = ch_below_canopy + if(present(ch_vegetated_2m_ccpp )) ch_vegetated_2m_ccpp (i) = ch_vegetated_2m + if(present(ch_bare_ground_2m_ccpp )) ch_bare_ground_2m_ccpp (i) = ch_bare_ground_2m + if(present(precip_adv_heat_veg_ccpp )) precip_adv_heat_veg_ccpp (i) = precip_adv_heat_veg + if(present(precip_adv_heat_grd_v_ccpp)) precip_adv_heat_grd_v_ccpp(i) = precip_adv_heat_grd_v + if(present(precip_adv_heat_grd_b_ccpp)) precip_adv_heat_grd_b_ccpp(i) = precip_adv_heat_grd_b + if(present(spec_humid_sfc_veg_ccpp )) spec_humid_sfc_veg_ccpp (i) = spec_humid_sfc_veg + if(present(spec_humid_sfc_bare_ccpp )) spec_humid_sfc_bare_ccpp (i) = spec_humid_sfc_bare + wslakexy (i) = lake_water ! not active fwetxy (i) = canopy_wet_fraction taussxy (i) = snow_age @@ -1051,7 +1188,7 @@ subroutine noahmpdrv_run & ! if ( .not. do_mynnsfclay) then !GFS sfcdiff if ( iopt_sfc .ne. 4 ) then !GFS sfcdiff - call stability & + call gfs_stability & (zf(i), zvfun(i), gdx, virtual_temperature, vptemp,wind(i), z0_total, z0h_total, & tvs1, con_g, thsfc_loc, & rb1(i), fm1(i), fh1(i), fm101(i), fh21(i), cm(i), ch(i), stress1(i), ustar1(i)) @@ -1198,10 +1335,12 @@ subroutine transfer_mp_parameters (vegtype,soiltype,slopetype, & parameters%z0mvt = z0mvt_table(vegtype) !momentum roughness length (m) parameters%hvt = hvt_table(vegtype) !top of canopy (m) parameters%hvb = hvb_table(vegtype) !bottom of canopy (m) + parameters%z0mhvt = z0mhvt_table(vegtype) !momentum roughness length (m) parameters%den = den_table(vegtype) !tree density (no. of trunks per m2) parameters%rc = rc_table(vegtype) !tree crown radius (m) parameters%mfsno = mfsno_table(vegtype) !snowmelt m parameter () parameters%scffac = scffac_table(vegtype) !snow cover factor + parameters%cbiom = cbiom_table(vegtype) !canopy biomass heat capacity parameter (m) parameters%saim = saim_table(vegtype,:) !monthly stem area index, one-sided parameters%laim = laim_table(vegtype,:) !monthly leaf area index, one-sided parameters%sla = sla_table(vegtype) !single-side leaf area per kg [m2/kg] diff --git a/physics/noahmpdrv.meta b/physics/noahmpdrv.meta index 633205de2..820da5740 100644 --- a/physics/noahmpdrv.meta +++ b/physics/noahmpdrv.meta @@ -174,6 +174,13 @@ dimensions = (horizontal_loop_extent) type = integer intent= in +[soilcol] + standard_name = soil_color_classification + long_name = soil color at each grid cell + units = index + dimensions = (horizontal_loop_extent) + type = integer + intent= in [vegtype] standard_name = vegetation_type_classification long_name = vegetation type at each grid cell @@ -453,6 +460,13 @@ dimensions = () type = integer intent = in +[iopt_diag] + standard_name = control_for_land_surface_scheme_surface_diagnose_approach + long_name = choice for surface diagnose approach option (see noahmp module for definition) + units = index + dimensions = () + type = integer + intent = in [xlatin] standard_name = latitude long_name = latitude diff --git a/physics/noahmptable.tbl b/physics/noahmptable.tbl new file mode 100644 index 000000000..3ffd5b532 --- /dev/null +++ b/physics/noahmptable.tbl @@ -0,0 +1,780 @@ +&noahmp_usgs_veg_categories + veg_dataset_description = "usgs" + nveg = 27 +/ +&noahmp_usgs_parameters + ! nveg = 27 + ! 1: urban and built-up land + ! 2: dryland cropland and pasture + ! 3: irrigated cropland and pasture + ! 4: mixed dryland/irrigated cropland and pasture + ! 5: cropland/grassland mosaic + ! 6: cropland/woodland mosaic + ! 7: grassland + ! 8: shrubland + ! 9: mixed shrubland/grassland + ! 10: savanna + ! 11: deciduous broadleaf forest + ! 12: deciduous needleleaf forest + ! 13: evergreen broadleaf forest + ! 14: evergreen needleleaf forest + ! 15: mixed forest + ! 16: water bodies + ! 17: herbaceous wetland + ! 18: wooded wetland + ! 19: barren or sparsely vegetated + ! 20: herbaceous tundra + ! 21: wooded tundra + ! 22: mixed tundra + ! 23: bare ground tundra + ! 24: snow or ice + ! 25: playa + ! 26: lava + ! 27: white sand + + isurban = 1 + iswater = 16 + isbarren = 19 + isice = 24 + iscrop = 2 + eblforest = 13 + natural = 5 + lcz_1 = 31 + lcz_2 = 32 + lcz_3 = 33 + lcz_4 = 34 + lcz_5 = 35 + lcz_6 = 36 + lcz_7 = 37 + lcz_8 = 38 + lcz_9 = 39 + lcz_10 = 40 + lcz_11 = 41 + + !--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 + !--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ch2op = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + dleaf = 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, + z0mvt = 1.00, 0.15, 0.15, 0.15, 0.14, 0.50, 0.12, 0.06, 0.09, 0.50, 0.80, 0.85, 1.10, 1.09, 0.80, 0.00, 0.12, 0.50, 0.00, 0.10, 0.30, 0.20, 0.03, 0.00, 0.01, 0.00, 0.00, + hvt = 15.0, 2.00, 2.00, 2.00, 1.50, 8.00, 1.00, 1.10, 1.10, 10.0, 16.0, 18.0, 20.0, 20.0, 16.0, 0.00, 0.50, 10.0, 0.00, 0.50, 4.00, 2.00, 0.50, 0.00, 0.10, 0.00, 0.00, + hvb = 1.00, 0.10, 0.10, 0.10, 0.10, 0.15, 0.05, 0.10, 0.10, 0.10, 11.5, 7.00, 8.00, 8.50, 10.0, 0.00, 0.05, 0.10, 0.00, 0.10, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, + z0mhvt= 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.00, 0.05, 0.05, 0.05, 0.05, 0.00, 0.05, 0.00, 0.00, + den = 0.01, 25.0, 25.0, 25.0, 25.0, 25.0, 100., 10.0, 10.0, 0.02, 0.10, 0.28, 0.02, 0.28, 0.10, 0.01, 10.0, 0.10, 0.01, 1.00, 1.00, 1.00, 1.00, 0.00, 0.01, 0.01, 0.01, + rc = 1.00, 0.08, 0.08, 0.08, 0.08, 0.08, 0.03, 0.12, 0.12, 3.00, 1.40, 1.20, 3.60, 1.20, 1.40, 0.01, 0.10, 1.40, 0.01, 0.30, 0.30, 0.30, 0.30, 0.00, 0.01, 0.01, 0.01, +!mfsno = 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, +! c. he 12/17/2020: optimized mfsno values dependent on land type based on evaluation with snotel swe and modis scf, surface albedo + mfsno = 4.00, 3.00, 3.00, 3.00, 4.00, 4.00, 2.00, 2.00, 2.00, 2.00, 1.00, 1.00, 1.00, 1.00, 1.00, 3.00, 3.00, 3.00, 3.00, 3.50, 3.50, 3.50, 3.50, 2.50, 3.50, 3.50, 3.50, +! c. he 12/17/2020: optimized snow cover factor (m) in scf formulation to replace original constant 2.5*z0,z0=0.002m, based on evaluation with snotel swe and modis scf, surface albedo + scffac= 0.042, 0.014, 0.014, 0.014, 0.026, 0.026, 0.020, 0.018, 0.016, 0.020, 0.008, 0.008, 0.008, 0.008, 0.008, 0.030, 0.020, 0.020, 0.016, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, 0.030, + cbiom = 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, + + ! row 1: vis + ! row 2: near ir + rhol_vis=0.00, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.07, 0.10, 0.10, 0.10, 0.07, 0.10, 0.07, 0.10, 0.00, 0.11, 0.10, 0.00, 0.10, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, + rhol_nir=0.00, 0.58, 0.58, 0.58, 0.58, 0.58, 0.58, 0.35, 0.45, 0.45, 0.45, 0.35, 0.45, 0.35, 0.45, 0.00, 0.58, 0.45, 0.00, 0.45, 0.45, 0.45, 0.45, 0.00, 0.45, 0.00, 0.00, + + ! row 1: vis + ! row 2: near ir + rhos_vis=0.00, 0.36, 0.36, 0.36, 0.36, 0.36, 0.36, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.00, 0.36, 0.16, 0.00, 0.16, 0.16, 0.16, 0.16, 0.00, 0.16, 0.00, 0.00, + rhos_nir=0.00, 0.58, 0.58, 0.58, 0.58, 0.58, 0.58, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.00, 0.58, 0.39, 0.00, 0.39, 0.39, 0.39, 0.39, 0.00, 0.39, 0.00, 0.00, + + ! row 1: vis + ! row 2: near ir + taul_vis=0.00, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.00, 0.07, 0.05, 0.00, 0.05, 0.05, 0.05, 0.05, 0.00, 0.05, 0.00, 0.00, + taul_nir=0.00, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.10, 0.10, 0.25, 0.25, 0.10, 0.25, 0.10, 0.25, 0.00, 0.25, 0.25, 0.00, 0.25, 0.25, 0.25, 0.25, 0.00, 0.25, 0.00, 0.00, + + ! row 1: vis + ! row 2: near ir + taus_vis=0.00, 0.220, 0.220, 0.220, 0.220, 0.220, 0.220, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.000, 0.220, 0.001, 0.000, 0.220, 0.001, 0.001, 0.001, 0.000, 0.001, 0.000, 0.000, + taus_nir=0.00, 0.380, 0.380, 0.380, 0.380, 0.380, 0.380, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.000, 0.380, 0.001, 0.000, 0.380, 0.001, 0.001, 0.001, 0.000, 0.001, 0.000, 0.000, + + xl = 0.000, -0.30, -0.30, -0.30, -0.30, -0.30, -0.30, 0.010, 0.250, 0.010, 0.250, 0.010, 0.010, 0.010, 0.250, 0.000, -0.30, 0.250, 0.000, -0.30, 0.250, 0.250, 0.250, 0.000, 0.250, 0.000, 0.000, + ! make cwpvt vegetation dependent according to j. goudriaan, crop micrometeorology: a simulation study (simulation monographs), 1977). c. he, 12/17/2020 + cwpvt = 0.18, 1.67, 1.67, 1.67, 1.67, 0.5, 5.0, 1.0, 2.0, 1.0, 0.67, 0.18, 0.67, 0.18, 0.29, 0.18, 1.67, 0.67, 0.18, 1.67, 0.67, 1.00, 0.18, 0.18, 0.18, 0.18, 0.18, + c3psn = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + kc25 = 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, + akc = 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, + ko25 = 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, + ako = 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, + avcmx = 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, + aqe = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + + ltovrc= 0.0, 1.2, 1.2, 1.2, 1.2, 1.30, 0.50, 0.65, 0.70, 0.65, 0.55, 0.2, 0.55, 0.5, 0.5, 0.0, 1.4, 1.4, 0.0, 1.2, 1.3, 1.4, 1.0, 0.0, 1.0, 0.0, 0.0, + dilefc= 0.00, 0.50, 0.50, 0.50, 0.35, 0.20, 0.20, 0.20, 0.50, 0.50, 0.60, 1.80, 0.50, 1.20, 0.80, 0.00, 0.40, 0.40, 0.00, 0.40, 0.30, 0.40, 0.30, 0.00, 0.30, 0.00, 0.00, + dilefw= 0.00, 0.20, 0.20, 0.20, 0.20, 0.20, 0.10, 0.20, 0.20, 0.50, 0.20, 0.20, 4.00, 0.20, 0.20, 0.00, 0.20, 0.20, 0.00, 0.20, 0.20, 0.20, 0.20, 0.00, 0.20, 0.00, 0.00, + rmf25 = 0.00, 1.00, 1.40, 1.45, 1.45, 1.45, 1.80, 0.26, 0.26, 0.80, 3.00, 4.00, 0.65, 3.00, 3.00, 0.00, 3.20, 3.20, 0.00, 3.20, 3.00, 3.00, 3.00, 0.00, 3.00, 0.00, 0.00, + sla = 60, 80, 80, 80, 80, 80, 60, 60, 60, 50, 80, 80, 80, 80, 80, 0, 80, 80, 0, 80, 80, 80, 80, 0, 80, 0, 0, + fragr = 0.00, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.10, 0.20, 0.10, 0.10, 0.00, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, + tmin = 0, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 268, 273, 265, 268, 0, 268, 268, 0, 268, 268, 268, 268, 0, 268, 0, 0, + vcmx25= 0.00, 80.0, 80.0, 80.0, 60.0, 70.0, 40.0, 40.0, 40.0, 40.0, 60.0, 60.0, 60.0, 50.0, 55.0, 0.00, 50.0, 50.0, 0.00, 50.0, 50.0, 50.0, 50.0, 0.00, 50.0, 0.00, 0.00, + tdlef = 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 268, 278, 278, 268, 0, 268, 268, 0, 268, 268, 268, 268, 0, 268, 0, 0, + bp = 1.e15, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 1.e15, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 1.e15, 2.e3, 1.e15, 1.e15, + mp = 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 6., 9., 6., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., + qe25 = 0., 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.00, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.00, 0.06, 0.00, 0.00, + rms25 = 0.00, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.32, 0.10, 0.64, 0.30, 0.90, 0.80, 0.00, 0.10, 0.10, 0.00, 0.10, 0.10, 0.10, 0.00, 0.00, 0.00, 0.00, 0.00, + rmr25 = 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.20, 0.00, 0.00, 0.01, 0.01, 0.05, 0.05, 0.36, 0.03, 0.00, 0.00, 0.00, 0.00, 2.11, 2.11, 2.11, 0.00, 0.00, 0.00, 0.00, 0.00, + arm = 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + folnmx= 0.00, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 0.00, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 0.00, 1.5, 0.00, 0.00, + wdpool= 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 0.00, 0.00, 1.00, 0.00, 0.00, 1.00, 1.00, 0.00, 0.00, 0.00, 0.00, 0.00, + wrrat = 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.00, 3.00, 3.00, 30.0, 30.0, 30.0, 30.0, 30.0, 0.00, 0.00, 30.0, 0.00, 0.00, 3.00, 3.00, 0.00, 0.00, 0.00, 0.00, 0.00, + mrp = 0.00, 0.23, 0.23, 0.23, 0.23, 0.23, 0.17, 0.19, 0.19, 0.40, 0.40, 0.37, 0.23, 0.37, 0.30, 0.00, 0.17, 0.40, 0.00, 0.17, 0.23, 0.20, 0.00, 0.00, 0.20, 0.00, 0.00, + nroot = 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 2, 2, 1, 3, 3, 3, 2, 1, 1, 0, 0, + rgl = 999.0, 100.0, 100.0, 100.0, 100.0, 65.0, 100.0, 100.0, 100.0, 65.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 30.0, 999.0, 100.0, 100.0, 100.0, 100.0, 999.0, 100.0, 999.0, 999.0, + rs = 200.0, 40.0, 40.0, 40.0, 40.0, 70.0, 40.0, 300.0, 170.0, 70.0, 100.0, 150.0, 150.0, 125.0, 125.0, 100.0, 40.0, 100.0, 999.0, 150.0, 150.0, 150.0, 200.0, 999.0, 40.0, 999.0, 999.0, + hs = 999.0, 36.25, 36.25, 36.25, 36.25, 44.14, 36.35, 42.00, 39.18, 54.53, 54.53, 47.35, 41.69, 47.35, 51.93, 51.75, 60.00, 51.93, 999.0, 42.00, 42.00, 42.00, 42.00, 999.0, 36.25, 999.0, 999.0, + topt = 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, + rsmax = 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., + rtovrc = 2.e-8,2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, + rswoodc= 3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10,3.e-10, + bf = 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, + wstrc = 100.0,100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, + laimin = 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, + xsamin = 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, + +! monthly values, one row for each month: + sai_jan = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.3, 0.5, 0.4, 0.4, 0.0, 0.2, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_feb = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.3, 0.5, 0.4, 0.4, 0.0, 0.2, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_mar = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.3, 0.5, 0.4, 0.4, 0.0, 0.2, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_apr = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.4, 0.5, 0.3, 0.4, 0.0, 0.2, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_may = 0.0, 0.2, 0.2, 0.2, 0.3, 0.3, 0.3, 0.2, 0.2, 0.3, 0.4, 0.4, 0.5, 0.4, 0.4, 0.0, 0.3, 0.3, 0.0, 0.1, 0.2, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_jun = 0.0, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.2, 0.3, 0.4, 0.4, 0.7, 0.5, 0.5, 0.4, 0.0, 0.4, 0.4, 0.0, 0.2, 0.2, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_jul = 0.0, 0.4, 0.4, 0.4, 0.6, 0.6, 0.8, 0.4, 0.6, 0.8, 0.9, 1.3, 0.5, 0.5, 0.7, 0.0, 0.6, 0.6, 0.0, 0.4, 0.4, 0.4, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_aug = 0.0, 0.5, 0.5, 0.5, 0.9, 0.9, 1.3, 0.6, 0.9, 1.2, 1.2, 1.2, 0.5, 0.6, 0.8, 0.0, 0.9, 0.9, 0.0, 0.6, 0.6, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_sep = 0.0, 0.4, 0.4, 0.4, 0.7, 1.0, 1.1, 0.8, 1.0, 1.3, 1.6, 1.0, 0.5, 0.6, 1.0, 0.0, 0.7, 1.0, 0.0, 0.7, 0.8, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_oct = 0.0, 0.3, 0.3, 0.3, 0.3, 0.8, 0.4, 0.7, 0.6, 0.7, 1.4, 0.8, 0.5, 0.7, 1.0, 0.0, 0.3, 0.8, 0.0, 0.5, 0.7, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_nov = 0.0, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.3, 0.3, 0.4, 0.6, 0.6, 0.5, 0.6, 0.5, 0.0, 0.3, 0.4, 0.0, 0.3, 0.3, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, + sai_dec = 0.0, 0.3, 0.3, 0.3, 0.3, 0.3, 0.4, 0.2, 0.3, 0.4, 0.4, 0.5, 0.5, 0.5, 0.4, 0.0, 0.3, 0.4, 0.0, 0.2, 0.2, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, + + lai_jan = 0.0, 0.0, 0.0, 0.0, 0.2, 0.0, 0.4, 0.0, 0.2, 0.3, 0.0, 0.0, 4.5, 4.0, 2.0, 0.0, 0.2, 0.2, 0.0, 0.2, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_feb = 0.0, 0.0, 0.0, 0.0, 0.3, 0.0, 0.5, 0.0, 0.3, 0.3, 0.0, 0.0, 4.5, 4.0, 2.0, 0.0, 0.3, 0.3, 0.0, 0.3, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_mar = 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.6, 0.2, 0.4, 0.5, 0.3, 0.0, 4.5, 4.0, 2.2, 0.0, 0.3, 0.3, 0.0, 0.3, 1.1, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_apr = 0.0, 0.0, 0.0, 0.0, 0.4, 0.6, 0.7, 0.6, 0.7, 0.8, 1.2, 0.6, 4.5, 4.0, 2.6, 0.0, 0.4, 0.6, 0.0, 0.4, 1.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_may = 0.0, 1.0, 1.0, 1.0, 1.1, 2.0, 1.2, 1.5, 1.4, 1.8, 3.0, 1.2, 4.5, 4.0, 3.5, 0.0, 1.1, 2.0, 0.0, 0.6, 1.7, 1.2, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_jun = 0.0, 2.0, 2.0, 2.0, 2.5, 3.3, 3.0, 2.3, 2.6, 3.6, 4.7, 2.0, 4.5, 4.0, 4.3, 0.0, 2.5, 3.3, 0.0, 1.5, 2.1, 1.8, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_jul = 0.0, 3.0, 3.0, 3.0, 3.2, 3.7, 3.5, 2.3, 2.9, 3.8, 4.5, 2.6, 4.5, 4.0, 4.3, 0.0, 3.2, 3.7, 0.0, 1.7, 2.1, 1.8, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_aug = 0.0, 3.0, 3.0, 3.0, 2.2, 3.2, 1.5, 1.7, 1.6, 2.1, 3.4, 1.7, 4.5, 4.0, 3.7, 0.0, 2.2, 3.2, 0.0, 0.8, 1.8, 1.3, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_sep = 0.0, 1.5, 1.5, 1.5, 1.1, 1.3, 0.7, 0.6, 0.7, 0.9, 1.2, 1.0, 4.5, 4.0, 2.6, 0.0, 1.1, 1.3, 0.0, 0.4, 1.3, 0.8, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_oct = 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.6, 0.2, 0.4, 0.5, 0.3, 0.5, 4.5, 4.0, 2.2, 0.0, 0.3, 0.3, 0.0, 0.3, 1.1, 0.7, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_nov = 0.0, 0.0, 0.0, 0.0, 0.3, 0.0, 0.5, 0.0, 0.3, 0.3, 0.0, 0.2, 4.5, 4.0, 2.0, 0.0, 0.3, 0.3, 0.0, 0.2, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, + lai_dec = 0.0, 0.0, 0.0, 0.0, 0.2, 0.0, 0.4, 0.0, 0.2, 0.3, 0.0, 0.0, 4.5, 4.0, 2.0, 0.0, 0.2, 0.2, 0.0, 0.2, 1.0, 0.6, 0.0, 0.0, 0.0, 0.0, 0.0, + +! five types, one row for each type (bvoc currently not active). + eps1 = 41.87, 0.00, 0.00, 2.52, 0.04, 17.11, 0.02, 21.62, 0.11, 22.80, 46.86, 0.00, 0.00, 0.46, 30.98, 2.31, 1.63, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + eps2 = 0.98, 0.00, 0.00, 0.16, 0.09, 0.28, 0.05, 0.92, 0.22, 0.59, 0.38, 0.00, 0.00, 3.34, 0.96, 1.47, 1.07, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + eps3 = 1.82, 0.00, 0.00, 0.23, 0.05, 0.81, 0.03, 1.73, 1.26, 1.37, 1.84, 0.00, 0.00, 1.85, 1.84, 1.70, 1.21, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + eps4 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + eps5 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, +/ + +&noahmp_modis_veg_categories + veg_dataset_description = "modified igbp modis noah" + nveg = 20 +/ + +&noahmp_modis_parameters +! 1 'evergreen needleleaf forest' -> usgs 14 +! 2, 'evergreen broadleaf forest' -> usgs 13 +! 3, 'deciduous needleleaf forest' -> usgs 12 +! 4, 'deciduous broadleaf forest' -> usgs 11 +! 5, 'mixed forests' -> usgs 15 +! 6, 'closed shrublands' -> usgs 8 "shrubland" +! 7, 'open shrublands' -> usgs 9 "shrubland/grassland" +! 8, 'woody savannas' -> usgs 8 "shrubland" +! 9, 'savannas' -> usgs 10 +! 10, 'grasslands' -> usgs 7 +! 11 'permanent wetlands' -> avg of usgs 17 and 18 (herb. wooded wetland) +! 12, 'croplands' -> usgs 2 "dryland cropland" +! 13, 'urban and built-up' -> usgs 1 +! 14 'cropland/natural vegetation mosaic' -> usgs 5 "cropland/grassland" +! 15, 'snow and ice' -> usgs 24 +! 16, 'barren or sparsely vegetated' -> usgs 19 +! 17, 'water' -> usgs 16 +! 18, 'wooded tundra' -> usgs 21 +! 19, 'mixed tundra' -> usgs 22 +! 20, 'barren tundra' -> usgs 23 + + isurban = 13 + iswater = 17 + isbarren = 16 + isice = 15 + iscrop = 12 + eblforest = 2 + natural = 14 + lcz_1 = 31 + lcz_2 = 32 + lcz_3 = 33 + lcz_4 = 34 + lcz_5 = 35 + lcz_6 = 36 + lcz_7 = 37 + lcz_8 = 38 + lcz_9 = 39 + lcz_10 = 40 + lcz_11 = 41 + !--------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + !--------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ch2op = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, + dleaf = 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, + z0mvt = 1.09, 1.10, 0.85, 0.80, 0.80, 0.20, 0.06, 0.60, 0.50, 0.12, 0.30, 0.15, 1.00, 0.14, 0.00, 0.00, 0.00, 0.30, 0.20, 0.03, + hvt = 20.0, 20.0, 18.0, 16.0, 16.0, 1.10, 1.10, 13.0, 10.0, 1.00, 5.00, 2.00, 15.0, 1.50, 0.00, 0.00, 0.00, 4.00, 2.00, 0.50, + hvb = 8.50, 8.00, 7.00, 11.5, 10.0, 0.10, 0.10, 0.10, 0.10, 0.05, 0.10, 0.10, 1.00, 0.10, 0.00, 0.00, 0.00, 0.30, 0.20, 0.10, + z0mhvt= 0.0545, 0.055, 0.047, 0.050, 0.050, 0.182, 0.0545, 0.046, 0.050, 0.120, 0.060, 0.075, 0.067, 0.093, 0.000, 0.000, 0.000, 0.075, 0.100, 0.060, + den = 0.28, 0.02, 0.28, 0.10, 0.10, 10.0, 10.0, 10.0, 0.02, 100., 5.05, 25.0, 0.01, 25.0, 0.00, 0.01, 0.01, 1.00, 1.00, 1.00, + rc = 1.20, 3.60, 1.20, 1.40, 1.40, 0.12, 0.12, 0.12, 3.00, 0.03, 0.75, 0.08, 1.00, 0.08, 0.00, 0.01, 0.01, 0.30, 0.30, 0.30, +!mfsno = 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, 2.50, +! c. he 12/17/2020: optimized mfsno values dependent on land type based on evaluation with snotel swe and modis scf, surface albedo + mfsno = 1.00, 1.00, 1.00, 1.00, 1.00, 2.00, 2.00, 2.00, 2.00, 2.00, 3.00, 3.00, 4.00, 4.00, 2.50, 3.00, 3.00, 3.50, 3.50, 3.50, +! c. he 12/17/2020: optimized snow cover factor (m) in scf formulation to replace original constant 2.5*z0,z0=0.002m, based on evaluation with snotel swe and modis scf, surface albedo +! scffac = 0.008, 0.008, 0.008, 0.008, 0.008, 0.016, 0.016, 0.020, 0.020, 0.020, 0.020, 0.014, 0.042, 0.026, 0.030, 0.016, 0.030, 0.030, 0.030, 0.030, + scffac = 0.005, 0.005, 0.005, 0.005, 0.005, 0.008, 0.008, 0.010, 0.010, 0.010, 0.010, 0.007, 0.021, 0.013, 0.015, 0.008, 0.015, 0.015, 0.015, 0.015, + cbiom = 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, + + ! row 1: vis + ! row 2: near ir + rhol_vis=0.07, 0.10, 0.07, 0.10, 0.10, 0.07, 0.07, 0.07, 0.10, 0.11, 0.105, 0.11, 0.00, 0.11, 0.00, 0.00, 0.00, 0.10, 0.10, 0.10, + rhol_nir=0.35, 0.45, 0.35, 0.45, 0.45, 0.35, 0.35, 0.35, 0.45, 0.58, 0.515, 0.58, 0.00, 0.58, 0.00, 0.00, 0.00, 0.45, 0.45, 0.45, + + ! row 1: vis + ! row 2: near ir + rhos_vis=0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.36, 0.26, 0.36, 0.00, 0.36, 0.00, 0.00, 0.00, 0.16, 0.16, 0.16, + rhos_nir=0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.39, 0.58, 0.485, 0.58, 0.00, 0.58, 0.00, 0.00, 0.00, 0.39, 0.39, 0.39, + + ! row 1: vis + ! row 2: near ir + taul_vis=0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.07, 0.06, 0.07, 0.00, 0.07, 0.00, 0.00, 0.00, 0.05, 0.05, 0.05, + taul_nir=0.10, 0.25, 0.10, 0.25, 0.25, 0.10, 0.10, 0.10, 0.25, 0.25, 0.25, 0.25, 0.00, 0.25, 0.00, 0.00, 0.00, 0.25, 0.25, 0.25, + + ! row 1: vis + ! row 2: near ir + taus_vis=0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.220, 0.1105, 0.220, 0.000, 0.220, 0.000, 0.000, 0.000, 0.001, 0.001, 0.001, + taus_nir=0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.380, 0.1905, 0.380, 0.000, 0.380, 0.000, 0.000, 0.000, 0.001, 0.001, 0.001, + + xl = 0.010, 0.010, 0.010, 0.250, 0.250, 0.010, 0.010, 0.010, 0.010, -0.30, -0.025, -0.30, 0.000, -0.30, 0.000, 0.000, 0.000, 0.250, 0.250, 0.250, +! make cwpvt vegetation dependent according to j. goudriaan, crop micrometeorology: a simulation study (simulation monographs), 1977). c. he, 12/17/2020 +! cwpvt = 0.18, 0.67, 0.18, 0.67, 0.29, 1.0, 2.0, 1.3, 1.0, 5.0, 1.17, 1.67, 1.67, 1.67, 0.18, 0.18, 0.18, 0.67, 1.0, 0.18, + cwpvt = 0.09, 0.335, 0.09, 0.335, 0.145, 0.5, 1.0, 0.65, 0.5, 2.5, 0.585, 0.835, 0.835, 0.835, 0.09, 0.09, 0.09, 0.335, 0.5, 0.09, + c3psn = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + kc25 = 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, + akc = 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, 2.1, + ko25 = 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, + ako = 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, + avcmx = 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, 2.4, + aqe = 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, + + ltovrc= 0.5, 0.55, 0.2, 0.55, 0.5, 0.65, 0.65, 0.65, 0.65, 0.50, 1.4, 1.6, 0.0, 1.2, 0.0, 0.0, 0.0, 1.3, 1.4, 1.0, + dilefc= 1.20, 0.50, 1.80, 0.60, 0.80, 0.20, 0.20, 0.20, 0.50, 0.20, 0.4, 0.50, 0.00, 0.35, 0.00, 0.00, 0.00, 0.30, 0.40, 0.30, + dilefw= 0.20, 4.00, 0.20, 0.20, 0.20, 0.20, 0.20, 0.20, 0.50, 0.10, 0.2, 0.20, 0.00, 0.20, 0.00, 0.00, 0.00, 0.20, 0.20, 0.20, + rmf25 = 3.00, 0.65, 4.00, 3.00, 3.00, 0.26, 0.26, 0.26, 0.80, 1.80, 3.2, 1.00, 0.00, 1.45, 0.00, 0.00, 0.00, 3.00, 3.00, 3.00, + sla = 80, 80, 80, 80, 80, 60, 60, 60, 50, 60, 80, 80, 60, 80, 0, 0, 0, 80, 80, 80, + fragr = 0.10, 0.20, 0.10, 0.20, 0.10, 0.20, 0.20, 0.20, 0.20, 0.20, 0.1, 0.20, 0.00, 0.20, 0.00, 0.10, 0.00, 0.10, 0.10, 0.10, + tmin = 265, 273, 268, 273, 268, 273, 273, 273, 273, 273, 268, 273, 0, 273, 0, 0, 0, 268, 268, 268, + vcmx25= 50.0, 60.0, 60.0, 60.0, 55.0, 40.0, 40.0, 40.0, 40.0, 40.0, 50.0, 80.0, 0.00, 60.0, 0.00, 0.00, 0.00, 50.0, 50.0, 50.0, + tdlef = 278, 278, 268, 278, 268, 278, 278, 278, 278, 278, 268, 278, 278, 278, 0, 0, 0, 268, 268, 268, + bp = 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 2.e3, 1.e15, 2.e3, 1.e15, 2.e3, 1.e15, 2.e3, 2.e3, 2.e3, + mp = 6., 9., 6., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., 9., + qe25 = 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.00, 0.06, 0.00, 0.06, 0.00, 0.06, 0.06, 0.06, + rms25 = 0.90, 0.30, 0.64, 0.10, 0.80, 0.10, 0.10, 0.10, 0.32, 0.10, 0.10, 0.10, 0.00, 0.10, 0.00, 0.00, 0.00, 0.10, 0.10, 0.00, + rmr25 = 0.36, 0.05, 0.05, 0.01, 0.03, 0.00, 0.00, 0.00, 0.01, 1.20, 0.0, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 2.11, 2.11, 0.00, + arm = 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, + folnmx= 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 0.00, 1.5, 0.00, 1.5, 0.00, 1.5, 1.5, 1.5, + wdpool= 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 0.00, 0.5, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 1.00, 1.00, 0.00, + wrrat = 30.0, 30.0, 30.0, 30.0, 30.0, 3.00, 3.00, 3.00, 3.00, 0.00, 15.0, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 3.00, 3.00, 0.00, + mrp = 0.37, 0.23, 0.37, 0.40, 0.30, 0.19, 0.19, 0.19, 0.40, 0.17, 0.285, 0.23, 0.00, 0.23, 0.00, 0.00, 0.00, 0.23, 0.20, 0.00, + nroot = 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 3, 1, 3, 1, 1, 0, 3, 3, 2, + rgl = 30.0, 30.0, 30.0, 30.0, 30.0, 100.0, 100.0, 100.0, 65.0, 100.0, 65.0, 100.0, 999.0, 100.0, 999.0, 999.0, 30.0, 100.0, 100.0, 100.0, + rs = 125.0, 150.0, 150.0, 100.0, 125.0, 300.0, 170.0, 300.0, 70.0, 40.0, 70.0, 40.0, 200.0, 40.0, 999.0, 999.0, 100.0, 150.0, 150.0, 200.0, + hs = 47.35, 41.69, 47.35, 54.53, 51.93, 42.00, 39.18, 42.00, 54.53, 36.35, 55.97, 36.25, 999.0, 36.25, 999.0, 999.0, 51.75, 42.00, 42.00, 42.00, + topt = 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, 298.0, + rsmax = 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., 5000., + rtovrc = 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, 2.e-8, + rswoodc= 3.e-10,3.e-10,3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, 3.e-10, + bf = 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, + wstrc = 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, + laimin = 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, + xsamin = 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, + +! monthly values, one row for each month: + sai_jan = 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, + sai_feb = 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, + sai_mar = 0.4, 0.5, 0.3, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, + sai_apr = 0.3, 0.5, 0.4, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, + sai_may = 0.4, 0.5, 0.4, 0.4, 0.4, 0.3, 0.2, 0.4, 0.3, 0.3, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.1, 0.0, + sai_jun = 0.5, 0.5, 0.7, 0.4, 0.4, 0.3, 0.2, 0.4, 0.4, 0.4, 0.4, 0.3, 0.0, 0.4, 0.0, 0.0, 0.0, 0.2, 0.2, 0.0, + sai_jul = 0.5, 0.5, 1.3, 0.9, 0.7, 0.6, 0.4, 0.7, 0.8, 0.8, 0.6, 0.4, 0.0, 0.6, 0.0, 0.0, 0.0, 0.4, 0.4, 0.0, + sai_aug = 0.6, 0.5, 1.2, 1.2, 0.8, 0.9, 0.6, 1.2, 1.2, 1.3, 0.9, 0.5, 0.0, 0.9, 0.0, 0.0, 0.0, 0.6, 0.6, 0.0, + sai_sep = 0.6, 0.5, 1.0, 1.6, 1.0, 1.2, 0.8, 1.4, 1.3, 1.1, 0.9, 0.4, 0.0, 0.7, 0.0, 0.0, 0.0, 0.8, 0.7, 0.0, + sai_oct = 0.7, 0.5, 0.8, 1.4, 1.0, 0.9, 0.7, 1.1, 0.7, 0.4, 0.6, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.7, 0.5, 0.0, + sai_nov = 0.6, 0.5, 0.6, 0.6, 0.5, 0.4, 0.3, 0.5, 0.4, 0.4, 0.4, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.3, 0.3, 0.0, + sai_dec = 0.5, 0.5, 0.5, 0.4, 0.4, 0.3, 0.2, 0.4, 0.4, 0.4, 0.3, 0.3, 0.0, 0.3, 0.0, 0.0, 0.0, 0.2, 0.2, 0.0, + + lai_jan = 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, 0.0, 0.2, 0.3, 0.4, 0.2, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 1.0, 0.6, 0.0, + lai_feb = 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, 0.0, 0.2, 0.3, 0.5, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 1.0, 0.6, 0.0, + lai_mar = 4.0, 4.5, 0.0, 0.3, 2.2, 0.3, 0.2, 0.4, 0.5, 0.6, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 1.1, 0.7, 0.0, + lai_apr = 4.0, 4.5, 0.6, 1.2, 2.6, 0.9, 0.6, 1.0, 0.8, 0.7, 0.5, 0.0, 0.0, 0.4, 0.0, 0.0, 0.0, 1.3, 0.8, 0.0, + lai_may = 4.0, 4.5, 1.2, 3.0, 3.5, 2.2, 1.5, 2.4, 1.8, 1.2, 1.5, 1.0, 0.0, 1.1, 0.0, 0.0, 0.0, 1.7, 1.2, 0.0, + lai_jun = 4.0, 4.5, 2.0, 4.7, 4.3, 3.5, 2.3, 4.1, 3.6, 3.0, 2.9, 2.0, 0.0, 2.5, 0.0, 0.0, 0.0, 2.1, 1.8, 0.0, + lai_jul = 4.0, 4.5, 2.6, 4.5, 4.3, 3.5, 2.3, 4.1, 3.8, 3.5, 3.5, 3.0, 0.0, 3.2, 0.0, 0.0, 0.0, 2.1, 1.8, 0.0, + lai_aug = 4.0, 4.5, 1.7, 3.4, 3.7, 2.5, 1.7, 2.7, 2.1, 1.5, 2.7, 3.0, 0.0, 2.2, 0.0, 0.0, 0.0, 1.8, 1.3, 0.0, + lai_sep = 4.0, 4.5, 1.0, 1.2, 2.6, 0.9, 0.6, 1.0, 0.9, 0.7, 1.2, 1.5, 0.0, 1.1, 0.0, 0.0, 0.0, 1.3, 0.8, 0.0, + lai_oct = 4.0, 4.5, 0.5, 0.3, 2.2, 0.3, 0.2, 0.4, 0.5, 0.6, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 1.1, 0.7, 0.0, + lai_nov = 4.0, 4.5, 0.2, 0.0, 2.0, 0.0, 0.0, 0.2, 0.3, 0.5, 0.3, 0.0, 0.0, 0.3, 0.0, 0.0, 0.0, 1.0, 0.6, 0.0, + lai_dec = 4.0, 4.5, 0.0, 0.0, 2.0, 0.0, 0.0, 0.2, 0.3, 0.4, 0.2, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 1.0, 0.6, 0.0, + +! five types, one row for each type (bvoc currently not active). + eps1 = 0.46, 0.00, 0.00, 46.86, 30.98, 21.62, 0.11, 21.62, 22.80, 0.02, 0.815, 0.00, 41.87, 0.04, 0.0, 0.0, 2.31, 0.0, 0.0, 0.0, + eps2 = 3.34, 0.00, 0.00, 0.38, 0.96, 0.92, 0.22, 0.92, 0.59, 0.05, 0.535, 0.00, 0.98, 0.09, 0.0, 0.0, 1.47, 0.0, 0.0, 0.0, + eps3 = 1.85, 0.00, 0.00, 1.84, 1.84, 1.73, 1.26, 1.73, 1.37, 0.03, 0.605, 0.00, 1.82, 0.05, 0.0, 0.0, 1.70, 0.0, 0.0, 0.0, + eps4 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + eps5 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + +/ + +&noahmp_rad_parameters + !-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + ! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 soil color index for soil albedo + !-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + albsat_vis = 0.25, 0.23, 0.21, 0.20, 0.19, 0.18, 0.17, 0.16, 0.15, 0.14, 0.13, 0.12, 0.11, 0.10, 0.09, 0.08, 0.07, 0.06, 0.05, 0.04 ! saturated soil albedos + albsat_nir = 0.50, 0.46, 0.42, 0.40, 0.38, 0.36, 0.34, 0.32, 0.30, 0.28, 0.26, 0.24, 0.22, 0.20, 0.18, 0.16, 0.14, 0.12, 0.10, 0.08 ! saturated soil albedos + albdry_vis = 0.36, 0.34, 0.32, 0.31, 0.30, 0.29, 0.28, 0.27, 0.26, 0.25, 0.24, 0.23, 0.22, 0.20, 0.18, 0.16, 0.14, 0.12, 0.10, 0.08 ! dry soil albedos + albdry_nir = 0.61, 0.57, 0.53, 0.51, 0.49, 0.48, 0.45, 0.43, 0.41, 0.39, 0.37, 0.35, 0.33, 0.31, 0.29, 0.27, 0.25, 0.23, 0.21, 0.16 ! dry soil albedos + albice = 0.80, 0.55 ! albedo land ice: 1=vis, 2=nir + alblak = 0.60, 0.40 ! albedo frozen lakes: 1=vis, 2=nir + omegas = 0.8 , 0.4 ! two-stream parameter omega for snow + betads = 0.5 ! two-stream parameter betad for snow + betais = 0.5 ! two-stream parameter betai for snow + eg = 0.97, 0.98 ! emissivity soil surface 1-soil;2-lake + eice = 0.98 ! emissivity ice surface +/ + +&noahmp_global_parameters + +! atmospheric constituants + + co2 = 395.e-06 !co2 partial pressure + o2 = 0.209 !o2 partial pressure + +! runoff parameters used for simtop and simgm: + + timean = 10.5 !gridcell mean topgraphic index (global mean) + fsatmx = 0.38 !maximum surface saturated fraction (global mean) + +! adjustable parameters for snow processes + + z0sno = 0.002 !snow surface roughness length (m) (0.002) + ssi = 0.03 !liquid water holding capacity for snowpack (m3/m3) (0.03) + snow_ret_fac = 5.e-5 !snowpack water release timescale factor (1/s) + snow_emis = 0.95 !snow emissivity (bring from hard-coded value of 1.0 to here) + swemx = 1.00 !new snow mass to fully cover old snow (mm) + !equivalent to 10mm depth (density = 100 kg/m3) + tau0 = 1.e6 !tau0 from yang97 eqn. 10a + grain_growth = 5000. !growth from vapor diffusion yang97 eqn. 10b + extra_growth = 10. !extra growth near freezing yang97 eqn. 10c + dirt_soot = 0.3 !dirt and soot term yang97 eqn. 10d + bats_cosz = 2.0 !zenith angle snow albedo adjustment; b in yang97 eqn. 15 + bats_vis_new = 0.95 !new snow visible albedo + bats_nir_new = 0.65 !new snow nir albedo + bats_vis_age = 0.2 !age factor for diffuse visible snow albedo yang97 eqn. 17 + bats_nir_age = 0.5 !age factor for diffuse nir snow albedo yang97 eqn. 18 + bats_vis_dir = 0.4 !cosz factor for direct visible snow albedo yang97 eqn. 15 + bats_nir_dir = 0.4 !cosz factor for direct nir snow albedo yang97 eqn. 16 + rsurf_snow = 50.0 !surface resistence for snow [s/m] + rsurf_exp = 5.0 !exponent in the shape parameter for soil resistance option 1 + c2_snowcompact = 21.e-3 !overburden snow compaction parameter (m3/kg) cenlin + c3_snowcompact = 2.5e-6 !snow desctructive metamorphism compaction parameter1 [1/s] cenlin + c4_snowcompact = 0.04 !snow desctructive metamorphism compaction parameter2 [1/k] cenlin + c5_snowcompact = 2.0 !snow desctructive metamorphism compaction parameter3 cenlin + dm_snowcompact = 100.0 !upper limit on destructive metamorphism compaction [kg/m3] cenlin + eta0_snowcompact = 0.8e+6 !snow viscosity coefficient [kg-s/m2], anderson1979: 0.52e6~1.38e6 cenlin + snliqmaxfrac = 0.4 !maximum liquid water fraction in snow cenlin + swemaxgla = 5000.0 ! maximum swe allowed at glaciers (mm) cenlin + wslmax = 5000.0 ! maximum lake water storage (mm) cenlin + rous = 0.20 ! specific yield [-] for niu et al. 2007 groundwater scheme (optrunoffsubsurface=1) + cmic = 0.20 ! microprore content (0.0-1.0), 0.0: close to free drainage + snowden_max = 120.0 ! maximum fresh snowfall density (kg/m3) + class_alb_ref = 0.55 ! reference snow albedo in class scheme + class_sno_age = 3600.0 ! snow aging e-folding time (s) in class albedo scheme + class_alb_new = 0.84 ! fresh snow albedo in class scheme + psiwlt = -150.0 !metric potential for wilting point (m) + z0soil = 0.002 ! bare-soil roughness length (m) (i.e., under the canopy) + z0lake = 0.01 ! lake surface roughness length (m) +/ + +&noahmp_irrigation_parameters +irr_frac = 0.10 ! irrigation fraction +irr_har = 20 ! number of days before harvest date to stop irrigation +irr_lai = 0.50 ! minimum lai to trigger irrigation +irr_mad = 0.60 ! management allowable deficit (0-1) +filoss = 0.10 ! fraction of flood irrigation loss (0-1) +sprir_rate = 6.40 ! mm/h, sprinkler irrigation rate +micir_rate = 1.38 ! mm/h, micro irrigation rate +firtfac = 1.00 ! flood application rate factor +ir_rain = 1.00 ! maximum precipitation [mm/hr] to stop irrigation trigger +/ + +&noahmp_crop_parameters + + ! ncrop = 5 + ! 1: corn + ! 2: soybean + ! 3: sorghum + ! 4: rice + ! 5: winter wheat + +default_crop = 0 ! the default crop type(1-5); if zero, use generic dynamic vegetation + +!---------------------------------------------------------- +! 1 2 3 4 5 +!---------------------------------------------------------- + +pltday = 111, 131, 111, 111, 111, ! planting date +hsday = 300, 280, 300, 300, 300, ! harvest date +plantpop = 78.0, 78.0, 78.0, 78.0, 78.0, ! plant density [per ha] - used? +gddtbase = 10.0, 10.0, 10.0, 10.0, 10.0, ! base temperature for gdd accumulation [c] +gddtcut = 30.0, 30.0, 30.0, 30.0, 30.0, ! upper temperature for gdd accumulation [c] +gdds1 = 50.0, 60.0, 50.0, 50.0, 50.0, ! gdd from seeding to emergence +gdds2 = 625.0, 675.0, 718.0, 718.0, 718.0, ! gdd from seeding to initial vegetative +gdds3 = 933.0, 1183.0, 933.0, 933.0, 933.0, ! gdd from seeding to post vegetative +gdds4 = 1103.0, 1253.0, 1103.0, 1103.0, 1103.0, ! gdd from seeding to intial reproductive +gdds5 = 1555.0, 1605.0, 1555.0, 1555.0, 1555.0, ! gdd from seeding to pysical maturity +c3psni = 0.0, 1.0, 1.0, 1.0, 1.0, ! transfer crop-specific photosynthetic parameters +kc25i = 30.0, 30.0, 30.0, 30.0, 30.0, ! zhe zhang +akci = 2.1, 2.1, 2.1, 2.1, 2.1, ! 2020-02-05 +ko25i = 3.e4, 3.e4, 3.e4, 3.e4, 3.e4, ! +akoi = 1.2, 1.2, 1.2, 1.2, 1.2, ! +avcmxi = 2.4, 2.4, 2.4, 2.4, 2.4, ! +vcmx25i = 60.0, 80.0, 60.0, 60.0, 55.0, ! +bpi = 4.e4, 1.e4, 2.e3, 2.e3, 2.e3, ! +mpi = 4., 9., 6., 9., 9., ! +folnmxi = 1.5, 1.5, 1.5, 1.5, 1.5, ! foliage nitrogen concentration when f(n)=1 (%) +qe25i = 0.05, 0.06, 0.06, 0.06, 0.06, ! +aref = 7.0, 7.0, 7.0, 7.0, 7.0, ! reference maximum co2 assimilation rate +psnrf = 0.85, 0.85, 0.85, 0.85, 0.85, ! co2 assimilation reduction factor(0-1) (caused by non-modeling part,e.g.pest,weeds) +i2par = 0.5, 0.5, 0.5, 0.5, 0.5, ! fraction of incoming solar radiation to photosynthetically active radiation +tassim0 = 8.0, 8.0, 8.0, 8.0, 8.0, ! minimum temperature for co2 assimilation [c] +tassim1 = 18.0, 18.0, 18.0, 18.0, 18.0, ! co2 assimilation linearly increasing until temperature reaches t1 [c] +tassim2 = 30.0, 30.0, 30.0, 30.0, 30.0, ! co2 assmilation rate remain at aref until temperature reaches t2 [c] +k = 0.55, 0.55, 0.55, 0.55, 0.55, ! light extinction coefficient +epsi = 12.5, 12.5, 12.5, 12.5, 12.5, ! initial light use efficiency + +q10mr = 2.0, 2.0, 2.0, 2.0, 2.0, ! q10 for maintainance respiration +lefreez = 268, 268, 268, 268, 268, ! characteristic t for leaf freezing [k] + +dile_fc_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! coeficient for temperature leaf stress death [1/s] +dile_fc_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +dile_fc_s3 = 0.0, 0.0, 0.0, 0.0, 0.0, +dile_fc_s4 = 0.0, 0.0, 0.0, 0.0, 0.0, +dile_fc_s5 = 0.5, 0.5, 0.5, 0.5, 0.5, +dile_fc_s6 = 0.5, 0.5, 0.5, 0.5, 0.5, +dile_fc_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +dile_fc_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +dile_fw_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! coeficient for water leaf stress death [1/s] +dile_fw_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +dile_fw_s3 = 0.0, 0.0, 0.0, 0.0, 0.0, +dile_fw_s4 = 0.0, 0.0, 0.0, 0.0, 0.0, +dile_fw_s5 = 0.2, 0.2, 0.2, 0.2, 0.2, +dile_fw_s6 = 0.2, 0.2, 0.2, 0.2, 0.2, +dile_fw_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +dile_fw_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +fra_gr = 0.2, 0.2, 0.2, 0.2, 0.2, ! fraction of growth respiration + +lf_ovrc_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of leaf turnover [1/s] +lf_ovrc_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +lf_ovrc_s3 = 0.0, 0.0, 0.0, 0.0, 0.0, +lf_ovrc_s4 = 0.0, 0.0, 0.0, 0.0, 0.0, +lf_ovrc_s5 = 0.2, 0.2, 0.48, 0.48, 0.48, +lf_ovrc_s6 = 0.3, 0.3, 0.48, 0.48, 0.48, +lf_ovrc_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +lf_ovrc_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +st_ovrc_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of stem turnover [1/s] +st_ovrc_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +st_ovrc_s3 = 0.0, 0.0, 0.0, 0.0, 0.0, +st_ovrc_s4 = 0.0, 0.0, 0.0, 0.0, 0.0, +st_ovrc_s5 = 0.2, 0.12, 0.12, 0.12, 0.12, +st_ovrc_s6 = 0.3, 0.06, 0.06, 0.06, 0.06, +st_ovrc_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +st_ovrc_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +rt_ovrc_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of root tunrover [1/s] +rt_ovrc_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +rt_ovrc_s3 = 0.0, 0.0, 0.0, 0.0, 0.0, +rt_ovrc_s4 = 0.0, 0.0, 0.0, 0.0, 0.0, +rt_ovrc_s5 = 0.12, 0.12, 0.12, 0.12, 0.12, +rt_ovrc_s6 = 0.06, 0.06, 0.06, 0.06, 0.06, +rt_ovrc_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +rt_ovrc_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +lfmr25 = 0.8, 1.0, 1.0, 1.0, 1.0, ! leaf maintenance respiration at 25c [umol co2/m**2 /s] +stmr25 = 0.05, 0.05, 0.1, 0.1, 0.1, ! stem maintenance respiration at 25c [umol co2/kg bio/s] +rtmr25 = 0.05, 0.05, 0.0, 0.0, 0.0, ! root maintenance respiration at 25c [umol co2/kg bio/s] +grainmr25 = 0.0, 0.0, 0.1, 0.1, 0.1, ! grain maintenance respiration at 25c [umol co2/kg bio/s] + +lfpt_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to leaf +lfpt_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +lfpt_s3 = 0.36, 0.4, 0.4, 0.4, 0.4, +lfpt_s4 = 0.1, 0.2, 0.2, 0.2, 0.2, +lfpt_s5 = 0.0, 0.0, 0.0, 0.0, 0.0, +lfpt_s6 = 0.0, 0.0, 0.0, 0.0, 0.0, +lfpt_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +lfpt_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +stpt_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to stem +stpt_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +stpt_s3 = 0.24, 0.2, 0.2, 0.2, 0.2, +stpt_s4 = 0.6, 0.5, 0.5, 0.5, 0.5, +stpt_s5 = 0.0, 0.0, 0.15, 0.15, 0.15, +stpt_s6 = 0.0, 0.0, 0.05, 0.05, 0.05, +stpt_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +stpt_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +rtpt_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to root +rtpt_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +rtpt_s3 = 0.4, 0.4, 0.4, 0.4, 0.4, +rtpt_s4 = 0.3, 0.3, 0.3, 0.3, 0.3, +rtpt_s5 = 0.05, 0.05, 0.05, 0.05, 0.05, +rtpt_s6 = 0.0, 0.0, 0.05, 0.05, 0.05, +rtpt_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +rtpt_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +grainpt_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! fraction of carbohydrate flux to grain +grainpt_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, ! one row for each of 8 stages +grainpt_s3 = 0.0, 0.0, 0.0, 0.0, 0.0, +grainpt_s4 = 0.0, 0.0, 0.0, 0.0, 0.0, +grainpt_s5 = 0.95, 0.95, 0.8, 0.8, 0.8, +grainpt_s6 = 1.0, 1.0, 0.9, 0.9, 0.9, +grainpt_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +grainpt_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +lfct_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation +lfct_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, +lfct_s3 = 0.0, 0.0, 0.4, 0.4, 0.4, +lfct_s4 = 0.0, 0.0, 0.3, 0.3, 0.3, +lfct_s5 = 0.0, 0.0, 0.05, 0.05, 0.05, +lfct_s6 = 0.0, 0.0, 0.05, 0.05, 0.05, +lfct_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +lfct_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +stct_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation +stct_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, +stct_s3 = 0.0, 0.0, 0.4, 0.4, 0.4, +stct_s4 = 0.0, 0.0, 0.3, 0.3, 0.3, +stct_s5 = 0.0, 0.0, 0.05, 0.05, 0.05, +stct_s6 = 0.0, 0.0, 0.05, 0.05, 0.05, +stct_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +stct_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +rtct_s1 = 0.0, 0.0, 0.0, 0.0, 0.0, ! carbohydrate translocation +rtct_s2 = 0.0, 0.0, 0.0, 0.0, 0.0, +rtct_s3 = 0.0, 0.0, 0.4, 0.4, 0.4, +rtct_s4 = 0.0, 0.0, 0.3, 0.3, 0.3, +rtct_s5 = 0.0, 0.0, 0.05, 0.05, 0.05, +rtct_s6 = 0.0, 0.0, 0.05, 0.05, 0.05, +rtct_s7 = 0.0, 0.0, 0.0, 0.0, 0.0, +rtct_s8 = 0.0, 0.0, 0.0, 0.0, 0.0, + +bio2lai = 0.015, 0.030, 0.015, 0.015, 0.015, ! leaf are per living leaf biomass [m^2/kg] + +/ + +&noahmp_tiledrain_parameters +!-----------------------------------! +! for simple drainage model ! +!-----------------------------------! +nsoiltype = 19 ! num_soil_types +drain_layer_opt = 4 + ! 0 - from one specified layer by td_depth, + ! 1 - from layers 1 & 2, + ! 2 - from layer layers 1, 2, and 3 + ! 3 - from layer 2 and 3 + ! 4 - from layer layers 3, 4 + ! 5 - from all the four layers +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! +! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ! +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! +tdsmc_fac = 0.90, 0.90, 0.90, 0.90, 0.90, 1.25, 0.90, 1.0, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90, 0.90 ! corresponds to number of soil types soilparam.tbl +td_depth = 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ! depth of drain tube from the soil surface +td_dc = 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20., 20. ! drainage coefficient (mm d^-1) +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! +! +!-------------------------------------! +! for hooghoudt tile drain model ! +!-------------------------------------! +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- +td_dcoef = 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07 ! m d^-1, drainage coefficent +td_d = 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00 ! m, depth to impe layer from drain water level (d) +td_adepth = 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00 ! m, actual depth of imp layer from land surface +td_radi = 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07 ! m, effective radius of drains (ro) +td_spac = 60.0, 55.0, 45.0, 20.0, 25.0, 30.0, 40.0, 16.0, 18.0, 50.0, 15.0, 10.0, 35.0, 10.0, 60.0, 60.0, 10.0, 60.0, 60.0 ! m, distance between two drain tubes or tiles (l) +td_ddrain = 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20, 1.20 ! m, depth of drain +klat_fac = 1.30, 1.80, 2.10, 2.60, 2.90, 2.50, 2.30, 3.00, 2.70, 2.00, 3.10, 3.30, 2.50, 1.00, 1.00, 1.80, 4.00, 1.00, 1.30 ! multiplication factor to lateral hyd.cond +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +/ + +&noahmp_optional_parameters + + !------------------------------------------------------------------------------ + ! saxton and rawls 2006 pedo-transfer function coefficients + !------------------------------------------------------------------------------ + + sr2006_theta_1500t_a = -0.024 ! sand coefficient + sr2006_theta_1500t_b = 0.487 ! clay coefficient + sr2006_theta_1500t_c = 0.006 ! orgm coefficient + sr2006_theta_1500t_d = 0.005 ! sand*orgm coefficient + sr2006_theta_1500t_e = -0.013 ! clay*orgm coefficient + sr2006_theta_1500t_f = 0.068 ! sand*clay coefficient + sr2006_theta_1500t_g = 0.031 ! constant adjustment + + sr2006_theta_1500_a = 0.14 ! theta_1500t coefficient + sr2006_theta_1500_b = -0.02 ! constant adjustment + + sr2006_theta_33t_a = -0.251 ! sand coefficient + sr2006_theta_33t_b = 0.195 ! clay coefficient + sr2006_theta_33t_c = 0.011 ! orgm coefficient + sr2006_theta_33t_d = 0.006 ! sand*orgm coefficient + sr2006_theta_33t_e = -0.027 ! clay*orgm coefficient + sr2006_theta_33t_f = 0.452 ! sand*clay coefficient + sr2006_theta_33t_g = 0.299 ! constant adjustment + + sr2006_theta_33_a = 1.283 ! theta_33t*theta_33t coefficient + sr2006_theta_33_b = -0.374 ! theta_33t coefficient + sr2006_theta_33_c = -0.015 ! constant adjustment + + sr2006_theta_s33t_a = 0.278 ! sand coefficient + sr2006_theta_s33t_b = 0.034 ! clay coefficient + sr2006_theta_s33t_c = 0.022 ! orgm coefficient + sr2006_theta_s33t_d = -0.018 ! sand*orgm coefficient + sr2006_theta_s33t_e = -0.027 ! clay*orgm coefficient + sr2006_theta_s33t_f = -0.584 ! sand*clay coefficient + sr2006_theta_s33t_g = 0.078 ! constant adjustment + + sr2006_theta_s33_a = 0.636 ! theta_s33t coefficient + sr2006_theta_s33_b = -0.107 ! constant adjustment + + sr2006_psi_et_a = -21.67 ! sand coefficient + sr2006_psi_et_b = -27.93 ! clay coefficient + sr2006_psi_et_c = -81.97 ! theta_s33 coefficient + sr2006_psi_et_d = 71.12 ! sand*theta_s33 coefficient + sr2006_psi_et_e = 8.29 ! clay*theta_s33 coefficient + sr2006_psi_et_f = 14.05 ! sand*clay coefficient + sr2006_psi_et_g = 27.16 ! constant adjustment + + sr2006_psi_e_a = 0.02 ! psi_et*psi_et coefficient + sr2006_psi_e_b = -0.113 ! psi_et coefficient + sr2006_psi_e_c = -0.7 ! constant adjustment + + sr2006_smcmax_a = -0.097 ! sand adjustment + sr2006_smcmax_b = 0.043 ! constant adjustment + +/ + +&noahmp_general_parameters + !------------------------------------------------- + ! this part is originally from genparm.tbl + !------------------------------------------------- +slope_data = 0.1, 0.6, 1.0, 0.35, 0.55, 0.8, 0.63, 0.0, 0.0 ! slope factor for soil drainage (9 different slope types) +csoil_data = 2.00e+6 ! soil heat capacity [j m-3 k-1] +refdk_data = 2.0e-6 ! parameter in the surface runoff parameterization +refkdt_data = 3.0 ! parameter in the surface runoff parameterization +frzk_data = 0.15 ! frozen ground parameter +zbot_data = -8.0 ! depth [m] of lower boundary soil temperature +czil_data = 0.1 ! parameter used in the calculation of the roughness length for heat + +/ + +&noahmp_stas_soil_categories + sltype = "stas" ! "stas" or "stas_ruc" + slcats = 19 !num_soil_types +/ + +&noahmp_soil_stas_parameters +! 19 total soil types considered by noahmp +! 1: sand +! 2: loamy sand +! 3: sandy loam +! 4: silt loam +! 5: silt +! 6: loam +! 7: sandy clay loam +! 8: silty clay loam +! 9: clay loam +! 10: sandy clay +! 11: silty clay +! 12: clay +! 13: organic material +! 14: water +! 15: bedrock +! 16: other(land-ice) +! 17: playa +! 18: lava +! 19: white sand +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! +! soil type: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ! +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! + bb = 2.790, 4.260, 4.740, 5.330, 3.860, 5.250, 6.770, 8.720, 8.170, 10.730, 10.390, 11.550, 5.250, 0.000, 2.790, 4.260, 11.550, 2.790, 2.790 + drysmc = 0.010, 0.028, 0.047, 0.084, 0.061, 0.066, 0.069, 0.120, 0.103, 0.100, 0.126, 0.138, 0.066, 0.000, 0.006, 0.028, 0.030, 0.006, 0.010 + maxsmc = 0.339, 0.421, 0.434, 0.476, 0.484, 0.439, 0.404, 0.464, 0.465, 0.406, 0.468, 0.468, 0.439, 1.000, 0.200, 0.421, 0.468, 0.200, 0.339 + refsmc = 0.192, 0.283, 0.312, 0.360, 0.347, 0.329, 0.315, 0.387, 0.382, 0.338, 0.404, 0.412, 0.329, 0.000, 0.170, 0.283, 0.454, 0.170, 0.192 + satpsi = 0.069, 0.036, 0.141, 0.759, 0.955, 0.355, 0.135, 0.617, 0.263, 0.098, 0.324, 0.468, 0.355, 0.000, 0.069, 0.036, 0.468, 0.069, 0.069 + satdk = 4.66e-05, 1.41e-05, 5.23e-06, 2.81e-06, 2.18e-06, 3.38e-06, 4.45e-06, 2.03e-06, 2.45e-06, 7.22e-06, 1.34e-06, 9.74e-07, 3.38e-06, 0.00e+00, 1.41e-04, 1.41e-05, 9.74e-07, 1.41e-04, 4.66e-05 + satdw = 2.65e-05, 5.14e-06, 8.05e-06, 2.39e-05, 1.66e-05, 1.43e-05, 1.01e-05, 2.35e-05, 1.13e-05, 1.87e-05, 9.64e-06, 1.12e-05, 1.43e-05, 0.00e+00, 1.36e-04, 5.14e-06, 1.12e-05, 1.36e-04, 2.65e-05 + wltsmc = 0.010, 0.028, 0.047, 0.084, 0.061, 0.066, 0.069, 0.120, 0.103, 0.100, 0.126, 0.138, 0.066, 0.000, 0.006, 0.028, 0.030, 0.006, 0.010 + qtz = 0.920, 0.820, 0.600, 0.250, 0.100, 0.400, 0.600, 0.100, 0.350, 0.520, 0.100, 0.250, 0.050, 0.600, 0.070, 0.250, 0.600, 0.520, 0.920 + bvic = 0.050, 0.080, 0.090, 0.250, 0.150, 0.180, 0.200, 0.220, 0.230, 0.250, 0.280, 0.300, 0.260, 0.000, 1.000, 1.000, 1.000, 0.350, 0.150 + axaj = 0.009, 0.010, 0.009, 0.010, 0.012, 0.013, 0.014, 0.015, 0.016, 0.015, 0.016, 0.017, 0.012, 0.001, 0.017, 0.017, 0.017, 0.015, 0.009 + bxaj = 0.050, 0.080, 0.090, 0.250, 0.150, 0.180, 0.200, 0.220, 0.230, 0.250, 0.280, 0.300, 0.260, 0.000, 1.000, 1.000, 1.000, 0.350, 0.150 + xxaj = 0.050, 0.080, 0.090, 0.250, 0.150, 0.180, 0.200, 0.220, 0.230, 0.250, 0.280, 0.300, 0.260, 0.000, 1.000, 1.000, 1.000, 0.350, 0.150 + bdvic = 0.050, 0.080, 0.090, 0.250, 0.150, 0.180, 0.200, 0.220, 0.230, 0.250, 0.280, 0.300, 0.260, 0.000, 1.000, 1.000, 1.000, 0.350, 0.150 + bbvic = 1.000, 1.010, 1.020, 1.025, 1.000, 1.000, 1.032, 1.035, 1.040, 1.042, 1.045, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 + gdvic = 0.050, 0.070, 0.130, 0.200, 0.170, 0.110, 0.260, 0.350, 0.260, 0.300, 0.380, 0.410, 0.500, 0.001, 0.010, 0.001, 0.001, 0.050, 0.020 + +/ + +&noahmp_soil_stas_ruc_parameters +! 19 total soil types considered by noahmp +! 1: sand +! 2: loamy sand +! 3: sandy loam +! 4: silt loam +! 5: silt +! 6: loam +! 7: sandy clay loam +! 8: silty clay loam +! 9: clay loam +! 10: sandy clay +! 11: silty clay +! 12: clay +! 13: organic material +! 14: water +! 15: bedrock +! 16: other(land-ice) +! 17: playa +! 18: lava +! 19: white sand +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! +! soil type: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ! +!-------------------------------------------------------------------------------------------------------------------------------------------------------------------- ! + bb = 4.050, 4.380, 4.900, 5.300, 5.300, 5.390, 7.120, 7.750, 5.390, 10.400, 10.400, 11.400, 5.390, 0.000, 4.050, 4.900, 11.400, 4.050, 4.050 + drysmc = 0.002, 0.035, 0.041, 0.034, 0.034, 0.050, 0.068, 0.060, 0.050, 0.070, 0.070, 0.068, 0.027, 0.000, 0.004, 0.065, 0.030, 0.006, 0.010 + hc = 1.470, 1.410, 1.340, 1.270, 1.270, 1.210, 1.180, 1.320, 1.210, 1.180, 1.150, 1.090, 1.210, 4.180, 2.030, 2.100, 1.410, 1.410, 1.470 + maxsmc = 0.395, 0.410, 0.435, 0.485, 0.485, 0.451, 0.420, 0.477, 0.451, 0.426, 0.492, 0.482, 0.451, 1.000, 0.200, 0.435, 0.468, 0.200, 0.339 + refsmc = 0.174, 0.179, 0.249, 0.369, 0.369, 0.314, 0.299, 0.357, 0.314, 0.316, 0.409, 0.400, 0.314, 1.000, 0.100, 0.249, 0.454, 0.170, 0.236 + satpsi = 0.121, 0.090, 0.218, 0.786, 0.786, 0.478, 0.299, 0.356, 0.478, 0.153, 0.490, 0.405, 0.478, 0.000, 0.121, 0.218, 0.468, 0.069, 0.069 + satdk = 1.76e-04, 1.56e-04, 3.47e-05, 7.20e-06, 7.20e-06, 6.95e-06, 6.30e-06, 1.70e-06, 6.95e-06, 2.17e-06, 1.03e-06, 1.28e-06, 6.95e-06, 0.00e+00, 1.41e-04, 3.47e-05, 9.74e-07, 1.41e-04, 1.76e-04 + satdw = 6.08e-07, 5.14e-06, 8.05e-06, 2.39e-05, 2.39e-05, 1.43e-05, 9.90e-06, 2.37e-05, 1.43e-05, 1.87e-05, 9.64e-06, 1.12e-05, 1.43e-05, 0.00e+00, 1.36e-04, 5.14e-06, 1.12e-05, 1.36e-04, 6.08e-07 + wltsmc = 0.033, 0.055, 0.095, 0.143, 0.143, 0.137, 0.148, 0.170, 0.137, 0.158, 0.190, 0.198, 0.117, 0.000, 0.006, 0.114, 0.030, 0.006, 0.060 + qtz = 0.920, 0.820, 0.600, 0.250, 0.100, 0.400, 0.600, 0.100, 0.400, 0.520, 0.100, 0.250, 0.050, 0.000, 0.600, 0.050, 0.600, 0.520, 0.920 + bvic = 0.050, 0.080, 0.090, 0.100, 0.150, 0.180, 0.200, 0.220, 0.230, 0.250, 0.280, 0.300, 0.260, 0.000, 1.000, 1.000, 1.000, 0.350, 0.150 + axaj = 0.009, 0.010, 0.009, 0.010, 0.012, 0.013, 0.014, 0.015, 0.016, 0.015, 0.016, 0.017, 0.012, 0.001, 0.017, 0.017, 0.017, 0.015, 0.009 + bxaj = 0.050, 0.080, 0.090, 0.250, 0.150, 0.180, 0.200, 0.220, 0.230, 0.250, 0.280, 0.300, 0.260, 0.000, 1.000, 1.000, 1.000, 0.350, 0.150 + xxaj = 0.050, 0.080, 0.090, 0.250, 0.150, 0.180, 0.200, 0.220, 0.230, 0.250, 0.280, 0.300, 0.260, 0.000, 1.000, 1.000, 1.000, 0.350, 0.150 + bdvic = 0.050, 0.080, 0.090, 0.100, 0.150, 0.180, 0.200, 0.220, 0.230, 0.250, 0.280, 0.300, 0.260, 0.000, 1.000, 1.000, 1.000, 0.350, 0.150 + bbvic = 1.000, 1.010, 1.020, 1.025, 1.000, 1.000, 1.032, 1.035, 1.040, 1.042, 1.045, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000 + gdvic = 0.050, 0.070, 0.130, 0.200, 0.170, 0.110, 0.260, 0.350, 0.260, 0.300, 0.380, 0.410, 0.500, 0.001, 0.010, 0.001, 0.001, 0.050, 0.020 + +/ + diff --git a/physics/radiation_clouds.f b/physics/radiation_clouds.f index 079218f5a..111be4019 100644 --- a/physics/radiation_clouds.f +++ b/physics/radiation_clouds.f @@ -32,7 +32,7 @@ ! imp_physics_mg, iovr, iovr_rand, iovr_maxrand, iovr_max, ! ! iovr_dcorr, iovr_exp, iovr_exprand, idcor, idcor_con, ! ! idcor_hogan, idcor_oreopoulos, ! -! imfdeepcnv, imfdeepcnv_gf, imfdeepcnv_unified, do_mynnedmf, lgfdlmprad, ! +! imfdeepcnv, imfdeepcnv_gf, imfdeepcnv_c3, do_mynnedmf, lgfdlmprad, ! ! uni_cld, lmfshal, lmfdeep2, cldcov, clouds1, ! ! effrl, effri, effrr, effrs, effr_in, ! ! effrl_inout, effri_inout, effrs_inout, ! @@ -347,7 +347,7 @@ subroutine radiation_clouds_prop & & imp_physics_mg, iovr, iovr_rand, iovr_maxrand, iovr_max, & & iovr_dcorr, iovr_exp, iovr_exprand, idcor, idcor_con, & & idcor_hogan, idcor_oreopoulos, lcrick, lcnorm, & - & imfdeepcnv, imfdeepcnv_gf, imfdeepcnv_unified, & + & imfdeepcnv, imfdeepcnv_gf, imfdeepcnv_c3, & & do_mynnedmf, lgfdlmprad, & & uni_cld, lmfshal, lmfdeep2, cldcov, clouds1, & & effrl, effri, effrr, effrs, effr_in, & @@ -450,7 +450,7 @@ subroutine radiation_clouds_prop & ! idcor_oreopoulos: flag for decorrelation-length: (=2) ! ! imfdeepcnv : flag for mass-flux deep convection scheme ! ! imfdeepcnv_gf : flag for scale- & aerosol-aware Grell-Freitas scheme (GSD) -! imfdeepcnv_unified : flag for unified convection scheme +! imfdeepcnv_c3 : flag for unified convection scheme ! do_mynnedmf : flag for MYNN-EDMF ! ! lgfdlmprad : flag for GFDLMP radiation interaction ! ! uni_cld : logical - true for cloud fraction from shoc ! @@ -511,7 +511,7 @@ subroutine radiation_clouds_prop & integer, intent(in) :: ntrac, ntcw, ntiw, ntrw, ntsw, ntgl, & & ntclamt integer, intent(in) :: kdt, imfdeepcnv, imfdeepcnv_gf, & - & imfdeepcnv_unified + & imfdeepcnv_c3 integer, intent(in) :: & & imp_physics, ! Flag for MP scheme & imp_physics_nssl, ! Flag for NSSL scheme @@ -702,7 +702,7 @@ subroutine radiation_clouds_prop & elseif ( imp_physics == imp_physics_nssl ) then ! NSSL MP if(do_mynnedmf .or. imfdeepcnv == imfdeepcnv_gf .or. & - & imfdeepcnv == imfdeepcnv_unified) then ! MYNN PBL or GF or unified conv + & imfdeepcnv == imfdeepcnv_c3) then ! MYNN PBL or GF or unified conv !-- MYNN PBL or convective GF !-- use cloud fractions with SGS clouds do k=1,NLAY @@ -742,7 +742,7 @@ subroutine radiation_clouds_prop & elseif(imp_physics == imp_physics_thompson) then ! Thompson MP if(do_mynnedmf .or. imfdeepcnv == imfdeepcnv_gf & - & .or. imfdeepcnv == imfdeepcnv_unified) then ! MYNN PBL or GF conv + & .or. imfdeepcnv == imfdeepcnv_c3) then ! MYNN PBL or GF conv if (icloud == 3) then call progcld_thompson (plyr,plvl,tlyr,qlyr,qstl,rhly, & ! --- inputs diff --git a/physics/sfc_diag_post.F90 b/physics/sfc_diag_post.F90 index 139f30137..c1a43f170 100644 --- a/physics/sfc_diag_post.F90 +++ b/physics/sfc_diag_post.F90 @@ -13,7 +13,7 @@ module sfc_diag_post !! \htmlinclude sfc_diag_post_run.html !! #endif - subroutine sfc_diag_post_run (im, lsm, lsm_noahmp, dry, lssav, dtf, con_eps, con_epsm1, pgr,& + subroutine sfc_diag_post_run (im, lsm, lsm_noahmp, opt_diag, dry, lssav, dtf, con_eps, con_epsm1, pgr,& t2mmp,q2mp, t2m, q2m, u10m, v10m, tmpmin, tmpmax, spfhmin, spfhmax, & wind10mmax, u10mmax, v10mmax, dpt2m, errmsg, errflg) @@ -21,7 +21,7 @@ subroutine sfc_diag_post_run (im, lsm, lsm_noahmp, dry, lssav, dtf, con_eps, con implicit none - integer, intent(in) :: im, lsm, lsm_noahmp + integer, intent(in) :: im, lsm, lsm_noahmp,opt_diag logical, intent(in) :: lssav real(kind=kind_phys), intent(in) :: dtf, con_eps, con_epsm1 logical , dimension(:), intent(in) :: dry @@ -41,12 +41,14 @@ subroutine sfc_diag_post_run (im, lsm, lsm_noahmp, dry, lssav, dtf, con_eps, con errflg = 0 if (lsm == lsm_noahmp) then + if (opt_diag == 2 .or. opt_diag == 3)then do i=1,im if(dry(i)) then t2m(i) = t2mmp(i) q2m(i) = q2mp(i) endif enddo + endif endif if (lssav) then diff --git a/physics/sfc_diag_post.meta b/physics/sfc_diag_post.meta index 56534d71b..c50d3c4dc 100644 --- a/physics/sfc_diag_post.meta +++ b/physics/sfc_diag_post.meta @@ -28,6 +28,13 @@ dimensions = () type = integer intent = in +[opt_diag] + standard_name = control_for_land_surface_scheme_surface_diagnose_approach + long_name = choice for surface diagnose approach option (see noahmp module for definition) + units = index + dimensions = () + type = integer + intent = in [dry] standard_name = flag_nonzero_land_surface_fraction long_name = flag indicating presence of some land surface area fraction diff --git a/physics/sfcsub.F b/physics/sfcsub.F index dae710760..7be07b39c 100644 --- a/physics/sfcsub.F +++ b/physics/sfcsub.F @@ -16,8 +16,8 @@ module sfccyc_module ! integer kpdtsf,kpdwet,kpdsno,kpdzor,kpdais,kpdtg3,kpdplr,kpdgla, & kpdmxi,kpdscv,kpdsmc,kpdoro,kpdmsk,kpdstc,kpdacn,kpdveg, - & kpdvet,kpdsot - &, kpdvmn,kpdvmx,kpdslp,kpdabs + & kpdvet,kpdsot,kpdsoc, + & kpdvmn,kpdvmx,kpdslp,kpdabs &, kpdsnd, kpdabs_0, kpdabs_1, kpdalb(4) parameter(kpdtsf=11, kpdwet=86, kpdsno=65, kpdzor=83, ! & kpdalb=84, kpdais=91, kpdtg3=11, kpdplr=224, @@ -26,7 +26,7 @@ module sfccyc_module & kpdoro=8, kpdmsk=81, kpdstc=11, kpdacn=91, kpdveg=87, !cbosu max snow albedo uses a grib id number of 159, not 255. & kpdvmn=255, kpdvmx=255,kpdslp=236, kpdabs_0=255, - & kpdvet=225, kpdsot=224,kpdabs_1=159, + & kpdvet=225, kpdsot=224,kpdsoc=255,kpdabs_1=159, & kpdsnd=66 ) ! integer, parameter :: kpdalb_0(4)=(/212,215,213,216/) @@ -37,6 +37,7 @@ module sfccyc_module integer, parameter :: xdata=7200, ydata=3600, mdata=xdata*ydata integer :: veg_type_landice integer :: soil_type_landice + integer :: soil_color_landice integer :: num_threads ! ! @@ -81,7 +82,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & &, vmnfcs,vmxfcs,slpfcs,absfcs & &, tsffcs,snofcs,zorfcs,albfcs,tg3fcs & &, cnpfcs,smcfcs,stcfcs,slifcs,aisfcs & - &, vegfcs,vetfcs,sotfcs,alffcs & + &, vegfcs,vetfcs,sotfcs,socfcs,alffcs & &, cvfcs,cvbfcs,cvtfcs,me,nthrds,nlunit & &, sz_nml,input_nml_file & &, min_ice & @@ -125,15 +126,17 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & vetsmn,vetimx,vetimn,vetjmx,vetjmn, & & sotlmx,sotlmn,sotomx,sotomn,sotsmx, & & sotsmn,sotimx,sotimn,sotjmx,sotjmn, & + & soclmx,soclmn,socomx,socomn,socsmx, & + & socsmn,socimx,socimn,socjmx,socjmn, & & alslmx,alslmn,alsomx,alsomn,alssmx, & & alssmn,alsimx,alsimn,alsjmx,alsjmn, & & epstsf,epsalb,epssno,epswet,epszor, & & epsplr,epsoro,epssmc,epsscv,eptsfc, & & epstg3,epsais,epsacn,epsveg,epsvet, & - & epssot,epsalf,qctsfs,qcsnos,qctsfi, & + & epssot,epssoc,epsalf,qctsfs,qcsnos,qctsfi, & & aislim,snwmin,snwmax,cplrl,cplrs, & & cvegl,czors,csnol,csnos,czorl,csots, & - & csotl,cvwgs,cvetl,cvets,calfs, & + & csotl,csocs,csocl,cvwgs,cvetl,cvets,calfs, & & fcalfl,fcalfs,ccvt,ccnp,ccv,ccvb, & & calbl,calfl,calbs,ctsfs,grboro, & & grbmsk,ctsfl,deltf,caisl,caiss, & @@ -142,6 +145,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & faiss,fsnol,bltmsk,falbs,cvegs,percrit, & & deltsfc,critp2,critp3,blnmsk,critp1, & & fcplrl,fcplrs,fczors,fvets,fsotl,fsots, & + & fsocl,fsocs, & & fvetl,fplrs,fvegl,fvegs,fcsnol,fcsnos, & & fczorl,fcalbs,fctsfl,fctsfs,fcalbl, & & falfs,falfl,fh,crit,zsca,ztsfc,tem1,tem2 & @@ -167,7 +171,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & &, sihnew integer imsk,jmsk,ifp,irtscv,irtacn,irtais,irtsno,irtzor, & - & irtalb,irtsot,irtalf,j,irtvet,irtsmc,irtstc,irtveg, & + & irtalb,irtsot,irtsoc,irtalf,j,irtvet,irtsmc,irtstc,irtveg,& & irtwet,k,iprnt,kk,irttsf,iret,i,igrdbg,iy,im,id, & & icalbl,icalbs,icalfl,ictsfs,lugb,len,lsoil,ih, & & ictsfl,iczors,icplrl,icplrs,iczorl,icalfs,icsnol, & @@ -238,6 +242,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & ! sli .. land/sea/sea-ice mask. (1/0/2 respectively) ! veg .. vegetation cover ! sot .. soil type +! soc .. soil color !cwu [+2l] add sih & sic ! sih .. sea ice thickness ! sic .. sea ice concentration @@ -364,6 +369,10 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & parameter(sotlmx=16.,sotlmn=1.0,sotomx=0.0,sotomn=0.0, & sotsmx=16.,sotsmn=1.0,sotimx=0.,sotimn=0., & sotjmx=0.,sotjmn=0.) +! soil color + parameter(soclmx=20.,soclmn=1.0,socomx=0.0,socomn=0.0, + & socsmx=20.,socsmn=1.0,socimx=0.,socimn=0., + & socjmx=0.,socjmn=0.) ! fraction of vegetation for strongly and weakly zeneith angle dependent ! albedo parameter(alslmx=1.0,alslmn=0.0,alsomx=0.0,alsomn=0.0, @@ -378,7 +387,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & epsais=0.,epsacn=0.01,epsveg=0.01, & epssih=0.001,epssic=0.001, & epsvmn=0.01,epsvmx=0.01,epsabs=0.001,epsslp=0.01, - & epsvet=.01,epssot=.01,epsalf=.001) + & epsvet=.01,epssot=.01,epssoc=0.01,epsalf=.001) ! ! quality control of analysis snow and sea ice ! @@ -427,6 +436,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & ! vegetation cover analysis analysis ! vegetation type analysis analysis ! soil type analysis analysis +! soil color analysis analysis ! sea-ice thickness forecast forecast ! sea-ice concentration analysis analysis ! vegetation cover min analysis analysis @@ -467,14 +477,14 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & ! character*500 fntsfc,fnwetc,fnsnoc,fnzorc,fnalbc,fnaisc & &, fnplrc,fntg3c,fnscvc,fnsmcc,fnstcc,fnacnc & - &, fnvegc,fnvetc,fnsotc & + &, fnvegc,fnvetc,fnsotc,fnsocc & &, fnvmnc,fnvmxc,fnslpc,fnabsc, fnalbc2 real (kind=kind_io8) tsfclm(len), wetclm(len), snoclm(len) & &, zorclm(len), albclm(len,4), aisclm(len) & &, tg3clm(len), acnclm(len), cnpclm(len) & &, cvclm (len), cvbclm(len), cvtclm(len) & &, scvclm(len), tsfcl2(len), vegclm(len) & - &, vetclm(len), sotclm(len), alfclm(len,2), sliclm(len) & + &, vetclm(len), sotclm(len), socclm(len),alfclm(len,2), sliclm(len)& &, smcclm(len,lsoil), stcclm(len,lsoil) & &, sihclm(len), sicclm(len) & &, vmnclm(len), vmxclm(len), slpclm(len), absclm(len) @@ -483,7 +493,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & ! character*500 fntsfa,fnweta,fnsnoa,fnzora,fnalba,fnaisa & &, fnplra,fntg3a,fnscva,fnsmca,fnstca,fnacna & - &, fnvega,fnveta,fnsota & + &, fnvega,fnveta,fnsota,fnsoca & &, fnvmna,fnvmxa,fnslpa,fnabsa ! real (kind=kind_io8) tsfanl(len), wetanl(len), snoanl(len) & @@ -491,7 +501,8 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & &, tg3anl(len), acnanl(len), cnpanl(len) & &, cvanl (len), cvbanl(len), cvtanl(len) & &, scvanl(len), tsfan2(len), veganl(len) & - &, vetanl(len), sotanl(len), alfanl(len,2), slianl(len) & + &, vetanl(len), sotanl(len), socanl(len) & + &, alfanl(len,2), slianl(len) & &, smcanl(len,lsoil), stcanl(len,lsoil) & &, sihanl(len), sicanl(len) & &, vmnanl(len), vmxanl(len), slpanl(len), absanl(len) @@ -505,7 +516,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & &, tg3fcs(len), acnfcs(len), cnpfcs(len) & &, cvfcs (len), cvbfcs(len), cvtfcs(len) & &, slifcs(len), vegfcs(len) & - &, vetfcs(len), sotfcs(len), alffcs(len,2) & + &, vetfcs(len), sotfcs(len), socfcs(len), alffcs(len,2) & &, smcfcs(len,lsoil), stcfcs(len,lsoil) & &, sihfcs(len), sicfcs(len), sitfcs(len) & &, vmnfcs(len), vmxfcs(len), slpfcs(len), absfcs(len) & @@ -536,7 +547,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & ! real (kind=kind_io8), allocatable, dimension(:) :: & & tsffcsd, snofcsd, tg3fcsd, zorfcsd, slifcsd, aisfcsd, & - & cnpfcsd, vegfcsd, vetfcsd, sotfcsd, sihfcsd, sicfcsd, & + & cnpfcsd, vegfcsd, vetfcsd, sotfcsd, socfcsd, sihfcsd, sicfcsd, & & vmnfcsd, vmxfcsd, slpfcsd, absfcsd real (kind=kind_io8), allocatable, dimension(:,:) :: & & smcfcsd, stcfcsd, albfcsd @@ -574,6 +585,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & ! rec. 16 canopy water content (cnpanl) -----> f10m ! rec. 17 vegetation type ! rec. 18 soil type +! rec. 18 soil color ? add later? ! rec. 19 zeneith angle dependent vegetation fraction (two types) ! rec. 20 uustar ! rec. 21 ffmm @@ -609,11 +621,11 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & namelist/namsfc/fnglac,fnmxic, & fntsfc,fnwetc,fnsnoc,fnzorc,fnalbc,fnaisc, & fnplrc,fntg3c,fnscvc,fnsmcc,fnstcc,fnacnc, - & fnvegc,fnvetc,fnsotc,fnalbc2, + & fnvegc,fnvetc,fnsotc,fnsocc,fnalbc2, & fnvmnc,fnvmxc,fnslpc,fnabsc, & fntsfa,fnweta,fnsnoa,fnzora,fnalba,fnaisa, & fnplra,fntg3a,fnscva,fnsmca,fnstca,fnacna, - & fnvega,fnveta,fnsota, + & fnvega,fnveta,fnsota,fnsoca, & fnvmna,fnvmxa,fnslpa,fnabsa, & fnmskh, & ldebug,lgchek,lqcbgs,critp1,critp2,critp3, @@ -622,6 +634,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & ftsfl,ftsfs,falbl,falbs,faisl,faiss,fsnol,fsnos, & fzorl,fzors,fplrl,fplrs,fsmcl,fsmcs, & fstcl,fstcs,fvegl,fvegs,fvetl,fvets,fsotl,fsots, + & fsocl,fsocs, & fctsfl,fctsfs,fcalbl,fcalbs,fcsnol,fcsnos, & fczorl,fczors,fcplrl,fcplrs,fcsmcl,fcsmcs, & fcstcl,fcstcs,fsalfl,fsalfs,fcalfl,flalfs, @@ -647,6 +660,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & data fnalbc2/'global_albedo4.1x1.grb'/ data fntsfc/'global_sstclim.2x2.grb'/ data fnsotc/'global_soiltype.1x1.grb'/ + data fnsocc/''/ data fnvegc/'global_vegfrac.1x1.grb'/ data fnvetc/'global_vegtype.1x1.grb'/ data fnglac/'global_glacier.2x2.grb'/ @@ -683,6 +697,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & data fnvega/' '/ data fnveta/' '/ data fnsota/' '/ + data fnsoca/' '/ !clu [+4l] add fn()a for vmn, vmx, abs, slp data fnvmna/' '/ data fnvmxa/' '/ @@ -704,6 +719,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & data fplrl/0.0/, fplrs/0.0/ data fvetl/0.0/, fvets/99999.0/ data fsotl/0.0/, fsots/99999.0/ + data fsocl/0.0/, fsocs/99999.0/ data fvegl/0.0/, fvegs/99999.0/ !cwu [+4l] add f()l and f()s for sih, sic and aislim, sihlim data fsihl/99999.0/, fsihs/99999.0/ @@ -744,6 +760,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & fnplra,fntg3a,fnscva,fnsmca,fnstca,fnacna,fnvega, & fnvetc,fnveta, & fnsotc,fnsota, + & fnsocc,fnsoca, !clu [+2l] add fn()c and fn()a for vmn, vmx, slp, abs & fnvmnc,fnvmxc,fnabsc,fnslpc, & fnvmna,fnvmxa,fnabsa,fnslpa, @@ -753,6 +770,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & ftsfl,ftsfs,falbl,falbs,faisl,faiss,fsnol,fsnos, & fzorl,fzors,fplrl,fplrs,fsmcl,fsmcs,falfl,falfs, & fstcl,fstcs,fvegl,fvegs,fvetl,fvets,fsotl,fsots, + & fsocl,fsocs, & fctsfl,fctsfs,fcalbl,fcalbs,fcsnol,fcsnos, & fczorl,fczors,fcplrl,fcplrs,fcsmcl,fcsmcs, & fcstcl,fcstcs,fcalfl,fcalfs, @@ -771,6 +789,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & ctsfl, ctsfs, calbl, calfl, calbs, calfs, csmcs, & csnol, csnos, czorl, czors, cplrl, cplrs, cstcl, & cstcs, cvegl, cvwgs, cvetl, cvets, csotl, csots, + & csocl, csocs, & csmcl !cwu [+1l] add c()l and c()s for sih, sic &, csihl, csihs, csicl, csics @@ -860,6 +879,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & print *,' fstcs=',fstcs(1:lsoil) print *,' aislim=',aislim,' sihnew=',sihnew print *,' isot=', isot,' ivegsrc=',ivegsrc + print *,' fnsotc =', fnsotc endif if (ivegsrc == 2) then ! sib @@ -872,6 +892,8 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & else soil_type_landice = 16 endif + + soil_color_landice = 10 !does not matter, only one source ! deltf = deltsfc / 24.0 ! @@ -981,6 +1003,15 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & csots = 0. !... soil type over sea if (fsots >= 99999.) csots = 1. if (fsots > 0. .and. fsots < 99999) csots = exp(-deltf/fsots) +! + csocl = 0. !... soil color over land + if (fsocl >= 99999.) csocl = 1. + if (fsocl > 0. .and. fsocl < 99999) csocl = exp(-deltf/fsocl) +! + csocs = 0. !... soil color over sea + if (fsocs >= 99999.) csots = 1. + if (fsocs > 0. .and. fsocs < 99999) csocs = exp(-deltf/fsocs) + !cwu [+16l]--------------------------------------------------------------- ! @@ -1092,9 +1123,6 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & snoclm(i) = 0. icefl1(i) = .true. enddo -! if(lprnt) print *,' tsffcsin=',tsffcs(iprnt) -! if(lprnt) print *,' slifcsin=',slifcs(iprnt) -! if(lprnt) print *,'slmskl=',slmskl(iprnt),' slmskw=',slmskw(iprnt) ! ! read climatology fields ! @@ -1109,25 +1137,25 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & fntsfc,fnwetc,fnsnoc,fnzorc,fnalbc,fnaisc, & fntg3c,fnscvc,fnsmcc,fnstcc,fnacnc,fnvegc, - & fnvetc,fnsotc, + & fnvetc,fnsotc,fnsocc, & fnvmnc,fnvmxc,fnslpc,fnabsc, & tsfclm,tsfcl2,wetclm,snoclm,zorclm,albclm,aisclm, & tg3clm,cvclm ,cvbclm,cvtclm, & cnpclm,smcclm,stcclm,sliclm,scvclm,acnclm,vegclm, - & vetclm,sotclm,alfclm, + & vetclm,sotclm,socclm,alfclm, & vmnclm,vmxclm,slpclm,absclm, & kpdtsf,kpdwet,kpdsno,kpdzor,kpdalb,kpdais, & kpdtg3,kpdscv,kpdacn,kpdsmc,kpdstc,kpdveg, - & kpdvet,kpdsot,kpdalf,tsfcl0, + & kpdvet,kpdsot,kpdsoc,kpdalf,tsfcl0, & kpdvmn,kpdvmx,kpdslp,kpdabs, & deltsfc, lanom &, imsk, jmsk, slmskh, rla, rlo, gausm, blnmsk, bltmsk,me &, lprnt,iprnt,fnalbc2,ialb,tile_num_ch,i_index,j_index) -! if(lprnt) print *,'tsfclm=',tsfclm(iprnt),' tsfcl2=',tsfcl2(iprnt) ! ! scale surface roughness and albedo to model required units ! + zsca=100. call scale(zorclm,len,zsca) zsca=0.01 @@ -1150,7 +1178,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & ! ! make sure vegetation type and soil type are non zero over land ! - call landtyp(vetclm,sotclm,slpclm,slmskl,len) + call landtyp(vetclm,sotclm,socclm,slpclm,slmskl,len) ! !cwu [-1l/+1l] !* ice concentration or ice mask (only ice mask used in the model now) @@ -1202,7 +1230,6 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & ! if(lprnt) print *,' aisclm=',aisclm(iprnt),' sliclm=' ! &,sliclm(iprnt),' slmskw=',slmskw(iprnt) ! -! write(6,*) 'sliclm' ! znnt=1. ! call nntprt(sliclm,len,znnt) ! @@ -1317,6 +1344,15 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & sotlmx,sotlmn,sotomx,sotomn,sotimx,sotimn, & sotjmx,sotjmn,sotsmx,sotsmn,epssot, & rla,rlo,len,kqcm,percrit,lgchek,me) +! soil color + call qcmxmn('socc ',socclm,slmskl,snoclm,icefl1, + & soclmx,soclmn,socomx,socomn,socimx,socimn, + & socjmx,socjmn,socsmx,socsmn,epssoc, + & rla,rlo,len,kqcm,percrit,lgchek,me) + +! znnt=1. +! call nntprt(socclm,len,znnt) + !cwu [+8l] --------------------------------------------------------------- call qcmxmn('sihc ',sihclm,sliclm,snoclm,icefl1, & sihlmx,sihlmn,sihomx,sihomn,sihimx,sihimn, @@ -1382,6 +1418,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call monitr('vegclm',vegclm,sliclm,snoclm,len) call monitr('vetclm',vetclm,sliclm,snoclm,len) call monitr('sotclm',sotclm,sliclm,snoclm,len) + call monitr('socclm',socclm,sliclm,snoclm,len) !cwu [+2l] add sih, sic call monitr('sihclm',sihclm,sliclm,snoclm,len) call monitr('sicclm',sicclm,sliclm,snoclm,len) @@ -1405,16 +1442,17 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call filanl(tsfanl,tsfan2,wetanl,snoanl,zoranl,albanl,aisanl, & tg3anl,cvanl ,cvbanl,cvtanl, & cnpanl,smcanl,stcanl,slianl,scvanl,veganl, - & vetanl,sotanl,alfanl, + & vetanl,sotanl,socanl,alfanl, & sihanl,sicanl, & vmnanl,vmxanl,slpanl,absanl, & tsfclm,tsfcl2,wetclm,snoclm,zorclm,albclm,aisclm, & tg3clm,cvclm ,cvbclm,cvtclm, & cnpclm,smcclm,stcclm,sliclm,scvclm,vegclm, - & vetclm,sotclm,alfclm, + & vetclm,sotclm,socclm,alfclm, & sihclm,sicclm, & vmnclm,vmxclm,slpclm,absclm, & len,lsoil) + ! ! reverse scaling to match with grib analysis input ! @@ -1440,24 +1478,25 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call analy(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & fntsfa,fnweta,fnsnoa,fnzora,fnalba,fnaisa, & fntg3a,fnscva,fnsmca,fnstca,fnacna,fnvega, - & fnveta,fnsota, + & fnveta,fnsota,fnsoca, & fnvmna,fnvmxa,fnslpa,fnabsa, & tsfanl,wetanl,snoanl,zoranl,albanl,aisanl, & tg3anl,cvanl ,cvbanl,cvtanl, & smcanl,stcanl,slianl,scvanl,acnanl,veganl, - & vetanl,sotanl,alfanl,tsfan0, + & vetanl,sotanl,socanl,alfanl,tsfan0, & vmnanl,vmxanl,slpanl,absanl, & kpdtsf,kpdwet,kpdsno,kpdsnd,kpdzor,kpdalb,kpdais, & kpdtg3,kpdscv,kpdacn,kpdsmc,kpdstc,kpdveg, - & kpdvet,kpdsot,kpdalf, + & kpdvet,kpdsot,kpdsoc,kpdalf, & kpdvmn,kpdvmx,kpdslp,kpdabs, & irttsf,irtwet,irtsno,irtzor,irtalb,irtais, & irttg3,irtscv,irtacn,irtsmc,irtstc,irtveg, - & irtvet,irtsot,irtalf + & irtvet,irtsot,irtsoc,irtalf &, irtvmn,irtvmx,irtslp,irtabs, & imsk, jmsk, slmskh, rla, rlo, gausm, blnmsk, bltmsk &, me, lanom) + ! if(lprnt) print *,' tsfanl=',tsfanl(iprnt) ! ! scale zor and alb to match forecast model units @@ -1705,6 +1744,12 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & sotlmx,sotlmn,sotomx,sotomn,sotimx,sotimn, & sotjmx,sotjmn,sotsmx,sotsmn,epssot, & rla,rlo,len,kqcm,percrit,lgchek,me) +! soil color + call qcmxmn('soca ',socanl,slmskl,snoanl,icefl1, + & soclmx,soclmn,socomx,socomn,socimx,socimn, + & socjmx,socjmn,socsmx,socsmn,epssoc, + & rla,rlo,len,kqcm,percrit,lgchek,me) + !clu [+16l]---------------------------------------------------------------------- ! call qcmxmn('vmna ',vmnanl,slianl,snoanl,icefl1, call qcmxmn('vmna ',vmnanl,slmskl,snoanl,icefl1, @@ -1758,6 +1803,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call monitr('veganl',veganl,slianl,snoanl,len) call monitr('vetanl',vetanl,slianl,snoanl,len) call monitr('sotanl',sotanl,slianl,snoanl,len) + call monitr('socanl',socanl,slianl,snoanl,len) !cwu [+2l] add sih, sic call monitr('sihanl',sihanl,slianl,snoanl,len) call monitr('sicanl',sicanl,slianl,snoanl,len) @@ -1789,7 +1835,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call filfcs(tsffcs,wetfcs,snofcs,zorfcs,albfcs, & tg3fcs,cvfcs ,cvbfcs,cvtfcs, & cnpfcs,smcfcs,stcfcs,slifcs,aisfcs, - & vegfcs,vetfcs,sotfcs,alffcs, + & vegfcs,vetfcs,sotfcs,socfcs,alffcs, !cwu [+1l] add ()fcs for sih, sic & sihfcs,sicfcs, !clu [+1l] add ()fcs for vmn, vmx, slp, abs @@ -1797,12 +1843,17 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & tsfanl,wetanl,snoanl,zoranl,albanl, & tg3anl,cvanl ,cvbanl,cvtanl, & cnpanl,smcanl,stcanl,slianl,aisanl, - & veganl,vetanl,sotanl,alfanl, + & veganl,vetanl,sotanl,socanl,alfanl, !cwu [+1l] add ()anl for sih, sic & sihanl,sicanl, !clu [+1l] add ()anl for vmn, vmx, slp, abs & vmnanl,vmxanl,slpanl,absanl, & len,lsoil) + + do i=1,len + print *, 'AFTER FILFCS (i) is ',socfcs (i) + enddo + if (sig1t(1) /= 0.) then call usesgt(sig1t,slianl,tg3anl,len,lsoil,tsffcs,stcfcs, & tsfimx) @@ -1949,6 +2000,11 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & sotlmx,sotlmn,sotomx,sotomn,sotimx,sotimn, & sotjmx,sotjmn,sotsmx,sotsmn,epssot, & rla,rlo,len,kqcm,percrit,lgchek,me) + call qcmxmn('socf ',socfcs,slmskl,snofcs,icefl1, + & soclmx,soclmn,socomx,socomn,socimx,socimn, + & socjmx,socjmn,socsmx,socsmn,epssoc, + & rla,rlo,len,kqcm,percrit,lgchek,me) + !clu [+16l] --------------------------------------------------------------- ! call qcmxmn('vmnf ',vmnfcs,slifcs,snofcs,icefl1, @@ -2002,6 +2058,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call monitr('vegfcs',vegfcs,slifcs,snofcs,len) call monitr('vetfcs',vetfcs,slifcs,snofcs,len) call monitr('sotfcs',sotfcs,slifcs,snofcs,len) + call monitr('socfcs',socfcs,slifcs,snofcs,len) !cwu [+2l] add sih, sic call monitr('sihfcs',sihfcs,slifcs,snofcs,len) call monitr('sicfcs',sicfcs,slifcs,snofcs,len) @@ -2066,23 +2123,23 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & tsffcs,wetfcs,snofcs,zorfcs,albfcs,aisfcs, & cvfcs ,cvbfcs,cvtfcs, & cnpfcs,smcfcs,stcfcs,slifcs,vegfcs, - & vetfcs,sotfcs,alffcs, + & vetfcs,sotfcs,socfcs,alffcs, & sihanl,sicanl, & vmnanl,vmxanl,slpanl,absanl, & tsfanl,tsfan2,wetanl,snoanl,zoranl,albanl,aisanl, & cvanl ,cvbanl,cvtanl, & cnpanl,smcanl,stcanl,slianl,veganl, - & vetanl,sotanl,alfanl, + & vetanl,sotanl,socanl,alfanl, & ctsfl,calbl,caisl,csnol,csmcl,czorl,cstcl,cvegl, & ctsfs,calbs,caiss,csnos,csmcs,czors,cstcs,cvegs, - & ccv,ccvb,ccvt,ccnp,cvetl,cvets,csotl,csots, + & ccv,ccvb,ccvt,ccnp,cvetl,cvets,csotl,csots,csocl,csocs, & calfl,calfs, & csihl,csihs,csicl,csics, & cvmnl,cvmns,cvmxl,cvmxs,cslpl,cslps,cabsl,cabss, & irttsf,irtwet,irtsno,irtzor,irtalb,irtais, & irttg3,irtscv,irtacn,irtsmc,irtstc,irtveg, & irtvmn,irtvmx,irtslp,irtabs, - & irtvet,irtsot,irtalf,landice,me) + & irtvet,irtsot,irtsoc,irtalf,landice,me) call setzro(snoanl,epssno,len) @@ -2177,6 +2234,11 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & & sotlmx,sotlmn,sotomx,sotomn,sotimx,sotimn, & sotjmx,sotjmn,sotsmx,sotsmn,epssot, & rla,rlo,len,kqcm,percrit,lgchek,me) + + call qcmxmn('socm ',socanl,slmskl,snoanl,icefl1, + & soclmx,soclmn,socomx,socomn,socimx,socimn, + & socjmx,socjmn,socsmx,socsmn,epssoc, + & rla,rlo,len,kqcm,percrit,lgchek,me) !cwu [+8l] add sih, sic, call qcmxmn('sihm ',sihanl,slianl,snoanl,icefl1, & sihlmx,sihlmn,sihomx,sihomn,sihimx,sihimn, @@ -2269,6 +2331,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call monitr('veganl',veganl,slianl,snoanl,len) call monitr('vetanl',vetanl,slianl,snoanl,len) call monitr('sotanl',sotanl,slianl,snoanl,len) + call monitr('socanl',socanl,slianl,snoanl,len) !cwu [+2l] add sih, sic, call monitr('sihanl',sihanl,slianl,snoanl,len) call monitr('sicanl',sicanl,slianl,snoanl,len) @@ -2284,7 +2347,8 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & allocate (tsffcsd(len), snofcsd(len), tg3fcsd(len), & & zorfcsd(len), slifcsd(len), aisfcsd(len), & & cnpfcsd(len), vegfcsd(len), vetfcsd(len), & - & sotfcsd(len), sihfcsd(len), sicfcsd(len), & + & sotfcsd(len), socfcsd(len),sihfcsd(len), & + & sicfcsd(len), & & vmnfcsd(len), vmxfcsd(len), slpfcsd(len), & & absfcsd(len)) allocate (smcfcsd(len,lsoil), stcfcsd(len,lsoil), & @@ -2302,6 +2366,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & vegfcsd(i) = veganl(i) - vegfcs(i) vetfcsd(i) = vetanl(i) - vetfcs(i) sotfcsd(i) = sotanl(i) - sotfcs(i) + socfcsd(i) = socanl(i) - socfcs(i) !clu [+2l] add sih, sic sihfcsd(i) = sihanl(i) - sihfcs(i) sicfcsd(i) = sicanl(i) - sicfcs(i) @@ -2355,6 +2420,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call monitr('vegdif',vegfcsd,slianl,snoanl,len) call monitr('vetdif',vetfcsd,slianl,snoanl,len) call monitr('sotdif',sotfcsd,slianl,snoanl,len) + call monitr('socdif',socfcsd,slianl,snoanl,len) !cwu [+2l] add sih, sic call monitr('sihdif',sihfcsd,slianl,snoanl,len) call monitr('sicdif',sicfcsd,slianl,snoanl,len) @@ -2365,7 +2431,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & call monitr('absdif',absfcsd,slianl,snoanl,len) endif deallocate (tsffcsd, snofcsd, tg3fcsd, zorfcsd, slifcsd, & - & aisfcsd, cnpfcsd, vegfcsd, vetfcsd, sotfcsd, & + & aisfcsd, cnpfcsd, vegfcsd, vetfcsd, sotfcsd,socfcsd, & & sihfcsd, sicfcsd, vmnfcsd, vmxfcsd, slpfcsd, & & absfcsd) deallocate (smcfcsd, stcfcsd, albfcsd) @@ -2388,6 +2454,7 @@ subroutine sfccycle(lugb,len,lsoil,sig1t,deltsfc & vegfcs(i) = veganl(i) vetfcs(i) = vetanl(i) sotfcs(i) = sotanl(i) + socfcs(i) = socanl(i) !clu [+4l] add vmn, vmx, slp, abs vmnfcs(i) = vmnanl(i) vmxfcs(i) = vmxanl(i) @@ -2723,8 +2790,6 @@ subroutine hmskrd(lugb,imsk,jmsk,fnmskh, & call fixrdg(lugb,imsk,jmsk,fnmskh, & kpds5,slmskh,gausm,blnmsk,bltmsk,me) -! print *,'in sfc_sub, aft fixrdg,slmskh=',maxval(slmskh), -! & minval(slmskh),'mdata=',mdata,'imsk*jmsk=',imsk*jmsk do i=1,imsk*jmsk slmskh(i) = nint(slmskh(i)) @@ -3486,9 +3551,6 @@ subroutine la2ga(regin,imxin,jmxin,rinlon,rinlat,rlon,rlat,inttyp,& & wi1j2*sums +wi2j2*sums ) & * wsumiv endif -! print *,' slmask=',slmask(i),' sums=',sums,' sumn=',sumn -! & ,' regin=',regin(i1,j2),regin(i2,j2),' j1=',j1,' j2=',j2 -! & ,' wij=',wi1j1, wi2j1, wi1j2, wi2j2,wsumiv else if (slmask(i) .eq. 1.0) then sums = sum1 @@ -3645,14 +3707,14 @@ subroutine filanl(tsfanl,tsfan2,wetanl,snoanl,zoranl,albanl, & & aisanl, & & tg3anl,cvanl ,cvbanl,cvtanl, & & cnpanl,smcanl,stcanl,slianl,scvanl,veganl, & - & vetanl,sotanl,alfanl, & + & vetanl,sotanl,socanl,alfanl, & !socanl: soil color & sihanl,sicanl, & !cwu [+1l] add ()anl for sih, sic & vmnanl,vmxanl,slpanl,absanl, & !clu [+1l] add ()anl for vmn, vmx, slp, abs & tsfclm,tsfcl2,wetclm,snoclm,zorclm,albclm, & & aisclm, & & tg3clm,cvclm ,cvbclm,cvtclm, & & cnpclm,smcclm,stcclm,sliclm,scvclm,vegclm, & - & vetclm,sotclm,alfclm, & + & vetclm,sotclm,socclm,alfclm, & !socclm: soil color & sihclm,sicclm, & !cwu [+1l] add ()clm for sih, sic & vmnclm,vmxclm,slpclm,absclm, & !clu [+1l] add ()clm for vmn, vmx, slp, abs & len,lsoil) @@ -3668,7 +3730,7 @@ subroutine filanl(tsfanl,tsfan2,wetanl,snoanl,zoranl,albanl, & & cnpanl(len), & & smcanl(len,lsoil),stcanl(len,lsoil), & & slianl(len),scvanl(len),veganl(len), & - & vetanl(len),sotanl(len),alfanl(len,2) & + & vetanl(len),sotanl(len),socanl(len),alfanl(len,2) & !socanl:soil color &, sihanl(len),sicanl(len) & &, vmnanl(len),vmxanl(len),slpanl(len),absanl(len) real (kind=kind_io8) tsfclm(len),tsfcl2(len),wetclm(len), & @@ -3679,7 +3741,7 @@ subroutine filanl(tsfanl,tsfan2,wetanl,snoanl,zoranl,albanl, & & cnpclm(len), & & smcclm(len,lsoil),stcclm(len,lsoil), & & sliclm(len),scvclm(len),vegclm(len), & - & vetclm(len),sotclm(len),alfclm(len,2) & + & vetclm(len),sotclm(len),socclm(len),alfclm(len,2) & !socclm:soil color &, sihclm(len),sicclm(len) & &, vmnclm(len),vmxclm(len),slpclm(len),absclm(len) ! @@ -3698,6 +3760,7 @@ subroutine filanl(tsfanl,tsfan2,wetanl,snoanl,zoranl,albanl, & veganl(i) = vegclm(i) ! vegetation cover vetanl(i) = vetclm(i) ! vegetation type sotanl(i) = sotclm(i) ! soil type + socanl(i) = socclm(i) ! soil color cvanl(i) = cvclm(i) ! cv cvbanl(i) = cvbclm(i) ! cvb cvtanl(i) = cvtclm(i) ! cvt @@ -3735,20 +3798,20 @@ subroutine filanl(tsfanl,tsfan2,wetanl,snoanl,zoranl,albanl, & subroutine analy(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & & fntsfa,fnweta,fnsnoa,fnzora,fnalba,fnaisa, & & fntg3a,fnscva,fnsmca,fnstca,fnacna,fnvega, & - & fnveta,fnsota, & + & fnveta,fnsota,fnsoca, & !fnsoca: soil color & fnvmna,fnvmxa,fnslpa,fnabsa, & !clu [+1l] add fn()a for vmn, vmx, slp, abs & tsfanl,wetanl,snoanl,zoranl,albanl,aisanl, & & tg3anl,cvanl ,cvbanl,cvtanl, & & smcanl,stcanl,slianl,scvanl,acnanl,veganl, & - & vetanl,sotanl,alfanl,tsfan0, & + & vetanl,sotanl,socanl,alfanl,tsfan0, & !soil color & vmnanl,vmxanl,slpanl,absanl, & !clu [+1l] add ()anl for vmn, vmx, slp, abs & kpdtsf,kpdwet,kpdsno,kpdsnd,kpdzor,kpdalb,kpdais,& & kpdtg3,kpdscv,kpdacn,kpdsmc,kpdstc,kpdveg, & - & kprvet,kpdsot,kpdalf, & + & kprvet,kpdsot,kpdsoc,kpdalf, & !kpdsoc: soil color & kpdvmn,kpdvmx,kpdslp,kpdabs, & !clu [+1l] add kpd() for vmn, vmx, slp, abs & irttsf,irtwet,irtsno,irtzor,irtalb,irtais, & !cggg snow mods & irttg3,irtscv,irtacn,irtsmc,irtstc,irtveg, & - & irtvet,irtsot,irtalf & + & irtvet,irtsot,irtsoc,irtalf & !irtsoc: soil color &, irtvmn,irtvmx,irtslp,irtabs & !clu [+1l] add irt() for vmn, vmx, slp, abs &, imsk, jmsk, slmskh, outlat, outlon & &, gaus, blno, blto, me, lanom) @@ -3756,9 +3819,9 @@ subroutine analy(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & implicit none logical lanom integer irtsmc,irtacn,irtstc,irtvet,irtveg,irtscv,irtzor,irtsno, & - & irtalb,irttg3,irtais,iret,me,kk,kpdvet,i,irtalf,irtsot, & + & irtalb,irttg3,irtais,iret,me,kk,kpdvet,i,irtalf,irtsot,irtsoc, & !irtsoc:soil color & imsk,jmsk,irtwet,lsoil,len,kpdtsf,kpdsno,kpdsnd,kpdwet,iy,& - & lugb,im,ih,id,kpdveg,kpdstc,kprvet,irttsf,kpdsot,kpdsmc, & + & lugb,im,ih,id,kpdveg,kpdstc,kprvet,irttsf,kpdsot,kpdsoc,kpdsmc,& !kpdsoc: soil color & kpdais,kpdzor,kpdtg3,kpdacn,kpdscv,j & &, kpdvmn,kpdvmx,kpdslp,kpdabs,irtvmn,irtvmx,irtslp,irtabs real (kind=kind_io8) blto,blno,fh @@ -3774,15 +3837,15 @@ subroutine analy(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & ! character*500 fntsfa,fnweta,fnsnoa,fnzora,fnalba,fnaisa, & & fntg3a,fnscva,fnsmca,fnstca,fnacna,fnvega, & - & fnveta,fnsota - &, fnvmna,fnvmxa,fnslpa,fnabsa + & fnveta,fnsota,fnsoca, & !fnsoca: soil color + & fnvmna,fnvmxa,fnslpa,fnabsa real (kind=kind_io8) tsfanl(len), wetanl(len), snoanl(len), & & zoranl(len), albanl(len,4), aisanl(len), & & tg3anl(len), acnanl(len), & & cvanl (len), cvbanl(len), cvtanl(len), & & slianl(len), scvanl(len), veganl(len), & - & vetanl(len), sotanl(len), alfanl(len,2), & + & vetanl(len), sotanl(len), socanl(len),alfanl(len,2), & !socanl: soil color & smcanl(len,lsoil), stcanl(len,lsoil), & & tsfan0(len) & &, vmnanl(len),vmxanl(len),slpanl(len),absanl(len) @@ -4267,6 +4330,36 @@ subroutine analy(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & endif endif +! +! soil color +! + irtsoc=0 + if(fnsoca(1:8).ne.' ') then + call fixrda(lugb,fnsoca,kpdsoc,slmskl, + & iy,im,id,ih,fh,socanl,len,iret + &, imsk, jmsk, slmskh, gaus,blno, blto + &, outlat, outlon, me) + irtsoc=iret + if(iret.eq.1) then + write(6,*) 'FATAL ERROR: soil color analysis read error.' + call abort + elseif(iret.eq.-1) then + if (me .eq. 0) then + print *,'old soil color analysis provided', + & ' indicating proper file name is given.' + print *,' no error suspected.' + write(6,*) 'forecast guess will be used' + endif + else + if (me .eq. 0) print *,'soil color analysis provided.' + endif + else + if (me .eq. 0) then +! print *,'************************************************' + print *,'no soil color anly available. climatology used' + endif + endif + !clu [+120l]-------------------------------------------------------------- ! ! min vegetation cover @@ -4397,13 +4490,13 @@ subroutine analy(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & subroutine filfcs(tsffcs,wetfcs,snofcs,zorfcs,albfcs, & & tg3fcs,cvfcs ,cvbfcs,cvtfcs, & & cnpfcs,smcfcs,stcfcs,slifcs,aisfcs, & - & vegfcs, vetfcs, sotfcs, alffcs, & + & vegfcs, vetfcs, sotfcs,socfcs, alffcs, & !socfcs: soil color & sihfcs,sicfcs, & !cwu [+1l] add ()fcs for sih, sic & vmnfcs,vmxfcs,slpfcs,absfcs, & !clu [+1l] add ()fcs for vmn, vmx, slp, abs & tsfanl,wetanl,snoanl,zoranl,albanl, & & tg3anl,cvanl ,cvbanl,cvtanl, & & cnpanl,smcanl,stcanl,slianl,aisanl, & - & veganl, vetanl, sotanl, alfanl, & + & veganl, vetanl, sotanl,socanl, alfanl, & !soil color & sihanl,sicanl, & !cwu [+1l] add ()anl for sih, sic & vmnanl,vmxanl,slpanl,absanl, & !clu [+1l] add ()anl for vmn, vmx, slp, abs & len,lsoil) @@ -4418,7 +4511,7 @@ subroutine filfcs(tsffcs,wetfcs,snofcs,zorfcs,albfcs, & & cnpfcs(len), & & smcfcs(len,lsoil),stcfcs(len,lsoil), & & slifcs(len),vegfcs(len), & - & vetfcs(len),sotfcs(len),alffcs(len,2) & + & vetfcs(len),sotfcs(len),socfcs(len),alffcs(len,2) & !socfcs: soil color &, sihfcs(len),sicfcs(len) & &, vmnfcs(len),vmxfcs(len),slpfcs(len),absfcs(len) real (kind=kind_io8) tsfanl(len),wetanl(len),snoanl(len), & @@ -4428,7 +4521,7 @@ subroutine filfcs(tsffcs,wetfcs,snofcs,zorfcs,albfcs, & & cnpanl(len), & & smcanl(len,lsoil),stcanl(len,lsoil), & & slianl(len),veganl(len), & - & vetanl(len),sotanl(len),alfanl(len,2) & + & vetanl(len),sotanl(len),socanl(len),alfanl(len,2) & !socanl:soil color &, sihanl(len),sicanl(len) & &, vmnanl(len),vmxanl(len),slpanl(len),absanl(len) ! @@ -4457,6 +4550,7 @@ subroutine filfcs(tsffcs,wetfcs,snofcs,zorfcs,albfcs, & vegfcs(i) = veganl(i) ! vegetation cover vetfcs(i) = vetanl(i) ! vegetation type sotfcs(i) = sotanl(i) ! soil type + socfcs(i) = socanl(i) ! soil color alffcs(i,1) = alfanl(i,1) ! vegetation fraction for albedo alffcs(i,2) = alfanl(i,2) ! vegetation fraction for albedo !cwu [+2l] add sih, sic @@ -4688,41 +4782,43 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & & tsffcs,wetfcs,snofcs,zorfcs,albfcs,aisfcs, & & cvfcs ,cvbfcs,cvtfcs, & & cnpfcs,smcfcs,stcfcs,slifcs,vegfcs, & - & vetfcs,sotfcs,alffcs, & + & vetfcs,sotfcs,socfcs,alffcs, & !socfcs:soil color & sihanl,sicanl, & & vmnanl,vmxanl,slpanl,absanl, & & tsfanl,tsfan2,wetanl,snoanl,zoranl,albanl,aisanl,& & cvanl ,cvbanl,cvtanl, & & cnpanl,smcanl,stcanl,slianl,veganl, & - & vetanl,sotanl,alfanl, & + & vetanl,sotanl,socanl,alfanl, & !socanl:soil color & ctsfl,calbl,caisl,csnol,csmcl,czorl,cstcl,cvegl, & & ctsfs,calbs,caiss,csnos,csmcs,czors,cstcs,cvegs, & & ccv,ccvb,ccvt,ccnp,cvetl,cvets,csotl,csots, & + & csocl,csocs, & !csocl,csocs:soil color & calfl,calfs, & & csihl,csihs,csicl,csics, & & cvmnl,cvmns,cvmxl,cvmxs,cslpl,cslps,cabsl,cabss, & & irttsf,irtwet,irtsno,irtzor,irtalb,irtais, & & irttg3,irtscv,irtacn,irtsmc,irtstc,irtveg, & & irtvmn,irtvmx,irtslp,irtabs, & - & irtvet,irtsot,irtalf, landice, me) + & irtvet,irtsot,irtsoc,irtalf, landice, me) use machine , only : kind_io8,kind_io4 use sfccyc_module, only : veg_type_landice, soil_type_landice, & - & num_threads, zero, one + & num_threads, zero, one,soil_color_landice implicit none integer k,i,im,id,iy,len,lsoil,ih,irtacn,irtsmc,irtscv,irtais, & - & irttg3,irtstc,irtalf,me,irtsot,irtveg,irtvet, irtzor, & + & irttg3,irtstc,irtalf,me,irtsot,irtsoc,irtveg,irtvet, irtzor, & !irtsoc:soil color & irtalb,irtsno,irttsf,irtwet,j & &, irtvmn,irtvmx,irtslp,irtabs logical, intent(in) :: landice - real (kind=kind_io8) rvegs,rvets,rzors,raiss,rsnos,rsots,rcnp, & - & rcvt,rcv,rcvb,rsnol,rzorl,raisl,ralbl, & - & ralfl,rvegl,ralbs,ralfs,rtsfs,rvetl,rsotl, & + real (kind=kind_io8) rvegs,rvets,rzors,raiss,rsnos,rsots,rsocs, & !rsocs:soil color + & rcnp,rcvt,rcv,rcvb,rsnol,rzorl,raisl,ralbl, & + & ralfl,rvegl,ralbs,ralfs,rtsfs,rvetl,rsotl,rsocl, & & qzors,qvegs,qsnos,qalfs,qaiss,qvets,qcvt, & - & qcnp,qcvb,qsots,qcv,qaisl,qsnol,qalfl, & - & qtsfl,qalbl,qzorl,qtsfs,qalbs,qsotl,qvegl, & + & qcnp,qcvb,qsots,qsocs,qcv,qaisl,qsnol,qalfl, & + & qtsfl,qalbl,qzorl,qtsfs,qalbs,qsotl,qsocl,qvegl, & & qvetl,rtsfl,calbs,caiss,ctsfs,czorl,cvegl, & & csnos,ccvb,ccvt,ccv,czors,cvegs,caisl,csnol, & & calbl,fh,ctsfl,ccnp,csots,calfl,csotl,cvetl, & + & csocl,csocs, & !csocl,csocs:soil color & cvets,calfs,deltsfc, & & csihl,csihs,csicl,csics, & & rsihl,rsihs,rsicl,rsics, & @@ -4739,7 +4835,7 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & & cnpfcs(len), & & smcfcs(len,lsoil),stcfcs(len,lsoil), & & slifcs(len), vegfcs(len), & - & vetfcs(len), sotfcs(len), alffcs(len,2) & + & vetfcs(len), sotfcs(len),socfcs(len), alffcs(len,2) & !socfcs:soil color &, sihfcs(len), sicfcs(len) & &, vmnfcs(len),vmxfcs(len),slpfcs(len),absfcs(len) real (kind=kind_io8) tsfanl(len),tsfan2(len), & @@ -4749,7 +4845,7 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & & cnpanl(len), & & smcanl(len,lsoil),stcanl(len,lsoil), & & slianl(len), veganl(len), & - & vetanl(len), sotanl(len), alfanl(len,2) & + & vetanl(len), sotanl(len),socanl(len), alfanl(len,2) & !socanl:soil color &, sihanl(len),sicanl(len) & &, vmnanl(len),vmxanl(len),slpanl(len),absanl(len) ! @@ -4787,6 +4883,7 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & rvegl = cvegl rvetl = cvetl rsotl = csotl + rsocl = csocl !soil color rsihl = csihl rsicl = csicl rvmnl = cvmnl @@ -4804,6 +4901,7 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & rvegs = cvegs rvets = cvets rsots = csots + rsocs = csocs !soil color rsihs = csihs rsics = csics rvmns = cvmns @@ -4885,6 +4983,11 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & rsots = 1. endif + if(irtsoc == -1) then !soil color + rsocl = 1. + rsocs = 1. + endif + if(irtacn == -1) then rsicl = 1. rsics = 1. @@ -4919,8 +5022,10 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & 100 format('rtsfl,ralbl,raisl,rsnol,rsmcl,rzorl,rvegl=',10f7.3) write(6,101) rtsfs,ralbs,raiss,rsnos,rsmcs,rzors,rvegs,rsics 101 format('rtsfs,ralbs,raiss,rsnos,rsmcs,rzors,rvegs,rsics=',11f7.3) -! print *,' ralfl=',ralfl,' ralfs=',ralfs,' rsotl=',rsotl -! *,' rsots=',rsots,' rvetl=',rvetl,' rvets=',rvets + + write(6,102) rsocl,rsocs + 102 format('rsoc1, rsocs =',10f7.3) + endif ! qtsfl = 1. - rtsfl @@ -4933,6 +5038,8 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & qvegl = 1. - rvegl qvetl = 1. - rvetl qsotl = 1. - rsotl + qsocl = 1. - rsocl !soil color + qsihl = 1. - rsihl qsicl = 1. - rsicl qvmnl = 1. - rvmnl @@ -4950,6 +5057,8 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & qvegs = 1. - rvegs qvets = 1. - rvets qsots = 1. - rsots + qsocs = 1. - rsocs + qsihs = 1. - rsihs qsics = 1. - rsics qvmns = 1. - rvmns @@ -4977,17 +5086,6 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & print *, 'dbgx-- csnol, csnos:',csnol,csnos print *, 'dbgx-- rsnol, rsnos:',rsnol,rsnos endif - -! print *, rtsfs, qtsfs, raiss , qaiss -! *, rsnos , qsnos, rzors , qzors, rvegs , qvegs -! *, rvets , qvets, rsots , qsots -! *, rcv, rcvb, rcvt, qcv, qcvb, qcvt -! *, ralbs, qalbs, ralfs, qalfs -! print *, rtsfl, qtsfl, raisl , qaisl -! *, rsnol , qsnol, rzorl , qzorl, rvegl , qvegl -! *, rvetl , qvetl, rsotl , qsotl -! *, ralbl, qalbl, ralfl, qalfl -! ! len_thread_m = (len+num_threads-1) / num_threads @@ -4999,9 +5097,11 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & if(slianl(i) == zero) then vetanl(i) = vetfcs(i)*rvets + vetanl(i)*qvets sotanl(i) = sotfcs(i)*rsots + sotanl(i)*qsots + socanl(i) = socfcs(i)*rsocs + socanl(i)*qsocs else vetanl(i) = vetfcs(i)*rvetl + vetanl(i)*qvetl sotanl(i) = sotfcs(i)*rsotl + sotanl(i)*qsotl + socanl(i) = socfcs(i)*rsocl + socanl(i)*qsocl endif enddo enddo @@ -5066,7 +5166,7 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & ! enddo -! at landice points, set the soil type, slope type and +! at landice points, set the soil type, color,slope type and ! greenness fields to flag values. if (landice) then @@ -5074,6 +5174,7 @@ subroutine merge(len,lsoil,iy,im,id,ih,fh,deltsfc, & if (nint(slianl(i)) == 1) then if (nint(vetanl(i)) == veg_type_landice) then sotanl(i) = soil_type_landice + socanl(i) = soil_color_landice veganl(i) = 0.0 slpanl(i) = 9.0 vmnanl(i) = 0.0 @@ -6895,12 +6996,12 @@ subroutine ga2la(gauin,imxin,jmxin,regout,imxout,jmxout, & end !>\ingroup mod_sfcsub - subroutine landtyp(vegtype,soiltype,slptype,slmask,len) + subroutine landtyp(vegtype,soiltype,colortype,slptype,slmask,len) use machine , only : kind_io8,kind_io4 implicit none integer i,len real (kind=kind_io8) vegtype(len),soiltype(len),slmask(len) & - &, slptype(len) + &, slptype(len),colortype(len) ! ! make sure that the soil type and veg type are non-zero over land ! @@ -6908,6 +7009,7 @@ subroutine landtyp(vegtype,soiltype,slptype,slmask,len) if (slmask(i) .eq. 1) then if (vegtype(i) .eq. 0.) vegtype(i) = 7 if (soiltype(i) .eq. 0.) soiltype(i) = 2 + if (colortype(i) .eq. 0.) colortype(i)= 4 if (slptype(i) .eq. 0.) slptype(i) = 1 endif enddo @@ -6931,9 +7033,6 @@ subroutine gaulat(gaul,k) do n=1,k gaul(n) = acos(a(n)) * radi enddo -! -! print *,'gaussian lat (deg) for jmax=',k -! print *,(gaul(n),n=1,k) ! return 70 write(6,6000) @@ -6966,16 +7065,16 @@ subroutine anomint(tsfan0,tsfclm,tsfcl0,tsfanl,len) subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & & fntsfc,fnwetc,fnsnoc,fnzorc,fnalbc,fnaisc, & & fntg3c,fnscvc,fnsmcc,fnstcc,fnacnc,fnvegc, & - & fnvetc,fnsotc, & + & fnvetc,fnsotc,fnsocc, & & fnvmnc,fnvmxc,fnslpc,fnabsc, & & tsfclm,tsfcl2,wetclm,snoclm,zorclm,albclm,aisclm,& & tg3clm,cvclm ,cvbclm,cvtclm, & & cnpclm,smcclm,stcclm,sliclm,scvclm,acnclm,vegclm,& - & vetclm,sotclm,alfclm, & + & vetclm,sotclm,socclm,alfclm, & & vmnclm,vmxclm,slpclm,absclm, & & kpdtsf,kpdwet,kpdsno,kpdzor,kpdalb,kpdais, & & kpdtg3,kpdscv,kpdacn,kpdsmc,kpdstc,kpdveg, & - & kpdvet,kpdsot,kpdalf,tsfcl0, & + & kpdvet,kpdsot,kpdsoc,kpdalf,tsfcl0, & & kpdvmn,kpdvmx,kpdslp,kpdabs, & & deltsfc, lanom & &, imsk, jmsk, slmskh, outlat, outlon & @@ -6993,13 +7092,13 @@ subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & & jy,mon1,is2,isx,kpd9,is1,l,nn,mon2,mon,is,kpdsno, & & kpdzor,kpdtsf,kpdwet,kpdscv,kpdacn,kpdais,kpdtg3,im,id, & & lugb,iy,len,lsoil,ih,kpdsmc,iprnt,me,m1,m2,k1,k2, & - & kpdvet,kpdsot,kpdstc,kpdveg,jmsk,imsk,j,ialb & + & kpdvet,kpdsot,kpdsoc,kpdstc,kpdveg,jmsk,imsk,j,ialb & &, kpdvmn,kpdvmx,kpdslp,kpdabs,landice_cat integer kpdalb(4), kpdalf(2) ! character*500 fntsfc,fnwetc,fnsnoc,fnzorc,fnalbc,fnaisc, & & fntg3c,fnscvc,fnsmcc,fnstcc,fnacnc,fnvegc, & - & fnvetc,fnsotc,fnalbc2 & + & fnvetc,fnsotc,fnsocc,fnalbc2 & &, fnvmnc,fnvmxc,fnslpc,fnabsc real (kind=kind_io8) tsfclm(len),tsfcl2(len), & & wetclm(len),snoclm(len), & @@ -7009,7 +7108,7 @@ subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & & cnpclm(len), & & smcclm(len,lsoil),stcclm(len,lsoil), & & sliclm(len),scvclm(len),vegclm(len), & - & vetclm(len),sotclm(len),alfclm(len,2) & + & vetclm(len),sotclm(len),socclm(len),alfclm(len,2) & &, vmnclm(len),vmxclm(len),slpclm(len),absclm(len) real (kind=kind_io8) slmskh(imsk,jmsk) real (kind=kind_io8) outlat(len), outlon(len) @@ -7051,7 +7150,7 @@ subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & & zor(:,:),wet(:,:), & ais(:,:), acn(:,:), scv(:,:), smc(:,:,:), & tg3(:), alb(:,:,:), alf(:,:), - & vet(:), sot(:), tsf2(:), + & vet(:), sot(:), soc(:), tsf2(:), & veg(:,:), stc(:,:,:) &, vmn(:), vmx(:), slp(:), absm(:) ! @@ -7060,7 +7159,7 @@ subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & data mon1s/0/, mon2s/0/, sea1s/0/, sea2s/0/ ! save first, tsf, sno, zor, wet, ais, acn, scv, smc, tg3, - & alb, alf, vet, sot, tsf2, veg, stc, + & alb, alf, vet, sot, soc,tsf2, veg, stc, & vmn, vmx, slp, absm, & mon1s, mon2s, sea1s, sea2s, dayhf, k1, k2, m1, m2, & landice_cat @@ -7115,7 +7214,7 @@ subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & & wet(len,2), ais(len,2), acn(len,2), & scv(len,2), smc(len,lsoil,2), & tg3(len), alb(len,4,2), alf(len,2), - & vet(len), sot(len), tsf2(len), + & vet(len), sot(len), soc(len),tsf2(len), !clu [+1l] add vmn, vmx, slp, abs & vmn(len), vmx(len), slp(len), absm(len), & veg(len,2), stc(len,lsoil,2)) @@ -7394,6 +7493,7 @@ subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & endif ! ! soil type + print *,'in FIXREAD fnsotc =',fnsotc ! if(fnsotc(1:8).ne.' ') then if ( index(fnsotc, "tileX.nc") == 0) then ! grib file @@ -7409,6 +7509,24 @@ subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & if (me .eq. 0) write(6,*) 'climatological soil type read in.' endif +! +! soil color +! + If(fnsocc(1:8).ne.' ') then + if ( index(fnsocc, "tileX.nc") == 0) then ! grib file + kpd7=-1 + call fixrdc(lugb,fnsocc,kpdsoc,kpd7,kpd9,slmskl, + & soc,len,iret + &, imsk, jmsk, slmskh, gaus,blno, blto + &, outlat, outlon, me) + else + call fixrdc_tile(fnsocc, tile_num_ch, i_index, j_index, + & 255, soc, 1, len, me) + if (me .eq. 0) write(6,*) 'Soil color data name is',fnsocc + endif + if (me .eq. 0) write(6,*) 'climatological soil color read in.' + endif + ! ! min vegetation cover ! @@ -8088,6 +8206,17 @@ subroutine clima(lugb,iy,im,id,ih,fh,len,lsoil,slmskl,slmskw, & enddo endif +! initialize socclm in case there is no soil color data input + + do i=1,len + socclm(i) = 4. + enddo + + if(fnsocc(1:8).ne.' ') then + do i=1,len + socclm(i) = soc(i) + enddo + endif !clu ---------------------------------------------------------------------- ! @@ -8217,6 +8346,8 @@ subroutine fixrdc_tile(filename_raw, tile_num_ch, & error=nf90_inq_varid(ncid, 'vegetation_type', id_var) case(236) error=nf90_inq_varid(ncid, 'slope_type', id_var) + case(255) + ERROR=NF90_INQ_VARID(NCID, 'soil_color', id_var) case(256:257) error=nf90_inq_varid(ncid, 'vegetation_greenness', id_var) case default diff --git a/physics/sgscloud_radpre.F90 b/physics/sgscloud_radpre.F90 index 07f74714a..44ab87bcc 100644 --- a/physics/sgscloud_radpre.F90 +++ b/physics/sgscloud_radpre.F90 @@ -45,7 +45,7 @@ subroutine sgscloud_radpre_run( & qr, qs, qg, & qci_conv,qlc,qli,ud_mf, & imfdeepcnv, imfdeepcnv_gf, & - imfdeepcnv_unified, & + imfdeepcnv_c3, & imfdeepcnv_sas, & qc_save, qi_save, qs_save, & qc_bl,qi_bl,cldfra_bl, & @@ -74,7 +74,7 @@ subroutine sgscloud_radpre_run( & real :: xls, xlvcp, xlscp !derived below real(kind=kind_phys) :: gfac integer, intent(in) :: im, levs, imfdeepcnv, imfdeepcnv_gf, & - & nlay, imfdeepcnv_sas, imfdeepcnv_unified, imp_physics, & + & nlay, imfdeepcnv_sas, imfdeepcnv_c3, imp_physics, & & imp_physics_gfdl, imp_physics_fa logical, intent(in) :: flag_init, flag_restart, do_mynnedmf @@ -273,7 +273,7 @@ subroutine sgscloud_radpre_run( & ! At this point, we have cloud properties for all non-deep convective clouds. ! So now we add the convective clouds: - if (imfdeepcnv == imfdeepcnv_gf .or. imfdeepcnv == imfdeepcnv_unified) then + if (imfdeepcnv == imfdeepcnv_gf .or. imfdeepcnv == imfdeepcnv_c3) then do k = 1, levs do i = 1, im if ( qci_conv(i,k) > 0. ) then diff --git a/physics/sgscloud_radpre.meta b/physics/sgscloud_radpre.meta index 6415358de..d5341bcd4 100644 --- a/physics/sgscloud_radpre.meta +++ b/physics/sgscloud_radpre.meta @@ -256,9 +256,9 @@ dimensions = () type = integer intent = in -[imfdeepcnv_unified] - standard_name = identifier_for_unified_deep_convection - long_name = flag for Unified deep convection scheme +[imfdeepcnv_c3] + standard_name = identifier_for_c3_deep_convection + long_name = flag for C3 deep convection scheme units = flag dimensions = () type = integer