- constant_propertiesConstant mechanical and thermal material properties (PROPS)
C++ Type:std::vector<double>
Controllable:No
Description:Constant mechanical and thermal material properties (PROPS)
- num_state_varsThe number of state variables this UMAT is going to use
C++ Type:unsigned int
Controllable:No
Description:The number of state variables this UMAT is going to use
- pluginUEL plugin file
C++ Type:FileName
Controllable:No
Description:UEL plugin file
AbaqusUserElement
Coupling UserObject to use Abaqus UEL plugins in MOOSE
Description
The AbaqusUserElement
user object is used to execute Abaqus UEL plugins that users code with the purpose of building finite element kinematics (i.e. interpolation functions), numerical treatments (e.g. locking correction), Jacobian of the forces with respect to the displacements and the forces themselves. These plug-ins can be coded in Fortran (.f
and .f90
file extensions) or C/C++ (.c
and .C
file extensions) and can be located in the plugins
directory of the app or another appropriate directory such as examples
.
Note that one can combine a UEL routine with UMAT routines such that the UEL coder is responsible for calling a UMAT routine compiled within the same plugin.
When state variables are needed, the user is responsible for prescribing them in the input files via num_state_vars =
in the AbaqusUserElement
user object.
Various forms of verification of this interface have been carried out. The most general is that defined by a beam subjected to external loading. The internal forces are a function of strain-dependent state variables and two external fields that vary spatially. Results between a UEL of triangular elements and the corresponding model set up in MOOSE with a call to an equivalent UMAT routine match to a relative tolerance of .
The input file that calls the UEL does so from the AbaqusUserElement
block:
[UserObjects]
[uel]
type = AbaqusUserElement
variables = 'disp_x disp_y'
plugin = ../../../examples/uel_tri_states_tests/uel
use_displaced_mesh = false
num_state_vars = 8
constant_properties = '100 0.3' # E nu
external_fields = 'temperature voltage'
extra_vector_tags = 'kernel_residual'
[]
[]
(moose/modules/tensor_mechanics/test/tests/uel/small_test_uel_states_fields_gradient.i)The equivalent input file that performs all the setup in MOOSE, except the computation of internal forces, uses the AbaqusUMATStress
plugin.
[umat]
type = AbaqusUMATStress
constant_properties = '100 0.3'
plugin = '../../plugins/small_elastic_tri_states'
num_state_vars = 2
use_one_based_indexing = true
temperature = 'temperature'
external_fields = 'voltage'
[]
(moose/modules/tensor_mechanics/test/tests/uel/small_test_umat_states_fields_gradient.i)Interface
The UEL plugin entry function signature is defined in the AbaqusUserElement.h
header file
typedef void (*uel_t)(
Real RHS[], // (MLVARX,*) Residual vector contribution for the current element
Real AMATRX[], // (NDOFEL,NDOFEL) Jacobian contribution for the current element
Real SVARS[], // (NSVARS) Persistent state variable values for the current element
Real ENERGY[], // (8) Energy quantities at the start of the current
// increment (to be updated by the UEL routine)
int * NDOFEL, // Number of degrees of freedom (DOFs) for the current element
int * NRHS, // NRHS=1: RHS should contain the residual vector,
// NRHS=2: not implemented (modified Riks static procedure)
int * NSVARS, // Number of persistent state variables for the element
Real PROPS[], // (NPROPS) Static property values (parameters) defined for use with this
// element.
int * NPROPS, //
Real COORDS[], // (MCRD,NNODE) Undisplaced coordinates of the element nodes
// COORDS(K1,K2) is the K1th coordinate of the
// K2th node of the element
int * MCRD, // Maximum number of coordinates needed at any node point (COORDINATES keyword -
// unsupported)
int * NNODE, // Number of nodes in the current element
Real U[], // (NDOFEL) Total values of the variables
Real DU[], // (MLVARX,*) Incremental values of the variables for the current increment
// for right-hand-side
Real V[], // (NDOFEL) Time rate of change of the variables (velocities,
// rates of rotation). Defined for implicit dynamics only (LFLAGS(1)
// 11 or 12)
Real A[], // (NDOFEL) Accelerations of the variables. Defined for implicit dynamics
// only (LFLAGS(1) 11 or 12).
int * JTYPE, // Integer defining the element type. This is the user-defined integer value n in
// element type Un
Real TIME[], // (2) step time and total time
Real * DTIME, // Time increment
int * KSTEP, // Step number (as per Abaqus definition) can be set by the user
int * KINC, // Increment number (MOOSE time step)
int * JELEM, // User-defined element number
Real PRAMS[], // (*) parameters associated with the solution procedure
int * NDLOAD, // Number of applied loads to the element (unused)
int JDLTYP[], // (MDLOAD, *) array containing the integers used to define distributed load
// types for the element
Real ADLMAG[], // (MDLOAD,*)
Real PREDEF[], // (2,NPREDF,NNODE) predefined field variables, such as temperature in an
// uncoupled stress/displacement analysis
int * NPREDF, // Number of predefined field (auxiliary) variables, including temperature
int LFLAGS[], // (*) flags that define the current solution procedure
int * MLVARX, // used when several displacement or right-hand-side vectors are used
Real DDLMAG[], // (MDLOAD,*)
int * MDLOAD, // Total number of distributed loads and/or fluxes defined on this element
Real * PNEWDT, // Recommended new timestep (unused)
int JPROPS[], // (NJPROP) NJPROP integer property values defined for the current element
int * NJPROP, // Number of user defined integer properties
Real * PERIOD // Current step time period (unused)
);
(moose/modules/tensor_mechanics/include/userobjects/AbaqusUserElement.h)Output parameters
The UEL routine sets RHS
, AMATRX
, SVARS
, ENERGY
, and PNEWDT
RHS
is the residual contribution for the DOFs associated with the current elementAMATRIX
are the Jacobian contributions for the DOFs associated with the current elementSVARS
are stateful properties (persistent across timesteps) that are managed by the user object similar to stateful material properties in MOOSEENERGY
array of 6 energy quantities (currently not used by MOOSE)Kinetic energy.
Elastic strain energy.
Creep dissipation.
Plastic dissipation.
Viscous dissipation.
Artificial strain energy stemming from e.g. artificial stiffness to control singular modes
Electroststic energy
Incremental work done by loads applied through the UEL routine
PNEWDT
is a new recommended simulation time step (currently not used by MOOSE)
Input parameters
Please consult the Abaqus user manual for more documentation on the UEL plugin parameters.
Input Parameters
- blockThe list of blocks (ids or names) that this object will be applied
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:The list of blocks (ids or names) that this object will be applied
- external_fieldsAuxiliary field variables (or 'predifined field variables') passed to the UEL plugin. Some plugins may assume that the first field is temperature when there are multiple external fields.
C++ Type:std::vector<AuxVariableName>
Controllable:No
Description:Auxiliary field variables (or 'predifined field variables') passed to the UEL plugin. Some plugins may assume that the first field is temperature when there are multiple external fields.
- jtype0Abaqus element type integer
Default:0
C++ Type:int
Controllable:No
Description:Abaqus element type integer
- prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
C++ Type:MaterialPropertyName
Controllable:No
Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
- variablesNonlinear coupled variables
C++ Type:std::vector<NonlinearVariableName>
Controllable:No
Description:Nonlinear coupled variables
Optional Parameters
- absolute_value_vector_tagsThe tags for the vectors this residual object should fill with the absolute value of the residual contribution
C++ Type:std::vector<TagName>
Controllable:No
Description:The tags for the vectors this residual object should fill with the absolute value of the residual contribution
- extra_matrix_tagsThe extra tags for the matrices this Kernel should fill
C++ Type:std::vector<TagName>
Controllable:No
Description:The extra tags for the matrices this Kernel should fill
- extra_vector_tagsThe extra tags for the vectors this Kernel should fill
C++ Type:std::vector<TagName>
Controllable:No
Description:The extra tags for the vectors this Kernel should fill
- matrix_tagssystemThe tag for the matrices this Kernel should fill
Default:system
C++ Type:MultiMooseEnum
Controllable:No
Description:The tag for the matrices this Kernel should fill
- vector_tagsnontimeThe tag for the vectors this Kernel should fill
Default:nontime
C++ Type:MultiMooseEnum
Controllable:No
Description:The tag for the vectors this Kernel should fill
Tagging Parameters
- allow_duplicate_execution_on_initialFalseIn the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).
Default:False
C++ Type:bool
Controllable:No
Description:In the case where this UserObject is depended upon by an initial condition, allow it to be executed twice during the initial setup (once before the IC and again after mesh adaptivity (if applicable).
- control_tagsAdds user-defined labels for accessing object parameters via control logic.
C++ Type:std::vector<std::string>
Controllable:No
Description:Adds user-defined labels for accessing object parameters via control logic.
- enableTrueSet the enabled status of the MooseObject.
Default:True
C++ Type:bool
Controllable:Yes
Description:Set the enabled status of the MooseObject.
- execution_order_group0Execution order groups are executed in increasing order (e.g., the lowest number is executed first). Note that negative group numbers may be used to execute groups before the default (0) group. Please refer to the user object documentation for ordering of user object execution within a group.
Default:0
C++ Type:int
Controllable:No
Description:Execution order groups are executed in increasing order (e.g., the lowest number is executed first). Note that negative group numbers may be used to execute groups before the default (0) group. Please refer to the user object documentation for ordering of user object execution within a group.
- force_postauxFalseForces the UserObject to be executed in POSTAUX
Default:False
C++ Type:bool
Controllable:No
Description:Forces the UserObject to be executed in POSTAUX
- force_preauxFalseForces the UserObject to be executed in PREAUX
Default:False
C++ Type:bool
Controllable:No
Description:Forces the UserObject to be executed in PREAUX
- use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.
Default:False
C++ Type:bool
Controllable:No
Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.