AbaqusCSE
This is the documentation for the new version of the Abaqus solver wrapper, which uses the Abaqus Co-Simulation Engine (CSE) avoiding the need to start and stop Abaqus every coupling iteration. Refer to Abaqus for the old version of the Abaqus solver wrapper.
Abaqus is a structural solver implementing the finite element method. Currently, this wrapper only supports FSI simulations, no other multi-physics problems.
For two-dimensional cases, the traction forces are not taken into account
Restart has not yet been implemented
Terminology
- A step in Abaqus is a convenient period of time (during which a load is applied for example). Within the context of CoCoNuT it usually coincides with the complete duration of the calculation. It should not be confused with the time step.
- An increment in Abaqus is usually equal to the time step of Abaqus, unless subcycling is applied within the Abaqus solver. Then a time step can be subdivided in multiple increments.
- In an implicit or strongly coupled FSI calculation, the structural solver is called multiple times per time step. A call of the the flow solver and subsequent call of the structural solver is called a coupling iteration. All coupling iterations are part of the same attempt of the same increment (unless subcycling is used).
Subcycling
Subcycling has not been tested for this solver wrapper. Note that the maximum number of increments is now set to the number of time steps. In order to apply subcycling, this needs to be modified.
Licensing
If the Abaqus license server needs to be specified explicitly, it is advised to do this in the solver modules file by setting the variable LM_LICENSE_FILE.
The file abaqus_v6.env
is the environment file for the Abaqus solver and will be automically created by the CoCoNuT Python wrapper.
Fluid-structure interaction with Abaqus
Abaqus (Dassault Systèmes) can be used to solve for the structural displacement/deformation in partitioned FSI-simulations.
The FSI interface consist of a surfaces in the Abaqus model, where pressure and traction loads are applied.
The loads are applied in the element centers, the displacements are exported in the element nodes.
The input loads are collected in one or more ModelParts
in the input Interface
,
the output nodes are collected in one or more ModelParts
of the output Interface
.
Each ModelPart
on the input Interface
has a counterpart on the output Interface
.
More information about ModelParts
and Interface
can be found in the data structure documentation.
Parameters
This section describes the parameter settings in the JSON file.
It can be useful to have a look at a JSON file of one of the examples in the examples
folder.
parameter | type | description |
---|---|---|
cores |
int | Number of cores to be used by Abaqus. |
debug |
bool | (optional) Default: false . Additional files are created or retained that are helpful for debugging, such as Abaqus send-and-receive file (Abaqus.SRE) or the input and output data of the solver for every coupling iterations. |
dimensions |
int | Dimensionality of the problem (2 or 3). |
disable_modification_of_input_file |
bool | (optional) Default: false . If true , the input file is not modified by CoCoNuT but simply copied to a file named Abaqus.inp. The user is responsible to correctly define the co-simulation settings, the time step, the duration, the output and the restart behaviour. |
interface_input |
list | Should contain a dictionary for each input ModelPart to be created, having a key model_part and a key variables . The order of the list should correspond to the order of the Abaqus surfaces provided in the parameter surfaces , as well as to the order of the model parts in the other solver. The value of the key variables should be a list of the variables pressure and traction . The interface_input corresponds to the face centers of the elements on the surface. |
interface_output |
list | Similar to interface_input but contains the output ModelParts for Abaqus geometrical nodes. In this case the variables key specifies the output variable, chosen from data_structure/variables.py . Here, the value of the key variables should be a displacement . Again, the order should correspond to the surfaces as well as to the Interface definitions of the solver to which Abaqus is coupled. |
input_file |
str | Name of the Abaqus input file (.inp) provided by the user. Example: case.inp |
port |
int | (optional) If not provided, the operating system will choose a free port. This port is used for the communication between the AbaqusWrapper executable and the CSE. |
save_results |
int | (optional) Default: 1 . This will modify the frequency of storing fields or history in the .odb file. If no output definition is present in the input file, one is created for the PRESELECT variables. |
surfaces |
list | List of the surface names defined in Abaqus. Note that the order has to be the same as those of the interface definitions. Take the Abaqus naming conventions into account: surfaces names are capitalized unless specified within double quotes in the input file, and the name is often prepended for example with ASSEMBLY_ (“Assembly.Part” is translated to “Assembly_Part”). |
working_directory |
str | Relative path to the directory in which Abaqus will be executed and where all structural information will be stored. This folder is typically called CSM , but any name is allowed. It should be created before execution and contain the input file. |
The following parameters are usually defined in the top-level settings of the JSON file, but they can also be given directly as parameter of the solver wrapper (e.g. for standalone testing). If they are defined in both locations, a warning is printed and the top-level value is used.
parameter | type | description |
---|---|---|
delta_t |
float | Size of the time step in Abaqus. |
number_of_timesteps |
int | The amount of time steps to run the calculation. For a steady calculation, the value should be 1 . |
save_restart |
int | Indicates the time step interval at which files for restart have to be saved. A minus sign indicates only the files from the last interval are retained. |
timestep_start |
int | Time step to start from. Data should be available at this time step. For a new simulation this value will typically be 0 . |
Overview of operation
The communication with Abaqus is achieved through the Co-Simulation Engine (CSE). Therefore, CoCoNuT will launch 3 processes simultaneously, as shown below. The dashed arrows represent communication at the start of the calculations, while the full arrows represent communication of pressure, traction and displacement on run time.
On the far right, the Abaqus process is shown, which is the actual solver.
The used mesh information and settings are contained within an input file Abaqus.inp
.
CoCoNuT crates this file based on the provided input_file
in the JSON file.
The time step, duration, number of increments, output frequency, restart frequency and co-simulation settings are all updated or added by the Python solver wrapper (unless disable_modification_of_input_file
is true
). This includes the load definition on the ModelParts
and a basic output request.
The communication with this Abaqus process is taken care of by the Co-Simulation Engine (CSE).
This is a second process launched by the Python solver wrapper.
Its settings are dictated by the file CSE_config.xml
which is also created by Python solver wrapper.
Finally, a third process is launched: the executable AbaqusWrapper.
Its C++ code is stored in coupling_components/solver_wrappers/abaqus_cse/AbaqusWrapper
and automatically compiled by the Python solver wrapper.
At the start of a calculation, it receives input written by the Python solver wrapper by reading the file AbaqusWrapper_input.txt
.
When the calculation is running, the Python solver wrapper communicates with the AbaqusWrapper using text files such as: pressure_mp0.txt
.
The suffix mp0 refers to model part 0, that is the first model part.
Log files
Since the Python wrapper will launch three separate processes, it is wise to check the log file of each process should an error occur.
- The Abaqus process is launched in the
working_directory
, and the log file is namedabaqus.log
. Usually, useful information can be found inAbaqus.msg
and occasionallyAbaqus.dat
. - The CSE process is launched in a subfolder,
CSE
, of theworking_directory
, and the log file is namedcse.log
. - The AbaqusWrapper process is launched in a subfolder,
AbaqusWrapper
, of theworking_directory
, and the log file is namedAbaqusWrapper.log
.
For debugging purposes, it is usefull to set the debug
JSON parameter on true, resulting in the output of additional files.
Setting up a case: creation of an Abaqus input file (.inp)
The Abaqus solver wrapper is configured to start from an input file which contains all necessary information for the calculation.
Its name should be specified in the JSON file via the parameter input_file
, and it should be located in the working_directory
.
For the remainder of this section this file will be referred to as "base file".
Creation of the base file is not considered a part of the solver wrapper functionality as it is case-specific. However, in order for the solver wrapper to work, the base file has to comply with certain general conditions. This section aims at informing the user about the requirements for the base file.
General
The base file needs to be of the ".inp" type, this is an "input file for Abaqus". ".inp-files" are created via Abaqus by, after configuration, creating a "job" and requesting a "write input" for that job. These files can be opened in Abaqus by using "file > import > model". The base file has to contain all necessary information about the structural model, which includes:
- Mesh defining the structure geometry and discretization.
- Also, the element type needs to be defined.
- Material properties.
- Boundary conditions.
- Surfaces where external loads need to be applied (one surface per
ModelPart
).- Here "Surface" refers to nomenclature of the Abaqus software itself. The name can be found as such in the Abaqus working tree.
- A Step definition, which contains solver settings. The following type of analyses are some examples (it is advised to explicitly set them based on this documentation rather than leaving it to Abaqus to fill in a default):
- Implicit dynamic, application quasi-static
- Implicit dynamic, application moderate dissipation
- Implicit dynamic, application transient fidelity
- Static general
- Additional loads not dependent on the flow solver.
Abaqus models contain parts and those parts are used to create assemblies. The assembly, determines the position and orientation that will be used.
Abaqus has a GUI as well as a Python interface (which is also accessible) via the GUI. References to both the Python interface and GUI will be made below.
Creating surfaces in Abaqus
Per surface in the fluid-structure interface (where loads and displacements need to be exchanged) a "surface" should be created. There are multiple possibilities to create these surfaces:
- From the geometry: when the geometry has been defined in Abaqus itself, the geometry faces can easily be selected in the GUI. This method is often the most straightforward, but the Abaqus model should contain the geometry.
- From the mesh: when the geometry is not available (this can for example be the case when a mesh has been imported), a surface can be defined by selecting multiple mesh faces. As a surface typically covers many mesh faces, it is useful there to select the regions "by angle", which uses the angle between mesh faces to determine whether adjacent faces should be selected. This way the surface selection can be extended until a sharp corner is met.
- By converting a "node set" containing all the nodes on the surface and then calling the
SurfaceFromNodeSet
method which can be found in themake_surface.py
file incoupling_components/solver_wrappers/abaqus/extra
. It is advised to copy this file to the working directory.
An example on the use of SurfaceFromNodeSet
(via the Python console in Abaqus or a Python script for Abaqus):
from make_surface import SurfaceFromNodeSet
my_model = mdb.models['Model-1']
my_assembly = my_model.rootAssembly
my_instance = my_assembly.instances['PART-1-1']
inputSurfaceA = SurfaceFromNodeSet(my_assembly, my_instance, 'NODESET_NAME_A', 'SURFACE_NAME_A')
Note about choosing model parts and surfaces
The created "surfaces" for load input and displacement output, correspond to ModelParts
in the CoCoNuT code. It is strongly advised to subdivide to fluid-structure interaction interface intelligently, depending on the geometry.
As a rule of thumb it can be said that a surfaces at two sides of a sharp corner should be assigned to a different ModelPart
.
Issues can arise at sharp corners, as the interpolation is based on shortest distance.
Those are avoided by having different ModelParts
at each side of the corner.
Another reason to do this is because the code cannot handle elements with two or more faces being part of the same ModelPart
.
This situation would occur if the surface contains corners.
An example is an airfoil where the suction side and pressure side belong to the same ModelPart
: elements at the trailing edge will have (a) face(s) at both the pressure side and suction side.
Even when the code would allow this, interpolation mistakes become likely, as a geometrical node or element center on the suction side could have (a) nearest neighbour(s) on the pressure side, leading to wrong data being used for interpolation.
End of the calculation
Unlike for the other solvers, CoCoNuT does not keep track of the time it takes to write output files, since this is controlled by Abaqus and triggered by CoCoNuT.
Nevertheless, the output frequency is controlled by CoCoNuT and can be set with the JSON file parameter save_results
.
Solver coupling convergence
The convergence criterion solver coupling convergence has not yet been implemented for this Abaqus solver wrapper.
Version specific documentation
v2023
No major changes.
v2024
Abaqus is now using Python 3.10 instead of Python 2.7.