20 template <
typename LocalAssemblerInterface,
21 typename AddSecondaryVariableCallback,
int DisplacementDim>
24 DisplacementDim>>>
const& solid_materials,
25 AddSecondaryVariableCallback
const& add_secondary_variable)
29 DisplacementDim>::InternalVariable>
31 for (
auto const& material_id__solid_material : solid_materials)
33 auto const variables =
35 copy(begin(variables), end(variables),
36 back_inserter(internal_variables));
40 for (
auto const& internal_variable : internal_variables)
42 auto const&
name = internal_variable.name;
43 auto const& fct = internal_variable.getter;
44 auto const num_components = internal_variable.num_components;
45 DBUG(
"Registering internal variable {:s}.",
name);
48 [fct, num_components](
51 std::vector<GlobalVector*>
const& ,
54 std::vector<double>& cache) -> std::vector<double>
const& {
55 const unsigned num_int_pts = loc_asm.getNumberOfIntegrationPoints();
59 double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>(
60 cache, num_components, num_int_pts);
63 std::vector<double> cache_column(num_int_pts);
65 for (
unsigned i = 0; i < num_int_pts; ++i)
67 auto const& state = loc_asm.getMaterialStateVariablesAt(i);
69 auto const& int_pt_values = fct(state, cache_column);
70 assert(int_pt_values.size() ==
71 static_cast<std::size_t
>(num_components));
74 cache_mat.col(i).noalias() = int_pt_values_vec;
80 add_secondary_variable(
name, num_components, std::move(getIntPtValues));
88 DisplacementDim>>>
const& solid_materials,
89 std::vector<std::unique_ptr<LocalAssemblerInterface>>
const&
91 std::vector<std::unique_ptr<IntegrationPointWriter>>&
92 integration_point_writer,
93 int const integration_order)
97 DisplacementDim>::InternalVariable>
99 for (
auto const& solid_material : solid_materials)
102 copy(begin(ivs), end(ivs), back_inserter(internal_variables));
106 for (
auto const& iv : internal_variables)
108 DBUG(
"Creating integration point writer for internal variable {:s}.",
111 integration_point_writer.emplace_back(
112 std::make_unique<IntegrationPointWriter>(
113 "material_state_variable_" + iv.name +
"_ip", iv.num_components,
114 integration_order, local_assemblers,
115 &LocalAssemblerInterface::getMaterialStateVariableInternalState,
116 iv.reference, iv.num_components));
void DBUG(char const *fmt, Args const &... args)
void copy(PETScVector const &x, PETScVector &y)
Eigen::Map< const Vector > toVector(std::vector< double > const &data, Eigen::VectorXd::Index size)
Creates an Eigen mapped vector from the given data vector.
Eigen::Map< Matrix > createZeroedMatrix(std::vector< double > &data, Eigen::MatrixXd::Index rows, Eigen::MatrixXd::Index cols)
virtual std::vector< InternalVariable > getInternalVariables() const