Source code for compass.ocean.tests.soma.soma_test_case

from compass.testcase import TestCase
from compass.ocean.tests.soma.initial_state import InitialState
from compass.ocean.tests.soma.forward import Forward
from compass.ocean.tests.soma.analysis import Analysis
from compass.validate import compare_variables, compare_timers


[docs]class SomaTestCase(TestCase): """ The class for all test cases in the SOMA test group. The test case creates the mesh and initial condition, then performs a forward run with analysis members. An analysis step is included if the simulation includes particles. Attributes ---------- resolution : str The resolution of the test case with_particles : bool Whether particles are include in the simulation with_surface_restoring : bool Whether surface restoring is included in the simulation long : bool Whether to run a long (3-year) simulation to quasi-equilibrium three_layer : bool Whether to use only 3 vertical layers and no continental shelf """
[docs] def __init__(self, test_group, resolution, with_particles, with_surface_restoring, long, three_layer): """ Create the test case Parameters ---------- test_group : compass.ocean.tests.soma.Soma The test group that this test case belongs to resolution : str The resolution of the test case with_particles : bool Whether particles are include in the simulation with_surface_restoring : bool Whether surface restoring is included in the simulation long : bool Whether to run a long (3-year) simulation to quasi-equilibrium three_layer : bool Whether to use only 3 vertical layers and no continental shelf """ self.resolution = resolution self.with_particles = with_particles self.with_surface_restoring = with_surface_restoring self.long = long self.three_layer = three_layer name = None if three_layer: name = 'three_layer' if long: if name is None: name = 'long' else: name = f'{name}_long' if with_surface_restoring: if name is None: name = 'surface_restoring' else: name = f'{name}_with_surface_restoring' if with_particles: if name is None: name = 'particles' else: name = f'{name}_with_particles' if name is None: name = 'default' subdir = f'{resolution}/{name}' super().__init__(test_group=test_group, name=name, subdir=subdir) self.add_step(InitialState( test_case=self, resolution=resolution, with_surface_restoring=with_surface_restoring, three_layer=three_layer)) options = dict() if with_surface_restoring: options['config_use_activeTracers_surface_restoring'] = '.true.' self.add_step(Forward( test_case=self, resolution=resolution, with_particles=with_particles, with_surface_restoring=with_surface_restoring, long=long, three_layer=three_layer)) if with_particles: self.add_step(Analysis(test_case=self, resolution=resolution))
def configure(self): """ Set config options that are different from the defaults """ if self.three_layer: config = self.config # remove the continental shelf config.set('soma', 'phi', '1e-16') config.set('soma', 'shelf_depth', '0.0')
[docs] def validate(self): """ Test cases can override this method to perform validation of variables """ variables = ['bottomDepth', 'layerThickness', 'maxLevelCell', 'temperature', 'salinity'] compare_variables( test_case=self, variables=variables, filename1='initial_state/initial_state.nc') variables = ['temperature', 'layerThickness'] compare_variables( test_case=self, variables=variables, filename1='forward/output/output.0001-01-01_00.00.00.nc') if self.with_particles: # just do particle validation at coarse res variables = [ 'xParticle', 'yParticle', 'zParticle', 'zLevelParticle', 'buoyancyParticle', 'indexToParticleID', 'currentCell', 'transfered', 'numTimesReset'] compare_variables(test_case=self, variables=variables, filename1='forward/analysis_members/' 'lagrPartTrack.0001-01-01_00.00.00.nc') timers = ['init_lagrPartTrack', 'compute_lagrPartTrack', 'write_lagrPartTrack', 'restart_lagrPartTrack', 'finalize_lagrPartTrack'] compare_timers(self, timers, rundir1='forward')