From 8e79066326d69ae4b80527cee53fc41149b1929f Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Tue, 22 Mar 2022 18:48:28 -0500 Subject: [PATCH 01/24] Add drying slope case skeleton --- compass/ocean/tests/drying_slope/__init__.py | 21 ++++++++++ .../tests/drying_slope/default/__init__.py | 39 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 compass/ocean/tests/drying_slope/__init__.py create mode 100644 compass/ocean/tests/drying_slope/default/__init__.py diff --git a/compass/ocean/tests/drying_slope/__init__.py b/compass/ocean/tests/drying_slope/__init__.py new file mode 100644 index 0000000000..4ffcbc5507 --- /dev/null +++ b/compass/ocean/tests/drying_slope/__init__.py @@ -0,0 +1,21 @@ +from compass.testgroup import TestGroup +from compass.ocean.tests.drying_slope.default import Default + + +class DryingSlope(TestGroup): + """ + A test group for drying slope (wetting-and-drying) test cases + """ + + def __init__(self, mpas_core): + """ + mpas_core : compass.MpasCore + the MPAS core that this test group belongs to + """ + super().__init__(mpas_core=mpas_core, name='drying_slope') + + for resolution in ['1km']: + for coord_type in ['sigma']: + self.add_test_case( + Default(test_group=self, resolution=resolution, + coord_type=coord_type)) diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py new file mode 100644 index 0000000000..08ffac17c7 --- /dev/null +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -0,0 +1,39 @@ +from compass.testcase import TestCase + + +class Default(TestCase): + """ + The default drying_slope test case + + Attributes + ---------- + resolution : str + The horizontal resolution of the test case + + coord_type : str + The type of vertical coordinate (``z-star``, ``z-level``, etc.) + """ + + def __init__(self, test_group, resolution, coord_type): + """ + Create the test case + + Parameters + ---------- + test_group : compass.ocean.tests.drying_slope.DryingSlope + The test group that this test case belongs to + + resolution : str + The resolution of the test case + + coord_type : str + The type of vertical coordinate (``sigma``, ``single_layer``) + """ + name = 'default' + + self.resolution = resolution + self.coord_type = coord_type + subdir = '{}/{}/{}'.format(resolution, coord_type, name) + super().__init__(test_group=test_group, name=name, + subdir=subdir) + From fbdb00cb0378074092f4bd14a162a90ff5414387 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Thu, 24 Mar 2022 13:40:05 -0500 Subject: [PATCH 02/24] Add drying slope to test cases --- compass/ocean/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/compass/ocean/__init__.py b/compass/ocean/__init__.py index e338431b63..5457480fc2 100644 --- a/compass/ocean/__init__.py +++ b/compass/ocean/__init__.py @@ -1,5 +1,6 @@ from compass.mpas_core import MpasCore from compass.ocean.tests.baroclinic_channel import BaroclinicChannel +from compass.ocean.tests.drying_slope import DryingSlope from compass.ocean.tests.global_convergence import GlobalConvergence from compass.ocean.tests.global_ocean import GlobalOcean from compass.ocean.tests.gotm import Gotm @@ -24,6 +25,7 @@ def __init__(self): super().__init__(name='ocean') self.add_test_group(BaroclinicChannel(mpas_core=self)) + self.add_test_group(DryingSlope(mpas_core=self)) self.add_test_group(GlobalConvergence(mpas_core=self)) self.add_test_group(GlobalOcean(mpas_core=self)) self.add_test_group(Gotm(mpas_core=self)) From 9a6b1cd9a65c58f8d92195aa379ce441c10a4c3d Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Tue, 22 Mar 2022 18:48:52 -0500 Subject: [PATCH 03/24] Transfer namelist and streams files --- .../ocean/tests/drying_slope/namelist.forward | 30 +++++++++++++ .../ocean/tests/drying_slope/namelist.init | 11 +++++ .../ocean/tests/drying_slope/streams.forward | 25 +++++++++++ compass/ocean/tests/drying_slope/streams.init | 42 +++++++++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 compass/ocean/tests/drying_slope/namelist.forward create mode 100644 compass/ocean/tests/drying_slope/namelist.init create mode 100644 compass/ocean/tests/drying_slope/streams.forward create mode 100644 compass/ocean/tests/drying_slope/streams.init diff --git a/compass/ocean/tests/drying_slope/namelist.forward b/compass/ocean/tests/drying_slope/namelist.forward new file mode 100644 index 0000000000..664d58e56a --- /dev/null +++ b/compass/ocean/tests/drying_slope/namelist.forward @@ -0,0 +1,30 @@ +#this list is from forward_template then sigma/*/config_forward*.xml +config_run_duration='0000_12:00:01' +config_dt='0000_00:00:20' +config_time_integrator='RK4' +config_use_tidal_forcing=.true. +config_use_tidal_forcing_tau=60.0 +config_tidal_forcing_type='direct' +config_tidal_forcing_model='monochromatic' +config_tidal_forcing_monochromatic_amp=10.0 +config_tidal_forcing_monochromatic_period=1.0 +config_tidal_forcing_monochromatic_baseline=10.0 +config_eos_linear_alpha=0.0 +config_eos_linear_beta=0.0 +config_vert_coord_movement='impermeable_interfaces' +config_ALE_thickness_proportionality='weights_only' +config_use_wetting_drying=.true. +config_prevent_drying=.true. +config_drying_min_cell_height=1.0e-3 +config_zero_drying_velocity=.true. +config_verify_not_dry=.true. +config_thickness_flux_type='upwind' +config_cvmix_background_viscosity=1e4 +config_use_variable_drag=.true. +config_Rayleigh_friction=.true. +config_Rayleigh_damping_depth_variable=.true. +config_Rayleigh_damping_coeff=0.0025 +#config_Rayleigh_damping_coeff=0.01 #sigma/250m/forward2 +config_use_implicit_bottom_drag=.false. #default is true +config_use_debugTracers=.true. +config_check_ssh_consistency=.true. diff --git a/compass/ocean/tests/drying_slope/namelist.init b/compass/ocean/tests/drying_slope/namelist.init new file mode 100644 index 0000000000..7aa385c6d4 --- /dev/null +++ b/compass/ocean/tests/drying_slope/namelist.init @@ -0,0 +1,11 @@ +config_init_configuration='tidal_boundary' +config_ocean_run_mode = 'init' +config_tidal_boundary_vert_levels=10 +config_tidal_boundary_layer_type='sigma' +config_tidal_start_dry=.true. +config_tidal_boundary_left_bottom_depth=0.0 +config_tidal_boundary_use_distances=.false. +config_use_wetting_drying=.true. +config_use_tidal_forcing=.true. +config_write_cull_cell_mask=.false. +config_use_variable_drag=.true. diff --git a/compass/ocean/tests/drying_slope/streams.forward b/compass/ocean/tests/drying_slope/streams.forward new file mode 100644 index 0000000000..e928fb0ce2 --- /dev/null +++ b/compass/ocean/tests/drying_slope/streams.forward @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/compass/ocean/tests/drying_slope/streams.init b/compass/ocean/tests/drying_slope/streams.init new file mode 100644 index 0000000000..530f7e7cf9 --- /dev/null +++ b/compass/ocean/tests/drying_slope/streams.init @@ -0,0 +1,42 @@ + + + + + + type="output" + output_interval="0000_00:00:01" + clobber_mode="truncate" + filename_template="forcing.nc"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 66663779c91564fb730bc5d6b637fafdf3a2e221 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Thu, 24 Mar 2022 12:12:34 -0500 Subject: [PATCH 04/24] Add initial state --- .../tests/drying_slope/default/__init__.py | 4 ++ .../ocean/tests/drying_slope/drying_slope.cfg | 18 +++++ .../ocean/tests/drying_slope/initial_state.py | 66 +++++++++++++++++++ .../ocean/tests/drying_slope/namelist.init | 4 +- compass/ocean/tests/drying_slope/streams.init | 2 +- 5 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 compass/ocean/tests/drying_slope/drying_slope.cfg create mode 100644 compass/ocean/tests/drying_slope/initial_state.py diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index 08ffac17c7..10ca6a09cf 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -1,4 +1,6 @@ from compass.testcase import TestCase +from compass.ocean.tests.drying_slope.initial_state import InitialState +#from compass.ocean.tests.drying_slope.forward import Forward class Default(TestCase): @@ -36,4 +38,6 @@ def __init__(self, test_group, resolution, coord_type): subdir = '{}/{}/{}'.format(resolution, coord_type, name) super().__init__(test_group=test_group, name=name, subdir=subdir) + self.add_step(InitialState(test_case=self)) + #self.add_step(Forward(test_case=self, cores=4, threads=1)) diff --git a/compass/ocean/tests/drying_slope/drying_slope.cfg b/compass/ocean/tests/drying_slope/drying_slope.cfg new file mode 100644 index 0000000000..b0c683b7a4 --- /dev/null +++ b/compass/ocean/tests/drying_slope/drying_slope.cfg @@ -0,0 +1,18 @@ +# Options related to the vertical grid +[vertical_grid] + +# Number of vertical levels +vert_levels = 10 + +# The type of vertical coordinate (e.g. z-level, z-star) +coord_type = sigma + +# config options for internal wave test cases +[drying_slope] + +# the number of grid cells in x and y +nx = 6 +ny = 114 + +# the size of grid cells (m) +dc = 1000.0 diff --git a/compass/ocean/tests/drying_slope/initial_state.py b/compass/ocean/tests/drying_slope/initial_state.py new file mode 100644 index 0000000000..26f020fbac --- /dev/null +++ b/compass/ocean/tests/drying_slope/initial_state.py @@ -0,0 +1,66 @@ +import xarray +import numpy + +from mpas_tools.planar_hex import make_planar_hex_mesh +from mpas_tools.io import write_netcdf +from mpas_tools.mesh.conversion import convert, cull + +from compass.step import Step +from compass.model import run_model + +class InitialState(Step): + """ + A step for creating a mesh and initial condition for drying slope test + cases + """ + def __init__(self, test_case): + """ + Create the step + + Parameters + ---------- + test_case : compass.ocean.tests.drying_slope.default.Default + The test case this step belongs to + """ + super().__init__(test_case=test_case, name='initial_state', cores=1, + min_cores=1, threads=1) + + self.add_namelist_file('compass.ocean.tests.drying_slope', + 'namelist.init', mode='init') + + self.add_streams_file('compass.ocean.tests.drying_slope', + 'streams.init', mode='init') + + for file in ['base_mesh.nc', 'culled_mesh.nc', 'culled_graph.info', + 'ocean.nc']: + self.add_output_file(file) + + self.add_model_as_input() + + def run(self): + """ + Run this step of the test case + """ + config = self.config + logger = self.logger + + section = config['drying_slope'] + nx = section.getint('nx') + ny = section.getint('ny') + dc = section.getfloat('dc') + + logger.info(' * Make planar hex mesh') + dsMesh = make_planar_hex_mesh(nx=nx, ny=ny, dc=dc, nonperiodic_x=False, + nonperiodic_y=True) + logger.info(' * Completed Make planar hex mesh') + write_netcdf(dsMesh, 'base_mesh.nc') + + logger.info(' * Cull mesh') + dsMesh = cull(dsMesh, logger=logger) + logger.info(' * Convert mesh') + dsMesh = convert(dsMesh, graphInfoFileName='culled_graph.info', + logger=logger) + logger.info(' * Completed Convert mesh') + write_netcdf(dsMesh, 'culled_mesh.nc') + run_model(self, namelist='namelist.ocean', + streams='streams.ocean') diff --git a/compass/ocean/tests/drying_slope/namelist.init b/compass/ocean/tests/drying_slope/namelist.init index 7aa385c6d4..6f42c8c82d 100644 --- a/compass/ocean/tests/drying_slope/namelist.init +++ b/compass/ocean/tests/drying_slope/namelist.init @@ -4,8 +4,10 @@ config_tidal_boundary_vert_levels=10 config_tidal_boundary_layer_type='sigma' config_tidal_start_dry=.true. config_tidal_boundary_left_bottom_depth=0.0 -config_tidal_boundary_use_distances=.false. +config_tidal_boundary_use_distances=.true. +config_tidal_forcing_monochromatic_baseline=10.0 config_use_wetting_drying=.true. +config_drying_min_cell_height=1.000001e-3 config_use_tidal_forcing=.true. config_write_cull_cell_mask=.false. config_use_variable_drag=.true. diff --git a/compass/ocean/tests/drying_slope/streams.init b/compass/ocean/tests/drying_slope/streams.init index 530f7e7cf9..e6bd194590 100644 --- a/compass/ocean/tests/drying_slope/streams.init +++ b/compass/ocean/tests/drying_slope/streams.init @@ -1,7 +1,7 @@ + filename_template="culled_mesh.nc"/> type="output" From ee94f1790046d931b3f140b34e96bfcedff79310 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Thu, 24 Mar 2022 15:38:07 -0500 Subject: [PATCH 05/24] Add forward step --- .../tests/drying_slope/default/__init__.py | 4 +- compass/ocean/tests/drying_slope/forward.py | 70 +++++++++++++++++++ .../ocean/tests/drying_slope/namelist.forward | 6 +- .../ocean/tests/drying_slope/streams.forward | 8 +++ 4 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 compass/ocean/tests/drying_slope/forward.py diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index 10ca6a09cf..39449b1a67 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -1,6 +1,6 @@ from compass.testcase import TestCase from compass.ocean.tests.drying_slope.initial_state import InitialState -#from compass.ocean.tests.drying_slope.forward import Forward +from compass.ocean.tests.drying_slope.forward import Forward class Default(TestCase): @@ -39,5 +39,5 @@ def __init__(self, test_group, resolution, coord_type): super().__init__(test_group=test_group, name=name, subdir=subdir) self.add_step(InitialState(test_case=self)) - #self.add_step(Forward(test_case=self, cores=4, threads=1)) + self.add_step(Forward(test_case=self, cores=4, threads=1)) diff --git a/compass/ocean/tests/drying_slope/forward.py b/compass/ocean/tests/drying_slope/forward.py new file mode 100644 index 0000000000..b43235f97e --- /dev/null +++ b/compass/ocean/tests/drying_slope/forward.py @@ -0,0 +1,70 @@ +from compass.model import run_model +from compass.step import Step + + +class Forward(Step): + """ + A step for performing forward MPAS-Ocean runs as part of drying slope + test cases. + """ + def __init__(self, test_case, name='forward', subdir=None, cores=1, + min_cores=None, threads=1): + """ + Create a new test case + + Parameters + ---------- + test_case : compass.TestCase + The test case this step belongs to + + name : str + the name of the test case + + subdir : str, optional + the subdirectory for the step. The default is ``name`` + + cores : int, optional + the number of cores the step would ideally use. If fewer cores + are available on the system, the step will run on all available + cores as long as this is not below ``min_cores`` + + min_cores : int, optional + the number of cores the step requires. If the system has fewer + than this number of cores, the step will fail + + threads : int, optional + the number of threads the step will use + + """ + if min_cores is None: + min_cores = cores + super().__init__(test_case=test_case, name=name, subdir=subdir, + cores=cores, min_cores=min_cores, threads=threads) + self.add_namelist_file('compass.ocean.tests.drying_slope', + 'namelist.forward') + self.add_streams_file('compass.ocean.tests.drying_slope', + 'streams.forward') + + self.add_input_file(filename='mesh.nc', + target='../initial_state/culled_mesh.nc') + + self.add_input_file(filename='init.nc', + target='../initial_state/ocean.nc') + + self.add_input_file(filename='forcing.nc', + target='../initial_state/init_mode_forcing_data.nc') + + self.add_input_file(filename='graph.info', + target='../initial_state/culled_graph.info') + + self.add_model_as_input() + + self.add_output_file(filename='output.nc') + + # no setup() is needed + + def run(self): + """ + Run this step of the test case + """ + run_model(self) diff --git a/compass/ocean/tests/drying_slope/namelist.forward b/compass/ocean/tests/drying_slope/namelist.forward index 664d58e56a..6945f7bdcb 100644 --- a/compass/ocean/tests/drying_slope/namelist.forward +++ b/compass/ocean/tests/drying_slope/namelist.forward @@ -1,6 +1,5 @@ -#this list is from forward_template then sigma/*/config_forward*.xml config_run_duration='0000_12:00:01' -config_dt='0000_00:00:20' +config_dt='0000_00:00:30' config_time_integrator='RK4' config_use_tidal_forcing=.true. config_use_tidal_forcing_tau=60.0 @@ -24,7 +23,6 @@ config_use_variable_drag=.true. config_Rayleigh_friction=.true. config_Rayleigh_damping_depth_variable=.true. config_Rayleigh_damping_coeff=0.0025 -#config_Rayleigh_damping_coeff=0.01 #sigma/250m/forward2 -config_use_implicit_bottom_drag=.false. #default is true +config_use_implicit_bottom_drag=.false. config_use_debugTracers=.true. config_check_ssh_consistency=.true. diff --git a/compass/ocean/tests/drying_slope/streams.forward b/compass/ocean/tests/drying_slope/streams.forward index e928fb0ce2..1f9e5b4c07 100644 --- a/compass/ocean/tests/drying_slope/streams.forward +++ b/compass/ocean/tests/drying_slope/streams.forward @@ -6,6 +6,14 @@ + + + + + Date: Thu, 24 Mar 2022 16:59:44 -0500 Subject: [PATCH 06/24] Add viz --- .../tests/drying_slope/default/__init__.py | 2 + compass/ocean/tests/drying_slope/viz.py | 88 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 compass/ocean/tests/drying_slope/viz.py diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index 39449b1a67..0df9732ac9 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -1,6 +1,7 @@ from compass.testcase import TestCase from compass.ocean.tests.drying_slope.initial_state import InitialState from compass.ocean.tests.drying_slope.forward import Forward +from compass.ocean.tests.drying_slope.viz import Viz class Default(TestCase): @@ -40,4 +41,5 @@ def __init__(self, test_group, resolution, coord_type): subdir=subdir) self.add_step(InitialState(test_case=self)) self.add_step(Forward(test_case=self, cores=4, threads=1)) + self.add_step(Viz(test_case=self)) diff --git a/compass/ocean/tests/drying_slope/viz.py b/compass/ocean/tests/drying_slope/viz.py new file mode 100644 index 0000000000..6fc2522360 --- /dev/null +++ b/compass/ocean/tests/drying_slope/viz.py @@ -0,0 +1,88 @@ +import xarray +import numpy +import matplotlib.pyplot as plt + +from compass.step import Step + + +class Viz(Step): + """ + A step for visualizing XX + """ + def __init__(self, test_case): + """ + Create the step + + Parameters + ---------- + test_case : compass.TestCase + The test case this step belongs to + """ + super().__init__(test_case=test_case, name='viz') + + self.add_input_file(filename='output.nc', + target='../forward/output.nc') + self.add_output_file('ssh_t.png') + self.add_output_file('ssh_depth_section.png') + + def run(self): + """ + Run this step of the test case + """ + + ds = xarray.open_dataset('output.nc') + ssh = ds.ssh + ympas = ds.ssh.where(ds.tidalInputMask).mean('nCells').values + xmpas = numpy.linspace(0, 1.0, len(ds.xtime))*12.0 + x = numpy.linspace(0,12.0,100) + y = 10.0*numpy.sin(x*numpy.pi/12.0) - 10.0 + print(ympas) + #print('ymin={} ymax={}\n'.format(ympas.min(), ympas.max())) + + figsize = [6.4, 4.8] + markersize = 20 + # Figures + plt.figure(figsize=figsize, dpi=100) + plt.plot(x, y, lw=3, color='black', label='analytical') + plt.plot(xmpas, ympas, marker='o', label='MPAS-O forward') + plt.legend(frameon=False) + plt.ylabel('Tidal amplitude (m)') + plt.xlabel('Time (hrs)') + plt.suptitle('Tidal amplitude forcing (right side) for MPAS-O and analytical') + plt.savefig('ssh_t.png', bbox_inches='tight', dpi=200) + plt.close() + + # plot cross-sections + times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] + fig, ax = plt.subplots(nrows=1,ncols=1, sharex=True, sharey=True) + fig.text(0.04, 0.5, 'Channel depth (m)', va='center', rotation='vertical') + fig.text(0.5, 0.02, 'Along channel distance (km)', ha='center') + + plt.xlim(0,25) + plt.ylim(-1, 11) + ax = plt.gca() + ax.invert_yaxis() + ax.spines['top'].set_visible(False) + ax.spines['right'].set_visible(False) + + x = numpy.linspace(0,25,100) + y = 10.0/25.0*x + plt.plot(x, y, 'k-', lw=3) + + for atime in times: + # factor of 1e-16 needed to account for annoying round-off issue to get right time slices + plottime = int((float(atime)/0.2 + 1e-16)*24.0) + #print('{} {} {}'.format(atime, plottime, ds.isel(Time=plottime).xtime.values)) + print('{} {}'.format(atime, plottime)) + ds = ds.drop_vars(numpy.setdiff1d([i for i in ds.variables], ['yCell','ssh'])) + ymean = ds.isel(Time=plottime).groupby('yCell').mean(dim=xarray.ALL_DIMS) + x = ymean.yCell.values/1000.0 + y = ymean.ssh.values + #print('ymin={} ymax={}\n{}\n{}'.format(y.min(), y.max(),x, y)) + print('ymin={} ymax={}\n'.format(y.min(), y.max())) + plt.plot(x, -y)#, *args, **kwargs) + plt.savefig('ssh_section_t.png', bbox_inches='tight', dpi=200) + plt.close() + + ds.close() + From b604c9300c32b0ec81d8241a4f8070059a66b7e6 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Fri, 1 Apr 2022 16:02:17 -0500 Subject: [PATCH 07/24] Add atm, landIce forcing to streams --- .../ocean/tests/drying_slope/streams.forward | 23 +++++++++++++++++++ compass/ocean/tests/drying_slope/streams.init | 15 +++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/compass/ocean/tests/drying_slope/streams.forward b/compass/ocean/tests/drying_slope/streams.forward index 1f9e5b4c07..9f650f7c1b 100644 --- a/compass/ocean/tests/drying_slope/streams.forward +++ b/compass/ocean/tests/drying_slope/streams.forward @@ -6,6 +6,29 @@ + + + + + + + + + + type="output" output_interval="0000_00:00:01" @@ -36,7 +50,6 @@ - From 64b9c1caedddb94767ec9cf07154a35c80b0ec58 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Sun, 3 Apr 2022 10:07:11 -0500 Subject: [PATCH 08/24] Add damping coefficient comparison --- .../r0.0025d0.05-analytical.csv | 7 + .../comparison_data/r0.0025d0.05-roms.csv | 8 ++ .../r0.0025d0.15-analytical.csv | 22 +++ .../comparison_data/r0.0025d0.15-roms.csv | 24 ++++ .../r0.0025d0.25-analytical.csv | 30 ++++ .../comparison_data/r0.0025d0.25-roms.csv | 29 ++++ .../r0.0025d0.30-analytical.csv | 34 +++++ .../comparison_data/r0.0025d0.30-roms.csv | 32 +++++ .../r0.0025d0.40-analytical.csv | 32 +++++ .../comparison_data/r0.0025d0.40-roms.csv | 32 +++++ .../r0.0025d0.50-analytical.csv | 28 ++++ .../comparison_data/r0.0025d0.50-roms.csv | 27 ++++ .../comparison_data/r0.01d0.05-analytical.csv | 7 + .../comparison_data/r0.01d0.05-roms.csv | 6 + .../comparison_data/r0.01d0.15-analytical.csv | 11 ++ .../comparison_data/r0.01d0.15-roms.csv | 17 +++ .../comparison_data/r0.01d0.25-analytical.csv | 22 +++ .../comparison_data/r0.01d0.25-roms.csv | 24 ++++ .../comparison_data/r0.01d0.30-analytical.csv | 28 ++++ .../comparison_data/r0.01d0.30-roms.csv | 29 ++++ .../comparison_data/r0.01d0.40-analytical.csv | 31 ++++ .../comparison_data/r0.01d0.40-roms.csv | 30 ++++ .../comparison_data/r0.01d0.50-analytical.csv | 24 ++++ .../comparison_data/r0.01d0.50-roms.csv | 20 +++ .../tests/drying_slope/default/__init__.py | 7 +- compass/ocean/tests/drying_slope/forward.py | 15 +- compass/ocean/tests/drying_slope/viz.py | 133 +++++++++++------- 27 files changed, 652 insertions(+), 57 deletions(-) create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-roms.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-analytical.csv create mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-roms.csv diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-analytical.csv new file mode 100644 index 0000000000..4d41c4b9f6 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-analytical.csv @@ -0,0 +1,7 @@ +20.433617965734783, 7.95631020193958 +20.988350480522175, 7.55729639307698 +21.690191662202203, 7.318544110733299 +22.50256934498103, 7.133321671058239 +23.204082525174112, 7.001235472267473 +24.016214206837738, 6.896012595257096 +24.920514306331523, 6.817620239878417 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-roms.csv new file mode 100644 index 0000000000..e9e4a6dcef --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-roms.csv @@ -0,0 +1,8 @@ +21.20737347342641, 8.33101910061992 +21.410898396072728, 8.144714256037958 +21.818194242480562, 7.692105004209349 +22.464603172867715, 7.479920842307816 +23.147748269792153, 7.321135322480124 +23.812443283076213, 7.162317002503743 +24.476892295245072, 7.083498245192041 +24.97537255502225, 6.977717765653868 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-analytical.csv new file mode 100644 index 0000000000..4ebe1aabb5 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-analytical.csv @@ -0,0 +1,22 @@ +9.137246755518625, 3.536227764232529 +9.74782152345757, 2.9773132304866436 +10.96626504706821, 2.739479352306396 +12.03694390081235, 2.5547161147130524 +13.365677924406592, 2.4504116418661086 +14.0670271038562, 2.371658484851796 +14.749844199293703, 2.3195390485770186 +15.432661294731203, 2.267419612302241 +16.09694630615659, 2.241933896766997 +16.761313317953707, 2.1897816603435256 +17.425680329750826, 2.1376294239200533 +18.12686550845697, 2.112209308682198 +18.7542503526016, 2.0866579928495668 +19.455517531679476, 2.0345713567234824 +20.13825262674524, 2.0091184413369323 +20.820987721811008, 1.9836655259503821 +21.46690464996774, 1.9314804893782167 +22.131107661021396, 1.9326612947312016 +22.813842756087162, 1.9072083793446515 +23.478127767512543, 1.8817226638094073 +24.179394946590424, 1.829636027683323 +24.880498124924834, 1.830882433333696 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-roms.csv new file mode 100644 index 0000000000..2188799869 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-roms.csv @@ -0,0 +1,24 @@ +10.169385434547303, 3.8847293441063586 +10.26229185572308, 3.671561177744004 +10.780042202857983, 3.299148289472244 +11.444983217257251, 3.0603304068311763 +12.072860063632286, 2.874779965669176 +12.755677159069787, 2.8226605293943994 +13.420208171610378, 2.7171752511944707 +14.084739184150967, 2.611689972994543 +14.749188196319823, 2.5328712156828423 +15.432005291757319, 2.480751779408065 +16.096372303554446, 2.4285995429845935 +16.760657314979827, 2.4031138274493493 +17.443556410789064, 2.3243278702863437 +18.10784142221445, 2.2988421547510995 +18.79065851765195, 2.246722718476322 +19.454861528705596, 2.247903523829306 +20.11931054087445, 2.1690847665176065 +20.783595552299833, 2.1435990509823624 +21.4663306473656, 2.118146135595812 +22.149147742803102, 2.0660266993210357 +22.813350753856753, 2.0672075046740197 +23.477717765653868, 2.0150552682505474 +24.17890294436001, 1.9896351530126912 +24.824655871773288, 1.9907831582169813 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-analytical.csv new file mode 100644 index 0000000000..c091707def --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-analytical.csv @@ -0,0 +1,30 @@ +1.7847654242699238, 0.563156686310311 +2.4866066059499468, 0.32440440396663117 +3.353924537791238, 0.2726129691787933 +4.368925139127297, 0.1944174146922797 +5.9189781660343534, 0.11717306451789256 +7.838032865748991, 0.040584717317385 +9.240321222789543, 0.016411007729901783 +9.978324568404709, 0.017723013677660937 +10.568727244896843, 0.01877261843586897 +11.30673059051201, 0.020084624383629457 +11.934115434656636, -0.005466691449001804 +12.598318445710287, -0.004285886096017322 +13.26260345713567, -0.02977160163126147 +13.908356384548943, -0.02862359642697232 +14.591009479242972, -0.02740999092529295 +15.25521249029662, -0.02622918557230891 +15.937947585362386, -0.05168210095885861 +16.58370051277566, -0.050534095754568575 +17.284885691481797, -0.07595421099242428 +17.96753878617583, -0.07474060549074624 +18.613291713589106, -0.0735926002864562 +19.27749472464275, -0.07241179493347127 +19.9416977356964, -0.07123098958048768 +20.62435083039043, -0.07001738407880964 +21.307085925456196, -0.0954702994653589 +21.971288936509843, -0.09428949411237486 +22.653942031203872, -0.09307588861069682 +23.3365951258979, -0.09186228310901878 +24.000798136951556, -0.09068147775603475 +24.665001148005203, -0.08950067240304982 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-roms.csv new file mode 100644 index 0000000000..b9d63b6d80 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-roms.csv @@ -0,0 +1,29 @@ +2.5047286881033863, 0.431103287668237 +3.7968085455320737, 0.24673365185922114 +4.811891147239866, 0.1418715764844798 +5.549894492855035, 0.14318358243223983 +6.2140975039086825, 0.1443643877852243 +7.0628833517378595, 0.11920667373692062 +8.096252036342563, 0.06771044028732875 +9.277139389698565, 0.04314312891551708 +9.904524233843194, 0.01759181308288582 +10.550277161256462, 0.01873981828717497 +11.897133267004142, 0.02113422914183838 +13.262521456763936, -0.003105080743033284 +13.889824300536828, -0.001989875687437248 +14.572477395230857, -0.0007762701857596532 +15.291948656833904, 0.02716945650153546 +15.956233668259296, 0.0016837409662908698 +16.60198659567257, 0.0028317461705809066 +17.30308977400697, 0.004078151820953835 +17.930392617779866, 0.005193356876550315 +18.631495796114276, 0.006439762526922355 +19.295698807167927, 0.007620567879905948 +19.97826990149022, 0.03550069426981217 +20.64247291254387, 0.03668149962279621 +21.325126007237895, 0.03789510512447558 +21.98932901829155, 0.03907591047745873 +22.653532029345197, 0.0402567158304441 +23.336185124039226, 0.04147032133212125 +24.00038813509288, 0.04265112668510529 +24.664591146146527, 0.04383193203808977 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-analytical.csv new file mode 100644 index 0000000000..ba832308ad --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-analytical.csv @@ -0,0 +1,34 @@ +0.5316357434153707, 0.08092890021101429 +1.5280222603675813, 0.056033587352262604 +2.229043438330254, 0.08394651389086283 +2.8932464493839034, 0.08512731924384731 +3.575899544077933, 0.08634092474552535 +4.258552638771963, 0.08755453024720383 +4.867241398161003, 0.1419699769305618 +5.5867946601357925, 0.1432491827296274 +6.287897838470201, 0.14449558838000032 +8.206706537069634, 0.14790680384417687 +8.907809715404042, 0.1491532094945489 +9.60874889299498, 0.20373265692137732 +10.291319987317275, 0.23161278331128354 +10.937154915102278, 0.20609426762734584 +11.619808009796309, 0.20730787312902388 +12.265478936837846, 0.2351223992215421 +12.96650011480052, 0.2630353257601423 +14.33180630418858, 0.26546253676349885 +14.977559231601843, 0.2666105419677889 +15.660212326295875, 0.2678241474694669 +16.324333336977798, 0.2956714737106796 +16.951636180750686, 0.2967866787662756 +17.689639526365852, 0.2980986847140361 +18.353760537047766, 0.32594601095524833 +19.017963548101417, 0.32712681630823237 +19.682166559155068, 0.32830762166121685 +20.364819653849093, 0.3295212271628949 +21.010490580890632, 0.35733575325541356 +21.674693591944283, 0.3585165586083976 +22.37579677027869, 0.35976296425876964 +23.03999978133234, 0.3609437696117537 +23.685670708373877, 0.38875829570427145 +24.36832380306791, 0.38997190120594993 +24.94027639591966, 0.39098870581546397 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-roms.csv new file mode 100644 index 0000000000..9cb1c460c8 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-roms.csv @@ -0,0 +1,32 @@ +2.4677465204508926, 0.4577042082590772 +3.741458294610936, 0.24663525141313913 +4.424193389676699, 0.22118233602658988 +5.088560401473819, 0.16903009960311755 +5.93726424893126, 0.17053890644304204 +7.302570438319318, 0.17296611744639812 +8.243606704350393, 0.14797240414156443 +8.944791883056537, 0.12255228890370828 +9.572094726829425, 0.12366749395930476 +10.2731159047921, 0.15158042049790543 +10.937236915474015, 0.1794277467391181 +11.601439926527664, 0.1806085520921017 +12.284093021221693, 0.18182215759377973 +12.96658211517225, 0.23636880487191458 +13.612253042213792, 0.26418333096443236 +14.479242972568139, 0.3190579797295072 +14.995845314498757, 0.31997638389293925 +15.641680242283767, 0.2944578682090011 +16.32425133660606, 0.3223379945989078 +16.988454347659708, 0.3235187999518918 +17.689475525622385, 0.35143172649049204 +18.335146452663917, 0.3792462525830098 +19.017799547357946, 0.38045985808468785 +19.681920558039863, 0.4083071843259005 +20.34604156872178, 0.43615451056711274 +21.028612663044072, 0.4640346369570194 +21.72971584137848, 0.46528104260739145 +22.39391885243213, 0.46646184796037593 +23.076489946754425, 0.49434197435028215 +23.74061095743634, 0.5221893005914944 +24.386363884849615, 0.5233373057957849 +24.95823447732963, 0.5510206312935266 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-analytical.csv new file mode 100644 index 0000000000..16ebde420e --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-analytical.csv @@ -0,0 +1,32 @@ +2.227239430152084, 0.6706099734318793 +4.033543618731072, 1.2604878475449084 +4.826241212293496, 1.4752304210445741 +5.489870220745004, 1.6630768726151555 +6.116763062659217, 1.7975246821118915 +6.780474071482457, 1.9587046127942438 +7.444267080677433, 2.093218022588368 +8.126510173512786, 2.227764232531186 +8.790385183079497, 2.3356111214370827 +9.47262827591485, 2.470157331379901 +10.118135202212915, 2.5513048992488754 +10.782010211779628, 2.6591517881547713 +12.10984223128478, 2.8481790450783375 +12.7922493248636, 2.9293922132446983 +13.456206334802049, 3.010572581262367 +14.120163344740492, 3.0917529492800355 +14.784120354678942, 3.1729333172977032 +15.466609448629496, 3.2274799645758376 +16.112116374927567, 3.3086275324448122 +16.813055552518506, 3.3632069798716397 +17.477094562828682, 3.41772082700108 +18.14105157276713, 3.4989011950187487 +18.823540666717683, 3.5534478422968823 +19.506029760668252, 3.6079944895750167 +20.170068770978432, 3.662508336704457 +20.83410778128861, 3.7170221838338975 +21.498228791970522, 3.7448695100751097 +22.180717885921084, 3.799416157353245 +22.826306812590886, 3.8538972043339914 +23.508795906541444, 3.908443851612124 +24.191367000863735, 3.9363239780020303 +24.855406011173915, 3.9908378251314716 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-roms.csv new file mode 100644 index 0000000000..570c14bbae --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-roms.csv @@ -0,0 +1,32 @@ +3.480533111750107, 1.0995047177547201 +4.770726960628888, 1.5284650623749485 +5.489706220001532, 1.716409914391611 +6.153417228824772, 1.877589845073964 +6.79867815400763, 2.0387369756076223 +7.444021079562228, 2.1732175852530524 +8.12626417239758, 2.3077637951958705 +8.808507265232937, 2.4423100051386886 +9.453768190415795, 2.6034571356723477 +10.11772520035424, 2.6846375036900163 +10.781600209920954, 2.792484392595912 +11.427107136219016, 2.873631960464885 +12.109432229426105, 2.9815116495194767 +12.77338923936455, 3.0626920175371453 +13.437346249302996, 3.143872385554813 +14.11975334288182, 3.2250855537211747 +14.783710352820266, 3.3062659217388433 +15.44766736275871, 3.387446289756512 +16.13015645670927, 3.4419929370346463 +16.812645550659827, 3.4965395843127807 +17.476602560598277, 3.5777199523304475 +18.140641570908453, 3.632233799459888 +18.84158074849939, 3.686813246886717 +19.4871696751692, 3.7412942938674636 +20.151208685479375, 3.795808140996904 +20.833697779429933, 3.8503547882750384 +21.49773678974011, 3.904868635404478 +22.18030788406241, 3.932748761794384 +22.82589681073221, 3.9872298087751306 +23.526835988323143, 4.041809256201959 +24.172506915364682, 4.069623782294477 +24.854996009315244, 4.124170429572612 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-analytical.csv new file mode 100644 index 0000000000..f6f07bbe72 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-analytical.csv @@ -0,0 +1,28 @@ +6.060018805418585, 2.250757136765686 +6.760383980407376, 2.49200223041011 +7.6450039906847564, 2.8135748882061593 +8.603342335151918, 3.161945267485212 +9.561680679619078, 3.5103156467642647 +10.759624110295965, 3.939111990641022 +11.66261220384199, 4.287383969473994 +12.289259044641, 4.501831341635414 +12.934355969080398, 4.716311513945528 +13.579452893519784, 4.930791686255642 +14.24283590085608, 5.198637700490908 +14.888014825667208, 5.386451351912793 +15.569929917015623, 5.627663645408523 +16.215026841455018, 5.842143817718638 +16.860041765522666, 6.08329051091698 +17.52358877360244, 6.297803483375789 +18.168603697670097, 6.538950176574131 +18.832150705749864, 6.753463149032939 +19.47724763018926, 6.9679433213430535 +20.14071263789729, 7.209122814690092 +20.841077812886084, 7.450367908334515 +21.467724653685096, 7.664815280495937 +22.094371494484104, 7.879262652657356 +22.757836502192145, 8.120442146004391 +23.402769425888064, 8.388255360090966 +24.010802182303227, 8.656002973880144 +24.710593354689877, 9.083913713742165 +25.02276876988509, 9.564468692258068 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-roms.csv new file mode 100644 index 0000000000..042ba5a449 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-roms.csv @@ -0,0 +1,27 @@ +7.829258825973344, 2.893902452357782 +8.45582366640062, 3.135016345407432 +9.08247050719963, 3.3494637175688515 +9.67213518034615, 3.5905120103211114 +10.4094005226157, 3.831822704262925 +11.035965363042976, 4.072936597312573 +11.644080119829876, 4.314017690213527 +12.307627127909644, 4.5285306626723365 +12.952642051977302, 4.769677355870678 +13.597656976044954, 5.01082404906902 +14.242671900112613, 5.251970742267364 +14.906136907820647, 5.493150235614399 +15.569683915900418, 5.707663208073207 +16.177798672687317, 5.9487443009741625 +16.84126368039535, 6.189923794321199 +17.50481068847512, 6.404436766780007 +18.168275696183155, 6.645616260127044 +18.813372620622545, 6.860096432437157 +19.458387544690204, 7.1012431256355 +20.121852552398238, 7.342422618982537 +20.803767643746653, 7.583634912478267 +21.411964400905283, 7.798049484490992 +22.075429408613324, 8.03922897783803 +22.720526333052707, 8.253709150148145 +23.383909340389014, 8.521555164383408 +23.991942096804173, 8.789302778172592 +24.63671101975662, 9.110449034035621 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-analytical.csv new file mode 100644 index 0000000000..6d76534f8c --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-analytical.csv @@ -0,0 +1,7 @@ +22.378967186659498, 8.657342657342657 +22.64671866594944, 8.041958041958042 +23.107315761161917, 7.65034965034965 +23.587345346960735, 7.342657342657342 +24.144432490586336, 7.09090909090909 +24.60556750941366, 6.923076923076923 +24.95145239376009, 6.81118881118881 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-roms.csv new file mode 100644 index 0000000000..a5bd7a99ff --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-roms.csv @@ -0,0 +1,6 @@ +22.64779451317913, 8.489510489510488 +22.91601667563206, 8.06993006993007 +23.45360408821947, 7.706293706293707 +23.914537385691233, 7.454545454545453 +24.414066702528242, 7.258741258741258 +24.721490048413127, 7.146853146853147 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-analytical.csv new file mode 100644 index 0000000000..d29bc8069f --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-analytical.csv @@ -0,0 +1,11 @@ +13.909494351802046, 5.356643356643356 +14.292361484669176, 4.629370629370629 +14.867939752555138, 4.069930069930069 +15.713017751479288, 3.6223776223776216 +16.789066702528242, 3.2587412587412574 +17.826788596019366, 2.95104895104895 +19.36444324905864, 2.615384615384614 +21.056011296395912, 2.3076923076923066 +22.51701183431953, 2.0839160839160824 +23.8243006993007, 1.9160839160839145 +24.977810650887577, 1.776223776223775 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-roms.csv new file mode 100644 index 0000000000..025c21287b --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-roms.csv @@ -0,0 +1,17 @@ +14.216043571812804, 4.881118881118881 +14.830016137708448, 4.293706293706292 +15.44459386767079, 3.9580419580419575 +16.097767616998386, 3.6783216783216774 +16.751075847229693, 3.4545454545454533 +17.404451317912855, 3.2587412587412574 +18.077124798278646, 3.09090909090909 +18.730634749865526, 2.95104895104895 +19.3841447014524, 2.811188811188811 +20.056952662721898, 2.6993006993006983 +20.729693383539537, 2.5594405594405583 +21.40250134480904, 2.4475524475524466 +22.07537654653039, 2.3636363636363624 +22.709722969338355, 2.2517482517482508 +23.38259817105971, 2.1678321678321666 +24.05547337278107, 2.083916083916083 +24.74757934373319, 1.9999999999999987 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-analytical.csv new file mode 100644 index 0000000000..c99969b952 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-analytical.csv @@ -0,0 +1,22 @@ +6.864308768154924, 2.5594405594405583 +7.247713824636902, 2.055944055944055 +7.8236955352339965, 1.6643356643356637 +8.784359870898333, 1.300699300699299 +9.47626412049489, 1.132867132867132 +10.398870360408823, 0.9370629370629362 +11.28314954276493, 0.7972027972027962 +11.763851533082303, 0.7692307692307678 +12.436659494351801, 0.6573426573426562 +13.12869822485207, 0.5454545454545441 +14.436054330285103, 0.4055944055944041 +15.935718128025819, 0.26573426573426495 +17.781603012372244, 0.15384615384615286 +19.166016675632058, 0.06993006993006912 +19.839026358257126, 0.041958041958040315 +20.512036040882197, 0.013986013986012624 +21.204276492738032, -0.01398601398601551 +21.85805540613233, -0.041958041958043424 +22.51183431952663, -0.06993006993007156 +23.184844002151696, -0.09790209790209925 +23.8963152232383, -0.12587412587412738 +24.5500941366326, -0.1538461538461553 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-roms.csv new file mode 100644 index 0000000000..f23f09283f --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-roms.csv @@ -0,0 +1,24 @@ +6.671866594943518, 2.5034965034965024 +7.132127487896719, 1.9720279720279708 +7.727541689080152, 1.6643356643356633 +9.822417966648738, 1.132867132867132 +10.475927918235612, 0.9930069930069925 +11.110274341043572, 0.8811188811188799 +11.763986013986015, 0.8251748251748241 +12.475322754168907, 0.7412587412587399 +13.109669176976869, 0.6293706293706278 +13.801842388380852, 0.573426573426572 +14.49401559978483, 0.5174825174825162 +15.128496503496503, 0.4615384615384599 +15.820736955352341, 0.43356643356643243 +16.647525551371704, 0.37762237762237616 +18.474179666487363, 0.2657342657342645 +19.166352877891338, 0.20979020979020868 +19.858593329747176, 0.18181818181818032 +20.493141473910715, 0.1538461538461524 +21.185381925766542, 0.1258741258741245 +21.858391608391607, 0.09790209790209659 +22.53146853146853, 0.09790209790209659 +23.185247444862835, 0.06993006993006845 +23.8582571274879, 0.04195804195804076 +24.5697283485745, 0.013986013986012624 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-analytical.csv new file mode 100644 index 0000000000..d79901f40b --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-analytical.csv @@ -0,0 +1,28 @@ +4.650820333512643, 1.748251748251747 +5.2842253899946225, 1.2447552447552432 +6.014389456697151, 0.9930069930069925 +6.610274341043571, 0.8811188811188799 +7.263851533082303, 0.7692307692307678 +7.93672673480366, 0.6853146853146841 +8.513515330823022, 0.6293706293706278 +9.263380849919312, 0.5734265734265724 +10.62856374394836, 0.48951048951048826 +11.628429263044648, 0.43356643356643243 +12.62829478214094, 0.37762237762237616 +13.320535233996775, 0.34965034965034825 +13.935919849381392, 0.34965034965034825 +15.166689080150622, 0.34965034965034825 +15.974314147391073, 0.32167832167832033 +16.647323830016134, 0.2937062937062924 +17.358862291554594, 0.2937062937062924 +18.031871974179666, 0.2657342657342645 +18.685718128025822, 0.2657342657342645 +19.358795051102746, 0.26573426573426406 +20.051169983862295, 0.2937062937062924 +20.72424690693921, 0.2937062937062924 +21.397323830016138, 0.2937062937062924 +22.05116998386229, 0.2937062937062924 +22.743477676169977, 0.2937062937062924 +23.397323830016134, 0.293706293706292 +24.070467993544924, 0.3216783216783199 +24.743544916621843, 0.3216783216783199 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-roms.csv new file mode 100644 index 0000000000..6bda4fc9d3 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-roms.csv @@ -0,0 +1,29 @@ +4.400753093060786, 1.7202797202797195 +4.707638515330823, 1.3846153846153837 +5.322350726196882, 1.1048951048951037 +5.937331898870362, 0.9370629370629362 +6.590909090909092, 0.8251748251748241 +7.244486282947822, 0.7132867132867116 +7.936659494351803, 0.6573426573426562 +8.628832705755784, 0.6013986013985999 +9.321005917159763, 0.5454545454545441 +10.282409897794514, 0.48951048951048826 +11.397660032275418, 0.43356643356643243 +12.628429263044652, 0.43356643356643243 +13.359131253362026, 0.4055944055944041 +14.012910166756324, 0.37762237762237616 +14.666756320602477, 0.37762237762237616 +15.897660032275418, 0.43356643356643243 +16.705217859064014, 0.37762237762237616 +17.397525551371704, 0.37762237762237616 +18.032140935987094, 0.37762237762237616 +18.705217859064017, 0.37762237762237616 +19.359131253362026, 0.4055944055944045 +20.070669714900482, 0.4055944055944045 +20.705217859064014, 0.37762237762237616 +21.397660032275418, 0.43356643356643243 +22.05150618612157, 0.43356643356643243 +22.74381387842926, 0.43356643356643243 +23.397660032275414, 0.43356643356643243 +24.090034965034967, 0.46153846153846034 +24.782409897794516, 0.48951048951048826 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-analytical.csv new file mode 100644 index 0000000000..9a4f2570e0 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-analytical.csv @@ -0,0 +1,31 @@ +3.168504572350726, 1.1048951048951037 +4.0529854760624, 1.0489510489510478 +4.745360408821947, 1.0769230769230758 +5.4377353415814955, 1.1048951048951037 +6.091850457235074, 1.2167832167832153 +6.745763851533084, 1.2447552447552432 +7.380580957504035, 1.3286713286713274 +8.130715438407746, 1.3846153846153837 +8.977138246369016, 1.4965034965034953 +9.977541689080152, 1.6643356643356633 +10.939349112426035, 1.776223776223775 +11.747310381925766, 1.888111888111887 +12.747579343733193, 1.9999999999999987 +13.478617536309844, 2.1118881118881108 +14.132732651963423, 2.2237762237762224 +14.76748251748252, 2.279720279720279 +15.498520710059172, 2.391608391608391 +16.13340505648198, 2.5034965034965024 +16.768222162452933, 2.5874125874125866 +17.480096826250673, 2.7272727272727266 +18.15330823023131, 2.7832167832167816 +18.78819257665412, 2.895104895104894 +19.48076923076923, 3.0069930069930058 +20.17334588488435, 3.1188811188811174 +20.827461000537927, 3.23076923076923 +21.4815761161915, 3.3426573426573416 +22.174152770306616, 3.454545454545454 +22.82826788596019, 3.566433566433566 +23.482383001613773, 3.6783216783216774 +24.174959655728887, 3.79020979020979 +24.82907477138247, 3.9020979020979008 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-roms.csv new file mode 100644 index 0000000000..fb8dd1e48a --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-roms.csv @@ -0,0 +1,30 @@ +3.3604088219472827, 0.9370629370629362 +4.072014523937602, 0.9650349650349641 +4.725995158687468, 1.0209790209790204 +5.379908552985476, 1.0489510489510478 +6.072485207100591, 1.16083916083916 +6.745696611081229, 1.2167832167832153 +7.39974448628295, 1.3006993006992995 +8.169176976869284, 1.3846153846153837 +9.015599784830554, 1.4965034965034953 +10.054464766003228, 1.6643356643356633 +11.131724045185583, 1.8041958041958033 +12.362829478214094, 1.9440559440559433 +13.2862426035503, 2.083916083916083 +14.113501882732653, 2.2237762237762224 +14.806078536847764, 2.335664335664335 +15.479357181280257, 2.4195804195804183 +16.133472296933835, 2.531468531468531 +16.826048951048953, 2.6433566433566424 +17.441635287789136, 2.7272727272727266 +18.1341447014524, 2.811188811188811 +18.788461538461537, 3.0069930069930058 +19.4809709521248, 3.09090909090909 +20.135086067778374, 3.2027972027972016 +20.827662721893493, 3.3146853146853132 +21.4625470683163, 3.426573426573426 +22.155123722431412, 3.5384615384615383 +22.79007530930608, 3.6783216783216774 +23.463421194190424, 3.79020979020979 +24.155997848305546, 3.9020979020979008 +24.82941097364174, 4.041958041958041 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-analytical.csv new file mode 100644 index 0000000000..aef0fa0e1e --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-analytical.csv @@ -0,0 +1,24 @@ +3.2838891877353418, 1.1048951048951037 +4.592388380849918, 1.4405594405594386 +5.4390801506186115, 1.6643356643356633 +6.43961807423346, 1.888111888111887 +7.40182894029048, 2.1678321678321666 +8.286982248520712, 2.391608391608391 +9.441500806885424, 2.67132867132867 +11.134884346422808, 3.1188811188811174 +12.982383001613773, 3.6783216783216774 +15.291621839698763, 4.321678321678321 +15.945938676707907, 4.517482517482517 +16.61948628294783, 4.7132867132867124 +17.254572350726196, 4.909090909090908 +17.928187197417966, 5.1328671328671325 +18.582571274878966, 5.356643356643356 +19.23695535233997, 5.58041958041958 +20.565021516944594, 6.055944055944055 +21.83559709521248, 6.615384615384615 +22.490182894029047, 6.923076923076923 +23.29895104895105, 7.37062937062937 +24.030863367401828, 7.846153846153845 +24.493343195266274, 8.237762237762237 +24.840505648197958, 8.657342657342657 +24.99583109198494, 9.272727272727273 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-roms.csv new file mode 100644 index 0000000000..32975a2ef7 --- /dev/null +++ b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-roms.csv @@ -0,0 +1,20 @@ +3.36094674556213, 1.16083916083916 +4.0535906401291015, 1.3006993006992995 +4.938743948359335, 1.5244755244755233 +6.093262506724045, 1.8041958041958033 +7.324838622915546, 2.139860139860139 +8.517885960193652, 2.4475524475524466 +9.903375470683164, 2.811188811188811 +11.21187466379774, 3.1468531468531458 +13.251815492200109, 3.7622377622377616 +14.060045723507262, 3.986013986013986 +15.926707907477144, 4.517482517482517 +17.25470683162991, 4.965034965034964 +18.563474986551913, 5.412587412587412 +19.891541151156535, 5.8881118881118875 +21.16191500806886, 6.363636363636363 +21.95118343195266, 6.699300699300698 +22.682759548144162, 7.034965034965035 +23.645642818719743, 7.594405594405593 +24.339093598708985, 8.06993006993007 +24.859601936525017, 8.601398601398602 diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index 0df9732ac9..fdf630d3bd 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -14,7 +14,7 @@ class Default(TestCase): The horizontal resolution of the test case coord_type : str - The type of vertical coordinate (``z-star``, ``z-level``, etc.) + The type of vertical coordinate (``sigma``, ``single_layer``, etc.) """ def __init__(self, test_group, resolution, coord_type): @@ -39,7 +39,10 @@ def __init__(self, test_group, resolution, coord_type): subdir = '{}/{}/{}'.format(resolution, coord_type, name) super().__init__(test_group=test_group, name=name, subdir=subdir) + self.add_step(InitialState(test_case=self)) - self.add_step(Forward(test_case=self, cores=4, threads=1)) + for damping_coeff in [0.0025, 0.01]: + self.add_step(Forward(test_case=self, cores=4, threads=1, + damping_coeff=damping_coeff)) self.add_step(Viz(test_case=self)) diff --git a/compass/ocean/tests/drying_slope/forward.py b/compass/ocean/tests/drying_slope/forward.py index b43235f97e..c9c18d7896 100644 --- a/compass/ocean/tests/drying_slope/forward.py +++ b/compass/ocean/tests/drying_slope/forward.py @@ -8,7 +8,7 @@ class Forward(Step): test cases. """ def __init__(self, test_case, name='forward', subdir=None, cores=1, - min_cores=None, threads=1): + min_cores=None, threads=1, damping_coeff=None): """ Create a new test case @@ -35,13 +35,25 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, threads : int, optional the number of threads the step will use + damping_coeff: real, optional + the value of the rayleigh damping coefficient + """ if min_cores is None: min_cores = cores + if damping_coeff is not None: + name ='{}_{}'.format(name, damping_coeff) + super().__init__(test_case=test_case, name=name, subdir=subdir, cores=cores, min_cores=min_cores, threads=threads) + self.add_namelist_file('compass.ocean.tests.drying_slope', 'namelist.forward') + if damping_coeff is not None: + # update the Rayleigh damping coeff to the requested value + options = {'config_Rayleigh_damping_coeff': '{}'.format(damping_coeff)} + self.add_namelist_options(options) + self.add_streams_file('compass.ocean.tests.drying_slope', 'streams.forward') @@ -67,4 +79,5 @@ def run(self): """ Run this step of the test case """ + run_model(self) diff --git a/compass/ocean/tests/drying_slope/viz.py b/compass/ocean/tests/drying_slope/viz.py index 6fc2522360..3c5a8874ca 100644 --- a/compass/ocean/tests/drying_slope/viz.py +++ b/compass/ocean/tests/drying_slope/viz.py @@ -1,6 +1,8 @@ +import os import xarray import numpy import matplotlib.pyplot as plt +import pandas as pd from compass.step import Step @@ -9,7 +11,7 @@ class Viz(Step): """ A step for visualizing XX """ - def __init__(self, test_case): + def __init__(self, test_case, config): """ Create the step @@ -20,69 +22,92 @@ def __init__(self, test_case): """ super().__init__(test_case=test_case, name='viz') - self.add_input_file(filename='output.nc', - target='../forward/output.nc') + for damping_coeff in [0.0025, 0.01]: + self.add_input_file(filename='output_{}.nc'.format(damping_coeff), + target='../forward_{}/output.nc'.format(damping_coeff)) self.add_output_file('ssh_t.png') self.add_output_file('ssh_depth_section.png') + self.config = config def run(self): """ Run this step of the test case """ + section = self.config['paths'] + datapath = section.get('ocean_database_root') - ds = xarray.open_dataset('output.nc') - ssh = ds.ssh - ympas = ds.ssh.where(ds.tidalInputMask).mean('nCells').values - xmpas = numpy.linspace(0, 1.0, len(ds.xtime))*12.0 - x = numpy.linspace(0,12.0,100) - y = 10.0*numpy.sin(x*numpy.pi/12.0) - 10.0 - print(ympas) - #print('ymin={} ymax={}\n'.format(ympas.min(), ympas.max())) + colors = {'MPAS-O':'k', 'analytical':'b', 'ROMS':'g'} + xSsh = numpy.linspace(0,12.0,100) + ySsh = 10.0*numpy.sin(xSsh*numpy.pi/12.0) - 10.0 figsize = [6.4, 4.8] markersize = 20 - # Figures - plt.figure(figsize=figsize, dpi=100) - plt.plot(x, y, lw=3, color='black', label='analytical') - plt.plot(xmpas, ympas, marker='o', label='MPAS-O forward') - plt.legend(frameon=False) - plt.ylabel('Tidal amplitude (m)') - plt.xlabel('Time (hrs)') - plt.suptitle('Tidal amplitude forcing (right side) for MPAS-O and analytical') - plt.savefig('ssh_t.png', bbox_inches='tight', dpi=200) - plt.close() - - # plot cross-sections + + # SSH forcing figure + damping_coeffs = [0.0025, 0.01] + fig1, ax1 = plt.subplots(nrows=len(damping_coeffs), ncols=1, figsize=figsize, dpi=100) + + # Cross-section figure times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] - fig, ax = plt.subplots(nrows=1,ncols=1, sharex=True, sharey=True) - fig.text(0.04, 0.5, 'Channel depth (m)', va='center', rotation='vertical') - fig.text(0.5, 0.02, 'Along channel distance (km)', ha='center') - - plt.xlim(0,25) - plt.ylim(-1, 11) - ax = plt.gca() - ax.invert_yaxis() - ax.spines['top'].set_visible(False) - ax.spines['right'].set_visible(False) - - x = numpy.linspace(0,25,100) - y = 10.0/25.0*x - plt.plot(x, y, 'k-', lw=3) - - for atime in times: - # factor of 1e-16 needed to account for annoying round-off issue to get right time slices - plottime = int((float(atime)/0.2 + 1e-16)*24.0) - #print('{} {} {}'.format(atime, plottime, ds.isel(Time=plottime).xtime.values)) - print('{} {}'.format(atime, plottime)) - ds = ds.drop_vars(numpy.setdiff1d([i for i in ds.variables], ['yCell','ssh'])) - ymean = ds.isel(Time=plottime).groupby('yCell').mean(dim=xarray.ALL_DIMS) - x = ymean.yCell.values/1000.0 - y = ymean.ssh.values - #print('ymin={} ymax={}\n{}\n{}'.format(y.min(), y.max(),x, y)) - print('ymin={} ymax={}\n'.format(y.min(), y.max())) - plt.plot(x, -y)#, *args, **kwargs) - plt.savefig('ssh_section_t.png', bbox_inches='tight', dpi=200) - plt.close() - - ds.close() + locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] + locs = 0.92 - numpy.divide(locs, 11.) + fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, sharex=True, sharey=True) + fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', rotation='vertical') + fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') + + #TODO replace with parameters + xBed = numpy.linspace(0,25,100) + yBed = 10.0/25.0*xBed + + for i, damping_coeff in enumerate(damping_coeffs): + ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ssh = ds.ssh + ympas = ds.ssh.where(ds.tidalInputMask).mean('nCells').values + xmpas = numpy.linspace(0, 1.0, len(ds.xtime))*12.0 + ax1[i].plot(xmpas, ympas, marker='o', label='MPAS-O forward', color=colors['MPAS-O']) + ax1[i].plot(xSsh, ySsh, lw=3, color=colors['analytical'], label='analytical') + ax1[i].set_ylabel('Tidal amplitude (m)') + + ax2[i].text(0.5, 5, 'r = ' + str(damping_coeff)) + ax2[i].set_ylim(-1, 11) + ax2[i].invert_yaxis() + ax2[i].spines['top'].set_visible(False) + ax2[i].spines['right'].set_visible(False) + for atime, ay in zip(times, locs): + + # factor of 1e- needed to account for annoying round-off issue to get right time slices + plottime = int((float(atime)/0.2 + 1e-16)*24.0) + ds = ds.drop_vars(numpy.setdiff1d([i for i in ds.variables], ['yCell','ssh'])) + ymean = ds.isel(Time=plottime).groupby('yCell').mean(dim=xarray.ALL_DIMS) + x = ymean.yCell.values/1000.0 + y = ymean.ssh.values + + ax2[i].plot(xBed, yBed, '-k', lw=3) + mpas = ax2[i].plot(x, -y, color=colors['MPAS-O'], label='MPAS-O') + ax2[i].text(1, ay, atime + ' days', size=8, transform=ax2[i].transAxes) + + for datatype in ['analytical', 'ROMS']: + datafile = '{}/drying_slope/r{}d{}-{}.csv'.format( + datapath,damping_coeff,atime,datatype.lower()) + data = pd.read_csv(datafile, header=None) + ax2[i].scatter(data[0], data[1], + marker = '.', color = colors[datatype], label=datatype) + + ds.close() + + ax1[0].legend(frameon=False) + ax1[1].set_xlabel('Time (hrs)') + + h, l = ax2[0].get_legend_handles_labels() + ax2[0].legend(h[1:4], l[1:4], frameon=False, loc='lower left') + h, l = ax2[1].get_legend_handles_labels() + ax2[1].legend(h[1:4], l[1:4], frameon=False, loc='lower left') + ax2[1].set_xlim(0,25) + + fig1.suptitle('Tidal amplitude forcing (right side) for MPAS-O and analytical') + fig1.savefig('ssh_t.png', bbox_inches='tight', dpi=200) + plt.close(fig1) + + fig2.savefig('ssh_depth_section.png', dpi=200) + plt.close(fig2) From edad8bb54d0fcb06c385643910a8df8bd4337ce2 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Sun, 3 Apr 2022 13:06:50 -0500 Subject: [PATCH 09/24] Add another resolution test case --- compass/ocean/tests/drying_slope/__init__.py | 2 +- .../tests/drying_slope/default/__init__.py | 20 ++++++++++++++++++- .../ocean/tests/drying_slope/drying_slope.cfg | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/compass/ocean/tests/drying_slope/__init__.py b/compass/ocean/tests/drying_slope/__init__.py index 4ffcbc5507..be23b0dc2f 100644 --- a/compass/ocean/tests/drying_slope/__init__.py +++ b/compass/ocean/tests/drying_slope/__init__.py @@ -14,7 +14,7 @@ def __init__(self, mpas_core): """ super().__init__(mpas_core=mpas_core, name='drying_slope') - for resolution in ['1km']: + for resolution in [0.25, 1]: for coord_type in ['sigma']: self.add_test_case( Default(test_group=self, resolution=resolution, diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index fdf630d3bd..508a988b86 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -36,7 +36,11 @@ def __init__(self, test_group, resolution, coord_type): self.resolution = resolution self.coord_type = coord_type - subdir = '{}/{}/{}'.format(resolution, coord_type, name) + if resolution < 1.: + res_name = str(int(resolution*1e3))+'m' + else: + res_name = str(int(resolution))+'km' + subdir = '{}/{}/{}'.format(res_name, coord_type, name) super().__init__(test_group=test_group, name=name, subdir=subdir) @@ -46,3 +50,17 @@ def __init__(self, test_group, resolution, coord_type): damping_coeff=damping_coeff)) self.add_step(Viz(test_case=self)) + def configure(self): + """ + Modify the configuration options for this test case. + """ + + resolution = self.resolution + config = self.config + ny = round(28 / resolution) + if resolution < 1.: + ny += 2 + dc = 1e3 * resolution + + config.set('drying_slope', 'ny', '{}'.format(ny)) + config.set('drying_slope', 'dc', '{}'.format(dc)) diff --git a/compass/ocean/tests/drying_slope/drying_slope.cfg b/compass/ocean/tests/drying_slope/drying_slope.cfg index b0c683b7a4..f2dc9394fa 100644 --- a/compass/ocean/tests/drying_slope/drying_slope.cfg +++ b/compass/ocean/tests/drying_slope/drying_slope.cfg @@ -12,7 +12,7 @@ coord_type = sigma # the number of grid cells in x and y nx = 6 -ny = 114 +ny = 28 # the size of grid cells (m) dc = 1000.0 From e05f193c38933a6f881f79f1211a2db477320acd Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Mon, 4 Apr 2022 18:36:53 -0500 Subject: [PATCH 10/24] Move viz and add movie --- .../ocean/tests/drying_slope/drying_slope.cfg | 9 + compass/ocean/tests/drying_slope/viz.py | 113 ------ .../ocean/tests/drying_slope/viz/__init__.py | 50 +++ compass/ocean/tests/drying_slope/viz/plot.py | 322 ++++++++++++++++++ 4 files changed, 381 insertions(+), 113 deletions(-) delete mode 100644 compass/ocean/tests/drying_slope/viz.py create mode 100644 compass/ocean/tests/drying_slope/viz/__init__.py create mode 100755 compass/ocean/tests/drying_slope/viz/plot.py diff --git a/compass/ocean/tests/drying_slope/drying_slope.cfg b/compass/ocean/tests/drying_slope/drying_slope.cfg index f2dc9394fa..6bdbd5dc32 100644 --- a/compass/ocean/tests/drying_slope/drying_slope.cfg +++ b/compass/ocean/tests/drying_slope/drying_slope.cfg @@ -16,3 +16,12 @@ ny = 28 # the size of grid cells (m) dc = 1000.0 + +# config options for visualizing ISOMIP+ ouptut +[drying_slope_viz] + +# frames per second for movies +frames_per_second = 30 + +# movie format +movie_format = mp4 diff --git a/compass/ocean/tests/drying_slope/viz.py b/compass/ocean/tests/drying_slope/viz.py deleted file mode 100644 index 3c5a8874ca..0000000000 --- a/compass/ocean/tests/drying_slope/viz.py +++ /dev/null @@ -1,113 +0,0 @@ -import os -import xarray -import numpy -import matplotlib.pyplot as plt -import pandas as pd - -from compass.step import Step - - -class Viz(Step): - """ - A step for visualizing XX - """ - def __init__(self, test_case, config): - """ - Create the step - - Parameters - ---------- - test_case : compass.TestCase - The test case this step belongs to - """ - super().__init__(test_case=test_case, name='viz') - - for damping_coeff in [0.0025, 0.01]: - self.add_input_file(filename='output_{}.nc'.format(damping_coeff), - target='../forward_{}/output.nc'.format(damping_coeff)) - self.add_output_file('ssh_t.png') - self.add_output_file('ssh_depth_section.png') - self.config = config - - def run(self): - """ - Run this step of the test case - """ - section = self.config['paths'] - datapath = section.get('ocean_database_root') - - colors = {'MPAS-O':'k', 'analytical':'b', 'ROMS':'g'} - xSsh = numpy.linspace(0,12.0,100) - ySsh = 10.0*numpy.sin(xSsh*numpy.pi/12.0) - 10.0 - - figsize = [6.4, 4.8] - markersize = 20 - - # SSH forcing figure - damping_coeffs = [0.0025, 0.01] - fig1, ax1 = plt.subplots(nrows=len(damping_coeffs), ncols=1, figsize=figsize, dpi=100) - - # Cross-section figure - times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] - locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] - locs = 0.92 - numpy.divide(locs, 11.) - fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, sharex=True, sharey=True) - fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', rotation='vertical') - fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') - - #TODO replace with parameters - xBed = numpy.linspace(0,25,100) - yBed = 10.0/25.0*xBed - - for i, damping_coeff in enumerate(damping_coeffs): - ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) - ssh = ds.ssh - ympas = ds.ssh.where(ds.tidalInputMask).mean('nCells').values - xmpas = numpy.linspace(0, 1.0, len(ds.xtime))*12.0 - ax1[i].plot(xmpas, ympas, marker='o', label='MPAS-O forward', color=colors['MPAS-O']) - ax1[i].plot(xSsh, ySsh, lw=3, color=colors['analytical'], label='analytical') - ax1[i].set_ylabel('Tidal amplitude (m)') - - ax2[i].text(0.5, 5, 'r = ' + str(damping_coeff)) - ax2[i].set_ylim(-1, 11) - ax2[i].invert_yaxis() - ax2[i].spines['top'].set_visible(False) - ax2[i].spines['right'].set_visible(False) - for atime, ay in zip(times, locs): - - # factor of 1e- needed to account for annoying round-off issue to get right time slices - plottime = int((float(atime)/0.2 + 1e-16)*24.0) - ds = ds.drop_vars(numpy.setdiff1d([i for i in ds.variables], ['yCell','ssh'])) - ymean = ds.isel(Time=plottime).groupby('yCell').mean(dim=xarray.ALL_DIMS) - x = ymean.yCell.values/1000.0 - y = ymean.ssh.values - - ax2[i].plot(xBed, yBed, '-k', lw=3) - mpas = ax2[i].plot(x, -y, color=colors['MPAS-O'], label='MPAS-O') - ax2[i].text(1, ay, atime + ' days', size=8, transform=ax2[i].transAxes) - - for datatype in ['analytical', 'ROMS']: - datafile = '{}/drying_slope/r{}d{}-{}.csv'.format( - datapath,damping_coeff,atime,datatype.lower()) - data = pd.read_csv(datafile, header=None) - ax2[i].scatter(data[0], data[1], - marker = '.', color = colors[datatype], label=datatype) - - ds.close() - - ax1[0].legend(frameon=False) - ax1[1].set_xlabel('Time (hrs)') - - h, l = ax2[0].get_legend_handles_labels() - ax2[0].legend(h[1:4], l[1:4], frameon=False, loc='lower left') - h, l = ax2[1].get_legend_handles_labels() - ax2[1].legend(h[1:4], l[1:4], frameon=False, loc='lower left') - ax2[1].set_xlim(0,25) - - fig1.suptitle('Tidal amplitude forcing (right side) for MPAS-O and analytical') - fig1.savefig('ssh_t.png', bbox_inches='tight', dpi=200) - plt.close(fig1) - - fig2.savefig('ssh_depth_section.png', dpi=200) - plt.close(fig2) - diff --git a/compass/ocean/tests/drying_slope/viz/__init__.py b/compass/ocean/tests/drying_slope/viz/__init__.py new file mode 100644 index 0000000000..e62b02ea3d --- /dev/null +++ b/compass/ocean/tests/drying_slope/viz/__init__.py @@ -0,0 +1,50 @@ +import os +import xarray +import numpy +import matplotlib.pyplot as plt +import pandas as pd + +from compass.step import Step +from compass.ocean.tests.drying_slope.viz.plot import MoviePlotter, \ + TimeSeriesPlotter + + +class Viz(Step): + """ + A step for visualizing drying slope results, as well as comparison with + analytical solution and ROMS results. + """ + def __init__(self, test_case): + """ + Create the step + + Parameters + ---------- + test_case : compass.TestCase + The test case this step belongs to + """ + super().__init__(test_case=test_case, name='viz') + + for damping_coeff in [0.0025, 0.01]: + self.add_input_file(filename='output_{}.nc'.format(damping_coeff), + target='../forward_{}/output.nc'.format( + damping_coeff)) + + def run(self): + """ + Run this step of the test case + """ + section = self.config['paths'] + datapath = section.get('ocean_database_root') + section = self.config['drying_slope_viz'] + frames_per_second = section.getint('frames_per_second') + movie_format = section.get('movie_format') + + tsPlotter = TimeSeriesPlotter() + tsPlotter.plot_ssh_validation(datapath) + tsPlotter.plot_ssh_time_series() + + mPlotter = MoviePlotter() + mPlotter.plot_ssh_validation(datapath) + mPlotter.images_to_movies(framesPerSecond=frames_per_second, + extension=movie_format) diff --git a/compass/ocean/tests/drying_slope/viz/plot.py b/compass/ocean/tests/drying_slope/viz/plot.py new file mode 100755 index 0000000000..611ad39655 --- /dev/null +++ b/compass/ocean/tests/drying_slope/viz/plot.py @@ -0,0 +1,322 @@ +#!/usr/bin/env python +""" + +Drying slope comparison betewen MPAS-O, analytical, and ROMS results from + +Warner, J. C., Defne, Z., Haas, K., & Arango, H. G. (2013). A wetting and +drying scheme for ROMS. Computers & geosciences, 58, 54-61. + +Phillip J. Wolfram and Zhendong Cao +04/30/2019 + +""" + +import os +import numpy +import xarray +import matplotlib.pyplot as plt +import pandas as pd +import subprocess + + +class TimeSeriesPlotter(object): + """ + A plotter object to hold on to some info needed for plotting time series + from drying slope simulation results + + Attributes + ---------- + inFolder : str + The folder with simulation results + + outFolder : str + The folder where images will be written + + """ + def __init__(self, inFolder='.', outFolder='plots'): + """ + Create a plotter object to hold on to some info needed for plotting + time series from drying slope simulation results + + Parameters + ---------- + inFolder : str, optional + The folder with simulation results + + outFolder : str, optional + The folder where images will be written + + dsMesh : xarray.Dataset, optional + The MPAS mesh + + ds : xarray.Dataset, optional + The time series output + """ + + self.inFolder = inFolder + self.outFolder = outFolder + + if not os.path.exists(outFolder): + try: + os.makedirs(os.path.join(os.getcwd(), self.outFolder)) + except OSError: + pass + + plt.switch_backend('Agg') + + def plot_ssh_time_series(self): + """ + """ + colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} + xSsh = numpy.linspace(0, 12.0, 100) + ySsh = 10.0*numpy.sin(xSsh*numpy.pi/12.0) - 10.0 + + figsize = [6.4, 4.8] + markersize = 20 + + # SSH forcing figure + damping_coeffs = [0.0025, 0.01] + fig1, ax1 = plt.subplots(nrows=len(damping_coeffs), ncols=1, + figsize=figsize, dpi=100) + for i, damping_coeff in enumerate(damping_coeffs): + ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ssh = ds.ssh + ympas = ds.ssh.where(ds.tidalInputMask).mean('nCells').values + xmpas = numpy.linspace(0, 1.0, len(ds.xtime))*12.0 + ax1[i].plot(xmpas, ympas, marker='o', label='MPAS-O forward', + color=colors['MPAS-O']) + ax1[i].plot(xSsh, ySsh, lw=3, label='analytical', + color=colors['analytical']) + ax1[i].set_ylabel('Tidal amplitude (m)') + ds.close() + + ax1[0].legend(frameon=False) + ax1[1].set_xlabel('Time (hrs)') + + fig1.suptitle('Tidal amplitude forcing (right side)') + fig1.savefig('{}/ssh_t.png'.format(self.outFolder), + bbox_inches='tight', dpi=200) + plt.close(fig1) + + def plot_ssh_validation(self, datapath): + """ + """ + colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} + + # Cross-section figure + times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] + locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] + locs = 0.92 - numpy.divide(locs, 11.) + + damping_coeffs = [0.0025, 0.01] + + fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, + sharex=True, sharey=True) + fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', + rotation='vertical') + fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') + + xBed = numpy.linspace(0, 25, 100) + yBed = 10.0/25.0*xBed + + for i, damping_coeff in enumerate(damping_coeffs): + ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ds = ds.drop_vars(numpy.setdiff1d([j for j in ds.variables], + ['yCell', 'ssh'])) + + ax2[i].plot(xBed, yBed, '-k', lw=3) + ax2[i].text(0.5, 5, 'r = ' + str(damping_coeff)) + ax2[i].set_xlim(0, 25) + ax2[i].set_ylim(-1, 11) + ax2[i].invert_yaxis() + ax2[i].spines['top'].set_visible(False) + ax2[i].spines['right'].set_visible(False) + + for atime, ay in zip(times, locs): + + # Plot MPAS-O data + # factor of 1e- needed to account for annoying round-off issue + # to get right time slices + plottime = int((float(atime)/0.2 + 1e-16)*24.0) + ymean = ds.isel(Time=plottime).groupby('yCell').mean( + dim=xarray.ALL_DIMS) + x = ymean.yCell.values/1000.0 + y = ymean.ssh.values + + mpas = ax2[i].plot(x, -y, label='MPAS-O', + color=colors['MPAS-O']) + ax2[i].text(1, ay, atime + ' days', size=8, + transform=ax2[i].transAxes) + + # Plot comparison data + for datatype in ['analytical', 'ROMS']: + datafile = '{}/drying_slope/r{}d{}-{}.csv'.format( + datapath,damping_coeff,atime,datatype.lower()) + data = pd.read_csv(datafile, header=None) + ax2[i].scatter(data[0], data[1], marker='.', + color=colors[datatype], label=datatype) + + ds.close() + + h, l0 = ax2[0].get_legend_handles_labels() + ax2[0].legend(h[0:3], l0[0:3], frameon=False, loc='lower left') + h, l1 = ax2[1].get_legend_handles_labels() + ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') + + if not os.path.exists(self.outFolder): + try: + os.makedirs(os.path.join(os.getcwd(), self.outFolder)) + except OSError: + pass + + fig2.savefig('{}/ssh_depth_section.png'.format(self.outFolder), + dpi=200) + plt.close(fig2) + + +class MoviePlotter(object): + """ + A plotter object to hold on to some info needed for plotting images from + drying slope simulation results + + Attributes + ---------- + inFolder : str + The folder with simulation results + + outFolder : str + The folder where images will be written + """ + + def __init__(self, inFolder='.', outFolder='plots'): + """ + Create a plotter object to hold on to some info needed for plotting + images from drying slope simulation results + + Parameters + ---------- + inFolder : str + The folder with simulation results + + outFolder : str + The folder where images will be written + """ + self.inFolder = inFolder + self.outFolder = outFolder + + if not os.path.exists(outFolder): + try: + os.makedirs(os.path.join(os.getcwd(), self.outFolder)) + except OSError: + pass + + plt.switch_backend('Agg') + + def plot_ssh_validation(self, datapath): + """ + Compare ssh along the channel at different time slices with the + analytical solution and ROMS results. + + Parameters + ---------- + datapath: str + The folder with analytical and ROMS results for comparison + + """ + colors = {'MPAS-O':'k', 'analytical':'b', 'ROMS':'g'} + + times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] + locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] + locs = 0.92 - numpy.divide(locs, 11.) + + damping_coeffs = [0.0025, 0.01] + + xBed = numpy.linspace(0,25,100) + yBed = 10.0/25.0*xBed + + ii = 0 + # Plot profiles over the 12h simulation duration + for itime in numpy.linspace(0,0.5,5*12+1): + + plottime = int((float(itime)/0.2 + 1e-16)*24.0) + + fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, + sharex=True, sharey=True) + ax2[0].set_title('t = {0:.3f} days'.format(itime)) + fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', + rotation='vertical') + fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') + + for i, damping_coeff in enumerate(damping_coeffs): + + ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ds = ds.drop_vars(numpy.setdiff1d([j for j in ds.variables], + ['yCell', 'ssh'])) + + # Plot MPAS-O snapshots + # factor of 1e- needed to account for annoying round-off issue + # to get right time slices + ymean = ds.isel(Time=plottime).groupby('yCell').mean( + dim=xarray.ALL_DIMS) + x = ymean.yCell.values/1000.0 + y = ymean.ssh.values + ax2[i].plot(xBed, yBed, '-k', lw=3) + mpas = ax2[i].plot(x, -y, label='MPAS-O', + color=colors['MPAS-O']) + + ax2[i].text(0.5, 5, 'r = ' + str(damping_coeff)) + ax2[i].set_ylim(-1, 11) + ax2[i].set_xlim(0, 25) + ax2[i].invert_yaxis() + ax2[i].spines['top'].set_visible(False) + ax2[i].spines['right'].set_visible(False) + + # Plot comparison data + for atime, ay in zip(times, locs): + ax2[i].text(1, ay, atime + ' days', size=8, + transform=ax2[i].transAxes) + + for datatype in ['analytical', 'ROMS']: + datafile = '{}/drying_slope/r{}d{}-{}.csv'.format( + datapath, damping_coeff, atime, datatype.lower()) + data = pd.read_csv(datafile, header=None) + ax2[i].scatter(data[0], data[1], marker = '.', + color = colors[datatype], label=datatype) + + ds.close() + + h, l0 = ax2[0].get_legend_handles_labels() + ax2[0].legend(h[0:3], l0[0:3], frameon=False, loc='lower left') + h, l1 = ax2[1].get_legend_handles_labels() + ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') + + fig2.savefig('{}/ssh_depth_section_{:03d}.png'.format( + self.outFolder, ii), dpi=200) + plt.close(fig2) + ii += 1 + + def images_to_movies(self, outFolder='.', framesPerSecond=30, extension='mp4', + overwrite=True): + """ + Convert all the image sequences into movies with ffmpeg + """ + try: + os.makedirs('{}/logs'.format(outFolder)) + except OSError: + pass + + framesPerSecond = '{}'.format(framesPerSecond) + prefix = 'ssh_depth_section' + outFileName = '{}/{}.{}'.format(outFolder, prefix, extension) + if overwrite or not os.path.exists(outFileName): + + imageFileTemplate = '{}/{}_%03d.png'.format(self.outFolder, + prefix) + logFileName = '{}/logs/{}.log'.format(outFolder, prefix) + with open(logFileName, 'w') as logFile: + args = ['ffmpeg', '-y', '-r', framesPerSecond, + '-i', imageFileTemplate, '-b:v', '32000k', + '-r', framesPerSecond, '-pix_fmt', 'yuv420p', + outFileName] + print('running {}'.format(' '.join(args))) + subprocess.check_call(args, stdout=logFile, stderr=logFile) From c8713d3f69a15aacabc595b4b8bbe3e6751fec76 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Tue, 5 Apr 2022 14:48:08 -0500 Subject: [PATCH 11/24] Move comparison data to public_html --- .../r0.0025d0.05-analytical.csv | 7 ---- .../comparison_data/r0.0025d0.05-roms.csv | 8 ----- .../r0.0025d0.15-analytical.csv | 22 ------------ .../comparison_data/r0.0025d0.15-roms.csv | 24 ------------- .../r0.0025d0.25-analytical.csv | 30 ---------------- .../comparison_data/r0.0025d0.25-roms.csv | 29 ---------------- .../r0.0025d0.30-analytical.csv | 34 ------------------- .../comparison_data/r0.0025d0.30-roms.csv | 32 ----------------- .../r0.0025d0.40-analytical.csv | 32 ----------------- .../comparison_data/r0.0025d0.40-roms.csv | 32 ----------------- .../r0.0025d0.50-analytical.csv | 28 --------------- .../comparison_data/r0.0025d0.50-roms.csv | 27 --------------- .../comparison_data/r0.01d0.05-analytical.csv | 7 ---- .../comparison_data/r0.01d0.05-roms.csv | 6 ---- .../comparison_data/r0.01d0.15-analytical.csv | 11 ------ .../comparison_data/r0.01d0.15-roms.csv | 17 ---------- .../comparison_data/r0.01d0.25-analytical.csv | 22 ------------ .../comparison_data/r0.01d0.25-roms.csv | 24 ------------- .../comparison_data/r0.01d0.30-analytical.csv | 28 --------------- .../comparison_data/r0.01d0.30-roms.csv | 29 ---------------- .../comparison_data/r0.01d0.40-analytical.csv | 31 ----------------- .../comparison_data/r0.01d0.40-roms.csv | 30 ---------------- .../comparison_data/r0.01d0.50-analytical.csv | 24 ------------- .../comparison_data/r0.01d0.50-roms.csv | 20 ----------- 24 files changed, 554 deletions(-) delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-roms.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-analytical.csv delete mode 100644 compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-roms.csv diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-analytical.csv deleted file mode 100644 index 4d41c4b9f6..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-analytical.csv +++ /dev/null @@ -1,7 +0,0 @@ -20.433617965734783, 7.95631020193958 -20.988350480522175, 7.55729639307698 -21.690191662202203, 7.318544110733299 -22.50256934498103, 7.133321671058239 -23.204082525174112, 7.001235472267473 -24.016214206837738, 6.896012595257096 -24.920514306331523, 6.817620239878417 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-roms.csv deleted file mode 100644 index e9e4a6dcef..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.05-roms.csv +++ /dev/null @@ -1,8 +0,0 @@ -21.20737347342641, 8.33101910061992 -21.410898396072728, 8.144714256037958 -21.818194242480562, 7.692105004209349 -22.464603172867715, 7.479920842307816 -23.147748269792153, 7.321135322480124 -23.812443283076213, 7.162317002503743 -24.476892295245072, 7.083498245192041 -24.97537255502225, 6.977717765653868 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-analytical.csv deleted file mode 100644 index 4ebe1aabb5..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-analytical.csv +++ /dev/null @@ -1,22 +0,0 @@ -9.137246755518625, 3.536227764232529 -9.74782152345757, 2.9773132304866436 -10.96626504706821, 2.739479352306396 -12.03694390081235, 2.5547161147130524 -13.365677924406592, 2.4504116418661086 -14.0670271038562, 2.371658484851796 -14.749844199293703, 2.3195390485770186 -15.432661294731203, 2.267419612302241 -16.09694630615659, 2.241933896766997 -16.761313317953707, 2.1897816603435256 -17.425680329750826, 2.1376294239200533 -18.12686550845697, 2.112209308682198 -18.7542503526016, 2.0866579928495668 -19.455517531679476, 2.0345713567234824 -20.13825262674524, 2.0091184413369323 -20.820987721811008, 1.9836655259503821 -21.46690464996774, 1.9314804893782167 -22.131107661021396, 1.9326612947312016 -22.813842756087162, 1.9072083793446515 -23.478127767512543, 1.8817226638094073 -24.179394946590424, 1.829636027683323 -24.880498124924834, 1.830882433333696 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-roms.csv deleted file mode 100644 index 2188799869..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.15-roms.csv +++ /dev/null @@ -1,24 +0,0 @@ -10.169385434547303, 3.8847293441063586 -10.26229185572308, 3.671561177744004 -10.780042202857983, 3.299148289472244 -11.444983217257251, 3.0603304068311763 -12.072860063632286, 2.874779965669176 -12.755677159069787, 2.8226605293943994 -13.420208171610378, 2.7171752511944707 -14.084739184150967, 2.611689972994543 -14.749188196319823, 2.5328712156828423 -15.432005291757319, 2.480751779408065 -16.096372303554446, 2.4285995429845935 -16.760657314979827, 2.4031138274493493 -17.443556410789064, 2.3243278702863437 -18.10784142221445, 2.2988421547510995 -18.79065851765195, 2.246722718476322 -19.454861528705596, 2.247903523829306 -20.11931054087445, 2.1690847665176065 -20.783595552299833, 2.1435990509823624 -21.4663306473656, 2.118146135595812 -22.149147742803102, 2.0660266993210357 -22.813350753856753, 2.0672075046740197 -23.477717765653868, 2.0150552682505474 -24.17890294436001, 1.9896351530126912 -24.824655871773288, 1.9907831582169813 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-analytical.csv deleted file mode 100644 index c091707def..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-analytical.csv +++ /dev/null @@ -1,30 +0,0 @@ -1.7847654242699238, 0.563156686310311 -2.4866066059499468, 0.32440440396663117 -3.353924537791238, 0.2726129691787933 -4.368925139127297, 0.1944174146922797 -5.9189781660343534, 0.11717306451789256 -7.838032865748991, 0.040584717317385 -9.240321222789543, 0.016411007729901783 -9.978324568404709, 0.017723013677660937 -10.568727244896843, 0.01877261843586897 -11.30673059051201, 0.020084624383629457 -11.934115434656636, -0.005466691449001804 -12.598318445710287, -0.004285886096017322 -13.26260345713567, -0.02977160163126147 -13.908356384548943, -0.02862359642697232 -14.591009479242972, -0.02740999092529295 -15.25521249029662, -0.02622918557230891 -15.937947585362386, -0.05168210095885861 -16.58370051277566, -0.050534095754568575 -17.284885691481797, -0.07595421099242428 -17.96753878617583, -0.07474060549074624 -18.613291713589106, -0.0735926002864562 -19.27749472464275, -0.07241179493347127 -19.9416977356964, -0.07123098958048768 -20.62435083039043, -0.07001738407880964 -21.307085925456196, -0.0954702994653589 -21.971288936509843, -0.09428949411237486 -22.653942031203872, -0.09307588861069682 -23.3365951258979, -0.09186228310901878 -24.000798136951556, -0.09068147775603475 -24.665001148005203, -0.08950067240304982 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-roms.csv deleted file mode 100644 index b9d63b6d80..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.25-roms.csv +++ /dev/null @@ -1,29 +0,0 @@ -2.5047286881033863, 0.431103287668237 -3.7968085455320737, 0.24673365185922114 -4.811891147239866, 0.1418715764844798 -5.549894492855035, 0.14318358243223983 -6.2140975039086825, 0.1443643877852243 -7.0628833517378595, 0.11920667373692062 -8.096252036342563, 0.06771044028732875 -9.277139389698565, 0.04314312891551708 -9.904524233843194, 0.01759181308288582 -10.550277161256462, 0.01873981828717497 -11.897133267004142, 0.02113422914183838 -13.262521456763936, -0.003105080743033284 -13.889824300536828, -0.001989875687437248 -14.572477395230857, -0.0007762701857596532 -15.291948656833904, 0.02716945650153546 -15.956233668259296, 0.0016837409662908698 -16.60198659567257, 0.0028317461705809066 -17.30308977400697, 0.004078151820953835 -17.930392617779866, 0.005193356876550315 -18.631495796114276, 0.006439762526922355 -19.295698807167927, 0.007620567879905948 -19.97826990149022, 0.03550069426981217 -20.64247291254387, 0.03668149962279621 -21.325126007237895, 0.03789510512447558 -21.98932901829155, 0.03907591047745873 -22.653532029345197, 0.0402567158304441 -23.336185124039226, 0.04147032133212125 -24.00038813509288, 0.04265112668510529 -24.664591146146527, 0.04383193203808977 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-analytical.csv deleted file mode 100644 index ba832308ad..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-analytical.csv +++ /dev/null @@ -1,34 +0,0 @@ -0.5316357434153707, 0.08092890021101429 -1.5280222603675813, 0.056033587352262604 -2.229043438330254, 0.08394651389086283 -2.8932464493839034, 0.08512731924384731 -3.575899544077933, 0.08634092474552535 -4.258552638771963, 0.08755453024720383 -4.867241398161003, 0.1419699769305618 -5.5867946601357925, 0.1432491827296274 -6.287897838470201, 0.14449558838000032 -8.206706537069634, 0.14790680384417687 -8.907809715404042, 0.1491532094945489 -9.60874889299498, 0.20373265692137732 -10.291319987317275, 0.23161278331128354 -10.937154915102278, 0.20609426762734584 -11.619808009796309, 0.20730787312902388 -12.265478936837846, 0.2351223992215421 -12.96650011480052, 0.2630353257601423 -14.33180630418858, 0.26546253676349885 -14.977559231601843, 0.2666105419677889 -15.660212326295875, 0.2678241474694669 -16.324333336977798, 0.2956714737106796 -16.951636180750686, 0.2967866787662756 -17.689639526365852, 0.2980986847140361 -18.353760537047766, 0.32594601095524833 -19.017963548101417, 0.32712681630823237 -19.682166559155068, 0.32830762166121685 -20.364819653849093, 0.3295212271628949 -21.010490580890632, 0.35733575325541356 -21.674693591944283, 0.3585165586083976 -22.37579677027869, 0.35976296425876964 -23.03999978133234, 0.3609437696117537 -23.685670708373877, 0.38875829570427145 -24.36832380306791, 0.38997190120594993 -24.94027639591966, 0.39098870581546397 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-roms.csv deleted file mode 100644 index 9cb1c460c8..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.30-roms.csv +++ /dev/null @@ -1,32 +0,0 @@ -2.4677465204508926, 0.4577042082590772 -3.741458294610936, 0.24663525141313913 -4.424193389676699, 0.22118233602658988 -5.088560401473819, 0.16903009960311755 -5.93726424893126, 0.17053890644304204 -7.302570438319318, 0.17296611744639812 -8.243606704350393, 0.14797240414156443 -8.944791883056537, 0.12255228890370828 -9.572094726829425, 0.12366749395930476 -10.2731159047921, 0.15158042049790543 -10.937236915474015, 0.1794277467391181 -11.601439926527664, 0.1806085520921017 -12.284093021221693, 0.18182215759377973 -12.96658211517225, 0.23636880487191458 -13.612253042213792, 0.26418333096443236 -14.479242972568139, 0.3190579797295072 -14.995845314498757, 0.31997638389293925 -15.641680242283767, 0.2944578682090011 -16.32425133660606, 0.3223379945989078 -16.988454347659708, 0.3235187999518918 -17.689475525622385, 0.35143172649049204 -18.335146452663917, 0.3792462525830098 -19.017799547357946, 0.38045985808468785 -19.681920558039863, 0.4083071843259005 -20.34604156872178, 0.43615451056711274 -21.028612663044072, 0.4640346369570194 -21.72971584137848, 0.46528104260739145 -22.39391885243213, 0.46646184796037593 -23.076489946754425, 0.49434197435028215 -23.74061095743634, 0.5221893005914944 -24.386363884849615, 0.5233373057957849 -24.95823447732963, 0.5510206312935266 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-analytical.csv deleted file mode 100644 index 16ebde420e..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-analytical.csv +++ /dev/null @@ -1,32 +0,0 @@ -2.227239430152084, 0.6706099734318793 -4.033543618731072, 1.2604878475449084 -4.826241212293496, 1.4752304210445741 -5.489870220745004, 1.6630768726151555 -6.116763062659217, 1.7975246821118915 -6.780474071482457, 1.9587046127942438 -7.444267080677433, 2.093218022588368 -8.126510173512786, 2.227764232531186 -8.790385183079497, 2.3356111214370827 -9.47262827591485, 2.470157331379901 -10.118135202212915, 2.5513048992488754 -10.782010211779628, 2.6591517881547713 -12.10984223128478, 2.8481790450783375 -12.7922493248636, 2.9293922132446983 -13.456206334802049, 3.010572581262367 -14.120163344740492, 3.0917529492800355 -14.784120354678942, 3.1729333172977032 -15.466609448629496, 3.2274799645758376 -16.112116374927567, 3.3086275324448122 -16.813055552518506, 3.3632069798716397 -17.477094562828682, 3.41772082700108 -18.14105157276713, 3.4989011950187487 -18.823540666717683, 3.5534478422968823 -19.506029760668252, 3.6079944895750167 -20.170068770978432, 3.662508336704457 -20.83410778128861, 3.7170221838338975 -21.498228791970522, 3.7448695100751097 -22.180717885921084, 3.799416157353245 -22.826306812590886, 3.8538972043339914 -23.508795906541444, 3.908443851612124 -24.191367000863735, 3.9363239780020303 -24.855406011173915, 3.9908378251314716 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-roms.csv deleted file mode 100644 index 570c14bbae..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.40-roms.csv +++ /dev/null @@ -1,32 +0,0 @@ -3.480533111750107, 1.0995047177547201 -4.770726960628888, 1.5284650623749485 -5.489706220001532, 1.716409914391611 -6.153417228824772, 1.877589845073964 -6.79867815400763, 2.0387369756076223 -7.444021079562228, 2.1732175852530524 -8.12626417239758, 2.3077637951958705 -8.808507265232937, 2.4423100051386886 -9.453768190415795, 2.6034571356723477 -10.11772520035424, 2.6846375036900163 -10.781600209920954, 2.792484392595912 -11.427107136219016, 2.873631960464885 -12.109432229426105, 2.9815116495194767 -12.77338923936455, 3.0626920175371453 -13.437346249302996, 3.143872385554813 -14.11975334288182, 3.2250855537211747 -14.783710352820266, 3.3062659217388433 -15.44766736275871, 3.387446289756512 -16.13015645670927, 3.4419929370346463 -16.812645550659827, 3.4965395843127807 -17.476602560598277, 3.5777199523304475 -18.140641570908453, 3.632233799459888 -18.84158074849939, 3.686813246886717 -19.4871696751692, 3.7412942938674636 -20.151208685479375, 3.795808140996904 -20.833697779429933, 3.8503547882750384 -21.49773678974011, 3.904868635404478 -22.18030788406241, 3.932748761794384 -22.82589681073221, 3.9872298087751306 -23.526835988323143, 4.041809256201959 -24.172506915364682, 4.069623782294477 -24.854996009315244, 4.124170429572612 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-analytical.csv deleted file mode 100644 index f6f07bbe72..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-analytical.csv +++ /dev/null @@ -1,28 +0,0 @@ -6.060018805418585, 2.250757136765686 -6.760383980407376, 2.49200223041011 -7.6450039906847564, 2.8135748882061593 -8.603342335151918, 3.161945267485212 -9.561680679619078, 3.5103156467642647 -10.759624110295965, 3.939111990641022 -11.66261220384199, 4.287383969473994 -12.289259044641, 4.501831341635414 -12.934355969080398, 4.716311513945528 -13.579452893519784, 4.930791686255642 -14.24283590085608, 5.198637700490908 -14.888014825667208, 5.386451351912793 -15.569929917015623, 5.627663645408523 -16.215026841455018, 5.842143817718638 -16.860041765522666, 6.08329051091698 -17.52358877360244, 6.297803483375789 -18.168603697670097, 6.538950176574131 -18.832150705749864, 6.753463149032939 -19.47724763018926, 6.9679433213430535 -20.14071263789729, 7.209122814690092 -20.841077812886084, 7.450367908334515 -21.467724653685096, 7.664815280495937 -22.094371494484104, 7.879262652657356 -22.757836502192145, 8.120442146004391 -23.402769425888064, 8.388255360090966 -24.010802182303227, 8.656002973880144 -24.710593354689877, 9.083913713742165 -25.02276876988509, 9.564468692258068 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-roms.csv deleted file mode 100644 index 042ba5a449..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.0025d0.50-roms.csv +++ /dev/null @@ -1,27 +0,0 @@ -7.829258825973344, 2.893902452357782 -8.45582366640062, 3.135016345407432 -9.08247050719963, 3.3494637175688515 -9.67213518034615, 3.5905120103211114 -10.4094005226157, 3.831822704262925 -11.035965363042976, 4.072936597312573 -11.644080119829876, 4.314017690213527 -12.307627127909644, 4.5285306626723365 -12.952642051977302, 4.769677355870678 -13.597656976044954, 5.01082404906902 -14.242671900112613, 5.251970742267364 -14.906136907820647, 5.493150235614399 -15.569683915900418, 5.707663208073207 -16.177798672687317, 5.9487443009741625 -16.84126368039535, 6.189923794321199 -17.50481068847512, 6.404436766780007 -18.168275696183155, 6.645616260127044 -18.813372620622545, 6.860096432437157 -19.458387544690204, 7.1012431256355 -20.121852552398238, 7.342422618982537 -20.803767643746653, 7.583634912478267 -21.411964400905283, 7.798049484490992 -22.075429408613324, 8.03922897783803 -22.720526333052707, 8.253709150148145 -23.383909340389014, 8.521555164383408 -23.991942096804173, 8.789302778172592 -24.63671101975662, 9.110449034035621 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-analytical.csv deleted file mode 100644 index 6d76534f8c..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-analytical.csv +++ /dev/null @@ -1,7 +0,0 @@ -22.378967186659498, 8.657342657342657 -22.64671866594944, 8.041958041958042 -23.107315761161917, 7.65034965034965 -23.587345346960735, 7.342657342657342 -24.144432490586336, 7.09090909090909 -24.60556750941366, 6.923076923076923 -24.95145239376009, 6.81118881118881 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-roms.csv deleted file mode 100644 index a5bd7a99ff..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.05-roms.csv +++ /dev/null @@ -1,6 +0,0 @@ -22.64779451317913, 8.489510489510488 -22.91601667563206, 8.06993006993007 -23.45360408821947, 7.706293706293707 -23.914537385691233, 7.454545454545453 -24.414066702528242, 7.258741258741258 -24.721490048413127, 7.146853146853147 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-analytical.csv deleted file mode 100644 index d29bc8069f..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-analytical.csv +++ /dev/null @@ -1,11 +0,0 @@ -13.909494351802046, 5.356643356643356 -14.292361484669176, 4.629370629370629 -14.867939752555138, 4.069930069930069 -15.713017751479288, 3.6223776223776216 -16.789066702528242, 3.2587412587412574 -17.826788596019366, 2.95104895104895 -19.36444324905864, 2.615384615384614 -21.056011296395912, 2.3076923076923066 -22.51701183431953, 2.0839160839160824 -23.8243006993007, 1.9160839160839145 -24.977810650887577, 1.776223776223775 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-roms.csv deleted file mode 100644 index 025c21287b..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.15-roms.csv +++ /dev/null @@ -1,17 +0,0 @@ -14.216043571812804, 4.881118881118881 -14.830016137708448, 4.293706293706292 -15.44459386767079, 3.9580419580419575 -16.097767616998386, 3.6783216783216774 -16.751075847229693, 3.4545454545454533 -17.404451317912855, 3.2587412587412574 -18.077124798278646, 3.09090909090909 -18.730634749865526, 2.95104895104895 -19.3841447014524, 2.811188811188811 -20.056952662721898, 2.6993006993006983 -20.729693383539537, 2.5594405594405583 -21.40250134480904, 2.4475524475524466 -22.07537654653039, 2.3636363636363624 -22.709722969338355, 2.2517482517482508 -23.38259817105971, 2.1678321678321666 -24.05547337278107, 2.083916083916083 -24.74757934373319, 1.9999999999999987 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-analytical.csv deleted file mode 100644 index c99969b952..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-analytical.csv +++ /dev/null @@ -1,22 +0,0 @@ -6.864308768154924, 2.5594405594405583 -7.247713824636902, 2.055944055944055 -7.8236955352339965, 1.6643356643356637 -8.784359870898333, 1.300699300699299 -9.47626412049489, 1.132867132867132 -10.398870360408823, 0.9370629370629362 -11.28314954276493, 0.7972027972027962 -11.763851533082303, 0.7692307692307678 -12.436659494351801, 0.6573426573426562 -13.12869822485207, 0.5454545454545441 -14.436054330285103, 0.4055944055944041 -15.935718128025819, 0.26573426573426495 -17.781603012372244, 0.15384615384615286 -19.166016675632058, 0.06993006993006912 -19.839026358257126, 0.041958041958040315 -20.512036040882197, 0.013986013986012624 -21.204276492738032, -0.01398601398601551 -21.85805540613233, -0.041958041958043424 -22.51183431952663, -0.06993006993007156 -23.184844002151696, -0.09790209790209925 -23.8963152232383, -0.12587412587412738 -24.5500941366326, -0.1538461538461553 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-roms.csv deleted file mode 100644 index f23f09283f..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.25-roms.csv +++ /dev/null @@ -1,24 +0,0 @@ -6.671866594943518, 2.5034965034965024 -7.132127487896719, 1.9720279720279708 -7.727541689080152, 1.6643356643356633 -9.822417966648738, 1.132867132867132 -10.475927918235612, 0.9930069930069925 -11.110274341043572, 0.8811188811188799 -11.763986013986015, 0.8251748251748241 -12.475322754168907, 0.7412587412587399 -13.109669176976869, 0.6293706293706278 -13.801842388380852, 0.573426573426572 -14.49401559978483, 0.5174825174825162 -15.128496503496503, 0.4615384615384599 -15.820736955352341, 0.43356643356643243 -16.647525551371704, 0.37762237762237616 -18.474179666487363, 0.2657342657342645 -19.166352877891338, 0.20979020979020868 -19.858593329747176, 0.18181818181818032 -20.493141473910715, 0.1538461538461524 -21.185381925766542, 0.1258741258741245 -21.858391608391607, 0.09790209790209659 -22.53146853146853, 0.09790209790209659 -23.185247444862835, 0.06993006993006845 -23.8582571274879, 0.04195804195804076 -24.5697283485745, 0.013986013986012624 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-analytical.csv deleted file mode 100644 index d79901f40b..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-analytical.csv +++ /dev/null @@ -1,28 +0,0 @@ -4.650820333512643, 1.748251748251747 -5.2842253899946225, 1.2447552447552432 -6.014389456697151, 0.9930069930069925 -6.610274341043571, 0.8811188811188799 -7.263851533082303, 0.7692307692307678 -7.93672673480366, 0.6853146853146841 -8.513515330823022, 0.6293706293706278 -9.263380849919312, 0.5734265734265724 -10.62856374394836, 0.48951048951048826 -11.628429263044648, 0.43356643356643243 -12.62829478214094, 0.37762237762237616 -13.320535233996775, 0.34965034965034825 -13.935919849381392, 0.34965034965034825 -15.166689080150622, 0.34965034965034825 -15.974314147391073, 0.32167832167832033 -16.647323830016134, 0.2937062937062924 -17.358862291554594, 0.2937062937062924 -18.031871974179666, 0.2657342657342645 -18.685718128025822, 0.2657342657342645 -19.358795051102746, 0.26573426573426406 -20.051169983862295, 0.2937062937062924 -20.72424690693921, 0.2937062937062924 -21.397323830016138, 0.2937062937062924 -22.05116998386229, 0.2937062937062924 -22.743477676169977, 0.2937062937062924 -23.397323830016134, 0.293706293706292 -24.070467993544924, 0.3216783216783199 -24.743544916621843, 0.3216783216783199 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-roms.csv deleted file mode 100644 index 6bda4fc9d3..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.30-roms.csv +++ /dev/null @@ -1,29 +0,0 @@ -4.400753093060786, 1.7202797202797195 -4.707638515330823, 1.3846153846153837 -5.322350726196882, 1.1048951048951037 -5.937331898870362, 0.9370629370629362 -6.590909090909092, 0.8251748251748241 -7.244486282947822, 0.7132867132867116 -7.936659494351803, 0.6573426573426562 -8.628832705755784, 0.6013986013985999 -9.321005917159763, 0.5454545454545441 -10.282409897794514, 0.48951048951048826 -11.397660032275418, 0.43356643356643243 -12.628429263044652, 0.43356643356643243 -13.359131253362026, 0.4055944055944041 -14.012910166756324, 0.37762237762237616 -14.666756320602477, 0.37762237762237616 -15.897660032275418, 0.43356643356643243 -16.705217859064014, 0.37762237762237616 -17.397525551371704, 0.37762237762237616 -18.032140935987094, 0.37762237762237616 -18.705217859064017, 0.37762237762237616 -19.359131253362026, 0.4055944055944045 -20.070669714900482, 0.4055944055944045 -20.705217859064014, 0.37762237762237616 -21.397660032275418, 0.43356643356643243 -22.05150618612157, 0.43356643356643243 -22.74381387842926, 0.43356643356643243 -23.397660032275414, 0.43356643356643243 -24.090034965034967, 0.46153846153846034 -24.782409897794516, 0.48951048951048826 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-analytical.csv deleted file mode 100644 index 9a4f2570e0..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-analytical.csv +++ /dev/null @@ -1,31 +0,0 @@ -3.168504572350726, 1.1048951048951037 -4.0529854760624, 1.0489510489510478 -4.745360408821947, 1.0769230769230758 -5.4377353415814955, 1.1048951048951037 -6.091850457235074, 1.2167832167832153 -6.745763851533084, 1.2447552447552432 -7.380580957504035, 1.3286713286713274 -8.130715438407746, 1.3846153846153837 -8.977138246369016, 1.4965034965034953 -9.977541689080152, 1.6643356643356633 -10.939349112426035, 1.776223776223775 -11.747310381925766, 1.888111888111887 -12.747579343733193, 1.9999999999999987 -13.478617536309844, 2.1118881118881108 -14.132732651963423, 2.2237762237762224 -14.76748251748252, 2.279720279720279 -15.498520710059172, 2.391608391608391 -16.13340505648198, 2.5034965034965024 -16.768222162452933, 2.5874125874125866 -17.480096826250673, 2.7272727272727266 -18.15330823023131, 2.7832167832167816 -18.78819257665412, 2.895104895104894 -19.48076923076923, 3.0069930069930058 -20.17334588488435, 3.1188811188811174 -20.827461000537927, 3.23076923076923 -21.4815761161915, 3.3426573426573416 -22.174152770306616, 3.454545454545454 -22.82826788596019, 3.566433566433566 -23.482383001613773, 3.6783216783216774 -24.174959655728887, 3.79020979020979 -24.82907477138247, 3.9020979020979008 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-roms.csv deleted file mode 100644 index fb8dd1e48a..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.40-roms.csv +++ /dev/null @@ -1,30 +0,0 @@ -3.3604088219472827, 0.9370629370629362 -4.072014523937602, 0.9650349650349641 -4.725995158687468, 1.0209790209790204 -5.379908552985476, 1.0489510489510478 -6.072485207100591, 1.16083916083916 -6.745696611081229, 1.2167832167832153 -7.39974448628295, 1.3006993006992995 -8.169176976869284, 1.3846153846153837 -9.015599784830554, 1.4965034965034953 -10.054464766003228, 1.6643356643356633 -11.131724045185583, 1.8041958041958033 -12.362829478214094, 1.9440559440559433 -13.2862426035503, 2.083916083916083 -14.113501882732653, 2.2237762237762224 -14.806078536847764, 2.335664335664335 -15.479357181280257, 2.4195804195804183 -16.133472296933835, 2.531468531468531 -16.826048951048953, 2.6433566433566424 -17.441635287789136, 2.7272727272727266 -18.1341447014524, 2.811188811188811 -18.788461538461537, 3.0069930069930058 -19.4809709521248, 3.09090909090909 -20.135086067778374, 3.2027972027972016 -20.827662721893493, 3.3146853146853132 -21.4625470683163, 3.426573426573426 -22.155123722431412, 3.5384615384615383 -22.79007530930608, 3.6783216783216774 -23.463421194190424, 3.79020979020979 -24.155997848305546, 3.9020979020979008 -24.82941097364174, 4.041958041958041 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-analytical.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-analytical.csv deleted file mode 100644 index aef0fa0e1e..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-analytical.csv +++ /dev/null @@ -1,24 +0,0 @@ -3.2838891877353418, 1.1048951048951037 -4.592388380849918, 1.4405594405594386 -5.4390801506186115, 1.6643356643356633 -6.43961807423346, 1.888111888111887 -7.40182894029048, 2.1678321678321666 -8.286982248520712, 2.391608391608391 -9.441500806885424, 2.67132867132867 -11.134884346422808, 3.1188811188811174 -12.982383001613773, 3.6783216783216774 -15.291621839698763, 4.321678321678321 -15.945938676707907, 4.517482517482517 -16.61948628294783, 4.7132867132867124 -17.254572350726196, 4.909090909090908 -17.928187197417966, 5.1328671328671325 -18.582571274878966, 5.356643356643356 -19.23695535233997, 5.58041958041958 -20.565021516944594, 6.055944055944055 -21.83559709521248, 6.615384615384615 -22.490182894029047, 6.923076923076923 -23.29895104895105, 7.37062937062937 -24.030863367401828, 7.846153846153845 -24.493343195266274, 8.237762237762237 -24.840505648197958, 8.657342657342657 -24.99583109198494, 9.272727272727273 diff --git a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-roms.csv b/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-roms.csv deleted file mode 100644 index 32975a2ef7..0000000000 --- a/compass/ocean/tests/drying_slope/comparison_data/r0.01d0.50-roms.csv +++ /dev/null @@ -1,20 +0,0 @@ -3.36094674556213, 1.16083916083916 -4.0535906401291015, 1.3006993006992995 -4.938743948359335, 1.5244755244755233 -6.093262506724045, 1.8041958041958033 -7.324838622915546, 2.139860139860139 -8.517885960193652, 2.4475524475524466 -9.903375470683164, 2.811188811188811 -11.21187466379774, 3.1468531468531458 -13.251815492200109, 3.7622377622377616 -14.060045723507262, 3.986013986013986 -15.926707907477144, 4.517482517482517 -17.25470683162991, 4.965034965034964 -18.563474986551913, 5.412587412587412 -19.891541151156535, 5.8881118881118875 -21.16191500806886, 6.363636363636363 -21.95118343195266, 6.699300699300698 -22.682759548144162, 7.034965034965035 -23.645642818719743, 7.594405594405593 -24.339093598708985, 8.06993006993007 -24.859601936525017, 8.601398601398602 From 7e173f2091ef910f4d5fd8540c66e2267d0ec35b Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Tue, 5 Apr 2022 15:16:22 -0500 Subject: [PATCH 12/24] Fix PEP8 issues --- compass/ocean/tests/drying_slope/forward.py | 15 ++++++++----- .../ocean/tests/drying_slope/initial_state.py | 3 ++- compass/ocean/tests/drying_slope/viz/plot.py | 22 ++++++++++--------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/compass/ocean/tests/drying_slope/forward.py b/compass/ocean/tests/drying_slope/forward.py index c9c18d7896..e47e61834f 100644 --- a/compass/ocean/tests/drying_slope/forward.py +++ b/compass/ocean/tests/drying_slope/forward.py @@ -42,7 +42,7 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, if min_cores is None: min_cores = cores if damping_coeff is not None: - name ='{}_{}'.format(name, damping_coeff) + name = '{}_{}'.format(name, damping_coeff) super().__init__(test_case=test_case, name=name, subdir=subdir, cores=cores, min_cores=min_cores, threads=threads) @@ -51,23 +51,26 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, 'namelist.forward') if damping_coeff is not None: # update the Rayleigh damping coeff to the requested value - options = {'config_Rayleigh_damping_coeff': '{}'.format(damping_coeff)} + options = {'config_Rayleigh_damping_coeff': '{}'.format( + damping_coeff)} self.add_namelist_options(options) self.add_streams_file('compass.ocean.tests.drying_slope', 'streams.forward') + input_path = '../initial_state' self.add_input_file(filename='mesh.nc', - target='../initial_state/culled_mesh.nc') + target='{}/culled_mesh.nc'.format(input_path)) self.add_input_file(filename='init.nc', - target='../initial_state/ocean.nc') + target='{}/ocean.nc'.format(input_path)) self.add_input_file(filename='forcing.nc', - target='../initial_state/init_mode_forcing_data.nc') + target='{}/init_mode_forcing_data.nc'.format( + input_path)) self.add_input_file(filename='graph.info', - target='../initial_state/culled_graph.info') + target='{}/culled_graph.info'.format(input_path)) self.add_model_as_input() diff --git a/compass/ocean/tests/drying_slope/initial_state.py b/compass/ocean/tests/drying_slope/initial_state.py index 26f020fbac..b373fc5143 100644 --- a/compass/ocean/tests/drying_slope/initial_state.py +++ b/compass/ocean/tests/drying_slope/initial_state.py @@ -8,6 +8,7 @@ from compass.step import Step from compass.model import run_model + class InitialState(Step): """ A step for creating a mesh and initial condition for drying slope test @@ -31,7 +32,7 @@ def __init__(self, test_case): self.add_streams_file('compass.ocean.tests.drying_slope', 'streams.init', mode='init') - for file in ['base_mesh.nc', 'culled_mesh.nc', 'culled_graph.info', + for file in ['base_mesh.nc', 'culled_mesh.nc', 'culled_graph.info', 'ocean.nc']: self.add_output_file(file) diff --git a/compass/ocean/tests/drying_slope/viz/plot.py b/compass/ocean/tests/drying_slope/viz/plot.py index 611ad39655..6d5808d687 100755 --- a/compass/ocean/tests/drying_slope/viz/plot.py +++ b/compass/ocean/tests/drying_slope/viz/plot.py @@ -151,7 +151,8 @@ def plot_ssh_validation(self, datapath): # Plot comparison data for datatype in ['analytical', 'ROMS']: datafile = '{}/drying_slope/r{}d{}-{}.csv'.format( - datapath,damping_coeff,atime,datatype.lower()) + datapath, damping_coeff, atime, + datatype.lower()) data = pd.read_csv(datafile, header=None) ax2[i].scatter(data[0], data[1], marker='.', color=colors[datatype], label=datatype) @@ -223,7 +224,7 @@ def plot_ssh_validation(self, datapath): The folder with analytical and ROMS results for comparison """ - colors = {'MPAS-O':'k', 'analytical':'b', 'ROMS':'g'} + colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] @@ -231,12 +232,12 @@ def plot_ssh_validation(self, datapath): damping_coeffs = [0.0025, 0.01] - xBed = numpy.linspace(0,25,100) + xBed = numpy.linspace(0, 25, 100) yBed = 10.0/25.0*xBed ii = 0 # Plot profiles over the 12h simulation duration - for itime in numpy.linspace(0,0.5,5*12+1): + for itime in numpy.linspace(0, 0.5, 5*12+1): plottime = int((float(itime)/0.2 + 1e-16)*24.0) @@ -278,10 +279,11 @@ def plot_ssh_validation(self, datapath): for datatype in ['analytical', 'ROMS']: datafile = '{}/drying_slope/r{}d{}-{}.csv'.format( - datapath, damping_coeff, atime, datatype.lower()) + datapath, damping_coeff, atime, + datatype.lower()) data = pd.read_csv(datafile, header=None) - ax2[i].scatter(data[0], data[1], marker = '.', - color = colors[datatype], label=datatype) + ax2[i].scatter(data[0], data[1], marker='.', + color=colors[datatype], label=datatype) ds.close() @@ -295,8 +297,8 @@ def plot_ssh_validation(self, datapath): plt.close(fig2) ii += 1 - def images_to_movies(self, outFolder='.', framesPerSecond=30, extension='mp4', - overwrite=True): + def images_to_movies(self, outFolder='.', framesPerSecond=30, + extension='mp4', overwrite=True): """ Convert all the image sequences into movies with ffmpeg """ @@ -311,7 +313,7 @@ def images_to_movies(self, outFolder='.', framesPerSecond=30, extension='mp4', if overwrite or not os.path.exists(outFileName): imageFileTemplate = '{}/{}_%03d.png'.format(self.outFolder, - prefix) + prefix) logFileName = '{}/logs/{}.log'.format(outFolder, prefix) with open(logFileName, 'w') as logFile: args = ['ffmpeg', '-y', '-r', framesPerSecond, From 2a7e9a37c1b446b9258d3b62735c1a37f5e32fe0 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Fri, 8 Apr 2022 13:17:00 -0600 Subject: [PATCH 13/24] Change strings to f-strings Co-authored-by: Xylar Asay-Davis --- .../ocean/tests/drying_slope/default/__init__.py | 10 +++++----- compass/ocean/tests/drying_slope/forward.py | 14 ++++++-------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index 508a988b86..56084740ab 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -37,10 +37,10 @@ def __init__(self, test_group, resolution, coord_type): self.resolution = resolution self.coord_type = coord_type if resolution < 1.: - res_name = str(int(resolution*1e3))+'m' + res_name = f'{int(resolution*1e3)}m' else: - res_name = str(int(resolution))+'km' - subdir = '{}/{}/{}'.format(res_name, coord_type, name) + res_name = f`{int(resolution)}km' + subdir = f'{res_name}/{coord_type}/{name}' super().__init__(test_group=test_group, name=name, subdir=subdir) @@ -62,5 +62,5 @@ def configure(self): ny += 2 dc = 1e3 * resolution - config.set('drying_slope', 'ny', '{}'.format(ny)) - config.set('drying_slope', 'dc', '{}'.format(dc)) + config.set('drying_slope', 'ny', f'{ny}') + config.set('drying_slope', 'dc', f'{dc}') diff --git a/compass/ocean/tests/drying_slope/forward.py b/compass/ocean/tests/drying_slope/forward.py index e47e61834f..8c92b017c3 100644 --- a/compass/ocean/tests/drying_slope/forward.py +++ b/compass/ocean/tests/drying_slope/forward.py @@ -42,7 +42,7 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, if min_cores is None: min_cores = cores if damping_coeff is not None: - name = '{}_{}'.format(name, damping_coeff) + name = f'{name}_{damping_coeff}' super().__init__(test_case=test_case, name=name, subdir=subdir, cores=cores, min_cores=min_cores, threads=threads) @@ -51,8 +51,7 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, 'namelist.forward') if damping_coeff is not None: # update the Rayleigh damping coeff to the requested value - options = {'config_Rayleigh_damping_coeff': '{}'.format( - damping_coeff)} + options = {'config_Rayleigh_damping_coeff': f'{damping_coeff}'} self.add_namelist_options(options) self.add_streams_file('compass.ocean.tests.drying_slope', @@ -60,17 +59,16 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, input_path = '../initial_state' self.add_input_file(filename='mesh.nc', - target='{}/culled_mesh.nc'.format(input_path)) + target=f'{input_path}/culled_mesh.nc') self.add_input_file(filename='init.nc', - target='{}/ocean.nc'.format(input_path)) + target=f'{input_path}/ocean.nc') self.add_input_file(filename='forcing.nc', - target='{}/init_mode_forcing_data.nc'.format( - input_path)) + target=f'{input_path}/init_mode_forcing_data.nc') self.add_input_file(filename='graph.info', - target='{}/culled_graph.info'.format(input_path)) + target=f'{input_path}/culled_graph.info') self.add_model_as_input() From c72932026b83b429b18b18753b027ee9a8669084 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Fri, 8 Apr 2022 12:03:20 -0500 Subject: [PATCH 14/24] remove landice, atm forcing --- compass/ocean/tests/drying_slope/streams.forward | 14 -------------- compass/ocean/tests/drying_slope/streams.init | 14 -------------- 2 files changed, 28 deletions(-) diff --git a/compass/ocean/tests/drying_slope/streams.forward b/compass/ocean/tests/drying_slope/streams.forward index 9f650f7c1b..7004ee26af 100644 --- a/compass/ocean/tests/drying_slope/streams.forward +++ b/compass/ocean/tests/drying_slope/streams.forward @@ -15,20 +15,6 @@ input_interval="initial_only" output_interval="0005_00:00:00"/> - - - - - - - - type="output" output_interval="0000_00:00:01" From 6093a202f69c597b7cefb936d13df244fb724598 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Fri, 8 Apr 2022 13:46:04 -0500 Subject: [PATCH 15/24] Use symlinks for comparison data --- .../ocean/tests/drying_slope/viz/__init__.py | 18 +++++++++++++++--- compass/ocean/tests/drying_slope/viz/plot.py | 14 ++++++-------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/compass/ocean/tests/drying_slope/viz/__init__.py b/compass/ocean/tests/drying_slope/viz/__init__.py index e62b02ea3d..be796cff7f 100644 --- a/compass/ocean/tests/drying_slope/viz/__init__.py +++ b/compass/ocean/tests/drying_slope/viz/__init__.py @@ -25,10 +25,22 @@ def __init__(self, test_case): """ super().__init__(test_case=test_case, name='viz') - for damping_coeff in [0.0025, 0.01]: + damping_coeffs = [0.0025, 0.01] + times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] + datatypes = ['analytical', 'ROMS'] + self.damping_coeffs = damping_coeffs + self.times = times + self.datatypes = datatypes + + for damping_coeff in damping_coeffs: self.add_input_file(filename='output_{}.nc'.format(damping_coeff), target='../forward_{}/output.nc'.format( damping_coeff)) + for time in times: + for datatype in datatypes: + filename = f'r{damping_coeff}d{time}-{datatype.lower()}.csv' + self.add_input_file(filename=f'comparison_data/{filename}', target=filename, + database='drying_slope') def run(self): """ @@ -41,10 +53,10 @@ def run(self): movie_format = section.get('movie_format') tsPlotter = TimeSeriesPlotter() - tsPlotter.plot_ssh_validation(datapath) + tsPlotter.plot_ssh_validation() tsPlotter.plot_ssh_time_series() mPlotter = MoviePlotter() - mPlotter.plot_ssh_validation(datapath) + mPlotter.plot_ssh_validation() mPlotter.images_to_movies(framesPerSecond=frames_per_second, extension=movie_format) diff --git a/compass/ocean/tests/drying_slope/viz/plot.py b/compass/ocean/tests/drying_slope/viz/plot.py index 6d5808d687..8f307addb9 100755 --- a/compass/ocean/tests/drying_slope/viz/plot.py +++ b/compass/ocean/tests/drying_slope/viz/plot.py @@ -98,7 +98,7 @@ def plot_ssh_time_series(self): bbox_inches='tight', dpi=200) plt.close(fig1) - def plot_ssh_validation(self, datapath): + def plot_ssh_validation(self): """ """ colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} @@ -150,8 +150,8 @@ def plot_ssh_validation(self, datapath): # Plot comparison data for datatype in ['analytical', 'ROMS']: - datafile = '{}/drying_slope/r{}d{}-{}.csv'.format( - datapath, damping_coeff, atime, + datafile = './r{}d{}-{}.csv'.format( + damping_coeff, atime, datatype.lower()) data = pd.read_csv(datafile, header=None) ax2[i].scatter(data[0], data[1], marker='.', @@ -213,15 +213,13 @@ def __init__(self, inFolder='.', outFolder='plots'): plt.switch_backend('Agg') - def plot_ssh_validation(self, datapath): + def plot_ssh_validation(self): """ Compare ssh along the channel at different time slices with the analytical solution and ROMS results. Parameters ---------- - datapath: str - The folder with analytical and ROMS results for comparison """ colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} @@ -278,8 +276,8 @@ def plot_ssh_validation(self, datapath): transform=ax2[i].transAxes) for datatype in ['analytical', 'ROMS']: - datafile = '{}/drying_slope/r{}d{}-{}.csv'.format( - datapath, damping_coeff, atime, + datafile = './r{}d{}-{}.csv'.format( + damping_coeff, atime, datatype.lower()) data = pd.read_csv(datafile, header=None) ax2[i].scatter(data[0], data[1], marker='.', From 858f5e80ce81fa83e9e30d788ce2cadf71b8a789 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Fri, 8 Apr 2022 14:14:38 -0500 Subject: [PATCH 16/24] Move plotting scripts to viz object --- .../ocean/tests/drying_slope/viz/__init__.py | 236 ++++++++++++- compass/ocean/tests/drying_slope/viz/plot.py | 322 ------------------ 2 files changed, 226 insertions(+), 332 deletions(-) delete mode 100755 compass/ocean/tests/drying_slope/viz/plot.py diff --git a/compass/ocean/tests/drying_slope/viz/__init__.py b/compass/ocean/tests/drying_slope/viz/__init__.py index be796cff7f..07dfae2464 100644 --- a/compass/ocean/tests/drying_slope/viz/__init__.py +++ b/compass/ocean/tests/drying_slope/viz/__init__.py @@ -3,10 +3,9 @@ import numpy import matplotlib.pyplot as plt import pandas as pd +import subprocess from compass.step import Step -from compass.ocean.tests.drying_slope.viz.plot import MoviePlotter, \ - TimeSeriesPlotter class Viz(Step): @@ -39,7 +38,7 @@ def __init__(self, test_case): for time in times: for datatype in datatypes: filename = f'r{damping_coeff}d{time}-{datatype.lower()}.csv' - self.add_input_file(filename=f'comparison_data/{filename}', target=filename, + self.add_input_file(filename=filename, target=filename, database='drying_slope') def run(self): @@ -51,12 +50,229 @@ def run(self): section = self.config['drying_slope_viz'] frames_per_second = section.getint('frames_per_second') movie_format = section.get('movie_format') + outFolder = 'movie' + if not os.path.exists(outFolder): + try: + os.makedirs(os.path.join(os.getcwd(), outFolder)) + except OSError: + pass - tsPlotter = TimeSeriesPlotter() - tsPlotter.plot_ssh_validation() - tsPlotter.plot_ssh_time_series() + self._plot_ssh_validation() + self._plot_ssh_time_series() + self._plot_ssh_validation_for_movie(outFolder=outFolder) + self._images_to_movies(framesPerSecond=frames_per_second, + outFolder=outFolder, extension=movie_format) + def _plot_ssh_time_series(self, outFolder='.'): + """ + """ + colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} + xSsh = numpy.linspace(0, 12.0, 100) + ySsh = 10.0*numpy.sin(xSsh*numpy.pi/12.0) - 10.0 + + figsize = [6.4, 4.8] + markersize = 20 + + # SSH forcing figure + damping_coeffs = [0.0025, 0.01] + fig1, ax1 = plt.subplots(nrows=len(damping_coeffs), ncols=1, + figsize=figsize, dpi=100) + for i, damping_coeff in enumerate(damping_coeffs): + ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ssh = ds.ssh + ympas = ds.ssh.where(ds.tidalInputMask).mean('nCells').values + xmpas = numpy.linspace(0, 1.0, len(ds.xtime))*12.0 + ax1[i].plot(xmpas, ympas, marker='o', label='MPAS-O forward', + color=colors['MPAS-O']) + ax1[i].plot(xSsh, ySsh, lw=3, label='analytical', + color=colors['analytical']) + ax1[i].set_ylabel('Tidal amplitude (m)') + ds.close() + + ax1[0].legend(frameon=False) + ax1[1].set_xlabel('Time (hrs)') + + fig1.suptitle('Tidal amplitude forcing (right side)') + fig1.savefig('{}/ssh_t.png'.format(outFolder), + bbox_inches='tight', dpi=200) + plt.close(fig1) + + def _plot_ssh_validation(self, outFolder='.'): + """ + Plot ssh as a function of along-channel distance for all times for which there is validation data + """ + colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} + + locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] + locs = 0.92 - numpy.divide(locs, 11.) + + times = self.times + damping_coeffs = self.damping_coeffs + datatypes = self.datatypes + + fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, + sharex=True, sharey=True) + fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', + rotation='vertical') + fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') + + xBed = numpy.linspace(0, 25, 100) + yBed = 10.0/25.0*xBed + + for i, damping_coeff in enumerate(damping_coeffs): + ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ds = ds.drop_vars(numpy.setdiff1d([j for j in ds.variables], + ['yCell', 'ssh'])) + + ax2[i].plot(xBed, yBed, '-k', lw=3) + ax2[i].text(0.5, 5, 'r = ' + str(damping_coeff)) + ax2[i].set_xlim(0, 25) + ax2[i].set_ylim(-1, 11) + ax2[i].invert_yaxis() + ax2[i].spines['top'].set_visible(False) + ax2[i].spines['right'].set_visible(False) + + for atime, ay in zip(times, locs): + + # Plot MPAS-O data + # factor of 1e- needed to account for annoying round-off issue + # to get right time slices + plottime = int((float(atime)/0.2 + 1e-16)*24.0) + ymean = ds.isel(Time=plottime).groupby('yCell').mean( + dim=xarray.ALL_DIMS) + x = ymean.yCell.values/1000.0 + y = ymean.ssh.values + + mpas = ax2[i].plot(x, -y, label='MPAS-O', + color=colors['MPAS-O']) + ax2[i].text(1, ay, atime + ' days', size=8, + transform=ax2[i].transAxes) + + # Plot comparison data + for datatype in datatypes: + datafile = './r{}d{}-{}.csv'.format( + damping_coeff, atime, + datatype.lower()) + data = pd.read_csv(datafile, header=None) + ax2[i].scatter(data[0], data[1], marker='.', + color=colors[datatype], label=datatype) + + ds.close() + + h, l0 = ax2[0].get_legend_handles_labels() + ax2[0].legend(h[0:3], l0[0:3], frameon=False, loc='lower left') + h, l1 = ax2[1].get_legend_handles_labels() + ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') + + fig2.savefig('{}/ssh_depth_section.png'.format(outFolder), + dpi=200) + plt.close(fig2) + + + def _plot_ssh_validation_for_movie(self, outFolder='.'): + """ + Compare ssh along the channel at different time slices with the + analytical solution and ROMS results. + + Parameters + ---------- + + """ + colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} + + locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] + locs = 0.92 - numpy.divide(locs, 11.) + + times = self.times + damping_coeffs = self.damping_coeffs + datatypes = self.datatypes + + xBed = numpy.linspace(0, 25, 100) + yBed = 10.0/25.0*xBed + + ii = 0 + # Plot profiles over the 12h simulation duration + for itime in numpy.linspace(0, 0.5, 5*12+1): + + plottime = int((float(itime)/0.2 + 1e-16)*24.0) + + fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, + sharex=True, sharey=True) + ax2[0].set_title('t = {0:.3f} days'.format(itime)) + fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', + rotation='vertical') + fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') + + for i, damping_coeff in enumerate(damping_coeffs): + + ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ds = ds.drop_vars(numpy.setdiff1d([j for j in ds.variables], + ['yCell', 'ssh'])) + + # Plot MPAS-O snapshots + # factor of 1e- needed to account for annoying round-off issue + # to get right time slices + ymean = ds.isel(Time=plottime).groupby('yCell').mean( + dim=xarray.ALL_DIMS) + x = ymean.yCell.values/1000.0 + y = ymean.ssh.values + ax2[i].plot(xBed, yBed, '-k', lw=3) + mpas = ax2[i].plot(x, -y, label='MPAS-O', + color=colors['MPAS-O']) + + ax2[i].text(0.5, 5, 'r = ' + str(damping_coeff)) + ax2[i].set_ylim(-1, 11) + ax2[i].set_xlim(0, 25) + ax2[i].invert_yaxis() + ax2[i].spines['top'].set_visible(False) + ax2[i].spines['right'].set_visible(False) + + # Plot comparison data + for atime, ay in zip(times, locs): + ax2[i].text(1, ay, atime + ' days', size=8, + transform=ax2[i].transAxes) + + for datatype in datatypes: + datafile = './r{}d{}-{}.csv'.format( + damping_coeff, atime, + datatype.lower()) + data = pd.read_csv(datafile, header=None) + ax2[i].scatter(data[0], data[1], marker='.', + color=colors[datatype], label=datatype) + + ds.close() + + h, l0 = ax2[0].get_legend_handles_labels() + ax2[0].legend(h[0:3], l0[0:3], frameon=False, loc='lower left') + h, l1 = ax2[1].get_legend_handles_labels() + ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') + + fig2.savefig('{}/ssh_depth_section_{:03d}.png'.format( + outFolder, ii), dpi=200) + plt.close(fig2) + ii += 1 + + def _images_to_movies(self, outFolder='.', framesPerSecond=30, + extension='mp4', overwrite=True): + """ + Convert all the image sequences into movies with ffmpeg + """ + try: + os.makedirs('{}/logs'.format(outFolder)) + except OSError: + pass + + framesPerSecond = '{}'.format(framesPerSecond) + prefix = 'ssh_depth_section' + outFileName = '{}/{}.{}'.format(outFolder, prefix, extension) + if overwrite or not os.path.exists(outFileName): - mPlotter = MoviePlotter() - mPlotter.plot_ssh_validation() - mPlotter.images_to_movies(framesPerSecond=frames_per_second, - extension=movie_format) + imageFileTemplate = '{}/{}_%03d.png'.format(outFolder, + prefix) + logFileName = '{}/logs/{}.log'.format(outFolder, prefix) + with open(logFileName, 'w') as logFile: + args = ['ffmpeg', '-y', '-r', framesPerSecond, + '-i', imageFileTemplate, '-b:v', '32000k', + '-r', framesPerSecond, '-pix_fmt', 'yuv420p', + outFileName] + print('running {}'.format(' '.join(args))) + subprocess.check_call(args, stdout=logFile, stderr=logFile) diff --git a/compass/ocean/tests/drying_slope/viz/plot.py b/compass/ocean/tests/drying_slope/viz/plot.py deleted file mode 100755 index 8f307addb9..0000000000 --- a/compass/ocean/tests/drying_slope/viz/plot.py +++ /dev/null @@ -1,322 +0,0 @@ -#!/usr/bin/env python -""" - -Drying slope comparison betewen MPAS-O, analytical, and ROMS results from - -Warner, J. C., Defne, Z., Haas, K., & Arango, H. G. (2013). A wetting and -drying scheme for ROMS. Computers & geosciences, 58, 54-61. - -Phillip J. Wolfram and Zhendong Cao -04/30/2019 - -""" - -import os -import numpy -import xarray -import matplotlib.pyplot as plt -import pandas as pd -import subprocess - - -class TimeSeriesPlotter(object): - """ - A plotter object to hold on to some info needed for plotting time series - from drying slope simulation results - - Attributes - ---------- - inFolder : str - The folder with simulation results - - outFolder : str - The folder where images will be written - - """ - def __init__(self, inFolder='.', outFolder='plots'): - """ - Create a plotter object to hold on to some info needed for plotting - time series from drying slope simulation results - - Parameters - ---------- - inFolder : str, optional - The folder with simulation results - - outFolder : str, optional - The folder where images will be written - - dsMesh : xarray.Dataset, optional - The MPAS mesh - - ds : xarray.Dataset, optional - The time series output - """ - - self.inFolder = inFolder - self.outFolder = outFolder - - if not os.path.exists(outFolder): - try: - os.makedirs(os.path.join(os.getcwd(), self.outFolder)) - except OSError: - pass - - plt.switch_backend('Agg') - - def plot_ssh_time_series(self): - """ - """ - colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} - xSsh = numpy.linspace(0, 12.0, 100) - ySsh = 10.0*numpy.sin(xSsh*numpy.pi/12.0) - 10.0 - - figsize = [6.4, 4.8] - markersize = 20 - - # SSH forcing figure - damping_coeffs = [0.0025, 0.01] - fig1, ax1 = plt.subplots(nrows=len(damping_coeffs), ncols=1, - figsize=figsize, dpi=100) - for i, damping_coeff in enumerate(damping_coeffs): - ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) - ssh = ds.ssh - ympas = ds.ssh.where(ds.tidalInputMask).mean('nCells').values - xmpas = numpy.linspace(0, 1.0, len(ds.xtime))*12.0 - ax1[i].plot(xmpas, ympas, marker='o', label='MPAS-O forward', - color=colors['MPAS-O']) - ax1[i].plot(xSsh, ySsh, lw=3, label='analytical', - color=colors['analytical']) - ax1[i].set_ylabel('Tidal amplitude (m)') - ds.close() - - ax1[0].legend(frameon=False) - ax1[1].set_xlabel('Time (hrs)') - - fig1.suptitle('Tidal amplitude forcing (right side)') - fig1.savefig('{}/ssh_t.png'.format(self.outFolder), - bbox_inches='tight', dpi=200) - plt.close(fig1) - - def plot_ssh_validation(self): - """ - """ - colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} - - # Cross-section figure - times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] - locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] - locs = 0.92 - numpy.divide(locs, 11.) - - damping_coeffs = [0.0025, 0.01] - - fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, - sharex=True, sharey=True) - fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', - rotation='vertical') - fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') - - xBed = numpy.linspace(0, 25, 100) - yBed = 10.0/25.0*xBed - - for i, damping_coeff in enumerate(damping_coeffs): - ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) - ds = ds.drop_vars(numpy.setdiff1d([j for j in ds.variables], - ['yCell', 'ssh'])) - - ax2[i].plot(xBed, yBed, '-k', lw=3) - ax2[i].text(0.5, 5, 'r = ' + str(damping_coeff)) - ax2[i].set_xlim(0, 25) - ax2[i].set_ylim(-1, 11) - ax2[i].invert_yaxis() - ax2[i].spines['top'].set_visible(False) - ax2[i].spines['right'].set_visible(False) - - for atime, ay in zip(times, locs): - - # Plot MPAS-O data - # factor of 1e- needed to account for annoying round-off issue - # to get right time slices - plottime = int((float(atime)/0.2 + 1e-16)*24.0) - ymean = ds.isel(Time=plottime).groupby('yCell').mean( - dim=xarray.ALL_DIMS) - x = ymean.yCell.values/1000.0 - y = ymean.ssh.values - - mpas = ax2[i].plot(x, -y, label='MPAS-O', - color=colors['MPAS-O']) - ax2[i].text(1, ay, atime + ' days', size=8, - transform=ax2[i].transAxes) - - # Plot comparison data - for datatype in ['analytical', 'ROMS']: - datafile = './r{}d{}-{}.csv'.format( - damping_coeff, atime, - datatype.lower()) - data = pd.read_csv(datafile, header=None) - ax2[i].scatter(data[0], data[1], marker='.', - color=colors[datatype], label=datatype) - - ds.close() - - h, l0 = ax2[0].get_legend_handles_labels() - ax2[0].legend(h[0:3], l0[0:3], frameon=False, loc='lower left') - h, l1 = ax2[1].get_legend_handles_labels() - ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') - - if not os.path.exists(self.outFolder): - try: - os.makedirs(os.path.join(os.getcwd(), self.outFolder)) - except OSError: - pass - - fig2.savefig('{}/ssh_depth_section.png'.format(self.outFolder), - dpi=200) - plt.close(fig2) - - -class MoviePlotter(object): - """ - A plotter object to hold on to some info needed for plotting images from - drying slope simulation results - - Attributes - ---------- - inFolder : str - The folder with simulation results - - outFolder : str - The folder where images will be written - """ - - def __init__(self, inFolder='.', outFolder='plots'): - """ - Create a plotter object to hold on to some info needed for plotting - images from drying slope simulation results - - Parameters - ---------- - inFolder : str - The folder with simulation results - - outFolder : str - The folder where images will be written - """ - self.inFolder = inFolder - self.outFolder = outFolder - - if not os.path.exists(outFolder): - try: - os.makedirs(os.path.join(os.getcwd(), self.outFolder)) - except OSError: - pass - - plt.switch_backend('Agg') - - def plot_ssh_validation(self): - """ - Compare ssh along the channel at different time slices with the - analytical solution and ROMS results. - - Parameters - ---------- - - """ - colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} - - times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] - locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] - locs = 0.92 - numpy.divide(locs, 11.) - - damping_coeffs = [0.0025, 0.01] - - xBed = numpy.linspace(0, 25, 100) - yBed = 10.0/25.0*xBed - - ii = 0 - # Plot profiles over the 12h simulation duration - for itime in numpy.linspace(0, 0.5, 5*12+1): - - plottime = int((float(itime)/0.2 + 1e-16)*24.0) - - fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, - sharex=True, sharey=True) - ax2[0].set_title('t = {0:.3f} days'.format(itime)) - fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', - rotation='vertical') - fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') - - for i, damping_coeff in enumerate(damping_coeffs): - - ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) - ds = ds.drop_vars(numpy.setdiff1d([j for j in ds.variables], - ['yCell', 'ssh'])) - - # Plot MPAS-O snapshots - # factor of 1e- needed to account for annoying round-off issue - # to get right time slices - ymean = ds.isel(Time=plottime).groupby('yCell').mean( - dim=xarray.ALL_DIMS) - x = ymean.yCell.values/1000.0 - y = ymean.ssh.values - ax2[i].plot(xBed, yBed, '-k', lw=3) - mpas = ax2[i].plot(x, -y, label='MPAS-O', - color=colors['MPAS-O']) - - ax2[i].text(0.5, 5, 'r = ' + str(damping_coeff)) - ax2[i].set_ylim(-1, 11) - ax2[i].set_xlim(0, 25) - ax2[i].invert_yaxis() - ax2[i].spines['top'].set_visible(False) - ax2[i].spines['right'].set_visible(False) - - # Plot comparison data - for atime, ay in zip(times, locs): - ax2[i].text(1, ay, atime + ' days', size=8, - transform=ax2[i].transAxes) - - for datatype in ['analytical', 'ROMS']: - datafile = './r{}d{}-{}.csv'.format( - damping_coeff, atime, - datatype.lower()) - data = pd.read_csv(datafile, header=None) - ax2[i].scatter(data[0], data[1], marker='.', - color=colors[datatype], label=datatype) - - ds.close() - - h, l0 = ax2[0].get_legend_handles_labels() - ax2[0].legend(h[0:3], l0[0:3], frameon=False, loc='lower left') - h, l1 = ax2[1].get_legend_handles_labels() - ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') - - fig2.savefig('{}/ssh_depth_section_{:03d}.png'.format( - self.outFolder, ii), dpi=200) - plt.close(fig2) - ii += 1 - - def images_to_movies(self, outFolder='.', framesPerSecond=30, - extension='mp4', overwrite=True): - """ - Convert all the image sequences into movies with ffmpeg - """ - try: - os.makedirs('{}/logs'.format(outFolder)) - except OSError: - pass - - framesPerSecond = '{}'.format(framesPerSecond) - prefix = 'ssh_depth_section' - outFileName = '{}/{}.{}'.format(outFolder, prefix, extension) - if overwrite or not os.path.exists(outFileName): - - imageFileTemplate = '{}/{}_%03d.png'.format(self.outFolder, - prefix) - logFileName = '{}/logs/{}.log'.format(outFolder, prefix) - with open(logFileName, 'w') as logFile: - args = ['ffmpeg', '-y', '-r', framesPerSecond, - '-i', imageFileTemplate, '-b:v', '32000k', - '-r', framesPerSecond, '-pix_fmt', 'yuv420p', - outFileName] - print('running {}'.format(' '.join(args))) - subprocess.check_call(args, stdout=logFile, stderr=logFile) From b3b0c56bf0b02b97490afd65a8640157640654f5 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Fri, 8 Apr 2022 14:37:19 -0500 Subject: [PATCH 17/24] Additional cleanup in response to review --- .../tests/drying_slope/default/__init__.py | 10 ++-- .../ocean/tests/drying_slope/drying_slope.cfg | 4 +- compass/ocean/tests/drying_slope/forward.py | 2 +- .../ocean/tests/drying_slope/viz/__init__.py | 51 +++++++++---------- 4 files changed, 31 insertions(+), 36 deletions(-) diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index 56084740ab..62af0e15a4 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -10,8 +10,8 @@ class Default(TestCase): Attributes ---------- - resolution : str - The horizontal resolution of the test case + resolution : float + The resolution of the test case in km coord_type : str The type of vertical coordinate (``sigma``, ``single_layer``, etc.) @@ -26,8 +26,8 @@ def __init__(self, test_group, resolution, coord_type): test_group : compass.ocean.tests.drying_slope.DryingSlope The test group that this test case belongs to - resolution : str - The resolution of the test case + resolution : float + The resolution of the test case in km coord_type : str The type of vertical coordinate (``sigma``, ``single_layer``) @@ -39,7 +39,7 @@ def __init__(self, test_group, resolution, coord_type): if resolution < 1.: res_name = f'{int(resolution*1e3)}m' else: - res_name = f`{int(resolution)}km' + res_name = f'{int(resolution)}km' subdir = f'{res_name}/{coord_type}/{name}' super().__init__(test_group=test_group, name=name, subdir=subdir) diff --git a/compass/ocean/tests/drying_slope/drying_slope.cfg b/compass/ocean/tests/drying_slope/drying_slope.cfg index 6bdbd5dc32..84ee5e50e4 100644 --- a/compass/ocean/tests/drying_slope/drying_slope.cfg +++ b/compass/ocean/tests/drying_slope/drying_slope.cfg @@ -7,7 +7,7 @@ vert_levels = 10 # The type of vertical coordinate (e.g. z-level, z-star) coord_type = sigma -# config options for internal wave test cases +# config options for drying slope test cases [drying_slope] # the number of grid cells in x and y @@ -17,7 +17,7 @@ ny = 28 # the size of grid cells (m) dc = 1000.0 -# config options for visualizing ISOMIP+ ouptut +# config options for visualizing drying slope ouptut [drying_slope_viz] # frames per second for movies diff --git a/compass/ocean/tests/drying_slope/forward.py b/compass/ocean/tests/drying_slope/forward.py index 8c92b017c3..3437a311f2 100644 --- a/compass/ocean/tests/drying_slope/forward.py +++ b/compass/ocean/tests/drying_slope/forward.py @@ -35,7 +35,7 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, threads : int, optional the number of threads the step will use - damping_coeff: real, optional + damping_coeff: float, optional the value of the rayleigh damping coefficient """ diff --git a/compass/ocean/tests/drying_slope/viz/__init__.py b/compass/ocean/tests/drying_slope/viz/__init__.py index 07dfae2464..07e7cb4319 100644 --- a/compass/ocean/tests/drying_slope/viz/__init__.py +++ b/compass/ocean/tests/drying_slope/viz/__init__.py @@ -32,9 +32,8 @@ def __init__(self, test_case): self.datatypes = datatypes for damping_coeff in damping_coeffs: - self.add_input_file(filename='output_{}.nc'.format(damping_coeff), - target='../forward_{}/output.nc'.format( - damping_coeff)) + self.add_input_file(filename=f'output_{damping_coeff}.nc', + target=f'../forward_{damping_coeff}/output.nc') for time in times: for datatype in datatypes: filename = f'r{damping_coeff}d{time}-{datatype.lower()}.csv' @@ -73,11 +72,11 @@ def _plot_ssh_time_series(self, outFolder='.'): markersize = 20 # SSH forcing figure - damping_coeffs = [0.0025, 0.01] + damping_coeffs = self.damping_coeffs fig1, ax1 = plt.subplots(nrows=len(damping_coeffs), ncols=1, figsize=figsize, dpi=100) for i, damping_coeff in enumerate(damping_coeffs): - ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ds = xarray.open_dataset(f'output_{damping_coeff}.nc') ssh = ds.ssh ympas = ds.ssh.where(ds.tidalInputMask).mean('nCells').values xmpas = numpy.linspace(0, 1.0, len(ds.xtime))*12.0 @@ -92,8 +91,8 @@ def _plot_ssh_time_series(self, outFolder='.'): ax1[1].set_xlabel('Time (hrs)') fig1.suptitle('Tidal amplitude forcing (right side)') - fig1.savefig('{}/ssh_t.png'.format(outFolder), - bbox_inches='tight', dpi=200) + fig1.savefig(f'{outFolder}/ssh_t.png', bbox_inches='tight', dpi=200) + plt.close(fig1) def _plot_ssh_validation(self, outFolder='.'): @@ -119,7 +118,7 @@ def _plot_ssh_validation(self, outFolder='.'): yBed = 10.0/25.0*xBed for i, damping_coeff in enumerate(damping_coeffs): - ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ds = xarray.open_dataset(f'output_{damping_coeff}.nc') ds = ds.drop_vars(numpy.setdiff1d([j for j in ds.variables], ['yCell', 'ssh'])) @@ -149,9 +148,8 @@ def _plot_ssh_validation(self, outFolder='.'): # Plot comparison data for datatype in datatypes: - datafile = './r{}d{}-{}.csv'.format( - damping_coeff, atime, - datatype.lower()) + datafile = f'./r{damping_coeff}d{atime}-'\ + f'{datatype.lower()}.csv' data = pd.read_csv(datafile, header=None) ax2[i].scatter(data[0], data[1], marker='.', color=colors[datatype], label=datatype) @@ -163,8 +161,7 @@ def _plot_ssh_validation(self, outFolder='.'): h, l1 = ax2[1].get_legend_handles_labels() ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') - fig2.savefig('{}/ssh_depth_section.png'.format(outFolder), - dpi=200) + fig2.savefig(f'{outFolder}/ssh_depth_section.png', dpi=200) plt.close(fig2) @@ -197,14 +194,14 @@ def _plot_ssh_validation_for_movie(self, outFolder='.'): fig2, ax2 = plt.subplots(nrows=len(damping_coeffs), ncols=1, sharex=True, sharey=True) - ax2[0].set_title('t = {0:.3f} days'.format(itime)) + ax2[0].set_title(f't = {itime:.3f} days') fig2.text(0.04, 0.5, 'Channel depth (m)', va='center', rotation='vertical') fig2.text(0.5, 0.02, 'Along channel distance (km)', ha='center') for i, damping_coeff in enumerate(damping_coeffs): - ds = xarray.open_dataset('output_{}.nc'.format(damping_coeff)) + ds = xarray.open_dataset(f'output_{damping_coeff}.nc') ds = ds.drop_vars(numpy.setdiff1d([j for j in ds.variables], ['yCell', 'ssh'])) @@ -228,13 +225,12 @@ def _plot_ssh_validation_for_movie(self, outFolder='.'): # Plot comparison data for atime, ay in zip(times, locs): - ax2[i].text(1, ay, atime + ' days', size=8, + ax2[i].text(1, ay, f'{atime} days', size=8, transform=ax2[i].transAxes) for datatype in datatypes: - datafile = './r{}d{}-{}.csv'.format( - damping_coeff, atime, - datatype.lower()) + datafile = f'./r{damping_coeff}d{atime}-'\ + f'{datatype.lower()}.csv' data = pd.read_csv(datafile, header=None) ax2[i].scatter(data[0], data[1], marker='.', color=colors[datatype], label=datatype) @@ -246,8 +242,7 @@ def _plot_ssh_validation_for_movie(self, outFolder='.'): h, l1 = ax2[1].get_legend_handles_labels() ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') - fig2.savefig('{}/ssh_depth_section_{:03d}.png'.format( - outFolder, ii), dpi=200) + fig2.savefig(f'{outFolder}/ssh_depth_section_{ii:03d}.png', dpi=200) plt.close(fig2) ii += 1 @@ -257,22 +252,22 @@ def _images_to_movies(self, outFolder='.', framesPerSecond=30, Convert all the image sequences into movies with ffmpeg """ try: - os.makedirs('{}/logs'.format(outFolder)) + os.makedirs(f'{outFolder}/logs') except OSError: pass - framesPerSecond = '{}'.format(framesPerSecond) + framesPerSecond = str(framesPerSecond) prefix = 'ssh_depth_section' - outFileName = '{}/{}.{}'.format(outFolder, prefix, extension) + outFileName = f'{outFolder}/{prefix}.{extension}' if overwrite or not os.path.exists(outFileName): - imageFileTemplate = '{}/{}_%03d.png'.format(outFolder, - prefix) - logFileName = '{}/logs/{}.log'.format(outFolder, prefix) + imageFileTemplate = f'{outFolder}/{prefix}_%03d.png' + logFileName = f'{outFolder}/logs/{prefix}.log' with open(logFileName, 'w') as logFile: args = ['ffmpeg', '-y', '-r', framesPerSecond, '-i', imageFileTemplate, '-b:v', '32000k', '-r', framesPerSecond, '-pix_fmt', 'yuv420p', outFileName] - print('running {}'.format(' '.join(args))) + print_args = ' '.join(args) + print(f'running {print_args}') subprocess.check_call(args, stdout=logFile, stderr=logFile) From 260b3c60eab031a4863fa09d901bfee398e9ba68 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Fri, 8 Apr 2022 14:53:17 -0500 Subject: [PATCH 18/24] Add documentation for drying_slope case --- .../ocean/tests/drying_slope/viz/__init__.py | 2 +- docs/developers_guide/ocean/api.rst | 23 +++++ .../ocean/test_groups/drying_slope.rst | 76 ++++++++++++++++ .../ocean/test_groups/index.rst | 1 + .../ocean/test_groups/drying_slope.rst | 85 ++++++++++++++++++ .../images/drying_slope_forcing.png | Bin 0 -> 104919 bytes .../images/drying_slope_validation.png | Bin 0 -> 184357 bytes docs/users_guide/ocean/test_groups/index.rst | 1 + 8 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 docs/developers_guide/ocean/test_groups/drying_slope.rst create mode 100644 docs/users_guide/ocean/test_groups/drying_slope.rst create mode 100644 docs/users_guide/ocean/test_groups/images/drying_slope_forcing.png create mode 100644 docs/users_guide/ocean/test_groups/images/drying_slope_validation.png diff --git a/compass/ocean/tests/drying_slope/viz/__init__.py b/compass/ocean/tests/drying_slope/viz/__init__.py index 07e7cb4319..7949ebbd5e 100644 --- a/compass/ocean/tests/drying_slope/viz/__init__.py +++ b/compass/ocean/tests/drying_slope/viz/__init__.py @@ -92,7 +92,7 @@ def _plot_ssh_time_series(self, outFolder='.'): fig1.suptitle('Tidal amplitude forcing (right side)') fig1.savefig(f'{outFolder}/ssh_t.png', bbox_inches='tight', dpi=200) - + plt.close(fig1) def _plot_ssh_validation(self, outFolder='.'): diff --git a/docs/developers_guide/ocean/api.rst b/docs/developers_guide/ocean/api.rst index 7c023fffac..94e1755230 100644 --- a/docs/developers_guide/ocean/api.rst +++ b/docs/developers_guide/ocean/api.rst @@ -54,6 +54,29 @@ baroclinic_channel initial_state.InitialState.run +drying_slope +~~~~~~~~~~~~ + +.. currentmodule:: compass.ocean.tests.drying_slope + +.. autosummary:: + :toctree: generated/ + + DryingSlope + + default.Default + default.Default.configure + + forward.Forward + forward.Forward.run + + initial_state.InitialState + initial_state.InitialState.run + + viz.Viz + viz.Viz.run + + global_convergence ~~~~~~~~~~~~~~~~~~ diff --git a/docs/developers_guide/ocean/test_groups/drying_slope.rst b/docs/developers_guide/ocean/test_groups/drying_slope.rst new file mode 100644 index 0000000000..b574b2559c --- /dev/null +++ b/docs/developers_guide/ocean/test_groups/drying_slope.rst @@ -0,0 +1,76 @@ +.. _dev_ocean_drying_slope: + +drying_slope +============ + +The ``drying_slope`` test group +(:py:class:`compass.ocean.tests.drying_slope.DryingSlope`) +implements variants of the drying slope test case. Here, +we describe the shared framework for this test group and the 1 test case. + +.. _dev_ocean_drying_slope_framework: + +framework +--------- + +The shared config options for the ``drying_slope`` test group are described +in :ref:`ocean_drying_slope` in the User's Guide. + +Additionally, the test group has shared ``namelist.init`` and +``namelist.forward`` files with a few common namelist options related to run +duration, bottom drag, and tidal forcing options, as well as shared +``streams.init`` and ``streams.forward`` files that defines ``mesh``, ``input``, +``restart``, ``forcing`` and ``output`` streams. + +initial_state +~~~~~~~~~~~~~ + +The class +:py:class:`compass.ocean.tests.drying_slope.initial_state.InitialState` +defines a step for setting up the initial state for each test case. + +First, a mesh appropriate for the resolution is generated using +:py:func:`mpas_tools.planar_hex.make_planar_hex_mesh()`. Then, the mesh is +culled to remove periodicity in the y direction. MPAS-Ocean is then run in init +mode. During this run, the vertical grid is set up with ``sigma`` coordinates, +ssh is initialized using the tidal forcing config options, and temperature and +salinity are set to constant values by default. (Namelist options may be +modified to produce a plug of different temperature values from the background, +but this is not employed in this test case.) + +forward +~~~~~~~ + +The class :py:class:`compass.ocean.tests.drying_slope.forward.Forward` +defines a step for running MPAS-Ocean from the initial condition produced in +the ``initial_state`` step. If ``damping_coeff`` is provided as an argument to +the constructor, the associate namelist option +(``config_Rayleigh_damping_coeff``) will be given this value. MPAS-Ocean is run +in ``run()``. + +viz +~~~ + +The class :py:class:`compass.ocean.tests.drying_slope.viz.Viz` +defines a visualization step which serves the purpose of validation. This +validation is tailored for the default config options and the two Rayleigh +damping coefficients set by the default test case, 0.0025 and 0.01. One plot +verifies that the time evolution of the ssh forcing at the boundary matches the +analytical solution intended to drive the test case. Another plot compares the +time evolution of the ssh profile across the channel between the analytical +solution, MPAS-Ocean and ROMS. Similar plots are used to create a movie showing +the solution from MPAS-Ocean at more fine-grained time intervals. + + +.. _dev_ocean_drying_slope_default: + +default +------- + +The :py:class:`compass.ocean.tests.drying_slope.default.Default` +test performs two 12-hour runs on 4 cores. It doesn't contain any +:ref:`dev_validation`. This class accepts resolution and coordinate type +``coord_type`` as arguments, though currently only the ``sigma`` coordinate +type is supported. This case is hard-coded to run two cases at different values +of ``config_Rayleigh_damping_coeff``, 0.0025 and 0.01, for which there is +comparison data. diff --git a/docs/developers_guide/ocean/test_groups/index.rst b/docs/developers_guide/ocean/test_groups/index.rst index 63449fd38b..bdcf4071d3 100644 --- a/docs/developers_guide/ocean/test_groups/index.rst +++ b/docs/developers_guide/ocean/test_groups/index.rst @@ -8,6 +8,7 @@ Test groups :titlesonly: baroclinic_channel + drying_slope global_convergence global_ocean gotm diff --git a/docs/users_guide/ocean/test_groups/drying_slope.rst b/docs/users_guide/ocean/test_groups/drying_slope.rst new file mode 100644 index 0000000000..525d696f72 --- /dev/null +++ b/docs/users_guide/ocean/test_groups/drying_slope.rst @@ -0,0 +1,85 @@ +.. _ocean_drying_slope: + +drying_slope +============= + +The ``ocean/drying_slope`` test group reproducs the tidal channel flow test case +from `Warner et al. (2013) `_ +which was originally presented in +`Oey (2005) `_. + +The domain is 2-d with a channel sloping in the x-dimension and periodic in the +y-dimension. The channel length is set to 25 km and slopes with an aspect ratio +of 0.1. The channel width is 6km for all simulations. The channel is initialized +as dry with a minimum layer thickness. The water level at the seaward end is +oscillated sinusoidally with a period of 0.5 days as + +.. math:: + \zeta_{east} = 10.0 \sin(\pi/0.5t) - 10.0 + +.. image:: images/drying_slope_forcing.png + :width: 500 px + :align: center + +Temperature and salinity are constant throughout the domain with values of 20 +degC and 35 PSU, respectively. Two different linear drag bottom roughness +factors of 0.0025 and 0.01 are applied in separate simulations. + +By default, there are 10 vertical layers. The sigma vertical coordinate is +used. Horizontal resolution of 250m and 1 km are available. + +The test group includes 1 test case. The test case has 4 steps, +``initial_state``, which defines the mesh and initial conditions for the model, +two ``forward`` steps, one for each Rayleigh damping coefficient, and a ``viz`` +which performs visualization of the ssh field and comparison with the analytical +solution as well as the solution from the ROMS model. + +.. image:: images/drying_slope_validation.png + :width: 500 px + :align: center + + +config options +-------------- + +The config options for this test case are: + +.. code-block:: cfg + + # Options related to the vertical grid + [vertical_grid] + + # Number of vertical levels + vert_levels = 10 + + # The type of vertical coordinate (e.g. z-level, z-star) + coord_type = sigma + + # config options for drying slope test cases + [drying_slope] + + # the number of grid cells in x and y + nx = 6 + ny = 28 + + # the size of grid cells (m) + dc = 1000.0 + + # config options for visualizing drying slope ouptut + [drying_slope_viz] + + # frames per second for movies + frames_per_second = 30 + + # movie format + movie_format = mp4 + +All units are mks. + +default +------- + +``ocean/drying_slope/1km/default`` is the default version of the drying slope +test case for two short (12h) test runs with two different drag coefficients +and validation of sea surface height through visual inspection against analytic +and ROMS solutions. diff --git a/docs/users_guide/ocean/test_groups/images/drying_slope_forcing.png b/docs/users_guide/ocean/test_groups/images/drying_slope_forcing.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc89900c168009e39bf1713d314e519bd2f92a3 GIT binary patch literal 104919 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 WN6ysUNW?q?FHN-rs%g7TF8m+S0M9@G literal 0 HcmV?d00001 diff --git a/docs/users_guide/ocean/test_groups/images/drying_slope_validation.png b/docs/users_guide/ocean/test_groups/images/drying_slope_validation.png new file mode 100644 index 0000000000000000000000000000000000000000..7172928af94fc7b8656e8e65a77190d5a738a571 GIT binary patch literal 184357 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

f=p)M>$RwBI+JyDzqBm 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 literal 0 HcmV?d00001 diff --git a/docs/users_guide/ocean/test_groups/index.rst b/docs/users_guide/ocean/test_groups/index.rst index 112bdef2ca..fbfb3c1bbb 100644 --- a/docs/users_guide/ocean/test_groups/index.rst +++ b/docs/users_guide/ocean/test_groups/index.rst @@ -12,6 +12,7 @@ coming months. :titlesonly: baroclinic_channel + drying_slope global_convergence global_ocean gotm From f76ff08b33cd252e9d2db63ddbf51af36989a81b Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Wed, 13 Apr 2022 10:50:56 -0500 Subject: [PATCH 19/24] Cleanup viz --- .../ocean/tests/drying_slope/viz/__init__.py | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/compass/ocean/tests/drying_slope/viz/__init__.py b/compass/ocean/tests/drying_slope/viz/__init__.py index 7949ebbd5e..f85bb113df 100644 --- a/compass/ocean/tests/drying_slope/viz/__init__.py +++ b/compass/ocean/tests/drying_slope/viz/__init__.py @@ -12,6 +12,19 @@ class Viz(Step): """ A step for visualizing drying slope results, as well as comparison with analytical solution and ROMS results. + + Attributes + ---------- + damping_coeffs : list of float + Rayleigh damping coefficients used for the MPAS-Ocean and ROMS + forward runs + + times : list of str + Time in days since the start of the simulation for which ROMS + comparison data is available + + datatypes : list of str + The sources of data for comparison to the MPAS-Ocean run """ def __init__(self, test_case): """ @@ -25,7 +38,7 @@ def __init__(self, test_case): super().__init__(test_case=test_case, name='viz') damping_coeffs = [0.0025, 0.01] - times = ['0.50', '0.05', '0.40', '0.15', '0.30', '0.25'] + times = ['0.05', '0.15', '0.25', '0.30', '0.40', '0.50'] datatypes = ['analytical', 'ROMS'] self.damping_coeffs = damping_coeffs self.times = times @@ -36,7 +49,8 @@ def __init__(self, test_case): target=f'../forward_{damping_coeff}/output.nc') for time in times: for datatype in datatypes: - filename = f'r{damping_coeff}d{time}-{datatype.lower()}.csv' + filename = f'r{damping_coeff}d{time}-{datatype.lower()}'\ + '.csv' self.add_input_file(filename=filename, target=filename, database='drying_slope') @@ -61,8 +75,13 @@ def run(self): self._plot_ssh_validation_for_movie(outFolder=outFolder) self._images_to_movies(framesPerSecond=frames_per_second, outFolder=outFolder, extension=movie_format) + def _plot_ssh_time_series(self, outFolder='.'): """ + Plot ssh forcing on the right x boundary as a function of time against + the analytical solution. The agreement should be within machine + precision if the namelist options are consistent with the Warner et al. + (2013) test case. """ colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} xSsh = numpy.linspace(0, 12.0, 100) @@ -71,7 +90,6 @@ def _plot_ssh_time_series(self, outFolder='.'): figsize = [6.4, 4.8] markersize = 20 - # SSH forcing figure damping_coeffs = self.damping_coeffs fig1, ax1 = plt.subplots(nrows=len(damping_coeffs), ncols=1, figsize=figsize, dpi=100) @@ -97,11 +115,12 @@ def _plot_ssh_time_series(self, outFolder='.'): def _plot_ssh_validation(self, outFolder='.'): """ - Plot ssh as a function of along-channel distance for all times for which there is validation data + Plot ssh as a function of along-channel distance for all times for + which there is validation data """ colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} - locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] + locs = [7.2, 2.2, 0.2, 1.2, 4.2, 9.3] locs = 0.92 - numpy.divide(locs, 11.) times = self.times @@ -164,7 +183,6 @@ def _plot_ssh_validation(self, outFolder='.'): fig2.savefig(f'{outFolder}/ssh_depth_section.png', dpi=200) plt.close(fig2) - def _plot_ssh_validation_for_movie(self, outFolder='.'): """ Compare ssh along the channel at different time slices with the @@ -176,7 +194,7 @@ def _plot_ssh_validation_for_movie(self, outFolder='.'): """ colors = {'MPAS-O': 'k', 'analytical': 'b', 'ROMS': 'g'} - locs = [9.3, 7.2, 4.2, 2.2, 1.2, 0.2] + locs = [7.2, 2.2, 0.2, 1.2, 4.2, 9.3] locs = 0.92 - numpy.divide(locs, 11.) times = self.times @@ -242,12 +260,13 @@ def _plot_ssh_validation_for_movie(self, outFolder='.'): h, l1 = ax2[1].get_legend_handles_labels() ax2[1].legend(h[0:3], l1[0:3], frameon=False, loc='lower left') - fig2.savefig(f'{outFolder}/ssh_depth_section_{ii:03d}.png', dpi=200) + fig2.savefig(f'{outFolder}/ssh_depth_section_{ii:03d}.png', + dpi=200) plt.close(fig2) ii += 1 def _images_to_movies(self, outFolder='.', framesPerSecond=30, - extension='mp4', overwrite=True): + extension='mp4', overwrite=True): """ Convert all the image sequences into movies with ffmpeg """ From b61748c8f8164321bba0861279513ad0d531b962 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Fri, 15 Apr 2022 12:40:23 -0500 Subject: [PATCH 20/24] Remove resolution and ny from config --- compass/ocean/tests/drying_slope/default/__init__.py | 6 ++++-- compass/ocean/tests/drying_slope/drying_slope.cfg | 6 +----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index 62af0e15a4..e287deb7d1 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -62,5 +62,7 @@ def configure(self): ny += 2 dc = 1e3 * resolution - config.set('drying_slope', 'ny', f'{ny}') - config.set('drying_slope', 'dc', f'{dc}') + config.set('drying_slope', 'ny', f'{ny}', comment='the number of ' + 'mesh cells in the y direction') + config.set('drying_slope', 'dc', f'{dc}', comment='the distance ' + 'between adjacent cell centers') diff --git a/compass/ocean/tests/drying_slope/drying_slope.cfg b/compass/ocean/tests/drying_slope/drying_slope.cfg index 84ee5e50e4..6aefaf04d1 100644 --- a/compass/ocean/tests/drying_slope/drying_slope.cfg +++ b/compass/ocean/tests/drying_slope/drying_slope.cfg @@ -10,12 +10,8 @@ coord_type = sigma # config options for drying slope test cases [drying_slope] -# the number of grid cells in x and y +# the number of grid cells in x nx = 6 -ny = 28 - -# the size of grid cells (m) -dc = 1000.0 # config options for visualizing drying slope ouptut [drying_slope_viz] From 0844f09fcbda63a3df639a96a8f01778ad6546e1 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Sun, 17 Apr 2022 13:48:00 -0500 Subject: [PATCH 21/24] Change forward namelist options --- compass/ocean/tests/drying_slope/namelist.forward | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/compass/ocean/tests/drying_slope/namelist.forward b/compass/ocean/tests/drying_slope/namelist.forward index 6945f7bdcb..3624092dd1 100644 --- a/compass/ocean/tests/drying_slope/namelist.forward +++ b/compass/ocean/tests/drying_slope/namelist.forward @@ -18,8 +18,7 @@ config_drying_min_cell_height=1.0e-3 config_zero_drying_velocity=.true. config_verify_not_dry=.true. config_thickness_flux_type='upwind' -config_cvmix_background_viscosity=1e4 -config_use_variable_drag=.true. +config_use_cvmix=.false. config_Rayleigh_friction=.true. config_Rayleigh_damping_depth_variable=.true. config_Rayleigh_damping_coeff=0.0025 From 62deaafc3eedcf72c44573b286196f8b782c03ec Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Sun, 17 Apr 2022 13:46:34 -0500 Subject: [PATCH 22/24] Change timestep for high resolution case --- .../ocean/tests/drying_slope/default/__init__.py | 3 ++- compass/ocean/tests/drying_slope/forward.py | 13 +++++++++++-- .../ocean/tests/drying_slope/namelist.1km.forward | 1 + .../ocean/tests/drying_slope/namelist.250m.forward | 1 + compass/ocean/tests/drying_slope/namelist.forward | 1 - 5 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 compass/ocean/tests/drying_slope/namelist.1km.forward create mode 100644 compass/ocean/tests/drying_slope/namelist.250m.forward diff --git a/compass/ocean/tests/drying_slope/default/__init__.py b/compass/ocean/tests/drying_slope/default/__init__.py index e287deb7d1..7e50af7dfb 100644 --- a/compass/ocean/tests/drying_slope/default/__init__.py +++ b/compass/ocean/tests/drying_slope/default/__init__.py @@ -46,7 +46,8 @@ def __init__(self, test_group, resolution, coord_type): self.add_step(InitialState(test_case=self)) for damping_coeff in [0.0025, 0.01]: - self.add_step(Forward(test_case=self, cores=4, threads=1, + self.add_step(Forward(test_case=self, resolution=resolution, + cores=4, threads=1, damping_coeff=damping_coeff)) self.add_step(Viz(test_case=self)) diff --git a/compass/ocean/tests/drying_slope/forward.py b/compass/ocean/tests/drying_slope/forward.py index 3437a311f2..f7646c55bd 100644 --- a/compass/ocean/tests/drying_slope/forward.py +++ b/compass/ocean/tests/drying_slope/forward.py @@ -7,8 +7,8 @@ class Forward(Step): A step for performing forward MPAS-Ocean runs as part of drying slope test cases. """ - def __init__(self, test_case, name='forward', subdir=None, cores=1, - min_cores=None, threads=1, damping_coeff=None): + def __init__(self, test_case, resolution, name='forward', subdir=None, + cores=1, min_cores=None, threads=1, damping_coeff=None): """ Create a new test case @@ -17,6 +17,9 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, test_case : compass.TestCase The test case this step belongs to + resolution : str + The resolution of the test case + name : str the name of the test case @@ -49,6 +52,12 @@ def __init__(self, test_case, name='forward', subdir=None, cores=1, self.add_namelist_file('compass.ocean.tests.drying_slope', 'namelist.forward') + if resolution < 1.: + res_name = f'{int(resolution*1e3)}m' + else: + res_name = f'{int(resolution)}km' + self.add_namelist_file('compass.ocean.tests.drying_slope', + f'namelist.{res_name}.forward') if damping_coeff is not None: # update the Rayleigh damping coeff to the requested value options = {'config_Rayleigh_damping_coeff': f'{damping_coeff}'} diff --git a/compass/ocean/tests/drying_slope/namelist.1km.forward b/compass/ocean/tests/drying_slope/namelist.1km.forward new file mode 100644 index 0000000000..ef4481cc0a --- /dev/null +++ b/compass/ocean/tests/drying_slope/namelist.1km.forward @@ -0,0 +1 @@ +config_dt='0000_00:00:30' diff --git a/compass/ocean/tests/drying_slope/namelist.250m.forward b/compass/ocean/tests/drying_slope/namelist.250m.forward new file mode 100644 index 0000000000..6198aa4969 --- /dev/null +++ b/compass/ocean/tests/drying_slope/namelist.250m.forward @@ -0,0 +1 @@ +config_dt='0000_00:00:08' diff --git a/compass/ocean/tests/drying_slope/namelist.forward b/compass/ocean/tests/drying_slope/namelist.forward index 3624092dd1..f4f986b33e 100644 --- a/compass/ocean/tests/drying_slope/namelist.forward +++ b/compass/ocean/tests/drying_slope/namelist.forward @@ -1,5 +1,4 @@ config_run_duration='0000_12:00:01' -config_dt='0000_00:00:30' config_time_integrator='RK4' config_use_tidal_forcing=.true. config_use_tidal_forcing_tau=60.0 From 9d79ab15be877bad11cf5f8ebf6726dadba8a750 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Sun, 17 Apr 2022 13:48:53 -0500 Subject: [PATCH 23/24] Add config option to generate movie --- .../ocean/tests/drying_slope/drying_slope.cfg | 3 +++ .../ocean/tests/drying_slope/viz/__init__.py | 24 ++++++++++--------- .../ocean/test_groups/drying_slope.rst | 7 +++--- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/compass/ocean/tests/drying_slope/drying_slope.cfg b/compass/ocean/tests/drying_slope/drying_slope.cfg index 6aefaf04d1..4bc41c4e2f 100644 --- a/compass/ocean/tests/drying_slope/drying_slope.cfg +++ b/compass/ocean/tests/drying_slope/drying_slope.cfg @@ -16,6 +16,9 @@ nx = 6 # config options for visualizing drying slope ouptut [drying_slope_viz] +# whether to generate movie +generate_movie = False + # frames per second for movies frames_per_second = 30 diff --git a/compass/ocean/tests/drying_slope/viz/__init__.py b/compass/ocean/tests/drying_slope/viz/__init__.py index f85bb113df..7852c15bf9 100644 --- a/compass/ocean/tests/drying_slope/viz/__init__.py +++ b/compass/ocean/tests/drying_slope/viz/__init__.py @@ -61,20 +61,22 @@ def run(self): section = self.config['paths'] datapath = section.get('ocean_database_root') section = self.config['drying_slope_viz'] - frames_per_second = section.getint('frames_per_second') - movie_format = section.get('movie_format') - outFolder = 'movie' - if not os.path.exists(outFolder): - try: - os.makedirs(os.path.join(os.getcwd(), outFolder)) - except OSError: - pass + generate_movie = section.getboolean('generate_movie') self._plot_ssh_validation() self._plot_ssh_time_series() - self._plot_ssh_validation_for_movie(outFolder=outFolder) - self._images_to_movies(framesPerSecond=frames_per_second, - outFolder=outFolder, extension=movie_format) + if generate_movie: + frames_per_second = section.getint('frames_per_second') + movie_format = section.get('movie_format') + outFolder = 'movie' + if not os.path.exists(outFolder): + try: + os.makedirs(os.path.join(os.getcwd(), outFolder)) + except OSError: + pass + self._plot_ssh_validation_for_movie(outFolder=outFolder) + self._images_to_movies(framesPerSecond=frames_per_second, + outFolder=outFolder, extension=movie_format) def _plot_ssh_time_series(self, outFolder='.'): """ diff --git a/docs/users_guide/ocean/test_groups/drying_slope.rst b/docs/users_guide/ocean/test_groups/drying_slope.rst index 525d696f72..3344f64506 100644 --- a/docs/users_guide/ocean/test_groups/drying_slope.rst +++ b/docs/users_guide/ocean/test_groups/drying_slope.rst @@ -60,14 +60,13 @@ The config options for this test case are: # the number of grid cells in x and y nx = 6 - ny = 28 - - # the size of grid cells (m) - dc = 1000.0 # config options for visualizing drying slope ouptut [drying_slope_viz] + # whether to generate movie + generate_movie = False + # frames per second for movies frames_per_second = 30 From 98ec3286d3cc6263c65f62d69f314e1896ef389e Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Mon, 18 Apr 2022 09:59:48 -0500 Subject: [PATCH 24/24] Remove variable drag from init and forcing --- compass/ocean/tests/drying_slope/namelist.init | 1 - compass/ocean/tests/drying_slope/streams.forward | 1 - compass/ocean/tests/drying_slope/streams.init | 1 - 3 files changed, 3 deletions(-) diff --git a/compass/ocean/tests/drying_slope/namelist.init b/compass/ocean/tests/drying_slope/namelist.init index 6f42c8c82d..e0937b6b87 100644 --- a/compass/ocean/tests/drying_slope/namelist.init +++ b/compass/ocean/tests/drying_slope/namelist.init @@ -10,4 +10,3 @@ config_use_wetting_drying=.true. config_drying_min_cell_height=1.000001e-3 config_use_tidal_forcing=.true. config_write_cull_cell_mask=.false. -config_use_variable_drag=.true. diff --git a/compass/ocean/tests/drying_slope/streams.forward b/compass/ocean/tests/drying_slope/streams.forward index 7004ee26af..49b6475ce2 100644 --- a/compass/ocean/tests/drying_slope/streams.forward +++ b/compass/ocean/tests/drying_slope/streams.forward @@ -20,7 +20,6 @@ input_interval="initial_only" type="input"> - -