Elmer FEM solver Elmer is an open source finite element software for multiphysical problems
blocksolve Module Reference

## Public Attributes

type(blockmatrix_t), pointer, save totmatrix

type(variable_t) function, pointer createblockvariable (Solver, VariableNo, VarName, ExtDofs, ExtPerm)

subroutine blockinitmatrix (Solver, BlockMatrix, BlockDofs)

subroutine blockpickmatrix (Solver, NoVar)

subroutine blockprecmatrix (Solver, NoVar)

subroutine blockupdaterhs (BlockMatrix, ThisRow)

subroutine blockmatrixvectorprod (u, v, ipar)

subroutine blockmatrixprec (u, v, ipar)

subroutine blockstandarditer (Solver, MaxChange)

subroutine blockkryloviter (Solver, MaxChange)

subroutine blocksolveint (A, x, b, Solver)

## Member Function/Subroutine Documentation

 subroutine blocksolve::blockinitmatrix ( type(solver_t), target Solver, type(blockmatrix_t), pointer BlockMatrix, integer BlockDofs )

This subroutine initializes the block matrix structure so that the matrices and vectors have a natural location to save.

Referenced by blocksolveint(), and mainutils::blocksolver().

Here is the call graph for this function:

Here is the caller graph for this function:

 subroutine blocksolve::blockkryloviter ( type(solver_t) Solver, real(kind=dp) MaxChange )

This call takes care of the iterative Krylov methods for block systems which can still be preconditioned by block Jacobi or Gauss-Seidel methods.

Referenced by blocksolveint(), and mainutils::blocksolver().

Here is the call graph for this function:

Here is the caller graph for this function:

 subroutine blocksolve::blockmatrixprec ( real(kind=dp), dimension(*), target u, real(kind=dp), dimension(*), target v, integer, dimension(*) ipar )

Perform block preconditioning by solving all the individual diagonal problems. Has to be called outside the module by Krylov methods.

Referenced by blockkryloviter().

Here is the call graph for this function:

Here is the caller graph for this function:

 subroutine blocksolve::blockmatrixvectorprod ( real(kind=dp), dimension(*) u, real(kind=dp), dimension(*) v, integer, dimension(*) ipar )

Perform matrix-vector product for block matrices. Has to be callable outside the module by Krylov methods.

Referenced by blockkryloviter().

Here is the call graph for this function:

Here is the caller graph for this function:

 subroutine blocksolve::blockpickmatrix ( type(solver_t) Solver, integer NoVar )

Picks the components of a full matrix to the submatrices of a block matrix. On choice, the user may have exactly the same block matrix structure than a leading component.

Referenced by blocksolveint(), and mainutils::blocksolver().

Here is the call graph for this function:

Here is the caller graph for this function:

 subroutine blocksolve::blockprecmatrix ( type(solver_t) Solver, integer NoVar )

The block preconditioning matrix need not be directly derived from the full matrix. Some or all the components may also be derived from a basic operator such as the Laplacian.

Referenced by blocksolveint(), and mainutils::blocksolver().

Here is the call graph for this function:

Here is the caller graph for this function:

 subroutine blocksolve::blocksolveint ( type(matrix_t), pointer A, real(kind=dp), dimension(:) x, real(kind=dp), dimension(:) b, type(solver_t), target Solver )

An alternative handle for the block solvers to be used by the legacy matrix type.

Referenced by blocksolveext().

Here is the call graph for this function:

Here is the caller graph for this function:

 subroutine blocksolve::blockstandarditer ( type(solver_t) Solver, real(kind=dp) MaxChange )

This call takes care of Jacobi & Gauss Seidel block methods.

Referenced by blocksolveint(), and mainutils::blocksolver().

Here is the call graph for this function:

Here is the caller graph for this function:

 subroutine blocksolve::blockupdaterhs ( type(blockmatrix_t), target BlockMatrix, integer, optional ThisRow )

Compute the rhs for the block matrix system which is solved accounting only the diagonal entries i.e. subtract the non-diagonal matrix-vector results from the original r.h.s. vectors. After this the block diagonal problem Ax=b may be solved.

References crsmatrix::crs_matrixvectormultiply(), and messages::info().

Referenced by blockstandarditer().

Here is the call graph for this function:

Here is the caller graph for this function:

 type(variable_t) function, pointer blocksolve::createblockvariable ( type(solver_t), pointer Solver, integer VariableNo, character(len=max_name_len) VarName, integer, optional ExtDofs, integer, dimension(:), optional, pointer ExtPerm )

If a block variable does not exist it will be created. Here only normal nodal elements are supported for the moment. Then also the creation of permutation vector is straight-forward. Note that no reordering is currently performed.

There is limitation regarding non-nodal elements which stems partly from the fact that an elementtype is solver specific while this one solver could have a number of different elementtypes for different equations.

Referenced by blockinitmatrix(), and mainutils::coupledsolver().

Here is the call graph for this function:

Here is the caller graph for this function:

## Member Data Documentation

 type(blockmatrix_t), pointer, save blocksolve::totmatrix

The documentation for this module was generated from the following file: