Usage

MTest can also be used to model a pipe subjected to various loadings. This extension to pipes is often referred to as PTest.

By default, MTest considers a unique material point. Switching to pipe modeling can be done by either using a file with the extension .ptest or by using the command-line option --scheme=ptest.

Getting help on the command line

The following line allows displaying the list of supported keywords:

mtest --scheme=ptest --help-keywords-list

The help associated with a given keyword can be displayed using the following --help-keyword command line argument, as in the following example:

mtest --scheme=ptest --help-keyword=@RadialLoading

A simple tutorial

This tutorial simulates a closed elastic pipe subjected to an inner pressure, in small strain.

The behaviour is described in the Elasticity.mfront file:

@DSL Implicit;
@Behaviour Elasticity;
@Brick StandardElasticity;
@ElasticMaterialProperties {150e9, 0.3};

It is compiled as follows:

mfront --obuild --interface=generic Elasticity.mfront

The simulation is described in the pipe.ptest file:

@InnerRadius 4.2e-3;
@OuterRadius 4.7e-3;
@NumberOfElements 10;
@PerformSmallStrainAnalysis true;

@Behaviour<generic> 'src/libBehaviour.so' 'Elasticity';
@ExternalStateVariable 'Temperature' 293.15;

@InnerPressureEvolution<evolution> {0 : 0, 1 : 1.5e6};

@Times {0, 1 in 10};
@Profile 'pipe-profile.res' {'SRR', 'STT', 'SZZ'};

It is run as follows:

mtest pipe.ptest

This generates two files:

For this closed elastic pipe, the axial stress is uniform:

\[ \sigma_{zz} = \dfrac{P_{i}\,R_{i}^{2}}{R_{e}^{2} - R_{i}^{2}} \]

At the end of the simulation, this gives \(5.946\,\mathrm{MPa}\), which is the value of the fourth column of pipe-profile.res.

Overview and modeling hypotheses

PTest models a pipe of unit height under the axisymmetrical generalised plane strain hypothesis, which is the only supported modeling hypothesis.

The thickness of the pipe is discretized by a one-dimensional mesh. The unknowns are:

Behaviours

The behaviour is declared with the @Behaviour keyword. It is integrated under the axisymmetrical generalised plane strain hypothesis, and it must be consistent with the type of analysis:

Other behaviours can be used with a wrapper, specified after the name of the interface:

Example of usage

@Behaviour<generic, LogarithmicStrain1D> 'src/libBehaviour.so' 'Elasticity';

Geometry and finite element discretization

Geometry

The geometry of the pipe is specified using the self-explanatory keywords @InnerRadius and @OuterRadius.

Finite element discretization

The finite element discretization is specified using the self-explanatory keywords @ElementType and @NumberOfElements. The following element types are supported: Linear, Quadratic and Cubic. By default, quadratic elements are used.

Type of analysis

By default, simulations are done in a finite strain framework. The @PerformSmallStrainAnalysis, which is followed by a boolean, allows switching to a resolution under the infinitesimal strain hypothesis.

Radial loadings

The @RadialLoading keyword lets the user choose the kind of loading to be applied to the pipe in radial direction.

This keyword is followed by a string. The following loadings are supported:

Note that the modeling of a mandrel may affect the radial loading once the pipe and the mandrel are in contact. Modeling of a mandrel is detailed below in a dedicated section.

Imposed inner pressure loading

The @InnerPressureEvolution keyword defines the pressure applied to the inner surface of the pipe. It is followed by a value, or by an evolution:

@InnerPressureEvolution<evolution> {0 : 0, 1 : 1.5e6};

Imposed outer pressure loading

The @OuterPressureEvolution keyword defines the pressure applied to the outer surface of the pipe. It is followed by a value, or by an evolution:

@OuterPressureEvolution 1.e5;

At least one of these two evolutions must be defined, unless the axial loading is ImposedAxialForce or ImposedAxialGrowth, or a mandrel is modeled.

Imposed inner radius loading

PTest can impose the evolution of the inner radius of the pipe. In this case, PTest adds the inner pressure as an unknown and reports it in the output file.

Example of usage

The following code shows how to impose the evolution of the inner radius of the pipe:

@RadialLoading 'ImposedInnerRadius';
@InnerRadiusEvolution{0 : 4.2e-3, 1 : 4.3e-3};

Tight pipe

MTest is able to model a tight pipe, which assumes that the amount of substance of the gas inside the pipe is constant. The evolution of the inner pressure is linked to the temperature and radius evolution through the gas equation of state. By default, the equation of state of a perfect gas is used.

Specifying the gas equation of state

The equation of state of the gas can be specified using the @GasEquationOfState keyword.

This keyword expects a function \(f{\left(P,V,T,n\right)}\) such that the equation of state is:

\[ f{\left(P,V,T, n\right)}=0 \qquad{(1)}\]

where:

A first example

In this example, the equation of state of a perfect gas is specified:

@FillingPressure      1.e5;
@FillingTemperature 293.15;
@Real 'R' 8.314;
@GasEquationOfState 'P*V-n*R*T';

A second example

In this example, the equation of state of a perfect gas is specified, but one can consider a case where the gas only occupies a fraction \(\alpha\,V\) of the volume inside the pipe:

@FillingPressure      1.e5;
@FillingTemperature 293.15;
@Real 'R' 8.314;
@Real 'a' '0.8';
@GasEquationOfState 'P*a*V-n*R*T';

Axial loadings

The @AxialLoading keyword lets the user choose the kind of loading to be applied to the pipe in the axial direction.

This keyword is followed by a string. The following loadings are supported:

Note that the modeling of a mandrel may affect the axial loading once the pipe and the mandrel are in contact. Modeling of a mandrel is detailed below in a dedicated section.

End-cap effect

The pipe is considered closed. The pressures apply to it the axial force:

\[ F_{z} = \pi\,{\left(R_{i}^{2}\,P_{i} - R_{e}^{2}\,P_{e}\right)} \]

where:

Imposed axial growth

See the @AxialGrowthEvolution for details.

Imposed axial force

See the @AxialForceEvolution for details.

Modeling a non-deformable mandrel inside the pipe

The effect of a mandrel located inside the pipe can be modelled by defining the evolution of its radius \(R_{m}\) using the @MandrelRadiusEvolution keyword. The inner radius \(R_{i}\) will then satisfy the following unilateral boundary condition:

\[ R_{i} - R_{m} \geq 0 \]

This boundary condition is imposed by using a Lagrange multiplier. Its value is given by the contact pressure in the output file. The total pressure applied to the inner surface of the pipe is given by the sum of the imposed pressure (if any) and the contact pressure. Only the imposed inner pressure is used to compute the end cap effect.

This boundary condition is not compatible with:

Axial binding

If the evolution of the axial growth of the mandrel is defined using the @MandrelAxialGrowthEvolution keyword, an axial binding between the mandrel and the pipe is assumed, i.e. the difference between the axial growth of the pipe \(\varepsilon^{p}_{zz}\) and the axial growth of the mandrel \(\varepsilon^{m}_{zz}\) is assumed to be constant to its value when the contact between the mandrel and the pipe is detected:

\[ \varepsilon^{p}_{zz}-\varepsilon^{m}_{zz}=\textrm{Cste} \]

This axial boundary condition is not compatible with the boundary condition imposing the evolution of the axial growth of the pipe.

Support for failure criteria for pipes

Failure criteria can be added to pipe modelling using the @FailureCriterion keyword. Note that no failure criterion is currently shipped with MTest.

A failure criterion is called at the end of each time step to detect failure of the pipe.

Each failure criterion adds a column to the output file giving the status of the criterion:

In case of failure, three policies can be selected using the @FailurePolicy keyword:

Example of usage

@FailurePolicy 'FreezeState';
@FailureCriterion 'ElongationAtBreak' {maximum_value : 1e-4};

Support for oxidation models for pipes

The @OxidationModel keyword introduces a model which computes an oxidation length at either the inner boundary or the outer boundary of the pipe. This keyword must be followed by a data map with the following entries:

An oxidation model must define an internal state variable named OxidationLength. The values of the material properties and external state variables passed to an oxidation model are computed on the boundary on which the model is defined.

The definition of at least one oxidation model automatically defines an evolution named OxidationStatus which states if an integration point is inside an oxidation layer.

Example of usage

@OxidationModel{
  model : 'umatm5deziroxoxidationmodel_srma2020b',
  library : 'src/libUmatM5.so',
  boundary : 'outer_boundary'
};

Post-processings

The computeIntegralValue and computeMeanValue post-processings

The computeIntegralValue and computeMeanValue post-processings allow calculating the integral and the average of a scalar value in the thickness of the pipe, in the current or in the initial configuration.

Example of usage

@AdditionalOutputs {'mean_value_initial_configuration':'SRR',
                    'mean_value_current_configuration':'SRR'}; // compute mean values of SRR
@AdditionalOutputs {'integral_value_initial_configuration':'SRR',
                    'integral_value_current_configuration':'SRR'}; // compute integral values of SRR