mirror of
https://github.com/sfilippone/psblas3.git
synced 2026-10-20 12:52:14 +00:00
psblas3:
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:
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user