## Sparse Linear Equation Solvers

During the analysis of linear and nonlinear FE problems, systems of linear equations must be solved. In most cases, the matrices are sparse, and often, they are symmetric as well. The solution of these systems of linear equations constitutes an important part of the FE solving procedures and as such has a great influence on the robustness and effectiveness of any FE analysis.

B2000++ contains a variety of different solvers for sparse systems of linear equations. By default, the linear, nonlinear, static or dynamic FE solver (selected with the MDL command analysis) automatically selects in function of the discretised FE problem the sparse linear (matrix) solver. This chapter describes how to override these default settings.

The following commands may be specified in the case block.

sparse_linear_solver dmumps|dmumps_dp|dll|dmf|dmf_ooc|dmf_ooc_nommap|dpastix|icg|igmres

Selects the type of sparse linear solver:

dmumps

Direct multi-frontal solver with pivoting, for use with general symmetric matrices, making use of the the MUMPS library. This solver is used by default. It is particularly robust and effective on matrices containing Lagrange multipliers (that is, whenever nonlinear constraints are present in the FE model). It has out-of-core support. The sequential version is available on all platforms, the parallel version is available on RedHat Enterprise Linux 6.x and Fedora 21.

The parallel version is activated via the mpirun command. Example:

\$ mpirun -np 8 b2000++ DBNAME

The following options are available:

autospc yes|no

Enables fixing of singular or nearly-singular degrees-of-freedom. Default is no. This option may be useful for example in conjunction with Lagrange multipliers, or shell elements with free 6th degrees-of-freedom.

The autospc option should be used with caution as it may significantly influence the solution in non-foreseeable ways, especially in free-vibration analysis and in linearised buckling analysis. For shell FE models, it is recommended to use artificial drill stiffness (drills f) instead.

autospc_value v

If autospc is enabled, use this value to fix singular or nearly-singular degrees-of-freedom. A value of 0.0 indicates that autospc_value should be determined automatically. Default is 0.0.

autospc_threshold v

If autospc is enabled, use this value to determine singular or nearly-singular degrees-of-freedom. A value of 0.0 indicates that autospc_threshold will be chosen automatically. Default is 0.0.

compute_null_space_vector n

If autospc is enabled, compute maximum n first null space vectors (zero-energy modes) and store them on the database as DISP_NS datasets. Default is 0.

Use of this option requires sometimes to adjust autospc_threshold.

The following example is a single 2D quadrilateral element. No degrees-of-freedom are constrained, hence 3 zero-energy modes are present.

nodes
1 0.0 0.0 0.0
2 1.0 0.0 0.0
3 1.0 1.0 0.0
4 0.0 1.0 0.0
end

elements
type Q4.S.2D.TL mid 1 thickness 0.1
1 1 2 3 4
end

material 1 type isotropic
e 73.e3
nu 0.3
end

case 1
analysis                  linear
sparse_linear_solver      dmumps
autospc                   yes
autospc_threshold         1.e-15
compute_null_space_vector 3
end

case 1
end

mumps_ooc yes|no

Enables the out-of-core solver.

mumps_ooc_tmpdir directory

When the out-of-core solver is active, specifies directory where the temporary files should be created. By default, the /tmp directory is used.

mumps_ooc_prefix name

When the out-of-core solver is active, specifies name as prefix for the temporary files.

mumps_icntl v

Sets one or several values in the ICNTL (integer) array, which is used to control the behaviour of the MUMPS solver. The string v consists of comma-separated key:value pairs, where key is the index into the ICNTL array, starting from 1, and value is an integer number.

The following example enforces the use of the SCOTCH library for pivoting by setting "ICNTL(7)=3":

case 1
analysis                  linear
sparse_linear_solver      dmumps
mumps_icntl               "7:3"
end

Only in rare cases it is necessary to set ICNTL, the defaults that are set by B2000++ are usually satisfactory or are supported directly. While ICNTL allows to fine-tune the workings of MUMPS, not all options will work with B2000++. Refer to the MUMPS user's guide, section 5.1, for an explanation of ICNTL.

mumps_cntl v

Sets one or several values in the CNTL (floating-point) array, which is used to control the behaviour of the MUMPS solver. The string v consists of comma-separated key:value pairs, where key is the index into the CNTL array, starting from 1, and value is a floating-point number.

Only in rare cases it is required to set CNTL, the defaults that are set by B2000++ are usually satisfactory or are supported directly (e.g. autospc_threshold and autospc_value). Refer to the MUMPS user's guide, section 5.2, for an explanation of CNTL.

dmumps_dp

Direct multi-frontal solver without pivoting, for use with symmetric positive definite matrices, making use of the MUMPS library. It has out-of-core support. Since the matrices have to be symmetric positive definite, this solver cannot be used in FE analysis involving Lagrange multipliers. This solver is moderately faster than dmumps and supports the same set of options.

dll

Sequential direct super-nodal left-looking sparse solver for symmetric problems. The matrices need not be positive definite, however, no zero elements on the diagonal must be present.

dmf

Parallel direct multi-frontal sparse solver for symmetric problems. The matrices need not be positive definite, however, no zero elements on the diagonal must be present.

dmf_ooc

Direct multi-frontal, out-of-core, sparse symmetric solver. This solver is similar to dmf, but can also be used for FE analyses where the problem's memory footprint exceeds the available memory. The out-of-core data is stored in a temporary file and is mapped into memory using UNIX's mmap mechanism.

dmf_ooc_nommap

Similar to dmf_ooc, but less efficient. Makes use of a regular file instead of a mmap'ed file. To be used on platforms where mmap is not reliable.

dpastix

Parallel direct left-looking super-nodal solver with static pivoting, for use with positive-definite symmetric matrices, making use of the the PASTIX library.

In B2000++, the solver is executed with multi-threading enabled and MPI and out-of-core support disabled. This solver is available for RedHat Enterprise Linux 6.x and Fedora 18.

icg or igmres

Iterative conjugate-gradient (icg) and GMRES (igmres) solver for use with symmetric resp. unsymmetric problems, making use of the GMM++ library. Note that the successful use of iterative solvers largely depends on the type of problem and the preconditioner.

The following options are available:

sls_tol_residuum

Specifies the tolerance (default 1.0e-8) for the residuum. When the residuum becomes lower than this tolerance, the iterative solution process is considered converged.

sls_max_iter

Specifies maximum number of iterations. By default, an infinite amount of iterations is permitted.

sls_precond

Specifies the type of preconditioner to use. For the symmetric solver (icg) , the ildlt (default), ildltt, and diagonal preconditioners are available. For the unsymmetric solver (igmres), the ilu (default), ilut, ilutp, diagonal, and mr_approx_inverse preconditioners are available.

sls_restart

Specifies after how many iterations the preconditioner should be applied again. Default is 200.

sls_verbosity

Specifies the amount of information that GMM++ should print to the console. A value of 0 (default) means no information, a value of 1 will print the iterations, and a value of 2 will print iterations and sub-iterations.

unsymmetric yes|no

Specifies whether an unsymmetric sparse linear solver should be used. If the problem is per se symmetric, default is no. This option is normally not necessary as B2000++ automatically detects whether the problem is unsymmetric and selects the appropriate sparse linear solver.

complex yes|no

Specifies whether a complex sparse linear solver should be used. For non-complex problems, default is no. This option is normally not necessary as B2000++ automatically detects whether the problem is complex and selects the appropriate sparse linear solver.