diff --git a/src/core_atmosphere/Externals.cfg b/src/core_atmosphere/Externals.cfg index 84dc47d1d8..b71a0451c6 100644 --- a/src/core_atmosphere/Externals.cfg +++ b/src/core_atmosphere/Externals.cfg @@ -1,8 +1,8 @@ [MMM-physics] local_path = ./physics_mmm protocol = git -repo_url = https://github.com/NCAR/MMM-physics.git -tag = 20250616-MPASv8.3 +repo_url = https://github.com/Sonyou184/MMM-physics.git +branch = MMM2026-SHPBL required = True [GSL_UGWP] diff --git a/src/core_atmosphere/Registry.xml b/src/core_atmosphere/Registry.xml index 4281c40bba..3beee6f179 100644 --- a/src/core_atmosphere/Registry.xml +++ b/src/core_atmosphere/Registry.xml @@ -406,6 +406,7 @@ + @@ -471,6 +472,7 @@ + @@ -1434,10 +1436,13 @@ - - + + + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in;cu_ntiedtke_in;mp_kessler_in;mp_thompson_in;mp_thompson_aers_in;mp_wsm6_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in;cu_ntiedtke_in;mp_thompson_in;mp_thompson_aers_in;mp_wsm6_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in;cu_ntiedtke_in;mp_kessler_in;mp_thompson_in;mp_thompson_aers_in;mp_wsm6_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in;cu_ntiedtke_in;mp_thompson_in;mp_thompson_aers_in;mp_wsm6_in"/> + + + + + + + possible_values="`suite',`bl_ysu',`bl_shinhong',`bl_mynn',`off'"/> + possible_values="`suite',`bl_kim_gwdo',`bl_ugwp_gwdo',`off'"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + - + + + + + packages="bl_ysu_in;bl_shinhong_in"/> + packages="bl_ysu_in;bl_shinhong_in"/> + packages="bl_ysu_in;bl_shinhong_in"/> @@ -2701,10 +2729,6 @@ description="liquid water - liquid water potential temperature covariance" packages="bl_mynn_in"/> - - @@ -2721,10 +2745,6 @@ description="liquid water potential temperature variance" packages="bl_mynn_in"/> - - @@ -2792,121 +2812,121 @@ + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_ysu_in;bl_shinhong_in"/> + packages="bl_ysu_in;bl_shinhong_in"/> @@ -2928,19 +2948,19 @@ - - - - - @@ -3549,27 +3569,27 @@ + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> + packages="bl_mynn_in;bl_ysu_in;bl_shinhong_in"/> - @@ -3893,7 +3913,7 @@ units="kg kg^{-1}" description="Rain water mixing ratio increment"/> - diff --git a/src/core_atmosphere/mpas_atm_core.F b/src/core_atmosphere/mpas_atm_core.F index f7d04a1f0c..7cfd10b1bf 100644 --- a/src/core_atmosphere/mpas_atm_core.F +++ b/src/core_atmosphere/mpas_atm_core.F @@ -372,6 +372,7 @@ subroutine atm_mpas_init_block(dminfo, stream_manager, block, mesh, dt) use mpas_vector_reconstruction use mpas_stream_manager use mpas_atm_boundaries, only : mpas_atm_setup_bdy_masks + use mpas_constants, only : omega #ifdef DO_PHYSICS ! use mpas_atmphys_aquaplanet use mpas_atmphys_control @@ -405,6 +406,7 @@ subroutine atm_mpas_init_block(dminfo, stream_manager, block, mesh, dt) real (kind=RKIND), dimension(:), pointer :: dvEdge, invDvEdge real (kind=RKIND), dimension(:), pointer :: dcEdge, invDcEdge real (kind=RKIND), dimension(:), pointer :: areaTriangle, invAreaTriangle + real (kind=RKIND), dimension(:), pointer :: fcell, latcell integer, pointer :: nCells_ptr, nEdges_ptr, nVertices_ptr, nVertLevels_ptr, nEdgesSolve integer :: nCells, nEdges, nVertices, nVertLevels integer :: thread @@ -444,6 +446,8 @@ subroutine atm_mpas_init_block(dminfo, stream_manager, block, mesh, dt) call mpas_pool_get_array(mesh, 'areaTriangle', areaTriangle) call mpas_pool_get_array(mesh, 'invAreaTriangle', invAreaTriangle) + call mpas_pool_get_array(mesh, 'fCell', fcell) + call mpas_pool_get_array(mesh, 'latCell', latcell) call mpas_pool_get_dimension(mesh, 'nCells', nCells_ptr) call mpas_pool_get_dimension(mesh, 'nEdges', nEdges_ptr) @@ -469,6 +473,10 @@ subroutine atm_mpas_init_block(dminfo, stream_manager, block, mesh, dt) invAreaTriangle(iVertex) = 1.0_RKIND / areaTriangle(iVertex) end do + do iCell=1,nCells + fcell(iCell) = 2. * omega * sin(latcell(iCell)) + end do + !!!!! End compute inverses !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! diff --git a/src/core_atmosphere/physics/mpas_atmphys_control.F b/src/core_atmosphere/physics/mpas_atmphys_control.F index b3162019e5..80d744fbea 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_control.F +++ b/src/core_atmosphere/physics/mpas_atmphys_control.F @@ -83,6 +83,8 @@ module mpas_atmphys_control ! * in the mesoscale_reference suite, replaced the MM5 surface layer scheme with the MM5 revised surface layer ! scheme as the default option for config_sfclayer_scheme. ! Laura D. Fowler (laura@ucar.edu) / 2024-06-18. +! * added the option bl_shinhong +! Songyou Hong (hong@ucar.edu) / 2025-11-27. contains @@ -133,8 +135,8 @@ subroutine physics_namelist_check(configs) if (trim(config_microp_scheme) == 'suite') config_microp_scheme = 'mp_wsm6' if (trim(config_convection_scheme) == 'suite') config_convection_scheme = 'cu_ntiedtke' if (trim(config_pbl_scheme) == 'suite') config_pbl_scheme = 'bl_ysu' - if (trim(config_gwdo_scheme) == 'suite') config_gwdo_scheme = 'bl_ysu_gwdo' if (trim(config_radt_lw_scheme) == 'suite') config_radt_lw_scheme = 'rrtmg_lw' + if (trim(config_gwdo_scheme) == 'suite') config_gwdo_scheme = 'bl_ysu_gwdo' if (trim(config_radt_sw_scheme) == 'suite') config_radt_sw_scheme = 'rrtmg_sw' if (trim(config_radt_cld_scheme) == 'suite') config_radt_cld_scheme = 'cld_fraction' if (trim(config_sfclayer_scheme) == 'suite') config_sfclayer_scheme = 'sf_monin_obukhov_rev' @@ -201,6 +203,7 @@ subroutine physics_namelist_check(configs) !pbl scheme: if(.not. (config_pbl_scheme .eq. 'off' .or. & config_pbl_scheme .eq. 'bl_mynn' .or. & + config_pbl_scheme .eq. 'bl_shinhong' .or. & config_pbl_scheme .eq. 'bl_ysu')) then write(mpas_err_message,'(A,A20)') 'illegal value for pbl_scheme: ', & @@ -279,10 +282,10 @@ subroutine physics_namelist_check(configs) else if(config_pbl_scheme == 'bl_mynn') then config_sfclayer_scheme = 'sf_mynn' - elseif(config_pbl_scheme == 'bl_ysu') then + elseif(config_pbl_scheme == 'bl_shinhong' .or. config_pbl_scheme == 'bl_ysu') then if(config_sfclayer_scheme /= 'sf_monin_obukhov' .and. & config_sfclayer_scheme /= 'sf_monin_obukhov_rev') then - write(mpas_err_message,'(A,A20)') 'wrong choice for surface layer scheme with YSU PBL: ', & + write(mpas_err_message,'(A,A20)') 'wrong choice for surface layer scheme with SHINHONG/YSU PBL: ', & trim(config_sfclayer_scheme) call physics_error_fatal(mpas_err_message) endif diff --git a/src/core_atmosphere/physics/mpas_atmphys_driver_pbl.F b/src/core_atmosphere/physics/mpas_atmphys_driver_pbl.F index 72a411aeba..c73c70eb2b 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_driver_pbl.F +++ b/src/core_atmosphere/physics/mpas_atmphys_driver_pbl.F @@ -16,6 +16,7 @@ module mpas_atmphys_driver_pbl use bl_mynn,only: bl_mynn_init use module_bl_mynn,only: mynn_bl_driver + use module_bl_shinhong use module_bl_ysu implicit none @@ -39,6 +40,7 @@ module mpas_atmphys_driver_pbl ! ! WRF physics called from driver_pbl: ! ----------------------------------- +! * module_bl_shinhong : SHINHONG PBL scheme. ! * module_bl_ysu : YSU PBL scheme. ! ! add-ons and modifications to sourcecode: @@ -78,6 +80,8 @@ module mpas_atmphys_driver_pbl ! Laura D. Fowler (laura@ucar.edu) / 2024-02-14. ! * updated the MYNN PBL scheme to the sourcecode from WRF version 4.6. ! Laura D. Fowler (laura@ucar.edu) / 2024-02.15. +! * added the option SHINHONG PBL scheme, incorporating revisions and additions from WRF version 4.7 +! Songyou Hong (hong@ucar.edu) / 2025-11.27. contains @@ -102,6 +106,7 @@ subroutine allocate_pbl(configs) if(.not.allocated(ust_p) ) allocate(ust_p(ims:ime,jms:jme) ) if(.not.allocated(wspd_p) ) allocate(wspd_p(ims:ime,jms:jme) ) if(.not.allocated(xland_p)) allocate(xland_p(ims:ime,jms:jme)) + if(.not.allocated(fcell_p)) allocate(fcell_p(ims:ime,jms:jme)) if(.not.allocated(hpbl_p) ) allocate(hpbl_p(ims:ime,jms:jme) ) if(.not.allocated(kpbl_p) ) allocate(kpbl_p(ims:ime,jms:jme) ) if(.not.allocated(znt_p) ) allocate(znt_p(ims:ime,jms:jme) ) @@ -125,6 +130,21 @@ subroutine allocate_pbl(configs) pbl_select: select case (trim(pbl_scheme)) + case("bl_shinhong") + !from surface-layer model: + if(.not.allocated(br_p) ) allocate(br_p(ims:ime,jms:jme) ) + if(.not.allocated(dx_p) ) allocate(dx_p(ims:ime,jms:jme) ) + if(.not.allocated(ctopo_p) ) allocate(ctopo_p(ims:ime,jms:jme) ) + if(.not.allocated(ctopo2_p)) allocate(ctopo2_p(ims:ime,jms:jme) ) + if(.not.allocated(delta_p) ) allocate(delta_p(ims:ime,jms:jme) ) + if(.not.allocated(psih_p) ) allocate(psih_p(ims:ime,jms:jme) ) + if(.not.allocated(psim_p) ) allocate(psim_p(ims:ime,jms:jme) ) + if(.not.allocated(u10_p) ) allocate(u10_p(ims:ime,jms:jme) ) + if(.not.allocated(v10_p) ) allocate(v10_p(ims:ime,jms:jme) ) + if(.not.allocated(exch_p) ) allocate(exch_p(ims:ime,kms:kme,jms:jme)) + if(.not.allocated(wstar_p) ) allocate(wstar_p(ims:ime,jms:jme) ) + if(.not.allocated(elpbl_p) ) allocate(elpbl_p(ims:ime,kms:kme,jms:jme) ) + if(.not.allocated(tkepbl_p) ) allocate(tkepbl_p(ims:ime,kms:kme,jms:jme) ) case("bl_ysu") !from surface-layer model: if(.not.allocated(br_p) ) allocate(br_p(ims:ime,jms:jme) ) @@ -211,6 +231,7 @@ subroutine deallocate_pbl(configs) if(allocated(ust_p) ) deallocate(ust_p ) if(allocated(wspd_p) ) deallocate(wspd_p ) if(allocated(xland_p)) deallocate(xland_p) + if(allocated(fcell_p)) deallocate(fcell_p) if(allocated(hpbl_p) ) deallocate(hpbl_p ) if(allocated(kpbl_p) ) deallocate(kpbl_p ) if(allocated(znt_p) ) deallocate(znt_p ) @@ -234,6 +255,21 @@ subroutine deallocate_pbl(configs) pbl_select: select case (trim(pbl_scheme)) + case("bl_shinhong") + !from surface-layer model: + if(allocated(br_p) ) deallocate(br_p ) + if(allocated(dx_p) ) deallocate(dx_p ) + if(allocated(ctopo_p) ) deallocate(ctopo_p ) + if(allocated(ctopo2_p)) deallocate(ctopo2_p) + if(allocated(delta_p) ) deallocate(delta_p ) + if(allocated(psih_p) ) deallocate(psih_p ) + if(allocated(psim_p) ) deallocate(psim_p ) + if(allocated(u10_p) ) deallocate(u10_p ) + if(allocated(v10_p) ) deallocate(v10_p ) + if(allocated(exch_p) ) deallocate(exch_p ) + if(allocated(wstar_p) ) deallocate(wstar_p ) + if(allocated(elpbl_p) ) deallocate(elpbl_p ) + if(allocated(tkepbl_p) ) deallocate(tkepbl_p ) case("bl_ysu") !from surface-layer model: if(allocated(br_p) ) deallocate(br_p ) @@ -321,13 +357,17 @@ subroutine pbl_from_MPAS(configs,mesh,sfc_input,diag_physics,tend_physics,its,it !local pointers: character(len=StrKIND),pointer:: pbl_scheme - real(kind=RKIND),dimension(:),pointer:: hfx,hpbl,qfx,ust,wspd,xland,znt + real(kind=RKIND),dimension(:),pointer:: hfx,hpbl,qfx,ust,wspd,xland,znt,fcell real(kind=RKIND),dimension(:),pointer:: delta,wstar !local pointers for YSU scheme: logical,pointer:: config_ysu_pblmix real(kind=RKIND),dimension(:),pointer:: br,fh,fm,u10,v10 real(kind=RKIND),dimension(:,:),pointer:: rthratenlw,rthratensw +!local pointers for SHINHONG scheme: + logical,pointer:: config_shinhong_nonlocal_flux + logical,pointer:: config_shinhong_scu_mixing + logical,pointer:: config_shinhong_ke_dissipation !local pointers for MYNN scheme: real(kind=RKIND),pointer:: len_disp @@ -353,6 +393,7 @@ subroutine pbl_from_MPAS(configs,mesh,sfc_input,diag_physics,tend_physics,its,it call mpas_pool_get_array(tend_physics,'rthratensw',rthratensw) call mpas_pool_get_array(sfc_input,'xland',xland) + call mpas_pool_get_array(mesh,'fCell',fcell) do j = jts,jte do i = its,ite @@ -363,6 +404,7 @@ subroutine pbl_from_MPAS(configs,mesh,sfc_input,diag_physics,tend_physics,its,it ust_p(i,j) = ust(i) wspd_p(i,j) = wspd(i) xland_p(i,j) = xland(i) + fcell_p(i,j) = fcell(i) kpbl_p(i,j) = 1 znt_p(i,j) = znt(i) !... ocean currents are set to zero: @@ -378,6 +420,56 @@ subroutine pbl_from_MPAS(configs,mesh,sfc_input,diag_physics,tend_physics,its,it pbl_select: select case (trim(pbl_scheme)) + case("bl_shinhong") + call mpas_pool_get_config(configs,'config_shinhong_nonlocal_flux',config_shinhong_nonlocal_flux) + call mpas_pool_get_config(configs,'config_shinhong_scu_mixing',config_shinhong_scu_mixing) + call mpas_pool_get_config(configs,'config_shinhong_ke_dissipation',config_shinhong_ke_dissipation) + call mpas_pool_get_config(configs,'config_len_disp',len_disp) + + call mpas_pool_get_array(mesh,'meshDensity',meshDensity) + call mpas_pool_get_array(diag_physics,'br' ,br ) + call mpas_pool_get_array(diag_physics,'delta',delta) + call mpas_pool_get_array(diag_physics,'fm' ,fm ) + call mpas_pool_get_array(diag_physics,'fh' ,fh ) + call mpas_pool_get_array(diag_physics,'u10' ,u10 ) + call mpas_pool_get_array(diag_physics,'v10' ,v10 ) + call mpas_pool_get_array(diag_physics,'wstar',wstar) + + call mpas_pool_get_array(diag_physics,'el_pbl' ,el_pbl ) + call mpas_pool_get_array(diag_physics,'tke_pbl' ,tke_pbl ) + + do j = jts,jte + do i = its,ite + dx_p(i,j) = len_disp / meshDensity(i)**0.25 + enddo + enddo + + do j = jts,jte + do i = its,ite + !from surface-layer model: + br_p(i,j) = br(i) + psim_p(i,j) = fm(i) + psih_p(i,j) = fh(i) + u10_p(i,j) = u10(i) + v10_p(i,j) = v10(i) + delta_p(i,j) = delta(i) + wstar_p(i,j) = wstar(i) + !initialization for YSU/SHINHONG PBL scheme: + ctopo_p(i,j) = 1._RKIND + ctopo2_p(i,j) = 1._RKIND + enddo + enddo + + do j = jts,jte + do k = kts,kte + do i = its,ite + exch_p(i,k,j) = 0._RKIND + tkepbl_p(i,k,j) = tke_pbl(k,i) + elpbl_p(i,k,j) = el_pbl(k,i) + enddo + enddo + enddo + case("bl_ysu") call mpas_pool_get_config(configs,'config_ysu_pblmix',config_ysu_pblmix) @@ -608,6 +700,27 @@ subroutine pbl_to_MPAS(configs,diag_physics,tend_physics,its,ite) pbl_select: select case (trim(pbl_scheme)) + case("bl_shinhong") + call mpas_pool_get_array(diag_physics,'delta',delta ) + call mpas_pool_get_array(diag_physics,'wstar' ,wstar ) + call mpas_pool_get_array(diag_physics,'exch_h',exch_h) + call mpas_pool_get_array(diag_physics,'tke_pbl',tke_pbl) + call mpas_pool_get_array(diag_physics,'el_pbl',el_pbl) + + do j = jts,jte + do i = its,ite + delta(i) = delta_p(i,j) + wstar(i) = wstar_p(i,j) + enddo + do k = kts,kte + do i = its,ite + exch_h(k,i) = exch_p(i,k,j) + tke_pbl(k,i) = tkepbl_p(i,k,j) + el_pbl(k,i) = elpbl_p(i,k,j) + enddo + enddo + enddo + case("bl_ysu") call mpas_pool_get_array(diag_physics,'delta',delta ) call mpas_pool_get_array(diag_physics,'wstar' ,wstar ) @@ -774,6 +887,10 @@ subroutine driver_pbl(itimestep,configs,mesh,sfc_input,diag_physics,tend_physics config_do_restart, & bl_mynn_tkeadvect + logical,pointer:: config_shinhong_nonlocal_flux, & + config_shinhong_scu_mixing, & + config_shinhong_ke_dissipation + character(len=StrKIND),pointer:: pbl_scheme integer,pointer:: bl_mynn_cloudpdf, & @@ -822,6 +939,43 @@ subroutine driver_pbl(itimestep,configs,mesh,sfc_input,diag_physics,tend_physics pbl_select: select case (trim(pbl_scheme)) + case("bl_shinhong") + call mpas_timer_start('bl_shinhong') + call mpas_pool_get_config(configs,'config_shinhong_nonlocal_flux',config_shinhong_nonlocal_flux) + call mpas_pool_get_config(configs,'config_shinhong_scu_mixing',config_shinhong_scu_mixing) + call mpas_pool_get_config(configs,'config_shinhong_ke_dissipation',config_shinhong_ke_dissipation) + + call shinhong ( & + p3d = pres_hyd_p , p3di = pres2_hyd_p , psfc = psfc_p , & + t3d = t_p , dz8w = dz_p , pi3d = pi_p , & + u3d = u_p , v3d = v_p , qv3d = qv_p , & + qc3d = qc_p , qi3d = qi_p , rublten = rublten_p , & + rvblten = rvblten_p , rthblten = rthblten_p , rqvblten = rqvblten_p , & + rqcblten = rqcblten_p , rqiblten = rqiblten_p , flag_qc = f_qc , & + flag_qi = f_qi , cp = cp , g = gravity , & + rovcp = rcp , rd = R_d , rovg = rdg , & + ep1 = ep_1 , ep2 = ep_2 , karman = karman , & + xlv = xlv , rv = R_v , znt = znt_p , & + ust = ust_p , hpbl = hpbl_p , psim = psim_p , & + psih = psih_p , xland = xland_p , hfx = hfx_p , & + qfx = qfx_p , wspd = wspd_p , br = br_p , & + dt = dt_pbl , kpbl2d = kpbl_p , exch_h = kzh_p , & + exch_m = kzm_p , wstar = wstar_p , delta = delta_p , & + shinhong_nonlocal_flux = config_shinhong_nonlocal_flux , & + shinhong_dissi_heating = config_shinhong_ke_dissipation , & + shinhong_scu_mixing = config_shinhong_scu_mixing , & + tke = tkepbl_p , el= elpbl_p , corf=fcell_p , & + uoce = uoce_p , voce = voce_p , rthraten = rthraten_p , & + u10 = u10_p , v10 = v10_p , ctopo = ctopo_p , & + ctopo2 = ctopo2_p , flag_bep = flag_bep , idiff = idiff , & + dx = dx_p , & + errmsg = errmsg , errflg = errflg , & + ids = ids , ide = ide , jds = jds , jde = jde , kds = kds , kde = kde , & + ims = ims , ime = ime , jms = jms , jme = jme , kms = kms , kme = kme , & + its = its , ite = ite , jts = jts , jte = jte , kts = kts , kte = kte & + ) + call mpas_timer_stop('bl_shinhong') + case("bl_ysu") call mpas_timer_start('bl_ysu') call ysu ( & diff --git a/src/core_atmosphere/physics/mpas_atmphys_packages.F b/src/core_atmosphere/physics/mpas_atmphys_packages.F index 5d32cb297e..9fe858d96e 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_packages.F +++ b/src/core_atmosphere/physics/mpas_atmphys_packages.F @@ -39,7 +39,7 @@ function atmphys_setup_packages(configs,packages,iocontext) result(ierr) character(len=StrKIND),pointer:: config_lsm_scheme logical,pointer:: mp_kessler_in,mp_thompson_in,mp_thompson_aers_in,mp_wsm6_in logical,pointer:: cu_grell_freitas_in,cu_kain_fritsch_in,cu_ntiedtke_in - logical,pointer:: bl_mynn_in,bl_ysu_in + logical,pointer:: bl_mynn_in,bl_ysu_in,bl_shinhong_in logical,pointer:: sf_noahmp_in integer :: ierr @@ -150,8 +150,11 @@ function atmphys_setup_packages(configs,packages,iocontext) result(ierr) nullify(bl_ysu_in) call mpas_pool_get_package(packages,'bl_ysu_inActive',bl_ysu_in) + nullify(bl_shinhong_in) + call mpas_pool_get_package(packages,'bl_shinhong_inActive',bl_shinhong_in) + if(.not.associated(bl_mynn_in) .or. & - .not.associated(bl_ysu_in)) then + .not.associated(bl_ysu_in) .or. .not.associated(bl_shinhong_in) ) then call mpas_log_write('====================================================================================',messageType=MPAS_LOG_ERR) call mpas_log_write('* Error while setting up packages for planetary layer options in atmosphere core.', messageType=MPAS_LOG_ERR) call mpas_log_write('====================================================================================',messageType=MPAS_LOG_ERR) @@ -161,15 +164,19 @@ function atmphys_setup_packages(configs,packages,iocontext) result(ierr) bl_mynn_in = .false. bl_ysu_in = .false. + bl_shinhong_in = .false. if(config_pbl_scheme=='bl_mynn') then bl_mynn_in = .true. elseif(config_pbl_scheme == 'bl_ysu') then bl_ysu_in = .true. + elseif(config_pbl_scheme == 'bl_shinhong') then + bl_shinhong_in = .true. endif call mpas_log_write(' bl_mynn_in = $l', logicArgs=(/bl_mynn_in/)) call mpas_log_write(' bl_ysu_in = $l', logicArgs=(/bl_ysu_in/)) + call mpas_log_write(' bl_shinhong_in = $l', logicArgs=(/bl_shinhong_in/)) call mpas_log_write('') !--- initialization of all packages for parameterizations of land surface processes: diff --git a/src/core_atmosphere/physics/mpas_atmphys_vars.F b/src/core_atmosphere/physics/mpas_atmphys_vars.F index 134009f537..74c5672b37 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_vars.F +++ b/src/core_atmosphere/physics/mpas_atmphys_vars.F @@ -374,11 +374,11 @@ module mpas_atmphys_vars !================================================================================================================= logical,parameter:: & - flag_bep = .false. !flag to use BEP/BEP+BEM for use in the YSU PBL scheme (with urban physics). since we do + flag_bep = .false. !flag to use BEP/BEP+BEM for use in the SHINHONG/YSU PBL scheme (with urban physics). since we do !not run urban physics, flag_bep is always set to false. integer,parameter:: & - idiff = 0 !BEP/BEM+BEM diffusion flag for use in the YSU PBL scheme (with urban physics). since we + idiff = 0 !BEP/BEM+BEM diffusion flag for use in the SHINHONG/YSU PBL scheme (with urban physics). since we !do not run urban physics, idiff is set to zero. integer:: ysu_pblmix @@ -394,6 +394,7 @@ module mpas_atmphys_vars hpbl_p, &!PBL height [m] delta_p, &! wstar_p, &! + fcell_p, &! uoce_p, &! voce_p ! @@ -469,8 +470,8 @@ module mpas_atmphys_vars sina_p !sine of map rotation [-] real(kind=RKIND),dimension(:,:),allocatable:: & - var2d_p, &!orographic variance [m2] - con_p, &!orographic convexity [m2] + var2d_p, &!orographic variance (indeed standard deviation) [m] + con_p, &!orographic convexity [-] oa1_p, &!orographic direction asymmetry function [-] oa2_p, &!orographic direction asymmetry function [-] oa3_p, &!orographic direction asymmetry function [-] diff --git a/src/core_atmosphere/physics/physics_wrf/Makefile b/src/core_atmosphere/physics/physics_wrf/Makefile index 4495b74960..3058e079b3 100644 --- a/src/core_atmosphere/physics/physics_wrf/Makefile +++ b/src/core_atmosphere/physics/physics_wrf/Makefile @@ -14,6 +14,7 @@ OBJS = \ module_bl_ugwp_gwdo.o \ module_bl_mynn.o \ module_bl_ysu.o \ + module_bl_shinhong.o \ module_cam_error_function.o \ module_cam_shr_kind_mod.o \ module_cam_support.o \ diff --git a/src/core_atmosphere/physics/physics_wrf/module_bl_shinhong.F b/src/core_atmosphere/physics/physics_wrf/module_bl_shinhong.F new file mode 100644 index 0000000000..dbfe5f01f2 --- /dev/null +++ b/src/core_atmosphere/physics/physics_wrf/module_bl_shinhong.F @@ -0,0 +1,499 @@ +#define NEED_B4B_DURING_CCPP_TESTING 1 +!================================================================================================================= + module module_bl_shinhong + use mpas_kind_types,only: kind_phys => RKIND + use bl_shinhong + + + implicit none + private + public:: shinhong + + + contains + + +!================================================================================================================= + subroutine shinhong(u3d,v3d,t3d,qv3d,qc3d,qi3d,p3d,p3di,pi3d, & + rublten,rvblten,rthblten, & + rqvblten,rqcblten,rqiblten,flag_qc,flag_qi, & + cp,g,rovcp,rd,rovg,ep1,ep2,karman,xlv,rv, & + dz8w,psfc, & + znt,ust,hpbl,psim,psih, & + xland,hfx,qfx,wspd,br, & + dt,kpbl2d, & + exch_h,exch_m, & + wstar,delta, & + shinhong_nonlocal_flux, & + tke,el,corf, & + u10,v10, & + uoce,voce, & + rthraten,shinhong_scu_mixing, & + shinhong_dissi_heating, & + ctopo,ctopo2,dx, & + idiff,flag_bep,frc_urb2d, & + a_u_bep,a_v_bep,a_t_bep, & + a_q_bep, & + a_e_bep,b_u_bep,b_v_bep, & + b_t_bep,b_q_bep, & + b_e_bep,dlg_bep, & + dl_u_bep,sf_bep,vl_bep, & + ids,ide, jds,jde, kds,kde, & + ims,ime, jms,jme, kms,kme, & + its,ite, jts,jte, kts,kte, & + errmsg,errflg & + ) +!------------------------------------------------------------------------------- + implicit none +!------------------------------------------------------------------------------- +!-- u3d 3d u-velocity interpolated to theta points (m/s) +!-- v3d 3d v-velocity interpolated to theta points (m/s) +!-- th3d 3d potential temperature (k) +!-- t3d temperature (k) +!-- qv3d 3d water vapor mixing ratio (kg/kg) +!-- qc3d 3d cloud mixing ratio (kg/kg) +!-- qi3d 3d ice mixing ratio (kg/kg) +! (note: if P_QI