diff --git a/LICENSE b/LICENSE index 1a56c4c2..89dcff9b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ - MLD2P4 version 2.1 + MLD2P4 version 2.2 MultiLevel Domain Decomposition Parallel Preconditioners Package based on PSBLAS (Parallel Sparse BLAS version 3.5) diff --git a/Makefile b/Makefile index eb496629..f72d29d0 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,8 @@ install: all /bin/cp -fr docs/*pdf docs/html $(INSTALL_DOCSDIR) $(SHELL) ./mkdir.sh $(INSTALL_DOCSDIR) && \ $(INSTALL_DATA) README LICENSE $(INSTALL_DOCSDIR) - $(SHELL) ./mkdir.sh $(INSTALL_SAMPLESDIR) && ./mkdir.sh $(INSTALL_SAMPLESDIR)/simple &&\ + $(SHELL) ./mkdir.sh $(INSTALL_SAMPLESDIR) && \ + ./mkdir.sh $(INSTALL_SAMPLESDIR)/simple &&\ ./mkdir.sh $(INSTALL_SAMPLESDIR)/advanced && \ (cd examples; /bin/cp -fr pdegen fileread $(INSTALL_SAMPLESDIR)/simple ) && \ (cd tests; /bin/cp -fr pdegen fileread $(INSTALL_SAMPLESDIR)/advanced ) diff --git a/docs/html/img1.png b/docs/html/img1.png index fdd84f66..6e9422be 100644 Binary files a/docs/html/img1.png and b/docs/html/img1.png differ diff --git a/docs/html/img10.png b/docs/html/img10.png index 764b8113..9568c111 100644 Binary files a/docs/html/img10.png and b/docs/html/img10.png differ diff --git a/docs/html/img11.png b/docs/html/img11.png index 9b11155f..3ff4c6e6 100644 Binary files a/docs/html/img11.png and b/docs/html/img11.png differ diff --git a/docs/html/img12.png b/docs/html/img12.png index 5c710b74..3649dbe8 100644 Binary files a/docs/html/img12.png and b/docs/html/img12.png differ diff --git a/docs/html/img13.png b/docs/html/img13.png index c0e0675d..63b7e7a7 100644 Binary files a/docs/html/img13.png and b/docs/html/img13.png differ diff --git a/docs/html/img14.png b/docs/html/img14.png index 7f5706ea..d212e882 100644 Binary files a/docs/html/img14.png and b/docs/html/img14.png differ diff --git a/docs/html/img15.png b/docs/html/img15.png index d22a82cc..63669b77 100644 Binary files a/docs/html/img15.png and b/docs/html/img15.png differ diff --git a/docs/html/img16.png b/docs/html/img16.png index 7903ab11..c026878a 100644 Binary files a/docs/html/img16.png and b/docs/html/img16.png differ diff --git a/docs/html/img17.png b/docs/html/img17.png index 1f1e520f..ab9d063b 100644 Binary files a/docs/html/img17.png and b/docs/html/img17.png differ diff --git a/docs/html/img18.png b/docs/html/img18.png index cc28564b..2efc6035 100644 Binary files a/docs/html/img18.png and b/docs/html/img18.png differ diff --git a/docs/html/img19.png b/docs/html/img19.png index 1c33a760..50f1ef67 100644 Binary files a/docs/html/img19.png and b/docs/html/img19.png differ diff --git a/docs/html/img2.png b/docs/html/img2.png index ee136a21..b704a4b3 100644 Binary files a/docs/html/img2.png and b/docs/html/img2.png differ diff --git a/docs/html/img20.png b/docs/html/img20.png index 39e252e2..91841e80 100644 Binary files a/docs/html/img20.png and b/docs/html/img20.png differ diff --git a/docs/html/img21.png b/docs/html/img21.png index 2add4701..a8fb8e21 100644 Binary files a/docs/html/img21.png and b/docs/html/img21.png differ diff --git a/docs/html/img22.png b/docs/html/img22.png index 7418dfe8..aa79b4b2 100644 Binary files a/docs/html/img22.png and b/docs/html/img22.png differ diff --git a/docs/html/img23.png b/docs/html/img23.png index 7a758bcc..5cca2abd 100644 Binary files a/docs/html/img23.png and b/docs/html/img23.png differ diff --git a/docs/html/img24.png b/docs/html/img24.png index 9d61d844..71aa6915 100644 Binary files a/docs/html/img24.png and b/docs/html/img24.png differ diff --git a/docs/html/img25.png b/docs/html/img25.png index e6c2da12..80614919 100644 Binary files a/docs/html/img25.png and b/docs/html/img25.png differ diff --git a/docs/html/img26.png b/docs/html/img26.png index 05e45e2a..c7bfe75b 100644 Binary files a/docs/html/img26.png and b/docs/html/img26.png differ diff --git a/docs/html/img27.png b/docs/html/img27.png index bafab175..ea594f48 100644 Binary files a/docs/html/img27.png and b/docs/html/img27.png differ diff --git a/docs/html/img28.png b/docs/html/img28.png index 0d58d893..fea48403 100644 Binary files a/docs/html/img28.png and b/docs/html/img28.png differ diff --git a/docs/html/img29.png b/docs/html/img29.png index 665df9d7..fd4e255c 100644 Binary files a/docs/html/img29.png and b/docs/html/img29.png differ diff --git a/docs/html/img3.png b/docs/html/img3.png index 6210a8a5..27acb69b 100644 Binary files a/docs/html/img3.png and b/docs/html/img3.png differ diff --git a/docs/html/img30.png b/docs/html/img30.png index 20700d36..79d5c4c5 100644 Binary files a/docs/html/img30.png and b/docs/html/img30.png differ diff --git a/docs/html/img31.png b/docs/html/img31.png index b6e2c2f4..abff1e55 100644 Binary files a/docs/html/img31.png and b/docs/html/img31.png differ diff --git a/docs/html/img32.png b/docs/html/img32.png index 9c811f3a..6a3a5c8e 100644 Binary files a/docs/html/img32.png and b/docs/html/img32.png differ diff --git a/docs/html/img33.png b/docs/html/img33.png index 73c3dbc2..0e0acf00 100644 Binary files a/docs/html/img33.png and b/docs/html/img33.png differ diff --git a/docs/html/img34.png b/docs/html/img34.png index a9566abd..15a5966f 100644 Binary files a/docs/html/img34.png and b/docs/html/img34.png differ diff --git a/docs/html/img35.png b/docs/html/img35.png index 04eac653..7c9551eb 100644 Binary files a/docs/html/img35.png and b/docs/html/img35.png differ diff --git a/docs/html/img36.png b/docs/html/img36.png index 42a164f1..097c4318 100644 Binary files a/docs/html/img36.png and b/docs/html/img36.png differ diff --git a/docs/html/img37.png b/docs/html/img37.png index 6410868e..5c336962 100644 Binary files a/docs/html/img37.png and b/docs/html/img37.png differ diff --git a/docs/html/img38.png b/docs/html/img38.png index 18edc7a8..6f37179c 100644 Binary files a/docs/html/img38.png and b/docs/html/img38.png differ diff --git a/docs/html/img39.png b/docs/html/img39.png index d44f6784..126db528 100644 Binary files a/docs/html/img39.png and b/docs/html/img39.png differ diff --git a/docs/html/img4.png b/docs/html/img4.png index 0dbad0b8..e6f697e8 100644 Binary files a/docs/html/img4.png and b/docs/html/img4.png differ diff --git a/docs/html/img40.png b/docs/html/img40.png index bc6c005f..834b2218 100644 Binary files a/docs/html/img40.png and b/docs/html/img40.png differ diff --git a/docs/html/img41.png b/docs/html/img41.png index becee53d..17b9e5c3 100644 Binary files a/docs/html/img41.png and b/docs/html/img41.png differ diff --git a/docs/html/img42.png b/docs/html/img42.png index e19cd72f..77bd82e9 100644 Binary files a/docs/html/img42.png and b/docs/html/img42.png differ diff --git a/docs/html/img43.png b/docs/html/img43.png index 94880331..588abb24 100644 Binary files a/docs/html/img43.png and b/docs/html/img43.png differ diff --git a/docs/html/img44.png b/docs/html/img44.png index 92d1dfe7..29d01803 100644 Binary files a/docs/html/img44.png and b/docs/html/img44.png differ diff --git a/docs/html/img45.png b/docs/html/img45.png index af30929a..7f609739 100644 Binary files a/docs/html/img45.png and b/docs/html/img45.png differ diff --git a/docs/html/img46.png b/docs/html/img46.png index c1a8232d..2e5b8d82 100644 Binary files a/docs/html/img46.png and b/docs/html/img46.png differ diff --git a/docs/html/img47.png b/docs/html/img47.png index ccf736bf..242ad652 100644 Binary files a/docs/html/img47.png and b/docs/html/img47.png differ diff --git a/docs/html/img48.png b/docs/html/img48.png index 4c213639..71c0f11f 100644 Binary files a/docs/html/img48.png and b/docs/html/img48.png differ diff --git a/docs/html/img49.png b/docs/html/img49.png index 83d7ad8d..47d48775 100644 Binary files a/docs/html/img49.png and b/docs/html/img49.png differ diff --git a/docs/html/img5.png b/docs/html/img5.png index aa6c1343..87d06a09 100644 Binary files a/docs/html/img5.png and b/docs/html/img5.png differ diff --git a/docs/html/img50.png b/docs/html/img50.png index 49cb9d92..cf9cddd7 100644 Binary files a/docs/html/img50.png and b/docs/html/img50.png differ diff --git a/docs/html/img51.png b/docs/html/img51.png index cd350b7c..5ed44007 100644 Binary files a/docs/html/img51.png and b/docs/html/img51.png differ diff --git a/docs/html/img52.png b/docs/html/img52.png index 27e5a060..fcaf7a68 100644 Binary files a/docs/html/img52.png and b/docs/html/img52.png differ diff --git a/docs/html/img53.png b/docs/html/img53.png index af7d1cba..86ee555f 100644 Binary files a/docs/html/img53.png and b/docs/html/img53.png differ diff --git a/docs/html/img54.png b/docs/html/img54.png index 8ee9efc1..1ba05f3e 100644 Binary files a/docs/html/img54.png and b/docs/html/img54.png differ diff --git a/docs/html/img55.png b/docs/html/img55.png index 38465170..1378d964 100644 Binary files a/docs/html/img55.png and b/docs/html/img55.png differ diff --git a/docs/html/img56.png b/docs/html/img56.png index e9e8ba40..6a787014 100644 Binary files a/docs/html/img56.png and b/docs/html/img56.png differ diff --git a/docs/html/img57.png b/docs/html/img57.png index 7c30390e..9427a62e 100644 Binary files a/docs/html/img57.png and b/docs/html/img57.png differ diff --git a/docs/html/img58.png b/docs/html/img58.png index 845042a8..0a20920a 100644 Binary files a/docs/html/img58.png and b/docs/html/img58.png differ diff --git a/docs/html/img59.png b/docs/html/img59.png index 5a6adcc8..f1319814 100644 Binary files a/docs/html/img59.png and b/docs/html/img59.png differ diff --git a/docs/html/img6.png b/docs/html/img6.png index cc8d9d2d..952b5ef1 100644 Binary files a/docs/html/img6.png and b/docs/html/img6.png differ diff --git a/docs/html/img60.png b/docs/html/img60.png index a936486b..f6e845e6 100644 Binary files a/docs/html/img60.png and b/docs/html/img60.png differ diff --git a/docs/html/img61.png b/docs/html/img61.png index 373ca564..a681445d 100644 Binary files a/docs/html/img61.png and b/docs/html/img61.png differ diff --git a/docs/html/img62.png b/docs/html/img62.png index 66fe4003..d4654d6e 100644 Binary files a/docs/html/img62.png and b/docs/html/img62.png differ diff --git a/docs/html/img63.png b/docs/html/img63.png index a441bf9f..0de130c7 100644 Binary files a/docs/html/img63.png and b/docs/html/img63.png differ diff --git a/docs/html/img64.png b/docs/html/img64.png index a9e7f5da..bd52ba03 100644 Binary files a/docs/html/img64.png and b/docs/html/img64.png differ diff --git a/docs/html/img65.png b/docs/html/img65.png index 96c2af83..b27f1696 100644 Binary files a/docs/html/img65.png and b/docs/html/img65.png differ diff --git a/docs/html/img66.png b/docs/html/img66.png index 299747ec..d0ad453b 100644 Binary files a/docs/html/img66.png and b/docs/html/img66.png differ diff --git a/docs/html/img67.png b/docs/html/img67.png index 83860d24..35bdb2e6 100644 Binary files a/docs/html/img67.png and b/docs/html/img67.png differ diff --git a/docs/html/img68.png b/docs/html/img68.png index 5c05b81b..c1829efe 100644 Binary files a/docs/html/img68.png and b/docs/html/img68.png differ diff --git a/docs/html/img69.png b/docs/html/img69.png index 2eb73f61..9db10080 100644 Binary files a/docs/html/img69.png and b/docs/html/img69.png differ diff --git a/docs/html/img7.png b/docs/html/img7.png index 57b209d4..3502085d 100644 Binary files a/docs/html/img7.png and b/docs/html/img7.png differ diff --git a/docs/html/img70.png b/docs/html/img70.png index 3485c810..991ff18c 100644 Binary files a/docs/html/img70.png and b/docs/html/img70.png differ diff --git a/docs/html/img71.png b/docs/html/img71.png index 687f8f11..b9247035 100644 Binary files a/docs/html/img71.png and b/docs/html/img71.png differ diff --git a/docs/html/img72.png b/docs/html/img72.png index bc6b7ac6..5ae525f8 100644 Binary files a/docs/html/img72.png and b/docs/html/img72.png differ diff --git a/docs/html/img73.png b/docs/html/img73.png index a6d5d19b..7143bb00 100644 Binary files a/docs/html/img73.png and b/docs/html/img73.png differ diff --git a/docs/html/img74.png b/docs/html/img74.png index a9337489..61650309 100644 Binary files a/docs/html/img74.png and b/docs/html/img74.png differ diff --git a/docs/html/img75.png b/docs/html/img75.png index 107e05d7..8085fa9a 100644 Binary files a/docs/html/img75.png and b/docs/html/img75.png differ diff --git a/docs/html/img76.png b/docs/html/img76.png index 3936b252..323290a9 100644 Binary files a/docs/html/img76.png and b/docs/html/img76.png differ diff --git a/docs/html/img77.png b/docs/html/img77.png index 4e67821f..6da8adfa 100644 Binary files a/docs/html/img77.png and b/docs/html/img77.png differ diff --git a/docs/html/img78.png b/docs/html/img78.png index 576642c2..5bf75696 100644 Binary files a/docs/html/img78.png and b/docs/html/img78.png differ diff --git a/docs/html/img79.png b/docs/html/img79.png index 26284a83..d44da06e 100644 Binary files a/docs/html/img79.png and b/docs/html/img79.png differ diff --git a/docs/html/img8.png b/docs/html/img8.png index fd5994ec..f31f1db8 100644 Binary files a/docs/html/img8.png and b/docs/html/img8.png differ diff --git a/docs/html/img80.png b/docs/html/img80.png index 28f65c01..af549151 100644 Binary files a/docs/html/img80.png and b/docs/html/img80.png differ diff --git a/docs/html/img81.png b/docs/html/img81.png index e6ddac59..9f6148ed 100644 Binary files a/docs/html/img81.png and b/docs/html/img81.png differ diff --git a/docs/html/img82.png b/docs/html/img82.png index 9485b3d5..02046ff3 100644 Binary files a/docs/html/img82.png and b/docs/html/img82.png differ diff --git a/docs/html/img83.png b/docs/html/img83.png index dbec189b..51f7e6bb 100644 Binary files a/docs/html/img83.png and b/docs/html/img83.png differ diff --git a/docs/html/img84.png b/docs/html/img84.png index 429992b0..88943270 100644 Binary files a/docs/html/img84.png and b/docs/html/img84.png differ diff --git a/docs/html/img85.png b/docs/html/img85.png index f93f9c2c..9758b0d8 100644 Binary files a/docs/html/img85.png and b/docs/html/img85.png differ diff --git a/docs/html/img86.png b/docs/html/img86.png index 091c79a2..b0843489 100644 Binary files a/docs/html/img86.png and b/docs/html/img86.png differ diff --git a/docs/html/img87.png b/docs/html/img87.png index d3b680ce..9edf3adb 100644 Binary files a/docs/html/img87.png and b/docs/html/img87.png differ diff --git a/docs/html/img88.png b/docs/html/img88.png index 80e1ebdf..f9dfb321 100644 Binary files a/docs/html/img88.png and b/docs/html/img88.png differ diff --git a/docs/html/img89.png b/docs/html/img89.png index 24713eed..69a3e66c 100644 Binary files a/docs/html/img89.png and b/docs/html/img89.png differ diff --git a/docs/html/img9.png b/docs/html/img9.png index 043b345d..e411ffb3 100644 Binary files a/docs/html/img9.png and b/docs/html/img9.png differ diff --git a/docs/html/img90.png b/docs/html/img90.png index dcc9e5fa..f390f644 100644 Binary files a/docs/html/img90.png and b/docs/html/img90.png differ diff --git a/docs/html/img91.png b/docs/html/img91.png index efb2a515..18a953e2 100644 Binary files a/docs/html/img91.png and b/docs/html/img91.png differ diff --git a/docs/html/img92.png b/docs/html/img92.png index b69a0964..b58a4533 100644 Binary files a/docs/html/img92.png and b/docs/html/img92.png differ diff --git a/docs/html/img93.png b/docs/html/img93.png index c0282ff0..cc5d0c13 100644 Binary files a/docs/html/img93.png and b/docs/html/img93.png differ diff --git a/docs/html/index.html b/docs/html/index.html index f026ce9d..1f0d2ee7 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -1,6 +1,6 @@ - + userhtml @@ -9,7 +9,7 @@ - + @@ -69,17 +69,15 @@ based on PSBLAS


-Software version: 2.1 +Software version: 2.2
-July 31, 2017 +July 31, 2018

- - - +



diff --git a/docs/html/node1.html b/docs/html/node1.html index 202c3887..fc552ff5 100644 --- a/docs/html/node1.html +++ b/docs/html/node1.html @@ -1,6 +1,6 @@ - + Abstract @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node10.html b/docs/html/node10.html index a880f838..37ec11f4 100644 --- a/docs/html/node10.html +++ b/docs/html/node10.html @@ -1,6 +1,6 @@ - + Bug reporting @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node11.html b/docs/html/node11.html index 7b4e7b1b..13e572cb 100644 --- a/docs/html/node11.html +++ b/docs/html/node11.html @@ -1,6 +1,6 @@ - + Example and test programs @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node12.html b/docs/html/node12.html index b2da8f7e..0a40de2f 100644 --- a/docs/html/node12.html +++ b/docs/html/node12.html @@ -1,6 +1,6 @@ - + Multigrid Background @@ -9,7 +9,7 @@ - + @@ -88,19 +88,19 @@ are considered. The second approach performs a fully automatic coarsening and en interplay between fine and coarse level by suitably choosing the coarse space and the coarse-to-fine interpolation (see, e.g., [3,23,21] for details.) + HREF="node36.html#Stuben_01">24,22] for details.)

MLD2P4 uses a pure algebraic approach, based on the smoothed aggregation algorithm [2,25], + HREF="node36.html#VANEK_MANDEL_BREZINA">26], for building the sequence of coarse matrices and transfer operators, starting from the original one. A decoupled version of this algorithm is implemented, where the smoothed aggregation is applied locally to each submatrix [24]. + HREF="node36.html#TUMINARO_TONG">25]. A brief description of the AMG preconditioners implemented in MLD2P4 is given in Sections 4.1-4.3. For further details the reader is referred to [ - + AMG preconditioners @@ -9,7 +9,7 @@ - + @@ -67,7 +67,7 @@ Ax=b,
\begin{displaymath}
 Ax=b,
@@ -84,14 +84,14 @@ where <!-- MATH
  SRC= is a nonsingular sparse matrix; for ease of presentation we assume $A$ has a symmetric sparsity pattern.

Let us consider as finest index space the set of row (column) indices of $A$, i.e., $\mathbb{R}^{n_{k}}$ is associated with $\Omega^k$. For all $k < nlev$, a restriction operator and a prolongation one are built, which connect two levels $k$ and \begin{displaymath}
 P^k \in \mathbb{R}^{n_k \times n_{k+1}}, \quad 
 R^k \in \mathbb{R}^{n_{k+1}\times n_k};
\end{displaymath} + ALT="\begin{displaymath} +P^k \in \mathbb{R}^{n_k \times n_{k+1}}, \quad +R^k \in \mathbb{R}^{n_{k+1}\times n_k}; +\end{displaymath}">

@@ -188,9 +192,11 @@ A^{k+1}=R^kA^kP^k. --> \begin{displaymath}
 A^{k+1}=R^kA^kP^k.
\end{displaymath} + ALT="\begin{displaymath} +A^{k+1}=R^kA^kP^k. +\end{displaymath}">

@@ -202,19 +208,19 @@ A smoother with iteration matrix $M^k$ is set up at each level $k < nlev$, and a solver is set up at the coarsest level, so that they are ready for application (for example, setting up a solver based on the $LU$ factorization means computing and storing the $L$ and $U$ factors). The construction of the hierarchy of AMG components described so far corresponds to the so-called build phase of the preconditioner. @@ -251,8 +257,15 @@ end \framebox{
\begin{minipage}{.85\textwidth}
\begin{tabbing}
\quad \=\quad \=\quad...
-...mm]
\>endif  [1mm]
\>return $u^k$  [1mm]
end
\end{tabbing}
\end{minipage}
} + ALT="\framebox{ +\begin{minipage}{.85\textwidth} +\begin{tabbing} +\quad \=\quad \=\quad... +...[1mm] +\>endif \\ [1mm] +\>return $u^k$\ \\ [1mm] +end +\end{tabbing}\end{minipage}}">
@@ -270,7 +283,7 @@ of type $B$ denotes the preconditioner, usually within an iteration of a Krylov solver [20]. An example of such a combination, known as + HREF="node36.html#Saad_book">21]. An example of such a combination, known as V-cycle, is given in Figure 1. In this case, a single iteration of the same smoother is used before and after the the recursive call to the V-cycle (i.e., in the pre-smoothing and post-smoothing phases); however, different choices can be @@ -278,7 +291,7 @@ performed. Other cycles can be defined; in MLD2P4, we implemented the standard V and W-cycle [3], and a version of the K-cycle described in [19]. + HREF="node36.html#Notay2008">20].

diff --git a/docs/html/node14.html b/docs/html/node14.html index a4d6105f..e560ac94 100644 --- a/docs/html/node14.html +++ b/docs/html/node14.html @@ -1,6 +1,6 @@ - + Smoothed Aggregation @@ -9,7 +9,7 @@ - + @@ -63,7 +63,7 @@ the coarse-level matrix $A^{k+1}$, MLD2P4 uses the smoothed aggregation algorithm described in [2,25]. + HREF="node36.html#VANEK_MANDEL_BREZINA">26]. The basic idea of this algorithm is to build a coarse set of indices In order to perform the coarsening step, the smoothed aggregation algorithm described in [25] is used. In this algorithm, + HREF="node36.html#VANEK_MANDEL_BREZINA">26] is used. In this algorithm, each index @@ -149,11 +149,13 @@ strongly-coupled neighborood of +\Omega^k_j \subset \mathcal{N}_i^k(\theta) = +\left\{ r \i... +...vert a_{ii}^ka_{rr}^k\vert} \right \} \cup \left\{ i \right\}, +\end{displaymath}">
\begin{displaymath}
-\Omega^k_j \subset \mathcal{N}_i^k(\theta) = 
 \left\{ r ...
-...vert a_{ii}^ka_{rr}^k\vert} \right \} \cup \left\{ i \right\},
\end{displaymath} (3)
@@ -165,7 +167,7 @@ for a given threshold + Smoothers and coarsest-level solvers @@ -9,7 +9,7 @@ - + @@ -55,8 +55,8 @@ Smoothers and coarsest-level solvers The smoothers implemented in MLD2P4 include the Jacobi and block-Jacobi methods, a hybrid version of the forward and backward Gauss-Seidel methods, and the additive Schwarz (AS) ones (see, e.g., [20,21]). + HREF="node36.html#Saad_book">21,22]).

The hybrid Gauss-Seidel @@ -93,13 +93,13 @@ operator \begin{displaymath}
 ( M^k_{AS} )^{-1} = \sum_{i=1}^{m_k} P_i^k (A_i^k)^{-1} R_i^{k},
\end{displaymath} + ALT="\begin{displaymath} +( M^k_{AS} )^{-1} = \sum_{i=1}^{m_k} P_i^k (A_i^k)^{-1} R_i^{k}, +\end{displaymath}">

@@ -203,7 +205,7 @@ multilevel application phase, requires
  • the restriction of $w^k$ to the subspaces + Getting Started @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node17.html b/docs/html/node17.html index 830f4f6c..bb8015ed 100644 --- a/docs/html/node17.html +++ b/docs/html/node17.html @@ -1,6 +1,6 @@ - + Examples @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node18.html b/docs/html/node18.html index fc22110c..82317e7a 100644 --- a/docs/html/node18.html +++ b/docs/html/node18.html @@ -1,6 +1,6 @@ - + User Interface @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node19.html b/docs/html/node19.html index 1ea569b5..70549f3d 100644 --- a/docs/html/node19.html +++ b/docs/html/node19.html @@ -1,6 +1,6 @@ - + Method init @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node2.html b/docs/html/node2.html index 27a15212..18abc9b0 100644 --- a/docs/html/node2.html +++ b/docs/html/node2.html @@ -1,6 +1,6 @@ - + Contents @@ -9,7 +9,7 @@ - + @@ -122,9 +122,7 @@ Contents

    - - - +



    diff --git a/docs/html/node20.html b/docs/html/node20.html index 6d8135bf..f22f9a27 100644 --- a/docs/html/node20.html +++ b/docs/html/node20.html @@ -1,6 +1,6 @@ - + Method set @@ -9,7 +9,7 @@ - + @@ -247,7 +247,7 @@ solver is changed to the default sequential solver.


    -
    +
    @@ -300,7 +300,7 @@ number

    -
    +
    Table 2: Parameters defining the multilevel cycle and the number of cycles to @@ -285,7 +285,7 @@ Note that hybrid Multiplicative Schwarz is equivalent to V-cycle and
    Any integer

    number $\ge 1$

    1
    @@ -358,7 +358,7 @@ Parameters defining the aggregation algorithm. @@ -376,18 +376,22 @@ Currently, only the SYMDEC option applies decoupled aggregation to the sparsity pattern of $A+A^T$. - - - + + + @@ -415,7 +419,7 @@ of levels.


    -
    +
    Table 3: Parameters defining the aggregation algorithm. @@ -319,14 +319,14 @@ Parameters defining the aggregation algorithm.
    Any number

    $> 0$

    $\lfloor 40 \sqrt[3]{n} \rfloor$, where Any number

    $> 1$

    1.5Any integer

    number $> 1$

    20
    'AGGR_TYPE' character(len=*)'VMB''VMB'Type of aggregation algorithm: currently, the scalar aggregation - algorithm by Vanek, Mandel and Brezina is implemented - [25].'SOC1''SOC1', + 'SOC2'Type of aggregation algorithm: currently, + we implement to measures of strength of + connection, the one by Vanek, Mandel + and Brezina [26], + and the one by Gratton et al [16].
    'AGGR_PROL' character(len=*)
    +


    -
    +
    Table 4: Parameters defining the aggregation algorithm (continued). @@ -440,8 +444,7 @@ Parameters defining the aggregation algorithm (continued). descending degrees of the nodes in the matrix graph. -
    -'AGGR_THRESH'
    'AGGR_THRESH' real(kind_parameter) Any real

    @@ -451,7 +454,7 @@ number $\in [0, 1]$

    0.01 The threshold $\theta$ in the aggregation algorithm, see (3) in Section 4.2. @@ -468,7 +471,7 @@ number 
    Note. Different thresholds at different levels, such as those used in [25, Section 5.1], can be easily set by + HREF="node36.html#VANEK_MANDEL_BREZINA">26, Section 5.1], can be easily set by invoking the rou-
    tine set with @@ -483,7 +486,7 @@ the parameter ilev.
    Table 5: Parameters defining the coarse-space correction at the coarsest @@ -590,7 +593,7 @@ Note that UMF and SLU require the coarsest


    -
    +
    @@ -621,7 +624,7 @@ number Any integer

    number $\ge 0$

    @@ -635,7 +638,7 @@ number Any real

    number $\ge 0$

    @@ -656,7 +659,7 @@ number

    -
    +
    Table 6: Parameters defining the coarse-space correction at the coarsest @@ -609,7 +612,7 @@ level (continued).
    Any integer

    number $> 0$

    1000
    @@ -767,7 +770,7 @@ Parameters defining the smoother or the details of the one-level preconditioner. @@ -783,7 +786,7 @@ Parameters defining the smoother or the details of the one-level preconditioner.


    -
    +
    Table 7: Parameters defining the smoother or the details of the one-level preconditioner. @@ -748,7 +751,7 @@ Parameters defining the smoother or the details of the one-level preconditioner.
    Any integer

    number $\ge 0$

    Any integer

    number $\ge 0$

    @@ -856,7 +859,7 @@ Parameters defining the smoother or the details of the one-level preconditioner @@ -870,8 +873,7 @@ Parameters defining the smoother or the details of the one-level preconditioner SRC="img83.png" ALT="$p,t$">) factorization. - + diff --git a/docs/html/node21.html b/docs/html/node21.html index 8a1d324e..be357628 100644 --- a/docs/html/node21.html +++ b/docs/html/node21.html @@ -1,6 +1,6 @@ - +Method hierarchy_build @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node22.html b/docs/html/node22.html index 0bb9ab16..d9fa00f9 100644 --- a/docs/html/node22.html +++ b/docs/html/node22.html @@ -1,6 +1,6 @@ - +Method smoothers_build @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node23.html b/docs/html/node23.html index 445ce6f3..54375c9a 100644 --- a/docs/html/node23.html +++ b/docs/html/node23.html @@ -1,6 +1,6 @@ - +Method build @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node24.html b/docs/html/node24.html index be5f014a..447807ca 100644 --- a/docs/html/node24.html +++ b/docs/html/node24.html @@ -1,6 +1,6 @@ - +Method apply @@ -9,7 +9,7 @@ - + @@ -62,9 +62,9 @@ This method computes $y = op(B^{-1})  x$, where $y = op(B^{-1})\, x$, where $B$ is a previously built diff --git a/docs/html/node25.html b/docs/html/node25.html index da626cdc..23211355 100644 --- a/docs/html/node25.html +++ b/docs/html/node25.html @@ -1,6 +1,6 @@ - +Method free @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node26.html b/docs/html/node26.html index 494e7369..f07bcf9f 100644 --- a/docs/html/node26.html +++ b/docs/html/node26.html @@ -1,6 +1,6 @@ - +Method descr @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node27.html b/docs/html/node27.html index b4165d36..64b9a5db 100644 --- a/docs/html/node27.html +++ b/docs/html/node27.html @@ -1,6 +1,6 @@ - +Auxiliary Methods @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node28.html b/docs/html/node28.html index ffbacc9b..813e8e25 100644 --- a/docs/html/node28.html +++ b/docs/html/node28.html @@ -1,6 +1,6 @@ - +Method: dump @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node29.html b/docs/html/node29.html index 888861cf..da717d1c 100644 --- a/docs/html/node29.html +++ b/docs/html/node29.html @@ -1,6 +1,6 @@ - +Method: clone @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node3.html b/docs/html/node3.html index a5e870ba..b7f7bd1d 100644 --- a/docs/html/node3.html +++ b/docs/html/node3.html @@ -1,6 +1,6 @@ - +General Overview @@ -9,7 +9,7 @@ - + @@ -57,8 +57,8 @@ General Overview PSBLAS (MLD2P4) provides parallel Algebraic MultiGrid (AMG) and Domain Decomposition preconditioners (see, e.g., [3,23,21]), + HREF="node36.html#Stuben_01">24,22]), to be used in the iterative solution of linear systems,
    @@ -72,7 +72,7 @@ Ax=b,
    Table 8: Parameters defining the smoother or the details of the one-level preconditioner @@ -840,7 +843,7 @@ Parameters defining the smoother or the details of the one-level preconditioner
    Any integer

    number $\ge 0$

    real(kind_parameter) Any real number $\ge 0$
    -
    \begin{displaymath}
 Ax=b,
@@ -82,7 +82,7 @@ Ax=b,
 </TABLE>
 <BR CLEAR=

    where $A$ is a square, real or complex, sparse matrix. The name of the package comes from its original implementation, containing @@ -95,7 +95,7 @@ multilevel cycles and smoothers widely used in multigrid methods. AMG cycles with smoothers and coarsest-level solvers. The V-, W-, and K-cycles [3,19] are available, which allow to define + HREF="node36.html#Notay2008">20] are available, which allow to define almost all the preconditioners in the package, including the multilevel hybrid Schwarz ones; a specific cycle is implemented to obtain multilevel additive Schwarz preconditioners. The Jacobi, hybrid @@ -105,7 +105,7 @@ coarse-level matrices and operators, without explicitly using any information on geometry of the original problem, e.g., the discretization of a PDE. To this end, the smoothed aggregation technique [2,25] + HREF="node36.html#VANEK_MANDEL_BREZINA">26] is applied. Either exact or approximate solvers can be used on the coarsest-level system. Specifically, different sparse LU factorizations from external packages, and native incomplete LU factorizations and Jacobi, hybrid Gauss-Seidel, @@ -116,8 +116,7 @@ preconditioners. MLD2P4 is written in Fortran 2003, following an object-oriented design through the exploitation of features such as abstract data type creation, type extension, functional overloading, and -dynamic memory management. -The parallel implementation is based on a Single Program Multiple Data +dynamic memory management. The parallel implementation is based on a Single Program Multiple Data (SPMD) paradigm. Single and double precision implementations of MLD2P4 are available for both the real and the complex case, which can be used through a single diff --git a/docs/html/node30.html b/docs/html/node30.html index e5cfa8fa..873b2304 100644 --- a/docs/html/node30.html +++ b/docs/html/node30.html @@ -1,6 +1,6 @@ - + Method: sizeof @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node31.html b/docs/html/node31.html index a2044f73..1243f28c 100644 --- a/docs/html/node31.html +++ b/docs/html/node31.html @@ -1,6 +1,6 @@ - + Method: allocate_wrk @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node32.html b/docs/html/node32.html index 66687d38..5805fd18 100644 --- a/docs/html/node32.html +++ b/docs/html/node32.html @@ -1,6 +1,6 @@ - + Method: free_wrk @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node33.html b/docs/html/node33.html index a9e120a5..463a9879 100644 --- a/docs/html/node33.html +++ b/docs/html/node33.html @@ -1,6 +1,6 @@ - + Adding new smoother and solver objects to MLD2P4 @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node34.html b/docs/html/node34.html index 150cb8e1..a32c73cd 100644 --- a/docs/html/node34.html +++ b/docs/html/node34.html @@ -1,6 +1,6 @@ - + Error Handling @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node35.html b/docs/html/node35.html index 5a7991e0..369bfe3a 100644 --- a/docs/html/node35.html +++ b/docs/html/node35.html @@ -1,6 +1,6 @@ - + License @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node36.html b/docs/html/node36.html index bf1feef1..0504c1f0 100644 --- a/docs/html/node36.html +++ b/docs/html/node36.html @@ -1,6 +1,6 @@ - + Bibliography @@ -9,7 +9,7 @@ - + @@ -138,53 +138,60 @@ S. Filippone, M. Colajanni, PSBLAS: A Library for Parallel Linear Algebra Computation on Sparse Matrices, ACM Transactions on Mathematical Software, 26 (4), 2000, 527-550. -

    16 +

    16 +
    +S. Gratton, P. Henon, P. Jiranek and X. Vasseur, + Reducing complexity of algebraic multigrid by aggregation, +Numerical Lin. Algebra with Applications, 2016, 23:501-518 + +

    +

    17
    W. Gropp, S. Huss-Lederman, A. Lumsdaine, E. Lusk, B. Nitzberg, W. Saphir, M. Snir, MPI: The Complete Reference. Volume 2 - The MPI-2 Extensions, MIT Press, 1998. -

    17 +

    18
    C. L. Lawson, R. J. Hanson, D. Kincaid, F. T. Krogh, Basic Linear Algebra Subprograms for FORTRAN usage, ACM Transactions on Mathematical Software, 5 (3), 1979, 308-323. -

    18 +

    19
    X. S. Li, J. W. Demmel, SuperLU_DIST: A Scalable Distributed-memory Sparse Direct Solver for Unsymmetric Linear Systems, ACM Transactions on Mathematical Software, 29 (2), 2003, 110-140. -

    19 +

    20
    Y. Notay, P. S. Vassilevski, Recursive Krylov-based multigrid cycles, Numerical Linear Algebra with Applications, 15 (5), 2008, 473-487. -

    20 +

    21
    Y. Saad, Iterative methods for sparse linear systems, 2nd edition, SIAM, 2003. -

    21 +

    22
    B. Smith, P. Bjorstad, W. Gropp, Domain Decomposition: Parallel Multilevel Methods for Elliptic Partial Differential Equations, Cambridge University Press, 1996. -

    22 +

    23
    M. Snir, S. Otto, S. Huss-Lederman, D. Walker, J. Dongarra, MPI: The Complete Reference. Volume 1 - The MPI Core, second edition, MIT Press, 1998. -

    23 +

    24
    K. Stüben, An Introduction to Algebraic Multigrid, in A. Schüller, U. Trottenberg, C. Oosterlee, Multigrid, Academic Press, 2001. -

    24 +

    25
    R. S. Tuminaro, C. Tong, Parallel Smoothed Aggregation Multigrid: Aggregation Strategies on Massively Parallel Machines, in J. Donnelley, editor, Proceedings of SuperComputing 2000, Dallas, 2000. -

    25 +

    26
    P. Vanek, J. Mandel, M. Brezina, Algebraic Multigrid by Smoothed Aggregation for Second and Fourth Order Elliptic Problems, diff --git a/docs/html/node37.html b/docs/html/node37.html index 0eb0b5e6..657869fa 100644 --- a/docs/html/node37.html +++ b/docs/html/node37.html @@ -1,6 +1,6 @@ - + About this document ... @@ -9,7 +9,7 @@ - + @@ -47,7 +47,7 @@ About this document ...

    This document was generated using the -LaTeX2HTML translator Version 2017.2 (Released Jan 23, 2017) +LaTeX2HTML translator Version 2018 (Released Feb 1, 2018)

    Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, @@ -60,7 +60,7 @@ Mathematics Department, Macquarie University, Sydney. The command line arguments were:
    latex2html -local_icons -noaddress -dir ../../html userhtml.tex

    -The translation was initiated on 2018-01-27 +The translation was initiated on 2018-05-14


    diff --git a/docs/html/node4.html b/docs/html/node4.html index 7b2ac12c..c478e331 100644 --- a/docs/html/node4.html +++ b/docs/html/node4.html @@ -1,6 +1,6 @@ - + Code Distribution @@ -9,7 +9,7 @@ - + @@ -80,7 +80,7 @@ constant --> \begin{displaymath}\verb\vert mld_version_string_\vert\end{displaymath} diff --git a/docs/html/node5.html b/docs/html/node5.html index 3e5ba8d6..a15ea834 100644 --- a/docs/html/node5.html +++ b/docs/html/node5.html @@ -1,6 +1,6 @@ - + Contributors @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node6.html b/docs/html/node6.html index 8c177d8c..54be0f4b 100644 --- a/docs/html/node6.html +++ b/docs/html/node6.html @@ -1,6 +1,6 @@ - + Configuring and Building MLD2P4 @@ -9,7 +9,7 @@ - + diff --git a/docs/html/node7.html b/docs/html/node7.html index 13445741..7eed7f21 100644 --- a/docs/html/node7.html +++ b/docs/html/node7.html @@ -1,6 +1,6 @@ - + Prerequisites @@ -9,7 +9,7 @@ - + @@ -59,7 +59,7 @@ Prerequisites
    [11,12,17] Many vendors provide optimized versions + HREF="node36.html#blas1">18] Many vendors provide optimized versions of BLAS; if no vendor version is available for a given platform, the ATLAS software (
    MPI
    [16,22] A version of MPI is available on most + HREF="node36.html#MPI2">17,23] A version of MPI is available on most high-performance computing systems.
    diff --git a/docs/html/node8.html b/docs/html/node8.html index f1b81928..b008d3ae 100644 --- a/docs/html/node8.html +++ b/docs/html/node8.html @@ -1,6 +1,6 @@ - + Optional third party libraries @@ -9,7 +9,7 @@ - + @@ -92,7 +92,7 @@ for multilevel preconditioners may change to reflect their presence.
    SuperLU_Dist
    [18] + HREF="node36.html#SUPERLUDIST">19] A sparse LU factorization package available from the same site as SuperLU; it provides parallel factorization and triangular system solution for double precision real and complex data. diff --git a/docs/html/node9.html b/docs/html/node9.html index df5e4663..212118d8 100644 --- a/docs/html/node9.html +++ b/docs/html/node9.html @@ -1,6 +1,6 @@ - + Configuration options @@ -9,7 +9,7 @@ - + diff --git a/docs/html/userhtml.html b/docs/html/userhtml.html index f026ce9d..1f0d2ee7 100644 --- a/docs/html/userhtml.html +++ b/docs/html/userhtml.html @@ -1,6 +1,6 @@ - + userhtml @@ -9,7 +9,7 @@ - + @@ -69,17 +69,15 @@ based on PSBLAS


    -Software version: 2.1 +Software version: 2.2
    -July 31, 2017 +July 31, 2018

    - - - +



    diff --git a/docs/mld2p4-2.1-guide.pdf b/docs/mld2p4-2.2-guide.pdf similarity index 94% rename from docs/mld2p4-2.1-guide.pdf rename to docs/mld2p4-2.2-guide.pdf index 859ae4c5..29db2a71 100644 --- a/docs/mld2p4-2.1-guide.pdf +++ b/docs/mld2p4-2.2-guide.pdf @@ -24,7 +24,7 @@ BT /F17 11.9552 Tf 218.644 -79.389 Td [(P)31(asqua)-375(D'Am)31(bra)]TJ/F37 11.9552 Tf -22.655 -13.947 Td [(IA)27(C-CNR,)-326(Naples,)-326(Italy)]TJ/F17 11.9552 Tf 11.494 -29.39 Td [(Daniela)-375(di)-375(Sera\014no)]TJ/F37 11.9552 Tf -181.63 -13.948 Td [(Univ)27(ersit)27(y)-326(of)-326(Campania)-326(\134Luigi)-327(V)82(an)27(vitelli",)-326(Caserta,)-326(Italy)]TJ/F17 11.9552 Tf 179.561 -29.39 Td [(Salv)62(atore)-375(Filipp)-31(one)]TJ/F37 11.9552 Tf -134.787 -13.947 Td [(Cran\014eld)-326(Univ)27(ersit)27(y)82(,)-326(Cran\014eld,)-327(United)-326(Kingdom)]TJ 0 g 0 G 0 g 0 G - 141.76 -78.924 Td [(Soft)27(w)28(are)-327(v)27(ersion)1(:)-436(2.1)]TJ 38.924 -13.948 Td [(July)-326(31,)-327(2017)]TJ + 141.76 -78.924 Td [(Soft)27(w)28(are)-327(v)27(ersion)1(:)-436(2.2)]TJ 38.924 -13.948 Td [(July)-326(31,)-327(2018)]TJ 0 g 0 G 0 g 0 G ET @@ -722,11 +722,11 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-269(23)]TJ + [-269(24)]TJ 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-268(21)]TJ + [-268(22)]TJ 0 g 0 G [(]\051,)-281(to)-269(b)-27(e)-269(used)-268(in)-268(the)-269(iterativ)28(e)]TJ 0 -13.549 Td [(solution)-333(of)-334(lin)1(e)-1(ar)-333(systems,)]TJ/F22 10.9091 Tf 186.98 -16.123 Td [(Ax)]TJ/F15 10.9091 Tf 17.447 0 Td [(=)]TJ/F22 10.9091 Tf 11.515 0 Td [(b;)]TJ 0 g 0 G @@ -738,7 +738,7 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-263(19)]TJ + [-263(20)]TJ 0 g 0 G [(])]TJ 0 -13.549 Td [(are)-392(a)28(v)56(ailable,)-407(whic)28(h)-392(allo)28(w)-392(to)-391(de\014ne)-392(almost)-392(all)-391(the)-392(preconditioners)-392(in)-392(th)1(e)-392(pac)28(k)55(age,)-406(in-)]TJ 0 -13.549 Td [(cluding)-394(the)-394(m)28(ultilev)28(el)-394(h)28(ybrid)-394(Sc)28(h)27(w)28(arz)-394(ones;)-424(a)-394(sp)-28(eci\014c)-394(cycle)-394(is)-394(implemen)28(ted)-394(to)-394(obtain)]TJ 0 -13.55 Td [(m)28(ultilev)28(el)-498(additiv)28(e)-498(Sc)28(h)28(w)28(arz)-498(preconditioners.)-937(The)-497(Jacobi,)-539(h)28(ybrid)-498(forw)28(ard/bac)28(kw)28(ard)]TJ 0 -13.549 Td [(Gauss-Seidel,)-366(blo)-27(c)27(k-Jacobi,)-365(and)-359(additiv)28(e)-360(Sc)28(h)28(w)28(arz)-359(m)-1(eth)1(o)-28(ds)-359(are)-360(a)28(v)56(ailable)-359(as)-360(smo)-27(others.)]TJ 0 -13.549 Td [(An)-279(algebraic)-279(appr)1(oac)27(h)-279(i)1(s)-279(used)-279(to)-279(generate)-279(a)-279(hierarc)28(h)28(y)-279(of)-279(coarse-lev)28(el)-279(matrices)-279(and)-278(op)-28(er-)]TJ 0 -13.549 Td [(ators,)-283(without)-270(explicitly)-270(using)-270(an)28(y)-271(inf)1(ormation)-271(on)-270(the)-270(geometry)-270(of)-270(the)-271(original)-270(problem,)]TJ 0 -13.549 Td [(e.g.,)-256(the)-237(discretization)-237(of)-237(a)-237(PDE.)-237(T)84(o)-237(this)-237(end,)-256(the)-237(smo)-28(othed)-237(aggregation)-237(tec)28(hnique)-237([)]TJ 1 0 0 rg 1 0 0 RG @@ -746,7 +746,7 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-236(25)]TJ + [-236(26)]TJ 0 g 0 G [(])]TJ 0 -13.55 Td [(is)-377(applied.)-575(Either)-376(exact)-377(or)-377(appro)28(ximate)-377(solv)28(ers)-377(can)-377(b)-28(e)-377(used)-376(on)-377(the)-377(coarsest-lev)28(el)-377(sys-)]TJ 0 -13.549 Td [(tem.)-441(Sp)-27(eci\014cally)83(,)-324(di\013eren)28(t)-322(sparse)-322(LU)-322(factorizations)-321(from)-322(external)-322(pac)28(k)55(ages,)-324(and)-321(nativ)27(e)]TJ 0 -13.549 Td [(incomplete)-285(LU)-285(factorizations)-285(and)-285(Jacobi,)-295(h)28(ybrid)-285(Gauss-Seidel,)-294(and)-285(blo)-28(c)28(k-Jacobi)-285(solv)28(ers)]TJ 0 -13.549 Td [(are)-333(a)27(v)56(ailable.)-444(All)-334(smo)-28(oth)1(e)-1(r)1(s)-334(can)-333(b)-28(e)-333(also)-334(exploited)-333(as)-333(one-lev)27(el)-333(preconditioners.)]TJ 16.937 -14.408 Td [(MLD2P4)-267(is)-267(written)-268(in)-267(F)84(ortran)-267(2003,)-281(follo)28(wing)-267(an)-267(ob)-56(ject-orien)28(ted)-267(design)-268(th)1(rough)-268(the)]TJ -16.937 -13.549 Td [(exploitation)-338(of)-337(features)-338(suc)28(h)-338(as)-337(abstract)-338(data)-338(t)28(yp)-28(e)-337(creation,)-339(t)28(yp)-28(e)-338(extension,)-338(functional)]TJ 0 -13.549 Td [(o)28(v)28(erloading,)-326(and)-325(dynamic)-324(memory)-325(managemen)28(t.)-441(The)-325(parallel)-324(implemen)28(tation)-325(is)-324(based)]TJ 0 -13.549 Td [(on)-424(a)-424(Single)-424(Program)-424(Multiple)-424(Data)-424(\050SPMD\051)-424(paradigm.)-717(Single)-424(and)-424(double)-424(precision)]TJ 0 -13.549 Td [(implemen)28(tations)-486(of)-486(MLD2P4)-486(are)-486(a)28(v)56(ailable)-486(for)-486(b)-27(oth)-486(the)-486(real)-486(and)-486(the)-486(complex)-485(cas)-1(e,)]TJ 0 -13.55 Td [(whic)28(h)-334(can)-333(b)-28(e)-333(used)-333(through)-333(a)-334(single)-333(in)28(terface.)]TJ 16.937 -14.407 Td [(MLD2P4)-229(has)-230(b)-27(e)-1(en)-229(designed)-229(to)-230(implemen)28(t)-230(scalable)-229(and)-229(easy-to-use)-230(m)28(ultilev)28(el)-230(precon-)]TJ -16.937 -13.549 Td [(ditioners)-349(in)-349(the)-350(con)28(text)-349(of)-349(the)-349(PSBLAS)-349(\050P)27(arallel)-349(Sparse)-349(BLAS\051)-349(computational)-349(frame-)]TJ 0 -13.549 Td [(w)28(ork)-360([)]TJ 1 0 0 rg 1 0 0 RG @@ -908,7 +908,7 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-424(17)]TJ + [-424(18)]TJ 0 g 0 G [(])-425(Man)28(y)-425(v)28(endors)-424(pro)27(v)1(ide)-425(optimized)-425(v)28(ersions)-425(of)-424(BLAS;)-425(if)-424(no)-425(v)28(endor)]TJ -11.105 -13.55 Td [(v)28(ersion)-523(is)-524(a)28(v)56(ailable)-523(for)-523(a)-524(giv)28(en)-523(platform,)-570(the)-524(A)84(TLAS)-523(soft)28(w)27(are)-523(\050)]TJ 0 1 0 0 k 0 1 0 0 K @@ -928,11 +928,11 @@ BT 0 g 0 G /F15 10.9091 Tf 30.697 0 Td [([)]TJ 1 0 0 rg 1 0 0 RG - [(16)]TJ + [(17)]TJ 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-340(22)]TJ + [-340(23)]TJ 0 g 0 G [(])-340(A)-341(v)28(ersion)-340(of)-340(MPI)-340(is)-341(a)28(v)56(ailable)-341(on)-340(most)-340(high-p)-28(erformance)-340(computing)-340(sys-)]TJ -3.424 -13.549 Td [(tems.)]TJ 0 g 0 G @@ -1018,7 +1018,7 @@ BT 0 g 0 G /F15 10.9091 Tf 28.388 0 Td [([)]TJ 1 0 0 rg 1 0 0 RG - [(18)]TJ + [(19)]TJ 0 g 0 G [(])-417(A)-416(sparse)-417(LU)-416(factorization)-417(pac)28(k)55(age)-416(a)28(v)55(ailable)-416(from)-417(the)-417(same)-416(site)]TJ -55.002 -13.549 Td [(as)-366(Sup)-28(erLU;)-366(it)-367(pro)28(vides)-366(parallel)-366(factorization)-367(and)-366(triangular)-366(system)-367(solution)-366(for)]TJ 0 -13.549 Td [(double)-384(precision)-384(real)-384(and)-384(complex)-384(data.)-596(W)83(e)-384(tested)-384(v)28(ersions)-384(3.3)-384(and)-384(4.2.)-596(If)-384(y)28(ou)]TJ 0 -13.549 Td [(installed)-384(BLAS)-384(f)1(rom)-384(A)83(TLAS,)-384(remem)28(b)-28(er)-384(to)-383(de\014ne)-384(the)-384(BLASLIB)-384(v)56(ariable)-384(in)-384(the)]TJ 0 -13.549 Td [(mak)28(e.inc)-401(\014le)-401(and)-401(to)-401(add)-402(t)1(he)]TJ/F45 10.9091 Tf 142.011 0 Td [(-std=c99)]TJ/F15 10.9091 Tf 50.193 0 Td [(option)-401(to)-401(the)-401(C)-401(compiler)-401(options.)-648(Note)]TJ -192.204 -13.55 Td [(that)-432(this)-432(library)-432(requires)-433(t)1(he)-433(P)28(arMETIS)-432(library)-432(for)-432(parallel)-432(graph)-432(partitioning)]TJ 0 -13.549 Td [(and)-374(\014ll-reducing)-374(matrix)-374(ordering,)-385(a)28(v)56(ailable)-374(from)]TJ 0 1 0 0 k 0 1 0 0 K @@ -1891,11 +1891,11 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-313(23)]TJ + [-313(24)]TJ 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-313(21)]TJ + [-313(22)]TJ 0 g 0 G [(])]TJ 0 -13.549 Td [(for)-333(details.\051)]TJ 16.937 -14.105 Td [(MLD2P4)-329(uses)-330(a)-329(pure)-330(algebraic)-329(approac)28(h,)-331(b)1(as)-1(ed)-329(on)-329(the)-330(smo)-28(othed)-329(aggregation)-330(algo-)]TJ -16.937 -13.549 Td [(rithm)-298([)]TJ 1 0 0 rg 1 0 0 RG @@ -1903,11 +1903,11 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-298(25)]TJ + [-298(26)]TJ 0 g 0 G [(],)-305(for)-298(building)-298(the)-298(sequence)-298(of)-298(coarse)-298(matrices)-298(and)-298(transfer)-298(op)-28(erators,)-305(start-)]TJ 0 -13.549 Td [(ing)-306(from)-306(the)-305(original)-306(one.)-435(A)-306(decoupled)-306(v)28(ersion)-306(of)-306(this)-306(algori)1(thm)-306(is)-306(implemen)28(ted,)-312(where)]TJ 0 -13.55 Td [(the)-316(smo)-28(othed)-316(aggregation)-315(is)-316(applied)-316(lo)-28(cally)-316(to)-316(eac)28(h)-316(submatrix)-316([)]TJ 1 0 0 rg 1 0 0 RG - [(24)]TJ + [(25)]TJ 0 g 0 G [(].)-438(A)-316(brief)-316(description)]TJ 0 -13.549 Td [(of)-333(the)-333(AMG)-333(prec)-1(on)1(ditioners)-334(implemen)28(ted)-333(in)-333(MLD2P4)-333(is)-333(giv)27(en)-333(in)-333(Sections)]TJ 0 0 1 rg 0 0 1 RG @@ -1955,7 +1955,7 @@ BT 0 g 0 G -398.511 -19.516 Td [(where)]TJ/F22 10.9091 Tf 32.496 0 Td [(A)]TJ/F15 10.9091 Tf 12.796 0 Td [(=)-423(\050)]TJ/F22 10.9091 Tf 17.342 0 Td [(a)]TJ/F23 7.9701 Tf 5.767 -1.636 Td [(ij)]TJ/F15 10.9091 Tf 7.265 1.636 Td [(\051)]TJ/F25 10.9091 Tf 8.857 0 Td [(2)]TJ/F34 10.9091 Tf 11.888 0 Td [(R)]TJ/F23 7.9701 Tf 7.878 3.959 Td [(n)]TJ/F26 7.9701 Tf 5.139 0 Td [(\002)]TJ/F23 7.9701 Tf 6.586 0 Td [(n)]TJ/F15 10.9091 Tf 10.223 -3.959 Td [(is)-421(a)-420(nonsingular)-420(sparse)-421(matrix;)-464(for)-420(ease)-421(of)-420(presen)28(tation)-421(w)28(e)]TJ -126.237 -13.549 Td [(assume)]TJ/F22 10.9091 Tf 37.697 0 Td [(A)]TJ/F15 10.9091 Tf 11.818 0 Td [(has)-333(a)-334(symmetric)-333(sparsit)28(y)-334(pattern.)]TJ -32.579 -13.549 Td [(Let)-468(us)-469(consider)-468(as)-468(\014nest)-469(ind)1(e)-1(x)-468(space)-468(the)-468(s)-1(et)-468(of)-468(ro)28(w)-469(\050column\051)-468(indices)-468(of)]TJ/F22 10.9091 Tf 361.856 0 Td [(A)]TJ/F15 10.9091 Tf 8.182 0 Td [(,)-502(i.e.,)]TJ -386.974 -13.55 Td [(\012)-377(=)]TJ/F25 10.9091 Tf 24.593 0 Td [(f)]TJ/F15 10.9091 Tf 5.454 0 Td [(1)]TJ/F22 10.9091 Tf 5.455 0 Td [(;)]TJ/F15 10.9091 Tf 4.848 0 Td [(2)]TJ/F22 10.9091 Tf 5.455 0 Td [(;)-167(:)-166(:)-167(:)-167(;)-166(n)]TJ/F25 10.9091 Tf 30.79 0 Td [(g)]TJ/F15 10.9091 Tf 5.455 0 Td [(.)-623(An)28(y)-393(algebraic)-393(m)27(ultilev)28(el)-393(preconditioners)-393(implemen)28(ted)-393(in)-393(MLD2P4)]TJ -82.05 -13.549 Td [(generates)-333(a)-334(hierarc)28(h)28(y)-333(of)-334(index)-333(spaces)-333(and)-334(a)-333(corresp)-28(onding)-333(hierarc)28(h)28(y)-334(of)-333(matrices,)]TJ 81.377 -23.491 Td [(\012)]TJ/F20 7.9701 Tf 7.879 4.505 Td [(1)]TJ/F25 10.9091 Tf 7.762 -4.505 Td [(\021)]TJ/F15 10.9091 Tf 11.515 0 Td [(\012)]TJ/F25 10.9091 Tf 10.909 0 Td [(\033)]TJ/F15 10.9091 Tf 11.515 0 Td [(\012)]TJ/F20 7.9701 Tf 7.879 4.505 Td [(2)]TJ/F25 10.9091 Tf 7.763 -4.505 Td [(\033)]TJ/F22 10.9091 Tf 11.515 0 Td [(:)-167(:)-166(:)]TJ/F25 10.9091 Tf 15.757 0 Td [(\033)]TJ/F15 10.9091 Tf 11.516 0 Td [(\012)]TJ/F23 7.9701 Tf 7.878 4.505 Td [(nl)-12(ev)]TJ/F22 10.9091 Tf 16.597 -4.505 Td [(;)-1167(A)]TJ/F20 7.9701 Tf 23.939 4.505 Td [(1)]TJ/F25 10.9091 Tf 7.763 -4.505 Td [(\021)]TJ/F22 10.9091 Tf 11.515 0 Td [(A;)-167(A)]TJ/F20 7.9701 Tf 21.212 4.505 Td [(2)]TJ/F22 10.9091 Tf 4.732 -4.505 Td [(;)-167(:)-166(:)-167(:)-167(;)-166(A)]TJ/F23 7.9701 Tf 32.424 4.505 Td [(nl)-12(ev)]TJ/F22 10.9091 Tf 16.597 -4.505 Td [(;)]TJ/F15 10.9091 Tf -328.044 -23.49 Td [(b)28(y)-282(using)-282(the)-282(information)-282(con)28(tained)-282(in)]TJ/F22 10.9091 Tf 180.373 0 Td [(A)]TJ/F15 10.9091 Tf 8.182 0 Td [(,)-292(without)-282(assuming)-282(an)27(y)-282(kno)28(wledge)-282(of)-282(the)-282(geom-)]TJ -188.555 -13.55 Td [(etry)-295(of)-294(the)-295(problem)-294(from)-295(whic)28(h)]TJ/F22 10.9091 Tf 150.888 0 Td [(A)]TJ/F15 10.9091 Tf 11.395 0 Td [(originates.)-431(A)-295(v)28(ector)-295(space)]TJ/F34 10.9091 Tf 126.348 0 Td [(R)]TJ/F23 7.9701 Tf 7.879 3.959 Td [(n)]TJ/F24 5.9776 Tf 5.138 -1.406 Td [(k)]TJ/F15 10.9091 Tf 8.285 -2.553 Td [(is)-295(asso)-27(ciate)-1(d)-294(with)-295(\012)]TJ/F23 7.9701 Tf 94.368 3.959 Td [(k)]TJ/F15 10.9091 Tf 5.12 -3.959 Td [(,)]TJ -409.421 -13.549 Td [(where)]TJ/F22 10.9091 Tf 31.714 0 Td [(n)]TJ/F23 7.9701 Tf 6.548 -1.777 Td [(k)]TJ/F15 10.9091 Tf 8.925 1.777 Td [(is)-349(the)-349(size)-348(of)-349(\012)]TJ/F23 7.9701 Tf 71.401 3.959 Td [(k)]TJ/F15 10.9091 Tf 5.12 -3.959 Td [(.)-491(F)84(or)-349(all)]TJ/F22 10.9091 Tf 43.449 0 Td [(k)-335(<)-304(nl)-19(ev)]TJ/F15 10.9091 Tf 41.907 0 Td [(,)-353(a)-348(restriction)-349(op)-28(erator)-349(and)-348(a)-349(prolongation)]TJ -209.064 -13.549 Td [(one)-333(are)-334(built,)-333(whic)28(h)-333(connect)-334(t)28(w)28(o)-334(l)1(e)-1(v)28(els)]TJ/F22 10.9091 Tf 188.273 0 Td [(k)]TJ/F15 10.9091 Tf 9.659 0 Td [(and)]TJ/F22 10.9091 Tf 21.212 0 Td [(k)]TJ/F15 10.9091 Tf 8.447 0 Td [(+)-222(1:)]TJ/F22 10.9091 Tf -101.285 -23.491 Td [(P)]TJ/F23 7.9701 Tf 8.519 4.504 Td [(k)]TJ/F25 10.9091 Tf 8.15 -4.504 Td [(2)]TJ/F34 10.9091 Tf 10.303 0 Td [(R)]TJ/F23 7.9701 Tf 7.879 4.504 Td [(n)]TJ/F24 5.9776 Tf 5.138 -1.405 Td [(k)]TJ/F26 7.9701 Tf 4.573 1.405 Td [(\002)]TJ/F23 7.9701 Tf 6.587 0 Td [(n)]TJ/F24 5.9776 Tf 5.138 -1.405 Td [(k)]TJ/F21 5.9776 Tf 4.075 0 Td [(+1)]TJ/F22 10.9091 Tf 10.239 -3.099 Td [(;)-1167(R)]TJ/F23 7.9701 Tf 24.125 4.504 Td [(k)]TJ/F25 10.9091 Tf 8.15 -4.504 Td [(2)]TJ/F34 10.9091 Tf 10.303 0 Td [(R)]TJ/F23 7.9701 Tf 7.879 4.504 Td [(n)]TJ/F24 5.9776 Tf 5.138 -1.405 Td [(k)]TJ/F21 5.9776 Tf 4.075 0 Td [(+1)]TJ/F26 7.9701 Tf 9.741 1.405 Td [(\002)]TJ/F23 7.9701 Tf 6.587 0 Td [(n)]TJ/F24 5.9776 Tf 5.138 -1.405 Td [(k)]TJ/F15 10.9091 Tf 5.071 -3.099 Td [(;)]TJ -283.114 -23.491 Td [(the)-282(matrix)]TJ/F22 10.9091 Tf 53.146 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.959 Td [(k)]TJ/F20 7.9701 Tf 4.621 0 Td [(+1)]TJ/F15 10.9091 Tf 14.392 -3.959 Td [(is)-282(computed)-281(b)27(y)-281(using)-282(the)-282(previou)1(s)-282(op)-28(erators)-282(according)-281(to)-282(the)-282(Galerkin)]TJ -80.341 -13.549 Td [(approac)28(h,)-333(i.e.,)]TJ/F22 10.9091 Tf 165.163 -13.549 Td [(A)]TJ/F23 7.9701 Tf 8.182 4.504 Td [(k)]TJ/F20 7.9701 Tf 4.621 0 Td [(+1)]TJ/F15 10.9091 Tf 14.349 -4.504 Td [(=)]TJ/F22 10.9091 Tf 11.515 0 Td [(R)]TJ/F23 7.9701 Tf 8.368 4.504 Td [(k)]TJ/F22 10.9091 Tf 5.12 -4.504 Td [(A)]TJ/F23 7.9701 Tf 8.181 4.504 Td [(k)]TJ/F22 10.9091 Tf 5.12 -4.504 Td [(P)]TJ/F23 7.9701 Tf 8.519 4.504 Td [(k)]TJ/F22 10.9091 Tf 5.12 -4.504 Td [(:)]TJ/F15 10.9091 Tf -244.258 -19.516 Td [(In)-476(the)-477(curren)28(t)-476(implemen)28(tation)-477(of)-476(MLD2P4)-476(w)28(e)-477(ha)28(v)28(e)]TJ/F22 10.9091 Tf 261.479 0 Td [(R)]TJ/F23 7.9701 Tf 8.368 3.958 Td [(k)]TJ/F15 10.9091 Tf 10.749 -3.958 Td [(=)-516(\050)]TJ/F22 10.9091 Tf 18.358 0 Td [(P)]TJ/F23 7.9701 Tf 8.519 3.958 Td [(k)]TJ/F15 10.9091 Tf 5.119 -3.958 Td [(\051)]TJ/F23 7.9701 Tf 4.243 3.958 Td [(T)]TJ/F15 10.9091 Tf 11.801 -3.958 Td [(A)-476(smo)-28(other)-476(with)]TJ -328.636 -13.55 Td [(iteration)-441(matrix)]TJ/F22 10.9091 Tf 82.101 0 Td [(M)]TJ/F23 7.9701 Tf 11.773 3.959 Td [(k)]TJ/F15 10.9091 Tf 9.928 -3.959 Td [(is)-441(set)-441(up)-440(at)-441(eac)28(h)-441(lev)28(el)]TJ/F22 10.9091 Tf 113.517 0 Td [(k)-488(<)-457(nl)-20(ev)]TJ/F15 10.9091 Tf 45.251 0 Td [(,)-468(and)-440(a)-441(solv)28(er)-441(is)-441(set)-441(up)-440(at)-441(the)]TJ -262.57 -13.549 Td [(coarsest)-369(lev)28(el,)-378(so)-368(that)-369(they)-369(are)-369(ready)-368(for)-369(application)-369(\050for)-368(example,)-378(setting)-369(up)-368(a)-369(solv)28(er)]TJ 0 -13.549 Td [(based)-292(on)-291(the)]TJ/F22 10.9091 Tf 62.938 0 Td [(LU)]TJ/F15 10.9091 Tf 19.243 0 Td [(factorization)-292(means)-291(computing)-292(and)-291(storing)-292(the)]TJ/F22 10.9091 Tf 224.422 0 Td [(L)]TJ/F15 10.9091 Tf 10.605 0 Td [(and)]TJ/F22 10.9091 Tf 20.757 0 Td [(U)]TJ/F15 10.9091 Tf 11.819 0 Td [(factors\051.)-431(The)]TJ -349.784 -13.549 Td [(construction)-345(of)-344(the)-345(hierarc)28(h)27(y)-344(of)-345(AMG)-345(comp)-28(on)1(e)-1(n)28(ts)-345(d)1(e)-1(scrib)-27(ed)-345(so)-345(far)-345(corresp)-27(onds)-345(to)-345(the)]TJ 0 -13.549 Td [(so-called)-333(build)-334(ph)1(as)-1(e)-333(of)-333(the)-334(p)1(rec)-1(on)1(ditioner.)]TJ 16.936 -13.55 Td [(The)-359(com)-1(p)-27(onen)28(ts)-360(pro)-28(du)1(c)-1(ed)-359(in)-359(the)-360(build)-359(phase)-359(ma)27(y)-359(b)-28(e)-359(com)28(bined)-360(in)-359(sev)28(eral)-360(w)28(a)28(ys)-360(to)]TJ -16.936 -13.549 Td [(obtain)-306(di\013eren)28(t)-306(m)27(ultilev)28(el)-306(preconditioners;)-315(this)-306(is)-306(done)-307(in)-306(the)-306(application)-306(phase,)-312(i)1(.e)-1(.)1(,)-312(in)]TJ 0 -13.549 Td [(the)-391(computation)-391(of)-391(a)-391(v)27(ector)-391(of)-391(t)28(yp)-28(e)]TJ/F22 10.9091 Tf 178.081 0 Td [(w)]TJ/F15 10.9091 Tf 12.185 0 Td [(=)]TJ/F22 10.9091 Tf 12.566 0 Td [(B)]TJ/F26 7.9701 Tf 8.822 3.959 Td [(\000)]TJ/F20 7.9701 Tf 6.586 0 Td [(1)]TJ/F22 10.9091 Tf 4.732 -3.959 Td [(v)]TJ/F15 10.9091 Tf 5.68 0 Td [(,)-406(where)]TJ/F22 10.9091 Tf 39.631 0 Td [(B)]TJ/F15 10.9091 Tf 13.089 0 Td [(denotes)-391(the)-391(preconditioner,)]TJ -281.372 -13.549 Td [(usually)-334(with)1(in)-334(an)-334(iteration)-333(of)-334(a)-334(Kr)1(ylo)27(v)-333(solv)27(er)-333([)]TJ 1 0 0 rg 1 0 0 RG - [(20)]TJ + [(21)]TJ 0 g 0 G [(].)-446(An)-333(example)-334(of)-333(s)-1(u)1(c)27(h)-333(a)-334(com)28(bination,)]TJ 0 -13.549 Td [(kno)28(wn)-448(as)-448(V-cycle,)-476(is)-448(giv)28(en)-448(in)-447(Figure)]TJ 0 0 1 rg 0 0 1 RG @@ -1967,7 +1967,7 @@ BT 0 g 0 G [(],)-334(and)-333(a)-333(v)28(e)-1(r)1(s)-1(ion)-333(of)-333(the)-333(K-cyc)-1(l)1(e)-334(describ)-28(ed)-333(in)-333([)]TJ 1 0 0 rg 1 0 0 RG - [(19)]TJ + [(20)]TJ 0 g 0 G [(].)]TJ/F17 11.9552 Tf 0 -29.053 Td [(4.2)-1125(Smo)-31(othed)-375(Aggregation)]TJ/F15 10.9091 Tf 0 -20.595 Td [(In)-374(order)-374(to)-374(de\014ne)-374(the)-375(prolongator)]TJ/F22 10.9091 Tf 167.339 0 Td [(P)]TJ/F23 7.9701 Tf 8.519 3.959 Td [(k)]TJ/F15 10.9091 Tf 5.12 -3.959 Td [(,)-384(used)-375(to)-374(compute)-374(the)-374(coarse-lev)28(el)-375(matrix)]TJ/F22 10.9091 Tf 204.32 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.959 Td [(k)]TJ/F20 7.9701 Tf 4.622 0 Td [(+1)]TJ/F15 10.9091 Tf 11.319 -3.959 Td [(,)]TJ -409.421 -13.549 Td [(MLD2P4)-319(uses)-320(the)-319(smo)-28(othed)-319(aggregation)-319(algorithm)-320(describ)-27(ed)-320(in)-319([)]TJ 1 0 0 rg 1 0 0 RG @@ -1975,7 +1975,7 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-319(25)]TJ + [-319(26)]TJ 0 g 0 G [(].)-440(The)-319(basic)-320(idea)]TJ 0 -13.549 Td [(of)-270(this)-271(algorithm)-270(is)-271(to)-270(build)-270(a)-271(coarse)-270(se)-1(t)-270(of)-270(indices)-271(\012)]TJ/F23 7.9701 Tf 243.122 3.959 Td [(k)]TJ/F20 7.9701 Tf 4.621 0 Td [(+1)]TJ/F15 10.9091 Tf 14.27 -3.959 Td [(b)28(y)-271(suitabl)1(y)-271(grouping)-270(the)-271(indices)]TJ -262.013 -13.549 Td [(of)-350(\012)]TJ/F23 7.9701 Tf 20.481 3.959 Td [(k)]TJ/F15 10.9091 Tf 8.934 -3.959 Td [(in)28(to)-350(disjoin)28(t)-350(sub)1(s)-1(ets)-349(\050aggregates\051,)-354(and)-350(to)-349(de\014ne)-350(the)-349(coarse)-1(-to-\014n)1(e)-350(space)-350(transfer)]TJ 0 g 0 G @@ -2038,7 +2038,7 @@ BT 0 g 0 G [-500(application)-333(of)]TJ/F22 10.9091 Tf 82.727 0 Td [(P)]TJ/F23 7.9701 Tf 8.519 3.958 Td [(k)]TJ/F15 10.9091 Tf 8.756 -3.958 Td [(and)]TJ/F22 10.9091 Tf 21.212 0 Td [(R)]TJ/F23 7.9701 Tf 8.368 3.958 Td [(k)]TJ/F15 10.9091 Tf 8.15 -3.958 Td [(=)-278(\050)]TJ/F22 10.9091 Tf 15.757 0 Td [(P)]TJ/F23 7.9701 Tf 8.519 3.958 Td [(k)]TJ/F15 10.9091 Tf 5.12 -3.958 Td [(\051)]TJ/F23 7.9701 Tf 4.242 3.958 Td [(T)]TJ/F15 10.9091 Tf 10.241 -3.958 Td [(to)-333(build)]TJ/F22 10.9091 Tf 41.212 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.958 Td [(k)]TJ/F20 7.9701 Tf 4.622 0 Td [(+1)]TJ/F15 10.9091 Tf 11.319 -3.958 Td [(.)]TJ -243.343 -23.467 Td [(In)-407(order)-407(to)-407(p)-28(erform)-407(the)-407(coarsening)-407(s)-1(tep,)-425(the)-407(smo)-28(othed)-407(aggregation)-407(algorithm)-407(de-)]TJ -16.937 -13.549 Td [(scrib)-28(ed)-478(in)-478([)]TJ 1 0 0 rg 1 0 0 RG - [(25)]TJ + [(26)]TJ 0 g 0 G [(])-479(is)-478(used.)-879(In)-479(this)-478(algorithm,)-514(eac)27(h)-478(index)]TJ/F22 10.9091 Tf 271.801 0 Td [(j)]TJ/F25 10.9091 Tf 10.783 0 Td [(2)]TJ/F15 10.9091 Tf 12.939 0 Td [(\012)]TJ/F23 7.9701 Tf 7.879 3.959 Td [(k)]TJ/F20 7.9701 Tf 4.622 0 Td [(+1)]TJ/F15 10.9091 Tf 16.537 -3.959 Td [(corresp)-28(onds)-478(to)-478(an)]TJ -324.561 -13.549 Td [(aggregate)-374(\012)]TJ/F23 7.9701 Tf 57.445 3.958 Td [(k)]TJ 0 -7.014 Td [(j)]TJ/F15 10.9091 Tf 9.201 3.056 Td [(of)-374(\012)]TJ/F23 7.9701 Tf 20.747 3.958 Td [(k)]TJ/F15 10.9091 Tf 5.12 -3.958 Td [(,)-384(consisting)-374(of)-374(a)-374(s)-1(u)1(itably)-374(c)27(hosen)-374(index)]TJ/F22 10.9091 Tf 187.709 0 Td [(i)]TJ/F25 10.9091 Tf 7.529 0 Td [(2)]TJ/F15 10.9091 Tf 11.044 0 Td [(\012)]TJ/F23 7.9701 Tf 7.879 3.958 Td [(k)]TJ/F15 10.9091 Tf 9.201 -3.958 Td [(and)-374(indices)-374(that)-374(are)]TJ -315.875 -13.55 Td [(\050usually\051)-333(con)28(tained)-334(in)-333(a)-333(strongly-coupled)-334(n)1(e)-1(igh)28(b)-27(oro)-28(o)-28(d)-333(of)]TJ/F22 10.9091 Tf 274.122 0 Td [(i)]TJ/F15 10.9091 Tf 3.758 0 Td [(,)-333(i.e.,)]TJ -194.032 -31.214 Td [(\012)]TJ/F23 7.9701 Tf 7.879 4.505 Td [(k)]TJ 0 -7.202 Td [(j)]TJ/F25 10.9091 Tf 8.15 2.697 Td [(\032)-278(N)]TJ/F23 7.9701 Tf 22.073 4.505 Td [(k)]TJ -1.607 -7.202 Td [(i)]TJ/F15 10.9091 Tf 6.727 2.697 Td [(\050)]TJ/F22 10.9091 Tf 4.242 0 Td [(\022)]TJ/F15 10.9091 Tf 5.425 0 Td [(\051)-278(=)]TJ/F28 10.9091 Tf 18.788 15.382 Td [(\032)]TJ/F22 10.9091 Tf 8.181 -15.382 Td [(r)]TJ/F25 10.9091 Tf 8.255 0 Td [(2)]TJ/F15 10.9091 Tf 10.303 0 Td [(\012)]TJ/F23 7.9701 Tf 7.879 4.505 Td [(k)]TJ/F15 10.9091 Tf 8.15 -4.505 Td [(:)]TJ/F25 10.9091 Tf 6.061 0 Td [(j)]TJ/F22 10.9091 Tf 3.03 0 Td [(a)]TJ/F23 7.9701 Tf 5.766 4.505 Td [(k)]TJ 0 -7.202 Td [(ir)]TJ/F25 10.9091 Tf 7.438 2.697 Td [(j)]TJ/F22 10.9091 Tf 6.061 0 Td [(>)-278(\022)]TJ/F28 10.9091 Tf 16.939 13.424 Td [(q)]TJ ET @@ -2053,7 +2053,7 @@ BT 0 g 0 G -398.512 -31.214 Td [(for)-431(a)-430(giv)27(en)-430(threshold)]TJ/F22 10.9091 Tf 106.493 0 Td [(\022)]TJ/F25 10.9091 Tf 10.225 0 Td [(2)]TJ/F15 10.9091 Tf 12.074 0 Td [([0)]TJ/F22 10.9091 Tf 8.485 0 Td [(;)]TJ/F15 10.9091 Tf 4.848 0 Td [(1])-431(\050see)-431([)]TJ 1 0 0 rg 1 0 0 RG - [(25)]TJ + [(26)]TJ 0 g 0 G [(])-430(for)-431(the)-431(details\051.)-736(Since)-431(this)-431(algorithm)-430(has)-431(a)]TJ -142.125 -13.549 Td [(sequen)28(tial)-382(n)1(ature,)-394(a)-381(decoupled)-381(v)28(e)-1(r)1(s)-1(i)1(on)-382(of)-381(it)-381(is)-382(appli)1(e)-1(d,)-393(where)-381(eac)28(h)-382(pro)-27(ces)-1(sor)-381(indep)-28(en-)]TJ 0 -13.549 Td [(den)28(tly)-433(exe)-1(cutes)-433(the)-433(algorithm)-433(on)-434(the)-433(set)-433(of)-434(indices)-433(assigned)-433(to)-434(it)-433(in)-433(the)-433(initial)-434(data)]TJ 0 -13.549 Td [(distribution.)-442(Thi)1(s)-326(v)28(ersion)-325(is)-326(em)28(barrassingly)-325(parallel,)-327(since)-325(it)-326(do)-27(es)-326(not)-325(require)-325(an)27(y)-325(data)]TJ 0 -13.55 Td [(comm)28(unication.)-522(On)-359(the)-359(other)-359(hand,)-365(it)-360(ma)28(y)-359(pro)-28(du)1(c)-1(e)-359(some)-359(non)28(uniform)-359(aggregates)-359(and)]TJ 0 -13.549 Td [(is)-295(strongly)-295(dep)-27(enden)27(t)-294(on)-295(the)-295(n)28(um)28(b)-28(er)-295(of)-295(pro)-27(cess)-1(or)1(s)-295(and)-295(on)-295(the)-295(initial)-294(partitioning)-295(of)-295(the)]TJ 0 -13.549 Td [(matrix)]TJ/F22 10.9091 Tf 35.775 0 Td [(A)]TJ/F15 10.9091 Tf 8.182 0 Td [(.)-524(Nev)28(e)-1(rt)1(hele)-1(ss,)-366(this)-360(parallel)-360(algorithm)-360(has)-360(b)-27(ee)-1(n)-359(c)27(hosen)-360(for)-359(MLD2P4,)-367(since)-360(it)]TJ -43.957 -13.549 Td [(has)-333(b)-28(een)-333(s)-1(h)1(o)27(wn)-333(to)-333(pro)-28(duce)-333(go)-28(o)-28(d)-333(results)-334(in)-333(practice)-333([)]TJ 1 0 0 rg 1 0 0 RG @@ -2065,7 +2065,7 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-334(24)]TJ + [-334(25)]TJ 0 g 0 G [(].)]TJ 0 g 0 G @@ -2093,7 +2093,7 @@ BT 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-293(23)]TJ + [-293(24)]TJ 0 g 0 G [(].)-431(A)-294(simple)-293(c)28(hoice)]TJ 0 -13.549 Td [(for)]TJ/F22 10.9091 Tf 16.697 0 Td [(S)]TJ/F23 7.9701 Tf 7.318 3.959 Td [(k)]TJ/F15 10.9091 Tf 8.756 -3.959 Td [(is)-333(the)-334(damp)-27(ed)-334(Jacobi)-333(smo)-28(other:)]TJ/F22 10.9091 Tf 118.068 -22.041 Td [(S)]TJ/F23 7.9701 Tf 7.318 4.505 Td [(k)]TJ/F15 10.9091 Tf 8.15 -4.505 Td [(=)]TJ/F22 10.9091 Tf 11.515 0 Td [(I)]TJ/F25 10.9091 Tf 8.076 0 Td [(\000)]TJ/F22 10.9091 Tf 10.909 0 Td [(!)]TJ/F23 7.9701 Tf 7.182 4.505 Td [(k)]TJ/F15 10.9091 Tf 5.119 -4.505 Td [(\050)]TJ/F22 10.9091 Tf 4.243 0 Td [(D)]TJ/F23 7.9701 Tf 9.335 4.505 Td [(k)]TJ/F15 10.9091 Tf 5.119 -4.505 Td [(\051)]TJ/F26 7.9701 Tf 4.243 4.505 Td [(\000)]TJ/F20 7.9701 Tf 6.586 0 Td [(1)]TJ/F22 10.9091 Tf 4.733 -4.505 Td [(A)]TJ/F23 7.9701 Tf 8.181 4.505 Td [(k)]TJ 0 -7.202 Td [(F)]TJ/F22 10.9091 Tf 7.034 2.697 Td [(;)]TJ/F15 10.9091 Tf -258.582 -22.04 Td [(where)]TJ/F22 10.9091 Tf 32.045 0 Td [(D)]TJ/F23 7.9701 Tf 9.335 3.958 Td [(k)]TJ/F15 10.9091 Tf 9.255 -3.958 Td [(is)-379(the)-379(diagonal)-379(matrix)-379(with)-379(the)-379(s)-1(ame)-379(diagonal)-379(en)28(tries)-379(as)]TJ/F22 10.9091 Tf 276.813 0 Td [(A)]TJ/F23 7.9701 Tf 8.181 3.958 Td [(k)]TJ/F15 10.9091 Tf 5.12 -3.958 Td [(,)]TJ/F22 10.9091 Tf 7.291 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.958 Td [(k)]TJ 0 -7.191 Td [(F)]TJ/F15 10.9091 Tf 10.896 3.233 Td [(=)-354(\050)-14(\026)]TJ/F22 10.9091 Tf 16.59 0 Td [(a)]TJ/F23 7.9701 Tf 5.766 3.958 Td [(k)]TJ 0 -7.014 Td [(ij)]TJ/F15 10.9091 Tf 7.266 3.056 Td [(\051)-379(is)]TJ -396.74 -13.55 Td [(the)-333(\014ltered)-334(matrix)-333(de\014ned)-333(as)]TJ 48.968 -26.039 Td [(\026)]TJ/F22 10.9091 Tf -0.156 0 Td [(a)]TJ/F23 7.9701 Tf 5.766 4.505 Td [(k)]TJ 0 -7.202 Td [(ij)]TJ/F15 10.9091 Tf 10.296 2.697 Td [(=)]TJ/F28 10.9091 Tf 11.515 15.382 Td [(\032)]TJ/F22 10.9091 Tf 13.163 -8.324 Td [(a)]TJ/F23 7.9701 Tf 5.766 3.959 Td [(k)]TJ 0 -7.015 Td [(ij)]TJ/F15 10.9091 Tf 17.228 3.056 Td [(if)]TJ/F22 10.9091 Tf 10 0 Td [(j)]TJ/F25 10.9091 Tf 8.147 0 Td [(2)-278(N)]TJ/F23 7.9701 Tf 20.862 3.959 Td [(k)]TJ -1.608 -7.015 Td [(i)]TJ/F15 10.9091 Tf 6.728 3.056 Td [(\050)]TJ/F22 10.9091 Tf 4.242 0 Td [(\022)]TJ/F15 10.9091 Tf 5.424 0 Td [(\051)]TJ/F22 10.9091 Tf 4.243 0 Td [(;)]TJ/F15 10.9091 Tf -81.032 -14.09 Td [(0)-1608(otherwise)]TJ/F22 10.9091 Tf 67.934 0 Td [(;)]TJ/F15 10.9091 Tf 27.153 7.032 Td [(\050)]TJ/F22 10.9091 Tf 4.243 0 Td [(j)]TJ/F25 10.9091 Tf 8.147 0 Td [(6)]TJ/F15 10.9091 Tf 0 0 Td [(=)]TJ/F22 10.9091 Tf 11.515 0 Td [(i)]TJ/F15 10.9091 Tf 3.758 0 Td [(\051)]TJ/F22 10.9091 Tf 4.243 0 Td [(;)]TJ/F15 10.9091 Tf 26.822 0 Td [(\026)]TJ/F22 10.9091 Tf -0.156 0 Td [(a)]TJ/F23 7.9701 Tf 5.767 4.505 Td [(k)]TJ 0 -7.202 Td [(ii)]TJ/F15 10.9091 Tf 9.294 2.697 Td [(=)]TJ/F22 10.9091 Tf 11.516 0 Td [(a)]TJ/F23 7.9701 Tf 5.766 4.505 Td [(k)]TJ 0 -7.202 Td [(ii)]TJ/F25 10.9091 Tf 8.689 2.697 Td [(\000)]TJ/F28 10.9091 Tf 10.909 10.364 Td [(X)]TJ/F23 7.9701 Tf 1.202 -23.717 Td [(j)]TJ/F26 7.9701 Tf 3.884 0 Td [(6)]TJ/F20 7.9701 Tf 0 0 Td [(=)]TJ/F23 7.9701 Tf 6.586 0 Td [(i)]TJ/F15 10.9091 Tf 4.085 13.353 Td [(\050)]TJ/F22 10.9091 Tf 4.243 0 Td [(a)]TJ/F23 7.9701 Tf 5.766 4.505 Td [(k)]TJ 0 -7.202 Td [(ij)]TJ/F25 10.9091 Tf 9.69 2.697 Td [(\000)]TJ/F15 10.9091 Tf 11.065 0 Td [(\026)]TJ/F22 10.9091 Tf -0.156 0 Td [(a)]TJ/F23 7.9701 Tf 5.766 4.505 Td [(k)]TJ 0 -7.202 Td [(ij)]TJ/F15 10.9091 Tf 7.265 2.697 Td [(\051)]TJ/F22 10.9091 Tf 4.243 0 Td [(;)]TJ 0 g 0 G @@ -2105,11 +2105,11 @@ BT 0 g 0 G [(].)]TJ -397.906 -13.549 Td [(In)-288(MLD2P4)-288(this)-287(appro)27(ximation)-287(is)-288(obtained)-288(b)28(y)-288(using)]TJ/F25 10.9091 Tf 250.336 0 Td [(k)]TJ/F22 10.9091 Tf 5.455 0 Td [(A)]TJ/F23 7.9701 Tf 8.181 3.959 Td [(k)]TJ 0 -7.192 Td [(F)]TJ/F25 10.9091 Tf 7.034 3.233 Td [(k)]TJ/F26 7.9701 Tf 5.454 -1.636 Td [(1)]TJ/F15 10.9091 Tf 12.107 1.636 Td [(as)-288(an)-288(estimate)-288(of)]TJ/F22 10.9091 Tf 82.683 0 Td [(\032)]TJ/F23 7.9701 Tf 5.641 3.959 Td [(k)]TJ/F15 10.9091 Tf 5.119 -3.959 Td [(.)-429(Note)]TJ -382.01 -13.549 Td [(that)-373(for)-373(systems)-374(coming)-373(from)-373(uniformly)-373(elliptic)-373(problems,)-384(\014)1(ltering)-374(the)-373(matrix)]TJ/F22 10.9091 Tf 379.26 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.959 Td [(k)]TJ/F15 10.9091 Tf 9.191 -3.959 Td [(has)]TJ -396.633 -13.549 Td [(little)-306(or)-306(no)-306(e\013ect,)-312(and)]TJ/F22 10.9091 Tf 106.178 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.958 Td [(k)]TJ/F15 10.9091 Tf 8.459 -3.958 Td [(can)-306(b)-28(e)-306(used)-306(instead)-306(of)]TJ/F22 10.9091 Tf 108.331 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.958 Td [(k)]TJ 0 -7.191 Td [(F)]TJ/F15 10.9091 Tf 7.033 3.233 Td [(.)-435(The)-306(latter)-306(c)27(hoice)-306(is)-306(the)-306(default)-306(in)]TJ -246.365 -13.55 Td [(MLD2P4.)]TJ/F17 11.9552 Tf 0 -28.825 Td [(4.3)-1125(Smo)-31(others)-375(and)-375(coarsest-lev)31(el)-375(solv)31(ers)]TJ/F15 10.9091 Tf 0 -20.594 Td [(The)-294(smo)-28(others)-294(implemen)28(ted)-295(i)1(n)-295(MLD2P4)-294(include)-294(the)-294(Jacobi)-294(and)-294(blo)-28(c)28(k-Jacobi)-294(metho)-28(ds,)]TJ 0 -13.549 Td [(a)-344(h)28(ybrid)-343(v)28(e)-1(r)1(s)-1(ion)-343(of)-344(the)-343(forw)28(ard)-344(and)-344(b)1(ac)27(kw)28(ard)-344(Gau)1(s)-1(s-Seidel)-343(metho)-28(ds,)-346(and)-344(the)-343(additiv)28(e)]TJ 0 -13.55 Td [(Sc)28(h)28(w)27(arz)-333(\050AS\051)-333(ones)-334(\050see,)-333(e.g.,)-333([)]TJ 1 0 0 rg 1 0 0 RG - [(20)]TJ + [(21)]TJ 0 g 0 G [(,)]TJ 1 0 0 rg 1 0 0 RG - [-334(21)]TJ + [-334(22)]TJ 0 g 0 G [(]\051.)]TJ 16.936 -13.549 Td [(The)-481(h)28(ybrid)-480(Gauss-Seidel)-481(v)28(ersion)-481(is)-480(considered)-481(b)-27(ecause)-481(the)-481(origin)1(al)-481(Gauss-Seidel)]TJ -16.936 -13.549 Td [(metho)-28(d)-364(is)-365(inheren)28(tly)-364(sequen)27(tial.)-537(A)27(t)-364(eac)28(h)-365(iteration)-364(of)-365(the)-364(h)28(ybrid)-365(v)28(ersion,)-372(eac)27(h)-364(parallel)]TJ 0 -13.549 Td [(pro)-28(cess)-452(uses)-452(the)-451(mos)-1(t)-451(recen)27(t)-451(v)55(alues)-452(of)-452(i)1(ts)-452(o)27(wn)-451(lo)-28(cal)-452(v)56(ariables)-452(and)-452(the)-452(v)56(alues)-452(of)-452(the)]TJ 0 -13.549 Td [(non-lo)-28(cal)-418(v)55(ari)1(ables)-419(computed)-418(at)-419(the)-418(previous)-418(iteration,)-440(obtained)-418(b)28(y)-419(exc)28(hanging)-418(data)]TJ 0 -13.55 Td [(with)-333(other)-334(pr)1(o)-28(cesses)-334(b)-28(efore)-333(the)-333(b)-28(eginning)-333(of)-334(th)1(e)-334(curren)28(t)-333(iteration.)]TJ 16.936 -13.549 Td [(In)-372(the)-372(AS)-372(me)-1(th)1(o)-28(ds,)-382(the)-372(index)-372(space)-373(\012)]TJ/F23 7.9701 Tf 185.618 3.959 Td [(k)]TJ/F15 10.9091 Tf 9.18 -3.959 Td [(is)-372(divided)-372(in)28(to)]TJ/F22 10.9091 Tf 72.847 0 Td [(m)]TJ/F23 7.9701 Tf 9.578 -1.777 Td [(k)]TJ/F15 10.9091 Tf 9.18 1.777 Td [(subsets)-372(\012)]TJ/F23 7.9701 Tf 46.06 3.959 Td [(k)]TJ 0 -7.014 Td [(i)]TJ/F15 10.9091 Tf 9.18 3.055 Td [(of)-372(size)]TJ/F22 10.9091 Tf 33.939 0 Td [(n)]TJ/F23 7.9701 Tf 6.548 -1.777 Td [(k)-27(;i)]TJ/F15 10.9091 Tf 10.355 1.777 Td [(,)]TJ -409.421 -13.549 Td [(p)-28(ossibly)-432(o)28(v)28(erlapping.)-740(F)83(or)-432(eac)28(h)]TJ/F22 10.9091 Tf 155.272 0 Td [(i)]TJ/F15 10.9091 Tf 8.47 0 Td [(w)28(e)-432(consider)-432(the)-432(restriction)-432(op)-28(erator)]TJ/F22 10.9091 Tf 178.985 0 Td [(R)]TJ/F23 7.9701 Tf 8.367 3.959 Td [(k)]TJ -0.084 -7.014 Td [(i)]TJ/F25 10.9091 Tf 10.027 3.055 Td [(2)]TJ/F34 10.9091 Tf 12.095 0 Td [(R)]TJ/F23 7.9701 Tf 7.879 3.959 Td [(n)]TJ/F24 5.9776 Tf 5.138 -1.406 Td [(k)-21(;i)]TJ/F26 7.9701 Tf 9.506 1.406 Td [(\002)]TJ/F23 7.9701 Tf 6.587 0 Td [(n)]TJ/F24 5.9776 Tf 5.138 -1.406 Td [(k)]TJ/F15 10.9091 Tf -407.38 -16.102 Td [(that)-366(maps)-366(a)-365(v)27(ector)]TJ/F22 10.9091 Tf 95.448 0 Td [(x)]TJ/F23 7.9701 Tf 6.235 3.959 Td [(k)]TJ/F15 10.9091 Tf 9.11 -3.959 Td [(to)-366(the)-366(v)28(ector)]TJ/F22 10.9091 Tf 65.942 0 Td [(x)]TJ/F23 7.9701 Tf 6.235 3.959 Td [(k)]TJ 0 -7.015 Td [(i)]TJ/F15 10.9091 Tf 9.11 3.056 Td [(made)-366(of)-366(the)-365(com)-1(p)-27(onen)28(ts)-366(of)]TJ/F22 10.9091 Tf 134.56 0 Td [(x)]TJ/F23 7.9701 Tf 6.234 3.959 Td [(k)]TJ/F15 10.9091 Tf 9.111 -3.959 Td [(with)-366(indices)-366(in)]TJ -341.985 -13.549 Td [(\012)]TJ/F23 7.9701 Tf 7.879 3.959 Td [(k)]TJ 0 -7.015 Td [(i)]TJ/F15 10.9091 Tf 5.12 3.056 Td [(,)-301(and)-292(the)-293(prolongation)-292(op)-28(erator)]TJ/F22 10.9091 Tf 152.201 0 Td [(P)]TJ/F23 7.9701 Tf 8.519 3.959 Td [(k)]TJ -1.515 -7.015 Td [(i)]TJ/F15 10.9091 Tf 9.665 3.056 Td [(=)-278(\050)]TJ/F22 10.9091 Tf 15.758 0 Td [(R)]TJ/F23 7.9701 Tf 8.367 3.959 Td [(k)]TJ -0.084 -7.015 Td [(i)]TJ/F15 10.9091 Tf 5.204 3.056 Td [(\051)]TJ/F23 7.9701 Tf 4.242 3.959 Td [(T)]TJ/F15 10.9091 Tf 6.605 -3.959 Td [(.)-431(These)-293(op)-27(erators)-293(are)-293(then)-292(used)-293(to)-292(build)]TJ/F22 10.9091 Tf -221.961 -13.549 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.958 Td [(k)]TJ 0 -7.014 Td [(i)]TJ/F15 10.9091 Tf 8.557 3.056 Td [(=)]TJ/F22 10.9091 Tf 11.923 0 Td [(R)]TJ/F23 7.9701 Tf 8.367 3.958 Td [(k)]TJ -0.084 -7.014 Td [(i)]TJ/F22 10.9091 Tf 5.204 3.056 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.958 Td [(k)]TJ/F22 10.9091 Tf 5.119 -3.958 Td [(P)]TJ/F23 7.9701 Tf 8.519 3.958 Td [(k)]TJ -1.515 -7.014 Td [(i)]TJ/F15 10.9091 Tf 6.635 3.056 Td [(,)-361(whic)27(h)-355(is)-356(the)-356(restriction)-355(of)]TJ/F22 10.9091 Tf 133.83 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.958 Td [(k)]TJ/F15 10.9091 Tf 9.001 -3.958 Td [(to)-356(the)-355(index)-356(space)-356(\012)]TJ/F23 7.9701 Tf 99.523 3.958 Td [(k)]TJ 0 -7.014 Td [(i)]TJ/F15 10.9091 Tf 5.119 3.056 Td [(.)-512(The)-355(class)-1(ical)-355(AS)]TJ -324.744 -13.55 Td [(preconditioner)]TJ/F22 10.9091 Tf 72.182 0 Td [(M)]TJ/F23 7.9701 Tf 11.773 3.959 Td [(k)]TJ -1.19 -7.192 Td [(AS)]TJ/F15 10.9091 Tf 16.074 3.233 Td [(is)-333(de\014ned)-334(as)]TJ 38.283 -31.315 Td [(\050)]TJ/F22 10.9091 Tf 4.243 0 Td [(M)]TJ/F23 7.9701 Tf 11.773 4.504 Td [(k)]TJ -1.19 -7.201 Td [(AS)]TJ/F15 10.9091 Tf 12.437 2.697 Td [(\051)]TJ/F26 7.9701 Tf 4.242 4.504 Td [(\000)]TJ/F20 7.9701 Tf 6.587 0 Td [(1)]TJ/F15 10.9091 Tf 7.763 -4.504 Td [(=)]TJ/F23 7.9701 Tf 13.362 14.072 Td [(m)]TJ/F24 5.9776 Tf 7.49 -1.406 Td [(k)]TJ/F28 10.9091 Tf -9.337 -2.303 Td [(X)]TJ/F23 7.9701 Tf 1.027 -23.45 Td [(i)]TJ/F20 7.9701 Tf 2.883 0 Td [(=1)]TJ/F22 10.9091 Tf 13.665 13.087 Td [(P)]TJ/F23 7.9701 Tf 8.519 4.504 Td [(k)]TJ -1.515 -7.201 Td [(i)]TJ/F15 10.9091 Tf 6.635 2.697 Td [(\050)]TJ/F22 10.9091 Tf 4.243 0 Td [(A)]TJ/F23 7.9701 Tf 8.181 4.504 Td [(k)]TJ 0 -7.201 Td [(i)]TJ/F15 10.9091 Tf 5.12 2.697 Td [(\051)]TJ/F26 7.9701 Tf 4.243 4.504 Td [(\000)]TJ/F20 7.9701 Tf 6.586 0 Td [(1)]TJ/F22 10.9091 Tf 4.732 -4.504 Td [(R)]TJ/F23 7.9701 Tf 8.368 4.504 Td [(k)]TJ -0.084 -7.201 Td [(i)]TJ/F22 10.9091 Tf 5.204 2.697 Td [(;)]TJ 0 g 0 G @@ -3531,7 +3531,7 @@ ET endstream endobj -513 0 obj +514 0 obj << /Length 2620 >> @@ -3564,7 +3564,7 @@ ET endstream endobj -518 0 obj +519 0 obj << /Length 3774 >> @@ -3729,9 +3729,9 @@ Q endstream endobj -523 0 obj +524 0 obj << -/Length 10371 +/Length 10624 >> stream 0 g 0 G @@ -3750,362 +3750,366 @@ q 0 g 0 G 0 g 0 G q -1 0 0 1 0 209.817 cm +1 0 0 1 0 216.592 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q q -1 0 0 1 0 196.069 cm +1 0 0 1 0 202.843 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q 1 0 0 1 -299.826 -121.521 cm BT -/F45 10.9091 Tf 305.803 321.655 Td [(what)]TJ +/F45 10.9091 Tf 305.803 328.429 Td [(what)]TJ ET q -1 0 0 1 422.332 317.59 cm +1 0 0 1 422.332 324.364 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q BT -/F42 10.9091 Tf 428.31 321.655 Td [(d)22(a)67(t)67(a)-378(type)]TJ +/F42 10.9091 Tf 428.31 328.429 Td [(d)22(a)67(t)67(a)-378(type)]TJ ET q -1 0 0 1 521.055 317.59 cm +1 0 0 1 521.055 324.364 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q BT -/F45 10.9091 Tf 527.032 321.655 Td [(val)]TJ +/F45 10.9091 Tf 527.032 328.429 Td [(val)]TJ ET q -1 0 0 1 598.207 317.59 cm +1 0 0 1 598.207 324.364 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q BT -/F42 10.9091 Tf 604.185 321.655 Td [(def)89(a)22(ul)67(t)]TJ +/F42 10.9091 Tf 604.185 328.429 Td [(def)89(a)22(ul)67(t)]TJ ET q -1 0 0 1 692.367 317.59 cm +1 0 0 1 692.367 324.364 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q BT -/F42 10.9091 Tf 698.344 321.655 Td [(comments)]TJ +/F42 10.9091 Tf 698.344 328.429 Td [(comments)]TJ ET q -1 0 0 1 899.912 317.59 cm +1 0 0 1 899.912 324.364 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q q -1 0 0 1 299.826 317.391 cm +1 0 0 1 299.826 324.165 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q q -1 0 0 1 299.826 262.995 cm +1 0 0 1 299.826 269.769 cm []0 d 0 J 0.398 w 0 0 m 0 54.197 l S Q BT -/F45 10.9091 Tf 305.803 307.707 Td [('MIN_COARSE_SIZE')]TJ +/F45 10.9091 Tf 305.803 314.481 Td [('MIN_COARSE_SIZE')]TJ ET q -1 0 0 1 422.332 262.995 cm +1 0 0 1 422.332 269.769 cm []0 d 0 J 0.398 w 0 0 m 0 54.197 l S Q BT -/F45 10.9091 Tf 428.31 307.707 Td [(integer)]TJ +/F45 10.9091 Tf 428.31 314.481 Td [(integer)]TJ ET q -1 0 0 1 521.055 262.995 cm +1 0 0 1 521.055 269.769 cm []0 d 0 J 0.398 w 0 0 m 0 54.197 l S Q BT -/F15 10.9091 Tf 527.032 307.707 Td [(An)28(y)-334(n)28(um)28(b)-28(er)]TJ/F22 10.9091 Tf 0 -13.549 Td [(>)]TJ/F15 10.9091 Tf 11.516 0 Td [(0)]TJ +/F15 10.9091 Tf 527.032 314.481 Td [(An)28(y)-334(n)28(um)28(b)-28(er)]TJ/F22 10.9091 Tf 0 -13.549 Td [(>)]TJ/F15 10.9091 Tf 11.516 0 Td [(0)]TJ ET q -1 0 0 1 598.207 262.995 cm +1 0 0 1 598.207 269.769 cm []0 d 0 J 0.398 w 0 0 m 0 54.197 l S Q BT -/F25 10.9091 Tf 604.185 307.707 Td [(b)]TJ/F15 10.9091 Tf 4.848 0 Td [(40)]TJ/F21 5.9776 Tf 13.939 3.669 Td [(3)]TJ/F25 10.9091 Tf -2.407 4.188 Td [(p)]TJ +/F25 10.9091 Tf 604.185 314.481 Td [(b)]TJ/F15 10.9091 Tf 4.848 0 Td [(40)]TJ/F21 5.9776 Tf 13.939 3.67 Td [(3)]TJ/F25 10.9091 Tf -2.407 4.188 Td [(p)]TJ ET q -1 0 0 1 629.656 315.783 cm +1 0 0 1 629.656 322.557 cm []0 d 0 J 0.436 w 0 0 m 6.548 0 l S Q BT -/F22 10.9091 Tf 629.656 307.707 Td [(n)]TJ/F25 10.9091 Tf 6.548 0 Td [(c)]TJ/F15 10.9091 Tf 4.848 0 Td [(,)-363(where)]TJ/F22 10.9091 Tf 38.789 0 Td [(n)]TJ/F15 10.9091 Tf -75.656 -13.549 Td [(is)-540(the)-540(dimension)]TJ 0 -13.549 Td [(of)-511(the)-511(matrix)-510(at)]TJ 0 -13.55 Td [(the)-333(\014nest)-334(lev)28(el)]TJ +/F22 10.9091 Tf 629.656 314.481 Td [(n)]TJ/F25 10.9091 Tf 6.548 0 Td [(c)]TJ/F15 10.9091 Tf 4.848 0 Td [(,)-363(where)]TJ/F22 10.9091 Tf 38.789 0 Td [(n)]TJ/F15 10.9091 Tf -75.656 -13.549 Td [(is)-540(the)-540(dimension)]TJ 0 -13.549 Td [(of)-511(the)-511(matrix)-510(at)]TJ 0 -13.549 Td [(the)-333(\014nest)-334(lev)28(el)]TJ ET q -1 0 0 1 692.367 262.995 cm +1 0 0 1 692.367 269.769 cm []0 d 0 J 0.398 w 0 0 m 0 54.197 l S Q BT -/F15 10.9091 Tf 698.344 307.707 Td [(Coarse)-475(size)-475(threshold.)-868(The)-475(aggregation)]TJ 0 -13.549 Td [(stops)-531(if)-531(the)-530(global)-531(n)28(um)28(b)-28(er)-531(of)-531(v)56(ariables)]TJ 0 -13.549 Td [(of)-354(the)-355(computed)-354(coarsest)-355(matrix)-354(is)-354(lo)27(w)28(er)]TJ 0 -13.55 Td [(than)-249(or)-248(equal)-249(to)-248(this)-249(threshold)-248(\050see)-249(Note\051.)]TJ +/F15 10.9091 Tf 698.344 314.481 Td [(Coarse)-475(size)-475(threshold.)-868(The)-475(aggregation)]TJ 0 -13.549 Td [(stops)-531(if)-531(the)-530(global)-531(n)28(um)28(b)-28(er)-531(of)-531(v)56(ariables)]TJ 0 -13.549 Td [(of)-354(the)-355(computed)-354(coarsest)-355(matrix)-354(is)-354(lo)27(w)28(er)]TJ 0 -13.549 Td [(than)-249(or)-248(equal)-249(to)-248(this)-249(threshold)-248(\050see)-249(Note\051.)]TJ ET q -1 0 0 1 899.912 262.995 cm +1 0 0 1 899.912 269.769 cm []0 d 0 J 0.398 w 0 0 m 0 54.197 l S Q q -1 0 0 1 299.826 262.795 cm +1 0 0 1 299.826 269.57 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q q -1 0 0 1 299.826 194.85 cm +1 0 0 1 299.826 201.625 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 305.803 253.112 Td [('MIN_CR_RATIO')]TJ +/F45 10.9091 Tf 305.803 259.886 Td [('MIN_CR_RATIO')]TJ ET q -1 0 0 1 422.332 194.85 cm +1 0 0 1 422.332 201.625 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 428.31 253.112 Td [(real)]TJ +/F45 10.9091 Tf 428.31 259.886 Td [(real)]TJ ET q -1 0 0 1 521.055 194.85 cm +1 0 0 1 521.055 201.625 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F15 10.9091 Tf 527.032 253.112 Td [(An)28(y)-334(n)28(um)28(b)-28(er)]TJ/F22 10.9091 Tf 0 -13.55 Td [(>)]TJ/F15 10.9091 Tf 11.516 0 Td [(1)]TJ +/F15 10.9091 Tf 527.032 259.886 Td [(An)28(y)-334(n)28(um)28(b)-28(er)]TJ/F22 10.9091 Tf 0 -13.549 Td [(>)]TJ/F15 10.9091 Tf 11.516 0 Td [(1)]TJ ET q -1 0 0 1 598.207 194.85 cm +1 0 0 1 598.207 201.625 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F15 10.9091 Tf 604.185 253.112 Td [(1.5)]TJ +/F15 10.9091 Tf 604.185 259.886 Td [(1.5)]TJ ET q -1 0 0 1 692.367 194.85 cm +1 0 0 1 692.367 201.625 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F15 10.9091 Tf 698.344 253.112 Td [(Minim)28(um)-325(coarsening)-324(ratio.)-442(The)-324(aggrega-)]TJ 0 -13.55 Td [(tion)-480(stops)-480(if)-480(the)-480(ratio)-480(b)-27(et)27(w)28(een)-480(the)-480(ma-)]TJ 0 -13.549 Td [(trix)-364(dimensions)-364(at)-364(t)27(w)28(o)-364(consecutiv)28(e)-364(lev)27(els)]TJ 0 -13.549 Td [(is)-459(lo)28(w)28(er)-459(th)1(an)-459(or)-458(e)-1(q)1(ual)-459(to)-458(this)-459(threshold)]TJ 0 -13.549 Td [(\050see)-333(Note)-1(\051.)]TJ +/F15 10.9091 Tf 698.344 259.886 Td [(Minim)28(um)-325(coarsening)-324(ratio.)-442(The)-324(aggrega-)]TJ 0 -13.549 Td [(tion)-480(stops)-480(if)-480(the)-480(ratio)-480(b)-27(et)27(w)28(een)-480(the)-480(ma-)]TJ 0 -13.549 Td [(trix)-364(dimensions)-364(at)-364(t)27(w)28(o)-364(consecutiv)28(e)-364(lev)27(els)]TJ 0 -13.549 Td [(is)-459(lo)28(w)28(er)-459(th)1(an)-459(or)-458(e)-1(q)1(ual)-459(to)-458(this)-459(threshold)]TJ 0 -13.55 Td [(\050see)-333(Note)-1(\051.)]TJ ET q -1 0 0 1 899.912 194.85 cm +1 0 0 1 899.912 201.625 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q q -1 0 0 1 299.826 194.651 cm +1 0 0 1 299.826 201.425 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q q -1 0 0 1 299.826 153.804 cm +1 0 0 1 299.826 160.579 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F45 10.9091 Tf 305.803 184.967 Td [('MAX_LEVS')]TJ +/F45 10.9091 Tf 305.803 191.742 Td [('MAX_LEVS')]TJ ET q -1 0 0 1 422.332 153.804 cm +1 0 0 1 422.332 160.579 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F45 10.9091 Tf 428.31 184.967 Td [(integer)]TJ +/F45 10.9091 Tf 428.31 191.742 Td [(integer)]TJ ET q -1 0 0 1 521.055 153.804 cm +1 0 0 1 521.055 160.579 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F15 10.9091 Tf 527.032 184.967 Td [(An)28(y)-334(in)28(teger)]TJ 0 -13.549 Td [(n)28(um)28(b)-28(er)]TJ/F22 10.9091 Tf 39.728 0 Td [(>)]TJ/F15 10.9091 Tf 11.515 0 Td [(1)]TJ +/F15 10.9091 Tf 527.032 191.742 Td [(An)28(y)-334(in)28(teger)]TJ 0 -13.549 Td [(n)28(um)28(b)-28(er)]TJ/F22 10.9091 Tf 39.728 0 Td [(>)]TJ/F15 10.9091 Tf 11.515 0 Td [(1)]TJ ET q -1 0 0 1 598.207 153.804 cm +1 0 0 1 598.207 160.579 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F15 10.9091 Tf 604.185 184.967 Td [(20)]TJ +/F15 10.9091 Tf 604.185 191.742 Td [(20)]TJ ET q -1 0 0 1 692.367 153.804 cm +1 0 0 1 692.367 160.579 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F15 10.9091 Tf 698.344 184.967 Td [(Maxim)28(um)-244(n)28(um)28(b)-28(er)-244(of)-244(lev)28(els.)-415(The)-244(aggrega-)]TJ 0 -13.549 Td [(tion)-343(stops)-343(if)-343(the)-343(n)28(um)28(b)-28(er)-343(of)-343(lev)27(els)-343(reac)28(hes)]TJ 0 -13.549 Td [(this)-333(v)55(alue)-333(\050see)-334(Note\051.)]TJ +/F15 10.9091 Tf 698.344 191.742 Td [(Maxim)28(um)-244(n)28(um)28(b)-28(er)-244(of)-244(lev)28(els.)-415(The)-244(aggrega-)]TJ 0 -13.549 Td [(tion)-343(stops)-343(if)-343(the)-343(n)28(um)28(b)-28(er)-343(of)-343(lev)27(els)-343(reac)28(hes)]TJ 0 -13.55 Td [(this)-333(v)55(alue)-333(\050see)-334(Note\051.)]TJ ET q -1 0 0 1 899.912 153.804 cm +1 0 0 1 899.912 160.579 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q q -1 0 0 1 299.826 153.605 cm +1 0 0 1 299.826 160.379 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q q -1 0 0 1 299.826 85.66 cm +1 0 0 1 299.826 92.434 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 305.803 143.921 Td [('PAR_AGGR_ALG')]TJ +/F45 10.9091 Tf 305.803 150.696 Td [('PAR_AGGR_ALG')]TJ ET q -1 0 0 1 422.332 85.66 cm +1 0 0 1 422.332 92.434 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 428.31 143.921 Td [(character\050len=*\051)]TJ +/F45 10.9091 Tf 428.31 150.696 Td [(character\050len=*\051)]TJ ET q -1 0 0 1 521.055 85.66 cm +1 0 0 1 521.055 92.434 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 527.032 143.921 Td [('DEC')]TJ/F15 10.9091 Tf 28.637 0 Td [(,)]TJ/F45 10.9091 Tf -28.637 -13.549 Td [('SYMDEC')]TJ +/F45 10.9091 Tf 527.032 150.696 Td [('DEC')]TJ/F15 10.9091 Tf 28.637 0 Td [(,)]TJ/F45 10.9091 Tf -28.637 -13.55 Td [('SYMDEC')]TJ ET q -1 0 0 1 598.207 85.66 cm +1 0 0 1 598.207 92.434 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 604.185 143.921 Td [('DEC')]TJ +/F45 10.9091 Tf 604.185 150.696 Td [('DEC')]TJ ET q -1 0 0 1 692.367 85.66 cm +1 0 0 1 692.367 92.434 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F15 10.9091 Tf 698.344 143.921 Td [(P)28(arallel)-333(aggregation)-334(algorithm.)]TJ 0 -13.549 Td [(Curren)28(tly)83(,)-604(only)-550(the)-550(decoupled)-550(aggrega-)]TJ 0 -13.549 Td [(tion)-518(\050)]TJ/F45 10.9091 Tf 28.679 0 Td [(DEC)]TJ/F15 10.9091 Tf 17.182 0 Td [(\051)-518(is)-517(a)27(v)56(ailable;)-610(the)]TJ/F45 10.9091 Tf 94.568 0 Td [(SYMDEC)]TJ/F15 10.9091 Tf 40.01 0 Td [(op-)]TJ -180.439 -13.549 Td [(tion)-306(applies)-307(decoupled)-306(aggregation)-306(to)-307(the)]TJ 0 -13.55 Td [(sparsit)28(y)-334(p)1(atte)-1(r)1(n)-334(of)]TJ/F22 10.9091 Tf 92 0 Td [(A)]TJ/F15 10.9091 Tf 10.606 0 Td [(+)]TJ/F22 10.9091 Tf 10.909 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.959 Td [(T)]TJ/F15 10.9091 Tf 6.605 -3.959 Td [(.)]TJ +/F15 10.9091 Tf 698.344 150.696 Td [(P)28(arallel)-333(aggregation)-334(algorithm.)]TJ 0 -13.55 Td [(Curren)28(tly)83(,)-604(only)-550(the)-550(decoupled)-550(aggrega-)]TJ 0 -13.549 Td [(tion)-518(\050)]TJ/F45 10.9091 Tf 28.679 0 Td [(DEC)]TJ/F15 10.9091 Tf 17.182 0 Td [(\051)-518(is)-517(a)27(v)56(ailable;)-610(the)]TJ/F45 10.9091 Tf 94.568 0 Td [(SYMDEC)]TJ/F15 10.9091 Tf 40.01 0 Td [(op-)]TJ -180.439 -13.549 Td [(tion)-306(applies)-307(decoupled)-306(aggregation)-306(to)-307(the)]TJ 0 -13.549 Td [(sparsit)28(y)-334(p)1(atte)-1(r)1(n)-334(of)]TJ/F22 10.9091 Tf 92 0 Td [(A)]TJ/F15 10.9091 Tf 10.606 0 Td [(+)]TJ/F22 10.9091 Tf 10.909 0 Td [(A)]TJ/F23 7.9701 Tf 8.182 3.959 Td [(T)]TJ/F15 10.9091 Tf 6.605 -3.959 Td [(.)]TJ ET q -1 0 0 1 899.912 85.66 cm +1 0 0 1 899.912 92.434 cm []0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q q -1 0 0 1 299.826 85.46 cm +1 0 0 1 299.826 92.235 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q q -1 0 0 1 299.826 31.064 cm -[]0 d 0 J 0.398 w 0 0 m 0 54.197 l S +1 0 0 1 299.826 24.29 cm +[]0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 305.803 75.777 Td [('AGGR_TYPE')]TJ +/F45 10.9091 Tf 305.803 82.551 Td [('AGGR_TYPE')]TJ ET q -1 0 0 1 422.332 31.064 cm -[]0 d 0 J 0.398 w 0 0 m 0 54.197 l S +1 0 0 1 422.332 24.29 cm +[]0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 428.31 75.777 Td [(character\050len=*\051)]TJ +/F45 10.9091 Tf 428.31 82.551 Td [(character\050len=*\051)]TJ ET q -1 0 0 1 521.055 31.064 cm -[]0 d 0 J 0.398 w 0 0 m 0 54.197 l S +1 0 0 1 521.055 24.29 cm +[]0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 527.032 75.777 Td [('VMB')]TJ +/F45 10.9091 Tf 527.032 82.551 Td [('SOC1')]TJ ET q -1 0 0 1 598.207 31.064 cm -[]0 d 0 J 0.398 w 0 0 m 0 54.197 l S +1 0 0 1 598.207 24.29 cm +[]0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F45 10.9091 Tf 604.185 75.777 Td [('VMB')]TJ +/F45 10.9091 Tf 604.185 82.551 Td [('SOC1')]TJ/F15 10.9091 Tf 34.363 0 Td [(,)]TJ/F45 10.9091 Tf 6.667 0 Td [('SOC2')]TJ ET q -1 0 0 1 692.367 31.064 cm -[]0 d 0 J 0.398 w 0 0 m 0 54.197 l S +1 0 0 1 692.367 24.29 cm +[]0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q BT -/F15 10.9091 Tf 698.344 75.777 Td [(T)28(yp)-28(e)-762(of)-762(aggregation)-762(algorithm:)-1301(cur-)]TJ 0 -13.55 Td [(ren)28(tly)83(,)-528(the)-489(scalar)-489(aggregation)-490(algor)1(ithm)]TJ 0 -13.549 Td [(b)28(y)-385(V)83(an)28(\024)472(ek,)-398(Mandel)-385(and)-385(Brezina)-385(is)-385(imple-)]TJ 0 -13.549 Td [(men)28(ted)-334([)]TJ +/F15 10.9091 Tf 698.344 82.551 Td [(T)28(yp)-28(e)-254(of)-255(aggregation)-254(algorithm:)-405(curren)28(tly)83(,)]TJ 0 -13.549 Td [(w)28(e)-355(implemen)28(t)-355(to)-355(measures)-355(of)-355(strength)-355(of)]TJ 0 -13.549 Td [(connection,)-595(the)-543(one)-542(b)28(y)-543(V)83(an)28(\024)472(ek,)-595(Mandel)]TJ 0 -13.549 Td [(and)-454(Brezina)-454([)]TJ 1 0 0 rg 1 0 0 RG - [(25)]TJ + [(26)]TJ +0 g 0 G + [(],)-484(and)-454(the)-454(one)-454(b)28(y)-454(Grat-)]TJ 0 -13.55 Td [(ton)-333(et)-334(al)-333([)]TJ +1 0 0 rg 1 0 0 RG + [(16)]TJ 0 g 0 G [(].)]TJ ET q -1 0 0 1 899.912 31.064 cm -[]0 d 0 J 0.398 w 0 0 m 0 54.197 l S +1 0 0 1 899.912 24.29 cm +[]0 d 0 J 0.398 w 0 0 m 0 67.746 l S Q q -1 0 0 1 299.826 30.865 cm +1 0 0 1 299.826 24.09 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q q -1 0 0 1 299.826 -9.982 cm +1 0 0 1 299.826 -16.756 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F45 10.9091 Tf 305.803 21.181 Td [('AGGR_PROL')]TJ +/F45 10.9091 Tf 305.803 14.407 Td [('AGGR_PROL')]TJ ET q -1 0 0 1 422.332 -9.982 cm +1 0 0 1 422.332 -16.756 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F45 10.9091 Tf 428.31 21.181 Td [(character\050len=*\051)]TJ +/F45 10.9091 Tf 428.31 14.407 Td [(character\050len=*\051)]TJ ET q -1 0 0 1 521.055 -9.982 cm +1 0 0 1 521.055 -16.756 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F45 10.9091 Tf 527.032 21.181 Td [('SMOOTHED')]TJ/F15 10.9091 Tf 57.273 0 Td [(,)]TJ/F45 10.9091 Tf -57.273 -13.549 Td [('UNSMOOTHED')]TJ +/F45 10.9091 Tf 527.032 14.407 Td [('SMOOTHED')]TJ/F15 10.9091 Tf 57.273 0 Td [(,)]TJ/F45 10.9091 Tf -57.273 -13.549 Td [('UNSMOOTHED')]TJ ET q -1 0 0 1 598.207 -9.982 cm +1 0 0 1 598.207 -16.756 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F45 10.9091 Tf 604.185 21.181 Td [('SMOOTHED')]TJ +/F45 10.9091 Tf 604.185 14.407 Td [('SMOOTHED')]TJ ET q -1 0 0 1 692.367 -9.982 cm +1 0 0 1 692.367 -16.756 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q BT -/F15 10.9091 Tf 698.344 21.181 Td [(Prolongator)-436(used)-435(b)27(y)-435(the)-436(aggregation)-436(al-)]TJ 0 -13.549 Td [(gorithm:)-609(smo)-28(othed)-416(or)-416(unsmo)-28(oth)1(e)-1(d)-415(\050i.e.,)]TJ 0 -13.549 Td [(ten)28(tativ)28(e)-334(prolongator\051.)]TJ +/F15 10.9091 Tf 698.344 14.407 Td [(Prolongator)-436(used)-435(b)27(y)-435(the)-436(aggregation)-436(al-)]TJ 0 -13.549 Td [(gorithm:)-609(smo)-28(othed)-416(or)-416(unsmo)-28(oth)1(e)-1(d)-415(\050i.e.,)]TJ 0 -13.55 Td [(ten)28(tativ)28(e)-334(prolongator\051.)]TJ ET q -1 0 0 1 899.912 -9.982 cm +1 0 0 1 899.912 -16.756 cm []0 d 0 J 0.398 w 0 0 m 0 40.648 l S Q q -1 0 0 1 299.826 -10.181 cm +1 0 0 1 299.826 -16.956 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q q -1 0 0 1 299.826 -23.93 cm +1 0 0 1 299.826 -30.704 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q BT -/F44 10.9091 Tf 305.803 -19.865 Td [(Note.)]TJ/F15 10.9091 Tf 35.053 0 Td [(The)-333(aggregation)-334(algorithm)-333(stops)-333(when)-334(at)-333(least)-333(one)-334(of)-333(the)-333(follo)28(wing)-334(criteria)-333(is)-333(met:)-445(the)-333(coarse)-334(size)-333(threshold,)-333(the)]TJ +/F44 10.9091 Tf 305.803 -26.639 Td [(Note.)]TJ/F15 10.9091 Tf 35.053 0 Td [(The)-333(aggregation)-334(algorithm)-333(stops)-333(when)-334(at)-333(least)-333(one)-334(of)-333(the)-333(follo)28(wing)-334(criteria)-333(is)-333(met:)-445(the)-333(coarse)-334(size)-333(threshold,)-333(the)]TJ ET q -1 0 0 1 899.912 -23.93 cm +1 0 0 1 899.912 -30.704 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q q -1 0 0 1 299.826 -37.479 cm +1 0 0 1 299.826 -44.253 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q BT -/F15 10.9091 Tf 305.803 -33.414 Td [(minim)28(um)-334(coarsening)-333(ratio,)-333(or)-333(the)-334(maxim)28(um)-333(n)27(u)1(m)27(b)-27(e)-1(r)-333(of)-333(lev)28(els)-334(is)-333(reac)28(hed.)-445(Therefore,)-333(the)-333(actual)-334(n)28(um)28(b)-28(er)-333(of)-333(lev)27(els)-333(ma)28(y)-334(b)-27(e)]TJ +/F15 10.9091 Tf 305.803 -40.189 Td [(minim)28(um)-334(coarsening)-333(ratio,)-333(or)-333(the)-334(maxim)28(um)-333(n)27(u)1(m)27(b)-27(e)-1(r)-333(of)-333(lev)28(els)-334(is)-333(reac)28(hed.)-445(Therefore,)-333(the)-333(actual)-334(n)28(um)28(b)-28(er)-333(of)-333(lev)27(els)-333(ma)28(y)-334(b)-27(e)]TJ ET q -1 0 0 1 899.912 -37.479 cm +1 0 0 1 899.912 -44.253 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q q -1 0 0 1 299.826 -51.028 cm +1 0 0 1 299.826 -57.802 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q BT -/F15 10.9091 Tf 305.803 -46.963 Td [(smaller)-333(than)-334(the)-333(sp)-28(eci\014ed)-333(maxim)28(um)-334(n)28(um)28(b)-28(er)-333(of)-333(lev)27(els.)]TJ +/F15 10.9091 Tf 305.803 -53.738 Td [(smaller)-333(than)-334(the)-333(sp)-28(eci\014ed)-333(maxim)28(um)-334(n)28(um)28(b)-28(er)-333(of)-333(lev)27(els.)]TJ ET q -1 0 0 1 899.912 -51.028 cm +1 0 0 1 899.912 -57.802 cm []0 d 0 J 0.398 w 0 0 m 0 13.549 l S Q q -1 0 0 1 299.826 -51.227 cm +1 0 0 1 299.826 -58.002 cm []0 d 0 J 0.398 w 0 0 m 600.087 0 l S Q 0 g 0 G BT -/F15 10.9091 Tf 459.779 -81.916 Td [(T)83(able)-333(3:)-444(P)27(arameters)-333(de\014ning)-333(the)-334(aggregation)-333(algorithm.)]TJ +/F15 10.9091 Tf 459.779 -88.691 Td [(T)83(able)-333(3:)-444(P)27(arameters)-333(de\014ning)-333(the)-334(aggregation)-333(algorithm.)]TJ 0 g 0 G 0 g 0 G ET @@ -4117,7 +4121,7 @@ Q endstream endobj -528 0 obj +530 0 obj << /Length 6126 >> @@ -4341,7 +4345,7 @@ Q BT /F44 10.9091 Tf 298.603 662.983 Td [(Note.)]TJ/F15 10.9091 Tf 35.053 0 Td [(Di\013eren)28(t)-334(th)1(res)-1(h)1(olds)-334(at)-333(di\013eren)28(t)-334(lev)28(els,)-333(suc)27(h)-333(as)-333(those)-334(used)-333(in)-333([)]TJ 1 0 0 rg 1 0 0 RG - [(25)]TJ + [(26)]TJ 0 g 0 G [(,)-333(Sec)-1(ti)1(on)-334(5.1],)-333(can)-333(b)-28(e)-333(e)-1(asily)-333(set)-333(b)28(y)-334(in)28(v)28(oking)-333(the)-334(rou-)]TJ ET @@ -4378,7 +4382,7 @@ Q endstream endobj -534 0 obj +536 0 obj << /Length 9225 >> @@ -4661,7 +4665,7 @@ Q endstream endobj -538 0 obj +540 0 obj << /Length 4941 >> @@ -4876,266 +4880,12 @@ Q endstream endobj -544 0 obj +435 0 obj << -/Length 7639 ->> -stream -0 g 0 G -0 0 1 rg 0 0 1 RG -BT -/F42 10.9091 Tf 93.6 740.002 Td [(6)]TJ -0 g 0 G - [-378(User)-377(Interf)88(a)23(ce)]TJ/F15 10.9091 Tf 401.542 0 Td [(31)]TJ -0 g 0 G -0 g 0 G -ET -1 0 0 1 299.826 121.521 cm -q -0 1 -1 0 0 0 cm -0 g 0 G -0 g 0 G -0 g 0 G -q -1 0 0 1 3.954 157.513 cm -[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S -Q -q -1 0 0 1 3.954 145.359 cm -[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S -Q -1 0 0 1 -299.826 -121.521 cm -BT -/F45 9.9626 Tf 309.757 270.467 Td [(what)]TJ -ET -q -1 0 0 1 417.782 266.88 cm -[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S -Q -BT -/F42 9.9626 Tf 423.76 270.467 Td [(d)22(a)67(t)66(a)-377(type)]TJ -ET -q -1 0 0 1 513.423 266.88 cm -[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S -Q -BT -/F45 9.9626 Tf 519.401 270.467 Td [(val)]TJ -ET -q -1 0 0 1 579.236 266.88 cm -[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S -Q -BT -/F42 9.9626 Tf 585.214 270.467 Td [(def)89(a)22(ul)67(t)]TJ -ET -q -1 0 0 1 693.239 266.88 cm -[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S -Q -BT -/F42 9.9626 Tf 699.216 270.467 Td [(comments)]TJ -ET -q -1 0 0 1 889.446 266.88 cm -[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S -Q -q -1 0 0 1 303.78 266.681 cm -[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S -Q -q -1 0 0 1 303.78 194.75 cm -[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S -Q -BT -/F45 9.9626 Tf 309.757 258.113 Td [('SMOOTHER_TYPE')]TJ -ET -q -1 0 0 1 417.782 194.75 cm -[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S -Q -BT -/F45 9.9626 Tf 423.76 258.113 Td [(character\050len=*\051)]TJ -ET -q -1 0 0 1 513.423 194.75 cm -[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S -Q -BT -/F45 9.9626 Tf 519.401 258.113 Td [('JACOBI')]TJ 0 -11.955 Td [('GS')]TJ 0 -11.955 Td [('BGS')]TJ 0 -11.956 Td [('BJAC')]TJ 0 -11.955 Td [('AS')]TJ -ET -q -1 0 0 1 579.236 194.75 cm -[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S -Q -BT -/F45 9.9626 Tf 585.214 258.113 Td [('FBGS')]TJ -ET -q -1 0 0 1 693.239 194.75 cm -[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S -Q -BT -/F15 9.9626 Tf 699.216 258.113 Td [(T)28(yp)-28(e)-765(of)-766(smo)-27(other)-766(used)-765(in)-765(the)-765(m)27(ul)1(ti-)]TJ 0 -11.955 Td [(lev)28(el)-419(pr)1(e)-1(cond)1(itioner:)-615(p)-27(oin)27(t-Jacobi,)-439(h)28(ybrid)]TJ 0 -11.955 Td [(\050forw)28(ard\051)-519(Gauss-Seidel,)-566(h)28(ybrid)-519(bac)28(kw)27(ard)]TJ 0 -11.956 Td [(Gauss-Seidel,)-558(blo)-28(c)28(k-Jacobi,)-558(and)-513(Additiv)28(e)]TJ 0 -11.955 Td [(Sc)28(h)28(w)27(arz.)]TJ 0 -11.955 Td [(It)-333(is)-334(ignored)-333(b)28(y)-333(one)-1(-lev)28(el)-333(preconditioners.)]TJ -ET -q -1 0 0 1 889.446 194.75 cm -[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S -Q -q -1 0 0 1 303.78 194.551 cm -[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S -Q -q -1 0 0 1 303.78 86.755 cm -[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S -Q -BT -/F45 9.9626 Tf 309.757 185.983 Td [('SUB_SOLVE')]TJ -ET -q -1 0 0 1 417.782 86.755 cm -[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S -Q -BT -/F45 9.9626 Tf 423.76 185.983 Td [(character\050len=*\051)]TJ -ET -q -1 0 0 1 513.423 86.755 cm -[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S -Q -BT -/F45 9.9626 Tf 519.401 185.983 Td [('JACOBI')]TJ 0 -11.955 Td [('GS')]TJ 0 -11.955 Td [('BGS')]TJ 0 -11.955 Td [('ILU')]TJ 0 -11.955 Td [('ILUT')]TJ 0 -11.956 Td [('MILU')]TJ 0 -11.955 Td [('MUMPS')]TJ 0 -11.955 Td [('SLU')]TJ 0 -11.955 Td [('UMF')]TJ -ET -q -1 0 0 1 579.236 86.755 cm -[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S -Q -BT -/F45 9.9626 Tf 585.214 185.983 Td [(GS)]TJ/F15 9.9626 Tf 13.397 0 Td [(and)]TJ/F45 9.9626 Tf 18.987 0 Td [(BGS)]TJ/F15 9.9626 Tf 18.627 0 Td [(for)-295(pre-)-294(and)]TJ -51.011 -11.955 Td [(p)-28(ost-smo)-28(others)-417(of)-417(m)27(ul-)]TJ 0 -11.955 Td [(tilev)28(el)-677(pr)1(e)-1(cond)1(itioners,)]TJ 0 -11.955 Td [(resp)-28(ectiv)28(ely)]TJ/F45 9.9626 Tf 0 -11.955 Td [(ILU)]TJ/F15 9.9626 Tf 25.851 0 Td [(for)-1020(blo)-28(c)28(k-Jacobi)]TJ -25.851 -11.956 Td [(and)-676(Addi)1(tiv)27(e)-675(Sc)27(h)28(w)28(arz)]TJ 0 -11.955 Td [(one-lev)28(el)-685(precondition-)]TJ 0 -11.955 Td [(ers)]TJ -ET -q -1 0 0 1 693.239 86.755 cm -[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S -Q -BT -/F15 9.9626 Tf 699.216 185.983 Td [(The)-719(lo)-28(cal)-720(solv)28(er)-719(to)-720(b)-28(e)-719(used)-719(with)-720(the)]TJ 0 -11.955 Td [(smo)-28(other)-458(or)-458(one-lev)27(el)-458(preconditioner)-458(\050see)]TJ 0 -11.955 Td [(Remark)-383(2,)-395(page)-383(24\051:)-544(p)-27(oin)27(t-Jacobi,)-395(h)28(ybrid)]TJ 0 -11.955 Td [(\050forw)28(ard\051)-519(Gauss-Seidel,)-566(h)28(ybrid)-519(bac)28(kw)27(ard)]TJ 0 -11.955 Td [(Gauss-Seidel,)-364(ILU\050)]TJ/F22 9.9626 Tf 82.539 0 Td [(p)]TJ/F15 9.9626 Tf 5.012 0 Td [(\051,)-364(ILU\050)]TJ/F22 9.9626 Tf 31.439 0 Td [(p;)-167(t)]TJ/F15 9.9626 Tf 13.037 0 Td [(\051,)-364(MILU\050)]TJ/F22 9.9626 Tf 40.571 0 Td [(p)]TJ/F15 9.9626 Tf 5.013 0 Td [(\051,)]TJ -177.611 -11.956 Td [(LU)-708(from)-709(MUM)1(PS,)-709(Sup)-28(erLU)-708(or)-708(UMF-)]TJ 0 -11.955 Td [(P)83(A)28(CK)-487(\050plus)-486(triangular)-487(solv)28(e\051.)-906(See)-487(Note)]TJ 0 -11.955 Td [(for)-333(details)-334(on)-333(h)28(ybrid)-333(Gauss-Seidel.)]TJ -ET -q -1 0 0 1 889.446 86.755 cm -[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S -Q -q -1 0 0 1 303.78 86.556 cm -[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S -Q -q -1 0 0 1 303.78 26.581 cm -[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S -Q -BT -/F45 9.9626 Tf 309.757 77.988 Td [('SMOOTHER_SWEEPS')]TJ -ET -q -1 0 0 1 417.782 26.581 cm -[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S -Q -BT -/F45 9.9626 Tf 423.76 77.988 Td [(integer)]TJ -ET -q -1 0 0 1 513.423 26.581 cm -[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S -Q -BT -/F15 9.9626 Tf 519.401 77.988 Td [(An)28(y)-333(in)27(teger)]TJ 0 -11.955 Td [(n)28(um)28(b)-28(er)]TJ/F25 9.9626 Tf 36.28 0 Td [(\025)]TJ/F15 9.9626 Tf 10.516 0 Td [(0)]TJ -ET -q -1 0 0 1 579.236 26.581 cm -[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S -Q -BT -/F15 9.9626 Tf 585.214 77.988 Td [(1)]TJ -ET -q -1 0 0 1 693.239 26.581 cm -[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S -Q -BT -/F15 9.9626 Tf 699.216 77.988 Td [(Num)28(b)-28(er)-325(of)-325(sw)28(eeps)-325(of)-325(the)-325(smo)-28(other)-325(or)-325(one-)]TJ 0 -11.955 Td [(lev)28(el)-240(preconditioner.)-413(In)-240(the)-239(m)27(ultilev)28(el)-240(case,)]TJ 0 -11.955 Td [(no)-491(pre-smother)-491(or)-491(p)-28(ost-smo)-28(other)-491(is)-491(used)]TJ 0 -11.955 Td [(if)-375(this)-374(parameter)-375(is)-375(set)-374(to)-375(0)-375(t)1(o)-1(gether)-374(with)]TJ/F45 9.9626 Tf 0 -11.955 Td [(pos='PRE')]TJ/F15 9.9626 Tf 50.394 0 Td [(or)]TJ/F45 9.9626 Tf 12.205 0 Td [(pos='POST)]TJ/F15 9.9626 Tf 47.073 0 Td [(,)-333(resp)-28(ectiv)28(ely)83(.)]TJ -ET -q -1 0 0 1 889.446 26.581 cm -[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S -Q -q -1 0 0 1 303.78 26.382 cm -[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S -Q -q -1 0 0 1 303.78 2.272 cm -[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S -Q -BT -/F45 9.9626 Tf 309.757 17.814 Td [('SUB_OVR')]TJ -ET -q -1 0 0 1 417.782 2.272 cm -[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S -Q -BT -/F45 9.9626 Tf 423.76 17.814 Td [(integer)]TJ -ET -q -1 0 0 1 513.423 2.272 cm -[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S -Q -BT -/F15 9.9626 Tf 519.401 17.814 Td [(An)28(y)-333(in)27(teger)]TJ 0 -11.955 Td [(n)28(um)28(b)-28(er)]TJ/F25 9.9626 Tf 36.28 0 Td [(\025)]TJ/F15 9.9626 Tf 10.516 0 Td [(0)]TJ -ET -q -1 0 0 1 579.236 2.272 cm -[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S -Q -BT -/F15 9.9626 Tf 585.214 17.814 Td [(1)]TJ -ET -q -1 0 0 1 693.239 2.272 cm -[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S -Q -BT -/F15 9.9626 Tf 699.216 17.814 Td [(Num)28(b)-28(er)-647(of)-646(o)28(v)28(e)-1(r)1(lap)-647(la)28(y)28(ers,)-725(for)-647(Additiv)28(e)]TJ 0 -11.955 Td [(Sc)28(h)28(w)27(arz)-333(only)83(.)]TJ -ET -q -1 0 0 1 889.446 2.272 cm -[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S -Q -q -1 0 0 1 303.78 2.073 cm -[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S -Q -0 g 0 G -BT -/F15 10.9091 Tf 382.719 -28.616 Td [(T)83(able)-333(7:)-444(P)27(arameters)-333(de\014ning)-333(the)-334(smo)-27(other)-334(or)-333(the)-333(details)-334(of)-333(the)-333(one-lev)28(e)-1(l)-333(preconditioner.)]TJ -0 g 0 G -0 g 0 G -ET -1 0 0 1 299.826 121.521 cm -Q -0 g 0 G -0 g 0 G -0 g 0 G - -endstream -endobj -435 0 obj -<< -/Type /ObjStm -/N 100 -/First 898 -/Length 12262 +/Type /ObjStm +/N 100 +/First 898 +/Length 12291 >> stream 434 0 422 54 431 111 445 217 428 423 429 569 436 713 437 865 438 1018 439 1165 @@ -5144,10 +4894,10 @@ stream 462 3305 467 3456 67 3510 464 3563 471 3734 468 3876 469 4021 473 4168 71 4222 470 4275 483 4381 481 4571 474 4717 475 4862 476 5007 477 5152 478 5297 479 5444 480 5589 485 5733 75 5787 482 5840 495 5959 486 6149 487 6294 488 6438 489 6585 490 6729 491 6874 492 7018 -493 7163 497 7308 498 7362 499 7415 500 7469 501 7523 494 7577 512 7696 510 7830 514 7976 -511 8030 517 8123 519 8237 423 8291 516 8350 522 8456 520 8598 504 8744 524 8907 525 8961 -521 9018 527 9176 505 9342 506 9492 507 9644 508 9792 509 9942 529 10104 530 10158 526 10215 -533 10360 531 10494 535 10640 503 10694 532 10752 537 10871 539 10985 540 11039 536 11098 543 11230 +493 7163 497 7308 498 7362 499 7415 500 7469 501 7523 494 7577 513 7696 511 7830 515 7976 +512 8030 518 8123 520 8237 423 8291 517 8350 523 8456 521 8606 504 8752 505 8915 525 9067 +526 9121 522 9179 529 9337 506 9503 507 9653 508 9805 509 9953 510 10103 531 10265 532 10319 +528 10378 535 10523 533 10657 537 10803 503 10857 534 10915 539 11034 541 11148 542 11202 538 11261 % 434 0 obj << /D [432 0 R /XYZ 92.6 752.957 null] @@ -5582,16 +5332,16 @@ stream /Font << /F15 160 0 R /F42 161 0 R /F44 205 0 R /F45 255 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 512 0 obj +% 513 0 obj << /Type /Page -/Contents 513 0 R -/Resources 511 0 R +/Contents 514 0 R +/Resources 512 0 R /MediaBox [0 0 595.276 841.89] -/Parent 515 0 R -/Annots [ 510 0 R ] +/Parent 516 0 R +/Annots [ 511 0 R ] >> -% 510 0 obj +% 511 0 obj << /Type /Annot /Subtype /Link @@ -5599,46 +5349,46 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.6) >> >> -% 514 0 obj +% 515 0 obj << -/D [512 0 R /XYZ 92.6 752.957 null] +/D [513 0 R /XYZ 92.6 752.957 null] >> -% 511 0 obj +% 512 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 517 0 obj +% 518 0 obj << /Type /Page -/Contents 518 0 R -/Resources 516 0 R +/Contents 519 0 R +/Resources 517 0 R /MediaBox [0 0 595.276 841.89] -/Parent 515 0 R +/Parent 516 0 R >> -% 519 0 obj +% 520 0 obj << -/D [517 0 R /XYZ 85.4 752.957 null] +/D [518 0 R /XYZ 85.4 752.957 null] >> % 423 0 obj << -/D [517 0 R /XYZ -3855.021 590.914 null] +/D [518 0 R /XYZ -3855.021 590.914 null] >> -% 516 0 obj +% 517 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F45 255 0 R /F25 257 0 R >> /ProcSet [ /PDF /Text ] >> -% 522 0 obj +% 523 0 obj << /Type /Page -/Contents 523 0 R -/Resources 521 0 R +/Contents 524 0 R +/Resources 522 0 R /MediaBox [0 0 595.276 841.89] -/Parent 515 0 R -/Annots [ 520 0 R 504 0 R ] +/Parent 516 0 R +/Annots [ 521 0 R 504 0 R 505 0 R ] >> -% 520 0 obj +% 521 0 obj << /Type /Annot /Subtype /Link @@ -5651,32 +5401,40 @@ stream /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] -/Rect [378.191 560.558 387.214 574.456] +/Rect [371.416 585.797 380.439 599.695] /A << /S /GoTo /D (cite.VANEK_MANDEL_BREZINA) >> >> -% 524 0 obj +% 505 0 obj << -/D [522 0 R /XYZ 92.6 752.957 null] +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[0 1 0] +/Rect [384.966 566.316 393.988 580.214] +/A << /S /GoTo /D (cite.GrHeJi:16) >> >> % 525 0 obj << -/D [522 0 R /XYZ 489.714 324.808 null] +/D [523 0 R /XYZ 92.6 752.957 null] >> -% 521 0 obj +% 526 0 obj +<< +/D [523 0 R /XYZ 496.333 4405.505 null] +>> +% 522 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F45 255 0 R /F22 225 0 R /F25 257 0 R /F21 366 0 R /F23 361 0 R /F44 205 0 R >> /ProcSet [ /PDF /Text ] >> -% 527 0 obj +% 529 0 obj << /Type /Page -/Contents 528 0 R -/Resources 526 0 R +/Contents 530 0 R +/Resources 528 0 R /MediaBox [0 0 595.276 841.89] -/Parent 515 0 R -/Annots [ 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R ] +/Parent 516 0 R +/Annots [ 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R ] >> -% 505 0 obj +% 506 0 obj << /Type /Annot /Subtype /Link @@ -5684,7 +5442,7 @@ stream /Rect [305.333 237.711 318.234 246.154] /A << /S /GoTo /D (equation.4.3) >> >> -% 506 0 obj +% 507 0 obj << /Type /Annot /Subtype /Link @@ -5692,7 +5450,7 @@ stream /Rect [305.333 166.335 318.234 183.263] /A << /S /GoTo /D (subsection.4.2) >> >> -% 507 0 obj +% 508 0 obj << /Type /Annot /Subtype /Link @@ -5700,7 +5458,7 @@ stream /Rect [249.4 276.931 263.639 285.374] /A << /S /GoTo /D (equation.4.5) >> >> -% 508 0 obj +% 509 0 obj << /Type /Annot /Subtype /Link @@ -5708,7 +5466,7 @@ stream /Rect [249.4 204.203 263.639 221.132] /A << /S /GoTo /D (subsection.4.2) >> >> -% 509 0 obj +% 510 0 obj << /Type /Annot /Subtype /Link @@ -5716,29 +5474,29 @@ stream /Rect [239.517 367.769 248.54 381.667] /A << /S /GoTo /D (cite.VANEK_MANDEL_BREZINA) >> >> -% 529 0 obj +% 531 0 obj << -/D [527 0 R /XYZ 85.4 752.957 null] +/D [529 0 R /XYZ 85.4 752.957 null] >> -% 530 0 obj +% 532 0 obj << -/D [527 0 R /XYZ 202.833 540.899 null] +/D [529 0 R /XYZ -3875.743 540.899 null] >> -% 526 0 obj +% 528 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F45 255 0 R /F18 307 0 R /F25 257 0 R /F22 225 0 R /F44 205 0 R >> /ProcSet [ /PDF /Text ] >> -% 533 0 obj +% 535 0 obj << /Type /Page -/Contents 534 0 R -/Resources 532 0 R +/Contents 536 0 R +/Resources 534 0 R /MediaBox [0 0 595.276 841.89] -/Parent 515 0 R -/Annots [ 531 0 R ] +/Parent 516 0 R +/Annots [ 533 0 R ] >> -% 531 0 obj +% 533 0 obj << /Type /Annot /Subtype /Link @@ -5746,53 +5504,298 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.6) >> >> -% 535 0 obj +% 537 0 obj << -/D [533 0 R /XYZ 92.6 752.957 null] +/D [535 0 R /XYZ 92.6 752.957 null] >> % 503 0 obj << -/D [533 0 R /XYZ 475.208 4356.566 null] +/D [535 0 R /XYZ 475.206 4356.566 null] >> -% 532 0 obj +% 534 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F45 255 0 R /F22 225 0 R /F44 205 0 R >> /ProcSet [ /PDF /Text ] >> -% 537 0 obj +% 539 0 obj << /Type /Page -/Contents 538 0 R -/Resources 536 0 R +/Contents 540 0 R +/Resources 538 0 R /MediaBox [0 0 595.276 841.89] -/Parent 515 0 R +/Parent 516 0 R >> -% 539 0 obj +% 541 0 obj << -/D [537 0 R /XYZ 85.4 752.957 null] +/D [539 0 R /XYZ 85.4 752.957 null] >> -% 540 0 obj +% 542 0 obj << -/D [537 0 R /XYZ -3834.398 589.839 null] +/D [539 0 R /XYZ -3834.398 589.839 null] >> -% 536 0 obj +% 538 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F45 255 0 R /F22 225 0 R /F25 257 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 543 0 obj + +endstream +endobj +546 0 obj << -/Type /Page -/Contents 544 0 R -/Resources 542 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 546 0 R -/Annots [ 541 0 R ] +/Length 7639 >> +stream +0 g 0 G +0 0 1 rg 0 0 1 RG +BT +/F42 10.9091 Tf 93.6 740.002 Td [(6)]TJ +0 g 0 G + [-378(User)-377(Interf)88(a)23(ce)]TJ/F15 10.9091 Tf 401.542 0 Td [(31)]TJ +0 g 0 G +0 g 0 G +ET +1 0 0 1 299.826 121.521 cm +q +0 1 -1 0 0 0 cm +0 g 0 G +0 g 0 G +0 g 0 G +q +1 0 0 1 3.954 157.513 cm +[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S +Q +q +1 0 0 1 3.954 145.359 cm +[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S +Q +1 0 0 1 -299.826 -121.521 cm +BT +/F45 9.9626 Tf 309.757 270.467 Td [(what)]TJ +ET +q +1 0 0 1 417.782 266.88 cm +[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S +Q +BT +/F42 9.9626 Tf 423.76 270.467 Td [(d)22(a)67(t)66(a)-377(type)]TJ +ET +q +1 0 0 1 513.423 266.88 cm +[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S +Q +BT +/F45 9.9626 Tf 519.401 270.467 Td [(val)]TJ +ET +q +1 0 0 1 579.236 266.88 cm +[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S +Q +BT +/F42 9.9626 Tf 585.214 270.467 Td [(def)89(a)22(ul)67(t)]TJ +ET +q +1 0 0 1 693.239 266.88 cm +[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S +Q +BT +/F42 9.9626 Tf 699.216 270.467 Td [(comments)]TJ +ET +q +1 0 0 1 889.446 266.88 cm +[]0 d 0 J 0.398 w 0 0 m 0 11.955 l S +Q +q +1 0 0 1 303.78 266.681 cm +[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S +Q +q +1 0 0 1 303.78 194.75 cm +[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S +Q +BT +/F45 9.9626 Tf 309.757 258.113 Td [('SMOOTHER_TYPE')]TJ +ET +q +1 0 0 1 417.782 194.75 cm +[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S +Q +BT +/F45 9.9626 Tf 423.76 258.113 Td [(character\050len=*\051)]TJ +ET +q +1 0 0 1 513.423 194.75 cm +[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S +Q +BT +/F45 9.9626 Tf 519.401 258.113 Td [('JACOBI')]TJ 0 -11.955 Td [('GS')]TJ 0 -11.955 Td [('BGS')]TJ 0 -11.956 Td [('BJAC')]TJ 0 -11.955 Td [('AS')]TJ +ET +q +1 0 0 1 579.236 194.75 cm +[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S +Q +BT +/F45 9.9626 Tf 585.214 258.113 Td [('FBGS')]TJ +ET +q +1 0 0 1 693.239 194.75 cm +[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S +Q +BT +/F15 9.9626 Tf 699.216 258.113 Td [(T)28(yp)-28(e)-765(of)-766(smo)-27(other)-766(used)-765(in)-765(the)-765(m)27(ul)1(ti-)]TJ 0 -11.955 Td [(lev)28(el)-419(pr)1(e)-1(cond)1(itioner:)-615(p)-27(oin)27(t-Jacobi,)-439(h)28(ybrid)]TJ 0 -11.955 Td [(\050forw)28(ard\051)-519(Gauss-Seidel,)-566(h)28(ybrid)-519(bac)28(kw)27(ard)]TJ 0 -11.956 Td [(Gauss-Seidel,)-558(blo)-28(c)28(k-Jacobi,)-558(and)-513(Additiv)28(e)]TJ 0 -11.955 Td [(Sc)28(h)28(w)27(arz.)]TJ 0 -11.955 Td [(It)-333(is)-334(ignored)-333(b)28(y)-333(one)-1(-lev)28(el)-333(preconditioners.)]TJ +ET +q +1 0 0 1 889.446 194.75 cm +[]0 d 0 J 0.398 w 0 0 m 0 71.731 l S +Q +q +1 0 0 1 303.78 194.551 cm +[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S +Q +q +1 0 0 1 303.78 86.755 cm +[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S +Q +BT +/F45 9.9626 Tf 309.757 185.983 Td [('SUB_SOLVE')]TJ +ET +q +1 0 0 1 417.782 86.755 cm +[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S +Q +BT +/F45 9.9626 Tf 423.76 185.983 Td [(character\050len=*\051)]TJ +ET +q +1 0 0 1 513.423 86.755 cm +[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S +Q +BT +/F45 9.9626 Tf 519.401 185.983 Td [('JACOBI')]TJ 0 -11.955 Td [('GS')]TJ 0 -11.955 Td [('BGS')]TJ 0 -11.955 Td [('ILU')]TJ 0 -11.955 Td [('ILUT')]TJ 0 -11.956 Td [('MILU')]TJ 0 -11.955 Td [('MUMPS')]TJ 0 -11.955 Td [('SLU')]TJ 0 -11.955 Td [('UMF')]TJ +ET +q +1 0 0 1 579.236 86.755 cm +[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S +Q +BT +/F45 9.9626 Tf 585.214 185.983 Td [(GS)]TJ/F15 9.9626 Tf 13.397 0 Td [(and)]TJ/F45 9.9626 Tf 18.987 0 Td [(BGS)]TJ/F15 9.9626 Tf 18.627 0 Td [(for)-295(pre-)-294(and)]TJ -51.011 -11.955 Td [(p)-28(ost-smo)-28(others)-417(of)-417(m)27(ul-)]TJ 0 -11.955 Td [(tilev)28(el)-677(pr)1(e)-1(cond)1(itioners,)]TJ 0 -11.955 Td [(resp)-28(ectiv)28(ely)]TJ/F45 9.9626 Tf 0 -11.955 Td [(ILU)]TJ/F15 9.9626 Tf 25.851 0 Td [(for)-1020(blo)-28(c)28(k-Jacobi)]TJ -25.851 -11.956 Td [(and)-676(Addi)1(tiv)27(e)-675(Sc)27(h)28(w)28(arz)]TJ 0 -11.955 Td [(one-lev)28(el)-685(precondition-)]TJ 0 -11.955 Td [(ers)]TJ +ET +q +1 0 0 1 693.239 86.755 cm +[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S +Q +BT +/F15 9.9626 Tf 699.216 185.983 Td [(The)-719(lo)-28(cal)-720(solv)28(er)-719(to)-720(b)-28(e)-719(used)-719(with)-720(the)]TJ 0 -11.955 Td [(smo)-28(other)-458(or)-458(one-lev)27(el)-458(preconditioner)-458(\050see)]TJ 0 -11.955 Td [(Remark)-383(2,)-395(page)-383(24\051:)-544(p)-27(oin)27(t-Jacobi,)-395(h)28(ybrid)]TJ 0 -11.955 Td [(\050forw)28(ard\051)-519(Gauss-Seidel,)-566(h)28(ybrid)-519(bac)28(kw)27(ard)]TJ 0 -11.955 Td [(Gauss-Seidel,)-364(ILU\050)]TJ/F22 9.9626 Tf 82.539 0 Td [(p)]TJ/F15 9.9626 Tf 5.012 0 Td [(\051,)-364(ILU\050)]TJ/F22 9.9626 Tf 31.439 0 Td [(p;)-167(t)]TJ/F15 9.9626 Tf 13.037 0 Td [(\051,)-364(MILU\050)]TJ/F22 9.9626 Tf 40.571 0 Td [(p)]TJ/F15 9.9626 Tf 5.013 0 Td [(\051,)]TJ -177.611 -11.956 Td [(LU)-708(from)-709(MUM)1(PS,)-709(Sup)-28(erLU)-708(or)-708(UMF-)]TJ 0 -11.955 Td [(P)83(A)28(CK)-487(\050plus)-486(triangular)-487(solv)28(e\051.)-906(See)-487(Note)]TJ 0 -11.955 Td [(for)-333(details)-334(on)-333(h)28(ybrid)-333(Gauss-Seidel.)]TJ +ET +q +1 0 0 1 889.446 86.755 cm +[]0 d 0 J 0.398 w 0 0 m 0 107.597 l S +Q +q +1 0 0 1 303.78 86.556 cm +[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S +Q +q +1 0 0 1 303.78 26.581 cm +[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S +Q +BT +/F45 9.9626 Tf 309.757 77.988 Td [('SMOOTHER_SWEEPS')]TJ +ET +q +1 0 0 1 417.782 26.581 cm +[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S +Q +BT +/F45 9.9626 Tf 423.76 77.988 Td [(integer)]TJ +ET +q +1 0 0 1 513.423 26.581 cm +[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S +Q +BT +/F15 9.9626 Tf 519.401 77.988 Td [(An)28(y)-333(in)27(teger)]TJ 0 -11.955 Td [(n)28(um)28(b)-28(er)]TJ/F25 9.9626 Tf 36.28 0 Td [(\025)]TJ/F15 9.9626 Tf 10.516 0 Td [(0)]TJ +ET +q +1 0 0 1 579.236 26.581 cm +[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S +Q +BT +/F15 9.9626 Tf 585.214 77.988 Td [(1)]TJ +ET +q +1 0 0 1 693.239 26.581 cm +[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S +Q +BT +/F15 9.9626 Tf 699.216 77.988 Td [(Num)28(b)-28(er)-325(of)-325(sw)28(eeps)-325(of)-325(the)-325(smo)-28(other)-325(or)-325(one-)]TJ 0 -11.955 Td [(lev)28(el)-240(preconditioner.)-413(In)-240(the)-239(m)27(ultilev)28(el)-240(case,)]TJ 0 -11.955 Td [(no)-491(pre-smother)-491(or)-491(p)-28(ost-smo)-28(other)-491(is)-491(used)]TJ 0 -11.955 Td [(if)-375(this)-374(parameter)-375(is)-375(set)-374(to)-375(0)-375(t)1(o)-1(gether)-374(with)]TJ/F45 9.9626 Tf 0 -11.955 Td [(pos='PRE')]TJ/F15 9.9626 Tf 50.394 0 Td [(or)]TJ/F45 9.9626 Tf 12.205 0 Td [(pos='POST)]TJ/F15 9.9626 Tf 47.073 0 Td [(,)-333(resp)-28(ectiv)28(ely)83(.)]TJ +ET +q +1 0 0 1 889.446 26.581 cm +[]0 d 0 J 0.398 w 0 0 m 0 59.776 l S +Q +q +1 0 0 1 303.78 26.382 cm +[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S +Q +q +1 0 0 1 303.78 2.272 cm +[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S +Q +BT +/F45 9.9626 Tf 309.757 17.814 Td [('SUB_OVR')]TJ +ET +q +1 0 0 1 417.782 2.272 cm +[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S +Q +BT +/F45 9.9626 Tf 423.76 17.814 Td [(integer)]TJ +ET +q +1 0 0 1 513.423 2.272 cm +[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S +Q +BT +/F15 9.9626 Tf 519.401 17.814 Td [(An)28(y)-333(in)27(teger)]TJ 0 -11.955 Td [(n)28(um)28(b)-28(er)]TJ/F25 9.9626 Tf 36.28 0 Td [(\025)]TJ/F15 9.9626 Tf 10.516 0 Td [(0)]TJ +ET +q +1 0 0 1 579.236 2.272 cm +[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S +Q +BT +/F15 9.9626 Tf 585.214 17.814 Td [(1)]TJ +ET +q +1 0 0 1 693.239 2.272 cm +[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S +Q +BT +/F15 9.9626 Tf 699.216 17.814 Td [(Num)28(b)-28(er)-647(of)-646(o)28(v)28(e)-1(r)1(lap)-647(la)28(y)28(ers,)-725(for)-647(Additiv)28(e)]TJ 0 -11.955 Td [(Sc)28(h)28(w)27(arz)-333(only)83(.)]TJ +ET +q +1 0 0 1 889.446 2.272 cm +[]0 d 0 J 0.398 w 0 0 m 0 23.91 l S +Q +q +1 0 0 1 303.78 2.073 cm +[]0 d 0 J 0.398 w 0 0 m 585.666 0 l S +Q +0 g 0 G +BT +/F15 10.9091 Tf 382.719 -28.616 Td [(T)83(able)-333(7:)-444(P)27(arameters)-333(de\014ning)-333(the)-334(smo)-27(other)-334(or)-333(the)-333(details)-334(of)-333(the)-333(one-lev)28(e)-1(l)-333(preconditioner.)]TJ +0 g 0 G +0 g 0 G +ET +1 0 0 1 299.826 121.521 cm +Q +0 g 0 G +0 g 0 G +0 g 0 G endstream endobj -550 0 obj +552 0 obj << /Length 6856 >> @@ -6050,7 +6053,7 @@ Q endstream endobj -558 0 obj +560 0 obj << /Length 2792 >> @@ -6091,7 +6094,7 @@ ET endstream endobj -567 0 obj +569 0 obj << /Length 4654 >> @@ -6137,7 +6140,7 @@ ET endstream endobj -578 0 obj +580 0 obj << /Length 5532 >> @@ -6186,7 +6189,7 @@ ET endstream endobj -583 0 obj +585 0 obj << /Length 8543 >> @@ -6254,7 +6257,7 @@ ET endstream endobj -589 0 obj +591 0 obj << /Length 1284 >> @@ -6283,7 +6286,7 @@ ET endstream endobj -597 0 obj +599 0 obj << /Length 3993 >> @@ -6323,7 +6326,7 @@ ET endstream endobj -604 0 obj +606 0 obj << /Length 5175 >> @@ -6373,7 +6376,7 @@ ET endstream endobj -609 0 obj +611 0 obj << /Length 658 >> @@ -6393,7 +6396,7 @@ ET endstream endobj -616 0 obj +618 0 obj << /Length 7499 >> @@ -6438,7 +6441,7 @@ ET endstream endobj -620 0 obj +622 0 obj << /Length 1207 >> @@ -6456,7 +6459,7 @@ ET endstream endobj -626 0 obj +628 0 obj << /Length 1780 >> @@ -6479,7 +6482,7 @@ ET endstream endobj -631 0 obj +633 0 obj << /Length 3978 >> @@ -6498,7 +6501,7 @@ ET endstream endobj -635 0 obj +637 0 obj << /Length 6503 >> @@ -6558,25 +6561,34 @@ ET endstream endobj -547 0 obj +548 0 obj << /Type /ObjStm /N 100 /First 892 -/Length 11495 +/Length 11574 >> stream -541 0 545 146 502 200 542 258 549 377 551 491 424 545 548 604 557 736 555 894 -552 1040 553 1194 554 1348 559 1495 79 1549 556 1602 566 1721 560 1887 561 2039 562 2192 -563 2346 564 2493 568 2646 83 2700 565 2753 577 2872 575 3054 569 3200 570 3351 571 3503 -572 3657 573 3811 574 3958 579 4112 87 4166 576 4219 582 4338 580 4472 584 4619 91 4673 -581 4726 588 4897 586 5039 585 5185 590 5331 95 5385 587 5438 596 5544 592 5694 593 5841 -594 5988 598 6141 99 6195 103 6248 107 6302 111 6356 595 6410 603 6542 601 6692 599 6838 -600 6985 605 7132 115 7186 119 7240 123 7294 602 7348 608 7480 606 7614 610 7761 607 7815 -615 7921 613 8071 611 8217 612 8369 617 8521 127 8575 614 8629 619 8761 621 8875 618 8929 -625 9022 623 9164 622 9310 627 9464 131 9518 624 9572 630 9678 632 9792 135 9846 629 9900 -634 10006 636 10120 139 10174 300 10228 231 10282 227 10335 347 10387 348 10441 403 10495 349 10549 -% 541 0 obj +545 0 543 134 547 280 502 334 544 391 551 510 553 624 424 678 550 737 559 869 +557 1027 554 1173 555 1327 556 1481 561 1628 79 1682 558 1735 568 1854 562 2020 563 2172 +564 2325 565 2479 566 2626 570 2779 83 2833 567 2886 579 3005 577 3187 571 3333 572 3484 +573 3636 574 3790 575 3944 576 4091 581 4245 87 4299 578 4352 584 4471 582 4605 586 4752 +91 4806 583 4859 590 5030 588 5172 587 5318 592 5464 95 5518 589 5571 598 5677 594 5827 +595 5974 596 6121 600 6274 99 6328 103 6381 107 6435 111 6489 597 6543 605 6675 603 6825 +601 6971 602 7118 607 7265 115 7319 119 7373 123 7427 604 7481 610 7613 608 7747 612 7894 +609 7948 617 8054 615 8204 613 8350 614 8502 619 8654 127 8708 616 8762 621 8894 623 9008 +620 9062 627 9155 625 9297 624 9443 629 9597 131 9651 626 9705 632 9811 634 9925 135 9979 +631 10033 636 10139 638 10253 139 10307 300 10361 231 10415 227 10468 347 10520 348 10574 403 10628 +% 545 0 obj +<< +/Type /Page +/Contents 546 0 R +/Resources 544 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 549 0 R +/Annots [ 543 0 R ] +>> +% 543 0 obj << /Type /Annot /Subtype /Link @@ -6584,50 +6596,50 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.6) >> >> -% 545 0 obj +% 547 0 obj << -/D [543 0 R /XYZ 92.6 752.957 null] +/D [545 0 R /XYZ 92.6 752.957 null] >> % 502 0 obj << -/D [543 0 R /XYZ 435.989 4328.445 null] +/D [545 0 R /XYZ 436.309 248.064 null] >> -% 542 0 obj +% 544 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F45 255 0 R /F22 225 0 R /F25 257 0 R >> /ProcSet [ /PDF /Text ] >> -% 549 0 obj +% 551 0 obj << /Type /Page -/Contents 550 0 R -/Resources 548 0 R +/Contents 552 0 R +/Resources 550 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R +/Parent 549 0 R >> -% 551 0 obj +% 553 0 obj << -/D [549 0 R /XYZ 85.4 752.957 null] +/D [551 0 R /XYZ 85.4 752.957 null] >> % 424 0 obj << -/D [549 0 R /XYZ -3888.794 615.536 null] +/D [551 0 R /XYZ -3888.794 615.536 null] >> -% 548 0 obj +% 550 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F45 255 0 R /F25 257 0 R /F22 225 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 557 0 obj +% 559 0 obj << /Type /Page -/Contents 558 0 R -/Resources 556 0 R +/Contents 560 0 R +/Resources 558 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R -/Annots [ 555 0 R 552 0 R 553 0 R 554 0 R ] +/Parent 549 0 R +/Annots [ 557 0 R 554 0 R 555 0 R 556 0 R ] >> -% 555 0 obj +% 557 0 obj << /Type /Annot /Subtype /Link @@ -6635,7 +6647,7 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.6) >> >> -% 552 0 obj +% 554 0 obj << /Type /Annot /Subtype /Link @@ -6643,7 +6655,7 @@ stream /Rect [364.686 526.079 377.588 535.102] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 553 0 obj +% 555 0 obj << /Type /Annot /Subtype /Link @@ -6651,7 +6663,7 @@ stream /Rect [199.125 485.431 212.027 494.454] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 554 0 obj +% 556 0 obj << /Type /Annot /Subtype /Link @@ -6659,29 +6671,29 @@ stream /Rect [402.247 454.268 409.694 467.901] /A << /S /GoTo /D (section.8) >> >> -% 559 0 obj +% 561 0 obj << -/D [557 0 R /XYZ 92.6 752.957 null] +/D [559 0 R /XYZ 92.6 752.957 null] >> % 79 0 obj << -/D [557 0 R /XYZ 93.6 715.095 null] +/D [559 0 R /XYZ 93.6 715.095 null] >> -% 556 0 obj +% 558 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F17 148 0 R /F45 255 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 566 0 obj +% 568 0 obj << /Type /Page -/Contents 567 0 R -/Resources 565 0 R +/Contents 569 0 R +/Resources 567 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R -/Annots [ 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R ] +/Parent 549 0 R +/Annots [ 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R ] >> -% 560 0 obj +% 562 0 obj << /Type /Annot /Subtype /Link @@ -6689,7 +6701,7 @@ stream /Rect [235.009 613.666 250.941 626.568] /A << /S /GoTo /D (subsection.6.3) >> >> -% 561 0 obj +% 563 0 obj << /Type /Annot /Subtype /Link @@ -6697,7 +6709,7 @@ stream /Rect [357.486 512.53 370.387 521.553] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 562 0 obj +% 564 0 obj << /Type /Annot /Subtype /Link @@ -6705,7 +6717,7 @@ stream /Rect [191.925 471.882 204.826 480.905] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 563 0 obj +% 565 0 obj << /Type /Annot /Subtype /Link @@ -6713,7 +6725,7 @@ stream /Rect [395.046 440.719 402.493 454.352] /A << /S /GoTo /D (section.8) >> >> -% 564 0 obj +% 566 0 obj << /Type /Annot /Subtype /Link @@ -6721,29 +6733,29 @@ stream /Rect [338.092 390.587 350.993 399.61] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 568 0 obj +% 570 0 obj << -/D [566 0 R /XYZ 85.4 752.957 null] +/D [568 0 R /XYZ 85.4 752.957 null] >> % 83 0 obj << -/D [566 0 R /XYZ 86.4 715.095 null] +/D [568 0 R /XYZ 86.4 715.095 null] >> -% 565 0 obj +% 567 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F17 148 0 R /F45 255 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 577 0 obj +% 579 0 obj << /Type /Page -/Contents 578 0 R -/Resources 576 0 R +/Contents 580 0 R +/Resources 578 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R -/Annots [ 575 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R ] +/Parent 549 0 R +/Annots [ 577 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R ] >> -% 575 0 obj +% 577 0 obj << /Type /Annot /Subtype /Link @@ -6751,7 +6763,7 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.6) >> >> -% 569 0 obj +% 571 0 obj << /Type /Annot /Subtype /Link @@ -6759,7 +6771,7 @@ stream /Rect [334.588 640.765 350.52 653.666] /A << /S /GoTo /D (subsection.6.3) >> >> -% 570 0 obj +% 572 0 obj << /Type /Annot /Subtype /Link @@ -6767,7 +6779,7 @@ stream /Rect [374.629 640.765 390.561 653.666] /A << /S /GoTo /D (subsection.6.4) >> >> -% 571 0 obj +% 573 0 obj << /Type /Annot /Subtype /Link @@ -6775,7 +6787,7 @@ stream /Rect [364.686 485.431 377.588 494.454] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 572 0 obj +% 574 0 obj << /Type /Annot /Subtype /Link @@ -6783,7 +6795,7 @@ stream /Rect [199.125 444.784 212.027 453.807] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 573 0 obj +% 575 0 obj << /Type /Annot /Subtype /Link @@ -6791,7 +6803,7 @@ stream /Rect [402.247 413.621 409.694 427.254] /A << /S /GoTo /D (section.8) >> >> -% 574 0 obj +% 576 0 obj << /Type /Annot /Subtype /Link @@ -6799,29 +6811,29 @@ stream /Rect [345.292 363.489 358.194 372.511] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 579 0 obj +% 581 0 obj << -/D [577 0 R /XYZ 92.6 752.957 null] +/D [579 0 R /XYZ 92.6 752.957 null] >> % 87 0 obj << -/D [577 0 R /XYZ 93.6 715.095 null] +/D [579 0 R /XYZ 93.6 715.095 null] >> -% 576 0 obj +% 578 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F17 148 0 R /F45 255 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 582 0 obj +% 584 0 obj << /Type /Page -/Contents 583 0 R -/Resources 581 0 R +/Contents 585 0 R +/Resources 583 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R -/Annots [ 580 0 R ] +/Parent 549 0 R +/Annots [ 582 0 R ] >> -% 580 0 obj +% 582 0 obj << /Type /Annot /Subtype /Link @@ -6829,29 +6841,29 @@ stream /Rect [395.046 386.522 402.493 400.155] /A << /S /GoTo /D (section.8) >> >> -% 584 0 obj +% 586 0 obj << -/D [582 0 R /XYZ 85.4 752.957 null] +/D [584 0 R /XYZ 85.4 752.957 null] >> % 91 0 obj << -/D [582 0 R /XYZ 86.4 715.095 null] +/D [584 0 R /XYZ 86.4 715.095 null] >> -% 581 0 obj +% 583 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F17 148 0 R /F45 255 0 R /F22 225 0 R /F26 363 0 R /F20 364 0 R /F18 307 0 R /F23 361 0 R >> /ProcSet [ /PDF /Text ] >> -% 588 0 obj +% 590 0 obj << /Type /Page -/Contents 589 0 R -/Resources 587 0 R +/Contents 591 0 R +/Resources 589 0 R /MediaBox [0 0 595.276 841.89] -/Parent 591 0 R -/Annots [ 586 0 R 585 0 R ] +/Parent 593 0 R +/Annots [ 588 0 R 587 0 R ] >> -% 586 0 obj +% 588 0 obj << /Type /Annot /Subtype /Link @@ -6859,7 +6871,7 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.6) >> >> -% 585 0 obj +% 587 0 obj << /Type /Annot /Subtype /Link @@ -6867,29 +6879,29 @@ stream /Rect [399.894 589.76 407.341 603.393] /A << /S /GoTo /D (section.8) >> >> -% 590 0 obj +% 592 0 obj << -/D [588 0 R /XYZ 92.6 752.957 null] +/D [590 0 R /XYZ 92.6 752.957 null] >> % 95 0 obj << -/D [588 0 R /XYZ 93.6 715.095 null] +/D [590 0 R /XYZ 93.6 715.095 null] >> -% 587 0 obj +% 589 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F17 148 0 R /F45 255 0 R >> /ProcSet [ /PDF /Text ] >> -% 596 0 obj +% 598 0 obj << /Type /Page -/Contents 597 0 R -/Resources 595 0 R +/Contents 599 0 R +/Resources 597 0 R /MediaBox [0 0 595.276 841.89] -/Parent 591 0 R -/Annots [ 592 0 R 593 0 R 594 0 R ] +/Parent 593 0 R +/Annots [ 594 0 R 595 0 R 596 0 R ] >> -% 592 0 obj +% 594 0 obj << /Type /Annot /Subtype /Link @@ -6897,7 +6909,7 @@ stream /Rect [395.046 559.996 402.493 573.629] /A << /S /GoTo /D (section.8) >> >> -% 593 0 obj +% 595 0 obj << /Type /Annot /Subtype /Link @@ -6905,7 +6917,7 @@ stream /Rect [395.046 223.562 402.493 237.195] /A << /S /GoTo /D (section.8) >> >> -% 594 0 obj +% 596 0 obj << /Type /Annot /Subtype /Link @@ -6913,41 +6925,41 @@ stream /Rect [338.092 173.43 350.993 182.453] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 598 0 obj +% 600 0 obj << -/D [596 0 R /XYZ 85.4 752.957 null] +/D [598 0 R /XYZ 85.4 752.957 null] >> % 99 0 obj << -/D [596 0 R /XYZ 86.4 715.095 null] +/D [598 0 R /XYZ 86.4 715.095 null] >> % 103 0 obj << -/D [596 0 R /XYZ 86.4 431.215 null] +/D [598 0 R /XYZ 86.4 431.215 null] >> % 107 0 obj << -/D [596 0 R /XYZ 86.4 365.879 null] +/D [598 0 R /XYZ 86.4 365.879 null] >> % 111 0 obj << -/D [596 0 R /XYZ 86.4 153.691 null] +/D [598 0 R /XYZ 86.4 153.691 null] >> -% 595 0 obj +% 597 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F17 148 0 R /F45 255 0 R /F44 205 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 603 0 obj +% 605 0 obj << /Type /Page -/Contents 604 0 R -/Resources 602 0 R +/Contents 606 0 R +/Resources 604 0 R /MediaBox [0 0 595.276 841.89] -/Parent 591 0 R -/Annots [ 601 0 R 599 0 R 600 0 R ] +/Parent 593 0 R +/Annots [ 603 0 R 601 0 R 602 0 R ] >> -% 601 0 obj +% 603 0 obj << /Type /Annot /Subtype /Link @@ -6955,7 +6967,7 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.6) >> >> -% 599 0 obj +% 601 0 obj << /Type /Annot /Subtype /Link @@ -6963,7 +6975,7 @@ stream /Rect [402.247 579.493 409.694 593.126] /A << /S /GoTo /D (section.8) >> >> -% 600 0 obj +% 602 0 obj << /Type /Annot /Subtype /Link @@ -6971,37 +6983,37 @@ stream /Rect [402.247 212.842 409.694 226.475] /A << /S /GoTo /D (section.8) >> >> -% 605 0 obj +% 607 0 obj << -/D [603 0 R /XYZ 92.6 752.957 null] +/D [605 0 R /XYZ 92.6 752.957 null] >> % 115 0 obj << -/D [603 0 R /XYZ 93.6 561.815 null] +/D [605 0 R /XYZ 93.6 561.815 null] >> % 119 0 obj << -/D [603 0 R /XYZ 93.6 481.328 null] +/D [605 0 R /XYZ 93.6 481.328 null] >> % 123 0 obj << -/D [603 0 R /XYZ 93.6 154.517 null] +/D [605 0 R /XYZ 93.6 154.517 null] >> -% 602 0 obj +% 604 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F17 148 0 R /F45 255 0 R /F18 307 0 R /F44 205 0 R >> /ProcSet [ /PDF /Text ] >> -% 608 0 obj +% 610 0 obj << /Type /Page -/Contents 609 0 R -/Resources 607 0 R +/Contents 611 0 R +/Resources 609 0 R /MediaBox [0 0 595.276 841.89] -/Parent 591 0 R -/Annots [ 606 0 R ] +/Parent 593 0 R +/Annots [ 608 0 R ] >> -% 606 0 obj +% 608 0 obj << /Type /Annot /Subtype /Link @@ -7009,25 +7021,25 @@ stream /Rect [395.046 635.859 402.493 649.492] /A << /S /GoTo /D (section.8) >> >> -% 610 0 obj +% 612 0 obj << -/D [608 0 R /XYZ 85.4 752.957 null] +/D [610 0 R /XYZ 85.4 752.957 null] >> -% 607 0 obj +% 609 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F17 148 0 R /F45 255 0 R >> /ProcSet [ /PDF /Text ] >> -% 615 0 obj +% 617 0 obj << /Type /Page -/Contents 616 0 R -/Resources 614 0 R +/Contents 618 0 R +/Resources 616 0 R /MediaBox [0 0 595.276 841.89] -/Parent 591 0 R -/Annots [ 613 0 R 611 0 R 612 0 R ] +/Parent 593 0 R +/Annots [ 615 0 R 613 0 R 614 0 R ] >> -% 613 0 obj +% 615 0 obj << /Type /Annot /Subtype /Link @@ -7035,7 +7047,7 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.6) >> >> -% 611 0 obj +% 613 0 obj << /Type /Annot /Subtype /Link @@ -7043,7 +7055,7 @@ stream /Rect [334.005 662.511 349.937 675.413] /A << /S /GoTo /D (subsection.6.2) >> >> -% 612 0 obj +% 614 0 obj << /Type /Annot /Subtype /Link @@ -7051,46 +7063,46 @@ stream /Rect [394.361 145.502 410.293 157.191] /A << /S /GoTo /D (subsection.6.2) >> >> -% 617 0 obj +% 619 0 obj << -/D [615 0 R /XYZ 92.6 752.957 null] +/D [617 0 R /XYZ 92.6 752.957 null] >> % 127 0 obj << -/D [615 0 R /XYZ 93.6 715.095 null] +/D [617 0 R /XYZ 93.6 715.095 null] >> -% 614 0 obj +% 616 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F17 148 0 R /F25 257 0 R /F45 255 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 619 0 obj +% 621 0 obj << /Type /Page -/Contents 620 0 R -/Resources 618 0 R +/Contents 622 0 R +/Resources 620 0 R /MediaBox [0 0 595.276 841.89] -/Parent 591 0 R +/Parent 593 0 R >> -% 621 0 obj +% 623 0 obj << -/D [619 0 R /XYZ 85.4 752.957 null] +/D [621 0 R /XYZ 85.4 752.957 null] >> -% 618 0 obj +% 620 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F45 255 0 R >> /ProcSet [ /PDF /Text ] >> -% 625 0 obj +% 627 0 obj << /Type /Page -/Contents 626 0 R -/Resources 624 0 R +/Contents 628 0 R +/Resources 626 0 R /MediaBox [0 0 595.276 841.89] -/Parent 628 0 R -/Annots [ 623 0 R 622 0 R ] +/Parent 630 0 R +/Annots [ 625 0 R 624 0 R ] >> -% 623 0 obj +% 625 0 obj << /Type /Annot /Subtype /Link @@ -7098,7 +7110,7 @@ stream /Rect [92.604 739.006 100.627 748.453] /A << /S /GoTo /D (section.8) >> >> -% 622 0 obj +% 624 0 obj << /Type /Annot /Subtype /Link @@ -7106,90 +7118,86 @@ stream /Rect [277.347 583.943 290.248 592.966] /A << /S /GoTo /D (cite.PSBLASGUIDE) >> >> -% 627 0 obj +% 629 0 obj << -/D [625 0 R /XYZ 92.6 752.957 null] +/D [627 0 R /XYZ 92.6 752.957 null] >> % 131 0 obj << -/D [625 0 R /XYZ 93.6 715.095 null] +/D [627 0 R /XYZ 93.6 715.095 null] >> -% 624 0 obj +% 626 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F17 148 0 R /F45 255 0 R >> /ProcSet [ /PDF /Text ] >> -% 630 0 obj +% 632 0 obj << /Type /Page -/Contents 631 0 R -/Resources 629 0 R +/Contents 633 0 R +/Resources 631 0 R /MediaBox [0 0 595.276 841.89] -/Parent 628 0 R +/Parent 630 0 R >> -% 632 0 obj +% 634 0 obj << -/D [630 0 R /XYZ 85.4 752.957 null] +/D [632 0 R /XYZ 85.4 752.957 null] >> % 135 0 obj << -/D [630 0 R /XYZ 86.4 715.095 null] +/D [632 0 R /XYZ 86.4 715.095 null] >> -% 629 0 obj +% 631 0 obj << /Font << /F15 160 0 R /F42 161 0 R /F17 148 0 R /F45 255 0 R >> /ProcSet [ /PDF /Text ] >> -% 634 0 obj +% 636 0 obj << /Type /Page -/Contents 635 0 R -/Resources 633 0 R +/Contents 637 0 R +/Resources 635 0 R /MediaBox [0 0 595.276 841.89] -/Parent 628 0 R +/Parent 630 0 R >> -% 636 0 obj +% 638 0 obj << -/D [634 0 R /XYZ 92.6 752.957 null] +/D [636 0 R /XYZ 92.6 752.957 null] >> % 139 0 obj << -/D [634 0 R /XYZ 93.6 722.069 null] +/D [636 0 R /XYZ 93.6 722.069 null] >> % 300 0 obj << -/D [634 0 R /XYZ 93.6 697.846 null] +/D [636 0 R /XYZ 93.6 697.846 null] >> % 231 0 obj << -/D [634 0 R /XYZ 93.6 630.21 null] +/D [636 0 R /XYZ 93.6 630.21 null] >> % 227 0 obj << -/D [634 0 R /XYZ 93.6 592.4 null] +/D [636 0 R /XYZ 93.6 592.4 null] >> % 347 0 obj << -/D [634 0 R /XYZ 93.6 554.287 null] +/D [636 0 R /XYZ 93.6 554.287 null] >> % 348 0 obj << -/D [634 0 R /XYZ 93.6 489.076 null] +/D [636 0 R /XYZ 93.6 489.076 null] >> % 403 0 obj << -/D [634 0 R /XYZ 93.6 425.986 null] ->> -% 349 0 obj -<< -/D [634 0 R /XYZ 93.6 374.324 null] +/D [636 0 R /XYZ 93.6 425.986 null] >> endstream endobj -640 0 obj +642 0 obj << -/Length 7130 +/Length 6525 >> stream 0 g 0 G @@ -7201,71 +7209,90 @@ BT 0 g 0 G [-500(J.)-450(J.)-450(Dongarra,)-479(J.)-450(Du)-450(Croz,)-480(S.)-450(Hammarling,)-479(R.)-450(J.)-450(Hanson,)]TJ/F18 10.9091 Tf 320.772 0 Td [(A)26(n)-466(extende)51(d)-465(set)-465(of)]TJ -298.348 -13.549 Td [(F)26(OR)76(TRAN)-355(Basic)-355(Line)51(ar)-356(A)26(lgebr)51(a)-355(Subpr)51(o)51(gr)51(ams)]TJ/F15 10.9091 Tf 221.802 0 Td [(,)-331(A)28(CM)-331(T)83(ransactions)-331(on)-330(Mathemat-)]TJ -221.802 -13.549 Td [(ical)-333(Soft)28(w)27(are,)-333(14)-333(\0501\051)-334(1988,)-333(1{17.)]TJ 0 g 0 G - -22.424 -21.087 Td [([13])]TJ + -22.424 -24.84 Td [([13])]TJ 0 g 0 G - [-500(S.)-1026(Filip)1(p)-28(one,)-1199(A.)-1026(Buttari,)]TJ/F18 10.9091 Tf 177.354 0 Td [(PSBLAS)-994(3.5.0)-995(User's)-995(Guide.)-994(A)-995(R)52(efer)51(enc)51(e)]TJ -154.93 -13.55 Td [(Guide)-1084(for)-1084(the)-1084(Par)51(al)-51(lel)-1084(Sp)51(ar)1(se)-1084(BLAS)-1084(Libr)51(ar)1(y)]TJ/F15 10.9091 Tf 257.737 0 Td [(,)-1320(2012,)-1320(a)28(v)55(ailable)-1122(from)]TJ/F45 10.9091 Tf -257.737 -13.549 Td [(https://github.com/sfilippone/psblas3/tree/master/docs)]TJ/F15 10.9091 Tf 309.269 0 Td [(.)]TJ + [-500(S.)-1026(Filip)1(p)-28(one,)-1199(A.)-1026(Buttari,)]TJ/F18 10.9091 Tf 177.354 0 Td [(PSBLAS)-994(3.5.0)-995(User's)-995(Guide.)-994(A)-995(R)52(efer)51(enc)51(e)]TJ -154.93 -13.549 Td [(Guide)-1084(for)-1084(the)-1084(Par)51(al)-51(lel)-1084(Sp)51(ar)1(se)-1084(BLAS)-1084(Libr)51(ar)1(y)]TJ/F15 10.9091 Tf 257.737 0 Td [(,)-1320(2012,)-1320(a)28(v)55(ailable)-1122(from)]TJ/F45 10.9091 Tf -257.737 -13.55 Td [(https://github.com/sfilippone/psblas3/tree/master/docs)]TJ/F15 10.9091 Tf 309.269 0 Td [(.)]TJ 0 g 0 G - -331.693 -21.087 Td [([14])]TJ + -331.693 -24.84 Td [([14])]TJ 0 g 0 G [-500(S.)-330(Filipp)-28(one,)-330(A.)-330(B)-1(u)1(ttari,)]TJ/F18 10.9091 Tf 143.238 0 Td [(Obje)51(ct-Oriente)51(d)-354(T)76(e)51(chniques)-354(for)-355(Sp)51(arse)-355(Matrix)-355(Com)1(puta-)]TJ -120.814 -13.549 Td [(tions)-424(in)-423(F)77(ortr)51(an)-424(2003)]TJ/F15 10.9091 Tf 104.62 0 Td [(.)-405(A)28(CM)-405(T)83(r)1(ansac)-1(tion)1(s)-405(on)-405(on)-405(Mathematical)-405(Soft)28(w)28(are,)-423(38)-405(\0504\051,)]TJ -104.62 -13.549 Td [(2012,)-333(art.)-334(23.)]TJ 0 g 0 G - -22.424 -21.088 Td [([15])]TJ + -22.424 -24.84 Td [([15])]TJ 0 g 0 G - [-500(S.)-312(Filip)1(p)-28(one,)-316(M.)-312(Cola)-56(j)1(anni,)]TJ/F18 10.9091 Tf 155.667 0 Td [(PSBLAS:)-338(A)-338(Libr)51(ary)-338(for)-337(Par)51(al)-51(lel)-338(Line)51(ar)-338(A)26(lgebr)51(a)-338(Com-)]TJ -133.243 -13.549 Td [(putation)-284(on)-284(Sp)51(arse)-284(Matric)51(es)]TJ/F15 10.9091 Tf 131.984 0 Td [(,)-269(A)28(CM)-253(T)83(ransactions)-253(on)-253(Mathematical)-253(Soft)27(w)28(are,)-269(26)-253(\0504\051,)]TJ -131.984 -13.549 Td [(2000,)-333(527{550.)]TJ + [-500(S.)-312(Filip)1(p)-28(one,)-316(M.)-312(Cola)-56(j)1(anni,)]TJ/F18 10.9091 Tf 155.667 0 Td [(PSBLAS:)-338(A)-338(Libr)51(ary)-338(for)-337(Par)51(al)-51(lel)-338(Line)51(ar)-338(A)26(lgebr)51(a)-338(Com-)]TJ -133.243 -13.55 Td [(putation)-284(on)-284(Sp)51(arse)-284(Matric)51(es)]TJ/F15 10.9091 Tf 131.984 0 Td [(,)-269(A)28(CM)-253(T)83(ransactions)-253(on)-253(Mathematical)-253(Soft)27(w)28(are,)-269(26)-253(\0504\051,)]TJ -131.984 -13.549 Td [(2000,)-333(527{550.)]TJ 0 g 0 G - -22.424 -21.088 Td [([16])]TJ + -22.424 -24.84 Td [([16])]TJ +0 g 0 G + [-500(S.)-303(Gratton,)-309(P)84(.)-303(Henon,)-309(P)83(.)-303(Jiranek)-303(an)1(d)-303(X.)-303(V)83(asseur,)]TJ/F18 10.9091 Tf 258.865 0 Td [(R)51(e)51(ducing)-330(c)52(omplexity)-330(of)-330(algebr)51(aic)]TJ -236.441 -13.549 Td [(multigrid)-349(b)1(y)-349(aggr)51(e)51(gation)]TJ/F15 10.9091 Tf 114.383 0 Td [(,)-325(Numerical)-324(Lin.)-323(Algebra)-324(with)-323(Applications,)-325(2016,)-326(23:501-)]TJ -114.383 -13.549 Td [(518)]TJ +0 g 0 G + -22.424 -24.841 Td [([17])]TJ 0 g 0 G [-500(W.)-413(Gropp,)-433(S.)-413(Huss-Lederman,)-433(A.)-413(Lumsdaine,)-433(E)1(.)-413(Lusk,)-433(B.)-413(Nitzb)-28(erg,)-433(W.)-413(Saphir,)]TJ 22.424 -13.549 Td [(M.)-349(Snir,)]TJ/F18 10.9091 Tf 43.142 0 Td [(MPI:)-372(The)-372(Complete)-372(R)51(efer)51(enc)51(e.)-372(V)77(olume)-372(2)-373(-)-372(The)-372(MPI-2)-372(Extensions)]TJ/F15 10.9091 Tf 318.187 0 Td [(,)-353(MIT)]TJ -361.329 -13.549 Td [(Press,)-333(1998.)]TJ 0 g 0 G - -22.424 -21.087 Td [([17])]TJ + -22.424 -24.84 Td [([18])]TJ 0 g 0 G [-500(C.)-347(L.)-347(La)28(wson,)-351(R.)-347(J.)-347(Hanson,)-350(D.)-347(Kincaid,)-350(F.)-347(T.)-347(Krogh,)]TJ/F18 10.9091 Tf 287.094 0 Td [(Basic)-370(Line)51(ar)-371(A)26(lgebr)51(a)-370(Sub-)]TJ -264.67 -13.549 Td [(pr)51(o)51(gr)51(ams)-395(for)-396(F)26(OR)77(TRAN)-396(usage)]TJ/F15 10.9091 Tf 149.357 0 Td [(,)-385(A)28(CM)-374(T)83(ransactions)-374(on)-375(Mathematical)-374(Soft)28(w)28(are,)-385(5)]TJ -149.357 -13.55 Td [(\0503\051,)-333(1979,)-334(308{323.)]TJ 0 g 0 G - -22.424 -21.087 Td [([18])]TJ + -22.424 -24.84 Td [([19])]TJ 0 g 0 G [-500(X.)-408(S.)-408(Li,)-427(J.)-408(W)1(.)-408(De)-1(mmel,)]TJ/F18 10.9091 Tf 147.871 0 Td [(Sup)51(erLU)]TJ ET q -1 0 0 1 276.516 415.221 cm +1 0 0 1 276.516 340.765 cm []0 d 0 J 0.398 w 0 0 m 3.345 0 l S Q BT -/F18 10.9091 Tf 279.861 415.022 Td [(DIST:)-426(A)-427(Sc)51(alable)-426(Distribute)51(d-memory)-426(Sp)51(arse)]TJ -171.037 -13.549 Td [(Dir)51(e)51(ct)-342(Solver)-343(for)-342(Unsymmetric)-342(Line)51(ar)-343(Systems)]TJ/F15 10.9091 Tf 222.383 0 Td [(,)-320(A)28(CM)-317(T)83(ran)1(s)-1(actions)-316(on)-317(Mathemat-)]TJ -222.383 -13.549 Td [(ical)-333(Soft)28(w)27(are,)-333(29)-333(\0502\051,)-334(2003,)-333(110{140.)]TJ +/F18 10.9091 Tf 279.861 340.566 Td [(DIST:)-426(A)-427(Sc)51(alable)-426(Distribute)51(d-memory)-426(Sp)51(arse)]TJ -171.037 -13.549 Td [(Dir)51(e)51(ct)-342(Solver)-343(for)-342(Unsymmetric)-342(Line)51(ar)-343(Systems)]TJ/F15 10.9091 Tf 222.383 0 Td [(,)-320(A)28(CM)-317(T)83(ran)1(s)-1(actions)-316(on)-317(Mathemat-)]TJ -222.383 -13.549 Td [(ical)-333(Soft)28(w)27(are,)-333(29)-333(\0502\051,)-334(2003,)-333(110{140.)]TJ 0 g 0 G - -22.424 -21.088 Td [([19])]TJ + -22.424 -24.84 Td [([20])]TJ 0 g 0 G - [-500(Y.)-466(Nota)27(y)84(,)-500(P)83(.)-466(S.)-467(V)83(assilevski,)]TJ/F18 10.9091 Tf 163.479 0 Td [(R)51(e)51(cursive)-480(Krylov-b)51(ase)51(d)-480(multigrid)-480(cycles)]TJ/F15 10.9091 Tf 191.67 0 Td [(,)-500(Numerical)]TJ -332.725 -13.549 Td [(Linear)-333(Algebra)-334(with)-333(Applications,)-333(15)-333(\0505\051,)-334(2008,)-333(473{487.)]TJ + [-500(Y.)-466(Nota)27(y)84(,)-500(P)83(.)-466(S.)-467(V)83(assilevski,)]TJ/F18 10.9091 Tf 163.479 0 Td [(R)51(e)51(cursive)-480(Krylov-b)51(ase)51(d)-480(multigrid)-480(cycles)]TJ/F15 10.9091 Tf 191.67 0 Td [(,)-500(Numerical)]TJ -332.725 -13.55 Td [(Linear)-333(Algebra)-334(with)-333(Applications,)-333(15)-333(\0505\051,)-334(2008,)-333(473{487.)]TJ 0 g 0 G - -22.424 -21.087 Td [([20])]TJ + -22.424 -24.84 Td [([21])]TJ 0 g 0 G [-500(Y.)-333(Saad,)]TJ/F18 10.9091 Tf 66.97 0 Td [(Iter)51(ative)-358(metho)52(ds)-358(for)-358(sp)51(arse)-358(l)1(ine)51(ar)-358(systems)]TJ/F15 10.9091 Tf 202.98 0 Td [(,)-333(2nd)-334(editi)1(on,)-334(SIAM,)-333(2003.)]TJ 0 g 0 G - -269.95 -21.088 Td [([21])]TJ + -269.95 -24.84 Td [([22])]TJ 0 g 0 G [-500(B.)-505(Smith,)-549(P)84(.)-506(Bjorstad,)-548(W.)-506(Gropp,)]TJ/F18 10.9091 Tf 200.295 0 Td [(Domain)-516(De)51(c)51(omp)51(osition:)-776(Par)51(al)-51(lel)-516(Multilevel)]TJ -177.871 -13.549 Td [(Metho)51(ds)-432(for)-432(El)-51(liptic)-433(Partial)-432(Di\013er)51(ential)-432(Equations)]TJ/F15 10.9091 Tf 244.309 0 Td [(,)-434(Cam)27(bridge)-414(Univ)28(ersit)28(y)-415(Pr)1(e)-1(ss,)]TJ -244.309 -13.549 Td [(1996.)]TJ 0 g 0 G - -22.424 -21.087 Td [([22])]TJ + -22.424 -24.841 Td [([23])]TJ 0 g 0 G - [-500(M.)-317(Snir,)-321(S.)-317(Otto,)-321(S.)-317(Huss-Lederman,)-321(D.)-317(W)83(alk)28(er,)-321(J.)-317(Dongarra,)]TJ/F18 10.9091 Tf 317.503 0 Td [(MPI:)-343(The)-343(Complete)]TJ -295.079 -13.55 Td [(R)51(efer)51(enc)51(e.)-357(V)76(olume)-357(1)-358(-)-358(The)-358(MPI)-357(Cor)51(e)]TJ/F15 10.9091 Tf 179.356 0 Td [(,)-333(second)-334(edition,)-333(MIT)-333(Press,)-334(1998.)]TJ + [-500(M.)-317(Snir,)-321(S.)-317(Otto,)-321(S.)-317(Huss-Lederman,)-321(D.)-317(W)83(alk)28(er,)-321(J.)-317(Dongarra,)]TJ/F18 10.9091 Tf 317.503 0 Td [(MPI:)-343(The)-343(Complete)]TJ -295.079 -13.549 Td [(R)51(efer)51(enc)51(e.)-357(V)76(olume)-357(1)-358(-)-358(The)-358(MPI)-357(Cor)51(e)]TJ/F15 10.9091 Tf 179.356 0 Td [(,)-333(second)-334(edition,)-333(MIT)-333(Press,)-334(1998.)]TJ 0 g 0 G - -201.78 -21.087 Td [([23])]TJ + -201.78 -24.84 Td [([24])]TJ 0 g 0 G [-500(K.)-303(St)-27()527(ub)-27(en,)]TJ/F18 10.9091 Tf 77.278 0 Td [(A)26(n)-330(Intr)51(o)51(duction)-329(to)-330(A)25(l)1(gebr)51(aic)-330(Multigrid)]TJ/F15 10.9091 Tf 183.285 0 Td [(,)-309(in)-302(A.)-303(Sc)28(h)-28()528(uller,)-309(U.)-303(T)84(rotten)27(b)-27(erg,)]TJ -238.139 -13.549 Td [(C.)-333(Oosterlee,)-334(Multigrid,)-333(Academic)-333(Press,)-334(2001.)]TJ 0 g 0 G - -22.424 -21.087 Td [([24])]TJ 0 g 0 G - [-500(R.)-408(S.)-408(T)83(uminaro,)-427(C.)-408(T)84(ong,)]TJ/F18 10.9091 Tf 152.548 0 Td [(Par)51(al)-51(lel)-426(Smo)51(othe)51(d)-427(A)51(ggr)51(e)51(gati)1(o)-1(n)-426(Multigrid:)-597(A)51(ggr)51(e)51(gation)]TJ -130.124 -13.55 Td [(Str)51(ate)51(gies)-369(on)-370(Massively)-369(Par)51(al)-51(lel)-370(Machines)]TJ/F15 10.9091 Tf 200.325 0 Td [(,)-349(in)-346(J.)-347(Donn)1(e)-1(l)1(le)-1(y)84(,)-349(e)-1(d)1(itor,)-350(Pro)-27(c)-1(eedin)1(gs)-347(of)]TJ -200.325 -13.549 Td [(Sup)-28(erComputing)-333(2000,)-333(Dallas,)-334(2000.)]TJ +ET + +endstream +endobj +646 0 obj +<< +/Length 1191 +>> +stream +0 g 0 G +BT +/F42 10.9091 Tf 93.6 740.002 Td [(References)]TJ/F15 10.9091 Tf 401.542 0 Td [(47)]TJ +0 g 0 G 0 g 0 G - -22.424 -21.087 Td [([25])]TJ + -401.542 -35.866 Td [([25])]TJ 0 g 0 G - [-500(P)83(.)-293(V)84(an)27(\024)473(ek,)-302(J.)-293(Mandel,)-301(M.)-293(Brezina,)]TJ/F18 10.9091 Tf 183.276 0 Td [(A)26(lgebr)51(aic)-321(Multigrid)-321(by)-321(Smo)51(othe)52(d)-321(A)51(ggr)51(e)51(gation)-321(for)]TJ -160.852 -13.549 Td [(Se)51(c)51(ond)-358(and)-357(F)76(ourth)-357(Or)51(der)-358(El)-51(liptic)-358(Pr)51(oblems)]TJ/F15 10.9091 Tf 205.92 0 Td [(,)-333(Computing,)-333(56)-334(\0503\051)-333(1996,)-333(179{196.)]TJ + [-500(R.)-408(S.)-408(T)83(uminaro,)-427(C.)-408(T)84(ong,)]TJ/F18 10.9091 Tf 152.549 0 Td [(Par)51(al)-51(lel)-426(Smo)51(othe)51(d)-427(A)51(ggr)51(e)52(gation)-427(Multigrid:)-597(A)51(ggr)51(e)51(gation)]TJ -130.125 -13.549 Td [(Str)51(ate)51(gies)-369(on)-370(Massively)-369(Par)51(al)-51(lel)-370(Machines)]TJ/F15 10.9091 Tf 200.326 0 Td [(,)-349(in)-346(J.)-347(Don)1(nelley)83(,)-349(editor,)-350(Pro)-27(ce)-1(edi)1(ngs)-347(of)]TJ -200.326 -13.549 Td [(Sup)-28(erComputing)-333(2000,)-333(Dallas,)-334(2000.)]TJ +0 g 0 G + -22.424 -22.516 Td [([26])]TJ +0 g 0 G + [-500(P)83(.)-293(V)83(an)28(\024)473(e)-1(k)1(,)-302(J.)-293(Mandel,)-301(M.)-293(Brezina,)]TJ/F18 10.9091 Tf 183.276 0 Td [(A)26(lgebr)51(aic)-321(Multigrid)-321(by)-321(Smo)51(othe)51(d)-320(A)51(ggr)51(e)51(gation)-321(for)]TJ -160.852 -13.549 Td [(Se)51(c)51(ond)-358(and)-357(F)76(ourth)-357(Or)51(der)-358(El)-51(liptic)-358(Pr)51(oblems)]TJ/F15 10.9091 Tf 205.92 0 Td [(,)-333(Computing,)-334(56)-333(\0503\051)-333(1996,)-333(179{196.)]TJ 0 g 0 G 0 g 0 G ET endstream endobj -659 0 obj +665 0 obj << /Length1 2154 /Length2 17514 @@ -7432,7 +7459,7 @@ a ¤­;­rýnLŠ0åŽiZzu“¦é‚™É=u'~ŽøIƒAî PFAjè@éþõ$–û¾ ¹Îö„žã×üuú†—3ÄÊx £àåqµX endstream endobj -661 0 obj +667 0 obj << /Length1 2180 /Length2 15410 @@ -7584,7 +7611,7 @@ gL(H óUléX&_H7¢“òÀKã(C~¶@h«TT ÒEIG¥ x±¢6²ÙÃ$a„ÐmÙDÍ‘6MÔzÌháÉÞ¤Âb¶¬7‡—¡Ó[ȼ"äÃà÷Ù”RO¨¹kQpDß‚X†›¿žYÜP†KL:&Z’ IZ Å«H\£’´ùžE½cÆŠ9Šg­/ʵ,Ižkž™Èî3‹Ì¹’¥·1Ë܃ÇzZĉV£baÞw )!v¯ 1ôrœu|[·øZ9¿Z}´+,$xÔR¼K®ÞƒHœ7ö§²jR—…[UçâÏ endstream endobj -663 0 obj +669 0 obj << /Length1 2067 /Length2 14426 @@ -7738,7 +7765,7 @@ L ŽCpÙÔ#¿mRuWVf}š/ÀfsgšB9ˆÜÅ°ñˆ±Qa!X¼|n`¬ûpû´"õ•ÎI¸!Îô„Ä\9œêDÆÓÓ윮¶CÑÄ9¶‹Ñû31 endstream endobj -665 0 obj +671 0 obj << /Length1 1539 /Length2 6948 @@ -7818,7 +7845,7 @@ W K—ñdÐßü…åýÊN늦)ŸÌ^âÜübIªÿ|úÔÙÙ_|Kż7mÐfÕ:=ã"®<d‹Ú„¡Ç`PcŽÄðÀ9¶$+ïÇôû+ á«ÔÿwgêD¢' endstream endobj -667 0 obj +673 0 obj << /Length1 1946 /Length2 13085 @@ -7961,7 +7988,7 @@ r%lw ±³> endstream endobj -669 0 obj +675 0 obj << /Length1 1418 /Length2 6498 @@ -8038,7 +8065,7 @@ JVz 9ÿ j‘u,—ÚÊl_P!V%ý*<ù"Œ²-" ªö©8¥“qŸ, Þ{Pô²¶v©¤:ø‰ë®v endstream endobj -671 0 obj +677 0 obj << /Length1 1594 /Length2 8979 @@ -8141,7 +8168,7 @@ E ‡ Ð6ÏÀúŽølÔÓ‚ò >X—4’ËHÂswP…>OÜдÝ@ é²Îßwš_¹ò˜ú9´3Ê/ endstream endobj -673 0 obj +679 0 obj << /Length1 2717 /Length2 23393 @@ -8373,12 +8400,12 @@ V, –8dz1©Y«}M¢•±~2°ÒÙwû^fǸM¬ýI/Á,ô3ÿ=–Ü÷ÂýÅó(5ŽÇ©¾c’…¡CuTP!ŽØC±·+†QýµSéùf°µ +Y ûƒík›µLÓ1bVÀ„\Ä Oñ=®Ú‹CåÃ!â‰Xó!°³Í‹²é1ã=Ó¦x>²sJsÊec„ôn”ºOfÓÖ œÁiù¸D q¦” Ðú®K ‚¥@ •_q߯®Ð\>3¯üò$æ©ÐGOÚ ¼œ;«ÚPöŒT:LŸ“úô«‚ŽZ¦‚Ë„ï"C1/1-6âûz,ef´b™Èü‡.·K;Ü9ZŽ˜§°P–¢£?l÷jÓXÚОåÒi¡ŸgR%(ÌW6¾3¯5EZq‡€ËZÖ£€²®‹e”zï¬cÒygÖ! 2EMR½ßÜé}Z~µŠ­ÿÝ;r­‹™Ñ`‰ûŽ]Šù{žÚ_ IyÑO‰õ!óåöÒÊJZó:>À3Öf(R±4}øª±AfîhŠ<ãJæô­ÇJfh¬çfæ#,î¦ÀM'Çâ®6ØÇÜ­¸Lia<žFM!]¤Â¹rÞ,½P™ÓŸâUûëD"Ík_Qœ¹½"œ)¯Š–è~d·¾h¯©3Ž<‚ Ú“²£¢ß 4ùqßQvN«~_mZFíû·~í ƒ6ˆÉ# Z“À5<Ĭ'÷ endstream endobj -675 0 obj +681 0 obj << /Length1 1996 -/Length2 13118 +/Length2 13162 /Length3 0 -/Length 15114 +/Length 15158 >> stream %!PS-AdobeFont-1.0: CMR12 003.002 @@ -8398,7 +8425,7 @@ FontDirectory/CMR12 known{/CMR12 findfont dup/UniqueID known{dup 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def -/FontName /SNVSAK+CMR12 def +/FontName /OIRSPO+CMR12 def /FontBBox {-34 -251 988 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin @@ -8430,6 +8457,7 @@ dup 58 /colon put dup 44 /comma put dup 100 /d put dup 101 /e put +dup 56 /eight put dup 102 /f put dup 12 /fi put dup 103 /g put @@ -8446,7 +8474,6 @@ dup 92 /quotedblleft put dup 34 /quotedblright put dup 114 /r put dup 115 /s put -dup 55 /seven put dup 116 /t put dup 51 /three put dup 50 /two put @@ -8481,34 +8508,32 @@ a`O ED ´pèCr:ñ°óåÔìQ=£ä‘èâÌWµ8{‘mCUØ·;·Qtþã[®ŠZߪjÆš´|YQ4ÈæC<ZeÏØîoäåúD…r%`Ôʶ@B¦ˆ‹>ð:Õo%1+A±%1òÐë{$ÞvKÙ* ë1u+†ôSpÄŠ))2"yLÞoŸ¨)5 ?©=› t³pºB,áî›ÎRbÅItßh*ÅNAoÙŸ£(Òž/'¹JÀ 2ãnbq„Ê»°oHœôµs˜TòV}1´ˆ¶aøÄ^½/°ðîJ!ˆÃÜÒFæŸb,ìôàŸ%Øu·Î¦*¢} M-Éóë8³ããp—y‘|»Ï/µr,gÿZŽhç½ÍV|È1íx·ASt­W[*äÓáVÖ{×~±öR‰)Ÿsoßÿ@±œío1¤Ë ÔĆl†Åñ<¤T«]Å4Xùró{—8hßSb° ?8xâ3Ÿ2EëvŠÑlßF(ÕûêlõmSF¶¶ÁÚØØ3)—_J¡†˜/GÚGÓ‰ /ùz6­}EÑæ3N™1yÄÕ]¬‚ãûÎU2ÇdÞè:I ¹ËûÏb’ô%ó“©Jë®eU»EÜ/Ö>1;Ï æ‚Ùžl¶#¡[êŒâŸÈxXÀCVâ)à5PU’Ç|„ðøÎþìÓåÌ–Za×2¨{¤È¾\ç:qy<ƒiv<þ)‡­üõë‚ê&ÒgéÛ’ùþ¥ƒ…­g ´ÉŠþö"pݱ¥ÃCšWÃïµÛîï¬ÙLyÂǯ›iJïzã)³ìA•l‰ˆ¡ÑÖ ü{J©¥?ëó¦Þ@A)ó$Q½ƒø·ç*1sÓÿ꜄4Øo6êç$O{>&Ì&„ á‘p%<ÇkFjà|o{ÜPyæHt‘ºzTΫ°?¨D‹vZTeÛ-óŸ4•îUŽV€Ï•}€kÛyZÿždk¯xE¡ù½CIm „rV û—Û Gú;±Ò¨*Ç8ûx=NS˜¬È¶˜ˆ@¬p¼e÷ŠJ³gst.i> ˆ¹Yž¶++´ÉÙkí¨Bɸ*þòŽÙ{Ô·4|Ç Q)#‡ûß_Ae·ðÀƒ/¶²ÝwD­¨Çz"—ÀnÛbùŒªìÖL”B—êSΆaóð…îc¡­TשýB³ù hüH$ÆDøQµq½¡íî•N§›=…RÑ|t ¯àD­Îr\}¬cŠ*,ý3|âÏU ÙÛïaÇImؤð‹T"&s&,IÕýÞrãËס~ ¶ÅJrï£ðß/ÿ$%¦\˜Œ—%±³`ìxã´à†Ò”§Ìdm0©W4áBm0Lj#8NçcMM%™§Fdâ-¤#)©î,›&ÿ0˜@Hó“±ä1´ACaÎ1²J^’ Å KHìí#ù'J…MäÎåd}w'=¶å*öùÐ=×UÑ\&:ë–.éŸ/X¨êšÅ. Ûÿø¹2Í©Q¼5jBñ·Q\x@é)oBlrb_PÔ¤K}ÏFƒ¤Ï †-¨‰Ó²§µÂO-ž³/;àÿÌrÓã' 8ÍŒ8 äê°¸éÏc¾7¥ÑfߌJšƒêD_æYJÓ²–ΚvM± ™9¾Îö {ê;=aŒÜA½¤ÿöç¶is¯²Lͦ¯S;à½õ¶r·½¥½[§Ëc9çi³(*3«Â¼©¸^H"1ò¸R†ø pÍ/ÚÇZà£VЖo=§mÈŽ7Ø8íxsZð¤yFš^“åÖó5Oê‚·’Žl9 -P*¹Œ1v–§ƒØx« ¶>VãsHLÑÀTÞøÝÞñoˆ{›§¥÷¸t:¨–‹ùà FgÚ ‹+4Bcúë>orQž w©¥ÿ±Ø|Lkô·mdg ÜÄàO¢»øàâ¡NáµJ%£¥®N‘YqC{Ê%mK§AM %;õLÝ…ólÊ„‘T*–2 ƒ:È5 hæÛéN®­Z¸k°›»gø1„E“û·Õž Ç Ã—¥éL²µ¼3{L(ÔΫQp>"¾×¦ÞÚHi*òa–±ç¡pD‰(?9Ø}¢-…$E«[ý¿}Ë? T¸(“Ð?ˆ¹ ò¯Ì­°Ö^ -/F:£}ì°Ã‘Ìâ`²¼Iæ£qÒ"5zîJÊ Èdw^Êç½ —Ò”ÃZì""Aªéo¢#Þñn‚-^‚¦}ÏÎz.mÖ1›Ø‹§Áâ%¨+¡ pÊ×ËÜWRöľœˆ'ØUcC¬Ûu>O®aê>-¨ïñAvBw ê39í[@x"Ýn߇ñÎX<ÎŒóú°…åºÇ(ÿȨ‹Îû¾}_£ûäÒ©JÔˆÑ#£2 Y+ò—ZR˜E]ò œ$àÿóL+æ‚ê“h•%¶ã(vJ#ߤ)KèƒÒÔÏ07×øœ)ææ¢Æ a‚_;AC á’Î,ø-5™ôLá•ÀTôŠª.:a»r§Fìóû¥eâ°ÕhîÉH{S£Š4ŸìË6™cÁú"ÒÂ8Á—Ú+0¦+Ρe35ÐÎ6 •‚P$¸óyëkÝPÎãÛŒA ËC|æ€×kô¸¾1ht²Áy¤ðèO™Á0Þ{ -n4%6BÛæpËû¼……^擄Œ?H’`$%’¼ÈM`ÛϬ4døwÒÊ ›I%¡®Øö±q\qÓFš18æ:Ë32ŠË‘Ç æsÓ¦€è£"ðëë7kèû8ÂñÈxf)ÏžñØ´£4KRÜ­‰ @ãúKœ?™„"9è é‘ÉoV¸c‘‡ü;r®ªÐ) FùÈÈQdË$-ãØ^»;TËÕ*’جßÀùÇ"49vI -öuFƒžŽl³[ÙÈ»wR’÷ÒOÈ -9‘ÂÕBå -{” lEf@¥«²j`?Œ!š]#'/ -0;’üë3ŠHqIÙQÐ)® 2˜,U‚¬ò7FQÉWR;ŠY±ï[¨†Mè>«á }¦p‚ƒ”È4'()Ä›wÚVg-ã‘G¨ÅJ€ÓþC(WÊ‹rƒ*ŠïÃÛ8„õ$çÙ‰û…©çˆÁeЖ¿›s R7G¤Gžoª^›q´ΪŽð™Ä5æß÷L%räYÕu¿@·´R I-V³xë*ªLðªkH‘ÿÅël^m{¼I‹`øÿ@¸Þ>#6v¾O‚l ”ÔqRò™Ÿ§Qó¢: w—Tx-.1|LøŠÉ ½(éFèÜišWeT~heR5 ˜M9…»ÏŠòŽ­xœ#UYÔŠ»˜E¾ùwÑWlÌÀìÕ4n˳Ó2Xê¤PœZJâ)ô øm^û2B4j|¦aŽî¿]AÔ;“æ­þB—j’ð÷hTM›¨Í„hM‘;I­€­œzèpmdBœJÇxIŒ­' |‡ÞÞ~¥ƒ(ç|˜9ËBrõÔ[6Ë£„)Þ”#@¤ -±tOý}ã PIœ·¢ÞÚ¨ù¶¿I']y -\3 <^SçÎø‡ûÿ¾|‚ÎSc¤ðçPx¦ -ñ?0c>7š¼Xͺ² NUÄÜb2aØQ¢ÓÓ:Ž#w Þ0e1I3t_Ã'"Á²œ)*á[ù4Ö X8¥Œ×1e~âÈ! /íjn«r9A14DU•e³CãÔáQ8–Š€ÄHÇ—¡§©’³ÀñjØÁ]2”ÑkíâãëZÆã"îßZÌ(¨ UyþZä+æƒüa#1!ÞŒa6¸ãÒi£’9ê*zù -'žxɱLQ-Æßt“qÔdõHY8®)K9ï1AõŒã‡ßˆœ³£ÚOºeˆöDì{·ß‰WOY'»Š3–ãÝyä–rCžÆ‚]ÒâýÚaaDÒGUƒî†MLðM>F"M[³´·bæÔ‰ØÐEv©«Ç)¾hîPÐ]÷ElÔp—¾j}V/×üeDÏ.ß‹¥ha¤Ô,émc_-`‡,Ðí Eÿƒ¸Ä›#ëq"£TmNÛE°’¼Bm¥ï†ÄDë÷^§UÓ]ßø(azΖ@³Foµ:IZ©§Ù/}Í͈•Œíª»£jZpŒÞWÚnàèÄ› (þºÅèYüŠm=âòÞvƒÊ£\ÆGSv–Q<UX±Z•…ä_Uá-‡wp´C*±uFW]y‰A¼ éÒ÷ùñÛØ5O$‡ÍöpõåàӲƹx³ÓDÙmô‘Üž—Ÿí­õz¡ÄHl³gÍZŸg³Vœ‹ -}SGã‰Y ¹Ø-¦4dNL÷Ko=»òßdZ¸ua¥”éã¶L—#®ÎØì H44T¹–`5lMè%‘æ­ØÕæ¯<ÝðV–í€ ÜȘô[Ñ?]ígzvjl>d®mákÍ MŽ 2ú¬Q£'_IʿJì\n÷Mm˜â×KV5èYÌq@`B?î…YŸ’"IÏ¿L¹åû˜5ÚQ8é¡Øœ‰bÜ"؃‚.ƒM4âûdjd±³ë³.&[M²ùI]ç¡Q²5–4þk{ä"ä´{¦ä͹I§é†³Ä®ÃVÊ„Ç¿ûåØÐóڑ࣠E·3l=#)½ქvCœ¤¶=/`‹è}¨*›Ÿ˜5[ëyû½ê½6çjÍ;·.×S<©‡…ºCµÕO‰IêÓ^­`yBÂÀ‰ÙæñëÜ›.&§áD»%êÖD® $±"JÅ»Ýö’l,‰à‡ÕácÌôÈt™Ÿ¢‹p­^bý#Ç Þ5…+@M¨ß<3 dM*šRf*X ‡#<+–£å‰ÅõtË€²+é×M‹Ìøûª-**26ŠEOd†¿qëmÀÉhÝçæ‡;tó¸´jºœŸý̼\ÓÕÕ$éçèÅ8ï -»µn¢JLB§™ƒQÊ È&±ÌR3Ñ®l¡´Y%Ís;ãå ³Éˆº>^™ö„ÑZNËcSÅúŒôçÓ Ày˜1÷#_"dËvâSe•YóÏ—ÿñyqZzø2‚º@•ËŠ}L¹ˆYþ6£ÐºD~_Ûg[6ùº×@NI-½åš£>˜‡Ôf½Çr““¿7#qJ{·¿¨ÆÇâSÐùÁqôñ n ŒêìBwW¥h¾³˜Nµ8-·þÈÄDšÑ7í?Ӯγ‡ï{kZœ;jehJí‹êæU•®óx;ÊRö‹•ô·üŽ»lWjúš/úUyhz:íU ¿O·º=‘–‹¾æücç5õ2Ä£ˆõoJ d·ÀFÀÊôµ+*¡Ý¸PÙ±®o¸ºû™Þµ¯.À6/3žÔ ^9Þÿ»µáã¿ãßi³½þÚç¸áÊÕ›³ç±äÉêá2Á ™‘ ?Z2ºñ‰UGYò YèêJUpA½"¶?Jb•¯C_ëÈmæåYýY«ZWÒ§$3>Ë3VíÜï!€ïyOѳ•>1­¬ÎðÇcQø#Û¥eô?ÅÇ1eÜtÒ°úp8m”w];¿TŸL©hV› QaèÆÁRrð´C-mÍ^r×S[ZO±ðWtá1GcÓ±ñëõâo8™ç ”iøŸ„=&hbœ‘îÑ€ã]9Ç>nÜêõ€ö{Û"1„“¤t†"ȾW¯MãúŽ¢i*èáË%§²LÕ{4çÎ*Ê –ˆŒ¯—´Sªaþ¡31(^°…[ti?d^Ûã@§3úQ"—á?dÚt%Àd‘–,Og&,“^cdäe5;"˜ù$a:ÜÀŒë/.ŸüÝIí}„ÐA%þÞ›pvÇ—Ds§/µ„|;È'!Å嶊1àUt¾éAúˆæ>o»ßx»§…G -€Þ2j7×K ЛzX”7ô8x÷×n[ã Šã”Éùׇ¼ú^;“Ül âäY~Â0ŠªP‘“,ƒLz,õ ¡Á€,é›ïú~‡ò>šì/,*ö«•tÏF41Ç·ýU«XÿLû{küçf£D¦ÌâËç‘™l±A•Â¾iÍNŒ½ðUÛ5ƒ:8P -‰îkÈ–É–0WÞsŒž ALàkñ7\õq»¸À~˜L#¬®–—ãx–NÃã‚þ”ç+šYX²°²b£ƒM«‰Ýk*m¿|m, Òh¦"ÿ£ßȾpx°ðè +ŽðÂÍL›Zùî]5Fž«—uÎâ.naÕ-•p Þ†”¯…«Ûb¾\ôG˜ñRÿe6Àîá*µ²ZÂÇF²Du%„RŠ0ƒ>/‡Œ-LoCʹ[›ÍÎÞ²@K¡-z:g÷àé£æn3¡z ê<‚k­ß_â-VB^ïü‡àQºÉn‡ʦéíÊX/äƒmE³‡4Ï@ 0—/ÅU¶a$PK(7E]òŒº1Ö‰JG•_Frƒo~ûMîSzš'žª_B¡~³`d0Ãb R¶$è9ïÁ3ԎèÛÙ5BôMä/§òhÅšŸSµ~›h\<æ ™ä« Öìè´ÇÛ5¦“Ūèñü%’ƒ’eÖds»¼©>“Hì"—ÏE᡾»ÚréXw3W—4ÄŸ>öMîS:NñE}`a²ÍHV%êÚ¼~í&”/—öÿ>D­4ZñB%ãË|2þnA,iæ^^÷ë‡dJh§‡œÝlô£2›Ð(VF~¬a©A°‹ñCL]˶¢@c0à?ùîB“ àØ4æ'5 %I7þš¸tšRhèU®Z¾¬:Â.5Œù'…èo.Jˆ«ïÑ™º‚ökäŃû)â/S‹Š½š(ùŒÍw­‚¥O.Ç…È 3ô‘âÜ-Oßäè$ÆÆÓ·’¤¯Ij{ ß•Ÿ,s…{£¯˜Ô çšg}ÚÌ·¨Îeùç=†r4€ óN‚àSÔÍDe¹…cËnŒá—ÔDعSã®7•¢û«ä¡Z P=Ò®ãýtKCœ[H^”ðv0n)ÛZ t+óÝßðJÄä -X“Oì L¯9Æ΄e¿ ´5XŸ'WM)~âÉ:*„ۻɕ—yáÝ y«)yÃt­òÙÐg{ÞŒqí…p3‰¹‹˜ö¼>͆³j×­ã¨@^‰Í*ôº~†Åµ}ëËÙÛ½R¤“¿Æä€÷;8ˆ‘áÌØ=Aivù¥ > 3•\‰›àýþb£œˆ'€\ îï€_‚ Ò{ÅëP…¤ ð9õ»Ý8ñÛøç¨oii)©ÉUÒ÷Á7뜆2”&§(šÀ‰^p"öÐvûð£Ø¤~ÕïÈ@ßœÿ¼‰åâlr‹~aéÐsC·¯žßrõv¢PT}®C–c!™¯BÑ ²—Ñ[‹ÏŒ0€{½”?¡JÀ×Æ2m[}£Ø2Ê%FHý¯ÎtfÜ¡{'k!y=Ê[¦%:¼Cˆ \y!Ï,غ¢#°iéšÍ™ÐüÇòÊ2?™Ç…º¬bóÜ£vöÍ^ï}XÛ -Ñ.áç7ûÔ<¢*_› D´³Ÿy ‡R®Á¼9Ü3h¿ Pt’§ZuA¢z$Ÿ» ‹àIÁÔŸUÖ¡í$ñ˜4­ !ØI— r³xùøí.5¤˜©] -8 ™÷†súzýˆ5ܽ§ˆqƒÈð=`³/VŒÂ|>0§æ\­^"Ê)ýC‘á(R\êtzô\ ÚÏ%T^k´0LeÔr;ôÆã5P½d`áü#x1RÀhâ³Ô“àÍüü¨0<øàNãÚo-˜=ÊwŽó -Ìïxã Ωšký·õ¨ª40-&äaŠ -ôfF¨³¹§§ÐÂÐ\ÎëV(ïËìLþqŸ¥¯Ø%Üн­>e'ãןT…3ÔFKQ Ÿ ËÇNK,mÄ ¨~\ÅO~ Qwÿd¤Ó«µÄ\ ­ænaòª0q>éÚ¯ÔE;œùkà‡\›y3ÛO!©÷s1¥Çä.VãsHLÑÀTÞøÝÞñoˆ{›§¥÷¸t:¨–‹ùà FgÚ ‹+4Bcúë>orQž w©¥ÿ±Ø|Lkô·mdg ÜÄàO¢»øàâ¡NáµJ%£¥®N‘YqC{Ê%mK§AM %;õLÝ…ólÊ„‘T*–2 ƒ:È5 hæÛéN®­Z¸k°›»gø1„E“û·Õž Ç Ã—¥éL²µ¼3{L(ÔΫQp>"¾×¦ÞÚ +À*Ü5%&_cRTu9?"mU±Íìžã隌-Iuù'Ùp· ç2ñhŠ*½yJj-4äl6LîÒ^ +Ni%/Ài–¬¤Û‹‡y+®¡×%:&“B e½~xÂN€gÕ>“-³H¹‘ÛzÊY+wƒn*B÷uÙ$±£C¡}¸=~hîÀxÛ€©1éö—}¼ânÁRÙ}7-Ù1åL¤Å¨¶™™ÙA|Ãè1Äô#cS©ì~çib). {8ñ@‚Sˆ\$¹è»Æ¶ÄǦ÷$£üß4»H@kú4¦yúöVÌ€Á²…‘y-]SŠÞYÈ+µà(;‹`x«y—3tñWlž6T Ô€™¾¡ÁC#¹™)öX=~ÜUøœOÓÉ—ïl´Pà)ÆYØ­©Ñl²§oðÁ1™-£šŸ[Ý=úÞ[›ì;·V¬¾7—ýé,7ÄKõ“ñy +o±ÎSˆŽƒ:²²a>FrÖ;ê9[ÕÙ/~,ZÏ3J7ç/™ØÁ¡ÈY+ëȤødŽgÅ)#ûä§2˜†KBb¼œý¯C{ØûT“ûê_±Òg‰”uA}›wL$ëtA #GnÛ‡²e˜ –âoðÌÊKyQRÑSþ¬ïË6¹WéÂÀësºÜ®•oò¥…z A«ã¼/ƸNso%¾€<ãL{éB)é­³œÜ€alƈGf¾)àѵÑ?öyùƒ÷u/7úKÜN2.ü™NUl4ãkwÌ£Õj‚|îD#o­7>ŽñnÃ9S¶)èýg +÷=›¦ãÒ¾k(à‚’8˜ã›1cdÅÊèmé¥ý¥GænóG`³•F(I |†ŒÆŠð¨mt\z-ó²&](7ÇSË[AesJa$ª;/œˆä%Ôu v½hçlD£.¤ÑέÙ\Õ·â<áû¨Mv•ñ u¢u4ÁT3k=:2xš` ¤¶À_"A­Üo#¹¢ž µ6Aè–_ÙG4V0l9/˜ïK9xí˜_‘FJ¡x$*ýˆÏ?Q„x²ªÙÎ ØŸó//Í|§Åð6Ýí­ÊèCveÓp‡ë½¥+Ò,0®<Û-ùÒ+ ˆr(Yò½²Û°â™¹UŒ…’Š(­IÉÀ(̪Âú䥱µæÏ2}ý¹‡a¸€ŸÞÜGGH¬£Ås¼õn²³Enþ6æ‡òUc~'`1 +O³sµÇG«£mB ÊÚA–  +‹aˆ_ýÞþ…M×øf`}hÀ¾1ÍAËã u!“@Ðiqx>b•˜ÝSÉ…jòt;=§]‹¯_?NÜ5‘lä½­žeZ¬Q^¾ÅoúYÓ ²ØÑVÿ|ôÎ[¹]²z#ÞÕ–-Fݧ0„E­½f²Ž³øF0óMñ÷ÚE¸×þï̶ޢ›šÖ,@<ÃKÜÈe܇Uqì-¤#ôCL Þ—~•a¼#=ðé{NÊe‚‚_†÷ÑŒPßÉLXÛîÜ-Û3 +ëT¯ªH‹;YHä4¹!!vb¦¨ZB—óëÓ‘ä?¶‹‰ÚÈŸrñÿOýaN§ImXÎAmyyµ­–ýj‡vÐ 8['³ú +yå^ÈNœ¸†,äM’ºÒˇxö/ÂÚÁ$ÁHؾŽ„5Ãr³¬wWääõaç(é]ªvÕFã{ØDc¸["ëL«ºfã[Á#É\¬ù3¬÷‹"¡uÿHjÅW»yŸö—Q¹ô=QÈ-=¨™wÒ÷<Êû…¥¿^D…ˆòÅU§®#­‹>ôw<ÇÉvŸ5t°Žšxäå¼ñ²„¶‘ö)ýËïÛn)}ËÁIaKG›9TÚcZxýDQ«®O±ÛôÐ õ~ÉZùöŽí‚wp˜ü®­fÓò}G1ZænNr0mg2B®º»žÁ +pµžç£Ëó}¯šœ—®ÞxžGëªD¸ò¥£6ŠÑËì~ 2£a÷1Bô¡›AFGÆl0ÆvæІÔèARb³)Ö{âÁ)`* vŒž|ºªô¼ +¼>תØfÅ©ØÔ_8Nµ®ÿVRç ÝÕ˜èoI535›mg•æí>¡W-,½•9.@)þ€ObK7g6:Âæé01G×ÙåšöĀDŽ…Aˆ“‹j+²é*ڟȹ ¥•tCmÝˬüþ_IU!J1Ë敨-bàùl¡¬ µDÍcŽÿ¡-/'ߺ´ÁÑ\ãÌèºæ –Lò{ŒpÇ@Á¼Ük>ÔÅY9 ½@ƒï=‚P4*\‰L ¸^nÇgt³¾í:ŸZPu¬'(^2Z/ÂþÏnת5“ï‰V›H}€õ('°Þ„8Õò-ʬ “!±öã7Og¥JO`4(ɪÚ”—£˜ð©ÚèæñyÒK9D¦ÇuD®ì,¢Lò#Ó1TtwÒ³uÄDÕmW båçƒ ú$´m Í»»ÃÆŸDÅëí§›=1²Ïš"½à"ðR1ãk>¹Š§ü»øº5ãã¤Zé¿VÂw\ŸÍDEBüÉãë¿s¤·;’YM«±;Ô kˆ¿Åe +ùÅi”jŸÏþ+Í¿§xuúÃZè´CÃj†*+!EÁäùÙ›à…é½:žžË¬FÒìÌÄ~](6œXqT÷¯-UÄAÜqéÂFK̪!™;°`ö]d©î2*`ÓW¡•`A"öÑ` NL>×;º÷ÅO#6wO…Z±‘6& •«X$Ü€$¶}Ú{0k½ ‹j]i¦lG‘±ºh•˜ ôfÞ/åUA~ÛÙLUÂw YˆÆ/Ýô éë^â¬âÃl ohˆq ªöæNš¶DTSñéC| Ó Tm>£Z±¦ïý“üj¸"H!õŒ¶³ôç^8<ç…ç’dl»ªUsÇñ¼q3çGNHaM÷®8È`~È£âàLž +' É9$›½d7™íZ¿}ZýÁ’Eá»=Yþ ›ôš°ºÖï^lU"„»©BÇz‰mmìn”IŸÖI—¥[k‚ö…þ NÕçÓ[GovÝyS‹X®'ú9ö.ôøjþºC‘”–ø¤ Þf„E…ÄË—ãÙiîv‘¦£ƒ¡ÜJ¿wߣ¡fÕo¥@„eò Aï»ÈtPżíp^¾x—Ö5ôGG‹¾uÊ@·*àë¬`Ñãšuø¨~¢t¥þÖD (<&Å«\ÃÑj-–û‹öQa›É\ leÞØÆ‘•ßÛv‘÷¹ÑàÈßóK[†&xR¼¾Zjæƒ +JðÒÌ:H0¨AXk6…áS²6Ò}€ñÓd9UüÍÃKÄVAZÏ)[üåþð2!ü­ÉVÅÌe‡RˆèÀí_X>dzÑN’»ÄÚ¦²V +gÅ.Óz×»Òº¼}¤!E ¼ó¾ÓI§U¶5ÊdV£ÑŒ Þn³ÿ°õ>'Øžé³gQG´ò‰)7òB\nƉÖò¦Zü×nòƒ›á7Xyìk•‘>õkG×guµMý7;S¯‚¼–Hœ Bê†NžOÅYôßIü~U³N€;Ú$}Ftœv±;˜Ï‹!—Ün¦©|LpuN§`çtÀW2)yXÞ]uòù¯}ßxÔ¾Š‹Ã¡°ãà³’Àôš¶O}j¿JžïÑ$¥$飴 ؆)]¬/=…%[cÚGÚ%úZÊ–¿p2ŠÙ= þŠgEeÖ&v›vàÀ2œçÏF¦ÁL¥Äín6‘7ÿѲX@ÖEœ†²¬M71zšœ5ã‡O ‘y¹ £)~Œº…ð\²—µùqmµäO‚EÛÐõ—Ë…ÊöJ§¤ì×òdïúIÑíûÑ”ii¦ËKä ð„¹Nq“^·ºõk ²ºrå:×ó»Ÿ –y20‰^µsfð1rÑÃ1‡Rø!_pÅGUåŠþú©ÂRݼªBÔÃû½»Ï0öŠ¼+=ѽ!å<ý¾<6CD´ =ÉEBа¾{‹à!ž•TØ#l´Ô,]79^ľßý´Ii'·¹ÐãfXëùR(µ_ÜLjÛÀLçKnm{Ó°9ˆ´°@ï»9ŽÇÊGžIWë€Zµtu[»2ÝÒ‰ÙܲÈàSºf’†¨QÝÕJœóʽŠÝNx–0úôR†Í]Þ”¼Ô°ñ¨¾‚ùƒ\O Ë6’^ä1K¿À <é6³Ó$ øX“Ì©Æшa¸î[Z +Ý{þ´'>áª>*øþ,¨»Ã›”‚-¯áë+Âÿƒ¬<(‰rúc±2¯í]ž¤ õµÒÇ-]0' ‰TcÁK½ »“*oç‹ûQCÜ]Xp ¢ ÑøŒ¾m«ê[²5ï>ggŠ»·½QÄÇ2—c§ñϵ3äcšg¦Óø4a§¶€†q%ï½½ŸsºeîƲÌÿˆÃ—™9£<áñ…U6Ô”Ò}ÐÁˆš}˜³”Ñ\m ’tî}L4k˜KgCÞVââ>Çöþ¾Úº=ä®Øº%ÐÍÓÐ÷¤ò,´ì`çôÖÄž©†©ÈÑ¿%KÛŽãß «©=ºÕU÷ªv¦¥‘5C˜ïᮃ½+4p8EH¼\i„n_›ò\xæ¦mû‚{"a»’á[ôµÛXË‹?5øìÀí^ö“µä×ÏEô …N7]9"ºNþEEbÔ'lF*ïèÓ§åûÌ@{ùÆõ2³úMb±ôç=ɪ;Q3m3œ&M’ô‹€Zõ(6ûaŠÓúÊo™ìÁœ”«cbˆf»•o‘28Ø!Þ}–¶P/¥{Ü;¨÷Éhö×b×üvØ7çvxŸh‚v þâiÊ0|Ðw´"ˆMPk£ÔGÄüy”},i&ÊÒ…˜ÝýaÅ#A?…$Ú‚š¹¯ÔºÁI%Ö¥oJªÁäÑ´yâû”•éx¢ÛwI“`kÕîû£NÝ([ +mÇNùZ˜‡Ò!H;nŸeo r‡ºrÓBØƼX R ˜zužšjålA"Ð-BÊl ©kg´3 tð:>ÄÆ_0Û/|Ö±ó; ŒÈ:¨™ÇxÝ:ãßÿ÷µ@4¶|7â;Õ~ÓHËÒ\ÃwïÖÈwqÛ‰aœn„1¦+–Ñ`ö‘”U$ª] yÝ6÷_¬À?¢Y·–€üïyê“çX:=Õp¨øW½ä8¦þ^ʤK‡Ý~<ƒÎG^½&ýÇ,A˜©Ú ã,xûy¨Î"ûÿG í4íVr¤%(Qç5Ï4f#IUf÷JJÓÊ‘ î}\ñ@e,"$2xÿíhîôxEiª[›Y¢+Þ:Φ +ø•;F8IwÊ4ƒ&¢CRŔ٤ŠÕ`ÈÅX†‹¬lâêë>ª!{¨|þ/‡'»ŠãÙ»‘Öà“ÆiÉiMþ‚ŸSØMc'ƒ´¼’ÇŸ- î[lÂt¾²6Ùˆ]^Q‚¹£ŠF#L=ú~» endstream endobj -677 0 obj +683 0 obj << /Length1 1392 /Length2 6243 @@ -8580,7 +8605,7 @@ B i«Üsªù‡ۂ÷ k’}_ÓŠSÕgŸmøS¦ÓM F7«ƒºÂŠãrjh×cÙ%0xï[Yü$ðWCOå¨ÞÑ?š#~‰Œ—3½€AX±EŽ€¸îë·ÅšGâdã±aÍZìÍjë†LEOß1¤=Ô¬¢lG#)ý%mÊÓ¼/žJ9pÒ—`eL‰ñï¿ÂÐ…Ô)Ȩ@“y7ÝèçLêªK|ØÑäa+$ç?½c|wÔQ`x[ÿÍÎç(~‰ÁB ~@ %3Ÿüšü(ºöÀ¿¾ë­t§$'±Pzœ»’ëkí+÷hDaŽ?Ÿ"€Gî oZS89sÈíeVZÞ,6n‡m*3]MJÌFÛwxL¼©ÒÌ,åè!™ðŽúÔ×­âóDÉßRqè™XzàdQB}¼ÁU£'­œ¸æjk±Ëçyƒã›ÜféÃúŠz<8Phu[ endstream endobj -679 0 obj +685 0 obj << /Length1 1408 /Length2 6296 @@ -8655,7 +8680,7 @@ c •*Χo ©Þ‹ëG ‰½4YÆìÚúe¥å¤:dmvBÎÚ\)/­¤Y «“‡C¸q0QÓB÷Šï'4Anr í2v»lý@P²Ü?ÔC¡+7ÒÁÃ;u÷×±^`¹ŠIAä‹sðÃÛ®(\ák^ž0P?š«=˼{‹þ䘜¾›.å~´4ëº,.}ùNm*LŽ%ë~¢æ Wæ/q>Í*:»CãºÂ¬^oĪcµÕÊOÁ=|,ñŠîÁÆ7Ül0ѳq Ä„-@M¼÷bÇœ²Ûá7÷iFCAlL¹‹( ÑóPæG­I–çÝ—œöêkˆ endstream endobj -685 0 obj +691 0 obj << /Length1 2278 /Length2 19476 @@ -9000,7 +9025,7 @@ ZPQb \¸ ™rÌó2dˆÝqw´.Û”¢Ápd¯½;æ`¨h•¢Èõñö"ÑŸËüù>H H+-`Mq…ù¸fpÁ”÷Ÿ¢™‘à•i«wê/e20Næ³ó"A”Q…ÿqÞv8õätuTçµ.ãWZÏc;}F/×vwôN$×;ß‹¦ódô¥eÁ~`ü¡…±¯ÂY8­ŽYl/àIS1Õa6†å€ùÒH®^ÂÞ°}4M6(óà(Æð·ªi€ËKB!š‘_¤u‘Ù3¾_üa»L´Œ¥twÚ29b£W£S×çM5šBrŒ 9þé¨å¬\•;µ})Ü¢e7©ÊP ô”Þí²éë2 6Ö²£ïýÛ>Už“ŸÔÁÚAÈë1oB9ónx> hæK Ì6û˼* endstream endobj -687 0 obj +693 0 obj << /Length1 1786 /Length2 11772 @@ -9122,7 +9147,7 @@ fv à¯mfj÷—Ý[-âƒ~oA—u›3í¨™9Q»²:×b?°jjòNKÇ¡ÂmÐ5 ±LFq÷ÖñÿLQºÃó…cˆqÄ®«€*,–w¥`1SøÒˆwdP µ´ ôس¯Ð fŽïºUôÌwù&”?☄ÄÝú#ùÀÇFø0§å佃~LNØ !?žÁÑÏûî >¾evĘÊ*êü_V…«Wöç\7Å„„ Óñqr µ¿AÛ;=žð§rm£Á¬oš»¶ri¬]ý%f;•¦}!sŸï©îM#Ý=8H#U¼v–ˆ|–|ôÀrEl,ÿ^3T:ô·EEoIHÕËçàÖy<&ûQ©MáäܵòŽ$Ç0dJÓÖÅ_ºó—ºihRà€d©TõIží8;¨¥ËÏ×—Ú­8lÝïÚµ"áûÍ“VjbwÜ£äPóVÎÄÒ^Í:jÐû­ߧ˜"Œfò`õù¬fó×-w’ñh¯o‰ÀÉ5v›\P…ôS endstream endobj -689 0 obj +695 0 obj << /Length1 2769 /Length2 19845 @@ -9330,7 +9355,7 @@ bV wt´€YÃÿD7·yÛ¤•¸Wg.Cه˸ì|ó“Ù)òy—dI”òÎÀX%›ÏVúÝ·C<Æ9ûB*¶…{‹~ÀÞ)€çÿ»Î£vÃ9ÞHÛX<¾Ø%M‡7§sØ`.C™ endstream endobj -691 0 obj +697 0 obj << /Length1 1306 /Length2 1345 @@ -9380,153 +9405,178 @@ currentfile eexec €·jYÿ® çÏrÜ["ÒNŠh ¡íÏÅ,KC"m`ù´Ö \3´½¬ú¡3”8tÅ5(ƒ‰½;‰•½LrSÊ ¸Ua¶Í{Óú¶P®ƒƒ¬jèxÛ$Ç”¯(‰mRò£°çëîΠ֖Ƈ©†žÎ ¬alC_-ŽþûcIó¾#gÛÃì6R2ÄÑ·£ ¸²¾±E0Ï9Vm4æ†w‚%õ{‹-÷ŠOñåÖ†@Ñ·oBœJGÿ5… rg÷HÊ(üÏûtiJòÏÀôŒç&lR:UF©,Œ¶/SĈ¤†žfôÕƒ¥:¬ï P8áõó˜ÌAò£ƒ9íÓ¨ÌVq5Ç;úœÓœ»Î’’z£¸åAuuÈw$AÒŠ^Y ¾”Œú§M·Šº—½˜/ã Üö^v"ñ ÉåÄ endstream endobj -637 0 obj +639 0 obj << /Type /ObjStm /N 100 -/First 934 -/Length 20264 +/First 933 +/Length 20196 >> stream -248 0 299 54 301 108 278 162 633 216 639 335 641 449 279 503 283 557 234 611 -233 665 281 719 280 772 302 826 230 880 367 934 229 988 282 1042 228 1096 346 1150 -232 1204 638 1258 642 1364 643 2060 644 2128 645 2432 646 2560 647 2914 648 2934 649 3306 -650 3970 651 4613 652 5003 653 5595 654 6223 655 6730 656 7375 657 7970 658 8254 660 8886 -662 9243 664 9612 666 9949 668 10258 670 10579 672 10802 674 11050 676 11597 678 11947 680 12173 -682 12403 684 12775 686 13027 688 13415 690 13688 692 14258 205 14470 148 14609 161 14748 379 14888 -225 15026 365 15165 361 15303 160 15441 150 15579 366 15717 364 15853 257 15989 363 16127 307 16263 -149 16402 255 16541 362 16680 151 16818 226 16930 314 17042 384 17154 457 17266 515 17378 546 17490 -591 17602 628 17714 693 17810 694 17923 695 18012 696 18077 140 18145 136 18217 132 18303 128 18389 -124 18474 120 18548 116 18636 112 18724 108 18812 104 18886 100 18998 96 19083 92 19166 88 19248 +349 0 248 54 299 108 301 162 278 216 635 270 641 389 643 503 279 557 283 611 +234 665 233 718 527 772 281 826 280 880 302 934 230 988 367 1042 229 1096 282 1150 +228 1204 640 1258 645 1364 647 1478 346 1532 232 1586 644 1640 648 1733 649 2429 650 2497 +651 2801 652 2929 653 3283 654 3303 655 3675 656 4339 657 4982 658 5372 659 5964 660 6592 +661 7099 662 7744 663 8339 664 8623 666 9255 668 9612 670 9981 672 10318 674 10627 676 10948 +678 11171 680 11419 682 11966 684 12316 686 12542 688 12772 690 13144 692 13396 694 13784 696 14057 +698 14627 205 14839 148 14978 161 15117 379 15257 225 15395 365 15534 361 15672 160 15810 150 15948 +366 16086 364 16222 257 16358 363 16496 307 16632 149 16771 255 16910 362 17049 151 17187 226 17299 +314 17411 384 17523 457 17635 516 17747 549 17859 593 17971 630 18083 699 18187 700 18300 701 18389 +702 18454 140 18522 136 18594 132 18680 128 18766 124 18851 120 18925 116 19013 112 19101 108 19189 +% 349 0 obj +<< +/D [636 0 R /XYZ 93.6 374.324 null] +>> % 248 0 obj << -/D [634 0 R /XYZ 93.6 319.935 null] +/D [636 0 R /XYZ 93.6 319.935 null] >> % 299 0 obj << -/D [634 0 R /XYZ 93.6 268.273 null] +/D [636 0 R /XYZ 93.6 268.273 null] >> % 301 0 obj << -/D [634 0 R /XYZ 93.6 216.611 null] +/D [636 0 R /XYZ 93.6 216.611 null] >> % 278 0 obj << -/D [634 0 R /XYZ 93.6 164.948 null] +/D [636 0 R /XYZ 93.6 164.948 null] >> -% 633 0 obj +% 635 0 obj << /Font << /F42 161 0 R /F15 160 0 R /F17 148 0 R /F18 307 0 R /F45 255 0 R >> /ProcSet [ /PDF /Text ] >> -% 639 0 obj +% 641 0 obj << /Type /Page -/Contents 640 0 R -/Resources 638 0 R +/Contents 642 0 R +/Resources 640 0 R /MediaBox [0 0 595.276 841.89] -/Parent 628 0 R +/Parent 630 0 R >> -% 641 0 obj +% 643 0 obj << -/D [639 0 R /XYZ 85.4 752.957 null] +/D [641 0 R /XYZ 85.4 752.957 null] >> % 279 0 obj << -/D [639 0 R /XYZ 86.4 715.095 null] +/D [641 0 R /XYZ 86.4 715.095 null] >> % 283 0 obj << -/D [639 0 R /XYZ 86.4 670.542 null] +/D [641 0 R /XYZ 86.4 668.665 null] >> % 234 0 obj << -/D [639 0 R /XYZ 86.4 622.659 null] +/D [641 0 R /XYZ 86.4 617.03 null] >> % 233 0 obj << -/D [639 0 R /XYZ 86.4 574.776 null] +/D [641 0 R /XYZ 86.4 565.394 null] +>> +% 527 0 obj +<< +/D [641 0 R /XYZ 86.4 513.455 null] >> % 281 0 obj << -/D [639 0 R /XYZ 86.4 526.59 null] +/D [641 0 R /XYZ 86.4 463.638 null] >> % 280 0 obj << -/D [639 0 R /XYZ 86.4 478.405 null] +/D [641 0 R /XYZ 86.4 409.578 null] >> % 302 0 obj << -/D [639 0 R /XYZ 86.4 429.613 null] +/D [641 0 R /XYZ 86.4 357.034 null] >> % 230 0 obj << -/D [639 0 R /XYZ 86.4 381.427 null] +/D [641 0 R /XYZ 86.4 305.095 null] >> % 367 0 obj << -/D [639 0 R /XYZ 86.4 346.791 null] +/D [641 0 R /XYZ 86.4 266.706 null] >> % 229 0 obj << -/D [639 0 R /XYZ 86.4 325.703 null] +/D [641 0 R /XYZ 86.4 241.865 null] >> % 282 0 obj << -/D [639 0 R /XYZ 86.4 280.245 null] +/D [641 0 R /XYZ 86.4 192.654 null] >> % 228 0 obj << -/D [639 0 R /XYZ 86.4 243.487 null] +/D [641 0 R /XYZ 86.4 152.144 null] +>> +% 640 0 obj +<< +/Font << /F15 160 0 R /F42 161 0 R /F18 307 0 R /F45 255 0 R >> +/ProcSet [ /PDF /Text ] +>> +% 645 0 obj +<< +/Type /Page +/Contents 646 0 R +/Resources 644 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 630 0 R +>> +% 647 0 obj +<< +/D [645 0 R /XYZ 92.6 752.957 null] >> % 346 0 obj << -/D [639 0 R /XYZ 86.4 208.851 null] +/D [645 0 R /XYZ 93.6 715.095 null] >> % 232 0 obj << -/D [639 0 R /XYZ 86.4 160.665 null] +/D [645 0 R /XYZ 93.6 670.434 null] >> -% 638 0 obj +% 644 0 obj << -/Font << /F15 160 0 R /F42 161 0 R /F18 307 0 R /F45 255 0 R >> +/Font << /F42 161 0 R /F15 160 0 R /F18 307 0 R >> /ProcSet [ /PDF /Text ] >> -% 642 0 obj +% 648 0 obj [458.3 458.3 416.7 416.7 472.2 472.2 472.2 472.2 583.3 583.3 472.2 472.2 333.3 555.6 577.8 577.8 597.2 597.2 736.1 736.1 527.8 527.8 583.3 583.3 583.3 583.3 750 750 750 750 1044.4 1044.4 791.7 791.7 583.3 583.3 638.9 638.9 638.9 638.9 805.6 805.6 805.6 805.6 1277.8 1277.8 811.1 811.1 875 875 666.7 666.7 666.7 666.7 666.7 666.7 888.9 888.9 888.9 888.9 888.9 888.9 888.9 666.7 875 875 875 875 611.1 611.1 833.3 1111.1 472.2 555.6 1111.1 1511.1 1111.1 1511.1 1111.1 1511.1 1055.6 944.4 472.2 833.3 833.3 833.3 833.3 833.3 1444.4 1277.8 555.6 1111.1 1111.1 1111.1 1111.1 1111.1 944.4 1277.8 555.6 1000 1444.4 555.6 1000 1444.4 472.2 472.2 527.8 527.8 527.8 527.8 666.7 666.7 1000 1000] -% 643 0 obj +% 649 0 obj [935.2 351.8 416.7 351.8 611.1 611.1 611.1 611.1 611.1] -% 644 0 obj +% 650 0 obj [379.6 963 638.9 963 638.9 658.7 924.1 926.6 883.7 998.3 899.8 775 952.9 999.5 547.7 681.6 1025.7 846.3 1161.6 967.1 934.1 780 966.5 922.1 756.7 731.1 838.1 729.6 1150.9 1001.4 726.4 837.7 509.3 509.3 509.3 1222.2 1222.2 518.5 674.9 547.7 559.1 642.5 589 600.7 607.7 725.7 445.6 511.6 660.9] -% 645 0 obj +% 651 0 obj [826.4 295.1 354.2 295.1 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 295.1 295.1 295.1 826.4] -% 646 0 obj +% 652 0 obj [826.4 295.1 826.4 531.3 826.4 531.3 826.4 826.4 826.4 826.4 826.4 826.4 826.4 1062.5 531.3 531.3 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 826.4 1062.5 1062.5 826.4 826.4 1062.5 1062.5 531.3 531.3 1062.5 1062.5 1062.5 826.4 1062.5 1062.5 649.3 649.3 1062.5 1062.5 1062.5 826.4 288.2 1062.5 708.3 708.3 944.5 944.5 0] -% 647 0 obj +% 653 0 obj [722.2] -% 648 0 obj +% 654 0 obj [295.1 826.4 531.3 826.4 531.3 559.7 795.8 801.4 757.3 871.7 778.7 672.4 827.9 872.8 460.7 580.4 896 722.6 1020.4 843.3 806.2 673.6 835.7 800.2 646.2 618.6 718.8 618.8 1002.4 873.9 615.8 720 413.2 413.2 413.2 1062.5 1062.5 434 564.4 454.5 460.2 546.7 492.9 510.4 505.6 612.3 361.7 429.7 553.2 317.1 939.8 644.7 513.5 534.8 474.4 479.5 491.3 383.7 615.2 517.4] -% 649 0 obj +% 655 0 obj [613.3 562.2 587.8 881.7 894.4 306.7 332.2 511.1 511.1 511.1 511.1 511.1 831.3 460 536.7 715.6 715.6 511.1 882.8 985 766.7 255.6 306.7 514.4 817.8 769.1 817.8 766.7 306.7 408.9 408.9 511.1 766.7 306.7 357.8 306.7 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 511.1 306.7 306.7 306.7 766.7 511.1 511.1 766.7 743.3 703.9 715.6 755 678.3 652.8 773.6 743.3 385.6 525 768.9 627.2 896.7 743.3 766.7 678.3 766.7 729.4 562.2 715.6 743.3 743.3 998.9 743.3 743.3 613.3 306.7 514.4 306.7 511.1 306.7 306.7 511.1 460 460 511.1 460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460 664.4 463.9 485.6 408.9] -% 650 0 obj +% 656 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3] -% 651 0 obj +% 657 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -% 652 0 obj +% 658 0 obj [469.4 353.9 576.2 583.3 602.5 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.2 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9 571.5 490.3 465] -% 653 0 obj +% 659 0 obj [638.9 638.9 958.3 958.3 319.4 351.4 575 575 575 575 575 869.4 511.1 597.2 830.6 894.4 575 1041.7 1169.4 894.4 319.4 350 602.8 958.3 575 958.3 894.4 319.4 447.2 447.2 575 894.4 319.4 383.3 319.4 575 575 575 575 575 575 575 575 575 575 575 319.4 319.4 350 894.4 543.1 543.1 894.4 869.4 818.1 830.6 881.9 755.5 723.6 904.2 900 436.1 594.4 901.4 691.7 1091.7 900 863.9 786.1 863.9 862.5 638.9 800 884.7 869.4 1188.9 869.4 869.4 702.8 319.4 602.8 319.4 575 319.4 319.4 559 638.9 511.1 638.9 527.1 351.4 575 638.9 319.4 351.4 606.9 319.4 958.3 638.9 575 638.9 606.9 473.6 453.6 447.2 638.9 606.9 830.6 606.9 606.9 511.1] -% 654 0 obj +% 660 0 obj [319.4 436.1 436.1 552.8 844.4 319.4 377.8 319.4 552.8 552.8 552.8 552.8 552.8 552.8 552.8 552.8 552.8 552.8 552.8 319.4 319.4 844.4 844.4 844.4 523.6 844.4 813.9 770.8 786.1 829.2 741.7 712.5 851.4 813.9 405.6 566.7 843 683.3 988.9 813.9 844.4 741.7 844.4 800 611.1 786.1 813.9 813.9 1105.5 813.9 813.9 669.4 319.4 552.8 319.4 552.8 319.4 319.4 613.3 580 591.1 624.4 557.8 535.6 641.1 613.3 302.2 424.4 635.6 513.3 746.7 613.3 635.6 557.8 635.6 602.2 457.8 591.1 613.3 613.3 835.6 613.3 613.3] -% 655 0 obj +% 661 0 obj [722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8 444.4 500 1000 500 500 500] -% 656 0 obj +% 662 0 obj [544 544 816 816 272 299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8] -% 657 0 obj +% 663 0 obj [726.9 688.4 700 738.4 663.4 638.4 756.7 726.9 376.9 513.4 751.9 613.4 876.9 726.9 750 663.4 750 713.4 550 700 726.9 726.9 976.9 726.9 726.9 600 300 500 300 500 300 300 500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 412.5 400 325 525 450 650 450 475] -% 658 0 obj +% 664 0 obj [625 625 937.5 937.5 312.5 343.7 562.5 562.5 562.5 562.5 562.5 849.5 500 574.1 812.5 875 562.5 1018.5 1143.5 875 312.5 342.6 581 937.5 562.5 937.5 875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.2 531.2 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.7 312.5 937.5 625 562.5 625 593.7 459.5 443.8 437.5 625 593.7 812.5 593.7 593.7] -% 660 0 obj +% 666 0 obj << /Type /FontDescriptor /FontName /WOELMG+CMBX10 @@ -9539,9 +9589,9 @@ stream /StemV 114 /XHeight 444 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/U/a/b/c/colon/d/e/eight/f/fi/five/four/g/h/i/j/k/l/m/n/nine/o/one/p/period/r/s/seven/six/t/three/two/u/v/w/z) -/FontFile 659 0 R +/FontFile 665 0 R >> -% 662 0 obj +% 668 0 obj << /Type /FontDescriptor /FontName /XCHSJH+CMBX12 @@ -9554,9 +9604,9 @@ stream /StemV 109 /XHeight 444 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/O/P/R/S/U/a/b/c/d/e/eight/f/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/period/q/quoteright/r/s/seven/six/t/three/two/u/v/w/x/y) -/FontFile 661 0 R +/FontFile 667 0 R >> -% 664 0 obj +% 670 0 obj << /Type /FontDescriptor /FontName /EYIYGL+CMCSC10 @@ -9569,9 +9619,9 @@ stream /StemV 72 /XHeight 431 /CharSet (/A/B/C/D/E/G/I/L/M/O/P/R/S/U/a/b/c/d/e/eight/f/five/four/g/h/i/k/l/m/n/o/one/p/parenleft/quoteright/r/s/six/t/three/two/u/v/w/y) -/FontFile 663 0 R +/FontFile 669 0 R >> -% 666 0 obj +% 672 0 obj << /Type /FontDescriptor /FontName /YJJMFD+CMEX10 @@ -9584,9 +9634,9 @@ stream /StemV 47 /XHeight 431 /CharSet (/braceleftbigg/bracerightbigg/parenleftbig/parenrightbig/radicalBig/summationdisplay/summationtext) -/FontFile 665 0 R +/FontFile 671 0 R >> -% 668 0 obj +% 674 0 obj << /Type /FontDescriptor /FontName /VFYBNB+CMMI10 @@ -9599,9 +9649,9 @@ stream /StemV 72 /XHeight 431 /CharSet (/A/B/D/I/L/M/P/R/S/U/a/b/comma/e/greater/i/j/k/l/less/m/n/o/omega/p/period/r/rho/slash/t/theta/u/v/w/x/y/z) -/FontFile 667 0 R +/FontFile 673 0 R >> -% 670 0 obj +% 676 0 obj << /Type /FontDescriptor /FontName /PNUTJM+CMMI6 @@ -9614,9 +9664,9 @@ stream /StemV 85 /XHeight 431 /CharSet (/comma/i/k) -/FontFile 669 0 R +/FontFile 675 0 R >> -% 672 0 obj +% 678 0 obj << /Type /FontDescriptor /FontName /TWBVYQ+CMMI8 @@ -9629,9 +9679,9 @@ stream /StemV 78 /XHeight 431 /CharSet (/A/C/F/S/T/comma/e/i/j/k/l/m/n/r/v) -/FontFile 671 0 R +/FontFile 677 0 R >> -% 674 0 obj +% 680 0 obj << /Type /FontDescriptor /FontName /DKEMOU+CMR10 @@ -9644,12 +9694,12 @@ stream /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/Omega/P/R/S/T/U/V/W/X/Y/a/b/bracketleft/bracketright/c/caron/colon/comma/d/dieresis/e/eight/endash/equal/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/macron/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedblleft/quotedblright/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 673 0 R +/FontFile 679 0 R >> -% 676 0 obj +% 682 0 obj << /Type /FontDescriptor -/FontName /SNVSAK+CMR12 +/FontName /OIRSPO+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 @@ -9658,10 +9708,10 @@ stream /ItalicAngle 0 /StemV 65 /XHeight 431 -/CharSet (/A/C/I/J/K/L/N/R/S/U/V/a/colon/comma/d/e/f/fi/g/hyphen/i/l/m/n/o/one/p/period/quotedblleft/quotedblright/r/s/seven/t/three/two/u/v/w/y/zero) -/FontFile 675 0 R +/CharSet (/A/C/I/J/K/L/N/R/S/U/V/a/colon/comma/d/e/eight/f/fi/g/hyphen/i/l/m/n/o/one/p/period/quotedblleft/quotedblright/r/s/t/three/two/u/v/w/y/zero) +/FontFile 681 0 R >> -% 678 0 obj +% 684 0 obj << /Type /FontDescriptor /FontName /VROLGE+CMR6 @@ -9674,9 +9724,9 @@ stream /StemV 83 /XHeight 431 /CharSet (/one/plus/three) -/FontFile 677 0 R +/FontFile 683 0 R >> -% 680 0 obj +% 686 0 obj << /Type /FontDescriptor /FontName /ABQBBP+CMR8 @@ -9689,9 +9739,9 @@ stream /StemV 76 /XHeight 431 /CharSet (/equal/one/plus/two) -/FontFile 679 0 R +/FontFile 685 0 R >> -% 682 0 obj +% 688 0 obj << /Type /FontDescriptor /FontName /NSLWFJ+CMSY10 @@ -9704,9 +9754,9 @@ stream /StemV 40 /XHeight 431 /CharSet (/N/bar/bardbl/braceleft/braceright/bullet/element/equivalence/floorleft/floorright/greaterequal/minus/negationslash/propersubset/propersuperset/radical/union) -/FontFile 681 0 R +/FontFile 687 0 R >> -% 684 0 obj +% 690 0 obj << /Type /FontDescriptor /FontName /JHSYKM+CMSY8 @@ -9719,9 +9769,9 @@ stream /StemV 46 /XHeight 431 /CharSet (/infinity/minus/multiply/negationslash) -/FontFile 683 0 R +/FontFile 689 0 R >> -% 686 0 obj +% 692 0 obj << /Type /FontDescriptor /FontName /FPIMLF+CMTI10 @@ -9734,9 +9784,9 @@ stream /StemV 68 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/I/K/L/M/N/O/P/R/S/T/U/V/a/b/c/colon/comma/d/e/eight/f/ff/fi/five/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/period/q/quoteright/r/s/t/three/two/u/v/w/x/y/z/zero) -/FontFile 685 0 R +/FontFile 691 0 R >> -% 688 0 obj +% 694 0 obj << /Type /FontDescriptor /FontName /YRQLNB+CMTI12 @@ -9749,9 +9799,9 @@ stream /StemV 63 /XHeight 431 /CharSet (/A/B/D/L/M/P/S/T/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/y) -/FontFile 687 0 R +/FontFile 693 0 R >> -% 690 0 obj +% 696 0 obj << /Type /FontDescriptor /FontName /SBOMTR+CMTT10 @@ -9764,9 +9814,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/asciitilde/asterisk/b/backslash/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 689 0 R +/FontFile 695 0 R >> -% 692 0 obj +% 698 0 obj << /Type /FontDescriptor /FontName /QDTWCG+MSBM10 @@ -9779,262 +9829,262 @@ stream /StemV 40 /XHeight 463 /CharSet (/R) -/FontFile 691 0 R +/FontFile 697 0 R >> % 205 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WOELMG+CMBX10 -/FontDescriptor 660 0 R +/FontDescriptor 666 0 R /FirstChar 12 /LastChar 122 -/Widths 653 0 R +/Widths 659 0 R >> % 148 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XCHSJH+CMBX12 -/FontDescriptor 662 0 R +/FontDescriptor 668 0 R /FirstChar 12 /LastChar 121 -/Widths 658 0 R +/Widths 664 0 R >> % 161 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EYIYGL+CMCSC10 -/FontDescriptor 664 0 R +/FontDescriptor 670 0 R /FirstChar 39 /LastChar 121 -/Widths 654 0 R +/Widths 660 0 R >> % 379 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YJJMFD+CMEX10 -/FontDescriptor 666 0 R +/FontDescriptor 672 0 R /FirstChar 0 /LastChar 113 -/Widths 642 0 R +/Widths 648 0 R >> % 225 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VFYBNB+CMMI10 -/FontDescriptor 668 0 R +/FontDescriptor 674 0 R /FirstChar 18 /LastChar 122 -/Widths 652 0 R +/Widths 658 0 R >> % 365 0 obj << /Type /Font /Subtype /Type1 /BaseFont /PNUTJM+CMMI6 -/FontDescriptor 670 0 R +/FontDescriptor 676 0 R /FirstChar 59 /LastChar 107 -/Widths 644 0 R +/Widths 650 0 R >> % 361 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TWBVYQ+CMMI8 -/FontDescriptor 672 0 R +/FontDescriptor 678 0 R /FirstChar 59 /LastChar 118 -/Widths 648 0 R +/Widths 654 0 R >> % 160 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DKEMOU+CMR10 -/FontDescriptor 674 0 R +/FontDescriptor 680 0 R /FirstChar 10 /LastChar 127 -/Widths 655 0 R +/Widths 661 0 R >> % 150 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /SNVSAK+CMR12 -/FontDescriptor 676 0 R +/BaseFont /OIRSPO+CMR12 +/FontDescriptor 682 0 R /FirstChar 12 /LastChar 121 -/Widths 656 0 R +/Widths 662 0 R >> % 366 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VROLGE+CMR6 -/FontDescriptor 678 0 R +/FontDescriptor 684 0 R /FirstChar 43 /LastChar 51 -/Widths 643 0 R +/Widths 649 0 R >> % 364 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ABQBBP+CMR8 -/FontDescriptor 680 0 R +/FontDescriptor 686 0 R /FirstChar 43 /LastChar 61 -/Widths 645 0 R +/Widths 651 0 R >> % 257 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NSLWFJ+CMSY10 -/FontDescriptor 682 0 R +/FontDescriptor 688 0 R /FirstChar 0 /LastChar 112 -/Widths 650 0 R +/Widths 656 0 R >> % 363 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JHSYKM+CMSY8 -/FontDescriptor 684 0 R +/FontDescriptor 690 0 R /FirstChar 0 /LastChar 54 -/Widths 646 0 R +/Widths 652 0 R >> % 307 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FPIMLF+CMTI10 -/FontDescriptor 686 0 R +/FontDescriptor 692 0 R /FirstChar 11 /LastChar 122 -/Widths 649 0 R +/Widths 655 0 R >> % 149 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YRQLNB+CMTI12 -/FontDescriptor 688 0 R +/FontDescriptor 694 0 R /FirstChar 65 /LastChar 121 -/Widths 657 0 R +/Widths 663 0 R >> % 255 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SBOMTR+CMTT10 -/FontDescriptor 690 0 R +/FontDescriptor 696 0 R /FirstChar 33 /LastChar 126 -/Widths 651 0 R +/Widths 657 0 R >> % 362 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QDTWCG+MSBM10 -/FontDescriptor 692 0 R +/FontDescriptor 698 0 R /FirstChar 82 /LastChar 82 -/Widths 647 0 R +/Widths 653 0 R >> % 151 0 obj << /Type /Pages /Count 6 -/Parent 693 0 R +/Parent 699 0 R /Kids [143 0 R 153 0 R 157 0 R 163 0 R 201 0 R 208 0 R] >> % 226 0 obj << /Type /Pages /Count 6 -/Parent 693 0 R +/Parent 699 0 R /Kids [222 0 R 246 0 R 252 0 R 272 0 R 294 0 R 304 0 R] >> % 314 0 obj << /Type /Pages /Count 6 -/Parent 693 0 R +/Parent 699 0 R /Kids [310 0 R 316 0 R 321 0 R 326 0 R 343 0 R 357 0 R] >> % 384 0 obj << /Type /Pages /Count 6 -/Parent 693 0 R +/Parent 699 0 R /Kids [376 0 R 391 0 R 400 0 R 413 0 R 432 0 R 445 0 R] >> % 457 0 obj << /Type /Pages /Count 6 -/Parent 693 0 R +/Parent 699 0 R /Kids [454 0 R 459 0 R 465 0 R 471 0 R 483 0 R 495 0 R] >> -% 515 0 obj +% 516 0 obj << /Type /Pages /Count 6 -/Parent 693 0 R -/Kids [512 0 R 517 0 R 522 0 R 527 0 R 533 0 R 537 0 R] +/Parent 699 0 R +/Kids [513 0 R 518 0 R 523 0 R 529 0 R 535 0 R 539 0 R] >> -% 546 0 obj +% 549 0 obj << /Type /Pages /Count 6 -/Parent 694 0 R -/Kids [543 0 R 549 0 R 557 0 R 566 0 R 577 0 R 582 0 R] +/Parent 700 0 R +/Kids [545 0 R 551 0 R 559 0 R 568 0 R 579 0 R 584 0 R] >> -% 591 0 obj +% 593 0 obj << /Type /Pages /Count 6 -/Parent 694 0 R -/Kids [588 0 R 596 0 R 603 0 R 608 0 R 615 0 R 619 0 R] +/Parent 700 0 R +/Kids [590 0 R 598 0 R 605 0 R 610 0 R 617 0 R 621 0 R] >> -% 628 0 obj +% 630 0 obj << /Type /Pages -/Count 4 -/Parent 694 0 R -/Kids [625 0 R 630 0 R 634 0 R 639 0 R] +/Count 5 +/Parent 700 0 R +/Kids [627 0 R 632 0 R 636 0 R 641 0 R 645 0 R] >> -% 693 0 obj +% 699 0 obj << /Type /Pages /Count 36 -/Parent 695 0 R -/Kids [151 0 R 226 0 R 314 0 R 384 0 R 457 0 R 515 0 R] +/Parent 701 0 R +/Kids [151 0 R 226 0 R 314 0 R 384 0 R 457 0 R 516 0 R] >> -% 694 0 obj +% 700 0 obj << /Type /Pages -/Count 16 -/Parent 695 0 R -/Kids [546 0 R 591 0 R 628 0 R] +/Count 17 +/Parent 701 0 R +/Kids [549 0 R 593 0 R 630 0 R] >> -% 695 0 obj +% 701 0 obj << /Type /Pages -/Count 52 -/Kids [693 0 R 694 0 R] +/Count 53 +/Kids [699 0 R 700 0 R] >> -% 696 0 obj +% 702 0 obj << /Type /Outlines /First 4 0 R @@ -10110,6 +10160,32 @@ stream /Parent 104 0 R /Next 112 0 R >> + +endstream +endobj +737 0 obj +<< + /Title (MultiLevel Domain Decomposition Parallel Preconditioners Package based on PSBLAS, V. 2.2) /Subject (MultiLevel Domain Decomposition Parallel Preconditioners Package) /Keywords (Parallel Numerical Software, Algebraic Multilevel Preconditioners, Sparse Iterative Solvers, PSBLAS, MPI) /Creator (pdfLaTeX) /Producer ($Id: userguide.tex 2008-04-08 Pasqua D'Ambra, Daniela di Serafino, Salvatore Filippone$) /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.17)/Keywords() +/CreationDate (D:20180514143546+01'00') +/ModDate (D:20180514143546+01'00') +/Trapped /False +/PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016) kpathsea version 6.2.2) +>> +endobj +703 0 obj +<< +/Type /ObjStm +/N 59 +/First 491 +/Length 8047 +>> +stream +104 0 100 112 96 197 92 280 88 362 84 444 80 526 76 608 72 690 68 759 +64 879 60 935 56 1053 52 1122 48 1204 44 1273 40 1391 36 1460 32 1542 28 1624 +24 1706 20 1775 16 1893 12 1974 8 2054 4 2119 704 2211 705 2379 706 2536 707 2736 +708 2945 709 3164 710 3392 711 3592 712 3785 713 3953 714 4118 715 4282 716 4447 717 4611 +718 4776 719 4939 720 5100 721 5262 722 5444 723 5621 724 5836 725 6051 726 6267 727 6504 +728 6669 729 6760 730 6869 731 6976 732 7082 733 7188 734 7252 735 7350 736 7383 % 104 0 obj << /Title 105 0 R @@ -10152,32 +10228,6 @@ stream /Prev 84 0 R /Next 92 0 R >> - -endstream -endobj -729 0 obj -<< - /Title (MultiLevel Domain Decomposition Parallel Preconditioners Package based on PSBLAS, V. 2.1) /Subject (MultiLevel Domain Decomposition Parallel Preconditioners Package) /Keywords (Parallel Numerical Software, Algebraic Multilevel Preconditioners, Sparse Iterative Solvers, PSBLAS, MPI) /Creator (pdfLaTeX) /Producer ($Id: userguide.tex 2008-04-08 Pasqua D'Ambra, Daniela di Serafino, Salvatore Filippone$) /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.17)/Keywords() -/CreationDate (D:20180127175957Z) -/ModDate (D:20180127175957Z) -/Trapped /False -/PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016) kpathsea version 6.2.2) ->> -endobj -697 0 obj -<< -/Type /ObjStm -/N 52 -/First 430 -/Length 7383 ->> -stream -84 0 80 82 76 164 72 246 68 315 64 435 60 491 56 609 52 678 48 760 -44 829 40 947 36 1016 32 1098 28 1180 24 1262 20 1331 16 1449 12 1530 8 1610 -4 1675 698 1767 699 1935 700 2092 701 2292 702 2499 703 2732 704 2946 705 3148 706 3337 -707 3504 708 3669 709 3833 710 3998 711 4161 712 4324 713 4489 714 4648 715 4819 716 4999 -717 5191 718 5406 719 5621 720 5854 721 6067 722 6230 723 6339 724 6446 725 6551 726 6657 -727 6747 728 6780 % 84 0 obj << /Title 85 0 R @@ -10346,194 +10396,205 @@ stream << /Title 5 0 R /A 1 0 R -/Parent 696 0 R +/Parent 702 0 R /First 8 0 R /Last 140 0 R /Count -11 >> -% 698 0 obj +% 704 0 obj << /Names [(Doc-Start) 147 0 R (Item.1) 380 0 R (Item.10) 498 0 R (Item.11) 499 0 R (Item.12) 500 0 R (Item.13) 501 0 R] /Limits [(Doc-Start) (Item.13)] >> -% 699 0 obj +% 705 0 obj << /Names [(Item.2) 381 0 R (Item.3) 382 0 R (Item.4) 416 0 R (Item.5) 417 0 R (Item.6) 418 0 R (Item.7) 419 0 R] /Limits [(Item.2) (Item.7)] >> -% 700 0 obj +% 706 0 obj << /Names [(Item.8) 420 0 R (Item.9) 421 0 R (appendix.A) 135 0 R (cite.BREZINA_VANEK) 231 0 R (cite.Briggs2000) 227 0 R (cite.CAI_SARKIS) 403 0 R] /Limits [(Item.8) (cite.CAI_SARKIS)] >> -% 701 0 obj -<< -/Names [(cite.MLD2P4_TOMS) 248 0 R (cite.MPI1) 282 0 R (cite.MPI2) 281 0 R (cite.MUMPS) 300 0 R (cite.Notay2008) 230 0 R (cite.PSBLAS3) 234 0 R] -/Limits [(cite.MLD2P4_TOMS) (cite.PSBLAS3)] ->> -% 702 0 obj -<< -/Names [(cite.PSBLASGUIDE) 283 0 R (cite.SUPERLU) 301 0 R (cite.SUPERLUDIST) 302 0 R (cite.Saad_book) 367 0 R (cite.Stuben_01) 228 0 R (cite.TUMINARO_TONG) 346 0 R] -/Limits [(cite.PSBLASGUIDE) (cite.TUMINARO_TONG)] ->> -% 703 0 obj -<< -/Names [(cite.UMFPACK) 299 0 R (cite.VANEK_MANDEL_BREZINA) 232 0 R (cite.aaecc_07) 348 0 R (cite.apnum_07) 349 0 R (cite.blas1) 280 0 R (cite.blas2) 279 0 R] -/Limits [(cite.UMFPACK) (cite.blas2)] ->> -% 704 0 obj -<< -/Names [(cite.blas3) 278 0 R (cite.dd2_96) 229 0 R (cite.para_04) 347 0 R (cite.psblas_00) 233 0 R (equation.1.1) 224 0 R (equation.4.2) 360 0 R] -/Limits [(cite.blas3) (equation.4.2)] ->> -% 705 0 obj -<< -/Names [(equation.4.3) 383 0 R (equation.4.4) 394 0 R (equation.4.5) 395 0 R (figure.1) 368 0 R (figure.2) 448 0 R (figure.3) 449 0 R] -/Limits [(equation.4.3) (figure.3)] ->> -% 706 0 obj -<< -/Names [(figure.4) 450 0 R (figure.5) 451 0 R (page.1) 146 0 R (page.10) 328 0 R (page.11) 345 0 R (page.12) 359 0 R] -/Limits [(figure.4) (page.12)] ->> % 707 0 obj << -/Names [(page.13) 378 0 R (page.14) 393 0 R (page.15) 402 0 R (page.16) 415 0 R (page.17) 434 0 R (page.18) 447 0 R] -/Limits [(page.13) (page.18)] +/Names [(cite.GrHeJi:16) 527 0 R (cite.MLD2P4_TOMS) 248 0 R (cite.MPI1) 282 0 R (cite.MPI2) 281 0 R (cite.MUMPS) 300 0 R (cite.Notay2008) 230 0 R] +/Limits [(cite.GrHeJi:16) (cite.Notay2008)] >> % 708 0 obj << -/Names [(page.19) 456 0 R (page.2) 155 0 R (page.20) 461 0 R (page.21) 467 0 R (page.22) 473 0 R (page.23) 485 0 R] -/Limits [(page.19) (page.23)] +/Names [(cite.PSBLAS3) 234 0 R (cite.PSBLASGUIDE) 283 0 R (cite.SUPERLU) 301 0 R (cite.SUPERLUDIST) 302 0 R (cite.Saad_book) 367 0 R (cite.Stuben_01) 228 0 R] +/Limits [(cite.PSBLAS3) (cite.Stuben_01)] >> % 709 0 obj << -/Names [(page.24) 497 0 R (page.25) 514 0 R (page.26) 519 0 R (page.27) 524 0 R (page.28) 529 0 R (page.29) 535 0 R] -/Limits [(page.24) (page.29)] +/Names [(cite.TUMINARO_TONG) 346 0 R (cite.UMFPACK) 299 0 R (cite.VANEK_MANDEL_BREZINA) 232 0 R (cite.aaecc_07) 348 0 R (cite.apnum_07) 349 0 R (cite.blas1) 280 0 R] +/Limits [(cite.TUMINARO_TONG) (cite.blas1)] >> % 710 0 obj << -/Names [(page.3) 254 0 R (page.30) 539 0 R (page.31) 545 0 R (page.32) 551 0 R (page.33) 559 0 R (page.34) 568 0 R] -/Limits [(page.3) (page.34)] +/Names [(cite.blas2) 279 0 R (cite.blas3) 278 0 R (cite.dd2_96) 229 0 R (cite.para_04) 347 0 R (cite.psblas_00) 233 0 R (equation.1.1) 224 0 R] +/Limits [(cite.blas2) (equation.1.1)] >> % 711 0 obj << -/Names [(page.35) 579 0 R (page.36) 584 0 R (page.37) 590 0 R (page.38) 598 0 R (page.39) 605 0 R (page.4) 274 0 R] -/Limits [(page.35) (page.4)] +/Names [(equation.4.2) 360 0 R (equation.4.3) 383 0 R (equation.4.4) 394 0 R (equation.4.5) 395 0 R (figure.1) 368 0 R (figure.2) 448 0 R] +/Limits [(equation.4.2) (figure.2)] >> % 712 0 obj << -/Names [(page.40) 610 0 R (page.41) 617 0 R (page.42) 621 0 R (page.43) 627 0 R (page.44) 632 0 R (page.45) 636 0 R] -/Limits [(page.40) (page.45)] +/Names [(figure.3) 449 0 R (figure.4) 450 0 R (figure.5) 451 0 R (page.1) 146 0 R (page.10) 328 0 R (page.11) 345 0 R] +/Limits [(figure.3) (page.11)] >> % 713 0 obj << -/Names [(page.46) 641 0 R (page.5) 296 0 R (page.6) 306 0 R (page.7) 312 0 R (page.8) 318 0 R (page.9) 323 0 R] -/Limits [(page.46) (page.9)] +/Names [(page.12) 359 0 R (page.13) 378 0 R (page.14) 393 0 R (page.15) 402 0 R (page.16) 415 0 R (page.17) 434 0 R] +/Limits [(page.12) (page.17)] >> % 714 0 obj << -/Names [(page.i) 159 0 R (page.ii) 165 0 R (page.iii) 203 0 R (page.iv) 210 0 R (section*.1) 7 0 R (section*.2) 204 0 R] -/Limits [(page.i) (section*.2)] +/Names [(page.18) 447 0 R (page.19) 456 0 R (page.2) 155 0 R (page.20) 461 0 R (page.21) 467 0 R (page.22) 473 0 R] +/Limits [(page.18) (page.22)] >> % 715 0 obj << -/Names [(section*.3) 256 0 R (section*.4) 139 0 R (section.1) 11 0 R (section.2) 15 0 R (section.3) 19 0 R (section.4) 43 0 R] -/Limits [(section*.3) (section.4)] +/Names [(page.23) 485 0 R (page.24) 497 0 R (page.25) 515 0 R (page.26) 520 0 R (page.27) 525 0 R (page.28) 531 0 R] +/Limits [(page.23) (page.28)] >> % 716 0 obj << -/Names [(section.5) 59 0 R (section.6) 67 0 R (section.7) 127 0 R (section.8) 131 0 R (subsection.3.1) 23 0 R (subsection.3.2) 27 0 R] -/Limits [(section.5) (subsection.3.2)] +/Names [(page.29) 537 0 R (page.3) 254 0 R (page.30) 541 0 R (page.31) 547 0 R (page.32) 553 0 R (page.33) 561 0 R] +/Limits [(page.29) (page.33)] >> % 717 0 obj << -/Names [(subsection.3.3) 31 0 R (subsection.3.4) 35 0 R (subsection.3.5) 39 0 R (subsection.4.1) 47 0 R (subsection.4.2) 51 0 R (subsection.4.3) 55 0 R] -/Limits [(subsection.3.3) (subsection.4.3)] +/Names [(page.34) 570 0 R (page.35) 581 0 R (page.36) 586 0 R (page.37) 592 0 R (page.38) 600 0 R (page.39) 607 0 R] +/Limits [(page.34) (page.39)] >> % 718 0 obj << -/Names [(subsection.5.1) 63 0 R (subsection.6.1) 71 0 R (subsection.6.2) 75 0 R (subsection.6.3) 79 0 R (subsection.6.4) 83 0 R (subsection.6.5) 87 0 R] -/Limits [(subsection.5.1) (subsection.6.5)] +/Names [(page.4) 274 0 R (page.40) 612 0 R (page.41) 619 0 R (page.42) 623 0 R (page.43) 629 0 R (page.44) 634 0 R] +/Limits [(page.4) (page.44)] >> % 719 0 obj << -/Names [(subsection.6.6) 91 0 R (subsection.6.7) 95 0 R (subsection.6.8) 99 0 R (subsection.6.9) 103 0 R (subsubsection.6.9.1) 107 0 R (subsubsection.6.9.2) 111 0 R] -/Limits [(subsection.6.6) (subsubsection.6.9.2)] +/Names [(page.45) 638 0 R (page.46) 643 0 R (page.47) 647 0 R (page.5) 296 0 R (page.6) 306 0 R (page.7) 312 0 R] +/Limits [(page.45) (page.7)] >> % 720 0 obj << -/Names [(subsubsection.6.9.3) 115 0 R (subsubsection.6.9.4) 119 0 R (subsubsection.6.9.5) 123 0 R (table.1) 422 0 R (table.2) 423 0 R (table.3) 525 0 R] -/Limits [(subsubsection.6.9.3) (table.3)] +/Names [(page.8) 318 0 R (page.9) 323 0 R (page.i) 159 0 R (page.ii) 165 0 R (page.iii) 203 0 R (page.iv) 210 0 R] +/Limits [(page.8) (page.iv)] >> % 721 0 obj << -/Names [(table.4) 530 0 R (table.5) 503 0 R (table.6) 540 0 R (table.7) 502 0 R (table.8) 424 0 R (title.0) 3 0 R] -/Limits [(table.4) (title.0)] +/Names [(section*.1) 7 0 R (section*.2) 204 0 R (section*.3) 256 0 R (section*.4) 139 0 R (section.1) 11 0 R (section.2) 15 0 R] +/Limits [(section*.1) (section.2)] >> % 722 0 obj << -/Kids [698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R] -/Limits [(Doc-Start) (cite.blas2)] +/Names [(section.3) 19 0 R (section.4) 43 0 R (section.5) 59 0 R (section.6) 67 0 R (section.7) 127 0 R (section.8) 131 0 R] +/Limits [(section.3) (section.8)] >> % 723 0 obj << -/Kids [704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R] -/Limits [(cite.blas3) (page.29)] +/Names [(subsection.3.1) 23 0 R (subsection.3.2) 27 0 R (subsection.3.3) 31 0 R (subsection.3.4) 35 0 R (subsection.3.5) 39 0 R (subsection.4.1) 47 0 R] +/Limits [(subsection.3.1) (subsection.4.1)] >> % 724 0 obj << -/Kids [710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R] -/Limits [(page.3) (section.4)] +/Names [(subsection.4.2) 51 0 R (subsection.4.3) 55 0 R (subsection.5.1) 63 0 R (subsection.6.1) 71 0 R (subsection.6.2) 75 0 R (subsection.6.3) 79 0 R] +/Limits [(subsection.4.2) (subsection.6.3)] >> % 725 0 obj << -/Kids [716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R] -/Limits [(section.5) (title.0)] +/Names [(subsection.6.4) 83 0 R (subsection.6.5) 87 0 R (subsection.6.6) 91 0 R (subsection.6.7) 95 0 R (subsection.6.8) 99 0 R (subsection.6.9) 103 0 R] +/Limits [(subsection.6.4) (subsection.6.9)] >> % 726 0 obj << -/Kids [722 0 R 723 0 R 724 0 R 725 0 R] -/Limits [(Doc-Start) (title.0)] +/Names [(subsubsection.6.9.1) 107 0 R (subsubsection.6.9.2) 111 0 R (subsubsection.6.9.3) 115 0 R (subsubsection.6.9.4) 119 0 R (subsubsection.6.9.5) 123 0 R (table.1) 422 0 R] +/Limits [(subsubsection.6.9.1) (table.1)] >> % 727 0 obj << -/Dests 726 0 R +/Names [(table.2) 423 0 R (table.3) 526 0 R (table.4) 532 0 R (table.5) 503 0 R (table.6) 542 0 R (table.7) 502 0 R] +/Limits [(table.2) (table.7)] >> % 728 0 obj << +/Names [(table.8) 424 0 R (title.0) 3 0 R] +/Limits [(table.8) (title.0)] +>> +% 729 0 obj +<< +/Kids [704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R] +/Limits [(Doc-Start) (cite.blas1)] +>> +% 730 0 obj +<< +/Kids [710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R] +/Limits [(cite.blas2) (page.28)] +>> +% 731 0 obj +<< +/Kids [716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R] +/Limits [(page.29) (section.2)] +>> +% 732 0 obj +<< +/Kids [722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R] +/Limits [(section.3) (table.7)] +>> +% 733 0 obj +<< +/Kids [728 0 R] +/Limits [(table.8) (title.0)] +>> +% 734 0 obj +<< +/Kids [729 0 R 730 0 R 731 0 R 732 0 R 733 0 R] +/Limits [(Doc-Start) (title.0)] +>> +% 735 0 obj +<< +/Dests 734 0 R +>> +% 736 0 obj +<< /Type /Catalog -/Pages 695 0 R -/Outlines 696 0 R -/Names 727 0 R +/Pages 701 0 R +/Outlines 702 0 R +/Names 735 0 R /PageMode/UseOutlines/PageLabels<>2<>6<>]>> /OpenAction 142 0 R >> endstream endobj -730 0 obj +738 0 obj << /Type /XRef -/Index [0 731] -/Size 731 +/Index [0 739] +/Size 739 /W [1 3 1] -/Root 728 0 R -/Info 729 0 R -/ID [<37C6B93B1FC7FB0B6EF4F2D85DDA8EE2> <37C6B93B1FC7FB0B6EF4F2D85DDA8EE2>] -/Length 3655 +/Root 736 0 R +/Info 737 0 R +/ID [<8C81DAEA73A339289C5AFD04D6D5A2A7> <8C81DAEA73A339289C5AFD04D6D5A2A7>] +/Length 3695 >> stream -ÿ;&J¹Q¹Î&¹Î9¹ÎN¹  -ÎO¹  Î^¹ Î_¹ 9¹ 9¹ 9 ¹ -9*¹ 9,¹9E¹9U¹³¹ ³ ¹!"³&¹#$³2¹%&#¹'(#¹)*#"}c+,#'}b-.#-}a/0#4}`12#5}_34#6}^56#7}]78#>}\9:#?}[;<#@}Z=>#K}Y?@#T}XAB#X}WCD#\}VEFGKHI}9}F}@}INLMROÑP}?}:US=TWXYZ[\]^_`abcÎÎÎÎÎÎÎÎÎÎ Î -Î Î Î ÎÎÎÎÎÎÎÎVÎÎ}8á ÎÎW”ÎÎÎÎÎ Î!Î"Î#Î$Î%ÎÎ(ÎX_Î'}<}J#_}}}#^}} -} Î*Î+Î,Î-Î.Î/Î0Î1Î2Î3Î4Î)w}Î7Î6Î;Î5Œ‚Î8}GÎ:}CÎ=Î>Î?Î@ÎAÎBÎDÎFÎGÎHÎIÎJÎKÎPÎ<™ÊÎMÎCÎEÎL}}} } }}ÎSÎTÎUÎVÎWÎXÎZÎ[ÎRÎ`ÎQ·³Î]ÎYÎ\}#]}} ÎcÎaÐÆÎb}E999R9x}K99*999 -9:Í9 9 99 Ii9 99999999999999!9_9}#`#a#c9#9$9%9&9'9(9-9";9)9+}>}H}D}B}=}A}9690919293949/9;9.«ú95};9798999:}L9=9>9?9@9A9F9<Øó9B9C9D9I9J9H9L9G•9K#b9N9O9P9Q9R9S9_9`9\9M2±9T9V9W9X9Y9Z9[³³I#9a9b9c³³9^³9]Sâ³ó”³³³³ ³ -³ ³ ³ ³³«–³³³³³³³³Íê³}M³³Û/³³³³!³çå³³#³$³'³"ó%³*³+³,³-³.³/³0³)³3³(W³1³5³6³7³8³9³:³;³<³B³4$R³=³>³?³@³A#³]³M³R³S³T³U³V³D³F³CCX³E}N³J³GMгH³L³P³K\ʳN³O³Y³Q…‰³W³X³[³^³Z³³\³b³_Áø³`³a##³cÕ#}OD###Ö## -# # # ##>Ú# #######Iþ####### ####\h#!#%#(#$r@#&#+#*#.#)“Û#,}P#0#1#2#8#/™#3#;#<#:#A#9¨ð#=#C#E#B½c#D#H#I#G#L#FÀ1#J#O#Mݸ#N#R#Q#U#Pâ«#S}Q#Y#VéÛ#W}#Zù¡#[çÃ}}@‡}}}}}}}}}}}} }!}"}#}$}%}&\}'©Õ}(îï})/À}*QJ}+Œe},«´}-Õd}.;Æ}/w4}0•j}1³å}2ÚÉ}3ù“}4Nñ}5„K}6Ý}7}R}S}T}U :¹¹¹¹¹¹¹¹¹¹¹¹ ¹!¹"¹#¹$¹%¹&¹'¹(¹)¹*¹+¹,¹-¹.¹/¹0¹1¹2¹3 7G WI +ÿ;&J¿Q¿Î&¿Î9¿ÎN¿  +ÎO¿  Î^¿ Î_¿9¿9¿9 ¿9*¿9,¿ 9E¿ 9U¿ ³¿ + ³ ¿ !"³&¿#$³2¿%&$¿'($¿)*$#¿+,$(¿-.$.¿/0$5¿12$6¿34$7c56$8b78$?a9:$@`;<$A_=>$L^?@$U]AB$Y\CD$][EFGKHI>KENNLMROÑPD?US=TWXYZ[\]^_`abcÎÎÎÎÎÎÎÎÎÎ Î +Î Î Î ÎÎÎÎÎÎÎÎVÎÎ=á ÎÎW”ÎÎÎÎÎ Î!Î"Î#Î$Î%ÎÎ(ÎX_Î'AO$`$_  +Î*Î+Î,Î-Î.Î/Î0Î1Î2Î3Î4Î)wÎ7Î6Î;Î5Œ‚Î8LÎ:HÎ=Î>Î?Î@ÎAÎBÎDÎFÎGÎHÎIÎJÎKÎPÎ<™ÊÎMÎCÎEÎL  ÎSÎTÎUÎVÎWÎXÎZÎ[ÎRÎ`ÎQ·³Î]ÎYÎ\$^ÎcÎaÐÆÎbJ999R9xP99*999 +9:Í9 9 99 Ii9 99999999999999!9_9$a$b9#9$9%9&9'9(9-9";9)9+CMIGBF9690919293949/9;9.«ú95@9798999:Q9=9>9?9@9A9F9<Øó9B9C9D9I9J9H9L9G•9K$c9N9O9P9Q9R9S9_9`9\9M2±9T9V9W9X9Y9Z9[³³I$9a9b9c³³9^³9]Sâ³Ö~³³³³ ³ +³ ³ ³ ³³«–³³³³³³³³Íê³R³³Û/³³³³!³çå³³#³$³'³"ó%³*³+³,³-³.³/³0³)³3³(W³1³5³6³7³8³9³:³;³<³B³4$R³=³>³?³@³A$³^³M³N³S³T³U³V³W³D³F³CCX³ES³J³GMгH³L³Q³K\ʳO³P ³Z³R††³X³Y³\³_³[ž°³]³c³`Âõ³a³b$$$Ý$^T$$$ð$$ $ $ $ +$$ ?ô$$$$$$$$K$$$$$$ $!$$$$]‚$"$&$)$%sZ$'$,$+$/$*”õ$-U$1$2$3$9$0š5$4$<$=$;$B$:ª +$>$D$F$C¾}$E$I$J$H$M$GÁK$K$P$NÞÒ$O$S$R$V$QãÅ$TV$Z$Wêõ$X$[ú»$\ëÞAð[© !"#$%&'()*+`Œ,­Ä-òÞ.3¯/U90T1¯£2ÙS3?µ4{O5™…6¸7Þä8ý®9S :ˆf;á <WXYZ =ú¿¿¿¿¿¿¿ ¿!¿"¿#¿$¿%¿&¿'¿(¿)¿*¿+¿,¿-¿.¿/¿0¿1¿2¿3¿4¿5¿6¿7¿8¿9¿: ; ]Ä endstream endobj startxref -612169 +613828 %%EOF diff --git a/docs/src/Makefile b/docs/src/Makefile index 94459c2d..73e70b30 100644 --- a/docs/src/Makefile +++ b/docs/src/Makefile @@ -139,7 +139,7 @@ PDF = $(join $(BASEFILE),.pdf) PS = $(join $(BASEFILE),.ps) GXS = $(join $(BASEFILE),.gxs) GLX = $(join $(BASEFILE),.glx) -TARGETPDF= ../mld2p4-2.1-guide.pdf +TARGETPDF= ../mld2p4-2.2-guide.pdf BASEHTML = $(patsubst %.tex,%,$(HTMLFILE)) HTML = $(join $(HTMLFILE),.html) HTMLDIR = ../html diff --git a/docs/src/bibliography.tex b/docs/src/bibliography.tex index e935635a..d6716846 100644 --- a/docs/src/bibliography.tex +++ b/docs/src/bibliography.tex @@ -116,6 +116,12 @@ S.~Filippone, M.~Colajanni, {\em PSBLAS: A Library for Parallel Linear Algebra Computation on Sparse Matrices}, ACM Transactions on Mathematical Software, 26 (4), 2000, 527--550. +% +\bibitem{GrHeJi:16} +S. Gratton, P. Henon, P. Jiranek and X. Vasseur, + {\em Reducing complexity of algebraic multigrid by aggregation}, +Numerical Lin. Algebra with Applications, 2016, 23:501-518 + % \bibitem{MPI2} W.~Gropp, S.~Huss-Lederman, A.~Lumsdaine, E.~Lusk, B.~Nitzberg, W.~Saphir, M.~Snir, diff --git a/docs/src/userguide.tex b/docs/src/userguide.tex index 7584dd9e..70e4fab1 100644 --- a/docs/src/userguide.tex +++ b/docs/src/userguide.tex @@ -27,7 +27,7 @@ \pdfcompresslevel=0 %-- 0 = none, 9 = best \pdfinfo{ %-- Info dictionary of PDF output /Author (PD, DdS, SF) /Title (MultiLevel Domain Decomposition Parallel Preconditioners Package - based on PSBLAS, V. 2.1) + based on PSBLAS, V. 2.2) /Subject (MultiLevel Domain Decomposition Parallel Preconditioners Package) /Keywords (Parallel Numerical Software, Algebraic Multilevel Preconditioners, Sparse Iterative Solvers, PSBLAS, MPI) /Creator (pdfLaTeX) @@ -125,9 +125,9 @@ based on PSBLAS} \vspace{\stretch{1}} \noindent\hspace*{\centeroffset}\makebox[0pt][l]{\begin{minipage}{\textwidth} \flushright -\large Software version: 2.1\\ +\large Software version: 2.2\\ %\today -\large July 31, 2017 +\large July 31, 2018 \end{minipage}} %\addtolength{\textwidth}{\centeroffset} \vspace{\stretch{2}} diff --git a/docs/src/userhtml.tex b/docs/src/userhtml.tex index 5a979980..86d4cf93 100644 --- a/docs/src/userhtml.tex +++ b/docs/src/userhtml.tex @@ -26,7 +26,7 @@ \pdfcompresslevel=0 %-- 0 = none, 9 = best \pdfinfo{ %-- Info dictionary of PDF output /Author (PD, DdS, SF) /Title (MultiLevel Domain Decomposition Parallel Preconditioners Package - based on PSBLAS, V. 2.1) + based on PSBLAS, V. 2.2) /Subject (MultiLevel Domain Decomposition Parallel Preconditioners Package) /Keywords (Parallel Numerical Software, Algebraic Multilevel Preconditioners, Sparse Iterative Solvers, PSBLAS, MPI) /Creator (pdfLaTeX) @@ -102,9 +102,9 @@ based on PSBLAS}\\[3ex] \large Cranfield University, Cranfield, United Kingdom \\[10ex] %\today -Software version: 2.1\\ +Software version: 2.2\\ %\today - July 31, 2017 + July 31, 2018 \clearpage \ \\ \thispagestyle{empty} diff --git a/docs/src/userinterface.tex b/docs/src/userinterface.tex index 0e3de52d..82a13bfa 100644 --- a/docs/src/userinterface.tex +++ b/docs/src/userinterface.tex @@ -319,10 +319,14 @@ be applied. of $A+A^T$.\\ \hline %\verb|mld_aggr_type_| \par \verb|'AGGR_TYPE'| & \verb|character(len=*)| \hspace*{-3mm} - & \textbf{\texttt{'VMB'}} & \textbf{\texttt{'VMB'}} - & Type of aggregation algorithm: currently, the scalar aggregation - algorithm by Van\v{e}k, Mandel and Brezina is implemented - \cite{VANEK_MANDEL_BREZINA}. \\ \hline + & \textbf{\texttt{'SOC1'}} & + \textbf{\texttt{'SOC1'}}, + \textbf{\texttt{'SOC2'}} + & Type of aggregation algorithm: currently, + we implement to measures of strength of + connection, the one by Van\v{e}k, Mandel + and Brezina~\cite{VANEK_MANDEL_BREZINA}, + and the one by Gratton et al~\cite{GrHeJi:16}. \\ \hline %\verb|mld_aggr_prol_| \par \verb|'AGGR_PROL'| & \verb|character(len=*)| \hspace*{-3mm} & \texttt{'SMOOTHED'}, \texttt{'UNSMOOTHED'} & \texttt{'SMOOTHED'} diff --git a/examples/fileread/data_input.f90 b/examples/fileread/data_input.f90 index 2366f448..b31a5f9a 100644 --- a/examples/fileread/data_input.f90 +++ b/examples/fileread/data_input.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/fileread/mld_cexample_1lev.f90 b/examples/fileread/mld_cexample_1lev.f90 index 0bdfcc28..a21ff1dd 100644 --- a/examples/fileread/mld_cexample_1lev.f90 +++ b/examples/fileread/mld_cexample_1lev.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/fileread/mld_cexample_ml.f90 b/examples/fileread/mld_cexample_ml.f90 index 9776a7ff..790e3b2f 100644 --- a/examples/fileread/mld_cexample_ml.f90 +++ b/examples/fileread/mld_cexample_ml.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/fileread/mld_dexample_1lev.f90 b/examples/fileread/mld_dexample_1lev.f90 index ac0e0c8f..c5f0c0a9 100644 --- a/examples/fileread/mld_dexample_1lev.f90 +++ b/examples/fileread/mld_dexample_1lev.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/fileread/mld_dexample_ml.f90 b/examples/fileread/mld_dexample_ml.f90 index b7ba0d91..ff21e6fa 100644 --- a/examples/fileread/mld_dexample_ml.f90 +++ b/examples/fileread/mld_dexample_ml.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/fileread/mld_sexample_1lev.f90 b/examples/fileread/mld_sexample_1lev.f90 index b3cd0ca3..bcb62fe2 100644 --- a/examples/fileread/mld_sexample_1lev.f90 +++ b/examples/fileread/mld_sexample_1lev.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/fileread/mld_sexample_ml.f90 b/examples/fileread/mld_sexample_ml.f90 index fcc9df10..8f4fec57 100644 --- a/examples/fileread/mld_sexample_ml.f90 +++ b/examples/fileread/mld_sexample_ml.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/fileread/mld_zexample_1lev.f90 b/examples/fileread/mld_zexample_1lev.f90 index 12ae26f0..2e89da9d 100644 --- a/examples/fileread/mld_zexample_1lev.f90 +++ b/examples/fileread/mld_zexample_1lev.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/fileread/mld_zexample_ml.f90 b/examples/fileread/mld_zexample_ml.f90 index 58a5bcd6..5d7571c3 100644 --- a/examples/fileread/mld_zexample_ml.f90 +++ b/examples/fileread/mld_zexample_ml.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/pdegen/data_input.f90 b/examples/pdegen/data_input.f90 index 2366f448..b31a5f9a 100644 --- a/examples/pdegen/data_input.f90 +++ b/examples/pdegen/data_input.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/pdegen/mld_dexample_1lev.f90 b/examples/pdegen/mld_dexample_1lev.f90 index ff15ed41..c28c76ac 100644 --- a/examples/pdegen/mld_dexample_1lev.f90 +++ b/examples/pdegen/mld_dexample_1lev.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/pdegen/mld_dexample_ml.f90 b/examples/pdegen/mld_dexample_ml.f90 index 6bb497ef..dc775ba6 100644 --- a/examples/pdegen/mld_dexample_ml.f90 +++ b/examples/pdegen/mld_dexample_ml.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/pdegen/mld_dpde_mod.f90 b/examples/pdegen/mld_dpde_mod.f90 index 461334b6..ec06a599 100644 --- a/examples/pdegen/mld_dpde_mod.f90 +++ b/examples/pdegen/mld_dpde_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -68,8 +68,9 @@ contains ! the rhs. ! subroutine mld_d_gen_pde3d(ictxt,idim,a,bv,xv,desc_a,afmt,& - & a1,a2,a3,b1,b2,b3,c,g,info,f,amold,vmold,imold,nrl,iv) + & a1,a2,a3,b1,b2,b3,c,g,info,f,amold,vmold,imold,partition,nrl,iv) use psb_base_mod + use psb_util_mod ! ! Discretizes the partial differential equation ! @@ -97,7 +98,7 @@ contains class(psb_d_base_sparse_mat), optional :: amold class(psb_d_base_vect_type), optional :: vmold class(psb_i_base_vect_type), optional :: imold - integer(psb_ipk_), optional :: nrl,iv(:) + integer(psb_ipk_), optional :: partition, nrl,iv(:) ! Local variables. @@ -106,9 +107,13 @@ contains type(psb_d_coo_sparse_mat) :: acoo type(psb_d_csr_sparse_mat) :: acsr real(psb_dpk_) :: zt(nb),x,y,z - integer(psb_ipk_) :: m,n,nnz,glob_row,nlr,i,ii,ib,k + integer(psb_ipk_) :: m,n,nnz,nr,nt,glob_row,nlr,i,j,ii,ib,k, partition_ integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner - integer(psb_ipk_) :: np, iam, nr, nt + ! For 3D partition + integer(psb_ipk_) :: npx,npy,npz, npdims(3),iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam integer(psb_ipk_) :: icoeff integer(psb_ipk_), allocatable :: irow(:),icol(:),myidx(:) real(psb_dpk_), allocatable :: val(:) @@ -138,15 +143,28 @@ contains sqdeltah = deltah*deltah deltah2 = 2.d0* deltah + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + ! initialize array descriptor and sparse matrix storage. provide an ! estimate of the number of non zeroes - + m = idim*idim*idim n = m nnz = ((n*9)/(np)) if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n - if (.not.present(iv)) then + select case(partition_) + case(1) + ! A BLOCK partition if (present(nrl)) then nr = nrl else @@ -166,24 +184,99 @@ contains call psb_abort(ictxt) return end if - else - if (size(iv) /= m) then - write(psb_err_unit,*) iam, 'Initialization error IV',size(iv),m + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ictxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ictxt) + call psb_abort(ictxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' info = -1 call psb_barrier(ictxt) call psb_abort(ictxt) return end if - end if - call psb_barrier(ictxt) - t0 = psb_wtime() - if (present(iv)) then + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! call psb_cdall(ictxt,desc_a,info,vg=iv) - else - call psb_cdall(ictxt,desc_a,info,nl=nr) - end if + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndx(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ictxt) + call psb_abort(ictxt) + end if + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ictxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ictxt) + call psb_abort(ictxt) + return + end select + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) ! define rhs from boundary conditions; also build initial guess if (info == psb_success_) call psb_geall(xv,desc_a,info) @@ -211,8 +304,6 @@ contains goto 9999 endif - myidx = desc_a%get_global_indices() - nlr = size(myidx) ! loop over rows belonging to current process in a block ! distribution. @@ -227,18 +318,8 @@ contains ! local matrix pointer glob_row=myidx(i) ! compute gridpoint coordinates - if (mod(glob_row,(idim*idim)) == 0) then - ix = glob_row/(idim*idim) - else - ix = glob_row/(idim*idim)+1 - endif - if (mod((glob_row-(ix-1)*idim*idim),idim) == 0) then - iy = (glob_row-(ix-1)*idim*idim)/idim - else - iy = (glob_row-(ix-1)*idim*idim)/idim+1 - endif - iz = glob_row-(ix-1)*idim*idim-(iy-1)*idim - ! x, y, x coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates x = (ix-1)*deltah y = (iy-1)*deltah z = (iz-1)*deltah @@ -383,7 +464,6 @@ contains return end subroutine mld_d_gen_pde3d - ! ! functions parametrizing the differential equation ! diff --git a/examples/pdegen/mld_sexample_1lev.f90 b/examples/pdegen/mld_sexample_1lev.f90 index 23e4f674..c5d0f877 100644 --- a/examples/pdegen/mld_sexample_1lev.f90 +++ b/examples/pdegen/mld_sexample_1lev.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/pdegen/mld_sexample_ml.f90 b/examples/pdegen/mld_sexample_ml.f90 index 88c30e5d..086bcb19 100644 --- a/examples/pdegen/mld_sexample_ml.f90 +++ b/examples/pdegen/mld_sexample_ml.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/examples/pdegen/mld_spde_mod.f90 b/examples/pdegen/mld_spde_mod.f90 index e14153a3..ad0a7838 100644 --- a/examples/pdegen/mld_spde_mod.f90 +++ b/examples/pdegen/mld_spde_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -68,8 +68,9 @@ contains ! the rhs. ! subroutine mld_s_gen_pde3d(ictxt,idim,a,bv,xv,desc_a,afmt,& - & a1,a2,a3,b1,b2,b3,c,g,info,f,amold,vmold,imold,nrl,iv) + & a1,a2,a3,b1,b2,b3,c,g,info,f,amold,vmold,imold,partition,nrl,iv) use psb_base_mod + use psb_util_mod ! ! Discretizes the partial differential equation ! @@ -97,7 +98,7 @@ contains class(psb_s_base_sparse_mat), optional :: amold class(psb_s_base_vect_type), optional :: vmold class(psb_i_base_vect_type), optional :: imold - integer(psb_ipk_), optional :: nrl,iv(:) + integer(psb_ipk_), optional :: partition, nrl,iv(:) ! Local variables. @@ -106,9 +107,13 @@ contains type(psb_s_coo_sparse_mat) :: acoo type(psb_s_csr_sparse_mat) :: acsr real(psb_spk_) :: zt(nb),x,y,z - integer(psb_ipk_) :: m,n,nnz,glob_row,nlr,i,ii,ib,k + integer(psb_ipk_) :: m,n,nnz,nr,nt,glob_row,nlr,i,j,ii,ib,k, partition_ integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner - integer(psb_ipk_) :: np, iam, nr, nt + ! For 3D partition + integer(psb_ipk_) :: npx,npy,npz, npdims(3),iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam integer(psb_ipk_) :: icoeff integer(psb_ipk_), allocatable :: irow(:),icol(:),myidx(:) real(psb_spk_), allocatable :: val(:) @@ -138,15 +143,28 @@ contains sqdeltah = deltah*deltah deltah2 = 2.d0* deltah + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + ! initialize array descriptor and sparse matrix storage. provide an ! estimate of the number of non zeroes - + m = idim*idim*idim n = m nnz = ((n*9)/(np)) if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n - if (.not.present(iv)) then + select case(partition_) + case(1) + ! A BLOCK partition if (present(nrl)) then nr = nrl else @@ -166,24 +184,99 @@ contains call psb_abort(ictxt) return end if - else - if (size(iv) /= m) then - write(psb_err_unit,*) iam, 'Initialization error IV',size(iv),m + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ictxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ictxt) + call psb_abort(ictxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' info = -1 call psb_barrier(ictxt) call psb_abort(ictxt) return end if - end if - call psb_barrier(ictxt) - t0 = psb_wtime() - if (present(iv)) then + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! call psb_cdall(ictxt,desc_a,info,vg=iv) - else - call psb_cdall(ictxt,desc_a,info,nl=nr) - end if + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndx(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ictxt) + call psb_abort(ictxt) + end if + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ictxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ictxt) + call psb_abort(ictxt) + return + end select + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) ! define rhs from boundary conditions; also build initial guess if (info == psb_success_) call psb_geall(xv,desc_a,info) @@ -211,8 +304,6 @@ contains goto 9999 endif - myidx = desc_a%get_global_indices() - nlr = size(myidx) ! loop over rows belonging to current process in a block ! distribution. @@ -227,18 +318,8 @@ contains ! local matrix pointer glob_row=myidx(i) ! compute gridpoint coordinates - if (mod(glob_row,(idim*idim)) == 0) then - ix = glob_row/(idim*idim) - else - ix = glob_row/(idim*idim)+1 - endif - if (mod((glob_row-(ix-1)*idim*idim),idim) == 0) then - iy = (glob_row-(ix-1)*idim*idim)/idim - else - iy = (glob_row-(ix-1)*idim*idim)/idim+1 - endif - iz = glob_row-(ix-1)*idim*idim-(iy-1)*idim - ! x, y, x coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates x = (ix-1)*deltah y = (iy-1)*deltah z = (iz-1)*deltah @@ -383,7 +464,6 @@ contains return end subroutine mld_s_gen_pde3d - ! ! functions parametrizing the differential equation ! diff --git a/mlprec/Makefile b/mlprec/Makefile index e853352a..e9870075 100644 --- a/mlprec/Makefile +++ b/mlprec/Makefile @@ -11,25 +11,34 @@ DMODOBJS=mld_d_prec_type.o mld_d_ilu_fact_mod.o \ mld_d_inner_mod.o mld_d_ilu_solver.o mld_d_diag_solver.o mld_d_jac_smoother.o mld_d_as_smoother.o \ mld_d_umf_solver.o mld_d_slu_solver.o mld_d_sludist_solver.o mld_d_id_solver.o\ mld_d_base_solver_mod.o mld_d_base_smoother_mod.o mld_d_onelev_mod.o \ - mld_d_gs_solver.o mld_d_mumps_solver.o + mld_d_gs_solver.o mld_d_mumps_solver.o \ + mld_d_base_aggregator_mod.o \ + mld_d_dec_aggregator_mod.o mld_d_symdec_aggregator_mod.o +#mld_d_bcmatch_aggregator_mod.o SMODOBJS=mld_s_prec_type.o mld_s_ilu_fact_mod.o \ mld_s_inner_mod.o mld_s_ilu_solver.o mld_s_diag_solver.o mld_s_jac_smoother.o mld_s_as_smoother.o \ mld_s_slu_solver.o mld_s_id_solver.o\ mld_s_base_solver_mod.o mld_s_base_smoother_mod.o mld_s_onelev_mod.o \ - mld_s_gs_solver.o mld_s_mumps_solver.o + mld_s_gs_solver.o mld_s_mumps_solver.o \ + mld_s_base_aggregator_mod.o \ + mld_s_dec_aggregator_mod.o mld_s_symdec_aggregator_mod.o ZMODOBJS=mld_z_prec_type.o mld_z_ilu_fact_mod.o \ mld_z_inner_mod.o mld_z_ilu_solver.o mld_z_diag_solver.o mld_z_jac_smoother.o mld_z_as_smoother.o \ mld_z_umf_solver.o mld_z_slu_solver.o mld_z_sludist_solver.o mld_z_id_solver.o\ mld_z_base_solver_mod.o mld_z_base_smoother_mod.o mld_z_onelev_mod.o \ - mld_z_gs_solver.o mld_z_mumps_solver.o + mld_z_gs_solver.o mld_z_mumps_solver.o \ + mld_z_base_aggregator_mod.o \ + mld_z_dec_aggregator_mod.o mld_z_symdec_aggregator_mod.o CMODOBJS=mld_c_prec_type.o mld_c_ilu_fact_mod.o \ mld_c_inner_mod.o mld_c_ilu_solver.o mld_c_diag_solver.o mld_c_jac_smoother.o mld_c_as_smoother.o \ mld_c_slu_solver.o mld_c_id_solver.o\ mld_c_base_solver_mod.o mld_c_base_smoother_mod.o mld_c_onelev_mod.o \ - mld_c_gs_solver.o mld_c_mumps_solver.o + mld_c_gs_solver.o mld_c_mumps_solver.o \ + mld_c_base_aggregator_mod.o \ + mld_c_dec_aggregator_mod.o mld_c_symdec_aggregator_mod.o @@ -84,10 +93,26 @@ mld_d_prec_type.o: mld_d_onelev_mod.o mld_c_prec_type.o: mld_c_onelev_mod.o mld_z_prec_type.o: mld_z_onelev_mod.o -mld_s_onelev_mod.o: mld_s_base_smoother_mod.o -mld_d_onelev_mod.o: mld_d_base_smoother_mod.o -mld_c_onelev_mod.o: mld_c_base_smoother_mod.o -mld_z_onelev_mod.o: mld_z_base_smoother_mod.o +mld_s_onelev_mod.o: mld_s_base_smoother_mod.o mld_s_dec_aggregator_mod.o +mld_d_onelev_mod.o: mld_d_base_smoother_mod.o mld_d_dec_aggregator_mod.o +mld_c_onelev_mod.o: mld_c_base_smoother_mod.o mld_c_dec_aggregator_mod.o +mld_z_onelev_mod.o: mld_z_base_smoother_mod.o mld_z_dec_aggregator_mod.o + +mld_s_base_aggregator_mod.o: mld_base_prec_type.o +mld_s_dec_aggregator_mod.o: mld_s_base_aggregator_mod.o +mld_s_hybrid_aggregator_mod.o mld_s_symdec_aggregator_mod.o: mld_s_dec_aggregator_mod.o + +mld_d_base_aggregator_mod.o: mld_base_prec_type.o +mld_d_dec_aggregator_mod.o: mld_d_base_aggregator_mod.o +mld_d_hybrid_aggregator_mod.o mld_d_symdec_aggregator_mod.o: mld_d_dec_aggregator_mod.o + +mld_c_base_aggregator_mod.o: mld_base_prec_type.o +mld_c_dec_aggregator_mod.o: mld_c_base_aggregator_mod.o +mld_c_hybrid_aggregator_mod.o mld_c_symdec_aggregator_mod.o: mld_c_dec_aggregator_mod.o + +mld_z_base_aggregator_mod.o: mld_base_prec_type.o +mld_z_dec_aggregator_mod.o: mld_z_base_aggregator_mod.o +mld_z_hybrid_aggregator_mod.o mld_z_symdec_aggregator_mod.o: mld_z_dec_aggregator_mod.o mld_s_base_smoother_mod.o: mld_s_base_solver_mod.o mld_d_base_smoother_mod.o: mld_d_base_solver_mod.o diff --git a/mlprec/impl/Makefile b/mlprec/impl/Makefile index a2c35c31..27842294 100644 --- a/mlprec/impl/Makefile +++ b/mlprec/impl/Makefile @@ -8,13 +8,13 @@ FINCLUDES=$(FMFLAG)$(HERE) $(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(PSBLAS_INCLUD -DMPFOBJS=mld_daggrmat_nosmth_asb.o mld_daggrmat_smth_asb.o mld_daggrmat_minnrg_asb.o mld_daggrmat_biz_asb.o +DMPFOBJS= -SMPFOBJS=mld_saggrmat_nosmth_asb.o mld_saggrmat_smth_asb.o mld_saggrmat_minnrg_asb.o mld_saggrmat_biz_asb.o +SMPFOBJS= -ZMPFOBJS=mld_zaggrmat_nosmth_asb.o mld_zaggrmat_smth_asb.o mld_zaggrmat_minnrg_asb.o mld_zaggrmat_biz_asb.o +ZMPFOBJS= -CMPFOBJS=mld_caggrmat_nosmth_asb.o mld_caggrmat_smth_asb.o mld_caggrmat_minnrg_asb.o mld_caggrmat_biz_asb.o +CMPFOBJS= MPFOBJS=$(SMPFOBJS) $(DMPFOBJS) $(CMPFOBJS) $(ZMPFOBJS) @@ -24,27 +24,23 @@ MPCOBJS=mld_dslud_interface.o mld_zslud_interface.o DINNEROBJS= mld_dmlprec_bld.o mld_dfile_prec_descr.o \ mld_d_smoothers_bld.o mld_d_hierarchy_bld.o \ - mld_daggrmap_bld.o \ - mld_d_dec_map_bld.o mld_dmlprec_aply.o mld_daggrmat_asb.o \ - $(DMPFOBJS) mld_d_extprol_bld.o mld_d_lev_aggrmap_bld.o mld_d_lev_aggrmat_asb.o + mld_dmlprec_aply.o \ + $(DMPFOBJS) mld_d_extprol_bld.o SINNEROBJS= mld_smlprec_bld.o mld_sfile_prec_descr.o \ mld_s_smoothers_bld.o mld_s_hierarchy_bld.o \ - mld_saggrmap_bld.o \ - mld_s_dec_map_bld.o mld_smlprec_aply.o mld_saggrmat_asb.o \ - $(SMPFOBJS) mld_s_extprol_bld.o mld_s_lev_aggrmap_bld.o mld_s_lev_aggrmat_asb.o + mld_smlprec_aply.o \ + $(SMPFOBJS) mld_s_extprol_bld.o ZINNEROBJS= mld_zmlprec_bld.o mld_zfile_prec_descr.o \ mld_z_smoothers_bld.o mld_z_hierarchy_bld.o \ - mld_zaggrmap_bld.o \ - mld_z_dec_map_bld.o mld_zmlprec_aply.o mld_zaggrmat_asb.o \ - $(ZMPFOBJS) mld_z_extprol_bld.o mld_z_lev_aggrmap_bld.o mld_z_lev_aggrmat_asb.o + mld_zmlprec_aply.o \ + $(ZMPFOBJS) mld_z_extprol_bld.o CINNEROBJS= mld_cmlprec_bld.o mld_cfile_prec_descr.o \ mld_c_smoothers_bld.o mld_c_hierarchy_bld.o \ - mld_caggrmap_bld.o \ - mld_c_dec_map_bld.o mld_cmlprec_aply.o mld_caggrmat_asb.o \ - $(CMPFOBJS) mld_c_extprol_bld.o mld_c_lev_aggrmap_bld.o mld_c_lev_aggrmat_asb.o + mld_cmlprec_aply.o \ + $(CMPFOBJS) mld_c_extprol_bld.o INNEROBJS= $(SINNEROBJS) $(DINNEROBJS) $(CINNEROBJS) $(ZINNEROBJS) @@ -71,10 +67,12 @@ OBJS=$(F90OBJS) $(COBJS) $(MPCOBJS) LIBNAME=libmld_prec.a -lib: $(OBJS) levd smoothd solvd +lib: $(OBJS) aggrd levd smoothd solvd $(AR) $(HERE)/$(LIBNAME) $(OBJS) $(RANLIB) $(HERE)/$(LIBNAME) +aggrd: + cd aggregator && $(MAKE) levd: cd level && $(MAKE) smoothd: @@ -89,9 +87,11 @@ mpobjs: veryclean: clean /bin/rm -f $(LIBNAME) -clean: solvclean smoothclean levclean +clean: solvclean smoothclean levclean aggrclean /bin/rm -f $(OBJS) $(LOCAL_MODS) +aggrclean: + cd aggregator && $(MAKE) clean levclean: cd level && $(MAKE) clean smoothclean: diff --git a/mlprec/impl/aggregator/Makefile b/mlprec/impl/aggregator/Makefile new file mode 100644 index 00000000..81a51e87 --- /dev/null +++ b/mlprec/impl/aggregator/Makefile @@ -0,0 +1,60 @@ +include ../../../Make.inc +LIBDIR=../../../lib +INCDIR=../../../include +MODDIR=../../../modules +HERE=../.. + +FINCLUDES=$(FMFLAG)$(HERE) $(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(PSBLAS_INCLUDES) + +#CINCLUDES= -I${SUPERLU_INCDIR} -I${HSL_INCDIR} -I${SPRAL_INCDIR} -I/home/users/pasqua/Ambra/BootCMatch/include -lBCM -L/home/users/pasqua/Ambra/BootCMatch/lib -lm + +OBJS= \ +mld_s_dec_aggregator_mat_asb.o \ +mld_s_dec_aggregator_tprol.o \ +mld_s_symdec_aggregator_tprol.o \ +mld_s_map_to_tprol.o mld_s_soc1_map_bld.o mld_s_soc2_map_bld.o\ +mld_saggrmat_biz_asb.o mld_saggrmat_minnrg_asb.o\ +mld_saggrmat_nosmth_asb.o mld_saggrmat_smth_asb.o \ +mld_d_dec_aggregator_mat_asb.o \ +mld_d_dec_aggregator_tprol.o \ +mld_d_symdec_aggregator_tprol.o \ +mld_d_map_to_tprol.o mld_d_soc1_map_bld.o mld_d_soc2_map_bld.o\ +mld_daggrmat_biz_asb.o mld_daggrmat_minnrg_asb.o\ +mld_daggrmat_nosmth_asb.o mld_daggrmat_smth_asb.o \ +mld_c_dec_aggregator_mat_asb.o \ +mld_c_dec_aggregator_tprol.o \ +mld_c_symdec_aggregator_tprol.o \ +mld_c_map_to_tprol.o mld_c_soc1_map_bld.o mld_c_soc2_map_bld.o\ +mld_caggrmat_biz_asb.o mld_caggrmat_minnrg_asb.o\ +mld_caggrmat_nosmth_asb.o mld_caggrmat_smth_asb.o \ +mld_z_dec_aggregator_mat_asb.o \ +mld_z_dec_aggregator_tprol.o \ +mld_z_symdec_aggregator_tprol.o \ +mld_z_map_to_tprol.o mld_z_soc1_map_bld.o mld_z_soc2_map_bld.o\ +mld_zaggrmat_biz_asb.o mld_zaggrmat_minnrg_asb.o\ +mld_zaggrmat_nosmth_asb.o mld_zaggrmat_smth_asb.o + +#mld_s_hybrid_aggregator_tprol.o \ +#mld_d_hybrid_aggregator_tprol.o \ +#mld_c_hybrid_aggregator_tprol.o \ +#mld_z_hybrid_aggregator_tprol.o \ + +#bootCMatch_interface.o mld_d_bcmatch_aggregator_tprol.o\ +#mld_d_bcmatch_map_to_tprol.o mld_d_bcmatch_aggregator_mat_asb.o \ + + +LIBNAME=libmld_prec.a + +lib: $(OBJS) + $(AR) $(HERE)/$(LIBNAME) $(OBJS) + $(RANLIB) $(HERE)/$(LIBNAME) + +mpobjs: + (make $(MPFOBJS) F90="$(MPF90)" F90COPT="$(F90COPT)") + (make $(MPCOBJS) CC="$(MPCC)" CCOPT="$(CCOPT)") + +veryclean: clean + /bin/rm -f $(LIBNAME) + +clean: + /bin/rm -f $(OBJS) $(LOCAL_MODS) diff --git a/mlprec/impl/mld_caggrmat_asb.f90 b/mlprec/impl/aggregator/mld_c_dec_aggregator_mat_asb.f90 similarity index 71% rename from mlprec/impl/mld_caggrmat_asb.f90 rename to mlprec/impl/aggregator/mld_c_dec_aggregator_mat_asb.f90 index 4804626b..0cce1101 100644 --- a/mlprec/impl/mld_caggrmat_asb.f90 +++ b/mlprec/impl/aggregator/mld_c_dec_aggregator_mat_asb.f90 @@ -1,6 +1,6 @@ ! -! -! MLD2P4 version 2.1 +! +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,12 +35,20 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_caggrmat_asb.f90 +! File: mld_c_dec_aggregator_mat_asb.f90 ! -! Subroutine: mld_caggrmat_asb +! Subroutine: mld_c_dec_aggregator_mat_asb ! Version: complex ! -! This routine builds a coarse-level matrix A_C from a fine-level matrix A +! This routine builds the matrix associated to the current level of the +! multilevel preconditioner from the matrix associated to the previous level, +! by using the user-specified aggregation technique (therefore, it also builds the +! prolongation and restriction operators mapping the current level to the +! previous one and vice versa). +! The current level is regarded as the coarse one, while the previous as +! the fine one. This is in agreement with the fact that the routine is called, +! by mld_mlprec_bld, only on levels >=2. +! The coarse-level matrix A_C is built from a fine-level matrix A ! by using the Galerkin approach, i.e. ! ! A_C = P_C^T A P_C, @@ -50,7 +58,7 @@ ! A mapping from the nodes of the adjacency graph of A to the nodes of the ! adjacency graph of A_C has been computed by the mld_aggrmap_bld subroutine. ! The prolongator P_C is built here from this mapping, according to the -! value of p%iprcparm(mld_aggr_prol_), specified by the user through +! value of p%iprcparm(mld_aggr_kind_), specified by the user through ! mld_cprecinit and mld_zprecset. ! On output from this routine the entries of AC, op_prol, op_restr ! are still in "global numbering" mode; this is fixed in the calling routine @@ -64,13 +72,13 @@ ! 4. minimum energy ! 1. The non-smoothed aggregation uses as prolongator the piecewise constant ! interpolation operator corresponding to the fine-to-coarse level mapping built -! by mld_aggrmap_bld. This is called tentative prolongator. +! by p%aggr%bld_tprol. This is called tentative prolongator. ! 2. The smoothed aggregation uses as prolongator the operator obtained by applying ! a damped Jacobi smoother to the tentative prolongator. ! 3. The "bizarre" aggregation uses a prolongator proposed by the authors of MLD2P4. ! This prolongator still requires a deep analysis and testing and its use is ! not recommended. -! 4. Minimum energy aggregation: ADD REFERENCE. +! 4. Minimum energy aggregation ! ! For more details see ! M. Brezina and P. Vanek, A black-box iterative solver based on a two-level @@ -78,24 +86,28 @@ ! P. D'Ambra, D. di Serafino and S. Filippone, On the development of PSBLAS-based ! parallel two-level Schwarz preconditioners, Appl. Num. Math., 57 (2007), ! 1181-1196. +! M. Sala, R. Tuminaro: A new Petrov-Galerkin smoothed aggregation preconditioner +! for nonsymmetric linear systems, SIAM J. Sci. Comput., 31(1):143-166 (2008) ! ! +! The main structure is: +! 1. Perform sanity checks; +! 2. Compute prolongator/restrictor/AC ! +! ! Arguments: +! ag - type(mld_c_dec_aggregator_type), input/output. +! The aggregator object +! parms - type(mld_sml_parms), input +! The aggregation parameters ! a - type(psb_cspmat_type), input. ! The sparse matrix structure containing the local part of ! the fine-level matrix. ! desc_a - type(psb_desc_type), input. ! The communication descriptor of the fine-level matrix. -! p - type(mld_c_onelev_type), input/output. ! The 'one-level' data structure that will contain the local ! part of the matrix to be built as well as the information ! concerning the prolongator and its transpose. -! parms - type(mld_sml_parms), input -! Parameters controlling the choice of algorithm -! ac - type(psb_cspmat_type), output -! The coarse matrix on output -! ! ilaggr - integer, dimension(:), input ! The mapping between the row indices of the coarse-level ! matrix and the row indices of the fine-level matrix. @@ -106,6 +118,9 @@ ! the various processes do not overlap. ! nlaggr - integer, dimension(:) input ! nlaggr(i) contains the aggregates held by process i. +! ac - type(psb_cspmat_type), output +! The coarse matrix on output +! ! op_prol - type(psb_cspmat_type), input/output ! The tentative prolongator on input, the computed prolongator on output ! @@ -114,43 +129,45 @@ ! ! info - integer, output. ! Error code. -! -subroutine mld_caggrmat_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_restr,info) - +! +subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) use psb_base_mod - use mld_base_prec_type - use mld_c_inner_mod, mld_protect_name => mld_caggrmat_asb - + use mld_c_prec_type, mld_protect_name => mld_c_dec_aggregator_mat_asb + use mld_c_inner_mod implicit none - -! Arguments - type(psb_cspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) - type(mld_sml_parms), intent(inout) :: parms - type(psb_cspmat_type), intent(inout) :: ac, op_prol,op_restr - integer(psb_ipk_), intent(out) :: info - -! Local variables + + class(mld_c_dec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_cspmat_type), intent(inout) :: op_prol + type(psb_cspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + + ! Local variables + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me type(psb_c_coo_sparse_mat) :: acoo, bcoo type(psb_c_csr_sparse_mat) :: acsr1 - integer(psb_ipk_) :: nzl,ntaggr, err_act + integer(psb_ipk_) :: nzl,ntaggr + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit - integer(psb_ipk_) :: ictxt,np,me - character(len=20) :: name - name='mld_aggrmat_asb' - if(psb_get_errstatus().ne.0) return - info=psb_success_ + name='mld_c_dec_aggregator_mat_asb' + if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - - + info = psb_success_ ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) - call psb_info(ictxt, me, np) - + ! + ! Build the coarse-level matrix from the fine-level one, starting from + ! the mapping defined by mld_aggrmap_bld and applying the aggregation + ! algorithm specified by + ! select case (parms%aggr_prol) case (mld_no_smooth_) @@ -183,11 +200,12 @@ subroutine mld_caggrmat_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_restr,inf goto 9999 end if + call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) - return -end subroutine mld_caggrmat_asb + +end subroutine mld_c_dec_aggregator_mat_asb diff --git a/mlprec/impl/mld_c_lev_aggrmap_bld.f90 b/mlprec/impl/aggregator/mld_c_dec_aggregator_tprol.f90 similarity index 65% rename from mlprec/impl/mld_c_lev_aggrmap_bld.f90 rename to mlprec/impl/aggregator/mld_c_dec_aggregator_tprol.f90 index 251c1a7b..efe66b9a 100644 --- a/mlprec/impl/mld_c_lev_aggrmap_bld.f90 +++ b/mlprec/impl/aggregator/mld_c_dec_aggregator_tprol.f90 @@ -1,7 +1,6 @@ - -! +! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -36,15 +35,15 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_c_lev_aggrmap_bld.f90 +! File: mld_c_dec_aggregator_tprol.f90 ! -! Subroutine: mld_c_lev_aggrmap_bld +! Subroutine: mld_c_dec_aggregator_tprol ! Version: complex ! -! This routine is just an interface to aggrmap_bld where the real work is performed. -! It takes care of some consistency checking though. -! -! See mld_caggrmap_bld for constraints on input/oput arguments. +! This routine is mainly an interface to map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. ! ! ! Arguments: @@ -73,31 +72,27 @@ ! info - integer, output. ! Error code. ! -subroutine mld_c_lev_aggrmap_bld(p,a,desc_a,ilaggr,nlaggr,op_prol,info) - +subroutine mld_c_dec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod - use mld_base_prec_type - use mld_c_inner_mod, mld_protect_name => mld_c_lev_aggrmap_bld - + use mld_c_prec_type, mld_protect_name => mld_c_dec_aggregator_build_tprol + use mld_c_inner_mod implicit none - - ! Arguments - type(mld_c_onelev_type), intent(inout), target :: p - type(psb_cspmat_type), intent(in) :: a + class(mld_c_dec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_cspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info - ! Local variables - character(len=20) :: name - integer(psb_mpk_) :: ictxt, np, me - integer(psb_ipk_) :: err_act - integer(psb_ipk_) :: nzl, ntaggr + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: ntaggr integer(psb_ipk_) :: debug_level, debug_unit - name='mld_c_lev_aggrmap_bld' + name='mld_c_dec_aggregator_tprol' if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() @@ -106,52 +101,28 @@ subroutine mld_c_lev_aggrmap_bld(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ictxt = desc_a%get_context() call psb_info(ictxt,me,np) - call mld_check_def(p%parms%ml_cycle,'Multilevel cycle',& + call mld_check_def(parms%ml_cycle,'Multilevel cycle',& & mld_mult_ml_,is_legal_ml_cycle) - call mld_check_def(p%parms%par_aggr_alg,'Aggregation',& + call mld_check_def(parms%par_aggr_alg,'Aggregation',& & mld_dec_aggr_,is_legal_ml_par_aggr_alg) - call mld_check_def(p%parms%aggr_ord,'Ordering',& + call mld_check_def(parms%aggr_ord,'Ordering',& & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) - call mld_check_def(p%parms%aggr_thresh,'Aggr_Thresh',szero,is_legal_s_aggr_thrs) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',szero,is_legal_s_aggr_thrs) - select case(p%parms%par_aggr_alg) - case (mld_dec_aggr_, mld_sym_dec_aggr_) - - ! - ! Build a mapping between the row indices of the fine-level matrix - ! and the row indices of the coarse-level matrix, according to a decoupled - ! aggregation algorithm. This also defines a tentative prolongator from - ! the coarse to the fine level. - ! - call mld_aggrmap_bld(p%parms%par_aggr_alg,p%parms%aggr_ord,p%parms%aggr_thresh,& - & a,desc_a,ilaggr,nlaggr,op_prol,info) - - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmap_bld') - goto 9999 - end if - case (mld_bcmatch_aggr_) - write(0,*) 'Matching is not implemented yet ' - info = -1111 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,p%parms%par_aggr_alg,izero,izero,izero/)) - goto 9999 - - case default + call ag%map_bld(parms%aggr_ord,parms%aggr_thresh,a,desc_a,nlaggr,ilaggr,info) - info = -1 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,p%parms%par_aggr_alg,izero,izero,izero/)) + if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='map_bld/map_to_tprol') goto 9999 - - end select - + endif call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) return - -end subroutine mld_c_lev_aggrmap_bld + +end subroutine mld_c_dec_aggregator_build_tprol diff --git a/mlprec/impl/mld_caggrmap_bld.f90 b/mlprec/impl/aggregator/mld_c_map_to_tprol.f90 similarity index 71% rename from mlprec/impl/mld_caggrmap_bld.f90 rename to mlprec/impl/aggregator/mld_c_map_to_tprol.f90 index 0ef77481..28ac347a 100644 --- a/mlprec/impl/mld_caggrmap_bld.f90 +++ b/mlprec/impl/aggregator/mld_c_map_to_tprol.f90 @@ -1,6 +1,6 @@ +! ! -! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -9,7 +9,7 @@ ! Salvatore Filippone ! Pasqua D'Ambra ! Daniela di Serafino -! +! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions ! are met: @@ -35,15 +35,17 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_caggrmap_bld.f90 +! File: mld_c_map_to_tprol.f90 ! -! Subroutine: mld_caggrmap_bld +! Subroutine: mld_c_map_to_tprol ! Version: complex ! -! This routine builds a mapping from the row indices of the fine-level matrix -! to the row indices of the coarse-level matrix, according to a decoupled -! aggregation algorithm. This mapping will be used by mld_aggrmat_asb to -! build the coarse-level matrix. +! This routine uses a mapping from the row indices of the fine-level matrix +! to the row indices of the coarse-level matrix to build a tentative +! prolongator, i.e. a piecewise constant operator. +! This is later used to build the final operator; the code has been refactored here +! to be shared among all the methods that provide the tentative prolongator +! through a simple integer mapping. ! ! The aggregation algorithm is a parallel version of that described in ! * M. Brezina and P. Vanek, A black-box iterative solver based on a @@ -83,28 +85,21 @@ ! info - integer, output. ! Error code. ! -subroutine mld_caggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_prol,info) +subroutine mld_c_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod - use mld_base_prec_type - use mld_c_inner_mod, mld_protect_name => mld_caggrmap_bld + use mld_c_inner_mod, mld_protect_name => mld_c_map_to_tprol implicit none ! Arguments - integer(psb_ipk_), intent(in) :: iorder - integer(psb_ipk_), intent(in) :: aggr_type - real(psb_spk_), intent(in) :: theta - type(psb_cspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) type(psb_cspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info ! Local variables - integer(psb_ipk_), allocatable :: ils(:), neigh(:) integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m,naggrm1, naggrp1, ntaggr - type(psb_cspmat_type) :: atmp, atrans type(psb_c_coo_sparse_mat) :: tmpcoo integer(psb_ipk_) :: debug_level, debug_unit,err_act integer(psb_ipk_) :: ictxt,np,me @@ -113,7 +108,7 @@ subroutine mld_caggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro if(psb_get_errstatus() /= 0) return info=psb_success_ - name = 'mld_aggrmap_bld' + name = 'mld_map_to_tprol' call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() @@ -123,40 +118,6 @@ subroutine mld_caggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro nrow = desc_a%get_local_rows() ncol = desc_a%get_local_cols() - select case (aggr_type) - case (mld_dec_aggr_) - call mld_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) - - case (mld_sym_dec_aggr_) - nr = a%get_nrows() - call a%csclip(atmp,info,imax=nr,jmax=nr,& - & rscale=.false.,cscale=.false.) - call atmp%set_nrows(nr) - call atmp%set_ncols(nr) - if (info == psb_success_) call atmp%transp(atrans) - if (info == psb_success_) call atrans%cscnv(info,type='COO') - if (info == psb_success_) call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) - call atmp%set_nrows(nr) - call atmp%set_ncols(nr) - if (info == psb_success_) call atrans%free() - if (info == psb_success_) call atmp%cscnv(info,type='CSR') - if (info == psb_success_) call mld_dec_map_bld(iorder,theta,atmp,desc_a,nlaggr,ilaggr,info) - if (info == psb_success_) call atmp%free() - - case default - - info = -1 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,aggr_type,izero,izero,izero/)) - goto 9999 - end select - - if (info /= psb_success_) then - info=psb_err_internal_error_ - call psb_errpush(info,name,a_err='dec_map_bld') - goto 9999 - end if - naggr = nlaggr(me+1) ntaggr = sum(nlaggr) naggrm1 = sum(nlaggr(1:me)) @@ -186,4 +147,4 @@ subroutine mld_caggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro return -end subroutine mld_caggrmap_bld +end subroutine mld_c_map_to_tprol diff --git a/mlprec/impl/mld_c_dec_map_bld.f90 b/mlprec/impl/aggregator/mld_c_soc1_map_bld.f90 similarity index 95% rename from mlprec/impl/mld_c_dec_map_bld.f90 rename to mlprec/impl/aggregator/mld_c_soc1_map_bld.f90 index 4c480c94..1ec3aa18 100644 --- a/mlprec/impl/mld_c_dec_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_c_soc1_map_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -36,13 +36,13 @@ ! ! ! -! File: mld_c_dec_map__bld.f90 +! File: mld_c_soc1_map__bld.f90 ! -! Subroutine: mld_c_dec_map_bld +! Subroutine: mld_c_soc1_map_bld ! Version: complex ! ! This routine builds the tentative prolongator based on the -! decoupled aggregation algorithm presented in +! strength of connection aggregation algorithm presented in ! ! M. Brezina and P. Vanek, A black-box iterative solver based on a ! two-level Schwarz method, Computing, 63 (1999), 233-263. @@ -67,11 +67,11 @@ ! ! ! -subroutine mld_c_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) +subroutine mld_c_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) use psb_base_mod use mld_base_prec_type - use mld_c_inner_mod, mld_protect_name => mld_c_dec_map_bld + use mld_c_inner_mod!, mld_protect_name => mld_c_soc1_map_bld implicit none @@ -98,7 +98,7 @@ subroutine mld_c_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) if (psb_get_errstatus() /= 0) return info=psb_success_ - name = 'mld_dec_map_bld' + name = 'mld_soc1_map_bld' call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() @@ -247,7 +247,7 @@ subroutine mld_c_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) ! Find its strongly connected neighbourhood not ! already aggregated, and make it into a new aggregate. ! - cpling = dzero + cpling = szero ip = 0 do k=1, nz j = icol(k) @@ -318,5 +318,5 @@ subroutine mld_c_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) return -end subroutine mld_c_dec_map_bld +end subroutine mld_c_soc1_map_bld diff --git a/mlprec/impl/aggregator/mld_c_soc2_map_bld.f90 b/mlprec/impl/aggregator/mld_c_soc2_map_bld.f90 new file mode 100644 index 00000000..7ceb36fc --- /dev/null +++ b/mlprec/impl/aggregator/mld_c_soc2_map_bld.f90 @@ -0,0 +1,330 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! File: mld_c_soc2_map__bld.f90 +! +! Subroutine: mld_c_soc2_map_bld +! Version: complex +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! +! Note: upon exit +! +! Arguments: +! a - type(psb_cspmat_type). +! The sparse matrix structure containing the local part of the +! matrix to be preconditioned. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! p - type(mld_cprec_type), input/output. +! The preconditioner data structure; upon exit it contains +! the multilevel hierarchy of prolongators, restrictors +! and coarse matrices. +! info - integer, output. +! Error code. +! +! +! +subroutine mld_c_soc2_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) + + use psb_base_mod + use mld_base_prec_type + use mld_c_inner_mod!, mld_protect_name => mld_c_soc2_map_bld + + implicit none + + ! Arguments + integer(psb_ipk_), intent(in) :: iorder + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(psb_spk_), intent(in) :: theta + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), intent(out) :: info + + ! Local variables + integer(psb_ipk_), allocatable :: ils(:), neigh(:), irow(:), icol(:),& + & ideg(:), idxs(:), tmpaggr(:) + complex(psb_spk_), allocatable :: val(:), diag(:) + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr,nc,naggr,i,j,m, nz, ilg, ii, ip, ip1,nzcnt + type(psb_c_csr_sparse_mat) :: acsr, muij, s_neigh + type(psb_c_coo_sparse_mat) :: s_neigh_coo + real(psb_spk_) :: cpling, tcl + logical :: disjoint + integer(psb_ipk_) :: debug_level, debug_unit,err_act + integer(psb_ipk_) :: ictxt,np,me + integer(psb_ipk_) :: nrow, ncol, n_ne + character(len=20) :: name, ch_err + + if (psb_get_errstatus() /= 0) return + info=psb_success_ + name = 'mld_soc2_map_bld' + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ! + ictxt=desc_a%get_context() + call psb_info(ictxt,me,np) + nrow = desc_a%get_local_rows() + ncol = desc_a%get_local_cols() + + nr = a%get_nrows() + nc = a%get_ncols() + allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nr),stat=info) + if(info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + + diag = a%get_diag(info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_sp_getdiag') + goto 9999 + end if + + ! + ! Phase zero: compute muij + ! + call a%cp_to(muij) + do i=1, nr + do k=muij%irp(i),muij%irp(i+1)-1 + j = muij%ja(k) + if (j<= nr) muij%val(k) = abs(muij%val(k))/sqrt(abs(diag(i)*diag(j))) + end do + end do + !write(*,*) 'murows/cols ',maxval(mu_rows),maxval(mu_cols) + ! + ! Compute the 1-neigbour; mark strong links with +1, weak links with -1 + ! + call s_neigh_coo%allocate(nr,nr,muij%get_nzeros()) + ip = 0 + do i=1, nr + do k=muij%irp(i),muij%irp(i+1)-1 + j = muij%ja(k) + if (j<=nr) then + ip = ip + 1 + s_neigh_coo%ia(ip) = i + s_neigh_coo%ja(ip) = j + if (real(muij%val(k)) >= theta) then + s_neigh_coo%val(ip) = sone + else + s_neigh_coo%val(ip) = -sone + end if + end if + end do + end do + !write(*,*) 'S_NEIGH: ',nr,ip + call s_neigh_coo%set_nzeros(ip) + call s_neigh%mv_from_coo(s_neigh_coo,info) + + if (iorder == mld_aggr_ord_nat_) then + do i=1, nr + ilaggr(i) = -(nr+1) + idxs(i) = i + end do + else + do i=1, nr + ilaggr(i) = -(nr+1) + ideg(i) = muij%irp(i+1) - muij%irp(i) + end do + call psb_msort(ideg,ix=idxs,dir=psb_sort_down_) + end if + + + ! + ! Phase one: Start with disjoint groups. + ! + naggr = 0 + icnt = 0 + step1: do ii=1, nr + i = idxs(ii) + + if (ilaggr(i) == -(nr+1)) then + ! + ! Get the 1-neighbourhood of I + ! + ip1 = s_neigh%irp(i) + nz = s_neigh%irp(i+1)-ip1 + ! + ! If the neighbourhood only contains I, skip it + ! + if (nz ==0) then + ilaggr(i) = 0 + cycle step1 + end if + if ((nz==1).and.(s_neigh%ja(ip1)==i)) then + ilaggr(i) = 0 + cycle step1 + end if + ! + ! If the whole strongly coupled neighborhood of I is + ! as yet unconnected, turn it into the next aggregate. + ! + nzcnt = count(real(s_neigh%val(ip1:ip1+nz-1)) > 0) + icol(1:nzcnt) = pack(s_neigh%ja(ip1:ip1+nz-1),(real(s_neigh%val(ip1:ip1+nz-1)) > 0)) + disjoint = all(ilaggr(icol(1:nzcnt)) == -(nr+1)) + if (disjoint) then + icnt = icnt + 1 + naggr = naggr + 1 + do k=1, nzcnt + ilaggr(icol(k)) = naggr + end do + ilaggr(i) = naggr + end if + endif + enddo step1 + + if (debug_level >= psb_debug_outer_) then + write(debug_unit,*) me,' ',trim(name),& + & ' Check 1:',count(ilaggr == -(nr+1)) + end if + + ! + ! Phase two: join the neighbours + ! + tmpaggr = ilaggr + step2: do ii=1,nr + i = idxs(ii) + + if (ilaggr(i) == -(nr+1)) then + ! + ! Find the most strongly connected neighbour that is + ! already aggregated, if any, and join its aggregate + ! + cpling = szero + ip = 0 + do k=s_neigh%irp(i), s_neigh%irp(i+1)-1 + j = s_neigh%ja(k) + if ((1<=j).and.(j<=nr)) then + if ( (tmpaggr(j) > 0).and. (real(muij%val(k)) > cpling)& + & .and.(real(s_neigh%val(k))>0)) then + ip = k + cpling = muij%val(k) + end if + end if + enddo + if (ip > 0) then + ilaggr(i) = ilaggr(s_neigh%ja(ip)) + end if + end if + end do step2 + + + ! + ! Phase three: sweep over leftovers, if any + ! + step3: do ii=1,nr + i = idxs(ii) + + if (ilaggr(i) < 0) then + ! + ! Find its strongly connected neighbourhood not + ! already aggregated, and make it into a new aggregate. + ! + ip = 0 + do k=s_neigh%irp(i), s_neigh%irp(i+1)-1 + j = s_neigh%ja(k) + if ((1<=j).and.(j<=nr)) then + if (ilaggr(j) < 0) then + ip = ip + 1 + icol(ip) = j + end if + end if + enddo + if (ip > 0) then + icnt = icnt + 1 + naggr = naggr + 1 + ilaggr(i) = naggr + do k=1, ip + ilaggr(icol(k)) = naggr + end do + end if + end if + end do step3 + + + if (count(ilaggr<0) >0) then + info=psb_err_internal_error_ + call psb_errpush(info,name,a_err='Fatal error: some leftovers') + goto 9999 + endif + + if (naggr > ncol) then + write(0,*) name,'Error : naggr > ncol',naggr,ncol + info=psb_err_internal_error_ + call psb_errpush(info,name,a_err='Fatal error: naggr>ncol') + goto 9999 + end if + + call psb_realloc(ncol,ilaggr,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='psb_realloc' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(nlaggr(np),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/np,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + + nlaggr(:) = 0 + nlaggr(me+1) = naggr + call psb_sum(ictxt,nlaggr(1:np)) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + +end subroutine mld_c_soc2_map_bld + diff --git a/mlprec/impl/aggregator/mld_c_symdec_aggregator_tprol.f90 b/mlprec/impl/aggregator/mld_c_symdec_aggregator_tprol.f90 new file mode 100644 index 00000000..594831f4 --- /dev/null +++ b/mlprec/impl/aggregator/mld_c_symdec_aggregator_tprol.f90 @@ -0,0 +1,146 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! File: mld_c_symdec_aggregator_tprol.f90 +! +! Subroutine: mld_c_symdec_aggregator_tprol +! Version: complex +! +! +! This routine is mainly an interface to map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. +! +! +! +! Arguments: +! p - type(mld_c_onelev_type), input/output. +! The 'one-level' data structure containing the control +! parameters and (eventually) coarse matrix and prolongator/restrictors. +! +! a - type(psb_cspmat_type). +! The sparse matrix structure containing the local part of the +! fine-level matrix. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! ilaggr - integer, dimension(:), allocatable, output +! The mapping between the row indices of the coarse-level +! matrix and the row indices of the fine-level matrix. +! ilaggr(i)=j means that node i in the adjacency graph +! of the fine-level matrix is mapped onto node j in the +! adjacency graph of the coarse-level matrix. Note that on exit the indices +! will be shifted so as to make sure the ranges on the various processes do not +! overlap. +! nlaggr - integer, dimension(:), allocatable, output +! nlaggr(i) contains the aggregates held by process i. +! op_prol - type(psb_cspmat_type), output +! The tentative prolongator, based on ilaggr. +! +! info - integer, output. +! Error code. +! +subroutine mld_c_symdec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + use mld_c_prec_type + use mld_c_symdec_aggregator_mod, mld_protect_name => mld_c_symdec_aggregator_build_tprol + use mld_c_inner_mod + implicit none + class(mld_c_symdec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_cspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + ! Local variables + type(psb_cspmat_type) :: atmp, atrans + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: ntaggr, nr + integer(psb_ipk_) :: debug_level, debug_unit + + name='mld_c_symdec_aggregator_tprol' + if (psb_get_errstatus().ne.0) return + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + info = psb_success_ + ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) + + call mld_check_def(parms%ml_cycle,'Multilevel cycle',& + & mld_mult_ml_,is_legal_ml_cycle) + call mld_check_def(parms%par_aggr_alg,'Aggregation',& + & mld_dec_aggr_,is_legal_ml_par_aggr_alg) + call mld_check_def(parms%aggr_ord,'Ordering',& + & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',szero,is_legal_s_aggr_thrs) + + nr = a%get_nrows() + call a%csclip(atmp,info,imax=nr,jmax=nr,& + & rscale=.false.,cscale=.false.) + call atmp%set_nrows(nr) + call atmp%set_ncols(nr) + if (info == psb_success_) call atmp%transp(atrans) + if (info == psb_success_) call atrans%cscnv(info,type='COO') + if (info == psb_success_) call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) + call atmp%set_nrows(nr) + call atmp%set_ncols(nr) + if (info == psb_success_) call atrans%free() + if (info == psb_success_) call atmp%cscnv(info,type='CSR') + + if (info == psb_success_) & + & call ag%map_bld(parms%aggr_ord,parms%aggr_thresh,atmp,desc_a,nlaggr,ilaggr,info) + if (info == psb_success_) call atmp%free() + + if (info == psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='map_bld/map_to_tprol') + goto 9999 + endif + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return + +end subroutine mld_c_symdec_aggregator_build_tprol diff --git a/mlprec/impl/mld_caggrmat_biz_asb.f90 b/mlprec/impl/aggregator/mld_caggrmat_biz_asb.f90 similarity index 99% rename from mlprec/impl/mld_caggrmat_biz_asb.f90 rename to mlprec/impl/aggregator/mld_caggrmat_biz_asb.f90 index e0ab7e29..4944df2a 100644 --- a/mlprec/impl/mld_caggrmat_biz_asb.f90 +++ b/mlprec/impl/aggregator/mld_caggrmat_biz_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_caggrmat_minnrg_asb.f90 b/mlprec/impl/aggregator/mld_caggrmat_minnrg_asb.f90 similarity index 99% rename from mlprec/impl/mld_caggrmat_minnrg_asb.f90 rename to mlprec/impl/aggregator/mld_caggrmat_minnrg_asb.f90 index 4af16a9e..60be7674 100644 --- a/mlprec/impl/mld_caggrmat_minnrg_asb.f90 +++ b/mlprec/impl/aggregator/mld_caggrmat_minnrg_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_caggrmat_nosmth_asb.f90 b/mlprec/impl/aggregator/mld_caggrmat_nosmth_asb.f90 similarity index 88% rename from mlprec/impl/mld_caggrmat_nosmth_asb.f90 rename to mlprec/impl/aggregator/mld_caggrmat_nosmth_asb.f90 index a19b5539..c029b562 100644 --- a/mlprec/impl/mld_caggrmat_nosmth_asb.f90 +++ b/mlprec/impl/aggregator/mld_caggrmat_nosmth_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -117,11 +117,11 @@ subroutine mld_caggrmat_nosmth_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_re integer(psb_ipk_) :: ictxt,np,me, icomm, ndx, minfo character(len=20) :: name integer(psb_ipk_) :: ierr(5) - type(psb_c_coo_sparse_mat) :: ac_coo, acoo + type(psb_c_coo_sparse_mat) :: ac_coo, tmpcoo type(psb_c_csr_sparse_mat) :: acsr1, acsr2 integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: nrow, nglob, ncol, ntaggr, nzl, ip, & - & naggr, nzt, naggrm1, i, k + & naggr, nzt, naggrm1, naggrp1, i, k name='mld_aggrmat_nosmth_asb' if(psb_get_errstatus().ne.0) return @@ -137,16 +137,37 @@ subroutine mld_caggrmat_nosmth_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_re ncol = desc_a%get_local_cols() - naggr = nlaggr(me+1) - ntaggr = sum(nlaggr) - naggrm1=sum(nlaggr(1:me)) - - call acoo%allocate(ncol,ntaggr,ncol) + naggr = nlaggr(me+1) + ntaggr = sum(nlaggr) + naggrm1 = sum(nlaggr(1:me)) + naggrp1 = sum(nlaggr(1:me+1)) + + call op_prol%cp_to(tmpcoo) call op_prol%cscnv(info,type='csr',dupl=psb_dupl_add_) - if (info /= psb_success_) goto 9999 - call op_prol%transp(op_restr) + call tmpcoo%transp() + nzl = tmpcoo%get_nzeros() + i=0 + ! + ! Now we have to fix this. The only rows of tmpcoo/op_restr that are correct + ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) + ! + do k=1, nzl + if ((naggrm1 < tmpcoo%ia(k)) .and.(tmpcoo%ia(k) <= naggrp1)) then + i = i+1 + tmpcoo%val(i) = tmpcoo%val(k) + tmpcoo%ia(i) = tmpcoo%ia(k) + tmpcoo%ja(i) = tmpcoo%ja(k) + end if + end do + call tmpcoo%set_nzeros(i) + ! call tmpcoo%trim() + call op_restr%mv_from(tmpcoo) + call op_restr%cscnv(info,type='csr',dupl=psb_dupl_add_) + + if (info /= psb_success_) goto 9999 + call a%cp_to(ac_coo) nzt = ac_coo%get_nzeros() diff --git a/mlprec/impl/mld_caggrmat_smth_asb.f90 b/mlprec/impl/aggregator/mld_caggrmat_smth_asb.f90 similarity index 99% rename from mlprec/impl/mld_caggrmat_smth_asb.f90 rename to mlprec/impl/aggregator/mld_caggrmat_smth_asb.f90 index df5086b4..c4ee3bcc 100644 --- a/mlprec/impl/mld_caggrmat_smth_asb.f90 +++ b/mlprec/impl/aggregator/mld_caggrmat_smth_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_daggrmat_asb.f90 b/mlprec/impl/aggregator/mld_d_dec_aggregator_mat_asb.f90 similarity index 71% rename from mlprec/impl/mld_daggrmat_asb.f90 rename to mlprec/impl/aggregator/mld_d_dec_aggregator_mat_asb.f90 index 55f8a5b7..9f14fad1 100644 --- a/mlprec/impl/mld_daggrmat_asb.f90 +++ b/mlprec/impl/aggregator/mld_d_dec_aggregator_mat_asb.f90 @@ -1,6 +1,6 @@ ! -! -! MLD2P4 version 2.1 +! +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,12 +35,20 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_daggrmat_asb.f90 +! File: mld_d_dec_aggregator_mat_asb.f90 ! -! Subroutine: mld_daggrmat_asb +! Subroutine: mld_d_dec_aggregator_mat_asb ! Version: real ! -! This routine builds a coarse-level matrix A_C from a fine-level matrix A +! This routine builds the matrix associated to the current level of the +! multilevel preconditioner from the matrix associated to the previous level, +! by using the user-specified aggregation technique (therefore, it also builds the +! prolongation and restriction operators mapping the current level to the +! previous one and vice versa). +! The current level is regarded as the coarse one, while the previous as +! the fine one. This is in agreement with the fact that the routine is called, +! by mld_mlprec_bld, only on levels >=2. +! The coarse-level matrix A_C is built from a fine-level matrix A ! by using the Galerkin approach, i.e. ! ! A_C = P_C^T A P_C, @@ -50,7 +58,7 @@ ! A mapping from the nodes of the adjacency graph of A to the nodes of the ! adjacency graph of A_C has been computed by the mld_aggrmap_bld subroutine. ! The prolongator P_C is built here from this mapping, according to the -! value of p%iprcparm(mld_aggr_prol_), specified by the user through +! value of p%iprcparm(mld_aggr_kind_), specified by the user through ! mld_dprecinit and mld_zprecset. ! On output from this routine the entries of AC, op_prol, op_restr ! are still in "global numbering" mode; this is fixed in the calling routine @@ -64,13 +72,13 @@ ! 4. minimum energy ! 1. The non-smoothed aggregation uses as prolongator the piecewise constant ! interpolation operator corresponding to the fine-to-coarse level mapping built -! by mld_aggrmap_bld. This is called tentative prolongator. +! by p%aggr%bld_tprol. This is called tentative prolongator. ! 2. The smoothed aggregation uses as prolongator the operator obtained by applying ! a damped Jacobi smoother to the tentative prolongator. ! 3. The "bizarre" aggregation uses a prolongator proposed by the authors of MLD2P4. ! This prolongator still requires a deep analysis and testing and its use is ! not recommended. -! 4. Minimum energy aggregation: ADD REFERENCE. +! 4. Minimum energy aggregation ! ! For more details see ! M. Brezina and P. Vanek, A black-box iterative solver based on a two-level @@ -78,24 +86,28 @@ ! P. D'Ambra, D. di Serafino and S. Filippone, On the development of PSBLAS-based ! parallel two-level Schwarz preconditioners, Appl. Num. Math., 57 (2007), ! 1181-1196. +! M. Sala, R. Tuminaro: A new Petrov-Galerkin smoothed aggregation preconditioner +! for nonsymmetric linear systems, SIAM J. Sci. Comput., 31(1):143-166 (2008) ! ! +! The main structure is: +! 1. Perform sanity checks; +! 2. Compute prolongator/restrictor/AC ! +! ! Arguments: +! ag - type(mld_d_dec_aggregator_type), input/output. +! The aggregator object +! parms - type(mld_dml_parms), input +! The aggregation parameters ! a - type(psb_dspmat_type), input. ! The sparse matrix structure containing the local part of ! the fine-level matrix. ! desc_a - type(psb_desc_type), input. ! The communication descriptor of the fine-level matrix. -! p - type(mld_d_onelev_type), input/output. ! The 'one-level' data structure that will contain the local ! part of the matrix to be built as well as the information ! concerning the prolongator and its transpose. -! parms - type(mld_dml_parms), input -! Parameters controlling the choice of algorithm -! ac - type(psb_dspmat_type), output -! The coarse matrix on output -! ! ilaggr - integer, dimension(:), input ! The mapping between the row indices of the coarse-level ! matrix and the row indices of the fine-level matrix. @@ -106,6 +118,9 @@ ! the various processes do not overlap. ! nlaggr - integer, dimension(:) input ! nlaggr(i) contains the aggregates held by process i. +! ac - type(psb_dspmat_type), output +! The coarse matrix on output +! ! op_prol - type(psb_dspmat_type), input/output ! The tentative prolongator on input, the computed prolongator on output ! @@ -114,43 +129,45 @@ ! ! info - integer, output. ! Error code. -! -subroutine mld_daggrmat_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_restr,info) - +! +subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) use psb_base_mod - use mld_base_prec_type - use mld_d_inner_mod, mld_protect_name => mld_daggrmat_asb - + use mld_d_prec_type, mld_protect_name => mld_d_dec_aggregator_mat_asb + use mld_d_inner_mod implicit none - -! Arguments - type(psb_dspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) - type(mld_dml_parms), intent(inout) :: parms - type(psb_dspmat_type), intent(inout) :: ac, op_prol,op_restr - integer(psb_ipk_), intent(out) :: info - -! Local variables + + class(mld_d_dec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_dspmat_type), intent(inout) :: op_prol + type(psb_dspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + + ! Local variables + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me type(psb_d_coo_sparse_mat) :: acoo, bcoo type(psb_d_csr_sparse_mat) :: acsr1 - integer(psb_ipk_) :: nzl,ntaggr, err_act + integer(psb_ipk_) :: nzl,ntaggr + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit - integer(psb_ipk_) :: ictxt,np,me - character(len=20) :: name - name='mld_aggrmat_asb' - if(psb_get_errstatus().ne.0) return - info=psb_success_ + name='mld_d_dec_aggregator_mat_asb' + if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - - + info = psb_success_ ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) - call psb_info(ictxt, me, np) - + ! + ! Build the coarse-level matrix from the fine-level one, starting from + ! the mapping defined by mld_aggrmap_bld and applying the aggregation + ! algorithm specified by + ! select case (parms%aggr_prol) case (mld_no_smooth_) @@ -183,11 +200,12 @@ subroutine mld_daggrmat_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_restr,inf goto 9999 end if + call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) - return -end subroutine mld_daggrmat_asb + +end subroutine mld_d_dec_aggregator_mat_asb diff --git a/mlprec/impl/mld_d_lev_aggrmap_bld.f90 b/mlprec/impl/aggregator/mld_d_dec_aggregator_tprol.f90 similarity index 65% rename from mlprec/impl/mld_d_lev_aggrmap_bld.f90 rename to mlprec/impl/aggregator/mld_d_dec_aggregator_tprol.f90 index 89441a39..15a5c2c7 100644 --- a/mlprec/impl/mld_d_lev_aggrmap_bld.f90 +++ b/mlprec/impl/aggregator/mld_d_dec_aggregator_tprol.f90 @@ -1,7 +1,6 @@ - -! +! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -36,15 +35,15 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_d_lev_aggrmap_bld.f90 +! File: mld_d_dec_aggregator_tprol.f90 ! -! Subroutine: mld_d_lev_aggrmap_bld +! Subroutine: mld_d_dec_aggregator_tprol ! Version: real ! -! This routine is just an interface to aggrmap_bld where the real work is performed. -! It takes care of some consistency checking though. -! -! See mld_daggrmap_bld for constraints on input/oput arguments. +! This routine is mainly an interface to map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. ! ! ! Arguments: @@ -73,31 +72,27 @@ ! info - integer, output. ! Error code. ! -subroutine mld_d_lev_aggrmap_bld(p,a,desc_a,ilaggr,nlaggr,op_prol,info) - +subroutine mld_d_dec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod - use mld_base_prec_type - use mld_d_inner_mod, mld_protect_name => mld_d_lev_aggrmap_bld - + use mld_d_prec_type, mld_protect_name => mld_d_dec_aggregator_build_tprol + use mld_d_inner_mod implicit none - - ! Arguments - type(mld_d_onelev_type), intent(inout), target :: p - type(psb_dspmat_type), intent(in) :: a + class(mld_d_dec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_dspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info - ! Local variables - character(len=20) :: name - integer(psb_mpk_) :: ictxt, np, me - integer(psb_ipk_) :: err_act - integer(psb_ipk_) :: nzl, ntaggr + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: ntaggr integer(psb_ipk_) :: debug_level, debug_unit - name='mld_d_lev_aggrmap_bld' + name='mld_d_dec_aggregator_tprol' if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() @@ -106,52 +101,28 @@ subroutine mld_d_lev_aggrmap_bld(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ictxt = desc_a%get_context() call psb_info(ictxt,me,np) - call mld_check_def(p%parms%ml_cycle,'Multilevel cycle',& + call mld_check_def(parms%ml_cycle,'Multilevel cycle',& & mld_mult_ml_,is_legal_ml_cycle) - call mld_check_def(p%parms%par_aggr_alg,'Aggregation',& + call mld_check_def(parms%par_aggr_alg,'Aggregation',& & mld_dec_aggr_,is_legal_ml_par_aggr_alg) - call mld_check_def(p%parms%aggr_ord,'Ordering',& + call mld_check_def(parms%aggr_ord,'Ordering',& & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) - call mld_check_def(p%parms%aggr_thresh,'Aggr_Thresh',dzero,is_legal_d_aggr_thrs) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',dzero,is_legal_d_aggr_thrs) - select case(p%parms%par_aggr_alg) - case (mld_dec_aggr_, mld_sym_dec_aggr_) - - ! - ! Build a mapping between the row indices of the fine-level matrix - ! and the row indices of the coarse-level matrix, according to a decoupled - ! aggregation algorithm. This also defines a tentative prolongator from - ! the coarse to the fine level. - ! - call mld_aggrmap_bld(p%parms%par_aggr_alg,p%parms%aggr_ord,p%parms%aggr_thresh,& - & a,desc_a,ilaggr,nlaggr,op_prol,info) - - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmap_bld') - goto 9999 - end if - case (mld_bcmatch_aggr_) - write(0,*) 'Matching is not implemented yet ' - info = -1111 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,p%parms%par_aggr_alg,izero,izero,izero/)) - goto 9999 - - case default + call ag%map_bld(parms%aggr_ord,parms%aggr_thresh,a,desc_a,nlaggr,ilaggr,info) - info = -1 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,p%parms%par_aggr_alg,izero,izero,izero/)) + if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='map_bld/map_to_tprol') goto 9999 - - end select - + endif call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) return - -end subroutine mld_d_lev_aggrmap_bld + +end subroutine mld_d_dec_aggregator_build_tprol diff --git a/mlprec/impl/mld_daggrmap_bld.f90 b/mlprec/impl/aggregator/mld_d_map_to_tprol.f90 similarity index 71% rename from mlprec/impl/mld_daggrmap_bld.f90 rename to mlprec/impl/aggregator/mld_d_map_to_tprol.f90 index e186d719..a8a53826 100644 --- a/mlprec/impl/mld_daggrmap_bld.f90 +++ b/mlprec/impl/aggregator/mld_d_map_to_tprol.f90 @@ -1,6 +1,6 @@ +! ! -! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -9,7 +9,7 @@ ! Salvatore Filippone ! Pasqua D'Ambra ! Daniela di Serafino -! +! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions ! are met: @@ -35,15 +35,17 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_daggrmap_bld.f90 +! File: mld_d_map_to_tprol.f90 ! -! Subroutine: mld_daggrmap_bld +! Subroutine: mld_d_map_to_tprol ! Version: real ! -! This routine builds a mapping from the row indices of the fine-level matrix -! to the row indices of the coarse-level matrix, according to a decoupled -! aggregation algorithm. This mapping will be used by mld_aggrmat_asb to -! build the coarse-level matrix. +! This routine uses a mapping from the row indices of the fine-level matrix +! to the row indices of the coarse-level matrix to build a tentative +! prolongator, i.e. a piecewise constant operator. +! This is later used to build the final operator; the code has been refactored here +! to be shared among all the methods that provide the tentative prolongator +! through a simple integer mapping. ! ! The aggregation algorithm is a parallel version of that described in ! * M. Brezina and P. Vanek, A black-box iterative solver based on a @@ -83,28 +85,21 @@ ! info - integer, output. ! Error code. ! -subroutine mld_daggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_prol,info) +subroutine mld_d_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod - use mld_base_prec_type - use mld_d_inner_mod, mld_protect_name => mld_daggrmap_bld + use mld_d_inner_mod, mld_protect_name => mld_d_map_to_tprol implicit none ! Arguments - integer(psb_ipk_), intent(in) :: iorder - integer(psb_ipk_), intent(in) :: aggr_type - real(psb_dpk_), intent(in) :: theta - type(psb_dspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) type(psb_dspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info ! Local variables - integer(psb_ipk_), allocatable :: ils(:), neigh(:) integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m,naggrm1, naggrp1, ntaggr - type(psb_dspmat_type) :: atmp, atrans type(psb_d_coo_sparse_mat) :: tmpcoo integer(psb_ipk_) :: debug_level, debug_unit,err_act integer(psb_ipk_) :: ictxt,np,me @@ -113,7 +108,7 @@ subroutine mld_daggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro if(psb_get_errstatus() /= 0) return info=psb_success_ - name = 'mld_aggrmap_bld' + name = 'mld_map_to_tprol' call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() @@ -123,40 +118,6 @@ subroutine mld_daggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro nrow = desc_a%get_local_rows() ncol = desc_a%get_local_cols() - select case (aggr_type) - case (mld_dec_aggr_) - call mld_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) - - case (mld_sym_dec_aggr_) - nr = a%get_nrows() - call a%csclip(atmp,info,imax=nr,jmax=nr,& - & rscale=.false.,cscale=.false.) - call atmp%set_nrows(nr) - call atmp%set_ncols(nr) - if (info == psb_success_) call atmp%transp(atrans) - if (info == psb_success_) call atrans%cscnv(info,type='COO') - if (info == psb_success_) call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) - call atmp%set_nrows(nr) - call atmp%set_ncols(nr) - if (info == psb_success_) call atrans%free() - if (info == psb_success_) call atmp%cscnv(info,type='CSR') - if (info == psb_success_) call mld_dec_map_bld(iorder,theta,atmp,desc_a,nlaggr,ilaggr,info) - if (info == psb_success_) call atmp%free() - - case default - - info = -1 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,aggr_type,izero,izero,izero/)) - goto 9999 - end select - - if (info /= psb_success_) then - info=psb_err_internal_error_ - call psb_errpush(info,name,a_err='dec_map_bld') - goto 9999 - end if - naggr = nlaggr(me+1) ntaggr = sum(nlaggr) naggrm1 = sum(nlaggr(1:me)) @@ -186,4 +147,4 @@ subroutine mld_daggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro return -end subroutine mld_daggrmap_bld +end subroutine mld_d_map_to_tprol diff --git a/mlprec/impl/mld_d_dec_map_bld.f90 b/mlprec/impl/aggregator/mld_d_soc1_map_bld.f90 similarity index 96% rename from mlprec/impl/mld_d_dec_map_bld.f90 rename to mlprec/impl/aggregator/mld_d_soc1_map_bld.f90 index 4925233c..4c9e935f 100644 --- a/mlprec/impl/mld_d_dec_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_d_soc1_map_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -36,13 +36,13 @@ ! ! ! -! File: mld_d_dec_map__bld.f90 +! File: mld_d_soc1_map__bld.f90 ! -! Subroutine: mld_d_dec_map_bld +! Subroutine: mld_d_soc1_map_bld ! Version: real ! ! This routine builds the tentative prolongator based on the -! decoupled aggregation algorithm presented in +! strength of connection aggregation algorithm presented in ! ! M. Brezina and P. Vanek, A black-box iterative solver based on a ! two-level Schwarz method, Computing, 63 (1999), 233-263. @@ -67,11 +67,11 @@ ! ! ! -subroutine mld_d_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) +subroutine mld_d_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) use psb_base_mod use mld_base_prec_type - use mld_d_inner_mod, mld_protect_name => mld_d_dec_map_bld + use mld_d_inner_mod!, mld_protect_name => mld_d_soc1_map_bld implicit none @@ -98,7 +98,7 @@ subroutine mld_d_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) if (psb_get_errstatus() /= 0) return info=psb_success_ - name = 'mld_dec_map_bld' + name = 'mld_soc1_map_bld' call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() @@ -318,5 +318,5 @@ subroutine mld_d_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) return -end subroutine mld_d_dec_map_bld +end subroutine mld_d_soc1_map_bld diff --git a/mlprec/impl/aggregator/mld_d_soc2_map_bld.f90 b/mlprec/impl/aggregator/mld_d_soc2_map_bld.f90 new file mode 100644 index 00000000..2f57abb9 --- /dev/null +++ b/mlprec/impl/aggregator/mld_d_soc2_map_bld.f90 @@ -0,0 +1,330 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! File: mld_d_soc2_map__bld.f90 +! +! Subroutine: mld_d_soc2_map_bld +! Version: real +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! +! Note: upon exit +! +! Arguments: +! a - type(psb_dspmat_type). +! The sparse matrix structure containing the local part of the +! matrix to be preconditioned. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! p - type(mld_dprec_type), input/output. +! The preconditioner data structure; upon exit it contains +! the multilevel hierarchy of prolongators, restrictors +! and coarse matrices. +! info - integer, output. +! Error code. +! +! +! +subroutine mld_d_soc2_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) + + use psb_base_mod + use mld_base_prec_type + use mld_d_inner_mod!, mld_protect_name => mld_d_soc2_map_bld + + implicit none + + ! Arguments + integer(psb_ipk_), intent(in) :: iorder + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(psb_dpk_), intent(in) :: theta + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), intent(out) :: info + + ! Local variables + integer(psb_ipk_), allocatable :: ils(:), neigh(:), irow(:), icol(:),& + & ideg(:), idxs(:), tmpaggr(:) + real(psb_dpk_), allocatable :: val(:), diag(:) + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr,nc,naggr,i,j,m, nz, ilg, ii, ip, ip1,nzcnt + type(psb_d_csr_sparse_mat) :: acsr, muij, s_neigh + type(psb_d_coo_sparse_mat) :: s_neigh_coo + real(psb_dpk_) :: cpling, tcl + logical :: disjoint + integer(psb_ipk_) :: debug_level, debug_unit,err_act + integer(psb_ipk_) :: ictxt,np,me + integer(psb_ipk_) :: nrow, ncol, n_ne + character(len=20) :: name, ch_err + + if (psb_get_errstatus() /= 0) return + info=psb_success_ + name = 'mld_soc2_map_bld' + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ! + ictxt=desc_a%get_context() + call psb_info(ictxt,me,np) + nrow = desc_a%get_local_rows() + ncol = desc_a%get_local_cols() + + nr = a%get_nrows() + nc = a%get_ncols() + allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nr),stat=info) + if(info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + + diag = a%get_diag(info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_sp_getdiag') + goto 9999 + end if + + ! + ! Phase zero: compute muij + ! + call a%cp_to(muij) + do i=1, nr + do k=muij%irp(i),muij%irp(i+1)-1 + j = muij%ja(k) + if (j<= nr) muij%val(k) = abs(muij%val(k))/sqrt(abs(diag(i)*diag(j))) + end do + end do + !write(*,*) 'murows/cols ',maxval(mu_rows),maxval(mu_cols) + ! + ! Compute the 1-neigbour; mark strong links with +1, weak links with -1 + ! + call s_neigh_coo%allocate(nr,nr,muij%get_nzeros()) + ip = 0 + do i=1, nr + do k=muij%irp(i),muij%irp(i+1)-1 + j = muij%ja(k) + if (j<=nr) then + ip = ip + 1 + s_neigh_coo%ia(ip) = i + s_neigh_coo%ja(ip) = j + if (real(muij%val(k)) >= theta) then + s_neigh_coo%val(ip) = done + else + s_neigh_coo%val(ip) = -done + end if + end if + end do + end do + !write(*,*) 'S_NEIGH: ',nr,ip + call s_neigh_coo%set_nzeros(ip) + call s_neigh%mv_from_coo(s_neigh_coo,info) + + if (iorder == mld_aggr_ord_nat_) then + do i=1, nr + ilaggr(i) = -(nr+1) + idxs(i) = i + end do + else + do i=1, nr + ilaggr(i) = -(nr+1) + ideg(i) = muij%irp(i+1) - muij%irp(i) + end do + call psb_msort(ideg,ix=idxs,dir=psb_sort_down_) + end if + + + ! + ! Phase one: Start with disjoint groups. + ! + naggr = 0 + icnt = 0 + step1: do ii=1, nr + i = idxs(ii) + + if (ilaggr(i) == -(nr+1)) then + ! + ! Get the 1-neighbourhood of I + ! + ip1 = s_neigh%irp(i) + nz = s_neigh%irp(i+1)-ip1 + ! + ! If the neighbourhood only contains I, skip it + ! + if (nz ==0) then + ilaggr(i) = 0 + cycle step1 + end if + if ((nz==1).and.(s_neigh%ja(ip1)==i)) then + ilaggr(i) = 0 + cycle step1 + end if + ! + ! If the whole strongly coupled neighborhood of I is + ! as yet unconnected, turn it into the next aggregate. + ! + nzcnt = count(real(s_neigh%val(ip1:ip1+nz-1)) > 0) + icol(1:nzcnt) = pack(s_neigh%ja(ip1:ip1+nz-1),(real(s_neigh%val(ip1:ip1+nz-1)) > 0)) + disjoint = all(ilaggr(icol(1:nzcnt)) == -(nr+1)) + if (disjoint) then + icnt = icnt + 1 + naggr = naggr + 1 + do k=1, nzcnt + ilaggr(icol(k)) = naggr + end do + ilaggr(i) = naggr + end if + endif + enddo step1 + + if (debug_level >= psb_debug_outer_) then + write(debug_unit,*) me,' ',trim(name),& + & ' Check 1:',count(ilaggr == -(nr+1)) + end if + + ! + ! Phase two: join the neighbours + ! + tmpaggr = ilaggr + step2: do ii=1,nr + i = idxs(ii) + + if (ilaggr(i) == -(nr+1)) then + ! + ! Find the most strongly connected neighbour that is + ! already aggregated, if any, and join its aggregate + ! + cpling = dzero + ip = 0 + do k=s_neigh%irp(i), s_neigh%irp(i+1)-1 + j = s_neigh%ja(k) + if ((1<=j).and.(j<=nr)) then + if ( (tmpaggr(j) > 0).and. (real(muij%val(k)) > cpling)& + & .and.(real(s_neigh%val(k))>0)) then + ip = k + cpling = muij%val(k) + end if + end if + enddo + if (ip > 0) then + ilaggr(i) = ilaggr(s_neigh%ja(ip)) + end if + end if + end do step2 + + + ! + ! Phase three: sweep over leftovers, if any + ! + step3: do ii=1,nr + i = idxs(ii) + + if (ilaggr(i) < 0) then + ! + ! Find its strongly connected neighbourhood not + ! already aggregated, and make it into a new aggregate. + ! + ip = 0 + do k=s_neigh%irp(i), s_neigh%irp(i+1)-1 + j = s_neigh%ja(k) + if ((1<=j).and.(j<=nr)) then + if (ilaggr(j) < 0) then + ip = ip + 1 + icol(ip) = j + end if + end if + enddo + if (ip > 0) then + icnt = icnt + 1 + naggr = naggr + 1 + ilaggr(i) = naggr + do k=1, ip + ilaggr(icol(k)) = naggr + end do + end if + end if + end do step3 + + + if (count(ilaggr<0) >0) then + info=psb_err_internal_error_ + call psb_errpush(info,name,a_err='Fatal error: some leftovers') + goto 9999 + endif + + if (naggr > ncol) then + write(0,*) name,'Error : naggr > ncol',naggr,ncol + info=psb_err_internal_error_ + call psb_errpush(info,name,a_err='Fatal error: naggr>ncol') + goto 9999 + end if + + call psb_realloc(ncol,ilaggr,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='psb_realloc' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(nlaggr(np),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/np,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + + nlaggr(:) = 0 + nlaggr(me+1) = naggr + call psb_sum(ictxt,nlaggr(1:np)) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + +end subroutine mld_d_soc2_map_bld + diff --git a/mlprec/impl/aggregator/mld_d_symdec_aggregator_tprol.f90 b/mlprec/impl/aggregator/mld_d_symdec_aggregator_tprol.f90 new file mode 100644 index 00000000..b3079bdf --- /dev/null +++ b/mlprec/impl/aggregator/mld_d_symdec_aggregator_tprol.f90 @@ -0,0 +1,146 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! File: mld_d_symdec_aggregator_tprol.f90 +! +! Subroutine: mld_d_symdec_aggregator_tprol +! Version: real +! +! +! This routine is mainly an interface to map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. +! +! +! +! Arguments: +! p - type(mld_d_onelev_type), input/output. +! The 'one-level' data structure containing the control +! parameters and (eventually) coarse matrix and prolongator/restrictors. +! +! a - type(psb_dspmat_type). +! The sparse matrix structure containing the local part of the +! fine-level matrix. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! ilaggr - integer, dimension(:), allocatable, output +! The mapping between the row indices of the coarse-level +! matrix and the row indices of the fine-level matrix. +! ilaggr(i)=j means that node i in the adjacency graph +! of the fine-level matrix is mapped onto node j in the +! adjacency graph of the coarse-level matrix. Note that on exit the indices +! will be shifted so as to make sure the ranges on the various processes do not +! overlap. +! nlaggr - integer, dimension(:), allocatable, output +! nlaggr(i) contains the aggregates held by process i. +! op_prol - type(psb_dspmat_type), output +! The tentative prolongator, based on ilaggr. +! +! info - integer, output. +! Error code. +! +subroutine mld_d_symdec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + use mld_d_prec_type + use mld_d_symdec_aggregator_mod, mld_protect_name => mld_d_symdec_aggregator_build_tprol + use mld_d_inner_mod + implicit none + class(mld_d_symdec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + ! Local variables + type(psb_dspmat_type) :: atmp, atrans + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: ntaggr, nr + integer(psb_ipk_) :: debug_level, debug_unit + + name='mld_d_symdec_aggregator_tprol' + if (psb_get_errstatus().ne.0) return + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + info = psb_success_ + ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) + + call mld_check_def(parms%ml_cycle,'Multilevel cycle',& + & mld_mult_ml_,is_legal_ml_cycle) + call mld_check_def(parms%par_aggr_alg,'Aggregation',& + & mld_dec_aggr_,is_legal_ml_par_aggr_alg) + call mld_check_def(parms%aggr_ord,'Ordering',& + & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',dzero,is_legal_d_aggr_thrs) + + nr = a%get_nrows() + call a%csclip(atmp,info,imax=nr,jmax=nr,& + & rscale=.false.,cscale=.false.) + call atmp%set_nrows(nr) + call atmp%set_ncols(nr) + if (info == psb_success_) call atmp%transp(atrans) + if (info == psb_success_) call atrans%cscnv(info,type='COO') + if (info == psb_success_) call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) + call atmp%set_nrows(nr) + call atmp%set_ncols(nr) + if (info == psb_success_) call atrans%free() + if (info == psb_success_) call atmp%cscnv(info,type='CSR') + + if (info == psb_success_) & + & call ag%map_bld(parms%aggr_ord,parms%aggr_thresh,atmp,desc_a,nlaggr,ilaggr,info) + if (info == psb_success_) call atmp%free() + + if (info == psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='map_bld/map_to_tprol') + goto 9999 + endif + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return + +end subroutine mld_d_symdec_aggregator_build_tprol diff --git a/mlprec/impl/mld_daggrmat_biz_asb.f90 b/mlprec/impl/aggregator/mld_daggrmat_biz_asb.f90 similarity index 99% rename from mlprec/impl/mld_daggrmat_biz_asb.f90 rename to mlprec/impl/aggregator/mld_daggrmat_biz_asb.f90 index 90e35693..76d266d8 100644 --- a/mlprec/impl/mld_daggrmat_biz_asb.f90 +++ b/mlprec/impl/aggregator/mld_daggrmat_biz_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_daggrmat_minnrg_asb.f90 b/mlprec/impl/aggregator/mld_daggrmat_minnrg_asb.f90 similarity index 99% rename from mlprec/impl/mld_daggrmat_minnrg_asb.f90 rename to mlprec/impl/aggregator/mld_daggrmat_minnrg_asb.f90 index 418ac112..391aefe1 100644 --- a/mlprec/impl/mld_daggrmat_minnrg_asb.f90 +++ b/mlprec/impl/aggregator/mld_daggrmat_minnrg_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_daggrmat_nosmth_asb.f90 b/mlprec/impl/aggregator/mld_daggrmat_nosmth_asb.f90 similarity index 88% rename from mlprec/impl/mld_daggrmat_nosmth_asb.f90 rename to mlprec/impl/aggregator/mld_daggrmat_nosmth_asb.f90 index 3d2d4309..09989846 100644 --- a/mlprec/impl/mld_daggrmat_nosmth_asb.f90 +++ b/mlprec/impl/aggregator/mld_daggrmat_nosmth_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -117,11 +117,11 @@ subroutine mld_daggrmat_nosmth_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_re integer(psb_ipk_) :: ictxt,np,me, icomm, ndx, minfo character(len=20) :: name integer(psb_ipk_) :: ierr(5) - type(psb_d_coo_sparse_mat) :: ac_coo, acoo + type(psb_d_coo_sparse_mat) :: ac_coo, tmpcoo type(psb_d_csr_sparse_mat) :: acsr1, acsr2 integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: nrow, nglob, ncol, ntaggr, nzl, ip, & - & naggr, nzt, naggrm1, i, k + & naggr, nzt, naggrm1, naggrp1, i, k name='mld_aggrmat_nosmth_asb' if(psb_get_errstatus().ne.0) return @@ -137,16 +137,37 @@ subroutine mld_daggrmat_nosmth_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_re ncol = desc_a%get_local_cols() - naggr = nlaggr(me+1) - ntaggr = sum(nlaggr) - naggrm1=sum(nlaggr(1:me)) - - call acoo%allocate(ncol,ntaggr,ncol) + naggr = nlaggr(me+1) + ntaggr = sum(nlaggr) + naggrm1 = sum(nlaggr(1:me)) + naggrp1 = sum(nlaggr(1:me+1)) + + call op_prol%cp_to(tmpcoo) call op_prol%cscnv(info,type='csr',dupl=psb_dupl_add_) - if (info /= psb_success_) goto 9999 - call op_prol%transp(op_restr) + call tmpcoo%transp() + nzl = tmpcoo%get_nzeros() + i=0 + ! + ! Now we have to fix this. The only rows of tmpcoo/op_restr that are correct + ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) + ! + do k=1, nzl + if ((naggrm1 < tmpcoo%ia(k)) .and.(tmpcoo%ia(k) <= naggrp1)) then + i = i+1 + tmpcoo%val(i) = tmpcoo%val(k) + tmpcoo%ia(i) = tmpcoo%ia(k) + tmpcoo%ja(i) = tmpcoo%ja(k) + end if + end do + call tmpcoo%set_nzeros(i) + ! call tmpcoo%trim() + call op_restr%mv_from(tmpcoo) + call op_restr%cscnv(info,type='csr',dupl=psb_dupl_add_) + + if (info /= psb_success_) goto 9999 + call a%cp_to(ac_coo) nzt = ac_coo%get_nzeros() diff --git a/mlprec/impl/mld_daggrmat_smth_asb.f90 b/mlprec/impl/aggregator/mld_daggrmat_smth_asb.f90 similarity index 99% rename from mlprec/impl/mld_daggrmat_smth_asb.f90 rename to mlprec/impl/aggregator/mld_daggrmat_smth_asb.f90 index 7605260d..7a147832 100644 --- a/mlprec/impl/mld_daggrmat_smth_asb.f90 +++ b/mlprec/impl/aggregator/mld_daggrmat_smth_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_saggrmat_asb.f90 b/mlprec/impl/aggregator/mld_s_dec_aggregator_mat_asb.f90 similarity index 71% rename from mlprec/impl/mld_saggrmat_asb.f90 rename to mlprec/impl/aggregator/mld_s_dec_aggregator_mat_asb.f90 index 263fa5e6..e632f8fa 100644 --- a/mlprec/impl/mld_saggrmat_asb.f90 +++ b/mlprec/impl/aggregator/mld_s_dec_aggregator_mat_asb.f90 @@ -1,6 +1,6 @@ ! -! -! MLD2P4 version 2.1 +! +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,12 +35,20 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_saggrmat_asb.f90 +! File: mld_s_dec_aggregator_mat_asb.f90 ! -! Subroutine: mld_saggrmat_asb +! Subroutine: mld_s_dec_aggregator_mat_asb ! Version: real ! -! This routine builds a coarse-level matrix A_C from a fine-level matrix A +! This routine builds the matrix associated to the current level of the +! multilevel preconditioner from the matrix associated to the previous level, +! by using the user-specified aggregation technique (therefore, it also builds the +! prolongation and restriction operators mapping the current level to the +! previous one and vice versa). +! The current level is regarded as the coarse one, while the previous as +! the fine one. This is in agreement with the fact that the routine is called, +! by mld_mlprec_bld, only on levels >=2. +! The coarse-level matrix A_C is built from a fine-level matrix A ! by using the Galerkin approach, i.e. ! ! A_C = P_C^T A P_C, @@ -50,7 +58,7 @@ ! A mapping from the nodes of the adjacency graph of A to the nodes of the ! adjacency graph of A_C has been computed by the mld_aggrmap_bld subroutine. ! The prolongator P_C is built here from this mapping, according to the -! value of p%iprcparm(mld_aggr_prol_), specified by the user through +! value of p%iprcparm(mld_aggr_kind_), specified by the user through ! mld_sprecinit and mld_zprecset. ! On output from this routine the entries of AC, op_prol, op_restr ! are still in "global numbering" mode; this is fixed in the calling routine @@ -64,13 +72,13 @@ ! 4. minimum energy ! 1. The non-smoothed aggregation uses as prolongator the piecewise constant ! interpolation operator corresponding to the fine-to-coarse level mapping built -! by mld_aggrmap_bld. This is called tentative prolongator. +! by p%aggr%bld_tprol. This is called tentative prolongator. ! 2. The smoothed aggregation uses as prolongator the operator obtained by applying ! a damped Jacobi smoother to the tentative prolongator. ! 3. The "bizarre" aggregation uses a prolongator proposed by the authors of MLD2P4. ! This prolongator still requires a deep analysis and testing and its use is ! not recommended. -! 4. Minimum energy aggregation: ADD REFERENCE. +! 4. Minimum energy aggregation ! ! For more details see ! M. Brezina and P. Vanek, A black-box iterative solver based on a two-level @@ -78,24 +86,28 @@ ! P. D'Ambra, D. di Serafino and S. Filippone, On the development of PSBLAS-based ! parallel two-level Schwarz preconditioners, Appl. Num. Math., 57 (2007), ! 1181-1196. +! M. Sala, R. Tuminaro: A new Petrov-Galerkin smoothed aggregation preconditioner +! for nonsymmetric linear systems, SIAM J. Sci. Comput., 31(1):143-166 (2008) ! ! +! The main structure is: +! 1. Perform sanity checks; +! 2. Compute prolongator/restrictor/AC ! +! ! Arguments: +! ag - type(mld_s_dec_aggregator_type), input/output. +! The aggregator object +! parms - type(mld_sml_parms), input +! The aggregation parameters ! a - type(psb_sspmat_type), input. ! The sparse matrix structure containing the local part of ! the fine-level matrix. ! desc_a - type(psb_desc_type), input. ! The communication descriptor of the fine-level matrix. -! p - type(mld_s_onelev_type), input/output. ! The 'one-level' data structure that will contain the local ! part of the matrix to be built as well as the information ! concerning the prolongator and its transpose. -! parms - type(mld_sml_parms), input -! Parameters controlling the choice of algorithm -! ac - type(psb_sspmat_type), output -! The coarse matrix on output -! ! ilaggr - integer, dimension(:), input ! The mapping between the row indices of the coarse-level ! matrix and the row indices of the fine-level matrix. @@ -106,6 +118,9 @@ ! the various processes do not overlap. ! nlaggr - integer, dimension(:) input ! nlaggr(i) contains the aggregates held by process i. +! ac - type(psb_sspmat_type), output +! The coarse matrix on output +! ! op_prol - type(psb_sspmat_type), input/output ! The tentative prolongator on input, the computed prolongator on output ! @@ -114,43 +129,45 @@ ! ! info - integer, output. ! Error code. -! -subroutine mld_saggrmat_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_restr,info) - +! +subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) use psb_base_mod - use mld_base_prec_type - use mld_s_inner_mod, mld_protect_name => mld_saggrmat_asb - + use mld_s_prec_type, mld_protect_name => mld_s_dec_aggregator_mat_asb + use mld_s_inner_mod implicit none - -! Arguments - type(psb_sspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) - type(mld_sml_parms), intent(inout) :: parms - type(psb_sspmat_type), intent(inout) :: ac, op_prol,op_restr - integer(psb_ipk_), intent(out) :: info - -! Local variables + + class(mld_s_dec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_sspmat_type), intent(inout) :: op_prol + type(psb_sspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + + ! Local variables + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me type(psb_s_coo_sparse_mat) :: acoo, bcoo type(psb_s_csr_sparse_mat) :: acsr1 - integer(psb_ipk_) :: nzl,ntaggr, err_act + integer(psb_ipk_) :: nzl,ntaggr + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit - integer(psb_ipk_) :: ictxt,np,me - character(len=20) :: name - name='mld_aggrmat_asb' - if(psb_get_errstatus().ne.0) return - info=psb_success_ + name='mld_s_dec_aggregator_mat_asb' + if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - - + info = psb_success_ ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) - call psb_info(ictxt, me, np) - + ! + ! Build the coarse-level matrix from the fine-level one, starting from + ! the mapping defined by mld_aggrmap_bld and applying the aggregation + ! algorithm specified by + ! select case (parms%aggr_prol) case (mld_no_smooth_) @@ -183,11 +200,12 @@ subroutine mld_saggrmat_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_restr,inf goto 9999 end if + call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) - return -end subroutine mld_saggrmat_asb + +end subroutine mld_s_dec_aggregator_mat_asb diff --git a/mlprec/impl/mld_s_lev_aggrmap_bld.f90 b/mlprec/impl/aggregator/mld_s_dec_aggregator_tprol.f90 similarity index 65% rename from mlprec/impl/mld_s_lev_aggrmap_bld.f90 rename to mlprec/impl/aggregator/mld_s_dec_aggregator_tprol.f90 index 9c7f93c1..02552a10 100644 --- a/mlprec/impl/mld_s_lev_aggrmap_bld.f90 +++ b/mlprec/impl/aggregator/mld_s_dec_aggregator_tprol.f90 @@ -1,7 +1,6 @@ - -! +! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -36,15 +35,15 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_s_lev_aggrmap_bld.f90 +! File: mld_s_dec_aggregator_tprol.f90 ! -! Subroutine: mld_s_lev_aggrmap_bld +! Subroutine: mld_s_dec_aggregator_tprol ! Version: real ! -! This routine is just an interface to aggrmap_bld where the real work is performed. -! It takes care of some consistency checking though. -! -! See mld_saggrmap_bld for constraints on input/oput arguments. +! This routine is mainly an interface to map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. ! ! ! Arguments: @@ -73,31 +72,27 @@ ! info - integer, output. ! Error code. ! -subroutine mld_s_lev_aggrmap_bld(p,a,desc_a,ilaggr,nlaggr,op_prol,info) - +subroutine mld_s_dec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod - use mld_base_prec_type - use mld_s_inner_mod, mld_protect_name => mld_s_lev_aggrmap_bld - + use mld_s_prec_type, mld_protect_name => mld_s_dec_aggregator_build_tprol + use mld_s_inner_mod implicit none - - ! Arguments - type(mld_s_onelev_type), intent(inout), target :: p - type(psb_sspmat_type), intent(in) :: a + class(mld_s_dec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_sspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info - ! Local variables - character(len=20) :: name - integer(psb_mpk_) :: ictxt, np, me - integer(psb_ipk_) :: err_act - integer(psb_ipk_) :: nzl, ntaggr + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: ntaggr integer(psb_ipk_) :: debug_level, debug_unit - name='mld_s_lev_aggrmap_bld' + name='mld_s_dec_aggregator_tprol' if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() @@ -106,52 +101,28 @@ subroutine mld_s_lev_aggrmap_bld(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ictxt = desc_a%get_context() call psb_info(ictxt,me,np) - call mld_check_def(p%parms%ml_cycle,'Multilevel cycle',& + call mld_check_def(parms%ml_cycle,'Multilevel cycle',& & mld_mult_ml_,is_legal_ml_cycle) - call mld_check_def(p%parms%par_aggr_alg,'Aggregation',& + call mld_check_def(parms%par_aggr_alg,'Aggregation',& & mld_dec_aggr_,is_legal_ml_par_aggr_alg) - call mld_check_def(p%parms%aggr_ord,'Ordering',& + call mld_check_def(parms%aggr_ord,'Ordering',& & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) - call mld_check_def(p%parms%aggr_thresh,'Aggr_Thresh',szero,is_legal_s_aggr_thrs) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',szero,is_legal_s_aggr_thrs) - select case(p%parms%par_aggr_alg) - case (mld_dec_aggr_, mld_sym_dec_aggr_) - - ! - ! Build a mapping between the row indices of the fine-level matrix - ! and the row indices of the coarse-level matrix, according to a decoupled - ! aggregation algorithm. This also defines a tentative prolongator from - ! the coarse to the fine level. - ! - call mld_aggrmap_bld(p%parms%par_aggr_alg,p%parms%aggr_ord,p%parms%aggr_thresh,& - & a,desc_a,ilaggr,nlaggr,op_prol,info) - - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmap_bld') - goto 9999 - end if - case (mld_bcmatch_aggr_) - write(0,*) 'Matching is not implemented yet ' - info = -1111 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,p%parms%par_aggr_alg,izero,izero,izero/)) - goto 9999 - - case default + call ag%map_bld(parms%aggr_ord,parms%aggr_thresh,a,desc_a,nlaggr,ilaggr,info) - info = -1 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,p%parms%par_aggr_alg,izero,izero,izero/)) + if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='map_bld/map_to_tprol') goto 9999 - - end select - + endif call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) return - -end subroutine mld_s_lev_aggrmap_bld + +end subroutine mld_s_dec_aggregator_build_tprol diff --git a/mlprec/impl/mld_saggrmap_bld.f90 b/mlprec/impl/aggregator/mld_s_map_to_tprol.f90 similarity index 71% rename from mlprec/impl/mld_saggrmap_bld.f90 rename to mlprec/impl/aggregator/mld_s_map_to_tprol.f90 index 2009bf6e..8d237d34 100644 --- a/mlprec/impl/mld_saggrmap_bld.f90 +++ b/mlprec/impl/aggregator/mld_s_map_to_tprol.f90 @@ -1,6 +1,6 @@ +! ! -! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -9,7 +9,7 @@ ! Salvatore Filippone ! Pasqua D'Ambra ! Daniela di Serafino -! +! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions ! are met: @@ -35,15 +35,17 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_saggrmap_bld.f90 +! File: mld_s_map_to_tprol.f90 ! -! Subroutine: mld_saggrmap_bld +! Subroutine: mld_s_map_to_tprol ! Version: real ! -! This routine builds a mapping from the row indices of the fine-level matrix -! to the row indices of the coarse-level matrix, according to a decoupled -! aggregation algorithm. This mapping will be used by mld_aggrmat_asb to -! build the coarse-level matrix. +! This routine uses a mapping from the row indices of the fine-level matrix +! to the row indices of the coarse-level matrix to build a tentative +! prolongator, i.e. a piecewise constant operator. +! This is later used to build the final operator; the code has been refactored here +! to be shared among all the methods that provide the tentative prolongator +! through a simple integer mapping. ! ! The aggregation algorithm is a parallel version of that described in ! * M. Brezina and P. Vanek, A black-box iterative solver based on a @@ -83,28 +85,21 @@ ! info - integer, output. ! Error code. ! -subroutine mld_saggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_prol,info) +subroutine mld_s_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod - use mld_base_prec_type - use mld_s_inner_mod, mld_protect_name => mld_saggrmap_bld + use mld_s_inner_mod, mld_protect_name => mld_s_map_to_tprol implicit none ! Arguments - integer(psb_ipk_), intent(in) :: iorder - integer(psb_ipk_), intent(in) :: aggr_type - real(psb_spk_), intent(in) :: theta - type(psb_sspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) type(psb_sspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info ! Local variables - integer(psb_ipk_), allocatable :: ils(:), neigh(:) integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m,naggrm1, naggrp1, ntaggr - type(psb_sspmat_type) :: atmp, atrans type(psb_s_coo_sparse_mat) :: tmpcoo integer(psb_ipk_) :: debug_level, debug_unit,err_act integer(psb_ipk_) :: ictxt,np,me @@ -113,7 +108,7 @@ subroutine mld_saggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro if(psb_get_errstatus() /= 0) return info=psb_success_ - name = 'mld_aggrmap_bld' + name = 'mld_map_to_tprol' call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() @@ -123,40 +118,6 @@ subroutine mld_saggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro nrow = desc_a%get_local_rows() ncol = desc_a%get_local_cols() - select case (aggr_type) - case (mld_dec_aggr_) - call mld_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) - - case (mld_sym_dec_aggr_) - nr = a%get_nrows() - call a%csclip(atmp,info,imax=nr,jmax=nr,& - & rscale=.false.,cscale=.false.) - call atmp%set_nrows(nr) - call atmp%set_ncols(nr) - if (info == psb_success_) call atmp%transp(atrans) - if (info == psb_success_) call atrans%cscnv(info,type='COO') - if (info == psb_success_) call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) - call atmp%set_nrows(nr) - call atmp%set_ncols(nr) - if (info == psb_success_) call atrans%free() - if (info == psb_success_) call atmp%cscnv(info,type='CSR') - if (info == psb_success_) call mld_dec_map_bld(iorder,theta,atmp,desc_a,nlaggr,ilaggr,info) - if (info == psb_success_) call atmp%free() - - case default - - info = -1 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,aggr_type,izero,izero,izero/)) - goto 9999 - end select - - if (info /= psb_success_) then - info=psb_err_internal_error_ - call psb_errpush(info,name,a_err='dec_map_bld') - goto 9999 - end if - naggr = nlaggr(me+1) ntaggr = sum(nlaggr) naggrm1 = sum(nlaggr(1:me)) @@ -186,4 +147,4 @@ subroutine mld_saggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro return -end subroutine mld_saggrmap_bld +end subroutine mld_s_map_to_tprol diff --git a/mlprec/impl/mld_s_dec_map_bld.f90 b/mlprec/impl/aggregator/mld_s_soc1_map_bld.f90 similarity index 95% rename from mlprec/impl/mld_s_dec_map_bld.f90 rename to mlprec/impl/aggregator/mld_s_soc1_map_bld.f90 index 24f1b408..4729964d 100644 --- a/mlprec/impl/mld_s_dec_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_s_soc1_map_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -36,13 +36,13 @@ ! ! ! -! File: mld_s_dec_map__bld.f90 +! File: mld_s_soc1_map__bld.f90 ! -! Subroutine: mld_s_dec_map_bld +! Subroutine: mld_s_soc1_map_bld ! Version: real ! ! This routine builds the tentative prolongator based on the -! decoupled aggregation algorithm presented in +! strength of connection aggregation algorithm presented in ! ! M. Brezina and P. Vanek, A black-box iterative solver based on a ! two-level Schwarz method, Computing, 63 (1999), 233-263. @@ -67,11 +67,11 @@ ! ! ! -subroutine mld_s_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) +subroutine mld_s_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) use psb_base_mod use mld_base_prec_type - use mld_s_inner_mod, mld_protect_name => mld_s_dec_map_bld + use mld_s_inner_mod!, mld_protect_name => mld_s_soc1_map_bld implicit none @@ -98,7 +98,7 @@ subroutine mld_s_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) if (psb_get_errstatus() /= 0) return info=psb_success_ - name = 'mld_dec_map_bld' + name = 'mld_soc1_map_bld' call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() @@ -247,7 +247,7 @@ subroutine mld_s_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) ! Find its strongly connected neighbourhood not ! already aggregated, and make it into a new aggregate. ! - cpling = dzero + cpling = szero ip = 0 do k=1, nz j = icol(k) @@ -318,5 +318,5 @@ subroutine mld_s_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) return -end subroutine mld_s_dec_map_bld +end subroutine mld_s_soc1_map_bld diff --git a/mlprec/impl/aggregator/mld_s_soc2_map_bld.f90 b/mlprec/impl/aggregator/mld_s_soc2_map_bld.f90 new file mode 100644 index 00000000..9e0a95cd --- /dev/null +++ b/mlprec/impl/aggregator/mld_s_soc2_map_bld.f90 @@ -0,0 +1,330 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! File: mld_s_soc2_map__bld.f90 +! +! Subroutine: mld_s_soc2_map_bld +! Version: real +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! +! Note: upon exit +! +! Arguments: +! a - type(psb_sspmat_type). +! The sparse matrix structure containing the local part of the +! matrix to be preconditioned. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! p - type(mld_sprec_type), input/output. +! The preconditioner data structure; upon exit it contains +! the multilevel hierarchy of prolongators, restrictors +! and coarse matrices. +! info - integer, output. +! Error code. +! +! +! +subroutine mld_s_soc2_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) + + use psb_base_mod + use mld_base_prec_type + use mld_s_inner_mod!, mld_protect_name => mld_s_soc2_map_bld + + implicit none + + ! Arguments + integer(psb_ipk_), intent(in) :: iorder + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(psb_spk_), intent(in) :: theta + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), intent(out) :: info + + ! Local variables + integer(psb_ipk_), allocatable :: ils(:), neigh(:), irow(:), icol(:),& + & ideg(:), idxs(:), tmpaggr(:) + real(psb_spk_), allocatable :: val(:), diag(:) + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr,nc,naggr,i,j,m, nz, ilg, ii, ip, ip1,nzcnt + type(psb_s_csr_sparse_mat) :: acsr, muij, s_neigh + type(psb_s_coo_sparse_mat) :: s_neigh_coo + real(psb_spk_) :: cpling, tcl + logical :: disjoint + integer(psb_ipk_) :: debug_level, debug_unit,err_act + integer(psb_ipk_) :: ictxt,np,me + integer(psb_ipk_) :: nrow, ncol, n_ne + character(len=20) :: name, ch_err + + if (psb_get_errstatus() /= 0) return + info=psb_success_ + name = 'mld_soc2_map_bld' + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ! + ictxt=desc_a%get_context() + call psb_info(ictxt,me,np) + nrow = desc_a%get_local_rows() + ncol = desc_a%get_local_cols() + + nr = a%get_nrows() + nc = a%get_ncols() + allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nr),stat=info) + if(info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + + diag = a%get_diag(info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_sp_getdiag') + goto 9999 + end if + + ! + ! Phase zero: compute muij + ! + call a%cp_to(muij) + do i=1, nr + do k=muij%irp(i),muij%irp(i+1)-1 + j = muij%ja(k) + if (j<= nr) muij%val(k) = abs(muij%val(k))/sqrt(abs(diag(i)*diag(j))) + end do + end do + !write(*,*) 'murows/cols ',maxval(mu_rows),maxval(mu_cols) + ! + ! Compute the 1-neigbour; mark strong links with +1, weak links with -1 + ! + call s_neigh_coo%allocate(nr,nr,muij%get_nzeros()) + ip = 0 + do i=1, nr + do k=muij%irp(i),muij%irp(i+1)-1 + j = muij%ja(k) + if (j<=nr) then + ip = ip + 1 + s_neigh_coo%ia(ip) = i + s_neigh_coo%ja(ip) = j + if (real(muij%val(k)) >= theta) then + s_neigh_coo%val(ip) = sone + else + s_neigh_coo%val(ip) = -sone + end if + end if + end do + end do + !write(*,*) 'S_NEIGH: ',nr,ip + call s_neigh_coo%set_nzeros(ip) + call s_neigh%mv_from_coo(s_neigh_coo,info) + + if (iorder == mld_aggr_ord_nat_) then + do i=1, nr + ilaggr(i) = -(nr+1) + idxs(i) = i + end do + else + do i=1, nr + ilaggr(i) = -(nr+1) + ideg(i) = muij%irp(i+1) - muij%irp(i) + end do + call psb_msort(ideg,ix=idxs,dir=psb_sort_down_) + end if + + + ! + ! Phase one: Start with disjoint groups. + ! + naggr = 0 + icnt = 0 + step1: do ii=1, nr + i = idxs(ii) + + if (ilaggr(i) == -(nr+1)) then + ! + ! Get the 1-neighbourhood of I + ! + ip1 = s_neigh%irp(i) + nz = s_neigh%irp(i+1)-ip1 + ! + ! If the neighbourhood only contains I, skip it + ! + if (nz ==0) then + ilaggr(i) = 0 + cycle step1 + end if + if ((nz==1).and.(s_neigh%ja(ip1)==i)) then + ilaggr(i) = 0 + cycle step1 + end if + ! + ! If the whole strongly coupled neighborhood of I is + ! as yet unconnected, turn it into the next aggregate. + ! + nzcnt = count(real(s_neigh%val(ip1:ip1+nz-1)) > 0) + icol(1:nzcnt) = pack(s_neigh%ja(ip1:ip1+nz-1),(real(s_neigh%val(ip1:ip1+nz-1)) > 0)) + disjoint = all(ilaggr(icol(1:nzcnt)) == -(nr+1)) + if (disjoint) then + icnt = icnt + 1 + naggr = naggr + 1 + do k=1, nzcnt + ilaggr(icol(k)) = naggr + end do + ilaggr(i) = naggr + end if + endif + enddo step1 + + if (debug_level >= psb_debug_outer_) then + write(debug_unit,*) me,' ',trim(name),& + & ' Check 1:',count(ilaggr == -(nr+1)) + end if + + ! + ! Phase two: join the neighbours + ! + tmpaggr = ilaggr + step2: do ii=1,nr + i = idxs(ii) + + if (ilaggr(i) == -(nr+1)) then + ! + ! Find the most strongly connected neighbour that is + ! already aggregated, if any, and join its aggregate + ! + cpling = szero + ip = 0 + do k=s_neigh%irp(i), s_neigh%irp(i+1)-1 + j = s_neigh%ja(k) + if ((1<=j).and.(j<=nr)) then + if ( (tmpaggr(j) > 0).and. (real(muij%val(k)) > cpling)& + & .and.(real(s_neigh%val(k))>0)) then + ip = k + cpling = muij%val(k) + end if + end if + enddo + if (ip > 0) then + ilaggr(i) = ilaggr(s_neigh%ja(ip)) + end if + end if + end do step2 + + + ! + ! Phase three: sweep over leftovers, if any + ! + step3: do ii=1,nr + i = idxs(ii) + + if (ilaggr(i) < 0) then + ! + ! Find its strongly connected neighbourhood not + ! already aggregated, and make it into a new aggregate. + ! + ip = 0 + do k=s_neigh%irp(i), s_neigh%irp(i+1)-1 + j = s_neigh%ja(k) + if ((1<=j).and.(j<=nr)) then + if (ilaggr(j) < 0) then + ip = ip + 1 + icol(ip) = j + end if + end if + enddo + if (ip > 0) then + icnt = icnt + 1 + naggr = naggr + 1 + ilaggr(i) = naggr + do k=1, ip + ilaggr(icol(k)) = naggr + end do + end if + end if + end do step3 + + + if (count(ilaggr<0) >0) then + info=psb_err_internal_error_ + call psb_errpush(info,name,a_err='Fatal error: some leftovers') + goto 9999 + endif + + if (naggr > ncol) then + write(0,*) name,'Error : naggr > ncol',naggr,ncol + info=psb_err_internal_error_ + call psb_errpush(info,name,a_err='Fatal error: naggr>ncol') + goto 9999 + end if + + call psb_realloc(ncol,ilaggr,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='psb_realloc' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(nlaggr(np),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/np,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + + nlaggr(:) = 0 + nlaggr(me+1) = naggr + call psb_sum(ictxt,nlaggr(1:np)) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + +end subroutine mld_s_soc2_map_bld + diff --git a/mlprec/impl/aggregator/mld_s_symdec_aggregator_tprol.f90 b/mlprec/impl/aggregator/mld_s_symdec_aggregator_tprol.f90 new file mode 100644 index 00000000..a19f5344 --- /dev/null +++ b/mlprec/impl/aggregator/mld_s_symdec_aggregator_tprol.f90 @@ -0,0 +1,146 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! File: mld_s_symdec_aggregator_tprol.f90 +! +! Subroutine: mld_s_symdec_aggregator_tprol +! Version: real +! +! +! This routine is mainly an interface to map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. +! +! +! +! Arguments: +! p - type(mld_s_onelev_type), input/output. +! The 'one-level' data structure containing the control +! parameters and (eventually) coarse matrix and prolongator/restrictors. +! +! a - type(psb_sspmat_type). +! The sparse matrix structure containing the local part of the +! fine-level matrix. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! ilaggr - integer, dimension(:), allocatable, output +! The mapping between the row indices of the coarse-level +! matrix and the row indices of the fine-level matrix. +! ilaggr(i)=j means that node i in the adjacency graph +! of the fine-level matrix is mapped onto node j in the +! adjacency graph of the coarse-level matrix. Note that on exit the indices +! will be shifted so as to make sure the ranges on the various processes do not +! overlap. +! nlaggr - integer, dimension(:), allocatable, output +! nlaggr(i) contains the aggregates held by process i. +! op_prol - type(psb_sspmat_type), output +! The tentative prolongator, based on ilaggr. +! +! info - integer, output. +! Error code. +! +subroutine mld_s_symdec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + use mld_s_prec_type + use mld_s_symdec_aggregator_mod, mld_protect_name => mld_s_symdec_aggregator_build_tprol + use mld_s_inner_mod + implicit none + class(mld_s_symdec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_sspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + ! Local variables + type(psb_sspmat_type) :: atmp, atrans + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: ntaggr, nr + integer(psb_ipk_) :: debug_level, debug_unit + + name='mld_s_symdec_aggregator_tprol' + if (psb_get_errstatus().ne.0) return + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + info = psb_success_ + ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) + + call mld_check_def(parms%ml_cycle,'Multilevel cycle',& + & mld_mult_ml_,is_legal_ml_cycle) + call mld_check_def(parms%par_aggr_alg,'Aggregation',& + & mld_dec_aggr_,is_legal_ml_par_aggr_alg) + call mld_check_def(parms%aggr_ord,'Ordering',& + & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',szero,is_legal_s_aggr_thrs) + + nr = a%get_nrows() + call a%csclip(atmp,info,imax=nr,jmax=nr,& + & rscale=.false.,cscale=.false.) + call atmp%set_nrows(nr) + call atmp%set_ncols(nr) + if (info == psb_success_) call atmp%transp(atrans) + if (info == psb_success_) call atrans%cscnv(info,type='COO') + if (info == psb_success_) call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) + call atmp%set_nrows(nr) + call atmp%set_ncols(nr) + if (info == psb_success_) call atrans%free() + if (info == psb_success_) call atmp%cscnv(info,type='CSR') + + if (info == psb_success_) & + & call ag%map_bld(parms%aggr_ord,parms%aggr_thresh,atmp,desc_a,nlaggr,ilaggr,info) + if (info == psb_success_) call atmp%free() + + if (info == psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='map_bld/map_to_tprol') + goto 9999 + endif + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return + +end subroutine mld_s_symdec_aggregator_build_tprol diff --git a/mlprec/impl/mld_saggrmat_biz_asb.f90 b/mlprec/impl/aggregator/mld_saggrmat_biz_asb.f90 similarity index 99% rename from mlprec/impl/mld_saggrmat_biz_asb.f90 rename to mlprec/impl/aggregator/mld_saggrmat_biz_asb.f90 index dff9e720..93b3be0b 100644 --- a/mlprec/impl/mld_saggrmat_biz_asb.f90 +++ b/mlprec/impl/aggregator/mld_saggrmat_biz_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_saggrmat_minnrg_asb.f90 b/mlprec/impl/aggregator/mld_saggrmat_minnrg_asb.f90 similarity index 99% rename from mlprec/impl/mld_saggrmat_minnrg_asb.f90 rename to mlprec/impl/aggregator/mld_saggrmat_minnrg_asb.f90 index d66af67b..6ceb0874 100644 --- a/mlprec/impl/mld_saggrmat_minnrg_asb.f90 +++ b/mlprec/impl/aggregator/mld_saggrmat_minnrg_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_saggrmat_nosmth_asb.f90 b/mlprec/impl/aggregator/mld_saggrmat_nosmth_asb.f90 similarity index 88% rename from mlprec/impl/mld_saggrmat_nosmth_asb.f90 rename to mlprec/impl/aggregator/mld_saggrmat_nosmth_asb.f90 index 990d6f52..6678f775 100644 --- a/mlprec/impl/mld_saggrmat_nosmth_asb.f90 +++ b/mlprec/impl/aggregator/mld_saggrmat_nosmth_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -117,11 +117,11 @@ subroutine mld_saggrmat_nosmth_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_re integer(psb_ipk_) :: ictxt,np,me, icomm, ndx, minfo character(len=20) :: name integer(psb_ipk_) :: ierr(5) - type(psb_s_coo_sparse_mat) :: ac_coo, acoo + type(psb_s_coo_sparse_mat) :: ac_coo, tmpcoo type(psb_s_csr_sparse_mat) :: acsr1, acsr2 integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: nrow, nglob, ncol, ntaggr, nzl, ip, & - & naggr, nzt, naggrm1, i, k + & naggr, nzt, naggrm1, naggrp1, i, k name='mld_aggrmat_nosmth_asb' if(psb_get_errstatus().ne.0) return @@ -137,16 +137,37 @@ subroutine mld_saggrmat_nosmth_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_re ncol = desc_a%get_local_cols() - naggr = nlaggr(me+1) - ntaggr = sum(nlaggr) - naggrm1=sum(nlaggr(1:me)) - - call acoo%allocate(ncol,ntaggr,ncol) + naggr = nlaggr(me+1) + ntaggr = sum(nlaggr) + naggrm1 = sum(nlaggr(1:me)) + naggrp1 = sum(nlaggr(1:me+1)) + + call op_prol%cp_to(tmpcoo) call op_prol%cscnv(info,type='csr',dupl=psb_dupl_add_) - if (info /= psb_success_) goto 9999 - call op_prol%transp(op_restr) + call tmpcoo%transp() + nzl = tmpcoo%get_nzeros() + i=0 + ! + ! Now we have to fix this. The only rows of tmpcoo/op_restr that are correct + ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) + ! + do k=1, nzl + if ((naggrm1 < tmpcoo%ia(k)) .and.(tmpcoo%ia(k) <= naggrp1)) then + i = i+1 + tmpcoo%val(i) = tmpcoo%val(k) + tmpcoo%ia(i) = tmpcoo%ia(k) + tmpcoo%ja(i) = tmpcoo%ja(k) + end if + end do + call tmpcoo%set_nzeros(i) + ! call tmpcoo%trim() + call op_restr%mv_from(tmpcoo) + call op_restr%cscnv(info,type='csr',dupl=psb_dupl_add_) + + if (info /= psb_success_) goto 9999 + call a%cp_to(ac_coo) nzt = ac_coo%get_nzeros() diff --git a/mlprec/impl/mld_saggrmat_smth_asb.f90 b/mlprec/impl/aggregator/mld_saggrmat_smth_asb.f90 similarity index 99% rename from mlprec/impl/mld_saggrmat_smth_asb.f90 rename to mlprec/impl/aggregator/mld_saggrmat_smth_asb.f90 index b95c9e93..e2c52d7f 100644 --- a/mlprec/impl/mld_saggrmat_smth_asb.f90 +++ b/mlprec/impl/aggregator/mld_saggrmat_smth_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zaggrmat_asb.f90 b/mlprec/impl/aggregator/mld_z_dec_aggregator_mat_asb.f90 similarity index 71% rename from mlprec/impl/mld_zaggrmat_asb.f90 rename to mlprec/impl/aggregator/mld_z_dec_aggregator_mat_asb.f90 index afb53865..6d85871b 100644 --- a/mlprec/impl/mld_zaggrmat_asb.f90 +++ b/mlprec/impl/aggregator/mld_z_dec_aggregator_mat_asb.f90 @@ -1,6 +1,6 @@ ! -! -! MLD2P4 version 2.1 +! +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,12 +35,20 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_zaggrmat_asb.f90 +! File: mld_z_dec_aggregator_mat_asb.f90 ! -! Subroutine: mld_zaggrmat_asb +! Subroutine: mld_z_dec_aggregator_mat_asb ! Version: complex ! -! This routine builds a coarse-level matrix A_C from a fine-level matrix A +! This routine builds the matrix associated to the current level of the +! multilevel preconditioner from the matrix associated to the previous level, +! by using the user-specified aggregation technique (therefore, it also builds the +! prolongation and restriction operators mapping the current level to the +! previous one and vice versa). +! The current level is regarded as the coarse one, while the previous as +! the fine one. This is in agreement with the fact that the routine is called, +! by mld_mlprec_bld, only on levels >=2. +! The coarse-level matrix A_C is built from a fine-level matrix A ! by using the Galerkin approach, i.e. ! ! A_C = P_C^T A P_C, @@ -50,7 +58,7 @@ ! A mapping from the nodes of the adjacency graph of A to the nodes of the ! adjacency graph of A_C has been computed by the mld_aggrmap_bld subroutine. ! The prolongator P_C is built here from this mapping, according to the -! value of p%iprcparm(mld_aggr_prol_), specified by the user through +! value of p%iprcparm(mld_aggr_kind_), specified by the user through ! mld_zprecinit and mld_zprecset. ! On output from this routine the entries of AC, op_prol, op_restr ! are still in "global numbering" mode; this is fixed in the calling routine @@ -64,13 +72,13 @@ ! 4. minimum energy ! 1. The non-smoothed aggregation uses as prolongator the piecewise constant ! interpolation operator corresponding to the fine-to-coarse level mapping built -! by mld_aggrmap_bld. This is called tentative prolongator. +! by p%aggr%bld_tprol. This is called tentative prolongator. ! 2. The smoothed aggregation uses as prolongator the operator obtained by applying ! a damped Jacobi smoother to the tentative prolongator. ! 3. The "bizarre" aggregation uses a prolongator proposed by the authors of MLD2P4. ! This prolongator still requires a deep analysis and testing and its use is ! not recommended. -! 4. Minimum energy aggregation: ADD REFERENCE. +! 4. Minimum energy aggregation ! ! For more details see ! M. Brezina and P. Vanek, A black-box iterative solver based on a two-level @@ -78,24 +86,28 @@ ! P. D'Ambra, D. di Serafino and S. Filippone, On the development of PSBLAS-based ! parallel two-level Schwarz preconditioners, Appl. Num. Math., 57 (2007), ! 1181-1196. +! M. Sala, R. Tuminaro: A new Petrov-Galerkin smoothed aggregation preconditioner +! for nonsymmetric linear systems, SIAM J. Sci. Comput., 31(1):143-166 (2008) ! ! +! The main structure is: +! 1. Perform sanity checks; +! 2. Compute prolongator/restrictor/AC ! +! ! Arguments: +! ag - type(mld_z_dec_aggregator_type), input/output. +! The aggregator object +! parms - type(mld_dml_parms), input +! The aggregation parameters ! a - type(psb_zspmat_type), input. ! The sparse matrix structure containing the local part of ! the fine-level matrix. ! desc_a - type(psb_desc_type), input. ! The communication descriptor of the fine-level matrix. -! p - type(mld_z_onelev_type), input/output. ! The 'one-level' data structure that will contain the local ! part of the matrix to be built as well as the information ! concerning the prolongator and its transpose. -! parms - type(mld_dml_parms), input -! Parameters controlling the choice of algorithm -! ac - type(psb_zspmat_type), output -! The coarse matrix on output -! ! ilaggr - integer, dimension(:), input ! The mapping between the row indices of the coarse-level ! matrix and the row indices of the fine-level matrix. @@ -106,6 +118,9 @@ ! the various processes do not overlap. ! nlaggr - integer, dimension(:) input ! nlaggr(i) contains the aggregates held by process i. +! ac - type(psb_zspmat_type), output +! The coarse matrix on output +! ! op_prol - type(psb_zspmat_type), input/output ! The tentative prolongator on input, the computed prolongator on output ! @@ -114,43 +129,45 @@ ! ! info - integer, output. ! Error code. -! -subroutine mld_zaggrmat_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_restr,info) - +! +subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) use psb_base_mod - use mld_base_prec_type - use mld_z_inner_mod, mld_protect_name => mld_zaggrmat_asb - + use mld_z_prec_type, mld_protect_name => mld_z_dec_aggregator_mat_asb + use mld_z_inner_mod implicit none - -! Arguments - type(psb_zspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) - type(mld_dml_parms), intent(inout) :: parms - type(psb_zspmat_type), intent(inout) :: ac, op_prol,op_restr - integer(psb_ipk_), intent(out) :: info - -! Local variables + + class(mld_z_dec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_zspmat_type), intent(inout) :: op_prol + type(psb_zspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + + ! Local variables + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me type(psb_z_coo_sparse_mat) :: acoo, bcoo type(psb_z_csr_sparse_mat) :: acsr1 - integer(psb_ipk_) :: nzl,ntaggr, err_act + integer(psb_ipk_) :: nzl,ntaggr + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit - integer(psb_ipk_) :: ictxt,np,me - character(len=20) :: name - name='mld_aggrmat_asb' - if(psb_get_errstatus().ne.0) return - info=psb_success_ + name='mld_z_dec_aggregator_mat_asb' + if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - - + info = psb_success_ ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) - call psb_info(ictxt, me, np) - + ! + ! Build the coarse-level matrix from the fine-level one, starting from + ! the mapping defined by mld_aggrmap_bld and applying the aggregation + ! algorithm specified by + ! select case (parms%aggr_prol) case (mld_no_smooth_) @@ -183,11 +200,12 @@ subroutine mld_zaggrmat_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_restr,inf goto 9999 end if + call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) - return -end subroutine mld_zaggrmat_asb + +end subroutine mld_z_dec_aggregator_mat_asb diff --git a/mlprec/impl/mld_z_lev_aggrmap_bld.f90 b/mlprec/impl/aggregator/mld_z_dec_aggregator_tprol.f90 similarity index 65% rename from mlprec/impl/mld_z_lev_aggrmap_bld.f90 rename to mlprec/impl/aggregator/mld_z_dec_aggregator_tprol.f90 index b1f88f22..aeac2317 100644 --- a/mlprec/impl/mld_z_lev_aggrmap_bld.f90 +++ b/mlprec/impl/aggregator/mld_z_dec_aggregator_tprol.f90 @@ -1,7 +1,6 @@ - -! +! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -36,15 +35,15 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_z_lev_aggrmap_bld.f90 +! File: mld_z_dec_aggregator_tprol.f90 ! -! Subroutine: mld_z_lev_aggrmap_bld +! Subroutine: mld_z_dec_aggregator_tprol ! Version: complex ! -! This routine is just an interface to aggrmap_bld where the real work is performed. -! It takes care of some consistency checking though. -! -! See mld_zaggrmap_bld for constraints on input/oput arguments. +! This routine is mainly an interface to map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. ! ! ! Arguments: @@ -73,31 +72,27 @@ ! info - integer, output. ! Error code. ! -subroutine mld_z_lev_aggrmap_bld(p,a,desc_a,ilaggr,nlaggr,op_prol,info) - +subroutine mld_z_dec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod - use mld_base_prec_type - use mld_z_inner_mod, mld_protect_name => mld_z_lev_aggrmap_bld - + use mld_z_prec_type, mld_protect_name => mld_z_dec_aggregator_build_tprol + use mld_z_inner_mod implicit none - - ! Arguments - type(mld_z_onelev_type), intent(inout), target :: p - type(psb_zspmat_type), intent(in) :: a + class(mld_z_dec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) type(psb_zspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info - ! Local variables - character(len=20) :: name - integer(psb_mpk_) :: ictxt, np, me - integer(psb_ipk_) :: err_act - integer(psb_ipk_) :: nzl, ntaggr + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: ntaggr integer(psb_ipk_) :: debug_level, debug_unit - name='mld_z_lev_aggrmap_bld' + name='mld_z_dec_aggregator_tprol' if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() @@ -106,52 +101,28 @@ subroutine mld_z_lev_aggrmap_bld(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ictxt = desc_a%get_context() call psb_info(ictxt,me,np) - call mld_check_def(p%parms%ml_cycle,'Multilevel cycle',& + call mld_check_def(parms%ml_cycle,'Multilevel cycle',& & mld_mult_ml_,is_legal_ml_cycle) - call mld_check_def(p%parms%par_aggr_alg,'Aggregation',& + call mld_check_def(parms%par_aggr_alg,'Aggregation',& & mld_dec_aggr_,is_legal_ml_par_aggr_alg) - call mld_check_def(p%parms%aggr_ord,'Ordering',& + call mld_check_def(parms%aggr_ord,'Ordering',& & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) - call mld_check_def(p%parms%aggr_thresh,'Aggr_Thresh',dzero,is_legal_d_aggr_thrs) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',dzero,is_legal_d_aggr_thrs) - select case(p%parms%par_aggr_alg) - case (mld_dec_aggr_, mld_sym_dec_aggr_) - - ! - ! Build a mapping between the row indices of the fine-level matrix - ! and the row indices of the coarse-level matrix, according to a decoupled - ! aggregation algorithm. This also defines a tentative prolongator from - ! the coarse to the fine level. - ! - call mld_aggrmap_bld(p%parms%par_aggr_alg,p%parms%aggr_ord,p%parms%aggr_thresh,& - & a,desc_a,ilaggr,nlaggr,op_prol,info) - - if (info /= psb_success_) then - call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmap_bld') - goto 9999 - end if - case (mld_bcmatch_aggr_) - write(0,*) 'Matching is not implemented yet ' - info = -1111 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,p%parms%par_aggr_alg,izero,izero,izero/)) - goto 9999 - - case default + call ag%map_bld(parms%aggr_ord,parms%aggr_thresh,a,desc_a,nlaggr,ilaggr,info) - info = -1 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,p%parms%par_aggr_alg,izero,izero,izero/)) + if (info==psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='map_bld/map_to_tprol') goto 9999 - - end select - + endif call psb_erractionrestore(err_act) return 9999 call psb_error_handler(err_act) return - -end subroutine mld_z_lev_aggrmap_bld + +end subroutine mld_z_dec_aggregator_build_tprol diff --git a/mlprec/impl/mld_zaggrmap_bld.f90 b/mlprec/impl/aggregator/mld_z_map_to_tprol.f90 similarity index 71% rename from mlprec/impl/mld_zaggrmap_bld.f90 rename to mlprec/impl/aggregator/mld_z_map_to_tprol.f90 index dc9adbc9..d01b2e75 100644 --- a/mlprec/impl/mld_zaggrmap_bld.f90 +++ b/mlprec/impl/aggregator/mld_z_map_to_tprol.f90 @@ -1,6 +1,6 @@ +! ! -! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -9,7 +9,7 @@ ! Salvatore Filippone ! Pasqua D'Ambra ! Daniela di Serafino -! +! ! Redistribution and use in source and binary forms, with or without ! modification, are permitted provided that the following conditions ! are met: @@ -35,15 +35,17 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_zaggrmap_bld.f90 +! File: mld_z_map_to_tprol.f90 ! -! Subroutine: mld_zaggrmap_bld +! Subroutine: mld_z_map_to_tprol ! Version: complex ! -! This routine builds a mapping from the row indices of the fine-level matrix -! to the row indices of the coarse-level matrix, according to a decoupled -! aggregation algorithm. This mapping will be used by mld_aggrmat_asb to -! build the coarse-level matrix. +! This routine uses a mapping from the row indices of the fine-level matrix +! to the row indices of the coarse-level matrix to build a tentative +! prolongator, i.e. a piecewise constant operator. +! This is later used to build the final operator; the code has been refactored here +! to be shared among all the methods that provide the tentative prolongator +! through a simple integer mapping. ! ! The aggregation algorithm is a parallel version of that described in ! * M. Brezina and P. Vanek, A black-box iterative solver based on a @@ -83,28 +85,21 @@ ! info - integer, output. ! Error code. ! -subroutine mld_zaggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_prol,info) +subroutine mld_z_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod - use mld_base_prec_type - use mld_z_inner_mod, mld_protect_name => mld_zaggrmap_bld + use mld_z_inner_mod, mld_protect_name => mld_z_map_to_tprol implicit none ! Arguments - integer(psb_ipk_), intent(in) :: iorder - integer(psb_ipk_), intent(in) :: aggr_type - real(psb_dpk_), intent(in) :: theta - type(psb_zspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) type(psb_zspmat_type), intent(out) :: op_prol integer(psb_ipk_), intent(out) :: info ! Local variables - integer(psb_ipk_), allocatable :: ils(:), neigh(:) integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m,naggrm1, naggrp1, ntaggr - type(psb_zspmat_type) :: atmp, atrans type(psb_z_coo_sparse_mat) :: tmpcoo integer(psb_ipk_) :: debug_level, debug_unit,err_act integer(psb_ipk_) :: ictxt,np,me @@ -113,7 +108,7 @@ subroutine mld_zaggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro if(psb_get_errstatus() /= 0) return info=psb_success_ - name = 'mld_aggrmap_bld' + name = 'mld_map_to_tprol' call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() @@ -123,40 +118,6 @@ subroutine mld_zaggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro nrow = desc_a%get_local_rows() ncol = desc_a%get_local_cols() - select case (aggr_type) - case (mld_dec_aggr_) - call mld_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) - - case (mld_sym_dec_aggr_) - nr = a%get_nrows() - call a%csclip(atmp,info,imax=nr,jmax=nr,& - & rscale=.false.,cscale=.false.) - call atmp%set_nrows(nr) - call atmp%set_ncols(nr) - if (info == psb_success_) call atmp%transp(atrans) - if (info == psb_success_) call atrans%cscnv(info,type='COO') - if (info == psb_success_) call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) - call atmp%set_nrows(nr) - call atmp%set_ncols(nr) - if (info == psb_success_) call atrans%free() - if (info == psb_success_) call atmp%cscnv(info,type='CSR') - if (info == psb_success_) call mld_dec_map_bld(iorder,theta,atmp,desc_a,nlaggr,ilaggr,info) - if (info == psb_success_) call atmp%free() - - case default - - info = -1 - call psb_errpush(psb_err_input_value_invalid_i_,name,& - & i_err=(/ione,aggr_type,izero,izero,izero/)) - goto 9999 - end select - - if (info /= psb_success_) then - info=psb_err_internal_error_ - call psb_errpush(info,name,a_err='dec_map_bld') - goto 9999 - end if - naggr = nlaggr(me+1) ntaggr = sum(nlaggr) naggrm1 = sum(nlaggr(1:me)) @@ -186,4 +147,4 @@ subroutine mld_zaggrmap_bld(aggr_type,iorder,theta,a,desc_a,ilaggr,nlaggr,op_pro return -end subroutine mld_zaggrmap_bld +end subroutine mld_z_map_to_tprol diff --git a/mlprec/impl/mld_z_dec_map_bld.f90 b/mlprec/impl/aggregator/mld_z_soc1_map_bld.f90 similarity index 96% rename from mlprec/impl/mld_z_dec_map_bld.f90 rename to mlprec/impl/aggregator/mld_z_soc1_map_bld.f90 index 6900b221..9a4bc47b 100644 --- a/mlprec/impl/mld_z_dec_map_bld.f90 +++ b/mlprec/impl/aggregator/mld_z_soc1_map_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -36,13 +36,13 @@ ! ! ! -! File: mld_z_dec_map__bld.f90 +! File: mld_z_soc1_map__bld.f90 ! -! Subroutine: mld_z_dec_map_bld +! Subroutine: mld_z_soc1_map_bld ! Version: complex ! ! This routine builds the tentative prolongator based on the -! decoupled aggregation algorithm presented in +! strength of connection aggregation algorithm presented in ! ! M. Brezina and P. Vanek, A black-box iterative solver based on a ! two-level Schwarz method, Computing, 63 (1999), 233-263. @@ -67,11 +67,11 @@ ! ! ! -subroutine mld_z_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) +subroutine mld_z_soc1_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) use psb_base_mod use mld_base_prec_type - use mld_z_inner_mod, mld_protect_name => mld_z_dec_map_bld + use mld_z_inner_mod!, mld_protect_name => mld_z_soc1_map_bld implicit none @@ -98,7 +98,7 @@ subroutine mld_z_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) if (psb_get_errstatus() /= 0) return info=psb_success_ - name = 'mld_dec_map_bld' + name = 'mld_soc1_map_bld' call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() @@ -318,5 +318,5 @@ subroutine mld_z_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) return -end subroutine mld_z_dec_map_bld +end subroutine mld_z_soc1_map_bld diff --git a/mlprec/impl/aggregator/mld_z_soc2_map_bld.f90 b/mlprec/impl/aggregator/mld_z_soc2_map_bld.f90 new file mode 100644 index 00000000..590c3d37 --- /dev/null +++ b/mlprec/impl/aggregator/mld_z_soc2_map_bld.f90 @@ -0,0 +1,330 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! File: mld_z_soc2_map__bld.f90 +! +! Subroutine: mld_z_soc2_map_bld +! Version: complex +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! +! Note: upon exit +! +! Arguments: +! a - type(psb_zspmat_type). +! The sparse matrix structure containing the local part of the +! matrix to be preconditioned. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! p - type(mld_zprec_type), input/output. +! The preconditioner data structure; upon exit it contains +! the multilevel hierarchy of prolongators, restrictors +! and coarse matrices. +! info - integer, output. +! Error code. +! +! +! +subroutine mld_z_soc2_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) + + use psb_base_mod + use mld_base_prec_type + use mld_z_inner_mod!, mld_protect_name => mld_z_soc2_map_bld + + implicit none + + ! Arguments + integer(psb_ipk_), intent(in) :: iorder + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(psb_dpk_), intent(in) :: theta + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), intent(out) :: info + + ! Local variables + integer(psb_ipk_), allocatable :: ils(:), neigh(:), irow(:), icol(:),& + & ideg(:), idxs(:), tmpaggr(:) + complex(psb_dpk_), allocatable :: val(:), diag(:) + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr,nc,naggr,i,j,m, nz, ilg, ii, ip, ip1,nzcnt + type(psb_z_csr_sparse_mat) :: acsr, muij, s_neigh + type(psb_z_coo_sparse_mat) :: s_neigh_coo + real(psb_dpk_) :: cpling, tcl + logical :: disjoint + integer(psb_ipk_) :: debug_level, debug_unit,err_act + integer(psb_ipk_) :: ictxt,np,me + integer(psb_ipk_) :: nrow, ncol, n_ne + character(len=20) :: name, ch_err + + if (psb_get_errstatus() /= 0) return + info=psb_success_ + name = 'mld_soc2_map_bld' + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ! + ictxt=desc_a%get_context() + call psb_info(ictxt,me,np) + nrow = desc_a%get_local_rows() + ncol = desc_a%get_local_cols() + + nr = a%get_nrows() + nc = a%get_ncols() + allocate(ilaggr(nr),neigh(nr),ideg(nr),idxs(nr),icol(nr),stat=info) + if(info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/2*nr,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + + diag = a%get_diag(info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_sp_getdiag') + goto 9999 + end if + + ! + ! Phase zero: compute muij + ! + call a%cp_to(muij) + do i=1, nr + do k=muij%irp(i),muij%irp(i+1)-1 + j = muij%ja(k) + if (j<= nr) muij%val(k) = abs(muij%val(k))/sqrt(abs(diag(i)*diag(j))) + end do + end do + !write(*,*) 'murows/cols ',maxval(mu_rows),maxval(mu_cols) + ! + ! Compute the 1-neigbour; mark strong links with +1, weak links with -1 + ! + call s_neigh_coo%allocate(nr,nr,muij%get_nzeros()) + ip = 0 + do i=1, nr + do k=muij%irp(i),muij%irp(i+1)-1 + j = muij%ja(k) + if (j<=nr) then + ip = ip + 1 + s_neigh_coo%ia(ip) = i + s_neigh_coo%ja(ip) = j + if (real(muij%val(k)) >= theta) then + s_neigh_coo%val(ip) = done + else + s_neigh_coo%val(ip) = -done + end if + end if + end do + end do + !write(*,*) 'S_NEIGH: ',nr,ip + call s_neigh_coo%set_nzeros(ip) + call s_neigh%mv_from_coo(s_neigh_coo,info) + + if (iorder == mld_aggr_ord_nat_) then + do i=1, nr + ilaggr(i) = -(nr+1) + idxs(i) = i + end do + else + do i=1, nr + ilaggr(i) = -(nr+1) + ideg(i) = muij%irp(i+1) - muij%irp(i) + end do + call psb_msort(ideg,ix=idxs,dir=psb_sort_down_) + end if + + + ! + ! Phase one: Start with disjoint groups. + ! + naggr = 0 + icnt = 0 + step1: do ii=1, nr + i = idxs(ii) + + if (ilaggr(i) == -(nr+1)) then + ! + ! Get the 1-neighbourhood of I + ! + ip1 = s_neigh%irp(i) + nz = s_neigh%irp(i+1)-ip1 + ! + ! If the neighbourhood only contains I, skip it + ! + if (nz ==0) then + ilaggr(i) = 0 + cycle step1 + end if + if ((nz==1).and.(s_neigh%ja(ip1)==i)) then + ilaggr(i) = 0 + cycle step1 + end if + ! + ! If the whole strongly coupled neighborhood of I is + ! as yet unconnected, turn it into the next aggregate. + ! + nzcnt = count(real(s_neigh%val(ip1:ip1+nz-1)) > 0) + icol(1:nzcnt) = pack(s_neigh%ja(ip1:ip1+nz-1),(real(s_neigh%val(ip1:ip1+nz-1)) > 0)) + disjoint = all(ilaggr(icol(1:nzcnt)) == -(nr+1)) + if (disjoint) then + icnt = icnt + 1 + naggr = naggr + 1 + do k=1, nzcnt + ilaggr(icol(k)) = naggr + end do + ilaggr(i) = naggr + end if + endif + enddo step1 + + if (debug_level >= psb_debug_outer_) then + write(debug_unit,*) me,' ',trim(name),& + & ' Check 1:',count(ilaggr == -(nr+1)) + end if + + ! + ! Phase two: join the neighbours + ! + tmpaggr = ilaggr + step2: do ii=1,nr + i = idxs(ii) + + if (ilaggr(i) == -(nr+1)) then + ! + ! Find the most strongly connected neighbour that is + ! already aggregated, if any, and join its aggregate + ! + cpling = dzero + ip = 0 + do k=s_neigh%irp(i), s_neigh%irp(i+1)-1 + j = s_neigh%ja(k) + if ((1<=j).and.(j<=nr)) then + if ( (tmpaggr(j) > 0).and. (real(muij%val(k)) > cpling)& + & .and.(real(s_neigh%val(k))>0)) then + ip = k + cpling = muij%val(k) + end if + end if + enddo + if (ip > 0) then + ilaggr(i) = ilaggr(s_neigh%ja(ip)) + end if + end if + end do step2 + + + ! + ! Phase three: sweep over leftovers, if any + ! + step3: do ii=1,nr + i = idxs(ii) + + if (ilaggr(i) < 0) then + ! + ! Find its strongly connected neighbourhood not + ! already aggregated, and make it into a new aggregate. + ! + ip = 0 + do k=s_neigh%irp(i), s_neigh%irp(i+1)-1 + j = s_neigh%ja(k) + if ((1<=j).and.(j<=nr)) then + if (ilaggr(j) < 0) then + ip = ip + 1 + icol(ip) = j + end if + end if + enddo + if (ip > 0) then + icnt = icnt + 1 + naggr = naggr + 1 + ilaggr(i) = naggr + do k=1, ip + ilaggr(icol(k)) = naggr + end do + end if + end if + end do step3 + + + if (count(ilaggr<0) >0) then + info=psb_err_internal_error_ + call psb_errpush(info,name,a_err='Fatal error: some leftovers') + goto 9999 + endif + + if (naggr > ncol) then + write(0,*) name,'Error : naggr > ncol',naggr,ncol + info=psb_err_internal_error_ + call psb_errpush(info,name,a_err='Fatal error: naggr>ncol') + goto 9999 + end if + + call psb_realloc(ncol,ilaggr,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='psb_realloc' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(nlaggr(np),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/np,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + + nlaggr(:) = 0 + nlaggr(me+1) = naggr + call psb_sum(ictxt,nlaggr(1:np)) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + +end subroutine mld_z_soc2_map_bld + diff --git a/mlprec/impl/aggregator/mld_z_symdec_aggregator_tprol.f90 b/mlprec/impl/aggregator/mld_z_symdec_aggregator_tprol.f90 new file mode 100644 index 00000000..eb619419 --- /dev/null +++ b/mlprec/impl/aggregator/mld_z_symdec_aggregator_tprol.f90 @@ -0,0 +1,146 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! File: mld_z_symdec_aggregator_tprol.f90 +! +! Subroutine: mld_z_symdec_aggregator_tprol +! Version: complex +! +! +! This routine is mainly an interface to map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. +! +! +! +! Arguments: +! p - type(mld_z_onelev_type), input/output. +! The 'one-level' data structure containing the control +! parameters and (eventually) coarse matrix and prolongator/restrictors. +! +! a - type(psb_zspmat_type). +! The sparse matrix structure containing the local part of the +! fine-level matrix. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! ilaggr - integer, dimension(:), allocatable, output +! The mapping between the row indices of the coarse-level +! matrix and the row indices of the fine-level matrix. +! ilaggr(i)=j means that node i in the adjacency graph +! of the fine-level matrix is mapped onto node j in the +! adjacency graph of the coarse-level matrix. Note that on exit the indices +! will be shifted so as to make sure the ranges on the various processes do not +! overlap. +! nlaggr - integer, dimension(:), allocatable, output +! nlaggr(i) contains the aggregates held by process i. +! op_prol - type(psb_zspmat_type), output +! The tentative prolongator, based on ilaggr. +! +! info - integer, output. +! Error code. +! +subroutine mld_z_symdec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + use mld_z_prec_type + use mld_z_symdec_aggregator_mod, mld_protect_name => mld_z_symdec_aggregator_build_tprol + use mld_z_inner_mod + implicit none + class(mld_z_symdec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_zspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + ! Local variables + type(psb_zspmat_type) :: atmp, atrans + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: ntaggr, nr + integer(psb_ipk_) :: debug_level, debug_unit + + name='mld_z_symdec_aggregator_tprol' + if (psb_get_errstatus().ne.0) return + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + info = psb_success_ + ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) + + call mld_check_def(parms%ml_cycle,'Multilevel cycle',& + & mld_mult_ml_,is_legal_ml_cycle) + call mld_check_def(parms%par_aggr_alg,'Aggregation',& + & mld_dec_aggr_,is_legal_ml_par_aggr_alg) + call mld_check_def(parms%aggr_ord,'Ordering',& + & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',dzero,is_legal_d_aggr_thrs) + + nr = a%get_nrows() + call a%csclip(atmp,info,imax=nr,jmax=nr,& + & rscale=.false.,cscale=.false.) + call atmp%set_nrows(nr) + call atmp%set_ncols(nr) + if (info == psb_success_) call atmp%transp(atrans) + if (info == psb_success_) call atrans%cscnv(info,type='COO') + if (info == psb_success_) call psb_rwextd(nr,atmp,info,b=atrans,rowscale=.false.) + call atmp%set_nrows(nr) + call atmp%set_ncols(nr) + if (info == psb_success_) call atrans%free() + if (info == psb_success_) call atmp%cscnv(info,type='CSR') + + if (info == psb_success_) & + & call ag%map_bld(parms%aggr_ord,parms%aggr_thresh,atmp,desc_a,nlaggr,ilaggr,info) + if (info == psb_success_) call atmp%free() + + if (info == psb_success_) call mld_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='map_bld/map_to_tprol') + goto 9999 + endif + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return + +end subroutine mld_z_symdec_aggregator_build_tprol diff --git a/mlprec/impl/mld_zaggrmat_biz_asb.f90 b/mlprec/impl/aggregator/mld_zaggrmat_biz_asb.f90 similarity index 99% rename from mlprec/impl/mld_zaggrmat_biz_asb.f90 rename to mlprec/impl/aggregator/mld_zaggrmat_biz_asb.f90 index 867ef775..297ea046 100644 --- a/mlprec/impl/mld_zaggrmat_biz_asb.f90 +++ b/mlprec/impl/aggregator/mld_zaggrmat_biz_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zaggrmat_minnrg_asb.f90 b/mlprec/impl/aggregator/mld_zaggrmat_minnrg_asb.f90 similarity index 99% rename from mlprec/impl/mld_zaggrmat_minnrg_asb.f90 rename to mlprec/impl/aggregator/mld_zaggrmat_minnrg_asb.f90 index b86af371..71add989 100644 --- a/mlprec/impl/mld_zaggrmat_minnrg_asb.f90 +++ b/mlprec/impl/aggregator/mld_zaggrmat_minnrg_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zaggrmat_nosmth_asb.f90 b/mlprec/impl/aggregator/mld_zaggrmat_nosmth_asb.f90 similarity index 88% rename from mlprec/impl/mld_zaggrmat_nosmth_asb.f90 rename to mlprec/impl/aggregator/mld_zaggrmat_nosmth_asb.f90 index 5dfc77c1..27677ac4 100644 --- a/mlprec/impl/mld_zaggrmat_nosmth_asb.f90 +++ b/mlprec/impl/aggregator/mld_zaggrmat_nosmth_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -117,11 +117,11 @@ subroutine mld_zaggrmat_nosmth_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_re integer(psb_ipk_) :: ictxt,np,me, icomm, ndx, minfo character(len=20) :: name integer(psb_ipk_) :: ierr(5) - type(psb_z_coo_sparse_mat) :: ac_coo, acoo + type(psb_z_coo_sparse_mat) :: ac_coo, tmpcoo type(psb_z_csr_sparse_mat) :: acsr1, acsr2 integer(psb_ipk_) :: debug_level, debug_unit integer(psb_ipk_) :: nrow, nglob, ncol, ntaggr, nzl, ip, & - & naggr, nzt, naggrm1, i, k + & naggr, nzt, naggrm1, naggrp1, i, k name='mld_aggrmat_nosmth_asb' if(psb_get_errstatus().ne.0) return @@ -137,16 +137,37 @@ subroutine mld_zaggrmat_nosmth_asb(a,desc_a,ilaggr,nlaggr,parms,ac,op_prol,op_re ncol = desc_a%get_local_cols() - naggr = nlaggr(me+1) - ntaggr = sum(nlaggr) - naggrm1=sum(nlaggr(1:me)) - - call acoo%allocate(ncol,ntaggr,ncol) + naggr = nlaggr(me+1) + ntaggr = sum(nlaggr) + naggrm1 = sum(nlaggr(1:me)) + naggrp1 = sum(nlaggr(1:me+1)) + + call op_prol%cp_to(tmpcoo) call op_prol%cscnv(info,type='csr',dupl=psb_dupl_add_) - if (info /= psb_success_) goto 9999 - call op_prol%transp(op_restr) + call tmpcoo%transp() + nzl = tmpcoo%get_nzeros() + i=0 + ! + ! Now we have to fix this. The only rows of tmpcoo/op_restr that are correct + ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:) + ! + do k=1, nzl + if ((naggrm1 < tmpcoo%ia(k)) .and.(tmpcoo%ia(k) <= naggrp1)) then + i = i+1 + tmpcoo%val(i) = tmpcoo%val(k) + tmpcoo%ia(i) = tmpcoo%ia(k) + tmpcoo%ja(i) = tmpcoo%ja(k) + end if + end do + call tmpcoo%set_nzeros(i) + ! call tmpcoo%trim() + call op_restr%mv_from(tmpcoo) + call op_restr%cscnv(info,type='csr',dupl=psb_dupl_add_) + + if (info /= psb_success_) goto 9999 + call a%cp_to(ac_coo) nzt = ac_coo%get_nzeros() diff --git a/mlprec/impl/mld_zaggrmat_smth_asb.f90 b/mlprec/impl/aggregator/mld_zaggrmat_smth_asb.f90 similarity index 99% rename from mlprec/impl/mld_zaggrmat_smth_asb.f90 rename to mlprec/impl/aggregator/mld_zaggrmat_smth_asb.f90 index 165c2605..02f2ebe6 100644 --- a/mlprec/impl/mld_zaggrmat_smth_asb.f90 +++ b/mlprec/impl/aggregator/mld_zaggrmat_smth_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/Makefile b/mlprec/impl/level/Makefile index 0143f61b..9cb12928 100644 --- a/mlprec/impl/level/Makefile +++ b/mlprec/impl/level/Makefile @@ -17,6 +17,8 @@ mld_c_base_onelev_csetr.o \ mld_c_base_onelev_descr.o \ mld_c_base_onelev_dump.o \ mld_c_base_onelev_free.o \ +mld_c_base_onelev_mat_asb.o \ +mld_c_base_onelev_setag.o \ mld_c_base_onelev_setc.o \ mld_c_base_onelev_seti.o \ mld_c_base_onelev_setr.o \ @@ -31,6 +33,8 @@ mld_d_base_onelev_csetr.o \ mld_d_base_onelev_descr.o \ mld_d_base_onelev_dump.o \ mld_d_base_onelev_free.o \ +mld_d_base_onelev_mat_asb.o \ +mld_d_base_onelev_setag.o \ mld_d_base_onelev_setc.o \ mld_d_base_onelev_seti.o \ mld_d_base_onelev_setr.o \ @@ -45,6 +49,8 @@ mld_s_base_onelev_csetr.o \ mld_s_base_onelev_descr.o \ mld_s_base_onelev_dump.o \ mld_s_base_onelev_free.o \ +mld_s_base_onelev_mat_asb.o \ +mld_s_base_onelev_setag.o \ mld_s_base_onelev_setc.o \ mld_s_base_onelev_seti.o \ mld_s_base_onelev_setr.o \ @@ -59,6 +65,8 @@ mld_z_base_onelev_csetr.o \ mld_z_base_onelev_descr.o \ mld_z_base_onelev_dump.o \ mld_z_base_onelev_free.o \ +mld_z_base_onelev_mat_asb.o \ +mld_z_base_onelev_setag.o \ mld_z_base_onelev_setc.o \ mld_z_base_onelev_seti.o \ mld_z_base_onelev_setr.o \ diff --git a/mlprec/impl/level/mld_c_base_onelev_build.f90 b/mlprec/impl/level/mld_c_base_onelev_build.f90 index 6579af69..bc3c3a15 100644 --- a/mlprec/impl/level/mld_c_base_onelev_build.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_build.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_check.f90 b/mlprec/impl/level/mld_c_base_onelev_check.f90 index 5f4f3f22..c47747b5 100644 --- a/mlprec/impl/level/mld_c_base_onelev_check.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_cnv.f90 b/mlprec/impl/level/mld_c_base_onelev_cnv.f90 index 72837aed..e3d49b1b 100644 --- a/mlprec/impl/level/mld_c_base_onelev_cnv.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_csetc.f90 b/mlprec/impl/level/mld_c_base_onelev_csetc.f90 index 8e3cc4a6..781ceef0 100644 --- a/mlprec/impl/level/mld_c_base_onelev_csetc.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_cseti.F90 b/mlprec/impl/level/mld_c_base_onelev_cseti.F90 index 2d8da26e..f412093e 100644 --- a/mlprec/impl/level/mld_c_base_onelev_cseti.F90 +++ b/mlprec/impl/level/mld_c_base_onelev_cseti.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -39,6 +39,9 @@ subroutine mld_c_base_onelev_cseti(lv,what,val,info,pos) use psb_base_mod use mld_c_onelev_mod, mld_protect_name => mld_c_base_onelev_cseti + use mld_c_base_aggregator_mod + use mld_c_dec_aggregator_mod + use mld_c_symdec_aggregator_mod use mld_c_jac_smoother use mld_c_as_smoother use mld_c_diag_solver @@ -182,12 +185,31 @@ subroutine mld_c_base_onelev_cseti(lv,what,val,info,pos) case ('PAR_AGGR_ALG') lv%parms%par_aggr_alg = val - + if (allocated(lv%aggr)) then + call lv%aggr%free(info) + if (info == 0) deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = psb_err_internal_error_ + return + end if + end if + + select case(val) + case(mld_dec_aggr_) + allocate(mld_c_dec_aggregator_type :: lv%aggr, stat=info) + case(mld_sym_dec_aggr_) + allocate(mld_c_symdec_aggregator_type :: lv%aggr, stat=info) + case default + info = psb_err_internal_error_ + end select + if (info == psb_success_) call lv%aggr%default() + case ('AGGR_ORD') lv%parms%aggr_ord = val case ('AGGR_TYPE') lv%parms%aggr_type = val + if (allocated(lv%aggr)) call lv%aggr%set_aggr_type(lv%parms,info) case ('AGGR_PROL') lv%parms%aggr_prol = val diff --git a/mlprec/impl/level/mld_c_base_onelev_csetr.f90 b/mlprec/impl/level/mld_c_base_onelev_csetr.f90 index fea5cef9..922496dd 100644 --- a/mlprec/impl/level/mld_c_base_onelev_csetr.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_descr.f90 b/mlprec/impl/level/mld_c_base_onelev_descr.f90 index 5dc4d610..f271be0c 100644 --- a/mlprec/impl/level/mld_c_base_onelev_descr.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -66,9 +66,18 @@ subroutine mld_c_base_onelev_descr(lv,il,nl,ilmin,info,iout) write(iout_,*) if (il == ilmin) then - call lv%parms%mldescr(iout_,info) + call lv%parms%mlcycledsc(iout_,info) + if (allocated(lv%aggr)) then + call lv%aggr%descr(lv%parms,iout_,info) + else + write(iout_,*) 'Internal error: unallocated aggregator object' + info = psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if write(iout_,*) end if + if (il > 1) then if (coarse) then diff --git a/mlprec/impl/level/mld_c_base_onelev_dump.f90 b/mlprec/impl/level/mld_c_base_onelev_dump.f90 index 52453416..5416dd63 100644 --- a/mlprec/impl/level/mld_c_base_onelev_dump.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_dump.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_free.f90 b/mlprec/impl/level/mld_c_base_onelev_free.f90 index ae07b13e..e480e012 100644 --- a/mlprec/impl/level/mld_c_base_onelev_free.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_c_lev_aggrmat_asb.f90 b/mlprec/impl/level/mld_c_base_onelev_mat_asb.f90 similarity index 80% rename from mlprec/impl/mld_c_lev_aggrmat_asb.f90 rename to mlprec/impl/level/mld_c_base_onelev_mat_asb.f90 index ee9f8803..0985cb35 100644 --- a/mlprec/impl/mld_c_lev_aggrmat_asb.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_mat_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,9 +35,9 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_c_lev_aggrmat_asb.f90 +! File: mld_c_onelev_mat_asb.f90 ! -! Subroutine: mld_c_lev_aggrmat_asb +! Subroutine: mld_c_onelev_mat_asb ! Version: complex ! ! This routine builds the matrix associated to the current level of the @@ -83,16 +83,16 @@ ! info - integer, output. ! Error code. ! -subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) +subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod use mld_base_prec_type - use mld_c_inner_mod, mld_protect_name => mld_c_lev_aggrmat_asb + use mld_c_onelev_mod, mld_protect_name => mld_c_base_onelev_mat_asb implicit none ! Arguments - type(mld_c_onelev_type), intent(inout), target :: p + class(mld_c_onelev_type), intent(inout), target :: lv type(psb_cspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(inout) :: ilaggr(:),nlaggr(:) @@ -101,7 +101,7 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! Local variables - character(len=20) :: name + character(len=24) :: name integer(psb_mpk_) :: ictxt, np, me integer(psb_ipk_) :: err_act type(psb_cspmat_type) :: ac, op_restr @@ -110,7 +110,7 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) integer(psb_ipk_) :: nzl, ntaggr integer(psb_ipk_) :: debug_level, debug_unit - name='mld_c_lev_aggrmat_asb' + name='mld_c_onelev_mat_asb' if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() @@ -119,25 +119,25 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ictxt = desc_a%get_context() call psb_info(ictxt,me,np) - call mld_check_def(p%parms%aggr_prol,'Smoother',& + call mld_check_def(lv%parms%aggr_prol,'Smoother',& & mld_smooth_prol_,is_legal_ml_aggr_prol) - call mld_check_def(p%parms%coarse_mat,'Coarse matrix',& + call mld_check_def(lv%parms%coarse_mat,'Coarse matrix',& & mld_distr_mat_,is_legal_ml_coarse_mat) - call mld_check_def(p%parms%aggr_filter,'Use filtered matrix',& + call mld_check_def(lv%parms%aggr_filter,'Use filtered matrix',& & mld_no_filter_mat_,is_legal_aggr_filter) - call mld_check_def(p%parms%aggr_omega_alg,'Omega Alg.',& + call mld_check_def(lv%parms%aggr_omega_alg,'Omega Alg.',& & mld_eig_est_,is_legal_ml_aggr_omega_alg) - call mld_check_def(p%parms%aggr_eig,'Eigenvalue estimate',& + call mld_check_def(lv%parms%aggr_eig,'Eigenvalue estimate',& & mld_max_norm_,is_legal_ml_aggr_eig) - call mld_check_def(p%parms%aggr_omega_val,'Omega',szero,is_legal_s_omega) + call mld_check_def(lv%parms%aggr_omega_val,'Omega',szero,is_legal_s_omega) ! ! Build the coarse-level matrix from the fine-level one, starting from ! the mapping defined by mld_aggrmap_bld and applying the aggregation - ! algorithm specified by p%iprcparm(mld_aggr_prol_) + ! algorithm specified by lv%iprcparm(mld_aggr_prol_) ! - call mld_caggrmat_asb(a,desc_a,ilaggr,nlaggr,p%parms,ac,op_prol,op_restr,info) + call lv%aggr%mat_asb(lv%parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb') @@ -149,31 +149,31 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ntaggr = sum(nlaggr) - select case(p%parms%coarse_mat) + select case(lv%parms%coarse_mat) case(mld_distr_mat_) call ac%mv_to(bcoo) nzl = bcoo%get_nzeros() - if (info == psb_success_) call psb_cdall(ictxt,p%desc_ac,info,nl=nlaggr(me+1)) - if (info == psb_success_) call psb_cdins(nzl,bcoo%ia,bcoo%ja,p%desc_ac,info) - if (info == psb_success_) call psb_cdasb(p%desc_ac,info) - if (info == psb_success_) call psb_glob_to_loc(bcoo%ia(1:nzl),p%desc_ac,info,iact='I') - if (info == psb_success_) call psb_glob_to_loc(bcoo%ja(1:nzl),p%desc_ac,info,iact='I') + if (info == psb_success_) call psb_cdall(ictxt,lv%desc_ac,info,nl=nlaggr(me+1)) + if (info == psb_success_) call psb_cdins(nzl,bcoo%ia,bcoo%ja,lv%desc_ac,info) + if (info == psb_success_) call psb_cdasb(lv%desc_ac,info) + if (info == psb_success_) call psb_glob_to_loc(bcoo%ia(1:nzl),lv%desc_ac,info,iact='I') + if (info == psb_success_) call psb_glob_to_loc(bcoo%ja(1:nzl),lv%desc_ac,info,iact='I') if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='Creating p%desc_ac and converting ac') + & a_err='Creating lv%desc_ac and converting ac') goto 9999 end if if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Assembld aux descr. distr.' - call p%ac%mv_from(bcoo) + call lv%ac%mv_from(bcoo) - call p%ac%set_nrows(p%desc_ac%get_local_rows()) - call p%ac%set_ncols(p%desc_ac%get_local_cols()) - call p%ac%set_asb() + call lv%ac%set_nrows(lv%desc_ac%get_local_rows()) + call lv%ac%set_ncols(lv%desc_ac%get_local_cols()) + call lv%ac%set_asb() if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_sp_free') @@ -183,20 +183,20 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) if (np>1) then call op_prol%mv_to(acsr1) nzl = acsr1%get_nzeros() - call psb_glob_to_loc(acsr1%ja(1:nzl),p%desc_ac,info,'I') + call psb_glob_to_loc(acsr1%ja(1:nzl),lv%desc_ac,info,'I') if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_glob_to_loc') goto 9999 end if call op_prol%mv_from(acsr1) endif - call op_prol%set_ncols(p%desc_ac%get_local_cols()) + call op_prol%set_ncols(lv%desc_ac%get_local_cols()) if (np>1) then call op_restr%cscnv(info,type='coo',dupl=psb_dupl_add_) call op_restr%mv_to(acoo) nzl = acoo%get_nzeros() - if (info == psb_success_) call psb_glob_to_loc(acoo%ia(1:nzl),p%desc_ac,info,'I') + if (info == psb_success_) call psb_glob_to_loc(acoo%ia(1:nzl),lv%desc_ac,info,'I') call acoo%set_dupl(psb_dupl_add_) if (info == psb_success_) call op_restr%mv_from(acoo) if (info == psb_success_) call op_restr%cscnv(info,type='csr') @@ -209,7 +209,7 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! ! Clip to local rows. ! - call op_restr%set_nrows(p%desc_ac%get_local_rows()) + call op_restr%set_nrows(lv%desc_ac%get_local_rows()) if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& @@ -218,10 +218,10 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) case(mld_repl_mat_) ! ! - call psb_cdall(ictxt,p%desc_ac,info,mg=ntaggr,repl=.true.) - if (info == psb_success_) call psb_cdasb(p%desc_ac,info) + call psb_cdall(ictxt,lv%desc_ac,info,mg=ntaggr,repl=.true.) + if (info == psb_success_) call psb_cdasb(lv%desc_ac,info) if (info == psb_success_) & - & call psb_gather(p%ac,ac,p%desc_ac,info,dupl=psb_dupl_add_,keeploc=.false.) + & call psb_gather(lv%ac,ac,lv%desc_ac,info,dupl=psb_dupl_add_,keeploc=.false.) if (info /= psb_success_) goto 9999 @@ -231,7 +231,7 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) goto 9999 end select - call p%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) + call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') goto 9999 @@ -243,8 +243,8 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! op_prol => PR i.e. prolongation operator ! - p%map = psb_linmap(psb_map_aggr_,desc_a,& - & p%desc_ac,op_restr,op_prol,ilaggr,nlaggr) + lv%map = psb_linmap(psb_map_aggr_,desc_a,& + & lv%desc_ac,op_restr,op_prol,ilaggr,nlaggr) if (info == psb_success_) call op_prol%free() if (info == psb_success_) call op_restr%free() if(info /= psb_success_) then @@ -255,8 +255,8 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! Fix the base_a and base_desc pointers for handling of residuals. ! This is correct because this routine is only called at levels >=2. ! - p%base_a => p%ac - p%base_desc => p%desc_ac + lv%base_a => lv%ac + lv%base_desc => lv%desc_ac call psb_erractionrestore(err_act) return @@ -264,4 +264,4 @@ subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) 9999 call psb_error_handler(err_act) return -end subroutine mld_c_lev_aggrmat_asb +end subroutine mld_c_base_onelev_mat_asb diff --git a/mlprec/impl/level/mld_c_base_onelev_setag.f90 b/mlprec/impl/level/mld_c_base_onelev_setag.f90 new file mode 100644 index 00000000..25da1459 --- /dev/null +++ b/mlprec/impl/level/mld_c_base_onelev_setag.f90 @@ -0,0 +1,81 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +subroutine mld_c_base_onelev_setag(lv,val,info,pos) + + use psb_base_mod + use mld_c_onelev_mod, mld_protect_name => mld_c_base_onelev_setag + + implicit none + + ! Arguments + class(mld_c_onelev_type), target, intent(inout) :: lv + class(mld_c_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + + ! Local variables + integer(psb_ipk_) :: ipos_ + character(len=*), parameter :: name='mld_base_onelev_setag' + + info = psb_success_ + + ! Ignore pos for aggregator + + if (allocated(lv%aggr)) then + if (.not.same_type_as(lv%aggr,val)) then + call lv%aggr%free(info) + deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = 3111 + return + end if + end if + end if + + if (.not.allocated(lv%aggr)) then + allocate(lv%aggr,mold=val,stat=info) + if (info /= 0) then + info = 3111 + return + end if + lv%parms%par_aggr_alg = mld_ext_aggr_ + lv%parms%aggr_type = mld_noalg_ + end if + +end subroutine mld_c_base_onelev_setag + diff --git a/mlprec/impl/level/mld_c_base_onelev_setc.f90 b/mlprec/impl/level/mld_c_base_onelev_setc.f90 index 93dac171..93b8ff9c 100644 --- a/mlprec/impl/level/mld_c_base_onelev_setc.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_seti.F90 b/mlprec/impl/level/mld_c_base_onelev_seti.F90 index a85df1e5..534915cc 100644 --- a/mlprec/impl/level/mld_c_base_onelev_seti.F90 +++ b/mlprec/impl/level/mld_c_base_onelev_seti.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -39,6 +39,9 @@ subroutine mld_c_base_onelev_seti(lv,what,val,info,pos) use psb_base_mod use mld_c_onelev_mod, mld_protect_name => mld_c_base_onelev_seti + use mld_c_base_aggregator_mod + use mld_c_dec_aggregator_mod + use mld_c_symdec_aggregator_mod use mld_c_jac_smoother use mld_c_as_smoother use mld_c_diag_solver @@ -116,7 +119,7 @@ subroutine mld_c_base_onelev_seti(lv,what,val,info,pos) case (mld_fbgs_) call lv%set(mld_c_jac_smoother_mold,info,pos='pre') if (info == 0) call lv%set(mld_c_gs_solver_mold,info,pos='pre') - call lv%set(mld_c_jac_smoother_mold,info,pos='post') + if (info == 0) call lv%set(mld_c_jac_smoother_mold,info,pos='post') if (info == 0) call lv%set(mld_c_bwgs_solver_mold,info,pos='post') @@ -182,12 +185,31 @@ subroutine mld_c_base_onelev_seti(lv,what,val,info,pos) case (mld_par_aggr_alg_) lv%parms%par_aggr_alg = val + if (allocated(lv%aggr)) then + call lv%aggr%free(info) + if (info == 0) deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = psb_err_internal_error_ + return + end if + end if + + select case(val) + case(mld_dec_aggr_) + allocate(mld_c_dec_aggregator_type :: lv%aggr, stat=info) + case(mld_sym_dec_aggr_) + allocate(mld_c_symdec_aggregator_type :: lv%aggr, stat=info) + case default + info = psb_err_internal_error_ + end select + if (info == psb_success_) call lv%aggr%default() case (mld_aggr_ord_) lv%parms%aggr_ord = val case (mld_aggr_type_) lv%parms%aggr_type = val + if (allocated(lv%aggr)) call lv%aggr%set_aggr_type(lv%parms,info) case (mld_aggr_prol_) lv%parms%aggr_prol = val diff --git a/mlprec/impl/level/mld_c_base_onelev_setr.f90 b/mlprec/impl/level/mld_c_base_onelev_setr.f90 index 86c39ef3..adfd71ba 100644 --- a/mlprec/impl/level/mld_c_base_onelev_setr.f90 +++ b/mlprec/impl/level/mld_c_base_onelev_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_setsm.F90 b/mlprec/impl/level/mld_c_base_onelev_setsm.F90 index 6d970405..5f95daf7 100644 --- a/mlprec/impl/level/mld_c_base_onelev_setsm.F90 +++ b/mlprec/impl/level/mld_c_base_onelev_setsm.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_c_base_onelev_setsv.F90 b/mlprec/impl/level/mld_c_base_onelev_setsv.F90 index 4beb8b7b..16530915 100644 --- a/mlprec/impl/level/mld_c_base_onelev_setsv.F90 +++ b/mlprec/impl/level/mld_c_base_onelev_setsv.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_build.f90 b/mlprec/impl/level/mld_d_base_onelev_build.f90 index fe15bbb9..11e7fb5d 100644 --- a/mlprec/impl/level/mld_d_base_onelev_build.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_build.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_check.f90 b/mlprec/impl/level/mld_d_base_onelev_check.f90 index f1a871c8..65c58a16 100644 --- a/mlprec/impl/level/mld_d_base_onelev_check.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_cnv.f90 b/mlprec/impl/level/mld_d_base_onelev_cnv.f90 index d965c265..23ff2c26 100644 --- a/mlprec/impl/level/mld_d_base_onelev_cnv.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_csetc.f90 b/mlprec/impl/level/mld_d_base_onelev_csetc.f90 index 23e2416e..1ac67d26 100644 --- a/mlprec/impl/level/mld_d_base_onelev_csetc.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_cseti.F90 b/mlprec/impl/level/mld_d_base_onelev_cseti.F90 index 713a31da..d76c5b59 100644 --- a/mlprec/impl/level/mld_d_base_onelev_cseti.F90 +++ b/mlprec/impl/level/mld_d_base_onelev_cseti.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -39,6 +39,9 @@ subroutine mld_d_base_onelev_cseti(lv,what,val,info,pos) use psb_base_mod use mld_d_onelev_mod, mld_protect_name => mld_d_base_onelev_cseti + use mld_d_base_aggregator_mod + use mld_d_dec_aggregator_mod + use mld_d_symdec_aggregator_mod use mld_d_jac_smoother use mld_d_as_smoother use mld_d_diag_solver @@ -202,12 +205,31 @@ subroutine mld_d_base_onelev_cseti(lv,what,val,info,pos) case ('PAR_AGGR_ALG') lv%parms%par_aggr_alg = val - + if (allocated(lv%aggr)) then + call lv%aggr%free(info) + if (info == 0) deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = psb_err_internal_error_ + return + end if + end if + + select case(val) + case(mld_dec_aggr_) + allocate(mld_d_dec_aggregator_type :: lv%aggr, stat=info) + case(mld_sym_dec_aggr_) + allocate(mld_d_symdec_aggregator_type :: lv%aggr, stat=info) + case default + info = psb_err_internal_error_ + end select + if (info == psb_success_) call lv%aggr%default() + case ('AGGR_ORD') lv%parms%aggr_ord = val case ('AGGR_TYPE') lv%parms%aggr_type = val + if (allocated(lv%aggr)) call lv%aggr%set_aggr_type(lv%parms,info) case ('AGGR_PROL') lv%parms%aggr_prol = val diff --git a/mlprec/impl/level/mld_d_base_onelev_csetr.f90 b/mlprec/impl/level/mld_d_base_onelev_csetr.f90 index 91af2d19..33f5a5a5 100644 --- a/mlprec/impl/level/mld_d_base_onelev_csetr.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_descr.f90 b/mlprec/impl/level/mld_d_base_onelev_descr.f90 index fdee2e93..6ca546df 100644 --- a/mlprec/impl/level/mld_d_base_onelev_descr.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -66,9 +66,18 @@ subroutine mld_d_base_onelev_descr(lv,il,nl,ilmin,info,iout) write(iout_,*) if (il == ilmin) then - call lv%parms%mldescr(iout_,info) + call lv%parms%mlcycledsc(iout_,info) + if (allocated(lv%aggr)) then + call lv%aggr%descr(lv%parms,iout_,info) + else + write(iout_,*) 'Internal error: unallocated aggregator object' + info = psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if write(iout_,*) end if + if (il > 1) then if (coarse) then diff --git a/mlprec/impl/level/mld_d_base_onelev_dump.f90 b/mlprec/impl/level/mld_d_base_onelev_dump.f90 index 24e08b47..36b59197 100644 --- a/mlprec/impl/level/mld_d_base_onelev_dump.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_dump.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_free.f90 b/mlprec/impl/level/mld_d_base_onelev_free.f90 index 68d44e74..24947988 100644 --- a/mlprec/impl/level/mld_d_base_onelev_free.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_d_lev_aggrmat_asb.f90 b/mlprec/impl/level/mld_d_base_onelev_mat_asb.f90 similarity index 80% rename from mlprec/impl/mld_d_lev_aggrmat_asb.f90 rename to mlprec/impl/level/mld_d_base_onelev_mat_asb.f90 index 14b8c26d..381a3225 100644 --- a/mlprec/impl/mld_d_lev_aggrmat_asb.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_mat_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,9 +35,9 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_d_lev_aggrmat_asb.f90 +! File: mld_d_onelev_mat_asb.f90 ! -! Subroutine: mld_d_lev_aggrmat_asb +! Subroutine: mld_d_onelev_mat_asb ! Version: real ! ! This routine builds the matrix associated to the current level of the @@ -83,16 +83,16 @@ ! info - integer, output. ! Error code. ! -subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) +subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod use mld_base_prec_type - use mld_d_inner_mod, mld_protect_name => mld_d_lev_aggrmat_asb + use mld_d_onelev_mod, mld_protect_name => mld_d_base_onelev_mat_asb implicit none ! Arguments - type(mld_d_onelev_type), intent(inout), target :: p + class(mld_d_onelev_type), intent(inout), target :: lv type(psb_dspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(inout) :: ilaggr(:),nlaggr(:) @@ -101,7 +101,7 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! Local variables - character(len=20) :: name + character(len=24) :: name integer(psb_mpk_) :: ictxt, np, me integer(psb_ipk_) :: err_act type(psb_dspmat_type) :: ac, op_restr @@ -110,7 +110,7 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) integer(psb_ipk_) :: nzl, ntaggr integer(psb_ipk_) :: debug_level, debug_unit - name='mld_d_lev_aggrmat_asb' + name='mld_d_onelev_mat_asb' if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() @@ -119,25 +119,25 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ictxt = desc_a%get_context() call psb_info(ictxt,me,np) - call mld_check_def(p%parms%aggr_prol,'Smoother',& + call mld_check_def(lv%parms%aggr_prol,'Smoother',& & mld_smooth_prol_,is_legal_ml_aggr_prol) - call mld_check_def(p%parms%coarse_mat,'Coarse matrix',& + call mld_check_def(lv%parms%coarse_mat,'Coarse matrix',& & mld_distr_mat_,is_legal_ml_coarse_mat) - call mld_check_def(p%parms%aggr_filter,'Use filtered matrix',& + call mld_check_def(lv%parms%aggr_filter,'Use filtered matrix',& & mld_no_filter_mat_,is_legal_aggr_filter) - call mld_check_def(p%parms%aggr_omega_alg,'Omega Alg.',& + call mld_check_def(lv%parms%aggr_omega_alg,'Omega Alg.',& & mld_eig_est_,is_legal_ml_aggr_omega_alg) - call mld_check_def(p%parms%aggr_eig,'Eigenvalue estimate',& + call mld_check_def(lv%parms%aggr_eig,'Eigenvalue estimate',& & mld_max_norm_,is_legal_ml_aggr_eig) - call mld_check_def(p%parms%aggr_omega_val,'Omega',dzero,is_legal_d_omega) + call mld_check_def(lv%parms%aggr_omega_val,'Omega',dzero,is_legal_d_omega) ! ! Build the coarse-level matrix from the fine-level one, starting from ! the mapping defined by mld_aggrmap_bld and applying the aggregation - ! algorithm specified by p%iprcparm(mld_aggr_prol_) + ! algorithm specified by lv%iprcparm(mld_aggr_prol_) ! - call mld_daggrmat_asb(a,desc_a,ilaggr,nlaggr,p%parms,ac,op_prol,op_restr,info) + call lv%aggr%mat_asb(lv%parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb') @@ -149,31 +149,31 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ntaggr = sum(nlaggr) - select case(p%parms%coarse_mat) + select case(lv%parms%coarse_mat) case(mld_distr_mat_) call ac%mv_to(bcoo) nzl = bcoo%get_nzeros() - if (info == psb_success_) call psb_cdall(ictxt,p%desc_ac,info,nl=nlaggr(me+1)) - if (info == psb_success_) call psb_cdins(nzl,bcoo%ia,bcoo%ja,p%desc_ac,info) - if (info == psb_success_) call psb_cdasb(p%desc_ac,info) - if (info == psb_success_) call psb_glob_to_loc(bcoo%ia(1:nzl),p%desc_ac,info,iact='I') - if (info == psb_success_) call psb_glob_to_loc(bcoo%ja(1:nzl),p%desc_ac,info,iact='I') + if (info == psb_success_) call psb_cdall(ictxt,lv%desc_ac,info,nl=nlaggr(me+1)) + if (info == psb_success_) call psb_cdins(nzl,bcoo%ia,bcoo%ja,lv%desc_ac,info) + if (info == psb_success_) call psb_cdasb(lv%desc_ac,info) + if (info == psb_success_) call psb_glob_to_loc(bcoo%ia(1:nzl),lv%desc_ac,info,iact='I') + if (info == psb_success_) call psb_glob_to_loc(bcoo%ja(1:nzl),lv%desc_ac,info,iact='I') if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='Creating p%desc_ac and converting ac') + & a_err='Creating lv%desc_ac and converting ac') goto 9999 end if if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Assembld aux descr. distr.' - call p%ac%mv_from(bcoo) + call lv%ac%mv_from(bcoo) - call p%ac%set_nrows(p%desc_ac%get_local_rows()) - call p%ac%set_ncols(p%desc_ac%get_local_cols()) - call p%ac%set_asb() + call lv%ac%set_nrows(lv%desc_ac%get_local_rows()) + call lv%ac%set_ncols(lv%desc_ac%get_local_cols()) + call lv%ac%set_asb() if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_sp_free') @@ -183,20 +183,20 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) if (np>1) then call op_prol%mv_to(acsr1) nzl = acsr1%get_nzeros() - call psb_glob_to_loc(acsr1%ja(1:nzl),p%desc_ac,info,'I') + call psb_glob_to_loc(acsr1%ja(1:nzl),lv%desc_ac,info,'I') if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_glob_to_loc') goto 9999 end if call op_prol%mv_from(acsr1) endif - call op_prol%set_ncols(p%desc_ac%get_local_cols()) + call op_prol%set_ncols(lv%desc_ac%get_local_cols()) if (np>1) then call op_restr%cscnv(info,type='coo',dupl=psb_dupl_add_) call op_restr%mv_to(acoo) nzl = acoo%get_nzeros() - if (info == psb_success_) call psb_glob_to_loc(acoo%ia(1:nzl),p%desc_ac,info,'I') + if (info == psb_success_) call psb_glob_to_loc(acoo%ia(1:nzl),lv%desc_ac,info,'I') call acoo%set_dupl(psb_dupl_add_) if (info == psb_success_) call op_restr%mv_from(acoo) if (info == psb_success_) call op_restr%cscnv(info,type='csr') @@ -209,7 +209,7 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! ! Clip to local rows. ! - call op_restr%set_nrows(p%desc_ac%get_local_rows()) + call op_restr%set_nrows(lv%desc_ac%get_local_rows()) if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& @@ -218,10 +218,10 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) case(mld_repl_mat_) ! ! - call psb_cdall(ictxt,p%desc_ac,info,mg=ntaggr,repl=.true.) - if (info == psb_success_) call psb_cdasb(p%desc_ac,info) + call psb_cdall(ictxt,lv%desc_ac,info,mg=ntaggr,repl=.true.) + if (info == psb_success_) call psb_cdasb(lv%desc_ac,info) if (info == psb_success_) & - & call psb_gather(p%ac,ac,p%desc_ac,info,dupl=psb_dupl_add_,keeploc=.false.) + & call psb_gather(lv%ac,ac,lv%desc_ac,info,dupl=psb_dupl_add_,keeploc=.false.) if (info /= psb_success_) goto 9999 @@ -231,7 +231,7 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) goto 9999 end select - call p%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) + call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') goto 9999 @@ -243,8 +243,8 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! op_prol => PR i.e. prolongation operator ! - p%map = psb_linmap(psb_map_aggr_,desc_a,& - & p%desc_ac,op_restr,op_prol,ilaggr,nlaggr) + lv%map = psb_linmap(psb_map_aggr_,desc_a,& + & lv%desc_ac,op_restr,op_prol,ilaggr,nlaggr) if (info == psb_success_) call op_prol%free() if (info == psb_success_) call op_restr%free() if(info /= psb_success_) then @@ -255,8 +255,8 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! Fix the base_a and base_desc pointers for handling of residuals. ! This is correct because this routine is only called at levels >=2. ! - p%base_a => p%ac - p%base_desc => p%desc_ac + lv%base_a => lv%ac + lv%base_desc => lv%desc_ac call psb_erractionrestore(err_act) return @@ -264,4 +264,4 @@ subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) 9999 call psb_error_handler(err_act) return -end subroutine mld_d_lev_aggrmat_asb +end subroutine mld_d_base_onelev_mat_asb diff --git a/mlprec/impl/level/mld_d_base_onelev_setag.f90 b/mlprec/impl/level/mld_d_base_onelev_setag.f90 new file mode 100644 index 00000000..c4c26cca --- /dev/null +++ b/mlprec/impl/level/mld_d_base_onelev_setag.f90 @@ -0,0 +1,81 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +subroutine mld_d_base_onelev_setag(lv,val,info,pos) + + use psb_base_mod + use mld_d_onelev_mod, mld_protect_name => mld_d_base_onelev_setag + + implicit none + + ! Arguments + class(mld_d_onelev_type), target, intent(inout) :: lv + class(mld_d_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + + ! Local variables + integer(psb_ipk_) :: ipos_ + character(len=*), parameter :: name='mld_base_onelev_setag' + + info = psb_success_ + + ! Ignore pos for aggregator + + if (allocated(lv%aggr)) then + if (.not.same_type_as(lv%aggr,val)) then + call lv%aggr%free(info) + deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = 3111 + return + end if + end if + end if + + if (.not.allocated(lv%aggr)) then + allocate(lv%aggr,mold=val,stat=info) + if (info /= 0) then + info = 3111 + return + end if + lv%parms%par_aggr_alg = mld_ext_aggr_ + lv%parms%aggr_type = mld_noalg_ + end if + +end subroutine mld_d_base_onelev_setag + diff --git a/mlprec/impl/level/mld_d_base_onelev_setc.f90 b/mlprec/impl/level/mld_d_base_onelev_setc.f90 index d5002cc3..4b5f633b 100644 --- a/mlprec/impl/level/mld_d_base_onelev_setc.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_seti.F90 b/mlprec/impl/level/mld_d_base_onelev_seti.F90 index 8fbe0ecc..d68f2ec6 100644 --- a/mlprec/impl/level/mld_d_base_onelev_seti.F90 +++ b/mlprec/impl/level/mld_d_base_onelev_seti.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -39,6 +39,9 @@ subroutine mld_d_base_onelev_seti(lv,what,val,info,pos) use psb_base_mod use mld_d_onelev_mod, mld_protect_name => mld_d_base_onelev_seti + use mld_d_base_aggregator_mod + use mld_d_dec_aggregator_mod + use mld_d_symdec_aggregator_mod use mld_d_jac_smoother use mld_d_as_smoother use mld_d_diag_solver @@ -128,7 +131,7 @@ subroutine mld_d_base_onelev_seti(lv,what,val,info,pos) case (mld_fbgs_) call lv%set(mld_d_jac_smoother_mold,info,pos='pre') if (info == 0) call lv%set(mld_d_gs_solver_mold,info,pos='pre') - call lv%set(mld_d_jac_smoother_mold,info,pos='post') + if (info == 0) call lv%set(mld_d_jac_smoother_mold,info,pos='post') if (info == 0) call lv%set(mld_d_bwgs_solver_mold,info,pos='post') @@ -202,12 +205,31 @@ subroutine mld_d_base_onelev_seti(lv,what,val,info,pos) case (mld_par_aggr_alg_) lv%parms%par_aggr_alg = val + if (allocated(lv%aggr)) then + call lv%aggr%free(info) + if (info == 0) deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = psb_err_internal_error_ + return + end if + end if + + select case(val) + case(mld_dec_aggr_) + allocate(mld_d_dec_aggregator_type :: lv%aggr, stat=info) + case(mld_sym_dec_aggr_) + allocate(mld_d_symdec_aggregator_type :: lv%aggr, stat=info) + case default + info = psb_err_internal_error_ + end select + if (info == psb_success_) call lv%aggr%default() case (mld_aggr_ord_) lv%parms%aggr_ord = val case (mld_aggr_type_) lv%parms%aggr_type = val + if (allocated(lv%aggr)) call lv%aggr%set_aggr_type(lv%parms,info) case (mld_aggr_prol_) lv%parms%aggr_prol = val diff --git a/mlprec/impl/level/mld_d_base_onelev_setr.f90 b/mlprec/impl/level/mld_d_base_onelev_setr.f90 index 4c28095c..dfd96da7 100644 --- a/mlprec/impl/level/mld_d_base_onelev_setr.f90 +++ b/mlprec/impl/level/mld_d_base_onelev_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_setsm.F90 b/mlprec/impl/level/mld_d_base_onelev_setsm.F90 index 5f5227eb..cc9d526b 100644 --- a/mlprec/impl/level/mld_d_base_onelev_setsm.F90 +++ b/mlprec/impl/level/mld_d_base_onelev_setsm.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_d_base_onelev_setsv.F90 b/mlprec/impl/level/mld_d_base_onelev_setsv.F90 index d6e1f2e6..65f219ca 100644 --- a/mlprec/impl/level/mld_d_base_onelev_setsv.F90 +++ b/mlprec/impl/level/mld_d_base_onelev_setsv.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_build.f90 b/mlprec/impl/level/mld_s_base_onelev_build.f90 index fdba5976..3e71496d 100644 --- a/mlprec/impl/level/mld_s_base_onelev_build.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_build.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_check.f90 b/mlprec/impl/level/mld_s_base_onelev_check.f90 index 9fe3959f..ffa4c70d 100644 --- a/mlprec/impl/level/mld_s_base_onelev_check.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_cnv.f90 b/mlprec/impl/level/mld_s_base_onelev_cnv.f90 index b518676b..89a3d087 100644 --- a/mlprec/impl/level/mld_s_base_onelev_cnv.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_csetc.f90 b/mlprec/impl/level/mld_s_base_onelev_csetc.f90 index 5950034c..2443b4e5 100644 --- a/mlprec/impl/level/mld_s_base_onelev_csetc.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_cseti.F90 b/mlprec/impl/level/mld_s_base_onelev_cseti.F90 index 0a0ed792..8ca26b54 100644 --- a/mlprec/impl/level/mld_s_base_onelev_cseti.F90 +++ b/mlprec/impl/level/mld_s_base_onelev_cseti.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -39,6 +39,9 @@ subroutine mld_s_base_onelev_cseti(lv,what,val,info,pos) use psb_base_mod use mld_s_onelev_mod, mld_protect_name => mld_s_base_onelev_cseti + use mld_s_base_aggregator_mod + use mld_s_dec_aggregator_mod + use mld_s_symdec_aggregator_mod use mld_s_jac_smoother use mld_s_as_smoother use mld_s_diag_solver @@ -182,12 +185,31 @@ subroutine mld_s_base_onelev_cseti(lv,what,val,info,pos) case ('PAR_AGGR_ALG') lv%parms%par_aggr_alg = val - + if (allocated(lv%aggr)) then + call lv%aggr%free(info) + if (info == 0) deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = psb_err_internal_error_ + return + end if + end if + + select case(val) + case(mld_dec_aggr_) + allocate(mld_s_dec_aggregator_type :: lv%aggr, stat=info) + case(mld_sym_dec_aggr_) + allocate(mld_s_symdec_aggregator_type :: lv%aggr, stat=info) + case default + info = psb_err_internal_error_ + end select + if (info == psb_success_) call lv%aggr%default() + case ('AGGR_ORD') lv%parms%aggr_ord = val case ('AGGR_TYPE') lv%parms%aggr_type = val + if (allocated(lv%aggr)) call lv%aggr%set_aggr_type(lv%parms,info) case ('AGGR_PROL') lv%parms%aggr_prol = val diff --git a/mlprec/impl/level/mld_s_base_onelev_csetr.f90 b/mlprec/impl/level/mld_s_base_onelev_csetr.f90 index a010d029..f75849cc 100644 --- a/mlprec/impl/level/mld_s_base_onelev_csetr.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_descr.f90 b/mlprec/impl/level/mld_s_base_onelev_descr.f90 index 3ae878f0..5c09e28b 100644 --- a/mlprec/impl/level/mld_s_base_onelev_descr.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -66,9 +66,18 @@ subroutine mld_s_base_onelev_descr(lv,il,nl,ilmin,info,iout) write(iout_,*) if (il == ilmin) then - call lv%parms%mldescr(iout_,info) + call lv%parms%mlcycledsc(iout_,info) + if (allocated(lv%aggr)) then + call lv%aggr%descr(lv%parms,iout_,info) + else + write(iout_,*) 'Internal error: unallocated aggregator object' + info = psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if write(iout_,*) end if + if (il > 1) then if (coarse) then diff --git a/mlprec/impl/level/mld_s_base_onelev_dump.f90 b/mlprec/impl/level/mld_s_base_onelev_dump.f90 index a4fca5eb..df93abe4 100644 --- a/mlprec/impl/level/mld_s_base_onelev_dump.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_dump.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_free.f90 b/mlprec/impl/level/mld_s_base_onelev_free.f90 index 2cca2125..89588074 100644 --- a/mlprec/impl/level/mld_s_base_onelev_free.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_s_lev_aggrmat_asb.f90 b/mlprec/impl/level/mld_s_base_onelev_mat_asb.f90 similarity index 80% rename from mlprec/impl/mld_s_lev_aggrmat_asb.f90 rename to mlprec/impl/level/mld_s_base_onelev_mat_asb.f90 index e7b2150a..7f6319cb 100644 --- a/mlprec/impl/mld_s_lev_aggrmat_asb.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_mat_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,9 +35,9 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_s_lev_aggrmat_asb.f90 +! File: mld_s_onelev_mat_asb.f90 ! -! Subroutine: mld_s_lev_aggrmat_asb +! Subroutine: mld_s_onelev_mat_asb ! Version: real ! ! This routine builds the matrix associated to the current level of the @@ -83,16 +83,16 @@ ! info - integer, output. ! Error code. ! -subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) +subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod use mld_base_prec_type - use mld_s_inner_mod, mld_protect_name => mld_s_lev_aggrmat_asb + use mld_s_onelev_mod, mld_protect_name => mld_s_base_onelev_mat_asb implicit none ! Arguments - type(mld_s_onelev_type), intent(inout), target :: p + class(mld_s_onelev_type), intent(inout), target :: lv type(psb_sspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(inout) :: ilaggr(:),nlaggr(:) @@ -101,7 +101,7 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! Local variables - character(len=20) :: name + character(len=24) :: name integer(psb_mpk_) :: ictxt, np, me integer(psb_ipk_) :: err_act type(psb_sspmat_type) :: ac, op_restr @@ -110,7 +110,7 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) integer(psb_ipk_) :: nzl, ntaggr integer(psb_ipk_) :: debug_level, debug_unit - name='mld_s_lev_aggrmat_asb' + name='mld_s_onelev_mat_asb' if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() @@ -119,25 +119,25 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ictxt = desc_a%get_context() call psb_info(ictxt,me,np) - call mld_check_def(p%parms%aggr_prol,'Smoother',& + call mld_check_def(lv%parms%aggr_prol,'Smoother',& & mld_smooth_prol_,is_legal_ml_aggr_prol) - call mld_check_def(p%parms%coarse_mat,'Coarse matrix',& + call mld_check_def(lv%parms%coarse_mat,'Coarse matrix',& & mld_distr_mat_,is_legal_ml_coarse_mat) - call mld_check_def(p%parms%aggr_filter,'Use filtered matrix',& + call mld_check_def(lv%parms%aggr_filter,'Use filtered matrix',& & mld_no_filter_mat_,is_legal_aggr_filter) - call mld_check_def(p%parms%aggr_omega_alg,'Omega Alg.',& + call mld_check_def(lv%parms%aggr_omega_alg,'Omega Alg.',& & mld_eig_est_,is_legal_ml_aggr_omega_alg) - call mld_check_def(p%parms%aggr_eig,'Eigenvalue estimate',& + call mld_check_def(lv%parms%aggr_eig,'Eigenvalue estimate',& & mld_max_norm_,is_legal_ml_aggr_eig) - call mld_check_def(p%parms%aggr_omega_val,'Omega',szero,is_legal_s_omega) + call mld_check_def(lv%parms%aggr_omega_val,'Omega',szero,is_legal_s_omega) ! ! Build the coarse-level matrix from the fine-level one, starting from ! the mapping defined by mld_aggrmap_bld and applying the aggregation - ! algorithm specified by p%iprcparm(mld_aggr_prol_) + ! algorithm specified by lv%iprcparm(mld_aggr_prol_) ! - call mld_saggrmat_asb(a,desc_a,ilaggr,nlaggr,p%parms,ac,op_prol,op_restr,info) + call lv%aggr%mat_asb(lv%parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb') @@ -149,31 +149,31 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ntaggr = sum(nlaggr) - select case(p%parms%coarse_mat) + select case(lv%parms%coarse_mat) case(mld_distr_mat_) call ac%mv_to(bcoo) nzl = bcoo%get_nzeros() - if (info == psb_success_) call psb_cdall(ictxt,p%desc_ac,info,nl=nlaggr(me+1)) - if (info == psb_success_) call psb_cdins(nzl,bcoo%ia,bcoo%ja,p%desc_ac,info) - if (info == psb_success_) call psb_cdasb(p%desc_ac,info) - if (info == psb_success_) call psb_glob_to_loc(bcoo%ia(1:nzl),p%desc_ac,info,iact='I') - if (info == psb_success_) call psb_glob_to_loc(bcoo%ja(1:nzl),p%desc_ac,info,iact='I') + if (info == psb_success_) call psb_cdall(ictxt,lv%desc_ac,info,nl=nlaggr(me+1)) + if (info == psb_success_) call psb_cdins(nzl,bcoo%ia,bcoo%ja,lv%desc_ac,info) + if (info == psb_success_) call psb_cdasb(lv%desc_ac,info) + if (info == psb_success_) call psb_glob_to_loc(bcoo%ia(1:nzl),lv%desc_ac,info,iact='I') + if (info == psb_success_) call psb_glob_to_loc(bcoo%ja(1:nzl),lv%desc_ac,info,iact='I') if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='Creating p%desc_ac and converting ac') + & a_err='Creating lv%desc_ac and converting ac') goto 9999 end if if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Assembld aux descr. distr.' - call p%ac%mv_from(bcoo) + call lv%ac%mv_from(bcoo) - call p%ac%set_nrows(p%desc_ac%get_local_rows()) - call p%ac%set_ncols(p%desc_ac%get_local_cols()) - call p%ac%set_asb() + call lv%ac%set_nrows(lv%desc_ac%get_local_rows()) + call lv%ac%set_ncols(lv%desc_ac%get_local_cols()) + call lv%ac%set_asb() if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_sp_free') @@ -183,20 +183,20 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) if (np>1) then call op_prol%mv_to(acsr1) nzl = acsr1%get_nzeros() - call psb_glob_to_loc(acsr1%ja(1:nzl),p%desc_ac,info,'I') + call psb_glob_to_loc(acsr1%ja(1:nzl),lv%desc_ac,info,'I') if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_glob_to_loc') goto 9999 end if call op_prol%mv_from(acsr1) endif - call op_prol%set_ncols(p%desc_ac%get_local_cols()) + call op_prol%set_ncols(lv%desc_ac%get_local_cols()) if (np>1) then call op_restr%cscnv(info,type='coo',dupl=psb_dupl_add_) call op_restr%mv_to(acoo) nzl = acoo%get_nzeros() - if (info == psb_success_) call psb_glob_to_loc(acoo%ia(1:nzl),p%desc_ac,info,'I') + if (info == psb_success_) call psb_glob_to_loc(acoo%ia(1:nzl),lv%desc_ac,info,'I') call acoo%set_dupl(psb_dupl_add_) if (info == psb_success_) call op_restr%mv_from(acoo) if (info == psb_success_) call op_restr%cscnv(info,type='csr') @@ -209,7 +209,7 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! ! Clip to local rows. ! - call op_restr%set_nrows(p%desc_ac%get_local_rows()) + call op_restr%set_nrows(lv%desc_ac%get_local_rows()) if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& @@ -218,10 +218,10 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) case(mld_repl_mat_) ! ! - call psb_cdall(ictxt,p%desc_ac,info,mg=ntaggr,repl=.true.) - if (info == psb_success_) call psb_cdasb(p%desc_ac,info) + call psb_cdall(ictxt,lv%desc_ac,info,mg=ntaggr,repl=.true.) + if (info == psb_success_) call psb_cdasb(lv%desc_ac,info) if (info == psb_success_) & - & call psb_gather(p%ac,ac,p%desc_ac,info,dupl=psb_dupl_add_,keeploc=.false.) + & call psb_gather(lv%ac,ac,lv%desc_ac,info,dupl=psb_dupl_add_,keeploc=.false.) if (info /= psb_success_) goto 9999 @@ -231,7 +231,7 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) goto 9999 end select - call p%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) + call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') goto 9999 @@ -243,8 +243,8 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! op_prol => PR i.e. prolongation operator ! - p%map = psb_linmap(psb_map_aggr_,desc_a,& - & p%desc_ac,op_restr,op_prol,ilaggr,nlaggr) + lv%map = psb_linmap(psb_map_aggr_,desc_a,& + & lv%desc_ac,op_restr,op_prol,ilaggr,nlaggr) if (info == psb_success_) call op_prol%free() if (info == psb_success_) call op_restr%free() if(info /= psb_success_) then @@ -255,8 +255,8 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! Fix the base_a and base_desc pointers for handling of residuals. ! This is correct because this routine is only called at levels >=2. ! - p%base_a => p%ac - p%base_desc => p%desc_ac + lv%base_a => lv%ac + lv%base_desc => lv%desc_ac call psb_erractionrestore(err_act) return @@ -264,4 +264,4 @@ subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) 9999 call psb_error_handler(err_act) return -end subroutine mld_s_lev_aggrmat_asb +end subroutine mld_s_base_onelev_mat_asb diff --git a/mlprec/impl/level/mld_s_base_onelev_setag.f90 b/mlprec/impl/level/mld_s_base_onelev_setag.f90 new file mode 100644 index 00000000..36bf2871 --- /dev/null +++ b/mlprec/impl/level/mld_s_base_onelev_setag.f90 @@ -0,0 +1,81 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +subroutine mld_s_base_onelev_setag(lv,val,info,pos) + + use psb_base_mod + use mld_s_onelev_mod, mld_protect_name => mld_s_base_onelev_setag + + implicit none + + ! Arguments + class(mld_s_onelev_type), target, intent(inout) :: lv + class(mld_s_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + + ! Local variables + integer(psb_ipk_) :: ipos_ + character(len=*), parameter :: name='mld_base_onelev_setag' + + info = psb_success_ + + ! Ignore pos for aggregator + + if (allocated(lv%aggr)) then + if (.not.same_type_as(lv%aggr,val)) then + call lv%aggr%free(info) + deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = 3111 + return + end if + end if + end if + + if (.not.allocated(lv%aggr)) then + allocate(lv%aggr,mold=val,stat=info) + if (info /= 0) then + info = 3111 + return + end if + lv%parms%par_aggr_alg = mld_ext_aggr_ + lv%parms%aggr_type = mld_noalg_ + end if + +end subroutine mld_s_base_onelev_setag + diff --git a/mlprec/impl/level/mld_s_base_onelev_setc.f90 b/mlprec/impl/level/mld_s_base_onelev_setc.f90 index 099412d5..1093ce9a 100644 --- a/mlprec/impl/level/mld_s_base_onelev_setc.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_seti.F90 b/mlprec/impl/level/mld_s_base_onelev_seti.F90 index d5e34645..7d12cf9b 100644 --- a/mlprec/impl/level/mld_s_base_onelev_seti.F90 +++ b/mlprec/impl/level/mld_s_base_onelev_seti.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -39,6 +39,9 @@ subroutine mld_s_base_onelev_seti(lv,what,val,info,pos) use psb_base_mod use mld_s_onelev_mod, mld_protect_name => mld_s_base_onelev_seti + use mld_s_base_aggregator_mod + use mld_s_dec_aggregator_mod + use mld_s_symdec_aggregator_mod use mld_s_jac_smoother use mld_s_as_smoother use mld_s_diag_solver @@ -116,7 +119,7 @@ subroutine mld_s_base_onelev_seti(lv,what,val,info,pos) case (mld_fbgs_) call lv%set(mld_s_jac_smoother_mold,info,pos='pre') if (info == 0) call lv%set(mld_s_gs_solver_mold,info,pos='pre') - call lv%set(mld_s_jac_smoother_mold,info,pos='post') + if (info == 0) call lv%set(mld_s_jac_smoother_mold,info,pos='post') if (info == 0) call lv%set(mld_s_bwgs_solver_mold,info,pos='post') @@ -182,12 +185,31 @@ subroutine mld_s_base_onelev_seti(lv,what,val,info,pos) case (mld_par_aggr_alg_) lv%parms%par_aggr_alg = val + if (allocated(lv%aggr)) then + call lv%aggr%free(info) + if (info == 0) deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = psb_err_internal_error_ + return + end if + end if + + select case(val) + case(mld_dec_aggr_) + allocate(mld_s_dec_aggregator_type :: lv%aggr, stat=info) + case(mld_sym_dec_aggr_) + allocate(mld_s_symdec_aggregator_type :: lv%aggr, stat=info) + case default + info = psb_err_internal_error_ + end select + if (info == psb_success_) call lv%aggr%default() case (mld_aggr_ord_) lv%parms%aggr_ord = val case (mld_aggr_type_) lv%parms%aggr_type = val + if (allocated(lv%aggr)) call lv%aggr%set_aggr_type(lv%parms,info) case (mld_aggr_prol_) lv%parms%aggr_prol = val diff --git a/mlprec/impl/level/mld_s_base_onelev_setr.f90 b/mlprec/impl/level/mld_s_base_onelev_setr.f90 index 874785a1..2aeee09c 100644 --- a/mlprec/impl/level/mld_s_base_onelev_setr.f90 +++ b/mlprec/impl/level/mld_s_base_onelev_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_setsm.F90 b/mlprec/impl/level/mld_s_base_onelev_setsm.F90 index 4d2a34e9..30cba813 100644 --- a/mlprec/impl/level/mld_s_base_onelev_setsm.F90 +++ b/mlprec/impl/level/mld_s_base_onelev_setsm.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_s_base_onelev_setsv.F90 b/mlprec/impl/level/mld_s_base_onelev_setsv.F90 index 4036194e..cbc4cacf 100644 --- a/mlprec/impl/level/mld_s_base_onelev_setsv.F90 +++ b/mlprec/impl/level/mld_s_base_onelev_setsv.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_build.f90 b/mlprec/impl/level/mld_z_base_onelev_build.f90 index 5a01daac..9c444715 100644 --- a/mlprec/impl/level/mld_z_base_onelev_build.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_build.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_check.f90 b/mlprec/impl/level/mld_z_base_onelev_check.f90 index 5cfb4656..74f48256 100644 --- a/mlprec/impl/level/mld_z_base_onelev_check.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_cnv.f90 b/mlprec/impl/level/mld_z_base_onelev_cnv.f90 index 758d4503..407fca8d 100644 --- a/mlprec/impl/level/mld_z_base_onelev_cnv.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_csetc.f90 b/mlprec/impl/level/mld_z_base_onelev_csetc.f90 index ad68e3c2..a09be534 100644 --- a/mlprec/impl/level/mld_z_base_onelev_csetc.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_cseti.F90 b/mlprec/impl/level/mld_z_base_onelev_cseti.F90 index 2cf24546..bee8ba2b 100644 --- a/mlprec/impl/level/mld_z_base_onelev_cseti.F90 +++ b/mlprec/impl/level/mld_z_base_onelev_cseti.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -39,6 +39,9 @@ subroutine mld_z_base_onelev_cseti(lv,what,val,info,pos) use psb_base_mod use mld_z_onelev_mod, mld_protect_name => mld_z_base_onelev_cseti + use mld_z_base_aggregator_mod + use mld_z_dec_aggregator_mod + use mld_z_symdec_aggregator_mod use mld_z_jac_smoother use mld_z_as_smoother use mld_z_diag_solver @@ -202,12 +205,31 @@ subroutine mld_z_base_onelev_cseti(lv,what,val,info,pos) case ('PAR_AGGR_ALG') lv%parms%par_aggr_alg = val - + if (allocated(lv%aggr)) then + call lv%aggr%free(info) + if (info == 0) deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = psb_err_internal_error_ + return + end if + end if + + select case(val) + case(mld_dec_aggr_) + allocate(mld_z_dec_aggregator_type :: lv%aggr, stat=info) + case(mld_sym_dec_aggr_) + allocate(mld_z_symdec_aggregator_type :: lv%aggr, stat=info) + case default + info = psb_err_internal_error_ + end select + if (info == psb_success_) call lv%aggr%default() + case ('AGGR_ORD') lv%parms%aggr_ord = val case ('AGGR_TYPE') lv%parms%aggr_type = val + if (allocated(lv%aggr)) call lv%aggr%set_aggr_type(lv%parms,info) case ('AGGR_PROL') lv%parms%aggr_prol = val diff --git a/mlprec/impl/level/mld_z_base_onelev_csetr.f90 b/mlprec/impl/level/mld_z_base_onelev_csetr.f90 index f7914ee0..28a7d61a 100644 --- a/mlprec/impl/level/mld_z_base_onelev_csetr.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_descr.f90 b/mlprec/impl/level/mld_z_base_onelev_descr.f90 index 80053e38..7ec9e91f 100644 --- a/mlprec/impl/level/mld_z_base_onelev_descr.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -66,9 +66,18 @@ subroutine mld_z_base_onelev_descr(lv,il,nl,ilmin,info,iout) write(iout_,*) if (il == ilmin) then - call lv%parms%mldescr(iout_,info) + call lv%parms%mlcycledsc(iout_,info) + if (allocated(lv%aggr)) then + call lv%aggr%descr(lv%parms,iout_,info) + else + write(iout_,*) 'Internal error: unallocated aggregator object' + info = psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if write(iout_,*) end if + if (il > 1) then if (coarse) then diff --git a/mlprec/impl/level/mld_z_base_onelev_dump.f90 b/mlprec/impl/level/mld_z_base_onelev_dump.f90 index ecceb0f6..c1181e97 100644 --- a/mlprec/impl/level/mld_z_base_onelev_dump.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_dump.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_free.f90 b/mlprec/impl/level/mld_z_base_onelev_free.f90 index 15fe3d0d..4e09b7f0 100644 --- a/mlprec/impl/level/mld_z_base_onelev_free.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_z_lev_aggrmat_asb.f90 b/mlprec/impl/level/mld_z_base_onelev_mat_asb.f90 similarity index 80% rename from mlprec/impl/mld_z_lev_aggrmat_asb.f90 rename to mlprec/impl/level/mld_z_base_onelev_mat_asb.f90 index 82e6a60d..190896fa 100644 --- a/mlprec/impl/mld_z_lev_aggrmat_asb.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_mat_asb.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,9 +35,9 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_z_lev_aggrmat_asb.f90 +! File: mld_z_onelev_mat_asb.f90 ! -! Subroutine: mld_z_lev_aggrmat_asb +! Subroutine: mld_z_onelev_mat_asb ! Version: complex ! ! This routine builds the matrix associated to the current level of the @@ -83,16 +83,16 @@ ! info - integer, output. ! Error code. ! -subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) +subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) use psb_base_mod use mld_base_prec_type - use mld_z_inner_mod, mld_protect_name => mld_z_lev_aggrmat_asb + use mld_z_onelev_mod, mld_protect_name => mld_z_base_onelev_mat_asb implicit none ! Arguments - type(mld_z_onelev_type), intent(inout), target :: p + class(mld_z_onelev_type), intent(inout), target :: lv type(psb_zspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(inout) :: ilaggr(:),nlaggr(:) @@ -101,7 +101,7 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! Local variables - character(len=20) :: name + character(len=24) :: name integer(psb_mpk_) :: ictxt, np, me integer(psb_ipk_) :: err_act type(psb_zspmat_type) :: ac, op_restr @@ -110,7 +110,7 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) integer(psb_ipk_) :: nzl, ntaggr integer(psb_ipk_) :: debug_level, debug_unit - name='mld_z_lev_aggrmat_asb' + name='mld_z_onelev_mat_asb' if (psb_get_errstatus().ne.0) return call psb_erractionsave(err_act) debug_unit = psb_get_debug_unit() @@ -119,25 +119,25 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ictxt = desc_a%get_context() call psb_info(ictxt,me,np) - call mld_check_def(p%parms%aggr_prol,'Smoother',& + call mld_check_def(lv%parms%aggr_prol,'Smoother',& & mld_smooth_prol_,is_legal_ml_aggr_prol) - call mld_check_def(p%parms%coarse_mat,'Coarse matrix',& + call mld_check_def(lv%parms%coarse_mat,'Coarse matrix',& & mld_distr_mat_,is_legal_ml_coarse_mat) - call mld_check_def(p%parms%aggr_filter,'Use filtered matrix',& + call mld_check_def(lv%parms%aggr_filter,'Use filtered matrix',& & mld_no_filter_mat_,is_legal_aggr_filter) - call mld_check_def(p%parms%aggr_omega_alg,'Omega Alg.',& + call mld_check_def(lv%parms%aggr_omega_alg,'Omega Alg.',& & mld_eig_est_,is_legal_ml_aggr_omega_alg) - call mld_check_def(p%parms%aggr_eig,'Eigenvalue estimate',& + call mld_check_def(lv%parms%aggr_eig,'Eigenvalue estimate',& & mld_max_norm_,is_legal_ml_aggr_eig) - call mld_check_def(p%parms%aggr_omega_val,'Omega',dzero,is_legal_d_omega) + call mld_check_def(lv%parms%aggr_omega_val,'Omega',dzero,is_legal_d_omega) ! ! Build the coarse-level matrix from the fine-level one, starting from ! the mapping defined by mld_aggrmap_bld and applying the aggregation - ! algorithm specified by p%iprcparm(mld_aggr_prol_) + ! algorithm specified by lv%iprcparm(mld_aggr_prol_) ! - call mld_zaggrmat_asb(a,desc_a,ilaggr,nlaggr,p%parms,ac,op_prol,op_restr,info) + call lv%aggr%mat_asb(lv%parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_aggrmat_asb') @@ -149,31 +149,31 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ntaggr = sum(nlaggr) - select case(p%parms%coarse_mat) + select case(lv%parms%coarse_mat) case(mld_distr_mat_) call ac%mv_to(bcoo) nzl = bcoo%get_nzeros() - if (info == psb_success_) call psb_cdall(ictxt,p%desc_ac,info,nl=nlaggr(me+1)) - if (info == psb_success_) call psb_cdins(nzl,bcoo%ia,bcoo%ja,p%desc_ac,info) - if (info == psb_success_) call psb_cdasb(p%desc_ac,info) - if (info == psb_success_) call psb_glob_to_loc(bcoo%ia(1:nzl),p%desc_ac,info,iact='I') - if (info == psb_success_) call psb_glob_to_loc(bcoo%ja(1:nzl),p%desc_ac,info,iact='I') + if (info == psb_success_) call psb_cdall(ictxt,lv%desc_ac,info,nl=nlaggr(me+1)) + if (info == psb_success_) call psb_cdins(nzl,bcoo%ia,bcoo%ja,lv%desc_ac,info) + if (info == psb_success_) call psb_cdasb(lv%desc_ac,info) + if (info == psb_success_) call psb_glob_to_loc(bcoo%ia(1:nzl),lv%desc_ac,info,iact='I') + if (info == psb_success_) call psb_glob_to_loc(bcoo%ja(1:nzl),lv%desc_ac,info,iact='I') if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='Creating p%desc_ac and converting ac') + & a_err='Creating lv%desc_ac and converting ac') goto 9999 end if if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& & 'Assembld aux descr. distr.' - call p%ac%mv_from(bcoo) + call lv%ac%mv_from(bcoo) - call p%ac%set_nrows(p%desc_ac%get_local_rows()) - call p%ac%set_ncols(p%desc_ac%get_local_cols()) - call p%ac%set_asb() + call lv%ac%set_nrows(lv%desc_ac%get_local_rows()) + call lv%ac%set_ncols(lv%desc_ac%get_local_cols()) + call lv%ac%set_asb() if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_sp_free') @@ -183,20 +183,20 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) if (np>1) then call op_prol%mv_to(acsr1) nzl = acsr1%get_nzeros() - call psb_glob_to_loc(acsr1%ja(1:nzl),p%desc_ac,info,'I') + call psb_glob_to_loc(acsr1%ja(1:nzl),lv%desc_ac,info,'I') if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_glob_to_loc') goto 9999 end if call op_prol%mv_from(acsr1) endif - call op_prol%set_ncols(p%desc_ac%get_local_cols()) + call op_prol%set_ncols(lv%desc_ac%get_local_cols()) if (np>1) then call op_restr%cscnv(info,type='coo',dupl=psb_dupl_add_) call op_restr%mv_to(acoo) nzl = acoo%get_nzeros() - if (info == psb_success_) call psb_glob_to_loc(acoo%ia(1:nzl),p%desc_ac,info,'I') + if (info == psb_success_) call psb_glob_to_loc(acoo%ia(1:nzl),lv%desc_ac,info,'I') call acoo%set_dupl(psb_dupl_add_) if (info == psb_success_) call op_restr%mv_from(acoo) if (info == psb_success_) call op_restr%cscnv(info,type='csr') @@ -209,7 +209,7 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! ! Clip to local rows. ! - call op_restr%set_nrows(p%desc_ac%get_local_rows()) + call op_restr%set_nrows(lv%desc_ac%get_local_rows()) if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& @@ -218,10 +218,10 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) case(mld_repl_mat_) ! ! - call psb_cdall(ictxt,p%desc_ac,info,mg=ntaggr,repl=.true.) - if (info == psb_success_) call psb_cdasb(p%desc_ac,info) + call psb_cdall(ictxt,lv%desc_ac,info,mg=ntaggr,repl=.true.) + if (info == psb_success_) call psb_cdasb(lv%desc_ac,info) if (info == psb_success_) & - & call psb_gather(p%ac,ac,p%desc_ac,info,dupl=psb_dupl_add_,keeploc=.false.) + & call psb_gather(lv%ac,ac,lv%desc_ac,info,dupl=psb_dupl_add_,keeploc=.false.) if (info /= psb_success_) goto 9999 @@ -231,7 +231,7 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) goto 9999 end select - call p%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) + call lv%ac%cscnv(info,type='csr',dupl=psb_dupl_add_) if(info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv') goto 9999 @@ -243,8 +243,8 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! op_prol => PR i.e. prolongation operator ! - p%map = psb_linmap(psb_map_aggr_,desc_a,& - & p%desc_ac,op_restr,op_prol,ilaggr,nlaggr) + lv%map = psb_linmap(psb_map_aggr_,desc_a,& + & lv%desc_ac,op_restr,op_prol,ilaggr,nlaggr) if (info == psb_success_) call op_prol%free() if (info == psb_success_) call op_restr%free() if(info /= psb_success_) then @@ -255,8 +255,8 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) ! Fix the base_a and base_desc pointers for handling of residuals. ! This is correct because this routine is only called at levels >=2. ! - p%base_a => p%ac - p%base_desc => p%desc_ac + lv%base_a => lv%ac + lv%base_desc => lv%desc_ac call psb_erractionrestore(err_act) return @@ -264,4 +264,4 @@ subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) 9999 call psb_error_handler(err_act) return -end subroutine mld_z_lev_aggrmat_asb +end subroutine mld_z_base_onelev_mat_asb diff --git a/mlprec/impl/level/mld_z_base_onelev_setag.f90 b/mlprec/impl/level/mld_z_base_onelev_setag.f90 new file mode 100644 index 00000000..e6c7d51b --- /dev/null +++ b/mlprec/impl/level/mld_z_base_onelev_setag.f90 @@ -0,0 +1,81 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +subroutine mld_z_base_onelev_setag(lv,val,info,pos) + + use psb_base_mod + use mld_z_onelev_mod, mld_protect_name => mld_z_base_onelev_setag + + implicit none + + ! Arguments + class(mld_z_onelev_type), target, intent(inout) :: lv + class(mld_z_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + + ! Local variables + integer(psb_ipk_) :: ipos_ + character(len=*), parameter :: name='mld_base_onelev_setag' + + info = psb_success_ + + ! Ignore pos for aggregator + + if (allocated(lv%aggr)) then + if (.not.same_type_as(lv%aggr,val)) then + call lv%aggr%free(info) + deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = 3111 + return + end if + end if + end if + + if (.not.allocated(lv%aggr)) then + allocate(lv%aggr,mold=val,stat=info) + if (info /= 0) then + info = 3111 + return + end if + lv%parms%par_aggr_alg = mld_ext_aggr_ + lv%parms%aggr_type = mld_noalg_ + end if + +end subroutine mld_z_base_onelev_setag + diff --git a/mlprec/impl/level/mld_z_base_onelev_setc.f90 b/mlprec/impl/level/mld_z_base_onelev_setc.f90 index 24490ca3..137ee584 100644 --- a/mlprec/impl/level/mld_z_base_onelev_setc.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_seti.F90 b/mlprec/impl/level/mld_z_base_onelev_seti.F90 index 488d8845..bfba8765 100644 --- a/mlprec/impl/level/mld_z_base_onelev_seti.F90 +++ b/mlprec/impl/level/mld_z_base_onelev_seti.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -39,6 +39,9 @@ subroutine mld_z_base_onelev_seti(lv,what,val,info,pos) use psb_base_mod use mld_z_onelev_mod, mld_protect_name => mld_z_base_onelev_seti + use mld_z_base_aggregator_mod + use mld_z_dec_aggregator_mod + use mld_z_symdec_aggregator_mod use mld_z_jac_smoother use mld_z_as_smoother use mld_z_diag_solver @@ -128,7 +131,7 @@ subroutine mld_z_base_onelev_seti(lv,what,val,info,pos) case (mld_fbgs_) call lv%set(mld_z_jac_smoother_mold,info,pos='pre') if (info == 0) call lv%set(mld_z_gs_solver_mold,info,pos='pre') - call lv%set(mld_z_jac_smoother_mold,info,pos='post') + if (info == 0) call lv%set(mld_z_jac_smoother_mold,info,pos='post') if (info == 0) call lv%set(mld_z_bwgs_solver_mold,info,pos='post') @@ -202,12 +205,31 @@ subroutine mld_z_base_onelev_seti(lv,what,val,info,pos) case (mld_par_aggr_alg_) lv%parms%par_aggr_alg = val + if (allocated(lv%aggr)) then + call lv%aggr%free(info) + if (info == 0) deallocate(lv%aggr,stat=info) + if (info /= 0) then + info = psb_err_internal_error_ + return + end if + end if + + select case(val) + case(mld_dec_aggr_) + allocate(mld_z_dec_aggregator_type :: lv%aggr, stat=info) + case(mld_sym_dec_aggr_) + allocate(mld_z_symdec_aggregator_type :: lv%aggr, stat=info) + case default + info = psb_err_internal_error_ + end select + if (info == psb_success_) call lv%aggr%default() case (mld_aggr_ord_) lv%parms%aggr_ord = val case (mld_aggr_type_) lv%parms%aggr_type = val + if (allocated(lv%aggr)) call lv%aggr%set_aggr_type(lv%parms,info) case (mld_aggr_prol_) lv%parms%aggr_prol = val diff --git a/mlprec/impl/level/mld_z_base_onelev_setr.f90 b/mlprec/impl/level/mld_z_base_onelev_setr.f90 index c6ac932b..f2303e41 100644 --- a/mlprec/impl/level/mld_z_base_onelev_setr.f90 +++ b/mlprec/impl/level/mld_z_base_onelev_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_setsm.F90 b/mlprec/impl/level/mld_z_base_onelev_setsm.F90 index c42a309a..4f2081ef 100644 --- a/mlprec/impl/level/mld_z_base_onelev_setsm.F90 +++ b/mlprec/impl/level/mld_z_base_onelev_setsm.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/level/mld_z_base_onelev_setsv.F90 b/mlprec/impl/level/mld_z_base_onelev_setsv.F90 index 7a8dce05..30c68af4 100644 --- a/mlprec/impl/level/mld_z_base_onelev_setsv.F90 +++ b/mlprec/impl/level/mld_z_base_onelev_setsv.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_c_extprol_bld.f90 b/mlprec/impl/mld_c_extprol_bld.f90 index 100afe6e..f28e1556 100644 --- a/mlprec/impl/mld_c_extprol_bld.f90 +++ b/mlprec/impl/mld_c_extprol_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,9 +35,9 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_c_hierarchy_bld.f90 +! File: mld_c_extprol_bld.f90 ! -! Subroutine: mld_c_hierarchy_bld +! Subroutine: mld_c_extprol_bld ! Version: real ! ! This routine builds the preconditioner according to the requirements made by @@ -312,7 +312,7 @@ subroutine mld_c_extprol_bld(a,desc_a,p,prolv,restrv,info,amold,vmold,imold) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='Internal hierarchy build' ) + & a_err='Internal extprol build' ) goto 9999 endif diff --git a/mlprec/impl/mld_c_hierarchy_bld.f90 b/mlprec/impl/mld_c_hierarchy_bld.f90 index a3bd0b10..194ad280 100644 --- a/mlprec/impl/mld_c_hierarchy_bld.f90 +++ b/mlprec/impl/mld_c_hierarchy_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -84,6 +84,7 @@ subroutine mld_c_hierarchy_bld(a,desc_a,prec,info) real(psb_spk_) :: mnaggratio, sizeratio, athresh, aomega class(mld_c_base_smoother_type), allocatable :: coarse_sm, base_sm, med_sm, & & base_sm2, med_sm2, coarse_sm2 + class(mld_c_base_aggregator_type), allocatable :: tmp_aggr type(mld_sml_parms) :: baseparms, medparms, coarseparms integer(psb_ipk_), allocatable :: ilaggr(:), nlaggr(:) type(psb_cspmat_type) :: op_prol @@ -216,19 +217,32 @@ subroutine mld_c_hierarchy_bld(a,desc_a,prec,info) allocate(tprecv(nplevs),stat=info) ! First all existing levels if (info == 0) tprecv(1)%parms = baseparms - if (info == 0) call restore_smoothers(tprecv(1),prec%precv(1)%sm,prec%precv(1)%sm2a,info) + if (info == 0) call restore_smoothers(tprecv(1),& + & prec%precv(1)%sm,prec%precv(1)%sm2a,info) + if (info == 0) call move_alloc(prec%precv(1)%aggr,tprecv(1)%aggr) do i=2, min(iszv,nplevs) - 1 if (info == 0) tprecv(i)%parms = medparms - if (info == 0) call restore_smoothers(tprecv(i),prec%precv(i)%sm,prec%precv(i)%sm2a,info) + if (info == 0) call restore_smoothers(tprecv(i),& + & prec%precv(i)%sm,prec%precv(i)%sm2a,info) + if (info == 0) call move_alloc(prec%precv(i)%aggr,tprecv(i)%aggr) end do ! Further intermediates, if any do i=iszv-1, nplevs - 1 if (info == 0) tprecv(i)%parms = medparms if (info == 0) call restore_smoothers(tprecv(i),med_sm,med_sm2,info) + if ((info == 0).and..not.allocated(tprecv(i)%aggr))& + & allocate(tprecv(i)%aggr,source=tprecv(iszv-1)%aggr,stat=info) end do ! Then coarse if (info == 0) tprecv(nplevs)%parms = coarseparms if (info == 0) call restore_smoothers(tprecv(nplevs),coarse_sm,coarse_sm2,info) + if (info == 0) then + if (nplevs <= iszv) then + allocate(tprecv(nplevs)%aggr,source=prec%precv(nplevs)%aggr,stat=info) + else + allocate(tprecv(nplevs)%aggr,source=tprecv(nplevs-1)%aggr,stat=info) + end if + end if if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,& & a_err='prec reallocation') @@ -272,9 +286,10 @@ subroutine mld_c_hierarchy_bld(a,desc_a,prec,info) ! ! Build the mapping between levels i-1 and i and the matrix ! at level i - ! - if (info == psb_success_) call mld_aggrmap_bld(prec%precv(i),& - & prec%precv(i-1)%base_a,prec%precv(i-1)%base_desc,& + ! + if (info == psb_success_)& + & call prec%precv(i)%bld_tprol(prec%precv(i-1)%base_a,& + & prec%precv(i-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) if (info /= psb_success_) then @@ -282,6 +297,7 @@ subroutine mld_c_hierarchy_bld(a,desc_a,prec,info) & a_err='Map build') goto 9999 endif + if (i= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& @@ -346,7 +362,8 @@ subroutine mld_c_hierarchy_bld(a,desc_a,prec,info) prec%precv(newsz)%parms%aggr_thresh = athresh prec%precv(newsz)%parms%aggr_omega_val = aomega - if (info == 0) call restore_smoothers(prec%precv(newsz),coarse_sm,coarse_sm2,info) + if (info == 0) call restore_smoothers(prec%precv(newsz),& + & coarse_sm,coarse_sm2,info) if (newsz < i) then ! ! We are going back and revisit a previous leve; @@ -357,7 +374,7 @@ subroutine mld_c_hierarchy_bld(a,desc_a,prec,info) call prec%precv(newsz)%tprol%clone(op_prol,info) end if - if (info == psb_success_) call mld_lev_mat_asb(prec%precv(newsz),& + if (info == psb_success_) call prec%precv(newsz)%mat_asb( & & prec%precv(newsz-1)%base_a,prec%precv(newsz-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) if (info /= 0) then @@ -367,7 +384,7 @@ subroutine mld_c_hierarchy_bld(a,desc_a,prec,info) endif exit array_build_loop else - if (info == psb_success_) call mld_lev_mat_asb(prec%precv(i),& + if (info == psb_success_) call prec%precv(i)%mat_asb(& & prec%precv(i-1)%base_a,prec%precv(i-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) end if diff --git a/mlprec/impl/mld_c_smoothers_bld.f90 b/mlprec/impl/mld_c_smoothers_bld.f90 index af364381..5fb30db5 100644 --- a/mlprec/impl/mld_c_smoothers_bld.f90 +++ b/mlprec/impl/mld_c_smoothers_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_ccprecset.F90 b/mlprec/impl/mld_ccprecset.F90 index 01a240d3..79bfdd29 100644 --- a/mlprec/impl/mld_ccprecset.F90 +++ b/mlprec/impl/mld_ccprecset.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_cfile_prec_descr.f90 b/mlprec/impl/mld_cfile_prec_descr.f90 index 690480bb..1f243756 100644 --- a/mlprec/impl/mld_cfile_prec_descr.f90 +++ b/mlprec/impl/mld_cfile_prec_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_cmlprec_aply.f90 b/mlprec/impl/mld_cmlprec_aply.f90 index b38b075a..6eac6b97 100644 --- a/mlprec/impl/mld_cmlprec_aply.f90 +++ b/mlprec/impl/mld_cmlprec_aply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_cmlprec_bld.f90 b/mlprec/impl/mld_cmlprec_bld.f90 index d34b157a..4330c49f 100644 --- a/mlprec/impl/mld_cmlprec_bld.f90 +++ b/mlprec/impl/mld_cmlprec_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_cprecaply.f90 b/mlprec/impl/mld_cprecaply.f90 index 170005c2..9ae6fcfd 100644 --- a/mlprec/impl/mld_cprecaply.f90 +++ b/mlprec/impl/mld_cprecaply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_cprecbld.f90 b/mlprec/impl/mld_cprecbld.f90 index 0e2f8e77..66a8cb84 100644 --- a/mlprec/impl/mld_cprecbld.f90 +++ b/mlprec/impl/mld_cprecbld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_cprecinit.F90 b/mlprec/impl/mld_cprecinit.F90 index e6733c3a..236a2e00 100644 --- a/mlprec/impl/mld_cprecinit.F90 +++ b/mlprec/impl/mld_cprecinit.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_cprecset.F90 b/mlprec/impl/mld_cprecset.F90 index d6f8c468..24e2d659 100644 --- a/mlprec/impl/mld_cprecset.F90 +++ b/mlprec/impl/mld_cprecset.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -542,6 +542,70 @@ subroutine mld_cprecsetsv(p,val,info,ilev,ilmax,pos) end subroutine mld_cprecsetsv +subroutine mld_cprecsetag(p,val,info,ilev,ilmax,pos) + + use psb_base_mod + use mld_c_prec_mod, mld_protect_name => mld_cprecsetag + + implicit none + + ! Arguments + class(mld_cprec_type), intent(inout) :: p + class(mld_c_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional, intent(in) :: ilev, ilmax + character(len=*), optional, intent(in) :: pos + + ! Local variables + integer(psb_ipk_) :: ilev_, nlev_, ilmin_, ilmax_ + character(len=*), parameter :: name='mld_precsetag' + + info = psb_success_ + + if (.not.allocated(p%precv)) then + info = 3111 + write(psb_err_unit,*) name,& + & ': Error: uninitialized preconditioner,',& + &' should call MLD_PRECINIT' + return + endif + nlev_ = size(p%precv) + + if (present(ilev)) then + ilev_ = ilev + ilmin_ = ilev + if (present(ilmax)) then + ilmax_ = ilmax + else + ilmax_ = ilev_ + end if + else + ilev_ = 1 + ilmin_ = 1 + ilmax_ = nlev_ + end if + + + if ((ilev_<1).or.(ilev_ > nlev_)) then + info = -1 + write(psb_err_unit,*) name,& + & ': Error: invalid ILEV/NLEV combination',ilev_, nlev_ + return + endif + if ((ilmax_<1).or.(ilmax_ > nlev_)) then + info = -1 + write(psb_err_unit,*) name,& + &': Error: invalid ILMAX/NLEV combination',ilmax_, nlev_ + return + endif + + do ilev_ = ilmin_, ilmax_ + call p%precv(ilev_)%set(val,info,pos=pos) + if (info /= 0) return + end do + +end subroutine mld_cprecsetag + ! ! Subroutine: mld_cprecsetc ! Version: complex diff --git a/mlprec/impl/mld_d_extprol_bld.f90 b/mlprec/impl/mld_d_extprol_bld.f90 index 7a751f29..e7a13942 100644 --- a/mlprec/impl/mld_d_extprol_bld.f90 +++ b/mlprec/impl/mld_d_extprol_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,9 +35,9 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_d_hierarchy_bld.f90 +! File: mld_d_extprol_bld.f90 ! -! Subroutine: mld_d_hierarchy_bld +! Subroutine: mld_d_extprol_bld ! Version: real ! ! This routine builds the preconditioner according to the requirements made by @@ -312,7 +312,7 @@ subroutine mld_d_extprol_bld(a,desc_a,p,prolv,restrv,info,amold,vmold,imold) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='Internal hierarchy build' ) + & a_err='Internal extprol build' ) goto 9999 endif diff --git a/mlprec/impl/mld_d_hierarchy_bld.f90 b/mlprec/impl/mld_d_hierarchy_bld.f90 index 6b68fa58..f1c39939 100644 --- a/mlprec/impl/mld_d_hierarchy_bld.f90 +++ b/mlprec/impl/mld_d_hierarchy_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -84,6 +84,7 @@ subroutine mld_d_hierarchy_bld(a,desc_a,prec,info) real(psb_dpk_) :: mnaggratio, sizeratio, athresh, aomega class(mld_d_base_smoother_type), allocatable :: coarse_sm, base_sm, med_sm, & & base_sm2, med_sm2, coarse_sm2 + class(mld_d_base_aggregator_type), allocatable :: tmp_aggr type(mld_dml_parms) :: baseparms, medparms, coarseparms integer(psb_ipk_), allocatable :: ilaggr(:), nlaggr(:) type(psb_dspmat_type) :: op_prol @@ -216,19 +217,32 @@ subroutine mld_d_hierarchy_bld(a,desc_a,prec,info) allocate(tprecv(nplevs),stat=info) ! First all existing levels if (info == 0) tprecv(1)%parms = baseparms - if (info == 0) call restore_smoothers(tprecv(1),prec%precv(1)%sm,prec%precv(1)%sm2a,info) + if (info == 0) call restore_smoothers(tprecv(1),& + & prec%precv(1)%sm,prec%precv(1)%sm2a,info) + if (info == 0) call move_alloc(prec%precv(1)%aggr,tprecv(1)%aggr) do i=2, min(iszv,nplevs) - 1 if (info == 0) tprecv(i)%parms = medparms - if (info == 0) call restore_smoothers(tprecv(i),prec%precv(i)%sm,prec%precv(i)%sm2a,info) + if (info == 0) call restore_smoothers(tprecv(i),& + & prec%precv(i)%sm,prec%precv(i)%sm2a,info) + if (info == 0) call move_alloc(prec%precv(i)%aggr,tprecv(i)%aggr) end do ! Further intermediates, if any do i=iszv-1, nplevs - 1 if (info == 0) tprecv(i)%parms = medparms if (info == 0) call restore_smoothers(tprecv(i),med_sm,med_sm2,info) + if ((info == 0).and..not.allocated(tprecv(i)%aggr))& + & allocate(tprecv(i)%aggr,source=tprecv(iszv-1)%aggr,stat=info) end do ! Then coarse if (info == 0) tprecv(nplevs)%parms = coarseparms if (info == 0) call restore_smoothers(tprecv(nplevs),coarse_sm,coarse_sm2,info) + if (info == 0) then + if (nplevs <= iszv) then + allocate(tprecv(nplevs)%aggr,source=prec%precv(nplevs)%aggr,stat=info) + else + allocate(tprecv(nplevs)%aggr,source=tprecv(nplevs-1)%aggr,stat=info) + end if + end if if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,& & a_err='prec reallocation') @@ -272,9 +286,10 @@ subroutine mld_d_hierarchy_bld(a,desc_a,prec,info) ! ! Build the mapping between levels i-1 and i and the matrix ! at level i - ! - if (info == psb_success_) call mld_aggrmap_bld(prec%precv(i),& - & prec%precv(i-1)%base_a,prec%precv(i-1)%base_desc,& + ! + if (info == psb_success_)& + & call prec%precv(i)%bld_tprol(prec%precv(i-1)%base_a,& + & prec%precv(i-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) if (info /= psb_success_) then @@ -282,6 +297,7 @@ subroutine mld_d_hierarchy_bld(a,desc_a,prec,info) & a_err='Map build') goto 9999 endif + if (i= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& @@ -346,7 +362,8 @@ subroutine mld_d_hierarchy_bld(a,desc_a,prec,info) prec%precv(newsz)%parms%aggr_thresh = athresh prec%precv(newsz)%parms%aggr_omega_val = aomega - if (info == 0) call restore_smoothers(prec%precv(newsz),coarse_sm,coarse_sm2,info) + if (info == 0) call restore_smoothers(prec%precv(newsz),& + & coarse_sm,coarse_sm2,info) if (newsz < i) then ! ! We are going back and revisit a previous leve; @@ -357,7 +374,7 @@ subroutine mld_d_hierarchy_bld(a,desc_a,prec,info) call prec%precv(newsz)%tprol%clone(op_prol,info) end if - if (info == psb_success_) call mld_lev_mat_asb(prec%precv(newsz),& + if (info == psb_success_) call prec%precv(newsz)%mat_asb( & & prec%precv(newsz-1)%base_a,prec%precv(newsz-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) if (info /= 0) then @@ -367,7 +384,7 @@ subroutine mld_d_hierarchy_bld(a,desc_a,prec,info) endif exit array_build_loop else - if (info == psb_success_) call mld_lev_mat_asb(prec%precv(i),& + if (info == psb_success_) call prec%precv(i)%mat_asb(& & prec%precv(i-1)%base_a,prec%precv(i-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) end if diff --git a/mlprec/impl/mld_d_smoothers_bld.f90 b/mlprec/impl/mld_d_smoothers_bld.f90 index 81981b45..fbab6abd 100644 --- a/mlprec/impl/mld_d_smoothers_bld.f90 +++ b/mlprec/impl/mld_d_smoothers_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_dcprecset.F90 b/mlprec/impl/mld_dcprecset.F90 index 99776960..7838dea6 100644 --- a/mlprec/impl/mld_dcprecset.F90 +++ b/mlprec/impl/mld_dcprecset.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_dfile_prec_descr.f90 b/mlprec/impl/mld_dfile_prec_descr.f90 index ab5fc662..d129e434 100644 --- a/mlprec/impl/mld_dfile_prec_descr.f90 +++ b/mlprec/impl/mld_dfile_prec_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_dmlprec_aply.f90 b/mlprec/impl/mld_dmlprec_aply.f90 index 601c25a9..98a19c77 100644 --- a/mlprec/impl/mld_dmlprec_aply.f90 +++ b/mlprec/impl/mld_dmlprec_aply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_dmlprec_bld.f90 b/mlprec/impl/mld_dmlprec_bld.f90 index 5ce1fbf4..c19b8799 100644 --- a/mlprec/impl/mld_dmlprec_bld.f90 +++ b/mlprec/impl/mld_dmlprec_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_dprecaply.f90 b/mlprec/impl/mld_dprecaply.f90 index 27e78fc3..07c62d91 100644 --- a/mlprec/impl/mld_dprecaply.f90 +++ b/mlprec/impl/mld_dprecaply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_dprecbld.f90 b/mlprec/impl/mld_dprecbld.f90 index 6f6bd661..447d5a22 100644 --- a/mlprec/impl/mld_dprecbld.f90 +++ b/mlprec/impl/mld_dprecbld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_dprecinit.F90 b/mlprec/impl/mld_dprecinit.F90 index d86c32d4..0699fdd6 100644 --- a/mlprec/impl/mld_dprecinit.F90 +++ b/mlprec/impl/mld_dprecinit.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_dprecset.F90 b/mlprec/impl/mld_dprecset.F90 index da732be5..aa4bf23c 100644 --- a/mlprec/impl/mld_dprecset.F90 +++ b/mlprec/impl/mld_dprecset.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -575,6 +575,70 @@ subroutine mld_dprecsetsv(p,val,info,ilev,ilmax,pos) end subroutine mld_dprecsetsv +subroutine mld_dprecsetag(p,val,info,ilev,ilmax,pos) + + use psb_base_mod + use mld_d_prec_mod, mld_protect_name => mld_dprecsetag + + implicit none + + ! Arguments + class(mld_dprec_type), intent(inout) :: p + class(mld_d_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional, intent(in) :: ilev, ilmax + character(len=*), optional, intent(in) :: pos + + ! Local variables + integer(psb_ipk_) :: ilev_, nlev_, ilmin_, ilmax_ + character(len=*), parameter :: name='mld_precsetag' + + info = psb_success_ + + if (.not.allocated(p%precv)) then + info = 3111 + write(psb_err_unit,*) name,& + & ': Error: uninitialized preconditioner,',& + &' should call MLD_PRECINIT' + return + endif + nlev_ = size(p%precv) + + if (present(ilev)) then + ilev_ = ilev + ilmin_ = ilev + if (present(ilmax)) then + ilmax_ = ilmax + else + ilmax_ = ilev_ + end if + else + ilev_ = 1 + ilmin_ = 1 + ilmax_ = nlev_ + end if + + + if ((ilev_<1).or.(ilev_ > nlev_)) then + info = -1 + write(psb_err_unit,*) name,& + & ': Error: invalid ILEV/NLEV combination',ilev_, nlev_ + return + endif + if ((ilmax_<1).or.(ilmax_ > nlev_)) then + info = -1 + write(psb_err_unit,*) name,& + &': Error: invalid ILMAX/NLEV combination',ilmax_, nlev_ + return + endif + + do ilev_ = ilmin_, ilmax_ + call p%precv(ilev_)%set(val,info,pos=pos) + if (info /= 0) return + end do + +end subroutine mld_dprecsetag + ! ! Subroutine: mld_dprecsetc ! Version: real diff --git a/mlprec/impl/mld_s_extprol_bld.f90 b/mlprec/impl/mld_s_extprol_bld.f90 index 4c880725..4feb6d82 100644 --- a/mlprec/impl/mld_s_extprol_bld.f90 +++ b/mlprec/impl/mld_s_extprol_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,9 +35,9 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_s_hierarchy_bld.f90 +! File: mld_s_extprol_bld.f90 ! -! Subroutine: mld_s_hierarchy_bld +! Subroutine: mld_s_extprol_bld ! Version: real ! ! This routine builds the preconditioner according to the requirements made by @@ -312,7 +312,7 @@ subroutine mld_s_extprol_bld(a,desc_a,p,prolv,restrv,info,amold,vmold,imold) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='Internal hierarchy build' ) + & a_err='Internal extprol build' ) goto 9999 endif diff --git a/mlprec/impl/mld_s_hierarchy_bld.f90 b/mlprec/impl/mld_s_hierarchy_bld.f90 index 28fbf51d..b66f462e 100644 --- a/mlprec/impl/mld_s_hierarchy_bld.f90 +++ b/mlprec/impl/mld_s_hierarchy_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -84,6 +84,7 @@ subroutine mld_s_hierarchy_bld(a,desc_a,prec,info) real(psb_spk_) :: mnaggratio, sizeratio, athresh, aomega class(mld_s_base_smoother_type), allocatable :: coarse_sm, base_sm, med_sm, & & base_sm2, med_sm2, coarse_sm2 + class(mld_s_base_aggregator_type), allocatable :: tmp_aggr type(mld_sml_parms) :: baseparms, medparms, coarseparms integer(psb_ipk_), allocatable :: ilaggr(:), nlaggr(:) type(psb_sspmat_type) :: op_prol @@ -216,19 +217,32 @@ subroutine mld_s_hierarchy_bld(a,desc_a,prec,info) allocate(tprecv(nplevs),stat=info) ! First all existing levels if (info == 0) tprecv(1)%parms = baseparms - if (info == 0) call restore_smoothers(tprecv(1),prec%precv(1)%sm,prec%precv(1)%sm2a,info) + if (info == 0) call restore_smoothers(tprecv(1),& + & prec%precv(1)%sm,prec%precv(1)%sm2a,info) + if (info == 0) call move_alloc(prec%precv(1)%aggr,tprecv(1)%aggr) do i=2, min(iszv,nplevs) - 1 if (info == 0) tprecv(i)%parms = medparms - if (info == 0) call restore_smoothers(tprecv(i),prec%precv(i)%sm,prec%precv(i)%sm2a,info) + if (info == 0) call restore_smoothers(tprecv(i),& + & prec%precv(i)%sm,prec%precv(i)%sm2a,info) + if (info == 0) call move_alloc(prec%precv(i)%aggr,tprecv(i)%aggr) end do ! Further intermediates, if any do i=iszv-1, nplevs - 1 if (info == 0) tprecv(i)%parms = medparms if (info == 0) call restore_smoothers(tprecv(i),med_sm,med_sm2,info) + if ((info == 0).and..not.allocated(tprecv(i)%aggr))& + & allocate(tprecv(i)%aggr,source=tprecv(iszv-1)%aggr,stat=info) end do ! Then coarse if (info == 0) tprecv(nplevs)%parms = coarseparms if (info == 0) call restore_smoothers(tprecv(nplevs),coarse_sm,coarse_sm2,info) + if (info == 0) then + if (nplevs <= iszv) then + allocate(tprecv(nplevs)%aggr,source=prec%precv(nplevs)%aggr,stat=info) + else + allocate(tprecv(nplevs)%aggr,source=tprecv(nplevs-1)%aggr,stat=info) + end if + end if if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,& & a_err='prec reallocation') @@ -272,9 +286,10 @@ subroutine mld_s_hierarchy_bld(a,desc_a,prec,info) ! ! Build the mapping between levels i-1 and i and the matrix ! at level i - ! - if (info == psb_success_) call mld_aggrmap_bld(prec%precv(i),& - & prec%precv(i-1)%base_a,prec%precv(i-1)%base_desc,& + ! + if (info == psb_success_)& + & call prec%precv(i)%bld_tprol(prec%precv(i-1)%base_a,& + & prec%precv(i-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) if (info /= psb_success_) then @@ -282,6 +297,7 @@ subroutine mld_s_hierarchy_bld(a,desc_a,prec,info) & a_err='Map build') goto 9999 endif + if (i= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& @@ -346,7 +362,8 @@ subroutine mld_s_hierarchy_bld(a,desc_a,prec,info) prec%precv(newsz)%parms%aggr_thresh = athresh prec%precv(newsz)%parms%aggr_omega_val = aomega - if (info == 0) call restore_smoothers(prec%precv(newsz),coarse_sm,coarse_sm2,info) + if (info == 0) call restore_smoothers(prec%precv(newsz),& + & coarse_sm,coarse_sm2,info) if (newsz < i) then ! ! We are going back and revisit a previous leve; @@ -357,7 +374,7 @@ subroutine mld_s_hierarchy_bld(a,desc_a,prec,info) call prec%precv(newsz)%tprol%clone(op_prol,info) end if - if (info == psb_success_) call mld_lev_mat_asb(prec%precv(newsz),& + if (info == psb_success_) call prec%precv(newsz)%mat_asb( & & prec%precv(newsz-1)%base_a,prec%precv(newsz-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) if (info /= 0) then @@ -367,7 +384,7 @@ subroutine mld_s_hierarchy_bld(a,desc_a,prec,info) endif exit array_build_loop else - if (info == psb_success_) call mld_lev_mat_asb(prec%precv(i),& + if (info == psb_success_) call prec%precv(i)%mat_asb(& & prec%precv(i-1)%base_a,prec%precv(i-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) end if diff --git a/mlprec/impl/mld_s_smoothers_bld.f90 b/mlprec/impl/mld_s_smoothers_bld.f90 index 9191e791..e5b394bc 100644 --- a/mlprec/impl/mld_s_smoothers_bld.f90 +++ b/mlprec/impl/mld_s_smoothers_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_scprecset.F90 b/mlprec/impl/mld_scprecset.F90 index 2a355989..b887d878 100644 --- a/mlprec/impl/mld_scprecset.F90 +++ b/mlprec/impl/mld_scprecset.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_sfile_prec_descr.f90 b/mlprec/impl/mld_sfile_prec_descr.f90 index 1ce5bd14..c90976e2 100644 --- a/mlprec/impl/mld_sfile_prec_descr.f90 +++ b/mlprec/impl/mld_sfile_prec_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_smlprec_aply.f90 b/mlprec/impl/mld_smlprec_aply.f90 index 5967d42e..c9fef2b5 100644 --- a/mlprec/impl/mld_smlprec_aply.f90 +++ b/mlprec/impl/mld_smlprec_aply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_smlprec_bld.f90 b/mlprec/impl/mld_smlprec_bld.f90 index 442d8240..c22f0035 100644 --- a/mlprec/impl/mld_smlprec_bld.f90 +++ b/mlprec/impl/mld_smlprec_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_sprecaply.f90 b/mlprec/impl/mld_sprecaply.f90 index 79d6d8e3..34d7bee0 100644 --- a/mlprec/impl/mld_sprecaply.f90 +++ b/mlprec/impl/mld_sprecaply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_sprecbld.f90 b/mlprec/impl/mld_sprecbld.f90 index c55d344b..558e506b 100644 --- a/mlprec/impl/mld_sprecbld.f90 +++ b/mlprec/impl/mld_sprecbld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_sprecinit.F90 b/mlprec/impl/mld_sprecinit.F90 index 632f5706..72bd578e 100644 --- a/mlprec/impl/mld_sprecinit.F90 +++ b/mlprec/impl/mld_sprecinit.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_sprecset.F90 b/mlprec/impl/mld_sprecset.F90 index 30e6cc02..3780e959 100644 --- a/mlprec/impl/mld_sprecset.F90 +++ b/mlprec/impl/mld_sprecset.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -542,6 +542,70 @@ subroutine mld_sprecsetsv(p,val,info,ilev,ilmax,pos) end subroutine mld_sprecsetsv +subroutine mld_sprecsetag(p,val,info,ilev,ilmax,pos) + + use psb_base_mod + use mld_s_prec_mod, mld_protect_name => mld_sprecsetag + + implicit none + + ! Arguments + class(mld_sprec_type), intent(inout) :: p + class(mld_s_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional, intent(in) :: ilev, ilmax + character(len=*), optional, intent(in) :: pos + + ! Local variables + integer(psb_ipk_) :: ilev_, nlev_, ilmin_, ilmax_ + character(len=*), parameter :: name='mld_precsetag' + + info = psb_success_ + + if (.not.allocated(p%precv)) then + info = 3111 + write(psb_err_unit,*) name,& + & ': Error: uninitialized preconditioner,',& + &' should call MLD_PRECINIT' + return + endif + nlev_ = size(p%precv) + + if (present(ilev)) then + ilev_ = ilev + ilmin_ = ilev + if (present(ilmax)) then + ilmax_ = ilmax + else + ilmax_ = ilev_ + end if + else + ilev_ = 1 + ilmin_ = 1 + ilmax_ = nlev_ + end if + + + if ((ilev_<1).or.(ilev_ > nlev_)) then + info = -1 + write(psb_err_unit,*) name,& + & ': Error: invalid ILEV/NLEV combination',ilev_, nlev_ + return + endif + if ((ilmax_<1).or.(ilmax_ > nlev_)) then + info = -1 + write(psb_err_unit,*) name,& + &': Error: invalid ILMAX/NLEV combination',ilmax_, nlev_ + return + endif + + do ilev_ = ilmin_, ilmax_ + call p%precv(ilev_)%set(val,info,pos=pos) + if (info /= 0) return + end do + +end subroutine mld_sprecsetag + ! ! Subroutine: mld_sprecsetc ! Version: real diff --git a/mlprec/impl/mld_z_extprol_bld.f90 b/mlprec/impl/mld_z_extprol_bld.f90 index fdba5e6a..95a1ff27 100644 --- a/mlprec/impl/mld_z_extprol_bld.f90 +++ b/mlprec/impl/mld_z_extprol_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -35,9 +35,9 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -! File: mld_z_hierarchy_bld.f90 +! File: mld_z_extprol_bld.f90 ! -! Subroutine: mld_z_hierarchy_bld +! Subroutine: mld_z_extprol_bld ! Version: real ! ! This routine builds the preconditioner according to the requirements made by @@ -312,7 +312,7 @@ subroutine mld_z_extprol_bld(a,desc_a,p,prolv,restrv,info,amold,vmold,imold) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& - & a_err='Internal hierarchy build' ) + & a_err='Internal extprol build' ) goto 9999 endif diff --git a/mlprec/impl/mld_z_hierarchy_bld.f90 b/mlprec/impl/mld_z_hierarchy_bld.f90 index 1c68b7c3..4409f7b4 100644 --- a/mlprec/impl/mld_z_hierarchy_bld.f90 +++ b/mlprec/impl/mld_z_hierarchy_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -84,6 +84,7 @@ subroutine mld_z_hierarchy_bld(a,desc_a,prec,info) real(psb_dpk_) :: mnaggratio, sizeratio, athresh, aomega class(mld_z_base_smoother_type), allocatable :: coarse_sm, base_sm, med_sm, & & base_sm2, med_sm2, coarse_sm2 + class(mld_z_base_aggregator_type), allocatable :: tmp_aggr type(mld_dml_parms) :: baseparms, medparms, coarseparms integer(psb_ipk_), allocatable :: ilaggr(:), nlaggr(:) type(psb_zspmat_type) :: op_prol @@ -216,19 +217,32 @@ subroutine mld_z_hierarchy_bld(a,desc_a,prec,info) allocate(tprecv(nplevs),stat=info) ! First all existing levels if (info == 0) tprecv(1)%parms = baseparms - if (info == 0) call restore_smoothers(tprecv(1),prec%precv(1)%sm,prec%precv(1)%sm2a,info) + if (info == 0) call restore_smoothers(tprecv(1),& + & prec%precv(1)%sm,prec%precv(1)%sm2a,info) + if (info == 0) call move_alloc(prec%precv(1)%aggr,tprecv(1)%aggr) do i=2, min(iszv,nplevs) - 1 if (info == 0) tprecv(i)%parms = medparms - if (info == 0) call restore_smoothers(tprecv(i),prec%precv(i)%sm,prec%precv(i)%sm2a,info) + if (info == 0) call restore_smoothers(tprecv(i),& + & prec%precv(i)%sm,prec%precv(i)%sm2a,info) + if (info == 0) call move_alloc(prec%precv(i)%aggr,tprecv(i)%aggr) end do ! Further intermediates, if any do i=iszv-1, nplevs - 1 if (info == 0) tprecv(i)%parms = medparms if (info == 0) call restore_smoothers(tprecv(i),med_sm,med_sm2,info) + if ((info == 0).and..not.allocated(tprecv(i)%aggr))& + & allocate(tprecv(i)%aggr,source=tprecv(iszv-1)%aggr,stat=info) end do ! Then coarse if (info == 0) tprecv(nplevs)%parms = coarseparms if (info == 0) call restore_smoothers(tprecv(nplevs),coarse_sm,coarse_sm2,info) + if (info == 0) then + if (nplevs <= iszv) then + allocate(tprecv(nplevs)%aggr,source=prec%precv(nplevs)%aggr,stat=info) + else + allocate(tprecv(nplevs)%aggr,source=tprecv(nplevs-1)%aggr,stat=info) + end if + end if if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,& & a_err='prec reallocation') @@ -272,9 +286,10 @@ subroutine mld_z_hierarchy_bld(a,desc_a,prec,info) ! ! Build the mapping between levels i-1 and i and the matrix ! at level i - ! - if (info == psb_success_) call mld_aggrmap_bld(prec%precv(i),& - & prec%precv(i-1)%base_a,prec%precv(i-1)%base_desc,& + ! + if (info == psb_success_)& + & call prec%precv(i)%bld_tprol(prec%precv(i-1)%base_a,& + & prec%precv(i-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) if (info /= psb_success_) then @@ -282,6 +297,7 @@ subroutine mld_z_hierarchy_bld(a,desc_a,prec,info) & a_err='Map build') goto 9999 endif + if (i= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),& @@ -346,7 +362,8 @@ subroutine mld_z_hierarchy_bld(a,desc_a,prec,info) prec%precv(newsz)%parms%aggr_thresh = athresh prec%precv(newsz)%parms%aggr_omega_val = aomega - if (info == 0) call restore_smoothers(prec%precv(newsz),coarse_sm,coarse_sm2,info) + if (info == 0) call restore_smoothers(prec%precv(newsz),& + & coarse_sm,coarse_sm2,info) if (newsz < i) then ! ! We are going back and revisit a previous leve; @@ -357,7 +374,7 @@ subroutine mld_z_hierarchy_bld(a,desc_a,prec,info) call prec%precv(newsz)%tprol%clone(op_prol,info) end if - if (info == psb_success_) call mld_lev_mat_asb(prec%precv(newsz),& + if (info == psb_success_) call prec%precv(newsz)%mat_asb( & & prec%precv(newsz-1)%base_a,prec%precv(newsz-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) if (info /= 0) then @@ -367,7 +384,7 @@ subroutine mld_z_hierarchy_bld(a,desc_a,prec,info) endif exit array_build_loop else - if (info == psb_success_) call mld_lev_mat_asb(prec%precv(i),& + if (info == psb_success_) call prec%precv(i)%mat_asb(& & prec%precv(i-1)%base_a,prec%precv(i-1)%base_desc,& & ilaggr,nlaggr,op_prol,info) end if diff --git a/mlprec/impl/mld_z_smoothers_bld.f90 b/mlprec/impl/mld_z_smoothers_bld.f90 index 24f99cd3..03d6c6f2 100644 --- a/mlprec/impl/mld_z_smoothers_bld.f90 +++ b/mlprec/impl/mld_z_smoothers_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zcprecset.F90 b/mlprec/impl/mld_zcprecset.F90 index 1eedb04e..871a03d4 100644 --- a/mlprec/impl/mld_zcprecset.F90 +++ b/mlprec/impl/mld_zcprecset.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zfile_prec_descr.f90 b/mlprec/impl/mld_zfile_prec_descr.f90 index 31faa261..e54e3a4f 100644 --- a/mlprec/impl/mld_zfile_prec_descr.f90 +++ b/mlprec/impl/mld_zfile_prec_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zmlprec_aply.f90 b/mlprec/impl/mld_zmlprec_aply.f90 index 7f756c34..bbac15d1 100644 --- a/mlprec/impl/mld_zmlprec_aply.f90 +++ b/mlprec/impl/mld_zmlprec_aply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zmlprec_bld.f90 b/mlprec/impl/mld_zmlprec_bld.f90 index cbf04032..11ce745d 100644 --- a/mlprec/impl/mld_zmlprec_bld.f90 +++ b/mlprec/impl/mld_zmlprec_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zprecaply.f90 b/mlprec/impl/mld_zprecaply.f90 index ca5daccd..66c7a224 100644 --- a/mlprec/impl/mld_zprecaply.f90 +++ b/mlprec/impl/mld_zprecaply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zprecbld.f90 b/mlprec/impl/mld_zprecbld.f90 index 0ffaa962..32306d6b 100644 --- a/mlprec/impl/mld_zprecbld.f90 +++ b/mlprec/impl/mld_zprecbld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zprecinit.F90 b/mlprec/impl/mld_zprecinit.F90 index 22a585ef..0bf8ce05 100644 --- a/mlprec/impl/mld_zprecinit.F90 +++ b/mlprec/impl/mld_zprecinit.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/mld_zprecset.F90 b/mlprec/impl/mld_zprecset.F90 index 3d1e7eb8..da553cb1 100644 --- a/mlprec/impl/mld_zprecset.F90 +++ b/mlprec/impl/mld_zprecset.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -575,6 +575,70 @@ subroutine mld_zprecsetsv(p,val,info,ilev,ilmax,pos) end subroutine mld_zprecsetsv +subroutine mld_zprecsetag(p,val,info,ilev,ilmax,pos) + + use psb_base_mod + use mld_z_prec_mod, mld_protect_name => mld_zprecsetag + + implicit none + + ! Arguments + class(mld_zprec_type), intent(inout) :: p + class(mld_z_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional, intent(in) :: ilev, ilmax + character(len=*), optional, intent(in) :: pos + + ! Local variables + integer(psb_ipk_) :: ilev_, nlev_, ilmin_, ilmax_ + character(len=*), parameter :: name='mld_precsetag' + + info = psb_success_ + + if (.not.allocated(p%precv)) then + info = 3111 + write(psb_err_unit,*) name,& + & ': Error: uninitialized preconditioner,',& + &' should call MLD_PRECINIT' + return + endif + nlev_ = size(p%precv) + + if (present(ilev)) then + ilev_ = ilev + ilmin_ = ilev + if (present(ilmax)) then + ilmax_ = ilmax + else + ilmax_ = ilev_ + end if + else + ilev_ = 1 + ilmin_ = 1 + ilmax_ = nlev_ + end if + + + if ((ilev_<1).or.(ilev_ > nlev_)) then + info = -1 + write(psb_err_unit,*) name,& + & ': Error: invalid ILEV/NLEV combination',ilev_, nlev_ + return + endif + if ((ilmax_<1).or.(ilmax_ > nlev_)) then + info = -1 + write(psb_err_unit,*) name,& + &': Error: invalid ILMAX/NLEV combination',ilmax_, nlev_ + return + endif + + do ilev_ = ilmin_, ilmax_ + call p%precv(ilev_)%set(val,info,pos=pos) + if (info /= 0) return + end do + +end subroutine mld_zprecsetag + ! ! Subroutine: mld_zprecsetc ! Version: complex diff --git a/mlprec/impl/smoother/mld_c_as_smoother_apply.f90 b/mlprec/impl/smoother/mld_c_as_smoother_apply.f90 index 9af16fc1..b2687cce 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_c_as_smoother_apply_vect.f90 index c991652a..55b0d94a 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_bld.f90 b/mlprec/impl/smoother/mld_c_as_smoother_bld.f90 index 3e39e298..2553354a 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_check.f90 b/mlprec/impl/smoother/mld_c_as_smoother_check.f90 index acb289ae..29172630 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_check.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_clone.f90 b/mlprec/impl/smoother/mld_c_as_smoother_clone.f90 index 0c6be044..badcf5ca 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_cnv.f90 b/mlprec/impl/smoother/mld_c_as_smoother_cnv.f90 index 982f8bbf..a45259ea 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_csetc.f90 b/mlprec/impl/smoother/mld_c_as_smoother_csetc.f90 index 25c9ab76..b48f58ed 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_csetc.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_cseti.f90 b/mlprec/impl/smoother/mld_c_as_smoother_cseti.f90 index 6ba123e3..6414ed84 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_cseti.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_csetr.f90 b/mlprec/impl/smoother/mld_c_as_smoother_csetr.f90 index 5453d6bd..ea438b55 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_csetr.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_dmp.f90 b/mlprec/impl/smoother/mld_c_as_smoother_dmp.f90 index 27b2981a..ada54775 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_free.f90 b/mlprec/impl/smoother/mld_c_as_smoother_free.f90 index b251a40a..3f299a89 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_free.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_prol_a.f90 b/mlprec/impl/smoother/mld_c_as_smoother_prol_a.f90 index 3155ba45..b2b0e775 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_prol_a.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_prol_a.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_prol_v.f90 b/mlprec/impl/smoother/mld_c_as_smoother_prol_v.f90 index 83299dc6..218f519f 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_prol_v.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_prol_v.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_restr_a.f90 b/mlprec/impl/smoother/mld_c_as_smoother_restr_a.f90 index 1dac43e4..bf404987 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_restr_a.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_restr_a.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_restr_v.f90 b/mlprec/impl/smoother/mld_c_as_smoother_restr_v.f90 index f0bc9668..111d4f89 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_restr_v.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_restr_v.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_setc.f90 b/mlprec/impl/smoother/mld_c_as_smoother_setc.f90 index ebfd3fbf..abf19e45 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_setc.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_seti.f90 b/mlprec/impl/smoother/mld_c_as_smoother_seti.f90 index 2fe97834..d401f944 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_seti.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_as_smoother_setr.f90 b/mlprec/impl/smoother/mld_c_as_smoother_setr.f90 index cbccad75..46f6c546 100644 --- a/mlprec/impl/smoother/mld_c_as_smoother_setr.f90 +++ b/mlprec/impl/smoother/mld_c_as_smoother_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_apply.f90 b/mlprec/impl/smoother/mld_c_base_smoother_apply.f90 index 0b1ff96c..db1ea5f5 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_c_base_smoother_apply_vect.f90 index c0fe128a..1cf7ad7d 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_bld.f90 b/mlprec/impl/smoother/mld_c_base_smoother_bld.f90 index 1c8f0026..29cf9613 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_check.f90 b/mlprec/impl/smoother/mld_c_base_smoother_check.f90 index 18a36b41..d88b17fe 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_check.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_clone.f90 b/mlprec/impl/smoother/mld_c_base_smoother_clone.f90 index aa4a428c..4b3ad865 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_cnv.f90 b/mlprec/impl/smoother/mld_c_base_smoother_cnv.f90 index e5d97561..c04a111f 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_csetc.f90 b/mlprec/impl/smoother/mld_c_base_smoother_csetc.f90 index 2c2a3de4..94387853 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_csetc.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_cseti.f90 b/mlprec/impl/smoother/mld_c_base_smoother_cseti.f90 index 5b3a09b9..d04cc545 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_cseti.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_csetr.f90 b/mlprec/impl/smoother/mld_c_base_smoother_csetr.f90 index 6b905022..6890258e 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_csetr.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_descr.f90 b/mlprec/impl/smoother/mld_c_base_smoother_descr.f90 index f36d135c..d2710d1d 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_descr.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_dmp.f90 b/mlprec/impl/smoother/mld_c_base_smoother_dmp.f90 index a5902b3c..5ab50a52 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_free.f90 b/mlprec/impl/smoother/mld_c_base_smoother_free.f90 index db2c20b6..73e2a9fc 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_free.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_setc.f90 b/mlprec/impl/smoother/mld_c_base_smoother_setc.f90 index 102584a9..88b82f78 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_setc.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_seti.f90 b/mlprec/impl/smoother/mld_c_base_smoother_seti.f90 index 16f96f6f..9ea67f47 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_seti.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_base_smoother_setr.f90 b/mlprec/impl/smoother/mld_c_base_smoother_setr.f90 index 63841822..eaf9ca24 100644 --- a/mlprec/impl/smoother/mld_c_base_smoother_setr.f90 +++ b/mlprec/impl/smoother/mld_c_base_smoother_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_jac_smoother_apply.f90 b/mlprec/impl/smoother/mld_c_jac_smoother_apply.f90 index 93038949..f6078ae4 100644 --- a/mlprec/impl/smoother/mld_c_jac_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_c_jac_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_jac_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_c_jac_smoother_apply_vect.f90 index 2dbfe8f7..33430696 100644 --- a/mlprec/impl/smoother/mld_c_jac_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_c_jac_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_jac_smoother_bld.f90 b/mlprec/impl/smoother/mld_c_jac_smoother_bld.f90 index d2c45d76..86e6b659 100644 --- a/mlprec/impl/smoother/mld_c_jac_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_c_jac_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_jac_smoother_clone.f90 b/mlprec/impl/smoother/mld_c_jac_smoother_clone.f90 index 4ba9648b..39270332 100644 --- a/mlprec/impl/smoother/mld_c_jac_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_c_jac_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_jac_smoother_cnv.f90 b/mlprec/impl/smoother/mld_c_jac_smoother_cnv.f90 index 15693916..7b963511 100644 --- a/mlprec/impl/smoother/mld_c_jac_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_c_jac_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_jac_smoother_descr.f90 b/mlprec/impl/smoother/mld_c_jac_smoother_descr.f90 index 9cc7c231..3f3c0725 100644 --- a/mlprec/impl/smoother/mld_c_jac_smoother_descr.f90 +++ b/mlprec/impl/smoother/mld_c_jac_smoother_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_c_jac_smoother_dmp.f90 b/mlprec/impl/smoother/mld_c_jac_smoother_dmp.f90 index e36794a8..bfa05ed4 100644 --- a/mlprec/impl/smoother/mld_c_jac_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_c_jac_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_apply.f90 b/mlprec/impl/smoother/mld_d_as_smoother_apply.f90 index 3a74fdf5..4a8835d9 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_d_as_smoother_apply_vect.f90 index 7b4b119c..7ae8e8bf 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_bld.f90 b/mlprec/impl/smoother/mld_d_as_smoother_bld.f90 index c2d62ac8..d385350f 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_check.f90 b/mlprec/impl/smoother/mld_d_as_smoother_check.f90 index d5b2c504..ef4be4e7 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_check.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_clone.f90 b/mlprec/impl/smoother/mld_d_as_smoother_clone.f90 index 2f0c3d81..e84e670c 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_cnv.f90 b/mlprec/impl/smoother/mld_d_as_smoother_cnv.f90 index 22a42f9d..ce761966 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_csetc.f90 b/mlprec/impl/smoother/mld_d_as_smoother_csetc.f90 index 0d01bcc3..13edd238 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_csetc.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_cseti.f90 b/mlprec/impl/smoother/mld_d_as_smoother_cseti.f90 index e148eba1..269e90ce 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_cseti.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_csetr.f90 b/mlprec/impl/smoother/mld_d_as_smoother_csetr.f90 index aa84ad3e..29324f20 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_csetr.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_dmp.f90 b/mlprec/impl/smoother/mld_d_as_smoother_dmp.f90 index e132ffd2..5929b06d 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_free.f90 b/mlprec/impl/smoother/mld_d_as_smoother_free.f90 index 82b66be3..2b446d9d 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_free.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_prol_a.f90 b/mlprec/impl/smoother/mld_d_as_smoother_prol_a.f90 index 4db22a62..97b1025e 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_prol_a.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_prol_a.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_prol_v.f90 b/mlprec/impl/smoother/mld_d_as_smoother_prol_v.f90 index 1b587618..d616a16f 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_prol_v.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_prol_v.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_restr_a.f90 b/mlprec/impl/smoother/mld_d_as_smoother_restr_a.f90 index 3e3f2e1e..f469ae6e 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_restr_a.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_restr_a.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_restr_v.f90 b/mlprec/impl/smoother/mld_d_as_smoother_restr_v.f90 index 67f4a493..7c4eca48 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_restr_v.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_restr_v.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_setc.f90 b/mlprec/impl/smoother/mld_d_as_smoother_setc.f90 index 50993348..c90c0cfb 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_setc.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_seti.f90 b/mlprec/impl/smoother/mld_d_as_smoother_seti.f90 index 7bbfff48..2b84d5bb 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_seti.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_as_smoother_setr.f90 b/mlprec/impl/smoother/mld_d_as_smoother_setr.f90 index 7fb75834..e87297a5 100644 --- a/mlprec/impl/smoother/mld_d_as_smoother_setr.f90 +++ b/mlprec/impl/smoother/mld_d_as_smoother_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_apply.f90 b/mlprec/impl/smoother/mld_d_base_smoother_apply.f90 index 7441ba8c..00b841c3 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_d_base_smoother_apply_vect.f90 index d81a6093..4a7dda3e 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_bld.f90 b/mlprec/impl/smoother/mld_d_base_smoother_bld.f90 index f074ed6e..737c4a95 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_check.f90 b/mlprec/impl/smoother/mld_d_base_smoother_check.f90 index b0742813..339f2f3d 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_check.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_clone.f90 b/mlprec/impl/smoother/mld_d_base_smoother_clone.f90 index 41a34afa..a596335a 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_cnv.f90 b/mlprec/impl/smoother/mld_d_base_smoother_cnv.f90 index e487b149..5518ac9b 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_csetc.f90 b/mlprec/impl/smoother/mld_d_base_smoother_csetc.f90 index f6ae1630..64fb2902 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_csetc.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_cseti.f90 b/mlprec/impl/smoother/mld_d_base_smoother_cseti.f90 index ee9846b9..923288c8 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_cseti.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_csetr.f90 b/mlprec/impl/smoother/mld_d_base_smoother_csetr.f90 index de39a4b6..2048835f 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_csetr.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_descr.f90 b/mlprec/impl/smoother/mld_d_base_smoother_descr.f90 index a18d127e..da0a8bf1 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_descr.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_dmp.f90 b/mlprec/impl/smoother/mld_d_base_smoother_dmp.f90 index dce0f67a..900a91ed 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_free.f90 b/mlprec/impl/smoother/mld_d_base_smoother_free.f90 index f53452a6..624fd718 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_free.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_setc.f90 b/mlprec/impl/smoother/mld_d_base_smoother_setc.f90 index 000bb1c8..cf5f34e8 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_setc.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_seti.f90 b/mlprec/impl/smoother/mld_d_base_smoother_seti.f90 index 88d3e1d3..ea9deef4 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_seti.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_base_smoother_setr.f90 b/mlprec/impl/smoother/mld_d_base_smoother_setr.f90 index 43041411..80f5ec7f 100644 --- a/mlprec/impl/smoother/mld_d_base_smoother_setr.f90 +++ b/mlprec/impl/smoother/mld_d_base_smoother_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_jac_smoother_apply.f90 b/mlprec/impl/smoother/mld_d_jac_smoother_apply.f90 index 1bee2bf3..fa5d27af 100644 --- a/mlprec/impl/smoother/mld_d_jac_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_d_jac_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_jac_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_d_jac_smoother_apply_vect.f90 index 92fe746a..11ab24b7 100644 --- a/mlprec/impl/smoother/mld_d_jac_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_d_jac_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_jac_smoother_bld.f90 b/mlprec/impl/smoother/mld_d_jac_smoother_bld.f90 index 166b0e5c..033136cc 100644 --- a/mlprec/impl/smoother/mld_d_jac_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_d_jac_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_jac_smoother_clone.f90 b/mlprec/impl/smoother/mld_d_jac_smoother_clone.f90 index 180249fa..3408d225 100644 --- a/mlprec/impl/smoother/mld_d_jac_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_d_jac_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_jac_smoother_cnv.f90 b/mlprec/impl/smoother/mld_d_jac_smoother_cnv.f90 index 7bcfbe1b..0218e90c 100644 --- a/mlprec/impl/smoother/mld_d_jac_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_d_jac_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_jac_smoother_descr.f90 b/mlprec/impl/smoother/mld_d_jac_smoother_descr.f90 index 5ade060c..4c738905 100644 --- a/mlprec/impl/smoother/mld_d_jac_smoother_descr.f90 +++ b/mlprec/impl/smoother/mld_d_jac_smoother_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_d_jac_smoother_dmp.f90 b/mlprec/impl/smoother/mld_d_jac_smoother_dmp.f90 index 44e63a35..811cee25 100644 --- a/mlprec/impl/smoother/mld_d_jac_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_d_jac_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_apply.f90 b/mlprec/impl/smoother/mld_s_as_smoother_apply.f90 index b4a83811..0dbb467e 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_s_as_smoother_apply_vect.f90 index a25688fd..e20643ba 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_bld.f90 b/mlprec/impl/smoother/mld_s_as_smoother_bld.f90 index 7ba5c86f..c1cb55c7 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_check.f90 b/mlprec/impl/smoother/mld_s_as_smoother_check.f90 index b381dfe3..06cbaf7f 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_check.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_clone.f90 b/mlprec/impl/smoother/mld_s_as_smoother_clone.f90 index d423f28a..6076c287 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_cnv.f90 b/mlprec/impl/smoother/mld_s_as_smoother_cnv.f90 index e25ee374..a71dc5fe 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_csetc.f90 b/mlprec/impl/smoother/mld_s_as_smoother_csetc.f90 index 130cfb81..08abf889 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_csetc.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_cseti.f90 b/mlprec/impl/smoother/mld_s_as_smoother_cseti.f90 index 27c76589..53950e47 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_cseti.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_csetr.f90 b/mlprec/impl/smoother/mld_s_as_smoother_csetr.f90 index 6d70cae9..5cdb1a35 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_csetr.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_dmp.f90 b/mlprec/impl/smoother/mld_s_as_smoother_dmp.f90 index ddcb0968..f35859b7 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_free.f90 b/mlprec/impl/smoother/mld_s_as_smoother_free.f90 index 986f7eb4..5a632a42 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_free.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_prol_a.f90 b/mlprec/impl/smoother/mld_s_as_smoother_prol_a.f90 index b15d9bee..caba1267 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_prol_a.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_prol_a.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_prol_v.f90 b/mlprec/impl/smoother/mld_s_as_smoother_prol_v.f90 index d27e004a..f5516309 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_prol_v.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_prol_v.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_restr_a.f90 b/mlprec/impl/smoother/mld_s_as_smoother_restr_a.f90 index bc5ca0b4..3055e987 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_restr_a.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_restr_a.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_restr_v.f90 b/mlprec/impl/smoother/mld_s_as_smoother_restr_v.f90 index aed6bad2..f6a82d9d 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_restr_v.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_restr_v.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_setc.f90 b/mlprec/impl/smoother/mld_s_as_smoother_setc.f90 index d9dccccc..842fa945 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_setc.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_seti.f90 b/mlprec/impl/smoother/mld_s_as_smoother_seti.f90 index 64bce301..c4fee0fd 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_seti.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_as_smoother_setr.f90 b/mlprec/impl/smoother/mld_s_as_smoother_setr.f90 index 1ea37d9e..1eb9fe99 100644 --- a/mlprec/impl/smoother/mld_s_as_smoother_setr.f90 +++ b/mlprec/impl/smoother/mld_s_as_smoother_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_apply.f90 b/mlprec/impl/smoother/mld_s_base_smoother_apply.f90 index 4197e7d1..e74a4d96 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_s_base_smoother_apply_vect.f90 index f9336a06..ab2fd275 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_bld.f90 b/mlprec/impl/smoother/mld_s_base_smoother_bld.f90 index 2659f1bd..99e6ea78 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_check.f90 b/mlprec/impl/smoother/mld_s_base_smoother_check.f90 index 7bcd79dc..06a34223 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_check.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_clone.f90 b/mlprec/impl/smoother/mld_s_base_smoother_clone.f90 index 43e51b24..231ec5a4 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_cnv.f90 b/mlprec/impl/smoother/mld_s_base_smoother_cnv.f90 index 2136eb5b..4dad645d 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_csetc.f90 b/mlprec/impl/smoother/mld_s_base_smoother_csetc.f90 index 291f5db6..27c7d700 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_csetc.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_cseti.f90 b/mlprec/impl/smoother/mld_s_base_smoother_cseti.f90 index 792ff441..81808a41 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_cseti.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_csetr.f90 b/mlprec/impl/smoother/mld_s_base_smoother_csetr.f90 index b02c9b27..2e20b226 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_csetr.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_descr.f90 b/mlprec/impl/smoother/mld_s_base_smoother_descr.f90 index 876c8cd6..404e3829 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_descr.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_dmp.f90 b/mlprec/impl/smoother/mld_s_base_smoother_dmp.f90 index c6819461..a9fcf074 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_free.f90 b/mlprec/impl/smoother/mld_s_base_smoother_free.f90 index 5bd7c61b..048bec71 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_free.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_setc.f90 b/mlprec/impl/smoother/mld_s_base_smoother_setc.f90 index a54efa36..0e04cddf 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_setc.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_seti.f90 b/mlprec/impl/smoother/mld_s_base_smoother_seti.f90 index d4296cd0..b840ce5e 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_seti.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_base_smoother_setr.f90 b/mlprec/impl/smoother/mld_s_base_smoother_setr.f90 index e4a20136..4a0d4936 100644 --- a/mlprec/impl/smoother/mld_s_base_smoother_setr.f90 +++ b/mlprec/impl/smoother/mld_s_base_smoother_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_jac_smoother_apply.f90 b/mlprec/impl/smoother/mld_s_jac_smoother_apply.f90 index 5880b124..73aa68b7 100644 --- a/mlprec/impl/smoother/mld_s_jac_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_s_jac_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_jac_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_s_jac_smoother_apply_vect.f90 index 1665050e..8d905796 100644 --- a/mlprec/impl/smoother/mld_s_jac_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_s_jac_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_jac_smoother_bld.f90 b/mlprec/impl/smoother/mld_s_jac_smoother_bld.f90 index d96da7b3..5ab0b99e 100644 --- a/mlprec/impl/smoother/mld_s_jac_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_s_jac_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_jac_smoother_clone.f90 b/mlprec/impl/smoother/mld_s_jac_smoother_clone.f90 index 1ee27924..ecb850b5 100644 --- a/mlprec/impl/smoother/mld_s_jac_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_s_jac_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_jac_smoother_cnv.f90 b/mlprec/impl/smoother/mld_s_jac_smoother_cnv.f90 index d05cf8f5..792a7872 100644 --- a/mlprec/impl/smoother/mld_s_jac_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_s_jac_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_jac_smoother_descr.f90 b/mlprec/impl/smoother/mld_s_jac_smoother_descr.f90 index d8e08461..820a246b 100644 --- a/mlprec/impl/smoother/mld_s_jac_smoother_descr.f90 +++ b/mlprec/impl/smoother/mld_s_jac_smoother_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_s_jac_smoother_dmp.f90 b/mlprec/impl/smoother/mld_s_jac_smoother_dmp.f90 index 13585519..e1c14975 100644 --- a/mlprec/impl/smoother/mld_s_jac_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_s_jac_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_apply.f90 b/mlprec/impl/smoother/mld_z_as_smoother_apply.f90 index 9bc7dae4..a0e18c1a 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_z_as_smoother_apply_vect.f90 index e21ccf69..53bf90f6 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_bld.f90 b/mlprec/impl/smoother/mld_z_as_smoother_bld.f90 index e92e78c9..43f97d1d 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_check.f90 b/mlprec/impl/smoother/mld_z_as_smoother_check.f90 index 5df26e1f..4fe4d6fe 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_check.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_clone.f90 b/mlprec/impl/smoother/mld_z_as_smoother_clone.f90 index 2dc91fa6..c192cdc6 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_cnv.f90 b/mlprec/impl/smoother/mld_z_as_smoother_cnv.f90 index 5f53ea74..716fb2a7 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_csetc.f90 b/mlprec/impl/smoother/mld_z_as_smoother_csetc.f90 index a79b08ed..553a2d20 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_csetc.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_cseti.f90 b/mlprec/impl/smoother/mld_z_as_smoother_cseti.f90 index ed0dbb75..0b7915be 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_cseti.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_csetr.f90 b/mlprec/impl/smoother/mld_z_as_smoother_csetr.f90 index faf31df3..c781b8ad 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_csetr.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_dmp.f90 b/mlprec/impl/smoother/mld_z_as_smoother_dmp.f90 index 339f0a8a..ecf10467 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_free.f90 b/mlprec/impl/smoother/mld_z_as_smoother_free.f90 index 978dd459..6745ff10 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_free.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_prol_a.f90 b/mlprec/impl/smoother/mld_z_as_smoother_prol_a.f90 index 892e7a2f..f320b923 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_prol_a.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_prol_a.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_prol_v.f90 b/mlprec/impl/smoother/mld_z_as_smoother_prol_v.f90 index 7c2327c5..613c2005 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_prol_v.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_prol_v.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_restr_a.f90 b/mlprec/impl/smoother/mld_z_as_smoother_restr_a.f90 index 21902f79..c56d72a5 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_restr_a.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_restr_a.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_restr_v.f90 b/mlprec/impl/smoother/mld_z_as_smoother_restr_v.f90 index 2add349d..154c0572 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_restr_v.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_restr_v.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_setc.f90 b/mlprec/impl/smoother/mld_z_as_smoother_setc.f90 index 20fe12b9..c928b1aa 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_setc.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_seti.f90 b/mlprec/impl/smoother/mld_z_as_smoother_seti.f90 index bf61a7f0..ba29e8ec 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_seti.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_as_smoother_setr.f90 b/mlprec/impl/smoother/mld_z_as_smoother_setr.f90 index cf322b20..88f54237 100644 --- a/mlprec/impl/smoother/mld_z_as_smoother_setr.f90 +++ b/mlprec/impl/smoother/mld_z_as_smoother_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_apply.f90 b/mlprec/impl/smoother/mld_z_base_smoother_apply.f90 index fd7521b1..b0013a85 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_z_base_smoother_apply_vect.f90 index ff339bf6..dc8c7578 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_bld.f90 b/mlprec/impl/smoother/mld_z_base_smoother_bld.f90 index 01db6b89..52f061aa 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_check.f90 b/mlprec/impl/smoother/mld_z_base_smoother_check.f90 index 65c8ac46..ceb2fe37 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_check.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_clone.f90 b/mlprec/impl/smoother/mld_z_base_smoother_clone.f90 index 45076f06..5a0efdc8 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_cnv.f90 b/mlprec/impl/smoother/mld_z_base_smoother_cnv.f90 index 53604e84..aed4fe2e 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_csetc.f90 b/mlprec/impl/smoother/mld_z_base_smoother_csetc.f90 index da8977fa..361fc3a0 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_csetc.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_cseti.f90 b/mlprec/impl/smoother/mld_z_base_smoother_cseti.f90 index 0bb67086..f87f49c5 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_cseti.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_csetr.f90 b/mlprec/impl/smoother/mld_z_base_smoother_csetr.f90 index d0789793..730df7ad 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_csetr.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_descr.f90 b/mlprec/impl/smoother/mld_z_base_smoother_descr.f90 index 264bd877..589485db 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_descr.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_dmp.f90 b/mlprec/impl/smoother/mld_z_base_smoother_dmp.f90 index a7b23e49..27f83a56 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_free.f90 b/mlprec/impl/smoother/mld_z_base_smoother_free.f90 index 2170ab93..4e0bc66b 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_free.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_setc.f90 b/mlprec/impl/smoother/mld_z_base_smoother_setc.f90 index c6536229..cb342510 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_setc.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_seti.f90 b/mlprec/impl/smoother/mld_z_base_smoother_seti.f90 index 8af31ea5..0c089f6b 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_seti.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_base_smoother_setr.f90 b/mlprec/impl/smoother/mld_z_base_smoother_setr.f90 index 05a38043..330b4093 100644 --- a/mlprec/impl/smoother/mld_z_base_smoother_setr.f90 +++ b/mlprec/impl/smoother/mld_z_base_smoother_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_jac_smoother_apply.f90 b/mlprec/impl/smoother/mld_z_jac_smoother_apply.f90 index c65c8d1e..90d3e8dc 100644 --- a/mlprec/impl/smoother/mld_z_jac_smoother_apply.f90 +++ b/mlprec/impl/smoother/mld_z_jac_smoother_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_jac_smoother_apply_vect.f90 b/mlprec/impl/smoother/mld_z_jac_smoother_apply_vect.f90 index 97f66e95..dc43087f 100644 --- a/mlprec/impl/smoother/mld_z_jac_smoother_apply_vect.f90 +++ b/mlprec/impl/smoother/mld_z_jac_smoother_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_jac_smoother_bld.f90 b/mlprec/impl/smoother/mld_z_jac_smoother_bld.f90 index 2ede4327..5bb2cf7e 100644 --- a/mlprec/impl/smoother/mld_z_jac_smoother_bld.f90 +++ b/mlprec/impl/smoother/mld_z_jac_smoother_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_jac_smoother_clone.f90 b/mlprec/impl/smoother/mld_z_jac_smoother_clone.f90 index dca98ad6..a9060305 100644 --- a/mlprec/impl/smoother/mld_z_jac_smoother_clone.f90 +++ b/mlprec/impl/smoother/mld_z_jac_smoother_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_jac_smoother_cnv.f90 b/mlprec/impl/smoother/mld_z_jac_smoother_cnv.f90 index 197bb18d..76ac02e0 100644 --- a/mlprec/impl/smoother/mld_z_jac_smoother_cnv.f90 +++ b/mlprec/impl/smoother/mld_z_jac_smoother_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_jac_smoother_descr.f90 b/mlprec/impl/smoother/mld_z_jac_smoother_descr.f90 index d13cd7e1..d89d0846 100644 --- a/mlprec/impl/smoother/mld_z_jac_smoother_descr.f90 +++ b/mlprec/impl/smoother/mld_z_jac_smoother_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/smoother/mld_z_jac_smoother_dmp.f90 b/mlprec/impl/smoother/mld_z_jac_smoother_dmp.f90 index fd3f9cb3..1c4f3f24 100644 --- a/mlprec/impl/smoother/mld_z_jac_smoother_dmp.f90 +++ b/mlprec/impl/smoother/mld_z_jac_smoother_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_apply.f90 b/mlprec/impl/solver/mld_c_base_solver_apply.f90 index 32d84514..d15667d9 100644 --- a/mlprec/impl/solver/mld_c_base_solver_apply.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_apply_vect.f90 b/mlprec/impl/solver/mld_c_base_solver_apply_vect.f90 index 73ff50fc..46531fbf 100644 --- a/mlprec/impl/solver/mld_c_base_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_bld.f90 b/mlprec/impl/solver/mld_c_base_solver_bld.f90 index f64ffc0b..3cd33de6 100644 --- a/mlprec/impl/solver/mld_c_base_solver_bld.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_check.f90 b/mlprec/impl/solver/mld_c_base_solver_check.f90 index a658e76b..a4f62967 100644 --- a/mlprec/impl/solver/mld_c_base_solver_check.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_clone.f90 b/mlprec/impl/solver/mld_c_base_solver_clone.f90 index cbd74849..fc158c5c 100644 --- a/mlprec/impl/solver/mld_c_base_solver_clone.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_cnv.f90 b/mlprec/impl/solver/mld_c_base_solver_cnv.f90 index 3a1c0086..1c8b9416 100644 --- a/mlprec/impl/solver/mld_c_base_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_csetc.f90 b/mlprec/impl/solver/mld_c_base_solver_csetc.f90 index a74fae11..c11c2a23 100644 --- a/mlprec/impl/solver/mld_c_base_solver_csetc.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_cseti.f90 b/mlprec/impl/solver/mld_c_base_solver_cseti.f90 index f26ceb73..34bda825 100644 --- a/mlprec/impl/solver/mld_c_base_solver_cseti.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_csetr.f90 b/mlprec/impl/solver/mld_c_base_solver_csetr.f90 index a18ce5e6..5a210ded 100644 --- a/mlprec/impl/solver/mld_c_base_solver_csetr.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_descr.f90 b/mlprec/impl/solver/mld_c_base_solver_descr.f90 index 2204f932..e988194c 100644 --- a/mlprec/impl/solver/mld_c_base_solver_descr.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_dmp.f90 b/mlprec/impl/solver/mld_c_base_solver_dmp.f90 index 2dfa0c3e..530a7ce4 100644 --- a/mlprec/impl/solver/mld_c_base_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_free.f90 b/mlprec/impl/solver/mld_c_base_solver_free.f90 index 51a521de..27577351 100644 --- a/mlprec/impl/solver/mld_c_base_solver_free.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_setc.f90 b/mlprec/impl/solver/mld_c_base_solver_setc.f90 index a4e57ec6..53f1201e 100644 --- a/mlprec/impl/solver/mld_c_base_solver_setc.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_seti.f90 b/mlprec/impl/solver/mld_c_base_solver_seti.f90 index ee583eba..3a461e05 100644 --- a/mlprec/impl/solver/mld_c_base_solver_seti.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_base_solver_setr.f90 b/mlprec/impl/solver/mld_c_base_solver_setr.f90 index 5d0be970..f6ea6371 100644 --- a/mlprec/impl/solver/mld_c_base_solver_setr.f90 +++ b/mlprec/impl/solver/mld_c_base_solver_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_bwgs_solver_apply.f90 b/mlprec/impl/solver/mld_c_bwgs_solver_apply.f90 index fdc1a2b5..fcd0f93f 100644 --- a/mlprec/impl/solver/mld_c_bwgs_solver_apply.f90 +++ b/mlprec/impl/solver/mld_c_bwgs_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_bwgs_solver_apply_vect.f90 b/mlprec/impl/solver/mld_c_bwgs_solver_apply_vect.f90 index 26166333..33d21fd1 100644 --- a/mlprec/impl/solver/mld_c_bwgs_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_c_bwgs_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_bwgs_solver_bld.f90 b/mlprec/impl/solver/mld_c_bwgs_solver_bld.f90 index 0135fa9f..04a5f12e 100644 --- a/mlprec/impl/solver/mld_c_bwgs_solver_bld.f90 +++ b/mlprec/impl/solver/mld_c_bwgs_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_diag_solver_apply.f90 b/mlprec/impl/solver/mld_c_diag_solver_apply.f90 index f9734b89..120e4c29 100644 --- a/mlprec/impl/solver/mld_c_diag_solver_apply.f90 +++ b/mlprec/impl/solver/mld_c_diag_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_diag_solver_apply_vect.f90 b/mlprec/impl/solver/mld_c_diag_solver_apply_vect.f90 index 7bbcb448..05841f2d 100644 --- a/mlprec/impl/solver/mld_c_diag_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_c_diag_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_diag_solver_bld.f90 b/mlprec/impl/solver/mld_c_diag_solver_bld.f90 index 5e0e057c..d0e5c19f 100644 --- a/mlprec/impl/solver/mld_c_diag_solver_bld.f90 +++ b/mlprec/impl/solver/mld_c_diag_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_diag_solver_clone.f90 b/mlprec/impl/solver/mld_c_diag_solver_clone.f90 index b75bfba8..1fd53b26 100644 --- a/mlprec/impl/solver/mld_c_diag_solver_clone.f90 +++ b/mlprec/impl/solver/mld_c_diag_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_diag_solver_cnv.f90 b/mlprec/impl/solver/mld_c_diag_solver_cnv.f90 index 41503ed0..e1375a21 100644 --- a/mlprec/impl/solver/mld_c_diag_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_c_diag_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_diag_solver_dmp.f90 b/mlprec/impl/solver/mld_c_diag_solver_dmp.f90 index 606b37af..63846d37 100644 --- a/mlprec/impl/solver/mld_c_diag_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_c_diag_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_gs_solver_apply.f90 b/mlprec/impl/solver/mld_c_gs_solver_apply.f90 index a5f1af4c..c5b15321 100644 --- a/mlprec/impl/solver/mld_c_gs_solver_apply.f90 +++ b/mlprec/impl/solver/mld_c_gs_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_gs_solver_apply_vect.f90 b/mlprec/impl/solver/mld_c_gs_solver_apply_vect.f90 index 8c43b64d..d0c9c326 100644 --- a/mlprec/impl/solver/mld_c_gs_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_c_gs_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_gs_solver_bld.f90 b/mlprec/impl/solver/mld_c_gs_solver_bld.f90 index 56e35fd6..b1052f2a 100644 --- a/mlprec/impl/solver/mld_c_gs_solver_bld.f90 +++ b/mlprec/impl/solver/mld_c_gs_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_gs_solver_clone.f90 b/mlprec/impl/solver/mld_c_gs_solver_clone.f90 index 321e8920..a48a30d3 100644 --- a/mlprec/impl/solver/mld_c_gs_solver_clone.f90 +++ b/mlprec/impl/solver/mld_c_gs_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_gs_solver_cnv.f90 b/mlprec/impl/solver/mld_c_gs_solver_cnv.f90 index 2c094df2..143a6618 100644 --- a/mlprec/impl/solver/mld_c_gs_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_c_gs_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_gs_solver_dmp.f90 b/mlprec/impl/solver/mld_c_gs_solver_dmp.f90 index a8263b49..3459e594 100644 --- a/mlprec/impl/solver/mld_c_gs_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_c_gs_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_id_solver_apply.f90 b/mlprec/impl/solver/mld_c_id_solver_apply.f90 index ffb9e7b5..39142aec 100644 --- a/mlprec/impl/solver/mld_c_id_solver_apply.f90 +++ b/mlprec/impl/solver/mld_c_id_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_id_solver_apply_vect.f90 b/mlprec/impl/solver/mld_c_id_solver_apply_vect.f90 index 91e69ffb..e8de6596 100644 --- a/mlprec/impl/solver/mld_c_id_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_c_id_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_id_solver_clone.f90 b/mlprec/impl/solver/mld_c_id_solver_clone.f90 index 1b8290b4..9c108356 100644 --- a/mlprec/impl/solver/mld_c_id_solver_clone.f90 +++ b/mlprec/impl/solver/mld_c_id_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_ilu_solver_apply.f90 b/mlprec/impl/solver/mld_c_ilu_solver_apply.f90 index 17fc7f07..1b1606b8 100644 --- a/mlprec/impl/solver/mld_c_ilu_solver_apply.f90 +++ b/mlprec/impl/solver/mld_c_ilu_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_ilu_solver_apply_vect.f90 b/mlprec/impl/solver/mld_c_ilu_solver_apply_vect.f90 index 71afc102..617223c8 100644 --- a/mlprec/impl/solver/mld_c_ilu_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_c_ilu_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_ilu_solver_bld.f90 b/mlprec/impl/solver/mld_c_ilu_solver_bld.f90 index ea3f6279..1d1f2de8 100644 --- a/mlprec/impl/solver/mld_c_ilu_solver_bld.f90 +++ b/mlprec/impl/solver/mld_c_ilu_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_ilu_solver_clone.f90 b/mlprec/impl/solver/mld_c_ilu_solver_clone.f90 index d73b4435..f46d68a4 100644 --- a/mlprec/impl/solver/mld_c_ilu_solver_clone.f90 +++ b/mlprec/impl/solver/mld_c_ilu_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_ilu_solver_cnv.f90 b/mlprec/impl/solver/mld_c_ilu_solver_cnv.f90 index 857d4b0b..2578e0cb 100644 --- a/mlprec/impl/solver/mld_c_ilu_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_c_ilu_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_ilu_solver_dmp.f90 b/mlprec/impl/solver/mld_c_ilu_solver_dmp.f90 index d5b156a9..61e7d1f1 100644 --- a/mlprec/impl/solver/mld_c_ilu_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_c_ilu_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_c_mumps_solver_apply.F90 b/mlprec/impl/solver/mld_c_mumps_solver_apply.F90 index aa8e84c0..436c3bf9 100644 --- a/mlprec/impl/solver/mld_c_mumps_solver_apply.F90 +++ b/mlprec/impl/solver/mld_c_mumps_solver_apply.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_c_mumps_solver_apply_vect.F90 b/mlprec/impl/solver/mld_c_mumps_solver_apply_vect.F90 index 5e96f1dd..185970d5 100644 --- a/mlprec/impl/solver/mld_c_mumps_solver_apply_vect.F90 +++ b/mlprec/impl/solver/mld_c_mumps_solver_apply_vect.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_c_mumps_solver_bld.F90 b/mlprec/impl/solver/mld_c_mumps_solver_bld.F90 index f1361f87..8a4fc85b 100644 --- a/mlprec/impl/solver/mld_c_mumps_solver_bld.F90 +++ b/mlprec/impl/solver/mld_c_mumps_solver_bld.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_cilu0_fact.f90 b/mlprec/impl/solver/mld_cilu0_fact.f90 index 242aaa02..c6e646a2 100644 --- a/mlprec/impl/solver/mld_cilu0_fact.f90 +++ b/mlprec/impl/solver/mld_cilu0_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_ciluk_fact.f90 b/mlprec/impl/solver/mld_ciluk_fact.f90 index a8502bbb..79fa2975 100644 --- a/mlprec/impl/solver/mld_ciluk_fact.f90 +++ b/mlprec/impl/solver/mld_ciluk_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_cilut_fact.f90 b/mlprec/impl/solver/mld_cilut_fact.f90 index 2f76492a..b7557ce2 100644 --- a/mlprec/impl/solver/mld_cilut_fact.f90 +++ b/mlprec/impl/solver/mld_cilut_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_apply.f90 b/mlprec/impl/solver/mld_d_base_solver_apply.f90 index 8a25ebb7..170a10d5 100644 --- a/mlprec/impl/solver/mld_d_base_solver_apply.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_apply_vect.f90 b/mlprec/impl/solver/mld_d_base_solver_apply_vect.f90 index 87265a45..b2208ba9 100644 --- a/mlprec/impl/solver/mld_d_base_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_bld.f90 b/mlprec/impl/solver/mld_d_base_solver_bld.f90 index a6c7e065..b511aec7 100644 --- a/mlprec/impl/solver/mld_d_base_solver_bld.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_check.f90 b/mlprec/impl/solver/mld_d_base_solver_check.f90 index 6ea2979f..fbd7264f 100644 --- a/mlprec/impl/solver/mld_d_base_solver_check.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_clone.f90 b/mlprec/impl/solver/mld_d_base_solver_clone.f90 index 829cfc38..6fdb6ef8 100644 --- a/mlprec/impl/solver/mld_d_base_solver_clone.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_cnv.f90 b/mlprec/impl/solver/mld_d_base_solver_cnv.f90 index 571dd3eb..6f7774b8 100644 --- a/mlprec/impl/solver/mld_d_base_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_csetc.f90 b/mlprec/impl/solver/mld_d_base_solver_csetc.f90 index 48f93b65..706d4ee1 100644 --- a/mlprec/impl/solver/mld_d_base_solver_csetc.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_cseti.f90 b/mlprec/impl/solver/mld_d_base_solver_cseti.f90 index 6e811ed9..07cbd399 100644 --- a/mlprec/impl/solver/mld_d_base_solver_cseti.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_csetr.f90 b/mlprec/impl/solver/mld_d_base_solver_csetr.f90 index 68faf968..1511eb26 100644 --- a/mlprec/impl/solver/mld_d_base_solver_csetr.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_descr.f90 b/mlprec/impl/solver/mld_d_base_solver_descr.f90 index 5af62aa4..2254482d 100644 --- a/mlprec/impl/solver/mld_d_base_solver_descr.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_dmp.f90 b/mlprec/impl/solver/mld_d_base_solver_dmp.f90 index c094b619..fbbb5208 100644 --- a/mlprec/impl/solver/mld_d_base_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_free.f90 b/mlprec/impl/solver/mld_d_base_solver_free.f90 index de40207c..386cbc30 100644 --- a/mlprec/impl/solver/mld_d_base_solver_free.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_setc.f90 b/mlprec/impl/solver/mld_d_base_solver_setc.f90 index 151a441a..e2664ce7 100644 --- a/mlprec/impl/solver/mld_d_base_solver_setc.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_seti.f90 b/mlprec/impl/solver/mld_d_base_solver_seti.f90 index f1549d21..4e18f78f 100644 --- a/mlprec/impl/solver/mld_d_base_solver_seti.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_base_solver_setr.f90 b/mlprec/impl/solver/mld_d_base_solver_setr.f90 index 8399ca9d..a933cfd6 100644 --- a/mlprec/impl/solver/mld_d_base_solver_setr.f90 +++ b/mlprec/impl/solver/mld_d_base_solver_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_bwgs_solver_apply.f90 b/mlprec/impl/solver/mld_d_bwgs_solver_apply.f90 index af634e97..4ce02fea 100644 --- a/mlprec/impl/solver/mld_d_bwgs_solver_apply.f90 +++ b/mlprec/impl/solver/mld_d_bwgs_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_bwgs_solver_apply_vect.f90 b/mlprec/impl/solver/mld_d_bwgs_solver_apply_vect.f90 index 25a1aa87..fe4fdd7c 100644 --- a/mlprec/impl/solver/mld_d_bwgs_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_d_bwgs_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_bwgs_solver_bld.f90 b/mlprec/impl/solver/mld_d_bwgs_solver_bld.f90 index 68113294..3fcc4f75 100644 --- a/mlprec/impl/solver/mld_d_bwgs_solver_bld.f90 +++ b/mlprec/impl/solver/mld_d_bwgs_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_diag_solver_apply.f90 b/mlprec/impl/solver/mld_d_diag_solver_apply.f90 index 84c1b7a5..45ac95e0 100644 --- a/mlprec/impl/solver/mld_d_diag_solver_apply.f90 +++ b/mlprec/impl/solver/mld_d_diag_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_diag_solver_apply_vect.f90 b/mlprec/impl/solver/mld_d_diag_solver_apply_vect.f90 index 3f6d70fc..43012d16 100644 --- a/mlprec/impl/solver/mld_d_diag_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_d_diag_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_diag_solver_bld.f90 b/mlprec/impl/solver/mld_d_diag_solver_bld.f90 index bf89bb7b..8b7378bb 100644 --- a/mlprec/impl/solver/mld_d_diag_solver_bld.f90 +++ b/mlprec/impl/solver/mld_d_diag_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_diag_solver_clone.f90 b/mlprec/impl/solver/mld_d_diag_solver_clone.f90 index feeaab9b..15d29217 100644 --- a/mlprec/impl/solver/mld_d_diag_solver_clone.f90 +++ b/mlprec/impl/solver/mld_d_diag_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_diag_solver_cnv.f90 b/mlprec/impl/solver/mld_d_diag_solver_cnv.f90 index 666aa63a..951615a4 100644 --- a/mlprec/impl/solver/mld_d_diag_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_d_diag_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_diag_solver_dmp.f90 b/mlprec/impl/solver/mld_d_diag_solver_dmp.f90 index 72df7f32..21d58955 100644 --- a/mlprec/impl/solver/mld_d_diag_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_d_diag_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_gs_solver_apply.f90 b/mlprec/impl/solver/mld_d_gs_solver_apply.f90 index c08734c2..7e5e2da8 100644 --- a/mlprec/impl/solver/mld_d_gs_solver_apply.f90 +++ b/mlprec/impl/solver/mld_d_gs_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_gs_solver_apply_vect.f90 b/mlprec/impl/solver/mld_d_gs_solver_apply_vect.f90 index 34fdf152..5ed87f5b 100644 --- a/mlprec/impl/solver/mld_d_gs_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_d_gs_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_gs_solver_bld.f90 b/mlprec/impl/solver/mld_d_gs_solver_bld.f90 index 13ba9e5d..c9b23f4a 100644 --- a/mlprec/impl/solver/mld_d_gs_solver_bld.f90 +++ b/mlprec/impl/solver/mld_d_gs_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_gs_solver_clone.f90 b/mlprec/impl/solver/mld_d_gs_solver_clone.f90 index 72a602bf..5dae02e1 100644 --- a/mlprec/impl/solver/mld_d_gs_solver_clone.f90 +++ b/mlprec/impl/solver/mld_d_gs_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_gs_solver_cnv.f90 b/mlprec/impl/solver/mld_d_gs_solver_cnv.f90 index dc3b3c36..8253c863 100644 --- a/mlprec/impl/solver/mld_d_gs_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_d_gs_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_gs_solver_dmp.f90 b/mlprec/impl/solver/mld_d_gs_solver_dmp.f90 index 53ffc133..f1d3b5cb 100644 --- a/mlprec/impl/solver/mld_d_gs_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_d_gs_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_id_solver_apply.f90 b/mlprec/impl/solver/mld_d_id_solver_apply.f90 index 6df623a8..ee3209ea 100644 --- a/mlprec/impl/solver/mld_d_id_solver_apply.f90 +++ b/mlprec/impl/solver/mld_d_id_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_id_solver_apply_vect.f90 b/mlprec/impl/solver/mld_d_id_solver_apply_vect.f90 index ac117bff..9ab9f3af 100644 --- a/mlprec/impl/solver/mld_d_id_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_d_id_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_id_solver_clone.f90 b/mlprec/impl/solver/mld_d_id_solver_clone.f90 index d866edf3..895863a8 100644 --- a/mlprec/impl/solver/mld_d_id_solver_clone.f90 +++ b/mlprec/impl/solver/mld_d_id_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_ilu_solver_apply.f90 b/mlprec/impl/solver/mld_d_ilu_solver_apply.f90 index 56b15cdb..a2e589f2 100644 --- a/mlprec/impl/solver/mld_d_ilu_solver_apply.f90 +++ b/mlprec/impl/solver/mld_d_ilu_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_ilu_solver_apply_vect.f90 b/mlprec/impl/solver/mld_d_ilu_solver_apply_vect.f90 index fa6ce75d..2ca9b278 100644 --- a/mlprec/impl/solver/mld_d_ilu_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_d_ilu_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_ilu_solver_bld.f90 b/mlprec/impl/solver/mld_d_ilu_solver_bld.f90 index 5fc1f17c..ba28539f 100644 --- a/mlprec/impl/solver/mld_d_ilu_solver_bld.f90 +++ b/mlprec/impl/solver/mld_d_ilu_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_ilu_solver_clone.f90 b/mlprec/impl/solver/mld_d_ilu_solver_clone.f90 index ebd78e8b..5cc7ff72 100644 --- a/mlprec/impl/solver/mld_d_ilu_solver_clone.f90 +++ b/mlprec/impl/solver/mld_d_ilu_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_ilu_solver_cnv.f90 b/mlprec/impl/solver/mld_d_ilu_solver_cnv.f90 index 89f439b7..1e0d1089 100644 --- a/mlprec/impl/solver/mld_d_ilu_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_d_ilu_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_ilu_solver_dmp.f90 b/mlprec/impl/solver/mld_d_ilu_solver_dmp.f90 index 2ec0d74b..0a4c9b43 100644 --- a/mlprec/impl/solver/mld_d_ilu_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_d_ilu_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_d_mumps_solver_apply.F90 b/mlprec/impl/solver/mld_d_mumps_solver_apply.F90 index dd312e2a..3900d211 100644 --- a/mlprec/impl/solver/mld_d_mumps_solver_apply.F90 +++ b/mlprec/impl/solver/mld_d_mumps_solver_apply.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_d_mumps_solver_apply_vect.F90 b/mlprec/impl/solver/mld_d_mumps_solver_apply_vect.F90 index 47081248..56013ba7 100644 --- a/mlprec/impl/solver/mld_d_mumps_solver_apply_vect.F90 +++ b/mlprec/impl/solver/mld_d_mumps_solver_apply_vect.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_d_mumps_solver_bld.F90 b/mlprec/impl/solver/mld_d_mumps_solver_bld.F90 index c7b6494a..3f51d193 100644 --- a/mlprec/impl/solver/mld_d_mumps_solver_bld.F90 +++ b/mlprec/impl/solver/mld_d_mumps_solver_bld.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_dilu0_fact.f90 b/mlprec/impl/solver/mld_dilu0_fact.f90 index 144cd657..6dab06b5 100644 --- a/mlprec/impl/solver/mld_dilu0_fact.f90 +++ b/mlprec/impl/solver/mld_dilu0_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_diluk_fact.f90 b/mlprec/impl/solver/mld_diluk_fact.f90 index 9fac8b38..53aa4cce 100644 --- a/mlprec/impl/solver/mld_diluk_fact.f90 +++ b/mlprec/impl/solver/mld_diluk_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_dilut_fact.f90 b/mlprec/impl/solver/mld_dilut_fact.f90 index 1f44275e..d8dfddce 100644 --- a/mlprec/impl/solver/mld_dilut_fact.f90 +++ b/mlprec/impl/solver/mld_dilut_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_apply.f90 b/mlprec/impl/solver/mld_s_base_solver_apply.f90 index b1d101ec..5605f4f8 100644 --- a/mlprec/impl/solver/mld_s_base_solver_apply.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_apply_vect.f90 b/mlprec/impl/solver/mld_s_base_solver_apply_vect.f90 index 4e831bd4..e1dac965 100644 --- a/mlprec/impl/solver/mld_s_base_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_bld.f90 b/mlprec/impl/solver/mld_s_base_solver_bld.f90 index 1d76c6e9..8bf11961 100644 --- a/mlprec/impl/solver/mld_s_base_solver_bld.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_check.f90 b/mlprec/impl/solver/mld_s_base_solver_check.f90 index 9bd3bbb7..0889c620 100644 --- a/mlprec/impl/solver/mld_s_base_solver_check.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_clone.f90 b/mlprec/impl/solver/mld_s_base_solver_clone.f90 index d093ac30..6e90e1af 100644 --- a/mlprec/impl/solver/mld_s_base_solver_clone.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_cnv.f90 b/mlprec/impl/solver/mld_s_base_solver_cnv.f90 index a5ed05cc..acca2e24 100644 --- a/mlprec/impl/solver/mld_s_base_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_csetc.f90 b/mlprec/impl/solver/mld_s_base_solver_csetc.f90 index 487c6ff0..0525d845 100644 --- a/mlprec/impl/solver/mld_s_base_solver_csetc.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_cseti.f90 b/mlprec/impl/solver/mld_s_base_solver_cseti.f90 index 9d198638..73da04f4 100644 --- a/mlprec/impl/solver/mld_s_base_solver_cseti.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_csetr.f90 b/mlprec/impl/solver/mld_s_base_solver_csetr.f90 index 1d19cf1c..4afcd3a8 100644 --- a/mlprec/impl/solver/mld_s_base_solver_csetr.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_descr.f90 b/mlprec/impl/solver/mld_s_base_solver_descr.f90 index d2e1450c..67fa0d35 100644 --- a/mlprec/impl/solver/mld_s_base_solver_descr.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_dmp.f90 b/mlprec/impl/solver/mld_s_base_solver_dmp.f90 index 8c9112f3..77ae6492 100644 --- a/mlprec/impl/solver/mld_s_base_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_free.f90 b/mlprec/impl/solver/mld_s_base_solver_free.f90 index 1bdadc18..7ba4a04c 100644 --- a/mlprec/impl/solver/mld_s_base_solver_free.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_setc.f90 b/mlprec/impl/solver/mld_s_base_solver_setc.f90 index 8b787f79..23e17ce5 100644 --- a/mlprec/impl/solver/mld_s_base_solver_setc.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_seti.f90 b/mlprec/impl/solver/mld_s_base_solver_seti.f90 index 982b3357..0a7fb9e6 100644 --- a/mlprec/impl/solver/mld_s_base_solver_seti.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_base_solver_setr.f90 b/mlprec/impl/solver/mld_s_base_solver_setr.f90 index 6fe89e72..d0f25532 100644 --- a/mlprec/impl/solver/mld_s_base_solver_setr.f90 +++ b/mlprec/impl/solver/mld_s_base_solver_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_bwgs_solver_apply.f90 b/mlprec/impl/solver/mld_s_bwgs_solver_apply.f90 index ec9e052c..f6955fbd 100644 --- a/mlprec/impl/solver/mld_s_bwgs_solver_apply.f90 +++ b/mlprec/impl/solver/mld_s_bwgs_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_bwgs_solver_apply_vect.f90 b/mlprec/impl/solver/mld_s_bwgs_solver_apply_vect.f90 index f3fa7a12..a4565edb 100644 --- a/mlprec/impl/solver/mld_s_bwgs_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_s_bwgs_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_bwgs_solver_bld.f90 b/mlprec/impl/solver/mld_s_bwgs_solver_bld.f90 index 68f81b07..0d2eb1a3 100644 --- a/mlprec/impl/solver/mld_s_bwgs_solver_bld.f90 +++ b/mlprec/impl/solver/mld_s_bwgs_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_diag_solver_apply.f90 b/mlprec/impl/solver/mld_s_diag_solver_apply.f90 index b03b9c6e..4aab61c1 100644 --- a/mlprec/impl/solver/mld_s_diag_solver_apply.f90 +++ b/mlprec/impl/solver/mld_s_diag_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_diag_solver_apply_vect.f90 b/mlprec/impl/solver/mld_s_diag_solver_apply_vect.f90 index 86bcdd5d..2e28ccfd 100644 --- a/mlprec/impl/solver/mld_s_diag_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_s_diag_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_diag_solver_bld.f90 b/mlprec/impl/solver/mld_s_diag_solver_bld.f90 index 6b33cd82..7c1a8fa6 100644 --- a/mlprec/impl/solver/mld_s_diag_solver_bld.f90 +++ b/mlprec/impl/solver/mld_s_diag_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_diag_solver_clone.f90 b/mlprec/impl/solver/mld_s_diag_solver_clone.f90 index f02f1f45..f642e9f0 100644 --- a/mlprec/impl/solver/mld_s_diag_solver_clone.f90 +++ b/mlprec/impl/solver/mld_s_diag_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_diag_solver_cnv.f90 b/mlprec/impl/solver/mld_s_diag_solver_cnv.f90 index d9a02a19..fc4ff623 100644 --- a/mlprec/impl/solver/mld_s_diag_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_s_diag_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_diag_solver_dmp.f90 b/mlprec/impl/solver/mld_s_diag_solver_dmp.f90 index be962fca..ae3695b8 100644 --- a/mlprec/impl/solver/mld_s_diag_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_s_diag_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_gs_solver_apply.f90 b/mlprec/impl/solver/mld_s_gs_solver_apply.f90 index 70db86ad..adfd751d 100644 --- a/mlprec/impl/solver/mld_s_gs_solver_apply.f90 +++ b/mlprec/impl/solver/mld_s_gs_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_gs_solver_apply_vect.f90 b/mlprec/impl/solver/mld_s_gs_solver_apply_vect.f90 index 2928333f..74bfe835 100644 --- a/mlprec/impl/solver/mld_s_gs_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_s_gs_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_gs_solver_bld.f90 b/mlprec/impl/solver/mld_s_gs_solver_bld.f90 index f4fd37a4..24fedbc6 100644 --- a/mlprec/impl/solver/mld_s_gs_solver_bld.f90 +++ b/mlprec/impl/solver/mld_s_gs_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_gs_solver_clone.f90 b/mlprec/impl/solver/mld_s_gs_solver_clone.f90 index e49fdfc7..3aa18c4d 100644 --- a/mlprec/impl/solver/mld_s_gs_solver_clone.f90 +++ b/mlprec/impl/solver/mld_s_gs_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_gs_solver_cnv.f90 b/mlprec/impl/solver/mld_s_gs_solver_cnv.f90 index aae8704e..7e67b973 100644 --- a/mlprec/impl/solver/mld_s_gs_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_s_gs_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_gs_solver_dmp.f90 b/mlprec/impl/solver/mld_s_gs_solver_dmp.f90 index 0288a0f8..33af39a7 100644 --- a/mlprec/impl/solver/mld_s_gs_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_s_gs_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_id_solver_apply.f90 b/mlprec/impl/solver/mld_s_id_solver_apply.f90 index d7bed551..b7614844 100644 --- a/mlprec/impl/solver/mld_s_id_solver_apply.f90 +++ b/mlprec/impl/solver/mld_s_id_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_id_solver_apply_vect.f90 b/mlprec/impl/solver/mld_s_id_solver_apply_vect.f90 index 05844b36..00b56862 100644 --- a/mlprec/impl/solver/mld_s_id_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_s_id_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_id_solver_clone.f90 b/mlprec/impl/solver/mld_s_id_solver_clone.f90 index cf8fe453..8cc886a6 100644 --- a/mlprec/impl/solver/mld_s_id_solver_clone.f90 +++ b/mlprec/impl/solver/mld_s_id_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_ilu_solver_apply.f90 b/mlprec/impl/solver/mld_s_ilu_solver_apply.f90 index db2e9fb4..3e33c108 100644 --- a/mlprec/impl/solver/mld_s_ilu_solver_apply.f90 +++ b/mlprec/impl/solver/mld_s_ilu_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_ilu_solver_apply_vect.f90 b/mlprec/impl/solver/mld_s_ilu_solver_apply_vect.f90 index f64716b6..fb320a8d 100644 --- a/mlprec/impl/solver/mld_s_ilu_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_s_ilu_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_ilu_solver_bld.f90 b/mlprec/impl/solver/mld_s_ilu_solver_bld.f90 index aee3e501..2701a851 100644 --- a/mlprec/impl/solver/mld_s_ilu_solver_bld.f90 +++ b/mlprec/impl/solver/mld_s_ilu_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_ilu_solver_clone.f90 b/mlprec/impl/solver/mld_s_ilu_solver_clone.f90 index 6944a06f..2c742b74 100644 --- a/mlprec/impl/solver/mld_s_ilu_solver_clone.f90 +++ b/mlprec/impl/solver/mld_s_ilu_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_ilu_solver_cnv.f90 b/mlprec/impl/solver/mld_s_ilu_solver_cnv.f90 index 71407a73..eb55738f 100644 --- a/mlprec/impl/solver/mld_s_ilu_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_s_ilu_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_ilu_solver_dmp.f90 b/mlprec/impl/solver/mld_s_ilu_solver_dmp.f90 index 7268ef3a..5da73209 100644 --- a/mlprec/impl/solver/mld_s_ilu_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_s_ilu_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_s_mumps_solver_apply.F90 b/mlprec/impl/solver/mld_s_mumps_solver_apply.F90 index 384c4c5f..f0fae77d 100644 --- a/mlprec/impl/solver/mld_s_mumps_solver_apply.F90 +++ b/mlprec/impl/solver/mld_s_mumps_solver_apply.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_s_mumps_solver_apply_vect.F90 b/mlprec/impl/solver/mld_s_mumps_solver_apply_vect.F90 index 705892c6..59fad283 100644 --- a/mlprec/impl/solver/mld_s_mumps_solver_apply_vect.F90 +++ b/mlprec/impl/solver/mld_s_mumps_solver_apply_vect.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_s_mumps_solver_bld.F90 b/mlprec/impl/solver/mld_s_mumps_solver_bld.F90 index 78aec716..664823f5 100644 --- a/mlprec/impl/solver/mld_s_mumps_solver_bld.F90 +++ b/mlprec/impl/solver/mld_s_mumps_solver_bld.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_silu0_fact.f90 b/mlprec/impl/solver/mld_silu0_fact.f90 index b47c9c42..8065d4b1 100644 --- a/mlprec/impl/solver/mld_silu0_fact.f90 +++ b/mlprec/impl/solver/mld_silu0_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_siluk_fact.f90 b/mlprec/impl/solver/mld_siluk_fact.f90 index 19ce3128..e91173df 100644 --- a/mlprec/impl/solver/mld_siluk_fact.f90 +++ b/mlprec/impl/solver/mld_siluk_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_silut_fact.f90 b/mlprec/impl/solver/mld_silut_fact.f90 index c535d0cf..510321a1 100644 --- a/mlprec/impl/solver/mld_silut_fact.f90 +++ b/mlprec/impl/solver/mld_silut_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_apply.f90 b/mlprec/impl/solver/mld_z_base_solver_apply.f90 index 8eec5367..0c7a0f61 100644 --- a/mlprec/impl/solver/mld_z_base_solver_apply.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_apply_vect.f90 b/mlprec/impl/solver/mld_z_base_solver_apply_vect.f90 index dc84cd7f..cc72e07d 100644 --- a/mlprec/impl/solver/mld_z_base_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_bld.f90 b/mlprec/impl/solver/mld_z_base_solver_bld.f90 index 9f3a331a..9fbd81d1 100644 --- a/mlprec/impl/solver/mld_z_base_solver_bld.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_check.f90 b/mlprec/impl/solver/mld_z_base_solver_check.f90 index ba893fc1..1fc6ccd8 100644 --- a/mlprec/impl/solver/mld_z_base_solver_check.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_check.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_clone.f90 b/mlprec/impl/solver/mld_z_base_solver_clone.f90 index 5c97abd9..7deb75eb 100644 --- a/mlprec/impl/solver/mld_z_base_solver_clone.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_cnv.f90 b/mlprec/impl/solver/mld_z_base_solver_cnv.f90 index 8b3660e7..bd62c83d 100644 --- a/mlprec/impl/solver/mld_z_base_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_csetc.f90 b/mlprec/impl/solver/mld_z_base_solver_csetc.f90 index c95f9510..048a4fdc 100644 --- a/mlprec/impl/solver/mld_z_base_solver_csetc.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_csetc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_cseti.f90 b/mlprec/impl/solver/mld_z_base_solver_cseti.f90 index 89e9c907..25ac8f67 100644 --- a/mlprec/impl/solver/mld_z_base_solver_cseti.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_cseti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_csetr.f90 b/mlprec/impl/solver/mld_z_base_solver_csetr.f90 index d2412eec..739586fc 100644 --- a/mlprec/impl/solver/mld_z_base_solver_csetr.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_csetr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_descr.f90 b/mlprec/impl/solver/mld_z_base_solver_descr.f90 index 7cc4c049..01050fdd 100644 --- a/mlprec/impl/solver/mld_z_base_solver_descr.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_descr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_dmp.f90 b/mlprec/impl/solver/mld_z_base_solver_dmp.f90 index b6749cfd..a85cd64c 100644 --- a/mlprec/impl/solver/mld_z_base_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_free.f90 b/mlprec/impl/solver/mld_z_base_solver_free.f90 index 10cd4a58..21a8099f 100644 --- a/mlprec/impl/solver/mld_z_base_solver_free.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_free.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_setc.f90 b/mlprec/impl/solver/mld_z_base_solver_setc.f90 index ceebe541..a0d60a99 100644 --- a/mlprec/impl/solver/mld_z_base_solver_setc.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_setc.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_seti.f90 b/mlprec/impl/solver/mld_z_base_solver_seti.f90 index 4ba74e10..ebeec939 100644 --- a/mlprec/impl/solver/mld_z_base_solver_seti.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_seti.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_base_solver_setr.f90 b/mlprec/impl/solver/mld_z_base_solver_setr.f90 index 8d190d99..a31ba30d 100644 --- a/mlprec/impl/solver/mld_z_base_solver_setr.f90 +++ b/mlprec/impl/solver/mld_z_base_solver_setr.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_bwgs_solver_apply.f90 b/mlprec/impl/solver/mld_z_bwgs_solver_apply.f90 index 28958ccd..02dce73c 100644 --- a/mlprec/impl/solver/mld_z_bwgs_solver_apply.f90 +++ b/mlprec/impl/solver/mld_z_bwgs_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_bwgs_solver_apply_vect.f90 b/mlprec/impl/solver/mld_z_bwgs_solver_apply_vect.f90 index 3ade70df..9454046f 100644 --- a/mlprec/impl/solver/mld_z_bwgs_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_z_bwgs_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_bwgs_solver_bld.f90 b/mlprec/impl/solver/mld_z_bwgs_solver_bld.f90 index 81fddcfb..38454e18 100644 --- a/mlprec/impl/solver/mld_z_bwgs_solver_bld.f90 +++ b/mlprec/impl/solver/mld_z_bwgs_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_diag_solver_apply.f90 b/mlprec/impl/solver/mld_z_diag_solver_apply.f90 index c7e76900..bdedc0f0 100644 --- a/mlprec/impl/solver/mld_z_diag_solver_apply.f90 +++ b/mlprec/impl/solver/mld_z_diag_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_diag_solver_apply_vect.f90 b/mlprec/impl/solver/mld_z_diag_solver_apply_vect.f90 index 19fb79d4..840e14a6 100644 --- a/mlprec/impl/solver/mld_z_diag_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_z_diag_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_diag_solver_bld.f90 b/mlprec/impl/solver/mld_z_diag_solver_bld.f90 index d1655bfd..59eb6fa4 100644 --- a/mlprec/impl/solver/mld_z_diag_solver_bld.f90 +++ b/mlprec/impl/solver/mld_z_diag_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_diag_solver_clone.f90 b/mlprec/impl/solver/mld_z_diag_solver_clone.f90 index c98beae1..508b503e 100644 --- a/mlprec/impl/solver/mld_z_diag_solver_clone.f90 +++ b/mlprec/impl/solver/mld_z_diag_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_diag_solver_cnv.f90 b/mlprec/impl/solver/mld_z_diag_solver_cnv.f90 index f13d9c3a..1f432bc1 100644 --- a/mlprec/impl/solver/mld_z_diag_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_z_diag_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_diag_solver_dmp.f90 b/mlprec/impl/solver/mld_z_diag_solver_dmp.f90 index 6e7b67c2..fe69026d 100644 --- a/mlprec/impl/solver/mld_z_diag_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_z_diag_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_gs_solver_apply.f90 b/mlprec/impl/solver/mld_z_gs_solver_apply.f90 index 7ca49e8d..4acfff15 100644 --- a/mlprec/impl/solver/mld_z_gs_solver_apply.f90 +++ b/mlprec/impl/solver/mld_z_gs_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_gs_solver_apply_vect.f90 b/mlprec/impl/solver/mld_z_gs_solver_apply_vect.f90 index 4c64ca42..5174ddc9 100644 --- a/mlprec/impl/solver/mld_z_gs_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_z_gs_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_gs_solver_bld.f90 b/mlprec/impl/solver/mld_z_gs_solver_bld.f90 index ea1076fd..a3934cd5 100644 --- a/mlprec/impl/solver/mld_z_gs_solver_bld.f90 +++ b/mlprec/impl/solver/mld_z_gs_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_gs_solver_clone.f90 b/mlprec/impl/solver/mld_z_gs_solver_clone.f90 index ffb2954f..0691846b 100644 --- a/mlprec/impl/solver/mld_z_gs_solver_clone.f90 +++ b/mlprec/impl/solver/mld_z_gs_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_gs_solver_cnv.f90 b/mlprec/impl/solver/mld_z_gs_solver_cnv.f90 index d9e25943..212a733d 100644 --- a/mlprec/impl/solver/mld_z_gs_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_z_gs_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_gs_solver_dmp.f90 b/mlprec/impl/solver/mld_z_gs_solver_dmp.f90 index b3a02f28..3449cdd1 100644 --- a/mlprec/impl/solver/mld_z_gs_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_z_gs_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_id_solver_apply.f90 b/mlprec/impl/solver/mld_z_id_solver_apply.f90 index caca1ca2..ab728ab2 100644 --- a/mlprec/impl/solver/mld_z_id_solver_apply.f90 +++ b/mlprec/impl/solver/mld_z_id_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_id_solver_apply_vect.f90 b/mlprec/impl/solver/mld_z_id_solver_apply_vect.f90 index 97ed7dcf..43ef0442 100644 --- a/mlprec/impl/solver/mld_z_id_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_z_id_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_id_solver_clone.f90 b/mlprec/impl/solver/mld_z_id_solver_clone.f90 index f9094e14..3dafb3ff 100644 --- a/mlprec/impl/solver/mld_z_id_solver_clone.f90 +++ b/mlprec/impl/solver/mld_z_id_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_ilu_solver_apply.f90 b/mlprec/impl/solver/mld_z_ilu_solver_apply.f90 index 23eaac57..5d70536d 100644 --- a/mlprec/impl/solver/mld_z_ilu_solver_apply.f90 +++ b/mlprec/impl/solver/mld_z_ilu_solver_apply.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_ilu_solver_apply_vect.f90 b/mlprec/impl/solver/mld_z_ilu_solver_apply_vect.f90 index 7c6fcaf9..5cf4d013 100644 --- a/mlprec/impl/solver/mld_z_ilu_solver_apply_vect.f90 +++ b/mlprec/impl/solver/mld_z_ilu_solver_apply_vect.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_ilu_solver_bld.f90 b/mlprec/impl/solver/mld_z_ilu_solver_bld.f90 index 7d685c92..18c069fb 100644 --- a/mlprec/impl/solver/mld_z_ilu_solver_bld.f90 +++ b/mlprec/impl/solver/mld_z_ilu_solver_bld.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_ilu_solver_clone.f90 b/mlprec/impl/solver/mld_z_ilu_solver_clone.f90 index 156f8363..a754b969 100644 --- a/mlprec/impl/solver/mld_z_ilu_solver_clone.f90 +++ b/mlprec/impl/solver/mld_z_ilu_solver_clone.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_ilu_solver_cnv.f90 b/mlprec/impl/solver/mld_z_ilu_solver_cnv.f90 index 6364b796..bbfcca7f 100644 --- a/mlprec/impl/solver/mld_z_ilu_solver_cnv.f90 +++ b/mlprec/impl/solver/mld_z_ilu_solver_cnv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_ilu_solver_dmp.f90 b/mlprec/impl/solver/mld_z_ilu_solver_dmp.f90 index 5c9cc0d0..8c40336d 100644 --- a/mlprec/impl/solver/mld_z_ilu_solver_dmp.f90 +++ b/mlprec/impl/solver/mld_z_ilu_solver_dmp.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_z_mumps_solver_apply.F90 b/mlprec/impl/solver/mld_z_mumps_solver_apply.F90 index 11050f9d..252e4c3a 100644 --- a/mlprec/impl/solver/mld_z_mumps_solver_apply.F90 +++ b/mlprec/impl/solver/mld_z_mumps_solver_apply.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_z_mumps_solver_apply_vect.F90 b/mlprec/impl/solver/mld_z_mumps_solver_apply_vect.F90 index 987a828f..29db13b8 100644 --- a/mlprec/impl/solver/mld_z_mumps_solver_apply_vect.F90 +++ b/mlprec/impl/solver/mld_z_mumps_solver_apply_vect.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_z_mumps_solver_bld.F90 b/mlprec/impl/solver/mld_z_mumps_solver_bld.F90 index 96b38b7b..77bc4682 100644 --- a/mlprec/impl/solver/mld_z_mumps_solver_bld.F90 +++ b/mlprec/impl/solver/mld_z_mumps_solver_bld.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.0) ! diff --git a/mlprec/impl/solver/mld_zilu0_fact.f90 b/mlprec/impl/solver/mld_zilu0_fact.f90 index f7dd71b8..5a89e785 100644 --- a/mlprec/impl/solver/mld_zilu0_fact.f90 +++ b/mlprec/impl/solver/mld_zilu0_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_ziluk_fact.f90 b/mlprec/impl/solver/mld_ziluk_fact.f90 index 151b4c45..daf52dc9 100644 --- a/mlprec/impl/solver/mld_ziluk_fact.f90 +++ b/mlprec/impl/solver/mld_ziluk_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/impl/solver/mld_zilut_fact.f90 b/mlprec/impl/solver/mld_zilut_fact.f90 index d7957aef..7554b35a 100644 --- a/mlprec/impl/solver/mld_zilut_fact.f90 +++ b/mlprec/impl/solver/mld_zilut_fact.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_base_prec_type.F90 b/mlprec/mld_base_prec_type.F90 index 50c9991c..1567ea96 100644 --- a/mlprec/mld_base_prec_type.F90 +++ b/mlprec/mld_base_prec_type.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -81,10 +81,10 @@ module mld_base_prec_type ! ! Version numbers ! - character(len=*), parameter :: mld_version_string_ = "2.1.1" + character(len=*), parameter :: mld_version_string_ = "2.2.0" integer(psb_ipk_), parameter :: mld_version_major_ = 2 - integer(psb_ipk_), parameter :: mld_version_minor_ = 1 - integer(psb_ipk_), parameter :: mld_patchlevel_ = 1 + integer(psb_ipk_), parameter :: mld_version_minor_ = 2 + integer(psb_ipk_), parameter :: mld_patchlevel_ = 0 type mld_ml_parms integer(psb_ipk_) :: sweeps_pre, sweeps_post @@ -97,6 +97,7 @@ module mld_base_prec_type procedure, pass(pm) :: get_coarse => ml_parms_get_coarse procedure, pass(pm) :: clone => ml_parms_clone procedure, pass(pm) :: descr => ml_parms_descr + procedure, pass(pm) :: mlcycledsc => ml_parms_mlcycledsc procedure, pass(pm) :: mldescr => ml_parms_mldescr procedure, pass(pm) :: coarsedescr => ml_parms_coarsedescr procedure, pass(pm) :: printout => ml_parms_printout @@ -222,11 +223,19 @@ module mld_base_prec_type integer(psb_ipk_), parameter :: mld_new_ml_prec_ = 7 integer(psb_ipk_), parameter :: mld_mult_dev_ml_ = 7 integer(psb_ipk_), parameter :: mld_max_ml_cycle_ = 8 + ! + ! Legal values for entry: mld_par_aggr_alg_ + ! + integer(psb_ipk_), parameter :: mld_dec_aggr_ = 0 + integer(psb_ipk_), parameter :: mld_sym_dec_aggr_ = 1 + integer(psb_ipk_), parameter :: mld_ext_aggr_ = 2 + integer(psb_ipk_), parameter :: mld_max_par_aggr_alg_ = mld_ext_aggr_ ! ! Legal values for entry: mld_aggr_type_ ! integer(psb_ipk_), parameter :: mld_noalg_ = 0 - integer(psb_ipk_), parameter :: mld_vmb_ = 1 + integer(psb_ipk_), parameter :: mld_soc1_ = 1 + integer(psb_ipk_), parameter :: mld_soc2_ = 2 ! ! Legal values for entry: mld_aggr_prol_ ! @@ -243,14 +252,6 @@ module mld_base_prec_type integer(psb_ipk_), parameter :: mld_filter_mat_ = 1 integer(psb_ipk_), parameter :: mld_max_filter_mat_ = mld_filter_mat_ ! - ! Legal values for entry: mld_par_aggr_alg_ - ! - integer(psb_ipk_), parameter :: mld_dec_aggr_ = 0 - integer(psb_ipk_), parameter :: mld_sym_dec_aggr_ = 1 - integer(psb_ipk_), parameter :: mld_ext_aggr_ = 2 - integer(psb_ipk_), parameter :: mld_bcmatch_aggr_ = 3 - integer(psb_ipk_), parameter :: mld_max_par_aggr_alg_ = mld_ext_aggr_ - ! ! Legal values for entry: mld_aggr_ord_ ! integer(psb_ipk_), parameter :: mld_aggr_ord_nat_ = 0 @@ -321,12 +322,12 @@ module mld_base_prec_type character(len=15), parameter, private :: & & matrix_names(0:1)=(/'distributed ','replicated '/) character(len=18), parameter, private :: & - & aggr_type_names(0:1)=(/'No aggregation ',& - & 'VMB aggregation '/) + & aggr_type_names(0:2)=(/'None ',& + & 'SOC measure 1 ', 'SOC Measure 2 '/) character(len=18), parameter, private :: & - & par_aggr_alg_names(0:3)=(/'decoupled aggr. ',& - & 'sym. dec. aggr. ',& - & 'user defined aggr.', 'matching aggr. '/) + & par_aggr_alg_names(0:2)=(/& + & 'decoupled aggr. ', 'sym. dec. aggr. ',& + & 'user defined aggr.'/) character(len=18), parameter, private :: & & ord_names(0:1)=(/'Natural ordering ','Desc. degree ord. '/) character(len=6), parameter, private :: & @@ -437,14 +438,14 @@ contains val = mld_kcycle_ml_ case('KCYCLESYM') val = mld_kcyclesym_ml_ - case('VMB') - val = mld_vmb_ + case('SOC2') + val = mld_soc2_ + case('SOC1') + val = mld_soc1_ case('DEC') val = mld_dec_aggr_ case('SYMDEC') val = mld_sym_dec_aggr_ - case('BCMATCH') - val = mld_bcmatch_aggr_ case('NAT','NATURAL') val = mld_aggr_ord_nat_ case('DESC','RDEGREE','DEGREE') @@ -475,7 +476,7 @@ contains val = mld_eig_est_ case('FILTER') val = mld_filter_mat_ - case('NOFILTER') + case('NOFILTER','NO_FILTER') val = mld_no_filter_mat_ case('OUTER_SWEEPS') val = mld_outer_sweeps_ @@ -530,8 +531,7 @@ contains ! ! Routines printing out a description of the preconditioner ! - - subroutine ml_parms_mldescr(pm,iout,info) + subroutine ml_parms_mlcycledsc(pm,iout,info) Implicit None @@ -539,7 +539,6 @@ contains class(mld_ml_parms), intent(in) :: pm integer(psb_ipk_), intent(in) :: iout integer(psb_ipk_), intent(out) :: info - info = psb_success_ if ((pm%ml_cycle>=mld_no_ml_).and.(pm%ml_cycle<=mld_max_ml_cycle_)) then @@ -554,11 +553,26 @@ contains write(iout,*) ' Number of smoother sweeps : pre: ',& & pm%sweeps_pre ,' post: ', pm%sweeps_post end select + + end if + end subroutine ml_parms_mlcycledsc + + subroutine ml_parms_mldescr(pm,iout,info) + + Implicit None + + ! Arguments + class(mld_ml_parms), intent(in) :: pm + integer(psb_ipk_), intent(in) :: iout + integer(psb_ipk_), intent(out) :: info + info = psb_success_ + if ((pm%ml_cycle>=mld_no_ml_).and.(pm%ml_cycle<=mld_max_ml_cycle_)) then + - write(iout,*) ' Aggregation type: ',& - & aggr_type_names(pm%aggr_type) - write(iout,*) ' parallel algorithm: ',& + write(iout,*) ' Parallel aggregation algorithm: ',& & par_aggr_alg_names(pm%par_aggr_alg) + write(iout,*) ' Aggregation type: ',& + & aggr_type_names(pm%aggr_type) if (pm%par_aggr_alg /= mld_ext_aggr_) then if ( pm%aggr_ord /= mld_aggr_ord_nat_) & & write(iout,*) ' with initial ordering: ',& @@ -566,7 +580,7 @@ contains write(iout,*) ' Aggregation prolongator: ', & & aggr_prols(pm%aggr_prol) if (pm%aggr_prol /= mld_no_smooth_) then - write(iout,*) ' with: ', aggr_filters(pm%aggr_filter) + write(iout,*) ' with: ', aggr_filters(pm%aggr_filter) if (pm%aggr_omega_alg == mld_eig_est_) then write(iout,*) ' Damping omega computation: spectral radius estimate' write(iout,*) ' Spectral radius estimate: ', & @@ -579,7 +593,7 @@ contains end if end if else - write(iout,*) ' Multilevel type: Unkonwn value. Something is amis....',& + write(iout,*) ' Multilevel type: Unkonwn value. Something is amiss....',& & pm%ml_cycle end if @@ -587,6 +601,33 @@ contains end subroutine ml_parms_mldescr + subroutine ml_parms_descr(pm,iout,info,coarse) + + Implicit None + + ! Arguments + class(mld_ml_parms), intent(in) :: pm + integer(psb_ipk_), intent(in) :: iout + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: coarse + logical :: coarse_ + + info = psb_success_ + if (present(coarse)) then + coarse_ = coarse + else + coarse_ = .false. + end if + + if (coarse_) then + call pm%coarsedescr(iout,info) + end if + + return + + end subroutine ml_parms_descr + + subroutine ml_parms_coarsedescr(pm,iout,info) @@ -618,32 +659,6 @@ contains end subroutine ml_parms_coarsedescr - subroutine ml_parms_descr(pm,iout,info,coarse) - - Implicit None - - ! Arguments - class(mld_ml_parms), intent(in) :: pm - integer(psb_ipk_), intent(in) :: iout - integer(psb_ipk_), intent(out) :: info - logical, intent(in), optional :: coarse - logical :: coarse_ - - info = psb_success_ - if (present(coarse)) then - coarse_ = coarse - else - coarse_ = .false. - end if - - if (coarse_) then - call pm%coarsedescr(iout,info) - end if - - return - - end subroutine ml_parms_descr - subroutine s_ml_parms_descr(pm,iout,info,coarse) Implicit None @@ -759,7 +774,7 @@ contains integer(psb_ipk_), intent(in) :: ip logical :: is_legal_ml_aggr_type - is_legal_ml_aggr_type = (ip == mld_vmb_) + is_legal_ml_aggr_type = (ip >= mld_soc1_) .and. (ip <= mld_soc2_) return end function is_legal_ml_aggr_type function is_legal_ml_aggr_ord(ip) diff --git a/mlprec/mld_c_as_smoother.f90 b/mlprec/mld_c_as_smoother.f90 index 325e9589..3155cfaa 100644 --- a/mlprec/mld_c_as_smoother.f90 +++ b/mlprec/mld_c_as_smoother.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_base_aggregator_mod.f90 b/mlprec/mld_c_base_aggregator_mod.f90 new file mode 100644 index 00000000..b62c9af1 --- /dev/null +++ b/mlprec/mld_c_base_aggregator_mod.f90 @@ -0,0 +1,248 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. The basic version is the +! decoupled aggregation algorithm presented in +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_c_base_aggregator_mod + + use mld_base_prec_type, only : mld_sml_parms + use psb_base_mod, only : psb_cspmat_type, psb_c_vect_type, & + & psb_c_base_vect_type, psb_clinmap_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, psb_desc_type, psb_i_base_vect_type, & + & psb_erractionsave, psb_error_handler, psb_success_ + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type mld_c_base_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_c_base_aggregator_build_tprol + procedure, pass(ag) :: mat_asb => mld_c_base_aggregator_mat_asb + procedure, pass(ag) :: update_next => mld_c_base_aggregator_update_next + procedure, pass(ag) :: clone => mld_c_base_aggregator_clone + procedure, pass(ag) :: free => mld_c_base_aggregator_free + procedure, pass(ag) :: default => mld_c_base_aggregator_default + procedure, pass(ag) :: descr => mld_c_base_aggregator_descr + procedure, pass(ag) :: set_aggr_type => mld_c_base_aggregator_set_aggr_type + procedure, nopass :: fmt => mld_c_base_aggregator_fmt + end type mld_c_base_aggregator_type + + +contains + + subroutine mld_c_base_aggregator_update_next(ag,agnext,info) + implicit none + class(mld_c_base_aggregator_type), target, intent(inout) :: ag, agnext + integer(psb_ipk_), intent(out) :: info + + ! + ! Base version does nothing. + ! + info = 0 + end subroutine mld_c_base_aggregator_update_next + + subroutine mld_c_base_aggregator_clone(ag,agnext,info) + implicit none + class(mld_c_base_aggregator_type), intent(inout) :: ag + class(mld_c_base_aggregator_type), allocatable, intent(inout) :: agnext + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(agnext)) then + call agnext%free(info) + if (info == 0) deallocate(agnext,stat=info) + end if + if (info /= 0) return + allocate(agnext,source=ag,stat=info) + + end subroutine mld_c_base_aggregator_clone + + subroutine mld_c_base_aggregator_free(ag,info) + implicit none + class(mld_c_base_aggregator_type), intent(inout) :: ag + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + return + end subroutine mld_c_base_aggregator_free + + subroutine mld_c_base_aggregator_default(ag) + implicit none + class(mld_c_base_aggregator_type), intent(inout) :: ag + + ! Here we need do nothing + + return + end subroutine mld_c_base_aggregator_default + + function mld_c_base_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Null " + end function mld_c_base_aggregator_fmt + + subroutine mld_c_base_aggregator_descr(ag,parms,iout,info) + implicit none + class(mld_c_base_aggregator_type), intent(in) :: ag + type(mld_sml_parms), intent(in) :: parms + integer(psb_ipk_), intent(in) :: iout + integer(psb_ipk_), intent(out) :: info + + call parms%mldescr(iout,info) + + return + end subroutine mld_c_base_aggregator_descr + + subroutine mld_c_base_aggregator_set_aggr_type(ag,parms,info) + implicit none + class(mld_c_base_aggregator_type), intent(inout) :: ag + type(mld_sml_parms), intent(in) :: parms + integer(psb_ipk_), intent(out) :: info + + ! Do nothing + + return + end subroutine mld_c_base_aggregator_set_aggr_type + + subroutine mld_c_base_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + implicit none + class(mld_c_base_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_cspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: err_act + character(len=20) :: name='c_base_aggregator_build_tprol' + + call psb_erractionsave(err_act) + + info = psb_err_missing_override_method_ + call psb_errpush(info,name) + goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + end subroutine mld_c_base_aggregator_build_tprol + + + subroutine mld_c_base_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + use psb_base_mod + implicit none + class(mld_c_base_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_cspmat_type), intent(inout) :: op_prol + type(psb_cspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: err_act + character(len=20) :: name='c_base_aggregator_mat_asb' + + call psb_erractionsave(err_act) + + info = psb_err_missing_override_method_ + call psb_errpush(info,name) + goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + end subroutine mld_c_base_aggregator_mat_asb + + +end module mld_c_base_aggregator_mod diff --git a/mlprec/mld_c_base_smoother_mod.f90 b/mlprec/mld_c_base_smoother_mod.f90 index 5f25bd1b..d882e3cf 100644 --- a/mlprec/mld_c_base_smoother_mod.f90 +++ b/mlprec/mld_c_base_smoother_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_base_solver_mod.f90 b/mlprec/mld_c_base_solver_mod.f90 index df1d4690..e6cd5a69 100644 --- a/mlprec/mld_c_base_solver_mod.f90 +++ b/mlprec/mld_c_base_solver_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_dec_aggregator_mod.f90 b/mlprec/mld_c_dec_aggregator_mod.f90 new file mode 100644 index 00000000..53a5f2c9 --- /dev/null +++ b/mlprec/mld_c_dec_aggregator_mod.f90 @@ -0,0 +1,193 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_c_dec_aggregator_mod + + use mld_c_base_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_c_base_aggregator_type) :: mld_c_dec_aggregator_type + procedure(mld_c_map_bld), nopass, pointer :: map_bld => null() + + contains + procedure, pass(ag) :: bld_tprol => mld_c_dec_aggregator_build_tprol + procedure, pass(ag) :: mat_asb => mld_c_dec_aggregator_mat_asb + procedure, pass(ag) :: default => mld_c_dec_aggregator_default + procedure, pass(ag) :: set_aggr_type => mld_c_dec_aggregator_set_aggr_type + procedure, nopass :: fmt => mld_c_dec_aggregator_fmt + end type mld_c_dec_aggregator_type + + + abstract interface + subroutine mld_c_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) + import :: psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_ + implicit none + integer(psb_ipk_), intent(in) :: iorder + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(psb_spk_), intent(in) :: theta + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), intent(out) :: info + end subroutine mld_c_map_bld + end interface + + procedure(mld_c_map_bld) :: mld_c_soc1_map_bld, mld_c_soc2_map_bld + + interface + subroutine mld_c_dec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_c_dec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, mld_sml_parms + implicit none + class(mld_c_dec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_cspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_c_dec_aggregator_build_tprol + end interface + + interface + subroutine mld_c_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + import :: mld_c_dec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, mld_sml_parms + implicit none + class(mld_c_dec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_cspmat_type), intent(inout) :: op_prol + type(psb_cspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + end subroutine mld_c_dec_aggregator_mat_asb + end interface + + +contains + + subroutine mld_c_dec_aggregator_set_aggr_type(ag,parms,info) + use mld_base_prec_type + implicit none + class(mld_c_dec_aggregator_type), intent(inout) :: ag + type(mld_sml_parms), intent(in) :: parms + integer(psb_ipk_), intent(out) :: info + + select case(parms%aggr_type) + case (mld_noalg_) + ag%map_bld => null() + case (mld_soc1_) + ag%map_bld => mld_c_soc1_map_bld + case (mld_soc2_) + ag%map_bld => mld_c_soc2_map_bld + case default + write(0,*) 'Unknown aggregation type, defaulting to SOC1' + ag%map_bld => mld_c_soc1_map_bld + end select + + return + end subroutine mld_c_dec_aggregator_set_aggr_type + + + subroutine mld_c_dec_aggregator_default(ag) + implicit none + class(mld_c_dec_aggregator_type), intent(inout) :: ag + + ag%map_bld => mld_c_soc1_map_bld + + return + end subroutine mld_c_dec_aggregator_default + + function mld_c_dec_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Decoupled aggregation" + end function mld_c_dec_aggregator_fmt + +end module mld_c_dec_aggregator_mod diff --git a/mlprec/mld_c_diag_solver.f90 b/mlprec/mld_c_diag_solver.f90 index 082adc93..a935c6e0 100644 --- a/mlprec/mld_c_diag_solver.f90 +++ b/mlprec/mld_c_diag_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_gs_solver.f90 b/mlprec/mld_c_gs_solver.f90 index 1ac82e0a..65fc5a17 100644 --- a/mlprec/mld_c_gs_solver.f90 +++ b/mlprec/mld_c_gs_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_hybrid_aggregator_mod.F90 b/mlprec/mld_c_hybrid_aggregator_mod.F90 new file mode 100644 index 00000000..e616eb87 --- /dev/null +++ b/mlprec/mld_c_hybrid_aggregator_mod.F90 @@ -0,0 +1,125 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the hybrid method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! +module mld_c_hybrid_aggregator_mod + + use mld_c_dec_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_c_dec_aggregator_type) :: mld_c_hybrid_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_c_hybrid_aggregator_build_tprol + procedure, nopass :: fmt => mld_c_hybrid_aggregator_fmt + end type mld_c_hybrid_aggregator_type + + + interface + subroutine mld_c_hybrid_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_c_hybrid_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, mld_sml_parms + implicit none + class(mld_c_hybrid_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_cspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_c_hybrid_aggregator_build_tprol + end interface + +contains + + + function mld_c_hybrid_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Hybrid Decoupled aggregation" + end function mld_c_hybrid_aggregator_fmt + + +end module mld_c_hybrid_aggregator_mod diff --git a/mlprec/mld_c_id_solver.f90 b/mlprec/mld_c_id_solver.f90 index ce03a91c..4bcba672 100644 --- a/mlprec/mld_c_id_solver.f90 +++ b/mlprec/mld_c_id_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_ilu_fact_mod.f90 b/mlprec/mld_c_ilu_fact_mod.f90 index b8c9a55d..e61ae28a 100644 --- a/mlprec/mld_c_ilu_fact_mod.f90 +++ b/mlprec/mld_c_ilu_fact_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_ilu_solver.f90 b/mlprec/mld_c_ilu_solver.f90 index e9dcd993..889cf13c 100644 --- a/mlprec/mld_c_ilu_solver.f90 +++ b/mlprec/mld_c_ilu_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_inner_mod.f90 b/mlprec/mld_c_inner_mod.f90 index e5394d4b..46b74f36 100644 --- a/mlprec/mld_c_inner_mod.f90 +++ b/mlprec/mld_c_inner_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -44,7 +44,7 @@ ! The interfaces of the user level routines are defined in mld_prec_mod.f90. ! module mld_c_inner_mod -! use mld_c_prec_type, only : mld_c_prec_type + use psb_base_mod, only : psb_cspmat_type, psb_desc_type, psb_i_base_vect_type, & & psb_spk_, psb_c_base_sparse_mat, psb_c_base_vect_type, psb_ipk_, & & psb_c_vect_type @@ -122,22 +122,19 @@ module mld_c_inner_mod integer(psb_ipk_), intent(out) :: info end subroutine mld_caggrmap_bld end interface mld_aggrmap_bld - - - interface mld_dec_map_bld - subroutine mld_c_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) - import :: psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_ + + interface mld_map_to_tprol + subroutine mld_c_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod, only : psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_ + use mld_c_prec_type, only : mld_c_onelev_type implicit none - integer(psb_ipk_), intent(in) :: iorder - type(psb_cspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a - real(psb_spk_), intent(in) :: theta - integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) - integer(psb_ipk_), intent(out) :: info - end subroutine mld_c_dec_map_bld - end interface mld_dec_map_bld - - + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) + type(psb_cspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_c_map_to_tprol + end interface mld_map_to_tprol + interface mld_lev_mat_asb subroutine mld_c_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) import :: psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_ diff --git a/mlprec/mld_c_jac_smoother.f90 b/mlprec/mld_c_jac_smoother.f90 index 1b48e78c..9e2615c3 100644 --- a/mlprec/mld_c_jac_smoother.f90 +++ b/mlprec/mld_c_jac_smoother.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_mumps_solver.F90 b/mlprec/mld_c_mumps_solver.F90 index 0a12b1ff..0e59552c 100644 --- a/mlprec/mld_c_mumps_solver.F90 +++ b/mlprec/mld_c_mumps_solver.F90 @@ -1,10 +1,10 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package -! based on PSBLAS (Parallel Sparse BLAS version 3.0) +! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! -! (C) Copyright 2008,2009,2010,2012,2013 +! (C) Copyright 2008-2018 ! ! Salvatore Filippone ! Pasqua D'Ambra diff --git a/mlprec/mld_c_onelev_mod.f90 b/mlprec/mld_c_onelev_mod.f90 index d57d7146..cf4d6639 100644 --- a/mlprec/mld_c_onelev_mod.f90 +++ b/mlprec/mld_c_onelev_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,6 +55,7 @@ module mld_c_onelev_mod use mld_base_prec_type use mld_c_base_smoother_mod + use mld_c_dec_aggregator_mod use psb_base_mod, only : psb_cspmat_type, psb_c_vect_type, & & psb_c_base_vect_type, psb_clinmap_type, psb_spk_, & & psb_ipk_, psb_epk_, psb_desc_type, psb_i_base_vect_type, & @@ -136,9 +137,10 @@ module mld_c_onelev_mod & c_wrk_clone, c_wrk_move_alloc, c_wrk_cnv type mld_c_onelev_type - class(mld_c_base_smoother_type), allocatable :: sm, sm2a - class(mld_c_base_smoother_type), pointer :: sm2 => null() - class(mld_cmlprec_wrk_type), allocatable :: wrk + class(mld_c_base_smoother_type), allocatable :: sm, sm2a + class(mld_c_base_smoother_type), pointer :: sm2 => null() + class(mld_cmlprec_wrk_type), allocatable :: wrk + class(mld_c_base_aggregator_type), allocatable :: aggr type(mld_sml_parms) :: parms type(psb_cspmat_type) :: ac integer(psb_ipk_) :: ac_nz_loc, ac_nz_tot @@ -149,6 +151,9 @@ module mld_c_onelev_mod type(psb_clinmap_type) :: map real(psb_spk_) :: szratio contains + procedure, pass(lv) :: bld_tprol => c_base_onelev_bld_tprol + procedure, pass(lv) :: mat_asb => mld_c_base_onelev_mat_asb + procedure, pass(lv) :: update_aggr => c_base_onelev_update_aggr procedure, pass(lv) :: bld => mld_c_base_onelev_build procedure, pass(lv) :: clone => c_base_onelev_clone procedure, pass(lv) :: cnv => mld_c_base_onelev_cnv @@ -166,8 +171,9 @@ module mld_c_onelev_mod procedure, pass(lv) :: csetc => mld_c_base_onelev_csetc procedure, pass(lv) :: setsm => mld_c_base_onelev_setsm procedure, pass(lv) :: setsv => mld_c_base_onelev_setsv + procedure, pass(lv) :: setag => mld_c_base_onelev_setag generic, public :: set => seti, setr, setc, & - & cseti, csetr, csetc, setsm, setsv + & cseti, csetr, csetc, setsm, setsv, setag procedure, pass(lv) :: sizeof => c_base_onelev_sizeof procedure, pass(lv) :: get_nzeros => c_base_onelev_get_nzeros procedure, pass(lv) :: get_wrksz => c_base_onelev_get_wrksize @@ -175,6 +181,7 @@ module mld_c_onelev_mod procedure, pass(lv) :: free_wrk => c_base_onelev_free_wrk procedure, nopass :: stringval => mld_stringval procedure, pass(lv) :: move_alloc => c_base_onelev_move_alloc + end type mld_c_onelev_type type mld_c_onelev_node @@ -188,7 +195,19 @@ module mld_c_onelev_mod & c_base_onelev_get_wrksize, c_base_onelev_allocate_wrk, & & c_base_onelev_free_wrk - + interface + subroutine mld_c_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: psb_cspmat_type, psb_desc_type, psb_spk_, psb_ipk_ + import :: mld_c_onelev_type + implicit none + class(mld_c_onelev_type), intent(inout), target :: lv + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:),nlaggr(:) + type(psb_cspmat_type), intent(inout) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_c_base_onelev_mat_asb + end interface interface subroutine mld_c_base_onelev_build(lv,info,amold,vmold,imold) @@ -299,6 +318,20 @@ module mld_c_onelev_mod end subroutine mld_c_base_onelev_setsv end interface + interface + subroutine mld_c_base_onelev_setag(lv,val,info,pos) + import :: psb_spk_, mld_c_onelev_type, mld_c_base_aggregator_type, & + & psb_ipk_, psb_long_int_k_, psb_desc_type + Implicit None + + ! Arguments + class(mld_c_onelev_type), target, intent(inout) :: lv + class(mld_c_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + end subroutine mld_c_base_onelev_setag + end interface + interface subroutine mld_c_base_onelev_setc(lv,what,val,info,pos) import :: psb_cspmat_type, psb_c_vect_type, psb_c_base_vect_type, & @@ -323,9 +356,9 @@ module mld_c_onelev_mod class(mld_c_onelev_type), intent(inout) :: lv integer(psb_ipk_), intent(in) :: what - real(psb_spk_), intent(in) :: val + real(psb_spk_), intent(in) :: val integer(psb_ipk_), intent(out) :: info - character(len=*), optional, intent(in) :: pos + character(len=*), optional, intent(in) :: pos end subroutine mld_c_base_onelev_setr end interface @@ -450,12 +483,13 @@ contains Implicit None ! Arguments - class(mld_c_onelev_type), target, intent(inout) :: lv + class(mld_c_onelev_type), target, intent(inout) :: lv + integer(psb_ipk_) :: info lv%parms%sweeps_pre = 1 lv%parms%sweeps_post = 1 lv%parms%ml_cycle = mld_vcycle_ml_ - lv%parms%aggr_type = mld_vmb_ + lv%parms%aggr_type = mld_soc1_ lv%parms%par_aggr_alg = mld_dec_aggr_ lv%parms%aggr_ord = mld_aggr_ord_nat_ lv%parms%aggr_prol = mld_smooth_prol_ @@ -473,11 +507,36 @@ contains else lv%sm2 => lv%sm end if - + if (.not.allocated(lv%aggr)) allocate(mld_c_dec_aggregator_type :: lv%aggr,stat=info) + if (allocated(lv%aggr)) call lv%aggr%default() + return end subroutine c_base_onelev_default + subroutine c_base_onelev_bld_tprol(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) + implicit none + class(mld_c_onelev_type), intent(inout), target :: lv + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_cspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + call lv%aggr%bld_tprol(lv%parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + + end subroutine c_base_onelev_bld_tprol + + + subroutine c_base_onelev_update_aggr(lv,lvnext,info) + implicit none + class(mld_c_onelev_type), intent(inout), target :: lv, lvnext + integer(psb_ipk_), intent(out) :: info + + call lv%aggr%update_next(lvnext%aggr,info) + + end subroutine c_base_onelev_update_aggr + subroutine c_base_onelev_clone(lv,lvout,info) @@ -508,6 +567,14 @@ contains end if lvout%sm2 => lvout%sm end if + if (allocated(lv%aggr)) then + call lv%aggr%clone(lvout%aggr,info) + else + if (allocated(lvout%aggr)) then + call lvout%aggr%free(info) + if (info==psb_success_) deallocate(lvout%aggr,stat=info) + end if + end if if (info == psb_success_) call lv%parms%clone(lvout%parms,info) if (info == psb_success_) call lv%ac%clone(lvout%ac,info) if (info == psb_success_) call lv%tprol%clone(lvout%tprol,info) @@ -538,8 +605,9 @@ contains call move_alloc(lv%sm2a,b%sm2a) b%sm2 =>b%sm end if - - if (info == psb_success_) call psb_move_alloc(lv%ac,b%ac,info) + + call move_alloc(lv%aggr,b%aggr) + if (info == psb_success_) call psb_move_alloc(lv%ac,b%ac,info) if (info == psb_success_) call psb_move_alloc(lv%tprol,b%tprol,info) if (info == psb_success_) call psb_move_alloc(lv%desc_ac,b%desc_ac,info) if (info == psb_success_) call psb_move_alloc(lv%map,b%map,info) diff --git a/mlprec/mld_c_prec_mod.f90 b/mlprec/mld_c_prec_mod.f90 index 4ec6e9d2..682b0548 100644 --- a/mlprec/mld_c_prec_mod.f90 +++ b/mlprec/mld_c_prec_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,7 +55,8 @@ module mld_c_prec_mod interface mld_precset module procedure mld_c_iprecsetsm, mld_c_iprecsetsv, & & mld_c_iprecseti, mld_c_iprecsetc, mld_c_iprecsetr, & - & mld_c_cprecseti, mld_c_cprecsetc, mld_c_cprecsetr + & mld_c_cprecseti, mld_c_cprecsetc, mld_c_cprecsetr, & + & mld_c_iprecsetag end interface mld_precset interface mld_extprol_bld @@ -97,6 +98,14 @@ contains call p%set(val,info, pos=pos) end subroutine mld_c_iprecsetsv + subroutine mld_c_iprecsetag(p,val,info,pos) + type(mld_cprec_type), intent(inout) :: p + class(mld_c_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + call p%set(val,info, pos=pos) + end subroutine mld_c_iprecsetag + subroutine mld_c_iprecseti(p,what,val,info,pos) type(mld_cprec_type), intent(inout) :: p integer(psb_ipk_), intent(in) :: what diff --git a/mlprec/mld_c_prec_type.f90 b/mlprec/mld_c_prec_type.f90 index 913eac62..52841488 100644 --- a/mlprec/mld_c_prec_type.f90 +++ b/mlprec/mld_c_prec_type.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,6 +55,7 @@ module mld_c_prec_type use mld_base_prec_type use mld_c_base_solver_mod use mld_c_base_smoother_mod + use mld_c_base_aggregator_mod use mld_c_onelev_mod use psb_prec_mod, only : psb_cprec_type @@ -92,8 +93,8 @@ module mld_c_prec_type ! 2. maximum number of levels. Defaults to 20 integer(psb_ipk_) :: max_levs = 20_psb_ipk_ ! 3. min_cr_ratio = 1.5 - real(psb_spk_) :: min_cr_ratio = 1.5_psb_spk_ - real(psb_spk_) :: op_complexity=szero + real(psb_spk_) :: min_cr_ratio = 1.5_psb_spk_ + real(psb_spk_) :: op_complexity = szero ! ! Number of outer sweeps. Sometimes 2 V-cycles may be better than 1 W-cycle. ! @@ -126,6 +127,7 @@ module mld_c_prec_type procedure, pass(prec) :: sizeof => mld_cprec_sizeof procedure, pass(prec) :: setsm => mld_cprecsetsm procedure, pass(prec) :: setsv => mld_cprecsetsv + procedure, pass(prec) :: setag => mld_cprecsetag procedure, pass(prec) :: seti => mld_cprecseti procedure, pass(prec) :: setc => mld_cprecsetc procedure, pass(prec) :: setr => mld_cprecsetr @@ -133,7 +135,7 @@ module mld_c_prec_type procedure, pass(prec) :: csetc => mld_ccprecsetc procedure, pass(prec) :: csetr => mld_ccprecsetr generic, public :: set => seti, setc, setr, & - & cseti, csetc, csetr, setsm, setsv + & cseti, csetc, csetr, setsm, setsv, setag procedure, pass(prec) :: get_smoother => mld_c_get_smootherp procedure, pass(prec) :: get_solver => mld_c_get_solverp procedure, pass(prec) :: move_alloc => c_prec_move_alloc @@ -234,6 +236,15 @@ module mld_c_prec_type integer(psb_ipk_), optional, intent(in) :: ilev,ilmax character(len=*), optional, intent(in) :: pos end subroutine mld_cprecsetsv + subroutine mld_cprecsetag(prec,val,info,ilev,pos) + import :: psb_cspmat_type, psb_desc_type, psb_spk_, & + & mld_cprec_type, mld_c_base_aggregator_type, psb_ipk_ + class(mld_cprec_type), intent(inout) :: prec + class(mld_c_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional, intent(in) :: ilev + character(len=*), optional, intent(in) :: pos + end subroutine mld_cprecsetag subroutine mld_cprecseti(prec,what,val,info,ilev,ilmax,pos) import :: psb_cspmat_type, psb_desc_type, psb_spk_, & & mld_cprec_type, psb_ipk_ diff --git a/mlprec/mld_c_slu_solver.F90 b/mlprec/mld_c_slu_solver.F90 index 816bcc1c..fd7b69a0 100644 --- a/mlprec/mld_c_slu_solver.F90 +++ b/mlprec/mld_c_slu_solver.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_c_symdec_aggregator_mod.f90 b/mlprec/mld_c_symdec_aggregator_mod.f90 new file mode 100644 index 00000000..f3df179e --- /dev/null +++ b/mlprec/mld_c_symdec_aggregator_mod.f90 @@ -0,0 +1,127 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This version only differs from the +! basic decoupled aggregation algorithm because it works on (the +! pattern of) A+A^T instead of A. +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_c_symdec_aggregator_mod + + use mld_c_dec_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_c_dec_aggregator_type) :: mld_c_symdec_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_c_symdec_aggregator_build_tprol + procedure, nopass :: fmt => mld_c_symdec_aggregator_fmt + end type mld_c_symdec_aggregator_type + + + interface + subroutine mld_c_symdec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_c_symdec_aggregator_type, psb_desc_type, psb_cspmat_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, mld_sml_parms + implicit none + class(mld_c_symdec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_cspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_cspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_c_symdec_aggregator_build_tprol + end interface + + +contains + + function mld_c_symdec_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Symmetric Decoupled aggregation" + end function mld_c_symdec_aggregator_fmt + +end module mld_c_symdec_aggregator_mod diff --git a/mlprec/mld_d_as_smoother.f90 b/mlprec/mld_d_as_smoother.f90 index 44a392eb..892c7005 100644 --- a/mlprec/mld_d_as_smoother.f90 +++ b/mlprec/mld_d_as_smoother.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_base_aggregator_mod.f90 b/mlprec/mld_d_base_aggregator_mod.f90 new file mode 100644 index 00000000..515d64c7 --- /dev/null +++ b/mlprec/mld_d_base_aggregator_mod.f90 @@ -0,0 +1,248 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. The basic version is the +! decoupled aggregation algorithm presented in +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_d_base_aggregator_mod + + use mld_base_prec_type, only : mld_dml_parms + use psb_base_mod, only : psb_dspmat_type, psb_d_vect_type, & + & psb_d_base_vect_type, psb_dlinmap_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, psb_desc_type, psb_i_base_vect_type, & + & psb_erractionsave, psb_error_handler, psb_success_ + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type mld_d_base_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_d_base_aggregator_build_tprol + procedure, pass(ag) :: mat_asb => mld_d_base_aggregator_mat_asb + procedure, pass(ag) :: update_next => mld_d_base_aggregator_update_next + procedure, pass(ag) :: clone => mld_d_base_aggregator_clone + procedure, pass(ag) :: free => mld_d_base_aggregator_free + procedure, pass(ag) :: default => mld_d_base_aggregator_default + procedure, pass(ag) :: descr => mld_d_base_aggregator_descr + procedure, pass(ag) :: set_aggr_type => mld_d_base_aggregator_set_aggr_type + procedure, nopass :: fmt => mld_d_base_aggregator_fmt + end type mld_d_base_aggregator_type + + +contains + + subroutine mld_d_base_aggregator_update_next(ag,agnext,info) + implicit none + class(mld_d_base_aggregator_type), target, intent(inout) :: ag, agnext + integer(psb_ipk_), intent(out) :: info + + ! + ! Base version does nothing. + ! + info = 0 + end subroutine mld_d_base_aggregator_update_next + + subroutine mld_d_base_aggregator_clone(ag,agnext,info) + implicit none + class(mld_d_base_aggregator_type), intent(inout) :: ag + class(mld_d_base_aggregator_type), allocatable, intent(inout) :: agnext + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(agnext)) then + call agnext%free(info) + if (info == 0) deallocate(agnext,stat=info) + end if + if (info /= 0) return + allocate(agnext,source=ag,stat=info) + + end subroutine mld_d_base_aggregator_clone + + subroutine mld_d_base_aggregator_free(ag,info) + implicit none + class(mld_d_base_aggregator_type), intent(inout) :: ag + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + return + end subroutine mld_d_base_aggregator_free + + subroutine mld_d_base_aggregator_default(ag) + implicit none + class(mld_d_base_aggregator_type), intent(inout) :: ag + + ! Here we need do nothing + + return + end subroutine mld_d_base_aggregator_default + + function mld_d_base_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Null " + end function mld_d_base_aggregator_fmt + + subroutine mld_d_base_aggregator_descr(ag,parms,iout,info) + implicit none + class(mld_d_base_aggregator_type), intent(in) :: ag + type(mld_dml_parms), intent(in) :: parms + integer(psb_ipk_), intent(in) :: iout + integer(psb_ipk_), intent(out) :: info + + call parms%mldescr(iout,info) + + return + end subroutine mld_d_base_aggregator_descr + + subroutine mld_d_base_aggregator_set_aggr_type(ag,parms,info) + implicit none + class(mld_d_base_aggregator_type), intent(inout) :: ag + type(mld_dml_parms), intent(in) :: parms + integer(psb_ipk_), intent(out) :: info + + ! Do nothing + + return + end subroutine mld_d_base_aggregator_set_aggr_type + + subroutine mld_d_base_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + implicit none + class(mld_d_base_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_base_aggregator_build_tprol' + + call psb_erractionsave(err_act) + + info = psb_err_missing_override_method_ + call psb_errpush(info,name) + goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + end subroutine mld_d_base_aggregator_build_tprol + + + subroutine mld_d_base_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + use psb_base_mod + implicit none + class(mld_d_base_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_dspmat_type), intent(inout) :: op_prol + type(psb_dspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: err_act + character(len=20) :: name='d_base_aggregator_mat_asb' + + call psb_erractionsave(err_act) + + info = psb_err_missing_override_method_ + call psb_errpush(info,name) + goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + end subroutine mld_d_base_aggregator_mat_asb + + +end module mld_d_base_aggregator_mod diff --git a/mlprec/mld_d_base_smoother_mod.f90 b/mlprec/mld_d_base_smoother_mod.f90 index a87824d5..6bdd7f16 100644 --- a/mlprec/mld_d_base_smoother_mod.f90 +++ b/mlprec/mld_d_base_smoother_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_base_solver_mod.f90 b/mlprec/mld_d_base_solver_mod.f90 index fda6e764..be97fc04 100644 --- a/mlprec/mld_d_base_solver_mod.f90 +++ b/mlprec/mld_d_base_solver_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_dec_aggregator_mod.f90 b/mlprec/mld_d_dec_aggregator_mod.f90 new file mode 100644 index 00000000..4b5acff3 --- /dev/null +++ b/mlprec/mld_d_dec_aggregator_mod.f90 @@ -0,0 +1,193 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_d_dec_aggregator_mod + + use mld_d_base_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_d_base_aggregator_type) :: mld_d_dec_aggregator_type + procedure(mld_d_map_bld), nopass, pointer :: map_bld => null() + + contains + procedure, pass(ag) :: bld_tprol => mld_d_dec_aggregator_build_tprol + procedure, pass(ag) :: mat_asb => mld_d_dec_aggregator_mat_asb + procedure, pass(ag) :: default => mld_d_dec_aggregator_default + procedure, pass(ag) :: set_aggr_type => mld_d_dec_aggregator_set_aggr_type + procedure, nopass :: fmt => mld_d_dec_aggregator_fmt + end type mld_d_dec_aggregator_type + + + abstract interface + subroutine mld_d_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) + import :: psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ + implicit none + integer(psb_ipk_), intent(in) :: iorder + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(psb_dpk_), intent(in) :: theta + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_map_bld + end interface + + procedure(mld_d_map_bld) :: mld_d_soc1_map_bld, mld_d_soc2_map_bld + + interface + subroutine mld_d_dec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_d_dec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_d_dec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_dec_aggregator_build_tprol + end interface + + interface + subroutine mld_d_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + import :: mld_d_dec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_d_dec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_dspmat_type), intent(inout) :: op_prol + type(psb_dspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_dec_aggregator_mat_asb + end interface + + +contains + + subroutine mld_d_dec_aggregator_set_aggr_type(ag,parms,info) + use mld_base_prec_type + implicit none + class(mld_d_dec_aggregator_type), intent(inout) :: ag + type(mld_dml_parms), intent(in) :: parms + integer(psb_ipk_), intent(out) :: info + + select case(parms%aggr_type) + case (mld_noalg_) + ag%map_bld => null() + case (mld_soc1_) + ag%map_bld => mld_d_soc1_map_bld + case (mld_soc2_) + ag%map_bld => mld_d_soc2_map_bld + case default + write(0,*) 'Unknown aggregation type, defaulting to SOC1' + ag%map_bld => mld_d_soc1_map_bld + end select + + return + end subroutine mld_d_dec_aggregator_set_aggr_type + + + subroutine mld_d_dec_aggregator_default(ag) + implicit none + class(mld_d_dec_aggregator_type), intent(inout) :: ag + + ag%map_bld => mld_d_soc1_map_bld + + return + end subroutine mld_d_dec_aggregator_default + + function mld_d_dec_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Decoupled aggregation" + end function mld_d_dec_aggregator_fmt + +end module mld_d_dec_aggregator_mod diff --git a/mlprec/mld_d_diag_solver.f90 b/mlprec/mld_d_diag_solver.f90 index 9d0ac4c3..2b20e4f3 100644 --- a/mlprec/mld_d_diag_solver.f90 +++ b/mlprec/mld_d_diag_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_gs_solver.f90 b/mlprec/mld_d_gs_solver.f90 index 7833de93..bf4b32c7 100644 --- a/mlprec/mld_d_gs_solver.f90 +++ b/mlprec/mld_d_gs_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_hybrid_aggregator_mod.F90 b/mlprec/mld_d_hybrid_aggregator_mod.F90 new file mode 100644 index 00000000..7acb7942 --- /dev/null +++ b/mlprec/mld_d_hybrid_aggregator_mod.F90 @@ -0,0 +1,125 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the hybrid method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! +module mld_d_hybrid_aggregator_mod + + use mld_d_dec_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_d_dec_aggregator_type) :: mld_d_hybrid_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_d_hybrid_aggregator_build_tprol + procedure, nopass :: fmt => mld_d_hybrid_aggregator_fmt + end type mld_d_hybrid_aggregator_type + + + interface + subroutine mld_d_hybrid_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_d_hybrid_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_d_hybrid_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_hybrid_aggregator_build_tprol + end interface + +contains + + + function mld_d_hybrid_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Hybrid Decoupled aggregation" + end function mld_d_hybrid_aggregator_fmt + + +end module mld_d_hybrid_aggregator_mod diff --git a/mlprec/mld_d_id_solver.f90 b/mlprec/mld_d_id_solver.f90 index 0bae0f90..50aaf2bd 100644 --- a/mlprec/mld_d_id_solver.f90 +++ b/mlprec/mld_d_id_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_ilu_fact_mod.f90 b/mlprec/mld_d_ilu_fact_mod.f90 index 3ce83f41..cb8c4bbe 100644 --- a/mlprec/mld_d_ilu_fact_mod.f90 +++ b/mlprec/mld_d_ilu_fact_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_ilu_solver.f90 b/mlprec/mld_d_ilu_solver.f90 index a430e8b7..d4827871 100644 --- a/mlprec/mld_d_ilu_solver.f90 +++ b/mlprec/mld_d_ilu_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_inner_mod.f90 b/mlprec/mld_d_inner_mod.f90 index e73856a0..81cb1ee2 100644 --- a/mlprec/mld_d_inner_mod.f90 +++ b/mlprec/mld_d_inner_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -44,7 +44,7 @@ ! The interfaces of the user level routines are defined in mld_prec_mod.f90. ! module mld_d_inner_mod -! use mld_d_prec_type, only : mld_d_prec_type + use psb_base_mod, only : psb_dspmat_type, psb_desc_type, psb_i_base_vect_type, & & psb_dpk_, psb_d_base_sparse_mat, psb_d_base_vect_type, psb_ipk_, & & psb_d_vect_type @@ -122,22 +122,19 @@ module mld_d_inner_mod integer(psb_ipk_), intent(out) :: info end subroutine mld_daggrmap_bld end interface mld_aggrmap_bld - - - interface mld_dec_map_bld - subroutine mld_d_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) - import :: psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ + + interface mld_map_to_tprol + subroutine mld_d_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod, only : psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ + use mld_d_prec_type, only : mld_d_onelev_type implicit none - integer(psb_ipk_), intent(in) :: iorder - type(psb_dspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a - real(psb_dpk_), intent(in) :: theta - integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) - integer(psb_ipk_), intent(out) :: info - end subroutine mld_d_dec_map_bld - end interface mld_dec_map_bld - - + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_map_to_tprol + end interface mld_map_to_tprol + interface mld_lev_mat_asb subroutine mld_d_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) import :: psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ diff --git a/mlprec/mld_d_jac_smoother.f90 b/mlprec/mld_d_jac_smoother.f90 index 87a13b14..966b7b31 100644 --- a/mlprec/mld_d_jac_smoother.f90 +++ b/mlprec/mld_d_jac_smoother.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_mumps_solver.F90 b/mlprec/mld_d_mumps_solver.F90 index eaae565c..37de156f 100644 --- a/mlprec/mld_d_mumps_solver.F90 +++ b/mlprec/mld_d_mumps_solver.F90 @@ -1,10 +1,10 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package -! based on PSBLAS (Parallel Sparse BLAS version 3.0) +! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! -! (C) Copyright 2008,2009,2010,2012,2013 +! (C) Copyright 2008-2018 ! ! Salvatore Filippone ! Pasqua D'Ambra diff --git a/mlprec/mld_d_onelev_mod.f90 b/mlprec/mld_d_onelev_mod.f90 index 2720029b..06eb120c 100644 --- a/mlprec/mld_d_onelev_mod.f90 +++ b/mlprec/mld_d_onelev_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,6 +55,7 @@ module mld_d_onelev_mod use mld_base_prec_type use mld_d_base_smoother_mod + use mld_d_dec_aggregator_mod use psb_base_mod, only : psb_dspmat_type, psb_d_vect_type, & & psb_d_base_vect_type, psb_dlinmap_type, psb_dpk_, & & psb_ipk_, psb_epk_, psb_desc_type, psb_i_base_vect_type, & @@ -136,9 +137,10 @@ module mld_d_onelev_mod & d_wrk_clone, d_wrk_move_alloc, d_wrk_cnv type mld_d_onelev_type - class(mld_d_base_smoother_type), allocatable :: sm, sm2a - class(mld_d_base_smoother_type), pointer :: sm2 => null() - class(mld_dmlprec_wrk_type), allocatable :: wrk + class(mld_d_base_smoother_type), allocatable :: sm, sm2a + class(mld_d_base_smoother_type), pointer :: sm2 => null() + class(mld_dmlprec_wrk_type), allocatable :: wrk + class(mld_d_base_aggregator_type), allocatable :: aggr type(mld_dml_parms) :: parms type(psb_dspmat_type) :: ac integer(psb_ipk_) :: ac_nz_loc, ac_nz_tot @@ -149,6 +151,9 @@ module mld_d_onelev_mod type(psb_dlinmap_type) :: map real(psb_dpk_) :: szratio contains + procedure, pass(lv) :: bld_tprol => d_base_onelev_bld_tprol + procedure, pass(lv) :: mat_asb => mld_d_base_onelev_mat_asb + procedure, pass(lv) :: update_aggr => d_base_onelev_update_aggr procedure, pass(lv) :: bld => mld_d_base_onelev_build procedure, pass(lv) :: clone => d_base_onelev_clone procedure, pass(lv) :: cnv => mld_d_base_onelev_cnv @@ -166,8 +171,9 @@ module mld_d_onelev_mod procedure, pass(lv) :: csetc => mld_d_base_onelev_csetc procedure, pass(lv) :: setsm => mld_d_base_onelev_setsm procedure, pass(lv) :: setsv => mld_d_base_onelev_setsv + procedure, pass(lv) :: setag => mld_d_base_onelev_setag generic, public :: set => seti, setr, setc, & - & cseti, csetr, csetc, setsm, setsv + & cseti, csetr, csetc, setsm, setsv, setag procedure, pass(lv) :: sizeof => d_base_onelev_sizeof procedure, pass(lv) :: get_nzeros => d_base_onelev_get_nzeros procedure, pass(lv) :: get_wrksz => d_base_onelev_get_wrksize @@ -175,6 +181,7 @@ module mld_d_onelev_mod procedure, pass(lv) :: free_wrk => d_base_onelev_free_wrk procedure, nopass :: stringval => mld_stringval procedure, pass(lv) :: move_alloc => d_base_onelev_move_alloc + end type mld_d_onelev_type type mld_d_onelev_node @@ -188,7 +195,19 @@ module mld_d_onelev_mod & d_base_onelev_get_wrksize, d_base_onelev_allocate_wrk, & & d_base_onelev_free_wrk - + interface + subroutine mld_d_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: psb_dspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ + import :: mld_d_onelev_type + implicit none + class(mld_d_onelev_type), intent(inout), target :: lv + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(inout) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_base_onelev_mat_asb + end interface interface subroutine mld_d_base_onelev_build(lv,info,amold,vmold,imold) @@ -299,6 +318,20 @@ module mld_d_onelev_mod end subroutine mld_d_base_onelev_setsv end interface + interface + subroutine mld_d_base_onelev_setag(lv,val,info,pos) + import :: psb_dpk_, mld_d_onelev_type, mld_d_base_aggregator_type, & + & psb_ipk_, psb_long_int_k_, psb_desc_type + Implicit None + + ! Arguments + class(mld_d_onelev_type), target, intent(inout) :: lv + class(mld_d_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + end subroutine mld_d_base_onelev_setag + end interface + interface subroutine mld_d_base_onelev_setc(lv,what,val,info,pos) import :: psb_dspmat_type, psb_d_vect_type, psb_d_base_vect_type, & @@ -323,9 +356,9 @@ module mld_d_onelev_mod class(mld_d_onelev_type), intent(inout) :: lv integer(psb_ipk_), intent(in) :: what - real(psb_dpk_), intent(in) :: val + real(psb_dpk_), intent(in) :: val integer(psb_ipk_), intent(out) :: info - character(len=*), optional, intent(in) :: pos + character(len=*), optional, intent(in) :: pos end subroutine mld_d_base_onelev_setr end interface @@ -450,12 +483,13 @@ contains Implicit None ! Arguments - class(mld_d_onelev_type), target, intent(inout) :: lv + class(mld_d_onelev_type), target, intent(inout) :: lv + integer(psb_ipk_) :: info lv%parms%sweeps_pre = 1 lv%parms%sweeps_post = 1 lv%parms%ml_cycle = mld_vcycle_ml_ - lv%parms%aggr_type = mld_vmb_ + lv%parms%aggr_type = mld_soc1_ lv%parms%par_aggr_alg = mld_dec_aggr_ lv%parms%aggr_ord = mld_aggr_ord_nat_ lv%parms%aggr_prol = mld_smooth_prol_ @@ -473,11 +507,36 @@ contains else lv%sm2 => lv%sm end if - + if (.not.allocated(lv%aggr)) allocate(mld_d_dec_aggregator_type :: lv%aggr,stat=info) + if (allocated(lv%aggr)) call lv%aggr%default() + return end subroutine d_base_onelev_default + subroutine d_base_onelev_bld_tprol(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) + implicit none + class(mld_d_onelev_type), intent(inout), target :: lv + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + call lv%aggr%bld_tprol(lv%parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + + end subroutine d_base_onelev_bld_tprol + + + subroutine d_base_onelev_update_aggr(lv,lvnext,info) + implicit none + class(mld_d_onelev_type), intent(inout), target :: lv, lvnext + integer(psb_ipk_), intent(out) :: info + + call lv%aggr%update_next(lvnext%aggr,info) + + end subroutine d_base_onelev_update_aggr + subroutine d_base_onelev_clone(lv,lvout,info) @@ -508,6 +567,14 @@ contains end if lvout%sm2 => lvout%sm end if + if (allocated(lv%aggr)) then + call lv%aggr%clone(lvout%aggr,info) + else + if (allocated(lvout%aggr)) then + call lvout%aggr%free(info) + if (info==psb_success_) deallocate(lvout%aggr,stat=info) + end if + end if if (info == psb_success_) call lv%parms%clone(lvout%parms,info) if (info == psb_success_) call lv%ac%clone(lvout%ac,info) if (info == psb_success_) call lv%tprol%clone(lvout%tprol,info) @@ -538,8 +605,9 @@ contains call move_alloc(lv%sm2a,b%sm2a) b%sm2 =>b%sm end if - - if (info == psb_success_) call psb_move_alloc(lv%ac,b%ac,info) + + call move_alloc(lv%aggr,b%aggr) + if (info == psb_success_) call psb_move_alloc(lv%ac,b%ac,info) if (info == psb_success_) call psb_move_alloc(lv%tprol,b%tprol,info) if (info == psb_success_) call psb_move_alloc(lv%desc_ac,b%desc_ac,info) if (info == psb_success_) call psb_move_alloc(lv%map,b%map,info) diff --git a/mlprec/mld_d_prec_mod.f90 b/mlprec/mld_d_prec_mod.f90 index 152c860f..e9ffb466 100644 --- a/mlprec/mld_d_prec_mod.f90 +++ b/mlprec/mld_d_prec_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,7 +55,8 @@ module mld_d_prec_mod interface mld_precset module procedure mld_d_iprecsetsm, mld_d_iprecsetsv, & & mld_d_iprecseti, mld_d_iprecsetc, mld_d_iprecsetr, & - & mld_d_cprecseti, mld_d_cprecsetc, mld_d_cprecsetr + & mld_d_cprecseti, mld_d_cprecsetc, mld_d_cprecsetr, & + & mld_d_iprecsetag end interface mld_precset interface mld_extprol_bld @@ -97,6 +98,14 @@ contains call p%set(val,info, pos=pos) end subroutine mld_d_iprecsetsv + subroutine mld_d_iprecsetag(p,val,info,pos) + type(mld_dprec_type), intent(inout) :: p + class(mld_d_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + call p%set(val,info, pos=pos) + end subroutine mld_d_iprecsetag + subroutine mld_d_iprecseti(p,what,val,info,pos) type(mld_dprec_type), intent(inout) :: p integer(psb_ipk_), intent(in) :: what diff --git a/mlprec/mld_d_prec_type.f90 b/mlprec/mld_d_prec_type.f90 index c68cc2d1..5c4a1fe9 100644 --- a/mlprec/mld_d_prec_type.f90 +++ b/mlprec/mld_d_prec_type.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,6 +55,7 @@ module mld_d_prec_type use mld_base_prec_type use mld_d_base_solver_mod use mld_d_base_smoother_mod + use mld_d_base_aggregator_mod use mld_d_onelev_mod use psb_prec_mod, only : psb_dprec_type @@ -92,8 +93,8 @@ module mld_d_prec_type ! 2. maximum number of levels. Defaults to 20 integer(psb_ipk_) :: max_levs = 20_psb_ipk_ ! 3. min_cr_ratio = 1.5 - real(psb_dpk_) :: min_cr_ratio = 1.5_psb_dpk_ - real(psb_dpk_) :: op_complexity=dzero + real(psb_dpk_) :: min_cr_ratio = 1.5_psb_dpk_ + real(psb_dpk_) :: op_complexity = dzero ! ! Number of outer sweeps. Sometimes 2 V-cycles may be better than 1 W-cycle. ! @@ -126,6 +127,7 @@ module mld_d_prec_type procedure, pass(prec) :: sizeof => mld_dprec_sizeof procedure, pass(prec) :: setsm => mld_dprecsetsm procedure, pass(prec) :: setsv => mld_dprecsetsv + procedure, pass(prec) :: setag => mld_dprecsetag procedure, pass(prec) :: seti => mld_dprecseti procedure, pass(prec) :: setc => mld_dprecsetc procedure, pass(prec) :: setr => mld_dprecsetr @@ -133,7 +135,7 @@ module mld_d_prec_type procedure, pass(prec) :: csetc => mld_dcprecsetc procedure, pass(prec) :: csetr => mld_dcprecsetr generic, public :: set => seti, setc, setr, & - & cseti, csetc, csetr, setsm, setsv + & cseti, csetc, csetr, setsm, setsv, setag procedure, pass(prec) :: get_smoother => mld_d_get_smootherp procedure, pass(prec) :: get_solver => mld_d_get_solverp procedure, pass(prec) :: move_alloc => d_prec_move_alloc @@ -234,6 +236,15 @@ module mld_d_prec_type integer(psb_ipk_), optional, intent(in) :: ilev,ilmax character(len=*), optional, intent(in) :: pos end subroutine mld_dprecsetsv + subroutine mld_dprecsetag(prec,val,info,ilev,pos) + import :: psb_dspmat_type, psb_desc_type, psb_dpk_, & + & mld_dprec_type, mld_d_base_aggregator_type, psb_ipk_ + class(mld_dprec_type), intent(inout) :: prec + class(mld_d_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional, intent(in) :: ilev + character(len=*), optional, intent(in) :: pos + end subroutine mld_dprecsetag subroutine mld_dprecseti(prec,what,val,info,ilev,ilmax,pos) import :: psb_dspmat_type, psb_desc_type, psb_dpk_, & & mld_dprec_type, psb_ipk_ diff --git a/mlprec/mld_d_slu_solver.F90 b/mlprec/mld_d_slu_solver.F90 index 89dcb17c..fa267f5a 100644 --- a/mlprec/mld_d_slu_solver.F90 +++ b/mlprec/mld_d_slu_solver.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_sludist_solver.F90 b/mlprec/mld_d_sludist_solver.F90 index 33037ecf..442ab913 100644 --- a/mlprec/mld_d_sludist_solver.F90 +++ b/mlprec/mld_d_sludist_solver.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_d_symdec_aggregator_mod.f90 b/mlprec/mld_d_symdec_aggregator_mod.f90 new file mode 100644 index 00000000..86fd4ba2 --- /dev/null +++ b/mlprec/mld_d_symdec_aggregator_mod.f90 @@ -0,0 +1,127 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This version only differs from the +! basic decoupled aggregation algorithm because it works on (the +! pattern of) A+A^T instead of A. +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_d_symdec_aggregator_mod + + use mld_d_dec_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_d_dec_aggregator_type) :: mld_d_symdec_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_d_symdec_aggregator_build_tprol + procedure, nopass :: fmt => mld_d_symdec_aggregator_fmt + end type mld_d_symdec_aggregator_type + + + interface + subroutine mld_d_symdec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_d_symdec_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_d_symdec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_symdec_aggregator_build_tprol + end interface + + +contains + + function mld_d_symdec_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Symmetric Decoupled aggregation" + end function mld_d_symdec_aggregator_fmt + +end module mld_d_symdec_aggregator_mod diff --git a/mlprec/mld_d_umf_solver.F90 b/mlprec/mld_d_umf_solver.F90 index 0268d851..54891e5d 100644 --- a/mlprec/mld_d_umf_solver.F90 +++ b/mlprec/mld_d_umf_solver.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_prec_mod.f90 b/mlprec/mld_prec_mod.f90 index 5dc5a011..91995d85 100644 --- a/mlprec/mld_prec_mod.f90 +++ b/mlprec/mld_prec_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_prec_type.f90 b/mlprec/mld_prec_type.f90 index 6a1b4a25..cf1b8ff2 100644 --- a/mlprec/mld_prec_type.f90 +++ b/mlprec/mld_prec_type.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_as_smoother.f90 b/mlprec/mld_s_as_smoother.f90 index d913fecf..b5f3b0ea 100644 --- a/mlprec/mld_s_as_smoother.f90 +++ b/mlprec/mld_s_as_smoother.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_base_aggregator_mod.f90 b/mlprec/mld_s_base_aggregator_mod.f90 new file mode 100644 index 00000000..f668023a --- /dev/null +++ b/mlprec/mld_s_base_aggregator_mod.f90 @@ -0,0 +1,248 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. The basic version is the +! decoupled aggregation algorithm presented in +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_s_base_aggregator_mod + + use mld_base_prec_type, only : mld_sml_parms + use psb_base_mod, only : psb_sspmat_type, psb_s_vect_type, & + & psb_s_base_vect_type, psb_slinmap_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, psb_desc_type, psb_i_base_vect_type, & + & psb_erractionsave, psb_error_handler, psb_success_ + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type mld_s_base_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_s_base_aggregator_build_tprol + procedure, pass(ag) :: mat_asb => mld_s_base_aggregator_mat_asb + procedure, pass(ag) :: update_next => mld_s_base_aggregator_update_next + procedure, pass(ag) :: clone => mld_s_base_aggregator_clone + procedure, pass(ag) :: free => mld_s_base_aggregator_free + procedure, pass(ag) :: default => mld_s_base_aggregator_default + procedure, pass(ag) :: descr => mld_s_base_aggregator_descr + procedure, pass(ag) :: set_aggr_type => mld_s_base_aggregator_set_aggr_type + procedure, nopass :: fmt => mld_s_base_aggregator_fmt + end type mld_s_base_aggregator_type + + +contains + + subroutine mld_s_base_aggregator_update_next(ag,agnext,info) + implicit none + class(mld_s_base_aggregator_type), target, intent(inout) :: ag, agnext + integer(psb_ipk_), intent(out) :: info + + ! + ! Base version does nothing. + ! + info = 0 + end subroutine mld_s_base_aggregator_update_next + + subroutine mld_s_base_aggregator_clone(ag,agnext,info) + implicit none + class(mld_s_base_aggregator_type), intent(inout) :: ag + class(mld_s_base_aggregator_type), allocatable, intent(inout) :: agnext + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(agnext)) then + call agnext%free(info) + if (info == 0) deallocate(agnext,stat=info) + end if + if (info /= 0) return + allocate(agnext,source=ag,stat=info) + + end subroutine mld_s_base_aggregator_clone + + subroutine mld_s_base_aggregator_free(ag,info) + implicit none + class(mld_s_base_aggregator_type), intent(inout) :: ag + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + return + end subroutine mld_s_base_aggregator_free + + subroutine mld_s_base_aggregator_default(ag) + implicit none + class(mld_s_base_aggregator_type), intent(inout) :: ag + + ! Here we need do nothing + + return + end subroutine mld_s_base_aggregator_default + + function mld_s_base_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Null " + end function mld_s_base_aggregator_fmt + + subroutine mld_s_base_aggregator_descr(ag,parms,iout,info) + implicit none + class(mld_s_base_aggregator_type), intent(in) :: ag + type(mld_sml_parms), intent(in) :: parms + integer(psb_ipk_), intent(in) :: iout + integer(psb_ipk_), intent(out) :: info + + call parms%mldescr(iout,info) + + return + end subroutine mld_s_base_aggregator_descr + + subroutine mld_s_base_aggregator_set_aggr_type(ag,parms,info) + implicit none + class(mld_s_base_aggregator_type), intent(inout) :: ag + type(mld_sml_parms), intent(in) :: parms + integer(psb_ipk_), intent(out) :: info + + ! Do nothing + + return + end subroutine mld_s_base_aggregator_set_aggr_type + + subroutine mld_s_base_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + implicit none + class(mld_s_base_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_sspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: err_act + character(len=20) :: name='s_base_aggregator_build_tprol' + + call psb_erractionsave(err_act) + + info = psb_err_missing_override_method_ + call psb_errpush(info,name) + goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + end subroutine mld_s_base_aggregator_build_tprol + + + subroutine mld_s_base_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + use psb_base_mod + implicit none + class(mld_s_base_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_sspmat_type), intent(inout) :: op_prol + type(psb_sspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: err_act + character(len=20) :: name='s_base_aggregator_mat_asb' + + call psb_erractionsave(err_act) + + info = psb_err_missing_override_method_ + call psb_errpush(info,name) + goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + end subroutine mld_s_base_aggregator_mat_asb + + +end module mld_s_base_aggregator_mod diff --git a/mlprec/mld_s_base_smoother_mod.f90 b/mlprec/mld_s_base_smoother_mod.f90 index ef4f9aaf..c99ddc6c 100644 --- a/mlprec/mld_s_base_smoother_mod.f90 +++ b/mlprec/mld_s_base_smoother_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_base_solver_mod.f90 b/mlprec/mld_s_base_solver_mod.f90 index 9cc099e4..388b1223 100644 --- a/mlprec/mld_s_base_solver_mod.f90 +++ b/mlprec/mld_s_base_solver_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_dec_aggregator_mod.f90 b/mlprec/mld_s_dec_aggregator_mod.f90 new file mode 100644 index 00000000..f1c80053 --- /dev/null +++ b/mlprec/mld_s_dec_aggregator_mod.f90 @@ -0,0 +1,193 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_s_dec_aggregator_mod + + use mld_s_base_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_s_base_aggregator_type) :: mld_s_dec_aggregator_type + procedure(mld_s_map_bld), nopass, pointer :: map_bld => null() + + contains + procedure, pass(ag) :: bld_tprol => mld_s_dec_aggregator_build_tprol + procedure, pass(ag) :: mat_asb => mld_s_dec_aggregator_mat_asb + procedure, pass(ag) :: default => mld_s_dec_aggregator_default + procedure, pass(ag) :: set_aggr_type => mld_s_dec_aggregator_set_aggr_type + procedure, nopass :: fmt => mld_s_dec_aggregator_fmt + end type mld_s_dec_aggregator_type + + + abstract interface + subroutine mld_s_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) + import :: psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_ + implicit none + integer(psb_ipk_), intent(in) :: iorder + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(psb_spk_), intent(in) :: theta + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), intent(out) :: info + end subroutine mld_s_map_bld + end interface + + procedure(mld_s_map_bld) :: mld_s_soc1_map_bld, mld_s_soc2_map_bld + + interface + subroutine mld_s_dec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_s_dec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, mld_sml_parms + implicit none + class(mld_s_dec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_sspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_s_dec_aggregator_build_tprol + end interface + + interface + subroutine mld_s_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + import :: mld_s_dec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, mld_sml_parms + implicit none + class(mld_s_dec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_sspmat_type), intent(inout) :: op_prol + type(psb_sspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + end subroutine mld_s_dec_aggregator_mat_asb + end interface + + +contains + + subroutine mld_s_dec_aggregator_set_aggr_type(ag,parms,info) + use mld_base_prec_type + implicit none + class(mld_s_dec_aggregator_type), intent(inout) :: ag + type(mld_sml_parms), intent(in) :: parms + integer(psb_ipk_), intent(out) :: info + + select case(parms%aggr_type) + case (mld_noalg_) + ag%map_bld => null() + case (mld_soc1_) + ag%map_bld => mld_s_soc1_map_bld + case (mld_soc2_) + ag%map_bld => mld_s_soc2_map_bld + case default + write(0,*) 'Unknown aggregation type, defaulting to SOC1' + ag%map_bld => mld_s_soc1_map_bld + end select + + return + end subroutine mld_s_dec_aggregator_set_aggr_type + + + subroutine mld_s_dec_aggregator_default(ag) + implicit none + class(mld_s_dec_aggregator_type), intent(inout) :: ag + + ag%map_bld => mld_s_soc1_map_bld + + return + end subroutine mld_s_dec_aggregator_default + + function mld_s_dec_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Decoupled aggregation" + end function mld_s_dec_aggregator_fmt + +end module mld_s_dec_aggregator_mod diff --git a/mlprec/mld_s_diag_solver.f90 b/mlprec/mld_s_diag_solver.f90 index ed54a6b6..8ad4eb8c 100644 --- a/mlprec/mld_s_diag_solver.f90 +++ b/mlprec/mld_s_diag_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_gs_solver.f90 b/mlprec/mld_s_gs_solver.f90 index 68afda7f..684efae5 100644 --- a/mlprec/mld_s_gs_solver.f90 +++ b/mlprec/mld_s_gs_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_hybrid_aggregator_mod.F90 b/mlprec/mld_s_hybrid_aggregator_mod.F90 new file mode 100644 index 00000000..b8a1ce23 --- /dev/null +++ b/mlprec/mld_s_hybrid_aggregator_mod.F90 @@ -0,0 +1,125 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the hybrid method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! +module mld_s_hybrid_aggregator_mod + + use mld_s_dec_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_s_dec_aggregator_type) :: mld_s_hybrid_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_s_hybrid_aggregator_build_tprol + procedure, nopass :: fmt => mld_s_hybrid_aggregator_fmt + end type mld_s_hybrid_aggregator_type + + + interface + subroutine mld_s_hybrid_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_s_hybrid_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, mld_sml_parms + implicit none + class(mld_s_hybrid_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_sspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_s_hybrid_aggregator_build_tprol + end interface + +contains + + + function mld_s_hybrid_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Hybrid Decoupled aggregation" + end function mld_s_hybrid_aggregator_fmt + + +end module mld_s_hybrid_aggregator_mod diff --git a/mlprec/mld_s_id_solver.f90 b/mlprec/mld_s_id_solver.f90 index e6ffa7d2..f483935a 100644 --- a/mlprec/mld_s_id_solver.f90 +++ b/mlprec/mld_s_id_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_ilu_fact_mod.f90 b/mlprec/mld_s_ilu_fact_mod.f90 index fc109093..0722a423 100644 --- a/mlprec/mld_s_ilu_fact_mod.f90 +++ b/mlprec/mld_s_ilu_fact_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_ilu_solver.f90 b/mlprec/mld_s_ilu_solver.f90 index 02b41e7c..08a83ca2 100644 --- a/mlprec/mld_s_ilu_solver.f90 +++ b/mlprec/mld_s_ilu_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_inner_mod.f90 b/mlprec/mld_s_inner_mod.f90 index 581b943e..55bd0ad0 100644 --- a/mlprec/mld_s_inner_mod.f90 +++ b/mlprec/mld_s_inner_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -44,7 +44,7 @@ ! The interfaces of the user level routines are defined in mld_prec_mod.f90. ! module mld_s_inner_mod -! use mld_s_prec_type, only : mld_s_prec_type + use psb_base_mod, only : psb_sspmat_type, psb_desc_type, psb_i_base_vect_type, & & psb_spk_, psb_s_base_sparse_mat, psb_s_base_vect_type, psb_ipk_, & & psb_s_vect_type @@ -122,22 +122,19 @@ module mld_s_inner_mod integer(psb_ipk_), intent(out) :: info end subroutine mld_saggrmap_bld end interface mld_aggrmap_bld - - - interface mld_dec_map_bld - subroutine mld_s_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) - import :: psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_ + + interface mld_map_to_tprol + subroutine mld_s_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod, only : psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_ + use mld_s_prec_type, only : mld_s_onelev_type implicit none - integer(psb_ipk_), intent(in) :: iorder - type(psb_sspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a - real(psb_spk_), intent(in) :: theta - integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) - integer(psb_ipk_), intent(out) :: info - end subroutine mld_s_dec_map_bld - end interface mld_dec_map_bld - - + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) + type(psb_sspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_s_map_to_tprol + end interface mld_map_to_tprol + interface mld_lev_mat_asb subroutine mld_s_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) import :: psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_ diff --git a/mlprec/mld_s_jac_smoother.f90 b/mlprec/mld_s_jac_smoother.f90 index ac36316b..a080da7f 100644 --- a/mlprec/mld_s_jac_smoother.f90 +++ b/mlprec/mld_s_jac_smoother.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_mumps_solver.F90 b/mlprec/mld_s_mumps_solver.F90 index 688c2043..a4974808 100644 --- a/mlprec/mld_s_mumps_solver.F90 +++ b/mlprec/mld_s_mumps_solver.F90 @@ -1,10 +1,10 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package -! based on PSBLAS (Parallel Sparse BLAS version 3.0) +! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! -! (C) Copyright 2008,2009,2010,2012,2013 +! (C) Copyright 2008-2018 ! ! Salvatore Filippone ! Pasqua D'Ambra diff --git a/mlprec/mld_s_onelev_mod.f90 b/mlprec/mld_s_onelev_mod.f90 index ffe86971..6de7f2f3 100644 --- a/mlprec/mld_s_onelev_mod.f90 +++ b/mlprec/mld_s_onelev_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,6 +55,7 @@ module mld_s_onelev_mod use mld_base_prec_type use mld_s_base_smoother_mod + use mld_s_dec_aggregator_mod use psb_base_mod, only : psb_sspmat_type, psb_s_vect_type, & & psb_s_base_vect_type, psb_slinmap_type, psb_spk_, & & psb_ipk_, psb_epk_, psb_desc_type, psb_i_base_vect_type, & @@ -136,9 +137,10 @@ module mld_s_onelev_mod & s_wrk_clone, s_wrk_move_alloc, s_wrk_cnv type mld_s_onelev_type - class(mld_s_base_smoother_type), allocatable :: sm, sm2a - class(mld_s_base_smoother_type), pointer :: sm2 => null() - class(mld_smlprec_wrk_type), allocatable :: wrk + class(mld_s_base_smoother_type), allocatable :: sm, sm2a + class(mld_s_base_smoother_type), pointer :: sm2 => null() + class(mld_smlprec_wrk_type), allocatable :: wrk + class(mld_s_base_aggregator_type), allocatable :: aggr type(mld_sml_parms) :: parms type(psb_sspmat_type) :: ac integer(psb_ipk_) :: ac_nz_loc, ac_nz_tot @@ -149,6 +151,9 @@ module mld_s_onelev_mod type(psb_slinmap_type) :: map real(psb_spk_) :: szratio contains + procedure, pass(lv) :: bld_tprol => s_base_onelev_bld_tprol + procedure, pass(lv) :: mat_asb => mld_s_base_onelev_mat_asb + procedure, pass(lv) :: update_aggr => s_base_onelev_update_aggr procedure, pass(lv) :: bld => mld_s_base_onelev_build procedure, pass(lv) :: clone => s_base_onelev_clone procedure, pass(lv) :: cnv => mld_s_base_onelev_cnv @@ -166,8 +171,9 @@ module mld_s_onelev_mod procedure, pass(lv) :: csetc => mld_s_base_onelev_csetc procedure, pass(lv) :: setsm => mld_s_base_onelev_setsm procedure, pass(lv) :: setsv => mld_s_base_onelev_setsv + procedure, pass(lv) :: setag => mld_s_base_onelev_setag generic, public :: set => seti, setr, setc, & - & cseti, csetr, csetc, setsm, setsv + & cseti, csetr, csetc, setsm, setsv, setag procedure, pass(lv) :: sizeof => s_base_onelev_sizeof procedure, pass(lv) :: get_nzeros => s_base_onelev_get_nzeros procedure, pass(lv) :: get_wrksz => s_base_onelev_get_wrksize @@ -175,6 +181,7 @@ module mld_s_onelev_mod procedure, pass(lv) :: free_wrk => s_base_onelev_free_wrk procedure, nopass :: stringval => mld_stringval procedure, pass(lv) :: move_alloc => s_base_onelev_move_alloc + end type mld_s_onelev_type type mld_s_onelev_node @@ -188,7 +195,19 @@ module mld_s_onelev_mod & s_base_onelev_get_wrksize, s_base_onelev_allocate_wrk, & & s_base_onelev_free_wrk - + interface + subroutine mld_s_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: psb_sspmat_type, psb_desc_type, psb_spk_, psb_ipk_ + import :: mld_s_onelev_type + implicit none + class(mld_s_onelev_type), intent(inout), target :: lv + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:),nlaggr(:) + type(psb_sspmat_type), intent(inout) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_s_base_onelev_mat_asb + end interface interface subroutine mld_s_base_onelev_build(lv,info,amold,vmold,imold) @@ -299,6 +318,20 @@ module mld_s_onelev_mod end subroutine mld_s_base_onelev_setsv end interface + interface + subroutine mld_s_base_onelev_setag(lv,val,info,pos) + import :: psb_spk_, mld_s_onelev_type, mld_s_base_aggregator_type, & + & psb_ipk_, psb_long_int_k_, psb_desc_type + Implicit None + + ! Arguments + class(mld_s_onelev_type), target, intent(inout) :: lv + class(mld_s_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + end subroutine mld_s_base_onelev_setag + end interface + interface subroutine mld_s_base_onelev_setc(lv,what,val,info,pos) import :: psb_sspmat_type, psb_s_vect_type, psb_s_base_vect_type, & @@ -323,9 +356,9 @@ module mld_s_onelev_mod class(mld_s_onelev_type), intent(inout) :: lv integer(psb_ipk_), intent(in) :: what - real(psb_spk_), intent(in) :: val + real(psb_spk_), intent(in) :: val integer(psb_ipk_), intent(out) :: info - character(len=*), optional, intent(in) :: pos + character(len=*), optional, intent(in) :: pos end subroutine mld_s_base_onelev_setr end interface @@ -450,12 +483,13 @@ contains Implicit None ! Arguments - class(mld_s_onelev_type), target, intent(inout) :: lv + class(mld_s_onelev_type), target, intent(inout) :: lv + integer(psb_ipk_) :: info lv%parms%sweeps_pre = 1 lv%parms%sweeps_post = 1 lv%parms%ml_cycle = mld_vcycle_ml_ - lv%parms%aggr_type = mld_vmb_ + lv%parms%aggr_type = mld_soc1_ lv%parms%par_aggr_alg = mld_dec_aggr_ lv%parms%aggr_ord = mld_aggr_ord_nat_ lv%parms%aggr_prol = mld_smooth_prol_ @@ -473,11 +507,36 @@ contains else lv%sm2 => lv%sm end if - + if (.not.allocated(lv%aggr)) allocate(mld_s_dec_aggregator_type :: lv%aggr,stat=info) + if (allocated(lv%aggr)) call lv%aggr%default() + return end subroutine s_base_onelev_default + subroutine s_base_onelev_bld_tprol(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) + implicit none + class(mld_s_onelev_type), intent(inout), target :: lv + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_sspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + call lv%aggr%bld_tprol(lv%parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + + end subroutine s_base_onelev_bld_tprol + + + subroutine s_base_onelev_update_aggr(lv,lvnext,info) + implicit none + class(mld_s_onelev_type), intent(inout), target :: lv, lvnext + integer(psb_ipk_), intent(out) :: info + + call lv%aggr%update_next(lvnext%aggr,info) + + end subroutine s_base_onelev_update_aggr + subroutine s_base_onelev_clone(lv,lvout,info) @@ -508,6 +567,14 @@ contains end if lvout%sm2 => lvout%sm end if + if (allocated(lv%aggr)) then + call lv%aggr%clone(lvout%aggr,info) + else + if (allocated(lvout%aggr)) then + call lvout%aggr%free(info) + if (info==psb_success_) deallocate(lvout%aggr,stat=info) + end if + end if if (info == psb_success_) call lv%parms%clone(lvout%parms,info) if (info == psb_success_) call lv%ac%clone(lvout%ac,info) if (info == psb_success_) call lv%tprol%clone(lvout%tprol,info) @@ -538,8 +605,9 @@ contains call move_alloc(lv%sm2a,b%sm2a) b%sm2 =>b%sm end if - - if (info == psb_success_) call psb_move_alloc(lv%ac,b%ac,info) + + call move_alloc(lv%aggr,b%aggr) + if (info == psb_success_) call psb_move_alloc(lv%ac,b%ac,info) if (info == psb_success_) call psb_move_alloc(lv%tprol,b%tprol,info) if (info == psb_success_) call psb_move_alloc(lv%desc_ac,b%desc_ac,info) if (info == psb_success_) call psb_move_alloc(lv%map,b%map,info) diff --git a/mlprec/mld_s_prec_mod.f90 b/mlprec/mld_s_prec_mod.f90 index b7e35d27..f7cd86bb 100644 --- a/mlprec/mld_s_prec_mod.f90 +++ b/mlprec/mld_s_prec_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,7 +55,8 @@ module mld_s_prec_mod interface mld_precset module procedure mld_s_iprecsetsm, mld_s_iprecsetsv, & & mld_s_iprecseti, mld_s_iprecsetc, mld_s_iprecsetr, & - & mld_s_cprecseti, mld_s_cprecsetc, mld_s_cprecsetr + & mld_s_cprecseti, mld_s_cprecsetc, mld_s_cprecsetr, & + & mld_s_iprecsetag end interface mld_precset interface mld_extprol_bld @@ -97,6 +98,14 @@ contains call p%set(val,info, pos=pos) end subroutine mld_s_iprecsetsv + subroutine mld_s_iprecsetag(p,val,info,pos) + type(mld_sprec_type), intent(inout) :: p + class(mld_s_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + call p%set(val,info, pos=pos) + end subroutine mld_s_iprecsetag + subroutine mld_s_iprecseti(p,what,val,info,pos) type(mld_sprec_type), intent(inout) :: p integer(psb_ipk_), intent(in) :: what diff --git a/mlprec/mld_s_prec_type.f90 b/mlprec/mld_s_prec_type.f90 index c585875e..341c17a3 100644 --- a/mlprec/mld_s_prec_type.f90 +++ b/mlprec/mld_s_prec_type.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,6 +55,7 @@ module mld_s_prec_type use mld_base_prec_type use mld_s_base_solver_mod use mld_s_base_smoother_mod + use mld_s_base_aggregator_mod use mld_s_onelev_mod use psb_prec_mod, only : psb_sprec_type @@ -92,8 +93,8 @@ module mld_s_prec_type ! 2. maximum number of levels. Defaults to 20 integer(psb_ipk_) :: max_levs = 20_psb_ipk_ ! 3. min_cr_ratio = 1.5 - real(psb_spk_) :: min_cr_ratio = 1.5_psb_spk_ - real(psb_spk_) :: op_complexity=szero + real(psb_spk_) :: min_cr_ratio = 1.5_psb_spk_ + real(psb_spk_) :: op_complexity = szero ! ! Number of outer sweeps. Sometimes 2 V-cycles may be better than 1 W-cycle. ! @@ -126,6 +127,7 @@ module mld_s_prec_type procedure, pass(prec) :: sizeof => mld_sprec_sizeof procedure, pass(prec) :: setsm => mld_sprecsetsm procedure, pass(prec) :: setsv => mld_sprecsetsv + procedure, pass(prec) :: setag => mld_sprecsetag procedure, pass(prec) :: seti => mld_sprecseti procedure, pass(prec) :: setc => mld_sprecsetc procedure, pass(prec) :: setr => mld_sprecsetr @@ -133,7 +135,7 @@ module mld_s_prec_type procedure, pass(prec) :: csetc => mld_scprecsetc procedure, pass(prec) :: csetr => mld_scprecsetr generic, public :: set => seti, setc, setr, & - & cseti, csetc, csetr, setsm, setsv + & cseti, csetc, csetr, setsm, setsv, setag procedure, pass(prec) :: get_smoother => mld_s_get_smootherp procedure, pass(prec) :: get_solver => mld_s_get_solverp procedure, pass(prec) :: move_alloc => s_prec_move_alloc @@ -234,6 +236,15 @@ module mld_s_prec_type integer(psb_ipk_), optional, intent(in) :: ilev,ilmax character(len=*), optional, intent(in) :: pos end subroutine mld_sprecsetsv + subroutine mld_sprecsetag(prec,val,info,ilev,pos) + import :: psb_sspmat_type, psb_desc_type, psb_spk_, & + & mld_sprec_type, mld_s_base_aggregator_type, psb_ipk_ + class(mld_sprec_type), intent(inout) :: prec + class(mld_s_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional, intent(in) :: ilev + character(len=*), optional, intent(in) :: pos + end subroutine mld_sprecsetag subroutine mld_sprecseti(prec,what,val,info,ilev,ilmax,pos) import :: psb_sspmat_type, psb_desc_type, psb_spk_, & & mld_sprec_type, psb_ipk_ diff --git a/mlprec/mld_s_slu_solver.F90 b/mlprec/mld_s_slu_solver.F90 index 45655ee2..75663fb0 100644 --- a/mlprec/mld_s_slu_solver.F90 +++ b/mlprec/mld_s_slu_solver.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_s_symdec_aggregator_mod.f90 b/mlprec/mld_s_symdec_aggregator_mod.f90 new file mode 100644 index 00000000..152ede99 --- /dev/null +++ b/mlprec/mld_s_symdec_aggregator_mod.f90 @@ -0,0 +1,127 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This version only differs from the +! basic decoupled aggregation algorithm because it works on (the +! pattern of) A+A^T instead of A. +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_s_symdec_aggregator_mod + + use mld_s_dec_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_s_dec_aggregator_type) :: mld_s_symdec_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_s_symdec_aggregator_build_tprol + procedure, nopass :: fmt => mld_s_symdec_aggregator_fmt + end type mld_s_symdec_aggregator_type + + + interface + subroutine mld_s_symdec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_s_symdec_aggregator_type, psb_desc_type, psb_sspmat_type, psb_spk_, & + & psb_ipk_, psb_long_int_k_, mld_sml_parms + implicit none + class(mld_s_symdec_aggregator_type), target, intent(inout) :: ag + type(mld_sml_parms), intent(inout) :: parms + type(psb_sspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_sspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_s_symdec_aggregator_build_tprol + end interface + + +contains + + function mld_s_symdec_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Symmetric Decoupled aggregation" + end function mld_s_symdec_aggregator_fmt + +end module mld_s_symdec_aggregator_mod diff --git a/mlprec/mld_z_as_smoother.f90 b/mlprec/mld_z_as_smoother.f90 index fc4ed662..0b023a5d 100644 --- a/mlprec/mld_z_as_smoother.f90 +++ b/mlprec/mld_z_as_smoother.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_base_aggregator_mod.f90 b/mlprec/mld_z_base_aggregator_mod.f90 new file mode 100644 index 00000000..660bc415 --- /dev/null +++ b/mlprec/mld_z_base_aggregator_mod.f90 @@ -0,0 +1,248 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. The basic version is the +! decoupled aggregation algorithm presented in +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_z_base_aggregator_mod + + use mld_base_prec_type, only : mld_dml_parms + use psb_base_mod, only : psb_zspmat_type, psb_z_vect_type, & + & psb_z_base_vect_type, psb_zlinmap_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, psb_desc_type, psb_i_base_vect_type, & + & psb_erractionsave, psb_error_handler, psb_success_ + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type mld_z_base_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_z_base_aggregator_build_tprol + procedure, pass(ag) :: mat_asb => mld_z_base_aggregator_mat_asb + procedure, pass(ag) :: update_next => mld_z_base_aggregator_update_next + procedure, pass(ag) :: clone => mld_z_base_aggregator_clone + procedure, pass(ag) :: free => mld_z_base_aggregator_free + procedure, pass(ag) :: default => mld_z_base_aggregator_default + procedure, pass(ag) :: descr => mld_z_base_aggregator_descr + procedure, pass(ag) :: set_aggr_type => mld_z_base_aggregator_set_aggr_type + procedure, nopass :: fmt => mld_z_base_aggregator_fmt + end type mld_z_base_aggregator_type + + +contains + + subroutine mld_z_base_aggregator_update_next(ag,agnext,info) + implicit none + class(mld_z_base_aggregator_type), target, intent(inout) :: ag, agnext + integer(psb_ipk_), intent(out) :: info + + ! + ! Base version does nothing. + ! + info = 0 + end subroutine mld_z_base_aggregator_update_next + + subroutine mld_z_base_aggregator_clone(ag,agnext,info) + implicit none + class(mld_z_base_aggregator_type), intent(inout) :: ag + class(mld_z_base_aggregator_type), allocatable, intent(inout) :: agnext + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(agnext)) then + call agnext%free(info) + if (info == 0) deallocate(agnext,stat=info) + end if + if (info /= 0) return + allocate(agnext,source=ag,stat=info) + + end subroutine mld_z_base_aggregator_clone + + subroutine mld_z_base_aggregator_free(ag,info) + implicit none + class(mld_z_base_aggregator_type), intent(inout) :: ag + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + return + end subroutine mld_z_base_aggregator_free + + subroutine mld_z_base_aggregator_default(ag) + implicit none + class(mld_z_base_aggregator_type), intent(inout) :: ag + + ! Here we need do nothing + + return + end subroutine mld_z_base_aggregator_default + + function mld_z_base_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Null " + end function mld_z_base_aggregator_fmt + + subroutine mld_z_base_aggregator_descr(ag,parms,iout,info) + implicit none + class(mld_z_base_aggregator_type), intent(in) :: ag + type(mld_dml_parms), intent(in) :: parms + integer(psb_ipk_), intent(in) :: iout + integer(psb_ipk_), intent(out) :: info + + call parms%mldescr(iout,info) + + return + end subroutine mld_z_base_aggregator_descr + + subroutine mld_z_base_aggregator_set_aggr_type(ag,parms,info) + implicit none + class(mld_z_base_aggregator_type), intent(inout) :: ag + type(mld_dml_parms), intent(in) :: parms + integer(psb_ipk_), intent(out) :: info + + ! Do nothing + + return + end subroutine mld_z_base_aggregator_set_aggr_type + + subroutine mld_z_base_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + implicit none + class(mld_z_base_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_zspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: err_act + character(len=20) :: name='z_base_aggregator_build_tprol' + + call psb_erractionsave(err_act) + + info = psb_err_missing_override_method_ + call psb_errpush(info,name) + goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + end subroutine mld_z_base_aggregator_build_tprol + + + subroutine mld_z_base_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + use psb_base_mod + implicit none + class(mld_z_base_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_zspmat_type), intent(inout) :: op_prol + type(psb_zspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: err_act + character(len=20) :: name='z_base_aggregator_mat_asb' + + call psb_erractionsave(err_act) + + info = psb_err_missing_override_method_ + call psb_errpush(info,name) + goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + end subroutine mld_z_base_aggregator_mat_asb + + +end module mld_z_base_aggregator_mod diff --git a/mlprec/mld_z_base_smoother_mod.f90 b/mlprec/mld_z_base_smoother_mod.f90 index 2078f4b0..d386a139 100644 --- a/mlprec/mld_z_base_smoother_mod.f90 +++ b/mlprec/mld_z_base_smoother_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_base_solver_mod.f90 b/mlprec/mld_z_base_solver_mod.f90 index 5ce32efe..52c8a45f 100644 --- a/mlprec/mld_z_base_solver_mod.f90 +++ b/mlprec/mld_z_base_solver_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_dec_aggregator_mod.f90 b/mlprec/mld_z_dec_aggregator_mod.f90 new file mode 100644 index 00000000..6930230b --- /dev/null +++ b/mlprec/mld_z_dec_aggregator_mod.f90 @@ -0,0 +1,193 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_z_dec_aggregator_mod + + use mld_z_base_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_z_base_aggregator_type) :: mld_z_dec_aggregator_type + procedure(mld_z_map_bld), nopass, pointer :: map_bld => null() + + contains + procedure, pass(ag) :: bld_tprol => mld_z_dec_aggregator_build_tprol + procedure, pass(ag) :: mat_asb => mld_z_dec_aggregator_mat_asb + procedure, pass(ag) :: default => mld_z_dec_aggregator_default + procedure, pass(ag) :: set_aggr_type => mld_z_dec_aggregator_set_aggr_type + procedure, nopass :: fmt => mld_z_dec_aggregator_fmt + end type mld_z_dec_aggregator_type + + + abstract interface + subroutine mld_z_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) + import :: psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ + implicit none + integer(psb_ipk_), intent(in) :: iorder + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + real(psb_dpk_), intent(in) :: theta + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + integer(psb_ipk_), intent(out) :: info + end subroutine mld_z_map_bld + end interface + + procedure(mld_z_map_bld) :: mld_z_soc1_map_bld, mld_z_soc2_map_bld + + interface + subroutine mld_z_dec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_z_dec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_z_dec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_zspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_z_dec_aggregator_build_tprol + end interface + + interface + subroutine mld_z_dec_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + import :: mld_z_dec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_z_dec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_zspmat_type), intent(inout) :: op_prol + type(psb_zspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + end subroutine mld_z_dec_aggregator_mat_asb + end interface + + +contains + + subroutine mld_z_dec_aggregator_set_aggr_type(ag,parms,info) + use mld_base_prec_type + implicit none + class(mld_z_dec_aggregator_type), intent(inout) :: ag + type(mld_dml_parms), intent(in) :: parms + integer(psb_ipk_), intent(out) :: info + + select case(parms%aggr_type) + case (mld_noalg_) + ag%map_bld => null() + case (mld_soc1_) + ag%map_bld => mld_z_soc1_map_bld + case (mld_soc2_) + ag%map_bld => mld_z_soc2_map_bld + case default + write(0,*) 'Unknown aggregation type, defaulting to SOC1' + ag%map_bld => mld_z_soc1_map_bld + end select + + return + end subroutine mld_z_dec_aggregator_set_aggr_type + + + subroutine mld_z_dec_aggregator_default(ag) + implicit none + class(mld_z_dec_aggregator_type), intent(inout) :: ag + + ag%map_bld => mld_z_soc1_map_bld + + return + end subroutine mld_z_dec_aggregator_default + + function mld_z_dec_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Decoupled aggregation" + end function mld_z_dec_aggregator_fmt + +end module mld_z_dec_aggregator_mod diff --git a/mlprec/mld_z_diag_solver.f90 b/mlprec/mld_z_diag_solver.f90 index 17540512..74ada7f2 100644 --- a/mlprec/mld_z_diag_solver.f90 +++ b/mlprec/mld_z_diag_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_gs_solver.f90 b/mlprec/mld_z_gs_solver.f90 index 18d2c385..96564ee5 100644 --- a/mlprec/mld_z_gs_solver.f90 +++ b/mlprec/mld_z_gs_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_hybrid_aggregator_mod.F90 b/mlprec/mld_z_hybrid_aggregator_mod.F90 new file mode 100644 index 00000000..75ff9719 --- /dev/null +++ b/mlprec/mld_z_hybrid_aggregator_mod.F90 @@ -0,0 +1,125 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the hybrid method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! +module mld_z_hybrid_aggregator_mod + + use mld_z_dec_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_z_dec_aggregator_type) :: mld_z_hybrid_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_z_hybrid_aggregator_build_tprol + procedure, nopass :: fmt => mld_z_hybrid_aggregator_fmt + end type mld_z_hybrid_aggregator_type + + + interface + subroutine mld_z_hybrid_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_z_hybrid_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_z_hybrid_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_zspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_z_hybrid_aggregator_build_tprol + end interface + +contains + + + function mld_z_hybrid_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Hybrid Decoupled aggregation" + end function mld_z_hybrid_aggregator_fmt + + +end module mld_z_hybrid_aggregator_mod diff --git a/mlprec/mld_z_id_solver.f90 b/mlprec/mld_z_id_solver.f90 index 561cd0fa..8775c5a4 100644 --- a/mlprec/mld_z_id_solver.f90 +++ b/mlprec/mld_z_id_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_ilu_fact_mod.f90 b/mlprec/mld_z_ilu_fact_mod.f90 index 6bed0435..80edcf81 100644 --- a/mlprec/mld_z_ilu_fact_mod.f90 +++ b/mlprec/mld_z_ilu_fact_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_ilu_solver.f90 b/mlprec/mld_z_ilu_solver.f90 index c1fbcdfa..964ff332 100644 --- a/mlprec/mld_z_ilu_solver.f90 +++ b/mlprec/mld_z_ilu_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_inner_mod.f90 b/mlprec/mld_z_inner_mod.f90 index 12860b7b..04c41c4f 100644 --- a/mlprec/mld_z_inner_mod.f90 +++ b/mlprec/mld_z_inner_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -44,7 +44,7 @@ ! The interfaces of the user level routines are defined in mld_prec_mod.f90. ! module mld_z_inner_mod -! use mld_z_prec_type, only : mld_z_prec_type + use psb_base_mod, only : psb_zspmat_type, psb_desc_type, psb_i_base_vect_type, & & psb_dpk_, psb_z_base_sparse_mat, psb_z_base_vect_type, psb_ipk_, & & psb_z_vect_type @@ -122,22 +122,19 @@ module mld_z_inner_mod integer(psb_ipk_), intent(out) :: info end subroutine mld_zaggrmap_bld end interface mld_aggrmap_bld - - - interface mld_dec_map_bld - subroutine mld_z_dec_map_bld(iorder,theta,a,desc_a,nlaggr,ilaggr,info) - import :: psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ + + interface mld_map_to_tprol + subroutine mld_z_map_to_tprol(desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod, only : psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ + use mld_z_prec_type, only : mld_z_onelev_type implicit none - integer(psb_ipk_), intent(in) :: iorder - type(psb_zspmat_type), intent(in) :: a - type(psb_desc_type), intent(in) :: desc_a - real(psb_dpk_), intent(in) :: theta - integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) - integer(psb_ipk_), intent(out) :: info - end subroutine mld_z_dec_map_bld - end interface mld_dec_map_bld - - + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) + type(psb_zspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_z_map_to_tprol + end interface mld_map_to_tprol + interface mld_lev_mat_asb subroutine mld_z_lev_aggrmat_asb(p,a,desc_a,ilaggr,nlaggr,op_prol,info) import :: psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ diff --git a/mlprec/mld_z_jac_smoother.f90 b/mlprec/mld_z_jac_smoother.f90 index 36219447..e5518c97 100644 --- a/mlprec/mld_z_jac_smoother.f90 +++ b/mlprec/mld_z_jac_smoother.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_mumps_solver.F90 b/mlprec/mld_z_mumps_solver.F90 index 1c4e0cbc..efa51b33 100644 --- a/mlprec/mld_z_mumps_solver.F90 +++ b/mlprec/mld_z_mumps_solver.F90 @@ -1,10 +1,10 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package -! based on PSBLAS (Parallel Sparse BLAS version 3.0) +! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! -! (C) Copyright 2008,2009,2010,2012,2013 +! (C) Copyright 2008-2018 ! ! Salvatore Filippone ! Pasqua D'Ambra diff --git a/mlprec/mld_z_onelev_mod.f90 b/mlprec/mld_z_onelev_mod.f90 index b262bbe0..bf4a5e8f 100644 --- a/mlprec/mld_z_onelev_mod.f90 +++ b/mlprec/mld_z_onelev_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,6 +55,7 @@ module mld_z_onelev_mod use mld_base_prec_type use mld_z_base_smoother_mod + use mld_z_dec_aggregator_mod use psb_base_mod, only : psb_zspmat_type, psb_z_vect_type, & & psb_z_base_vect_type, psb_zlinmap_type, psb_dpk_, & & psb_ipk_, psb_epk_, psb_desc_type, psb_i_base_vect_type, & @@ -136,9 +137,10 @@ module mld_z_onelev_mod & z_wrk_clone, z_wrk_move_alloc, z_wrk_cnv type mld_z_onelev_type - class(mld_z_base_smoother_type), allocatable :: sm, sm2a - class(mld_z_base_smoother_type), pointer :: sm2 => null() - class(mld_zmlprec_wrk_type), allocatable :: wrk + class(mld_z_base_smoother_type), allocatable :: sm, sm2a + class(mld_z_base_smoother_type), pointer :: sm2 => null() + class(mld_zmlprec_wrk_type), allocatable :: wrk + class(mld_z_base_aggregator_type), allocatable :: aggr type(mld_dml_parms) :: parms type(psb_zspmat_type) :: ac integer(psb_ipk_) :: ac_nz_loc, ac_nz_tot @@ -149,6 +151,9 @@ module mld_z_onelev_mod type(psb_zlinmap_type) :: map real(psb_dpk_) :: szratio contains + procedure, pass(lv) :: bld_tprol => z_base_onelev_bld_tprol + procedure, pass(lv) :: mat_asb => mld_z_base_onelev_mat_asb + procedure, pass(lv) :: update_aggr => z_base_onelev_update_aggr procedure, pass(lv) :: bld => mld_z_base_onelev_build procedure, pass(lv) :: clone => z_base_onelev_clone procedure, pass(lv) :: cnv => mld_z_base_onelev_cnv @@ -166,8 +171,9 @@ module mld_z_onelev_mod procedure, pass(lv) :: csetc => mld_z_base_onelev_csetc procedure, pass(lv) :: setsm => mld_z_base_onelev_setsm procedure, pass(lv) :: setsv => mld_z_base_onelev_setsv + procedure, pass(lv) :: setag => mld_z_base_onelev_setag generic, public :: set => seti, setr, setc, & - & cseti, csetr, csetc, setsm, setsv + & cseti, csetr, csetc, setsm, setsv, setag procedure, pass(lv) :: sizeof => z_base_onelev_sizeof procedure, pass(lv) :: get_nzeros => z_base_onelev_get_nzeros procedure, pass(lv) :: get_wrksz => z_base_onelev_get_wrksize @@ -175,6 +181,7 @@ module mld_z_onelev_mod procedure, pass(lv) :: free_wrk => z_base_onelev_free_wrk procedure, nopass :: stringval => mld_stringval procedure, pass(lv) :: move_alloc => z_base_onelev_move_alloc + end type mld_z_onelev_type type mld_z_onelev_node @@ -188,7 +195,19 @@ module mld_z_onelev_mod & z_base_onelev_get_wrksize, z_base_onelev_allocate_wrk, & & z_base_onelev_free_wrk - + interface + subroutine mld_z_base_onelev_mat_asb(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: psb_zspmat_type, psb_desc_type, psb_dpk_, psb_ipk_ + import :: mld_z_onelev_type + implicit none + class(mld_z_onelev_type), intent(inout), target :: lv + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:),nlaggr(:) + type(psb_zspmat_type), intent(inout) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_z_base_onelev_mat_asb + end interface interface subroutine mld_z_base_onelev_build(lv,info,amold,vmold,imold) @@ -299,6 +318,20 @@ module mld_z_onelev_mod end subroutine mld_z_base_onelev_setsv end interface + interface + subroutine mld_z_base_onelev_setag(lv,val,info,pos) + import :: psb_dpk_, mld_z_onelev_type, mld_z_base_aggregator_type, & + & psb_ipk_, psb_long_int_k_, psb_desc_type + Implicit None + + ! Arguments + class(mld_z_onelev_type), target, intent(inout) :: lv + class(mld_z_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + end subroutine mld_z_base_onelev_setag + end interface + interface subroutine mld_z_base_onelev_setc(lv,what,val,info,pos) import :: psb_zspmat_type, psb_z_vect_type, psb_z_base_vect_type, & @@ -323,9 +356,9 @@ module mld_z_onelev_mod class(mld_z_onelev_type), intent(inout) :: lv integer(psb_ipk_), intent(in) :: what - real(psb_dpk_), intent(in) :: val + real(psb_dpk_), intent(in) :: val integer(psb_ipk_), intent(out) :: info - character(len=*), optional, intent(in) :: pos + character(len=*), optional, intent(in) :: pos end subroutine mld_z_base_onelev_setr end interface @@ -450,12 +483,13 @@ contains Implicit None ! Arguments - class(mld_z_onelev_type), target, intent(inout) :: lv + class(mld_z_onelev_type), target, intent(inout) :: lv + integer(psb_ipk_) :: info lv%parms%sweeps_pre = 1 lv%parms%sweeps_post = 1 lv%parms%ml_cycle = mld_vcycle_ml_ - lv%parms%aggr_type = mld_vmb_ + lv%parms%aggr_type = mld_soc1_ lv%parms%par_aggr_alg = mld_dec_aggr_ lv%parms%aggr_ord = mld_aggr_ord_nat_ lv%parms%aggr_prol = mld_smooth_prol_ @@ -473,11 +507,36 @@ contains else lv%sm2 => lv%sm end if - + if (.not.allocated(lv%aggr)) allocate(mld_z_dec_aggregator_type :: lv%aggr,stat=info) + if (allocated(lv%aggr)) call lv%aggr%default() + return end subroutine z_base_onelev_default + subroutine z_base_onelev_bld_tprol(lv,a,desc_a,ilaggr,nlaggr,op_prol,info) + implicit none + class(mld_z_onelev_type), intent(inout), target :: lv + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_zspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + call lv%aggr%bld_tprol(lv%parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + + end subroutine z_base_onelev_bld_tprol + + + subroutine z_base_onelev_update_aggr(lv,lvnext,info) + implicit none + class(mld_z_onelev_type), intent(inout), target :: lv, lvnext + integer(psb_ipk_), intent(out) :: info + + call lv%aggr%update_next(lvnext%aggr,info) + + end subroutine z_base_onelev_update_aggr + subroutine z_base_onelev_clone(lv,lvout,info) @@ -508,6 +567,14 @@ contains end if lvout%sm2 => lvout%sm end if + if (allocated(lv%aggr)) then + call lv%aggr%clone(lvout%aggr,info) + else + if (allocated(lvout%aggr)) then + call lvout%aggr%free(info) + if (info==psb_success_) deallocate(lvout%aggr,stat=info) + end if + end if if (info == psb_success_) call lv%parms%clone(lvout%parms,info) if (info == psb_success_) call lv%ac%clone(lvout%ac,info) if (info == psb_success_) call lv%tprol%clone(lvout%tprol,info) @@ -538,8 +605,9 @@ contains call move_alloc(lv%sm2a,b%sm2a) b%sm2 =>b%sm end if - - if (info == psb_success_) call psb_move_alloc(lv%ac,b%ac,info) + + call move_alloc(lv%aggr,b%aggr) + if (info == psb_success_) call psb_move_alloc(lv%ac,b%ac,info) if (info == psb_success_) call psb_move_alloc(lv%tprol,b%tprol,info) if (info == psb_success_) call psb_move_alloc(lv%desc_ac,b%desc_ac,info) if (info == psb_success_) call psb_move_alloc(lv%map,b%map,info) diff --git a/mlprec/mld_z_prec_mod.f90 b/mlprec/mld_z_prec_mod.f90 index 1c094a84..2c402d10 100644 --- a/mlprec/mld_z_prec_mod.f90 +++ b/mlprec/mld_z_prec_mod.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,7 +55,8 @@ module mld_z_prec_mod interface mld_precset module procedure mld_z_iprecsetsm, mld_z_iprecsetsv, & & mld_z_iprecseti, mld_z_iprecsetc, mld_z_iprecsetr, & - & mld_z_cprecseti, mld_z_cprecsetc, mld_z_cprecsetr + & mld_z_cprecseti, mld_z_cprecsetc, mld_z_cprecsetr, & + & mld_z_iprecsetag end interface mld_precset interface mld_extprol_bld @@ -97,6 +98,14 @@ contains call p%set(val,info, pos=pos) end subroutine mld_z_iprecsetsv + subroutine mld_z_iprecsetag(p,val,info,pos) + type(mld_zprec_type), intent(inout) :: p + class(mld_z_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + character(len=*), optional, intent(in) :: pos + call p%set(val,info, pos=pos) + end subroutine mld_z_iprecsetag + subroutine mld_z_iprecseti(p,what,val,info,pos) type(mld_zprec_type), intent(inout) :: p integer(psb_ipk_), intent(in) :: what diff --git a/mlprec/mld_z_prec_type.f90 b/mlprec/mld_z_prec_type.f90 index c94fc30e..5318647e 100644 --- a/mlprec/mld_z_prec_type.f90 +++ b/mlprec/mld_z_prec_type.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -55,6 +55,7 @@ module mld_z_prec_type use mld_base_prec_type use mld_z_base_solver_mod use mld_z_base_smoother_mod + use mld_z_base_aggregator_mod use mld_z_onelev_mod use psb_prec_mod, only : psb_zprec_type @@ -92,8 +93,8 @@ module mld_z_prec_type ! 2. maximum number of levels. Defaults to 20 integer(psb_ipk_) :: max_levs = 20_psb_ipk_ ! 3. min_cr_ratio = 1.5 - real(psb_dpk_) :: min_cr_ratio = 1.5_psb_dpk_ - real(psb_dpk_) :: op_complexity=dzero + real(psb_dpk_) :: min_cr_ratio = 1.5_psb_dpk_ + real(psb_dpk_) :: op_complexity = dzero ! ! Number of outer sweeps. Sometimes 2 V-cycles may be better than 1 W-cycle. ! @@ -126,6 +127,7 @@ module mld_z_prec_type procedure, pass(prec) :: sizeof => mld_zprec_sizeof procedure, pass(prec) :: setsm => mld_zprecsetsm procedure, pass(prec) :: setsv => mld_zprecsetsv + procedure, pass(prec) :: setag => mld_zprecsetag procedure, pass(prec) :: seti => mld_zprecseti procedure, pass(prec) :: setc => mld_zprecsetc procedure, pass(prec) :: setr => mld_zprecsetr @@ -133,7 +135,7 @@ module mld_z_prec_type procedure, pass(prec) :: csetc => mld_zcprecsetc procedure, pass(prec) :: csetr => mld_zcprecsetr generic, public :: set => seti, setc, setr, & - & cseti, csetc, csetr, setsm, setsv + & cseti, csetc, csetr, setsm, setsv, setag procedure, pass(prec) :: get_smoother => mld_z_get_smootherp procedure, pass(prec) :: get_solver => mld_z_get_solverp procedure, pass(prec) :: move_alloc => z_prec_move_alloc @@ -234,6 +236,15 @@ module mld_z_prec_type integer(psb_ipk_), optional, intent(in) :: ilev,ilmax character(len=*), optional, intent(in) :: pos end subroutine mld_zprecsetsv + subroutine mld_zprecsetag(prec,val,info,ilev,pos) + import :: psb_zspmat_type, psb_desc_type, psb_dpk_, & + & mld_zprec_type, mld_z_base_aggregator_type, psb_ipk_ + class(mld_zprec_type), intent(inout) :: prec + class(mld_z_base_aggregator_type), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional, intent(in) :: ilev + character(len=*), optional, intent(in) :: pos + end subroutine mld_zprecsetag subroutine mld_zprecseti(prec,what,val,info,ilev,ilmax,pos) import :: psb_zspmat_type, psb_desc_type, psb_dpk_, & & mld_zprec_type, psb_ipk_ diff --git a/mlprec/mld_z_slu_solver.F90 b/mlprec/mld_z_slu_solver.F90 index 663686e4..c2ae2a2e 100644 --- a/mlprec/mld_z_slu_solver.F90 +++ b/mlprec/mld_z_slu_solver.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_sludist_solver.F90 b/mlprec/mld_z_sludist_solver.F90 index 397dbd8b..0f19bad0 100644 --- a/mlprec/mld_z_sludist_solver.F90 +++ b/mlprec/mld_z_sludist_solver.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/mlprec/mld_z_symdec_aggregator_mod.f90 b/mlprec/mld_z_symdec_aggregator_mod.f90 new file mode 100644 index 00000000..2044c273 --- /dev/null +++ b/mlprec/mld_z_symdec_aggregator_mod.f90 @@ -0,0 +1,127 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008-2018 +! +! Salvatore Filippone +! Pasqua D'Ambra +! Daniela di Serafino +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This version only differs from the +! basic decoupled aggregation algorithm because it works on (the +! pattern of) A+A^T instead of A. +! +! M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +module mld_z_symdec_aggregator_mod + + use mld_z_dec_aggregator_mod + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + type, extends(mld_z_dec_aggregator_type) :: mld_z_symdec_aggregator_type + + contains + procedure, pass(ag) :: bld_tprol => mld_z_symdec_aggregator_build_tprol + procedure, nopass :: fmt => mld_z_symdec_aggregator_fmt + end type mld_z_symdec_aggregator_type + + + interface + subroutine mld_z_symdec_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_z_symdec_aggregator_type, psb_desc_type, psb_zspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_z_symdec_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_zspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_zspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_z_symdec_aggregator_build_tprol + end interface + + +contains + + function mld_z_symdec_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "Symmetric Decoupled aggregation" + end function mld_z_symdec_aggregator_fmt + +end module mld_z_symdec_aggregator_mod diff --git a/mlprec/mld_z_umf_solver.F90 b/mlprec/mld_z_umf_solver.F90 index 879126d3..f5818e1d 100644 --- a/mlprec/mld_z_umf_solver.F90 +++ b/mlprec/mld_z_umf_solver.F90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/Bcmatch/mld_d_bcmatch_aggregator_mat_asb.f90 b/tests/Bcmatch/mld_d_bcmatch_aggregator_mat_asb.f90 new file mode 100644 index 00000000..750c068b --- /dev/null +++ b/tests/Bcmatch/mld_d_bcmatch_aggregator_mat_asb.f90 @@ -0,0 +1,225 @@ +! +! +! MLD2P4 version 2.1 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008, 2010, 2012, 2015, 2017 , 2017 +! +! Salvatore Filippone Cranfield University +! Ambra Abdullahi Hassan University of Rome Tor Vergata +! Pasqua D'Ambra IAC-CNR, Naples, IT +! Daniela di Serafino University of Campania "L. Vanvitelli", Caserta, IT +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! File: mld_d_base_aggregator_mat_asb.f90 +! +! Subroutine: mld_d_base_aggregator_mat_asb +! Version: real +! +! This routine builds the matrix associated to the current level of the +! multilevel preconditioner from the matrix associated to the previous level, +! by using the user-specified aggregation technique (therefore, it also builds the +! prolongation and restriction operators mapping the current level to the +! previous one and vice versa). +! The current level is regarded as the coarse one, while the previous as +! the fine one. This is in agreement with the fact that the routine is called, +! by mld_mlprec_bld, only on levels >=2. +! The coarse-level matrix A_C is built from a fine-level matrix A +! by using the Galerkin approach, i.e. +! +! A_C = P_C^T A P_C, +! +! where P_C is a prolongator from the coarse level to the fine one. +! +! A mapping from the nodes of the adjacency graph of A to the nodes of the +! adjacency graph of A_C has been computed by the mld_aggrmap_bld subroutine. +! The prolongator P_C is built here from this mapping, according to the +! value of p%iprcparm(mld_aggr_kind_), specified by the user through +! mld_dprecinit and mld_zprecset. +! On output from this routine the entries of AC, op_prol, op_restr +! are still in "global numbering" mode; this is fixed in the calling routine +! mld_d_lev_aggrmat_asb. +! +! Currently four different prolongators are implemented, corresponding to +! four aggregation algorithms: +! 1. un-smoothed aggregation, +! 2. smoothed aggregation, +! 3. "bizarre" aggregation. +! 4. minimum energy +! 1. The non-smoothed aggregation uses as prolongator the piecewise constant +! interpolation operator corresponding to the fine-to-coarse level mapping built +! by p%aggr%bld_tprol. This is called tentative prolongator. +! 2. The smoothed aggregation uses as prolongator the operator obtained by applying +! a damped Jacobi smoother to the tentative prolongator. +! 3. The "bizarre" aggregation uses a prolongator proposed by the authors of MLD2P4. +! This prolongator still requires a deep analysis and testing and its use is +! not recommended. +! 4. Minimum energy aggregation +! +! For more details see +! M. Brezina and P. Vanek, A black-box iterative solver based on a two-level +! Schwarz method, Computing, 63 (1999), 233-263. +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of PSBLAS-based +! parallel two-level Schwarz preconditioners, Appl. Num. Math., 57 (2007), +! 1181-1196. +! M. Sala, R. Tuminaro: A new Petrov-Galerkin smoothed aggregation preconditioner +! for nonsymmetric linear systems, SIAM J. Sci. Comput., 31(1):143-166 (2008) +! +! +! The main structure is: +! 1. Perform sanity checks; +! 2. Compute prolongator/restrictor/AC +! +! +! Arguments: +! ag - type(mld_d_base_aggregator_type), input/output. +! The aggregator object +! parms - type(mld_dml_parms), input +! The aggregation parameters +! a - type(psb_dspmat_type), input. +! The sparse matrix structure containing the local part of +! the fine-level matrix. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of the fine-level matrix. +! The 'one-level' data structure that will contain the local +! part of the matrix to be built as well as the information +! concerning the prolongator and its transpose. +! ilaggr - integer, dimension(:), input +! The mapping between the row indices of the coarse-level +! matrix and the row indices of the fine-level matrix. +! ilaggr(i)=j means that node i in the adjacency graph +! of the fine-level matrix is mapped onto node j in the +! adjacency graph of the coarse-level matrix. Note that the indices +! are assumed to be shifted so as to make sure the ranges on +! the various processes do not overlap. +! nlaggr - integer, dimension(:) input +! nlaggr(i) contains the aggregates held by process i. +! ac - type(psb_dspmat_type), output +! The coarse matrix on output +! +! op_prol - type(psb_dspmat_type), input/output +! The tentative prolongator on input, the computed prolongator on output +! +! op_restr - type(psb_dspmat_type), output +! The restrictor operator; normally, it is the transpose of the prolongator. +! +! info - integer, output. +! Error code. +! +subroutine mld_d_bcmatch_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,op_prol,op_restr,info) + use psb_base_mod + use mld_d_inner_mod!, mld_protect_name => mld_d_base_aggregator_mat_asb + implicit none + + class(mld_d_base_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_dspmat_type), intent(inout) :: op_prol + type(psb_dspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + + ! Local variables + character(len=20) :: name + integer(psb_mpik_) :: ictxt, np, me + type(psb_d_coo_sparse_mat) :: acoo, bcoo + type(psb_d_csr_sparse_mat) :: acsr1 + integer(psb_ipk_) :: nzl,ntaggr + integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: debug_level, debug_unit + + name='mld_d_base_aggregator_mat_asb' + if (psb_get_errstatus().ne.0) return + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + info = psb_success_ + ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) + + call mld_check_def(parms%aggr_kind,'Smoother',& + & mld_smooth_prol_,is_legal_ml_aggr_kind) + call mld_check_def(parms%coarse_mat,'Coarse matrix',& + & mld_distr_mat_,is_legal_ml_coarse_mat) + call mld_check_def(parms%aggr_filter,'Use filtered matrix',& + & mld_no_filter_mat_,is_legal_aggr_filter) + call mld_check_def(parms%smoother_pos,'smooth_pos',& + & mld_pre_smooth_,is_legal_ml_smooth_pos) + call mld_check_def(parms%aggr_omega_alg,'Omega Alg.',& + & mld_eig_est_,is_legal_ml_aggr_omega_alg) + call mld_check_def(parms%aggr_eig,'Eigenvalue estimate',& + & mld_max_norm_,is_legal_ml_aggr_eig) + call mld_check_def(parms%aggr_omega_val,'Omega',dzero,is_legal_d_omega) + + ! + ! Build the coarse-level matrix from the fine-level one, starting from + ! the mapping defined by mld_aggrmap_bld and applying the aggregation + ! algorithm specified by p%iprcparm(mld_aggr_kind_) + ! + select case (parms%aggr_kind) + case (mld_no_smooth_) + + call mld_daggrmat_unsmth_spmm_asb(a,desc_a,ilaggr,nlaggr,& + & parms,ac,op_prol,op_restr,info) + + case(mld_smooth_prol_) + + call mld_daggrmat_smth_asb(a,desc_a,ilaggr,nlaggr, & + & parms,ac,op_prol,op_restr,info) + + case(mld_biz_prol_) + + call mld_daggrmat_biz_asb(a,desc_a,ilaggr,nlaggr, & + & parms,ac,op_prol,op_restr,info) + + case(mld_min_energy_) + + call mld_daggrmat_minnrg_asb(a,desc_a,ilaggr,nlaggr, & + & parms,ac,op_prol,op_restr,info) + + case default + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid aggr kind') + goto 9999 + + end select + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner aggrmat asb') + goto 9999 + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return + + +end subroutine mld_d_bcmatch_aggregator_mat_asb diff --git a/tests/Bcmatch/mld_d_bcmatch_aggregator_mod.F90 b/tests/Bcmatch/mld_d_bcmatch_aggregator_mod.F90 new file mode 100644 index 00000000..489b7b10 --- /dev/null +++ b/tests/Bcmatch/mld_d_bcmatch_aggregator_mod.F90 @@ -0,0 +1,262 @@ +! +! +! MLD2P4 version 2.2 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008, 2010, 2012, 2015, 2017 , 2017 +! +! Salvatore Filippone Cranfield University +! Ambra Abdullahi Hassan University of Rome Tor Vergata +! Pasqua D'Ambra IAC-CNR, Naples, IT +! Daniela di Serafino University of Campania "L. Vanvitelli", Caserta, IT +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! +! The aggregator object hosts the aggregation method for building +! the multilevel hierarchy. This variant is based on the hybrid method +! presented in +! +! S. Gratton, P. Henon, P. Jiranek and X. Vasseur: +! Reducing complexity of algebraic multigrid by aggregation +! Numerical Lin. Algebra with Applications, 2016, 23:501-518 +! + ! + ! sm - class(mld_T_base_smoother_type), allocatable + ! The current level preconditioner (aka smoother). + ! parms - type(mld_RTml_parms) + ! The parameters defining the multilevel strategy. + ! ac - The local part of the current-level matrix, built by + ! coarsening the previous-level matrix. + ! desc_ac - type(psb_desc_type). + ! The communication descriptor associated to the matrix + ! stored in ac. + ! base_a - type(psb_Tspmat_type), pointer. + ! Pointer (really a pointer!) to the local part of the current + ! matrix (so we have a unified treatment of residuals). + ! We need this to avoid passing explicitly the current matrix + ! to the routine which applies the preconditioner. + ! base_desc - type(psb_desc_type), pointer. + ! Pointer to the communication descriptor associated to the + ! matrix pointed by base_a. + ! map - Stores the maps (restriction and prolongation) between the + ! vector spaces associated to the index spaces of the previous + ! and current levels. + ! + ! Methods: + ! Most methods follow the encapsulation hierarchy: they take whatever action + ! is appropriate for the current object, then call the corresponding method for + ! the contained object. + ! As an example: the descr() method prints out a description of the + ! level. It starts by invoking the descr() method of the parms object, + ! then calls the descr() method of the smoother object. + ! + ! descr - Prints a description of the object. + ! default - Set default values + ! dump - Dump to file object contents + ! set - Sets various parameters; when a request is unknown + ! it is passed to the smoother object for further processing. + ! check - Sanity checks. + ! sizeof - Total memory occupation in bytes + ! get_nzeros - Number of nonzeros + ! + ! + +module bcm_csr_type_mod + use iso_c_binding + type, bind(c):: bcm_Vector + type(c_ptr) :: data + integer(c_int) :: size + integer(c_int) :: owns_data + end type + + type, bind(c):: bcm_CSRMatrix + type(c_ptr) :: i + type(c_ptr) :: j + integer(c_int) :: num_rows + integer(c_int) :: num_cols + integer(c_int) :: num_nonzeros + integer(c_int) :: owns_data + type(c_ptr) :: data + end type +end module bcm_csr_type_mod + +module mld_d_bcmatch_aggregator_mod + use mld_d_base_aggregator_mod + use bcm_csr_type_mod + + type, extends(mld_d_base_aggregator_type) :: mld_d_bcmatch_aggregator_type + integer(psb_ipk_) :: matching_alg + integer(psb_ipk_) :: n_sweeps + real(psb_dpk_), allocatable :: w_tmp(:) + type(bcm_Vector) :: w_par + integer(psb_ipk_) :: max_csize + integer(psb_ipk_) :: max_nlevels + !type(psb_d_vect_type) :: w + contains + procedure, pass(ag) :: bld_tprol => mld_d_bcmatch_aggregator_build_tprol + procedure, pass(ag) :: set => d_bcmatch_aggr_cseti + procedure, pass(ag) :: default =>d_bcmatch_aggr_set_default + procedure, pass(ag) :: mat_asb => mld_d_bcmatch_aggregator_mat_asb + procedure, pass(ag) :: update_level => d_bcmatch_aggregator_update_level +!!$ procedure, pass(ag) :: clone => mld_d_base_aggregator_clone +!!$ procedure, pass(ag) :: free => mld_d_bcmatch_aggregator_free +!!$ procedure, pass(ag) :: default => mld_d_base_aggregator_default + procedure, nopass :: fmt => mld_d_bcmatch_aggregator_fmt + end type mld_d_bcmatch_aggregator_type + + + interface + subroutine mld_d_bcmatch_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + import :: mld_d_bcmatch_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_d_bcmatch_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_bcmatch_aggregator_build_tprol + end interface + + interface + subroutine mld_d_bcmatch_aggregator_mat_asb(ag,parms,a,desc_a,ilaggr,nlaggr,ac,& + & op_prol,op_restr,info) + import :: mld_d_bcmatch_aggregator_type, psb_desc_type, psb_dspmat_type, psb_dpk_, & + & psb_ipk_, psb_long_int_k_, mld_dml_parms + implicit none + class(mld_d_bcmatch_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(inout) :: ilaggr(:), nlaggr(:) + type(psb_dspmat_type), intent(inout) :: op_prol + type(psb_dspmat_type), intent(out) :: ac,op_restr + integer(psb_ipk_), intent(out) :: info + end subroutine mld_d_bcmatch_aggregator_mat_asb + end interface + + +contains + + + function mld_d_bcmatch_aggregator_fmt() result(val) + implicit none + character(len=32) :: val + + val = "BootCMatch aggregation" + end function mld_d_bcmatch_aggregator_fmt + + subroutine d_bcmatch_aggregator_update_level(ag,agnext,info) + implicit none + class(mld_d_bcmatch_aggregator_type), target, intent(inout) :: ag + class(mld_d_base_aggregator_type), target, intent(inout) :: agnext + integer(psb_ipk_), intent(out) :: info + + ! + ! + select type(agnext) + type is (mld_d_bcmatch_aggregator_type) + agnext%matching_alg=ag%matching_alg + agnext%n_sweeps=ag%n_sweeps + agnext%max_csize=ag%max_csize + agnext%max_nlevels=ag%max_nlevels + agnext%w_par=ag%w_par + end select + info = 0 + end subroutine d_bcmatch_aggregator_update_level + + subroutine d_bcmatch_aggr_cseti(ag,what,val,info) + + Implicit None + + ! Arguments + class(mld_d_bcmatch_aggregator_type), intent(inout) :: ag + character(len=*), intent(in) :: what + integer(psb_ipk_), intent(in) :: val + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: err_act, iwhat + character(len=20) :: name='d_bcmatch_aggr_cseti' + info = psb_success_ + + select case(what) + case('BCM_MATCH_ALG') + ag%matching_alg=val + case('BCM_SWEEPS') + ag%n_sweeps=val + case('BCM_MAX_CSIZE') + ag%max_csize=val + case('BCM_MAX_NLEVELS') + ag%max_nlevels=val + case('BCM_W_SIZE') + ag%w_par%size=val + ag%w_par%owns_data=0 + allocate(ag%w_tmp(val)) + ag%w_tmp = 1.0_psb_dpk_ + call set_cloc(ag%w_tmp, ag%w_par) + case default + end select + return + contains + subroutine set_cloc(vect,w_par) + real(psb_dpk_), target :: vect(:) + type(bcm_Vector) :: w_par + + w_par%data = c_loc(vect) + end subroutine set_cloc + + end subroutine d_bcmatch_aggr_cseti + + subroutine d_bcmatch_aggr_set_default(ag) + + Implicit None + + ! Arguments + class(mld_d_bcmatch_aggregator_type), intent(inout) :: ag + character(len=20) :: name='d_bcmatch_aggr_set_default' + ag%matching_alg=0 + ag%n_sweeps=1 + ag%max_nlevels=36 + ag%max_csize=10 + + return + + end subroutine d_bcmatch_aggr_set_default + +!!$ subroutine d_bcmatch_aggregator_free(ag,info) +!!$ implicit none +!!$ class(mld_d_bcmatch_aggregator_type), target, intent(inout) :: ag +!!$ integer(psb_ipk_), intent(out) :: info +!!$ +!!$ info = 0 +!!$ end subroutine d_bcmatch_aggregator_free + + +end module mld_d_bcmatch_aggregator_mod diff --git a/tests/Bcmatch/mld_d_bcmatch_aggregator_tprol.f90 b/tests/Bcmatch/mld_d_bcmatch_aggregator_tprol.f90 new file mode 100644 index 00000000..d6b511fe --- /dev/null +++ b/tests/Bcmatch/mld_d_bcmatch_aggregator_tprol.f90 @@ -0,0 +1,355 @@ +! +! +! MLD2P4 version 2.1 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008, 2010, 2012, 2015, 2017 , 2017 +! +! Salvatore Filippone Cranfield University +! Ambra Abdullahi Hassan University of Rome Tor Vergata +! Pasqua D'Ambra IAC-CNR, Naples, IT +! Daniela di Serafino University of Campania "L. Vanvitelli", Caserta, IT +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! File: mld_d_bcmatch_aggregator_tprol.f90 +! +! Subroutine: mld_d_bcmatch_aggregator_tprol +! Version: real +! +! +! This routine is mainly an interface to hyb_map_bld where the real work is performed. +! It takes care of some consistency checking, and calls map_to_tprol, which is +! refactored and shared among all the aggregation methods that produce a simple +! integer mapping. +! +! +! Arguments: +! p - type(mld_d_onelev_type), input/output. +! The 'one-level' data structure containing the control +! parameters and (eventually) coarse matrix and prolongator/restrictors. +! +! a - type(psb_dspmat_type). +! The sparse matrix structure containing the local part of the +! fine-level matrix. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of a. +! ilaggr - integer, dimension(:), allocatable, output +! The mapping between the row indices of the coarse-level +! matrix and the row indices of the fine-level matrix. +! ilaggr(i)=j means that node i in the adjacency graph +! of the fine-level matrix is mapped onto node j in the +! adjacency graph of the coarse-level matrix. Note that on exit the indices +! will be shifted so as to make sure the ranges on the various processes do not +! overlap. +! nlaggr - integer, dimension(:), allocatable, output +! nlaggr(i) contains the aggregates held by process i. +! op_prol - type(psb_dspmat_type), output +! The tentative prolongator, based on ilaggr. +! +! info - integer, output. +! Error code. +! + +module bcm_CSRMatrix_mod +use psb_base_mod +use psb_util_mod +use iso_c_binding +use bcm_csr_type_mod +implicit none + +contains + subroutine MLD_to_CSR(a,csr_ia, csr_ja, csr_val, C, info) + type(psb_dspmat_type), intent(in) :: a + type(bcm_CSRMatrix), intent(out) :: C + real(c_double), allocatable, target, intent(out) :: csr_val(:) + integer(c_int), allocatable, target, intent(out) :: csr_ia(:), csr_ja(:) + + !Local variable + character(len=20) :: name + integer(psb_ipk_) :: info + real(psb_dpk_), allocatable :: coo_val(:) + integer(psb_ipk_), allocatable :: coo_ia(:), coo_ja(:) + integer(psb_ipk_) :: x, nz, num_rows, num_cols , i , j, iad, k , k0 + type(psb_d_csr_sparse_mat) :: acsr + + name="MLD_to_CSR" + num_rows= a%get_nrows() + num_cols= a%get_ncols() + nz= a%get_nzeros() + call a%csgetrow(1,num_rows,nz,coo_ia,coo_ja,coo_val,info) + !allocate(csr_ia(0:nz-1), csr_ja(0:nz-1), csr_val(0:nz-1), STAT=info) + if (info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/nz,izero,izero,izero,izero/),& + & a_err='integer') + return + end if + + call a%cp_to(acsr) + allocate(csr_ia(0:nz-1), csr_ja(0:nz-1), csr_val(0:nz-1), STAT=info) + + + csr_ia(0:min(nz,size(acsr%irp,1))-1)=acsr%irp(1:min(nz,size(acsr%irp,1)))-1 + csr_ja(0:nz-1)=acsr%ja(1:nz)-1 + csr_val(0:nz-1)=acsr%val(1:nz) + + call acsr%free() + + C%num_rows=num_rows + C%num_cols=num_cols + C%num_nonzeros=nz + C%owns_data=0 + C%i=c_loc(csr_ia) + C%j=c_loc(csr_ja) + C%data=c_loc(csr_val) + end subroutine MLD_to_CSR + + subroutine bcm_to_op_prol(P, ilaggr, valaggr, info) + type(bcm_CSRMatrix), intent(in) :: P + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:) + integer(psb_ipk_), intent(out) :: info + real(psb_dpk_), allocatable, intent(out) :: valaggr(:) + + ! Local variables + integer(psb_ipk_), pointer :: point_ia(:), point_ja(:) + real(psb_dpk_), pointer :: point_val(:) + integer(psb_ipk_) :: i, j, k + integer(psb_ipk_) :: n, num_rows, num_cols, num_nz + character(len=20) :: name + integer(c_int), allocatable, target :: coo_ia(:),coo_ja(:) + real(c_double), allocatable, target :: coo_val(:) + + name="bcm_to_op_prol" + num_nz = P%num_nonzeros + num_rows = P%num_rows + num_cols = P%num_cols + call c_f_pointer(P%i,point_ia,(/num_rows+1/)) + call c_f_pointer(P%j,point_ja,(/num_nz/)) + call c_f_pointer(P%data,point_val,(/num_nz/)) + + !These are I, J, VAL. + !These are I, J, VAL. + if (allocated(coo_ia)) deallocate(coo_ia) + if (allocated(coo_ja)) deallocate(coo_ja) + if (allocated(coo_val)) deallocate(coo_val) + allocate(coo_ia(num_nz),coo_ja(num_nz),coo_val(num_nz), STAT=info) +!!$ write(0,*) num_rows,num_cols,num_nz,info,size(coo_val) + if (info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/num_nz,izero,izero,izero,izero/),& + & a_err='integer') + return + end if + + n = 1 + !coo_ia=-123 + !coo_ja=-123 + coo_val(1:num_nz)=point_val(1:num_nz) + do i=1, num_rows + do j=point_ia(i)+1, point_ia(i+1) + coo_ia(n)=i + coo_ja(n)=point_ja(j) + 1 + n = n + 1 + enddo + enddo + if (allocated(ilaggr)) deallocate(ilaggr) + if (allocated(valaggr)) deallocate(valaggr) + allocate(ilaggr(num_rows),valaggr(num_rows), STAT=info) + ilaggr=0 + if (info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/num_rows,izero,izero,izero,izero/),& + & a_err='integer') + return + end if + + do k=1,num_nz + i=coo_ia(k) + j=coo_ja(k) + ilaggr(i)=j + valaggr(i)=coo_val(i) + enddo + if (allocated(coo_ia)) deallocate(coo_ia) + if (allocated(coo_ja)) deallocate(coo_ja) + if (allocated(coo_val)) deallocate(coo_val) + nullify(point_ia) + nullify(point_ja) + nullify(point_val) + end subroutine bcm_to_op_prol +end module bcm_CSRMatrix_mod + + +subroutine mld_d_bcmatch_aggregator_build_tprol(ag,parms,a,desc_a,ilaggr,nlaggr,op_prol,info) + use psb_base_mod + use mld_d_bcmatch_aggregator_mod, mld_protect_name => mld_d_bcmatch_aggregator_build_tprol + use mld_d_inner_mod + !use bcm_CSRMatrix_mod + use bcm_csr_type_mod + use iso_c_binding + implicit none + class(mld_d_bcmatch_aggregator_type), target, intent(inout) :: ag + type(mld_dml_parms), intent(inout) :: parms + type(psb_dspmat_type), intent(in) :: a + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:) + real(psb_dpk_), allocatable:: valaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + + ! Local variables + type(psb_dspmat_type) :: a_tmp + type(bcm_CSRMatrix) :: C, P + integer(c_int) :: match_algorithm, n_sweeps, max_csize, max_nlevels + character(len=20) :: name, ch_err + integer(psb_mpik_) :: ictxt, np, me + integer(psb_ipk_) :: err_act, ierr + integer(psb_ipk_) :: debug_level, debug_unit + integer(psb_ipk_) :: i, j, k, nr, nc, isz, num_pcols + type(psb_d_csr_sparse_mat), target :: acsr + integer(psb_ipk_), allocatable, target :: csr_ia(:), csr_ja(:) + integer(psb_ipk_), allocatable :: aux(:) + real(psb_dpk_), allocatable, target:: csr_val(:) + interface + function bootCMatch(C,match_alg,n_sweeps,max_nlevels,max_csize,w)bind(c,name='bootCMatch') result(P) + use iso_c_binding + use bcm_CSRMatrix_mod + implicit none + type(bcm_CSRMatrix) :: C, P + type(bcm_Vector) :: w + integer(c_int) :: match_alg + integer(c_int) :: n_sweeps + integer(c_int) :: max_nlevels + integer(c_int) :: max_csize + end function bootCMatch + end interface + + interface + function mld_bootCMatch_if(C,match_alg,n_sweeps,max_nlevels,max_csize,& + & w,isz,ilaggr,valaggr, num_cols) & + & bind(c,name='mld_bootCMatch_if') result(iret) + use iso_c_binding + use bcm_CSRMatrix_mod + implicit none + type(bcm_CSRMatrix) :: C, P + type(bcm_Vector) :: w + integer(c_int), value :: match_alg + integer(c_int), value :: n_sweeps + integer(c_int), value :: max_nlevels + integer(c_int), value :: max_csize + integer(c_int), value :: isz + integer(c_int) :: num_cols + integer(c_int) :: ilaggr(*) + real(c_double) :: valaggr(*) + integer(c_int) :: iret + end function mld_bootCMatch_if + end interface + + name='mld_d_bcmatch_aggregator_tprol' + ictxt = desc_a%get_context() + call psb_info(ictxt,me,np) + if (psb_get_errstatus().ne.0) return + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + info = psb_success_ + + + call mld_check_def(parms%ml_type,'Multilevel type',& + & mld_mult_ml_,is_legal_ml_type) + call mld_check_def(parms%aggr_alg,'Aggregation',& + & mld_dec_aggr_,is_legal_ml_aggr_alg) + call mld_check_def(parms%aggr_ord,'Ordering',& + & mld_aggr_ord_nat_,is_legal_ml_aggr_ord) + call mld_check_def(parms%aggr_thresh,'Aggr_Thresh',dzero,is_legal_d_aggr_thrs) + + call a%csclip(b=a_tmp, info=info, jmax=a%get_nrows(), imax=a%get_nrows()) + + call a_tmp%mv_to(acsr) + + !write(*,*) 'Build_tprol:',acsr%get_nrows(),acsr%get_ncols() + C%num_rows=acsr%get_nrows() + C%num_cols=acsr%get_ncols() + C%num_nonzeros=acsr%get_nzeros() + C%owns_data=0 + acsr%irp = acsr%irp - 1 + acsr%ja = acsr%ja - 1 + C%i=c_loc(acsr%irp) + C%j=c_loc(acsr%ja) + C%data=c_loc(acsr%val) + + isz = a%get_ncols() + call psb_realloc(isz,ilaggr,info) + if (info == psb_success_) call psb_realloc(isz,valaggr,info) + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='psb_realloc' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + match_algorithm = ag%matching_alg + n_sweeps = ag%n_sweeps + max_csize = ag%max_csize + max_nlevels = ag%max_nlevels + + info = mld_bootCMatch_if(C,match_algorithm,n_sweeps,max_nlevels,max_csize,& + & ag%w_par, isz, ilaggr, valaggr, num_pcols) + if (info /= psb_success_) then +!!$ write(0,*) 'On return from bootCMatch_if:',info + call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_bootCMatch_if') + goto 9999 + end if + + call psb_realloc(np,nlaggr,info) + if (info /= psb_success_) then + info=psb_err_alloc_request_ + call psb_errpush(info,name,i_err=(/np,izero,izero,izero,izero/),& + & a_err='integer') + goto 9999 + end if + call acsr%free() + + nlaggr(:)=0 + nlaggr(me+1) = num_pcols + call psb_sum(ictxt,nlaggr(1:np)) + + + call mld_bcmatch_map_to_tprol(desc_a,ilaggr,nlaggr,valaggr,op_prol,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,a_err='mld_bcmatch_map_to_tprol') + goto 9999 + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + return + +end subroutine mld_d_bcmatch_aggregator_build_tprol diff --git a/tests/Bcmatch/mld_d_bcmatch_map_bld.f90 b/tests/Bcmatch/mld_d_bcmatch_map_bld.f90 new file mode 100644 index 00000000..e69de29b diff --git a/tests/Bcmatch/mld_d_bcmatch_map_to_tprol.f90 b/tests/Bcmatch/mld_d_bcmatch_map_to_tprol.f90 new file mode 100644 index 00000000..960f9cb9 --- /dev/null +++ b/tests/Bcmatch/mld_d_bcmatch_map_to_tprol.f90 @@ -0,0 +1,158 @@ +! +! +! MLD2P4 version 2.1 +! MultiLevel Domain Decomposition Parallel Preconditioners Package +! based on PSBLAS (Parallel Sparse BLAS version 3.5) +! +! (C) Copyright 2008, 2010, 2012, 2015, 2017 , 2017 +! +! Salvatore Filippone Cranfield University +! Ambra Abdullahi Hassan University of Rome Tor Vergata +! Pasqua D'Ambra IAC-CNR, Naples, IT +! Daniela di Serafino University of Campania "L. Vanvitelli", Caserta, IT +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the MLD2P4 group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE MLD2P4 GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! File: mld_d_bcmatch_map_to_tprol.f90 +! +! Subroutine: mld_d_bcmatch_map_to_tprol +! Version: real +! +! This routine uses a mapping from the row indices of the fine-level matrix +! to the row indices of the coarse-level matrix to build a tentative +! prolongator, i.e. a piecewise constant operator. +! This is later used to build the final operator; the code has been refactored here +! to be shared among all the methods that provide the tentative prolongator +! through a simple integer mapping. +! +! The aggregation algorithm is a parallel version of that described in +! * M. Brezina and P. Vanek, A black-box iterative solver based on a +! two-level Schwarz method, Computing, 63 (1999), 233-263. +! * P. Vanek, J. Mandel and M. Brezina, Algebraic Multigrid by Smoothed +! Aggregation for Second and Fourth Order Elliptic Problems, Computing, 56 +! (1996), 179-196. +! For more details see +! P. D'Ambra, D. di Serafino and S. Filippone, On the development of +! PSBLAS-based parallel two-level Schwarz preconditioners, Appl. Num. Math. +! 57 (2007), 1181-1196. +! +! +! Arguments: +! aggr_type - integer, input. +! The scalar used to identify the aggregation algorithm. +! theta - real, input. +! The aggregation threshold used in the aggregation algorithm. +! a - type(psb_dspmat_type), input. +! The sparse matrix structure containing the local part of +! the fine-level matrix. +! desc_a - type(psb_desc_type), input. +! The communication descriptor of the fine-level matrix. +! ilaggr - integer, dimension(:), allocatable. +! The mapping between the row indices of the coarse-level +! matrix and the row indices of the fine-level matrix. +! ilaggr(i)=j means that node i in the adjacency graph +! of the fine-level matrix is mapped onto node j in the +! adjacency graph of the coarse-level matrix. Note that on exit the indices +! will be shifted so as to make sure the ranges on the various processes do not +! overlap. +! nlaggr - integer, dimension(:), allocatable. +! nlaggr(i) contains the aggregates held by process i. +! op_prol - type(psb_dspmat_type). +! The tentative prolongator, based on ilaggr. +! +! info - integer, output. +! Error code. +! +subroutine mld_d_bcmatch_map_to_tprol(desc_a,ilaggr,nlaggr,valaggr, op_prol,info) + + use psb_base_mod + use mld_d_inner_mod, mld_protect_name => mld_d_bcmatch_map_to_tprol + + implicit none + + ! Arguments + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), allocatable, intent(inout) :: ilaggr(:),nlaggr(:) + real(psb_dpk_), allocatable, intent(inout) :: valaggr(:) + type(psb_dspmat_type), intent(out) :: op_prol + integer(psb_ipk_), intent(out) :: info + + ! Local variables + integer(psb_ipk_) :: icnt,nlp,k,n,ia,isz,nr, naggr,i,j,m,naggrm1, naggrp1, ntaggr + type(psb_d_coo_sparse_mat) :: tmpcoo + integer(psb_ipk_) :: debug_level, debug_unit,err_act + integer(psb_ipk_) :: ictxt,np,me + integer(psb_ipk_) :: nrow, ncol, n_ne + character(len=20) :: name, ch_err + + if(psb_get_errstatus() /= 0) return + info=psb_success_ + name = 'mld_d_bcmatch_map_to_tprol' + call psb_erractionsave(err_act) + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + ! + ictxt=desc_a%get_context() + call psb_info(ictxt,me,np) + nrow = desc_a%get_local_rows() + ncol = desc_a%get_local_cols() + + naggr = nlaggr(me+1) + ntaggr = sum(nlaggr) + naggrm1 = sum(nlaggr(1:me)) + naggrp1 = sum(nlaggr(1:me+1)) + ilaggr(1:nrow) = ilaggr(1:nrow) + naggrm1 + call psb_halo(ilaggr,desc_a,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_halo') + goto 9999 + end if + + call psb_halo(valaggr,desc_a,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_from_subroutine_,name,a_err='psb_halo') + goto 9999 + end if + + call tmpcoo%allocate(ncol,ntaggr,ncol) + do i=1,ncol + tmpcoo%val(i) = valaggr(i) + tmpcoo%ia(i) = i + tmpcoo%ja(i) = ilaggr(i) + end do + call tmpcoo%set_nzeros(ncol) + call tmpcoo%set_dupl(psb_dupl_add_) + call tmpcoo%set_sorted() ! At this point this is in row-major + call op_prol%mv_from(tmpcoo) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + +end subroutine mld_d_bcmatch_map_to_tprol diff --git a/tests/fileread/data_input.f90 b/tests/fileread/data_input.f90 index fe548526..b25cdeb0 100644 --- a/tests/fileread/data_input.f90 +++ b/tests/fileread/data_input.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/fileread/mld_cf_sample.f90 b/tests/fileread/mld_cf_sample.f90 index ae3515f6..4a22c2a0 100644 --- a/tests/fileread/mld_cf_sample.f90 +++ b/tests/fileread/mld_cf_sample.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/fileread/mld_df_sample.f90 b/tests/fileread/mld_df_sample.f90 index ef0b4c6d..c83304a1 100644 --- a/tests/fileread/mld_df_sample.f90 +++ b/tests/fileread/mld_df_sample.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/fileread/mld_sf_sample.f90 b/tests/fileread/mld_sf_sample.f90 index 0c23bc3b..d1c2d5bd 100644 --- a/tests/fileread/mld_sf_sample.f90 +++ b/tests/fileread/mld_sf_sample.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/fileread/mld_zf_sample.f90 b/tests/fileread/mld_zf_sample.f90 index b8007b5b..5ab5e518 100644 --- a/tests/fileread/mld_zf_sample.f90 +++ b/tests/fileread/mld_zf_sample.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/newslv/data_input.f90 b/tests/newslv/data_input.f90 index a8733b56..e6a8582b 100644 --- a/tests/newslv/data_input.f90 +++ b/tests/newslv/data_input.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/newslv/mld_d_tlu_solver.f90 b/tests/newslv/mld_d_tlu_solver.f90 index cf04d546..af6fb6bd 100644 --- a/tests/newslv/mld_d_tlu_solver.f90 +++ b/tests/newslv/mld_d_tlu_solver.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/newslv/mld_d_tlu_solver_impl.f90 b/tests/newslv/mld_d_tlu_solver_impl.f90 index 8369443d..086a1c80 100644 --- a/tests/newslv/mld_d_tlu_solver_impl.f90 +++ b/tests/newslv/mld_d_tlu_solver_impl.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/newslv/mld_pde3d_newslv.f90 b/tests/newslv/mld_pde3d_newslv.f90 index 2062e232..25abddc8 100644 --- a/tests/newslv/mld_pde3d_newslv.f90 +++ b/tests/newslv/mld_pde3d_newslv.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/pdegen/data_input.f90 b/tests/pdegen/data_input.f90 index fe548526..b25cdeb0 100644 --- a/tests/pdegen/data_input.f90 +++ b/tests/pdegen/data_input.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! diff --git a/tests/pdegen/mld_d_pde2d.f90 b/tests/pdegen/mld_d_pde2d.f90 index 0244a922..766b5d3b 100644 --- a/tests/pdegen/mld_d_pde2d.f90 +++ b/tests/pdegen/mld_d_pde2d.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -90,15 +90,83 @@ contains end function d_null_func_2d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1 and b2 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2 functions to e.g. done/sqrt((2*done)) + ! + function b1(x,y) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b1 + real(psb_dpk_), intent(in) :: x,y + b1=dzero + end function b1 + function b2(x,y) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b2 + real(psb_dpk_), intent(in) :: x,y + b2=dzero + end function b2 + function c(x,y) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: c + real(psb_dpk_), intent(in) :: x,y + c=0.d0 + end function c + function a1(x,y) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a1 + real(psb_dpk_), intent(in) :: x,y + a1=done/80 + end function a1 + function a2(x,y) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a2 + real(psb_dpk_), intent(in) :: x,y + a2=done/80 + end function a2 + function g(x,y) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: g + real(psb_dpk_), intent(in) :: x,y + g = dzero + if (x == done) then + g = done + else if (x == dzero) then + g = exp(-y**2) + end if + end function g + ! ! subroutine to allocate and fill in the coefficient matrix and ! the rhs. ! +<<<<<<< HEAD subroutine mld_d_gen_pde2d(ictxt,idim,a,bv,xv,desc_a,afmt,& & a1,a2,b1,b2,c,g,info,f,amold,vmold,imold,partition,nrl,iv) use psb_base_mod use psb_util_mod +======= + subroutine mld_d_gen_pde2d(ictxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv) + use psb_base_mod + use psb_util_mod +>>>>>>> mrgext ! ! Discretizes the partial differential equation ! @@ -115,7 +183,6 @@ contains ! Note that if b1=b2=c=0., the PDE is the Laplace equation. ! implicit none - procedure(d_func_2d) :: b1,b2,c,a1,a2,g integer(psb_ipk_) :: idim type(psb_dspmat_type) :: a type(psb_d_vect_type) :: xv,bv @@ -148,7 +215,7 @@ contains ! deltah dimension of each grid cell ! deltat discretization time real(psb_dpk_) :: deltah, sqdeltah, deltah2 - real(psb_dpk_), parameter :: rhs=0.e0,one=1.e0,zero=0.e0 + real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb integer(psb_ipk_) :: err_act procedure(d_func_2d), pointer :: f_ @@ -167,9 +234,9 @@ contains f_ => d_null_func_2d end if - deltah = 1.e0/(idim+2) + deltah = done/(idim+2) sqdeltah = deltah*deltah - deltah2 = 2.e0* deltah + deltah2 = (2*done)* deltah if (present(partition)) then if ((1<= partition).and.(partition <= 3)) then @@ -189,7 +256,31 @@ contains n = m nnz = ((n*7)/(np)) if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ictxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ictxt) + call psb_abort(ictxt) + return + end if +<<<<<<< HEAD select case(partition_) case(1) ! A BLOCK partition @@ -213,6 +304,8 @@ contains return end if +======= +>>>>>>> mrgext ! ! First example of use of CDALL: specify for each process a number of ! contiguous rows @@ -355,7 +448,7 @@ contains if (ix == 1) then zt(k) = g(dzero,y)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-2)*idim+iy + call ijk2idx(icol(icoeff),ix-1,iy,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -364,14 +457,14 @@ contains if (iy == 1) then zt(k) = g(x,dzero)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim+(iy-1) + call ijk2idx(icol(icoeff),ix,iy-1,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif ! term depending on (x,y) - val(icoeff)=2.e0*(a1(x,y) + a2(x,y))/sqdeltah + c(x,y) - icol(icoeff) = (ix-1)*idim+iy + val(icoeff)=(2*done)*(a1(x,y) + a2(x,y))/sqdeltah + c(x,y) + call ijk2idx(icol(icoeff),ix,iy,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 ! term depending on (x,y+1) @@ -379,7 +472,7 @@ contains if (iy == idim) then zt(k) = g(x,done)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim+(iy+1) + call ijk2idx(icol(icoeff),ix,iy+1,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -388,7 +481,7 @@ contains if (ix==idim) then zt(k) = g(done,y)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix)*idim+(iy) + call ijk2idx(icol(icoeff),ix+1,iy,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -398,7 +491,7 @@ contains if(info /= psb_success_) exit call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) if(info /= psb_success_) exit - zt(:)=0.e0 + zt(:)=dzero call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) if(info /= psb_success_) exit end do @@ -469,50 +562,6 @@ contains end subroutine mld_d_gen_pde2d - ! - ! functions parametrizing the differential equation - ! - function b1(x,y) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: b1 - real(psb_dpk_), intent(in) :: x,y - b1=dzero - end function b1 - function b2(x,y) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: b2 - real(psb_dpk_), intent(in) :: x,y - b2=dzero - end function b2 - function c(x,y) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: c - real(psb_dpk_), intent(in) :: x,y - c=dzero - end function c - function a1(x,y) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: a1 - real(psb_dpk_), intent(in) :: x,y - a1=done - end function a1 - function a2(x,y) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: a2 - real(psb_dpk_), intent(in) :: x,y - a2=done - end function a2 - function g(x,y) - use psb_base_mod, only : psb_dpk_, done, dzero - real(psb_dpk_) :: g - real(psb_dpk_), intent(in) :: x,y - g = dzero - if (x == done) then - g = done - else if (x == dzero) then - g = exp(-y**2) - end if - end function g end module mld_d_pde2d_mod program mld_d_pde2d @@ -654,8 +703,7 @@ program mld_d_pde2d ! call psb_barrier(ictxt) t1 = psb_wtime() - call mld_gen_pde2d(ictxt,idim,a,b,x,desc_a,afmt,& - & a1,a2,b1,b2,c,g,info) + call mld_gen_pde2d(ictxt,idim,a,b,x,desc_a,afmt,info) call psb_barrier(ictxt) t2 = psb_wtime() - t1 if(info /= psb_success_) then diff --git a/tests/pdegen/mld_d_pde3d.f90 b/tests/pdegen/mld_d_pde3d.f90 index e179a860..cba5eb2c 100644 --- a/tests/pdegen/mld_d_pde3d.f90 +++ b/tests/pdegen/mld_d_pde3d.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -92,13 +92,93 @@ contains val = dzero end function d_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b1 + real(psb_dpk_), intent(in) :: x,y,z + b1=dzero + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b2 + real(psb_dpk_), intent(in) :: x,y,z + b2=dzero + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b3 + real(psb_dpk_), intent(in) :: x,y,z + b3=dzero + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: c + real(psb_dpk_), intent(in) :: x,y,z + c=dzero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a1 + real(psb_dpk_), intent(in) :: x,y,z + a1=done/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a2 + real(psb_dpk_), intent(in) :: x,y,z + a2=done/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a3 + real(psb_dpk_), intent(in) :: x,y,z + a3=done/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: g + real(psb_dpk_), intent(in) :: x,y,z + g = dzero + if (x == done) then + g = done + else if (x == dzero) then + g = exp(y**2-z**2) + end if + end function g + ! ! subroutine to allocate and fill in the coefficient matrix and ! the rhs. ! +<<<<<<< HEAD subroutine mld_d_gen_pde3d(ictxt,idim,a,bv,xv,desc_a,afmt,& & a1,a2,a3,b1,b2,b3,c,g,info,f,amold,vmold,imold,partition,nrl,iv) +======= + subroutine mld_d_gen_pde3d(ictxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv) +>>>>>>> mrgext use psb_base_mod use psb_util_mod ! @@ -117,7 +197,6 @@ contains ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. ! implicit none - procedure(d_func_3d) :: b1,b2,b3,c,a1,a2,a3,g integer(psb_ipk_) :: idim type(psb_dspmat_type) :: a type(psb_d_vect_type) :: xv,bv @@ -169,9 +248,9 @@ contains f_ => d_null_func_3d end if - deltah = 1.d0/(idim+2) + deltah = done/(idim+2) sqdeltah = deltah*deltah - deltah2 = 2.d0* deltah + deltah2 = (2*done)* deltah if (present(partition)) then if ((1<= partition).and.(partition <= 3)) then @@ -189,9 +268,13 @@ contains m = idim*idim*idim n = m - nnz = ((n*9)/(np)) + nnz = ((n*7)/(np)) if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n +<<<<<<< HEAD +======= + t0 = psb_wtime() +>>>>>>> mrgext select case(partition_) case(1) ! A BLOCK partition @@ -362,7 +445,7 @@ contains if (ix == 1) then zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-2)*idim*idim+(iy-1)*idim+(iz) + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -371,7 +454,7 @@ contains if (iy == 1) then zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim*idim+(iy-2)*idim+(iz) + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -380,15 +463,15 @@ contains if (iz == 1) then zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz-1) + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif ! term depending on (x,y,z) - val(icoeff)=2.d0*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & & + c(x,y,z) - icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 ! term depending on (x,y,z+1) @@ -396,7 +479,7 @@ contains if (iz == idim) then zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz+1) + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -405,7 +488,7 @@ contains if (iy == idim) then zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim*idim+(iy)*idim+(iz) + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -414,7 +497,7 @@ contains if (ix==idim) then zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix)*idim*idim+(iy-1)*idim+(iz) + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -424,7 +507,7 @@ contains if(info /= psb_success_) exit call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) if(info /= psb_success_) exit - zt(:)=0.d0 + zt(:)=dzero call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) if(info /= psb_success_) exit end do @@ -494,62 +577,6 @@ contains return end subroutine mld_d_gen_pde3d - ! - ! functions parametrizing the differential equation - ! - function b1(x,y,z) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: b1 - real(psb_dpk_), intent(in) :: x,y,z - b1=dzero - end function b1 - function b2(x,y,z) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: b2 - real(psb_dpk_), intent(in) :: x,y,z - b2=dzero - end function b2 - function b3(x,y,z) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: b3 - real(psb_dpk_), intent(in) :: x,y,z - b3=dzero - end function b3 - function c(x,y,z) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: c - real(psb_dpk_), intent(in) :: x,y,z - c=dzero - end function c - function a1(x,y,z) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: a1 - real(psb_dpk_), intent(in) :: x,y,z - a1=done - end function a1 - function a2(x,y,z) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: a2 - real(psb_dpk_), intent(in) :: x,y,z - a2=done - end function a2 - function a3(x,y,z) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: a3 - real(psb_dpk_), intent(in) :: x,y,z - a3=done - end function a3 - function g(x,y,z) - use psb_base_mod, only : psb_dpk_,done,dzero - real(psb_dpk_) :: g - real(psb_dpk_), intent(in) :: x,y,z - g = dzero - if (x == done) then - g = done - else if (x == dzero) then - g = exp(y**2-z**2) - end if - end function g end module mld_d_pde3d_mod program mld_d_pde3d @@ -692,8 +719,7 @@ program mld_d_pde3d call psb_barrier(ictxt) t1 = psb_wtime() - call mld_gen_pde3d(ictxt,idim,a,b,x,desc_a,afmt,& - & a1,a2,a3,b1,b2,b3,c,g,info) + call mld_gen_pde3d(ictxt,idim,a,b,x,desc_a,afmt,info) call psb_barrier(ictxt) t2 = psb_wtime() - t1 if(info /= psb_success_) then diff --git a/tests/pdegen/mld_s_pde2d.f90 b/tests/pdegen/mld_s_pde2d.f90 index 98f36e3b..1a33f843 100644 --- a/tests/pdegen/mld_s_pde2d.f90 +++ b/tests/pdegen/mld_s_pde2d.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -90,15 +90,83 @@ contains end function s_null_func_2d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1 and b2 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2 functions to e.g. sone/sqrt((2*sone)) + ! + function b1(x,y) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b1 + real(psb_spk_), intent(in) :: x,y + b1=szero + end function b1 + function b2(x,y) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b2 + real(psb_spk_), intent(in) :: x,y + b2=szero + end function b2 + function c(x,y) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: c + real(psb_spk_), intent(in) :: x,y + c=0.d0 + end function c + function a1(x,y) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a1 + real(psb_spk_), intent(in) :: x,y + a1=sone/80 + end function a1 + function a2(x,y) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a2 + real(psb_spk_), intent(in) :: x,y + a2=sone/80 + end function a2 + function g(x,y) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: g + real(psb_spk_), intent(in) :: x,y + g = szero + if (x == sone) then + g = sone + else if (x == szero) then + g = exp(-y**2) + end if + end function g + ! ! subroutine to allocate and fill in the coefficient matrix and ! the rhs. ! +<<<<<<< HEAD subroutine mld_s_gen_pde2d(ictxt,idim,a,bv,xv,desc_a,afmt,& & a1,a2,b1,b2,c,g,info,f,amold,vmold,imold,partition,nrl,iv) use psb_base_mod use psb_util_mod +======= + subroutine mld_s_gen_pde2d(ictxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv) + use psb_base_mod + use psb_util_mod +>>>>>>> mrgext ! ! Discretizes the partial differential equation ! @@ -115,7 +183,6 @@ contains ! Note that if b1=b2=c=0., the PDE is the Laplace equation. ! implicit none - procedure(s_func_2d) :: b1,b2,c,a1,a2,g integer(psb_ipk_) :: idim type(psb_sspmat_type) :: a type(psb_s_vect_type) :: xv,bv @@ -148,7 +215,7 @@ contains ! deltah dimension of each grid cell ! deltat discretization time real(psb_spk_) :: deltah, sqdeltah, deltah2 - real(psb_spk_), parameter :: rhs=0.e0,one=1.e0,zero=0.e0 + real(psb_spk_), parameter :: rhs=szero,one=sone,zero=szero real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb integer(psb_ipk_) :: err_act procedure(s_func_2d), pointer :: f_ @@ -167,9 +234,9 @@ contains f_ => s_null_func_2d end if - deltah = 1.e0/(idim+2) + deltah = sone/(idim+2) sqdeltah = deltah*deltah - deltah2 = 2.e0* deltah + deltah2 = (2*sone)* deltah if (present(partition)) then if ((1<= partition).and.(partition <= 3)) then @@ -189,7 +256,31 @@ contains n = m nnz = ((n*7)/(np)) if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ictxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ictxt) + call psb_abort(ictxt) + return + end if +<<<<<<< HEAD select case(partition_) case(1) ! A BLOCK partition @@ -213,6 +304,8 @@ contains return end if +======= +>>>>>>> mrgext ! ! First example of use of CDALL: specify for each process a number of ! contiguous rows @@ -355,7 +448,7 @@ contains if (ix == 1) then zt(k) = g(szero,y)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-2)*idim+iy + call ijk2idx(icol(icoeff),ix-1,iy,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -364,14 +457,14 @@ contains if (iy == 1) then zt(k) = g(x,szero)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim+(iy-1) + call ijk2idx(icol(icoeff),ix,iy-1,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif ! term depending on (x,y) - val(icoeff)=2.e0*(a1(x,y) + a2(x,y))/sqdeltah + c(x,y) - icol(icoeff) = (ix-1)*idim+iy + val(icoeff)=(2*sone)*(a1(x,y) + a2(x,y))/sqdeltah + c(x,y) + call ijk2idx(icol(icoeff),ix,iy,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 ! term depending on (x,y+1) @@ -379,7 +472,7 @@ contains if (iy == idim) then zt(k) = g(x,sone)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim+(iy+1) + call ijk2idx(icol(icoeff),ix,iy+1,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -388,7 +481,7 @@ contains if (ix==idim) then zt(k) = g(sone,y)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix)*idim+(iy) + call ijk2idx(icol(icoeff),ix+1,iy,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -398,7 +491,7 @@ contains if(info /= psb_success_) exit call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) if(info /= psb_success_) exit - zt(:)=0.e0 + zt(:)=szero call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) if(info /= psb_success_) exit end do @@ -469,50 +562,6 @@ contains end subroutine mld_s_gen_pde2d - ! - ! functions parametrizing the differential equation - ! - function b1(x,y) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: b1 - real(psb_spk_), intent(in) :: x,y - b1=szero - end function b1 - function b2(x,y) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: b2 - real(psb_spk_), intent(in) :: x,y - b2=szero - end function b2 - function c(x,y) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: c - real(psb_spk_), intent(in) :: x,y - c=szero - end function c - function a1(x,y) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: a1 - real(psb_spk_), intent(in) :: x,y - a1=sone - end function a1 - function a2(x,y) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: a2 - real(psb_spk_), intent(in) :: x,y - a2=sone - end function a2 - function g(x,y) - use psb_base_mod, only : psb_spk_, sone, szero - real(psb_spk_) :: g - real(psb_spk_), intent(in) :: x,y - g = szero - if (x == sone) then - g = sone - else if (x == szero) then - g = exp(-y**2) - end if - end function g end module mld_s_pde2d_mod program mld_s_pde2d @@ -654,8 +703,7 @@ program mld_s_pde2d ! call psb_barrier(ictxt) t1 = psb_wtime() - call mld_gen_pde2d(ictxt,idim,a,b,x,desc_a,afmt,& - & a1,a2,b1,b2,c,g,info) + call mld_gen_pde2d(ictxt,idim,a,b,x,desc_a,afmt,info) call psb_barrier(ictxt) t2 = psb_wtime() - t1 if(info /= psb_success_) then diff --git a/tests/pdegen/mld_s_pde3d.f90 b/tests/pdegen/mld_s_pde3d.f90 index a8865ddd..d073a23b 100644 --- a/tests/pdegen/mld_s_pde3d.f90 +++ b/tests/pdegen/mld_s_pde3d.f90 @@ -1,6 +1,6 @@ ! ! -! MLD2P4 version 2.1 +! MLD2P4 version 2.2 ! MultiLevel Domain Decomposition Parallel Preconditioners Package ! based on PSBLAS (Parallel Sparse BLAS version 3.5) ! @@ -92,13 +92,93 @@ contains val = szero end function s_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. sone/sqrt((3*sone)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b1 + real(psb_spk_), intent(in) :: x,y,z + b1=szero + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b2 + real(psb_spk_), intent(in) :: x,y,z + b2=szero + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b3 + real(psb_spk_), intent(in) :: x,y,z + b3=szero + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: c + real(psb_spk_), intent(in) :: x,y,z + c=szero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a1 + real(psb_spk_), intent(in) :: x,y,z + a1=sone/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a2 + real(psb_spk_), intent(in) :: x,y,z + a2=sone/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a3 + real(psb_spk_), intent(in) :: x,y,z + a3=sone/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: g + real(psb_spk_), intent(in) :: x,y,z + g = szero + if (x == sone) then + g = sone + else if (x == szero) then + g = exp(y**2-z**2) + end if + end function g + ! ! subroutine to allocate and fill in the coefficient matrix and ! the rhs. ! +<<<<<<< HEAD subroutine mld_s_gen_pde3d(ictxt,idim,a,bv,xv,desc_a,afmt,& & a1,a2,a3,b1,b2,b3,c,g,info,f,amold,vmold,imold,partition,nrl,iv) +======= + subroutine mld_s_gen_pde3d(ictxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv) +>>>>>>> mrgext use psb_base_mod use psb_util_mod ! @@ -117,7 +197,6 @@ contains ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. ! implicit none - procedure(s_func_3d) :: b1,b2,b3,c,a1,a2,a3,g integer(psb_ipk_) :: idim type(psb_sspmat_type) :: a type(psb_s_vect_type) :: xv,bv @@ -169,9 +248,9 @@ contains f_ => s_null_func_3d end if - deltah = 1.d0/(idim+2) + deltah = sone/(idim+2) sqdeltah = deltah*deltah - deltah2 = 2.d0* deltah + deltah2 = (2*sone)* deltah if (present(partition)) then if ((1<= partition).and.(partition <= 3)) then @@ -189,9 +268,13 @@ contains m = idim*idim*idim n = m - nnz = ((n*9)/(np)) + nnz = ((n*7)/(np)) if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n +<<<<<<< HEAD +======= + t0 = psb_wtime() +>>>>>>> mrgext select case(partition_) case(1) ! A BLOCK partition @@ -362,7 +445,7 @@ contains if (ix == 1) then zt(k) = g(szero,y,z)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-2)*idim*idim+(iy-1)*idim+(iz) + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -371,7 +454,7 @@ contains if (iy == 1) then zt(k) = g(x,szero,z)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim*idim+(iy-2)*idim+(iz) + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -380,15 +463,15 @@ contains if (iz == 1) then zt(k) = g(x,y,szero)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz-1) + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif ! term depending on (x,y,z) - val(icoeff)=2.d0*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + val(icoeff)=(2*sone)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & & + c(x,y,z) - icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 ! term depending on (x,y,z+1) @@ -396,7 +479,7 @@ contains if (iz == idim) then zt(k) = g(x,y,sone)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz+1) + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -405,7 +488,7 @@ contains if (iy == idim) then zt(k) = g(x,sone,z)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix-1)*idim*idim+(iy)*idim+(iz) + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -414,7 +497,7 @@ contains if (ix==idim) then zt(k) = g(sone,y,z)*(-val(icoeff)) + zt(k) else - icol(icoeff) = (ix)*idim*idim+(iy-1)*idim+(iz) + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) irow(icoeff) = glob_row icoeff = icoeff+1 endif @@ -424,7 +507,7 @@ contains if(info /= psb_success_) exit call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) if(info /= psb_success_) exit - zt(:)=0.d0 + zt(:)=szero call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) if(info /= psb_success_) exit end do @@ -494,62 +577,6 @@ contains return end subroutine mld_s_gen_pde3d - ! - ! functions parametrizing the differential equation - ! - function b1(x,y,z) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: b1 - real(psb_spk_), intent(in) :: x,y,z - b1=szero - end function b1 - function b2(x,y,z) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: b2 - real(psb_spk_), intent(in) :: x,y,z - b2=szero - end function b2 - function b3(x,y,z) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: b3 - real(psb_spk_), intent(in) :: x,y,z - b3=szero - end function b3 - function c(x,y,z) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: c - real(psb_spk_), intent(in) :: x,y,z - c=szero - end function c - function a1(x,y,z) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: a1 - real(psb_spk_), intent(in) :: x,y,z - a1=sone - end function a1 - function a2(x,y,z) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: a2 - real(psb_spk_), intent(in) :: x,y,z - a2=sone - end function a2 - function a3(x,y,z) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: a3 - real(psb_spk_), intent(in) :: x,y,z - a3=sone - end function a3 - function g(x,y,z) - use psb_base_mod, only : psb_spk_,sone,szero - real(psb_spk_) :: g - real(psb_spk_), intent(in) :: x,y,z - g = szero - if (x == sone) then - g = sone - else if (x == szero) then - g = exp(y**2-z**2) - end if - end function g end module mld_s_pde3d_mod program mld_s_pde3d @@ -692,8 +719,7 @@ program mld_s_pde3d call psb_barrier(ictxt) t1 = psb_wtime() - call mld_gen_pde3d(ictxt,idim,a,b,x,desc_a,afmt,& - & a1,a2,a3,b1,b2,b3,c,g,info) + call mld_gen_pde3d(ictxt,idim,a,b,x,desc_a,afmt,info) call psb_barrier(ictxt) t2 = psb_wtime() - t1 if(info /= psb_success_) then diff --git a/tests/pdegen/runs/mld_pde3d.inp b/tests/pdegen/runs/mld_pde3d.inp index 316edc63..7d1bcbb7 100644 --- a/tests/pdegen/runs/mld_pde3d.inp +++ b/tests/pdegen/runs/mld_pde3d.inp @@ -1,7 +1,7 @@ %%%%%%%%%%% General arguments % Lines starting with % are ignored. CSR ! Storage format CSR COO JAD 0080 ! IDIM; domain size. Linear system size is IDIM**3 -CG ! Iterative method: BiCGSTAB BiCGSTABL BiCG CG CGS FCG GCR RGMRES +BICGSTAB ! Iterative method: BiCGSTAB BiCGSTABL BiCG CG CGS FCG GCR RGMRES 2 ! ISTOPC 00500 ! ITMAX 1 ! ITRACE