import time
from compass.model import run_model
from compass.step import Step
[docs]class Forward(Step):
"""
A step for performing forward MPAS-Ocean runs as part of the cosine bell
test case
Attributes
----------
resolution : int
The resolution of the (uniform) mesh in km
"""
[docs] def __init__(self, test_case, resolution):
"""
Create a new step
Parameters
----------
test_case : compass.ocean.tests.global_convergence.cosine_bell.CosineBell
The test case this step belongs to
resolution : int
The resolution of the (uniform) mesh in km
"""
super().__init__(test_case=test_case,
name='QU{}_forward'.format(resolution),
subdir='QU{}/forward'.format(resolution))
self.resolution = resolution
# make sure output is double precision
self.add_streams_file('compass.ocean.streams', 'streams.output')
self.add_namelist_file(
'compass.ocean.tests.global_convergence.cosine_bell',
'namelist.forward')
self.add_streams_file(
'compass.ocean.tests.global_convergence.cosine_bell',
'streams.forward')
self.add_input_file(filename='init.nc',
target='../init/initial_state.nc')
self.add_input_file(filename='graph.info',
target='../mesh/graph.info')
self.add_model_as_input()
self.add_output_file(filename='output.nc')
[docs] def setup(self):
"""
Set namelist options base on config options
"""
dt = self.get_dt()
self.add_namelist_options({'config_dt': dt})
[docs] def run(self):
"""
Run this step of the testcase
"""
# update dt in case the user has changed dt_per_km
dt = self.get_dt()
self.update_namelist_at_runtime(options={'config_dt': dt},
out_name='namelist.ocean')
run_model(self)
[docs] def get_dt(self):
"""
Get the time step
Returns
-------
dt : str
the time step in HH:MM:SS
"""
config = self.config
# dt is proportional to resolution: default 30 seconds per km
dt_per_km = config.getint('cosine_bell', 'dt_per_km')
dt = dt_per_km * self.resolution
# https://stackoverflow.com/a/1384565/7728169
dt = time.strftime('%H:%M:%S', time.gmtime(dt))
return dt