Skip to content

Commit 395fe91

Browse files
committed
Merge remote-tracking branch 'upstream/development' into cam_sima_testing
2 parents 3c5ac5e + fb0e870 commit 395fe91

15 files changed

+2161
-1096
lines changed

cime_config/buildlib

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ def _setup_mpas(case: Case) -> None:
189189

190190
shutil.copytree(mpas_dycore_src_root, mpas_dycore_bld_root, copy_function=_copy2_as_needed, dirs_exist_ok=True)
191191
shutil.move(os.path.join(mpas_dycore_bld_root, "Makefile"), os.path.join(mpas_dycore_bld_root, "Makefile.CESM"))
192-
_copy2_as_needed(os.path.normpath(os.path.join(mpas_dycore_src_root, os.pardir, os.pardir, "driver", "dyn_mpas_subdriver.F90")), os.path.join(mpas_dycore_bld_root, "driver"))
193-
_copy2_as_needed(os.path.normpath(os.path.join(mpas_dycore_src_root, os.pardir, os.pardir, "Makefile")), mpas_dycore_bld_root)
194-
_copy2_as_needed(os.path.normpath(os.path.join(mpas_dycore_src_root, os.pardir, os.pardir, "Makefile.in.CESM")), mpas_dycore_bld_root)
192+
193+
shutil.copytree(os.path.normpath(os.path.join(mpas_dycore_src_root, os.pardir, os.pardir, "assets")), mpas_dycore_bld_root, copy_function=_copy2_as_needed, dirs_exist_ok=True)
194+
shutil.copytree(os.path.normpath(os.path.join(mpas_dycore_src_root, os.pardir, os.pardir, "driver")), os.path.join(mpas_dycore_bld_root, "driver"), copy_function=_copy2_as_needed, dirs_exist_ok=True)
195195

196196
def _copy2_as_needed(src: str, dst: str) -> None:
197197
"""

cime_config/namelist_definition_cam.xml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,16 @@
149149
<value dyn="se" hgrid="ne30np4" nlev="70" sim_year="1850">${DIN_LOC_ROOT}/atm/waccm/ic/waccm5_1850_ne30np4_L70_0001-01-11-00000_c151217.nc</value>
150150
<value dyn="se" hgrid="ne30np4" nlev="70">${DIN_LOC_ROOT}/atm/waccm/ic/fw2000_ne30np4_L70_c181221.nc</value>
151151
<value hgrid="64x128" nlev="30" scam="1">${DIN_LOC_ROOT}/atm/cam/inic/gaus/cami_0000-09-01_64x128_L30_c031210.nc</value>
152-
<value dyn="mpas" hgrid="mpasa120" nlev="32" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa120_L32_notopo_coords_c201216.nc</value>
153-
<value dyn="mpas" hgrid="mpasa480" nlev="32" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa480_L32_notopo_coords_c201125.nc</value>
152+
<value dyn="mpas" hgrid="mpasa480" nlev="32" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa480_L32_notopo_coords_c240507.nc</value>
153+
<value dyn="mpas" hgrid="mpasa120" nlev="32" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa120_L32_notopo_coords_c240507.nc</value>
154+
<value dyn="mpas" hgrid="mpasa60" nlev="32" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa60_L32_notopo_coords_c240507.nc</value>
155+
<value dyn="mpas" hgrid="mpasa30" nlev="32" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa30_L32_notopo_coords_c240507.nc</value>
156+
<value dyn="mpas" hgrid="mpasa480" nlev="58" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa480_L58_notopo_coords_c240814.nc</value>
157+
<value dyn="mpas" hgrid="mpasa120" nlev="58" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa120_L58_notopo_coords_c240814.nc</value>
158+
<value dyn="mpas" hgrid="mpasa60" nlev="58" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa60_L58_notopo_coords_c240814.nc</value>
159+
<value dyn="mpas" hgrid="mpasa480" nlev="93" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa480_L93_notopo_coords_c240814.nc</value>
160+
<value dyn="mpas" hgrid="mpasa120" nlev="93" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa120_L93_notopo_coords_c240814.nc</value>
161+
<value dyn="mpas" hgrid="mpasa60" nlev="93" analytic_ic="1">${DIN_LOC_ROOT}/atm/cam/inic/mpas/mpasa60_L93_notopo_coords_c240814.nc</value>
154162
</values>
155163
</entry>
156164
<entry id="pertlim">
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Kuan-Chih Wang <kuanchihw@ucar.edu>
3+
Date: Mon, 1 Apr 2024 16:46:50 -0600
4+
Subject: [PATCH] Prefix all MPAS namelist group and option names
5+
6+
The following transformations are performed for each MPAS namelist group and
7+
option name:
8+
9+
1. Leading `config_` is removed recursively from the name. Case-insensitive.
10+
2. Leading `mpas_` is removed recursively from the name. Case-insensitive.
11+
3. Prepend `mpas_` to the name.
12+
13+
As a result, it is easier to distinguish MPAS namelist groups and options from
14+
CAM-SIMA ones. Note that only namelist I/O is affected. Internally, MPAS still
15+
refers to its namelist options by their original names due to compatibility reasons.
16+
17+
This downstream patch is maintained by CAM-SIMA for its particular use case of MPAS.
18+
---
19+
src/tools/registry/gen_inc.c | 80 +++++++++++++++++++++++++++++++++++-
20+
src/tools/registry/gen_inc.h | 4 ++
21+
2 files changed, 82 insertions(+), 2 deletions(-)
22+
23+
diff --git a/src/tools/registry/gen_inc.c b/src/tools/registry/gen_inc.c
24+
index 94f5f714..95b2502c 100644
25+
--- a/src/tools/registry/gen_inc.c
26+
+++ b/src/tools/registry/gen_inc.c
27+
@@ -15,6 +15,10 @@
28+
#include "fortprintf.h"
29+
#include "utility.h"
30+
31+
+#ifdef MPAS_CAM_DYCORE
32+
+#include <ctype.h>
33+
+#endif
34+
+
35+
void process_core_macro(const char *macro, const char *val, va_list ap);
36+
void process_domain_macro(const char *macro, const char *val, va_list ap);
37+
38+
@@ -696,8 +700,18 @@ int parse_namelist_records_from_registry(ezxml_t registry)/*{{{*/
39+
ezxml_t nmlrecs_xml, nmlopt_xml;
40+
41+
const char *const_core;
42+
- const char *nmlrecname, *nmlrecindef, *nmlrecinsub;
43+
- const char *nmloptname, *nmlopttype, *nmloptval, *nmloptunits, *nmloptdesc, *nmloptposvals, *nmloptindef;
44+
+#ifdef MPAS_CAM_DYCORE
45+
+ const char *orinmlrecname;
46+
+ const char *orinmloptname;
47+
+ // Fortran variable names have a length limit of 63 characters. +1 for the terminating null character.
48+
+ char nmlrecname[64];
49+
+ char nmloptname[64];
50+
+#else
51+
+ const char *nmlrecname;
52+
+ const char *nmloptname;
53+
+#endif
54+
+ const char *nmlrecindef, *nmlrecinsub;
55+
+ const char *nmlopttype, *nmloptval, *nmloptunits, *nmloptdesc, *nmloptposvals, *nmloptindef;
56+
57+
char pool_name[1024];
58+
char core_string[1024];
59+
@@ -743,7 +757,12 @@ int parse_namelist_records_from_registry(ezxml_t registry)/*{{{*/
60+
61+
// Parse Namelist Records
62+
for (nmlrecs_xml = ezxml_child(registry, "nml_record"); nmlrecs_xml; nmlrecs_xml = nmlrecs_xml->next){
63+
+#ifdef MPAS_CAM_DYCORE
64+
+ orinmlrecname = ezxml_attr(nmlrecs_xml, "name");
65+
+ transform_name(nmlrecname, sizeof(nmlrecname), orinmlrecname);
66+
+#else
67+
nmlrecname = ezxml_attr(nmlrecs_xml, "name");
68+
+#endif
69+
nmlrecindef = ezxml_attr(nmlrecs_xml, "in_defaults");
70+
nmlrecinsub = ezxml_attr(nmlrecs_xml, "in_subpool");
71+
72+
@@ -777,7 +796,12 @@ int parse_namelist_records_from_registry(ezxml_t registry)/*{{{*/
73+
74+
// Define variable definitions prior to reading the namelist in.
75+
for (nmlopt_xml = ezxml_child(nmlrecs_xml, "nml_option"); nmlopt_xml; nmlopt_xml = nmlopt_xml->next){
76+
+#ifdef MPAS_CAM_DYCORE
77+
+ orinmloptname = ezxml_attr(nmlopt_xml, "name");
78+
+ transform_name(nmloptname, sizeof(nmloptname), orinmloptname);
79+
+#else
80+
nmloptname = ezxml_attr(nmlopt_xml, "name");
81+
+#endif
82+
nmlopttype = ezxml_attr(nmlopt_xml, "type");
83+
nmloptval = ezxml_attr(nmlopt_xml, "default_value");
84+
nmloptunits = ezxml_attr(nmlopt_xml, "units");
85+
@@ -809,7 +833,12 @@ int parse_namelist_records_from_registry(ezxml_t registry)/*{{{*/
86+
// Define the namelist block, to read the namelist record in.
87+
fortprintf(fd, " namelist /%s/ &\n", nmlrecname);
88+
for (nmlopt_xml = ezxml_child(nmlrecs_xml, "nml_option"); nmlopt_xml; nmlopt_xml = nmlopt_xml->next){
89+
+#ifdef MPAS_CAM_DYCORE
90+
+ orinmloptname = ezxml_attr(nmlopt_xml, "name");
91+
+ transform_name(nmloptname, sizeof(nmloptname), orinmloptname);
92+
+#else
93+
nmloptname = ezxml_attr(nmlopt_xml, "name");
94+
+#endif
95+
if(nmlopt_xml->next){
96+
fortprintf(fd, " %s, &\n", nmloptname);
97+
} else {
98+
@@ -840,7 +869,12 @@ int parse_namelist_records_from_registry(ezxml_t registry)/*{{{*/
99+
// Define broadcast calls for namelist values.
100+
fortprintf(fd, " if (ierr <= 0) then\n");
101+
for (nmlopt_xml = ezxml_child(nmlrecs_xml, "nml_option"); nmlopt_xml; nmlopt_xml = nmlopt_xml->next){
102+
+#ifdef MPAS_CAM_DYCORE
103+
+ orinmloptname = ezxml_attr(nmlopt_xml, "name");
104+
+ transform_name(nmloptname, sizeof(nmloptname), orinmloptname);
105+
+#else
106+
nmloptname = ezxml_attr(nmlopt_xml, "name");
107+
+#endif
108+
nmlopttype = ezxml_attr(nmlopt_xml, "type");
109+
110+
if(strncmp(nmlopttype, "real", 1024) == 0){
111+
@@ -858,7 +892,12 @@ int parse_namelist_records_from_registry(ezxml_t registry)/*{{{*/
112+
fortprintf(fd, " call mpas_log_write(' The following values will be used for variables in this record:')\n");
113+
fortprintf(fd, " call mpas_log_write(' ')\n");
114+
for (nmlopt_xml = ezxml_child(nmlrecs_xml, "nml_option"); nmlopt_xml; nmlopt_xml = nmlopt_xml->next){
115+
+#ifdef MPAS_CAM_DYCORE
116+
+ orinmloptname = ezxml_attr(nmlopt_xml, "name");
117+
+ transform_name(nmloptname, sizeof(nmloptname), orinmloptname);
118+
+#else
119+
nmloptname = ezxml_attr(nmlopt_xml, "name");
120+
+#endif
121+
nmlopttype = ezxml_attr(nmlopt_xml, "type");
122+
123+
if (strncmp(nmlopttype, "character", 1024) == 0) {
124+
@@ -885,10 +924,18 @@ int parse_namelist_records_from_registry(ezxml_t registry)/*{{{*/
125+
fortprintf(fd, "\n");
126+
127+
for (nmlopt_xml = ezxml_child(nmlrecs_xml, "nml_option"); nmlopt_xml; nmlopt_xml = nmlopt_xml->next){
128+
+#ifdef MPAS_CAM_DYCORE
129+
+ orinmloptname = ezxml_attr(nmlopt_xml, "name");
130+
+ transform_name(nmloptname, sizeof(nmloptname), orinmloptname);
131+
+
132+
+ fortprintf(fd, " call mpas_pool_add_config(%s, '%s', %s)\n", pool_name, orinmloptname, nmloptname);
133+
+ fortprintf(fcg, " call mpas_pool_get_config(configPool, '%s', %s)\n", orinmloptname, nmloptname);
134+
+#else
135+
nmloptname = ezxml_attr(nmlopt_xml, "name");
136+
137+
fortprintf(fd, " call mpas_pool_add_config(%s, '%s', %s)\n", pool_name, nmloptname, nmloptname);
138+
fortprintf(fcg, " call mpas_pool_get_config(configPool, '%s', %s)\n", nmloptname, nmloptname);
139+
+#endif
140+
}
141+
fortprintf(fd, "\n");
142+
fortprintf(fcg, "\n");
143+
@@ -2532,3 +2579,32 @@ int parse_structs_from_registry(ezxml_t registry)/*{{{*/
144+
145+
return 0;
146+
}/*}}}*/
147+
+
148+
+
149+
+#ifdef MPAS_CAM_DYCORE
150+
+// Perform transformations for namelist group and option names.
151+
+void transform_name(char *new_name, const size_t new_name_size, const char *old_name) {
152+
+ const char *const new_prefix = "mpas_";
153+
+ const char *const old_prefix = "config_";
154+
+ size_t size = 0;
155+
+
156+
+ if (!new_name || !old_name || new_name_size == 0) return;
157+
+
158+
+ // Remove all leading whitespaces by moving pointer forward.
159+
+ while (*old_name != '\0' && isspace((unsigned char) *old_name)) old_name++;
160+
+
161+
+ // Remove all leading `config_` by moving pointer forward.
162+
+ while (strncasecmp(old_name, old_prefix, strlen(old_prefix)) == 0) old_name += strlen(old_prefix);
163+
+
164+
+ // Remove all leading `mpas_` by moving pointer forward.
165+
+ while (strncasecmp(old_name, new_prefix, strlen(new_prefix)) == 0) old_name += strlen(new_prefix);
166+
+
167+
+ *new_name = '\0';
168+
+ size = snprintf(NULL, 0, "%s%s", new_prefix, old_name) + 1;
169+
+ snprintf(new_name, size > new_name_size ? new_name_size : size, "%s%s", new_prefix, old_name);
170+
+
171+
+ // Remove all trailing whitespaces by zeroing (nulling) out.
172+
+ new_name += strlen(new_name) - 1;
173+
+ while (*new_name != '\0' && isspace((unsigned char) *new_name)) *new_name-- = '\0';
174+
+}
175+
+#endif
176+
diff --git a/src/tools/registry/gen_inc.h b/src/tools/registry/gen_inc.h
177+
index fc94e78b..69a76ace 100644
178+
--- a/src/tools/registry/gen_inc.h
179+
+++ b/src/tools/registry/gen_inc.h
180+
@@ -38,3 +38,7 @@ int push_attributes(ezxml_t currentPosition);
181+
int merge_structs_and_var_arrays(ezxml_t currentPosition);
182+
int merge_streams(ezxml_t registry);
183+
int parse_structs_from_registry(ezxml_t registry);
184+
+
185+
+#ifdef MPAS_CAM_DYCORE
186+
+void transform_name(char *new_name, const size_t new_name_size, const char *old_name);
187+
+#endif
188+
--
189+
2.43.0
190+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Kuan-Chih Wang <kuanchihw@ucar.edu>
3+
Date: Thu, 1 Aug 2024 17:09:58 -0600
4+
Subject: [PATCH] Disable physics for MPAS dycore-only build
5+
6+
When building MPAS as a dycore, all physics-related components are disabled.
7+
This build configuration is usually used by CAM/CAM-SIMA, and can be achieved by
8+
defining the `MPAS_CAM_DYCORE` macro in `CPPFLAGS`.
9+
10+
The `PHYSICS` variable controls whether physics are enabled in MPAS, but its logic
11+
is decoupled from the `MPAS_CAM_DYCORE` macro. Disabling physics in MPAS currently
12+
requires manual interventions.
13+
14+
Therefore, automatically disable physics when the `MPAS_CAM_DYCORE` macro is found
15+
in `CPPFLAGS`.
16+
17+
This downstream patch is maintained by CAM-SIMA for its particular use case of MPAS.
18+
---
19+
src/core_atmosphere/Makefile | 7 +++++--
20+
1 file changed, 5 insertions(+), 2 deletions(-)
21+
22+
diff --git a/src/core_atmosphere/Makefile b/src/core_atmosphere/Makefile
23+
index 8d9f4f1a..cac8255e 100644
24+
--- a/src/core_atmosphere/Makefile
25+
+++ b/src/core_atmosphere/Makefile
26+
@@ -4,8 +4,11 @@
27+
# To build a dycore-only MPAS-Atmosphere model, comment-out or delete
28+
# the definition of PHYSICS, below
29+
#
30+
-PHYSICS=-DDO_PHYSICS
31+
-
32+
+# If MPAS_CAM_DYCORE is found in CPPFLAGS, PHYSICS will become undefined automatically
33+
+#
34+
+ifeq ($(findstring MPAS_CAM_DYCORE,$(CPPFLAGS)),)
35+
+ PHYSICS = -DDO_PHYSICS
36+
+endif
37+
38+
ifdef PHYSICS
39+
PHYSCORE = physcore
40+
--
41+
2.43.0
42+
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Kuan-Chih Wang <kuanchihw@ucar.edu>
3+
Date: Wed, 13 Nov 2024 17:19:10 -0700
4+
Subject: [PATCH] Declare constants at the native precision of MPAS
5+
6+
When building MPAS as a dycore, certain constants in the `mpas_constants` module are
7+
imported from the `physconst` module, which is a part of CAM/CAM-SIMA. However,
8+
multiple issues arise if the precision of those constants differs from MPAS.
9+
10+
For example, building MPAS in single precision mode with CAM-SIMA fails due to
11+
multiple occurrences of type mismatch between actual and dummy arguments.
12+
13+
mpas_geometry_utils.F:885:157:
14+
15+
885 | call mpas_log_write('$r', MPAS_LOG_ERR, realArgs=(/mpas_triangle_signed_area_sphere(a,b,c,sphereRadius) - pii/2.0_RKIND*sphereRadius*sphereRadius/))
16+
| 1
17+
Error: Type mismatch in argument 'realargs' at (1); passed REAL(8) to REAL(4)
18+
19+
Here, `pii` is declared by CAM-SIMA to be double precision, and it causes unintended
20+
floating-point promotion in the expression.
21+
22+
The solution is to ensure that constants in the `mpas_constants` module are declared
23+
at the native precision of MPAS.
24+
25+
This downstream patch is maintained by CAM-SIMA for its particular use case of MPAS.
26+
---
27+
src/framework/mpas_constants.F | 44 ++++++++++++++++++++++++++--------
28+
1 file changed, 34 insertions(+), 10 deletions(-)
29+
30+
diff --git a/src/framework/mpas_constants.F b/src/framework/mpas_constants.F
31+
index c98cb810..68164bab 100644
32+
--- a/src/framework/mpas_constants.F
33+
+++ b/src/framework/mpas_constants.F
34+
@@ -23,16 +23,30 @@ module mpas_constants
35+
use mpas_kind_types
36+
37+
#ifdef MPAS_CAM_DYCORE
38+
- use physconst, only : pii => pi
39+
- use physconst, only : gravity => gravit
40+
- use physconst, only : omega
41+
- use physconst, only : a => rearth
42+
- use physconst, only : cp => cpair
43+
- use physconst, only : rgas => rair
44+
- use physconst, only : rv => rh2o
45+
- real (kind=RKIND) :: rvord = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
46+
- real (kind=RKIND) :: cv = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
47+
- real (kind=RKIND) :: cvpm = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
48+
+ use physconst, only: external_pii => pi
49+
+ use physconst, only: external_a => rearth
50+
+ use physconst, only: external_omega => omega
51+
+ use physconst, only: external_gravity => gravit
52+
+ use physconst, only: external_rgas => rair
53+
+ use physconst, only: external_rv => rh2o
54+
+ use physconst, only: external_cp => cpair
55+
+ private :: external_pii
56+
+ private :: external_a
57+
+ private :: external_omega
58+
+ private :: external_gravity
59+
+ private :: external_rgas
60+
+ private :: external_rv
61+
+ private :: external_cp
62+
+ real (kind=RKIND), protected :: pii = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
63+
+ real (kind=RKIND), protected :: a = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
64+
+ real (kind=RKIND), protected :: omega = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
65+
+ real (kind=RKIND), protected :: gravity = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
66+
+ real (kind=RKIND), protected :: rgas = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
67+
+ real (kind=RKIND), protected :: rv = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
68+
+ real (kind=RKIND), protected :: cp = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
69+
+ real (kind=RKIND), protected :: rvord = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
70+
+ real (kind=RKIND), protected :: cv = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
71+
+ real (kind=RKIND), protected :: cvpm = huge(1.0_RKIND) ! Derived in mpas_constants_compute_derived
72+
#else
73+
real (kind=RKIND), parameter :: pii = 3.141592653589793_RKIND !< Constant: Pi
74+
real (kind=RKIND), parameter :: a = 6371229.0_RKIND !< Constant: Spherical Earth radius [m]
75+
@@ -77,6 +91,16 @@ module mpas_constants
76+
implicit none
77+
78+
#ifdef MPAS_CAM_DYCORE
79+
+ ! Convert external constants to the native precision of MPAS (i.e., `RKIND`).
80+
+
81+
+ pii = real(external_pii, RKIND)
82+
+ a = real(external_a, RKIND)
83+
+ omega = real(external_omega, RKIND)
84+
+ gravity = real(external_gravity, RKIND)
85+
+ rgas = real(external_rgas, RKIND)
86+
+ rv = real(external_rv, RKIND)
87+
+ cp = real(external_cp, RKIND)
88+
+
89+
!
90+
! In the case of CAM-MPAS, rgas may depend on a CAM namelist option,
91+
! so physical constants that depend on rgas must be computed here after
92+
--
93+
2.43.0
94+
File renamed without changes.

0 commit comments

Comments
 (0)