base/modules/Makefile
 base/modules/psb_gen_block_map_mod.f90
 base/modules/psb_hash_map_mod.f90
 docs/html/footnode.html
 docs/html/img1.png
 docs/html/img10.png
 docs/html/img100.png
 docs/html/img101.png
 docs/html/img102.png
 docs/html/img103.png
 docs/html/img104.png
 docs/html/img105.png
 docs/html/img106.png
 docs/html/img107.png
 docs/html/img108.png
 docs/html/img109.png
 docs/html/img11.png
 docs/html/img110.png
 docs/html/img111.png
 docs/html/img112.png
 docs/html/img113.png
 docs/html/img114.png
 docs/html/img115.png
 docs/html/img116.png
 docs/html/img117.png
 docs/html/img118.png
 docs/html/img119.png
 docs/html/img12.png
 docs/html/img120.png
 docs/html/img121.png
 docs/html/img122.png
 docs/html/img123.png
 docs/html/img124.png
 docs/html/img125.png
 docs/html/img126.png
 docs/html/img127.png
 docs/html/img128.png
 docs/html/img129.png
 docs/html/img13.png
 docs/html/img130.png
 docs/html/img131.png
 docs/html/img132.png
 docs/html/img133.png
 docs/html/img134.png
 docs/html/img135.png
 docs/html/img136.png
 docs/html/img137.png
 docs/html/img138.png
 docs/html/img139.png
 docs/html/img14.png
 docs/html/img140.png
 docs/html/img141.png
 docs/html/img142.png
 docs/html/img143.png
 docs/html/img144.png
 docs/html/img145.png
 docs/html/img146.png
 docs/html/img147.png
 docs/html/img148.png
 docs/html/img15.png
 docs/html/img16.png
 docs/html/img17.png
 docs/html/img18.png
 docs/html/img2.png
 docs/html/img20.png
 docs/html/img22.png
 docs/html/img23.png
 docs/html/img24.png
 docs/html/img25.png
 docs/html/img26.png
 docs/html/img27.png
 docs/html/img28.png
 docs/html/img29.png
 docs/html/img3.png
 docs/html/img30.png
 docs/html/img31.png
 docs/html/img32.png
 docs/html/img33.png
 docs/html/img34.png
 docs/html/img35.png
 docs/html/img36.png
 docs/html/img37.png
 docs/html/img38.png
 docs/html/img39.png
 docs/html/img4.png
 docs/html/img40.png
 docs/html/img41.png
 docs/html/img42.png
 docs/html/img43.png
 docs/html/img44.png
 docs/html/img45.png
 docs/html/img46.png
 docs/html/img47.png
 docs/html/img48.png
 docs/html/img49.png
 docs/html/img5.png
 docs/html/img50.png
 docs/html/img51.png
 docs/html/img52.png
 docs/html/img53.png
 docs/html/img54.png
 docs/html/img55.png
 docs/html/img56.png
 docs/html/img57.png
 docs/html/img58.png
 docs/html/img59.png
 docs/html/img6.png
 docs/html/img60.png
 docs/html/img61.png
 docs/html/img62.png
 docs/html/img63.png
 docs/html/img64.png
 docs/html/img65.png
 docs/html/img66.png
 docs/html/img67.png
 docs/html/img68.png
 docs/html/img69.png
 docs/html/img7.png
 docs/html/img70.png
 docs/html/img71.png
 docs/html/img72.png
 docs/html/img73.png
 docs/html/img74.png
 docs/html/img75.png
 docs/html/img76.png
 docs/html/img77.png
 docs/html/img78.png
 docs/html/img79.png
 docs/html/img8.png
 docs/html/img80.png
 docs/html/img81.png
 docs/html/img82.png
 docs/html/img83.png
 docs/html/img84.png
 docs/html/img85.png
 docs/html/img86.png
 docs/html/img87.png
 docs/html/img88.png
 docs/html/img89.png
 docs/html/img9.png
 docs/html/img90.png
 docs/html/img91.png
 docs/html/img92.png
 docs/html/img93.png
 docs/html/img94.png
 docs/html/img95.png
 docs/html/img96.png
 docs/html/img97.png
 docs/html/img98.png
 docs/html/img99.png
 docs/html/index.html
 docs/html/node1.html
 docs/html/node10.html
 docs/html/node100.html
 docs/html/node101.html
 docs/html/node102.html
 docs/html/node103.html
 docs/html/node104.html
 docs/html/node105.html
 docs/html/node106.html
 docs/html/node107.html
 docs/html/node108.html
 docs/html/node109.html
 docs/html/node11.html
 docs/html/node110.html
 docs/html/node111.html
 docs/html/node112.html
 docs/html/node113.html
 docs/html/node114.html
 docs/html/node115.html
 docs/html/node116.html
 docs/html/node117.html
 docs/html/node118.html
 docs/html/node119.html
 docs/html/node12.html
 docs/html/node13.html
 docs/html/node14.html
 docs/html/node15.html
 docs/html/node16.html
 docs/html/node17.html
 docs/html/node18.html
 docs/html/node19.html
 docs/html/node2.html
 docs/html/node20.html
 docs/html/node21.html
 docs/html/node22.html
 docs/html/node23.html
 docs/html/node24.html
 docs/html/node25.html
 docs/html/node26.html
 docs/html/node27.html
 docs/html/node28.html
 docs/html/node29.html
 docs/html/node3.html
 docs/html/node30.html
 docs/html/node31.html
 docs/html/node32.html
 docs/html/node33.html
 docs/html/node34.html
 docs/html/node35.html
 docs/html/node36.html
 docs/html/node37.html
 docs/html/node38.html
 docs/html/node39.html
 docs/html/node4.html
 docs/html/node40.html
 docs/html/node41.html
 docs/html/node42.html
 docs/html/node43.html
 docs/html/node44.html
 docs/html/node45.html
 docs/html/node46.html
 docs/html/node47.html
 docs/html/node48.html
 docs/html/node49.html
 docs/html/node5.html
 docs/html/node50.html
 docs/html/node51.html
 docs/html/node52.html
 docs/html/node53.html
 docs/html/node54.html
 docs/html/node55.html
 docs/html/node56.html
 docs/html/node57.html
 docs/html/node58.html
 docs/html/node59.html
 docs/html/node6.html
 docs/html/node60.html
 docs/html/node61.html
 docs/html/node62.html
 docs/html/node63.html
 docs/html/node64.html
 docs/html/node65.html
 docs/html/node66.html
 docs/html/node67.html
 docs/html/node68.html
 docs/html/node69.html
 docs/html/node7.html
 docs/html/node70.html
 docs/html/node71.html
 docs/html/node72.html
 docs/html/node73.html
 docs/html/node74.html
 docs/html/node75.html
 docs/html/node76.html
 docs/html/node77.html
 docs/html/node78.html
 docs/html/node79.html
 docs/html/node8.html
 docs/html/node80.html
 docs/html/node81.html
 docs/html/node82.html
 docs/html/node83.html
 docs/html/node84.html
 docs/html/node85.html
 docs/html/node86.html
 docs/html/node87.html
 docs/html/node88.html
 docs/html/node89.html
 docs/html/node9.html
 docs/html/node90.html
 docs/html/node91.html
 docs/html/node92.html
 docs/html/node93.html
 docs/html/node94.html
 docs/html/node95.html
 docs/html/node96.html
 docs/html/node97.html
 docs/html/node98.html
 docs/html/node99.html
 docs/html/userhtml.html
 docs/psblas-3.0.pdf
 docs/src/biblio.tex
 docs/src/datastruct.tex
 docs/src/intro.tex
 test/fileread/df_sample.f90
 test/fileread/runs/dfs.inp
 test/pargen/ppde.f90
 test/pargen/spde.f90

1. Worked on documentation.
2. Fixed performance problem with gen_block_map: changed to use a hash
internally. 
3. Changed ppde to implement a convection-diffusion problem with
centered differences.
This commit is contained in:
Salvatore Filippone
2012-02-11 11:57:43 +00:00
parent 52714393a0
commit b0e6f32827
279 changed files with 20418 additions and 20328 deletions
+7
View File
@@ -124,6 +124,13 @@ Applications Code on Linux Clusters},
in G.~Joubert, A.~Murli, F.~Peters, M.~Vanneschi, editors,
Parallel Computing - Advances \& Current Issues,
pp.~441--448, Imperial College Press, 2002.
%
\bibitem{DesignPatterns}
{ Gamma, E.}, { Helm, R.}, { Johnson, R.}, { and} { Vlissides,
J.} 1995.
{\em Design Patterns: Elements of Reusable Object-Oriented Software}.
Addison-Wesley.
%
\bibitem{METIS}
Karypis, G. and Kumar, V.,
+494 -345
View File
@@ -1,4 +1,4 @@
\section{Data Structures}
\section{Data Structures and Classes}
\label{sec:datastruct}
%\ifthenelse{\boolean{mtc}}{\minitoc}{}
@@ -8,9 +8,11 @@ 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 are defined in
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.
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:
@@ -21,11 +23,17 @@ in the library as follows:
\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}
Moreover, the library defines a long integer kind
\verb|psb_long_int_k_| which normally corresponds to 64-bit integers;
it is only used for the \verb|psb_sizeof| utility.
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}
@@ -161,6 +169,165 @@ state, which can take the following values:
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}
@@ -196,97 +363,35 @@ state, which can take the following values:
\end{description}
\subsection{Sparse Matrix data structure}
\subsection{Sparse Matrix class}
\label{sec:spmat}
The \hypertarget{spdata}{{\tt psb\_spmat\_type}} data structure
The \hypertarget{spdata}{{\tt psb\_spmat\_type}} class
contains all information about the local portion of the sparse matrix and
its storage mode. Most of these fields are set by the tools
routines when inserting a new sparse matrix; the user needs only
choose, if he/she so whishes, a specific matrix storage mode.
The
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[{\bf aspk}] Contains values of the local distributed sparse
matrix.\\
Specified as: an allocatable array of rank one of type corresponding
to matrix entries type.
\item[{\bf ia1}] Holds integer information on distributed sparse
matrix. Actual information will depend on data format used.\\
Specified as: an allocatable integer array of rank one.
\item[{\bf ia2}] Holds integer information on distributed sparse
matrix. Actual information will depend on data format used.\\
Specified as: an allocatable integer array of rank one.
\item[{\bf infoa}] On entry can hold auxiliary information on distributed sparse
matrix. Actual information will depend on data format used.\\
Specified as: an integer array of length \verb|psb_ifasize_|.
\item[{\bf fida}] Defines the format of the distributed sparse matrix.\\
Specified as: a string of length 5
\item[{\bf descra}] Describe the characteristic of the distributed sparse matrix.\\
Specified as: array of character of length 9.
\item[{\bf pl}] Specifies the local row permutation of distributed sparse
matrix. If pl(1) is equal to 0, then there isn't row permutation.\\
Specified as: an allocatable integer array of dimension equal to number of local row (matrix\_data[psb\_n\_row\_\hbox{]})
\item[{\bf pr}] Specifies the local column permutation of distributed sparse
matrix. If PR(1) is equal to 0, then there isn't columnm permutation.\\
Specified as: an allocatable integer array of dimension equal to number of
local row (matrix\_data[psb\_n\_col\_\hbox{]})
\item[{\bf m}] Number of rows; if row indices are stored explicitly,
as in Coordinate Storage, should be greater than or equal to the
maximum row index actually present in the sparse matrix.
Specified as: integer variable.
\item[{\bf k}] Number of columns; if column indices are stored explicitly,
as in Coordinate Storage or Compressed Sparse Rows, should be greater
than or equal to the maximum column index actually present in the sparse matrix.
Specified as: integer variable.
\item[S] Single precision real;
\item[D] Double precision real;
\item[C] Single precision complex;
\item[Z] Double precision complex.
\end{description}
The Fortran~95 interface for distributed sparse matrices containing
double precision real entries is defined as shown in
figure~\ref{fig:spmattype}. The definitions for single precision and
complex data are identical except for the \verb|real| declaration and
for the kind type parameter.
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_sspmat_type
integer :: m, k
character :: fida(5)
character :: descra(10)
integer :: infoa(psb_ifa_size_)
real(psb_spk_), allocatable :: aspk(:)
integer, allocatable :: ia1(:), ia2(:)
integer, allocatable :: pr(:), pl(:)
end type psb_sspmat_type
type psb_dspmat_type
integer :: m, k
character :: fida(5)
character :: descra(10)
integer :: infoa(psb_ifa_size_)
real(psb_dpk_), allocatable :: aspk(:)
integer, allocatable :: ia1(:), ia2(:)
integer, allocatable :: pr(:), pl(:)
end type psb_dspmat_type
type :: psb_Tspmat_type
type psb_cspmat_type
integer :: m, k
character :: fida(5)
character :: descra(10)
integer :: infoa(psb_ifa_size_)
complex(psb_spk_), allocatable :: aspk(:)
integer, allocatable :: ia1(:), ia2(:)
integer, allocatable :: pr(:), pl(:)
end type psb_cspmat_type
class(psb_T_base_sparse_mat), allocatable :: a
type psb_zspmat_type
integer :: m, k
character :: fida(5)
character :: descra(10)
integer :: infoa(psb_ifa_size_)
complex(psb_dpk_), allocatable :: aspk(:)
integer, allocatable :: ia1(:), ia2(:)
integer, allocatable :: pr(:), pl(:)
end type psb_zspmat_type
end type psb_Tspmat_type
\end{verbatim}
\end{minipage}
@@ -299,32 +404,15 @@ end type psb_zspmat_type
The PSBLAS defined data type that
contains a sparse matrix.}
\end{figure}
The following two cases are among the most commonly used:
The following very common formats are precompiled in PSBLAS and thus
are always available:
\begin{description}
\item[fida=``CSR''] Compressed storage by rows. In this case the
following should hold:
\begin{enumerate}
\item \verb|ia2(i)| contains the index of the first element of row
\verb|i|; the last element of the sparse matrix is thus stored at
index $ia2(m+1)-1$. It should contain \verb|m+1| entries in
nondecreasing order (strictly increasing, if there are no empty rows).
\item \verb|ia1(j)| contains the column index and \verb|aspk(j)|
contains the corresponding coefficient value, for all $ia2(1) \le j
\le ia2(m+1)-1$.
\end{enumerate}
\item[fida=``COO''] Coordinate storage. In this case the following
should hold:
\begin{enumerate}
\item \verb|infoa(1)| contains the number of nonzero elements in the
matrix;
\item For all $1 \le j \le infoa(1)$, the coefficient, row index and
column index are stored into \verb|apsk(j)|, \verb|ia1(j)| and
\verb|ia2(j)| respectively.
\end{enumerate}
\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}
A sparse matrix has an associated state, which can take the following
values:
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.
@@ -336,6 +424,184 @@ values:
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}
@@ -353,15 +619,127 @@ values:
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
contains all information about local portion of the sparse matrix and
its storage mode. Most of these fields are set by the tools
routines when inserting a new sparse matrix; the user needs only
choose, if he/she so whishes, a specific matrix storage mode. \\
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}
@@ -469,238 +847,9 @@ research.
%% \end{description}
\subsection{Data structure query routines}
\subsection{Data structure Methods}
\label{sec:dataquery}
\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 in the mesh
\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 in the mesh
\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:] Asynchronous.
\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.
\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}
nr = 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}
nr = 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}
%%% Local Variables:
+12 -11
View File
@@ -11,10 +11,10 @@ dense matrix operations. The current implementation of PSBLAS
addresses a distributed memory execution model operating with message
passing.
The PSBLAS library version 3 is internally implemented in
The PSBLAS library version 3 is implemented in
the Fortran~2003~\cite{metcalf} programming language, with reuse and/or
adaptation of some existing Fortran~77 software, and a handful of C
routines.
adaptation of existing Fortran~77 and Fortran~95 software, plus a
handful of C routines.
The use of Fortran~2003 offers a number of advantages over Fortran~95,
mostly in the handling of requirements for evolution and adaptation of
@@ -103,7 +103,8 @@ further details on our communication layer see Sec.~\ref{sec:parenv}.
\ifcase\pdfoutput
\includegraphics[scale=0.65]{figures/psblas.eps}
\or
\rotatebox{-90}{\includegraphics[scale=0.65]{figures/psblas}}
%\rotatebox{-90}{\includegraphics[scale=0.65]{figures/psblas}}
{\includegraphics[scale=0.65]{figures/psblas}}
\fi
\end{center}
\caption{PSBLAS library components hierarchy.\label{fig:psblas}}
@@ -148,7 +149,7 @@ process generates its own portion. We never require that the entire
matrix be available on a single node. However, it is possible
to hold the entire matrix in one process and distribute it
explicitly\footnote{In our prototype implementation we provide
sample scatter/gather routines.}, even though the resulting
sample scatter/gather routines.}, even though the resulting memory
bottleneck would make this option unattractive in most cases.
@@ -263,11 +264,11 @@ systems solution for block diagonal matrices;
The following naming scheme has been adopted for all the symbols
internally defined in the PSBLAS software package:
\begin{itemize}
\item all the symbols (i.e. subroutine names, data types...) are
\item all symbols (i.e. subroutine names, data types...) are
prefixed by \verb|psb_|
\item all the data type names are suffixed by \verb|_type|
\item all the constant values are suffixed by \verb|_|
\item all the subroutine names follow the rule \verb|psb_xxname| where
\item all data type names are suffixed by \verb|_type|
\item all constants are suffixed by \verb|_|
\item all top-level subroutine names follow the rule \verb|psb_xxname| where
\verb|xx| can be either:
\begin{itemize}
\item \verb|ge|: the routine is related to dense data,
@@ -280,7 +281,7 @@ internally defined in the PSBLAS software package:
dense matrices, sparse matrices and communication descriptors
respectively.
Interface overloading allows the usage of the same subroutine
interfaces for both real and complex data.
names for both real and complex data.
\end{itemize}
In the description of the subroutines, arguments or argument entries
are classified as:
@@ -360,7 +361,7 @@ follows:
\item Call the iterative method of choice, e.g. \verb|psb_bicgstab|
\end{enumerate}
This is the structure of the sample program
\verb|test/pargen/ppde90.f90|.
\verb|test/pargen/ppde.f90|.
For a simulation in which the same discretization mesh is used over
multiple time steps, the following structure may be more appropriate: