17#include <dune/common/exceptions.hh>
37 mechanicalPotentialEnergy,
38 microMagneticPotentialEnergy
88 magnetizationAndVectorPotential
105requires(
sizeof...(Affordances) <= 3)
108 using Base = std::tuple<Affordances...>;
112 :
Base(affordances...) {}
126 template <FEAffordance Affordance>
128 using AffordanceRaw = std::remove_cvref_t<Affordance>;
129 if constexpr (std::is_same_v<AffordanceRaw, AffordanceCollection>)
130 return affordances == *
this;
132 if constexpr (std::is_same_v<AffordanceRaw, ScalarAffordance>) {
133 if constexpr (hasScalarAffordance)
134 return affordances == std::get<ScalarAffordance>(*
this);
138 if constexpr (std::is_same_v<AffordanceRaw, VectorAffordance>) {
139 if constexpr (hasVectorAffordance)
140 return affordances == std::get<VectorAffordance>(*
this);
144 if constexpr (std::is_same_v<AffordanceRaw, MatrixAffordance>) {
145 if constexpr (hasMatrixAffordance)
146 return affordances == std::get<MatrixAffordance>(*
this);
155 requires hasScalarAffordance
157 return std::get<ScalarAffordance>(*
this);
160 requires hasVectorAffordance
162 return std::get<VectorAffordance>(*
this);
165 requires hasMatrixAffordance
167 return std::get<MatrixAffordance>(*
this);
205namespace AffordanceCollections {
222template <FESolutions sol, FEParameter para,
typename SV = Eigen::VectorXd,
typename PM =
double>
240 template <
typename SV2 = SV,
typename PM2 = PM>
242 : sol_(std::make_unique<SV>(std::forward<SV2>(solVec))),
243 parameter_(std::make_unique<PM>(std::forward<PM2>(
parameter))) {}
250 template <
typename PB>
252 : sol_(std::make_unique<SV>(SV::Zero(
basis.flat().
size()))),
253 parameter_(std::make_unique<PM>(0.0)) {}
263 : sol_(other.sol_ ? std::make_unique<SV>(*other.sol_) : nullptr),
264 parameter_(other.parameter_ ? std::make_unique<PM>(*other.parameter_) : nullptr) {}
275 if (
this != &other) {
276 sol_ = other.sol_ ? std::make_unique<SV>(*other.sol_) :
nullptr;
277 parameter_ = other.parameter_ ? std::make_unique<PM>(*other.parameter_) :
nullptr;
291 parameter_ = std::make_unique<PM>(val);
303 template <
typename SV2 = SolutionVectorType>
305 sol_ = std::make_unique<SV>(std::forward<SV2>(solVec));
316 DUNE_THROW(Dune::InvalidStateException,
"Solution vector is not initialized.");
327 DUNE_THROW(Dune::InvalidStateException,
"Solution vector is not initialized.");
351 DUNE_THROW(Dune::InvalidStateException,
"Parameter is not initialized.");
363 DUNE_THROW(Dune::InvalidStateException,
"Parameter is not initialized.");
382 template <
typename T>
385 DUNE_THROW(Dune::InvalidStateException,
"Solution vector is not initialized.");
386 if constexpr (not std::is_same_v<T, utils::SyncFERequirements>)
399 template <
typename UF>
405 std::unique_ptr<SV> sol_;
406 std::unique_ptr<PM> parameter_;
Implementation of the make enum macro.
Collection of fallback default functions.
Definitions of ResultTypes used for finite element results.
FEParameter
A strongly typed enum class representing the FE parameter.
Definition: ferequirements.hh:76
FESolutions
A strongly typed enum class representing the type of the solutions vectors.
Definition: ferequirements.hh:89
#define MAKE_ENUM(type,...)
Macro to create an enumeration with a string conversion function.The macro creates an enum class with...
Definition: makeenum.hh:40
Definition: assemblermanipulatorbuildingblocks.hh:22
constexpr MatrixAffordance stiffnessdiffBucklingVector
Definition: ferequirements.hh:174
auto vectorAffordance(MatrixAffordance affordanceM)
Definition: ferequirements.hh:178
MatrixAffordance
A strongly typed enum class representing the matrix affordance.
Definition: ferequirements.hh:65
@ stiffnessdiffBucklingVector
constexpr MatrixAffordance stiffness
Definition: ferequirements.hh:173
constexpr VectorAffordance forces
Definition: ferequirements.hh:171
constexpr ScalarAffordance potentialEnergy
Definition: ferequirements.hh:176
auto scalarAffordance(MatrixAffordance affordanceM)
Definition: ferequirements.hh:187
VectorAffordance
A strongly typed enum class representing the vector affordance.
Definition: ferequirements.hh:50
constexpr MatrixAffordance mass
Definition: ferequirements.hh:175
ScalarAffordance
A strongly typed enum class representing the scalar affordance.
Definition: ferequirements.hh:39
@ mechanicalPotentialEnergy
@ microMagneticPotentialEnergy
constexpr AffordanceCollection elastoStatics(ScalarAffordance::mechanicalPotentialEnergy, VectorAffordance::forces, MatrixAffordance::stiffness)
struct Ikarus::utils::SyncFERequirements syncFERequirements
def basis(gv, tree)
Definition: basis.py:10
Struct representing a collection of affordances.
Definition: ferequirements.hh:107
std::tuple< Affordances... > Base
Definition: ferequirements.hh:108
auto vectorAffordance() const
Definition: ferequirements.hh:159
constexpr AffordanceCollection(Affordances... affordances)
Definition: ferequirements.hh:111
auto scalarAffordance() const
Definition: ferequirements.hh:154
AffordanceCollection()=default
constexpr bool hasAffordance(Affordance &&affordances) const
Check if a specific affordance is present in the requirements.
Definition: ferequirements.hh:127
auto matrixAffordance() const
Definition: ferequirements.hh:164
Class representing the requirements for finite element calculations.
Definition: ferequirements.hh:224
FERequirements()=default
Default constructor.
bool populated() const
Tells if the class contains all needed values.
Definition: ferequirements.hh:373
std::size_t size()
A helper function to get the size of the solution vector.
Definition: ferequirements.hh:337
void syncParameterAndGlobalSolution(UF &&updateFunction)
This function syncs the parameter and the global solution vector. The can get out of sync,...
Definition: ferequirements.hh:400
FERequirements & operator=(const FERequirements &other)
Copy assignment operator.
Definition: ferequirements.hh:274
FERequirements(const FERequirements &other)
Copy constructor.
Definition: ferequirements.hh:262
SV SolutionVectorType
Type of the solution vector.
Definition: ferequirements.hh:226
FERequirements(SV2 &&solVec, PM2 &¶meter)
Constructor initializing the solution vector and parameter.
Definition: ferequirements.hh:241
PM ParameterType
Type of the parameter.
Definition: ferequirements.hh:227
SV & globalSolution()
Get the global solution vector.
Definition: ferequirements.hh:325
FERequirements & insertGlobalSolution(SV2 &&solVec)
Insert a global solution vector into the requirements.
Definition: ferequirements.hh:304
const SolutionVectorType & globalSolution() const
Get the global solution vector.
Definition: ferequirements.hh:314
FERequirements & insertParameter(const PM &val)
Insert a parameter into the requirements.
Definition: ferequirements.hh:290
const PM & parameter() const
Get the parameter value.
Definition: ferequirements.hh:349
PM & parameter()
Get the parameter value.
Definition: ferequirements.hh:361
FERequirements(const Ikarus::BasisHandler< PB > &basis)
Constructor from a basis.
Definition: ferequirements.hh:251
SV & operator+=(const T &rhs)
Enables the usage of the class as a solution vector.
Definition: ferequirements.hh:383
Wrapper class for a hierarchical basis constructed from a pre-basis.
Definition: utils/basis.hh:30
Type trait to check if a specified type is present in a tuple.
Definition: traits.hh:88
Concept to check if a given type is one of the predefined affordance enums or the AffordanceCollectio...
Definition: ferequirements.hh:97
Concept defining the requirements for Eigen vectors.
Definition: utils/concepts.hh:365
Wrapper around Dune-functions global basis.