Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
1ea4d5e
CAM Changes in support of PUMAS update, first round changes tested in…
Jul 26, 2021
7a328f1
Remove vapdepso_grid and just average on output as needed
Katetc Jul 29, 2021
8485932
Updating CAM externals to use new pumas tag v1.18
Aug 2, 2021
3167e9c
Removing unused code in response to review
Aug 9, 2021
36a2fb7
Update Namelist Definition file, correcting an error in documentation…
Aug 10, 2021
b792420
Correcting typos in comments
Aug 17, 2021
2f2346b
updated implicit fall speed code
Sep 29, 2021
6bf851b
Merge pull request #6 from ESCOMP/cam_development
Katetc Nov 23, 2021
b7a94d0
Whitespace changes to prevent merge conflicts with Jian's code
Katetc Nov 24, 2021
a479234
update to the most recent PUMAS tag
Katetc Jan 12, 2022
c775201
Merge up to cam6_3_043
Katetc Jan 12, 2022
b5a9fb0
Move new pumas to cam_dev and update names from mg to pumas in more p…
Katetc Jan 19, 2022
7fbafa1
Re-review noticed comments not updated for new namelist options
Katetc Jan 19, 2022
1bf847d
Addressing review suggestions, changed micro_mg_cam to micro_pumas_cam
Katetc Jan 21, 2022
cb1bfb9
Merge remote-tracking branch 'origin/cam_development' into gettelman_…
Katetc Jan 24, 2022
62d75d8
Missed some renaming changes in sp-cam
Katetc Jan 25, 2022
6687a95
Roll back nucleate_ice changes for non-cam_dev configurations, first …
Katetc Jan 27, 2022
3e828b5
Missed an end if
Katetc Jan 27, 2022
bbe500b
Change output history variable names to reflect new tendencies
Katetc Jan 27, 2022
8a982ad
Update Outfld calls with new names
Katetc Jan 28, 2022
9a95855
Updated ChangeLog
Katetc Feb 1, 2022
0470e0d
Final updates to ChangeLog
Katetc Feb 1, 2022
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
2 changes: 1 addition & 1 deletion Externals_CAM.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ required = True
local_path = src/physics/pumas
protocol = git
repo_url = https://github.com/ESCOMP/PUMAS
tag = pumas_cam-release_v1.17
tag = pumas_cam-release_v1.18
required = True

[atmos_phys]
Expand Down
13 changes: 13 additions & 0 deletions bld/namelist_files/namelist_definition.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2731,6 +2731,19 @@ If .true., ensure non-zero precipitation fallspeed (rain,snow and graupel) if pr
Default: .false.
</entry>

<entry id="micro_mg_implicit_fall" type="logical" category="microphys"
group="micro_mg_nl" valid_values="" >
If .true., use implicit fall speed (sedimentation) routine for all hydrometeors. Improves numerical stability of precipitation
Default: .true.
Comment thread
andrewgettelman marked this conversation as resolved.
</entry>

<entry id="micro_mg_accre_sees_auto" type="logical" category="microphys"
group="micro_mg_nl" valid_values="" >
If true, then the autoconvered liquid is added to rain and removed from cloud before accretion is estimated.
Comment thread
andrewgettelman marked this conversation as resolved.
Outdated
Default: .false.
</entry>


<!-- Aerosol microphysics -->
<entry id="microp_aero_bulk_scale" type="real" category="microphys"
group="microp_aero_nl" valid_values="" >
Expand Down
31 changes: 25 additions & 6 deletions src/physics/cam/micro_mg_cam.F90
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,12 @@ module micro_mg_cam
logical :: micro_mg_evap_rhthrsh_ifs = .false. ! Evap RH threhold following IFS
logical :: micro_mg_rainfreeze_ifs = .false. ! Rain freezing at 0C following IFS
logical :: micro_mg_ifs_sed = .false. ! Snow sedimentation = 1 m/s following IFS
logical :: micro_mg_precip_fall_corr = .false. ! Precip fall speed following IFS
logical :: micro_mg_precip_fall_corr = .false. ! Precip fall speed following IFS (does not go to zero)

logical :: micro_mg_implicit_fall = .false. !Implicit fall speed (sedimentation) for hydrometeors

logical :: micro_mg_accre_sees_auto = .false. !Accretion sees autoconverted rain

character(len=10), parameter :: & ! Constituent names
cnst_names(10) = (/'CLDLIQ', 'CLDICE','NUMLIQ','NUMICE', &
'RAINQM', 'SNOWQM','NUMRAI','NUMSNO','GRAUQM','NUMGRA'/)
Expand Down Expand Up @@ -332,8 +336,8 @@ subroutine micro_mg_cam_readnl(nlfile)
micro_do_massless_droplet_destroyer, &
micro_mg_evap_sed_off, micro_mg_icenuc_rh_off, micro_mg_icenuc_use_meyers, &
micro_mg_evap_scl_ifs, micro_mg_evap_rhthrsh_ifs, &
micro_mg_rainfreeze_ifs, micro_mg_ifs_sed, micro_mg_precip_fall_corr

micro_mg_rainfreeze_ifs, micro_mg_ifs_sed, micro_mg_precip_fall_corr, &
micro_mg_accre_sees_auto, micro_mg_implicit_fall

!-----------------------------------------------------------------------------

Expand Down Expand Up @@ -526,7 +530,13 @@ subroutine micro_mg_cam_readnl(nlfile)

call mpi_bcast(micro_mg_precip_fall_corr, 1, mpi_logical, mstrid, mpicom, ierr)
if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_precip_fall_corr")


call mpi_bcast(micro_mg_implicit_fall, 1, mpi_logical, mstrid, mpicom, ierr)
if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_implicit_fall")

call mpi_bcast(micro_mg_accre_sees_auto, 1, mpi_logical, mstrid, mpicom, ierr)
if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: micro_mg_accre_sees_auto")

if(micro_mg_berg_eff_factor == unset_r8) call endrun(sub//": FATAL: micro_mg_berg_eff_factor is not set")
if(micro_mg_accre_enhan_fact == unset_r8) call endrun(sub//": FATAL: micro_mg_accre_enhan_fact is not set")
if(micro_mg_autocon_fact == unset_r8) call endrun(sub//": FATAL: micro_mg_autocon_fact is not set")
Expand Down Expand Up @@ -582,6 +592,8 @@ subroutine micro_mg_cam_readnl(nlfile)
write(iulog,*) ' micro_mg_rainfreeze_ifs = ', micro_mg_rainfreeze_ifs
write(iulog,*) ' micro_mg_ifs_sed = ', micro_mg_ifs_sed
write(iulog,*) ' micro_mg_precip_fall_corr = ', micro_mg_precip_fall_corr
write(iulog,*) ' micro_mg_implicit_fall = ', micro_mg_implicit_fall
write(iulog,*) ' micro_mg_accre_sees_auto = ', micro_mg_accre_sees_auto
end if

contains
Expand Down Expand Up @@ -968,6 +980,7 @@ subroutine micro_mg_cam_init(pbuf2d)
micro_mg_evap_sed_off, micro_mg_icenuc_rh_off, micro_mg_icenuc_use_meyers, &
micro_mg_evap_scl_ifs, micro_mg_evap_rhthrsh_ifs, &
micro_mg_rainfreeze_ifs, micro_mg_ifs_sed, micro_mg_precip_fall_corr,&
micro_mg_accre_sees_auto, micro_mg_implicit_fall, &
micro_mg_nccons, micro_mg_nicons, micro_mg_ncnst, &
micro_mg_ninst, micro_mg_ngcons, micro_mg_ngnst, &
micro_mg_nrcons, micro_mg_nrnst, micro_mg_nscons, micro_mg_nsnst, errstring)
Expand Down Expand Up @@ -1040,7 +1053,7 @@ subroutine micro_mg_cam_init(pbuf2d)
call addfld ('BERGO', (/ 'lev' /), 'A', 'kg/kg/s', 'Conversion of cloud water to cloud ice from bergeron' )
call addfld ('MELTO', (/ 'lev' /), 'A', 'kg/kg/s', 'Melting of cloud ice' )
call addfld ('MELTSTOT', (/ 'lev' /), 'A', 'kg/kg/s', 'Melting of snow' )
call addfld ('MNUDEPO', (/ 'lev' /), 'A', 'kg/kg/s', 'Deposition Nucleation' )
call addfld ('MNUDEPO', (/ 'lev' /), 'A', 'kg/kg/s', 'Deposition Nucleation' )
call addfld ('HOMOO', (/ 'lev' /), 'A', 'kg/kg/s', 'Homogeneous freezing of cloud water' )
call addfld ('QCRESO', (/ 'lev' /), 'A', 'kg/kg/s', 'Residual condensation term for cloud water' )
call addfld ('PRCIO', (/ 'lev' /), 'A', 'kg/kg/s', 'Autoconversion of cloud ice to snow' )
Expand All @@ -1049,6 +1062,7 @@ subroutine micro_mg_cam_init(pbuf2d)
call addfld ('MNUCCRO', (/ 'lev' /), 'A', 'kg/kg/s', 'Heterogeneous freezing of rain to snow' )
call addfld ('MNUCCRIO', (/ 'lev' /), 'A', 'kg/kg/s', 'Heterogeneous freezing of rain to ice' )
call addfld ('PRACSO', (/ 'lev' /), 'A', 'kg/kg/s', 'Accretion of rain by snow' )
call addfld ('VAPDEPSO', (/ 'lev' /), 'A', 'kg/kg/s', 'Vapor deposition onto snow' )
call addfld ('MELTSDT', (/ 'lev' /), 'A', 'W/kg', 'Latent heating rate due to melting of snow' )
call addfld ('FRZRDT', (/ 'lev' /), 'A', 'W/kg', 'Latent heating rate due to homogeneous freezing of rain' )
if (micro_mg_version > 1) then
Expand Down Expand Up @@ -1271,6 +1285,7 @@ subroutine micro_mg_cam_init(pbuf2d)
call add_default ('PRAO ', budget_histfile, ' ')
call add_default ('PRAIO ', budget_histfile, ' ')
call add_default ('PRACSO ', budget_histfile, ' ')
call add_default ('VAPDEPSO ', budget_histfile, ' ')
call add_default ('MSACWIO ', budget_histfile, ' ')
call add_default ('MPDW2V ', budget_histfile, ' ')
call add_default ('MPDW2P ', budget_histfile, ' ')
Expand Down Expand Up @@ -1584,6 +1599,7 @@ subroutine micro_mg_cam_tend_pack(state, ptend, dtime, pbuf, mgncol, mgcols, nle
real(r8), target :: meltstot(state%psetcols,pver)
real(r8), target :: meltgtot(state%psetcols,pver)
real(r8), target :: pracso (state%psetcols,pver)
real(r8), target :: vapdepso(state%psetcols,pver) ! Vapor deposition onto snow
real(r8), target :: meltsdt(state%psetcols,pver)
real(r8), target :: frzrdt (state%psetcols,pver)
real(r8), target :: mnuccdo(state%psetcols,pver)
Expand Down Expand Up @@ -1742,6 +1758,7 @@ subroutine micro_mg_cam_tend_pack(state, ptend, dtime, pbuf, mgncol, mgcols, nle
real(r8), target :: packed_meltgtot(mgncol,nlev)
real(r8), target :: packed_meltstot(mgncol,nlev)
real(r8), target :: packed_pracs(mgncol,nlev)
real(r8), target :: packed_vapdeps(mgncol,nlev)
real(r8), target :: packed_meltsdt(mgncol,nlev)
real(r8), target :: packed_frzrdt(mgncol,nlev)
real(r8), target :: packed_mnuccd(mgncol,nlev)
Expand Down Expand Up @@ -2434,6 +2451,7 @@ subroutine micro_mg_cam_tend_pack(state, ptend, dtime, pbuf, mgncol, mgcols, nle
call post_proc%add_field(p(qireso), p(packed_qires))
call post_proc%add_field(p(mnuccro), p(packed_mnuccr))
call post_proc%add_field(p(pracso), p(packed_pracs))
call post_proc%add_field(p(vapdepso), p(packed_vapdeps))
call post_proc%add_field(p(meltsdt), p(packed_meltsdt))
call post_proc%add_field(p(frzrdt), p(packed_frzrdt))
call post_proc%add_field(p(mnuccdo), p(packed_mnuccd))
Expand Down Expand Up @@ -2641,7 +2659,7 @@ subroutine micro_mg_cam_tend_pack(state, ptend, dtime, pbuf, mgncol, mgcols, nle
packed_qrsedten, packed_qssedten, &
packed_pra, packed_prc, &
packed_mnuccc, packed_mnucct, packed_msacwi, &
packed_psacws, packed_bergs, packed_berg, &
packed_psacws, packed_bergs, packed_vapdeps, packed_berg, &
packed_melt, packed_meltstot,packed_meltgtot, packed_homo, &
packed_qcres, packed_prci, packed_prai, &
packed_qires, packed_mnuccr, packed_mnudeptot, packed_mnuccri, packed_pracs, &
Expand Down Expand Up @@ -3625,6 +3643,7 @@ subroutine micro_mg_cam_tend_pack(state, ptend, dtime, pbuf, mgncol, mgcols, nle
call outfld('MNUCCDOhet', mnuccdohet, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
call outfld('MNUCCRO', mnuccro, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
call outfld('PRACSO', pracso , psetcols, lchnk, avg_subcol_field=use_subcol_microp)
call outfld('VAPDEPSO', vapdepso, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
call outfld('MELTSDT', meltsdt, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
call outfld('FRZRDT', frzrdt , psetcols, lchnk, avg_subcol_field=use_subcol_microp)
call outfld('FICE', nfice, psetcols, lchnk, avg_subcol_field=use_subcol_microp)
Expand Down
4 changes: 0 additions & 4 deletions src/physics/cam/nucleate_ice.F90
Original file line number Diff line number Diff line change
Expand Up @@ -327,10 +327,6 @@ subroutine nucleati( &
! MG is expecting to find.
ni = n1

! If using prexsiting ice, then add it to the total.
if (use_preexisting_ice .and. (.not. call_frm_zm)) then
ni = ni + Ni_preice * 1e-6_r8
end if
end if
end if
end if
Expand Down
41 changes: 21 additions & 20 deletions src/physics/cam/nucleate_ice_cam.F90
Original file line number Diff line number Diff line change
Expand Up @@ -218,10 +218,10 @@ subroutine nucleate_ice_cam_init(mincld_in, bulk_scale_in, pbuf2d)
call endrun(routine//': ERROR qsatfac is required when subgrid = -1 or subgrid_strat = -1')
end if

call addfld('NIHF', (/ 'lev' /), 'A', '1/m3', 'Activated Ice Number Concentation due to homogenous freezing')
call addfld('NIDEP', (/ 'lev' /), 'A', '1/m3', 'Activated Ice Number Concentation due to deposition nucleation')
call addfld('NIIMM', (/ 'lev' /), 'A', '1/m3', 'Activated Ice Number Concentation due to immersion freezing')
call addfld('NIMEY', (/ 'lev' /), 'A', '1/m3', 'Activated Ice Number Concentation due to meyers deposition')
call addfld('NIHF', (/ 'lev' /), 'A', '1/m3/s', 'Activated Ice Number Concentation tendency due to homogenous freezing')
call addfld('NIDEP', (/ 'lev' /), 'A', '1/m3/s', 'Activated Ice Number Concentation tendency due to deposition nucleation')
call addfld('NIIMM', (/ 'lev' /), 'A', '1/m3/s', 'Activated Ice Number Concentation tendency due to immersion freezing')
call addfld('NIMEY', (/ 'lev' /), 'A', '1/m3/s', 'Activated Ice Number Concentation tendency due to meyers deposition')
Comment thread
andrewgettelman marked this conversation as resolved.
Outdated

call addfld('NIREGM',(/ 'lev' /), 'A', 'C', 'Ice Nucleation Temperature Threshold for Regime')
call addfld('NISUBGRID',(/ 'lev' /), 'A', '', 'Ice Nucleation subgrid saturation factor')
Expand All @@ -234,13 +234,13 @@ subroutine nucleate_ice_cam_init(mincld_in, bulk_scale_in, pbuf2d)
call addfld('fhom', (/ 'lev' /), 'A','fraction', 'Fraction of cirrus where homogeneous freezing occur' )
call addfld ('WICE', (/ 'lev' /), 'A','m/s','Vertical velocity Reduction caused by preexisting ice' )
call addfld ('WEFF', (/ 'lev' /), 'A','m/s','Effective Vertical velocity for ice nucleation' )
call addfld ('INnso4', (/ 'lev' /), 'A','1/m3','Number Concentation so4 (in) to ice_nucleation')
call addfld ('INnbc', (/ 'lev' /), 'A','1/m3','Number Concentation bc (in) to ice_nucleation')
call addfld ('INndust', (/ 'lev' /), 'A','1/m3','Number Concentation dust (in) ice_nucleation')
call addfld ('INondust', (/ 'lev' /), 'A','1/m3','Number Concentation dust (out) from ice_nucleation')
call addfld ('INhet', (/ 'lev' /), 'A','1/m3', &
call addfld ('INnso4', (/ 'lev' /), 'A','1/m3/s','Number Concentation so4 (in) to ice_nucleation')
call addfld ('INnbc', (/ 'lev' /), 'A','1/m3/s','Number Concentation bc (in) to ice_nucleation')
call addfld ('INndust', (/ 'lev' /), 'A','1/m3/s','Number Concentation dust (in) ice_nucleation')
call addfld ('INondust', (/ 'lev' /), 'A','1/m3/s','Number Concentation dust (out) from ice_nucleation')
Comment thread
andrewgettelman marked this conversation as resolved.
Outdated
call addfld ('INhet', (/ 'lev' /), 'A','1/m3/s', &
'contribution for in-cloud ice number density increase by het nucleation in ice cloud')
call addfld ('INhom', (/ 'lev' /), 'A','1/m3', &
call addfld ('INhom', (/ 'lev' /), 'A','1/m3/s', &
'contribution for in-cloud ice number density increase by hom nucleation in ice cloud')
call addfld ('INFrehom', (/ 'lev' /), 'A','frequency','hom IN frequency ice cloud')
call addfld ('INFreIN', (/ 'lev' /), 'A','frequency','frequency of ice nucleation occur')
Expand Down Expand Up @@ -787,19 +787,20 @@ subroutine nucleate_ice_cam_calc( &
end if
end if

naai_hom(i,k) = nihf(i,k)
naai_hom(i,k) = nihf(i,k)/dtime
naai(i,k)= naai(i,k)/dtime

! output activated ice (convert from #/kg -> #/m3)
nihf(i,k) = nihf(i,k) *rho(i,k)
niimm(i,k) = niimm(i,k)*rho(i,k)
nidep(i,k) = nidep(i,k)*rho(i,k)
nimey(i,k) = nimey(i,k)*rho(i,k)
! output activated ice (convert from #/kg -> #/m3/s)
nihf(i,k) = nihf(i,k) *rho(i,k)/dtime
niimm(i,k) = niimm(i,k)*rho(i,k)/dtime
nidep(i,k) = nidep(i,k)*rho(i,k)/dtime
nimey(i,k) = nimey(i,k)*rho(i,k)/dtime

if (use_preexisting_ice) then
INnso4(i,k) =so4_num*1e6_r8 ! (convert from #/cm3 -> #/m3)
INnbc(i,k) =soot_num*1e6_r8
INndust(i,k)=dst_num*1e6_r8
INondust(i,k)=odst_num*1e6_r8
INnso4(i,k) =so4_num*1e6_r8/dtime ! (convert from #/cm3 -> #/m3/s)
INnbc(i,k) =soot_num*1e6_r8/dtime
INndust(i,k)=dst_num*1e6_r8/dtime
INondust(i,k)=odst_num*1e6_r8/dtime
INFreIN(i,k)=1.0_r8 ! 1,ice nucleation occur
INhet(i,k) = (niimm(i,k) + nidep(i,k)) ! #/m3, nimey not in cirrus
INhom(i,k) = nihf(i,k) ! #/m3
Expand Down