Changelog#

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[1.0.0rc1] - 2024-12-20#

Small post-release fix for installation instructions in documentation.

[1.0.0rc0] - 2024-12-20#

Added#

Fixed#

Changed#

[0.18.1] - 2024-11-20#

Added#

Fixed#

  • Relaxed validation for imod.mf6.StructuredDiscretization to also support cells with zero thickness where IDOMAIN = 0. Before, only cells with a zero thickness and IDOMAIN = -1 were supported, else the software threw a not all values comply with criterion: > bottom.

  • Fix bug where no ValidationError was thrown if there is an active RCH, DRN, GHB, or RIV cell where idomain = -1.

Changed#

[0.18.0] - 2024-11-11#

Fixed#

  • Multiple HorizontalFlowBarrier objects attached to imod.mf6.GroundwaterFlowModel are merged into a single horizontal flow barrier for MODFLOW 6.

  • Bug where error would be thrown when barriers in a HorizontalFlowBarrier would be snapped to the same cell edge. These are now summed.

  • Improve performance validation upon Package initialization

  • Improve performance writing HorizontalFlowBarrier objects

  • imod.mf6.open_cbc failing with flowja=False on budget output for DISV models if the model contained inactive cells.

  • imod.mf6.open_cbc now works for 2D and 1D models.

  • imod.prepare.fill() previously assigned to the result of an xarray .sel operation. This might not work for dask backed data and has been addressed.

  • Added imod.mf6.open_dvs() to read dependent variable output files like the water content file of imod.mf6.UnsaturatedZoneFlow.

  • imod.prj.open_projectfile_data is now able to also read IPF data for sprinkling wells in the CAP package.

  • Fix that caused iMOD Python to break upon import with numpy >=1.23, <2.0 .

  • ValidationError message now contains a suggestion to use the cleanup method, if available in the erroneous package.

  • Bug where error was thrown when imod.mf6.NodePropertyFlow was assigned to imod.mf6.GroundwaterFlowModel with key different from "npf" upon writing, along with well or horizontal flow barrier packages.

Changed#

Added#

Removed#

[0.17.2] - 2024-09-17#

Fixed#

Added#

Changed#

Fixed#

[0.17.1] - 2024-05-16#

Added#

  • Added function imod.util.spatial.gdal_compliant_grid() to make spatial coordinates of a NetCDF interpretable for GDAL (and so QGIS).

  • Added crs argument to imod.util.spatial.mdal_compliant_ugrid2d(), imod.mf6.Simulation.dump(), imod.mf6.GroundwaterFlowModel.dump(), imod.mf6.GroundwaterTransportModel.dump(), to add a coordinate reference system to dumped files, to ease loading them in QGIS.

Changed#

Fixed#

  • Fix missing API docs for dump and write methods.

[0.17.0] - 2024-05-13#

Added#

Fixed#

  • No ValidationError thrown anymore in imod.mf6.River when bottom_elevation equals bottom in the model discretization.

  • When wells outside of the domain are added, an exception is raised with an error message stating a well is outside of the domain.

  • When importing data from a .prj file, the multipliers and additions specified for ipf and idf files are now applied

  • Fix bug where y-coords were flipped in imod.msw.MeteoMapping

Changed#

  • Replaced csv_output by outer_csvfile and inner_csvfile in imod.mf6.Solution to match newer MODFLOW 6 releases.

  • Changed no_ptc from a bool to an option string in imod.mf6.Solution.

  • Removed constructor arguments source and target from imod.mf6.utilities.regrid.RegridderWeightsCache, as they were not used.

  • imod.mf6.open_cbc() now returns arrays which contain np.nan for cells where budget variables are not defined. Based on new budget output a disquisition between active cells but zero flow and inactive cells can be made.

  • imod.mf6.open_cbc() now returns package type in return budget names. New format is “package type”-“optional package variable”_”package name”. E.g. a River package named primary-sys will get a budget name riv_primary-sys. An UZF package with name uzf-sys1 will get a budget name uzf-gwrch_uzf-sys1 for the groundwater recharge budget from the UZF-CBC.

[0.16.0] - 2024-03-29#

Added#

Changed#

Fixed#

  • Incorrect validation error data values found at nodata values of idomain for boundary condition packages with a scalar coordinate not set as dimension.

  • Fix issue where imod.idf.open_subdomains() and imod.mf6.Modflow6Simulation.open_head() (for split simulations) would return arrays with incorrect dx and dy coordinates for equidistant data.

  • Fix issue where imod.idf.open_subdomains() returned a flipped dy coordinate for nonequidistant data.

  • Made imod.util.round_extent() available again, as it was moved without notice. Function now throws a DeprecationWarning to use imod.prepare.spatial.round_extent() instead.

  • :meth’imod.mf6.Modflow6Simulation.write failed after splitting the simulation. This has been fixed.

  • modflow options like “print flow”, “save flow”, and “print input” can now be set on imod.mf6.Well

  • when regridding a imod.mf6.Modflow6Simulation, imod.mf6.GroundwaterFlowModel, imod.mf6.GroundwaterTransportModel or a imod.mf6.package, regridding weights are now cached and can be re-used over the different objects that are regridded. This improves performance considerably in most use cases: when regridding is applied over the same grid cells with the same regridder type, but with different values/methods, multiple times.

[0.15.3] - 2024-02-22#

Fixed#

Added#

  • Developer environment: Added pixi environment interactive to interactively run code. Can be useful to plot data.

  • imod.mf6.ApiPackage was added. It can be added to both flow and transport models, and its presence allows users to interact with libMF6.dll through its API.

  • Developer environment: Empty python 3.10, 3.11, 3.12 environments where pip install and import imod can be tested.

[0.15.2] - 2024-02-16#

Fixed#

  • iMOD Python now supports versions of pandas >= 2

  • Fixed bugs with clipping imod.mf6.HorizontalFlowBarrier for structured grids

  • Packages and boundary conditions in the imod.mf6 module will now throw an error upon initialization if coordinate labels are inconsistent amongst variables

  • Improved performance for merging structured multimodel Modflow 6 output

  • Bug where imod.formats.idf.open_subdomains() did not properly support custom patterns

  • Added missing validation for concentration for imod.mf6.Drainage and imod.mf6.EvapoTranspiration package

  • Added validation imod.mf6.Well package, no np.nan values are allowed

  • Fix support for coupling a GroundwaterFlowModel and Transport Model i.c.w. the 6.4.3 release of MODFLOW. Using an older version of iMOD Python with this version of MODFLOW will result in an error.

Changed#

  • We moved to using pixi to create development environments. This replaces the imod-environment.yml conda environment. We advice doing development installations with pixi from now on. See the documentation. This does not affect users who installed with pip install imod, mamba install imod or conda install imod.

  • Changed build system from setuptools to hatchling. Users who did a development install are adviced to run pip uninstall imod and pip install -e . again. This does not affect users who installed with pip install imod, mamba install imod or conda install imod.

  • Decreased lower limit of MetaSWAP validation for x and y limits in the IdfMapping from 0 to -9999999.0.

[0.15.1] - 2023-12-22#

Fixed#

  • Made specific_yield optional argument in imod.mf6.SpecificStorage, imod.mf6.StorageCoefficient.

  • Fixed bug where simulations with imod.mf6.Well were not partitioned into multiple models.

  • Fixed erroneous default value for the out_of_bounds in imod.select.points.point_values()

  • Fixed bug where imod.mf6.Well could not be assigned to the first cell of an unstructured grid.

  • HorizontalFlowBarrier package now dropped if completely outside partition in a split model.

  • HorizontalFlowBarrier package clipped with clip_by_grid based on active cells, consistent with how other packages are treated by this function. This affects the imod.mf6.HorizontalFlowBarrier.regrid_like() and imod.mf6.Modflow6Simulation.split() methods.

Changed#

  • All the references to GitLab have been replaced by GitHub references as part of the GitHub migration.

Added#

  • Added comment in Modflow6 exchanges file (GWFGWF) denoting column header.

  • Added Python 3.11 support.

  • The GWF-GWF exchange options are derived from user created packages (NPF, OC) and set automatically.

  • Added the simulation_start_time and time_unit arguments. To the Modflow6Simulation.open_ methods, and imod.mf6.out.open_ functions. This converts the "time" coordinate to datetimes.

  • added imod.mf6.Modflow6Simulation.mask_all_models() to apply a mask to all models under a simulation, provided the simulation is not split and the models use the same discretization.

Changed#

[0.15.0] - 2023-11-25#

Fixed#

  • The Newton option for a imod.mf6.GroundwaterFlowModel was being ignored. This has been corrected.

  • The Contextily packages started throwing errors. This was caused because the default tile provider being used was Stamen. However Stamen is no longer free which caused Contextily to fail. The default tile provider has been changed to OpenStreetMap to resolve this issue.

  • imod.mf6.open_cbc() now reads saved cell saturations and specific discharges.

  • imod.mf6.open_cbc() failed to read unstructured budgets stored following IMETH1, most importantly the storage fluxes.

  • Fixed support of Python 3.11 by dropping the obsolete qgs module.

  • Bug in imod.mf6.SourceSinkMixing where, in case of multiple active boundary conditions with assigned concentrations, it would write a .ssm file with all sources/sinks on one single row.

  • Fixed bug where TypeError was thrown upond calling imod.mf6.HorizontalFlowBarrier.regrid_like() and imod.mf6.HorizontalFlowBarrier.mask().

  • Fixed bug where calling imod.mf6.Well.clip_box() over only the time dimension would remove the index coordinate.

  • Validation errors are rendered properly when writing a simulation object or regridding a model object.

Changed#

Added#

Removed#

  • Tox has been removed from the project.

  • Dropped support for writing .qgs files directly for QGIS, as this was hard to maintain and rarely used. To export your model to QGIS readable files, call the dump method imod.mf6.Modflow6Simulation with mdal_compliant=True. This writes UGRID NetCDFs which can read as meshes in QGIS.

  • Removed declxml from repository.

[0.14.1] - 2023-09-07#

Changed#

Fixed#

  • imod.mf6.HorizontalFlowBarrier would write to a binary file by default. However, the current version of Modflow 6 does not support this. Therefore, this class now always writes to text file.

[0.14.0] - 2023-09-06#

Changed#

  • imod.mf6.HorizontalFlowBarrier is specified by providing a geopandas GeoDataFrame

Added#

  • imod.mf6.Modflow6Simulation.regrid_like() to regrid a Modflow6 simulation to a new grid (structured or unstructured), using xugrid’s regridding functionality. Variables are regridded with pre-selected methods. The regridding functionality is useful for a variety of applications, for example to test the effect of different grid sizes, to add detail to a simulation (by refining the grid) or to speed up a simulation (by coarsening the grid) to name a few

  • imod.mf6.Package.regrid_like() to regrid packages. The user can specify their own custom regridder types and methods for variables.

  • imod.mf6.Modflow6Simulation.clip_box() got an extra argument states_for_boundary, which takes a dictionary with modelname as key and griddata as value. This data is specified as fixed state on the model boundary. At present only imod.mf6.GroundwaterFlowModel is supported, grid data is specified as a imod.mf6.ConstantHead at the model boundary.

  • imod.mf6.Well, a grid-agnostic well package, where wells can be specified based on their x,y coordinates and filter top and bottom.

[0.13.2] - 2023-07-26#

Changed#

  • imod.rasterio.save() will now write ESRII ASCII rasters, even if rasterio is not installed. A fallback function has been added specifically for ASCII rasters.

Fixed#

  • Geopandas and rasterio were imported at the top of a module in some places. This has been fixed so that both are not optional dependencies when installing via pip (installing via conda or mamba will always pull all dependencies and supports full functionality).

  • imod.mf6.Modflow6Simulation._validate() now print all validation errors for all models and packages in one message.

  • The gen file reader can now handle feature id’s that contain commas and spaces

  • imod.mf6.EvapoTranspiration now supports segments, by adding a segment dimension to the proportion_depth and proportion_rate variables.

  • imod.mf6.EvapoTranspiration template for .evt file now properly formats nseg option.

  • Fixed bug in imod.wq.Well preventing saving wells without a time dimension, but with a layer dimension.

  • imod.mf6.DiscretizationVertices._validate threw KeyError for "bottom" when validating the package separately.

Added#

  • imod.select.grid.active_grid_boundary_xy() & imod.select.grid.grid_boundary_xy() are added to find grid boundaries.

[0.13.1] - 2023-05-05#

Added#

Fixed#

[0.13.0] - 2023-05-02#

Added#

  • imod.mf6.OutputControl now takes parameters head_file, concentration_file, and budget_file to specify where to store MODFLOW6 output files.

  • imod.util.spatial.from_mdal_compliant_ugrid2d() to “restack” the variables that have have been “unstacked” in imod.util.spatial.mdal_compliant_ugrid2d().

  • Added support for the Modflow6 Lake package

  • imod.select.points_in_bounds(), imod.select.points_indices(), imod.select.points_values() now support unstructured grids.

  • Added support for the Modflow 6 Lake package: imod.mf6.Lake, imod.mf6.LakeData, imod.mf6.OutletManning, OutletSpecified, OutletWeir. See the examples for an application of the Lake package.

  • imod.mf6.simulation.Modflow6Simulation.dump() now supports dumping to MDAL compliant ugrids. These can be used to view and explore Modlfow 6 simulations in QGIS.

Fixed#

  • imod.wq.bas.BasicFlow.thickness() returns a DataArray with the correct dimension order again. This confusingly resulted in an error when writing the imod.wq.btn.BasicTransport package.

  • Fixed bug in imod.mf6.dis.StructuredDiscretization and imod.mf6.dis.VerticesDiscretization where inactive bottom above active cell was incorrectly raised.

[0.12.0] - 2023-03-17#

Added#

  • imod.prj.read_projectfile() to read the contents of a project file into a Python dictionary.

  • imod.prj.open_projectfile_data() to read/open the data that is pointed to in a project file.

  • imod.gen.read_ascii() to read the geometry stored in ASCII text .gen files.

  • imod.mf6.hfb.HorizontalFlowBarrier to support Modflow6’s HFB package, works well with xugrid.snap_to_grid function.

  • imod.mf6.simulation.Modflow6Simulation.dump() to dump a simulation to a toml file which acts as a definition file, pointing to packages written as netcdf files. This can be used to intermediately store Modflow6 simulations.

Fixed#

  • imod.evaluate.budget.flow_velocity() now properly computes velocity by dividing by the porosity. Before, this function computed the Darcian velocity.

Changed#

  • imod.ipf.save() will error on duplicate IDs for associated files if a "layer" column is present. As a dataframe is automatically broken down into a single IPF per layer, associated files for the first layer would be overwritten by the second, and so forth.

  • imod.wq.Well.save() will now write time varying data to associated files for extration rate and concentration.

  • Choosing method="geometric_mean" in the Regridder will now result in NaN values in the regridded result if a geometric mean is computed over negative values; in general, a geometric mean should only be computed over physical quantities with a “true zero” (e.g. conductivity, but not elevation).

[0.11.6] - 2023-02-01#

Added#

  • Added an extra optional argument in imod.couplers.metamod.MetaMod.write() named modflow6_write_kwargs, which can be used to provide keyword arguments to the writing of the Modflow 6 Simulation.

Fixed#

  • imod.mf6.out.disv.read_grb() Remove repeated construction of UgridDataArray for top

[0.11.5] - 2022-12-15#

Fixed#

  • imod.mf6.Modflow6Simulation.write() with binary=False no longer results in invalid MODFLOW6 input for 2D grid data, such as DIS top.

  • imod.flow.ImodflowModel.write() no longer writes incorrect project files for non-grid values with a time and layer dimension.

  • imod.evaluate.interpolate_value_boundaries(): Fix edge case when successive values in z direction are exactly equal to the boundary value.

Changed#

  • Removed meshzoo dependency.

  • Minor changes to imod.gen.gen backend, to support Shapely 2.0 , Shapely version above equal v1.8 is now required.

Added#

  • imod.flow.ImodflowModel.write() now supports writing a config_run.ini to convert the projectfile to a runfile or modflow 6 namfile with iMOD5.

  • Added validation of Modflow6 Flow and Transport models. Incorrect model input will now throw a ValidationError. To turn off the validation, set validate=False upon package initialization and/or when calling imod.mf6.Modflow6Simulation.write().

[0.11.4] - 2022-09-05#

Fixed#

  • imod.mf6.GroundwaterFlowModel.write() will no longer error when a 3D DataArray with a single layer is written. It will now accept both 2D and 3D arrays with a single layer coordinate.

  • Hotfixes for imod.wq.model.SeawatModel.clip(), until this merge request is fulfilled.

  • imod.flow.ImodflowModel.write() will set the timestring in the projectfile to steady-state for BoundaryConditions without a time dimension.

  • Added imod.flow.OutputControl as this was still missing.

  • imod.ipf.read() will no longer error when an associated files with 0 rows is read.

  • imod.evaluate.calculate_gxg() now correctly uses (March 14, March 28, April 14) to calculate GVG rather than (March 28, April 14, April 28).

  • imod.mf6.out.open_cbc() now correctly loads boundary fluxes.

  • imod.prepare.LayerRegridder.regrid() will now correctly skip values if top_source or bottom_source are NaN.

  • imod.gen.write() no longer errors on dataframes with empty columns.

  • imod.mf6.BoundaryCondition.set_repeat_stress() reinstated. This is a temporary measure, it gives a deprecation warning.

Changed#

  • Deprecate the current documentation URL: https://imod.xyz. For the coming months, redirection is automatic to: https://deltares.gitlab.io/imod/imod-python/.

  • imod.ipf.save() will now store associated files in separate directories named layer1, layer2, etc. The ID in the main IPF file is updated accordingly. Previously, if IDs were shared between different layers, the associated files would be overwritten as the IDs would result in the same file name being used over and over.

  • imod.flow.ImodflowModel.time_discretization(), imod.wq.SeawatModel.time_discretization(), imod.mf6.Modflow6Simulation.time_discretization(), are renamed to: imod.flow.ImodflowModel.create_time_discretization(), imod.wq.SeawatModel.create_time_discretization(), imod.mf6.Modflow6Simulation.create_time_discretization(),

  • Moved tests inside imod directory, added an entry point for pytest fixtures. Running the tests now requires an editable install, and also existing installations have to be reinstalled to run the tests.

  • The imod.mf6 model packages now all run type checks on input. This is a breaking change for scripts which provide input with an incorrect dtype.

  • imod.mf6.Solution now requires a model_names argument to specify which models should be solved in a single numerical solution. This is required to simulate groundwater flow and transport as they should be in separate solutions.

  • When writing MODFLOW6 input option blocks, a NaN value is now recognized as an alternative to None (and the entry will not be included in the options block).

Added#

[0.11.1] - 2021-12-23#

Fixed#

  • contextily, geopandas, pyvista, rasterio, and shapely are now fully optional dependencies. Import errors are only raised when accessing functionality that requires their use.

  • Include declxml as imod.declxml (should be internal use only!): declxml is no longer maintained on the official repository: gatkin/declxml. Furthermore, it has no conda feedstock, which makes distribution via conda difficult.

[0.11.0] - 2021-12-21#

Fixed#

  • imod.ipf.read() accepts list of file names.

  • imod.mf6.open_hds() did not read the appropriate bytes from the heads file, apart for the first timestep. It will now read the right records.

  • Use the appropriate array for modflow6 timestep duration: the imod.mf6.GroundwaterFlowModel.write() would write the timesteps multiplier in place of the duration array.

  • imod.mf6.GroundwaterFlowModel.write() will now respect the layer coordinate of DataArrays that had multiple coordinates, but were discontinuous from 1; e.g. layers [1, 3, 5] would’ve been transformed to [1, 2, 3] incorrectly.

  • imod.mf6.Modflow6Simulation.write() will no longer change working directory while writing model input – this could lead to errors when multiple processes are writing models in parallel.

  • imod.prepare.laplace_interpolate() will no longer ZeroDivisionError when given a value for ibound.

Added#

Changed#

  • Documentation overhaul: different theme, add sample data for examples, add Frequently Asked Questions (FAQ) section, restructure API Reference. Examples now ru

  • Datetime columns in IPF associated files (via imod.ipf.write_assoc()) will not be placed within quotes, as this can break certain iMOD batch functions.

  • imod.mf6.Well has been renamed into imod.mf6.WellDisStructured.

  • imod.mf6.GroundwaterFlowModel.write() will now write package names into the simulation namefile.

  • imod.mf6.open_cbc() will now return a dictionary with keys flow-front-face, flow-lower-face, flow-right-face for the face flows, rather than front-face-flow for better consistency.

  • Switched to composition from inheritance for all model packages: all model packages now contain an internal (xarray) Dataset, rather than inheriting from the xarray Dataset.

  • imod.mf6.SpecificStorage or imod.mf6.StorageCoefficient is now mandatory for every MODFLOW6 model to avoid accidental steady-state configuration.

Removed#

  • Module imod.tec for reading Tecplot files has been removed.

[0.10.1] - 2020-10-19#

Changed#

  • imod.wq.SeawatModel.write() now generates iMOD-WQ runfiles with more intelligent use of the “macro tokens”. : is used exclusively for ranges; $ is used to signify all layers. (This makes runfiles shorter, speeding up parsing, which takes a significant amount of time in the runfile to namefile conversion of iMOD-WQ.)

  • Datetime formats are inferred based on length of the time string according to %Y%m%d%H%M%S; supported lengths 4 (year only) to 14 (full format string).

Added#

Fixed#

  • IO methods for IDF files will now correctly identify double precision IDFs. The correct record length identifier is 2295 rather than 2296 (2296 was a typo in the iMOD manual).

  • imod.wq.SeawatModel.write() will now write the correct path for recharge package concentration given in IDF files. It did not prepend the name of the package correctly (resulting in paths like concentration_l1.idf instead of rch/concentration_l1.idf).

  • imod.idf.save() will simplify constant cellsize arrays to a scalar value – this greatly speeds up drawing in the iMOD-GUI.

[0.10.0] - 2020-05-23#

Changed#

  • imod.wq.SeawatModel.write() no longer automatically appends the model name to the directory where the input is written. Instead, it simply writes to the directory as specified.

  • imod.select.points_set_values() returns a new DataArray rather than mutating the input da.

  • imod.select.points_values() returns a DataArray with an index taken from the data of the first provided dimensions if it is a pandas.Series.

  • imod.wq.SeawatModel.write() now writes a runfile with start_hour and start_minute (this results in output IDFs with datetime format "%Y%m%d%H%M").

Added#

  • from_file() constructors have been added to all imod.wq.Package. This allows loading directly package from a netCDF file (or any file supported by xarray.open_dataset), or a path to a Zarr directory with suffix “.zarr” or “.zip”.

  • This can be combined with the cache argument in from_file() to enable caching of answers to avoid repeated computation during imod.wq.SeawatModel.write(); it works by checking whether input and output files have changed.

  • The resultdir_is_workspace argument has been added to imod.wq.SeawatModel.write(). iMOD-wq writes a number of files (e.g. list file) in the directory where the runfile is located. This results in mixing of input and output. By setting it True, all model output is written in the results directory.

  • imod.visualize.imshow_topview() has been added to visualize a complete DataArray with atleast dimensions x and y; it dumps PNGs into a specified directory.

  • Some support for 3D visualization has been added. imod.visualize.grid_3d() and imod.visualize.line_3d() have been added to produce pyvista meshes from xarray.DataArray’s and shapely polygons, respectively. imod.visualize.GridAnimation3D and imod.visualize.StaticGridAnimation3D have been added to setup 3D animations of DataArrays with transient data.

  • Support for out of core computation by imod.prepare.Regridder if source is chunked.

  • imod.ipf.read() now reports the problematic file if reading errors occur.

  • imod.prepare.polygonize() added to polygonize DataArrays to GeoDataFrames.

  • Added more support for multiple species imod-wq models, specifically: scalar concentration for boundary condition packages and well IPFs.

Fixed#

  • imod.prepare.Regridder() detects if the like DataArray is a subset along a dimension, in which case the dimension is not regridded.

  • imod.prepare.Regridder() now slices the source array accurately before regridding, taking cell boundaries into account rather than only cell midpoints.

  • density is no longer an optional argument in imod.wq.GeneralHeadboundary and imod.wq.River. The reason is that iMOD-WQ fully removes (!) these packages if density is not present.

  • imod.idf.save() and imod.rasterio.save() will now also save DataArrays in which a coordinate other than x or y is descending.

  • imod.visualize.plot_map() enforces decreasing y, which ensures maps are not plotted upside down.

  • imod.util.spatial.coord_reference() now returns a scalar cellsize if coordinate is equidistant.

  • imod.prepare.Regridder.regrid() returns cellsizes as scalar when coordinates are equidistant.

  • Raise proper ValueError in imod.prepare.Regridder.regrid() consistenly when the number of dimensions to regrid does not match the regridder dimensions.

  • When writing DataArrays that have size 1 in dimension x or y: raise error if cellsize (dx or dy) is not specified; and actually use dy or dx when size is 1.

[0.9.0] - 2020-01-19#

Added#

  • IDF files representing data of arbitrary dimensionality can be opened and saved. This enables reading and writing files with more dimensions than just x, y, layer, and time.

  • Added multi-species support for (imod.wq)

  • GDAL rasters representing N-dimensional data can be opened and saved similar to (imod.idf) in (imod.rasterio)

  • Writing GDAL rasters using imod.rasterio.save() and (imod.rasterio.write()) auto-detects GDAL driver based on file extension

  • 64-bit IDF files can be opened imod.idf.open()

  • 64-bit IDF files can be written using imod.idf.save() and (imod.idf.write()) using keyword dtype=np.float64

  • sel and isel methods to SeawatModel to support taking out a subdomain

  • Docstrings for the Modflow 6 classes in imod.mf6

  • imod.select.upper_active_layer() function to get the upper active layer from ibound xr.DataArray

Changed#

  • imod.idf.read() is deprecated, use imod.idf.open instead

  • imod.rasterio.read() is deprecated, use imod.rasterio.open instead

Fixed#

[0.8.0] - 2019-10-14#

Added#

  • Laplace grid interpolation imod.prepare.laplace_interpolate()

  • Experimental Modflow 6 structured model write support imod.mf6

  • More supported visualizations imod.visualize

  • More extensive reading and writing of GDAL raster in imod.rasterio

Changed#

[0.7.1] - 2019-08-07#

Added#

  • "multilinear" has been added as a regridding option to imod.prepare.Regridder to do linear interpolation up to three dimensions.

  • Boundary condition packages in imod.wq support a method called add_timemap to do cyclical boundary conditions, such as summer and winter stages.

Fixed#

  • imod.idf.save no longer fails on a single IDF when it is a voxel IDF (when it has top and bottom data).

  • imod.prepare.celltable now succesfully does parallel chunkwise operations, rather than raising an error.

  • imod.Regridder’s regrid method now succesfully returns source if all dimensions already have the right cell sizes, rather than raising an error.

  • imod.idf.open_subdomains is much faster now at merging different subdomain IDFs of a parallel modflow simulation.

  • imod.idf.save no longer suffers from extremely slow execution when the DataArray to save is chunked (it got extremely slow in some cases).

  • Package checks in imod.wq.SeawatModel succesfully reduces over dimensions.

  • Fix last case in imod.prepare.reproject where it did not allocate a new array yet, but returned like instead of the reprojected result.

[0.7.0] - 2019-07-23#

Added#

  • imod.wq module to create iMODFLOW Water Quality models

  • conda-forge recipe to install imod (conda-forge/imod-feedstock)

  • significantly extended documentation and examples

  • imod.prepare module with many data mangling functions

  • imod.select module for extracting data along cross sections or at points

  • imod.visualize module added to visualize results

  • imod.idf.open_subdomains() function to open and merge the IDF results of a parallelized run

  • imod.ipf.read() now infers delimeters for the headers and the body

  • imod.ipf.read() can now deal with heterogeneous delimiters between multiple IPF files, and between the headers and body in a single file

Changed#

  • Namespaces: lift many functions one level, such that you can use e.g. the function imod.prepare.reproject instead of imod.prepare.reproject.reproject

Removed#

  • All that was deprecated in v0.6.0

Deprecated#

  • imod.seawat_write() is deprecated, use the write method of imod.wq.SeawatModel instead

  • imod.run.seawat_get_runfile() is deprecated, use imod.wq instead

  • imod.run.seawat_write_runfile() is deprecated, use imod.wq instead

[0.6.1] - 2019-04-17#

Added#

  • Support nonequidistant models in runfile

Fixed#

  • Time conversion in runfile now also accepts cftime objects

[0.6.0] - 2019-03-15#

The primary change is that a number of functions have been renamed to better communicate what they do.

The load function name was not appropriate for IDFs, since the IDFs are not loaded into memory. Rather, they are opened and the headers are read; the data is only loaded when needed, in accordance with xarray’s design; compare for example xarray.open_dataset. The function has been renamed to open.

Similarly, load for IPFs has been deprecated. imod.ipf.read now reads both single and multiple IPF files into a single pandas.DataFrame.

Removed#

  • imod.idf.setnodataheader

Deprecated#

  • Opening IDFs with imod.idf.load, use imod.idf.open instead

  • Opening a set of IDFs with imod.idf.loadset, use imod.idf.open_dataset instead

  • Reading IPFs with imod.ipf.load, use imod.ipf.read

  • Reading IDF data into a dask array with imod.idf.dask, use imod.idf._dask instead

  • Reading an iMOD-seawat .tec file, use imod.tec.read instead.

Changed#

  • Use np.datetime64 when dates are within time bounds, use cftime.DatetimeProlepticGregorian when they are not (matches xarray defaults)

  • assert is no longer used to catch faulty input arguments, appropriate exceptions are raised instead

Fixed#

  • idf.open: sorts both paths and headers consistently so data does not end up mixed up in the DataArray

  • idf.open: Return an xarray.CFTimeIndex rather than an array of cftime.DatimeProlepticGregorian objects

  • idf.save properly forwards nodata argument to write

  • idf.write coerces coordinates to floats before writing

  • ipf.read: Significant performance increase for reading IPF timeseries by specifying the datetime format

  • ipf.write no longer writes ,, for missing data (which iMOD does not accept)

[0.5.0] - 2019-02-26#

Removed#

  • Reading IDFs with the chunks option

Deprecated#

  • Reading IDFs with the memmap option

  • imod.idf.dataarray, use imod.idf.load instead

Changed#

  • Reading IDFs gives delayed objects, which are only read on demand by dask

  • IDF: instead of res and transform attributes, use dx and dy coordinates (0D or 1D)

  • Use cftime.DatetimeProlepticGregorian to support time instead of np.datetime64, allowing longer timespans

  • Repository moved from https://gitlab.com/deltares/ to https://gitlab.com/deltares/imod/

Added#

  • Notebook in examples folder for synthetic model example

  • Support for nonequidistant IDF files, by adding dx and dy coordinates

Fixed#

  • IPF support implicit itype