16template <
int DisplacementDim,
typename IntegrationPointDataVector,
17 typename IpData,
typename MemberType>
19 IntegrationPointDataVector
const& ip_data_vector,
20 MemberType IpData::*
const member, std::vector<double>& cache)
24 [member](IpData
const& ip_data) ->
auto const&
25 {
return ip_data.*member; },
29template <
int DisplacementDim,
typename IntegrationPointDataVector,
32 IntegrationPointDataVector
const& ip_data_vector, Accessor&& accessor,
33 std::vector<double>& cache)
35 using AccessorResult =
decltype(std::declval<Accessor>()(
36 std::declval<IntegrationPointDataVector>()[0]));
37 static_assert(std::is_lvalue_reference_v<AccessorResult>,
38 "The ip data accessor should return a reference. This check "
39 "prevents accidental copies.");
41 auto const n_integration_points = ip_data_vector.size();
42 constexpr int size = DisplacementDim * DisplacementDim;
46 Eigen::Matrix<double, size, Eigen::Dynamic, Eigen::RowMajor>>(
47 cache, size, n_integration_points);
49 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
51 auto const& dim_matix = accessor(ip_data_vector[ip]);
52 cache_mat.col(ip) = dim_matix.template reshaped<Eigen::RowMajor>();
58template <
int DisplacementDim,
typename IntegrationPointDataVector,
59 typename IpData,
typename MemberType>
61 IntegrationPointDataVector
const& ip_data_vector,
62 MemberType IpData::*
const member, std::vector<double>& cache)
66 [member](IpData
const& ip_data) ->
auto const&
67 {
return ip_data.*member; },
71template <
int DisplacementDim,
typename IntegrationPointDataVector,
74 IntegrationPointDataVector
const& ip_data_vector, Accessor&& accessor,
75 std::vector<double>& cache)
77 using AccessorResult =
decltype(std::declval<Accessor>()(
78 std::declval<IntegrationPointDataVector>()[0]));
79 static_assert(std::is_lvalue_reference_v<AccessorResult>,
80 "The ip data accessor should return a reference. This check "
81 "prevents accidental copies.");
83 constexpr int kelvin_vector_size =
85 auto const n_integration_points = ip_data_vector.size();
89 double, kelvin_vector_size, Eigen::Dynamic, Eigen::RowMajor>>(
90 cache, kelvin_vector_size, n_integration_points);
92 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
94 auto const& kelvin_vector = accessor(ip_data_vector[ip]);
106template <
int DisplacementDim,
typename IntegrationPointDataVector,
109 IntegrationPointDataVector
const& ip_data_vector, MemberType member)
111 constexpr int kelvin_vector_size =
115 [&](std::vector<double>& values)
118 ip_data_vector, member, values);
123template <
int DisplacementDim,
typename IntegrationPointDataVector,
124 typename IpData,
typename MemberType>
126 double const* values,
127 IntegrationPointDataVector& ip_data_vector,
128 MemberType IpData::*
const member)
131 values, ip_data_vector,
132 [member](IpData& ip_data) ->
auto& {
return ip_data.*member; });
135template <
int DisplacementDim,
typename IntegrationPointDataVector,
138 double const* values,
139 IntegrationPointDataVector& ip_data_vector,
142 using AccessorResult =
decltype(std::declval<Accessor>()(
143 std::declval<IntegrationPointDataVector>()[0]));
144 static_assert(std::is_lvalue_reference_v<AccessorResult>,
145 "The ip data accessor must return a reference.");
147 constexpr int kelvin_vector_size =
149 auto const n_integration_points = ip_data_vector.size();
151 auto kelvin_vector_values =
152 Eigen::Map<Eigen::Matrix<double, kelvin_vector_size, Eigen::Dynamic,
153 Eigen::ColMajor>
const>(
154 values, kelvin_vector_size, n_integration_points);
156 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
158 accessor(ip_data_vector[ip]) =
160 kelvin_vector_values.col(ip));
163 return n_integration_points;
166template <
typename IntegrationPointDataVector,
typename IpData,
169 IntegrationPointDataVector
const& ip_data_vector,
170 MemberType IpData::*
const member, std::vector<double>& cache)
174 [member](IpData
const& ip_data) ->
auto const&
175 {
return ip_data.*member; },
179template <
typename IntegrationPo
intDataVector,
typename Accessor>
181 IntegrationPointDataVector
const& ip_data_vector, Accessor&& accessor,
182 std::vector<double>& cache)
184 using AccessorResult =
decltype(std::declval<Accessor>()(
185 std::declval<IntegrationPointDataVector>()[0]));
186 static_assert(std::is_lvalue_reference_v<AccessorResult>,
187 "The ip data accessor should return a reference. This check "
188 "prevents accidental copies.");
190 auto const n_integration_points = ip_data_vector.size();
194 Eigen::Matrix<double, 1, Eigen::Dynamic, Eigen::RowMajor>>(
195 cache, 1, n_integration_points);
197 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
199 cache_mat[ip] = accessor(ip_data_vector[ip]);
205template <
typename IntegrationPointDataVector,
typename IpData,
208 double const* values,
209 IntegrationPointDataVector& ip_data_vector,
210 MemberType IpData::*
const member)
213 [member](IpData& ip_data) ->
auto&
214 {
return ip_data.*member; });
217template <
typename IntegrationPo
intDataVector,
typename Accessor>
219 double const* values,
220 IntegrationPointDataVector& ip_data_vector,
223 using AccessorResult =
decltype(std::declval<Accessor>()(
224 std::declval<IntegrationPointDataVector>()[0]));
225 static_assert(std::is_lvalue_reference_v<AccessorResult>,
226 "The ip data accessor must return a reference.");
228 auto const n_integration_points = ip_data_vector.size();
230 for (
unsigned ip = 0; ip < n_integration_points; ++ip)
232 accessor(ip_data_vector[ip]) = values[ip];
234 return n_integration_points;
237template <
typename IntegrationPointDataVector,
typename MemberType,
238 typename MaterialStateVariables>
240 IntegrationPointDataVector
const& ip_data_vector,
242 std::function<std::span<double>(MaterialStateVariables&)>
244 int const n_components)
246 std::vector<double> result;
247 result.reserve(ip_data_vector.size() * n_components);
249 for (
auto& ip_data : ip_data_vector)
251 auto const values_span = get_values_span(*(ip_data.*member));
252 assert(values_span.size() ==
static_cast<std::size_t
>(n_components));
254 result.insert(end(result), values_span.begin(), values_span.end());
260template <
typename IntegrationPointDataVector,
typename MemberType,
261 typename MaterialStateVariables>
263 double const* values,
264 IntegrationPointDataVector& ip_data_vector,
266 std::function<std::span<double>(MaterialStateVariables&)>
269 auto const n_integration_points = ip_data_vector.size();
271 std::size_t position = 0;
272 for (
auto const& ip_data : ip_data_vector)
274 auto const values_span = get_values_span(*(ip_data.*member));
275 std::copy_n(values + position, values_span.size(), values_span.begin());
276 position += values_span.size();
278 return n_integration_points;
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
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)
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
std::vector< double > const & getIntegrationPointScalarData(IntegrationPointDataVector const &ip_data_vector, MemberType IpData::*const member, std::vector< double > &cache)
std::size_t setIntegrationPointDataMaterialStateVariables(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType member, std::function< std::span< double >(MaterialStateVariables &)> get_values_span)
std::vector< double > transposeInPlace(StoreValuesFunction const &store_values_function)
std::vector< double > getIntegrationPointDataMaterialStateVariables(IntegrationPointDataVector const &ip_data_vector, MemberType member, std::function< std::span< double >(MaterialStateVariables &)> get_values_span, int const n_components)
std::vector< double > const & getIntegrationPointDimMatrixData(IntegrationPointDataVector const &ip_data_vector, MemberType IpData::*const member, std::vector< double > &cache)
std::vector< double > const & getIntegrationPointKelvinVectorData(IntegrationPointDataVector const &ip_data_vector, MemberType IpData::*const member, std::vector< double > &cache)
std::size_t setIntegrationPointKelvinVectorData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)
std::size_t setIntegrationPointScalarData(double const *values, IntegrationPointDataVector &ip_data_vector, MemberType IpData::*const member)