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.
The following line allows displaying the list of supported keywords:
mtest --scheme=ptest --help-keywords-listThe 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=@RadialLoadingThis 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.mfrontThe 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.ptestThis generates two files:
pipe.res gives the evolution of the radii and of the
displacements. Its first lines describe its columns.pipe-profile.res gives the stresses in the thickness of
the pipe at each time step.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.
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:
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:
@PerformSmallStrainAnalysis keyword must then be placed
before the @Behaviour keyword.ETO-PK1 kinematic assumption.Other behaviours can be used with a wrapper, specified after the name of the interface:
LogarithmicStrain1D turns a small strain behaviour in
axisymmetrical generalised plane strain into a finite strain behaviour
in the logarithmic strain framework, following the ETO-PK1
kinematic assumption.SmallStrainTridimensionalBehaviourWrapper allows using
a small strain tridimensional behaviour.@Behaviour<generic, LogarithmicStrain1D> 'src/libBehaviour.so' 'Elasticity';The geometry of the pipe is specified using the self-explanatory
keywords @InnerRadius and @OuterRadius.
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.
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.
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:
ImposedPressure: the inner and outer pressures are
specified by the user. This is the default.TightPipe: the total amount of substance of the gas is
constant.ImposedOuterRadius: the evolution of the outer radius
is specified by the user.ImposedInnerRadius: the evolution of the inner radius
is specified by the user.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.
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};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.
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.
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};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.
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:
@FillingPressure
keyword).@FillingTemperature
keyword).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';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';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:
None: no loading is applied to the pipe.EndCapEffect: the loading applied to the pipe models
the effects of the inner and outer pressures on a closed pipe. This is
the default.ImposedAxialForce: the axial force acting on the pipe
is specified by the user.ImposedAxialGrowth: the axial growth of the pipe is
specified by the user.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.
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:
See the @AxialGrowthEvolution for details.
See the @AxialForceEvolution for details.
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:
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.
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:
0 means that the criterion is not met, i.e. no failure
is detected and the pipe is sound.1 means that the criterion is met, i.e. failure is
detected and the pipe is broken.In case of failure, three policies can be selected using the
@FailurePolicy keyword:
ReportOnly: failure does not affect computation. The
evaluation of the failure criteria only affects the output file.StopComputation: failure leads to reject the current
time step. If substepping is enabled, the time step is divided by two.
With this policy, one can thus only approach the failure time, but never
go beyond.FreezeState (or
FreezeStateUntilEndOfComputation): if a failure is
detected, the state of the structure is frozen and does not evolve. No
equilibrium is performed, the behaviour is no more called and
PipeTest will output the same results again and again until
the end of computation. This option may be useful when optimizing
material parameters.@FailurePolicy 'FreezeState';
@FailureCriterion 'ElongationAtBreak' {maximum_value : 1e-4};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:
model: the name of the model.library: the name of the library in which the model is
available.boundary: the name of the boundary on which the model
is defined. This variable must be equal to inner_boundary
or outer_boundary.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.
@OxidationModel{
model : 'umatm5deziroxoxidationmodel_srma2020b',
library : 'src/libUmatM5.so',
boundary : 'outer_boundary'
};computeIntegralValue and computeMeanValue
post-processingsThe 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.
@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