14 #include <nlohmann/json.hpp>
24 namespace SmallDeformation
26 template <
int DisplacementDim>
30 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
31 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
32 unsigned const integration_order,
33 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>&&
37 :
Process(std::move(
name), mesh, std::move(jacobian_assembler), parameters,
38 integration_order, std::move(process_variables),
39 std::move(secondary_variables)),
40 _process_data(std::move(process_data))
49 MeshLib::getOrCreateMeshProperty<double>(
50 const_cast<MeshLib::Mesh&
>(mesh),
"principal_stress_vector_1",
54 MeshLib::getOrCreateMeshProperty<double>(
55 const_cast<MeshLib::Mesh&
>(mesh),
"principal_stress_vector_2",
59 MeshLib::getOrCreateMeshProperty<double>(
60 const_cast<MeshLib::Mesh&
>(mesh),
"principal_stress_vector_3",
64 MeshLib::getOrCreateMeshProperty<double>(
72 std::make_unique<IntegrationPointWriter>(
79 template <
int DisplacementDim>
85 template <
int DisplacementDim>
89 unsigned const integration_order)
98 auto add_secondary_variable = [&](std::string
const&
name,
99 int const num_components,
100 auto get_ip_values_function)
102 _secondary_variables.addSecondaryVariable(
106 std::move(get_ip_values_function)));
109 add_secondary_variable(
"free_energy_density",
111 &LocalAssemblerInterface::getIntPtFreeEnergyDensity);
113 add_secondary_variable(
"sigma",
115 DisplacementDim>::RowsAtCompileTime,
116 &LocalAssemblerInterface::getIntPtSigma);
118 add_secondary_variable(
"epsilon",
120 DisplacementDim>::RowsAtCompileTime,
121 &LocalAssemblerInterface::getIntPtEpsilon);
128 add_secondary_variable);
131 for (
auto const& ip_writer : _integration_point_writer)
134 auto const&
name = ip_writer->name();
139 auto const& mesh_property =
143 if (mesh_property.getMeshItemType() !=
152 if (ip_meta_data.n_components !=
153 mesh_property.getNumberOfGlobalComponents())
156 "Different number of components in meta data ({:d}) than in "
157 "the integration point field data for '{:s}': {:d}.",
158 ip_meta_data.n_components,
name,
159 mesh_property.getNumberOfGlobalComponents());
164 std::size_t position = 0;
165 for (
auto& local_asm : _local_assemblers)
167 std::size_t
const integration_points_read =
168 local_asm->setIPDataInitialConditions(
169 name, &mesh_property[position],
170 ip_meta_data.integration_order);
171 if (integration_points_read == 0)
174 "No integration points read in the integration point "
175 "initial conditions set function.");
177 position += integration_points_read * ip_meta_data.n_components;
184 *_local_to_global_index_map);
187 template <
int DisplacementDim>
189 const double t,
double const dt, std::vector<GlobalVector*>
const& x,
190 std::vector<GlobalVector*>
const& xdot,
int const process_id,
193 DBUG(
"Assemble SmallDeformationProcess.");
197 std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
198 dof_table = {std::ref(*_local_to_global_index_map)};
206 template <
int DisplacementDim>
209 const double t,
double const dt, std::vector<GlobalVector*>
const& x,
210 std::vector<GlobalVector*>
const& xdot,
const double dxdot_dx,
211 const double dx_dx,
int const process_id,
GlobalMatrix& M,
214 DBUG(
"AssembleWithJacobian SmallDeformationProcess.");
218 std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
219 dof_table = {std::ref(*_local_to_global_index_map)};
224 dxdot_dx, dx_dx, process_id, M, K, b, Jac);
227 *_nodal_forces, std::negate<double>());
230 template <
int DisplacementDim>
232 std::vector<GlobalVector*>
const& x,
const double t,
const double dt,
233 int const process_id)
235 DBUG(
"PostTimestep SmallDeformationProcess.");
236 std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
237 dof_tables.reserve(x.size());
238 std::generate_n(std::back_inserter(dof_tables), x.size(),
239 [&]() { return _local_to_global_index_map.get(); });
246 std::unique_ptr<GlobalVector> material_forces;
248 material_forces, _local_assemblers, *_local_to_global_index_map,
251 material_forces->copyValues(*_material_forces);
254 template <
int DisplacementDim>
256 double const t,
double const dt, std::vector<GlobalVector*>
const& x,
259 DBUG(
"Compute the secondary variables for SmallDeformationProcess.");
260 std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
261 dof_tables.reserve(x.size());
262 std::generate_n(std::back_inserter(dof_tables), x.size(),
263 [&]() { return _local_to_global_index_map.get(); });
void DBUG(char const *fmt, Args const &... args)
Global vector based on Eigen vector.
bool isAxiallySymmetric() const
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Properties & getProperties()
bool existsPropertyVector(std::string const &name) const
virtual void postTimestep(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, double const dt)
virtual void initialize(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
virtual void computeSecondaryVariable(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_dot, int const process_id)
std::vector< std::size_t > const & getActiveElementIDs() const
std::vector< std::unique_ptr< IntegrationPointWriter > > _integration_point_writer
Handles configuration of several secondary variables from the project file.
void assembleWithJacobian(std::size_t const mesh_item_id, LocalAssemblerInterface &local_assembler, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap >> const &dof_tables, const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, const double dxdot_dx, const double dx_dx, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac)
void assemble(std::size_t const mesh_item_id, LocalAssemblerInterface &local_assembler, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap >> const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b)
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
void transformVariableFromGlobalVector(GlobalVector const &input_vector, int const variable_id, NumLib::LocalToGlobalIndexMap const &local_to_global_index_map, MeshLib::PropertyVector< double > &output_vector, Functor mapFunction)
IntegrationPointMetaData getIntegrationPointMetaData(MeshLib::Mesh const &mesh, std::string const &name)
SecondaryVariableFunctions makeExtrapolator(const unsigned num_components, NumLib::Extrapolator &extrapolator, LocalAssemblerCollection const &local_assemblers, typename NumLib::ExtrapolatableLocalAssemblerCollection< LocalAssemblerCollection >::IntegrationPointValuesMethod integration_point_values_method)
static void executeSelectedMemberOnDereferenced(Method method, Container const &container, std::vector< std::size_t > const &active_container_ids, Args &&... args)
static void executeSelectedMemberDereferenced(Object &object, Method method, Container const &container, std::vector< std::size_t > const &active_container_ids, Args &&... args)
static void executeMemberOnDereferenced(Method method, Container const &container, Args &&... args)