diff --git a/bld/build-namelist b/bld/build-namelist
index 90bd503820..a66c50a8f9 100755
--- a/bld/build-namelist
+++ b/bld/build-namelist
@@ -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
}
}
@@ -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
@@ -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');
diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml
index fc74b3e978..44d91006ca 100644
--- a/bld/namelist_files/namelist_defaults_cam.xml
+++ b/bld/namelist_files/namelist_defaults_cam.xml
@@ -2065,9 +2065,10 @@
.true.
.false.
0.308
+ 0.3
0.280
- 0.270
0.32
+ 0.3
2
0.04
0.1
@@ -2225,12 +2226,16 @@
1.D0
1.D0
- 1.D0
+ 1.D0
+ 0.375D0
1.D0
- 2.5D0
0.2D0
+ 0.1D0
+
+ 0.1D0
+ 0.0D0
0.001D0
@@ -2238,7 +2243,6 @@
25.D-6
1.D0
- 0.5D0
1.D0
1.D0
@@ -2644,12 +2648,19 @@
1.0D0
1.0D0
+1.e-7
+5.e-6
+5.e-3
+
.false.
.false.
.true.
.true.
+.false.
+.true.
+
5.0e-6
9.5e-6
diff --git a/bld/namelist_files/namelist_definition.xml b/bld/namelist_files/namelist_definition.xml
index a64571989a..cea91f7528 100644
--- a/bld/namelist_files/namelist_definition.xml
+++ b/bld/namelist_files/namelist_definition.xml
@@ -2916,7 +2916,7 @@ Default: 1.0
Unitless scaling factor for the liquid droplet subgrid scale vertical velocity during aerosol activation.
-Default: 1.0
+Default: set by build-namelist
-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
+
+
+
+Minimum subgrid vertical velocity (after scale factor) for liquid droplets during aerosol activation with units of (m s-1).
+Default: set by build-namelist
+
+Minimum in-stratus IWC constraint [ kg/kg ]
+Default: set by build-namelist
+
+
+
+Maximum in-stratus IWC constraint [ kg/kg ]
+Default: set by build-namelist
+
+
Use cloud fraction to determine whether to do growth of ice clouds below
@@ -3153,6 +3171,12 @@ RHice of 1 down to RHice = rhmini.
Default: .true. for CAM6; all others => .false.
+
+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.
+
+
Convective momentum transport parameter (upward)
diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml
index c7b7d00daf..854ad1ac5a 100644
--- a/cime_config/testdefs/testlist_cam.xml
+++ b/cime_config/testdefs/testlist_cam.xml
@@ -1690,7 +1690,7 @@
-
+
@@ -1700,7 +1700,7 @@
-
+
@@ -1709,7 +1709,7 @@
-
+
@@ -1718,7 +1718,7 @@
-
+
@@ -1860,7 +1860,7 @@
-
+
@@ -1870,7 +1870,7 @@
-
+
@@ -2156,7 +2156,7 @@
-
+
diff --git a/doc/ChangeLog b/doc/ChangeLog
index c8ef2edaee..f21676fe92 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,121 @@
+===============================================================
+
+Tag name:cam6_3_132
+Originator(s): cacraig, adamher, Thomas Toniazzo, hannay
+Date: Oct 18, 2023
+One-line Summary: Bring in changes to match run 51
+Github PR URL: https://github.com/ESCOMP/CAM/pull/900
+
+Purpose of changes (include the issue number and title text for each relevant GitHub issue):
+ - Update cam_development to match current tuning runs: https://github.com/ESCOMP/CAM/issues/895
+ - Discussion also occurred at: https://github.com/NCAR/amwg_dev/discussions/412
+
+Describe any changes made to build system: N/A
+
+Describe any changes made to the namelist:
+ - When running cam_dev, change the values for:
+ micro_mg_dcs
+ clubb_gamma_coef
+ clubb_gamma_coefb
+ microp_aero_wsub_scale
+ microp_aero_wsubi_scale
+ microp_aero_wsub_min
+ micro_mg_vtrmi_factor
+
+ - New namelists implemented:
+ microp_aero_wsub_min_asf: min subgrid vertical velocity (after scale factor) See namelist definition for full description
+ cldfrc2m_do_avg_aist_algs: for small ice cloud concentrations, take the geometric mean of the iceopt=4 and 5 area fractions
+ cldfrc2m_qist_min: min in-stratus ice IWC constraint
+ cldfrc2m_qist_max: max in-stratus ice IWC constraint
+
+List any changes to the defaults for the boundary datasets: N/A
+
+Describe any substantial timing or memory changes: N/A
+
+Code reviewed by: nusbaume, pel, adamrher
+
+List all files eliminated: N/A
+
+List all files added and what they do: N/A
+
+List all existing files that have been modified, and describe the changes:
+M bld/build-namelist
+M bld/namelist_files/namelist_defaults_cam.xml
+M src/physics/cam/cldfrc2m.F90
+M src/physics/cam/microp_aero.F90
+M src/physics/cam/ndrop.F90
+M src/physics/spcam/crmclouds_camaerosols.F90
+ - Change namelist as discussed in the issue/PR and group discussion
+
+M bld/namelist_files/namelist_definition.xml
+ - Update descriptions and add new ones
+
+M cime_config/testdefs/testlist_cam.xml
+ - Change a few tests to have them work on derecho
+
+If there were any failures reported from running test_driver.sh on any test
+platform, and checkin with these failures has been OK'd by the gatekeeper,
+then copy the lines from the td.*.status files for the failed tests to the
+appropriate machine below. All failed tests must be justified.
+
+cheyenne/intel/aux_cam:
+ ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 (Overall: PEND) details:
+ PEND ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 MODEL_BUILD RERUN
+ ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details:
+ FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest
+ SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details:
+ - pre-existing failure
+
+ ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: DIFF) details:
+ ERP_D_Ln9.ne30pg3_ne30pg3_mg17.FLTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: DIFF) details:
+ SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ SMS_D_Ln9_Vnuopc_P1280x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ SMS_D_Ln9_Vnuopc_P1280x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ SMS_D_Ln9_Vnuopc_P1280x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details:
+ - expected baseline differences due to removal of cam6 tuning factor for SE dy
+
+ ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details:
+ ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: DIFF) details:
+ SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details:
+ - expected baseline differences for cam_dev runs
+
+ SMS_D_Ln9_Vnuopc_P1280x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ SMS_D_Ln9_Vnuopc_P1280x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ SMS_D_Ln9_Vnuopc_P1280x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details:
+ -Changed layout and hence the testname, so no baselines to compare with
+
+izumi/nag/aux_cam:
+ DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL)
+ - pre-existing failure
+
+ ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf (Overall: DIFF) details:
+ - expected baseline differences due to removal of cam6 tuning factor for SE dy
+
+izumi/gnu/aux_cam:
+ SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: DIFF) details:
+ - expected baseline differences for cam_dev runs
+
+NOTE: Most tests have namelist changes
+
+CAM tag used for the baseline comparison tests if different than previous
+tag: N/A
+
+Summarize any changes to answers, i.e.,
+- what code configurations: All cam_dev and SE cam6
+- what platforms/compilers: All
+- nature of change (roundoff; larger than roundoff but same climate; new
+ climate): Tuning changes - Climate changing for cam_dev
+
+If this tag changes climate describe the run(s) done to evaluate the new
+climate in enough detail that it(they) could be reproduced, i.e.,
+ - Run which was the prelimiary source of the changes: https://github.com/NCAR/amwg_dev/tree/b.e23_alpha16b.BLT1850.ne30_t232.051
+ - It is important to note that further changes were made to this tag as discussed in the issue/PR and discussion - Adam ran a test
+ to verify the final changes.
===============================================================
diff --git a/src/physics/cam/cldfrc2m.F90 b/src/physics/cam/cldfrc2m.F90
index 28a19ca07a..77a391fd35 100644
--- a/src/physics/cam/cldfrc2m.F90
+++ b/src/physics/cam/cldfrc2m.F90
@@ -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 IWC constraint [ kg/kg ]
+real(r8) :: cldfrc2m_qist_max ! Maximum in-stratus IWC constraint [ kg/kg ]
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 !
! ----------------------------- !
@@ -59,10 +59,10 @@ module cldfrc2m
real(r8) :: rhminh_const ! Critical RH for high-level liquid stratus clouds
real(r8) :: premit ! Top height for mid-level liquid stratus fraction
real(r8) :: premib ! Bottom height for mid-level liquid stratus fraction
-integer :: iceopt ! option for ice cloud closure
- ! 1=wang & sassen 2=schiller (iciwc)
+integer :: iceopt ! option for ice cloud closure
+ ! 1=wang & sassen 2=schiller (iciwc)
! 3=wood & field, 4=Wilson (based on smith)
- ! 5=modified slingo (ssat & empyt cloud)
+ ! 5=modified slingo (ssat & empyt cloud)
real(r8) :: icecrit ! Critical RH for ice clouds in Wilson & Ballard closure
! ( smaller = more ice clouds )
@@ -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
@@ -103,7 +104,6 @@ subroutine cldfrc2m_readnl(nlfile)
rhmaxi_const = cldfrc2m_rhmaxi
rhminis_const = cldfrc2m_rhminis
rhmaxis_const = cldfrc2m_rhmaxis
-
end if
! Broadcast namelist variables
@@ -111,7 +111,10 @@ subroutine cldfrc2m_readnl(nlfile)
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
@@ -139,6 +142,9 @@ 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
+ write(iulog,*) ' cldfrc2m_qist_min = ', cldfrc2m_qist_min
+ write(iulog,*) ' cldfrc2m_qist_max = ', cldfrc2m_qist_max
end if
end subroutine cldfrc2m_init
@@ -183,7 +189,7 @@ subroutine astG_PDF_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
real(r8) cldrh ! RH of stratus cloud
real(r8) rhmin ! Critical RH
real(r8) rhwght
-
+
real(r8) :: rhminl
real(r8) :: rhminl_adj_land
real(r8) :: rhminh
@@ -226,7 +232,7 @@ subroutine astG_PDF_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
a = 1._r8 - (-3._r8/sqrt(2._r8)*(U-cldrh)/dV)**(2._r8/3._r8)
Ga = dV/sqrt(2._r8)*sqrt(1._r8-a)
elseif( U .gt. (cldrh-dV) .and. U .le. (cldrh-dV/6._r8) ) then
- a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
+ a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
(1._r8+(U-cldrh)/dV))-2._r8*3.141592_r8)))**2._r8
Ga = dV/sqrt(2._r8)*(1._r8/sqrt(a)-sqrt(a))
elseif( U .le. (cldrh-dV) ) then
@@ -236,7 +242,7 @@ subroutine astG_PDF_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
if( freeze_dry ) then
a = a *max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
- Ga = Ga/max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
+ Ga = Ga/max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
endif
elseif( p .lt. premit ) then
@@ -251,7 +257,7 @@ subroutine astG_PDF_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
a = 1._r8 - (-3._r8/sqrt(2._r8)*(U-cldrh)/dV)**(2._r8/3._r8)
Ga = dV/sqrt(2._r8)*sqrt(1._r8-a)
elseif( U .gt. (cldrh-dV) .and. U .le. (cldrh-dV/6._r8) ) then
- a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
+ a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
(1._r8+(U-cldrh)/dV))-2._r8*3.141592_r8)))**2._r8
Ga = dV/sqrt(2._r8)*(1._r8/sqrt(a)-sqrt(a))
elseif( U .le. (cldrh-dV) ) then
@@ -278,7 +284,7 @@ subroutine astG_PDF_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
a = 1._r8 - (-3._r8/sqrt(2._r8)*(U-cldrh)/dV)**(2._r8/3._r8)
Ga = dV/sqrt(2._r8)*sqrt(1._r8-a)
elseif( U .gt. (cldrh-dV) .and. U .le. (cldrh-dV/6._r8) ) then
- a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
+ a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
(1._r8+(U-cldrh)/dV))-2._r8*3.141592_r8)))**2._r8
Ga = dV/sqrt(2._r8)*(1._r8/sqrt(a)-sqrt(a))
elseif( U .le. (cldrh-dV) ) then
@@ -344,7 +350,7 @@ subroutine astG_PDF(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
real(r8) cldrh ! RH of stratus cloud
real(r8) rhmin ! Critical RH
real(r8) rhwght
-
+
! Statement functions
logical land
land(i) = nint(landfrac_in(i)) == 1
@@ -368,13 +374,13 @@ subroutine astG_PDF(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
do i = 1, ncol
- U = U_in(i)
- p = p_in(i)
- qv = qv_in(i)
- landfrac = landfrac_in(i)
- snowh = snowh_in(i)
+ U = U_in(i)
+ p = p_in(i)
+ qv = qv_in(i)
+ landfrac = landfrac_in(i)
+ snowh = snowh_in(i)
- if (present(rhminl_in)) rhminl = rhminl_in(i)
+ if (present(rhminl_in)) rhminl = rhminl_in(i)
if (present(rhminl_adj_land_in)) rhminl_adj_land = rhminl_adj_land_in(i)
if (present(rhminh_in)) rhminh = rhminh_in(i)
@@ -395,7 +401,7 @@ subroutine astG_PDF(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
a = 1._r8 - (-3._r8/sqrt(2._r8)*(U-cldrh)/dV)**(2._r8/3._r8)
Ga = dV/sqrt(2._r8)*sqrt(1._r8-a)
elseif( U .gt. (cldrh-dV) .and. U .le. (cldrh-dV/6._r8) ) then
- a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
+ a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
(1._r8+(U-cldrh)/dV))-2._r8*3.141592_r8)))**2._r8
Ga = dV/sqrt(2._r8)*(1._r8/sqrt(a)-sqrt(a))
elseif( U .le. (cldrh-dV) ) then
@@ -405,7 +411,7 @@ subroutine astG_PDF(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
if( freeze_dry ) then
a = a *max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
- Ga = Ga/max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
+ Ga = Ga/max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
endif
elseif( p .lt. premit ) then
@@ -420,7 +426,7 @@ subroutine astG_PDF(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
a = 1._r8 - (-3._r8/sqrt(2._r8)*(U-cldrh)/dV)**(2._r8/3._r8)
Ga = dV/sqrt(2._r8)*sqrt(1._r8-a)
elseif( U .gt. (cldrh-dV) .and. U .le. (cldrh-dV/6._r8) ) then
- a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
+ a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
(1._r8+(U-cldrh)/dV))-2._r8*3.141592_r8)))**2._r8
Ga = dV/sqrt(2._r8)*(1._r8/sqrt(a)-sqrt(a))
elseif( U .le. (cldrh-dV) ) then
@@ -447,7 +453,7 @@ subroutine astG_PDF(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
a = 1._r8 - (-3._r8/sqrt(2._r8)*(U-cldrh)/dV)**(2._r8/3._r8)
Ga = dV/sqrt(2._r8)*sqrt(1._r8-a)
elseif( U .gt. (cldrh-dV) .and. U .le. (cldrh-dV/6._r8) ) then
- a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
+ a = 4._r8*(cos((1._r8/3._r8)*(acos((3._r8/2._r8/sqrt(2._r8))* &
(1._r8+(U-cldrh)/dV))-2._r8*3.141592_r8)))**2._r8
Ga = dV/sqrt(2._r8)*(1._r8/sqrt(a)-sqrt(a))
elseif( U .le. (cldrh-dV) ) then
@@ -458,7 +464,7 @@ subroutine astG_PDF(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
endif
a_out(i) = a
- Ga_out(i) = Ga
+ Ga_out(i) = Ga
enddo
@@ -471,7 +477,7 @@ subroutine astG_RHU_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
! --------------------------------------------------------- !
! Compute 'stratus fraction(a)' and Gs=(dU/da) from the !
! CAM35 cloud fraction formula. !
- ! Below is valid only for CAMUW at 1.9x2.5 fv dynamics core !
+ ! Below is valid only for CAMUW at 1.9x2.5 fv dynamics core !
! For the other cases, I should re-define 'rhminl,rhminh' & !
! 'premib,premit'. !
! Note that if U > 1, Ga = 1.e10 instead of Ga = 0, that is !
@@ -524,15 +530,15 @@ subroutine astG_RHU_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
rhmin = rhminl
endif
rhdif = (U-rhmin)/(1.0_r8-rhmin)
- a = min(1._r8,(max(rhdif,0.0_r8))**2)
+ a = min(1._r8,(max(rhdif,0.0_r8))**2)
if( (U.ge.1._r8) .or. (U.le.rhmin) ) then
Ga = 1.e20_r8
- else
+ else
Ga = 0.5_r8*(1._r8-rhmin)*((1._r8-rhmin)/(U-rhmin))
endif
if( freeze_dry ) then
a = a*max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
- Ga = Ga/max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
+ Ga = Ga/max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
endif
elseif( p .lt. premit ) then
@@ -542,7 +548,7 @@ subroutine astG_RHU_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
a = min(1._r8,(max(rhdif,0._r8))**2)
if( (U.ge.1._r8) .or. (U.le.rhmin) ) then
Ga = 1.e20_r8
- else
+ else
Ga = 0.5_r8*(1._r8-rhmin)*((1._r8-rhmin)/(U-rhmin))
endif
@@ -560,7 +566,7 @@ subroutine astG_RHU_single(U, p, qv, landfrac, snowh, a, Ga, orhmin, &
a = min(1._r8,(max(rhdif,0._r8))**2)
if( (U.ge.1._r8) .or. (U.le.rhmin) ) then
Ga = 1.e10_r8
- else
+ else
Ga = 0.5_r8*(1._r8-rhmin)*((1._r8-rhmin)/(U-rhmin))
endif
@@ -578,7 +584,7 @@ subroutine astG_RHU(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
! --------------------------------------------------------- !
! Compute 'stratus fraction(a)' and Gs=(dU/da) from the !
! CAM35 cloud fraction formula. !
- ! Below is valid only for CAMUW at 1.9x2.5 fv dynamics core !
+ ! Below is valid only for CAMUW at 1.9x2.5 fv dynamics core !
! For the other cases, I should re-define 'rhminl,rhminh' & !
! 'premib,premit'. !
! Note that if U > 1, Ga = 1.e10 instead of Ga = 0, that is !
@@ -635,13 +641,13 @@ subroutine astG_RHU(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
do i = 1, ncol
- U = U_in(i)
- p = p_in(i)
- qv = qv_in(i)
- landfrac = landfrac_in(i)
- snowh = snowh_in(i)
+ U = U_in(i)
+ p = p_in(i)
+ qv = qv_in(i)
+ landfrac = landfrac_in(i)
+ snowh = snowh_in(i)
- if (present(rhminl_in)) rhminl = rhminl_in(i)
+ if (present(rhminl_in)) rhminl = rhminl_in(i)
if (present(rhminl_adj_land_in)) rhminl_adj_land = rhminl_adj_land_in(i)
if (present(rhminh_in)) rhminh = rhminh_in(i)
@@ -653,15 +659,15 @@ subroutine astG_RHU(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
rhmin = rhminl
endif
rhdif = (U-rhmin)/(1.0_r8-rhmin)
- a = min(1._r8,(max(rhdif,0.0_r8))**2)
+ a = min(1._r8,(max(rhdif,0.0_r8))**2)
if( (U.ge.1._r8) .or. (U.le.rhmin) ) then
Ga = 1.e20_r8
- else
+ else
Ga = 0.5_r8*(1._r8-rhmin)*((1._r8-rhmin)/(U-rhmin))
endif
if( freeze_dry ) then
a = a*max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
- Ga = Ga/max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
+ Ga = Ga/max(0.15_r8,min(1.0_r8,qv/0.0030_r8))
endif
elseif( p .lt. premit ) then
@@ -671,7 +677,7 @@ subroutine astG_RHU(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
a = min(1._r8,(max(rhdif,0._r8))**2)
if( (U.ge.1._r8) .or. (U.le.rhmin) ) then
Ga = 1.e20_r8
- else
+ else
Ga = 0.5_r8*(1._r8-rhmin)*((1._r8-rhmin)/(U-rhmin))
endif
@@ -689,14 +695,14 @@ subroutine astG_RHU(U_in, p_in, qv_in, landfrac_in, snowh_in, a_out, Ga_out, nco
a = min(1._r8,(max(rhdif,0._r8))**2)
if( (U.ge.1._r8) .or. (U.le.rhmin) ) then
Ga = 1.e10_r8
- else
+ else
Ga = 0.5_r8*(1._r8-rhmin)*((1._r8-rhmin)/(U-rhmin))
endif
endif
a_out(i) = a
- Ga_out(i) = Ga
+ Ga_out(i) = Ga
enddo
@@ -709,7 +715,7 @@ subroutine aist_single(qv, T, p, qi, landfrac, snowh, aist, &
qsatfac_out)
! --------------------------------------------------------- !
- ! Compute non-physical ice stratus fraction !
+ ! Compute non-physical ice stratus fraction !
! --------------------------------------------------------- !
real(r8), intent(in) :: qv ! Grid-mean water vapor[kg/kg]
@@ -797,19 +803,19 @@ subroutine aist_single(qv, T, p, qi, landfrac, snowh, aist, &
call qsat_water(T, p, es, qs)
esl = svp_water(T)
esi = svp_ice(T)
-
+
if( iceopt.lt.3 ) then
if( iceopt.eq.1 ) then
ttmp = max(195._r8,min(T,253._r8)) - 273.16_r8
icicval = a + b * ttmp + c * ttmp**2._r8
rho = p/(rair*T)
- icicval = icicval * 1.e-6_r8 / rho
+ icicval = icicval * 1.e-6_r8 / rho
else
ttmp = max(190._r8,min(T,273.16_r8))
icicval = 10._r8 **(as * bs**ttmp + cs)
icicval = icicval * 1.e-6_r8 * 18._r8 / 28.97_r8
endif
- aist = max(0._r8,min(qi/icicval,1._r8))
+ aist = max(0._r8,min(qi/icicval,1._r8))
elseif( iceopt.eq.3 ) then
aist = 1._r8 - exp(-Kc*qi/(qs*(esi/esl)))
aist = max(0._r8,min(aist,1._r8))
@@ -831,9 +837,9 @@ subroutine aist_single(qv, T, p, qi, landfrac, snowh, aist, &
! endif
endif
ncf = qi/((1._r8 - icecrit)*qs)
- if( ncf.le.0._r8 ) then
+ if( ncf.le.0._r8 ) then
aist = 0._r8
- elseif( ncf.gt.0._r8 .and. ncf.le.1._r8/6._r8 ) then
+ elseif( ncf.gt.0._r8 .and. ncf.le.1._r8/6._r8 ) then
aist = 0.5_r8*(6._r8 * ncf)**(2._r8/3._r8)
elseif( ncf.gt.1._r8/6._r8 .and. ncf.lt.1._r8 ) then
phi = (acos(3._r8*(1._r8-ncf)/2._r8**(3._r8/2._r8))+4._r8*3.1415927_r8)/3._r8
@@ -842,7 +848,7 @@ subroutine aist_single(qv, T, p, qi, landfrac, snowh, aist, &
aist = 1._r8
endif
aist = max(0._r8,min(aist,1._r8))
- elseif (iceopt.eq.5) then
+ elseif (iceopt.eq.5) then
! set rh ice cloud fraction
rhi= (qv+qi)/qs * (esl/esi)
if (rhmaxi .eq. rhmini) then
@@ -863,7 +869,7 @@ subroutine aist_single(qv, T, p, qi, landfrac, snowh, aist, &
! NOTE: Limit qsatfac so that adjusted RHliq would be 1. or less.
if (present(qsatfac_out) .and. cldfrc2m_do_subgrid_growth) then
qsatfac_out = max(min(qv / qs, 1._r8), (1._r8 - aist) * rhmini + aist * rhmaxi)
- end if
+ end if
! limiter to remove empty cloud and ice with no cloud
! and set icecld fraction to mincld if ice exists
@@ -879,19 +885,28 @@ 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
- endif
+ endif
! 0.999_r8 is added to prevent infinite 'ql_st' at the end of instratus_condensate
- ! computed after updating 'qi_st'.
+ ! computed after updating 'qi_st'.
aist = max(0._r8,min(aist,0.999_r8))
@@ -904,7 +919,7 @@ subroutine aist_vector(qv_in, T_in, p_in, qi_in, ni_in, landfrac_in, snowh_in, a
qsatfac_out )
! --------------------------------------------------------- !
- ! Compute non-physical ice stratus fraction !
+ ! Compute non-physical ice stratus fraction !
! --------------------------------------------------------- !
real(r8), intent(in) :: qv_in(pcols) ! Grid-mean water vapor[kg/kg]
@@ -916,7 +931,7 @@ subroutine aist_vector(qv_in, T_in, p_in, qi_in, ni_in, landfrac_in, snowh_in, a
real(r8), intent(in) :: snowh_in(pcols) ! Snow depth (liquid water equivalent)
real(r8), intent(out) :: aist_out(pcols) ! Non-physical ice stratus fraction ( 0<= aist <= 1 )
- integer, intent(in) :: ncol
+ integer, intent(in) :: ncol
real(r8), optional, intent(in) :: rhmaxi_in(pcols)
real(r8), optional, intent(in) :: rhmini_in(pcols) ! Critical relative humidity for ice stratus
@@ -1013,9 +1028,9 @@ subroutine aist_vector(qv_in, T_in, p_in, qi_in, ni_in, landfrac_in, snowh_in, a
call svp_ice_vect(T_in(1:ncol), esi(1:ncol), ncol)
do i = 1, ncol
-
- landfrac = landfrac_in(i)
- snowh = snowh_in(i)
+
+ landfrac = landfrac_in(i)
+ snowh = snowh_in(i)
T = T_in(i)
qv = qv_in(i)
p = p_in(i)
@@ -1024,23 +1039,23 @@ subroutine aist_vector(qv_in, T_in, p_in, qi_in, ni_in, landfrac_in, snowh_in, a
qs = qsat_in(i)
if (present(rhmaxi_in)) rhmaxi = rhmaxi_in(i)
- if (present(rhmini_in)) rhmini = rhmini_in(i)
- if (present(rhminl_in)) rhminl = rhminl_in(i)
+ if (present(rhmini_in)) rhmini = rhmini_in(i)
+ if (present(rhminl_in)) rhminl = rhminl_in(i)
if (present(rhminl_adj_land_in)) rhminl_adj_land = rhminl_adj_land_in(i)
if (present(rhminh_in)) rhminh = rhminh_in(i)
-
+
if( iceopt.lt.3 ) then
if( iceopt.eq.1 ) then
ttmp = max(195._r8,min(T,253._r8)) - 273.16_r8
icicval = a + b * ttmp + c * ttmp**2._r8
rho = p/(rair*T)
- icicval = icicval * 1.e-6_r8 / rho
+ icicval = icicval * 1.e-6_r8 / rho
else
ttmp = max(190._r8,min(T,273.16_r8))
icicval = 10._r8 **(as * bs**ttmp + cs)
icicval = icicval * 1.e-6_r8 * 18._r8 / 28.97_r8
endif
- aist = max(0._r8,min(qi/icicval,1._r8))
+ aist = max(0._r8,min(qi/icicval,1._r8))
elseif( iceopt.eq.3 ) then
aist = 1._r8 - exp(-Kc*qi/(qs*(esi(i)/esl(i))))
aist = max(0._r8,min(aist,1._r8))
@@ -1062,9 +1077,9 @@ subroutine aist_vector(qv_in, T_in, p_in, qi_in, ni_in, landfrac_in, snowh_in, a
! endif
endif
ncf = qi/((1._r8 - icecrit)*qs)
- if( ncf.le.0._r8 ) then
+ if( ncf.le.0._r8 ) then
aist = 0._r8
- elseif( ncf.gt.0._r8 .and. ncf.le.1._r8/6._r8 ) then
+ elseif( ncf.gt.0._r8 .and. ncf.le.1._r8/6._r8 ) then
aist = 0.5_r8*(6._r8 * ncf)**(2._r8/3._r8)
elseif( ncf.gt.1._r8/6._r8 .and. ncf.lt.1._r8 ) then
phi = (acos(3._r8*(1._r8-ncf)/2._r8**(3._r8/2._r8))+4._r8*3.1415927_r8)/3._r8
@@ -1073,7 +1088,7 @@ subroutine aist_vector(qv_in, T_in, p_in, qi_in, ni_in, landfrac_in, snowh_in, a
aist = 1._r8
endif
aist = max(0._r8,min(aist,1._r8))
- elseif (iceopt.eq.5) then
+ elseif (iceopt.eq.5) then
! set rh ice cloud fraction
rhi= (qv+qi)/qs * (esl(i)/esi(i))
if (rhmaxi .eq. rhmini) then
@@ -1104,7 +1119,7 @@ subroutine aist_vector(qv_in, T_in, p_in, qi_in, ni_in, landfrac_in, snowh_in, a
aist = max(0._r8,min(qi/icicval,1._r8))
aist = min(aist,1._r8)
- endif
+ endif
if (iceopt.eq.5 .or. iceopt.eq.6) then
@@ -1131,19 +1146,28 @@ 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
- endif
+ endif
! 0.999_r8 is added to prevent infinite 'ql_st' at the end of instratus_condensate
- ! computed after updating 'qi_st'.
+ ! computed after updating 'qi_st'.
aist = max(0._r8,min(aist,0.999_r8))
diff --git a/src/physics/cam/microp_aero.F90 b/src/physics/cam/microp_aero.F90
index 0afcd78baa..4961a139a8 100644
--- a/src/physics/cam/microp_aero.F90
+++ b/src/physics/cam/microp_aero.F90
@@ -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
@@ -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
@@ -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")
@@ -455,6 +458,7 @@ 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")
@@ -462,6 +466,7 @@ subroutine microp_aero_readnl(nlfile)
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)
@@ -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
diff --git a/src/physics/cam/ndrop.F90 b/src/physics/cam/ndrop.F90
index 55de7de42d..9eea87d218 100644
--- a/src/physics/cam/ndrop.F90
+++ b/src/physics/cam/ndrop.F90
@@ -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
@@ -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(:)
@@ -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
diff --git a/src/physics/spcam/crmclouds_camaerosols.F90 b/src/physics/spcam/crmclouds_camaerosols.F90
index 08f4e3f246..0ab4568033 100644
--- a/src/physics/spcam/crmclouds_camaerosols.F90
+++ b/src/physics/spcam/crmclouds_camaerosols.F90
@@ -388,6 +388,9 @@ subroutine crmclouds_mixnuc_tend( aero_props, aero_state, state, ptend, dtime, c
type(physics_ptend), intent(out) :: ptend ! package tendencies
! Local variables
+
+ real(r8), parameter :: wsub_min_asf = 0.1D0
+
integer i,k,m, k1, k2
integer ifld, itim
integer ixcldliq, ixcldice, ixnumliq
@@ -580,7 +583,8 @@ subroutine crmclouds_mixnuc_tend( aero_props, aero_state, state, ptend, dtime, c
! should we set omega to be zero ??
omega(:ncol, :) = state%omega(:ncol, :)
- call dropmixnuc(aero_props, aero_state, state, ptend, dtime, pbuf, wsub, lcldn, lcldo, cldliqf, tendnd, factnum, dommf )
+ call dropmixnuc(aero_props, aero_state, state, ptend, dtime, pbuf, wsub, wsub_min_asf, lcldn, lcldo, cldliqf, tendnd, factnum, &
+ dommf )
! this part is moved into tphysbc after aerosol stuffs.
!