OGS
ProcessLib::Reflection::detail Namespace Reference

Classes

struct  GetFlattenedIPDataFromLocAsm
struct  is_raw_data
struct  is_raw_data< double >
struct  is_raw_data< Eigen::Matrix< double, N, 1, Eigen::ColMajor, N, 1 > >
struct  is_raw_data< Eigen::Matrix< double, N, M, Eigen::RowMajor, N, M > >
struct  NumberOfColumns
struct  NumberOfColumns< double >
struct  NumberOfColumns< Eigen::Matrix< double, N, 1, Eigen::ColMajor, N, 1 > >
struct  NumberOfColumns< Eigen::Matrix< double, N, M, Eigen::RowMajor, N, M > >
struct  NumberOfComponents
struct  NumberOfRows
struct  NumberOfRows< double >
struct  NumberOfRows< Eigen::Matrix< double, N, 1, Eigen::ColMajor, N, 1 > >
struct  NumberOfRows< Eigen::Matrix< double, N, M, Eigen::RowMajor, N, M > >

Functions

template<typename... Ts>
auto reflect (std::type_identity< std::tuple< Ts... > >)
template<has_reflect T>
auto reflect (std::type_identity< T >)
template<typename T, typename Tag>
auto reflect (std::type_identity< BaseLib::StrongType< T, Tag > >)
template<int Dim, typename Accessor_IPDataVecInLocAsm, typename Accessor_CurrentLevelFromIPDataVecElement>
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)
template<int Dim, typename Accessor_IPDataVecInLocAsm>
auto getFlattenedIPDataFromLocAsm (Accessor_IPDataVecInLocAsm &&accessor_ip_data_vec_in_loc_asm)
template<int Dim, typename Callback, typename ReflectionDataTuple, typename Accessor_IPDataVecInLocAsm, typename Accessor_CurrentLevelFromIPDataVecElement>
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)
template<int Dim, typename Callback, typename ReflectionDataTuple, typename Accessor_IPDataVecInLocAsm>
void forEachReflectedFlattenedIPDataAccessor (Callback const &callback, ReflectionDataTuple const &reflection_data, Accessor_IPDataVecInLocAsm const &accessor_ip_data_vec_in_loc_asm)
template<int dim, typename IPData, typename Accessor>
void setIPData (double const *values, std::vector< IPData > &ip_data_vector, Accessor const &accessor)
template<int dim, typename IPData, typename Accessor_CurrentLevelFromIPData, typename Class, typename Accessor>
bool setIPDataIfNameMatches (std::string_view const name, double const *values, std::vector< IPData > &ip_data_vector, Accessor_CurrentLevelFromIPData const &accessor, ReflectionData< Class, Accessor > const &refl_data)
template<int dim, typename IPData, typename Accessor_CurrentLevelFromIPData, typename... Classes, typename... Accessors, std::size_t... Idcs>
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... >)
template<int dim, typename IPData, typename Accessor_CurrentLevelFromIPData, typename... Classes, typename... Accessors>
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)

Variables

template<typename T>
constexpr bool is_raw_data_v = is_raw_data<T>::value

Function Documentation

◆ forEachReflectedFlattenedIPDataAccessor() [1/2]

template<int Dim, typename Callback, typename ReflectionDataTuple, typename Accessor_IPDataVecInLocAsm>
void ProcessLib::Reflection::detail::forEachReflectedFlattenedIPDataAccessor ( Callback const & callback,
ReflectionDataTuple const & reflection_data,
Accessor_IPDataVecInLocAsm const & accessor_ip_data_vec_in_loc_asm )

Definition at line 425 of file ReflectionIPData.h.

429{
431 callback, reflection_data, accessor_ip_data_vec_in_loc_asm,
432 std::identity{});
433}
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)

References forEachReflectedFlattenedIPDataAccessor().

◆ forEachReflectedFlattenedIPDataAccessor() [2/2]

template<int Dim, typename Callback, typename ReflectionDataTuple, typename Accessor_IPDataVecInLocAsm, typename Accessor_CurrentLevelFromIPDataVecElement>
void ProcessLib::Reflection::detail::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 )

Calls the given callback for each flattened IP data accessor obtained recursively from the given reflection data.

The callback function must take (i) the name of the IP data (std::string), (ii) their number of components (unsigned) and a flattened IP data accessor of type ProcessLib::Reflection::detail::GetFlattenedIPDataFromLocAsm as arguments.

See also
ProcessLib::Reflection::detail::GetFlattenedIPDataFromLocAsm for details, also on the template parameters.

Definition at line 365 of file ReflectionIPData.h.

370{
372 "The passed reflection data is not a std::tuple.");
373 static_assert(
374 std::is_same_v<ReflectionDataTuple,
375 boost::mp11::mp_rename<ReflectionDataTuple, std::tuple>>,
376 "The passed reflection data is not a std::tuple.");
377
378 boost::mp11::tuple_for_each(
379 reflection_data,
380 [&accessor_ip_data_vec_in_loc_asm,
381 &accessor_current_level_from_ip_data_vec_element,
382 &callback]<typename Class, typename Accessor>(
383 ReflectionData<Class, Accessor> const& refl_data)
384 {
385 using MemberRef = std::invoke_result_t<Accessor, Class const&>;
386 using Member = std::remove_cvref_t<MemberRef>;
387
388 auto accessor_member_from_ip_data_vec_element =
389 [accessor_next_level = refl_data.accessor,
390 accessor_current_level_from_ip_data_vec_element](
391 auto const& ip_data_vec_element) -> Member const&
392 {
393 return accessor_next_level(
394 accessor_current_level_from_ip_data_vec_element(
395 ip_data_vec_element));
396 };
397
398 if constexpr (is_reflectable<Member>)
399 {
401 callback, detail::reflect(std::type_identity<Member>{}),
402 accessor_ip_data_vec_in_loc_asm,
403 accessor_member_from_ip_data_vec_element);
404 }
405 else
406 {
407 static_assert(is_raw_data_v<Member>,
408 "The current member is not reflectable, so we "
409 "expect it to be raw data.");
410
411 constexpr unsigned num_comp = NumberOfComponents<Member>::value;
412
413 assert(!refl_data.name.empty());
414 callback(refl_data.name, num_comp,
416 accessor_ip_data_vec_in_loc_asm,
417 accessor_member_from_ip_data_vec_element));
418 }
419 });
420}
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... > >)
constexpr bool mp_is_list_v

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

Referenced by forEachReflectedFlattenedIPDataAccessor(), forEachReflectedFlattenedIPDataAccessor(), and ProcessLib::Reflection::forEachReflectedFlattenedIPDataAccessor().

◆ getFlattenedIPDataFromLocAsm() [1/2]

template<int Dim, typename Accessor_IPDataVecInLocAsm>
auto ProcessLib::Reflection::detail::getFlattenedIPDataFromLocAsm ( Accessor_IPDataVecInLocAsm && accessor_ip_data_vec_in_loc_asm)

Definition at line 343 of file ReflectionIPData.h.

345{
347 std::forward<Accessor_IPDataVecInLocAsm>(
348 accessor_ip_data_vec_in_loc_asm),
349 std::identity{});
350}

References getFlattenedIPDataFromLocAsm().

◆ getFlattenedIPDataFromLocAsm() [2/2]

template<int Dim, typename Accessor_IPDataVecInLocAsm, typename Accessor_CurrentLevelFromIPDataVecElement>
GetFlattenedIPDataFromLocAsm< Dim, std::remove_cvref_t< Accessor_IPDataVecInLocAsm >, std::remove_cvref_t< Accessor_CurrentLevelFromIPDataVecElement > > ProcessLib::Reflection::detail::getFlattenedIPDataFromLocAsm ( Accessor_IPDataVecInLocAsm accessor_ip_data_vec_in_loc_asm,
Accessor_CurrentLevelFromIPDataVecElement accessor_current_level_from_ip_data_vec_element )

Definition at line 328 of file ReflectionIPData.h.

332{
333 return {std::forward<Accessor_IPDataVecInLocAsm>(
334 accessor_ip_data_vec_in_loc_asm),
335 std::forward<Accessor_CurrentLevelFromIPDataVecElement>(
336 accessor_current_level_from_ip_data_vec_element)};
337}

Referenced by forEachReflectedFlattenedIPDataAccessor(), ProcessLib::Reflection::forEachReflectedFlattenedIPDataAccessor(), and getFlattenedIPDataFromLocAsm().

◆ reflect() [1/3]

template<typename T, typename Tag>
auto ProcessLib::Reflection::detail::reflect ( std::type_identity< BaseLib::StrongType< T, Tag > > )

Definition at line 129 of file ReflectionIPData.h.

130{
132
133 auto accessor = [](auto& o) -> auto&
134 {
135 return *o;
136 };
137
138 // Maybe in the future we might want to lift the following two constraints.
139 // But beware: that generalization has to be tested thoroughly such that we
140 // don't accidentally produce I/O data without name and the like.
141 static_assert(
142 has_ioName<Tag>,
143 /* We use ioName(Tag* tag), because it works with an incomplete type
144 * Tag, as opposed to ioName(Tag tag), i.e. declaring
145 * std::string_view ioName(struct SomeTag*);
146 * is possible, whereas
147 * std::string_view ioName(struct SomeTag);
148 * is not.
149 * This choice makes the code for every ioName() definition rather
150 * compact.
151 */
152 "For I/O of StrongType<T, Tag> you have to define an ioName(Tag* tag) "
153 "function returning the name used for I/O.");
154 static_assert(
156 "I/O of StrongTypes is supported only for StrongTypes wrapping 'raw "
157 "data' such as double values, vectors and matrices.");
158
159 return std::tuple{makeReflectionData<ST>(
160 std::string{ioName(static_cast<Tag*>(nullptr))}, std::move(accessor))};
161}
auto makeReflectionData(Accessor &&accessor)

References is_raw_data_v, and ProcessLib::Reflection::makeReflectionData().

◆ reflect() [2/3]

template<typename... Ts>
auto ProcessLib::Reflection::detail::reflect ( std::type_identity< std::tuple< Ts... > > )

Definition at line 103 of file ReflectionIPData.h.

104{
105 using namespace boost::mp11;
106
107 // The types Ts... must be unique. Duplicate types are incompatible with the
108 // concept of "reflected" I/O: they would lead to duplicate names for the
109 // I/O data.
110 static_assert(mp_is_set_v<mp_list<Ts...>>);
111
112 return reflectWithoutName<std::tuple<Ts...>>(
113 [](auto& tuple_) -> auto& { return std::get<Ts>(tuple_); }...);
114}
auto reflectWithoutName(Accessors &&... accessors)
constexpr bool mp_is_set_v

References boost::mp11::mp_is_set_v, and ProcessLib::Reflection::reflectWithoutName().

Referenced by forEachReflectedFlattenedIPDataAccessor(), ProcessLib::Reflection::forEachReflectedFlattenedIPDataAccessor(), ProcessLib::Reflection::reflectSetIPData(), and setIPDataIfNameMatches().

◆ reflect() [3/3]

template<has_reflect T>
auto ProcessLib::Reflection::detail::reflect ( std::type_identity< T > )

Definition at line 117 of file ReflectionIPData.h.

118{
119 return T::reflect();
120}

◆ reflectSetIPData() [1/2]

template<int dim, typename IPData, typename Accessor_CurrentLevelFromIPData, typename... Classes, typename... Accessors>
bool ProcessLib::Reflection::detail::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 )

Definition at line 141 of file ReflectionSetIPData.h.

146{
148 name, values, ip_data_vector, accessor, refl_data,
149 std::make_index_sequence<sizeof...(Classes)>{});
150}
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 reflectSetIPData().

◆ reflectSetIPData() [2/2]

template<int dim, typename IPData, typename Accessor_CurrentLevelFromIPData, typename... Classes, typename... Accessors, std::size_t... Idcs>
bool ProcessLib::Reflection::detail::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... >  )

Definition at line 125 of file ReflectionSetIPData.h.

131{
132 // uses short-circuit evaluation of the fold || ... to stop after the first
133 // match
134 return ((setIPDataIfNameMatches<dim>(name, values, ip_data_vector, accessor,
135 std::get<Idcs>(refl_data))) ||
136 ...);
137}
bool setIPDataIfNameMatches(std::string_view const name, double const *values, std::vector< IPData > &ip_data_vector, Accessor_CurrentLevelFromIPData const &accessor, ReflectionData< Class, Accessor > const &refl_data)

References setIPDataIfNameMatches().

Referenced by reflectSetIPData(), ProcessLib::Reflection::reflectSetIPData(), and setIPDataIfNameMatches().

◆ setIPData()

template<int dim, typename IPData, typename Accessor>
void ProcessLib::Reflection::detail::setIPData ( double const * values,
std::vector< IPData > & ip_data_vector,
Accessor const & accessor )

Definition at line 17 of file ReflectionSetIPData.h.

20{
21 using AccessorResult = std::invoke_result_t<Accessor, IPData&>;
22 using AccessorResultStripped = std::remove_cvref_t<AccessorResult>;
23
25 "This method only deals with raw data. The given "
26 "AccessorResultStripped is not raw data.");
27
29
30 auto const num_int_pts = ip_data_vector.size();
31
32 if constexpr (num_comp == 1)
33 {
34 // scalar
35 for (unsigned ip = 0; ip < num_int_pts; ++ip)
36 {
37 accessor(ip_data_vector[ip]) = values[ip];
38 }
39 }
40 else
41 {
42 constexpr auto num_rows = NumberOfRows<AccessorResultStripped>::value;
43 constexpr auto num_cols =
44 NumberOfColumns<AccessorResultStripped>::value;
45 constexpr auto kv_size =
47
48 auto const values_mat =
49 Eigen::Map<Eigen::Matrix<double, num_comp, Eigen::Dynamic,
50 Eigen::ColMajor> const>(values, num_comp,
51 num_int_pts);
52
53 for (unsigned ip = 0; ip < num_int_pts; ++ip)
54 {
55 if constexpr (num_cols == 1 || num_rows == 1)
56 {
57 // vector
58 if constexpr (num_comp == kv_size)
59 {
60 // Kelvin vector
61 accessor(ip_data_vector[ip]) =
63 values_mat.col(ip));
64 }
65 else
66 {
67 // other vector
68 accessor(ip_data_vector[ip]) = values_mat.col(ip);
69 }
70 }
71 else
72 {
73 // matrix
74 accessor(ip_data_vector[ip]) =
75 values_mat.col(ip).template reshaped<Eigen::RowMajor>(
76 num_rows, num_cols);
77 }
78 }
79 }
80}
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.
Eigen::Matrix< double, Eigen::MatrixBase< Derived >::RowsAtCompileTime, 1 > symmetricTensorToKelvinVector(Eigen::MatrixBase< Derived > const &v)

References is_raw_data_v, MathLib::KelvinVector::kelvin_vector_dimensions(), and MathLib::KelvinVector::symmetricTensorToKelvinVector().

Referenced by setIPDataIfNameMatches().

◆ setIPDataIfNameMatches()

template<int dim, typename IPData, typename Accessor_CurrentLevelFromIPData, typename Class, typename Accessor>
bool ProcessLib::Reflection::detail::setIPDataIfNameMatches ( std::string_view const name,
double const * values,
std::vector< IPData > & ip_data_vector,
Accessor_CurrentLevelFromIPData const & accessor,
ReflectionData< Class, Accessor > const & refl_data )

Definition at line 86 of file ReflectionSetIPData.h.

90{
91 auto const accessor_next_level = refl_data.accessor;
92
93 using MemberRef = std::invoke_result_t<Accessor, Class&>;
94 using Member = std::remove_cvref_t<MemberRef>;
95
96 auto const accessor_field_from_ip_data =
97 [accessor, accessor_next_level](IPData& ip_data) -> Member&
98 { return accessor_next_level(accessor(ip_data)); };
99
100 if constexpr (detail::is_reflectable<Member>)
101 {
103 name, values, ip_data_vector, accessor_field_from_ip_data,
104 detail::reflect(std::type_identity<Member>{}));
105 }
106 else
107 {
108 static_assert(detail::is_raw_data_v<Member>,
109 "The current member is not reflectable, so we "
110 "expect it to be raw data.");
111
112 if (refl_data.name != name)
113 {
114 return false;
115 }
116
117 setIPData<dim>(values, ip_data_vector, accessor_field_from_ip_data);
118
119 return true;
120 }
121}
void setIPData(double const *values, std::vector< IPData > &ip_data_vector, Accessor const &accessor)

References ProcessLib::Reflection::ReflectionData< Class, Accessor >::accessor, is_raw_data_v, ProcessLib::Reflection::ReflectionData< Class, Accessor >::name, reflect(), reflectSetIPData(), and setIPData().

Referenced by reflectSetIPData().

Variable Documentation

◆ is_raw_data_v

template<typename T>
bool ProcessLib::Reflection::detail::is_raw_data_v = is_raw_data<T>::value
constexpr