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

Implements cam_thermo_water_update and CCPPized check_energy #316

Merged
merged 43 commits into from
Dec 16, 2024
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
8648970
Initial implementation of cp_to_cv_dycore/cam_thermo_water_update fro…
jimmielin Sep 12, 2024
333ad4e
Initial port of updates to energy budget (port of CAM #761) into CAM-…
jimmielin Sep 16, 2024
041cdfb
Add is_first_timestep registry
jimmielin Sep 16, 2024
7493a1d
Fix build issues; update factor in get_cp call to 1/dp
jimmielin Sep 16, 2024
4ce8427
Add gmean_mod to src/utils including support infra in physics_grid.F90
jimmielin Sep 20, 2024
2372f7f
Fix for b4b to CAM-SIMA (w/ History); add notes on modifications and/…
jimmielin Oct 2, 2024
c015e28
Update ncar-physics external
jimmielin Oct 15, 2024
e13e7ea
Fix build (part 1); update standard names and atmos_phys external
jimmielin Oct 15, 2024
0d16be9
New const_get_index logic without cam_ccpp_cap dependency
jimmielin Oct 15, 2024
8fca3a4
Update vcoord to energy_formula
jimmielin Oct 22, 2024
38fdbb2
Read cp_or_cv_dycore and identify dycore information from CAM snapshot
jimmielin Oct 24, 2024
240ef54
Set wv_idx in air_composition
jimmielin Oct 24, 2024
bef25fb
Update atmos_phys external
jimmielin Oct 25, 2024
8b8a8e0
Fix merge conflicts
jimmielin Oct 25, 2024
53cba06
Implements CCPPized check_energy in SIMA.
jimmielin Oct 25, 2024
a4d3866
Add adiabatic scheme and check_energy_fix
jimmielin Nov 4, 2024
e0450f9
Fix index underflow in get_hydrostatic_energy; update ncar-physics ex…
jimmielin Nov 4, 2024
6e5873e
Update with ne3np4 inic files
jimmielin Nov 5, 2024
768040e
Now mark energy consistency variables in registry as initialized in d…
jimmielin Nov 5, 2024
03100c1
Fix remaining issues in adiabatic scheme; add teout to registry and i…
jimmielin Nov 5, 2024
e4d387f
Merge branch 'hplin/check_energy' into hplin/check_energy_rebase
jimmielin Nov 7, 2024
3a1a5b9
Update ncar-physics external for dycore_energy_consistency_adjust
jimmielin Nov 8, 2024
7a706da
Update atmospheric_physics external; standard names to address review…
jimmielin Nov 13, 2024
11e9a20
Update nstep from model state; add FADIAB physics-suite
jimmielin Nov 13, 2024
800bf8b
Update standard names from review comments; add flag for energy consi…
jimmielin Nov 14, 2024
916cb9f
rga -> gravit
jimmielin Nov 14, 2024
b7abae1
gmean diagnostic updates
jimmielin Nov 14, 2024
6105ca8
Address review comments (update external)
jimmielin Nov 15, 2024
cca6e42
Merge branch 'development' into hplin/check_energy_rebase
jimmielin Dec 10, 2024
f999707
Address review comments
jimmielin Dec 10, 2024
3d2fd91
Address review comments
jimmielin Dec 12, 2024
fc1789b
Remove mention of check_energy_timestep_init in dp_coupling since it …
jimmielin Dec 12, 2024
58a151a
Fix build
jimmielin Dec 12, 2024
63dff8f
Add pver dim check in cam_thermo_dry_air_update
jimmielin Dec 12, 2024
55ea5b3
Pass cp_or_cv_dycore explicitly to cam_thermo_water_update in prepara…
jimmielin Dec 12, 2024
a8b977b
Fixes for MPAS dynamical core to support cam_thermo_water_update
jimmielin Dec 12, 2024
7448d73
Fix FPHYStest test failure
jimmielin Dec 12, 2024
4bbb920
Address review comments
jimmielin Dec 12, 2024
e28e9b9
Update src/dynamics/mpas/dyn_comp.F90
jimmielin Dec 13, 2024
2769a0d
Update src/dynamics/mpas/dyn_comp.F90
jimmielin Dec 13, 2024
835bfbe
Update src/dynamics/mpas/dyn_comp.F90
jimmielin Dec 13, 2024
1df3251
Update src/dynamics/mpas/dyn_comp.F90
jimmielin Dec 13, 2024
dc50fea
Update list of existing test failures
jimmielin Dec 14, 2024
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
1 change: 0 additions & 1 deletion cime_config/config_component.xml
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@

<!-- Simple models -->
<value compset="_CAM%ADIAB">--physics-suites adiabatic</value>
<!-- <value compset="_CAM%DABIP04">-phys adiabatic</value> -->
<value compset="_CAM%TJ16">--physics-suites tj2016 --analytic_ic</value>
<!-- <value compset="_CAM%KESSLER">-phys kessler -chem terminator -analytic_ic</value> -->
<value compset="_CAM%KESSLER">--physics-suites kessler --analytic_ic</value>
Expand Down
34 changes: 15 additions & 19 deletions src/data/air_composition.F90
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ module air_composition
use runtime_obj, only: unset_real, unset_int
use phys_vars_init_check, only: std_name_len
use physics_types, only: cpairv, rairv, cappav, mbarv, zvirv
use physics_types, only: cp_or_cv_dycore

implicit none
private
Expand Down Expand Up @@ -540,45 +539,42 @@ end subroutine dry_air_composition_update
!===========================================================================
!---------------------------------------------------------------------------
! water_composition_update: Update generalized cp or cv depending on dycore
! (enthalpy for pressure-based dynamical cores and internal energy for z-based dynamical cores)
!---------------------------------------------------------------------------
!===========================================================================
subroutine water_composition_update(mmr, ncol, energy_formula, to_dry_factor)
subroutine water_composition_update(mmr, ncol, energy_formula, cp_or_cv_dycore, to_dry_factor)
use cam_thermo_formula, only: ENERGY_FORMULA_DYCORE_FV, ENERGY_FORMULA_DYCORE_SE, ENERGY_FORMULA_DYCORE_MPAS
use string_utils, only: stringify

real(kind_phys), intent(in) :: mmr(:,:,:) ! constituents array
integer, intent(in) :: ncol ! number of columns
integer, intent(in) :: energy_formula ! energy formula for dynamical core
real(kind_phys), optional, intent(in) :: to_dry_factor(:,:)
real(kind_phys), intent(in) :: mmr(:,:,:) ! constituents array
integer, intent(in) :: ncol ! number of columns
integer, intent(in) :: energy_formula ! energy formula for dynamical core
real(kind_phys), intent(out) :: cp_or_cv_dycore(:,:) ! enthalpy or heat capacity, dycore dependent [J K-1 kg-1]
real(kind_phys), optional, intent(in) :: to_dry_factor(:,:)

character(len=*), parameter :: subname = 'water_composition_update'

! update enthalpy or internal energy scaling factor for energy consistency with CAM physics
! cp_or_cv_dycore is now a registry variable (physics_types) in CAM-SIMA instead of in-module

if (energy_formula == ENERGY_FORMULA_DYCORE_FV) then
! FV: moist pressure vertical coordinate does not need update.
else if (energy_formula == ENERGY_FORMULA_DYCORE_SE) then
! SE

! **TEMP** TODO hplin 9/17/24:
! for compatibility with CAM-SIMA that allocates thermodynamic_active_species_idx(0:num_advected)
! (whereas CAM only allocates 1-indexed) I subset it here. This should be verified during code
! review.
! Note: species index subset to 1: because SIMA currently uses index 0. See #334.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be good to make it clear that #334 is a Github issue:

Suggested change
! Note: species index subset to 1: because SIMA currently uses index 0. See #334.
! Note: species index subset to 1: because SIMA currently uses index 0. See Github issue #334 in ESCOMP/CAM-SIMA.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, fixed!

call get_cp(mmr(:ncol,:,:), .false., cp_or_cv_dycore(:ncol,:), &
factor=to_dry_factor, active_species_idx_dycore=thermodynamic_active_species_idx(1:), &
cpdry=cpairv(:ncol,:))
else if (energy_formula == ENERGY_FORMULA_DYCORE_MPAS) then
! MPAS
! Note: species index subset to 1: because SIMA currently uses index 0. See #334.
call get_R(mmr(:ncol,:,:), thermodynamic_active_species_idx(1:), &
cp_or_cv_dycore(:ncol,:), fact=to_dry_factor, Rdry=rairv(:ncol,:))

! internal energy coefficient for MPAS
! (equation 92 in Eldred et al. 2023; https://rmets.onlinelibrary.wiley.com/doi/epdf/10.1002/qj.4353)
! (equation 92 in Eldred et al. 2023; doi:10.1002/qj.4353)
cp_or_cv_dycore(:ncol,:) = cp_or_cv_dycore(:ncol,:) * (cpairv(:ncol,:) - rairv(:ncol,:)) / rairv(:ncol,:)
else
call endrun(subname//': dycore energy formula not supported')
call endrun(subname//': dycore energy formula (value = '//stringify((/energy_formula/))//') not supported')
end if

end subroutine water_composition_update

!===========================================================================
Expand Down Expand Up @@ -696,14 +692,14 @@ subroutine get_cp_1hd(tracer, inv_cp, cp, factor, active_species_idx_dycore, cpd
! Dummy arguments
! tracer: Tracer array
!
! factor not present then tracer must be dry mixing ratio
! if factor present tracer*factor must be dry mixing ratio
! if factor not present then tracer must be a dry mixing ratio
! if factor present tracer*factor must be a dry mixing ratio
!
real(kind_phys), intent(in) :: tracer(:,:,:)
! inv_cp: output inverse cp instead of cp
logical, intent(in) :: inv_cp
real(kind_phys), intent(out) :: cp(:,:)
! dp: if provided then tracer is mass not mixing ratio
! if provided then tracer is not a mass mixing ratio
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might want to specify that is a dry mass mixing ratio (?):

Suggested change
! if provided then tracer is not a mass mixing ratio
! if provided then tracer is not a dry mass mixing ratio

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, updated!

real(kind_phys), optional, intent(in) :: factor(:,:)
! active_species_idx_dycore: array of indices for index of
! thermodynamic active species in dycore tracer array
Expand Down
38 changes: 28 additions & 10 deletions src/data/cam_thermo.F90
Original file line number Diff line number Diff line change
Expand Up @@ -218,17 +218,18 @@ end subroutine cam_thermo_init
!
!***************************************************************************
!
subroutine cam_thermo_dry_air_update(mmr, T, ncol, update_thermo_variables, to_dry_factor)
subroutine cam_thermo_dry_air_update(mmr, T, ncol, pver, update_thermo_variables, to_dry_factor)
use air_composition, only: dry_air_composition_update
use air_composition, only: update_zvirv
use string_utils, only: to_str
use string_utils, only: stringify

real(kind_phys), intent(in) :: mmr(:,:,:) ! constituents array (mmr = dry mixing ratio, if not use to_dry_factor to convert)
real(kind_phys), intent(in) :: T(:,:) ! temperature
integer, intent(in) :: pver ! number of vertical levels
integer, intent(in) :: ncol ! number of columns
logical, intent(in) :: update_thermo_variables ! true: calculate composition-dependent thermo variables
! false: do not calculate composition-dependent thermo variables
real(kind_phys), optional, intent(in) :: to_dry_factor(:,:) ! if mmr moist convert
real(kind_phys), optional, intent(in) :: to_dry_factor(:,:) ! conversion factor to dry if mmr is wet or moist

! Local vars
real(kind_phys) :: sponge_factor(SIZE(mmr, 2))
Expand All @@ -240,7 +241,10 @@ subroutine cam_thermo_dry_air_update(mmr, T, ncol, update_thermo_variables, to_d

if (present(to_dry_factor)) then
if (SIZE(to_dry_factor, 1) /= ncol) then
call endrun(subname//'DIM 1 of to_dry_factor is'//to_str(SIZE(to_dry_factor,1))//'but should be'//to_str(ncol))
call endrun(subname//'DIM 1 of to_dry_factor is'//stringify((/SIZE(to_dry_factor,1)/))//'but should be'//stringify((/ncol/)))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you might want to add spaces here:

Suggested change
call endrun(subname//'DIM 1 of to_dry_factor is'//stringify((/SIZE(to_dry_factor,1)/))//'but should be'//stringify((/ncol/)))
call endrun(subname//'DIM 1 of to_dry_factor is '//stringify((/SIZE(to_dry_factor,1)/))//' but should be '//stringify((/ncol/)))

I have this same request for the other related endrun calls below as well.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, added!

end if
if (SIZE(to_dry_factor, 2) /= pver) then
call endrun(subname//'DIM 2 of to_dry_factor is'//stringify((/SIZE(to_dry_factor,2)/))//'but should be'//stringify((/pver/)))
end if
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like we are only checking the first dimension (ncol) here. Should we also be checking the second dimension (e.g. pver) as well?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good question, I just inherited a lot of this from CAM which also strangely just checks the first dimension. I guess the reason is that pver was not passed in.

I can add the check, but I also wanted to mention that nowhere in the code this to_dry_factor is used (in SIMA or CAM with SE/FV/MPAS) so I don't know if there is a particular reason we want to keep it (the underlying subroutines also changed the factor definition from dry-to-moist to moist-to-dry)? Maybe @PeterHjortLauritzen could chime in on the purpose of this. Thanks!

end if

Expand All @@ -263,18 +267,32 @@ end subroutine cam_thermo_dry_air_update
!
!***************************************************************************
!
subroutine cam_thermo_water_update(mmr, ncol, energy_formula, to_dry_factor)
subroutine cam_thermo_water_update(mmr, ncol, pver, energy_formula, cp_or_cv_dycore, to_dry_factor)
use air_composition, only: water_composition_update
use string_utils, only: stringify
!-----------------------------------------------------------------------
! Update the physics "constants" that vary
!-------------------------------------------------------------------------

real(kind_phys), intent(in) :: mmr(:,:,:) ! constituents array
integer, intent(in) :: ncol ! number of columns
integer, intent(in) :: energy_formula
real(kind_phys), optional, intent(in) :: to_dry_factor(:,:)
real(kind_phys), intent(in) :: mmr(:,:,:) ! constituents array (mmr = dry mixing ratio, if not use to_dry_factor to convert)
integer, intent(in) :: ncol ! number of columns
integer, intent(in) :: pver ! number of vertical levels
integer, intent(in) :: energy_formula
real(kind_phys), intent(out) :: cp_or_cv_dycore(:,:) ! enthalpy or heat capacity, dycore dependent [J K-1 kg-1]
real(kind_phys), optional, intent(in) :: to_dry_factor(:,:)

character(len=*), parameter :: subname = 'cam_thermo_water_update: '

if (present(to_dry_factor)) then
if (SIZE(to_dry_factor, 1) /= ncol) then
call endrun(subname//'DIM 1 of to_dry_factor is'//stringify((/SIZE(to_dry_factor,1)/))//'but should be'//stringify((/ncol/)))
end if
if (SIZE(to_dry_factor, 2) /= pver) then
call endrun(subname//'DIM 2 of to_dry_factor is'//stringify((/SIZE(to_dry_factor,2)/))//'but should be'//stringify((/pver/)))
end if
end if

call water_composition_update(mmr, ncol, energy_formula, to_dry_factor=to_dry_factor)
call water_composition_update(mmr, ncol, energy_formula, cp_or_cv_dycore, to_dry_factor=to_dry_factor)
end subroutine cam_thermo_water_update

!===========================================================================
Expand Down
6 changes: 4 additions & 2 deletions src/data/cam_thermo_formula.F90
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
module cam_thermo_formula

use runtime_obj, only: unset_int

implicit none
private
save
Expand All @@ -17,9 +19,9 @@ module cam_thermo_formula
!! \htmlinclude cam_thermo_formula.html
! energy_formula_dycore: energy formula used for dynamical core
! written by the dynamical core
integer, public :: energy_formula_dycore
integer, public :: energy_formula_dycore = unset_int
! energy_formula_physics: energy formula used for physics
integer, public :: energy_formula_physics = ENERGY_FORMULA_DYCORE_FV
integer, public :: energy_formula_physics = unset_int

! Public subroutines
public :: cam_thermo_formula_init
Expand Down
4 changes: 2 additions & 2 deletions src/data/registry.xml
Original file line number Diff line number Diff line change
Expand Up @@ -264,15 +264,15 @@
<variable local_name="dycore_energy_consistency_adjust"
standard_name="flag_for_dycore_energy_consistency_adjustment"
units="flag" type="logical">
<long_name>flag indicating if dynamical core energy not consistent with CAM physics and to perform adjustment of temperature and temperature tendency</long_name>
<long_name>flag indicating if dynamical core energy is not consistent with CAM physics and to perform adjustment of temperature and temperature tendency</long_name>
<initial_value>.false.</initial_value>
<initial_value dycore="SE,MPAS">.true.</initial_value>
</variable>
<!-- Timestep properties -->
<variable local_name="is_first_timestep"
standard_name="is_first_timestep"
units="flag" type="logical">
<long_name>flag indicating if is first timestep of initial run</long_name>
<long_name>flag indicating if it is the first timestep of an initial run</long_name>
</variable>
<!-- State tendencies -->
<variable local_name="dTdt_total"
Expand Down
22 changes: 17 additions & 5 deletions src/dynamics/mpas/dyn_coupling.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ module dyn_coupling
! Modules from CAM-SIMA.
use cam_abortutils, only: check_allocate, endrun
use cam_constituents, only: const_is_water_species, const_qmin, num_advected
use cam_thermo, only: cam_thermo_update
use cam_thermo, only: cam_thermo_dry_air_update, cam_thermo_water_update
use cam_thermo_formula, only: ENERGY_FORMULA_DYCORE_MPAS
use dyn_comp, only: dyn_debug_print, dyn_exchange_constituent_state, reverse, mpas_dynamical_core, &
ncells_solve
use dynconst, only: constant_cpd => cpair, constant_g => gravit, constant_p0 => pref, &
Expand All @@ -18,6 +19,7 @@ module dyn_coupling
use physics_types, only: cappav, cpairv, rairv, zvirv, &
dtime_phys, lagrangian_vertical, &
phys_state, phys_tend
use physics_types, only: cp_or_cv_dycore
use qneg, only: qneg_run
use static_energy, only: update_dry_static_energy_run
use string_utils, only: stringify
Expand Down Expand Up @@ -326,15 +328,25 @@ subroutine set_physics_state_external()
call endrun('Failed to find variable "constituent_properties"', subname, __LINE__)
end if

! Update `cappav`, `cpairv`, `rairv`, `zvirv`, etc. as needed by calling `cam_thermo_update`.
! Update `cappav`, `cpairv`, `rairv`, `zvirv`, etc. as needed by calling `cam_thermo_dry_air_update`.
! Note that this subroutine expects constituents to be dry.
call cam_thermo_update( &
constituents, phys_state % t, ncells_solve, cam_runtime_opts % update_thermodynamic_variables())
call cam_thermo_dry_air_update( &
constituents, phys_state % t, ncells_solve, pver, cam_runtime_opts % update_thermodynamic_variables())

! update cp_or_cv_dycore in SIMA state.
! (note: at this point q is dry)
call cam_thermo_water_update( &
mmr = constituents, & ! dry MMR
ncol = ncells_solve, &
pver = pver, &
energy_formula = ENERGY_FORMULA_DYCORE_MPAS, &
cp_or_cv_dycore = cp_or_cv_dycore &
)

! This variable name is really misleading. It actually represents the reciprocal of Exner function
! with respect to surface pressure. This definition is sometimes used for boundary layer work. See
! the paragraph below equation 1.5.1c in doi:10.1007/978-94-009-3027-8.
! Also note that `cappav` is updated externally by `cam_thermo_update`.
! Also note that `cappav` is updated externally by `cam_thermo_dry_air_update`.
do i = 1, ncells_solve
phys_state % exner(i, :) = (phys_state % ps(i) / phys_state % pmid(i, :)) ** cappav(i, :)
end do
Expand Down
2 changes: 1 addition & 1 deletion src/dynamics/none/dyn_grid.F90
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ subroutine model_grid_init()
use pio, only: PIO_BCAST_ERROR, pio_seterrorhandling
use pio, only: pio_get_var, pio_freedecomp
use pio, only: pio_read_darray
use pio, only: pio_inq_att
use spmd_utils, only: npes, iam
use cam_pio_utils, only: cam_pio_handle_error, cam_pio_find_var
use cam_pio_utils, only: cam_pio_var_info, pio_subsystem
Expand Down Expand Up @@ -688,6 +687,7 @@ subroutine find_energy_formula(file, grid_is_latlon)
if(energy_formula_dycore /= -1) then
call mark_as_initialized("total_energy_formula_for_dycore")
endif
call mark_as_initialized("flag_for_dycore_energy_consistency_adjustment")

! Mark other energy variables calculated by check_energy_timestep_init
! here since it will always run when required
Expand Down
19 changes: 8 additions & 11 deletions src/dynamics/se/dp_coupling.F90
Original file line number Diff line number Diff line change
Expand Up @@ -588,11 +588,11 @@ subroutine derived_phys_dry(cam_runtime_opts, phys_state, phys_tend)
use air_composition, only: thermodynamic_active_species_idx
use air_composition, only: dry_air_species_num
use physics_types, only: cpairv, rairv, zvirv, cappav
use physics_types, only: cp_or_cv_dycore
use physics_grid, only: columns_on_task
use geopotential_temp, only: geopotential_temp_run
use static_energy, only: update_dry_static_energy_run
use qneg, only: qneg_run
! use check_energy_chng, only: check_energy_chng_timestep_init
use hycoef, only: hyai, ps0
use shr_vmath_mod, only: shr_vmath_log
use shr_kind_mod, only: shr_kind_cx
Expand Down Expand Up @@ -793,20 +793,23 @@ subroutine derived_phys_dry(cam_runtime_opts, phys_state, phys_tend)
mmr = const_data_ptr, & ! dry MMR
T = phys_state%t, &
ncol = pcols, &
pver = pver, &
update_thermo_variables = cam_runtime_opts%update_thermodynamic_variables() &
)
else
zvirv(:,:) = zvir
end if

!
! update cp_or_cv_dycore in module air_composition.
! update cp_or_cv_dycore in SIMA state.
! (note: at this point q is dry)
!
call cam_thermo_water_update( &
mmr = const_data_ptr, & ! dry MMR
ncol = pcols, &
energy_formula = ENERGY_FORMULA_DYCORE_SE &
mmr = const_data_ptr, & ! dry MMR
ncol = pcols, &
pver = pver, &
energy_formula = ENERGY_FORMULA_DYCORE_SE, &
cp_or_cv_dycore = cp_or_cv_dycore &
)

!$omp parallel do num_threads(horz_num_threads) private (k, i)
Expand Down Expand Up @@ -853,12 +856,6 @@ subroutine derived_phys_dry(cam_runtime_opts, phys_state, phys_tend)
phys_state%phis, phys_state%dse, cpairv, &
errflg, errmsg)

!Remove once check_energy scheme exists in CAMDEN:
#if 0
! Compute energy and water integrals of input state
! call check_energy_chng_timestep_init(...)
#endif

end subroutine derived_phys_dry

!=========================================================================================
Expand Down
Loading
Loading