<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- Converted with LaTeX2HTML 2012 (1.2)
original version by: Nikos Drakos, CBLU, University of Leeds
* revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
* with significant contributions from:
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
< HTML >
< HEAD >
< TITLE > Examples< / TITLE >
< META NAME = "description" CONTENT = "Examples" >
< META NAME = "keywords" CONTENT = "userhtml" >
< META NAME = "resource-type" CONTENT = "document" >
< META NAME = "distribution" CONTENT = "global" >
< META NAME = "Generator" CONTENT = "LaTeX2HTML v2012" >
< META HTTP-EQUIV = "Content-Style-Type" CONTENT = "text/css" >
< LINK REL = "STYLESHEET" HREF = "userhtml.css" >
< LINK REL = "previous" HREF = "node14.html" >
< LINK REL = "up" HREF = "node14.html" >
< LINK REL = "next" HREF = "node16.html" >
< / HEAD >
< BODY >
<!-- Navigation Panel -->
< A NAME = "tex2html243"
HREF="node16.html">
< IMG WIDTH = "37" HEIGHT = "24" ALIGN = "BOTTOM" BORDER = "0" ALT = "next" SRC = "next.png" > < / A >
< A NAME = "tex2html239"
HREF="node14.html">
< IMG WIDTH = "26" HEIGHT = "24" ALIGN = "BOTTOM" BORDER = "0" ALT = "up" SRC = "up.png" > < / A >
< A NAME = "tex2html235"
HREF="node14.html">
< IMG WIDTH = "63" HEIGHT = "24" ALIGN = "BOTTOM" BORDER = "0" ALT = "previous" SRC = "prev.png" > < / A >
< A NAME = "tex2html241"
HREF="node2.html">
< IMG WIDTH = "65" HEIGHT = "24" ALIGN = "BOTTOM" BORDER = "0" ALT = "contents" SRC = "contents.png" > < / A >
< BR >
< B > Next:< / B > < A NAME = "tex2html244"
HREF="node16.html">User Interface< / A >
< B > Up:< / B > < A NAME = "tex2html240"
HREF="node14.html">Getting Started< / A >
< B > Previous:< / B > < A NAME = "tex2html236"
HREF="node14.html">Getting Started< / A >
< B > < A NAME = "tex2html242"
HREF="node2.html">Contents< / A > < / B >
< BR >
< BR >
<!-- End of Navigation Panel -->
< H2 > < A NAME = "SECTION00071000000000000000" > < / A > < A NAME = "sec:examples" > < / A >
< BR >
Examples
< / H2 >
< P >
The code reported in Figure < A HREF = "#fig:ex_default" > 2< / A > shows how to set and apply the default
multi-level preconditioner available in the real double precision version
of MLD2P4 (see Table < A HREF = "#tab:precinit" > 1< / A > ). This preconditioner is chosen
by simply specifying < code > 'ML'< / code > as second argument of < code > mld_precinit< / code >
(a call to < code > mld_precset< / code > is not needed) and is applied with the BiCGSTAB
solver provided by PSBLAS. As previously observed, the modules < code > psb_base_mod< / code > ,
< code > mld_prec_mod< / code > and < code > psb_krylov_mod< / code > must be used by the example program.
< P >
The part of the code concerning the
reading and assembling of the sparse matrix and the right-hand side vector, performed
through the PSBLAS routines for sparse matrix and vector management, is not reported
here for brevity; the statements concerning the deallocation of the PSBLAS
data structure are neglected too.
The complete code can be found in the example program file < code > mld_dexample_ml.f90< / code > ,
in the directory < code > examples/fileread< / code > of the MLD2P4 tree (see
Section < A HREF = "node10.html#sec:ex_and_test" > 3.5< / A > ).
For details on the use of the PSBLAS routines, see the PSBLAS User's
Guide [< A
HREF="node25.html#PSBLASGUIDE">16< / A > ].
< P >
The setup and application of the default multi-level
preconditioners for the real single precision and the complex, single and double
precision, versions are obtained with straightforward modifications of the previous
example (see Section < A HREF = "node16.html#sec:userinterface" > 6< / A > for details). If these versions are installed,
the corresponding Fortran 95 codes are available in < code > examples/fileread/< / code > .
< P >
< DIV ALIGN = "CENTER" > < A NAME = "fig:ex_default" > < / A > < A NAME = "946" > < / A >
< TABLE >
< CAPTION ALIGN = "BOTTOM" > < STRONG > Figure 2:< / STRONG >
Setup and application of the default multi-level Schwarz preconditioner.
< / CAPTION >
< TR > < TD >
< DIV ALIGN = "CENTER" >
< / DIV > < TABLE WIDTH = "90%" >
< TR > < TD >
< PRE >
use psb_base_mod
use mld_prec_mod
use psb_krylov_mod
... ...
!
! sparse matrix
type(psb_dspmat_type) :: A
! sparse matrix descriptor
type(psb_desc_type) :: desc_A
! preconditioner
type(mld_dprec_type) :: P
! right-hand side and solution vectors
type(psb_d_vect_type) :: b, x
... ...
!
! initialize the parallel environment
call psb_init(ictxt)
call psb_info(ictxt,iam,np)
... ...
!
! read and assemble the matrix A and the right-hand side b
! using PSBLAS routines for sparse matrix / vector management
... ...
!
! initialize the default multi-level preconditioner, i.e. hybrid
! Schwarz, using RAS (with overlap 1 and ILU(0) on the blocks)
! as pre- and post-smoother and 4 block-Jacobi sweeps
! (with UMFPACK LU on the blocks) as distributed coarse-level
! solver.
call mld_precinit(P,'ML',info)
!
! build the preconditioner
call mld_precbld(A,desc_A,P,info)
!
! set the solver parameters and the initial guess
... ...
!
! solve Ax=b with preconditioned BiCGSTAB
call psb_krylov('BICGSTAB',A,P,b,x,tol,desc_A,info)
... ...
!
! deallocate the preconditioner
call mld_precfree(P,info)
!
! deallocate other data structures
... ...
!
! exit the parallel environment
call psb_exit(ictxt)
stop
< / PRE >
< / TD > < / TR >
< / TABLE >
< DIV ALIGN = "CENTER" >
< / DIV > < / TD > < / TR >
< / TABLE >
< / DIV >
< P >
Different versions of multi-level preconditioners can be obtained by changing
the default values of the preconditioner parameters. The code reported in
Figure < A HREF = "#fig:ex_3lh" > 3< / A > shows how to set a three-level hybrid Schwarz
preconditioner, which uses block Jacobi with ILU(0) on the
local blocks as post-smoother, has a coarsest matrix replicated on the processors,
and solves the coarsest-level system with the LU factorization from UMFPACK [< A
HREF="node25.html#UMFPACK">9< / A > ].
Figure < A HREF = "#fig:ex_3lhm" > 4< / A > shows how to set a three-level preconditioner similar to the one of < A HREF = "#fig:ex_3lh" > 3< / A > , but the coarsest-level systems is solved with the multifrontal factorization from MUMPS [< A
HREF="node25.html#UMFPACK">9< / A > ].
Note that MUMPS can be used on both replicated and distributed coarsest level matrices,
as a global and local solver respectively.
The number of levels is specified by using < code > mld_precinit< / code > ; the other
preconditioner parameters are set by calling < code > mld_precset< / code > . Note that
the type of multilevel framework (i.e. multiplicative among the levels
with post-smoothing only) is not specified since it is the default
set by < code > mld_precinit< / code > .
< P >
Figure < A HREF = "#fig:ex_3la" > 5< / A > shows how to
set a three-level additive Schwarz preconditioner,
which uses RAS, with overlap 1 and ILU(0) on the blocks,
as pre- and post-smoother, and applies five block-Jacobi sweeps, with
the UMFPACK LU factorization on the blocks, as distributed coarsest-level
solver. Again, < code > mld_precset< / code > is used only to set
non-default values of the parameters (see Tables < A HREF = "#tab:p_type" > 2< / A > -< A HREF = "#tab:p_coarse" > 5< / A > ).
In both cases, the construction and the application of the preconditioner
are carried out as for the default multi-level preconditioner.
The code fragments shown in in Figures < A HREF = "#fig:ex_3lh" > 3< / A > < A HREF = "#fig:ex_3lhm" > 4< / A > -< A HREF = "#fig:ex_3la" > 5< / A > are
included in the example program file < code > mld_dexample_ml.f90< / code > too.
< P >
Finally, Figure < A HREF = "#fig:ex_1l" > 6< / A > shows the setup of a one-level
additive Schwarz preconditioner, i.e. RAS with overlap 2. The corresponding
example program is available in < code > mld_dexample_< / code > < code > 1lev.f90< / code > .
< P >
For all the previous preconditioners, example programs where the sparse matrix and
the right-hand side are generated by discretizing a PDE with Dirichlet
boundary conditions are also available in the directory < code > examples/pdegen< / code > .
< P >
< DIV ALIGN = "CENTER" > < A NAME = "fig:ex_3lh" > < / A > < A NAME = "948" > < / A >
< TABLE >
< CAPTION ALIGN = "BOTTOM" > < STRONG > Figure 3:< / STRONG >
Setup of a hybrid three-level Schwarz preconditioner.< / CAPTION >
< TR > < TD >
< DIV ALIGN = "CENTER" >
< / DIV > < TABLE WIDTH = "90%" >
< TR > < TD >
< PRE >
... ...
! set a three-level hybrid Schwarz preconditioner, which uses
! block Jacobi (with ILU(0) on the blocks) as post-smoother,
! a coarsest matrix replicated on the processors, and the
! LU factorization from UMFPACK as coarse-level solver
call mld_precinit(P,'ML',info,nlev=3)
call_mld_precset(P,'SMOOTHER_TYPE','BJAC',info)
call_mld_precset(P,'SMOOTHER_POS,'POST'w,info)
call mld_precset(P,'COARSE_MAT','REPL',info)
call mld_precset(P,'COARSE_SOLVE','UMF',info)
... ...
< / PRE >
< / TD > < / TR >
< / TABLE >
< DIV ALIGN = "CENTER" >
< / DIV >
< P >
< DIV ALIGN = "CENTER" >
< / DIV > < / TD > < / TR >
< / TABLE >
< / DIV >
< P >
< DIV ALIGN = "CENTER" > < A NAME = "fig:ex_3lhm" > < / A > < A NAME = "950" > < / A >
< TABLE >
< CAPTION ALIGN = "BOTTOM" > < STRONG > Figure 4:< / STRONG >
Setup of a hybrid three-level Schwarz preconditioner.< / CAPTION >
< TR > < TD >
< DIV ALIGN = "CENTER" >
< / DIV > < TABLE WIDTH = "90%" >
< TR > < TD >
< PRE >
... ...
! set a three-level hybrid Schwarz preconditioner, which uses
! block Jacobi (with ILU(0) on the blocks) as post-smoother,
! a coarsest matrix replicated on the processors, and the
! multifrontal solver in MUMPS as coarse-level solver
call mld_precinit(P,'ML',info,nlev=3)
call mld_precset(P,mld_smoother_type_,'BJAC',info)
call mld_precset(P,mld_coarse_mat_,'REPL',info)
call mld_precset(P,mld_coarse_solve_,'MUMPS',info)
... ...
< / PRE >
< / TD > < / TR >
< / TABLE >
< DIV ALIGN = "CENTER" >
< / DIV >
< P >
< DIV ALIGN = "CENTER" >
< / DIV > < / TD > < / TR >
< / TABLE >
< / DIV >
< P >
< DIV ALIGN = "CENTER" > < A NAME = "fig:ex_3la" > < / A > < A NAME = "952" > < / A >
< TABLE >
< CAPTION ALIGN = "BOTTOM" > < STRONG > Figure 5:< / STRONG >
Setup of an additive three-level Schwarz preconditioner.< / CAPTION >
< TR > < TD >
< DIV ALIGN = "CENTER" >
< / DIV > < TABLE WIDTH = "90%" >
< TR > < TD >
< PRE >
... ...
! set a three-level additive Schwarz preconditioner, which uses
! RAS (with overlap 1 and ILU(0) on the blocks) as pre- and
! post-smoother, and 5 block-Jacobi sweeps (with UMFPACK LU
! on the blocks) as distributed coarsest-level solver
call mld_precinit(P,'ML',info,nlev=3)
call mld_precset(P,'ML_TYPE','ADD',info)
call_mld_precset(P,'SMOOTHER_POS','TWOSIDE',info)
call mld_precset(P,'COARSE_SWEEPS',5,info)
... ...
< / PRE >
< / TD > < / TR >
< / TABLE >
< DIV ALIGN = "CENTER" >
< / DIV >
< P >
< DIV ALIGN = "CENTER" >
< / DIV > < / TD > < / TR >
< / TABLE >
< / DIV >
< P >
< DIV ALIGN = "CENTER" > < A NAME = "fig:ex_1l" > < / A > < A NAME = "954" > < / A >
< TABLE >
< CAPTION ALIGN = "BOTTOM" > < STRONG > Figure 6:< / STRONG >
Setup of a one-level Schwarz preconditioner.< / CAPTION >
< TR > < TD >
< DIV ALIGN = "CENTER" >
< / DIV > < TABLE WIDTH = "90%" >
< TR > < TD >
< PRE >
... ...
! set RAS with overlap 2 and ILU(0) on the local blocks
call mld_precinit(P,'AS',info)
call mld_precset(P,'SUB_OVR',2,info)
... ...
< / PRE >
< / TD > < / TR >
< / TABLE >
< DIV ALIGN = "CENTER" >
< / DIV > < / TD > < / TR >
< / TABLE >
< / DIV >
< P >
< HR >
<!-- Navigation Panel -->
< A NAME = "tex2html243"
HREF="node16.html">
< IMG WIDTH = "37" HEIGHT = "24" ALIGN = "BOTTOM" BORDER = "0" ALT = "next" SRC = "next.png" > < / A >
< A NAME = "tex2html239"
HREF="node14.html">
< IMG WIDTH = "26" HEIGHT = "24" ALIGN = "BOTTOM" BORDER = "0" ALT = "up" SRC = "up.png" > < / A >
< A NAME = "tex2html235"
HREF="node14.html">
< IMG WIDTH = "63" HEIGHT = "24" ALIGN = "BOTTOM" BORDER = "0" ALT = "previous" SRC = "prev.png" > < / A >
< A NAME = "tex2html241"
HREF="node2.html">
< IMG WIDTH = "65" HEIGHT = "24" ALIGN = "BOTTOM" BORDER = "0" ALT = "contents" SRC = "contents.png" > < / A >
< BR >
< B > Next:< / B > < A NAME = "tex2html244"
HREF="node16.html">User Interface< / A >
< B > Up:< / B > < A NAME = "tex2html240"
HREF="node14.html">Getting Started< / A >
< B > Previous:< / B > < A NAME = "tex2html236"
HREF="node14.html">Getting Started< / A >
< B > < A NAME = "tex2html242"
HREF="node2.html">Contents< / A > < / B >
<!-- End of Navigation Panel -->
< / BODY >
< / HTML >