Note
Demo of netCDF and shapefile export capabilities within the flopy export module.
[1]:
import os
import sys
import datetime
from tempfile import TemporaryDirectory
# run installed version of flopy or add local path
try:
import flopy
except:
fpth = os.path.abspath(os.path.join("..", ".."))
sys.path.append(fpth)
import flopy
print(sys.version)
print("flopy version: {}".format(flopy.__version__))
3.10.10 | packaged by conda-forge | (main, Mar 24 2023, 20:08:06) [GCC 11.3.0]
flopy version: 3.3.7
Load our old friend…the Freyberg model
[2]:
nam_file = "freyberg.nam"
model_ws = os.path.join("..", "..", "examples", "data", "freyberg_multilayer_transient")
ml = flopy.modflow.Modflow.load(nam_file, model_ws=model_ws, check=False)
We can see the Modelgrid
instance has generic entries, as does start_datetime
[3]:
ml.modelgrid
[3]:
xll:622241.1904510253; yll:3343617.741737109; rotation:15.0; crs:EPSG:32614; units:meters; lenuni:2
[4]:
ml.modeltime.start_datetime
[4]:
'1/1/2015'
Setting the attributes of the ml.modelgrid
is easy:
[5]:
ml.modelgrid.set_coord_info(
xoff=123456.7, yoff=765432.1, angrot=15.0, crs=3070
)
ml.dis.start_datetime = "7/4/1776"
[6]:
ml.modeltime.start_datetime
[6]:
'7/4/1776'
Some netCDF export capabilities:
Export the whole model (inputs and outputs)
[7]:
# temporary directory
temp_dir = TemporaryDirectory()
pth = temp_dir.name
[8]:
fnc = ml.export(os.path.join(pth, ml.name + ".in.nc"))
hds = flopy.utils.HeadFile(os.path.join(model_ws, "freyberg.hds"))
flopy.export.utils.output_helper(
os.path.join(pth, ml.name + ".out.nc"), ml, {"hds": hds}
)
initialize_geometry::
model crs: EPSG:3070
initialize_geometry::nc_crs = EPSG:4326
transforming coordinates using = unavailable until proj_trans is called
initialize_geometry::
model crs: EPSG:3070
initialize_geometry::nc_crs = EPSG:4326
transforming coordinates using = unavailable until proj_trans is called
[8]:
<flopy.export.netcdf.NetCdf at 0x7fd1362e2b90>
export a single array to netcdf or shapefile
[9]:
# export a 2d array
ml.dis.top.export(os.path.join(pth, "top.nc"))
ml.dis.top.export(os.path.join(pth, "top.shp"))
initialize_geometry::
model crs: EPSG:3070
initialize_geometry::nc_crs = EPSG:4326
transforming coordinates using = unavailable until proj_trans is called
sparse export of stress period data for a boundary condition package
excludes cells that aren’t in the package (aren’t in
package.stress_period_data
)by default, stress periods with duplicate parameter values (e.g., stage, conductance, etc.) are omitted (
squeeze=True
); only stress periods with different values are exportedargue
squeeze=False
to export all stress periods
[10]:
ml.drn.stress_period_data.export(os.path.join(pth, "drn.shp"), sparse=True)
wrote ../../../home/runner/work/flopy/flopy/.docs/Notebooks
Export a 3d array
[11]:
# export a 3d array
ml.upw.hk.export(os.path.join(pth, "hk.nc"))
ml.upw.hk.export(os.path.join(pth, "hk.shp"))
initialize_geometry::
model crs: EPSG:3070
initialize_geometry::nc_crs = EPSG:4326
transforming coordinates using = unavailable until proj_trans is called
Export a number of things to the same netCDF file
[12]:
# export lots of things to the same nc file
fnc = ml.dis.botm.export(os.path.join(pth, "test.nc"))
ml.upw.hk.export(fnc)
ml.dis.top.export(fnc)
# export transient 2d
ml.rch.rech.export(fnc)
initialize_geometry::
model crs: EPSG:3070
initialize_geometry::nc_crs = EPSG:4326
transforming coordinates using = unavailable until proj_trans is called
[12]:
<flopy.export.netcdf.NetCdf at 0x7fd1340a8a90>
Export whole packages to a netCDF file
[13]:
# export mflist
fnc = ml.wel.export(os.path.join(pth, "packages.nc"))
ml.upw.export(fnc)
initialize_geometry::
model crs: EPSG:3070
initialize_geometry::nc_crs = EPSG:4326
transforming coordinates using = unavailable until proj_trans is called
[13]:
<flopy.export.netcdf.NetCdf at 0x7fd1340a8c70>
Export the whole model to a netCDF
[14]:
fnc = ml.export(os.path.join(pth, "model.nc"))
initialize_geometry::
model crs: EPSG:3070
initialize_geometry::nc_crs = EPSG:4326
transforming coordinates using = unavailable until proj_trans is called
FloPy has utilities to export model outputs to a netcdf file. Valid output types for export are MODFLOW binary head files, formatted head files, cell budget files, seawat concentration files, and zonebudget output.
Let’s use output from the Freyberg model as an example of these functions
[15]:
# load binary head and cell budget files
fhead = os.path.join(model_ws, "freyberg.hds")
fcbc = os.path.join(model_ws, "freyberg.cbc")
hds = flopy.utils.HeadFile(fhead)
cbc = flopy.utils.CellBudgetFile(fcbc)
export_dict = {"hds": hds, "cbc": cbc}
# export head and cell budget outputs to netcdf
fnc = flopy.export.utils.output_helper(
os.path.join(pth, "output.nc"), ml, export_dict
)
initialize_geometry::
model crs: EPSG:3070
initialize_geometry::nc_crs = EPSG:4326
transforming coordinates using = unavailable until proj_trans is called
error getting data for cell_by_cell_flowstorage at time 1.0:list index out of range
error getting data for cell_by_cell_flowstorage at time 1097.0:list index out of range
[16]:
try:
# ignore PermissionError on Windows
temp_dir.cleanup()
except:
pass