16template <
int dim,
typename IPData,
typename Accessor>
18 std::vector<IPData>& ip_data_vector,
19 Accessor
const& accessor)
21 using AccessorResult = std::invoke_result_t<Accessor, IPData&>;
22 using AccessorResultStripped = std::remove_cvref_t<AccessorResult>;
25 "This method only deals with raw data. The given "
26 "AccessorResultStripped is not raw data.");
30 auto const num_int_pts = ip_data_vector.size();
32 if constexpr (num_comp == 1)
35 for (
unsigned ip = 0; ip < num_int_pts; ++ip)
37 accessor(ip_data_vector[ip]) = values[ip];
43 constexpr auto num_cols =
45 constexpr auto kv_size =
48 auto const values_mat =
49 Eigen::Map<Eigen::Matrix<double, num_comp, Eigen::Dynamic,
50 Eigen::ColMajor>
const>(values, num_comp,
53 for (
unsigned ip = 0; ip < num_int_pts; ++ip)
55 if constexpr (num_cols == 1 || num_rows == 1)
58 if constexpr (num_comp == kv_size)
61 accessor(ip_data_vector[ip]) =
68 accessor(ip_data_vector[ip]) = values_mat.col(ip);
74 accessor(ip_data_vector[ip]) =
75 values_mat.col(ip).template reshaped<Eigen::RowMajor>(
84template <
int dim,
typename IPData,
typename Accessor_CurrentLevelFromIPData,
85 typename Class,
typename Accessor>
87 std::vector<IPData>& ip_data_vector,
88 Accessor_CurrentLevelFromIPData
const& accessor,
91 auto const accessor_next_level = refl_data.
accessor;
93 using MemberRef = std::invoke_result_t<Accessor, Class&>;
94 using Member = std::remove_cvref_t<MemberRef>;
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)); };
103 name, values, ip_data_vector, accessor_field_from_ip_data,
109 "The current member is not reflectable, so we "
110 "expect it to be raw data.");
112 if (refl_data.
name != name)
117 setIPData<dim>(values, ip_data_vector, accessor_field_from_ip_data);
123template <
int dim,
typename IPData,
typename Accessor_CurrentLevelFromIPData,
124 typename... Classes,
typename... Accessors, std::size_t... Idcs>
126 std::string_view
const name,
double const* values,
127 std::vector<IPData>& ip_data_vector,
128 Accessor_CurrentLevelFromIPData
const& accessor,
130 std::index_sequence<Idcs...>)
135 std::get<Idcs>(refl_data))) ||
139template <
int dim,
typename IPData,
typename Accessor_CurrentLevelFromIPData,
140 typename... Classes,
typename... Accessors>
142 std::string_view
const name,
double const* values,
143 std::vector<IPData>& ip_data_vector,
144 Accessor_CurrentLevelFromIPData
const& accessor,
148 name, values, ip_data_vector, accessor, refl_data,
149 std::make_index_sequence<
sizeof...(Classes)>{});
162template <
int dim,
typename IPData>
164 std::vector<IPData>& ip_data_vector)
167 name, values, ip_data_vector, std::identity{},
170 return ip_data_vector.size();
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)
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)
constexpr bool is_raw_data_v
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... >)
void setIPData(double const *values, std::vector< IPData > &ip_data_vector, Accessor const &accessor)
auto reflect(std::type_identity< std::tuple< Ts... > >)
std::size_t reflectSetIPData(std::string_view const name, double const *values, std::vector< IPData > &ip_data_vector)