Skip to content
Snippets Groups Projects
Commit 75f15a87 authored by Dmitri Naumov's avatar Dmitri Naumov
Browse files

Merge branch 'rm-constitutive-setting-step-2' into 'master'

Further RichardsMechanics refactoring

See merge request ogs/ogs!5012
parents e4070e80 d60ecfbb
No related branches found
No related tags found
No related merge requests found
...@@ -19,15 +19,18 @@ ...@@ -19,15 +19,18 @@
#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Porosity.h" #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Porosity.h"
#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Saturation.h" #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/Saturation.h"
#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/SolidCompressibilityData.h" #include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/SolidCompressibilityData.h"
#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveStress_StrainTemperature/SolidMechanics.h"
#include "SaturationSecantDerivative.h" #include "SaturationSecantDerivative.h"
#include "StiffnessTensor.h" #include "StiffnessTensor.h"
namespace ProcessLib::RichardsMechanics namespace ProcessLib::RichardsMechanics
{ {
// TODO directly declare these type aliases in Traits.h
/// Data whose state must be tracked by the TRM process. /// Data whose state must be tracked by the TRM process.
template <int DisplacementDim> template <int DisplacementDim>
using StatefulData = std::tuple<>; using StatefulData = std::tuple<
StrainData<DisplacementDim>,
ProcessLib::ThermoRichardsMechanics::ConstitutiveStress_StrainTemperature::
EffectiveStressData<DisplacementDim>>;
template <int DisplacementDim> template <int DisplacementDim>
using StatefulDataPrev = ProcessLib::ConstitutiveRelations::PrevStateOf< using StatefulDataPrev = ProcessLib::ConstitutiveRelations::PrevStateOf<
......
...@@ -32,20 +32,14 @@ struct IntegrationPointData final ...@@ -32,20 +32,14 @@ struct IntegrationPointData final
// Initialize current time step values // Initialize current time step values
static const int kelvin_vector_size = static const int kelvin_vector_size =
MathLib::KelvinVector::kelvin_vector_dimensions(DisplacementDim); MathLib::KelvinVector::kelvin_vector_dimensions(DisplacementDim);
sigma_eff.setZero(kelvin_vector_size);
sigma_sw.setZero(kelvin_vector_size); sigma_sw.setZero(kelvin_vector_size);
eps.setZero(kelvin_vector_size);
eps_m.setZero(kelvin_vector_size); eps_m.setZero(kelvin_vector_size);
// Previous time step values are not initialized and are set later. // Previous time step values are not initialized and are set later.
eps_prev.resize(kelvin_vector_size);
eps_m_prev.resize(kelvin_vector_size); eps_m_prev.resize(kelvin_vector_size);
sigma_eff_prev.resize(kelvin_vector_size);
} }
typename BMatricesType::KelvinVectorType sigma_eff, sigma_eff_prev;
typename BMatricesType::KelvinVectorType sigma_sw, sigma_sw_prev; typename BMatricesType::KelvinVectorType sigma_sw, sigma_sw_prev;
typename BMatricesType::KelvinVectorType eps, eps_prev;
typename BMatricesType::KelvinVectorType eps_m, eps_m_prev; typename BMatricesType::KelvinVectorType eps_m, eps_m_prev;
typename ShapeMatrixTypeDisplacement::NodalRowVectorType N_u; typename ShapeMatrixTypeDisplacement::NodalRowVectorType N_u;
...@@ -80,9 +74,7 @@ struct IntegrationPointData final ...@@ -80,9 +74,7 @@ struct IntegrationPointData final
void pushBackState() void pushBackState()
{ {
eps_prev = eps;
eps_m_prev = eps_m; eps_m_prev = eps_m;
sigma_eff_prev = sigma_eff;
sigma_sw_prev = sigma_sw; sigma_sw_prev = sigma_sw;
saturation_prev = saturation; saturation_prev = saturation;
saturation_m_prev = saturation_m; saturation_m_prev = saturation_m;
...@@ -134,12 +126,16 @@ struct IntegrationPointData final ...@@ -134,12 +126,16 @@ struct IntegrationPointData final
double const t, double const t,
ParameterLib::SpatialPosition const& x_position, ParameterLib::SpatialPosition const& x_position,
double const dt, double const dt,
double const temperature) double const temperature,
ProcessLib::ThermoRichardsMechanics::
ConstitutiveStress_StrainTemperature::EffectiveStressData<
DisplacementDim>& sigma_eff,
PrevState<ProcessLib::ThermoRichardsMechanics::
ConstitutiveStress_StrainTemperature::EffectiveStressData<
DisplacementDim>> const& sigma_eff_prev)
{ {
MaterialPropertyLib::VariableArray variable_array_prev; MaterialPropertyLib::VariableArray variable_array_prev;
variable_array_prev.stress variable_array_prev.stress = sigma_eff_prev->sigma_eff;
.emplace<MathLib::KelvinVector::KelvinVectorType<DisplacementDim>>(
sigma_eff_prev);
variable_array_prev.mechanical_strain variable_array_prev.mechanical_strain
.emplace<MathLib::KelvinVector::KelvinVectorType<DisplacementDim>>( .emplace<MathLib::KelvinVector::KelvinVectorType<DisplacementDim>>(
eps_m_prev); eps_m_prev);
...@@ -155,7 +151,8 @@ struct IntegrationPointData final ...@@ -155,7 +151,8 @@ struct IntegrationPointData final
} }
MathLib::KelvinVector::KelvinMatrixType<DisplacementDim> C; MathLib::KelvinVector::KelvinMatrixType<DisplacementDim> C;
std::tie(sigma_eff, material_state_variables, C) = std::move(*solution); std::tie(sigma_eff.sigma_eff, material_state_variables, C) =
std::move(*solution);
return C; return C;
} }
......
...@@ -10,9 +10,14 @@ ...@@ -10,9 +10,14 @@
#pragma once #pragma once
#include "ConstitutiveRelations/ConstitutiveData.h"
#include "MaterialLib/SolidModels/MechanicsBase.h" #include "MaterialLib/SolidModels/MechanicsBase.h"
#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
#include "NumLib/Extrapolation/ExtrapolatableElement.h" #include "NumLib/Extrapolation/ExtrapolatableElement.h"
#include "NumLib/Fem/Integration/GenericIntegrationMethod.h"
#include "ProcessLib/LocalAssemblerInterface.h" #include "ProcessLib/LocalAssemblerInterface.h"
#include "ProcessLib/ThermoRichardsMechanics/ConstitutiveCommon/MaterialState.h"
#include "RichardsMechanicsProcessData.h"
namespace ProcessLib namespace ProcessLib
{ {
...@@ -22,6 +27,41 @@ template <int DisplacementDim> ...@@ -22,6 +27,41 @@ template <int DisplacementDim>
struct LocalAssemblerInterface : public ProcessLib::LocalAssemblerInterface, struct LocalAssemblerInterface : public ProcessLib::LocalAssemblerInterface,
public NumLib::ExtrapolatableElement public NumLib::ExtrapolatableElement
{ {
LocalAssemblerInterface(
MeshLib::Element const& e,
NumLib::GenericIntegrationMethod const& integration_method,
bool const is_axially_symmetric,
RichardsMechanicsProcessData<DisplacementDim>& process_data)
: process_data_(process_data),
integration_method_(integration_method),
element_(e),
is_axially_symmetric_(is_axially_symmetric)
{
unsigned const n_integration_points =
integration_method_.getNumberOfPoints();
current_states_.resize(n_integration_points);
prev_states_.resize(n_integration_points);
output_data_.resize(n_integration_points);
material_states_.reserve(n_integration_points);
auto const& solid_material =
MaterialLib::Solids::selectSolidConstitutiveRelation(
process_data_.solid_materials, process_data_.material_ids,
e.getID());
for (unsigned ip = 0; ip < n_integration_points; ++ip)
{
material_states_.emplace_back(
solid_material.createMaterialStateVariables());
// Set initial strain field to zero.
std::get<StrainData<DisplacementDim>>(current_states_[ip]).eps =
KelvinVector<DisplacementDim>::Zero();
}
}
virtual std::size_t setIPDataInitialConditions( virtual std::size_t setIPDataInitialConditions(
std::string_view const name, double const* values, std::string_view const name, double const* values,
int const integration_order) = 0; int const integration_order) = 0;
...@@ -116,7 +156,19 @@ struct LocalAssemblerInterface : public ProcessLib::LocalAssemblerInterface, ...@@ -116,7 +156,19 @@ struct LocalAssemblerInterface : public ProcessLib::LocalAssemblerInterface,
virtual typename MaterialLib::Solids::MechanicsBase< virtual typename MaterialLib::Solids::MechanicsBase<
DisplacementDim>::MaterialStateVariables const& DisplacementDim>::MaterialStateVariables const&
getMaterialStateVariablesAt(unsigned /*integration_point*/) const = 0; getMaterialStateVariablesAt(unsigned /*integration_point*/) const = 0;
};
protected:
RichardsMechanicsProcessData<DisplacementDim>& process_data_;
NumLib::GenericIntegrationMethod const& integration_method_;
MeshLib::Element const& element_;
bool const is_axially_symmetric_;
std::vector<StatefulData<DisplacementDim>> current_states_;
std::vector<StatefulDataPrev<DisplacementDim>> prev_states_;
std::vector<
ProcessLib::ThermoRichardsMechanics::MaterialStateData<DisplacementDim>>
material_states_;
std::vector<OutputData<DisplacementDim>> output_data_;
};
} // namespace RichardsMechanics } // namespace RichardsMechanics
} // namespace ProcessLib } // namespace ProcessLib
This diff is collapsed.
...@@ -125,25 +125,29 @@ public: ...@@ -125,25 +125,29 @@ public:
void initializeConcrete() override void initializeConcrete() override
{ {
unsigned const n_integration_points = unsigned const n_integration_points =
_integration_method.getNumberOfPoints(); this->integration_method_.getNumberOfPoints();
for (unsigned ip = 0; ip < n_integration_points; ip++) for (unsigned ip = 0; ip < n_integration_points; ip++)
{ {
auto& SD = this->current_states_[ip];
auto& ip_data = _ip_data[ip]; auto& ip_data = _ip_data[ip];
ParameterLib::SpatialPosition const x_position{ ParameterLib::SpatialPosition const x_position{
std::nullopt, _element.getID(), ip, std::nullopt, this->element_.getID(), ip,
MathLib::Point3d( MathLib::Point3d(NumLib::interpolateCoordinates<
NumLib::interpolateCoordinates< ShapeFunctionDisplacement,
ShapeFunctionDisplacement, ShapeMatricesTypeDisplacement>(this->element_,
ShapeMatricesTypeDisplacement>(_element, ip_data.N_u))}; ip_data.N_u))};
/// Set initial stress from parameter. /// Set initial stress from parameter.
if (_process_data.initial_stress != nullptr) if (this->process_data_.initial_stress != nullptr)
{ {
ip_data.sigma_eff = std::get<ProcessLib::ThermoRichardsMechanics::
ConstitutiveStress_StrainTemperature::
EffectiveStressData<DisplacementDim>>(SD)
.sigma_eff =
MathLib::KelvinVector::symmetricTensorToKelvinVector< MathLib::KelvinVector::symmetricTensorToKelvinVector<
DisplacementDim>((*_process_data.initial_stress)( DisplacementDim>((*this->process_data_.initial_stress)(
std::numeric_limits< std::numeric_limits<
double>::quiet_NaN() /* time independent */, double>::quiet_NaN() /* time independent */,
x_position)); x_position));
...@@ -154,6 +158,8 @@ public: ...@@ -154,6 +158,8 @@ public:
t, x_position, *ip_data.material_state_variables); t, x_position, *ip_data.material_state_variables);
ip_data.pushBackState(); ip_data.pushBackState();
this->prev_states_[ip] = SD;
} }
} }
...@@ -163,12 +169,18 @@ public: ...@@ -163,12 +169,18 @@ public:
int const /*process_id*/) override int const /*process_id*/) override
{ {
unsigned const n_integration_points = unsigned const n_integration_points =
_integration_method.getNumberOfPoints(); this->integration_method_.getNumberOfPoints();
for (unsigned ip = 0; ip < n_integration_points; ip++) for (unsigned ip = 0; ip < n_integration_points; ip++)
{ {
_ip_data[ip].pushBackState(); _ip_data[ip].pushBackState();
} }
// TODO move to the local assembler interface
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
this->prev_states_[ip] = this->current_states_[ip];
}
} }
void computeSecondaryVariableConcrete( void computeSecondaryVariableConcrete(
...@@ -336,15 +348,12 @@ private: ...@@ -336,15 +348,12 @@ private:
MPL::VariableArray& variables, MPL::VariableArray& variables_prev, MPL::VariableArray& variables, MPL::VariableArray& variables_prev,
MPL::Medium const* const medium, TemperatureData const T_data, MPL::Medium const* const medium, TemperatureData const T_data,
CapillaryPressureData<DisplacementDim> const& p_cap_data, CapillaryPressureData<DisplacementDim> const& p_cap_data,
ConstitutiveData<DisplacementDim>& CD); ConstitutiveData<DisplacementDim>& CD,
StatefulData<DisplacementDim>& SD,
RichardsMechanicsProcessData<DisplacementDim>& _process_data; StatefulDataPrev<DisplacementDim> const& SD_prev);
std::vector<IpData, Eigen::aligned_allocator<IpData>> _ip_data; std::vector<IpData, Eigen::aligned_allocator<IpData>> _ip_data;
NumLib::GenericIntegrationMethod const& _integration_method;
MeshLib::Element const& _element;
bool const _is_axially_symmetric;
SecondaryData< SecondaryData<
typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType> typename ShapeMatricesTypeDisplacement::ShapeMatrices::ShapeType>
_secondary_data; _secondary_data;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment