import os
from polaris.config import PolarisConfigParser
from polaris.mesh.spherical import (
IcosahedralMeshStep,
QuasiUniformSphericalMeshStep,
)
from polaris.ocean.resolution import resolution_to_subdir
[docs]
def add_spherical_base_mesh_step(component, resolution, icosahedral):
"""
Add a shared step for creating spherical base mesh with the given
resolution to the ocean component (if one has not already been added)
Parameters
----------
component : polaris.Component
The ocean component that the step will be added to
resolution : float
The resolution in km of the mesh
icosahedral : bool
Whether the mesh is a subdivided icosahedral mesh, as opposed to
Returns
-------
base_mesh : polaris.Step
The base mesh step
mesh_name : str
The name of the mesh (e.g. '240km')
"""
mesh_name = resolution_to_subdir(resolution)
if icosahedral:
prefix = 'icos'
else:
prefix = 'qu'
name = f'{prefix}_base_mesh_{mesh_name}'
subdir = f'spherical/{prefix}/base_mesh/{mesh_name}'
if subdir in component.steps:
base_mesh = component.steps[subdir]
else:
if icosahedral:
base_mesh = IcosahedralMeshStep(
component=component, name=name, subdir=subdir,
cell_width=resolution)
else:
base_mesh = QuasiUniformSphericalMeshStep(
component=component, name=name, subdir=subdir,
cell_width=resolution)
# add default config options for spherical meshes
config_filename = f'{base_mesh.name}.cfg'
filepath = os.path.join(base_mesh.subdir, config_filename)
config = PolarisConfigParser(filepath=filepath)
config.add_from_package('polaris.mesh', 'spherical.cfg')
base_mesh.set_shared_config(config)
component.add_step(base_mesh)
return base_mesh, mesh_name