SERiF v0.0.1a
Stellar Evolution and Rotation in Four Dimensions
Loading...
Searching...
No Matches
serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT > Class Template Referencefinal

#include <prepared_operator.hpp>

Collaboration diagram for serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >:
[legend]

Classes

struct  Calculate
 
struct  VolumeData
 

Public Types

using Plan = EquationPlan<EquationT>
 
using RowBinding = discretization::backend::mfem::TermBinding<typename Plan::Test, SchemaT>
 
using DisplacementBinding = discretization::backend::mfem::TermBinding<discretization::blocks::displacement::vector, SchemaT>
 

Public Member Functions

 PreparedOperator (EquationT equation, const RowBinding &row, const DisplacementBinding &displacement, const ::mfem::GridFunction &compactification, const mapping::DomainMapper &mapper, discretization::quadrature::Policy policy=discretization::quadrature::Policy{{}}, const ContractionMode contraction_mode=ContractionMode::automatic)
 Borrow discretization and mapping objects; no numerical state is prepared yet.
 
 PreparedOperator (const PreparedOperator &)=delete
 
PreparedOperator & operator= (const PreparedOperator &)=delete
 
 PreparedOperator (PreparedOperator &&)=delete
 
PreparedOperator & operator= (PreparedOperator &&)=delete
 
template<typename StateT>
std::expected< void, PreparationRejection > try_prepare (const StateT &state, const ::mfem::Vector &displacement, Workspace &workspace, const PreparationMode mode=PreparationMode::rebuild)
 Try to prepare the operator with the given state and displacement.
 
template<typename StateT>
void prepare (const StateT &state, const ::mfem::Vector &displacement, Workspace &workspace, const PreparationMode mode=PreparationMode::rebuild)
 Prepare or report the numerical rejection as a caller-visible exception.
 
void invalidate () noexcept
 Discard the frozen numerical data before accepting a new base state.
 
bool is_prepared () const noexcept
 Report whether a complete preparation has been published.
 
std::size_t preparation_count () const noexcept
 Count successful preparations.
 
const PreparationReport & preparation_report () const noexcept
 Report work performed by the most recent successful preparation.
 
std::size_t tensor_element_count () const
 Count prepared contribution-elements whose test, operands or geometry use tensor contractions.
 
int height () const noexcept
 Return the supported residual size.
 
int width () const
 Return the packed input size: unique term coefficients followed by displacement.
 
int integration_order (int element) const
 Return the quadrature order for a prepared supported element.
 
void residual (Workspace &workspace, ::mfem::Vector &result) const
 Assemble element residuals from the frozen preparation.
 
template<typename StateT>
void apply_jacobian (const StateT &direction, const ::mfem::Vector &displacement_direction, Workspace &workspace, ::mfem::Vector &result) const
 Apply the frozen linearization to a bound or packed coefficient direction.
 
void apply_jacobian (const ::mfem::Vector &direction, Workspace &workspace, ::mfem::Vector &result) const
 Apply the frozen linearization to a bound or packed coefficient direction.
 
void apply_jacobian_transpose (const ::mfem::Vector &residual_dual, Workspace &workspace, ::mfem::Vector &result) const
 Return the full coordinate transpose in the same packed order as the forward action.
 

Private Types

using Sources = VolumeDependencies<typename Plan::Columns>
 
using InputState = typename Sources::template State<SchemaT>
 
using Context
 
using Update = utils::dependencies::ComputationUpdate<typename Sources::Inputs, VolumeData>
 
using Calculation = utils::dependencies::IncrementalComputation<VolumeResult, VolumeData, typename Sources::Inputs, Calculate>
 
using Graph = utils::dependencies::ComputationGraph<Calculation>
 
using Cache = utils::dependencies::ComputationCache<Graph, Context, PreparationRejection>
 

Private Member Functions

const VolumeData & prepared_data () const
 Read the sole accepted numerical state; the dependency module owns its lifetime and publication.
 
template<typename StateT>
std::expected< VolumeData, PreparationRejection > prepare_volume (const Update &changes, const BasisBindings< Plan::column_count > &bindings, const CoefficientView< DisplacementBinding > &displacement, const StateT &state, Workspace &workspace)
 Rebuild only the numerical pieces affected by declared source changes.
 
void validate_prepared () const
 Reject missing preparation and changes to borrowed discretization objects.
 
void apply_action (const std::array< const ::mfem::Vector *, Plan::column_count > &directions, const ::mfem::Vector &displacement_direction, Workspace &workspace, ::mfem::Vector &result) const
 Validate directions, evaluate element Jacobian actions, and assemble them.
 
void add_element_result (int element, Workspace &workspace, utils::CompensatedSum &global_sum) const
 Global integrals reduce into one entry; compensate cancellation across elements too.
 

Private Attributes

EquationT m_equation
 
const RowBinding & m_row
 
const DisplacementBinding & m_displacement
 
const ::mfem::GridFunction & m_compactification
 
const ::mfem::FiniteElementSpace * m_compactification_space
 
long m_compactification_sequence
 
const mapping::DomainMapper & m_mapper
 
discretization::quadrature::Policy m_policy
 
TensorBasisCache m_basis_cache
 
ContractionMode m_contraction_mode
 
PreparationReport m_report
 
std::size_t m_preparation_count {0}
 
Workspace * m_workspace {nullptr}
 
Cache m_cache {Graph{Calculation{Calculate{*this}}}}
 

Member Typedef Documentation

◆ Cache

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::Cache = utils::dependencies::ComputationCache<Graph, Context, PreparationRejection>
private

◆ Calculation

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::Calculation = utils::dependencies::IncrementalComputation<VolumeResult, VolumeData, typename Sources::Inputs, Calculate>
private

◆ Context

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::Context
private
Initial value:
decltype(Sources::context(std::declval<const InputState&>(), std::declval<const DisplacementBinding&>(),
std::declval<const ::mfem::Vector&>(), std::declval<const ::mfem::GridFunction&>()))

◆ DisplacementBinding

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::DisplacementBinding = discretization::backend::mfem::TermBinding<discretization::blocks::displacement::vector, SchemaT>

◆ Graph

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::Graph = utils::dependencies::ComputationGraph<Calculation>
private

◆ InputState

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::InputState = typename Sources::template State<SchemaT>
private

◆ Plan

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::Plan = EquationPlan<EquationT>

◆ RowBinding

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::RowBinding = discretization::backend::mfem::TermBinding<typename Plan::Test, SchemaT>

◆ Sources

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::Sources = VolumeDependencies<typename Plan::Columns>
private

◆ Update

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
using serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::Update = utils::dependencies::ComputationUpdate<typename Sources::Inputs, VolumeData>
private

Constructor & Destructor Documentation

◆ PreparedOperator() [1/3]

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::PreparedOperator ( EquationT equation,
const RowBinding & row,
const DisplacementBinding & displacement,
const ::mfem::GridFunction & compactification,
const mapping::DomainMapper & mapper,
discretization::quadrature::Policy policy = discretization::quadrature::Policy{{}},
const ContractionMode contraction_mode = ContractionMode::automatic )
inline

Borrow discretization and mapping objects; no numerical state is prepared yet.

◆ PreparedOperator() [2/3]

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::PreparedOperator ( const PreparedOperator< EquationT, SchemaT > & )
delete

◆ PreparedOperator() [3/3]

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::PreparedOperator ( PreparedOperator< EquationT, SchemaT > && )
delete

Member Function Documentation

◆ add_element_result()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::add_element_result ( int element,
Workspace & workspace,
utils::CompensatedSum & global_sum ) const
inlineprivate

Global integrals reduce into one entry; compensate cancellation across elements too.

◆ apply_action()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::apply_action ( const std::array< const ::mfem::Vector *, Plan::column_count > & directions,
const ::mfem::Vector & displacement_direction,
Workspace & workspace,
::mfem::Vector & result ) const
inlineprivate

Validate directions, evaluate element Jacobian actions, and assemble them.

◆ apply_jacobian() [1/2]

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::apply_jacobian ( const ::mfem::Vector & direction,
Workspace & workspace,
::mfem::Vector & result ) const
inline

Apply the frozen linearization to a bound or packed coefficient direction.

◆ apply_jacobian() [2/2]

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
template<typename StateT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::apply_jacobian ( const StateT & direction,
const ::mfem::Vector & displacement_direction,
Workspace & workspace,
::mfem::Vector & result ) const
inline

Apply the frozen linearization to a bound or packed coefficient direction.

◆ apply_jacobian_transpose()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::apply_jacobian_transpose ( const ::mfem::Vector & residual_dual,
Workspace & workspace,
::mfem::Vector & result ) const
inline

Return the full coordinate transpose in the same packed order as the forward action.

◆ height()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
int serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::height ( ) const
inlinenodiscardnoexcept

Return the supported residual size.

◆ integration_order()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
int serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::integration_order ( int element) const
inlinenodiscard

Return the quadrature order for a prepared supported element.

◆ invalidate()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::invalidate ( )
inlinenoexcept

Discard the frozen numerical data before accepting a new base state.

◆ is_prepared()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
bool serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::is_prepared ( ) const
inlinenodiscardnoexcept

Report whether a complete preparation has been published.

◆ operator=() [1/2]

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
PreparedOperator & serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::operator= ( const PreparedOperator< EquationT, SchemaT > & )
delete

◆ operator=() [2/2]

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
PreparedOperator & serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::operator= ( PreparedOperator< EquationT, SchemaT > && )
delete

◆ preparation_count()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
std::size_t serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::preparation_count ( ) const
inlinenodiscardnoexcept

Count successful preparations.

◆ preparation_report()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
const PreparationReport & serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::preparation_report ( ) const
inlinenodiscardnoexcept

Report work performed by the most recent successful preparation.

◆ prepare()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
template<typename StateT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::prepare ( const StateT & state,
const ::mfem::Vector & displacement,
Workspace & workspace,
const PreparationMode mode = PreparationMode::rebuild )
inline

Prepare or report the numerical rejection as a caller-visible exception.

◆ prepare_volume()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
template<typename StateT>
std::expected< VolumeData, PreparationRejection > serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::prepare_volume ( const Update & changes,
const BasisBindings< Plan::column_count > & bindings,
const CoefficientView< DisplacementBinding > & displacement,
const StateT & state,
Workspace & workspace )
inlinenodiscardprivate

Rebuild only the numerical pieces affected by declared source changes.

◆ prepared_data()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
const VolumeData & serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::prepared_data ( ) const
inlinenodiscardprivate

Read the sole accepted numerical state; the dependency module owns its lifetime and publication.

◆ residual()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::residual ( Workspace & workspace,
::mfem::Vector & result ) const
inline

Assemble element residuals from the frozen preparation.

◆ tensor_element_count()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
std::size_t serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::tensor_element_count ( ) const
inlinenodiscard

Count prepared contribution-elements whose test, operands or geometry use tensor contractions.

◆ try_prepare()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
template<typename StateT>
std::expected< void, PreparationRejection > serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::try_prepare ( const StateT & state,
const ::mfem::Vector & displacement,
Workspace & workspace,
const PreparationMode mode = PreparationMode::rebuild )
inlinenodiscard

Try to prepare the operator with the given state and displacement.

Prepare a frozen state; optional reuse refreshes only changed coefficients, geometry and contributions. A rejection or programming error leaves the operator unprepared, even when old caches exist.

Template Parameters
StateTThe type of the state to prepare.
Parameters
stateThe state to prepare.
displacementThe displacement vector to use for preparation.
workspaceThe workspace to use for preparation.
modeThe preparation mode to use.
Returns
A std::expected indicating success or a PreparationRejection on failure.
Todo
The try-catch logic should be replaced with value based error handling to avoid stack unwinding.

◆ validate_prepared()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
void serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::validate_prepared ( ) const
inlineprivate

Reject missing preparation and changes to borrowed discretization objects.

◆ width()

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
int serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::width ( ) const
inlinenodiscard

Return the packed input size: unique term coefficients followed by displacement.

Member Data Documentation

◆ m_basis_cache

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
TensorBasisCache serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_basis_cache
private

◆ m_cache

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
Cache serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_cache {Graph{Calculation{Calculate{*this}}}}
private

◆ m_compactification

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
const ::mfem::GridFunction& serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_compactification
private

◆ m_compactification_sequence

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
long serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_compactification_sequence
private

◆ m_compactification_space

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
const ::mfem::FiniteElementSpace* serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_compactification_space
private

◆ m_contraction_mode

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
ContractionMode serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_contraction_mode
private

◆ m_displacement

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
const DisplacementBinding& serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_displacement
private

◆ m_equation

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
EquationT serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_equation
private

◆ m_mapper

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
const mapping::DomainMapper& serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_mapper
private

◆ m_policy

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
discretization::quadrature::Policy serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_policy
private

◆ m_preparation_count

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
std::size_t serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_preparation_count {0}
private

◆ m_report

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
PreparationReport serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_report
private

◆ m_row

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
const RowBinding& serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_row
private

◆ m_workspace

template<VolumeEquation EquationT, discretization::domain::schema::IsSchema SchemaT>
Workspace* serif::operators::backend::mfem::PreparedOperator< EquationT, SchemaT >::m_workspace {nullptr}
private

The documentation for this class was generated from the following file: