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

[PL] PF; MaterialIDs based solid models.

parent 070f1fe4
No related branches found
No related tags found
No related merge requests found
......@@ -11,9 +11,10 @@
#include <cassert>
#include "MaterialLib/SolidModels/CreateLinearElasticIsotropic.h"
#include "MaterialLib/SolidModels/LinearElasticIsotropicPhaseField.h"
#include "MaterialLib/SolidModels/CreateConstitutiveRelation.h"
#include "MaterialLib/SolidModels/MechanicsBase.h"
#include "ProcessLib/Output/CreateSecondaryVariables.h"
#include "ProcessLib/Utils/ProcessUtils.h"
#include "PhaseFieldProcess.h"
#include "PhaseFieldProcessData.h"
......@@ -99,40 +100,14 @@ std::unique_ptr<Process> createPhaseFieldProcess(
variable_ph->getNumberOfComponents());
}
// Constitutive relation.
// read type;
auto const constitutive_relation_config =
//! \ogs_file_param{prj__processes__process__PHASE_FIELD__constitutive_relation}
config.getConfigSubtree("constitutive_relation");
auto solid_constitutive_relations =
MaterialLib::Solids::createConstitutiveRelations<DisplacementDim>(
parameters, config);
auto const phasefield_parameters_config =
//! \ogs_file_param{prj__processes__process__PHASE_FIELD__phasefield_parameters}
config.getConfigSubtree("phasefield_parameters");
auto const type =
//! \ogs_file_param{prj__processes__process__PHASE_FIELD__constitutive_relation__type}
constitutive_relation_config.peekConfigParameter<std::string>("type");
std::unique_ptr<MaterialLib::Solids::PhaseFieldExtension<DisplacementDim>>
material = nullptr;
if (type == "LinearElasticIsotropic")
{
const bool skip_type_checking = false;
auto elastic_model =
MaterialLib::Solids::createLinearElasticIsotropic<DisplacementDim>(
parameters, constitutive_relation_config, skip_type_checking);
material = std::make_unique<
MaterialLib::Solids::LinearElasticIsotropicPhaseField<
DisplacementDim>>(
std::move(elastic_model->getMaterialProperties()));
}
else
{
OGS_FATAL(
"Cannot construct constitutive relation of given type \'%s\'.",
type.c_str());
}
// Residual stiffness
auto& residual_stiffness = findParameter<double>(
phasefield_parameters_config,
......@@ -212,9 +187,11 @@ std::unique_ptr<Process> createPhaseFieldProcess(
((*crack_scheme == "propagating") || (*crack_scheme == "static")));
PhaseFieldProcessData<DisplacementDim> process_data{
std::move(material), residual_stiffness, crack_resistance,
crack_length_scale, kinetic_coefficient, solid_density,
history_field, specific_body_force, propagating_crack,
materialIDs(mesh), std::move(solid_constitutive_relations),
residual_stiffness, crack_resistance,
crack_length_scale, kinetic_coefficient,
solid_density, history_field,
specific_body_force, propagating_crack,
crack_pressure};
SecondaryVariableCollection secondary_variables;
......
......@@ -12,7 +12,9 @@
#include <memory>
#include <vector>
#include "MaterialLib/SolidModels/PhaseFieldExtension.h"
#include "MaterialLib/SolidModels/LinearElasticIsotropic.h"
#include "MaterialLib/SolidModels/LinearElasticIsotropicPhaseField.h"
#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
#include "MathLib/LinAlg/Eigen/EigenMapTools.h"
#include "NumLib/Fem/FiniteElement/TemplateIsoparametric.h"
#include "NumLib/Fem/ShapeMatrixPolicy.h"
......@@ -126,6 +128,19 @@ public:
_ip_data.reserve(n_integration_points);
_secondary_data.N.resize(n_integration_points);
auto& solid_material =
MaterialLib::Solids::selectSolidConstitutiveRelation(
_process_data.solid_materials,
_process_data.material_ids,
e.getID());
if (!dynamic_cast<MaterialLib::Solids::LinearElasticIsotropic<
DisplacementDim> const*>(&solid_material))
{
OGS_FATAL(
"For phasefield process only linear elastic solid material "
"support is implemented.");
}
auto const shape_matrices =
initShapeMatrices<ShapeFunction, ShapeMatricesType,
IntegrationMethod, DisplacementDim>(
......@@ -136,8 +151,7 @@ public:
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
// displacement (subscript u)
_ip_data.emplace_back(*_process_data.material);
_ip_data.emplace_back(solid_material);
auto& ip_data = _ip_data[ip];
ip_data.integration_weight =
_integration_method.getWeightedPoint(ip).getWeight() *
......
......@@ -33,8 +33,11 @@ template <int DisplacementDim>
struct PhaseFieldProcessData
{
PhaseFieldProcessData(
std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>&&
material_,
MeshLib::PropertyVector<int> const* const material_ids_,
std::map<int,
std::unique_ptr<
MaterialLib::Solids::MechanicsBase<DisplacementDim>>>&&
solid_materials_,
Parameter<double> const& residual_stiffness_,
Parameter<double> const& crack_resistance_,
Parameter<double> const& crack_length_scale_,
......@@ -42,8 +45,10 @@ struct PhaseFieldProcessData
Parameter<double> const& solid_density_,
Parameter<double>& history_field_,
Eigen::Matrix<double, DisplacementDim, 1> const& specific_body_force_,
bool propagating_crack_, bool crack_pressure_)
: material{std::move(material_)},
bool const propagating_crack_,
bool const crack_pressure_)
: material_ids(material_ids_),
solid_materials{std::move(solid_materials_)},
residual_stiffness(residual_stiffness_),
crack_resistance(crack_resistance_),
crack_length_scale(crack_length_scale_),
......@@ -56,21 +61,7 @@ struct PhaseFieldProcessData
{
}
PhaseFieldProcessData(PhaseFieldProcessData&& other)
: material{std::move(other.material)},
residual_stiffness(other.residual_stiffness),
crack_resistance(other.crack_resistance),
crack_length_scale(other.crack_length_scale),
kinetic_coefficient(other.kinetic_coefficient),
solid_density(other.solid_density),
history_field(other.history_field),
specific_body_force(other.specific_body_force),
dt(other.dt),
t(other.t),
propagating_crack(other.propagating_crack),
crack_pressure(other.crack_pressure)
{
}
PhaseFieldProcessData(PhaseFieldProcessData&& other) = default;
//! Copies are forbidden.
PhaseFieldProcessData(PhaseFieldProcessData const&) = delete;
......@@ -81,8 +72,11 @@ struct PhaseFieldProcessData
//! Assignments are not needed.
void operator=(PhaseFieldProcessData&&) = delete;
std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>
material;
MeshLib::PropertyVector<int> const* const material_ids;
std::map<int, std::unique_ptr<
MaterialLib::Solids::MechanicsBase<DisplacementDim>>>
solid_materials;
Parameter<double> const& residual_stiffness;
Parameter<double> const& crack_resistance;
Parameter<double> const& crack_length_scale;
......
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