Loading [MathJax]/extensions/MathMenu.js
OGS
ThermoMechanicsFEM.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <memory>
14#include <vector>
15
29
30namespace ProcessLib
31{
32namespace ThermoMechanics
33{
34namespace MPL = MaterialPropertyLib;
35
36template <typename BMatricesType, typename ShapeMatricesType,
37 int DisplacementDim>
39{
48
49 // total stress
50 typename BMatricesType::KelvinVectorType sigma, sigma_prev;
51
52 // total strain
53 typename BMatricesType::KelvinVectorType eps, eps_prev;
54
55 // mechanical strain
56 typename BMatricesType::KelvinVectorType eps_m, eps_m_prev;
57
59 std::unique_ptr<typename MaterialLib::Solids::MechanicsBase<
60 DisplacementDim>::MaterialStateVariables>
62
64 typename ShapeMatricesType::NodalRowVectorType N;
65 typename ShapeMatricesType::GlobalDimNodalMatrixType dNdx;
66
68 {
69 eps_prev = eps;
72 material_state_variables->pushBackState();
73 }
74
76};
77
80template <typename ShapeMatrixType>
82{
83 std::vector<ShapeMatrixType, Eigen::aligned_allocator<ShapeMatrixType>> N;
84};
85
126template <typename ShapeFunction, int DisplacementDim>
128 : public ThermoMechanicsLocalAssemblerInterface<DisplacementDim>
129{
130public:
133
134 // Types for displacement.
135 // (Higher order elements = ShapeFunction).
139
140 static int const KelvinVectorSize =
143
145 using RhsVector = typename ShapeMatricesType::template VectorType<
146 ShapeFunction::NPOINTS + ShapeFunction::NPOINTS * DisplacementDim>;
147 using JacobianMatrix = typename ShapeMatricesType::template MatrixType<
148 ShapeFunction::NPOINTS + ShapeFunction::NPOINTS * DisplacementDim,
149 ShapeFunction::NPOINTS + ShapeFunction::NPOINTS * DisplacementDim>;
150 using IpData =
152
154 delete;
156
158 MeshLib::Element const& e,
159 std::size_t const /*local_matrix_size*/,
160 NumLib::GenericIntegrationMethod const& integration_method,
161 bool const is_axially_symmetric,
163
165 std::size_t setIPDataInitialConditions(
166 std::string_view const name,
167 double const* values,
168 int const integration_order) override;
169
170 void assemble(double const /*t*/, double const /*dt*/,
171 std::vector<double> const& /*local_x*/,
172 std::vector<double> const& /*local_x_prev*/,
173 std::vector<double>& /*local_M_data*/,
174 std::vector<double>& /*local_K_data*/,
175 std::vector<double>& /*local_rhs_data*/) override
176 {
177 OGS_FATAL(
178 "ThermoMechanicsLocalAssembler: assembly without jacobian is not "
179 "implemented.");
180 }
181
183 double const t, double const dt, Eigen::VectorXd const& local_x,
184 Eigen::VectorXd const& local_x_prev, int const process_id,
185 std::vector<double>& local_b_data,
186 std::vector<double>& local_Jac_data) override;
187
188 void assembleWithJacobian(double const t, double const dt,
189 std::vector<double> const& local_x,
190 std::vector<double> const& local_x_prev,
191 std::vector<double>& local_rhs_data,
192 std::vector<double>& local_Jac_data) override;
193
194 void initializeConcrete() override
195 {
196 unsigned const n_integration_points =
198 for (unsigned ip = 0; ip < n_integration_points; ip++)
199 {
200 auto& ip_data = _ip_data[ip];
201
202 ParameterLib::SpatialPosition const x_position{
203 std::nullopt, _element.getID(),
205 NumLib::interpolateCoordinates<ShapeFunction,
207 _element, ip_data.N))};
208
210 if (_process_data.initial_stress != nullptr)
211 {
212 ip_data.sigma =
214 DisplacementDim>((*_process_data.initial_stress)(
215 std::numeric_limits<
216 double>::quiet_NaN() /* time independent */,
217 x_position));
218 }
219
220 double const t = 0; // TODO (naumov) pass t from top
221 ip_data.solid_material.initializeInternalStateVariables(
222 t, x_position, *ip_data.material_state_variables);
223
224 ip_data.pushBackState();
225 }
226 }
227
228 void setInitialConditionsConcrete(Eigen::VectorXd const local_x,
229 double const t,
230 int const process_id) override;
231
232 void postTimestepConcrete(Eigen::VectorXd const& /*local_x*/,
233 Eigen::VectorXd const& /*local_x_prev*/,
234 double const /*t*/, double const /*dt*/,
235 int const /*process_id*/) override
236 {
237 unsigned const n_integration_points =
239
240 for (unsigned ip = 0; ip < n_integration_points; ip++)
241 {
242 _ip_data[ip].pushBackState();
243 }
244 }
245
246 Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
247 const unsigned integration_point) const override
248 {
249 auto const& N = _secondary_data.N[integration_point];
250
251 // assumes N is stored contiguously in memory
252 return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size());
253 }
254
255private:
279 const double t, double const dt, Eigen::VectorXd const& local_x,
280 Eigen::VectorXd const& local_x_prev, std::vector<double>& local_b_data,
281 std::vector<double>& local_Jac_data);
282
304 const double t, double const dt, Eigen::VectorXd const& local_x,
305 Eigen::VectorXd const& local_x_prev, std::vector<double>& local_b_data,
306 std::vector<double>& local_Jac_data);
307
308 std::size_t setSigma(double const* values);
309
310 // TODO (naumov) This method is same as getIntPtSigma but for arguments and
311 // the ordering of the cache_mat.
312 // There should be only one.
313 std::vector<double> getSigma() const override;
314
315 std::vector<double> const& getIntPtSigma(
316 const double t,
317 std::vector<GlobalVector*> const& x,
318 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
319 std::vector<double>& cache) const override;
320
321 std::size_t setEpsilon(double const* values);
322
323 std::vector<double> getEpsilon() const override;
324
325 std::vector<double> const& getIntPtEpsilon(
326 const double t,
327 std::vector<GlobalVector*> const& x,
328 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
329 std::vector<double>& cache) const override;
330
331 std::vector<double> const& getIntPtEpsilonMechanical(
332 const double t,
333 std::vector<GlobalVector*> const& x,
334 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
335 std::vector<double>& cache) const override;
336
337 std::size_t setEpsilonMechanical(double const* values);
338
339 std::vector<double> getEpsilonMechanical() const override;
340
341 unsigned getNumberOfIntegrationPoints() const override;
342
343 int getMaterialID() const override;
344
346 DisplacementDim>::MaterialStateVariables const&
347 getMaterialStateVariablesAt(unsigned integration_point) const override;
348
349private:
351
352 std::vector<IpData, Eigen::aligned_allocator<IpData>> _ip_data;
353
358
359 static const int temperature_index = 0;
360 static const int temperature_size = ShapeFunction::NPOINTS;
361 static const int displacement_index = ShapeFunction::NPOINTS;
362 static const int displacement_size =
363 ShapeFunction::NPOINTS * DisplacementDim;
364};
365
366} // namespace ThermoMechanics
367} // namespace ProcessLib
368
#define OGS_FATAL(...)
Definition Error.h:26
std::size_t getID() const
Returns the ID of the element.
Definition Element.h:91
VectorType< _number_of_dof > NodalForceVectorType
Rhs residual.
std::vector< double > const & getIntPtEpsilonMechanical(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
typename BMatricesType::NodalForceVectorType NodalForceVectorType
SecondaryData< typename ShapeMatrices::ShapeType > _secondary_data
std::size_t setIPDataInitialConditions(std::string_view const name, double const *values, int const integration_order) override
Returns number of read integration points.
typename ShapeMatricesType::template MatrixType< ShapeFunction::NPOINTS+ShapeFunction::NPOINTS *DisplacementDim, ShapeFunction::NPOINTS+ShapeFunction::NPOINTS *DisplacementDim > JacobianMatrix
std::vector< double > const & getIntPtSigma(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
void postTimestepConcrete(Eigen::VectorXd const &, Eigen::VectorXd const &, double const, double const, int const) override
ThermoMechanicsLocalAssembler(ThermoMechanicsLocalAssembler const &)=delete
MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables const & getMaterialStateVariablesAt(unsigned integration_point) const override
typename ShapeMatricesType::template VectorType< ShapeFunction::NPOINTS+ShapeFunction::NPOINTS *DisplacementDim > RhsVector
Eigen::Map< const Eigen::RowVectorXd > getShapeMatrix(const unsigned integration_point) const override
Provides the shape matrix at the given integration point.
ThermoMechanicsProcessData< DisplacementDim > & _process_data
NumLib::GenericIntegrationMethod const & _integration_method
void assembleWithJacobianForHeatConductionEquations(const double t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
void assembleWithJacobianForDeformationEquations(const double t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)
void assembleWithJacobianForStaggeredScheme(double const t, double const dt, Eigen::VectorXd const &local_x, Eigen::VectorXd const &local_x_prev, int const process_id, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data) override
void assemble(double const, double const, std::vector< double > const &, std::vector< double > const &, std::vector< double > &, std::vector< double > &, std::vector< double > &) override
typename ShapeMatricesType::ShapeMatrices ShapeMatrices
typename ShapeMatricesType::GlobalDimMatrixType GlobalDimMatrixType
ThermoMechanicsLocalAssembler(ThermoMechanicsLocalAssembler &&)=delete
std::vector< IpData, Eigen::aligned_allocator< IpData > > _ip_data
void setInitialConditionsConcrete(Eigen::VectorXd const local_x, double const t, int const process_id) override
std::vector< double > const & getIntPtEpsilon(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const override
void assembleWithJacobian(double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_rhs_data, std::vector< double > &local_Jac_data) override
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)
std::array< double, 3 > interpolateCoordinates(MeshLib::Element const &e, typename ShapeMatricesType::ShapeMatrices::ShapeType const &N)
NumLib::ShapeMatrices< NodalRowVectorType, DimNodalMatrixType, DimMatrixType, GlobalDimNodalMatrixType > ShapeMatrices
MatrixType< GlobalDim, GlobalDim > GlobalDimMatrixType
MaterialLib::Solids::MechanicsBase< DisplacementDim > const & solid_material
ShapeMatricesType::NodalRowVectorType N
std::unique_ptr< typename MaterialLib::Solids::MechanicsBase< DisplacementDim >::MaterialStateVariables > material_state_variables
ShapeMatricesType::GlobalDimNodalMatrixType dNdx
IntegrationPointData(MaterialLib::Solids::MechanicsBase< DisplacementDim > const &solid_material)
std::vector< ShapeMatrixType, Eigen::aligned_allocator< ShapeMatrixType > > N