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] Add a linear elastic constitutive law for line interfaces #12654

Conversation

avdg81
Copy link
Contributor

@avdg81 avdg81 commented Aug 30, 2024

📝 Description
Added a linear elastic constitutive law that uses an incremental formulation for line interface elements. This new constitutive law will eventually replace the existing classes LinearElastic2DInterfaceLaw and LinearElastic3DInterfaceLaw. So far it aims at 2D models only. In addition to the README file, the unit tests of class GeoIncrementalLinearElasticInterfaceLaw document its intended behavior.

🆕 Changelog
Other changes in this PR include adding two new variables to the GeoMechanicsApplication: INTERFACE_NORMAL_STIFFNESS and INTERFACE_SHEAR_STIFFNESS.

@indigocoral: Could you please read the README file carefully and see whether it makes sense to you? Any suggestions from your side are greatly appreciated. Thanks!

avdg81 and others added 21 commits August 27, 2024 13:58
…lative displacement and previous traction from the constructor to `InitializeMaterial`
…ept by the law itself by using `FinalizeMaterialResponseCauchy`
- When checking the constitutive law, also call the `Check` member of
  the base class.
- Replaced a few intermediate variables by using temporaries (return by
  other functions).
They now have the same order as in class `ConstitutiveLaw`.
- Renamed a test case.
- Set a Z coordinate to zero (since we assume a 2D model).
- Introduced a constant for the adopted relative tolerance.
Copy link
Contributor

@mnabideltares mnabideltares left a comment

Choose a reason for hiding this comment

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

@avdg81 @WPK4FEM
Thank you for adding constutative law for the interface.
I have few minor comments.

## Incremental linear elastic interface law
The constitutive law for an interface element relates tractions $\tau$ to relative displacement $\Delta u$.
Relative displacement for interface element is the differential motion between the two sides of the interface. As a
consequence the relative displacement has unit of length [L] and the stiffness has unit of force over cubic length [F/L^3].
Copy link
Contributor

Choose a reason for hiding this comment

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

Preferly to be "m" and "N" replacing of L and F.
I know that you don't want to relate it to any specific unit system like SI, and wanted to write it as symbolic. But in the standard units symbols, F is a dependent unit and it hasn't specific symbol. The force then becomes [M L T^-2].

Moreover: The unit is preferly to be written as "$\mathrm{[UNIT]}$" , to account for powers, For example, "$\mathrm{[F/L^3]}$" or "$\mathrm{[N/m^3]}$"

Copy link
Contributor Author

Choose a reason for hiding this comment

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

We will make use of the formula editor for correct formatting. However, in engineering it is very common to use the derived unit for Force i.s.o. mass * length * time^-2. To be independent of the system used ( S.I or imperical etc. ) we will express in L, F, t, T (i.e. quantities) i.s.o. mm, kN, days and Fahrenheit (i.e. some units).

consequence the relative displacement has unit of length [L] and the stiffness has unit of force over cubic length [F/L^3].

### Relative displacement and traction
In 2D plane strain y is the opening/closing direction of the interface, while differential motion in the tangential direction
Copy link
Contributor

Choose a reason for hiding this comment

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

"y" is a variable, so it has to be in italic (equation form). So, i think better to use "$y$" instead.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.


$$ \Delta u = \begin{bmatrix} \Delta u_y \\ \Delta u_x \end{bmatrix} $$

$$ \tau = \begin{bmatrix} \tau_{yy} \\ \tau_{xy} \end{bmatrix} $$
Copy link
Contributor

@mnabideltares mnabideltares Aug 30, 2024

Choose a reason for hiding this comment

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

I am not sure whether I am correct in the case of interface, but in the normal stress tensors, the normal components are defined by $\sigma_{xx}$. $\sigma_{yy}$ etc. and shears by $\tau_{xy}$. Is it also here applicable?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The name for stress in an interface is traction, and it is denoted by $\tau$. The symbol $\sigma$ is not used in this context at all.

Comment on lines +20 to +21
$$ C = \begin{bmatrix} C_{yy} & 0 \\
0 & C_{xy} \end{bmatrix}$$
Copy link
Contributor

Choose a reason for hiding this comment

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

What are the $C_{xx}$ and $C_{xy}$? I know they are stiffness parameters which are mentioned in the keywords, but preferly to be explicitely mentioned what they are, and what are their units.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Added the dimension of the stiffness values to be more explicit about what is expected. The normal and shear stiffness terms are clear from the input parameter names.

const auto result = BaseType::Check(rMaterialProperties, rElementGeometry, rCurrentProcessInfo);

KRATOS_ERROR_IF_NOT(rMaterialProperties.Has(INTERFACE_NORMAL_STIFFNESS))
<< "No interface normal stiffness defined" << std::endl;
Copy link
Contributor

Choose a reason for hiding this comment

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

"No interface normal stiffness is defined"

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

<< rMaterialProperties[INTERFACE_NORMAL_STIFFNESS] << std::endl;

KRATOS_ERROR_IF_NOT(rMaterialProperties.Has(INTERFACE_SHEAR_STIFFNESS))
<< "No interface shear stiffness defined" << std::endl;
Copy link
Contributor

Choose a reason for hiding this comment

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

is defined

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

Copy link
Contributor

@rfaasse rfaasse left a comment

Choose a reason for hiding this comment

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

Thank you for implementing this constitutive law as a well tested + documented package. I have a few questions and suggestions, but nothing major and mostly just to gain a bit of understanding myself


ConstitutiveLaw::SizeType GeoIncrementalLinearElasticInterfaceLaw::WorkingSpaceDimension()
{
return 2;
Copy link
Contributor

Choose a reason for hiding this comment

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

Could this ever become 3d (e.g. when using it for a interface plane, where you have multiple 'tangential' directions and a normal)?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I can imagine that at some point we will extend this class towards 3D models. In that case, I would suggest to supply the desired dimension on construction of an instance of this class, and store it with the object. Then this query should return whatever value the corresponding data member contains. Do you think this might work, or do you foresee any issues there?

Copy link
Contributor

Choose a reason for hiding this comment

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

I don't see any issues in this particular function, I think the challenge is more in the formulation, since then there is more than one 'SHEAR' direction. I don't know enough to see if this way of formulating it, makes it harder to go to 3D at some point.

Comment on lines +122 to +129
Matrix GeoIncrementalLinearElasticInterfaceLaw::MakeConstitutiveMatrix(double NormalStiffness,
double ShearStiffness) const
{
auto result = Matrix{ZeroMatrix{GetStrainSize(), GetStrainSize()}};
result(0, 0) = NormalStiffness;
result(1, 1) = ShearStiffness;
return result;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

This is more of a personal preference, but I'd put this function close to where it's called (i.e. directly below CalculateMaterialResponseCauchy)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The definitions of the member functions in the implementation file have the same ordering as the declarations in the header file. So first the public member functions, then the private member functions. The public members are all overrides of the interface defined by class ConstitutiveLaw, and they are in the same order as in the header file of ConstitutiveLaw. From this point of view, I'm a bit reluctant to rearrange their order. Is that acceptable to you, or would you still insist on having the definition of MakeConstitutiveMatrix close to CalculateMaterialResponseCauchy?

Copy link
Contributor

Choose a reason for hiding this comment

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

I get that reasoning as well. Since I think it improves readability, I still prefer moving it, but this is your PR and I'm also completely fine with choosing for consistency with the base class and header file.

Copy link
Contributor

@rfaasse rfaasse left a comment

Choose a reason for hiding this comment

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

I have one comment left about a render issue in the README.md, other than that it's good to go.

I also added one question, but that's out of curiosity and doesn't at all block the PR

## Incremental linear elastic interface law
The constitutive law for an interface element relates tractions $\tau$ to relative displacement $\Delta u$.
Relative displacement for interface element is the differential motion between the two sides of the interface. As a
consequence the relative displacement has unit of length [$\mathrm{L}$] and the stiffness has unit of force over cubic length [$\mathrm{F/L^3}$].
Copy link
Contributor

Choose a reason for hiding this comment

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

These mathrms don't render correctly, I think reversing dollar and [ should work $[\mathrm{F/L^3}]$ (would look like $[\mathrm{F/L^3}]$), adding a space between [ and $ also works

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good catch. Done.

Comment on lines +91 to +100
KRATOS_ERROR_IF_NOT(rMaterialProperties[INTERFACE_NORMAL_STIFFNESS] > 0.0)
<< "Interface normal stiffness must be positive, but got "
<< rMaterialProperties[INTERFACE_NORMAL_STIFFNESS] << std::endl;

KRATOS_ERROR_IF_NOT(rMaterialProperties.Has(INTERFACE_SHEAR_STIFFNESS))
<< "No interface shear stiffness is defined" << std::endl;

KRATOS_ERROR_IF_NOT(rMaterialProperties[INTERFACE_SHEAR_STIFFNESS] > 0.0)
<< "Interface shear stiffness must be positive, but got "
<< rMaterialProperties[INTERFACE_SHEAR_STIFFNESS] << std::endl;
Copy link
Contributor

Choose a reason for hiding this comment

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

Just out of curiosity, would it every be reasonable that the stiffnesses depend on something else (and thus become time-dependent)?

Copy link
Contributor

Choose a reason for hiding this comment

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

Stiffness can depend on many things e.g. time, age, temperature, strain, stress etc. That is what you might use when doing computations that involve improving ground stability by grouting.

Copy link
Contributor

@indigocoral indigocoral left a comment

Choose a reason for hiding this comment

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

Thanks a lot for your work on this and also for adding documentation for it.
I've only reviewed the ReadMe file for now and my comments are more on the style of the documentation.



## Incremental linear elastic interface law
The constitutive law for an interface element relates tractions $\tau$ to relative displacement $\Delta u$.
Copy link
Contributor

Choose a reason for hiding this comment

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

I would suggest to add the word 'linearly' to the sentence below to be more explicit about the nature of the relation:

Suggested change
The constitutive law for an interface element relates tractions $\tau$ to relative displacement $\Delta u$.
The constitutive law for an interface element linearly relates tractions $\tau$ to relative displacement $\Delta u$.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes, being more explicit about the nature of the relation may be clearer. Done.


### Relative displacement and traction
In 2D plane strain $y$ is the opening/closing direction of the interface, while differential motion in the tangential direction
gives shear. Like for a continuum, normal behaviour is placed first in the relative displacement and traction vector. Shear
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
gives shear. Like for a continuum, normal behaviour is placed first in the relative displacement and traction vector. Shear
gives shear. Similar to the continuum, the normal behaviour is placed first in the relative displacement and traction vector. The shear

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

### Relative displacement and traction
In 2D plane strain $y$ is the opening/closing direction of the interface, while differential motion in the tangential direction
gives shear. Like for a continuum, normal behaviour is placed first in the relative displacement and traction vector. Shear
is placed after the normal motion or traction.
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
is placed after the normal motion or traction.
behavior follows after the normal motion or traction in these vectors.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

$$ \tau = \begin{bmatrix} \tau_{yy} \\ \tau_{xy} \end{bmatrix} $$

### 2D Elastic constitutive tensor

Copy link
Contributor

Choose a reason for hiding this comment

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

I would suggest to add something here just for a clearer documentation:

The elastic behavior of the interface is characterized by the elastic constitutive tensor (or 2D Elastic constitutive tensor) 𝐶, which relates the traction and relative displacement vectors. The constitutive tensor in 2D is expressed as:

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

Where $C_{yy}$ is input as `INTERFACE_NORMAL_STIFFNESS` and $C_{xy}$ is input as `INTERFACE_SHEAR_STIFFNESS`. Both stiffness values have dimension $\mathrm{F/L^3}$.

### Incremental relation

Copy link
Contributor

Choose a reason for hiding this comment

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

Also here, I suggest again to add something like:

The relation between the traction and the relative displacement at a given time increment is given by the following incremental equation:

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.


$$ \Delta u = \begin{bmatrix} \Delta u_y \\ \Delta u_x \end{bmatrix} $$

$$ \tau = \begin{bmatrix} \tau_{yy} \\ \tau_{xy} \end{bmatrix} $$
Copy link
Contributor

Choose a reason for hiding this comment

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

This is more style and I only suggest it because sometimes you just want to quickly check the formula and what the parameters stand for. So I would suggest adding the following: (if correct to my understanding)

Where:

  • $\Delta u_𝑦$: Relative displacement in the 𝑦-direction (normal to the interface).
  • $\Delta u_𝑥$: Relative displacement in the 𝑥-direction (tangential to the interface).
  • $\tau_{𝑦𝑦}$: Traction in the 𝑦-direction (normal to the interface).
  • $\tau_{𝑥𝑦}$: Shear traction in the 𝑥-direction (tangential to the interface).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

$$ C = \begin{bmatrix} C_{yy} & 0 \\
0 & C_{xy} \end{bmatrix}$$

Where $C_{yy}$ is input as `INTERFACE_NORMAL_STIFFNESS` and $C_{xy}$ is input as `INTERFACE_SHEAR_STIFFNESS`. Both stiffness values have dimension $\mathrm{F/L^3}$.
Copy link
Contributor

Choose a reason for hiding this comment

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

Also for this one:

Where:

  • $C$: Represents the 2D elastic constitutive tensor.
  • $C_{𝑦𝑦}$: Represents the INTERFACE_NORMAL_STIFFNESS, which characterizes the stiffness in the normal direction.
  • $C_{𝑥𝑦}$: Represents the INTERFACE_SHEAR_STIFFNESS, which characterizes the stiffness in the tangential direction.

Both stiffness values have dimension $\mathrm{F/L^3}$.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

### Incremental relation

$$ \tau_{t + \Delta t} = \tau_t + C \cdot \Delta u $$

Copy link
Contributor

Choose a reason for hiding this comment

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

Also for this one:

Where:

  • $\tau_{t + \Delta t}$: The traction at the updated time 𝑡 + Δ𝑡.
  • $\tau_t$: The traction at the current time 𝑡.
  • $C$: The elastic constitutive tensor.
  • $\Delta u$: The incremental relative displacement vector.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

## Incremental linear elastic interface law
The constitutive law for an interface element relates tractions $\tau$ to relative displacement $\Delta u$.
Relative displacement for interface element is the differential motion between the two sides of the interface. As a
consequence the relative displacement has unit of length [$\mathrm{L}$] and the stiffness has unit of force over cubic length [$\mathrm{F/L^3}$].
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
consequence the relative displacement has unit of length [$\mathrm{L}$] and the stiffness has unit of force over cubic length [$\mathrm{F/L^3}$].
consequence the relative displacement has unit of length $[\mathrm{L}]$ and the stiffness has unit of force over cubic length $[\mathrm{F/L^3}]$.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done.

@avdg81
Copy link
Contributor Author

avdg81 commented Sep 3, 2024

Many thanks to @mnabideltares, @rfaasse, and @indigocoral for your valuable suggestions. We feel that those have improved the quality of this PR.

@avdg81 avdg81 requested a review from rfaasse September 3, 2024 12:20
Copy link
Contributor

@rfaasse rfaasse left a comment

Choose a reason for hiding this comment

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

Thank you for the hard work, to me this looks ready to be merged and used!

@avdg81 avdg81 enabled auto-merge (squash) September 3, 2024 12:54
@avdg81 avdg81 merged commit a6aeead into master Sep 3, 2024
9 of 11 checks passed
@avdg81 avdg81 deleted the geo/12650-add-linear-elastic-constitutive-law-for-line-interfaces branch September 3, 2024 14:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
GeoMechanics Issues related to the GeoMechanicsApplication
Projects
None yet
5 participants