Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cam6_3_132: Changes to capture changes made in run 51 #900

Merged
merged 14 commits into from
Oct 18, 2023
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion bld/build-namelist
Original file line number Diff line number Diff line change
Expand Up @@ -3115,7 +3115,7 @@ if ($cfg->get('microphys') =~ /^mg/) {
$micro_mg_dcs = '500.D-6'; # default for cam6
}
elsif ($phys eq 'cam_dev') {
$micro_mg_dcs = '250.D-6'; # default for cam_dev
$micro_mg_dcs = '500.D-6'; # default for cam_dev
}
}

Expand All @@ -3129,6 +3129,7 @@ add_default($nl, 'microp_aero_npccn_scale');
add_default($nl, 'microp_aero_wsub_scale');
add_default($nl, 'microp_aero_wsubi_scale');
add_default($nl, 'microp_aero_wsub_min');
add_default($nl, 'microp_aero_wsub_min_asf');
add_default($nl, 'microp_aero_wsubi_min');

# Ice nucleation options
Expand Down Expand Up @@ -3460,7 +3461,10 @@ if (!$simple_phys) {
add_default($nl, 'cldfrc2m_rhmaxi');
add_default($nl, 'cldfrc2m_rhminis');
add_default($nl, 'cldfrc2m_rhmaxis');
add_default($nl, 'cldfrc2m_qist_min');
add_default($nl, 'cldfrc2m_qist_max');
add_default($nl, 'cldfrc2m_do_subgrid_growth');
add_default($nl, 'cldfrc2m_do_avg_aist_algs');
}

my $rk_strat_polstrat_rhmin = $nl->get_value('rk_strat_polstrat_rhmin');
Expand Down
17 changes: 14 additions & 3 deletions bld/namelist_files/namelist_defaults_cam.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2065,9 +2065,10 @@
<clubb_do_energyfix > .true. </clubb_do_energyfix>
<clubb_do_liqsupersat > .false. </clubb_do_liqsupersat>
<clubb_gamma_coef > 0.308 </clubb_gamma_coef>
<clubb_gamma_coef phys="cam_dev" > 0.3 </clubb_gamma_coef>
<clubb_gamma_coef hgrid="1.9x2.5" phys="cam6" > 0.280 </clubb_gamma_coef>
<clubb_gamma_coef dyn="se" > 0.270 </clubb_gamma_coef>
<clubb_gamma_coefb > 0.32 </clubb_gamma_coefb>
<clubb_gamma_coefb phys="cam_dev" > 0.3 </clubb_gamma_coefb>
<clubb_ipdf_call_placement > 2 </clubb_ipdf_call_placement>
<clubb_lambda0_stability_coef > 0.04 </clubb_lambda0_stability_coef>
<clubb_lmin_coef > 0.1 </clubb_lmin_coef>
Expand Down Expand Up @@ -2226,19 +2227,22 @@
<microp_aero_npccn_scale microphys="mg2" > 1.D0 </microp_aero_npccn_scale>

<microp_aero_wsub_scale > 1.D0 </microp_aero_wsub_scale>
<microp_aero_wsub_scale phys="cam_dev" > 0.50D0 </microp_aero_wsub_scale>

<microp_aero_wsubi_scale > 1.D0 </microp_aero_wsubi_scale>
<microp_aero_wsubi_scale phys="cam_dev" > 2.5D0 </microp_aero_wsubi_scale>

<microp_aero_wsub_min > 0.2D0 </microp_aero_wsub_min>
<microp_aero_wsub_min phys="cam_dev" > 0.1D0 </microp_aero_wsub_min>

<microp_aero_wsub_min_asf > 0.1D0 </microp_aero_wsub_min_asf>
<microp_aero_wsub_min_asf phys="cam_dev" > 0.0D0 </microp_aero_wsub_min_asf>

<microp_aero_wsubi_min > 0.001D0 </microp_aero_wsubi_min>

<micro_mg_homog_size > 25.D-6 </micro_mg_homog_size>
<micro_mg_homog_size microphys="mg2" > 25.D-6 </micro_mg_homog_size>

<micro_mg_vtrmi_factor > 1.D0 </micro_mg_vtrmi_factor>
<micro_mg_vtrmi_factor phys="cam_dev" > 0.5D0 </micro_mg_vtrmi_factor>

<micro_mg_effi_factor > 1.D0 </micro_mg_effi_factor>
<micro_mg_effi_factor microphys="mg2" > 1.D0 </micro_mg_effi_factor>
Expand Down Expand Up @@ -2644,12 +2648,19 @@
<cldfrc2m_rhmaxis clubb_sgs="1" > 1.0D0 </cldfrc2m_rhmaxis>
<cldfrc2m_rhmaxis spcam_clubb_sgs="1" > 1.0D0 </cldfrc2m_rhmaxis>

<cldfrc2m_qist_min >1.e-7 </cldfrc2m_qist_min>
<cldfrc2m_qist_min phys="cam_dev">5.e-6 </cldfrc2m_qist_min>
<cldfrc2m_qist_max >5.e-3 </cldfrc2m_qist_max>

<micro_mg_adjust_cpt>.false.</micro_mg_adjust_cpt>

<cldfrc2m_do_subgrid_growth >.false.</cldfrc2m_do_subgrid_growth>
<cldfrc2m_do_subgrid_growth phys="cam6" >.true.</cldfrc2m_do_subgrid_growth>
<cldfrc2m_do_subgrid_growth phys="cam_dev">.true.</cldfrc2m_do_subgrid_growth>

<cldfrc2m_do_avg_aist_algs >.false.</cldfrc2m_do_avg_aist_algs>
<cldfrc2m_do_avg_aist_algs phys="cam_dev" >.true.</cldfrc2m_do_avg_aist_algs>

<!-- Cldwat -->
<rk_strat_icritc > 5.0e-6 </rk_strat_icritc>
<rk_strat_icritc dyn="fv" unicon="1" > 9.5e-6 </rk_strat_icritc>
Expand Down
30 changes: 27 additions & 3 deletions bld/namelist_files/namelist_definition.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2916,7 +2916,7 @@ Default: 1.0
<entry id="microp_aero_wsub_scale" type="real" category="microphys"
group="microp_aero_nl" valid_values="" >
Unitless scaling factor for the liquid droplet subgrid scale vertical velocity during aerosol activation.
Default: 1.0
Default: set by build-namelist
</entry>

<entry id="microp_aero_wsubi_scale" type="real" category="microphys"
Expand All @@ -2927,8 +2927,14 @@ Default: 1.0

<entry id="microp_aero_wsub_min" type="real" category="microphys"
group="microp_aero_nl" valid_values="" >
Minimum subgrid vertical velocity for liquid droplets during aerosol activation with units of (m s-1).
Default: 0.2 m s-1
Minimum subgrid vertical velocity (before scale factor) for liquid droplets during aerosol activation with units of (m s-1).
Default: set by build-namelist
</entry>

<entry id="microp_aero_wsub_min_asf" type="real" category="microphys"
group="microp_aero_nl" valid_values="" >
Minimum subgrid vertical velocity (after scale factor) for liquid droplets during aerosol activation with units of (m s-1).
Default: set by build-namelist
</entry>

<entry id="microp_aero_wsubi_min" type="real" category="microphys"
Expand Down Expand Up @@ -3146,13 +3152,31 @@ rhi at which ice cloud fraction = 1 in the stratosphere.
Default: set by build-namelist
</entry>

<entry id="cldfrc2m_qist_min" type="real" category="conv"
group="cldfrc2m_nl" valid_values="" >
Minimum in-stratus ice IWC constraint [ kg/kg ]
nusbaume marked this conversation as resolved.
Show resolved Hide resolved
Default: set by build-namelist
</entry>

<entry id="cldfrc2m_qist_max" type="real" category="conv"
group="cldfrc2m_nl" valid_values="" >
Maximum in-stratus ice IWC constraint [ kg/kg ]
nusbaume marked this conversation as resolved.
Show resolved Hide resolved
Default: set by build-namelist
</entry>

<entry id="cldfrc2m_do_subgrid_growth" type="logical" category="conv"
group="cldfrc2m_nl" valid_values="" >
Use cloud fraction to determine whether to do growth of ice clouds below
RHice of 1 down to RHice = rhmini.
Default: .true. for CAM6; all others =&gt; .false.
</entry>

<entry id="cldfrc2m_do_avg_aist_algs" type="logical" category="conv"
group="cldfrc2m_nl" valid_values="" >
For small ice cloud concentrations, take the geometric mean of the iceopt=4 and iceopt=5 area fractions
Default: .true. for CAM_DEV; all others .false.
</entry>

<entry id="zmconv_momcu" type="real" category="conv"
group="zmconv_nl" valid_values="" >
Convective momentum transport parameter (upward)
Expand Down
50 changes: 36 additions & 14 deletions src/physics/cam/cldfrc2m.F90
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,18 @@ module cldfrc2m
real(r8) :: cldfrc2m_rhmaxi
real(r8) :: cldfrc2m_rhminis ! Minimum rh for ice cloud fraction > 0 in the stratsophere.
real(r8) :: cldfrc2m_rhmaxis
real(r8) :: cldfrc2m_qist_min ! Minimum in-stratus ice IWC constraint [ kg/kg ]
real(r8) :: cldfrc2m_qist_max ! Maximum in-stratus ice IWC constraint [ kg/kg ]
nusbaume marked this conversation as resolved.
Show resolved Hide resolved
logical :: cldfrc2m_do_subgrid_growth = .false.
logical :: cldfrc2m_do_avg_aist_algs = .false.
! -------------------------- !
! Parameters for Ice Stratus !
! -------------------------- !
real(r8), protected :: rhmini_const ! Minimum rh for ice cloud fraction > 0.
real(r8), protected :: rhmaxi_const
real(r8), protected :: rhminis_const ! Minimum rh for ice cloud fraction > 0.
real(r8), protected :: rhminis_const ! Minimum rh for ice cloud fraction > 0.
real(r8), protected :: rhmaxis_const

real(r8), parameter :: qist_min = 1.e-7_r8 ! Minimum in-stratus ice IWC constraint [ kg/kg ]
real(r8), parameter :: qist_max = 5.e-3_r8 ! Maximum in-stratus ice IWC constraint [ kg/kg ]

! ----------------------------- !
! Parameters for Liquid Stratus !
! ----------------------------- !
Expand Down Expand Up @@ -82,7 +82,8 @@ subroutine cldfrc2m_readnl(nlfile)
integer :: unitn, ierr
character(len=*), parameter :: subname = 'cldfrc2m_readnl'

namelist /cldfrc2m_nl/ cldfrc2m_rhmini, cldfrc2m_rhmaxi, cldfrc2m_rhminis, cldfrc2m_rhmaxis, cldfrc2m_do_subgrid_growth
namelist /cldfrc2m_nl/ cldfrc2m_rhmini, cldfrc2m_rhmaxi, cldfrc2m_rhminis, cldfrc2m_rhmaxis, cldfrc2m_do_subgrid_growth, &
cldfrc2m_qist_min, cldfrc2m_qist_max, cldfrc2m_do_avg_aist_algs
!-----------------------------------------------------------------------------

if (masterproc) then
Expand All @@ -103,15 +104,17 @@ subroutine cldfrc2m_readnl(nlfile)
rhmaxi_const = cldfrc2m_rhmaxi
rhminis_const = cldfrc2m_rhminis
rhmaxis_const = cldfrc2m_rhmaxis

end if

! Broadcast namelist variables
call mpi_bcast(rhmini_const, 1, mpi_real8, masterprocid, mpicom, ierr)
call mpi_bcast(rhmaxi_const, 1, mpi_real8, masterprocid, mpicom, ierr)
call mpi_bcast(rhminis_const, 1, mpi_real8, masterprocid, mpicom, ierr)
call mpi_bcast(rhmaxis_const, 1, mpi_real8, masterprocid, mpicom, ierr)
call mpi_bcast(cldfrc2m_qist_min, 1, mpi_real8, masterprocid, mpicom, ierr)
call mpi_bcast(cldfrc2m_qist_max, 1, mpi_real8, masterprocid, mpicom, ierr)
call mpi_bcast(cldfrc2m_do_subgrid_growth, 1, mpi_logical,masterprocid, mpicom, ierr)
call mpi_bcast(cldfrc2m_do_avg_aist_algs, 1, mpi_logical,masterprocid, mpicom, ierr)

end subroutine cldfrc2m_readnl

Expand Down Expand Up @@ -139,6 +142,7 @@ subroutine cldfrc2m_init()
write(iulog,*) ' rhminis = ', rhminis_const
write(iulog,*) ' rhmaxis = ', rhmaxis_const
write(iulog,*) ' do_subgrid_growth = ', cldfrc2m_do_subgrid_growth
write(iulog,*) ' do_avg_aist_algs = ', cldfrc2m_do_avg_aist_algs
nusbaume marked this conversation as resolved.
Show resolved Hide resolved
end if

end subroutine cldfrc2m_init
Expand Down Expand Up @@ -879,12 +883,21 @@ subroutine aist_single(qv, T, p, qi, landfrac, snowh, aist, &
icimr=qi/aist

!minimum
if (icimr.lt.qist_min) then
aist = max(0._r8,min(1._r8,qi/qist_min))
if (icimr.lt.cldfrc2m_qist_min) then
if (cldfrc2m_do_avg_aist_algs) then
!
! Take the geometric mean of the iceopt=4 and iceopt=5 values.
! Mods developed by Thomas Toniazzo for NorESM.
aist = max(0._r8,min(1._r8,sqrt(aist*qi/cldfrc2m_qist_min)))
else
!
! Default for iceopt=5
aist = max(0._r8,min(1._r8,qi/cldfrc2m_qist_min))
end if
endif
!maximum
if (icimr.gt.qist_max) then
aist = max(0._r8,min(1._r8,qi/qist_max))
if (icimr.gt.cldfrc2m_qist_max) then
aist = max(0._r8,min(1._r8,qi/cldfrc2m_qist_max))
endif

endif
Expand Down Expand Up @@ -1131,12 +1144,21 @@ subroutine aist_vector(qv_in, T_in, p_in, qi_in, ni_in, landfrac_in, snowh_in, a
icimr=qi/aist

!minimum
if (icimr.lt.qist_min) then
aist = max(0._r8,min(1._r8,qi/qist_min))
if (icimr.lt.cldfrc2m_qist_min) then
if (cldfrc2m_do_avg_aist_algs) then
!
! Take the geometric mean of the iceopt=4 and iceopt=5 values.
! Mods developed by Thomas Toniazzo for NorESM.
aist = max(0._r8,min(1._r8,sqrt(aist*qi/cldfrc2m_qist_min)))
else
!
! Default for iceopt=5
aist = max(0._r8,min(1._r8,qi/cldfrc2m_qist_min))
end if
endif
!maximum
if (icimr.gt.qist_max) then
aist = max(0._r8,min(1._r8,qi/qist_max))
if (icimr.gt.cldfrc2m_qist_max) then
aist = max(0._r8,min(1._r8,qi/cldfrc2m_qist_max))
endif

endif
Expand Down
23 changes: 14 additions & 9 deletions src/physics/cam/microp_aero.F90
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ module microp_aero
real(r8) :: npccn_scale ! scaling for activated number
real(r8) :: wsub_scale ! scaling for sub-grid vertical velocity (liquid)
real(r8) :: wsubi_scale ! scaling for sub-grid vertical velocity (ice)
real(r8) :: wsub_min ! minimum sub-grid vertical velocity (liquid)
real(r8) :: wsub_min ! minimum sub-grid vertical velocity (liquid) before scale factor
real(r8) :: wsub_min_asf ! minimum sub-grid vertical velocity (liquid) after scale factor
real(r8) :: wsubi_min ! minimum sub-grid vertical velocity (ice)

! smallest mixing ratio considered in microphysics
Expand Down Expand Up @@ -405,20 +406,20 @@ subroutine microp_aero_readnl(nlfile)
character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input

! Namelist variables
real(r8) :: microp_aero_bulk_scale = unset_r8 ! prescribed aerosol bulk sulfur scale factor
real(r8) :: microp_aero_bulk_scale = unset_r8 ! prescribed aerosol bulk sulfur scale factor
real(r8) :: microp_aero_npccn_scale = unset_r8 ! prescribed aerosol bulk sulfur scale factor
real(r8) :: microp_aero_wsub_scale = unset_r8 ! subgrid vertical velocity (liquid) scale factor
real(r8) :: microp_aero_wsub_scale = unset_r8 ! subgrid vertical velocity (liquid) scale factor
real(r8) :: microp_aero_wsubi_scale = unset_r8 ! subgrid vertical velocity (ice) scale factor
real(r8) :: microp_aero_wsub_min = unset_r8 ! subgrid vertical velocity (liquid) minimum
real(r8) :: microp_aero_wsubi_min = unset_r8 ! subgrid vertical velocity (ice) minimum

real(r8) :: microp_aero_wsub_min = unset_r8 ! subgrid vertical velocity (liquid) minimum (before scale factor)
real(r8) :: microp_aero_wsub_min_asf = unset_r8 ! subgrid vertical velocity (liquid) minimum (after scale factor)
real(r8) :: microp_aero_wsubi_min = unset_r8 ! subgrid vertical velocity (ice) minimum

! Local variables
integer :: unitn, ierr
character(len=*), parameter :: subname = 'microp_aero_readnl'

namelist /microp_aero_nl/ microp_aero_bulk_scale, microp_aero_npccn_scale, microp_aero_wsub_min, &
microp_aero_wsubi_min, microp_aero_wsub_scale, microp_aero_wsubi_scale
microp_aero_wsubi_min, microp_aero_wsub_scale, microp_aero_wsubi_scale, microp_aero_wsub_min_asf
!-----------------------------------------------------------------------------

if (masterproc) then
Expand Down Expand Up @@ -446,6 +447,8 @@ subroutine microp_aero_readnl(nlfile)
if (ierr /= 0) call endrun(subname//": FATAL: mpi_bcast: microp_aero_wsubi_scale")
call mpi_bcast(microp_aero_wsub_min, 1, mpi_real8, mstrid, mpicom, ierr)
if (ierr /= 0) call endrun(subname//": FATAL: mpi_bcast: microp_aero_wsub_min")
call mpi_bcast(microp_aero_wsub_min_asf, 1, mpi_real8, mstrid, mpicom, ierr)
if (ierr /= 0) call endrun(subname//": FATAL: mpi_bcast: microp_aero_wsub_min_asf")
call mpi_bcast(microp_aero_wsubi_min, 1, mpi_real8, mstrid, mpicom, ierr)
if (ierr /= 0) call endrun(subname//": FATAL: mpi_bcast: microp_aero_wsubi_min")

Expand All @@ -455,13 +458,15 @@ subroutine microp_aero_readnl(nlfile)
wsub_scale = microp_aero_wsub_scale
wsubi_scale = microp_aero_wsubi_scale
wsub_min = microp_aero_wsub_min
wsub_min_asf = microp_aero_wsub_min_asf
wsubi_min = microp_aero_wsubi_min

if(bulk_scale == unset_r8) call endrun(subname//": FATAL: bulk_scale is not set")
if(npccn_scale == unset_r8) call endrun(subname//": FATAL: npccn_scale is not set")
if(wsub_scale == unset_r8) call endrun(subname//": FATAL: wsub_scale is not set")
if(wsubi_scale == unset_r8) call endrun(subname//": FATAL: wsubi_scale is not set")
if(wsub_min == unset_r8) call endrun(subname//": FATAL: wsub_min is not set")
if(wsub_min_asf == unset_r8) call endrun(subname//": FATAL: wsub_min_asf is not set")
if(wsubi_min == unset_r8) call endrun(subname//": FATAL: wsubi_min is not set")

call nucleate_ice_cam_readnl(nlfile)
Expand Down Expand Up @@ -728,12 +733,12 @@ subroutine microp_aero_run ( &
! liquid clouds. This is the same behavior as CAM5.
if (use_preexisting_ice) then
call dropmixnuc( aero_props_obj, aero_state1_obj, &
state1, ptend_loc, deltatin, pbuf, wsub, &
state1, ptend_loc, deltatin, pbuf, wsub, wsub_min_asf, &
cldn, cldo, cldliqf, nctend_mixnuc, factnum)
else
cldliqf = 1._r8
call dropmixnuc( aero_props_obj, aero_state1_obj, &
state1, ptend_loc, deltatin, pbuf, wsub, &
state1, ptend_loc, deltatin, pbuf, wsub, wsub_min_asf, &
lcldn, lcldo, cldliqf, nctend_mixnuc, factnum)
end if

Expand Down
5 changes: 2 additions & 3 deletions src/physics/cam/ndrop.F90
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ end subroutine ndrop_init
!===============================================================================

subroutine dropmixnuc( aero_props, aero_state, &
state, ptend, dtmicro, pbuf, wsub, &
state, ptend, dtmicro, pbuf, wsub, wmixmin, &
cldn, cldo, cldliqf, tendnd, factnum, from_spcam)

! vertical diffusion and nucleation of cloud droplets
Expand All @@ -183,6 +183,7 @@ subroutine dropmixnuc( aero_props, aero_state, &
type(physics_state), target, intent(in) :: state
type(physics_ptend), intent(out) :: ptend
real(r8), intent(in) :: dtmicro ! time step for microphysics (s)
real(r8), intent(in) :: wmixmin ! minimum turbulence vertical velocity (m/s)

type(physics_buffer_desc), pointer :: pbuf(:)

Expand Down Expand Up @@ -221,9 +222,7 @@ subroutine dropmixnuc( aero_props, aero_state, &
real(r8) :: raertend(pver) ! tendency of aerosol mass, number mixing ratios
real(r8) :: qqcwtend(pver) ! tendency of cloudborne aerosol mass, number mixing ratios


real(r8), parameter :: zkmin = 0.01_r8, zkmax = 100._r8
real(r8), parameter :: wmixmin = 0.1_r8 ! minimum turbulence vertical velocity (m/s)
integer :: i, k, l, m, mm, n
integer :: km1, kp1
integer :: nnew, nsav, ntemp
Expand Down