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. !