OGS
ProcessLib::Reflection Namespace Reference

Namespaces

namespace  detail

Classes

struct  ReflectionData

Functions

template<typename Class, typename Accessor>
auto makeReflectionData (Accessor &&accessor)
template<typename Class, typename Accessor>
auto makeReflectionData (std::string name, Accessor &&accessor)
template<typename Class, typename Member>
auto makeReflectionData (Member Class::*member)
template<typename Class, typename Member>
auto makeReflectionData (std::string name, Member Class::*member)
template<typename Class, typename Member>
auto reflectWithName (std::string name, Member Class::*member)
template<typename Class, typename... Accessors>
auto reflectWithoutName (Accessors &&... accessors)
template<typename Class, typename... Members>
auto reflectWithoutName (Members Class::*... members)
template<int Dim, typename LocAsmIF, typename ReflData>
void addReflectedSecondaryVariables (ReflData const &reflection_data, SecondaryVariableCollection &secondary_variables, NumLib::Extrapolator &extrapolator, std::vector< std::unique_ptr< LocAsmIF > > const &local_assemblers)
template<int Dim, typename LocAsmIF, typename ReflData>
void addReflectedIntegrationPointWriters (ReflData const &reflection_data, std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > &integration_point_writers, unsigned const integration_order, std::vector< std::unique_ptr< LocAsmIF > > const &local_assemblers)
template<int Dim, typename LocAsmIF, typename Callback, typename ReflData>
void forEachReflectedFlattenedIPDataAccessor (ReflData const &reflection_data, Callback const &callback)
template<int dim, typename IPData>
std::size_t reflectSetIPData (std::string_view const name, double const *values, std::vector< IPData > &ip_data_vector)

Function Documentation

◆ addReflectedIntegrationPointWriters()

template<int Dim, typename LocAsmIF, typename ReflData>
void ProcessLib::Reflection::addReflectedIntegrationPointWriters ( ReflData const & reflection_data,
std::vector< std::unique_ptr< MeshLib::IntegrationPointWriter > > & integration_point_writers,
unsigned const integration_order,
std::vector< std::unique_ptr< LocAsmIF > > const & local_assemblers )

Adds IP data writers for all IP data obtained recursively from the given reflection_data to the given IP writer vector.

Definition at line 14 of file ReflectionForIPWriters.h.

20{
22 reflection_data,
23 [&integration_point_writers, integration_order, &local_assemblers](
24 std::string const& name,
25 unsigned const num_comp,
26 auto&& flattened_ip_data_accessor)
27 {
28 // TODO check if writer with such a name already exists.
29 integration_point_writers.emplace_back(
30 std::make_unique<MeshLib::IntegrationPointWriter>(
31 name + "_ip", num_comp, integration_order, local_assemblers,
32 flattened_ip_data_accessor));
33 });
34}
void forEachReflectedFlattenedIPDataAccessor(ReflData const &reflection_data, Callback const &callback)

References forEachReflectedFlattenedIPDataAccessor().

Referenced by ProcessLib::LargeDeformation::LargeDeformationProcess< DisplacementDim >::LargeDeformationProcess().

◆ addReflectedSecondaryVariables()

template<int Dim, typename LocAsmIF, typename ReflData>
void ProcessLib::Reflection::addReflectedSecondaryVariables ( ReflData const & reflection_data,
SecondaryVariableCollection & secondary_variables,
NumLib::Extrapolator & extrapolator,
std::vector< std::unique_ptr< LocAsmIF > > const & local_assemblers )

Adds secondary variables for all IP data obtained recursively from the given reflection_data to the given secondary variable collection.

Definition at line 14 of file ReflectionForExtrapolation.h.

19{
21 reflection_data,
22 [&secondary_variables, &local_assemblers, &extrapolator](
23 std::string const& name,
24 unsigned const num_comp,
25 auto&& flattened_ip_data_accessor)
26 {
27 DBUG("Add secondary variable '{:s}' extrapolation (reflection).",
28 name);
29 secondary_variables.addSecondaryVariable(
30 name,
31 makeExtrapolator2(num_comp, extrapolator, local_assemblers,
32 flattened_ip_data_accessor));
33 });
34}
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
void addSecondaryVariable(std::string const &internal_name, SecondaryVariableFunctions &&fcts)
SecondaryVariableFunctions makeExtrapolator2(const unsigned num_components, NumLib::Extrapolator &extrapolator, LocalAssemblerCollection const &local_assemblers, IPDataAccessor &&accessor)

References ProcessLib::SecondaryVariableCollection::addSecondaryVariable(), DBUG(), forEachReflectedFlattenedIPDataAccessor(), and ProcessLib::makeExtrapolator2().

Referenced by ProcessLib::LargeDeformation::LargeDeformationProcess< DisplacementDim >::initializeConcreteProcess(), ProcessLib::RichardsMechanics::RichardsMechanicsProcess< DisplacementDim >::initializeConcreteProcess(), ProcessLib::SmallDeformation::SmallDeformationProcess< DisplacementDim >::initializeConcreteProcess(), ProcessLib::TH2M::TH2MProcess< DisplacementDim >::initializeConcreteProcess(), and ProcessLib::ThermoRichardsMechanics::ThermoRichardsMechanicsProcess< DisplacementDim, ConstitutiveTraits >::initializeConcreteProcess().

◆ forEachReflectedFlattenedIPDataAccessor()

template<int Dim, typename LocAsmIF, typename Callback, typename ReflData>
void ProcessLib::Reflection::forEachReflectedFlattenedIPDataAccessor ( ReflData const & reflection_data,
Callback const & callback )

Calls the passed callback for each IP data accessor for the given LocAsmIF class.

The IP data accessors are obtained via reflection (i.e., via the static reflect() method.

The IP data accessors provide IP data as a flat std::vector<double>.

The callback must accept name, number of components and a function object with signature LocAsmIF const& -> std::vector<double> as its arguments.

Definition at line 449 of file ReflectionIPData.h.

451{
452 using namespace boost::mp11;
453
454 static_assert(mp_is_list_v<ReflData>,
455 "The passed reflection data is not a std::tuple.");
456 static_assert(std::is_same_v<ReflData, mp_rename<ReflData, std::tuple>>,
457 "The passed reflection data is not a std::tuple.");
458
459 tuple_for_each(
460 reflection_data,
461 [&callback]<typename Class, typename Accessor>(
462 ReflectionData<Class, Accessor> const& refl_data)
463 {
464 static_assert(std::is_same_v<Class, LocAsmIF>,
465 "The currently processed reflection data is not for "
466 "the given LocAsmIF but for a different class.");
467
468 using AccessorResultRef =
469 std::invoke_result_t<Accessor, Class const&>;
470 using AccessorResult = std::remove_cvref_t<AccessorResultRef>;
471
472 // AccessorResult must be a std::vector<SomeType, SomeAllocator>. We
473 // check that, now.
474 static_assert(
475 mp_is_list_v<AccessorResult>); // std::vector<SomeType,
476 // SomeAllocator> is a list in
477 // the Boost MP11 sense
478 static_assert(
479 std::is_same_v<AccessorResult,
480 mp_rename<AccessorResult, std::vector>>,
481 "We expect a std::vector, here.");
482 // Now, we know that AccessorResult is std::vector<Member>. To be
483 // more specific, AccessorResult is a std::vector<IPData> and Member
484 // is IPData.
485 using Member = typename AccessorResult::value_type;
486
487 auto accessor_ip_data_vec_in_loc_asm =
488 [ip_data_vector_accessor =
489 refl_data.accessor](LocAsmIF const& loc_asm) -> auto const&
490 {
491 return ip_data_vector_accessor(loc_asm);
492 };
493
494 if constexpr (detail::is_reflectable<Member>)
495 {
497 callback,
498 detail::reflect(std::type_identity<Member>{}),
499 accessor_ip_data_vec_in_loc_asm);
500 }
501 else
502 {
503 static_assert(detail::is_raw_data_v<Member>,
504 "The current member is not reflectable, so we "
505 "expect it to be raw data.");
506
507 constexpr unsigned num_comp =
509
510 assert(!refl_data.name.empty());
511 callback(refl_data.name, num_comp,
513 accessor_ip_data_vec_in_loc_asm));
514 }
515 });
516}
GetFlattenedIPDataFromLocAsm< Dim, std::remove_cvref_t< Accessor_IPDataVecInLocAsm >, std::remove_cvref_t< Accessor_CurrentLevelFromIPDataVecElement > > getFlattenedIPDataFromLocAsm(Accessor_IPDataVecInLocAsm accessor_ip_data_vec_in_loc_asm, Accessor_CurrentLevelFromIPDataVecElement accessor_current_level_from_ip_data_vec_element)
auto reflect(std::type_identity< std::tuple< Ts... > >)
void forEachReflectedFlattenedIPDataAccessor(Callback const &callback, ReflectionDataTuple const &reflection_data, Accessor_IPDataVecInLocAsm const &accessor_ip_data_vec_in_loc_asm, Accessor_CurrentLevelFromIPDataVecElement const &accessor_current_level_from_ip_data_vec_element)
constexpr bool mp_is_list_v

References ProcessLib::Reflection::ReflectionData< Class, Accessor >::accessor, ProcessLib::Reflection::detail::forEachReflectedFlattenedIPDataAccessor(), ProcessLib::Reflection::detail::getFlattenedIPDataFromLocAsm(), ProcessLib::Reflection::detail::is_raw_data_v, boost::mp11::mp_is_list_v, ProcessLib::Reflection::ReflectionData< Class, Accessor >::name, and ProcessLib::Reflection::detail::reflect().

Referenced by addReflectedIntegrationPointWriters(), addReflectedSecondaryVariables(), and ProcessLib::computeCellAverages().

◆ makeReflectionData() [1/4]

template<typename Class, typename Accessor>
auto ProcessLib::Reflection::makeReflectionData ( Accessor && accessor)

◆ makeReflectionData() [2/4]

template<typename Class, typename Member>
auto ProcessLib::Reflection::makeReflectionData ( Member Class::* member)

Definition at line 58 of file ReflectionData.h.

59{
60 return makeReflectionData<Class>([member](auto& obj) -> auto&
61 { return obj.*member; });
62}
auto makeReflectionData(Accessor &&accessor)

References makeReflectionData().

◆ makeReflectionData() [3/4]

template<typename Class, typename Accessor>
auto ProcessLib::Reflection::makeReflectionData ( std::string name,
Accessor && accessor )

Definition at line 51 of file ReflectionData.h.

52{
54 std::move(name), std::forward<Accessor>(accessor)};
55}

◆ makeReflectionData() [4/4]

template<typename Class, typename Member>
auto ProcessLib::Reflection::makeReflectionData ( std::string name,
Member Class::* member )

Definition at line 65 of file ReflectionData.h.

66{
68 std::move(name), [member](auto& obj) -> auto& { return obj.*member; });
69}

References makeReflectionData().

◆ reflectSetIPData()

template<int dim, typename IPData>
std::size_t ProcessLib::Reflection::reflectSetIPData ( std::string_view const name,
double const * values,
std::vector< IPData > & ip_data_vector )

Sets integration point data for the property with the given name to the passed values.

Possible candidate properties are obtained from IPData via some sort of reflection.

Returns
The number of integration points.

Definition at line 163 of file ReflectionSetIPData.h.

165{
167 name, values, ip_data_vector, std::identity{},
168 detail::reflect(std::type_identity<IPData>{}));
169
170 return ip_data_vector.size();
171}
bool reflectSetIPData(std::string_view const name, double const *values, std::vector< IPData > &ip_data_vector, Accessor_CurrentLevelFromIPData const &accessor, std::tuple< ReflectionData< Classes, Accessors >... > const &refl_data, std::index_sequence< Idcs... >)

References ProcessLib::Reflection::detail::reflect(), and ProcessLib::Reflection::detail::reflectSetIPData().

Referenced by ProcessLib::LargeDeformation::LargeDeformationLocalAssemblerInterface< DisplacementDim >::setIPDataInitialConditions(), ProcessLib::RichardsMechanics::LocalAssemblerInterface< DisplacementDim >::setIPDataInitialConditions(), ProcessLib::SmallDeformation::SmallDeformationLocalAssemblerInterface< DisplacementDim >::setIPDataInitialConditions(), ProcessLib::TH2M::TH2MLocalAssembler< ShapeFunctionDisplacement, ShapeFunctionPressure, DisplacementDim >::setIPDataInitialConditions(), and ProcessLib::ThermoRichardsMechanics::LocalAssemblerInterface< DisplacementDim, ConstitutiveTraits >::setIPDataInitialConditions().

◆ reflectWithName()

◆ reflectWithoutName() [1/2]

◆ reflectWithoutName() [2/2]

template<typename Class, typename... Members>
auto ProcessLib::Reflection::reflectWithoutName ( Members Class::*... members)

Definition at line 85 of file ReflectionData.h.

86{
87 return std::tuple{makeReflectionData<Class>(members)...};
88}

References makeReflectionData().