Skip to content

Commit

Permalink
[GeoMechanicsApplication] Extract biot coefficient calculation (#12398)
Browse files Browse the repository at this point in the history
* Removing redundant hasBiotCoefficient flag
* Extracted lists for the biot coefficients
* Added utility function for biot modulus inverse with unit tests and used in diff and non-diff order elements
* Extracting Bulk Modulus calculation with tests
* Extract utility function for calculating the biot coefficients with tests and used in diff and non-diff order elements
  • Loading branch information
rfaasse authored May 24, 2024
1 parent d828a58 commit 281c6d3
Show file tree
Hide file tree
Showing 14 changed files with 241 additions and 188 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
// Application includes
#include "custom_elements/U_Pw_small_strain_FIC_element.hpp"
#include "custom_utilities/math_utilities.h"
#include "custom_utilities/transport_equation_utilities.hpp"

namespace Kratos
{
Expand Down Expand Up @@ -443,8 +444,6 @@ void UPwSmallStrainFICElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLeftHa
// create general parameters of retention law
RetentionLaw::Parameters RetentionParameters(this->GetProperties(), CurrentProcessInfo);

const bool hasBiotCoefficient = Prop.Has(BIOT_COEFFICIENT);

const auto b_matrices = this->CalculateBMatrices(Variables.DN_DXContainer, Variables.NContainer);
const auto integration_coefficients =
this->CalculateIntegrationCoefficients(IntegrationPoints, Variables.detJContainer);
Expand All @@ -455,10 +454,10 @@ void UPwSmallStrainFICElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLeftHa
this->CalculateAnyOfMaterialResponse(deformation_gradients, ConstitutiveParameters,
Variables.NContainer, Variables.DN_DXContainer,
strain_vectors, mStressVector, constitutive_matrices);
const auto biot_coefficients =
GeoTransportEquationUtilities::CalculateBiotCoefficients(constitutive_matrices, Prop);

// Loop over integration points
for (unsigned int GPoint = 0; GPoint < NumGPoints; ++GPoint) {
// Compute Np, GradNpT, B and StrainVector
this->CalculateKinematics(Variables, GPoint);
Variables.B = b_matrices[GPoint];
Variables.F = deformation_gradients[GPoint];
Expand All @@ -469,16 +468,14 @@ void UPwSmallStrainFICElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLeftHa
GeoElementUtilities::InterpolateVariableWithComponents<TDim, TNumNodes>(
Variables.BodyAcceleration, Variables.NContainer, Variables.VolumeAcceleration, GPoint);

// Compute ShapeFunctionsSecondOrderGradients
this->CalculateShapeFunctionsSecondOrderGradients(FICVariables, Variables);

this->CalculateRetentionResponse(Variables, RetentionParameters, GPoint);

// set shear modulus from stiffness matrix
FICVariables.ShearModulus = CalculateShearModulus(Variables.ConstitutiveMatrix);

// calculate Bulk modulus from stiffness matrix
this->InitializeBiotCoefficients(Variables, hasBiotCoefficient);
Variables.BiotCoefficient = biot_coefficients[GPoint];
Variables.BiotModulusInverse = GeoTransportEquationUtilities::CalculateBiotModulusInverse(
Variables.BiotCoefficient, Variables.DegreeOfSaturation, Variables.DerivativeOfSaturation, Prop);

Variables.IntegrationCoefficient = integration_coefficients[GPoint];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwSmallStrainFICElement
using UPwBaseElement<TDim, TNumNodes>::mStateVariablesFinalized;
using UPwBaseElement<TDim, TNumNodes>::mThisIntegrationMethod;

using UPwSmallStrainElement<TDim, TNumNodes>::CalculateBulkModulus;
using UPwSmallStrainElement<TDim, TNumNodes>::VoigtSize;

using ElementVariables = typename UPwSmallStrainElement<TDim, TNumNodes>::ElementVariables;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -697,8 +697,6 @@ void UPwSmallStrainElement<TDim, TNumNodes>::CalculateOnIntegrationPoints(const
for (unsigned int i = 0; i < StressTensorSize; ++i)
VoigtVector[i] = 1.0;

const bool hasBiotCoefficient = rProp.Has(BIOT_COEFFICIENT);

const auto b_matrices = CalculateBMatrices(Variables.DN_DXContainer, Variables.NContainer);
const auto deformation_gradients = CalculateDeformationGradients();
auto strain_vectors = StressStrainUtilities::CalculateStrains(
Expand All @@ -707,23 +705,18 @@ void UPwSmallStrainElement<TDim, TNumNodes>::CalculateOnIntegrationPoints(const
this->CalculateAnyOfMaterialResponse(deformation_gradients, ConstitutiveParameters,
Variables.NContainer, Variables.DN_DXContainer,
strain_vectors, mStressVector, constitutive_matrices);
const auto biot_coefficients = GeoTransportEquationUtilities::CalculateBiotCoefficients(
constitutive_matrices, this->GetProperties());

// Loop over integration points
for (unsigned int GPoint = 0; GPoint < NumGPoints; ++GPoint) {
this->CalculateKinematics(Variables, GPoint);
Variables.B = b_matrices[GPoint];
Variables.F = deformation_gradients[GPoint];
Variables.StrainVector = strain_vectors[GPoint];
Variables.ConstitutiveMatrix = constitutive_matrices[GPoint];

Variables.BiotCoefficient = CalculateBiotCoefficient(Variables, hasBiotCoefficient);

const auto fluid_pressure =
GeoTransportEquationUtilities::CalculateFluidPressure(Variables.Np, Variables.PressureVector);
const auto fluid_pressure = GeoTransportEquationUtilities::CalculateFluidPressure(
Variables.Np, Variables.PressureVector);
RetentionParameters.SetFluidPressure(fluid_pressure);
const auto bishop_coefficient = mRetentionLawVector[GPoint]->CalculateBishopCoefficient(RetentionParameters);
const auto bishop_coefficient =
mRetentionLawVector[GPoint]->CalculateBishopCoefficient(RetentionParameters);

rOutput[GPoint] = mStressVector[GPoint] + PORE_PRESSURE_SIGN_FACTOR * Variables.BiotCoefficient *
rOutput[GPoint] = mStressVector[GPoint] + PORE_PRESSURE_SIGN_FACTOR * biot_coefficients[GPoint] *
bishop_coefficient * fluid_pressure * VoigtVector;
}
} else if (rVariable == ENGINEERING_STRAIN_VECTOR) {
Expand Down Expand Up @@ -973,8 +966,6 @@ void UPwSmallStrainElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLe
// Create general parameters of retention law
RetentionLaw::Parameters RetentionParameters(this->GetProperties(), rCurrentProcessInfo);

const bool hasBiotCoefficient = rProp.Has(BIOT_COEFFICIENT);

const auto b_matrices = CalculateBMatrices(Variables.DN_DXContainer, Variables.NContainer);
const auto integration_coefficients =
this->CalculateIntegrationCoefficients(IntegrationPoints, Variables.detJContainer);
Expand All @@ -985,6 +976,8 @@ void UPwSmallStrainElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLe
this->CalculateAnyOfMaterialResponse(deformation_gradients, ConstitutiveParameters,
Variables.NContainer, Variables.DN_DXContainer,
strain_vectors, mStressVector, constitutive_matrices);
const auto biot_coefficients = GeoTransportEquationUtilities::CalculateBiotCoefficients(
constitutive_matrices, this->GetProperties());

for (unsigned int GPoint = 0; GPoint < NumGPoints; ++GPoint) {
this->CalculateKinematics(Variables, GPoint);
Expand All @@ -1000,7 +993,10 @@ void UPwSmallStrainElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLe

CalculateRetentionResponse(Variables, RetentionParameters, GPoint);

this->InitializeBiotCoefficients(Variables, hasBiotCoefficient);
Variables.BiotCoefficient = biot_coefficients[GPoint];
Variables.BiotModulusInverse = GeoTransportEquationUtilities::CalculateBiotModulusInverse(
Variables.BiotCoefficient, Variables.DegreeOfSaturation,
Variables.DerivativeOfSaturation, this->GetProperties());
Variables.PermeabilityUpdateFactor = this->CalculatePermeabilityUpdateFactor(Variables.StrainVector);

Variables.IntegrationCoefficient = integration_coefficients[GPoint];
Expand All @@ -1019,52 +1015,6 @@ void UPwSmallStrainElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLe
KRATOS_CATCH("")
}

template <unsigned int TDim, unsigned int TNumNodes>
double UPwSmallStrainElement<TDim, TNumNodes>::CalculateBiotCoefficient(const ElementVariables& rVariables,
bool hasBiotCoefficient) const
{
KRATOS_TRY

const PropertiesType& rProp = this->GetProperties();

// Properties variables
if (hasBiotCoefficient) {
return rProp[BIOT_COEFFICIENT];
} else {
// Calculate Bulk modulus from stiffness matrix
const double BulkModulus = CalculateBulkModulus(rVariables.ConstitutiveMatrix);
return 1.0 - BulkModulus / rProp[BULK_MODULUS_SOLID];
}

KRATOS_CATCH("")
}

template <unsigned int TDim, unsigned int TNumNodes>
void UPwSmallStrainElement<TDim, TNumNodes>::InitializeBiotCoefficients(ElementVariables& rVariables,
bool hasBiotCoefficient)
{
KRATOS_TRY

const PropertiesType& rProp = this->GetProperties();

// Properties variables
rVariables.BiotCoefficient = CalculateBiotCoefficient(rVariables, hasBiotCoefficient);

if (!rProp[IGNORE_UNDRAINED]) {
rVariables.BiotModulusInverse =
(rVariables.BiotCoefficient - rProp[POROSITY]) / rProp[BULK_MODULUS_SOLID] +
rProp[POROSITY] / rProp[BULK_MODULUS_FLUID];
} else {
rVariables.BiotModulusInverse =
(rVariables.BiotCoefficient - rProp[POROSITY]) / rProp[BULK_MODULUS_SOLID] + rProp[POROSITY] / TINY;
}

rVariables.BiotModulusInverse *= rVariables.DegreeOfSaturation;
rVariables.BiotModulusInverse -= rVariables.DerivativeOfSaturation * rProp[POROSITY];

KRATOS_CATCH("")
}

template <unsigned int TDim, unsigned int TNumNodes>
std::vector<array_1d<double, TDim>> UPwSmallStrainElement<TDim, TNumNodes>::CalculateFluidFluxes(
const std::vector<double>& rPermeabilityUpdateFactors, const ProcessInfo& rCurrentProcessInfo)
Expand Down Expand Up @@ -1126,17 +1076,6 @@ double UPwSmallStrainElement<TDim, TNumNodes>::CalculatePermeabilityUpdateFactor
KRATOS_CATCH("")
}

template <unsigned int TDim, unsigned int TNumNodes>
double UPwSmallStrainElement<TDim, TNumNodes>::CalculateBulkModulus(const Matrix& ConstitutiveMatrix) const
{
KRATOS_TRY

const int IndexG = ConstitutiveMatrix.size1() - 1;
return ConstitutiveMatrix(0, 0) - (4.0 / 3.0) * ConstitutiveMatrix(IndexG, IndexG);

KRATOS_CATCH("")
}

template <unsigned int TDim, unsigned int TNumNodes>
void UPwSmallStrainElement<TDim, TNumNodes>::InitializeElementVariables(ElementVariables& rVariables,
const ProcessInfo& rCurrentProcessInfo)
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 CalculateKinematics(ElementVariables& rVariables, unsigned int PointNumber);

void InitializeBiotCoefficients(ElementVariables& rVariables, bool hasBiotCoefficient = false);

double CalculatePermeabilityUpdateFactor(const Vector& rStrainVector) const;

Matrix CalculateBMatrix(const Matrix& rDN_DX, const Vector& rN) const;
Expand Down Expand Up @@ -266,9 +264,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwSmallStrainElement : public UPwBa
array_1d<double, TNumNodes>& rPVector,
const ElementVariables& rVariables) const;

double CalculateBulkModulus(const Matrix& ConstitutiveMatrix) const;
double CalculateBiotCoefficient(const ElementVariables& rVariables, bool hasBiotCoefficient) const;

virtual Vector CalculateGreenLagrangeStrain(const Matrix& rDeformationGradient) const;

Matrix CalculateDeformationGradient(unsigned int GPoint) const;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
// Project includes
#include "custom_elements/U_Pw_updated_lagrangian_FIC_element.hpp"
#include "custom_utilities/math_utilities.h"
#include "custom_utilities/transport_equation_utilities.hpp"
#include "utilities/math_utils.h"

namespace Kratos
Expand Down Expand Up @@ -71,8 +72,6 @@ void UPwUpdatedLagrangianFICElement<TDim, TNumNodes>::CalculateAll(MatrixType& r
// create general parameters of retention law
RetentionLaw::Parameters RetentionParameters(this->GetProperties(), rCurrentProcessInfo);

const bool hasBiotCoefficient = Prop.Has(BIOT_COEFFICIENT);

const auto b_matrices = this->CalculateBMatrices(Variables.DN_DXContainer, Variables.NContainer);
const auto integration_coefficients =
this->CalculateIntegrationCoefficients(IntegrationPoints, Variables.detJContainer);
Expand All @@ -84,6 +83,8 @@ void UPwUpdatedLagrangianFICElement<TDim, TNumNodes>::CalculateAll(MatrixType& r
this->CalculateAnyOfMaterialResponse(deformation_gradients, ConstitutiveParameters,
Variables.NContainer, Variables.DN_DXContainer,
strain_vectors, mStressVector, constitutive_matrices);
const auto biot_coefficients =
GeoTransportEquationUtilities::CalculateBiotCoefficients(constitutive_matrices, Prop);

// Computing in all integrations points
for (IndexType GPoint = 0; GPoint < IntegrationPoints.size(); ++GPoint) {
Expand Down Expand Up @@ -111,8 +112,10 @@ void UPwUpdatedLagrangianFICElement<TDim, TNumNodes>::CalculateAll(MatrixType& r
// set shear modulus from stiffness matrix
FICVariables.ShearModulus = CalculateShearModulus(Variables.ConstitutiveMatrix);

// calculate Bulk modulus from stiffness matrix
this->InitializeBiotCoefficients(Variables, hasBiotCoefficient);
Variables.BiotCoefficient = biot_coefficients[GPoint];
Variables.BiotModulusInverse = GeoTransportEquationUtilities::CalculateBiotModulusInverse(
Variables.BiotCoefficient, Variables.DegreeOfSaturation,
Variables.DerivativeOfSaturation, this->GetProperties());

Variables.IntegrationCoefficient = integration_coefficients[GPoint];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwUpdatedLagrangianFICElement
using UPwBaseElement<TDim, TNumNodes>::CalculateDerivativesOnInitialConfiguration;
using UPwBaseElement<TDim, TNumNodes>::mThisIntegrationMethod;
using UPwSmallStrainFICElement<TDim, TNumNodes>::CalculateShearModulus;
using UPwSmallStrainElement<TDim, TNumNodes>::CalculateBulkModulus;

using ElementVariables = typename UPwSmallStrainElement<TDim, TNumNodes>::ElementVariables;
using FICElementVariables = typename UPwSmallStrainFICElement<TDim, TNumNodes>::FICElementVariables;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ void UPwUpdatedLagrangianElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLef
// create general parameters of retention law
RetentionLaw::Parameters RetentionParameters(this->GetProperties(), rCurrentProcessInfo);

const bool hasBiotCoefficient = this->GetProperties().Has(BIOT_COEFFICIENT);
const auto b_matrices = this->CalculateBMatrices(Variables.DN_DXContainer, Variables.NContainer);
const auto integration_coefficients =
this->CalculateIntegrationCoefficients(IntegrationPoints, Variables.detJContainer);
Expand All @@ -80,6 +79,8 @@ void UPwUpdatedLagrangianElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLef
this->CalculateAnyOfMaterialResponse(deformation_gradients, ConstitutiveParameters,
Variables.NContainer, Variables.DN_DXContainer,
strain_vectors, mStressVector, constitutive_matrices);
const auto biot_coefficients = GeoTransportEquationUtilities::CalculateBiotCoefficients(
constitutive_matrices, this->GetProperties());

for (IndexType GPoint = 0; GPoint < IntegrationPoints.size(); ++GPoint) {
this->CalculateKinematics(Variables, GPoint);
Expand All @@ -98,8 +99,10 @@ void UPwUpdatedLagrangianElement<TDim, TNumNodes>::CalculateAll(MatrixType& rLef

this->CalculateRetentionResponse(Variables, RetentionParameters, GPoint);

// calculate Bulk modulus from stiffness matrix
this->InitializeBiotCoefficients(Variables, hasBiotCoefficient);
Variables.BiotCoefficient = biot_coefficients[GPoint];
Variables.BiotModulusInverse = GeoTransportEquationUtilities::CalculateBiotModulusInverse(
Variables.BiotCoefficient, Variables.DegreeOfSaturation,
Variables.DerivativeOfSaturation, this->GetProperties());

Variables.IntegrationCoefficient = integration_coefficients[GPoint];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwUpdatedLagrangianElement
using UPwBaseElement<TDim, TNumNodes>::mThisIntegrationMethod;

using ElementVariables = typename UPwSmallStrainElement<TDim, TNumNodes>::ElementVariables;
using UPwSmallStrainElement<TDim, TNumNodes>::CalculateBulkModulus;

/// Counted pointer of UPwUpdatedLagrangianElement
KRATOS_CLASS_INTRUSIVE_POINTER_DEFINITION(UPwUpdatedLagrangianElement);
Expand Down
Loading

0 comments on commit 281c6d3

Please sign in to comment.