\section{Preconditioner routines} \label{sec:precs} % \section{Preconditioners} \label{sec:psprecs} Preconditioning is somehow regarded as ``black magic''. This is due to the fact that theory doesn't provide a reliable support in the choice of a preconditioner. It is clear that the influence of a preconditioning technique on the convergence behavior of an iterative method mostly depends on the characteristics of the system matrix and of the method itself. Anyway it is not possible a priori to say that one preconditioner is algebrically better than another and this perfectly explains the importance of providing a wide range of preconditioners techniques so that the user can find by itself which one is more suitable for his problem. Moreover, there are some other issues to consider when choosing a preconditioner such as balancing the overhead of building the preconditioner with the reduction in the number of iterations. PSBLAS contains the implementation of many preconditioning techniques some of which are very flexible thanks to the presence of many parameters that is possible to adjust to fit the user's needs: \begin{itemize} \item Diagonal Scaling \item Block Jacobi with ILU(0) factorization \item Additive Schwarz with the Restricted Additive Schwarz and Additive Schwarz with Harmonic extensions (see chapter~\ref{sec:pprec}) \item Two-Level Additive Schwarz; this is actually a family of preconditioners since there is the possibility to choose between many variants as explained in chapter~\ref{sec:mlprec} \end{itemize} \subroutine{psb\_precset}{Sets the precodntioner type} \syntax{call psb\_precset}{prec, ptype, iv, rs, rv, ierr} \begin{description} \item[\bf On Entry] \item[prec] Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: e pronditioner data structure \precdata. \item[ptype] the type of preconditioner. Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: a string. \item[iv] integer parameters for the precondtioner. Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: an integer array. \item[rs] Scope: {\bf } \\ Type: {\bf }\\ Specified as: . \item[rv] Scope: {\bf } \\ Type: {\bf }\\ Specified as: . \item[ierr] Scope: {\bf } \\ Type: {\bf }\\ Specified as: . \end{description} \subroutine{psb\_precbld}{Builds a preconditioner} \syntax{call psb\_precbld}{a, desc\_a, prec, info, upd} \begin{description} \item[\bf On Entry] \item[a] the system sparse matrix. Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: a sparse matrix data structure \spdata. \item[desc\_a] the problem communication descriptor. Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: a communication descriptor data structure \descdata. \item[upd] Scope: {\bf global} \\ Type: {\bf optional}\\ Specified as: a character. \end{description} \begin{description} \item[\bf On Return] \item[prec] the precodntioner.\\ Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: a precondtioner data structure \precdata\\ \item[info] the return error code.\\ Scope: {\bf local} \\ Type: {\bf required}\\ Specified as: an integer.\\ \end{description} \subroutine{psb\_precaply}{Preconditioner application routine} \syntax{call psb\_precaply}{prec,x,y,desc\_a,info,trans,work} \syntax{call psb\_precaply}{prec,x,desc\_a,info,trans} \begin{description} \item[\bf On Entry] \item[prec] the preconditioner. Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: a preconditioner data structure \precdata. \item[x] the source vector. Scope: {\bf global} \\ Type: {\bf require}\\ Specified as: a double precision array. \item[desc\_a] the problem communication descriptor. Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: a communication data structure \descdata. \item[trans] Scope: {\bf } \\ Type: {\bf optional}\\ Specified as: a character. \item[work] an optional work space Scope: {\bf local} \\ Type: {\bf optional}\\ Specified as: a double precision array. \end{description} \begin{description} \item[\bf On Return] \item[y] the destination vector. Scope: {\bf global} \\ Type: {\bf required}\\ Specified as: a double precision array. \item[info] the return error code.\\ Scope: {\bf local} \\ Type: {\bf required}\\ Specified as: an integer.\\ \end{description} %%% Local Variables: %%% mode: latex %%% TeX-master: "userguide" %%% End: