\section{Data Structures and Classes} \label{sec:datastruct} %\ifthenelse{\boolean{mtc}}{\minitoc}{} In this chapter we illustrate the data structures used for definition of routines interfaces. They include data structures for sparse matrices, communication descriptors and preconditioners.%% These data structures %% are used for calling PSBLAS routines in Fortran~90 language and will %% be used to next chapters containing these callings. All the data types and the basic subroutine interfaces related to descriptors and sparse matrices are defined in the module \verb|psb_base_mod|; this will have to be included by every user subroutine that makes use of the library. The preconditioners are defined in the module \verb|psb_prec_mod| Real and complex data types are parametrized with a kind type defined in the library as follows: \begin{description} \item[psb\_spk\_] Kind parameter for short precision real and complex data; corresponds to a \verb|REAL| declaration and is normally 4 bytes. \item[psb\_dpk\_] Kind parameter for long precision real and complex data; corresponds to a \verb|DOUBLE PRECISION| declaration and is normally 8 bytes. \item[psb\_long\_int\_k\_] Kind parameter for long integers, used by the \verb|psb_sizeof| utility. \end{description} Together with the classes attributes we also discuss their methods. Most methods detailed here only act on the local variable, i.e. their action is purely local and asynchronous unless otherwise stated. The list of methods here is not completely exhaustive; many methods, especially those that alter the contents of the various objects, are usually not needed by the end-user, and therefore are described in the developer's documentation. \subsection{Descriptor data structure} \label{sec:desc} All the general matrix informations and elements to be exchanged among processes are stored within a data structure of the type \hypertarget{descdata}{{\tt psb\_desc\_type}}. Every structure of this type is associated with a discretization pattern and enables data communications and other operations that are necessary for implementing the various algorithms of interest to us. The data structure itself \verb|psb_desc_type| can be treated as an opaque object handled via the tools routines of Sec.~\ref{sec:toolsrout} and~\ref{sec:dataquery}; nevertheless we include here a description for the curious reader. First we describe the \verb|psb_indx_map| type. This is a data structure that keeps track of a certain number of basic issues such as: \begin{itemize} \item The value of the communication/MPI context; \item The number of indices in the index space, i.e. global number of rows and columns of a sparse matrix; \item The local set of indices, including: \begin{itemize} \item The number of local indices (and local rows); \item The number of halo indices (and therefore local columns); \item The global indices corresponding to the local ones. \end{itemize} \end{itemize} There are many different schemes for storing these data; therefore there are a number of types extending the base one, and the descriptor structure holds a polymorphic object whose dynamic type can be any of the extended types. The methods associated with this data type answer the following queries: \begin{itemize} \item For a given set of local indices, find the corresponding indices in the global numbering; \item For a given set of global indices, find the corresponding indices in the local numbering, if any, or return an invalid \item Add a global index to the set of halo indices; \item Find the process owner of each member of a set of global indices. \end{itemize} All methods but the last are purely local; the last method potentially requires communication among processes, and thus is a synchronous method. The choice of a specific dynamic type for the index map is made at the time the descriptor is initially allocated, according to the mode of initialization (see also~\ref{sec:toolsrout}). The descriptor contents are as follows: \begin{description} \item[{\bf indxmap}] A polymorphic variable of a type that is any extension of the indx\_map type described above. \\ \item[{\bf halo\_index}] A list of the halo and boundary elements for the current process to be exchanged with other processes; for each processes with which it is necessary to communicate: \begin{enumerate} \item Process identifier; \item Number of points to be received; \item Indices of points to be received; \item Number of points to be sent; \item Indices of points to be sent; \end{enumerate} The list may contain an arbitrary number of groups; its end is marked by a -1.\\ Specified as: an allocatable integer array of rank one. \item[{\bf ext\_index}] A list of element indices to be exchanged to implement the mapping between a base descriptor and a descriptor with overlap. \item [{\bf ovrlap\_index}] A list of the overlap elements for the current process, organized in groups like the previous vector: \begin{enumerate} \item Process identifier; \item Number of points to be received; \item Indices of points to be received; \item Number of points to be sent; \item Indices of points to be sent; \end{enumerate} The list may contain an arbitrary number of groups; its end is marked by a -1.\\ Specified as: an allocatable integer array of rank one. \item [{\bf ovr\_mst\_idx}] A list to retrieve the value of each overlap element from the respective master process.\\ Specified as: an allocatable integer array of rank one. \item [{\bf ovrlap\_elem}] For all overlap points belonging to th ecurrent process: \begin{enumerate} \item Overlap point index; \item Number of processes sharing that overlap points; \item Index of a ``master'' process: \end{enumerate} Specified as: an allocatable integer array of rank two. \item [{\bf bnd\_elem}] A list of all boundary points, i.e. points that have a connection with other processes. \end{description} The Fortran~2003 declaration for \verb|psb_desc_type| structures is as follows: \begin{figure}[h!] \begin{Sbox} \begin{minipage}[tl]{0.9\textwidth} \begin{verbatim} type psb_desc_type class(psb_indx_map), allocatable :: indxmap integer, allocatable :: halo_index(:) integer, allocatable :: ext_index(:) integer, allocatable :: ovrlap_index(:) integer, allocatable :: ovrlap_elem(:,:) integer, allocatable :: ovr_mst_idx(:) integer, allocatable :: bnd_elem(:) end type psb_desc_type \end{verbatim} \end{minipage} \end{Sbox} \setlength{\fboxsep}{8pt} \begin{center} \fbox{\TheSbox} \end{center} \caption{\label{fig:desctype}The PSBLAS defined data type that contains the communication descriptor.} \end{figure} A communication descriptor associated with a sparse matrix has a state, which can take the following values: \begin{description} \item[Build:] State entered after the first allocation, and before the first assembly; in this state it is possible to add communication requirements among different processes. \item[Assembled:] State entered after the assembly; computations using the associated sparse matrix, such as matrix-vector products, are only possible in this state. \end{description} \subsubsection{Methods} \subsubsection*{get\_local\_rows --- Get number of local rows} \addcontentsline{toc}{subsubsection}{get\_local\_rows } \begin{verbatim} nr = desc%get_local_rows() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[desc] the communication descriptor.\\ Scope: {\bf local}.\\ % Type: {\bf required}.\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \descdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The number of local rows, i.e. the number of rows owned by the current process; as explained in~\ref{sec:intro}, it is equal to $|{\cal I}_i| + |{\cal B}_i|$. The returned value is specific to the calling process. \end{description} \subsubsection*{get\_local\_cols --- Get number of local cols} \addcontentsline{toc}{subsubsection}{get\_local\_cols } \begin{verbatim} nc = desc%get_local_cols() \end{verbatim} \begin{description} \item[\bf On Entry] \item[Type:] Asynchronous. \item[desc] the communication descriptor.\\ Scope: {\bf local}.\\ % Type: {\bf required}.\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \descdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The number of local cols, i.e. the number of indices used by the current process, including both local and halo indices; as explained in~\ref{sec:intro}, it is equal to $|{\cal I}_i| + |{\cal B}_i| +|{\cal H}_i|$. The returned value is specific to the calling process. \end{description} \subsubsection*{get\_global\_rows --- Get number of global rows} \addcontentsline{toc}{subsubsection}{get\_global\_rows } \begin{verbatim} nr = desc%get_global_rows() \end{verbatim} \begin{description} \item[\bf On Entry] \item[Type:] Asynchronous. \item[desc] the communication descriptor.\\ Scope: {\bf local}.\\ % Type: {\bf required}.\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \descdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The number of global rows, i.e. the size of the global index space. \end{description} \subsubsection*{get\_global\_cols --- Get number of global cols} \addcontentsline{toc}{subsubsection}{get\_global\_cols } \begin{verbatim} nr = desc%get_global_cols() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[desc] the communication descriptor.\\ Scope: {\bf local}.\\ % Type: {\bf required}.\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \descdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The number of global cols; usually this is equal to the number of global rows. \end{description} \subsubroutine{get\_context}{Get communication context} \begin{verbatim} ictxt = desc%get_context() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[desc] the communication descriptor.\\ Scope: {\bf local}.\\ % Type: {\bf required}.\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \descdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The communication context. \end{description} \subsubsection*{psb\_cd\_get\_large\_threshold --- Get threshold for index mapping switch} \addcontentsline{toc}{subsubsection}{psb\_cd\_get\_large\_threshold} \begin{verbatim} ith = psb_cd_get_large_threshold() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Return] \item[Function value] The current value for the size threshold. \end{description} \subsubsection*{psb\_cd\_set\_large\_threshold --- Set threshold for index mapping switch} \addcontentsline{toc}{subsubsection}{psb\_cd\_set\_large\_threshold} \begin{verbatim} call psb_cd_set_large_threshold(ith) \end{verbatim} \begin{description} \item[Type:] Synchronous. \item[\bf On Entry] \item[ith] the new threshold for communication descriptors.\\ Scope: {\bf global}.\\ Type: {\bf required}.\\ Intent: {\bf in}.\\ Specified as: an integer value greater than zero. \end{description} Note: the threshold value is only queried by the library at the time a call to \verb|psb_cdall| is executed, therefore changing the threshold has no effect on communication descriptors that have already been initialized. Moreover the threshold must have the same value on all processes. \subsubsection{Named Constants} \label{sec:cd_constants} \begin{description} \item[psb\_none\_] Generic no-op; \item[psb\_nohalo\_] Do not fetch halo elements; \item[psb\_halo\_] Fetch halo elements from neighbouring processes; \item[psb\_sum\_] Sum overlapped elements \item[psb\_avg\_] Average overlapped elements \item[psb\_comm\_halo\_] Exchange data based on the \verb|halo_index| list; \item[psb\_comm\_ext\_] Exchange data based on the \verb|ext_index| list; \item[psb\_comm\_ovr\_] Exchange data based on the \verb|ovrlap_index| list; \item[psb\_comm\_mov\_] Exchange data based on the \verb|ovr_mst_idx| list; %% \item[psb\_square\_root\_] Update with the square root of the average %% of overlapped elements; %% \item[psb\_dec\_type\_] Entry holding decomposition type (in \verb|desc_a%matrix_data|) %% \item[psb\_m\_] Entry holding total number of rows %% \item[psb\_n\_] Entry holding total number of columns %% \item[ psb\_n\_row\_] Entry holding the number of rows stored in the %% current process %% \item[psb\_n\_col\_] Entry holding the number of columns stored in the %% current process %% \item[psb\_ctxt\_] Entry holding a copy of the BLACS communication context %% \item[psb\_desc\_asb\_] State of the descriptor: assembled, %% i.e. suitable for computational tasks. %% \item[psb\_desc\_bld\_] State of the descriptor: build, must be %% assembled before computational use. \end{description} \subsection{Sparse Matrix class} \label{sec:spmat} The \hypertarget{spdata}{{\tt psb\_spmat\_type}} class contains all information about the local portion of the sparse matrix and its storage mode. Its design is based on the STATE design pattern~\cite{DesignPatterns} as detailed in~\cite{Sparse03}; the type declaration is shown in figure~\ref{fig:spmattype} where \verb|T| is a placeholder for the data type and precision variants \begin{description} \item[S] Single precision real; \item[D] Double precision real; \item[C] Single precision complex; \item[Z] Double precision complex. \end{description} The actual data is contained in the polymorphic component \verb|a%a|; its specific layout can be chosen dynamically among the predefined types, or an entirely new storage layout can be implemented and passed to the library at runtime via the \verb|psb_spasb| routine. \begin{figure}[h!] \begin{Sbox} \begin{minipage}[tl]{0.85\textwidth} \begin{verbatim} type :: psb_Tspmat_type class(psb_T_base_sparse_mat), allocatable :: a end type psb_Tspmat_type \end{verbatim} \end{minipage} \end{Sbox} \setlength{\fboxsep}{8pt} \begin{center} \fbox{\TheSbox} \end{center} \caption{\label{fig:spmattype} The PSBLAS defined data type that contains a sparse matrix.} \end{figure} The following very common formats are precompiled in PSBLAS and thus are always available: \begin{description} \item[psb\_T\_coo\_sparse\_mat] Coordinate storage; \item[psb\_T\_csr\_sparse\_mat] Compressed storage by rows; \item[psb\_T\_csc\_sparse\_mat] Compressed storage by columns; \end{description} The inner sparse matrix has an associated state, which can take the following values: \begin{description} \item[Build:] State entered after the first allocation, and before the first assembly; in this state it is possible to add nonzero entries. \item[Assembled:] State entered after the assembly; computations using the sparse matrix, such as matrix-vector products, are only possible in this state; \item[Update:] State entered after a reinitalization; this is used to handle applications in which the same sparsity pattern is used multiple times with different coefficients. In this state it is only possible to enter coefficients for already existing nonzero entries. \end{description} The only storage variant supporting the build state is COO; all other variants are obtained by conversion to/from it. \subsubsection{Methods} \subsubsection*{get\_nrows --- Get number of rows in a sparse matrix} \addcontentsline{toc}{subsubsection}{get\_nrows} \begin{verbatim} nr = a%get_nrows() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[a] the sparse matrix\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The number of rows of sparse matrix \verb|a|. \end{description} \subsubsection*{get\_ncols --- Get number of columns in a sparse matrix} \addcontentsline{toc}{subsubsection}{get\_ncols} \begin{verbatim} nc = a%get_ncols() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[a] the sparse matrix\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The number of columns of sparse matrix \verb|a|. \end{description} \subsubsection*{get\_nnzeros --- Get number of nonzero elements in a sparse matrix} \addcontentsline{toc}{subsubsection}{get\_nnzeros} \begin{verbatim} nz = a%get_nnzeros() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[a] the sparse matrix\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The number of nonzero elements stored in sparse matrix \verb|a|. \end{description} {\par\noindent\bfseries Notes} \begin{enumerate} \item The function value is specific to the storage format of matrix \verb|a|; some storage formats employ padding, thus the returned value for the same matrix may be different for different storage choices. \end{enumerate} \subsubsection*{get\_size --- Get maximum number of nonzero elements in a sparse matrix} \addcontentsline{toc}{subsubsection}{get\_size} \begin{verbatim} maxnz = a%get_size() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[a] the sparse matrix\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The maximum number of nonzero elements that can be stored in sparse matrix \verb|a| using its current memory allocation. \end{description} \subsubsection*{sizeof --- Get memory occupation in bytes of a sparse matrix} \addcontentsline{toc}{subsubsection}{sizeof} \begin{verbatim} memory_size = a%sizeof() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[a] the sparse matrix\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The memory occupation in bytes. \end{description} \subsubsection*{get\_fmt --- Short description of the dynamic type} \addcontentsline{toc}{subsubsection}{get\_fmt} \begin{verbatim} write(*,*) a%get_fmt() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[a] the sparse matrix\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] A short string describing the dynamic type of the matrix. Predefined values include \verb|NULL|, \verb|COO|, \verb|CSR| and \verb|CSC|. \end{description} \subsubsection*{is\_bld, is\_upd, is\_asb --- Status check} \addcontentsline{toc}{subsubsection}{is\_bld, is\_upd, is\_asb} \begin{verbatim} if (a%is_bld()) then if (a%is_upd()) then if (a%is_asb()) then \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[a] the sparse matrix\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] A \verb|logical| value indicating whether the matrix is in the Build, Update or Assembled state, respectively. \end{description} \subsubsection{Named Constants} \label{sec:sp_constants} \begin{description} %% \item[psb\_nztotreq\_] Request to fetch the total number of nonzeroes %% stored in a sparse matrix %% \item[psb\_nzrowreq\_] Request to fetch the number of nonzeroes in a %% given row in a sparse matrix \item[psb\_dupl\_ovwrt\_] Duplicate coefficients should be overwritten (i.e. ignore duplications) \item[psb\_dupl\_add\_] Duplicate coefficients should be added; \item[psb\_dupl\_err\_] Duplicate coefficients should trigger an error conditino \item[psb\_upd\_dflt\_] Default update strategy for matrix coefficients; \item[psb\_upd\_srch\_] Update strategy based on search into the data structure; \item[psb\_upd\_perm\_] Update strategy based on additional permutation data (see tools routine description). \end{description} \subsection{Dense Vector Data Structure} \label{sec:spmat} The \hypertarget{vdata}{{\tt psb\_vect\_type}} data structure encapsulates the dense vectors in a way similar to sparse matrices. The user will not, in general, access the vector components directly, but rather via the routines of sec.~\ref{sec:toolsrout}. Among other simple things, we define here an extraction method that can be used to get a full copy of the part of the vector stored on the local process. The type declaration is shown in figure~\ref{fig:vectype} where \verb|T| is a placeholder for the data type and precision variants \begin{description} \item[I] Integer; \item[S] Single precision real; \item[D] Double precision real; \item[C] Single precision complex; \item[Z] Double precision complex. \end{description} The actual data is contained in the polymorphic component \verb|a%a|; its specific layout can be chosen dynamically among the predefined types, or an entirely new storage layout can be implemented and passed to the library at runtime via the \verb|psb_spasb| routine. \begin{figure}[h!] \begin{Sbox} \begin{minipage}[tl]{0.85\textwidth} \begin{verbatim} type psb_T_base_vect_type TYPE(KIND_), allocatable :: v(:) end type psb_T_base_vect_type type psb_T_vect_type class(psb_T_base_vect_type), allocatable :: v end type psb_T_vect_type \end{verbatim} \end{minipage} \end{Sbox} \setlength{\fboxsep}{8pt} \begin{center} \fbox{\TheSbox} \end{center} \caption{\label{fig:vectype} The PSBLAS defined data type that contains a dense vector..} \end{figure} \subsubsection{Methods} \subsubsection*{get\_nrows --- Get number of rows in a dense vector} \addcontentsline{toc}{subsubsection}{v\_get\_nrows} \begin{verbatim} nr = v%get_nrows() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[v] the dense vector\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The number of rows of sparse matrix \verb|a|. \end{description} \subsubsection*{get\_ncols --- Get number of columns in a sparse matrix} \subsubsection*{sizeof --- Get memory occupation in bytes of a dense vector matrix} \addcontentsline{toc}{subsubsection}{v\_sizeof} \begin{verbatim} memory_size = v%sizeof() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[v] the dense vector\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] The memory occupation in bytes. \end{description} \subsubsection*{get\_vect --- Get a copy of the vector contents} \addcontentsline{toc}{subsubsection}{v\_get\_vect} \begin{verbatim} extv = v%get_vect() \end{verbatim} \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] \item[v] the dense vector\\ Scope: {\bf local}\\ % Type: {\bf required}\\ % Intent: {\bf in}.\\ % Specified as: a structured data of type \spdata. \end{description} \begin{description} \item[\bf On Return] \item[Function value] An allocatable array holding a copy of the dense vector contents. \end{description} \subsection{Preconditioner data structure} \label{sec:prec} Our base library offers support for simple well known preconditioners like Diagonal Scaling or Block Jacobi with incomplete factorization ILU(0). A preconditioner is held in the \hypertarget{precdata}{{\tt psb\_prec\_type}} data structure reported in figure~\ref{fig:prectype}. The \verb|psb_prec_type| data type may contain a simple preconditioning matrix with the associated communication descriptor.%% which may be different than the %% system communication descriptor in the case of parallel %% preconditioners like the Additive Schwarz one. Then the %% \verb|psb_prec_type| may contain more than one preconditioning matrix %% like in the case of Two-Level (in general Multi-Level) preconditioners. %% The user can choose the type of preconditioner to be used by means of %% the \verb|psb_precset| subroutine; once the type of preconditioning %% method is specified, along with all the parameters that characterize %% it, the preconditioner data structure can be built using the %% \verb|psb_precbld| subroutine. %% This data structure wants to be flexible enough to easily allow the %% implementation of new kind of preconditioners. The values contained in the \verb|iprcparm| and \verb|rprcparm| define tha type of preconditioner along with all the parameters related to it; thus, \verb|iprcparm| and \verb|rprcparm| define how the other records have to be interpreted. This data structure is the basis of more complex preconditioning strategies, which are the subject of further research. \begin{figure}[h!] \small \begin{Sbox} \begin{minipage}[tl]{0.9\textwidth} \begin{verbatim} type psb_sprec_type type(psb_sspmat_type), allocatable :: av(:) real(psb_spk_), allocatable :: d(:) type(psb_desc_type) :: desc_data integer, allocatable :: iprcparm(:) real(psb_spk_), allocatable :: rprcparm(:) integer, allocatable :: perm(:), invperm(:) integer :: prec, base_prec end type psb_sprec_type type psb_dprec_type type(psb_dspmat_type), allocatable :: av(:) real(psb_dpk_), allocatable :: d(:) type(psb_desc_type) :: desc_data integer, allocatable :: iprcparm(:) real(psb_dpk_), allocatable :: rprcparm(:) integer, allocatable :: perm(:), invperm(:) integer :: prec, base_prec end type psb_dprec_type type psb_cprec_type type(psb_cspmat_type), allocatable :: av(:) complex(psb_spk_), allocatable :: d(:) type(psb_desc_type) :: desc_data integer, allocatable :: iprcparm(:) real(psb_spk_), allocatable :: rprcparm(:) integer, allocatable :: perm(:), invperm(:) integer :: prec, base_prec end type psb_cprec_type type psb_zprec_type type(psb_zspmat_type), allocatable :: av(:) complex(psb_dpk_), allocatable :: d(:) type(psb_desc_type) :: desc_data integer, allocatable :: iprcparm(:) real(psb_dpk_), allocatable :: rprcparm(:) integer, allocatable :: perm(:), invperm(:) integer :: prec, base_prec end type psb_zprec_type \end{verbatim} \end{minipage} \end{Sbox} \setlength{\fboxsep}{8pt} \begin{center} \fbox{\TheSbox} \end{center} \caption{\label{fig:prectype}The PSBLAS defined data type that contains a preconditioner.} \end{figure} %% \subsection{Named Constants} %% \label{sec:prec_constants} %% \begin{description} %% \item[f\_ilu\_n\_] Incomplete LU factorization with $n$ levels of %% fill-in; currently only $n=0$ is implemented; %% \item[f\_slu\_] Sparse factorization using SuperLU; %% \item[f\_umf\_] Sparse factorization using UMFPACK; %% \item[add\_ml\_prec\_] Additive multilevel correction; %% \item[mult\_ml\_prec\_] Multiplicative multilevel correction; %% \item[pre\_smooth\_] Pre-smoothing in applying multiplicative %% multilevel corrections; %% \item[post\_smooth\_] Post-smoothing in applying multiplicative %% multilevel corrections; %% \item[smooth\_both\_] Two-sided (i.e. symmetric) smoothing in applying multiplicative %% multilevel corrections; %% \item[mat\_distr\_] Coarse matrix distributed among processes %% \item[mat\_repl\_] Coarse matrix replicated among processes %% \end{description} \subsection{Data structure Methods} \label{sec:dataquery} %%% Local Variables: %%% mode: latex %%% TeX-master: "userguide" %%% End: