Constitutive laws are also used in non-structural components, to allow some degree of generality in defining input/output relationships. Some constitutive laws are meaningful only when related to some precise dimensionality. In some special cases, general purpose (genel) elements use 1D constitutive laws to express an arbitrary dependence of some value on a scalar state of the system. Table 2.6 shows the availability of each constitutive law.
The meaning of the input and output parameters of a constitutive law is dictated by the entity that uses it. In general, the user should refer to the element the constitutive law is being instantiated for in order to understand what the input and the output parameters are supposed to be.
Usually, constitutive laws can be directly defined when required, according to the definition of an element. However, the special card described in Section 2.3.1 allows to define constitutive laws stand-alone, and attach them to the elements by means of the following mechanism:
<constitutive_law> ::=
{ <constitutive_law_definition>
| <constitutive_law_reference> }
<constitutive_law_reference> ::= reference , <label>
where <constitutive_law_definition> is described in the following,
while <label> is the label of a previously defined constitutive law
of the appropriate dimensionality, as described
in Section 2.3.1.
| Constitutive law | 1D | 3D | 6D |
| linear elastic, linear elastic isotropic | |||
| linear elastic generic | |||
| linear elastic generic axial torsion coupling | |||
| cubic elastic generic | |||
| log elastic | |||
| linear elastic generic bi-stop | |||
| double linear elastic | |||
| isotropic hardening elastic | |||
| scalar function elastic, scalar function elastic isotropic | |||
| scalar function elastic orthotropic | |||
| linear viscous, linear viscous isotropic | |||
| linear viscous generic | |||
| linear viscoelastic, linear viscoelastic isotropic | |||
| linear viscoelastic generic | |||
| linear time variant viscoelastic generic | |||
| linear viscoelastic generic axial torsion coupling | |||
| cubic viscoelastic generic | |||
| double linear viscoelastic | |||
| turbulent viscoelastic | |||
| linear viscoelastic generic bi-stop | |||
| shock absorber | |||
| symbolic elastic | |||
| symbolic viscous | |||
| symbolic viscoelastic | |||
| ann elastic | |||
| ann viscoelastic | |||
| nlsf elastic | |||
| nlsf viscous | |||
| nlsf viscoelastic | |||
| nlp elastic | |||
| nlp viscous | |||
| nlp viscoelastic | |||
| Constitutive law wrapper | 1D | 3D | 6D |
| invariant angular (wrapper) | |||
The constitutive laws are entered as follows:
<constitutive_law_definition> ::= <specific_const_law>
[ , prestress, (entity) <prestress> ]
[ , prestrain, (entity_tpl_driver) <prestrain> ]
<specific_const_law> ::= <const_law_name> ,
<const_law_data>
where const_law_name is the name of the constitutive law and
const_law_data depends on the specific constitutive law.
The latter fields, whose type depends on the dimensionality of the
constitutive law, are optional, under the assumption that the
constitutive law is the last portion of a card, or that any ambiguity
can be avoided.
The data specific to the currently available constitutive laws must be
entered as follows:
<specific_const_law> ::= linear elastic [ isotropic ] ,
(scalar) <stiffness>
the isotropic stiffness coefficient; the word isotropic
can be omitted, essentially because it has no meaning
for scalar constitutive laws.
constitutive law: 1, name, "scalar isotropic law",
1, linear elastic, 1.e9;
constitutive law: 2, name, "3D isotropic law",
3, linear elastic isotropic, 1.e9;
constitutive law: 3, name, "6D isotropic law",
6, linear elastic isotropic, 1.e9;
<specific_const_law> ::= linear elastic generic ,
(derivative_of_entity) <stiffness>
the stiffness matrix. In case of 1D, the type is scalar,
and there is no distinction between generic and isotropic,
while, in case of n x 1 vectors, the type is the corresponding
n x n matrix.
constitutive law: 1, name, "scalar isotropic law",
1, linear elastic generic, 1.e9;
constitutive law: 2, name, "3D isotropic law",
3, linear elastic generic,
sym, 1.e9, 0., 0.,
1.e6, -1.e5,
1.e6;
constitutive law: 3, name, "6D isotropic law",
6, linear elastic generic,
diag, 1.e9, 1.e9, 1.e9, 1.e6, 1.e6, 1.e6;
<specific_const_law> ::=
linear elastic generic axial torsion coupling ,
(derivative_of_entity) <stiffness> ,
(scalar) <coupling_coefficient>
this is defined only for 6 x 1 vectors, where the torsion stiffness,
coefficient a44 in the stiffness matrix, depends linearly on
the axial strain,
<specific_const_law> ::=
cubic elastic generic
(entity) <stiffness1> ,
(entity) <stiffness2> ,
(entity) <stiffness3>
this is defined only for scalar and 3 x 1 vectors; the constitutive
law is written according to the formula
<specific_const_law> ::= log elastic ,
(derivative_of_entity) <stiffness>
this is defined only for scalars. The force is defined as:
![]()
<specific_const_law> ::= linear elastic bistop,
(derivative_of_entity) <stiffness> ,
[ initial state , { inactive | active } , ]
(DriveCaller)<activating_condition> ,
(DriveCaller)<deactivating_condition>
<specific_const_law> ::= double linear elastic ,
(scalar) <stiffness_1> ,
(scalar) <upper_strain> ,
(scalar) <lower_strain> ,
(scalar) <stiffness_2>
this is defined for scalar and 3 x 1 vectors. In the scalar case the
meaning of the entries is straightforward, while in case of 3 x 1 vectors,
the constitutive law is isotropic but in the local direction 3, where, in
case of strain out of the upper or lower bound, the stiffness_2 is
used.
<specific_const_law> ::= isotropic hardening elastic ,
(scalar) <stiffness> ,
(scalar) <reference_strain>
[ , linear stiffness , <linear_stiffness> ]
this constitutive law is defined as follows:

<specific_const_law> ::= scalar function elastic isotropic ,
(DifferentiableScalarFunction)<function>
this constitutive law is defined as follows:
<specific_const_law> ::= scalar function elastic orthotropic ,
{ (DifferentiableScalarFunction)<function> | null }
[ , ... ]
this constitutive law is defined as follows:
scalar function: "myfunc", multilinear,
-1., -100.,
-.5, -70.,
0., 0.,
.5, 70.,
1., 100.;
constitutive law: 1000, 3,
scalar function elastic orthotropic,
null,
null,
"myfunc";
indicates that the constitutive law is only defined in direction 3
as a multilinear function.
<specific_const_law> ::= linear viscous [ isotropic ] ,
(scalar) <viscosity_coefficient>
the linear viscous coefficient.
<specific_const_law> ::= linear viscous generic ,
(derivative_of_entity) <viscosity_matrix>
the linear viscous matrix.
<specific_const_law> ::= linear viscoelastic [ isotropic ] ,
(scalar) <stiffness> ,
{ (scalar) <viscosity_coefficient>
| proportional, (scalar) <factor> }
the isotropic stiffness and viscosity coefficients.
<specific_const_law> ::= linear viscoelastic generic ,
(derivative_of_entity) <stiffness> ,
{ (derivative_of_entity) <viscosity_matrix>
| proportional, (scalar) <factor> }
the linear stiffness and viscosity matrices.
<specific_const_law> ::= linear time variant viscoelastic generic ,
(derivative_of_entity) <stiffness> ,
(DriveCaller> <stiffness_scale> ,
{ (derivative_of_entity) <viscosity>
| proportional, (scalar) <factor> } ,
(DriveCaller> <viscosity_scale>
the linear stiffness and viscosity matrices are multiplied
by the respective scale factors,
| f | = stiffness . stiffness |
(2.40) |
linear time variant visco elastic,
1000., cosine, 2., pi/.2, .1/2, half, 1.,
100., cosine, 2., pi/.2, 1/2, half, 1.
At 2s, the stiffness grows of 10% from the nominal value in .2s,
while the damping doubles.
See Section 2.5 for details on the syntax of drive callers.
Beware that arbitrarily changing the stiffness and the damping of an elastic component during the execution of the simulation may have no physical meaning. The intended use of this feature is for tailoring the analysis; for example, a higher damping level may be desirable to smooth out a non-physical transient, and later return to the appropriate damping value.
<specific_const_law> ::=
linear viscoelastic generic axial torsion coupling ,
(derivative_of_entity) <stiffness> ,
{ (derivative_of_entity) <viscosity_matrix>
| proportional, (scalar) <factor> }
(scalar) <coupling_coefficient>
this is defined only for 6 x 1 vectors; it is the viscoelastic
extension of the
linear elastic generic axial torsion coupling constitutive law.
<specific_const_law> ::=
cubic elastic generic
(entity) <stiffness1> ,
(entity) <stiffness2> ,
(entity) <stiffness3> ,
(derivative_of_entity) <viscosity_matrix>
this is defined only for scalar and 3 x 1 vectors; the constitutive
law is written according to the formula
<specific_const_law> ::= double linear viscoelastic ,
(scalar) <stiffness_1> ,
(scalar) <upper_strain> ,
(scalar) <lower_strain> ,
(scalar) <stiffness_2> ,
(scalar) <viscosity_coefficient>
[ , second damping , (scalar) <viscosity_coefficient_2> ]
this is analogous to the double linear elastic constitutive law,
except for the isotropic viscosity term.
The second viscosity value is used when the strain is outside the
lower_strain-upper_strain range.
When this constitutive law is used with 3 x 1 vectors, the double linear elastic and viscous term only applies to component 3.
<specific_const_law> ::= turbulent viscoelastic ,
(scalar) <stiffness> ,
(scalar) <parabolic_viscous_coefficient>
[ , (scalar) <threshold>
[ , (scalar) <linear_viscous_coefficient> ] ]
the constitutive law has the form:
<specific_const_law> ::= linear viscoelastic bistop ,
(derivative_of_entity) <stiffness> ,
(derivative_of_entity) <viscosity_coefficient> ,
[ initial state , { inactive | active } , ]
(DriveCaller)<activating_condition> ,
(DriveCaller)<deactivating_condition>
<specific_const_law> ::= shock absorber ,
[ prestrain , <value> , ]
<reference pressure> ,
<reference area for force computation> ,
<interaction coefficient> ,
<polytropic exponent> ,
[ epsilon max , <upper strain bound> , ]
[ epsilon min , <lower strain bound> , ]
[ penalty , <penalty factor for strain> ,
<penalty factor for strain rate> , ]
[ metering , <metering area> ,
[ negative , <metering area for negative strain rate> , ]
[ orifice , <orifice area> , ]
<fluid area> ,
<fluid density> ,
<drag coefficient / reference length
(scales strain rate to velocity)>
[ , friction, <reference epsilon prime> ,
<friction amplitude coefficient> ]
where
The syntax is
<specific_const_law> ::= symbolic elastic ,
epsilon , " <epsilon> " ,
expression , " <expression> "
where epsilon is the symbol describing the input
parameter as it will be used in expression.
For constitutive laws with more than one dimension, a string for each epsilon and one for each expression are expected. For example:
# 1D symbolic constitutive law
constitutive law: 1001, 1, symbolic elastic,
epsilon, "eps",
expression, "1000.*eps + 5.*eps^3";
# 3D symbolic constitutive law
constitutive law: 1003, 3, symbolic elastic,
epsilon, "eps1", "eps2", "eps3",
expression,
"1000.*eps1 + 5.*eps1^3 - 10.*eps2*eps3",
"1000.*eps2 + 5.*eps2^3 - 10.*eps3*eps1",
"1000.*eps3 + 5.*eps3^3 - 10.*eps1*eps2";
Note: right now, the symbols defined within the mathematical parser are not available within symbolic consitutive laws.
<specific_const_law> ::= symbolic viscous ,
epsilon prime , " <epsilon_prime> " ,
expression , " <expression> "
where epsilon_prime is the symbol describing the derivative
of the input parameter as it will be used in expression.
For constitutive laws with more than one dimension, a string for each epsilon_prime and one for each expression are expected.
<specific_const_law> ::= symbolic viscoelastic,
epsilon , " <epsilon> " ,
epsilon prime , " <epsilon_prime> " ,
expression , " <expression> "
where epsilon and epsilon_prime are the symbols describing
the input parameter and its derivative as they will be used
in expression.
For constitutive laws with more than one dimension, a string for each epsilon, one for each epsilon_prime, and one for each expression are expected.
The syntax is
<specific_const_law> ::= ann elastic ,
" <file_name> "
where the file file_name contains the parameters of the network.
What is mainly significant to users is the need to scale inputs and outputs
to match the amplitudes and possibly the offsets used in the training.
For this purpose, the last two rows of the input files contain coefficients
b1 b0
a1 a0
which are used to scale the input u and the output y according
to the transformation
| = b1u + b0 | (2.41) | |
| = a1y + a0 | (2.42) |
y = ![]() |
(2.43) |
<specific_const_law> ::= ann viscoelastic ,
" <file_name> "
where the file file_name contains the parameters of the network.
For an n-dimensional constitutive law, it implements the formula
Elastic and viscous variants are defined. They differ from the viscoelastic one by only allowing the specific fraction of the input data.
<specific_const_law> ::= nlsf viscoelastic ,
(derivative_of_entity) <kappa_0'> ,
{ null | (scalar_function) <diag_force'> }
[ , ... ] ,
{ (derivative_of_entity) <kappa_0''> | proportional , <coef> } ,
{ null | (scalar_function) <diag_force''> }
[ , ... ]
<specific_const_law> ::= nlsf elastic ,
(derivative_of_entity) <kappa_0'> ,
{ null | (scalar_function) <diag_force'> }
[ , ... ]
<specific_const_law> ::= nlsf viscous ,
(derivative_of_entity) <kappa_0''> ,
{ null | (scalar_function) <diag_force''> }
[ , ... ]
The terms kappa_0' and kappa_0'' are indicated as
``derivative of entity'' because in the generic case they are the result
of a differential operator that computes the derivative of the force vector
as function of the strain or strain rate vectors.
So, for a 3D constitutive law, the force, the strain and the strain rate
are 3 x 1 vectors, while kappa_0' and kappa_0''
are 3 x 3 matrices.
Matrix input, in MBDyn, requires to write the whole set of coefficients,
row-wise; however, it can be described in many synthetic manners if
matrices have some special properties, as typical linear constitutive laws do.
For example, symmetric, diagonal and empty matrices have specific short forms; in the 3 x 3 case they are
# generic 3x3 matrix:
10., -2., -2.,
-2., 20., -8.,
-2., -8., 20.
# symmetric 3x3 matrix (same as above matrix):
sym,
10., -2., -2.,
20., -8.,
20.
# diagonal 3x3 matrix (diagonal of above matrix):
diag,
10., 20., 20.
# empty 3x3 matrix:
null
The terms diag_force' and diag_force'' refer
to the names of the scalar functions that are defined for each component
of the force vector.
There must be as many terms as the dimensions of the constitutive law.
These terms can either be null, if no non-linear contribution
is defined for that component, or contain a string, enclosed in double quotes,
which must refer to an already defined scalar function.
The same scalar function can be used multiple times.
# define a scalar function
scalar function: "exponential", exp, coefficient, -2., 5.;
# define a 1D constitutive law
constitutive law: 1000, 1,
nlsf viscoelastic,
10.,
null, # stiffness is just linear
0.,
"exponential"; # damping is exponential
# define a 3D constitutive law
constitutive law: 3000, 3,
nlsf viscoelastic,
sym,
10., -2., -2.,
10., -2.,
10.,
null, # stiffness is just linear
null, # stiffness is just linear
null, # stiffness is just linear
null,
"exponential", # damping is exponential...
null, # ...but in direction 1 only!
null;
The first constitutive law corresponds to
| f = 10.0 . |
(2.45) |
f = ![]() ![]() |
(2.46) |
This constitutive law consists in the linear combination
of nonlinear elastic and viscous effects whose coefficients
are arbitrary nonlinear functions of the strain
:
Elastic and viscous variants are defined. They differ from the viscoelastic one by only allowing the specific fraction of the input data.
<specific_const_law> ::= nlp viscoelastic ,
(derivative_of_entity) <kappa_0'> ,
{ null | (scalar_function) <diag_stiffness> }
[ , ... ] ,
{ (derivative_of_entity) <kappa_0''> | proportional , <coef> } ,
{ null | (scalar_function) <diag_damping> }
[ , ... ]
<specific_const_law> ::= nlp elastic ,
(derivative_of_entity) <kappa_0'> ,
{ null | (scalar_function) <diag_stiffness> }
[ , ... ]
<specific_const_law> ::= nlp viscous ,
(derivative_of_entity) <kappa_0''> ,
{ null | (scalar_function) <diag_damping> }
[ , ... ]
# define a scalar function
scalar function: "exponential", exp, coefficient, -2., 5.;
# define a 1D constitutive law
constitutive law: 1000, 1,
nlp viscoelastic,
10.,
null, # stiffness is just linear
0.,
"exponential"; # damping slope is exp.
# define a 3D constitutive law
constitutive law: 3000, 3,
nlp viscoelastic,
sym,
10., -2., -2.,
10., -2.,
10.,
null, # stiffness is just linear
null, # stiffness is just linear
null, # stiffness is just linear
null,
"exponential", # damping slope is exp...
null, # ...but in direction 1 only!
null;
The first constitutive law corresponds to
| f = 10.0 . |
(2.48) |
f = ![]() ![]() |
(2.49) |
<specific_const_law> ::= invariant angular ,
<xi> , <ancillary_const_law>
xi is the fraction of relative orientation the ancillary
constitutive law will be referred to, with respect
to the first node of the joint.
Its value should be comprised between 0 (attached to the first node)
and 1 (attached to the second node); a value of 1/2 yields
the invariant deformable hinge
joint, but any value is allowed, not limited to within the [0, 1] range.
Note: the contribution to the Jacobian matrix will be incomplete
when the underlying constitutive law has a viscous contribution.
This may slow down convergence, or even prevent it.
If this is an issue,
the invariant deformable hinge
should be used, since it does not suffer from this limitation,
although it only allows