surface.hpp concepts utility serif/discretization/blocks/fields.hpp serif/solver/preconditioner/keys.hpp serif/solver/preconditioner/strategies/inverse/fixed_amg.hpp serif/solver/preconditioner/strategies/surface/reference_mass.hpp serif/solver/preconditioner/strategies/surface/fitted_h1.hpp src/include/serif/solver/preconditioner/computations/surface.hpp serif::solver::preconditioner::SurfacePreconditioner serif serif::solver serif::solver::preconditioner #pragmaonce #include<concepts> #include<utility> #include"serif/discretization/blocks/fields.hpp" #include"serif/solver/preconditioner/keys.hpp" #include"serif/solver/preconditioner/strategies/inverse/fixed_amg.hpp" #include"serif/solver/preconditioner/strategies/surface/reference_mass.hpp" #include"serif/solver/preconditioner/strategies/surface/fitted_h1.hpp" namespaceserif::solver::preconditioner { template<typenameStrategy> conceptSurfaceStrategy=std::same_as<Strategy,strategies::surface::ReferenceSurfaceMass>|| std::same_as<Strategy,strategies::surface::CalibratedSurfaceMass>||std::same_as<Strategy,strategies::surface::FittedSurfaceH1>; template<typenameField,typenameRow,SurfaceStrategyStrategy,typenameBackend=strategies::inverse::FixedAMG> structSurfacePreconditionerfinal { usingRows=utils::dependencies::KeyList<Row>; usingValues=utils::dependencies::KeyList<Field>; usingResult=keys::Inverse<Rows, Values>; usingSurfaceStrategy=Strategy; usingInverseStrategy=Backend; Strategysurface; Backendinverse; }; template<typenameField=discretization::blocks::surface_deformation::coefficients,typenameRow=discretization::blocks::surface_deformation::shape_equilibrium,SurfaceStrategyStrategy=strategies::surface::ReferenceSurfaceMass,typenameBackend=strategies::inverse::FixedAMG> [[nodiscard]]automake_surface_preconditioner(Strategysurface={},Backendinverse={.cycles=3}) { returnSurfacePreconditioner<Field,Row,Strategy,Backend>{.surface=std::move(surface),.inverse=std::move(inverse)}; } }//namespaceserif::solver::preconditioner