From 8bdcbbbcac1f647893ac0be70d60cfff915ecd6f Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Thu, 17 Aug 2023 11:43:48 -0500 Subject: [PATCH 1/2] Don't delete temp dir after convert() or cull() --- conda_package/mpas_tools/mesh/conversion.py | 118 ++++++++++---------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/conda_package/mpas_tools/mesh/conversion.py b/conda_package/mpas_tools/mesh/conversion.py index d064d547e..e7055f4cf 100644 --- a/conda_package/mpas_tools/mesh/conversion.py +++ b/conda_package/mpas_tools/mesh/conversion.py @@ -1,6 +1,6 @@ import os import xarray -from tempfile import TemporaryDirectory +from tempfile import TemporaryDirectory, mkdtemp import shutil import mpas_tools.io @@ -38,26 +38,26 @@ def convert(dsIn, graphInfoFileName=None, logger=None, dir=None): """ if dir is not None: dir = os.path.abspath(dir) - with TemporaryDirectory(dir=dir) as tempdir: - inFileName = '{}/mesh_in.nc'.format(tempdir) - write_netcdf(dsIn, inFileName) - outFileName = '{}/mesh_out.nc'.format(tempdir) + tempdir = mkdtemp(dir=dir) + inFileName = '{}/mesh_in.nc'.format(tempdir) + write_netcdf(dsIn, inFileName) - if graphInfoFileName is not None: - graphInfoFileName = os.path.abspath(graphInfoFileName) + outFileName = '{}/mesh_out.nc'.format(tempdir) - outDir = os.path.dirname(outFileName) + if graphInfoFileName is not None: + graphInfoFileName = os.path.abspath(graphInfoFileName) - check_call(['MpasMeshConverter.x', inFileName, outFileName], - logger) + outDir = os.path.dirname(outFileName) - dsOut = xarray.open_dataset(outFileName) - dsOut.load() + check_call(['MpasMeshConverter.x', inFileName, outFileName], logger) - if graphInfoFileName is not None: - shutil.copyfile('{}/graph.info'.format(outDir), - graphInfoFileName) + dsOut = xarray.open_dataset(outFileName) + dsOut.load() + + if graphInfoFileName is not None: + shutil.copyfile('{}/graph.info'.format(outDir), + graphInfoFileName) return dsOut @@ -109,50 +109,50 @@ def cull(dsIn, dsMask=None, dsInverse=None, dsPreserve=None, """ if dir is not None: dir = os.path.abspath(dir) - with TemporaryDirectory(dir=dir) as tempdir: - inFileName = '{}/ds_in.nc'.format(tempdir) - write_netcdf(dsIn, inFileName) - outFileName = '{}/ds_out.nc'.format(tempdir) - - args = ['MpasCellCuller.x', inFileName, outFileName] - - if dsMask is not None: - if not isinstance(dsMask, list): - dsMask = [dsMask] - for index, ds in enumerate(dsMask): - fileName = '{}/mask{}.nc'.format(tempdir, index) - write_netcdf(ds, fileName) - args.extend(['-m', fileName]) - - if dsInverse is not None: - if not isinstance(dsInverse, list): - dsInverse = [dsInverse] - for index, ds in enumerate(dsInverse): - fileName = '{}/inverse{}.nc'.format(tempdir, index) - write_netcdf(ds, fileName) - args.extend(['-i', fileName]) - - if dsPreserve is not None: - if not isinstance(dsPreserve, list): - dsPreserve = [dsPreserve] - for index, ds in enumerate(dsPreserve): - fileName = '{}/preserve{}.nc'.format(tempdir, index) - write_netcdf(ds, fileName) - args.extend(['-p', fileName]) - - if graphInfoFileName is not None: - graphInfoFileName = os.path.abspath(graphInfoFileName) - - outDir = os.path.dirname(outFileName) - - check_call(args=args, logger=logger) - - dsOut = xarray.open_dataset(outFileName) - dsOut.load() - - if graphInfoFileName is not None: - shutil.copyfile('{}/culled_graph.info'.format(outDir), - graphInfoFileName) + tempdir = mkdtemp(dir=dir) + inFileName = '{}/ds_in.nc'.format(tempdir) + write_netcdf(dsIn, inFileName) + outFileName = '{}/ds_out.nc'.format(tempdir) + + args = ['MpasCellCuller.x', inFileName, outFileName] + + if dsMask is not None: + if not isinstance(dsMask, list): + dsMask = [dsMask] + for index, ds in enumerate(dsMask): + fileName = '{}/mask{}.nc'.format(tempdir, index) + write_netcdf(ds, fileName) + args.extend(['-m', fileName]) + + if dsInverse is not None: + if not isinstance(dsInverse, list): + dsInverse = [dsInverse] + for index, ds in enumerate(dsInverse): + fileName = '{}/inverse{}.nc'.format(tempdir, index) + write_netcdf(ds, fileName) + args.extend(['-i', fileName]) + + if dsPreserve is not None: + if not isinstance(dsPreserve, list): + dsPreserve = [dsPreserve] + for index, ds in enumerate(dsPreserve): + fileName = '{}/preserve{}.nc'.format(tempdir, index) + write_netcdf(ds, fileName) + args.extend(['-p', fileName]) + + if graphInfoFileName is not None: + graphInfoFileName = os.path.abspath(graphInfoFileName) + + outDir = os.path.dirname(outFileName) + + check_call(args=args, logger=logger) + + dsOut = xarray.open_dataset(outFileName) + dsOut.load() + + if graphInfoFileName is not None: + shutil.copyfile('{}/culled_graph.info'.format(outDir), + graphInfoFileName) return dsOut From 45291efcb8683e5797388143f915d5f44ca9c642 Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Thu, 17 Aug 2023 08:42:24 +0200 Subject: [PATCH 2/2] Convert masks to int type in `cull()` function The new version of the cell culler requires masks in int (rather than int64 or float) format. --- conda_package/mpas_tools/mesh/conversion.py | 27 ++++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/conda_package/mpas_tools/mesh/conversion.py b/conda_package/mpas_tools/mesh/conversion.py index e7055f4cf..6d25a4149 100644 --- a/conda_package/mpas_tools/mesh/conversion.py +++ b/conda_package/mpas_tools/mesh/conversion.py @@ -1,5 +1,6 @@ import os -import xarray +import numpy as np +import xarray as xr from tempfile import TemporaryDirectory, mkdtemp import shutil @@ -52,7 +53,7 @@ def convert(dsIn, graphInfoFileName=None, logger=None, dir=None): check_call(['MpasMeshConverter.x', inFileName, outFileName], logger) - dsOut = xarray.open_dataset(outFileName) + dsOut = xr.open_dataset(outFileName) dsOut.load() if graphInfoFileName is not None: @@ -111,6 +112,7 @@ def cull(dsIn, dsMask=None, dsInverse=None, dsPreserve=None, dir = os.path.abspath(dir) tempdir = mkdtemp(dir=dir) inFileName = '{}/ds_in.nc'.format(tempdir) + dsIn = _masks_to_int(dsIn) write_netcdf(dsIn, inFileName) outFileName = '{}/ds_out.nc'.format(tempdir) @@ -120,6 +122,7 @@ def cull(dsIn, dsMask=None, dsInverse=None, dsPreserve=None, if not isinstance(dsMask, list): dsMask = [dsMask] for index, ds in enumerate(dsMask): + ds = _masks_to_int(ds) fileName = '{}/mask{}.nc'.format(tempdir, index) write_netcdf(ds, fileName) args.extend(['-m', fileName]) @@ -128,6 +131,7 @@ def cull(dsIn, dsMask=None, dsInverse=None, dsPreserve=None, if not isinstance(dsInverse, list): dsInverse = [dsInverse] for index, ds in enumerate(dsInverse): + ds = _masks_to_int(ds) fileName = '{}/inverse{}.nc'.format(tempdir, index) write_netcdf(ds, fileName) args.extend(['-i', fileName]) @@ -136,6 +140,7 @@ def cull(dsIn, dsMask=None, dsInverse=None, dsPreserve=None, if not isinstance(dsPreserve, list): dsPreserve = [dsPreserve] for index, ds in enumerate(dsPreserve): + ds = _masks_to_int(ds) fileName = '{}/preserve{}.nc'.format(tempdir, index) write_netcdf(ds, fileName) args.extend(['-p', fileName]) @@ -147,7 +152,7 @@ def cull(dsIn, dsMask=None, dsInverse=None, dsPreserve=None, check_call(args=args, logger=logger) - dsOut = xarray.open_dataset(outFileName) + dsOut = xr.open_dataset(outFileName) dsOut.load() if graphInfoFileName is not None: @@ -208,7 +213,21 @@ def mask(dsMesh, fcMask=None, logger=None, dir=None, cores=1): check_call(args=args, logger=logger) - dsOut = xarray.open_dataset(outFileName) + dsOut = xr.open_dataset(outFileName) dsOut.load() return dsOut + + +def _masks_to_int(dsIn): + """ Convert masks to int type required by the cell culler """ + var_list = ['regionCellMasks', 'transectCellMasks', 'cullCell', + 'cellSeedMask'] + dsOut = xr.Dataset(dsIn, attrs=dsIn.attrs) + for var in var_list: + if var in dsIn: + print(var) + dsOut[var] = dsIn[var].astype(np.int32) + print(dsOut[var].dtype) + + return dsOut