Note

This page was generated from Notebooks/flopy3_export.ipynb.
Interactive online version: Binder badge

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 exported

  • argue 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