# 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.

## [Unreleased]¶

### Fixed¶

• 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.Model.write() would write the timesteps multiplier in place of of the duration array.

• imod.util.to_ugrid2d() has been added to convert a (structured) xarray DataArray or Dataset to a quadrilateral UGRID dataset.

## [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).

### 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¶

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

## [0.7.1] - 2019-08-07¶

• "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¶

### 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

## [0.6.1] - 2019-04-17¶

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

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

• Notebook in examples folder for synthetic model example
• Support for nonequidistant IDF files, by adding dx and dy coordinates
• IPF support implicit itype