IRIS user manual

Table of Contents

Prologue

IRIS is a general purpose program developed with the purpose of providing a flexible, easy to understand, and extensible framework for research in Computational Solid, Fluid, and Structural Mechanics.

The motivation for writing this code was, and still is, to provide a tool to learn and work with the finite element method — and similar methods — allowing researchers to develop specific parts of the method without the need to modify the rest of it. In this way, someone could develop a new equation solver, other a new material model, yet another some type of error estimator, and all of them find that their code will still work together at the end. At this moment, this goal has not been fully attained but special effort has been put in maintaining the structure of the code and the interfaces of the different modules as clear as possible.

The main parts of the code were written in a couple of years of part time dedication. In the last years, the program has been enhanced to include several types of elements, of solvers, of matrix formats, etc. Still, cleaning and documenting is in progress. It is a formidable tasks and both time and people resources are scarce.

The philosophy of the code has always been to favor clarity over speed, yet to render a final code that is fast enough to deal with moderately large problems (in the order of tens of thousands of equations). To achieve this goal the most time consuming part of the solution in large problems — solving large systems of linear equations — employs “high performance” libraries programmed by somebody else, and taken from the internet. The same principle applies to other CPU intensive linear algebra computations (eigenvalue computation, preconditioning, etc). In this way, IRIS developers can concentrate in writing, and maintaining, the tasks more directly related to the finite element method.

The program has been written with the programmer, as well as the user, in mind. Hence, many tools are available for debugging and testing the code as it is written. In particular, problems can be run in “interactive” mode, where the programmer can request specific information from the code at run time.

IRIS started as a pure C code but it grew up to a point where data structures were becoming so complex that it was becoming difficult to understand, which clearly invalidated the original goals. In 2005, the code started to have C structures which contained pointers to functions whose arguments were pointers to structures and pointers to functions too. At this moment, it became clear that the programming language was not suitable for the things that the code wanted to accomplish. And so the code was re-written in C++. Again this major transformation took more than two years and was done in such a way that a working version had to exist at all times. The code was not written from scratch, and some C parts were reused. The outcome is a smaller code, much cleaner, clearer, understandable, maintainable, and extensible. Some of the features of the “old” IRIS have not been ported to the “new” one yet, but most have.

As of today, IRIS can solve a wide variety of problems. Some of its salient features are:

  • it can deal with linear and nonlinear problems;
  • it includes quasistatic and transient integrators;
  • solid elements for small strain and finite, including displacement, mixed and enhanced formulations;
  • fluid elements for the Stokes and Navier-Stokes equations, including stabilized elements;
  • thermal elements for the (nonlinear) Poisson equation;
  • specific analyses exist for topology optimization, mode computation, calculation of dispersion diagrams;
  • linear and nonlinear elastic, elastoplastic, thermal and fluid material models.

As explained above, the code makes use of open source libraries. These include:

  • Intel Threading Building Blocks (TBB), providing the templates for multithreading programming.
  • BLAS and LAPACK are used throughout.
  • Large systems of linear equations can be solved using libraries such as SuperLU, LDL, Pardiso, WSMP, HSL, and, on macOS, Apple’s Accelerate framework. Some of these require specific licences so they are not distributed with IRIS.
  • Finally, IRIS might make use of Petsc. This is a huge project that provides an interface to many other sparse linear solvers that can be used in the code.

As for the rest, all the code is original and has been written from scratch mainly by the author and students of his research groups at UPM and IMDEA Materials Institute.

1. Installing IRIS

IRIS is a medium-sized program which depends on several libraries for complex operations in numerical algebra. To build a fully operational binary, one must link at least some of these libraries; the remaining ones can be added for additional features or improved performance. Since the code is designed to take advantage of shared-memory multi-core microprocessors, special (external) libraries must be linked to harness this feature. In addition, IRIS may be compiled to run on distributed memory computers, and this requires a special installation.

1.1. External libraries

As explained above, IRIS depends on several external — some of them optional — libraries which enable special type of computations. We describe each of them indicating what type of capabilities they enable and some instructions for their installation. The source files for the libraries are not distributed with IRIS, but mut be downloaded directly from the internet and installed in user-readable directories. It is not easy to explain all the possible solution for different machines and operating systems: IRIS makefile is simple enough to allow for customization.

The following table summarizes the requirements for external libraries

Name Mandatory / optional Tested version
BLAS Mandatory  
GMSH Optional (reduced functionality) 4.11
HSL Optional 1.02
Intel TBB Optional 4.0
LDL Optional 2.1
LAPACK Mandatory  
MUESLI Mandatory 2025
Pardiso Optional 6.0.0
PETSC Optional  
SuperLU Mandatory MT 3.1
WSMP Optional  

1.1.1. BLAS and LAPACK

The standard Basic Linear Algebra Subroutines (BLAS) and Linear Algebra Package (LAPACK) can be downloaded from the netlib repository in the internet, where instructions for their installation are provided. Given they widespread usage, most operating systems provide pre-compiled libraries, or even optimized ones. For Linux, there is a precompiled library for rpm-based distributions. For Mac OS X, the framework Accelerate contains all BLAS and LAPACK functions so there is no need to install from scratch the library for either operating system.

1.1.2. Intel TBB

This is a library of C++ classes that simplifies the implementation of multi-threading code. It can be downloaded from https://www.threadingbuildingblocks.org. In the case of Linux or MacOs operating systems, it can be installed using apt-get and brew, respectively.

Since 2025, IRIS does not require the Intel TBB library to carry out multi-threaded computations. Leveraging on the C++11 multi-threading standard library, IRIS is fully functional without Intel TBB, at the expense of some performance. This is because Intel TBB library is highly efficient and still faster than the standard multi-threading implementation. However, in the future the Intel TBB library will be removed from IRIS because it is difficult to install and link with the main code.

1.1.3. SuperLU

This is a free general purpose direct linear solver for unsymmetric sparse systems (See = http://crd-legacy.lbl.gov/~xiaoye/SuperLU=). At the current moment, the shared memory, multithreaded version of this solver is employed in IRIS.

1.1.4. LDL

This is another linear solver for general sparse systems of equations that has the virtue of being very compact. It is not extremely efficient, however.

1.1.5. WSMP

This an extremely fast library for sparse systems of equations that takes advantage of multi-processor computers. It includes specific Cholesky, symmetric, and unsymmetric solvers. Developed at IBM, it is non-free software. To include it in IRIS, and compile the necessary code to interface with it, an option needs to be set in the makefile.

1.1.6. Pardiso

Simiarly to the WSMP, this library is extremely fast and takes advantage of share-memory parallelism, providing a wide range of specialized solvers. At this moment it is not free software and no included by default in IRIS. A single option in the makefile can be set to link the library and compile the interface.

1.1.7. HSL solvers

This is a suite of sparse linear solvers developed at the Science and Technology Facilities Council of the UK that offers a free, non-commercial library to academic/research institutions. We have obtained one and its source code is currently shipped with IRIS.

1.1.8. MUESLI

This is a library that includes the most common material models for continuum problems and was developed side by side with IRIS. It can be downloaded from http://www.materials.imdea.org/Muesli.

1.1.9. GMSH

The software Gmsh is a freely available, open-source, pre- and post-processor for finite element models (web page). IRIS can take advantage of its capabilities to create solid models from a scripting language that allows for parametric mesh generation.

1.1.10. PETSC

Petsc is a very large library for serial and parallel numerical computations. It is written in C, but its interface with C++ is simple, providing access to many linear direct and sparse linear solvers, nonlinear solvers, preconditioners, ODE integrators, etc. It can be downloaded form http://www.mcs.anl.gov/petsc/. Petsc can be built in serial and parallel fashion, and has many options which are explained in its web page. Four our purposes, a simple configuration script is provided in the directory Blue/Makefiles/buildpetsc64. To use it, uncompress Petsc in, for example, usr/local/petsc. Then, copy buildpetsc64 to this directory and execute buildpetsc64 serial to build the serial version of the library or buildpetsc64 parallel, for the parallel version. We note that, in the configuration file provided, the Superlu library is downloaded, so that this step is simplified. The user might need to tweak this configuration file for his/her own specific system.

1.2. Building IRIS

The final stage consists in building the finite element code IRIS and linking it with all the external libraries. The code ships with a makefile that should take care of all the building process (see the Appendix).

The building process starts by selected which optional modules should be linked with the code.

After uncompressing the files, issuing the command make should take care of everything and build the final binary. If the building process fails, one should look into the makefile, and modify it to suit the computer needs.

If the building process completes, a binary iris will be created. The user then needs to move it to a directory in the correct path, such as /usr/local/bin.

2. IRIS basics

IRIS is a simulation code that an carry out a wide variety of simulation types, for many different materials, under many conditions. The definition of these problems is performed using a plain text input file that provides all the necessary details for describing the model and the analysis. The input files use, by default, the extension .iris; the code however, if instructed, can run files with any name.

2.1. Invoking IRIS

IRIS is started from a terminal by the command:

iris [--help] [–-debug] [--libraries] [--save] [-–test] [-–threads t] 
     [-–version] [filename]

The arguments can be entered in any order and are all optional. Their use is as follows:

  • filename is the name (and path) of the analysis file, can be avoided if there is only one file with extension .iris in the directory where IRIS is run.
  • help: Displays the complete list of (optional) arguments to the IRIS command.
  • debug: Activates debug messages in runtime. This option is useful to track the flow of the program and help to identify possible errors. In addition, when the debug option is activated, the amount of data written in the IRISlog file will be increased.
  • libraries: Returns a list of all the libraries linked with IRIS.
  • save: saves the log file of the previous IRIS run so that it is not overwritten when running again.
  • test: forces IRIS to run a suite of tests that verifies element, materials, mesh functions, etc. The full syntaxis of the command is:
iris –-test all | cad | elements | materials | solvers |
       topology | math | meshing

Errors in the tests are shown in the console and no messages are dumped if all the tests are passed.

  • threads: IRIS is designed to run in multiprocessor computers. By default, the code selects an optimal number of threads into which the processing effort is split. However, the user might want to limit the resources available to the code by using this option. If t is larger than the number of cores available at runtime, this option is ignored.
  • version: IRIS shows its version and exits.

2.2. The input file

The input file describes the fundamental characteristics of the analysis such as its name, its type, the integrator, the solver, the materials, the element types, etc. Each of these options is defined through lines of commands, which are just assignments separated by commas:

<command> [, <command>] [, <command>] [, <command>] [, ...]

Each <command> is an expression of the form:

<keyword> = <value>

where <keyword> is an alphanumeric string without quotes and <value> might be numeric, alphanumeric or a string delimited by single or double quotes. Symbolic expressions can be given within quotes, such as in

radius = "sin(4.0*_pi)+log(43.25*sqrt(10.0))"

A line ending with a backslash character \ indicates that the command is continued in the following line. A command can span as many lines as needed, as long as each line (except the last one) is terminated with the continuation character. The program does not distinguishes lower or upper case, except for data in strings. The character #, and everything coming after it until the end of the line, is ignored, thus serving to introduce comments in the input file.

A command line is recognized by its first keyword. In most cases, the order in which the remaining commands are input is not relevant. A few exceptions exist, mostly due to the need to introduce pairs of data. For example, in the tabular scaling factors, a sequence of pairs \((t_i,f_i)\) might be given to indicate the time evolution of a function in tabular form. In this case, and in some others, the value of the function is linked to the time instant prior to it.

Some of the commands are mandatory and some are optional. Generally speaking, the input file serves to create the model, run some type of analysis on it, and finally generate output data than can be postprocessed using external software (more on this later). Strictly speaking, the ordering of the commands is irrelevant since IRIS first reads all of them and later process them according to the most logical order (fist the geometry, then mechanics, finally the output).

The program IRIS is distributed with a directory of examples that illustrate all the capacities of the code. In this directory, subdirectories are included whose names refer to the commands or facilities illustrated by the specific example.

2.3. IRIS process in a nutshell

IRIS is a command-line code that takes a text file as input, creates a model and runs an analysis based on it. The code provides a log file with all the details of the analysis and — optionally — creates all the necessary files for the graphical postprocessing of the results and additional text files with specific output data of the solution. Figure 1 illustrates this overall structure in its simplest form.

./figures/flow-1.pdf

2.4. The input file

As previously indicated, the input file is responsible for describing completely the analysis that IRIS must perform when executed. It is based on a language that has been evolving through the years to include, at the moment, a wide range of possibilities as we will describe in subsequent chapters. The IRIS parser reads the input file and the sorts its content to obtain all the information required to run the analysis. Hence, there is a fair amount of freedom in the order with which the analysis is described. Figure 2 describes the main sections of the input file, ordered in a standard fashion.

./figures/input-1.pdf

In the following chapters, each of these blocks will be described with detail

3. The graphical interface

Besides writing an .iris file by hand, IRIS ships with a browser-based graphical interface that helps build, run, and inspect an analysis without leaving a single window. The GUI is a local web application: a small Python server (using only the standard library, so it runs in any checkout without installing anything extra) serves a page that runs entirely in the browser, talking back to the server only to read/write files and to launch iris itself. Nothing is sent outside the local machine.

3.1. Starting the GUI

The GUI is started from the gui directory of the distribution:

python3 gui/iris_gui.py [--host HOST] [--port PORT] [--no-browser]

By default it binds to 127.0.0.1 on an available port and opens the page in the system’s default browser; --no-browser starts the server without doing so. The server looks for the iris executable using the IRIS_EXECUTABLE environment variable, then ~/bin/iris or ~/bin/debugiris, then the system PATH.

The window is organized into tabs: Design, Run, Postprocess, Loggers, Files and Manual.

3.2. The Design tab

The Design tab is the preprocessor: it builds an .iris file interactively and keeps a live 3D preview of the model in step with it. Collapsible sections on the left cover the same ground as the input file itself — analysis and solver settings, geometry and mesh, materials and element types, boundary conditions and loads, output loggers, and a free-text area for any directive the builder does not yet expose. A Split=/=Builder=/=Source toggle controls how much of the raw generated .iris text is shown alongside the forms; Source mode allows editing the text directly, and an Update builder button re-parses it back into the forms.

3.2.1. The body preview

Every model part defined with a predefined CAD body (Section 6.1) — mecube, brick, cylinder, sphere, torus, wedge, and so on — is rendered together in a 3D panel as it is being defined, using the same placement (centerx, centery, centerz) and orientation (rotx, roty, rotz, an axis-angle vector, not three independent rotations) that end up in the .iris file. Editing a body’s parameters updates its shape in the preview immediately; several bodies are shown together, each in its own color.

Clicking a body selects it and attaches a 3D handle (Move or Rotate, chosen from the toolbar) that can be dragged to change its placement, writing the new numbers back into the form fields as it moves. The preview geometry is a client-side approximation, not the exact mesh IRIS itself will build: shapes with simple, axis-aligned or otherwise easily-parametrized geometry (the brick family, cylinders, spheres, tori, wedges, the spherical cap, domes, circles, rectangles, tubes and pipes) are drawn accurately; shapes whose true geometry depends on more elaborate algorithms (metamaterial, polycrystal, tictactoe, tree, or a curve given by an arbitrary expression, and any body imported from a NURBS file) are drawn as a coarse, wireframe stand-in, clearly distinguished from the solid shapes, sufficient for checking relative placement but not exact geometry.

3.2.2. Picking sets for boundary conditions and loads

A boundary condition or load that targets a named entity of a body (a surface, edge or vertex, see Section 6.1.1) can be filled in by clicking rather than typing. A Pick button next to the set field arms picking mode on the preview; the next click on the corresponding face, edge or corner writes the correct name (surface2, edge5, vertex0, and so on) into the field. Picking is only offered for bodies whose named entities can be worked out unambiguously from their parameters: the brick family and the rectangle offer full vertex, edge and surface picking; the cylinder, pipe, tube and circle offer edge and surface picking (they have no vertices); the sphere and torus, which only ever expose one surface, always pick surface0; and the wedge, spherical cap and dome currently offer surface picking only, their vertices and edges not yet being identified this way. It is not offered at all for the coarse-preview shapes described above. Once a set is assigned to a boundary condition or load, that entity is highlighted in cyan in the preview for as long as the assignment exists, so it stays easy to see which parts of a model already carry a condition.

3.3. The Run tab

The Run tab saves the current input, launches iris on it as a background process, and streams iris.log into a console as the analysis proceeds, with elapsed time and exit status. The run can be stopped at any time; when it finishes, any new .pvd, .vtu, .dof or similar output files are picked up automatically and offered for inspection in the Postprocess and Loggers tabs.

3.4. The Postprocess tab

This tab renders the actual results of a completed analysis (Section 2.3): the mesh in the postprocessing files, colored by any nodal or elemental field, with a real, orbiting 3D camera (rotate, pan, zoom, and a perspective/orthographic toggle) rather than a flat plot. A slider deforms the mesh by the current displacement field, timesteps of a .pvd collection can be stepped through or played back as an animation, and the current view can be exported as a PNG or PDF (each export is saved next to a small Python script that reproduces it, per the convention described in Section 2.3).

3.5. Loggers, Files and Manual

The Loggers tab plots the numeric history files produced by output directives (Section 8) — reaction forces, energy, scaling factors, and the like — and can export the plot the same way as the 3D viewer. The Files tab browses example inputs, meshes and result files already present in the working directory or the IRIS distribution. The Manual tab embeds this document.

4. Ancillary commands

Before describing the main commands that serve to precisely define the model that is run in IRIS, let us explain some auxiliary commands that might be useful to use at some point in the .iris file, usually to make it more clear or give it a better structure.

4.1. Comments

Let us start by mentioning, once again, that comments are available in the IRIS input file: everything after the character ’\’ is ignored by IRIS parser and does not even appear in the log file. For this reason, many input files — for instance, the ones in the examples directory of IRIS’ distribution — start with a block of the form

# block.iris
# Transient simulation of a hyperelastic block
# author: i. romero
# creation date: 1/7/2022

4.2. Global parameters

In addition to choosing the type of analysis that IRIS must run, users may define global parameters that can be later employed in the input file. By using the command constants, new alphanumeric paramters can be introduced that can later be used as arguments for other commands such as material contants, mesh dimensions, time step size, etc. The syntax of these definitions is

constants, <name> = <value> [, <name> = <value> ] [...]

Like everything other command in IRIS, constant names are case-insensitive. Values can be numeric or symbolic; in the latter case, the symbolic expression must be enclosed in quotes and may contain previously defined constants. The constants command can be used as many times as desired, and in any place of the input file.

4.3. Runtime messages

In some instances, it might be useful to output messages to the screen while running IRIS. The command echo provides precisely this functionality and its syntax is:

echo, <string>

4.4. Including files

IRIS allows users to split the input file among several text files. The main file, the one that is sent in the command line to IRIS, can include all the necessary blocks by using the include command. Its syntax is:

include, file = <string>

5. The analysis

The most fundamental command in an IRIS input file is the one that selects the type of analysis to be executed and it is often the first line of the .iris file, below some comments and text that (optionally) describes the analysis, identifies the author, date, etc.

The command line that selects the type of analysis is of the form:

analysis, type = [controlled | dispersion | eigenvalue
    | harmonic | infsup | spectral | staggered | stationary
    | topopt | transient ] [, options]

where the [options] depend on the type.

In fact, it is possible to define more than one analysis type in a single input file. In this case, after one analysis is concluded, the next one starts using as initial data the output of the previous one.

5.1. Controlled analysis

5.2. Dispersion analysis

This analysis type computes the dispersion diagram of a periodic medium: the branches of natural frequency \(\omega\) as a function of a wavevector \(k\) swept along a path in reciprocal space. A Bloch/Floquet reduction of the periodic unit cell is combined with a generalized eigenvalue problem \((K(k)-\omega^2 M(k))\,\phi=0\), solved at each sampled wavevector.

The command line is of the form

analysis, type = dispersion, geometry = [1d | 2d | 3d | frame2d]
    [, nbranches = <integer>] [, npoints = <integer>]
    [, structure = yes | no] [, solver = <keyword>]
keyword Data type Default value
geometry <keyword> 3d
nbranches <integer> 1
npoints <integer> 5
structure <keyword> yes

geometry selects how many degrees of freedom per node enter the reduced eigenproblem: 1d and 2d keep only the first one or two translational components, 3d keeps all three, and frame2d keeps the two in-plane translations plus the out-of-plane rotation, for planar beam/frame lattices. nbranches is the number of frequency branches (lowest eigenvalues) reported at each wavevector, and npoints the number of wavevectors sampled along the path described next. structure selects the eigensolver: yes (the default) reduces the problem to a sparse operator and solves it by subspace iteration (the linear solver used internally defaults to pcg and can be changed with solver); no assembles the reduced matrices explicitly and solves the dense generalized eigenproblem with LAPACK.

The wavevector path. \(k\) is swept, in npoints equally-spaced steps, along the piecewise-linear path defined by two or more wavevector command lines, for example

wavevector, kx = 0.0, ky = 0.0, kz = 0.0
wavevector, kx = "+_PI", ky = 0.0, kz = 0.0
wavevector, kx = "+_PI", ky = "+_PI", kz = 0.0

Each line is a vertex of the path; with two vertices the path is a single segment, with more it visits every vertex in order. Components can be plain numbers or quoted expressions, in which case the symbolic constant _PI (\(\pi\)) is available, which is convenient to describe the boundary of the first Brillouin zone (e.g. from kx = "-_PI" to kx = "+_PI").

Periodicity. The medium’s periodicity is described with the usual periodicbc command (see the Periodic boundary conditions section), adding the keyword bloch = true:

periodicbc, body = <string>, \
     master = <string>, slave = <string>
     [, master = <string>, slave = <string>]
     [, master = <string>, slave = <string>], \
     bloch = true

With bloch = true, the master/slave node pairs identified by periodicbc are used to build, at every sampled wavevector, the Bloch reduction operator that writes each dependent (“slave”) node’s motion as its corresponding free (“master”) node’s motion times the phase factor \(e^{ik\cdot\Delta x}\), instead of being turned into linear multipoint constraints as is done for the ordinary (non-Bloch) use of periodicbc; multipoint constraints would not make sense for an eigenvalue problem. No macroscopic strain (epsxx, etc.) should be given in this mode.

Output. Results are written, one line per sampled wavevector, to the file iris.wk: the columns are \(k_x\), \(k_y\), \(k_z\) followed by the nbranches frequencies \(\omega\) (not \(\omega^2\)) at that wavevector, sorted from lowest to highest.

A note of caution. The default iterative eigensolver (structure = yes) can occasionally fail to converge on small or highly degenerate reduced problems — near-zero acoustic branches close to \(k=0\) are a common trigger — and will then silently report spurious zero frequencies rather than raising an error. If a dispersion diagram looks physically implausible (e.g. not symmetric in \(k\)), repeat the run or set structure = no to cross-check against the dense LAPACK solver.

See examples in 16_Dispersion.

5.3. Eigenvalue analysis

This analysis type calculates the eigenvalues and eigenvector of a stiffness or the generalized eigenvalues for a dynamical problem. The commands in the command line are:

keyword Data type Default value
nmin <integer> 0
generalized <boolean> False
shift <double> 0.0
solver <keyword> subspace

In this analysis, IRIS finds the nmin smallest eigenvalues and eigenvectors of the stiffness matrix using the subspace iteration method. When the keyword generalized is included, this type of eigenpairs are calculated instead of the standard ones.

5.4. Harmonic analysis

5.5. Inf-sup analysis

IRIS can be employed to ascertain the well-posedness of a discretization by calculating and writing to disk the main operators that define the problem and its norms. The command line of this type of analysis is of the form

analysis, type = infsup, primal = <string>, dual = <string>

To understand what the analysis does, consider first a irreducible formulation of small strain solid mechanics in which the only variable is, for example, the displacements u. Then, the inf-sup analysis will be launched with the command line

analysis, type = infsup, primal = "u"

The analysis will calculate the stiffness matrix of the problem and write it on the file K.hwb, a sparse storage format known as Harwell-Boeing. The natural norm of this problem is the \(H^1\) norm and one has that \(\|u_h\|_{H^1} = U\cdot N U\), where \(U\) are the nodal values of the displacement field \(u_h\). The inf-sup analysis writes to disk the matrix \(N\) as well.

Consider next a mixed formulation. For example, one could analyze Stokes problem with primal variable v and dual p. The inf-sup analysis of this problem would be defined with the command

analysis, type = infsup, primal = "v", dual = "p"

The analysis will write to disk K.hwb, the global stiffness matrix. However, in this case the stiffness matrix has a block structure \(K=[A B^T; B C]\) and the three blocks will be also written to disk in the files A.hwb, B.hwb and C.hwb. Also, in addition to the natural norm for the velocities which is the \(H^1\) norm, the natural norm for the dual variables is the \(L^2\) norm. The inf-sup analysis will write to disk these two norms with the names PN.hwb and DN.hwb which correspond to the primal norm and dual norm.

5.6. Spectral analysis

5.7. Staggered analysis

5.8. Stationary analysis

A stationary analysis is one where all rate effects are ignored (this includes damping or inertial contributions). These analyses include those in which the loading is applied slowly, meaning precisely that the rate effect have a negligible effect on the solution.

In stationary analyses time must be understood as a dimensionless parameter that indicates how the solution evolves as the loading is (“slowly”) applied. The precise term for this kind of analyses is “quasistatic”

The optional commands that can be provided in a stationary analysis are:

keyword Data type Default value
final_time double 1.0

5.9. Topology optimization analysis

5.10. Transient analysis

Transient analysis are designed to solve initial boundary value problems. The equations can be of order 1 or 2 in time. The optional commands that might be given in the analysis command line are:

keyword Data type Default value
final_time double 1.0

One should ensure that in a transient analysis the correct integrator is provided. In fact, this choise sets the order of the time derivatives as explained below.

6. Defining the model

An analysis runs always on a model that combines geometry and mechanics. The first step is thus the definition of one or more modelparts, that is, geometrical entities, whose mechanical behavior will be specified later in the input file. These parts are purely geometrical entities: the have (possibly) volume, surfaces, edges, vertices, that live in \(\mathbb{R}^3\) and can be generated with a CAD program. In order to solve boundary value problems defined on them, at some point a spatial discretization will have to be introduced: maybe the bodies are partitioned into disjoint polyhedra, or maybe filled with particles. In either case, there is no mechanics nor equation on these entities.

There are two ways of defining modelparts. In the first type, simple bodies can be used that are internally built and meshed in IRIS; in the second type, input files from external pre-processing software can be imported. In either case, the modelpart is not only responsible for creating nodes and elements (or particles, in a meshless method), but also all the necessary manifolds where boundary conditions and/or loads might be later applied. Manifolds are named sets of dimension 0 (vertices), 1 (edges), 2 (surfaces), or 3 (volumes). Depending on the shape of the body, the number of manifolds of a particular dimension changes. In some cases, there might not even be a single manifold for a given body (for instance, a sphere has no edges nor vertices).

The available template solids are described next.

6.1. Pre-defined bodies

6.1.1. The brick

This body is a parallelepiped or the image of one of this bodies by a smooth map. Like any other body, it is mandatory to indicate its name and the integer label eltype for the type of elements that it will generate. The name is a string that will identify the body when applying, for example, boundary conditions, or loads on it.

modelpart, type = body, shape =  brick,
   name = <string>, eltype = <integer>,
   [, lx = <double>] [, ly = <double>] [, lz = <double>]
   [, divx = <integer>] [, divy = <integer>] [, divz = <integer>]
   [, centerx = <double>] [, centery = <double>] [, centerz = <double>]
   [, rotx = <double>] [, roty = <double>] [, rotz = <double>]
   [, xuvw = <string>] [, yuvw = <string>][, zuvw = <string>]
   [, subdivisions = <integer>]
   [, interpolation = p1 | p1p0 | p2 | p2p0 | p2p1 ]

By default, the body has dimensions \(1\times1\times1\), however, these three lengths can be modified with the optional commands lx, ly, lz. The number of divisions along each of the three axes are given by divx,divy,divz. The center of the body can be shifted using the optional parameters centerx, centery, centerz; also, the body is oriented with its axes parallel to the cartesian ones, but this orientation can also be modified by rotating the body with the optional vector rotx, roty, rotz. As indicated before, the parallelepiped can be mapped smoothly to another solid by using the parametric equations

where the three maps are given with the commands xuvw, yuvw, zuvw. The brick generates the following named manifolds:

Dimension Name
0 vertex0 .. vertex7
1 edge0 .. edge11
2 surface0 .. surface5
3 volume0

If the interpolation is selected to be p1 or if it is not used, the brick will generate a mesh of tetrahedra. If other interpolation options are provided, mixed-type meshes will be created. Notice that when a mixed method ( p2p0 or p2p1 ) is selected, a nodeset with name pressurenode will be automatically created that is linked to a pressure node.

cube.png

Figure 1: A brick generated by IRIS

6.1.2. The qbrick

The parallelepided of the previous section can be meshed with quadrilateral elements simply by replacing the shape brick with qbrick. The options for this new body are identical to those of the brick and are not explained here. Also, the vertices, edges and surfaces are the same.

6.1.3. The qdome

A spherical dome can be generated and meshed with quadrilateral elements. The syntax for creating such a body is:

modelpart, type = body, shape =  qdome,
   name = <string>, eltype = <integer>,
   [, radius = <double>],
   [, centerx = <double>] [, centery = <double>] [, centerz = <double>]
   [, rotx = <double>] [, roty = <double>] [, rotz = <double>]
   [, subdivisions = <integer>]

By default, the body has radius \(1\), but there is an option to modify it. The center of the body can be shifted using the optional parameters centerx, centery, centerz; also, the body is oriented with its axes parallel to the Cartesian ones, but this orientation can also be modified by rotating the body with the optional vector rotx, roty, rotz. The surface has the following named sets defined:

Dimension Name
1 edge0
2 surface0

dome.png

Figure 2: A spherical dome generated by IRIS

6.1.4. The cylinder

This body is a cylinder with default height 1 and radius \(1/2\), meshed with tetrahedra. Like any other body, it is mandatory to indicate its name and the integer label eltype for the type of elements that it will generate. The commandline for this body is:

modelpart, type = body, shape = cylinder,
   name = <string>, eltype = <integer>
   [, radius = <double>] [, height = <double>]\
   [, centerx = <double>] [, centery = <double>] [, centerz = <double>]\
   [, rotx = <double>][, roty = <double>][, rotz = <double>]\
   [, subdivisions  = <integer>]

The cylinder generates the following named manifolds:

Dimension Name
1 edge0, edge1
2 surface0, surface1, surface2
3 volume0

cylinder.png

Figure 3: A cylinder generated by IRIS

6.1.5. The spherical cap

This body is one eighth of a hollow sphere. More precisely, it is the fraction of the hollow sphere in the positive orthant and it is meshed with tetrahedra. The commandline for this body is:

modelpart, type = body, shape = cap,
   name = <string>, eltype = <integer>
   [, rint = <double>] [, rext = <double>]\
   [, centerx = <double>] [, centery = <double>] [, centerz = <double>]\
   [, rotx = <double>][, roty = <double>][, rotz = <double>]\
   [, subdivisions  = <integer>]

The code is set to generate \(6n\) elements subdivisions along the \(\phi\) and \(\theta\) directions of the spherical coordinates, where \(n\) is the number of subdivisions. The cap has the following named manifolds:

Dimension Name
0 vertex0, … , vertex 5
1 edge0, …, edge8
2 surface_int \((r=r_{int})\), normal \(e_r\)
2 surface_ext \((r=r_{ext})\), normal \(e_r\)
2 surface_x0 \((\phi=\pi/2)\)
2 surface_y0 \((\phi=0)\)
2 surface_z0 \((\theta=0)\)
3 volume0

cap.png

Figure 4: A spherical cap generated by IRIS

6.1.6. The polycrystal

In IRIS, a polycrystal refers to a parallelepiped with some internal structure, meshed with regular tetrahedra. Similarly, the modelpart qpolycrystal refers to the same type of solid, now meshed with regular hexahedra. These two bodies have the same manifolds of the brick and the qbrick, respectively, and are designed to work with periodic boundary conditions. See the example files 3115_Polyhedra and 3116_Polyhedra2.

The general syntax of this body is similar to that of the brick, but some options have been removed. Specifically, the polycrystal is defined by:

modelpart, type = body, shape = polycrystal, geometry = <string>,
   name = <string>,
   [, lx = <double>] [, ly = <double>] [, lz = <double>]
   [, divx = <integer>] [, divy = <integer>] [, divz = <integer>]
   [, subdivisions = <integer>]

There are several types of polycrystals, and selected with the option geometry. Each of them may require additional input data to be provided. This is summarized in the following table:

geometry Description
spheres Box with a periodic spherical inclusions, each of a different eltype
blocks Box consisting of brick-shaped blocks, each one of a different eltype

The geometries have options that can be used to tailor the “microstructure” of the polycrystal. In the case of the spheres geometry, the user must define, one by one, the center, radius and eltype of each of the included spheres as in

modelpart, type = body, shape = polycrystal, geometry = spheres,
   name = <string>,
   ...
   [, centerx = <double>] [, centery = <double>] [, centerx = <double>], radius = <double>, eltype = <int>,
   [, centerx = <double>] [, centery = <double>] [, centerx = <double>], radius = <double>, eltype = <int>,
Parameter Default Description
centerx 0.0 x-coordinate of the sphere center
centery 0.0 y-coordinate of the sphere center
centerz 0.0 z-coordinate of the sphere center
radius - Radius of the spherical inclusion
eltype - Element type for the inclusion (\(\ge1\))

In this polycrystal, the element type with label 1 is reserved for the matrix, and must be defined in the element type list. Note that all data must be defined for each spherical inclusion and also that the eltype might be shared among two or more inclusions.

For the blocks microstructure, the additional option is

Parameter Default Description
ncrystals 1 Cubic root of the number of crystals

At the moment, the polycrystal does not generate the element types that are required to generate all the elements in the polycrystal. For that, the user is responsible for adding them to the analysis file beforehand.

6.1.7. The sphere

A sphere is, by default, a solid body of radius 1 and it is meshed with tetrahedra. The syntax for including a sphere in IRIS is:

modelpart, type = body, shape = sphere,
   name = <string>, eltype = <integer>
   [, radius = <double>]
   [, centerx = <double>] [, centery = <double>] [, centerz = <double>]\
   [, rotx = <double>][, roty = <double>][, rotz = <double>]\
   [, subdivisions  = <integer>]

The manifolds that are automatically generated for the sphere are:

Dimension Name
2 surface0
3 volume0

6.1.8. The torus

6.1.9. The helix

This body is a solid tube of circular cross section, of default radius \(1/2\), swept along an arbitrary parametric centerline \(x(u), y(u), z(u)\), with \(u \in [-1/2, 1/2]\) (the same convention used by the curve body, so a bar embedded along the same centerline can share the exact same xu, yu, zu expressions). It is meshed with tetrahedra, obtained by bending a straight cylinder mesh onto the centerline with a rotation-minimizing frame, so the cross section stays circular and untwisted along the whole length. The commandline for this body is:

modelpart, type = body, shape = helix,
   name = <string>, eltype = <integer>,
   xu = <string>, yu = <string>, zu = <string>
   [, radius = <double>]\
   [, centerx = <double>] [, centery = <double>] [, centerz = <double>]\
   [, rotx = <double>][, roty = <double>][, rotz = <double>]\
   [, subdivisions  = <integer>]

For instance, a coil of centerline radius 3, three complete turns and pitch 4 is generated with xu = '3*cos(6*_pi*u)', yu = '3*sin(6*_pi*u)', zu = '12*u'.

The helix generates the following named manifolds, inherited from the straight cylinder it is bent from:

Dimension Name
1 edge0, edge1
2 surface0, surface1, surface2
3 volume0

6.1.10. The rectangle

6.2. Interactions

After two or more model parts have been defined, interactions can be introduced among them. These include contact pairs, glueing parts, embedding parts, etc. interactions are entities that contribute to the energy of the system, yet have not physical “matter”. Note that they may, however, have degrees of freedom that do not belong to the interacting bodies but to the interaction itself.

The first type of interaction is used to model contact between bodies, elements, etc. It has the following syntax:

contact, penalty = <double>, type = mebody_to_plane, body = <string>,
   [, pi0 = <double>] [, pi1 = <double>] [, pi2 = <double>] [, pi3 = <double>]

contact, penalty = <double>, type = nodeset_to_plane, nodeset = <string>,
   [, pi0 = <double>] [, pi1 = <double>] [, pi2 = <double>] [, pi3 = <double>]

contact, penalty = <double>, type = nodeset_to_elset, nodeset = <string>, elset = <string>

contact, penalty = <double>, type = elset_to_elset, elset1 = <string>, elset2 = <string>

contact, penalty = <double>, type = body_to_body, body = <string>,
    body = <string> [, body = <string>, ...]

contact, penalty = <double>, type = all_bodies

contact, penalty = <double>, type = rigid_wall

A second type of interaction is use to embed one body into another one and weakly tie them. iris has interactions to embed beams, shells, and solids into solids. The advantage of these interactions is that the mesh of the embedding need not be conforming with the one of the larger body.

interaction, type = embedded_shell, solid = <string>, shell = <string>, alphashell = <double>,
             fibersubdivisions = <int>, shellthickness = <double>

interaction, type = embedded_beam, solid = <string>, beam = <string>, alphabeam = <double>,
             fibertype = <string>, fibersubdivisions = <int>, beamthickness = <double>,
             stiffness = <double>, fiberparam = <double> [, fiberparam = <double> ...],
             vect11 = <double>, vect12 = <double>, vect13 = <double>,
             vect21 = <double>, vect22 = <double>, vect23 = <double>

interaction, type = embedded_solid, solid = <string>, linked = <string>, 
             alpha = <double>, lc = <double>, stiffness = <double>

Also, thermal conductor might be embedded with the syntax

interaction, type = thbarlink, solid = <string>, bar = <string>, bar_area = <double> [, ell = <double>]

Here, a solid body is linked with a one-dimensional bar of circular cross section and area bar_area. The variable ell is used to weigh the gradient contribution in the \(H^1\) norm of the coupling. If none is given, \(\ell\) is taken to be the radius of the circular cross section. Ideally, the user should give \(\ell = (r^2\;L)^{1/3}\), where \(L\) is the length of the bar.

This interaction creates one Lagrange multiplier node at every embedded bar node to enforce the coupling. Since these multipliers belong to the interaction and not to any modelpart, initialize exposes them as named nodesets so that they can still be constrained from the input file:

  • <bar>_lambda, containing every multiplier node of the interaction;
  • <bar>_lambda_<vertexset>, containing the multipliers sitting on the bar nodes of the bar’s BRep vertex set <vertexset> (vertex0, vertex1, etc.), mirroring the names already used to constrain the bar’s own temperature.

This matters whenever a bar node’s temperature is prescribed: the multiplier created there has no free temperature partner, which weakens the discrete inf-sup constant of the coupling. Setting such a multiplier to zero with

bc, nodeset = <bar>_lambda_<vertexset>, variable = l, value = 0.0

removes both the unknown and its constraint row, equivalent to never having created that multiplier there, and restores the sharp inf-sup constant.

6.3. Nodesets and elsets

As its name indicates, nodesets and elsets are collections of nodes and elements, respectively. They enables the use of functions that operate on sets, enormously simplifying the manipulation of large sets of objects.

There are two ways to define a nodeset. First, in some low-level mesh files, nodesets are defined by providing lists of nodes. This includes the imf mesh files and also the meshes imported from Abaqus, gmsh, etc.

Second, in the .iris files one can extract sets of nodes from existing parts and give them a unique name. For example, one can create a Cartesian coordinate system and the select all nodes whose value of one or more coordinates is fixed, or whose value is within a given range (modulo some tolerance). Specifically, the nodeset selection would be obtained by issueing:

nodeset, name = <string>, modelpart = <string>, select = cartesian
   [, tolerance = <double>]
   [, centerx = <double>] [, centery = <double>] [, centerz = <double>]
   [, x = <double>] [, y = <double>] [, z = <double>]
   [, minx = <double>] [, miny = <double>] [, minz = <double>]
   [, maxx = <double>] [, maxy = <double>] [, maxz = <double>]

The default values for centerx, centery, centerz are \((0,0,0)\). Similarly, one can select nodes based on their cylindrical coordinates.

nodeset, name = <string>, modelpart = <string>, select = cylindrical
   [, tolerance = <double>]
   [, r = <double>] [, theta = <double>] [, z = <double>]
   [, centerr = <double>] [, centert = <double>] [, centerz = <double>]
   [, minr = <double>] [, mint = <double>] [, minz = <double>]
   [, maxr = <double>] [, maxt = <double>] [, maxz = <double>]

Also, one can also select the nodes on a plane with the command

nodeset, name = <string>, modelpart = <string>, select = plane
 [, tolerance = <double>]
 [, pi0 = <double>] [, pi1 = <double>] [, pi2 = <double>] [, pi3 = <double>]

Finally, one can define a nodeset directly by providing the node labels. This is not the most desirable strategy because node labels change when the mesh is refined, but can be nevertheless be useful sometimes. The syntax is:

nodeset, name = <string>, modelpart = <string>, select = labels
   [, label = <integer>] [, label = <integer>] [, label = <integer>]

Elsets are less used in IRIS at, at the moment, can only be defined in mesh files.

6.4. Creating finite element models from mesh files

IRIS can create parts from (low level) mesh files containing only geometrical information of the model and following a syntax originally designed for IRIS in its first versions. The way to import such parts is using the command:

modelpart, type = mesh, filename = <string>, name = <string>, dimension = <integer>

In this type of input, the filename has node positions, elements, nodeset and elset and the maximum dimension of the modelpart is also indicated. This way of describing parts is still operational but is too poor for more advanced applications so it is being superseded by the new format, referred to as imf, or IRIS mesh format, described below.

The imf syntax has the following commands:

  • nodes : this part of the file lists all the nodes in the part, giving each one a label and its coordinates.
  • elements : describing groups of similar elements.
  • nodeset : collecting nodes in such a way that they can be later used for boundary conditions or other needs.

    We describe next with more detail each of the parts.

6.4.1. Nodes

Each modelpart must include a list of nodes, where the degrees of freedom of the problem will be stored. These could be used to generate nodes in a finite element discretization or particles, in a particle-based method. In all cases, nodes can be input in one or more blocks, each of them of the form

nodes
 label1 x1 y1 z1
 label2 x2 y2 z2
 ...
 labeln xn yn zn
 <empty line>

In each of the lines, the first integer is the label. Then, three decimal numbers indicate its coordinates. The node labels must be unique in the model part, although there can be defined in arbitrary order and need not be sequential. Between numbers the imf format uses one or more spaces.

6.4.2. Element

Parts can have elements of many different types, all of them connecting one or more nodes. Each element block must be of the form

elements, geometry = volume | surface | curve | point, setname = <string>,
   eltype = <integer>, [other commands]
label1 nodelabel11 nodelabel12 nodelabel13 ...
label2 nodelabel21 nodelabel22 nodelabel23 ...
label3 nodelabel31 nodelabel32 nodelabel33 ...
<empty line>

Following the keyword elements, the rest of the options can be given in any order. Since the number of nodes does not determine whether the element is a surface one, a line, etc., the geometry indicates this, and its value must be one of volume, surface, curve, point. The setname is a string that might allow in the future to refer to the whole set of elements; the eltype is a non-negative integer that corresponds to IRIS eltype numbering. Finally, other keywords can be used with any value that will help the importer deal with the peculiarities of the mesh file used as input for the imf format. For example, the Abaqus importer creates command lines that have the additional keyword abaqustype = <string>.

After the header, one line of data is provided for each element. The first integer is the element label; then, the node labels for this element follow. Since all the elements in the block are of the same type, all the lines in this block should have the same number of nodes. Finally, the block closes with an empty line.

The element labels must be unique for the whole part, although they need not be consecutively defined and might be given in an arbitrary order.

The number of element blocks is, in the new imf data structure, important. For every part that describes a finite element model, the highest dimension among all element blocks determines the type or part, whether it is a volume, a surface, a curve, o simply a point. Once this set is defined, the sets of lower dimensions are used to describe its boundaries. For example, if the set of the highest dimension is a volume, the remaining sets can be used to describe the elements on the external surfaces, the edges between two surfaces, the vertices at the intersection of edges, etc. Similarly, if the set of the highest dimension is a surface, then the remaining element blocks would allow the definition of the edges and vertices.

6.4.3. Nodesets

Finally, the nodeset blocks allow to collect a group of nodes under a common name that can be used later to refer to them and apply boundary conditions, contact conditions, etc. Several ways are provided to define a node set. The simplest syntax is

nodeset, name = <string>, type = list
   label1 label2 label3
   label4 label5
   label6 label7:label8 label9 ...
   <empty line>

Except for the first keyword, the remaining fields can be provided in an arbitrary order. For a nodeset of type list, the node labels are given in one or more lines separated by spaces and the block ends with an empty line. Also, the notation i:j, with \(i\le j\), selects all nodes with labels numbers between \(i\) and \(j\), both included.

There is a second type of nodeset blocks that can be defined by selecting those nodes already defined in the part that verify certain geometric conditions. For example, in order to select nodes using their cartesian coordinates the following command can be used

nodeset, name = <string>, type = cartesian,
   centerx = <double>, centery = <double>, centerz = <double>
   [, x = <double>] [, y = <double>] [, z  <double>]

Likewise, to select nodes using cylindrical coordinates we use

nodeset, name = <string>, type = cylindrical,
   centerx = <double>, centery = <double>, centerz = <double>
   [, r = <double>] [, theta = <double>] [, z = <double>]

6.5. Importing meshes from external other programs

IRIS has also a few importers. Each of them can take input files for other codes, such as Ansys or Abaqus, and generate an intermediate mesh file that can be later read by IRIS. In the past, the intermediate file generated by the importer had the old mesh format; in the future, these auxiliary files should adhere to the new imf syntax.

To import models from other codes IRIS still employs the command modelpart but now with the following syntax

modelpart, type = [abaqus | geo | tecplot | xml], filename = <string>,
   name = <string>, dimension = <integer>

The name is the tag employed later in the loading and boundary conditions to refer to this model. The filename is a text file with the native format of either of these codes. IRIS will process the input file, create a new imf file, and the use the latter as the input file. The dimension indicates the largest dimension of the manifold of the model part (3 for a volume, 2 for a surface, 1 for a curve), even if all nodes must be in three-dimensional space.

6.5.1. Using Gmsh to generate mesh files

Gmsh is a powerful, open-source, free software for the pre- and post-processing of finite element models. It has a powerful scripting language that can generate meshes from high-level primitives. IRIS can read these Gmsh files, send them to this program, generate a mesh file, and finally import it. To enable this feature, IRIS must be linked with the gmsh library.

modelpart, type = geo, filename = <string>, name = <string>

6.5.2. Importing Abaqus mesh files

Abaqus analyses can be run either from a script file (a files with the extension .inp) or from the graphical user interface (GUI). In the latter case, Abaqus creates the script file and it is always the latter what gets analyzed ultimately and the GUI can then be understood as a tool to generate input files in a convenient way.

In IRIS, when a model part is imported form Abaqus, an .inp text file is expected and then converted to the imf format.

IRIS does not process all the information contained in the inp file. Instead, it extracts from it the nodes coordinates, the elements sets (ELSET), and the node sets (NSET). To be compatible with IRIS, it is important that the Abaqus input file describes element sets for all the volumes, surfaces, edges, and vertices that will be later required for the mesh and the boundary conditions. Since the modelpart command line in IRIS includes a dimension option, only one element set with maximal dimension should be defined in the input file.

7. Describing the solution

Once the model has been described, the features of the mechanical problem can be assigned to it and the controls of the analysis, determined.

7.1. Scaling factors

Before defining how boundary conditions and loads can be input into IRIS, let us introduce the concept of scaling functions and their implementation within the input file language. The code allows to introduce both of these in a way that they vary in time. For example, this would allow to shake the supports of a structure or to apply wind loads whose value and direction depend on time.

A scaling function is thus a scalar-valued function \(F\) that depends on time and space. IRIS allows to define as many as desired, even if they are never used. These functions have all additive form: they are built by simpler contributions \(f_i\) that are added before evaluation. In this way,

In IRIS, we define a scaling function by describing its elementary contributions as in

scaling, combination = <integer>,
    type = constant | gaussian | linear | sine | symbolic | tablefile | tabular | triangle 
    [,options]

Here, the combination refers to the label of the scaling function \(F\), since the individual components can not be used by themselves. Each type of scaling factor has different options as described in the table

Scaling type option default option default option default option default
constant value 1.0            
gaussian mean 1.0 variance 1.0        
linear initial 0.0 slope 1.0        
sine amplitude 1.0 frequency 0.0 period 0.0 phase 0.0
symbolic value “t”            
tablefile filename -            
tabular time   value          
triangular peak   height 1.0        
laguerre lambda0 1.0 n 1        

All the scaling contributions, in addition, have two common options

option default value
start 0.0
end infinite

The tabular scaling factor is slightly different to the rest and its syntax is:

scaling, combination = <integer>, type = tabular, [time = <double>, value = <double>]
     [, time = <double>, value = <double>]
     [, time = <double>, value = <double>] ...

With this syntax, the user can introduce pairs of time value \((t_i,v_i)\) and the tabular factor will interpolate in intermediate instants.

The tablefile uses an external file that has two columns, the first one for the time, the second one for the value of the scaling factor. Optionally, the file might have comment lines that start with the character “#”. The syntax of this scaling factor is

scaling, combination = <integer>, type = tablefile, filename = <string>

The symbolic scaling factor allows the user to define analytical expressions of the variables \((t,x,y,z,\phi,\theta,r,\rho)\) that are evaluated at every point of space and instant of time in the simulation. Here, \((x,y,z)\) are the Cartesian coordinates, \((\rho,\phi,z)\) are the cylindrical coordinates, and \((r,\phi,\theta)\) refer to the spherical coordinates. This is a very powerful command that can be used, for example, to create filters. Using the C if block syntax, one can apply loads only on certain regions of the space without the need to define new element set nor manifolds. For example, the command

scaling, combination = 1, type = symbolic, value = "x*y > 0 ? t : 0.0"

defines the scaling combination number 1 to be proportional to time in the region \(xy>0\) and zero elsewhere. The variables phi,theta,r correspond to the three spherical coordinates.

By default, IRIS creates the scaling factor with label 0, a linear factor whose value is identical to the time variable.

7.2. Boundary and initial conditions

Boundary conditions for initial and boundary value problems are defined with the command bc. There exist severa ways to use it for reasons of backward compatibility. A major difficulty derives from the fact that IRIS now can work with multi-field problems and the name of the degree of freedom changes from problem to problem, precisely to allow combinations.

The preferable way to use bc is on manifolds. As described before, every part has manifolds defined precisely for this purpose. By using manifolds, the user does not need to know about node numbering or any other detail of the discretization but can, instead, focus on the true geometrical aspects of the model. The syntax of this version of the command is:

bc, [part | body] = <string>, setname = <string>,
    variable = <char> [, value = <double>]
    [, valuex = <double>] [, valuey = <double>] [, valuez = <double>]
    [, scaling = <integer>]

In this command, first the model part is seleted; then, the manifold is selected using the name with which each of them were defined. Then, the letter of the variable on which the boundary condition is to be applied must be given. If the varible is scalar, is suffices to give its value. If, instead, it is a vector field, then its values on the \(x,y,z\) directions can be given independently. Finally, the scaling factor can be added. If the latter is not given, it is assumed that the boundary condition is scaled by the default scaling factor (with label 0).

Boundary conditions can also be applied directly to nodesets. The syntax in this case is as follows:

bc, nodeset = <string>
   [, ux = <double>] [, uy = <double>] [, uz = <double>]
   [, p = <double>] [, e = <double>]
   [, rotx = <double>] [, roty = <double>] [, rotz = <double>]
   [, dirx = <double>] [, diry = <double>]
   [, scaling = <integer>]

This old way of applying initial conditions has an important limitation: it only works with mechanical problems in which the unknown fields have names u, p, e, are rotations or directors. It should be avoided when possible.

Initial conditions are applied on the model in a similar fashion. The syntax is

ic, [part | body] = <string>, setname = <string>,
    variable = <char> [, value = <double>]
    [, valuex = <double>] [, valuey = <double>] [, valuez = <double>]
    [, filter = <option>] [, filtertype = <option>]
    [, noise = <double>] [, noisevariance = <double>]

Alternatively, the initial condition can be given, but on a nodeset directly using

ic, nodeset = <string>,
    variable = <char> [, value = <double>]
    [, valuex = <double>] [, valuey = <double>] [, valuez = <double>]
    [, filter = <option>] [, filtertype = <option>]
    [, noise = <double>] [, noisevariance = <double>]

Finally, for second order problems, initial rates can be set using the same syntax, just modifying the keyword. Specifically, we must employ the following:

initialrate, [part | body] = <string>, setname = <string>,
    variable = <char> [, value = <double>]
    [, valuex = <double>] [, valuey = <double>] [, valuez = <double>]
    [, filter = <option>] [, filtertype = <option>]

or

initialrate, nodeset = <string>,
    variable = <char> [, value = <double>]
    [, valuex = <double>] [, valuey = <double>] [, valuez = <double>]
    [, filter = <option>] [, filtertype = <option>]

The option for the keyword filter is a symbolic expression in terms of the Cartesian coordinates \((x,y,z)\) , the cylindrical coordinates \((\rho,\phi,z)\) or the spherical ones \((r,\phi,\theta)\). The noise add a Gaussian noise on the initial condition that proportional noise, has a zero mean and variance noisevariance.

7.3. Linear multipoint constraints

Linear multi-point constraints (MPC) allow to link the displacement degrees of freedom of different nodes with linear relations. These constraints do not reduce the number of degrees of freedom of the problem; on the contrary, each of them adds one Lagrange multiplier to the global problem, so they should be used with care.

The syntax is as follows. Given some nodes with labels \(\mathcal{L}=\{l\}\), with \(\dim(\mathcal{L})=n\), and parameters \(\{\alpha_i,\beta_i,\gamma_i \}_{i=1}^n\), the linear constraint

\begin{equation*} \mbs{\phi}(\{\mbs{u}_i\}_{i\in \mathcal{L}}) \equiv \sum_{i\in \mathcal{L}} \mbs{w}_i\cdot \mbs{u}_i - C(t) = 0\ , \qquad\mathrm{with weights}\qquad \mbs{w}_i = \langle \alpha_i , \beta_i , \gamma_i \rangle^{T} \end{equation*}

is imposed using the command line:

linmpc, node = l0, [, alpha = <double>] [, beta = <double>] [, gamma = <double>]
       [, node = l1, , alpha = <double>   , beta = <double>   , gamma = <double>]
       [, node = l2, , alpha = <double>   , beta = <double>   , gamma = <double>]
       [, c= <double>] [, scaling = <int>]

The scaling option allows to use a pre-defined scaling factor to multiply the constant c so that, in the constraint, \(C(t) = c\; S_i(t)\), where \(i\) is the index of the scaling function. If no scaling is provided, it is assumed that \(S_i(t)\equiv 1\).

The user is cautioned not to constrain degrees of freedom that are already constrained with the standard boundary conditions.

See example 51_Constraints/5109_linmpc.

7.4. Periodic boundary conditions

IRIS includes some facilities to impose periodic boundary conditions, but they can only be used with prismatic blocks. To impose them, one starts by defining a model part of type brick or qbrick, as usual. Then, the following command line identifies the faces that have periodic boundary conditions

periodic, body = <string>,
     master = <string>, slave = <string>
     [, master = <string>, slave = <string>]
     [, master = <string>, slave = <string>]
     , epsxx = <double>, epsxy = <double>, epsxz = <double>
     , epsyx = <double>, epsyy = <double>, epsyz = <double>
     , epszx = <double>, epszy = <double>, epszz = <double>, \
     scaling = <int>, preconditioner = <double>

The periodic boundary conditions can be applied (on the brick surfaces) onto one, two or three face pairs. These pairs are identified by the sequence master / slave keywords. Then, at most six components of the strain operator can be defined . Finally, the scaling refers to a scaling factor that can be employed to impose gradually the deformation. If the scaling keyword is not employed, the deformation is imposed at time \(t=0\).

For other bodies, IRIS allows to impose periodic boundary conditions, although this feature should be handled with care. The user is required to define six nodesets and then use the slightly modified command:

periodic, body = <string>,
     master = <string>, slave = <string>
     [, masternodeset = <string>, slavenodeset = <string>]
     [, masternodeset = <string>, slavenodeset = <string>]
     , epsxx = <double>, epsxy = <double>, epsxz = <double>
     , epsyx = <double>, epsyy = <double>, epsyz = <double>
     , epszx = <double>, epszy = <double>, epszz = <double>, \
     scaling = <int>, preconditioner = <double>

As in the case of the master/slave surfaces, the nodesets defined above must be paired by opposing ones, and should include nodes that are exactly symmetric to each other.

The periodic boundary conditions define a Neumann problem. To make it well-posed, infinitesimal rigid body modes need to be constrained. To to so, one option is to select six degrees of freedom that are independent, and constrain them. Another option is to use the perturbed technique proposed by Kaleen and Romero. See the solid element.

The condition number of the stiffness of a mechanical problem with the periodic boundary conditions just described is not good. A remarkable improvement can be obtained if a preconditioner is employed of the order of \(E\,h\). If employed, the condition number improves significantly at the expense of the multipliers losing their physical interpretation: instead of forces, they will have dimension of length, so they need to be scaled back by \(E\,h\) to recover their physical meaning.

See example 51_Constraints/5110_periodic.

7.5. Applying loads

The way loads can be applied on IRIS has also evolved during the years and two methods currently co-exist. In the old, low-level, scheme, loads can be applied on nodesets, which can be selected either by their name or by the manifold that contain them. In the first case, the syntax is

loading, nodeset = <string> [,fx = <double>] [,fy = <double>] [,fz = <double>]
    [,f = <double>] [,frotx = <double>] [,froty = <double>] [,frotz = <double>]
    [,scaling = <integer>]

Here, the nodal forces \(f_x,f_y,f_z\) are conjugate to the degrees of freedom \(u_x,u_y,u_z\), while the loads \(frot_x,frot_y,frot_z\) are the moments conjugate to the rotational degrees of freedom. This command is too limited because it does not accept loads on general degrees of freedom. Alternatively, the following command can also be employed:

loading, nodeset = <string> variable = <char>] [,value = <double>]
    [,value0 = <double>] [,value1 = <double>] [,value2 = <double>]
    [,scaling = <integer>]

This latter form is more general and allows to apply loads on scalar and vector degrees of freedom, following the same syntax as the boundary conditions. Similarly, one can replace the nodeset option with the name of a model part and the manifold on which the load has to be applied. The syntax is thus

loading, [part | body] = <string>, vertex | edge | surface | volume = <integer>,
    variable = <char>] [,value = <double>]
    [,value0 = <double>] [,value1 = <double>] [,value2 = <double>]
    [,scaling = <integer>]

The previous commands apply on the nodes of the selected nodeset identical loads. This is inconsisent with variational methods where loads must be distributed according to the measure assigned to each node. For example, if a uniform load is applied to a surface, nodes on the edges and the corners should be loaded with a smaller load. To accommodate this general loading type, IRIS has a more advanced loading command with the following syntax

superloading, [part | body] = <string>, setname = <string>
    [, eltype = <int>]
    variable = <char>] [, scaling = <integer>]
    [, option = <double>] ...

In this, preferable, command, the manifold where the load has to be applied is the given by the setname on a particular body or part. The option(s) keyword(s) depends on the analysis (mechanical, thermal, fluid, etc.) as described in the appendix.

7.6. Elements and materials

In a finite element analysis, every element has a type and a material. A model part can have elements of a single type, although it is possible to mix types. Each type must be defined with a command such as

eltype, label = <integer>, type = <keyword> [, material = <integer>] [, <command>] [, <command>] ...

The label is a unique integer label that is used, for example, in the model part definition or in the mesh files. Often the element types are linked to a material which itself is assigned to a unique label and referenced with the command material = <integer>. Element types might possess other commands that are appended to the list. Each element type is slightly different. We refer to the Appendix for the specific options of each type.

A material is defined in a similar fashion. A command line is used that gives the material a name, a label, a type, and potentially other parameters as in:

material, label = <integer>, name = <string>, type = <keyword>, [, <command>] [, <command>] ...

7.7. Step solvers

Depending on the analysis type, it might be the case that the solution is obtained in a step-by-step fashion. This is true for quasistatic, transient, staggered and topology optimization problems. For the solution of each step, there exist several methods where IRIS can choose from. The command line that takes care of this is:

stepsolver, type = [adr | arclength | explicit | fractional | linear | newton |
   nlcg | quasinewton]  [, <command>] [...]

The keywords correspond to the following methds

Keyword Method name
adr Adaptive dynamic relaxation
explicit Explicit solver
fraction Fractional step solver
linear Solver of linear equations
newton Newton-Raphson
nlcg Nonlinear conjugate gradient
quasinewton Quasi-Newton nonlinear solver

7.7.1. Adaptive dynamic relaxation

Dynamic relaxation obtains the static equilibrium configuration of a (possibly strongly nonlinear) problem as the steady state of a fictitious, critically damped, dynamical system. Instead of assembling and factorizing the tangent stiffness at every iteration, the method marches the equations

\(M\,\ddot{u} + C\,\dot{u} + r_{\text{int}}(u) = f_{\text{ext}}\)

in pseudo-time with an explicit central-difference scheme until \(\dot{u}\) and \(\ddot{u}\) vanish and the residual \(f_{\text{ext}}-r_{\text{int}}(u)\) is zero. The mass matrix \(M\) and the damping matrix \(C\) are not physical: they are artificial quantities chosen only to reach that steady state as fast as possible. The step solver adr is adaptive because it re-estimates \(M\) and \(C\) from the current stiffness whenever a per-node apparent-frequency test detects that the previous choice is no longer near-optimal (??, ????, ??, a, ??, a). The method needs no tangent solve, so its memory footprint is a handful of vectors and every step costs one residual evaluation; this makes it attractive for very large models and for problems whose tangent is expensive, indefinite, or unavailable.

The complete syntax is:

stepsolver, type = adr [, tolerance = <double>]

Required companions. The adr step solver only makes sense inside an explicit, fixed-step pseudo-transient analysis. The input file must therefore declare

analysis,   type = transient, final_time = <double>
integrator, type = cd
stepsolver, type = adr
stepping,   type = fixed, dt = <double>

A linsolver is still declared (it is used to assemble the lumped stiffness that seeds the artificial mass) but no linear system is factorized during the iteration.

Artificial mass. At the first step, and again after every adaptive recomputation, the lumped absolute tangent stiffness \(\hat{K}\) is assembled and each translational nodal mass is overwritten with \(m_i = \tfrac{1}{4}\,\Delta t^{2}\,\lvert \hat{K}_{ii}\rvert\, s_{\max}\), with \(s_{\max}=30\), which renders the central-difference update unconditionally stable regardless of the value of dt. The time step size is consequently a free parameter: it does not affect stability and only sets how finely the loading history is sampled. It must, however, be fixed. When a node ends up with no contributing stiffness its original mass is retained.

Artificial damping. A mass-proportional damping \(C = c\,M\) is used, with the non-dimensional coefficient \(c\) estimated from the Rayleigh quotient of a random probe vector \(z\), namely \(c = 2\,\sqrt{(z\cdot \hat{K} z)/(z\cdot M z)}\), i.e. an estimate of critical damping for the lowest fictitious mode. During the iteration \(c\) is re-estimated from the last displacement and force increments; if the resulting spectral radius exceeds one, \(c\) is reset to the value that gives a spectral radius of one half.

Convergence and reporting. The loading is ramped through the scaling functions over final_time; at each pseudo-time the fictitious dynamics relaxes onto the corresponding static equilibrium. The tolerance keyword (default \(10^{-6}\)) sets the energy-based tolerance used to decide when a configuration has relaxed. The log file reports, per recomputation, the indicative maximum stable time step, the non-dimensional artificial damping, the estimated spectral radius, and an estimate of the remaining absolute error in the displacements.

Keyword Data type Default Meaning
tolerance double \(10^{-6}\) Energy-based tolerance to declare a state relaxed

7.7.2. The Newton-Raphson method

The Newton-Raphson method is the most common solution strategy for nonlinear problems. It is so common that in IRIS it is programmed with a certain amount of complexity to encompass different situations.

Fist, let us recall the complete syntax for its definition, before explaining in detail how the solver works:

stepsolver, type = newton [, maxiterations = <integer>]
    [, maxtrials = <integer>] [, update = <integer>]
    [, tolerance = <double>] [, abstolerance = <double>]

The Newton-Raphson attempts to solve a nonlinear problem by iterating until the energy error in the (residual) equation is below certain value (abstlerance) or it is reduced from its initial value to a relative number (tolerance). The method will attempt to converge in a number of iterations that is, at most, maxiterations. If the procedure fails, the time step control is automatic, then the method will restart, now with a smaller time step size. This restarting strategy can be performed, at most, maxtrials times.

7.7.3. The nonlinear conjugate-gradient method

The nonlinear conjugate-gradient (NLCG) step solver nlcg computes the equilibrium configuration of each step by minimizing the incremental potential of the problem, instead of driving the residual to zero with its tangent. At every configuration \(x\) the analysis provides a scalar objective \(E(x)\) (the minimizing energy of the integrator) and its gradient \(g(x)=\nabla E(x)\), which coincides with the out-of-balance force, \(r=-g\). No tangent stiffness matrix is assembled or factorized, so the memory footprint is that of a handful of vectors and every iteration costs one residual and one energy evaluation, plus the line-search evaluations. This makes the method attractive for very large problems, for problems whose tangent is expensive, unavailable or indefinite, and for rod, shell and finite-strain models that derive from a variational principle (??, a).

The complete syntax is:

stepsolver, type = nlcg [, update = <keyword>] [, linesearch = <keyword>]
    [, tolerance = <double>] [, abstolerance = <double>]
    [, maxiterations = <integer>] [, precondition = yes]
    [, stiffness = <double>] [, wolfe1 = <double>] [, wolfe2 = <double>]

Algorithm.

Starting from the configuration \(x_0\) inherited from the integrator, the solver sets the first search direction to the steepest-descent direction \(d_0=-g_0=r_0\) and then repeats, for \(k=0,1,2,\dots\)

  1. Line search. Find a step length \(\alpha_k>0\) that approximately minimizes \(\phi(\alpha)=E(x_k+\alpha\,d_k)\) along the current direction.
  2. Update. Set \(x_{k+1}=x_k+\alpha_k\,d_k\) and evaluate the new gradient \(g_{k+1}\).
  3. Conjugacy parameter. Compute \(\beta_{k+1}\) with the chosen update formula.
  4. New direction. Set \(d_{k+1}=-g_{k+1}+\beta_{k+1}\,d_k\) (with the preconditioned gradient in place of \(g_{k+1}\) when preconditioning is active).
  5. Restart. Reset \(d_{k+1}\) to steepest descent when any of the following holds: fifteen iterations have elapsed since the last restart, \(\beta_{k+1}\le 0\), the new direction is not a descent direction (\(g_{k+1}\cdot d_{k+1}>0\)), or the previous line search returned a zero step.

The iteration stops when the residual norm \(\lVert r_k\rVert\) drops below the absolute tolerance abstolerance or below tolerance times its initial value, when maxiterations is reached, or when two consecutive line searches fail to find a lower-energy point (the precision floor for the problem). Convergence is declared only if the final residual is finite and satisfies one of the two tolerances; a NaN or Inf residual is reported as divergence. When the time step control is adaptive, a failed solve halves the step size and the step is retried.

Direction update.

The update keyword selects the formula for the conjugacy parameter \(\beta\):

Keyword Update formula
fletcher-reeves Fletcher–Reeves, \(\beta=(g_{k+1}\cdot g_{k+1})/(g_k\cdot g_k)\)
polak-ribiere Polak–Ribiere with restart, \(\beta=\max\!\big(0,\,(g_{k+1}-g_k)\cdot g_{k+1}/(g_k\cdot g_k)\big)\)
hager Hager–Zhang (CG_DESCENT), with the truncation that guarantees a descent direction (??, a)

The default is polak-ribiere, the most robust choice for the non-quadratic objectives that arise in solid mechanics; hager often needs fewer iterations on smooth problems. See (??, a) for a survey of these formulas.

Line search.

The linesearch keyword selects how \(\alpha_k\) is computed:

Keyword Description
golden Golden-section minimization of \(\phi(\alpha)\) on \([0,\,10\,\alpha_c]\) (default)
wolfe Bracketing plus zoom refinement enforcing the strong Wolfe conditions with constants wolfe1 (\(c_1\)) and wolfe2 (\(c_2\))
armijo Bracket the minimizer by expansion/contraction of the characteristic step, then refine once with a parabolic fit

Here \(\alpha_c\) is a characteristic step length used to scale the initial trial. When preconditioning is active \(\alpha_c=1\), because the preconditioned direction is already Newton-scaled. Otherwise the solver estimates, once, a characteristic stiffness \(k\) from a finite-difference probe of the residual along \(r_0\) — the Rayleigh quotient \(k\approx (r_0\cdot H r_0)/(r_0\cdot r_0)\) obtained without assembling the tangent \(H\) — and takes \(\alpha_c=1/k\). A nonzero stiffness supplied by the user overrides the probe. The strong Wolfe constants default to wolfe1 \(=0.1\) and wolfe2 \(=0.2\) and must satisfy \(0

Preconditioning.

With precondition = yes the solver assembles the tangent stiffness once, at the beginning of the step, and uses it as a fixed preconditioner: each iteration solves \(K\,y_k=r_k\) with the linear solver declared by linsolver and uses \(y_k\) as the preconditioned gradient. This restores fast convergence on stiff or badly scaled problems while keeping a single factorization for the whole step. Without preconditioning the method is entirely matrix-free.

Options summary.

Keyword Data type Default Meaning
update keyword polak-ribiere Conjugacy parameter formula
linesearch keyword golden Line-search strategy
tolerance double \(5\cdot10^{-6}\) Relative residual-norm tolerance
abstolerance double \(10^{-9}\) Absolute residual-norm tolerance
maxiterations integer 200 Maximum iterations per step
precondition - off Use the initial tangent as a fixed preconditioner
stiffness double (estimated) Characteristic stiffness \(k\); sets \(\alpha_c=1/k\)
wolfe1 double 0.1 Strong Wolfe constant \(c_1\) (linesearch = wolfe)
wolfe2 double 0.2 Strong Wolfe constant \(c_2\) (linesearch = wolfe)
debug - off Verbose per-iteration output on the log file

For example, the command

stepsolver, type = nlcg, update = hager, tolerance = 1e-6, precondition = yes

runs the solver with the Hager–Zhang update and the initial tangent as preconditioner.

7.8. Linear solvers

In many of the analyses that IRIS can carry out there will be, at some point, a large system of linear equations that needs to be solved. The following command selects which of the available solvers will be used for this task:

linsolver, type = [superlu | apple | hsl | pcg | ldl | wsmp | pardiso] [, <command>] [...]

7.8.1. SuperLU solver

The SuperLU solver is a direct solver for sparse systems of equations. Currently, the shared-memory version of the library (SuperLU_MT) is employed. For this library, there are keywords that activate options in the solver. For example, the nopivoting keyword blocks all pivoting in the factorization (only safe for symmetric positive definite tangents), nprocs can modulate the number of threads opened for the solution of the system of equations, and the keywords unsymmetric/symmetric select what type of profile the matrix has: symmetric uses a minimum-degree ordering on \(A+A^\top\), unsymmetric (the default) uses COLAMD. The keyword printinfo activates output messages written to the IRIS log file, such as the estimated condition number and, for each solve, whether the factorization was computed from scratch or reused. Finally, the dumpmatrix keyword, when present, forces the matrix to be written to a file for later postprocessing.

The panelsize and relax keywords tune the supernode amalgamation performed by the library; when they are not given, SuperLU’s own built-in defaults are used. They are provided mainly for experimentation and rarely need to be changed.

When several linear systems with the same sparsity pattern are solved in succession (for instance the tangent of every iteration of a nonlinear analysis, as long as the mesh does not change), the column ordering and the symbolic factorization are computed only once and reused; only the numerical factorization is repeated on subsequent solves.

The solver works in symmetric and unsymmetric modes.

keyword Data type Default
nopivoting - -
nprocs <integer> max in computer
panelsize <integer> SuperLU default
relax <integer> SuperLU default
unsymmetric - (selected)
symmetric - -
printinfo - -
dumpmatrix - -

7.8.2. Apple Accelerate solver

The apple solver is a direct solver for symmetric sparse systems, built on the sparse \(LDL^\top\) factorizations of Apple’s Accelerate framework. Because Accelerate is part of macOS, no external library is needed and, on Apple hardware, the numerical factorization is handled by the vendor-tuned kernels. Only one triangle of the (structurally symmetric) tangent is passed to the framework; the extraction of the lower triangle is done once and its numerical values refreshed on every solve.

On a machine that is not running macOS there is no Accelerate framework, so the apple keyword silently falls back to the superlu (SuperLU_MT) direct solver, and a warning is written to the log file. Input files therefore remain portable.

The factorization keyword selects the variant: ldlt (the default) is threshold partial pivoting, stable for symmetric indefinite tangents; cholesky is faster but requires a symmetric positive definite tangent and fails otherwise; sbk is supernode Bunch–Kaufman; unpivoted performs no numerical pivoting and is only safe for well-behaved systems. The ordering keyword selects the fill-reducing permutation: default (chosen by the framework), amd or metis (nested dissection). The printinfo keyword writes, for each solve, the system size, the number of stored (lower-triangle) entries, whether the factors were computed from scratch, reused or only refactored, and the elapsed time.

As with superlu, when successive systems share the same sparsity pattern (the tangent of every iteration of a nonlinear analysis on a fixed mesh) the ordering and the symbolic factorization are computed once and reused; only the numerical factorization is repeated.

linsolver, type = apple [, factorization = ldlt | cholesky | sbk | unpivoted] [, ordering = default | amd | metis]
keyword Data type Default
factorization <keyword> ldlt
ordering <keyword> default
printinfo - -

7.8.3. HSL solver

The HSL family of solvers includes several multithreaded specific solutions that are suited to special matrix types. In the input file, the syntax should be:

linsolver, type = hsl, subtype = [cholesky | symmetric | unsymmetric | indefinite]

By default, if no subtype is selected, the unsymmetric solver will be selected. The sparse matrix can be written to a file using the dumpmatrix option.

keyword Data type Default
subtype <keyword> unsymmetric
dumpmatrix    
subtype Matrix type Solver
cholesky Symmetric, positive definite matrix (MA87) Multi-thread
indefinite Symmetric, indefinite (MA86) Multi-thread
symmetric Symmetric, indefinite (MA57) Single-thread
unsymmetric General matrix (MA41D) Single-thread

7.8.4. Preconditioned conjugate gradient

The solver pcg is an iterative solver for positive semidefinite (sparse) matrices. It accepts for the following options

Option Explanation Default
preconditioner Matrix preconditioner diagonal
levels Band half-width for preconditioner = ic full profile
reorder rcm to solve a reverse Cuthill-McKee system -
rtol Rel. tolerance for convergence \(10^{-8}\)
atol Abs. tolerance for convergence \(10^{-12}\)
maxiter Max iterations before failure \(\min(1.2\,N,\,20000)\)
reuse Preconditioner rebuild period (see below) 1

The matrix preconditioner is a key factor for the efficient convergence of the iterative scheme. These are the implemented options:

Keyword Explanation
diagonal Jacobi (diagonal scaling)
ic Incomplete Cholesky, full matrix profile, no fill-in
ic, levels = K Banded incomplete Cholesky: keep only the K sub-diagonals
cc Complete Cholesky

Bare preconditioner = ic is an incomplete Cholesky with the same profile as the matrix being solved, so it is a Cholesky factor without any fill-in. Adding levels = K instead keeps only the K sub-diagonals of that factor (levels = 0 is the diagonal alone, equivalent to diagonal). A small band is a poor preconditioner unless the matrix has a small bandwidth in the current numbering, so pair it with reorder = rcm, which solves a reverse Cuthill-McKee-reordered (bandwidth-reduced) system — a symmetric permutation, so the solution is unchanged, only the preconditioner quality and iteration count.

Note that a complete Cholesky will precondition the matrix to the identity, so the conjugate gradient will succeed in one iteration, at the expense of a large cost for calculating the preconditioner. Still, using a cc preconditioner might be useful. First, as a test case to confirm the performance of the iterative solver. But, more importantly, the complete Cholesky can be performed once to calculate the preconditioner and then, reused many times in the context of a nonlinear simulation where the tangent stiffness changes at every step.

The reuse keyword controls how often the preconditioner is rebuilt: reuse = 1 (the default) rebuilds it on every call to the solver; reuse = 0 builds it once and keeps it for the whole analysis; reuse = K with \(K>1\) rebuilds it on every $K$-th call. An eigenvalue analysis always uses reuse = 0.

7.9. Time integration method

In step-by-step solution, in addition to the solver, a time integration method must be provided. This is the algorithm that will take care of integrating the equations in time (for a transient problem) or in pseudo-time for a stationary problem. The command line to drive this option is

integrator, type = [quasistatic | cd | newmark | hht | midpoint] [, <command>] ...

Time stepping methods are responsible for updating the state variables after every iteration — if the step solver is nonlinear — and after the end of a time step, before starting a new one. The keywords in the command line correspond to the following methods

Keyword Method’s name Time order
backwardeuler Backward Euler One
cd Central differences method Second
forwardeuler Forward Euler One
hyperpara Hyperbolic/parabolic One + two
newmark Newmark’s method for second order equations Second
hht Hilber, Hughes & Taylor Second
midpoint Midpoint rule One/two
quasistatic Quasistatic integrator Zero
verlet Verlet method Two

7.9.1. Quasistatic

The quasistatic integrator is really not a time integrator; it is just the standard method to push the degrees of freedom during iterations and steps in a quasistatic solution. This method has no options.

7.9.2. Newmark method

Newmark’s method is the most common integration scheme for solid and structural mechanics (??, a). The method has two parameters, usually referred to as \(\beta,\gamma\) that determine the stability, accuracy, artificial damping of each of the members of the family. The options of the method in IRIS are

Keyword Value
beta double
gamma double
predictor integer in \([1,2]\)

The most common algorithm within the Newmark’s family is the trapezoidal rule, as second order accurate method that is unconditionally stable for linear problems and has no algorithmic damping. It corresponds to \(\gamma = 2\beta = 1/2\). In IRIS, when the integrator command line selects the Newmark’s method and no additional options are given, the code chooses the parameters of the trapezoidal rule.

When \(\gamma>1/2\) is given, IRIS selects automatically the parameter \(\beta\) so that the resulting method has maximum algorithmic dissipation while preserving the unconditional stability for linear problems. As a drawback, the method becomes only first order accurate.

In nonlinear problems, the choice of predictor in a solution step might have a non-negligible effect. By default, IRIS chooses as predictor for the displacements field the one obtained in the last converged solution, effectively setting the velocity to zero. If predictor is set to 2, the velocity at the beginning of the step is set fixed, and thus the initial displacement does not corresponds to the previously converged one.

7.9.3. The HHT method

The Hilber-Hughes-Taylor method is a second order implicit method for structural dynamics that possesses controllable artificial dissipation (??, a). The options of the method are:

Parameter Value
alpha double in \([0.7,1]\)

When the parameter alpha is set equal to 1, the method will be identical to the trapezoidal rule and thus it will add not high-frequency damping. The amount of dissipation increases monotonically while alpha is reduced until 0.7.

7.10. Time stepping control

An important ingredient of a step-by-step is the selection of the time step size. In IRIS, this quantity can be fixed by the user, or allow the code to select it adaptatively.

tscontrol, type = [automatic | cfl | fixed] [, <command>] [...]

If a time step control is not provided, the default fixed will be employed.

7.10.1. Automatic time step selection

keyword Data type Default value
dt <double> 1.0
maxdt <double> Infinite
mindt <double 0.0
target <integer> 8

7.10.2. CFL selection

In this method, the time step size is selected according to the Courant, Friedrich, Levy’s bound (CFL) for explicit methods

keyword Data type Default value
dt <double> 1.0
scaledt <double> 1.0
update <int> 100

7.10.3. Fixed time step

This is the most basic time stepping control in which the user sets the value of the time step and the code keeps it constant during the whole analysis. The syntax of options for this control is

keyword Data type Default value
dt <double> 1.0

It must be noted that if the analysis is nonlinear and IRIS is unable to converge to a solution during a step, the code will exit since, under this control, the time step size can not be modified.

8. Controlling the output

IRIS produces three types of outputs:

  • Log files with information about the progress of the analysis.
  • Postprocessing information for graphical output.
  • Results files with data obtained in the analysis.

8.1. The log files

IRIS generates a few files automaticall. These are

  • iris.log: This is the main log file of the code. IRIS writes here all the information generated at runtime. First, IRIS writes all the information gathered from the input file (the characteristics of the analysis and the parts, the boundary conditions, the loading, materials, etc.). Then it gives information about the progress of the analysis (convergence, errors, etc.). This file is key to understand the sucdess or failure of an analysis.
  • iris.warnings

Every time the code is run, it looks for the files iris.log and iris.warnings in the directory where it is being executed and deletes them if they exist. If, for any reason, the user wants to preserve the log file, IRIS should be run with the flag --save.

8.2. The postprocessing files

IRIS has the ability to dump the results obtained to files that can later be read by specialized postprocessing software. This is accomplished with the command line

postprocessor, type = [paraview | gmsh ] [, compress = <yes|no>] [, frequency = <double>]
    [smoother = <lumped|leastsquares>] [, result = <keyword>], [, result = <keyword>] [, ...],
    [,elementresult = <keyword>] [,elementresult = <keyword>] [...]

First, the user might select if the format of the postprocessing files is the one required by either Paraview or Gmsh, two programs capable of displaying graphically complex finite element solutions and related ones. The user can select as well if the output files are to be written in compressed (gzipped) format and the frequency in which the code will dump them (by default, they will be written at the end of every solution step).

The postprocessor commands writes to files the values of the degrees of freedom of them. Additionally, the user might want to obtain other results (stresses, heat fluxes, etc.) that are smoothed to the nodes or left (unsmoothed) in the elements. The commands result and elementresult serve this purpose and there can be as many as desired.

8.3. The results files

IRIS allows the user to write results obtained from the solution to text files. The syntax that needs to be employed to generate these reports is:

logger, variable = [dof | mass | reaction | bodies | stress | gradient | rate | velo | acce | energy | scaling | solution],
    settype = [element | elset | node | nodeset],
    [, nodeset = <string> | body = <string>, setname = <string>]
    [, varlabel = <integer>]
    [, filename = <string>] [, frequency = <double>]
    [, droptol = <double>] [, precision = <integer>]

The command variable selects which information should be dumped in the log file. In case the information is a degree of freedom, the variable label varlabel should be provided. The information will be extracted from a set selected using either a settype/setlabel pair or, alternatively, a named setname from a body. In the latter case the two strings should be provided.

A report will have a default name that will be replaced if a filename is provided. The data will be written to a file at every step of the solution, unless a frequency is indicated. Values smaller than droptol will be written as zero. The precission of the output can be controlled with the option that has that name.

In the case of scaling log files, they record the value in time of a given scaling combination. The syntax is as follows:

logger, variable = scaling, label = <integer>, [, filename = <string>] [, frequency = <double>]
    [, droptol = <double>] [, precision = <integer>]

and the value of the scaling combination with number label will be output to a file.

8.3.1. Reaction logs

IRIS can save the sum of the reactions on a group of nodes. The syntax for this output file is one of these two:

logger, variable = reaction, body = <string>, setname = <string> [, <options>]

or

logger, variable = reaction, nodeset = <string> [, <options>]

8.3.2. Solution logs

IRIS may save a snapshot of the finite element solution at each step. For that, we use a solution logger with syntax

logger, variable = solution

A solution file will be created at each step and it will include the node label, its coordinates, and its degrees of freedom.

9. The makefile


10. Element types

Element types define the equations that are solved by the code. They must select a unique label that will be referenced by the modelpart and the superloading. The syntax for all element types is as follows:

eltype, label = =<integer>= [, options ...]

The label and type fields are mandatory in every record. The tables below therefore list only the additional fields, except for material, which is shown whenever it is required. A material-family note names the corresponding MUESLI base class; a material of a different family is rejected when the input is read.

10.1. Type advectiondiffusion

This is the scalar, linear advection–diffusion equation, for example heat or solute transport with a prescribed velocity. It uses a MUESLI conductorMaterial.

Keyword Admitted value
material <integer>
ax, ay, az <double> (advection components)
supg, gls, vms, oss, noone flag (one stabilization choice)
heatsupply <double>

10.2. Type bar

Two-node, small-strain axial bar for trusses. Its stiffness, area and mass are taken from a named bar section; no MUESLI material is used.

Keyword Admitted value
section <string>

10.3. Type beam

Geometrically exact beam for slender structural members, with translational and rotational degrees of freedom. It obtains constitutive and inertia data from a beam section.

Keyword Admitted value
section <string>
body1, body2, body3 <double>
bodym1, bodym2, bodym3 <double>
point1, point2, point3 <double>
vector1, vector2, vector3 <double>
scaling <integer>

10.4. Type drod

Three-node discrete rod, useful for a bending regularisation or a simple one-dimensional bending model. It has no material.

Keyword Admitted value
ei <double> (bending stiffness)

10.5. Type dummy, dummycurve, dummysurface and dummyvolume

These placeholder elements carry the corresponding point, curve, surface or volume geometry without contributing equations. They take no options.

Keyword Admitted value
-- --

10.6. Type dummylink

A zero-equation link placeholder. It takes no options.

Keyword Admitted value
-- --

10.7. Type euler

Compressible Euler/Navier–Stokes fluid element in conservative variables. It requires a MUESLI fluidMaterial.

Keyword Admitted value
material <integer>
alpha <double>
bx, by, bz <double> (body force per mass)
h1984, n2009, nostab flag (stabilization)

10.8. Type fbar

Finite-strain axial bar for nonlinear trusses. It uses an fbar section and does not select a MUESLI material directly.

Keyword Admitted value
section <string>
nodemass <double>

10.9. Type fmembrane

Finite-strain membrane for thin surfaces. It requires a MUESLI finiteStrainMaterial.

Keyword Admitted value
material <integer>
thickness <double>
quadpoints <integer>

10.10. Type fpoisson

Nonlinear scalar Poisson/heat-conduction element. Use it when conductivity or capacity depends on the unknown; it requires MUESLI conductorMaterial.

Keyword Admitted value
material <integer>
tref <double>
lumped <double> in \([0,1]\)
varchange exp, arctan or tanh

10.11. Type frod and torsionfreefrod

Finite-strain rods for cables and slender members; torsionfreefrod omits the torsional mode. They use their section data rather than a MUESLI material.

Keyword Admitted value
section <string>
body1, body2, body3 <double>
scaling <integer>
EA, EI, arho, Irho <double> (torsionfreefrod only)

10.12. Type fshell and ftshell

Finite-strain shell elements for large-displacement thin structures. fshell uses a MUESLI finiteStrainMaterial; ftshell couples the shell to heat conduction and additionally requires a MUESLI conductorMaterial.

Keyword Admitted value
material <integer>
section <string>
pressure <double>
zerox, zeroy, zeroz <double>
omegax, omegay, omegaz <double>
bx, by, bz <double>
scaling <integer>

10.13. Type fsolid

This element implements finite-strain mechanics in quasistatic or dynamic problems. It requires a MUESLI finiteStrainMaterial.

Keyword Admitted value
material <integer>
formulation spatial, convected, conserving, bbar or stabilized
alpha <double>
quadpoints <integer>

bbar is restricted to hexahedra. stabilized is a mixed displacement– pressure formulation; the other formulations use displacement degrees of freedom only.

10.14. Type ftm

Finite-strain thermomechanics, for large-deformation thermoelastic or thermoplastic solids. It requires MUESLI thermofiniteStrainMaterial.

Keyword Admitted value
material <integer>
formulation convected or spatial
tref <double>
variational flag

10.15. Type ftcm

Finite-strain thermo-chemo-mechanics. It requires MUESLI fThermoMechMassMaterial.

Keyword Admitted value
material <integer>
formulation convected or spatial
muref <double>
tref <double>
variational flag

10.16. Type aotftmc and ftmc

Finite-strain coupled thermo-mechanical mass transport. ftmc is an input alias for aotftmc. It requires MUESLI fThermoMechMassMaterial.

Keyword Admitted value
material <integer>
formulation convected, spatial or bbar
muref, tref <double>
variational flag

10.17. Type fmm and fmechmass

Finite-strain mechanics coupled with mass diffusion. fmechmass is an alias for fmm. It requires MUESLI fMechMassMaterial.

Keyword Admitted value
material <integer>
formulation convected or spatial
muref <double>
variational flag

10.18. Type fthermorod and fthermoelerod

Finite-strain thermoelastic rods, the latter including electro-thermal coupling. They use their specialised structural formulation and section data.

Keyword Admitted value
section <string>
material <integer>
tref <double>

10.19. Type hydrogen

Chemical-potential formulation for hydrogen diffusion in a solid. It requires MUESLI dissolvedHydrogenMaterial.

Keyword Admitted value
material <integer>
muref <double>
variational flag

10.20. Type lagfluid

Lagrangian Navier–Stokes flow for moving-domain fluid problems. It requires MUESLI fluidMaterial.

Keyword Admitted value
material <integer>
formulation pspg or douglaswang
alpha <double>
bx, by, bz <double>
semiimplicit, compressible flag
rayleighh <double>

10.21. Type lineardiffusion

Linear mass/chemical-potential diffusion. It requires MUESLI linearDiffusionMaterial.

Keyword Admitted value
material <integer>
muref <double>

10.22. Type nonlineardiffusion

Nonlinear scalar diffusion. It requires MUESLI nonLinearDiffusionMaterial.

Keyword Admitted value
material <integer>
muref <double>

10.23. Type mixed

Small-strain displacement–pressure solid for incompressible materials. It requires MUESLI smallStrainMaterial and is implemented for linear tetrahedra and trilinear hexahedra.

Keyword Admitted value
material <integer>

10.24. Type navierstokes

Eulerian incompressible Navier–Stokes flow. It requires MUESLI fluidMaterial.

Keyword Admitted value
material <integer>
alpha <double>
bx, by, bz <double>
formulation stabilized, pspg, douglaswang or pitkaranta

10.25. Type phasefield

Scalar phase-field fracture/damage equation. It does not use a MUESLI material; fracture parameters are given directly.

Keyword Admitted value
gc, l <double>
enriched incompatible_modes or gradient_enhanced

10.26. Type phasefracture

Coupled small-strain mechanics and phase-field fracture. It requires MUESLI smallStrainMaterial.

Keyword Admitted value
material <integer>
gc, l, k <double>
degradation isotropic, anisotropic or hybrid
split_energy spectral, deviatoric, deviatoric_simple or masonry
solver staggered or monolithic
fatigue flag
quadpoints <integer>

10.27. Type plate and thermoplate

Kirchhoff-type plate elements for bending of thin surfaces; thermoplate adds a temperature field. They use a plate section.

Keyword Admitted value
section <string>
material <integer> (thermoplate)
tref <double> (thermoplate)

10.28. Type pointmass

Lumped point mass for discrete dynamic models. It has no MUESLI material.

Keyword Admitted value
mass <double>
bx, by, bz <double>

10.29. Type poisson

Continuum linear heat conduction or a generic scalar Poisson problem. It requires MUESLI conductorMaterial.

Keyword Admitted value
material <integer>
tref <double>
lumped <double> in \([0,1]\)

10.30. Type controlledpoisson

Scalar Poisson equation with a variable transformation used to enforce bounds. It requires MUESLI conductorMaterial.

Keyword Admitted value
material <integer>
tref <double>
lumped <double> in \([0,1]\)
varchange exp, arctan or tanh

10.31. Type compartmentalpoisson

Multi-compartment reaction–diffusion/transport equation. It requires MUESLI conductorMaterial.

Keyword Admitted value
material <integer>
ncompartments <integer>
rho, lumpvelocity, lumpreaction, t0 <double>
variable <character>
varchange exp, arctan or tanh

10.32. Type rigidbody

Concentrated rigid body with translation and rotation, for multibody dynamics.

Keyword Admitted value
M <double>
I11, I22, I33, I12, I13, I23 <double>

10.33. Type rigidlink, trlink and rblink

Kinematic links. rigidlink enforces a rigid connection; trlink and rblink use either a penalty or Lagrange-multiplier constraint.

Keyword Admitted value
stiffness <double> (trlink, rblink)
formulation penalty or lagrange (trlink, rblink)

10.34. Type spring

Discrete spring for linear or nonlinear connector models. It has no MUESLI material.

Keyword Admitted value
stiffness, epsilon, nodemass <double>
section <string>
potential <string>

10.35. Type solid

Three-dimensional small-strain continuum mechanics. It requires MUESLI smallStrainMaterial.

Keyword Admitted value
material <integer>
formulation standard, mixed, stabilized or bbar
quadpoints <integer>
alpha, epsilon, characteristic_length <double>

10.36. Type stm

Small-strain thermomechanics (displacement and temperature). It requires MUESLI thermoElasticMaterial.

Keyword Admitted value
material <integer>
formulation standard or bbar
quadpoints <integer>
epsilon, characteristic_length <double>

10.37. Type smm

Small-strain mechanics coupled with mass transport. It requires MUESLI sMechMassMaterial.

Keyword Admitted value
material <integer>
formulation standard or bbar
quadpoints <integer>

10.38. Type smmhyd

Small-strain mechanics coupled with hydrogen diffusion. It requires MUESLI sMechMassHydMaterial.

Keyword Admitted value
material <integer>
formulation standard or bbar
quadpoints <integer>
variational flag

10.39. Type stokes

Incompressible Stokes flow with stabilization. It requires MUESLI newtonianMaterial.

Keyword Admitted value
material <integer>
formulation pspg, douglaswang or pitkaranta
alpha <double>
bx, by, bz <double>

10.40. Type taylorhood

Mixed Taylor–Hood Stokes flow, with higher-order velocity than pressure. It requires MUESLI newtonianMaterial.

Keyword Admitted value
material <integer>
stabilization <double>
bx, by, bz <double>

10.41. Type thermalwire

One-dimensional thermal network/wire with direct conductivity and storage parameters. It has no MUESLI material.

Keyword Admitted value
kappa, c0 <double>

10.42. Type turingsurface

Surface reaction–diffusion element for Turing-pattern problems.

Keyword Admitted value
reaction <integer>
diffusion1, diffusion2 <double>

10.43. Type macro, sthermoto, sthermoto_functionalcv, sthermoto_nodalcv and svtochemp

These are topology-optimization elements: macro is the mechanical macro model; the sthermoto variants add thermal design fields; svtochemp is the phase-field/Cahn–Hilliard variant. They require MUESLI smallStrainMaterial.

Keyword Admitted value
material <integer>
formulation standard, mixed, stabilized or bbar
quadpoints <integer>
alpha, gamma, epsilon, kappa <double>
penalization, factor, eta <double> (where applicable)
well, denschange, wellpot, ersatzmat <integer> (where applicable)

10.44. Type art_comp

Lagrangian artificial-compressibility flow for incompressible Newtonian fluids. It requires MUESLI newtonianMaterial.

Keyword Admitted value
material <integer>
formulation convected or updated
mixed flag

10.45. Type fauno

Heat conduction with optional laser heating and convection. It requires MUESLI conductorMaterial.

Keyword Admitted value
material <integer>
tref, tenvironment <double>
lumped <double> in \([0,1]\)
laserheat, lasertime, convection <double>
plane flag

10.46. Type faunostm

Small-strain thermomechanics with laser heating. It requires MUESLI fsThermoMechMaterial.

Keyword Admitted value
material <integer>
formulation standard or bbar
quadpoints <integer>
alpha, tref, tenvironment, laserheat, lasertime, convection <double>

10.47. Type harmonic

Frequency-domain mechanics with real and imaginary displacement fields. It requires MUESLI frequencyMaterial.

Keyword Admitted value
material <integer>
frequency <double>

10.48. Type prototype

Experimental small-strain homogenization element. It requires MUESLI smallStrainMaterial.

Keyword Admitted value
material <integer>
quadpoints <integer>
lambdam, mum, lambdal, mul, characteristic_length <double>

10.49. Type stabilizedbeam

Small-strain Timoshenko beam with selectable integration. It uses a beam section and no MUESLI material.

Keyword Admitted value
section <string>
formulation standard, reduced, mixed or stabilized
body1, body2, body3, bodym1, bodym2, bodym3 <double>
point1, point2, point3, vector1, vector2, vector3 <double>

10.50. Type thermalsurface

Two-dimensional heat-conduction layer. It requires MUESLI conductorMaterial.

Keyword Admitted value
material <integer>
thickness <double>

11. Material types

Material types select constitutive behaviors from the available models in MUESLI. The syntax of these commands is always of the form:

material, label = <integer>, type = <string> [, options ...]

We summarize next the available material models and the parameters that need to be defined (with defaults)

11.1. Type elastic

This model represents the elastic, isotropic behavior for small strain mechanics.

Option Meaning Default
young Young’s modulus 0.0
poisson Poisson’s ratio 0.0
lambda Lamé parameter 0.0
mu Lamé parameter 0.0
density   1.0
tref Reference temperature 273.0

11.2. Type splastic

This is the model for small strain elastoplastic behavior

Option Meaning Default
young Young’s modulus 0.0
poisson Poisson’s ratio 0.0
lambda Lamé parameter 0.0
mu Lamé parameter 0.0
isotropich Isotrophic hardening par 0.0
kinematich Kinematic hardening par 0.0
yieldstress   0.0
density   1.0
model von_mises or tresca or drucker von_mises
alphac drucker’s cone semiangle 0.0
tref Reference temperature 273.0

11.3. Type conductor

Conductor materials are employed in thermal calculations. More precisely, the condutor defines a Fourier’s type relationship between heat flux and temperature gradient which is isotropic. The options are:

Option Meaning Default
conductivity (isotropic) conductivity 0.0
capacity Heat capacity 0.0

12. An input file

We include here, as an example, the quasistatic analysis of the mechanical response of a cube-shaped body.

#
# Analysis file for IRIS
#
# Description: a simple cube
#
# Author: i. romero
# Date:   jul 2006
#

#----------------------------------------------------------------------------
#
#   1 - Basic description of the analysis
#
#----------------------------------------------------------------------------
analysis, type = static, final_time = 1.0
modelpart, type = body, shape = qcube, name = "mycube", eltype = 1, \
  centerx = 0.2, centery = 0.3, centerz = -0.1, \
  lx = 1.1, ly = 0.9, lz = 0.7, \
  rotz = 0.2, roty = 0.1, rotz = -0.3, \
  divx = 5, divy = 4, divz = 5


#----------------------------------------------------------------------------
#
#   2 - Integrator and solver
#
#----------------------------------------------------------------------------
integrator, type = quasistatic
stepsolver, type = newton
linsolver,  type  = pcg
stepping, type = fixed, dt=0.2

superloading, body = mycube, surface = 5, tx = 200.0, ty = 300.00, tz = 400.0





#----------------------------------------------------------------------------
#
#   3 - Element types and materials
#
#----------------------------------------------------------------------------
material, label = 1, type = neohookean, young = 1e4, poisson = 0.3, density = 4241.0
eltype, label = 1, type = fsolid, material = 1



bc, body = mycube, surface = 4, variable=u, ux = 0.0, uy = 0.0, uz = 0.0



#----------------------------------------------------------------------------
#
#  6 - Output data
#
#----------------------------------------------------------------------------
#postprocessor, type = paraview
output, variable = energy

13. A log file

We show in this appendix one example of a log file obtained after running a simulation in IRIS. The file shows, first, the information that the code obtains or generates from the input file. If some aspects of the analysis are not provided, the code supplements the information with default procedures. Then, the output of the analysis is reported illustrating the convergence in the nonlinear procedure.

=============================================================================
|                                                                           |
|                              I    R    I    S                             |
|                                                                           |
=============================================================================

             A general purpose finite element analysis program             

              Copyright Ignacio Romero, ignacio.romero@upm.es              
                      Universidad Politecnica de Madrid                    
                          IMDEA Materials Institute                        
                       version  9.1  (November 2023)



                    R u n t i m e   o p t i o n s                    

   Available threads   : 10
   Activated threads   : 10
   Debug mode          : inactive

   [ Model checked ]
   [ Stepsolver checked ]
   [ Stepsize control checked ]



               A n a l y s i s    i n f o r m a t i o n               

 General properties:
   Name                : cube.iris
   Analysis type       : Quasistatic analysis
   Final time          : 1
   Started on          : Fri Dec 22 15:10:38 2023
   Hostname            : IROMERO.local
   Username            : ignacio



                        S t e p   S o l v e r                        

 Remesh after steps                      : Never
 Newton-Raphson non-linear solver
 Maximum number of iterations allowed    : 10
 Recompute tangent frequency             : 1
 Relative energy error for convergence   : 1e-16
 Absolute value of energy for convergence: 1e-20
 Number of pre-iterations                : 0
 Maximum number of allowed trials        : 4
 Linesearch                              : false



            T i m e   s t e p s i z e   s e l e c t i o n            

 No time step adaptation.
 The first failure in a NR solution will cause the analysis to halt.
 Time step size : 2.000000e-01



        S o l v e r   f o r   l i n e a r   e q u a t i o n s        

 Preconditioned conjugate gradient solver.
 Iterative solver for symmetric positive definte systems.
 Diagonal preconditioner.
 Relative tolerance for convergence = 1.000000e-10
 Absolute tolerance for convergence = 1.000000e-14




                  S c a l i n g   f a c t o r s  (1)                  

 Scaling factor number 0: 1 component(s)
  +linear factor active in (0.000000e+00, infinite]
   initial value = 0.000000e+00,  slope = 1.000000e+00



                      V a r i a b l e    L o g s                      

 Variable logger information
   Var type      : Energy, entropy, and volume.
   In set        : the whole domain.
   Filename      : iris_energy.vlog
   Log frequency : every time step
   Last log time : 0.000000e+00
   Precision     : 4
   Drop tolerance: 1.000000e-08
   Graphic output: none.



                S y s t e m   o f   e q u a t i o n s                

Sparse matrix
        Format                     : Symmetric Compressed Sparse Column (SCSC)
        Number of rows             : 450
        Number of columns          : 450
        Number of profile terms    : 12393
        Band size                  : 42
        Condition number           : 0.000000e+00
        Factorized                 : 0
        Data type                  : double
        Incorrect format (try hb or mm)



                         I n t e g r a t o r                         

 Incremental quasistatic integrator.
 Time is only a parameter to describe the progress of the analysis.



                    E l e m e n t   T y p e s  (1)                    

Element type   1 : FSOLID
 Degrees of freedom:
 Variable name : u, type : vector
 Linked to material with label 1
 Finite strain, deformable solid model.
 Implementation : convected
 Finite strain, standard displacement formulation.



                M a t e r i a l s  (1)

Material #1: 
   Elastic Neo-Hookean material for finite deformation analysis
   Stored energy function:
            W(I1,J) = U(J) + mu/2 ( I1_C - 3) - mu log J
            U(J)    = lambda/2 * (log J)^2

   Young modulus:  E      = 1.000000e+04
   Poisson ratio:  nu     = 3.000000e-01
   Lame constants: Lambda = 5.769231e+03
                   Mu     = 3.846154e+03
   Bulk modulus:   k      = 8.333333e+03
   Density                = 4.241000e+03
   Wave velocities C_p    = 1.781612e+00
                   C_s    = 9.523119e-01




                  M o d e l    i n f o r m a t i o n                  

   Number of bodies           :      1
   Number of raw meshes       :      0
   Number of meshlessbodies   :      0
   Number of control volumes  :      0
   Number of crystals         :      0
   Number of interactions     :      0
   Number of elements         :    100
   Number of evalspots        :      0
   Number of nodes            :    180
   Number of slave nodes      :      0
   Number of elsets           :      0
   Number of nodesets         :      1
   Number of point loads      :      0
   Number of constraints      :      1
   Number of unknowns         :    450
   Max. dofs/node             :      3

   Dofset dictionary: 
     Variable name: u, type: vector



                          B o d i e s   (1)                          

    Body name          : mycube
    Manifold dimension : 3
    Center             : (2.000000e-01, 3.000000e-01, -1.000000e-01)
    Orientation        : (0.000000e+00, 1.000000e-01, -3.000000e-01)
    Number of elements : 100
    Number of nodes    : 180
    Number of spots    : 0
    Type               : Brick with hexahedral elements
    Name               : mycube
    Dimension          : 3
    Subdivisions x     : 5
    Subdivisions y     : 4
    Subdivisions z     : 5
    Length x           : 1.100000e+00
    Length y           : 9.000000e-01
    Length z           : 7.000000e-01
    Center             : 2.0000000000e-01 3.0000000000e-01 -1.0000000000e-01
    Orientation        : 0.0000000000e+00 1.0000000000e-01 -3.0000000000e-01
    distorted          : no

    Named sets of dimension 0:
      vertex0,  vertex1,  vertex2,  vertex3,  vertex4,  
      vertex5,  vertex6,  vertex7,  

    Named sets of dimension 1:
      edge0,  edge1,  edge10,  edge11,  edge2,  
      edge3,  edge4,  edge5,  edge6,  edge7,  
      edge8,  edge9,  

    Named sets of dimension 2:
      surface0,  surface1,  surface2,  surface3,  surface4,  
      surface5,  

    Named sets of dimension 3:
      volume0,  




                       N o d e    S e t s   (1)                       

 Nodeset : a_brick_external_nodes (0 nodes) (internal)



                     C o n s t r a i n t s   (1)                     

 Constraint on a body boundary
 Name of the body   : mycube
 Boundary dimension : 2
 Boundary label     : 4
 Number of nodes    : 30
 variable u[0]      : 0.0000000000e+00
 variable u[1]      : 0.0000000000e+00
 variable u[2]      : 0.0000000000e+00
       scaling      : 0  (default)



                       S u p e r L o a d s  (1)                       

* Loading on body mycube
    Manifold dimension   : 2
    Manifold label       : 5
    Eltype label         : 0
    Scaling factor label : 0
    Number of elements:  : 20




                    S t a r t i n g    A n a l y s i s
                    ----------------------------------



Solution at (pseudo) time = 2.000000e-01, dt = 2.000000e-01, Step = 1
 Scaling factor 0  = +2.000000e-01
        [ System Size: 450
        [ PCG Iteration 117  , residual: +1.4942e-09, rel: +7.0623e-11, PCG total_time: +1.3e-02
 Opt: -4.6456e+01, Res: 2.1158e+01, EErr: 2.0947e+00 (1.0000e+00), Mflps: 283  
        [ System Size: 450
        [ PCG Iteration 128  , residual: 2.7530e-10, rel: 9.4898e-11, PCG total_time: 1.4e-02
 Opt: -4.7489e+01, Res: 2.9010e+00, EErr: 3.5563e-03 (1.6978e-03), Mflps: 287  
        [ System Size: 450
        [ PCG Iteration 134  , residual: 1.5069e-13, rel: 7.1394e-11, PCG total_time: 1.4e-02
 Opt: -4.7490e+01, Res: 2.1107e-03, EErr: 1.8973e-08 (9.0578e-09), Mflps: 286  
        [ System Size: 450
        [ PCG Iteration 86   , residual: 9.5341e-15, rel: 1.4094e-07, PCG total_time: 9.1e-03
 Opt: -4.7490e+01, Res: 6.7648e-08, EErr: 1.2756e-18 (6.0897e-19), Mflps: 290  

Solution at (pseudo) time = 4.000000e-01, dt = 2.000000e-01, Step = 2
 Scaling factor 0  = +4.000000e-01
        [ System Size: 450
        [ PCG Iteration 131  , residual: +2.1151e-09, rel: +9.9965e-11, PCG total_time: +1.4e-02
 Opt: -9.6002e+01, Res: 2.1158e+01, EErr: 2.0166e+00 (1.0000e+00), Mflps: 285  
        [ System Size: 450
        [ PCG Iteration 126  , residual: 2.3666e-10, rel: 9.2062e-11, PCG total_time: 1.3e-02
 Opt: -9.6996e+01, Res: 2.5707e+00, EErr: 2.9055e-03 (1.4408e-03), Mflps: 286  
        [ System Size: 450
        [ PCG Iteration 131  , residual: 1.6833e-13, rel: 9.5683e-11, PCG total_time: 1.4e-02
 Opt: -9.6998e+01, Res: 1.7592e-03, EErr: 1.2883e-08 (6.3888e-09), Mflps: 286  
        [ System Size: 450
        [ PCG Iteration 84   , residual: 8.1029e-15, rel: 1.8650e-07, PCG total_time: 8.9e-03
 Opt: -9.6998e+01, Res: 4.3447e-08, EErr: 5.3771e-19 (2.6665e-19), Mflps: 288  

Solution at (pseudo) time = 6.000000e-01, dt = 2.000000e-01, Step = 3
 Scaling factor 0  = +6.000000e-01
        [ System Size: 450
        [ PCG Iteration 130  , residual: +2.0613e-09, rel: +9.7422e-11, PCG total_time: +1.4e-02
 Opt: -1.4749e+02, Res: 2.1158e+01, EErr: 1.9449e+00 (1.0000e+00), Mflps: 284  
        [ System Size: 450
        [ PCG Iteration 126  , residual: 2.0611e-10, rel: 9.0541e-11, PCG total_time: 1.4e-02
 Opt: -1.4845e+02, Res: 2.2764e+00, EErr: 2.3792e-03 (1.2233e-03), Mflps: 286  
        [ System Size: 450
        [ PCG Iteration 130  , residual: 1.3530e-13, rel: 9.1245e-11, PCG total_time: 1.4e-02
 Opt: -1.4845e+02, Res: 1.4828e-03, EErr: 8.7881e-09 (4.5186e-09), Mflps: 287  
        [ System Size: 450
        [ PCG Iteration 80   , residual: 9.6738e-15, rel: 3.4211e-07, PCG total_time: 8.5e-03
 Opt: -1.4845e+02, Res: 2.8277e-08, EErr: 2.3287e-19 (1.1973e-19), Mflps: 288  

Solution at (pseudo) time = 8.000000e-01, dt = 2.000000e-01, Step = 4
 Scaling factor 0  = +8.000000e-01
        [ System Size: 450
        [ PCG Iteration 130  , residual: +1.5216e-09, rel: +7.1918e-11, PCG total_time: +1.4e-02
 Opt: -2.0085e+02, Res: 2.1158e+01, EErr: 1.8792e+00 (1.0000e+00), Mflps: 284  
        [ System Size: 450
        [ PCG Iteration 125  , residual: 1.9420e-10, rel: 9.6413e-11, PCG total_time: 1.4e-02
 Opt: -2.0178e+02, Res: 2.0143e+00, EErr: 1.9528e-03 (1.0391e-03), Mflps: 284  
        [ System Size: 450
        [ PCG Iteration 130  , residual: 1.1979e-13, rel: 9.4827e-11, PCG total_time: 1.4e-02
 Opt: -2.0178e+02, Res: 1.2632e-03, EErr: 6.0123e-09 (3.1994e-09), Mflps: 286  
        [ System Size: 450
        [ PCG Iteration 79   , residual: 8.5411e-15, rel: 4.5973e-07, PCG total_time: 8.4e-03
 Opt: -2.0178e+02, Res: 1.8578e-08, EErr: 1.0305e-19 (5.4839e-20), Mflps: 289  

Solution at (pseudo) time = 1.000000e+00, dt = 2.000000e-01, Step = 5
 Scaling factor 0  = +1.000000e+00
        [ System Size: 450
        [ PCG Iteration 129  , residual: +1.9586e-09, rel: +9.2570e-11, PCG total_time: +1.4e-02
 Opt: -2.5604e+02, Res: 2.1158e+01, EErr: 1.8192e+00 (1.0000e+00), Mflps: 284  
        [ System Size: 450
        [ PCG Iteration 124  , residual: 1.6665e-10, rel: 9.3584e-11, PCG total_time: 1.3e-02
 Opt: -2.5693e+02, Res: 1.7808e+00, EErr: 1.6067e-03 (8.8318e-04), Mflps: 284  
        [ System Size: 450
        [ PCG Iteration 130  , residual: 9.4280e-14, rel: 8.6776e-11, PCG total_time: 1.4e-02
 Opt: -2.5694e+02, Res: 1.0865e-03, EErr: 4.1197e-09 (2.2645e-09), Mflps: 286  
        [ System Size: 450
        [ PCG Iteration 78   , residual: 8.6368e-15, rel: 7.0408e-07, PCG total_time: 8.3e-03
 Opt: -2.5694e+02, Res: 1.2267e-08, EErr: 4.6308e-20 (2.5455e-20), Mflps: 287  


 End of computations.
 Analysis finished correctly.



-----------------------------------------------------------------------------
                             Solver report
-----------------------------------------------------------------------------

 Total number of solution steps  : 5
 Total time in solver            : 0
 Total number of iterations      : 20
 Total number of solution steps  : 5
 Average iterations/step         : 4
 Setup time (wall)               : 0.000 seconds
 Preprocess time (wall)          : 0.010 seconds
 Parsing time                    : 0.000 seconds
 Postprocessing time (wall | CPU): 0.000 seconds ||0.000 seconds
 Solution time (wall | CPU)      : 0.263 seconds (71.9%) || 0.263 seconds
 Assembler time (wall | CPU)     : 0.1 seconds (23.0%) || 0.085 seconds
 Total wall time                 : 0.366 seconds

 Analysis finished on Fri Dec 22 15:10:39 2023

14. Bibliography

Date: 12-09-2026

Author: Ignacio Romero

Created: 2026-09-12 Sat 22:06

Validate