Source code for pymt.printers.nc.read
from pymt.grids.grid_type import (
GridTypeRectilinear,
GridTypeStructured,
GridTypeUnstructured,
)
from .constants import open_netcdf
from .ugrid_read import (
NetcdfRectilinearFieldReader,
NetcdfStructuredFieldReader,
NetcdfUnstructuredFieldReader,
)
_NETCDF_MESH_TYPE = {
"rectilinear": GridTypeRectilinear(),
"structured": GridTypeStructured(),
"unstructured": GridTypeUnstructured(),
}
_NETCDF_READERS = {
"rectilinear": NetcdfRectilinearFieldReader,
"structured": NetcdfStructuredFieldReader,
"unstructured": NetcdfUnstructuredFieldReader,
}
[docs]def query_netcdf_mesh_type(path, fmt="NETCDF4"):
root = open_netcdf(path, mode="r", fmt=fmt)
try:
type_string = root.variables["mesh"].type
except AttributeError:
raise AttributeError("netcdf file is missing type attribute")
except KeyError:
raise AttributeError("netcdf file is missing mesh attribute")
finally:
root.close()
try:
mesh_type = _NETCDF_MESH_TYPE[type_string]
except KeyError:
raise TypeError("%s: mesh type not understood" % mesh_type)
return mesh_type
[docs]def field_fromfile(path, fmt="NETCDF4"):
mesh_type = query_netcdf_mesh_type(path)
try:
reader = _NETCDF_READERS[str(mesh_type)]
except KeyError:
raise TypeError("%s: no reader available for file" % mesh_type)
else:
nc_file = reader(path, fmt=fmt)
if len(nc_file.times) > 0:
return (nc_file.fields, nc_file.times)
else:
return nc_file.fields