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

[PL] Move constitutive relation selection in MatL.

parent 28dd5152
No related branches found
No related tags found
No related merge requests found
/**
* \copyright
* Copyright (c) 2012-2018, OpenGeoSys Community (http://www.opengeosys.org)
* Distributed under a Modified BSD License.
* See accompanying file LICENSE.txt or
* http://www.opengeosys.org/project/license
*
*/
#pragma once
#include "MechanicsBase.h"
namespace MaterialLib
{
namespace Solids
{
/// Choose solid material model for given element id out of a set of models,
/// possibly using the material ids.
///
/// Only two possibilities yield a valid result and result in OGS_FATAL call
/// otherwise.
/// 1. There is only one constitutive relation in the set of
/// constitutive_relations, then the material and element ids are ignored and
/// the only constitutive relation (under id 0) is returned.
/// 2. For each material id chosen for the given element id there exists a
/// constitutive relation in the set.
template <int DisplacementDim>
MechanicsBase<DisplacementDim>& selectSolidConstitutiveRelation(
std::map<int, std::unique_ptr<MechanicsBase<DisplacementDim>>> const&
constitutive_relations,
MeshLib::PropertyVector<int> const* const material_ids,
std::size_t const element_id)
{
int material_id;
if (constitutive_relations.size() == 1 || material_ids == nullptr)
{
material_id = 0;
}
else
{
material_id = (*material_ids)[element_id];
}
auto const constitutive_relation = constitutive_relations.find(material_id);
if (constitutive_relation == end(constitutive_relations))
{
OGS_FATAL(
"No constitutive relation found for material id %d and element %d. "
"There are %d constitutive relations available.",
material_id, element_id, constitutive_relations.size());
}
if (constitutive_relation->second == nullptr)
{
OGS_FATAL(
"The constitutive relation found for material id %d and element %d "
"is a nullptr, which is impossible.",
material_id, element_id);
}
return *constitutive_relation->second;
}
} // namespace Solids
} // namespace MaterialLib
......@@ -13,6 +13,7 @@
#include "HydroMechanicsFEM.h"
#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
#include "MathLib/KelvinVector.h"
#include "NumLib/Function/Interpolation.h"
#include "ProcessLib/CoupledSolutionsForStaggeredScheme.h"
......@@ -53,13 +54,12 @@ HydroMechanicsLocalAssembler<ShapeFunctionDisplacement, ShapeFunctionPressure,
IntegrationMethod, DisplacementDim>(
e, is_axially_symmetric, _integration_method);
auto const material_id = _process_data.material_ids == nullptr
? 0
: (*_process_data.material_ids)[e.getID()];
auto& solid_material = MaterialLib::Solids::selectSolidConstitutiveRelation(
_process_data.solid_materials, _process_data.material_ids, e.getID());
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
// displacement (subscript u)
_ip_data.emplace_back(*_process_data.solid_materials[material_id]);
_ip_data.emplace_back(solid_material);
auto& ip_data = _ip_data[ip];
auto const& sm_u = shape_matrices_u[ip];
_ip_data[ip].integration_weight =
......
......@@ -11,8 +11,9 @@
#include "HydroMechanicsLocalAssemblerMatrix.h"
#include "MathLib/KelvinVector.h"
#include "MaterialLib/PhysicalConstant.h"
#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
#include "MathLib/KelvinVector.h"
#include "MeshLib/ElementStatus.h"
#include "NumLib/Fem/CoordinatesMapping/NaturalNodeCoordinates.h"
#include "ProcessLib/Deformation/LinearBMatrix.h"
......@@ -61,9 +62,8 @@ HydroMechanicsLocalAssemblerMatrix<ShapeFunctionDisplacement,
IntegrationMethod, GlobalDim>(e, is_axially_symmetric,
integration_method);
auto const material_id = _process_data.material_ids == nullptr
? 0
: (*_process_data.material_ids)[e.getID()];
auto& solid_material = MaterialLib::Solids::selectSolidConstitutiveRelation(
_process_data.solid_materials, _process_data.material_ids, e.getID());
SpatialPosition x_position;
x_position.setElementID(e.getID());
......@@ -71,7 +71,7 @@ HydroMechanicsLocalAssemblerMatrix<ShapeFunctionDisplacement,
{
x_position.setIntegrationPoint(ip);
_ip_data.emplace_back(*_process_data.solid_materials[material_id]);
_ip_data.emplace_back(solid_material);
auto& ip_data = _ip_data[ip];
auto const& sm_u = shape_matrices_u[ip];
auto const& sm_p = shape_matrices_p[ip];
......
......@@ -17,6 +17,7 @@
#include <Eigen/Eigen>
#include "MaterialLib/PhysicalConstant.h"
#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
#include "MathLib/LinAlg/Eigen/EigenMapTools.h"
#include "NumLib/Fem/ShapeMatrixPolicy.h"
......@@ -62,12 +63,12 @@ SmallDeformationLocalAssemblerMatrix<ShapeFunction, IntegrationMethod,
DisplacementDim>(e, is_axially_symmetric,
_integration_method);
auto const material_id = _process_data.material_ids == nullptr
? 0
: (*_process_data.material_ids)[e.getID()];
auto& solid_material = MaterialLib::Solids::selectSolidConstitutiveRelation(
_process_data.solid_materials, _process_data.material_ids, e.getID());
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
_ip_data.emplace_back(*_process_data.solid_materials[material_id]);
_ip_data.emplace_back(solid_material);
auto& ip_data = _ip_data[ip];
auto const& sm = shape_matrices[ip];
ip_data.N = sm.N;
......
......@@ -81,12 +81,12 @@ SmallDeformationLocalAssemblerMatrixNearFracture<ShapeFunction,
_ip_data.reserve(n_integration_points);
_secondary_data.N.resize(n_integration_points);
auto const material_id = _process_data.material_ids == nullptr
? 0
: (*_process_data.material_ids)[e.getID()];
auto& solid_material = MaterialLib::Solids::selectSolidConstitutiveRelation(
_process_data.solid_materials, _process_data.material_ids, e.getID());
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
_ip_data.emplace_back(*_process_data.solid_materials[material_id]);
_ip_data.emplace_back(solid_material);
auto& ip_data = _ip_data[ip];
auto const& sm = shape_matrices[ip];
ip_data.N = sm.N;
......
......@@ -13,6 +13,7 @@
#include "RichardsMechanicsFEM.h"
#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
#include "MathLib/KelvinVector.h"
#include "NumLib/Function/Interpolation.h"
#include "ProcessLib/CoupledSolutionsForStaggeredScheme.h"
......@@ -54,12 +55,12 @@ RichardsMechanicsLocalAssembler<ShapeFunctionDisplacement,
IntegrationMethod, DisplacementDim>(
e, is_axially_symmetric, _integration_method);
auto const material_id = _process_data.material_ids == nullptr
? 0
: (*_process_data.material_ids)[e.getID()];
auto& solid_material = MaterialLib::Solids::selectSolidConstitutiveRelation(
_process_data.solid_materials, _process_data.material_ids, e.getID());
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
_ip_data.emplace_back(*_process_data.solid_materials[material_id]);
_ip_data.emplace_back(solid_material);
auto& ip_data = _ip_data[ip];
auto const& sm_u = shape_matrices_u[ip];
_ip_data[ip].integration_weight =
......
......@@ -13,7 +13,7 @@
#include <vector>
#include "MaterialLib/PhysicalConstant.h"
#include "MaterialLib/SolidModels/LinearElasticIsotropic.h"
#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
#include "MathLib/LinAlg/Eigen/EigenMapTools.h"
#include "NumLib/Extrapolation/ExtrapolatableElement.h"
#include "NumLib/Fem/FiniteElement/TemplateIsoparametric.h"
......@@ -125,12 +125,15 @@ public:
IntegrationMethod, DisplacementDim>(
e, is_axially_symmetric, _integration_method);
auto const material_id = _process_data.material_ids == nullptr
? 0
: (*_process_data.material_ids)[e.getID()];
auto& solid_material =
MaterialLib::Solids::selectSolidConstitutiveRelation(
_process_data.solid_materials,
_process_data.material_ids,
e.getID());
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
_ip_data.emplace_back(*_process_data.solid_materials[material_id]);
_ip_data.emplace_back(solid_material);
auto& ip_data = _ip_data[ip];
auto const& sm = shape_matrices[ip];
_ip_data[ip].integration_weight =
......
......@@ -12,7 +12,7 @@
#include <memory>
#include <vector>
#include "MaterialLib/SolidModels/MechanicsBase.h"
#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
#include "MathLib/KelvinVector.h"
#include "MathLib/LinAlg/Eigen/EigenMapTools.h"
#include "NumLib/Extrapolation/ExtrapolatableElement.h"
......@@ -123,12 +123,15 @@ public:
IntegrationMethod, DisplacementDim>(
e, is_axially_symmetric, _integration_method);
auto const material_id = _process_data.material_ids == nullptr
? 0
: (*_process_data.material_ids)[e.getID()];
auto& solid_material =
MaterialLib::Solids::selectSolidConstitutiveRelation(
_process_data.solid_materials,
_process_data.material_ids,
e.getID());
for (unsigned ip = 0; ip < n_integration_points; ip++)
{
_ip_data.emplace_back(*_process_data.solid_materials[material_id]);
_ip_data.emplace_back(solid_material);
auto& ip_data = _ip_data[ip];
ip_data.integration_weight =
_integration_method.getWeightedPoint(ip).getWeight() *
......
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