Source code for polaris.ocean.tasks.manufactured_solution.analysis

from polaris.ocean.convergence.analysis import ConvergenceAnalysis
from polaris.ocean.tasks.manufactured_solution.exact_solution import (
    ExactSolution,
)


[docs] class Analysis(ConvergenceAnalysis): """ A step for analysing the output from the manufactured solution test case """
[docs] def __init__(self, component, subdir, dependencies, refinement='both'): """ Create the step Parameters ---------- component : polaris.Component The component the step belongs to resolutions : list of float The resolutions of the meshes that have been run subdir : str The subdirectory that the step resides in dependencies : dict of dict of polaris.Steps The dependencies of this step refinement : str, optional Whether to refine in space, time or both space and time """ convergence_vars = [{'name': 'ssh', 'title': 'SSH', 'zidx': None}] super().__init__(component=component, subdir=subdir, dependencies=dependencies, convergence_vars=convergence_vars, refinement=refinement)
[docs] def exact_solution(self, refinement_factor, field_name, time, zidx=None): """ Get the exact solution Parameters ---------- refinement_factor : float The factor by which to scale space, time or both field_name : str The name of the variable of which we evaluate convergence For the default method, we use the same convergence rate for all fields time : float The time at which to evaluate the exact solution in seconds. For the default method, we always use the initial state. zidx : int, optional The z-index for the vertical level at which to evaluate the exact solution Returns ------- solution : xarray.DataArray The exact solution as derived from the initial condition """ init = self.open_model_dataset(f'init_r{refinement_factor:02g}.nc') exact = ExactSolution(self.config, init) if field_name != 'ssh': raise ValueError(f'{field_name} is not currently supported') return exact.ssh(time)