|
|
|
|
|
|
|
|
|
|
|
\section{Error handling}
|
|
|
|
|
|
|
|
The PSBLAS library error handling policy has been completely rewritten
|
|
|
|
in version 2.0. The idea behind the design of this new error handling
|
|
|
|
strategy is to keep error messages on a stack allowing the user to
|
|
|
|
trace back up to the point where the first error message has been
|
|
|
|
generated. Every routine in the PSBLAS-2.0 library has, as last
|
|
|
|
non-optional argument, an integer \verb|info| variable; whenever,
|
|
|
|
inside the routine, en error is detected, this variable is set to a
|
|
|
|
value corresponding to a specific error code. Then this error code is
|
|
|
|
also pushed on the error stack and then either control is returned to
|
|
|
|
the caller routine or the execution is aborted, depending on the users
|
|
|
|
choice. At the time when the execution is aborted, an error message is
|
|
|
|
printed on standard output with a level of verbosity than can be
|
|
|
|
chosen by the user. If the execution is not aborted, then, the caller
|
|
|
|
routine checks the value returned in the \verb|info| variable and, if
|
|
|
|
not zero, an error condition is raised. This process continues on all the
|
|
|
|
levels of nested calls until the level where the user decides to abort
|
|
|
|
the program execution.
|
|
|
|
|
|
|
|
Figure~\ref{fig:routerr} shows the layout of a generic \verb|psb_foo|
|
|
|
|
routine with respect to the PSBLAS-2.0 error handling policy. It is
|
|
|
|
possible to see how, whenever an error condition is detected, the
|
|
|
|
\verb|info| variable is set to the corresponding error code which is,
|
|
|
|
then, pushed on top of the stack by means of the
|
|
|
|
\verb|psb_errpush|. An error condition may be directly detected inside
|
|
|
|
a routine or indirectly checking the error code returned returned by a
|
|
|
|
called routine. Whenever an error is encountered, after it has been
|
|
|
|
pushed on stack, the program execution skips to a point where the
|
|
|
|
error condition is handled; the error condition is handled either by
|
|
|
|
returning control to the caller routine or by calling the
|
|
|
|
\verb|psb\_error| routine which prints the content of the error stack
|
|
|
|
and aborts the program execution.
|
|
|
|
|
|
|
|
\begin{figure}[h!]
|
|
|
|
\begin{Sbox}
|
|
|
|
\begin{minipage}[tl]{0.95\textwidth}
|
|
|
|
\small
|
|
|
|
\begin{verbatim}
|
|
|
|
subroutine psb_foo(some args, info)
|
|
|
|
...
|
|
|
|
if(error detected) then
|
|
|
|
info=errcode1
|
|
|
|
call psb_errpush('psb_foo', errcode1)
|
|
|
|
goto 9999
|
|
|
|
end if
|
|
|
|
...
|
|
|
|
call psb_bar(some args, info)
|
|
|
|
if(info .ne. zero) then
|
|
|
|
info=errcode2
|
|
|
|
call psb_errpush('psb_foo', errcode2)
|
|
|
|
goto 9999
|
|
|
|
end if
|
|
|
|
...
|
|
|
|
9999 continue
|
|
|
|
if (err_act .eq. act_abort) then
|
|
|
|
call psb_error(icontxt)
|
|
|
|
return
|
|
|
|
else
|
|
|
|
return
|
|
|
|
end if
|
|
|
|
|
|
|
|
end subroutine psb_foo
|
|
|
|
\end{verbatim}
|
|
|
|
\end{minipage}
|
|
|
|
\end{Sbox}
|
|
|
|
\setlength{\fboxsep}{8pt}
|
|
|
|
\begin{center}
|
|
|
|
\fbox{\TheSbox}
|
|
|
|
\end{center}
|
|
|
|
\caption{\label{fig:routerr}The layout of a generic \texttt{psb\_foo}
|
|
|
|
routine with respect to PSBLAS-2.0 error handling policy.}
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Figure~\ref{fig:errormsg} reports a sample error message generated by
|
|
|
|
the PSBLAS-2.0 library. This error has been generated by the fact that
|
|
|
|
the user has chosen the invalid ``FOO'' storage format to represent
|
|
|
|
the sparse matrix. From this error message it is possible to see that
|
|
|
|
the error has been detected inside the \verb|psb_cest| subroutine
|
|
|
|
called by \verb|psb_spasb| ... by process 0 (i.e. the root process).
|
|
|
|
|
|
|
|
|
|
|
|
\begin{figure}[h!]
|
|
|
|
\begin{Sbox}
|
|
|
|
\begin{minipage}[tl]{0.95\textwidth}
|
|
|
|
\begin{verbatim}
|
|
|
|
==========================================================
|
|
|
|
Process: 0. PSBLAS Error (4010) in subroutine: df_sample
|
|
|
|
Error from call to subroutine mat dist
|
|
|
|
==========================================================
|
|
|
|
Process: 0. PSBLAS Error (4010) in subroutine: mat_distv
|
|
|
|
Error from call to subroutine psb_spasb
|
|
|
|
==========================================================
|
|
|
|
Process: 0. PSBLAS Error (4010) in subroutine: psb_spasb
|
|
|
|
Error from call to subroutine psb_cest
|
|
|
|
==========================================================
|
|
|
|
Process: 0. PSBLAS Error (136) in subroutine: psb_cest
|
|
|
|
Format FOO is unknown
|
|
|
|
==========================================================
|
|
|
|
Aborting...
|
|
|
|
\end{verbatim}
|
|
|
|
\end{minipage}
|
|
|
|
\end{Sbox}
|
|
|
|
\setlength{\fboxsep}{8pt}
|
|
|
|
\begin{center}
|
|
|
|
\fbox{\TheSbox}
|
|
|
|
\end{center}
|
|
|
|
\caption{\label{fig:errormsg}A sample PSBLAS-2.0 error
|
|
|
|
message. Process 0 detected an error condition inside the {\textrm
|
|
|
|
psb\_cest} subroutine}
|
|
|
|
\end{figure}
|
|
|
|
|
|
|
|
|
|
|
|
\subroutine{psb\_errpush}{Pushes an error code onto the error stack}
|
|
|
|
|
|
|
|
\syntax{call psb\_errpush}{err\_c, r\_name, i\_err, a\_err}
|
|
|
|
|
|
|
|
\begin{description}
|
|
|
|
\item[\bf On Entry]
|
|
|
|
\item[err\_c] the error code\\
|
|
|
|
Scope: {\bf local} \\
|
|
|
|
Type: {\bf required}\\
|
|
|
|
Intent: {\bf in}.\\
|
|
|
|
Specified as: an integer.
|
|
|
|
\item[r\_name] the soutine where the error has been caught.\\
|
|
|
|
Scope: {\bf local} \\
|
|
|
|
Type: {\bf required}\\
|
|
|
|
Intent: {\bf in}.\\
|
|
|
|
Specified as: a string.\\
|
|
|
|
\item[i\_err] addional info for error code\\
|
|
|
|
Scope: {\bf local} \\
|
|
|
|
Type: {\bf optional}\\
|
|
|
|
Specified as: an integer array\\
|
|
|
|
\item[a\_err] addional info for error code\\
|
|
|
|
Scope: {\bf local} \\
|
|
|
|
Type: {\bf optional}\\
|
|
|
|
Specified as: a string.\\
|
|
|
|
\end{description}
|
|
|
|
|
|
|
|
\subroutine{psb\_error}{Prints the error stack content and aborts execution}
|
|
|
|
|
|
|
|
\syntax{call psb\_error}{icontxt}
|
|
|
|
|
|
|
|
\begin{description}
|
|
|
|
\item[\bf On Entry]
|
|
|
|
\item[icontxt] the communication context.\\
|
|
|
|
Scope: {\bf global} \\
|
|
|
|
Type: {\bf optional}\\
|
|
|
|
Intent: {\bf in}.\\
|
|
|
|
Specified as: an integer.
|
|
|
|
\end{description}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\subroutine{psb\_set\_errverbosity}{Sets the verbosity of error messages.}
|
|
|
|
|
|
|
|
\syntax{call psb\_set\_errverbosity}{v}
|
|
|
|
|
|
|
|
\begin{description}
|
|
|
|
\item[\bf On Entry]
|
|
|
|
\item[v] the verbosity level\\
|
|
|
|
Scope: {\bf global}\\
|
|
|
|
Type: {\bf required}\\
|
|
|
|
Intent: {\bf in}.\\
|
|
|
|
Specified as: an integer.
|
|
|
|
\end{description}
|
|
|
|
|
|
|
|
\subroutine{psb\_set\_erraction}{Set the type of action to be taken
|
|
|
|
upon error condition.}
|
|
|
|
|
|
|
|
\syntax{call psb\_set\_erraction}{err\_act}
|
|
|
|
|
|
|
|
\begin{description}
|
|
|
|
\item[\bf On Entry]
|
|
|
|
\item[err\_act] the type of action.\\
|
|
|
|
Scope: {\bf global} \\
|
|
|
|
Type: {\bf required}\\
|
|
|
|
Intent: {\bf in}.\\
|
|
|
|
Specified as: an integer.
|
|
|
|
\end{description}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
\subroutine{psb\_errcomm}{Error communication routine}
|
|
|
|
|
|
|
|
\syntax{call psb\_errcomm}{icontxt, err}
|
|
|
|
|
|
|
|
\begin{description}
|
|
|
|
\item[\bf On Entry]
|
|
|
|
\item[icontxt] the communication context.\\
|
|
|
|
Scope: {\bf global} \\
|
|
|
|
Type: {\bf required}\\
|
|
|
|
Intent: {\bf in}.\\
|
|
|
|
Specified as: an integer.
|
|
|
|
\item[err] the error code to be communicated\\
|
|
|
|
Scope: {\bf global} \\
|
|
|
|
Type: {\bf required}\\
|
|
|
|
Intent: {\bf inout}.\\
|
|
|
|
Specified as: an integer.\\
|
|
|
|
\end{description}
|
|
|
|
|
|
|
|
%%% Local Variables:
|
|
|
|
%%% mode: latex
|
|
|
|
%%% TeX-master: "userguide"
|
|
|
|
%%% End:
|