36namespace SmallDeformation
38template <
typename ShapeFunction,
int DisplacementDim>
44 bool const is_axially_symmetric,
46 : _process_data(process_data),
47 _integration_method(integration_method),
49 _is_axially_symmetric(is_axially_symmetric)
51 unsigned const n_integration_points =
54 _ip_data.reserve(n_integration_points);
57 auto const shape_matrices =
59 DisplacementDim>(e, is_axially_symmetric,
65 for (
unsigned ip = 0; ip < n_integration_points; ip++)
67 _ip_data.emplace_back(solid_material);
69 auto const& sm = shape_matrices[ip];
71 ip_data.dNdx_u = sm.dNdx;
72 ip_data.integration_weight =
74 sm.integralMeasure * sm.detJ;
77 static const int kelvin_vector_size =
79 ip_data._sigma.setZero(kelvin_vector_size);
80 ip_data._eps.setZero(kelvin_vector_size);
83 ip_data._sigma_prev.resize(kelvin_vector_size);
84 ip_data._eps_prev.resize(kelvin_vector_size);
86 ip_data._C.resize(kelvin_vector_size, kelvin_vector_size);
92template <
typename ShapeFunction,
int DisplacementDim>
95 std::vector<double>
const& local_x,
96 std::vector<double>
const& ,
97 std::vector<double>& local_b_data,
98 std::vector<double>& local_Jac_data)
100 assert(_element.getDimension() == DisplacementDim);
102 auto const local_matrix_size = local_x.size();
104 auto local_Jac = MathLib::createZeroedMatrix<StiffnessMatrixType>(
105 local_Jac_data, local_matrix_size, local_matrix_size);
107 auto local_b = MathLib::createZeroedVector<NodalDisplacementVectorType>(
108 local_b_data, local_matrix_size);
110 unsigned const n_integration_points =
111 _integration_method.getNumberOfPoints();
118 auto const B_dil_bar = getDilatationalBBarMatrix();
120 for (
unsigned ip = 0; ip < n_integration_points; ip++)
123 auto const& w = _ip_data[ip].integration_weight;
125 auto const& N = _ip_data[ip].N_u;
126 auto const& dNdx = _ip_data[ip].dNdx_u;
128 NumLib::interpolateXCoordinate<ShapeFunction, ShapeMatricesType>(
134 this->_is_axially_symmetric);
136 auto const& eps_prev = _ip_data[ip]._eps_prev;
137 auto const& sigma_prev = _ip_data[ip]._sigma_prev;
139 auto& eps = _ip_data[ip]._eps;
140 auto& sigma = _ip_data[ip]._sigma;
141 auto& state = _ip_data[ip]._material_state_variables;
144 B * Eigen::Map<typename BMatricesType::NodalForceVectorType const>(
145 local_x.data(), ShapeFunction::NPOINTS * DisplacementDim);
156 variables_prev.
temperature = _process_data.reference_temperature;
158 auto&& solution = _ip_data[ip]._solid_material.integrateStress(
159 variables_prev, variables, t, x_position, dt, *state);
163 OGS_FATAL(
"Computation of local constitutive relation failed.");
167 std::tie(sigma, state, C) = std::move(*solution);
169 local_b.noalias() -= B.transpose() * sigma * w;
170 local_Jac.noalias() += B.transpose() * C * B * w;
174template <
typename ShapeFunction,
int DisplacementDim>
177 double const , Eigen::VectorXd
const& )
181 KV sigma_avg = KV::Zero();
182 auto const e_id = _element.getID();
184 unsigned const n_integration_points =
185 _integration_method.getNumberOfPoints();
186 for (
unsigned ip = 0; ip < n_integration_points; ip++)
188 sigma_avg += _ip_data[ip]._sigma;
190 sigma_avg /= n_integration_points;
193 &(*_process_data.element_stresses)[e_id * KV::RowsAtCompileTime]) =
197template <
typename ShapeFunction,
int DisplacementDim>
198std::vector<double>
const&
202 std::vector<GlobalVector*>
const& ,
203 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& ,
204 std::vector<double>& cache)
const
206 return ProcessLib::getIntegrationPointKelvinVectorData<DisplacementDim>(
207 _ip_data, &IntegrationPointDataType::_sigma, cache);
209template <
typename ShapeFunction,
int DisplacementDim>
210std::vector<double>
const&
214 std::vector<GlobalVector*>
const& ,
215 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& ,
216 std::vector<double>& cache)
const
218 return ProcessLib::getIntegrationPointKelvinVectorData<DisplacementDim>(
219 _ip_data, &IntegrationPointDataType::_eps, cache);
KelvinVector mechanical_strain
std::size_t getID() const
Returns the ID of the element.
MathLib::WeightedPoint const & getWeightedPoint(unsigned const igp) const
unsigned getNumberOfPoints() const
void setElementID(std::size_t element_id)
void setIntegrationPoint(unsigned integration_point)
MatrixType< _kelvin_vector_size, _number_of_dof > BMatrixType
auto & selectSolidConstitutiveRelation(SolidMaterialsMap const &constitutive_relations, MeshLib::PropertyVector< int > const *const material_ids, std::size_t const element_id)
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, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType
std::vector< typename ShapeMatricesType::ShapeMatrices, Eigen::aligned_allocator< typename ShapeMatricesType::ShapeMatrices > > initShapeMatrices(MeshLib::Element const &e, bool const is_axially_symmetric, IntegrationMethod const &integration_method)
BMatrixType computeBMatrixPossiblyWithBbar(DNDX_Type const &dNdx, N_Type const &N, std::optional< BBarMatrixType > const &B_dil_bar, const double radius, const bool is_axially_symmetric)
Fills a B matrix, or a B bar matrix if required.
std::vector< ShapeMatrixType, Eigen::aligned_allocator< ShapeMatrixType > > N