pressio-rom

This work was started with a focus on projection-based reduced-order models (ROMs), which is a strongly multidisciplinary topic. Working towards a production-level ROM capability inevitably means spanning multiple fields ranging from, e.g., linear algebra, nonlinear solvers and optimization, to time integration, distributed computing and HPC. This constitutes a substantial challenge to tackle, whose complexity increases if aiming to develop a generic library.

To start such a project from the ground up, grow it and then being able to maintain it, we believe modularity, abstractions and well-defined APIs to be fundamental design principles to rely on. This has been, and still is, at the core of our development effort, and has lead to a highly modular design of pressio (see table below): each component (level) of the stack covers a specific capability and depends, via well-defined public APIs, on the ones below it. This has required (and still does) a considerable development effort, since each component needs “attention” and can easily be scoped into an independent, full-time project.

So why doing all this rather than adopting a different, simpler approach, for example, limiting and hiding as implementation some of the supporting functionalities? Because we believe the current structure/design offers several major benefits that would be hard—and in some cases impossible—to obtain otherwise: flexibility, extensibility, maintainability, and usability of each component on its own. One drawback is that at any point in time, the various components might have different maturity levels, so reaching a comparable and solid maturity across the stack might take some time—our current goal is to obtain in version 1.0.0 a uniform maturity level across the rom, ode, and solvers components. Please keep this in mind while browsing the documentation and the code.

The supported capabilities of pressio-rom are included in the table below. Each component (level) of the stack depends on the ones below it.


Description

Header(s)

rom

concepts
(linear) subspaces
Galerkin: steady
Galerkin: unsteady
LSPG: steady
LSPG: unsteady

<pressio/rom_concepts.hpp>
<pressio/rom_subspaces.hpp>
<pressio/rom_galerkin_steady.hpp>
<pressio/rom_galerkin_unsteady.hpp>
<pressio/rom_lspg_steady.hpp>
<pressio/rom_lspg_unsteady.hpp>
<pressio/rom.hpp> includes all

ode

concepts
explicit steppers
implicit steppers
advance_<*> fncs

<pressio/ode_concepts.hpp>
<pressio/ode_steppers_explicit.hpp>
<pressio/ode_steppers_implicit.hpp>
<pressio/ode_advancers.hpp>
<pressio/ode.hpp> includes all

solvers_nonlinear

concepts
Newton method
Gauss-Newton
Lev.-Marq.

<pressio/solvers_nonlinear_concepts.hpp>
<pressio/solvers_nonlinear_newton.hpp>
<pressio/solvers_nonlinear_gaussnewton.hpp>
<pressio/solvers_nonlinear_levmarq.hpp>
<pressio/solvers_nonlinear.hpp> includes all

solvers_linear

linear dense (on-node) solvers

<pressio/solvers_linear.hpp>

These components depend on the Pressio/pressio-ops header-only library.

Get Started

License and Citation

The full license (BSD-3) is available here.

Sooner or later we will publish this… in the meantime, you can find on arXiv an (outdated) preprint at: https://arxiv.org/abs/2003.07798

Questions?

Find us on Slack: https://pressioteam.slack.com or open an issue on github.