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<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 377 of file ReflectionIPData.h.

381{
382 forEachReflectedFlattenedIPDataAccessor<Dim>(
383 callback, reflection_data, accessor_ip_data_vec_in_loc_asm,
384 std::identity{});
385}

◆ 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 325 of file ReflectionIPData.h.

330{
331 boost::mp11::tuple_for_each(
332 reflection_data,
333 [&accessor_ip_data_vec_in_loc_asm,
334 &accessor_current_level_from_ip_data_vec_element,
335 &callback]<typename Class, typename Accessor>(
336 ReflectionData<Class, Accessor> const& refl_data)
337 {
338 using MemberRef = std::invoke_result_t<Accessor, Class const&>;
339 using Member = std::remove_cvref_t<MemberRef>;
340
341 auto accessor_member_from_ip_data_vec_element =
342 [accessor_next_level = refl_data.accessor,
343 accessor_current_level_from_ip_data_vec_element](
344 auto const& ip_data_vec_element) -> Member const&
345 {
346 return accessor_next_level(
347 accessor_current_level_from_ip_data_vec_element(
348 ip_data_vec_element));
349 };
350
351 if constexpr (is_reflectable<Member>)
352 {
353 forEachReflectedFlattenedIPDataAccessor<Dim>(
354 callback, detail::reflect(std::type_identity<Member>{}),
355 accessor_ip_data_vec_in_loc_asm,
356 accessor_member_from_ip_data_vec_element);
357 }
358 else
359 {
360 static_assert(is_raw_data<Member>::value,
361 "The current member is not reflectable, so we "
362 "expect it to be raw data.");
363
364 constexpr unsigned num_comp = NumberOfComponents<Member>::value;
365
366 callback(refl_data.name, num_comp,
367 getFlattenedIPDataFromLocAsm<Dim>(
368 accessor_ip_data_vec_in_loc_asm,
369 accessor_member_from_ip_data_vec_element));
370 }
371 });
372}

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

◆ 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 303 of file ReflectionIPData.h.

305{
306 return getFlattenedIPDataFromLocAsm<Dim>(
307 std::forward<Accessor_IPDataVecInLocAsm>(
308 accessor_ip_data_vec_in_loc_asm),
309 std::identity{});
310}

◆ 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 288 of file ReflectionIPData.h.

292{
293 return {std::forward<Accessor_IPDataVecInLocAsm>(
294 accessor_ip_data_vec_in_loc_asm),
295 std::forward<Accessor_CurrentLevelFromIPDataVecElement>(
296 accessor_current_level_from_ip_data_vec_element)};
297}

◆ reflect() [1/2]

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

Definition at line 26 of file ReflectionIPData.h.

27{
28 using namespace boost::mp11;
29
30 // The types Ts... must be unique. Duplicate types are incompatible with the
31 // concept of "reflected" I/O: they would lead to duplicate names for the
32 // I/O data.
33 static_assert(mp_is_set<mp_list<Ts...>>::value);
34
35 return reflectWithoutName<std::tuple<Ts...>>(
36 [](auto& tuple_) -> auto& { return std::get<Ts>(tuple_); }...);
37}
auto reflectWithoutName(Accessors &&... accessors)

References ProcessLib::Reflection::reflectWithoutName().

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

◆ reflect() [2/2]

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

Definition at line 40 of file ReflectionIPData.h.

41{
42 return T::reflect();
43}

◆ 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 148 of file ReflectionSetIPData.h.

153{
154 return reflectSetIPData<dim>(
155 name, values, ip_data_vector, accessor, refl_data,
156 std::make_index_sequence<sizeof...(Classes)>{});
157}

◆ 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 132 of file ReflectionSetIPData.h.

138{
139 // uses short-circuit evaluation of the fold || ... to stop after the first
140 // match
141 return ((setIPDataIfNameMatches<dim>(name, values, ip_data_vector, accessor,
142 std::get<Idcs>(refl_data))) ||
143 ...);
144}

◆ 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 24 of file ReflectionSetIPData.h.

27{
28 using AccessorResult = std::invoke_result_t<Accessor, IPData&>;
29 using AccessorResultStripped = std::remove_cvref_t<AccessorResult>;
30
31 static_assert(is_raw_data_v<AccessorResultStripped>,
32 "This method only deals with raw data. The given "
33 "AccessorResultStripped is not raw data.");
34
36
37 auto const num_int_pts = ip_data_vector.size();
38
39 if constexpr (num_comp == 1)
40 {
41 // scalar
42 for (unsigned ip = 0; ip < num_int_pts; ++ip)
43 {
44 accessor(ip_data_vector[ip]) = values[ip];
45 }
46 }
47 else
48 {
49 constexpr auto num_rows = NumberOfRows<AccessorResultStripped>::value;
50 constexpr auto num_cols =
51 NumberOfColumns<AccessorResultStripped>::value;
52 constexpr auto kv_size =
54
55 auto const values_mat =
56 Eigen::Map<Eigen::Matrix<double, num_comp, Eigen::Dynamic,
57 Eigen::ColMajor> const>(values, num_comp,
58 num_int_pts);
59
60 for (unsigned ip = 0; ip < num_int_pts; ++ip)
61 {
62 if constexpr (num_cols == 1 || num_rows == 1)
63 {
64 // vector
65 if constexpr (num_comp == kv_size)
66 {
67 // Kelvin vector
68 accessor(ip_data_vector[ip]) =
70 values_mat.col(ip));
71 }
72 else
73 {
74 // other vector
75 accessor(ip_data_vector[ip]) = values_mat.col(ip);
76 }
77 }
78 else
79 {
80 // matrix
81 accessor(ip_data_vector[ip]) =
82 values_mat.col(ip).template reshaped<Eigen::RowMajor>(
83 num_rows, num_cols);
84 }
85 }
86 }
87}
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 MathLib::KelvinVector::kelvin_vector_dimensions(), and MathLib::KelvinVector::symmetricTensorToKelvinVector().

◆ 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 93 of file ReflectionSetIPData.h.

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

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

Variable Documentation

◆ is_raw_data_v

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

Definition at line 80 of file ReflectionIPData.h.