Source code for polaris.mesh.base.so

import numpy as np
from geometric_features import read_feature_collection
from mpas_tools.mesh.creation.signed_distance import (
    signed_distance_from_geojson,
)

from polaris.constants import get_constant
from polaris.mesh import QuasiUniformSphericalMeshStep


[docs] class SOBaseMesh(QuasiUniformSphericalMeshStep): """ A step for creating Southern Ocean (SO) regionally refined meshes """ def setup(self): """ Add some input files """ self.add_input_file( filename='high_res_region.geojson', package=self.__module__ ) super().setup()
[docs] def build_cell_width_lat_lon(self): """ Create cell width array for this mesh on a regular latitude-longitude grid Returns ------- cellWidth : numpy.array m x n array of cell width in km lon : numpy.array longitude in degrees (length n and between -180 and 180) lat : numpy.array longitude in degrees (length m and between -90 and 90) """ config = self.config section = config['spherical_mesh'] min_res = section.getfloat('min_cell_width') max_res = section.getfloat('max_cell_width') dlon = 0.1 dlat = dlon earth_radius = get_constant('mean_radius') nlon = int(360.0 / dlon) + 1 nlat = int(180.0 / dlat) + 1 lon = np.linspace(-180.0, 180.0, nlon) lat = np.linspace(-90.0, 90.0, nlat) # start with a uniform max_res km background resolution cell_width = max_res * np.ones((nlat, nlon)) fc = read_feature_collection('high_res_region.geojson') so_signed_distance = signed_distance_from_geojson( fc, lon, lat, earth_radius, max_length=0.25 ) # Equivalent to 20 degrees latitude trans_width = 1600e3 trans_start = 500e3 weights = 0.5 * ( 1 + np.tanh((so_signed_distance - trans_start) / trans_width) ) cell_width = min_res * (1 - weights) + cell_width * weights return cell_width, lon, lat