Loading [MathJax]/extensions/tex2jax.js
OGS
ApplicationUtils::SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl > Class Template Referencefinal

Detailed Description

template<typename SolverInterface, template< typename ShapeFunction > class SolverImplementationTplTpl>
class ApplicationUtils::SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl >

Instantiates a given solver interface for all mesh element types (of dimension >= 1) and provides the correct solver implementation for a given mesh element.

Definition at line 30 of file SolverByElementTypeRegistry.h.

#include <SolverByElementTypeRegistry.h>

Static Public Member Functions

static SolverInterface const & getFor (MeshLib::Element const &e)
 

Private Types

using SolverIntfPtr = std::unique_ptr<SolverInterface>
 

Static Private Member Functions

static std::unordered_map< std::type_index, SolverIntfPtrinitSolvers ()
 

Static Private Attributes

static const std::unordered_map< std::type_index, SolverIntfPtrsolvers_
 

Member Typedef Documentation

◆ SolverIntfPtr

template<typename SolverInterface , template< typename ShapeFunction > class SolverImplementationTplTpl>
using ApplicationUtils::SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl >::SolverIntfPtr = std::unique_ptr<SolverInterface>
private

Definition at line 32 of file SolverByElementTypeRegistry.h.

Member Function Documentation

◆ getFor()

template<typename SolverInterface , template< typename ShapeFunction > class SolverImplementationTplTpl>
static SolverInterface const & ApplicationUtils::SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl >::getFor ( MeshLib::Element const & e)
inlinestatic

Definition at line 62 of file SolverByElementTypeRegistry.h.

63 {
64 auto const type_idx = std::type_index(typeid(e));
65 auto const it_type_solver = solvers_.find(type_idx);
66
67 if (it_type_solver != solvers_.end())
68 {
69 return *it_type_solver->second;
70 }
72 "You are trying to get a solver for an unknown mesh element "
73 "type "
74 "({:s}).",
75 type_idx.name());
76 }
#define OGS_FATAL(...)
Definition Error.h:26
static const std::unordered_map< std::type_index, SolverIntfPtr > solvers_

References OGS_FATAL, and ApplicationUtils::SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl >::solvers_.

◆ initSolvers()

template<typename SolverInterface , template< typename ShapeFunction > class SolverImplementationTplTpl>
static std::unordered_map< std::type_index, SolverIntfPtr > ApplicationUtils::SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl >::initSolvers ( )
inlinestaticprivate

Definition at line 34 of file SolverByElementTypeRegistry.h.

35 {
36 std::unordered_map<std::type_index, SolverIntfPtr> solvers;
37
38 auto at_least_1D = []<typename ET>(ET*)
39 { return ET::Element::dimension >= 1; };
40
41 auto create_and_insert_solver = [&solvers]<typename ET>(ET*)
42 {
43 using SolverImplementation =
44 SolverImplementationTplTpl<typename ET::ShapeFunction>;
45
46 solvers[std::type_index(typeid(typename ET::Element))] =
47 std::make_unique<SolverImplementation>();
48 };
49
50 using ElementTraitsFiltered =
52 at_least_1D));
53
54 BaseLib::TMP::foreach<ElementTraitsFiltered>(create_and_insert_solver);
55
56 return solvers;
57 }
void foreach(Function &&f)
Definition TMP.h:157
decltype(auto) filter(Pred pred)
Definition TMP.h:78

References BaseLib::TMP::filter(), and BaseLib::TMP::foreach().

Member Data Documentation

◆ solvers_

template<typename SolverInterface , template< typename > class SolverImplementationTplTpl>
const std::unordered_map< std::type_index, std::unique_ptr< SolverInterface > > ApplicationUtils::SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl >::solvers_
staticprivate
Initial value:
{
SolverByElementTypeRegistry<SolverInterface,
SolverImplementationTplTpl>::initSolvers()}
static std::unordered_map< std::type_index, SolverIntfPtr > initSolvers()

Definition at line 59 of file SolverByElementTypeRegistry.h.

Referenced by ApplicationUtils::SolverByElementTypeRegistry< SolverInterface, SolverImplementationTplTpl >::getFor().


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