Skip to content

Commit

Permalink
Remove to_esmf() method from descriptors
Browse files Browse the repository at this point in the history
MOAB cannot read these grids so we don't want to put extra effort
into supporting them.
  • Loading branch information
xylar committed Jul 21, 2024
1 parent 98778ff commit bffb9ea
Show file tree
Hide file tree
Showing 6 changed files with 0 additions and 298 deletions.
62 changes: 0 additions & 62 deletions pyremap/descriptor/lat_lon_grid_descriptor.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,68 +244,6 @@ def to_scrip(self, scripFileName, expandDist=None, expandFactor=None):

outFile.close()

def to_esmf(self, esmfFileName):
"""
Create an ESMF mesh file for the mesh
Parameters
----------
esmfFileName : str
The path to which the ESMF mesh file should be written
"""
nLat = len(self.lat)
nLon = len(self.lon)

(Lon, Lat) = numpy.meshgrid(self.lon, self.lat)
(LonCorner, LatCorner) = numpy.meshgrid(self.lonCorner, self.latCorner)
(XIndices, YIndices) = numpy.meshgrid(numpy.arange(nLon + 1),
numpy.arange(nLat + 1))

elementCount = nLon * nLat
nodeCount = (nLon + 1) * (nLat + 1)
coordDim = 2
maxNodePElement = 4

nodeCoords = numpy.zeros((nodeCount, coordDim))
nodeCoords[:, 0] = LonCorner.flat
nodeCoords[:, 1] = LatCorner.flat

centerCoords = numpy.zeros((elementCount, coordDim))
centerCoords[:, 0] = Lon.flat
centerCoords[:, 1] = Lat.flat

elementConn = numpy.zeros((elementCount, maxNodePElement), dtype=int)
elementConn[:, 0] = (XIndices[0:-1, 0:-1].ravel() +
(nLon + 1) * YIndices[0:-1, 0:-1].ravel())
elementConn[:, 1] = (XIndices[0:-1, 1:].ravel() +
(nLon + 1) * YIndices[0:-1, 1:].ravel())
elementConn[:, 2] = (XIndices[1:, 1:].ravel() +
(nLon + 1) * YIndices[1:, 1:].ravel())
elementConn[:, 3] = (XIndices[1:, 0:-1].ravel() +
(nLon + 1) * YIndices[1:, 0:-1].ravel())

ds_out = xarray.Dataset()
ds_out['nodeCoords'] = (('nodeCount', 'coordDim'), nodeCoords)
ds_out.nodeCoords.attrs['units'] = self.units
ds_out['centerCoords'] = \
(('elementCount', 'coordDim'), centerCoords)
ds_out.centerCoords.attrs['units'] = self.units
ds_out['elementConn'] = \
(('elementCount', 'maxNodePElement'), elementConn + 1)
ds_out.elementConn.attrs['start_index'] = 1
ds_out.elementConn.attrs['_FillValue'] = -1
ds_out['numElementConn'] = \
(('elementCount',), maxNodePElement * numpy.ones(elementCount,
dtype=int))

ds_out['origGridDims'] = (('origGridRank',), [nLon, nLat])

ds_out.attrs['gridType'] = 'unstructured mesh'
ds_out.attrs['version'] = '0.9'

ds_out.to_netcdf(esmfFileName, format=self.format,
engine=self.engine)

def _set_coords(self, latVarName, lonVarName, latDimName,
lonDimName):
"""
Expand Down
13 changes: 0 additions & 13 deletions pyremap/descriptor/mesh_descriptor.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,3 @@ def to_scrip(self, scripFileName, expandDist=None, expandFactor=None):
"""
raise NotImplementedError(
'to_scrip is not implemented for this descriptor')

def to_esmf(self, esmfFileName):
"""
Subclasses should overload this method to write an ESMF mesh file based
on the mesh.
Parameters
----------
esmfFileName : str
The path to which the ESMF mesh file should be written
"""
raise NotImplementedError(
'to_esmf is not implemented for this descriptor')
43 changes: 0 additions & 43 deletions pyremap/descriptor/mpas_cell_mesh_descriptor.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,46 +167,3 @@ def to_scrip(self, scripFileName, expandDist=None, expandFactor=None):

inFile.close()
outFile.close()

def to_esmf(self, esmfFileName):
"""
Create an ESMF mesh file for the mesh
Parameters
----------
esmfFileName : str
The path to which the ESMF mesh file should be written
"""
with xarray.open_dataset(self.fileName) as ds:

nodeCount = ds.sizes['nVertices']
elementCount = ds.sizes['nCells']
coordDim = 2

nodeCoords = numpy.zeros((nodeCount, coordDim))
nodeCoords[:, 0] = ds.lonVertex.values
nodeCoords[:, 1] = ds.latVertex.values
centerCoords = numpy.zeros((elementCount, coordDim))
centerCoords[:, 0] = ds.lonCell.values
centerCoords[:, 1] = ds.latCell.values

elementConn = ds.verticesOnCell.values
elementConn[elementConn == nodeCount + 1] = -1

ds_out = xarray.Dataset()
ds_out['nodeCoords'] = (('nodeCount', 'coordDim'), nodeCoords)
ds_out.nodeCoords.attrs['units'] = 'radians'
ds_out['centerCoords'] = \
(('elementCount', 'coordDim'), centerCoords)
ds_out.centerCoords.attrs['units'] = 'radians'
ds_out['elementConn'] = \
(('elementCount', 'maxNodePElement'), elementConn)
ds_out.elementConn.attrs['start_index'] = 1
ds_out.elementConn.attrs['_FillValue'] = -1
ds_out['numElementConn'] = \
(('elementCount',), ds.nEdgesOnCell.values)
ds_out.attrs['gridType'] = 'unstructured mesh'
ds_out.attrs['version'] = '0.9'

ds_out.to_netcdf(esmfFileName, format=self.format,
engine=self.engine)
63 changes: 0 additions & 63 deletions pyremap/descriptor/mpas_edge_mesh_descriptor.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,66 +161,3 @@ def to_scrip(self, scripFileName, expandDist=None, expandFactor=None):

inFile.close()
outFile.close()

def to_esmf(self, esmfFileName):
"""
Create an ESMF mesh file for the mesh
Parameters
----------
esmfFileName : str
The path to which the ESMF mesh file should be written
"""
with xr.open_dataset(self.fileName) as ds:

nCells = ds.sizes['nCells']
nodeCount = nCells + ds.sizes['nVertices']
elementCount = ds.sizes['nEdges']
coordDim = 2

nodeCoords = np.zeros((nodeCount, coordDim))
nodeCoords[0:nCells, 0] = ds.lonCell.values
nodeCoords[0:nCells, 1] = ds.latCell.values
nodeCoords[nCells:, 0] = ds.lonVertex.values
nodeCoords[nCells:, 1] = ds.latVertex.values
centerCoords = np.zeros((elementCount, coordDim))
centerCoords[:, 0] = ds.lonEdge.values
centerCoords[:, 1] = ds.latEdge.values

elementConn = -1 * np.ones((elementCount, 4), dtype=int)

verticesOnEdge = ds.verticesOnEdge.values
cellsOnEdge = ds.cellsOnEdge.values

elementConn[:, 0] = cellsOnEdge[:, 0]
elementConn[:, 1] = nCells + verticesOnEdge[:, 0]
elementConn[:, 2] = cellsOnEdge[:, 1]
elementConn[:, 3] = nCells + verticesOnEdge[:, 1]

# invalid value is -1, not 0
elementConn[elementConn == 0] = -1
for vertex in range(3):
# swap -1 value until they're at the end
mask = elementConn[:, vertex] == -1
elementConn[mask, vertex] = elementConn[mask, vertex + 1]
elementConn[mask, vertex + 1] = -1

numElementConn = np.sum((elementConn != -1), axis=1).astype(np.byte)

ds_out = xr.Dataset()
ds_out['nodeCoords'] = (('nodeCount', 'coordDim'), nodeCoords)
ds_out.nodeCoords.attrs['units'] = 'radians'
ds_out['centerCoords'] = \
(('elementCount', 'coordDim'), centerCoords)
ds_out.centerCoords.attrs['units'] = 'radians'
ds_out['elementConn'] = \
(('elementCount', 'maxNodePElement'), elementConn)
ds_out.elementConn.attrs['start_index'] = 1
ds_out.elementConn.attrs['_FillValue'] = -1
ds_out['numElementConn'] = \
(('elementCount',), numElementConn)
ds_out.attrs['gridType'] = 'unstructured mesh'
ds_out.attrs['version'] = '0.9'

ds_out.to_netcdf(esmfFileName, format=self.format,
engine=self.engine)
52 changes: 0 additions & 52 deletions pyremap/descriptor/point_collection_descriptor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

import netCDF4
import numpy
import xarray

from pyremap.descriptor.mesh_descriptor import MeshDescriptor
from pyremap.descriptor.utility import add_history, create_scrip
Expand Down Expand Up @@ -127,54 +126,3 @@ def to_scrip(self, scripFileName, expandDist=None, expandFactor=None):
setattr(outFile, 'history', self.history)

outFile.close()

def to_esmf(self, esmfFileName):
"""
Create an ESMF mesh file for the mesh
Parameters
----------
esmfFileName : str
The path to which the ESMF mesh file should be written
"""
nPoints = len(self.lat)

elementCount = nPoints
nodeCount = 3 * nPoints
coordDim = 2
maxNodePElement = 3

nodeCoords = numpy.zeros((nodeCount, coordDim))
# just repeat the center lat and lon
for iVertex in range(maxNodePElement):
nodeCoords[iVertex::maxNodePElement, 0] = self.lon
nodeCoords[iVertex::maxNodePElement, 1] = self.lat

centerCoords = numpy.zeros((elementCount, coordDim))
centerCoords[:, 0] = self.lon
centerCoords[:, 1] = self.lat

elementConn = numpy.zeros((elementCount, maxNodePElement), dtype=int)
elementConn[:, 0] = maxNodePElement * numpy.arange(nPoints)
elementConn[:, 1] = maxNodePElement * numpy.arange(nPoints) + 1
elementConn[:, 2] = maxNodePElement * numpy.arange(nPoints) + 2

ds_out = xarray.Dataset()
ds_out['nodeCoords'] = (('nodeCount', 'coordDim'), nodeCoords)
ds_out.nodeCoords.attrs['units'] = self.units
ds_out['centerCoords'] = \
(('elementCount', 'coordDim'), centerCoords)
ds_out.centerCoords.attrs['units'] = self.units
ds_out['elementConn'] = \
(('elementCount', 'maxNodePElement'), elementConn + 1)
ds_out.elementConn.attrs['start_index'] = 1
ds_out.elementConn.attrs['_FillValue'] = -1
ds_out['numElementConn'] = \
(('elementCount',), maxNodePElement * numpy.ones(elementCount,
dtype=int))

ds_out.attrs['gridType'] = 'unstructured mesh'
ds_out.attrs['version'] = '0.9'

ds_out.to_netcdf(esmfFileName, format=self.format,
engine=self.engine)
65 changes: 0 additions & 65 deletions pyremap/descriptor/projection_grid_descriptor.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,71 +222,6 @@ def to_scrip(self, scripFileName, expandDist=None, expandFactor=None):

outFile.close()

def to_esmf(self, esmfFileName):
"""
Create an ESMF mesh file for the mesh
Parameters
----------
esmfFileName : str
The path to which the ESMF mesh file should be written
"""
nx = len(self.x)
ny = len(self.y)

(X, Y) = numpy.meshgrid(self.x, self.y)
(XCorner, YCorner) = numpy.meshgrid(self.xCorner, self.yCorner)
(XIndices, YIndices) = numpy.meshgrid(numpy.arange(nx + 1),
numpy.arange(ny + 1))

(Lat, Lon) = self.project_to_lat_lon(X, Y)
(LatCorner, LonCorner) = self.project_to_lat_lon(XCorner, YCorner)

elementCount = nx * ny
nodeCount = (nx + 1) * (ny + 1)
coordDim = 2
maxNodePElement = 4

nodeCoords = numpy.zeros((nodeCount, coordDim))
nodeCoords[:, 0] = LonCorner.flat
nodeCoords[:, 1] = LatCorner.flat

centerCoords = numpy.zeros((elementCount, coordDim))
centerCoords[:, 0] = Lon.flat
centerCoords[:, 1] = Lat.flat

elementConn = numpy.zeros((elementCount, maxNodePElement), dtype=int)
elementConn[:, 0] = (XIndices[0:-1, 0:-1].ravel() +
(nx + 1) * YIndices[0:-1, 0:-1].ravel())
elementConn[:, 1] = (XIndices[0:-1, 1:].ravel() +
(nx + 1) * YIndices[0:-1, 1:].ravel())
elementConn[:, 2] = (XIndices[1:, 1:].ravel() +
(nx + 1) * YIndices[1:, 1:].ravel())
elementConn[:, 3] = (XIndices[1:, 0:-1].ravel() +
(nx + 1) * YIndices[1:, 0:-1].ravel())

ds_out = xarray.Dataset()
ds_out['nodeCoords'] = (('nodeCount', 'coordDim'), nodeCoords)
ds_out.nodeCoords.attrs['units'] = 'degrees'
ds_out['centerCoords'] = \
(('elementCount', 'coordDim'), centerCoords)
ds_out.centerCoords.attrs['units'] = 'degrees'
ds_out['elementConn'] = \
(('elementCount', 'maxNodePElement'), elementConn + 1)
ds_out.elementConn.attrs['start_index'] = 1
ds_out.elementConn.attrs['_FillValue'] = -1
ds_out['numElementConn'] = \
(('elementCount',), maxNodePElement * numpy.ones(elementCount,
dtype=int))

ds_out['origGridDims'] = (('origGridRank',), [ny, nx])

ds_out.attrs['gridType'] = 'unstructured mesh'
ds_out.attrs['version'] = '0.9'

ds_out.to_netcdf(esmfFileName, format=self.format,
engine=self.engine)

def project_to_lat_lon(self, X, Y):
"""
Given X and Y locations of points in a projection, returns the
Expand Down

0 comments on commit bffb9ea

Please sign in to comment.