Source code for regrid2.mvLibCFRegrid
# This code is provided with the hope that it will be useful.
# No guarantee is provided whatsoever. Use at your own risk.
#
# David Kindig and Alex Pletzer, Tech-X Corp. (2012)
"""
LibCF regridding class
"""
from regrid2 import gsRegrid
from regrid2 import GenericRegrid
[docs]class LibCFRegrid(GenericRegrid):
"""
"""
def __init__(self, srcGrid, dstGrid, srcGridMask=None,
srcBounds=None, **args):
"""
Constructor
Parameters
----------
srcGrid
array
dstGrid
array
srcBounds
cell boundaries
**args keyword arguments, eg mkCyclic, handleCut, ...to be passed to gsRegrid
"""
self.regridMethodStr = 'linear'
self.mkCyclic = args.get('mkCyclic', False)
self.handleCut = args.get('handleCut', False)
self.verbose = args.get('verbose', False)
self.regridObj = gsRegrid.Regrid(srcGrid, dstGrid,
src_bounds=srcBounds,
mkCyclic=self.mkCyclic,
handleCut=self.handleCut)
if srcGridMask is not None:
self.regridObj.setMask(srcGridMask)
# min resolution, required in order to set the tolerance (tolpos)
self.delta = float('inf')
for i in range(len(dstGrid)):
coordMin = dstGrid[i].min()
coordMax = dstGrid[i].max()
n = max(dstGrid[i].shape)
self.delta = min(self.delta, (coordMax - coordMin) / float(n))
[docs] def computeWeights(self, **args):
"""
Compute interpolation weights
Parameters
----------
**args arguments to be passed to gsRegrid, e.g. nitermax, tolpos, ...
"""
nitermax = args.get('nitermax', 20)
# make tolpos relative to the min cell size
tolpos = args.get('tolpos', 0.01) * self.delta
self.regridObj.computeWeights(nitermax=nitermax, tolpos=tolpos)
[docs] def apply(self, srcData, dstData, missingValue=None, **args):
"""
Regrid source to destination
Parameters
----------
srcData :
array (input)
dstData :
array (output)
missingValue :
value that should be set for points falling outside
the src domain, pass None if these should not be touched.
"""
self.regridObj.apply(srcData, dstData, missingValue)
[docs] def getSrcGrid(self):
"""
Get the grid of the src data (maybe larger than the dst
grid passed to the constructor due to column/row padding)
Returns
-------
grid
"""
return self.regridObj.getSrcGrid()
[docs] def getDstGrid(self):
"""
Get the grid of the dst data
Returns
-------
grid
"""
return self.regridObj.getDstGrid()
[docs] def fillInDiagnosticData(self, diag, rootPe):
"""
Fill in diagnostic data
Parameters
----------
diag
a dictionary whose entries, if present, will be filled valid entries are: 'numDstPoints' and 'numValid'
rootPe
not used
"""
for entry in 'numDstPoints', 'numValid':
if entry in diag:
meth = 'get' + entry[0].upper() + entry[1:]
diag[entry] = eval('self.regridObj.' + meth + '()')
diag['regridTool'] = 'libcf'
diag['regridMethod'] = self.regridMethodStr
diag['handleCut'] = self.handleCut
diag['mkCyclic'] = self.mkCyclic
diag['verbose'] = self.verbose