Skip to content

Commit 62eaaff

Browse files
committed
Separate refinement factors config options by refinement type
1 parent 2e96606 commit 62eaaff

File tree

12 files changed

+86
-43
lines changed

12 files changed

+86
-43
lines changed

polaris/ocean/convergence/__init__.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ def get_resolution_for_task(config, refinement_factor,
2323
The resolution corresponding to the refinement_factor and convergence
2424
test type
2525
"""
26+
if refinement == 'both':
27+
option = 'refinement_factors_space'
28+
else:
29+
option = f'refinement_factors_{refinement}'
2630
base_resolution = config.getfloat('convergence', 'base_resolution')
27-
refinement_factors = config.getlist('convergence',
28-
'refinement_factors',
29-
dtype=float)
31+
refinement_factors = config.getlist('convergence', option, dtype=float)
3032

3133
if refinement_factor not in refinement_factors:
3234
raise ValueError(
@@ -63,10 +65,12 @@ def get_timestep_for_task(config, refinement_factor,
6365
test type
6466
"""
6567

68+
if refinement == 'both':
69+
option = 'refinement_factors_space'
70+
else:
71+
option = f'refinement_factors_{refinement}'
6672
base_resolution = config.getfloat('convergence', 'base_resolution')
67-
refinement_factors = config.getlist('convergence',
68-
'refinement_factors',
69-
dtype=float)
73+
refinement_factors = config.getlist('convergence', option, dtype=float)
7074

7175
if refinement_factor not in refinement_factors:
7276
raise ValueError(
@@ -93,7 +97,7 @@ def get_timestep_for_task(config, refinement_factor,
9397
else:
9498
btr_timestep = btr_dt_per_km * resolution
9599
if refinement == 'time':
96-
timestep = dt_per_km * refinement_factor * base_resolution
100+
timestep = dt_per_km * refinement_factor * resolution
97101
elif refinement == 'space':
98102
timestep = dt_per_km * base_resolution
99103
else:

polaris/ocean/convergence/analysis.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
import pandas as pd
66

77
from polaris.mpas import area_for_field, time_index_from_xtime
8-
from polaris.ocean.model import OceanIOStep
98
from polaris.ocean.convergence import (
109
get_resolution_for_task,
1110
get_timestep_for_task,
1211
)
12+
from polaris.ocean.model import OceanIOStep
1313
from polaris.viz import use_mplstyle
1414

1515

@@ -123,8 +123,11 @@ def setup(self):
123123
"""
124124
config = self.config
125125
dependencies = self.dependencies_dict
126-
refinement_factors = config.getlist('convergence',
127-
'refinement_factors',
126+
if self.refinement == 'time':
127+
option = 'refinement_factors_time'
128+
else:
129+
option = 'refinement_factors_space'
130+
refinement_factors = config.getlist('convergence', option,
128131
dtype=float)
129132
for refinement_factor in refinement_factors:
130133
base_mesh = dependencies['mesh'][refinement_factor]
@@ -175,8 +178,13 @@ def plot_convergence(self, variable_name, title, zidx):
175178
field_name=variable_name)
176179

177180
error = []
178-
refinement_factors = config.getlist('convergence',
179-
'refinement_factors',
181+
if self.refinement == 'time':
182+
option = 'refinement_factors_time'
183+
header = 'time step'
184+
else:
185+
option = 'refinement_factors_space'
186+
header = 'resolution'
187+
refinement_factors = config.getlist('convergence', option,
180188
dtype=float)
181189
resolutions = list()
182190
timesteps = list()
@@ -203,7 +211,7 @@ def plot_convergence(self, variable_name, title, zidx):
203211
error_array = np.array(error)
204212
filename = f'convergence_{variable_name}.csv'
205213
data = np.stack((refinement_array, error_array), axis=1)
206-
df = pd.DataFrame(data, columns=['resolution', error_type])
214+
df = pd.DataFrame(data, columns=[header, error_type])
207215
df.to_csv(f'convergence_{variable_name}.csv', index=False)
208216

209217
convergence_failed = False

polaris/ocean/convergence/convergence.cfg

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,23 @@
44
convergence_eval_time = 24.0
55

66
# Convergence threshold below which a test fails
7-
convergence_thresh = 1.0
7+
convergence_thresh_space = 1.0
8+
convergence_thresh_time = 1.0
89

910
# Type of error to compute
1011
error_type = l2
1112

12-
# the base mesh resolution (km) to which refinement_factors
13-
# are applied if refinement is 'space' or 'both' on a planar mesh
13+
# the base mesh resolution (km) to which refinement_factors are applied
1414
# base resolutions for spherical meshes are given in section spherical_convergence
1515
base_resolution = 120
1616

17-
# refinement factors for a planar mesh applied to either space or time
17+
# refinement factors for a planar mesh applied to either space or both space and time
1818
# refinement factors for a spherical mesh given in section spherical_convergence
19-
refinement_factors = 4., 2., 1., 0.5
19+
refinement_factors_space = 4., 2., 1., 0.5
20+
21+
# refinement factors for a planar mesh applied to time with the base timestep
22+
# determined by base_resolution * dt_per_km
23+
refinement_factors_time = 1., 0.5, 0.25
2024

2125
# config options for convergence forward steps
2226
[convergence_forward]

polaris/ocean/convergence/forward.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ def dynamic_model_config(self, at_setup):
132132
btr_dt_str = get_time_interval_string(seconds=btr_timestep)
133133

134134
s_per_hour = 3600.
135+
section = config['convergence_forward']
135136
run_duration = section.getfloat('run_duration')
136137
run_duration_str = get_time_interval_string(
137138
seconds=run_duration * s_per_hour)
@@ -140,6 +141,7 @@ def dynamic_model_config(self, at_setup):
140141
output_interval_str = get_time_interval_string(
141142
seconds=output_interval * s_per_hour)
142143

144+
time_integrator = section.get('time_integrator')
143145
time_integrator_map = dict([('RK4', 'RungeKutta4')])
144146
model = config.get('ocean', 'model')
145147
if model == 'omega':

polaris/ocean/convergence/spherical/spherical.cfg

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
icos_base_resolution = 60.
77

88
# The factors by which to scale space or time based on icos_base_resolution
9-
icos_refinement_factors = 8., 4., 2., 1.
9+
icos_refinement_factors_space = 8., 4., 2., 1.
10+
icos_refinement_factors_time = 1., 0.5, 0.25
1011

1112
# The base resolution for the quasi-uniform mesh to which the refinement
1213
# factors are applied
1314
qu_base_resolution = 120.
1415

1516
# The factors by which to scale space or time based on qu_base_resolution
16-
qu_refinement_factors = 0.5, 0.75, 1., 1.25, 1.5, 1.75, 2.
17+
qu_refinement_factors_space = 2., 1.75, 1.5, 1.25, 1., 0.75, 0.5
18+
qu_refinement_factors_time = 1., 0.5, 0.25

polaris/ocean/tasks/cosine_bell/__init__.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,15 +129,16 @@ def _setup_steps(self, refinement):
129129
else:
130130
prefix = 'qu'
131131

132+
if refinement == 'time':
133+
option = 'refinement_factors_time'
134+
else:
135+
option = 'refinement_factors_space'
132136
refinement_factors = config.getlist('spherical_convergence',
133-
f'{prefix}_refinement_factors',
134-
dtype=str)
137+
f'{prefix}_{option}', dtype=str)
135138
refinement_factors = ', '.join(refinement_factors)
136-
config.set('convergence', 'refinement_factors',
137-
value=refinement_factors)
139+
config.set('convergence', option, value=refinement_factors)
138140
refinement_factors = config.getlist('convergence',
139-
'refinement_factors',
140-
dtype=float)
141+
option, dtype=float)
141142

142143
base_resolution = config.getfloat('spherical_convergence',
143144
f'{prefix}_base_resolution')

polaris/ocean/tasks/geostrophic/__init__.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,16 @@ def _setup_steps(self, refinement):
130130
else:
131131
prefix = 'qu'
132132

133+
if refinement == 'time':
134+
option = 'refinement_factors_time'
135+
else:
136+
option = 'refinement_factors_space'
133137
refinement_factors = config.getlist('spherical_convergence',
134-
f'{prefix}_refinement_factors',
135-
dtype=str)
138+
f'{prefix}_{option}', dtype=str)
136139
refinement_factors = ', '.join(refinement_factors)
137-
config.set('convergence', 'refinement_factors',
138-
value=refinement_factors)
140+
config.set('convergence', option, value=refinement_factors)
139141
refinement_factors = config.getlist('convergence',
140-
'refinement_factors',
141-
dtype=float)
142+
option, dtype=float)
142143

143144
base_resolution = config.getfloat('spherical_convergence',
144145
f'{prefix}_base_resolution')

polaris/ocean/tasks/inertial_gravity_wave/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,12 @@ def __init__(self, component, config, refinement='both'):
6666
analysis_dependencies: Dict[str, Dict[float, Step]] = (
6767
dict(mesh=dict(), init=dict(), forward=dict()))
6868

69+
if refinement == 'time':
70+
option = 'refinement_factors_time'
71+
else:
72+
option = 'refinement_factors_space'
6973
refinement_factors = self.config.getlist(
70-
'convergence', 'refinement_factors', dtype=float)
74+
'convergence', option, dtype=float)
7175
timesteps = list()
7276
resolutions = list()
7377
for refinement_factor in refinement_factors:
@@ -119,3 +123,8 @@ def __init__(self, component, config, refinement='both'):
119123
self.add_step(Viz(component=component, resolutions=resolutions,
120124
taskdir=self.subdir),
121125
run_by_default=False)
126+
config.add_from_package('polaris.ocean.convergence',
127+
'convergence.cfg')
128+
config.add_from_package(
129+
'polaris.ocean.tasks.inertial_gravity_wave',
130+
config_filename)

polaris/ocean/tasks/inertial_gravity_wave/inertial_gravity_wave.cfg

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ error_type = l2
6262
base_resolution = 100.
6363

6464
# refinement factors for a planar mesh applied to either space or time
65-
refinement_factors = 2., 1., 0.5, 0.25
65+
refinement_factors_space = 2., 1., 0.5, 0.25
66+
refinement_factors_time = 1., 0.5, 0.25
6667

6768
# config options for spherical convergence tests
6869
[convergence_forward]

polaris/ocean/tasks/manufactured_solution/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ def add_manufactured_solution_tasks(component):
2626
config_filename = 'manufactured_solution.cfg'
2727
filepath = f'{basedir}/{config_filename}'
2828
config = PolarisConfigParser(filepath=filepath)
29+
config.add_from_package('polaris.ocean.convergence',
30+
'convergence.cfg')
31+
config.add_from_package(
32+
'polaris.ocean.tasks.manufactured_solution',
33+
config_filename)
2934
for refinement in ['space', 'time', 'both']:
3035
component.add_task(ManufacturedSolution(component=component,
3136
config=config,
@@ -62,8 +67,12 @@ def __init__(self, component, config, refinement='both'):
6267
analysis_dependencies: Dict[str, Dict[float, Step]] = (
6368
dict(mesh=dict(), init=dict(), forward=dict()))
6469

70+
if refinement == 'time':
71+
option = 'refinement_factors_time'
72+
else:
73+
option = 'refinement_factors_space'
6574
refinement_factors = self.config.getlist(
66-
'convergence', 'refinement_factors', dtype=float)
75+
'convergence', option, dtype=float)
6776
timesteps = list()
6877
resolutions = list()
6978
for refinement_factor in refinement_factors:

0 commit comments

Comments
 (0)