Release notes#


Breaking changes#

  • All fields of Composition are now private (!273)

  • Input.source is private, Input.get_source() becomes property Input.source, Input.set_source becomes a getter (!273)

  • Output.targets is private, Output.get_targets() becomes property Output.targets (!273)

  • Composition metadata was restructured to hold components and adapters in separate sub-dictionaries (!274)


  • Components and adapters automatically provide default metadata that can be extended by implementations (!274, !276)

  • Grid class now have attributes providing connectivity information for the contained cells (!275)

    • cells_connectivity: connectivity array as used by ESMF and VTK

    • cells_definition: cell definition as used by PyVista and legacy VTK

    • cells_offset: location of the start of each cell in cells_connectivity

  • added convenience functions and constants to grid_tools (!275)

    • get_cells_matrix: convert cells_connectivity or cells_definition back to the default cells matrix used in the Grid class (can be used to convert VTK-grids into FINAM-grids)

    • INV_VTK_TYPE_MAP: inverse mapping to VTK_TYPE_MAP - FINAM cell type to VTK cell type

    • VTK_CELL_DIM: parametric dimension for each VTK cell type

  • Grid class now reusable when having different data locations and better grid type casting (!278)

    • added copy method to grids with optional argument deep (False by default) to create a copy of a grid

    • added setter for data_location in order to set a new data location (e.g. after copying a grid)

    • added class attribute valid_locations in order to check the set data location (esri-grid only supports cells, unstructured-points only support points)

    • added missing casting methods to convert esri to uniform and uniform to rectilinear (when you want to use point data on an esri-grid, you can cast it to uniform first)

    • added axes_attributes also to unstructured grids

  • Grid method compatible_with now has a check_location argument to optionally check data location (!280)


  • Minor fixes in documentation examples and links (!272)

  • Adds a book section on composition, component and adapter metadata (!274)


Bug fixes#

  • Fix unquantified masked arrays loosing mask in (#115, !270)



  • Components and adapters can provide a dictionary of meta data (!259)

  • Class Composition hat a property metadata that collects and returns the meta data from all components and adapters (!259)

  • Automatic conversion between compatible grids (!255)

  • Adds methods to_canonical, from_canonical and get_transform_to to grid classes (!255)

  • Adds support for masked grids using (!258, !260)

  • Adds convenience functions for dealing with masked arrays in (!260): is_masked_array, has_masked_values, filled, to_compressed, from_compressed, check_data_covers_domain


  • Adds a book chapter on wrapping existing models for FINAM (!256)

  • Adds a book section on masked data (!262)

Bug fixes#

  • No more logging of expected FinamNoDataError in inputs during the connect phase (!257)


  • FINAM is now available on Conda via conda-forge


New scheduling algorithm#

  • FINAM uses a new scheduling algorithm that allows components to use future data instead of only past/current (!157, !159)

  • New adapters to resolve circular coupling through the use of delayed data (!187)

  • It is now possible to set up static couplings that run only once and have no explicit time or stepping (!166)

  • FINAM can handle different starting times of components by pushing initial data twice (!206): Once for the common starting time, and once for the actual component time

  • Components are no longer required to push all outputs on every step (!208)

Data and metadata rework#

  • Outputs check compatibility between metadata of inputs if there is more than one target input (!104)

  • Add data tools function compatible_units to check for convertibility (!105)

  • Components can exchange their starting time through the Info object (!111)

  • Info exchange is automated by the ConnectHelper by specifying transfer rules at initialization (!154)

  • Info now requires time in constructor (can be None) (!111)

  • Scheduler checks for dead links that don’t work in terms of push/pull combination (!112)

  • IInput, IOutput and IAdapter have new internally used properties needs_push and needs_pull (!112)

  • to_xarray now checks the data shape if the data is not flat (!130)

  • Outputs can be flagged static for data that is only used during initialization, or that is constant (!166)

  • Inputs can be flagged static for constant data (!171)

  • Outputs accept and convert compatible units, not only exactly equal units (!215)

  • Outputs check that subsequent data pushes don’t share memory (!217)

  • Exchanged xarray data has no time coordinate anymore, only a dimension without values (for performance and usability) (!223)

  • Remove the xarray wrapping completely. Use numpy arrays in pint Quantity (!235)

  • Outputs and adapters can have a memory_limit and write data to disk if the limit is exceeded (!238)


  • Add modules.WeightedSum for aggregation of multiple inputs (!105)

  • Add modules.SimplexNoise for generating spatio-temporal noise (!131)

  • Add modules.TimeTrigger to forward data from pull-based to push-based components (!131)

  • Add modules.ScheduleLogger to visualize scheduling/module updates through ASCII charts (!160)

  • Add modules.DebugPushConsumer as a push-based variant of the debug consumer (!165)

  • Add modules.UserControl that lets users control FINAM runs from the terminal (!184)

  • modules.DebugConsumer and modules.DebugPushConsumer can use optional callbacks for better debugging (!176)

  • Components can be renamed using the method with_name() (!243)


  • Add adapters.Histogram to extract a histogram from grid values (!182)

  • Add adapters.DelayFixed, adapters.DelayToPull and adapters.DelayToPush to resolve circular coupling through the use of delayed data (!187)

  • Add adapters.StepTime for step-wise interpolation (!194)

  • Restructuring of time integration adapters (!194)

    • adapters.IntegrateTime renamed to adapters.AvgOverTime

    • Add adapters.SumOverTime for sum/Area under Curve integration

  • Adapters have a method finalize() for cleanup (!226).

  • Adapters can be renamed using the method with_name() (!243)


  • Remove module core, subpackages now under finam (!106)

  • Rename IOutput.source_changed() to source_updated (!107)

  • Rename LogError to ErrorLogger (!107)

  • Rename abstract SDK classes: (!107)

    • AAdapter is now Adapter

    • AComponent is now Component

    • ATimeComponent is now TimeComponent

  • Changed arguments for create_connector() (!111)

    • Removed required_out_infos

    • Renamed required_in_data to pull_data

    • Added arguments to specify info exchange rules

  • All error types are in module errors now, and re-exported at top level (!116)

  • Overwriting _validate() and _finalize() in components is now mandatory (!156)

  • Input and output slots can be accessed from components directly, e.g. comp["A"] instead of comp.inputs["A"] (!147)

  • Inputs and outputs can be marked as static for constant data without time information (!166, !171)

  • New helper function tools.inspect() to inspect components, adapters and I/O slots (!197)

  • Publish on PyPI, starting with the next release (!198, !200, !201)

  • Added benchmarks for the most important FINAM functions (see the benchmarks README)

  • Added profiling for full runs to the CI (!221)

  • Optimization of data tool functions, with approx. 20-fold speedup of basic push+pull (!222, !223, !224, !228, !229, !237).

  • Add two more log levels: TRACE (most verbose) and PROFILE (between DEBUG and INFO) (!240)


Data and metadata rework#

  • Add conversion between CRS to regridding adapters, using pyproj (!95)

  • Add more data tool functions: quantify(xdata), check_axes_uniformity(axes) and strip_data(xdata) (!96, !100)

  • In outputs, the name of the data is overwritten instead of failing the check (!98)

  • Adapters can pass through data with time, even if it does not match the pull time (which is quite common) (!98)


  • Add CallbackOutput for implementing pull-based components (!102)

  • Connect phase of scheduler can be called separately from run (!99)

  • No need to set component status in constructor anymore (!100)


  • Components are allowed to be in state VALIDATED at the end of a run (i.e. not updated) (!97)

  • Component connector checks that inputs and outputs referenced in arguments actually exist (!101)


Data and metadata rework#

  • Grid specifications for structured and unstructured grids (!74): RectilinearGrid, UniformGrid, EsriGrid, UnstructuredGrid and UnstructuredPoints

  • Use of xarray.DataArray for all exchanged data (!74)

  • All exchanged data must have pint units (can be “dimensionless”) (!74)

  • Metadata about grid specification, units and other metadata is exchanged before the first data exchange (!77)

  • Metadata exchange is iterative and bi-directional (!77) Components can depend on metadata from source or target components

  • Inputs check compatibility of incoming metadata with own requirements (!77)

  • Inputs and outputs check compatibility of incoming data with metadata (!77)

  • Automatic conversion of array-like and scalars to xarray.DataArray in outputs, with metadata check (!74, !77)


  • New adapters for linear and nearest-neighbour regridding from and to all available grid types (!77, !87)

  • Removed adapter GridCellCallback (!79)


  • Removed GridView component (new implementation in finam-plot) (!79)


  • The finam package has a flatter module hierarchy now, so the most important classes are now exported at the top level (!92)

  • Component developers do not overwrite interface methods like update() anymore, but internal methods like _update() instead (!85)


  • More ergonomic input and output creation in components (!80, !82)

  • Input and output mappings are immutable after initialization (!82)

  • Brought up test coverage to 98% (!93)



  • IOutput now has a property has_target to determine whether it is connected (!54)

  • IInput now has a property has_source to determine whether it is connected (!63)

  • CallbackComponent for generic, callback-based data generation, transform or consumption (!55)

  • IComponent.inputs, IComponent.outputs, IComponent.status and ITimeComponent.time are now properties instead of methods (!53)

  • Support for initialization from inputs / iterative connect (!69)

    • Changed logic and ComponentStatus to be set in component method connect()


  • Logging capability, incl. C-level output capturing (!64, !70, !71)

  • Grid now uses MaskedArray, to improve handling of missing data

  • Vertical/Y grid indices are now flipped, to conform with (typical) NetCDF and ASCII grid format (!51)

  • Minimal Python version is now 3.7, to ensure consistent dict order (!58)

  • Most asserts replaced by raising errors (!52)

  • Grid visualization supports color scale limits (!61)

  • Context manager and helper function to execute code in a certain working directory (!62)

  • Status checks moved from component methods to composition/scheduler (!65)

  • Adapters check that requested time it in the range of available data (!66)

Bug fixes#

  • Fix check for None data in Grid constructor (!50)



  • Uses Python’s datetime and timedelta for all time-related parameters

  • Removed temporal sum integration adapter


  • initial release of FINAM