Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[GeoMechanicsApplication] extract SetConstitutiveParameters function #12382

Merged
merged 11 commits into from
May 17, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

// Application includes
#include "custom_elements/U_Pw_small_strain_element.hpp"
#include "custom_utilities/constitutive_law_utilities.hpp"
#include "custom_utilities/equation_of_motion_utilities.h"
#include "custom_utilities/math_utilities.h"
#include "custom_utilities/transport_equation_utilities.hpp"
Expand Down Expand Up @@ -169,8 +170,9 @@ void UPwSmallStrainElement<TDim, TNumNodes>::InitializeSolutionStep(const Proces
Variables.detF = determinants_of_deformation_gradients[GPoint];
Variables.StrainVector = strain_vectors[GPoint];

// Set Gauss points variables to constitutive law parameters
this->SetConstitutiveParameters(Variables, ConstitutiveParameters);
ConstitutiveLawUtilities::SetConstitutiveParameters(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This call we need to retain, because the constitutive matrix was not calculated before the loop

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks.

ConstitutiveParameters, Variables.StrainVector, Variables.ConstitutiveMatrix,
Variables.Np, Variables.GradNpT, Variables.F, Variables.detF);

// Initialize constitutive law
noalias(Variables.StressVector) = mStressVector[GPoint];
Expand Down Expand Up @@ -321,8 +323,9 @@ void UPwSmallStrainElement<TDim, TNumNodes>::FinalizeSolutionStep(const ProcessI
Variables.detF = determinants_of_deformation_gradients[GPoint];
Variables.StrainVector = strain_vectors[GPoint];

// Set Gauss points variables to constitutive law parameters
this->SetConstitutiveParameters(Variables, ConstitutiveParameters);
ConstitutiveLawUtilities::SetConstitutiveParameters(
ConstitutiveParameters, Variables.StrainVector, Variables.ConstitutiveMatrix,
Variables.Np, Variables.GradNpT, Variables.F, Variables.detF);

// Compute constitutive tensor and/or stresses
noalias(Variables.StressVector) = mStressVector[GPoint];
Expand Down Expand Up @@ -1660,22 +1663,6 @@ void UPwSmallStrainElement<TDim, TNumNodes>::CalculateKinematics(ElementVariable
KRATOS_CATCH("")
}

template <unsigned int TDim, unsigned int TNumNodes>
void UPwSmallStrainElement<TDim, TNumNodes>::SetConstitutiveParameters(ElementVariables& rVariables,
ConstitutiveLaw::Parameters& rConstitutiveParameters)
{
KRATOS_TRY

rConstitutiveParameters.SetStrainVector(rVariables.StrainVector);
rConstitutiveParameters.SetConstitutiveMatrix(rVariables.ConstitutiveMatrix);
rConstitutiveParameters.SetShapeFunctionsValues(rVariables.Np);
rConstitutiveParameters.SetShapeFunctionsDerivatives(rVariables.GradNpT);
rConstitutiveParameters.SetDeformationGradientF(rVariables.F);
rConstitutiveParameters.SetDeterminantF(rVariables.detF);

KRATOS_CATCH("")
}

template <unsigned int TDim, unsigned int TNumNodes>
void UPwSmallStrainElement<TDim, TNumNodes>::CalculateRetentionResponse(ElementVariables& rVariables,
RetentionLaw::Parameters& rRetentionParameters,
Expand Down Expand Up @@ -1890,12 +1877,10 @@ void UPwSmallStrainElement<TDim, TNumNodes>::CalculateAnyOfMaterialResponse(
GeoMechanicsMathUtilities::CalculateDeterminants(rDeformationGradients);

for (unsigned int GPoint = 0; GPoint < rDeformationGradients.size(); ++GPoint) {
rConstitutiveParameters.SetConstitutiveMatrix(rConstitutiveMatrices[GPoint]);
rConstitutiveParameters.SetStrainVector(rStrainVectors[GPoint]);
rConstitutiveParameters.SetShapeFunctionsDerivatives(rDNu_DXContainer[GPoint]);
rConstitutiveParameters.SetShapeFunctionsValues(row(rNuContainer, GPoint));
rConstitutiveParameters.SetDeformationGradientF(rDeformationGradients[GPoint]);
rConstitutiveParameters.SetDeterminantF(determinants_of_deformation_gradients[GPoint]);
ConstitutiveLawUtilities::SetConstitutiveParameters(
rConstitutiveParameters, rStrainVectors[GPoint], rConstitutiveMatrices[GPoint],
row(rNuContainer, GPoint), rDNu_DXContainer[GPoint], rDeformationGradients[GPoint],
determinants_of_deformation_gradients[GPoint]);
rConstitutiveParameters.SetStressVector(rStressVectors[GPoint]);

mConstitutiveLawVector[GPoint]->CalculateMaterialResponseCauchy(rConstitutiveParameters);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,8 +220,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwSmallStrainElement : public UPwBa

virtual void InitializeElementVariables(ElementVariables& rVariables, const ProcessInfo& CurrentProcessInfo);

void SetConstitutiveParameters(ElementVariables& rVariables, ConstitutiveLaw::Parameters& rConstitutiveParameters);

virtual void CalculateKinematics(ElementVariables& rVariables, unsigned int PointNumber);

void InitializeBiotCoefficients(ElementVariables& rVariables, bool hasBiotCoefficient = false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

// Application includes
#include "custom_elements/U_Pw_small_strain_interface_element.hpp"
#include "custom_utilities/constitutive_law_utilities.hpp"
#include "custom_utilities/transport_equation_utilities.hpp"
#include <custom_utilities/stress_strain_utilities.h>

Expand Down Expand Up @@ -659,7 +660,9 @@ void UPwSmallStrainInterfaceElement<TDim, TNumNodes>::CalculateOnIntegrationPoin
ConstitutiveParameters.Set(ConstitutiveLaw::USE_ELEMENT_PROVIDED_STRAIN);
ConstitutiveParameters.Set(ConstitutiveLaw::COMPUTE_CONSTITUTIVE_TENSOR);

this->SetConstitutiveParameters(Variables, ConstitutiveParameters);
ConstitutiveLawUtilities::SetConstitutiveParameters(
ConstitutiveParameters, Variables.StrainVector, Variables.ConstitutiveMatrix,
Variables.Np, Variables.GradNpT, Variables.F, Variables.detF);

// Auxiliary variables
const double& MinimumJointWidth = rProp[MINIMUM_JOINT_WIDTH];
Expand Down Expand Up @@ -1000,8 +1003,9 @@ void UPwSmallStrainInterfaceElement<TDim, TNumNodes>::CalculateOnLobattoIntegrat

Vector TotalStressVector(mStressVector[0].size());

// set Gauss points variables to constitutive law parameters
this->SetConstitutiveParameters(Variables, ConstitutiveParameters);
ConstitutiveLawUtilities::SetConstitutiveParameters(
ConstitutiveParameters, Variables.StrainVector, Variables.ConstitutiveMatrix,
Variables.Np, Variables.GradNpT, Variables.F, Variables.detF);

// Auxiliary variables
const double& MinimumJointWidth = rProp[MINIMUM_JOINT_WIDTH];
Expand Down Expand Up @@ -1251,7 +1255,10 @@ void UPwSmallStrainInterfaceElement<TDim, TNumNodes>::CalculateMaterialStiffness
// Element variables
InterfaceElementVariables Variables;
this->InitializeElementVariables(Variables, Geom, Prop, CurrentProcessInfo);
this->SetConstitutiveParameters(Variables, ConstitutiveParameters);

ConstitutiveLawUtilities::SetConstitutiveParameters(ConstitutiveParameters, Variables.StrainVector,
Variables.ConstitutiveMatrix, Variables.Np,
Variables.GradNpT, Variables.F, Variables.detF);

// Auxiliary variables
const double& MinimumJointWidth = Prop[MINIMUM_JOINT_WIDTH];
Expand Down Expand Up @@ -1325,7 +1332,10 @@ void UPwSmallStrainInterfaceElement<TDim, TNumNodes>::CalculateAll(MatrixType& r
// Element variables
InterfaceElementVariables Variables;
this->InitializeElementVariables(Variables, Geom, Prop, CurrentProcessInfo);
this->SetConstitutiveParameters(Variables, ConstitutiveParameters);

ConstitutiveLawUtilities::SetConstitutiveParameters(ConstitutiveParameters, Variables.StrainVector,
Variables.ConstitutiveMatrix, Variables.Np,
Variables.GradNpT, Variables.F, Variables.detF);

// Auxiliary variables
const double& MinimumJointWidth = Prop[MINIMUM_JOINT_WIDTH];
Expand Down Expand Up @@ -1448,22 +1458,6 @@ void UPwSmallStrainInterfaceElement<TDim, TNumNodes>::InitializeElementVariables
KRATOS_CATCH("")
}

template <unsigned int TDim, unsigned int TNumNodes>
void UPwSmallStrainInterfaceElement<TDim, TNumNodes>::SetConstitutiveParameters(
InterfaceElementVariables& rVariables, ConstitutiveLaw::Parameters& rConstitutiveParameters)
{
KRATOS_TRY

rConstitutiveParameters.SetStrainVector(rVariables.StrainVector);
rConstitutiveParameters.SetConstitutiveMatrix(rVariables.ConstitutiveMatrix);
rConstitutiveParameters.SetShapeFunctionsValues(rVariables.Np);
rConstitutiveParameters.SetShapeFunctionsDerivatives(rVariables.GradNpT);
rConstitutiveParameters.SetDeformationGradientF(rVariables.F);
rConstitutiveParameters.SetDeterminantF(rVariables.detF);

KRATOS_CATCH("")
}

template <>
void UPwSmallStrainInterfaceElement<2, 4>::CalculateRotationMatrix(BoundedMatrix<double, 2, 2>& rRotationMatrix,
const GeometryType& Geom)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,9 +291,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwSmallStrainInterfaceElement

void CalculateSoilGamma(InterfaceElementVariables& rVariables);

void SetConstitutiveParameters(InterfaceElementVariables& rVariables,
ConstitutiveLaw::Parameters& rConstitutiveParameters);

Vector SetFullStressVector(const Vector& rStressVector);

private:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

// Application includes
#include "custom_elements/U_Pw_small_strain_link_interface_element.hpp"
#include "custom_utilities/constitutive_law_utilities.hpp"

namespace Kratos
{
Expand Down Expand Up @@ -321,7 +322,10 @@ void UPwSmallStrainLinkInterfaceElement<TDim, TNumNodes>::CalculateAll(MatrixTyp
// Element variables
InterfaceElementVariables Variables;
this->InitializeElementVariables(Variables, Geom, Prop, CurrentProcessInfo);
this->SetConstitutiveParameters(Variables, ConstitutiveParameters);

ConstitutiveLawUtilities::SetConstitutiveParameters(ConstitutiveParameters, Variables.StrainVector,
Variables.ConstitutiveMatrix, Variables.Np,
Variables.GradNpT, Variables.F, Variables.detF);

// Auxiliary variables
const double& MinimumJointWidth = Prop[MINIMUM_JOINT_WIDTH];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

// Application includes
#include "custom_elements/small_strain_U_Pw_diff_order_element.hpp"
#include "custom_utilities/constitutive_law_utilities.hpp"
#include "custom_utilities/dof_utilities.h"
#include "custom_utilities/element_utilities.hpp"
#include "custom_utilities/equation_of_motion_utilities.h"
Expand Down Expand Up @@ -334,8 +335,9 @@ void SmallStrainUPwDiffOrderElement::InitializeSolutionStep(const ProcessInfo& r
Variables.detF = determinants_of_deformation_gradients[GPoint];
Variables.StrainVector = strain_vectors[GPoint];

// set gauss points variables to constitutive law parameters
this->SetConstitutiveParameters(Variables, ConstitutiveParameters);
ConstitutiveLawUtilities::SetConstitutiveParameters(
ConstitutiveParameters, Variables.StrainVector, Variables.ConstitutiveMatrix,
Variables.Nu, Variables.DNu_DX, Variables.F, Variables.detF);

// compute constitutive tensor and/or stresses
noalias(Variables.StressVector) = mStressVector[GPoint];
Expand Down Expand Up @@ -548,8 +550,10 @@ void SmallStrainUPwDiffOrderElement::FinalizeSolutionStep(const ProcessInfo& rCu
Variables.F = deformation_gradients[GPoint];
Variables.detF = determinants_of_deformation_gradients[GPoint];
Variables.StrainVector = strain_vectors[GPoint];
// set gauss points variables to constitutive law parameters
this->SetConstitutiveParameters(Variables, ConstitutiveParameters);

ConstitutiveLawUtilities::SetConstitutiveParameters(
ConstitutiveParameters, Variables.StrainVector, Variables.ConstitutiveMatrix,
Variables.Nu, Variables.DNu_DX, Variables.F, Variables.detF);

// compute constitutive tensor and/or stresses
noalias(Variables.StressVector) = mStressVector[GPoint];
Expand Down Expand Up @@ -1673,24 +1677,6 @@ std::vector<Matrix> SmallStrainUPwDiffOrderElement::CalculateBMatrices(
return result;
}

void SmallStrainUPwDiffOrderElement::SetConstitutiveParameters(ElementVariables& rVariables,
ConstitutiveLaw::Parameters& rConstitutiveParameters) const
{
KRATOS_TRY

rConstitutiveParameters.SetStrainVector(rVariables.StrainVector);
rConstitutiveParameters.SetConstitutiveMatrix(rVariables.ConstitutiveMatrix);

// Needed parameters for consistency with the general constitutive law
rConstitutiveParameters.SetShapeFunctionsDerivatives(rVariables.DNu_DX);
rConstitutiveParameters.SetShapeFunctionsValues(rVariables.Nu);

rConstitutiveParameters.SetDeterminantF(rVariables.detF);
rConstitutiveParameters.SetDeformationGradientF(rVariables.F);

KRATOS_CATCH("")
}

double SmallStrainUPwDiffOrderElement::CalculateIntegrationCoefficient(const GeometryType::IntegrationPointType& rIntegrationPoint,
double detJ) const
{
Expand Down Expand Up @@ -2163,12 +2149,10 @@ void SmallStrainUPwDiffOrderElement::CalculateAnyOfMaterialResponse(
GeoMechanicsMathUtilities::CalculateDeterminants(rDeformationGradients);

for (unsigned int GPoint = 0; GPoint < rDeformationGradients.size(); ++GPoint) {
rConstitutiveParameters.SetConstitutiveMatrix(rConstitutiveMatrices[GPoint]);
rConstitutiveParameters.SetStrainVector(rStrainVectors[GPoint]);
rConstitutiveParameters.SetShapeFunctionsDerivatives(rDNu_DXContainer[GPoint]);
rConstitutiveParameters.SetShapeFunctionsValues(row(rNuContainer, GPoint));
rConstitutiveParameters.SetDeformationGradientF(rDeformationGradients[GPoint]);
rConstitutiveParameters.SetDeterminantF(determinants_of_deformation_gradients[GPoint]);
ConstitutiveLawUtilities::SetConstitutiveParameters(
rConstitutiveParameters, rStrainVectors[GPoint], rConstitutiveMatrices[GPoint],
row(rNuContainer, GPoint), rDNu_DXContainer[GPoint], rDeformationGradients[GPoint],
determinants_of_deformation_gradients[GPoint]);
rConstitutiveParameters.SetStressVector(rStressVectors[GPoint]);

mConstitutiveLawVector[GPoint]->CalculateMaterialResponseCauchy(rConstitutiveParameters);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) SmallStrainUPwDiffOrderElement : pub
void CalculateDerivativesOnInitialConfiguration(
double& detJ, Matrix& J0, Matrix& InvJ0, Matrix& DN_DX, unsigned int PointNumber) const;

void SetConstitutiveParameters(ElementVariables& rVariables,
ConstitutiveLaw::Parameters& rConstitutiveParameters) const;

double CalculateIntegrationCoefficient(const GeometryType::IntegrationPointType& rIntegrationPoint,
double detJ) const;
std::vector<double> CalculateIntegrationCoefficients(const GeometryType::IntegrationPointsArrayType& rIntegrationPoints,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,19 @@ int ConstitutiveLawUtilities::GetStateVariableIndex(const Variable<double>& rThi
return index - 1;
}

void ConstitutiveLawUtilities::SetConstitutiveParameters(ConstitutiveLaw::Parameters& rConstitutiveParameters,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice addition. I think it could also be used in the CalculateAnyOfMaterialResponse functions in the diff order and non-diff order elements!

Copy link
Contributor Author

@markelov208 markelov208 May 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for pointing. Added there.

Vector& rStrainVector,
Matrix& rConstitutiveMatrix,
const Vector& rN,
const Matrix& rGradNpT,
const Matrix& rF,
double detF)
{
rConstitutiveParameters.SetStrainVector(rStrainVector);
rConstitutiveParameters.SetConstitutiveMatrix(rConstitutiveMatrix);
rConstitutiveParameters.SetShapeFunctionsValues(rN);
rConstitutiveParameters.SetShapeFunctionsDerivatives(rGradNpT);
rConstitutiveParameters.SetDeformationGradientF(rF);
rConstitutiveParameters.SetDeterminantF(detF);
}
} // namespace Kratos
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

// Project includes
#include "containers/variable.h"
#include "includes/constitutive_law.h"

namespace Kratos
{
Expand All @@ -24,6 +25,14 @@ class ConstitutiveLawUtilities
public:
static int GetStateVariableIndex(const Variable<double>& rThisVariable);

static void SetConstitutiveParameters(ConstitutiveLaw::Parameters& rConstitutiveParameters,
Vector& rStrainVector,
Matrix& rConstitutiveMatrix,
const Vector& rN,
const Matrix& rGradNpT,
const Matrix& rF,
double detF);

}; /* Class ConstitutiveLawUtilities*/

} // namespace Kratos
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clear unit test! To reflect the name of the file it tests, we could also rename it to test_constitutive_law_utilities.cpp

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// KRATOS___
// // ) )
// // ___ ___
// // ____ //___) ) // ) )
// // / / // // / /
// ((____/ / ((____ ((___/ / MECHANICS
//
// License: geo_mechanics_application/license.txt
//
// Main authors: Gennady Markelov
//

#include "custom_utilities/constitutive_law_utilities.hpp"
#include "includes/checks.h"
#include "testing/testing.h"
#include <boost/numeric/ublas/assignment.hpp>

using namespace Kratos;

namespace Kratos::Testing
{

KRATOS_TEST_CASE_IN_SUITE(SetSixConstitutiveParametersCorrectResults, KratosGeoMechanicsFastSuite)
{
ConstitutiveLaw::Parameters ConstitutiveParameters;

Vector strain_vector(3);
strain_vector <<= 1.0, 2.0, 3.0;
Matrix constitutive_matrix = IdentityMatrix(5, 5);
Vector N(3);
N <<= 0.1, 0.2, 0.5;
const Matrix shape_functions_derivatives = ScalarMatrix(3, 3, 5.0);
const Matrix deformation_gradient_F = ScalarMatrix(3, 3, 10.0);
constexpr double determinant_of_F = 10.0;
ConstitutiveLawUtilities::SetConstitutiveParameters(
ConstitutiveParameters, strain_vector, constitutive_matrix, N, shape_functions_derivatives,
deformation_gradient_F, determinant_of_F);

KRATOS_CHECK_VECTOR_NEAR(ConstitutiveParameters.GetStrainVector(), strain_vector, 1e-12)

KRATOS_CHECK_MATRIX_NEAR(ConstitutiveParameters.GetConstitutiveMatrix(), constitutive_matrix, 1e-12)

KRATOS_CHECK_VECTOR_NEAR(ConstitutiveParameters.GetShapeFunctionsValues(), N, 1e-12)

KRATOS_CHECK_MATRIX_NEAR(ConstitutiveParameters.GetShapeFunctionsDerivatives(),
shape_functions_derivatives, 1e-12)

KRATOS_CHECK_MATRIX_NEAR(ConstitutiveParameters.GetDeformationGradientF(), deformation_gradient_F, 1e-12)

KRATOS_CHECK_NEAR(ConstitutiveParameters.GetDeterminantF(), determinant_of_F, 1e-12);
}

} // namespace Kratos::Testing
Loading