Overview

flecsolve provides reusable numerical building blocks for applications that already use FleCSI for data, execution, and control flow. The main interfaces are intentionally generic: solvers and time integrators work with any vector type that provides the expected vector operations, and operators define mappings through an apply interface.

Vectors

The core vector type is built from three pieces:

Data

Storage and access to the underlying values.

Operations

Common linear algebra operations such as copy, scaling, vector sums, dot products, and norms.

Variable

A static tag that identifies the physics field represented by the vector.

The flecsolve::vec::topo_view adapter maps fields on a FleCSI topology to the vector interface. The flecsolve::vec::multi type groups component vectors so physics packages can pass coupled state through one vector-like object while allowing operators to select the subset they own.

Operators

Operators define maps from a domain vector to a range vector. A user operator implements the desired map in an apply function, typically by launching FleCSI tasks or by composing existing vector operations.

Operator handles make ownership explicit:

Shared handles

Use flecsolve::op::make_shared to create a shared owning handle.

Mutable references

Use flecsolve::op::ref to create a non-owning mutable reference handle.

Const references

Use flecsolve::op::cref to create a non-owning const reference handle.

Solvers

The solver components include conjugate gradient, BiCGSTAB, GMRES, nonlinear Krylov acceleration, AMP-backed solvers, and multigrid pieces. Krylov solver namespaces follow a common structure:

Settings

Runtime configuration such as tolerances and iteration limits.

Options

Boost program-options definitions used to populate settings from a configuration file.

Work-vector factories

Factories used to allocate all vectors required during a solve before the solve begins.

Solver object

The entry point that binds an operator, optional preconditioner, and optional diagnostic callback into an approximate inverse operator.

The corresponding identifiers are generally named settings, options, make_work, and solver in each solver namespace.

Time Integrators

The time integration package includes adaptive explicit Runge-Kutta methods and implicit BDF support. Like the solvers, these integrators are implemented against the vector and operator interfaces so they can be used with application-specific FleCSI topology and field types.