mld2p4-2:

docs/html/index.html
 docs/html/node17.html
 docs/html/node2.html
 docs/html/node23.html
 docs/html/node24.html
 docs/html/node25.html
 docs/html/node28.html
 docs/html/userhtml.html
 docs/mld2p4-2.1-guide.pdf
 docs/src/userinterface.tex
 mlprec/impl/mld_ccprecset.F90
 mlprec/impl/mld_cprecset.F90
 mlprec/impl/mld_dcprecset.F90
 mlprec/impl/mld_dprecset.F90
 mlprec/impl/mld_scprecset.F90
 mlprec/impl/mld_sprecset.F90
 mlprec/impl/mld_zcprecset.F90
 mlprec/impl/mld_zprecset.F90

ALign precset to cprecset
Improve SM and SV set to user's guide
stopcriterion
Salvatore Filippone 8 years ago
parent cf7f97c1ec
commit b32cd88ef8

@ -136,7 +136,7 @@ Feb. 28, 2017
</UL>
<BR>
<LI><A NAME="tex2html48"
HREF="node24.html">Adding smoothers and solvers to MLD2P4</A>
HREF="node24.html">Adding new smoothers and solvers to MLD2P4</A>
<LI><A NAME="tex2html49"
HREF="node25.html">Error Handling</A>
<LI><A NAME="tex2html50"

@ -241,7 +241,7 @@ solver is changed to the default sequential solver.
<P>
<BR><P></P>
<DIV ALIGN="CENTER"><A NAME="962"></A>
<DIV ALIGN="CENTER"><A NAME="963"></A>
<TABLE>
<CAPTION><STRONG>Table 2:</STRONG>
Parameters defining the multi-level cycle and the number of cycles to
@ -294,7 +294,7 @@ number <IMG
<P>
<BR><P></P>
<DIV ALIGN="CENTER"><A NAME="967"></A>
<DIV ALIGN="CENTER"><A NAME="968"></A>
<TABLE>
<CAPTION><STRONG>Table 3:</STRONG>
Parameters defining the aggregation algorithm.
@ -409,7 +409,7 @@ of levels.</TD>
<P>
<BR><P></P>
<DIV ALIGN="CENTER"><A NAME="971"></A>
<DIV ALIGN="CENTER"><A NAME="972"></A>
<TABLE>
<CAPTION><STRONG>Table 4:</STRONG>
Parameters defining the aggregation algorithm (continued).
@ -547,7 +547,7 @@ the parameter <TT>ilev</TT>.</TD>
<P>
<BR><P></P>
<DIV ALIGN="CENTER"><A NAME="976"></A>
<DIV ALIGN="CENTER"><A NAME="977"></A>
<TABLE>
<CAPTION><STRONG>Table 5:</STRONG>
Parameters defining the coarse-space correction at the coarsest
@ -655,7 +655,7 @@ Note that <TT>UMF</TT> and <TT>SLU</TT> require the coarsest
<P>
<BR><P></P>
<DIV ALIGN="CENTER"><A NAME="978"></A>
<DIV ALIGN="CENTER"><A NAME="979"></A>
<TABLE>
<CAPTION><STRONG>Table 6:</STRONG>
Parameters defining the coarse-space correction at the coarsest
@ -721,7 +721,7 @@ number <IMG
<P>
<BR><P></P>
<DIV ALIGN="CENTER"><A NAME="980"></A>
<DIV ALIGN="CENTER"><A NAME="981"></A>
<TABLE>
<CAPTION><STRONG>Table 7:</STRONG>
Parameters defining the smoother or the details of the one-level preconditioner.
@ -844,7 +844,7 @@ Parameters defining the smoother or the details of the one-level preconditioner.
<P>
<BR><P></P>
<DIV ALIGN="CENTER"><A NAME="982"></A>
<DIV ALIGN="CENTER"><A NAME="983"></A>
<TABLE>
<CAPTION><STRONG>Table 8:</STRONG>
Parameters defining the smoother or the details of the one-level preconditioner

@ -108,7 +108,7 @@ Contents</A>
</UL>
<BR>
<LI><A NAME="tex2html96"
HREF="node24.html">Adding smoothers and solvers to MLD2P4</A>
HREF="node24.html">Adding new smoothers and solvers to MLD2P4</A>
<LI><A NAME="tex2html97"
HREF="node25.html">Error Handling</A>
<LI><A NAME="tex2html98"

@ -39,7 +39,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A>
<BR>
<B> Next:</B> <A NAME="tex2html358"
HREF="node24.html">Adding smoothers and solvers</A>
HREF="node24.html">Adding new smoothers and</A>
<B> Up:</B> <A NAME="tex2html354"
HREF="node15.html">User Interface</A>
<B> Previous:</B> <A NAME="tex2html350"

@ -7,8 +7,8 @@ original version by: Nikos Drakos, CBLU, University of Leeds
Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
<HTML>
<HEAD>
<TITLE>Adding smoothers and solvers to MLD2P4</TITLE>
<META NAME="description" CONTENT="Adding smoothers and solvers to MLD2P4">
<TITLE>Adding new smoothers and solvers to MLD2P4</TITLE>
<META NAME="description" CONTENT="Adding new smoothers and solvers to MLD2P4">
<META NAME="keywords" CONTENT="userhtml">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
@ -53,37 +53,53 @@ original version by: Nikos Drakos, CBLU, University of Leeds
<H1><A NAME="SECTION00090000000000000000"></A><A NAME="sec:adding"></A>
<BR>
Adding smoothers and solvers to MLD2P4
Adding new smoothers and solvers to MLD2P4
</H1>
<P>
<B>Da ampliare e completare - SALVATORE.</B>
<BR>
<P>
Completely new smoother and/or solver classes derived from the
base objects in the library may be used without recompiling the
library itself. Once the new smoother/solver class has been
developed, the user can declare a variable of that new type in the
application, and pass that variable to the <code>p%set(solver,info)</code>
call; the new solver object is then dynamically included in the
preconditioner structure.
Developers can add completely new smoother and/or solver classes
derived from the base objects in the library may be used without
recompiling the library itself. To do so it is necessary first to
select the base type to be extended; in our experience, it is quite
likely that the new application needs only require the definition of a
``solver'' object, which is almost always acting only on the local
part of the distributed matrix. The parallel actions required to
connect the various solver objects are most often already provided by
the Block Jacobi or the Additive Schwarz smoothers.
To define a new solver, the developer will then have to define its
components and methods, perhaps taking one of the predefined solvers
as a starting point if possible.
<P>
Once the new smoother/solver class has been developed, to use it in
the context of the multilevel preconditioners it is necessary to:
<BR>
<P>
If the user has developed a new type of smoother and/or
solver by extending one of the base MLD2P4 types, and has declared a
variable of the new type in the main program, it is possible to pass
the new smoother/solver variable to the setup routine as follows:
<UL>
<LI>Declare in the application program a variable of the new type;
</LI>
<LI>Pass that variable as the argument to the se routine as in the
following:
<DIV ALIGN="CENTER">
<code>call p%set(smoother,info [,ilev, ilmax,pos])</code>
<BR><code>call p%set(solver,info [,ilev, ilmax,pos])</code>
</DIV>
In this way, the variable will act as a <I>mold</I> to which the
preconditioner will conform, even though the MLD2P4 library is not
modified, and thus has no direct knowledge about the new type.
</LI>
<LI>Link into the application executable the code implementing the
various methods.
</LI>
</UL>
The new solver object is then dynamically included in the
preconditioner structure, and will act as a <I>mold</I> to which the
preconditioner will conform, even though the MLD2P4 library has not
been modified to account for this new development.
<P>
It is possible to define new values for the keyword <code>WHAT</code> in the
<code>set</code> routines; if the library code does not recognize a keyword,
it passes it down the composition hierarchy (levels containing
smoothers containing solvers), so that it can be eventually caught by
the new solver.
<P>

@ -44,7 +44,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds
<B> Up:</B> <A NAME="tex2html378"
HREF="userhtml.html">userhtml</A>
<B> Previous:</B> <A NAME="tex2html372"
HREF="node24.html">Adding smoothers and solvers</A>
HREF="node24.html">Adding new smoothers and</A>
&nbsp; <B> <A NAME="tex2html380"
HREF="node2.html">Contents</A></B>
<BR>

@ -63,7 +63,7 @@ Mathematics Department, Macquarie University, Sydney.
The command line arguments were: <BR>
<STRONG>latex2html</STRONG> <TT>-local_icons -noaddress -dir ../../html userhtml.tex</TT>
<P>
The translation was initiated by Salvatore Filippone on 2017-04-21
The translation was initiated by Salvatore Filippone on 2017-04-24
<BR><HR>
</BODY>

@ -136,7 +136,7 @@ Feb. 28, 2017
</UL>
<BR>
<LI><A NAME="tex2html48"
HREF="node24.html">Adding smoothers and solvers to MLD2P4</A>
HREF="node24.html">Adding new smoothers and solvers to MLD2P4</A>
<LI><A NAME="tex2html49"
HREF="node25.html">Error Handling</A>
<LI><A NAME="tex2html50"

@ -83,7 +83,7 @@ endstream
endobj
172 0 obj
<<
/Length 7171
/Length 7176
>>
stream
0 g 0 G
@ -253,9 +253,9 @@ BT
[-1281(38)]TJ
0 g 0 G
0 0 1 rg 0 0 1 RG
/F43 10.9091 Tf -16.364 -24.458 Td [(7)-925(Adding)-383(smo)-32(others)-384(and)-383(solv)32(ers)-383(t)-1(o)-383(MLD2P4)]TJ
/F43 10.9091 Tf -16.364 -24.458 Td [(7)-925(Adding)-383(new)-384(smo)-32(others)-383(and)-383(solv)32(ers)-384(to)-383(MLD2P4)]TJ
0 g 0 G
[-13589(39)]TJ
[-11209(39)]TJ
0 0 1 rg 0 0 1 RG
0 -24.459 Td [(8)-925(Error)-383(Handling)]TJ
0 g 0 G
@ -279,7 +279,7 @@ endobj
/Type /ObjStm
/N 100
/First 814
/Length 8404
/Length 8409
>>
stream
1 0 5 38 6 84 9 125 10 146 13 187 14 219 17 260 18 293 21 334
@ -287,11 +287,11 @@ stream
42 803 45 844 46 880 49 926 50 963 53 1009 54 1047 57 1093 58 1147 61 1188
62 1219 65 1265 66 1291 69 1332 70 1362 73 1408 74 1441 77 1487 78 1519 81 1565
82 1599 85 1645 86 1692 89 1738 90 1785 93 1831 94 1865 97 1911 98 1944 101 1990
102 2025 105 2067 106 2122 109 2164 110 2195 113 2238 114 2262 117 2305 118 2330 119 2375
122 2489 123 2543 3 2597 120 2649 129 2742 131 2856 128 2910 133 2946 135 3060 7 3114
132 3166 139 3259 141 3373 138 3427 171 3494 142 3844 143 3990 144 4136 145 4282 146 4428
147 4580 148 4732 149 4884 150 5035 151 5186 152 5332 153 5484 154 5636 155 5788 156 5934
157 6086 158 6231 159 6382 160 6534 161 6685 162 6837 163 6989 164 7141 165 7293 166 7445
102 2025 105 2067 106 2126 109 2168 110 2199 113 2242 114 2266 117 2309 118 2334 119 2379
122 2493 123 2547 3 2601 120 2653 129 2746 131 2860 128 2914 133 2950 135 3064 7 3118
132 3170 139 3263 141 3377 138 3431 171 3498 142 3848 143 3994 144 4140 145 4286 146 4432
147 4584 148 4736 149 4888 150 5039 151 5190 152 5336 153 5488 154 5640 155 5792 156 5938
157 6090 158 6235 159 6386 160 6538 161 6689 162 6841 163 6993 164 7145 165 7297 166 7449
% 1 0 obj
<< /S /GoTo /D (title.0) >>
% 5 0 obj
@ -395,7 +395,7 @@ stream
% 102 0 obj
<< /S /GoTo /D (section.7) >>
% 105 0 obj
(7 Adding smoothers and solvers to MLD2P4)
(7 Adding new smoothers and solvers to MLD2P4)
% 106 0 obj
<< /S /GoTo /D (section.8) >>
% 109 0 obj
@ -695,7 +695,7 @@ stream
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [92.604 275.016 346.26 286.705]
/Rect [92.604 275.016 372.222 286.705]
/A << /S /GoTo /D (section.7) >>
>>
@ -6327,7 +6327,7 @@ endstream
endobj
557 0 obj
<<
/Length 3346
/Length 5303
>>
stream
0 g 0 G
@ -6337,10 +6337,22 @@ BT
0 g 0 G
[-378(User)-377(Interf)88(a)23(ce)]TJ/F15 10.9091 Tf 401.542 0 Td [(39)]TJ
0 g 0 G
/F17 14.3462 Tf -401.542 -35.866 Td [(7)-1125(Adding)-375(smo)-31(others)-375(and)-375(solv)31(ers)-375(to)-375(MLD2P4)]TJ/F43 10.9091 Tf 0 -24.352 Td [(Da)-383(ampli)-1(are)-383(e)-383(completare)-384(-)-383(SAL)128(V)128(A)95(TORE.)]TJ/F15 10.9091 Tf 16.937 -27.098 Td [(Completely)-281(new)-281(smo)-27(other)-281(and/or)-281(solv)28(er)-281(classes)-281(deriv)28(ed)-281(from)-281(th)1(e)-281(base)-281(ob)-56(jects)-280(in)-281(the)]TJ -16.937 -13.549 Td [(library)-222(ma)28(y)-223(b)-27(e)-223(u)1(s)-1(ed)-222(without)-222(recompiling)-222(the)-222(library)-222(itself.)-408(Once)-222(the)-222(new)-222(smo)-28(other/solv)28(er)]TJ 0 -13.55 Td [(class)-318(has)-317(b)-28(een)-317(dev)27(elop)-27(ed,)-321(the)-317(user)-318(can)-317(declare)-318(a)-317(v)55(ariable)-317(of)-318(that)-317(new)-318(t)28(yp)-28(e)-317(in)-318(the)-317(appli-)]TJ 0 -13.549 Td [(cation,)-366(and)-360(pass)-360(th)1(at)-360(v)55(ariab)1(le)-360(to)-360(the)]TJ/F44 10.9091 Tf 179.508 0 Td [(p%set\050solver,info\051)]TJ/F15 10.9091 Tf 107.014 0 Td [(call;)-373(the)-359(new)-360(solv)28(er)-360(ob)-56(ject)]TJ -286.522 -13.549 Td [(is)-333(then)-334(dynamically)-333(included)-333(in)-333(the)-334(preconditioner)-333(structure.)]TJ 16.937 -40.648 Td [(If)-383(the)-383(user)-383(has)-383(dev)28(elop)-28(ed)-383(a)-382(new)-383(t)27(yp)-27(e)-383(of)-383(smo)-28(other)-383(and/or)-383(solv)28(er)-383(b)28(y)-383(extending)-383(one)]TJ -16.937 -13.549 Td [(of)-394(the)-395(base)-395(MLD)1(2P4)-395(t)28(yp)-28(es,)-410(and)-394(has)-395(declared)-394(a)-395(v)56(ariable)-395(of)-394(the)-395(n)1(e)-1(w)-394(t)28(yp)-28(e)-395(in)-394(the)-394(m)-1(ai)1(n)]TJ 0 -13.549 Td [(program,)-401(it)-388(is)-387(p)-28(ossible)-388(to)-387(pass)-388(the)-388(n)1(e)-1(w)-387(smo)-28(other/solv)28(er)-388(v)56(ariable)-388(to)-387(the)-388(setup)-388(rou)1(tine)]TJ 0 -13.549 Td [(as)-333(follo)27(ws:)]TJ
/F17 14.3462 Tf -401.542 -35.866 Td [(7)-1125(Adding)-375(new)-375(smo)-31(others)-375(and)-375(solv)31(ers)-375(to)-375(MLD2P4)]TJ/F15 10.9091 Tf 0 -24.352 Td [(Dev)28(elop)-28(ers)-414(can)-413(add)-414(completely)-413(new)-414(smo)-28(other)-414(an)1(d/or)-414(solv)28(er)-414(classes)-414(deriv)28(ed)-413(from)-414(the)]TJ 0 -13.549 Td [(base)-302(ob)-55(jects)-302(in)-301(the)-302(library)-301(ma)28(y)-302(b)-28(e)-301(used)-302(without)-301(recompiling)-302(th)1(e)-302(library)-301(itself.)-434(T)83(o)-301(do)-302(so)]TJ 0 -13.549 Td [(it)-317(is)-317(necessary)-317(\014rst)-317(to)-317(select)-317(the)-317(base)-317(t)28(yp)-28(e)-317(to)-317(b)-27(e)-317(exte)-1(n)1(ded;)-323(in)-317(our)-317(exp)-27(erience,)-321(it)-317(is)-317(q)1(uite)]TJ 0 -13.549 Td [(lik)28(ely)-396(that)-396(the)-396(new)-397(application)-396(needs)-396(only)-396(require)-396(the)-396(de\014nition)-396(of)-396(a)-396(\134solv)28(er")-397(ob)-55(ject,)]TJ 0 -13.55 Td [(whic)28(h)-417(is)-417(al)1(m)-1(ost)-416(alw)28(a)27(ys)-416(acting)-417(only)-416(on)-417(the)-417(lo)-27(c)-1(al)-416(part)-417(of)-416(the)-417(distributed)-416(matrix.)-695(The)]TJ 0 -13.549 Td [(parallel)-399(actions)-399(required)-399(to)-399(connect)-399(the)-399(v)55(ari)1(ous)-400(solv)28(er)-399(ob)-55(jects)-399(are)-400(most)-399(often)-399(already)]TJ 0 -13.549 Td [(pro)28(vided)-447(b)28(y)-447(the)-447(Blo)-28(c)28(k)-447(Jacobi)-446(or)-447(the)-447(Additiv)28(e)-447(Sc)28(h)28(w)27(arz)-446(smo)-28(others.)-785(T)83(o)-447(de\014ne)-446(a)-447(new)]TJ 0 -13.549 Td [(solv)28(er,)-466(the)-440(dev)28(elop)-28(er)-439(will)-440(then)-439(ha)28(v)27(e)-439(to)-440(de\014ne)-439(its)-440(comp)-28(onen)28(ts)-439(and)-440(metho)-28(ds,)-466(p)-27(erhaps)]TJ 0 -13.549 Td [(taking)-333(one)-334(of)-333(the)-333(prede\014ned)-333(solv)27(ers)-333(as)-333(a)-334(starting)-333(p)-28(oin)28(t)-333(if)-333(p)-28(ossible.)]TJ 16.937 -13.55 Td [(Once)-329(the)-329(new)-329(smo)-28(other/solv)28(er)-329(class)-329(has)-329(b)-27(een)-329(dev)28(e)-1(l)1(op)-28(ed,)-330(to)-329(use)-329(it)-329(in)-329(th)1(e)-329(con)27(text)-329(of)]TJ -16.937 -13.549 Td [(the)-333(m)27(ultil)1(e)-1(v)28(el)-333(preconditioners)-333(it)-334(is)-333(necessary)-333(to:)]TJ
0 g 0 G
/F25 10.9091 Tf 16.364 -22.515 Td [(\017)]TJ
0 g 0 G
/F44 10.9091 Tf 80.227 -22.516 Td [(call)-525(p%set\050smoother,info)-525([,ilev,)-525(ilmax,pos]\051)]TJ 5.727 -13.549 Td [(call)-525(p%set\050solver,info)-525([,ilev,)-525(ilmax,pos]\051)]TJ/F15 10.9091 Tf -85.954 -22.516 Td [(In)-375(this)-376(w)28(a)28(y)83(,)-386(the)-375(v)55(ariable)-375(will)-376(act)-375(as)-376(a)]TJ/F18 10.9091 Tf 184.403 0 Td [(mold)]TJ/F15 10.9091 Tf 28.084 0 Td [(to)-375(whic)27(h)-375(the)-375(prec)-1(on)1(ditioner)-376(will)-375(conform,)]TJ -212.487 -13.549 Td [(ev)28(en)-413(though)-412(the)-412(MLD2P4)-412(library)-413(is)-412(not)-412(mo)-28(di\014ed,)-432(and)-412(th)28(us)-413(has)-412(no)-412(direct)-413(kno)28(wledge)]TJ 0 -13.549 Td [(ab)-28(out)-333(the)-333(new)-334(t)28(yp)-28(e.)]TJ/F44 10.9091 Tf 22.914 -37.579 Td [(smoother)-14(class\050mld_x_base_smoother_type\051)]TJ/F15 10.9091 Tf 45.971 -13.549 Td [(The)-333(user-de\014ned)-334(new)-333(smo)-28(other)-333(to)-333(b)-28(e)-334(emplo)28(y)28(ed)-333(in)-334(the)-333(preconditioner.)]TJ/F44 10.9091 Tf -45.971 -13.549 Td [(solver)-1064(class\050mld_x_base_solver_type\051)]TJ/F15 10.9091 Tf 45.971 -13.55 Td [(The)-333(user-de\014ned)-334(new)-333(solv)28(er)-334(to)-333(b)-28(e)-333(emplo)28(y)28(ed)-334(in)-333(the)-333(preconditioner.)]TJ
/F15 10.9091 Tf 10.909 0 Td [(Declare)-333(in)-334(the)-333(application)-333(program)-333(a)-334(v)56(ariable)-333(of)-334(the)-333(new)-333(t)27(yp)-27(e;)]TJ
0 g 0 G
/F25 10.9091 Tf -10.909 -22.516 Td [(\017)]TJ
0 g 0 G
/F15 10.9091 Tf 10.909 0 Td [(P)28(ass)-334(that)-333(v)56(ariable)-334(as)-333(the)-333(argumen)28(t)-334(to)-333(the)-333(se)-334(routine)-333(as)-333(in)-334(the)-333(follo)28(wing:)]TJ
0 g 0 G
0 g 0 G
/F44 10.9091 Tf 66.591 -26.999 Td [(call)-525(p%set\050smoother,info)-525([,ilev,)-525(ilmax,pos]\051)]TJ 5.727 -13.549 Td [(call)-525(p%set\050solver,info)-525([,ilev,)-525(ilmax,pos]\051)]TJ
0 g 0 G
/F25 10.9091 Tf -83.227 -26.999 Td [(\017)]TJ
0 g 0 G
/F15 10.9091 Tf 10.909 0 Td [(Link)-308(in)27(to)-308(the)-309(application)-308(executable)-309(the)-308(co)-28(de)-309(implemen)28(ting)-309(th)1(e)-309(v)55(ar)1(ious)-309(metho)-28(ds.)]TJ -27.273 -22.515 Td [(The)-270(new)-270(solv)28(er)-270(ob)-55(ject)-270(is)-270(then)-269(dynamically)-270(included)-270(in)-269(the)-270(preconditioner)-270(stru)1(c)-1(tu)1(re)-1(,)-282(and)]TJ 0 -13.549 Td [(will)-321(act)-321(as)-321(a)]TJ/F18 10.9091 Tf 60.74 0 Td [(mold)]TJ/F15 10.9091 Tf 27.49 0 Td [(to)-321(whic)28(h)-321(the)-322(p)1(rec)-1(on)1(ditioner)-321(w)-1(i)1(ll)-322(confor)1(m)-1(,)-323(ev)28(en)-321(though)-321(the)-321(MLD2P4)]TJ -88.23 -13.55 Td [(library)-333(has)-334(n)1(ot)-334(b)-28(een)-333(mo)-28(di\014ed)-333(to)-333(accoun)28(t)-334(for)-333(this)-333(new)-334(dev)28(elopmen)28(t.)]TJ 16.937 -13.549 Td [(It)-358(is)-358(p)-28(ossible)-358(to)-357(de\014ne)-358(new)-358(v)55(alues)-358(for)-357(the)-358(k)27(eyw)28(ord)]TJ/F44 10.9091 Tf 244.802 0 Td [(WHAT)]TJ/F15 10.9091 Tf 26.813 0 Td [(in)-358(the)]TJ/F44 10.9091 Tf 32.052 0 Td [(set)]TJ/F15 10.9091 Tf 21.086 0 Td [(routines;)-370(if)-358(the)]TJ -341.69 -13.549 Td [(library)-319(co)-28(de)-319(do)-28(es)-319(not)-319(recognize)-320(a)-319(k)28(eyw)28(ord,)-322(it)-319(passes)-320(it)-319(do)28(wn)-319(the)-319(comp)-28(osition)-319(hierarc)28(h)27(y)]TJ 0 -13.549 Td [(\050lev)28(els)-307(con)28(taining)-307(smo)-28(others)-306(con)27(tain)1(ing)-307(solv)28(ers\051,)-312(so)-307(that)-307(it)-306(c)-1(an)-306(b)-28(e)-307(ev)28(en)28(tually)-307(caugh)28(t)-307(b)28(y)]TJ 0 -13.549 Td [(the)-333(new)-334(solv)28(er.)]TJ/F44 10.9091 Tf 22.914 -37.579 Td [(smoother)-14(class\050mld_x_base_smoother_type\051)]TJ/F15 10.9091 Tf 45.971 -13.55 Td [(The)-333(user-de\014ned)-334(new)-333(smo)-28(other)-333(to)-333(b)-28(e)-334(emplo)28(y)28(ed)-333(in)-334(the)-333(preconditioner.)]TJ/F44 10.9091 Tf -45.971 -13.549 Td [(solver)-1064(class\050mld_x_base_solver_type\051)]TJ/F15 10.9091 Tf 45.971 -13.549 Td [(The)-333(user-de\014ned)-334(new)-333(solv)28(er)-334(to)-333(b)-28(e)-333(emplo)28(y)28(ed)-334(in)-333(the)-333(preconditioner.)]TJ
0 g 0 G
0 g 0 G
ET
@ -6560,10 +6572,10 @@ endstream
endobj
603 0 obj
<<
/Length1 2262
/Length2 18451
/Length1 2234
/Length2 18115
/Length3 0
/Length 20713
/Length 20349
>>
stream
%!PS-AdobeFont-1.0: CMBX10 003.002
@ -6583,7 +6595,7 @@ FontDirectory/CMBX10 known{/CMBX10 findfont dup/UniqueID known{dup
11 dict begin
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
/FontName /XKTSPK+CMBX10 def
/FontName /FOOXCC+CMBX10 def
/FontBBox {-56 -250 1164 750 }readonly def
/PaintType 0 def
/FontInfo 9 dict dup begin
@ -6616,9 +6628,7 @@ dup 79 /O put
dup 80 /P put
dup 82 /R put
dup 83 /S put
dup 84 /T put
dup 85 /U put
dup 86 /V put
dup 97 /a put
dup 98 /b put
dup 99 /c put
@ -6692,40 +6702,43 @@ SDa
ëŸ|RÝR
šD¾º¦tû6%Ó'N ÌÀ¨áX^3<1A>Z`jF·j&cV×d*ÏþªØ$Ÿê«röáÈÔyžŠ -h¢ªØd<Gô‡õ%<25><EFBFBD>µ~íFqC2ÞZA1¸fµX&­—Gf¿fòü>gÌ™«“wÎM—˜Ììߦ Ш„Þžñç@²cÙ§¤Ç—V±u*R{ë²HËdѨÞÜ#UÛ.¾ã¢=-TWj§TiÑ3WM¾ã¡vþœ+‰ˆ‹õÛœ¯ü,¸ñ;Û*ÅI2i;ΚX#õU÷yYÕ˜©
øGgá¨<05>ä$þÅð´«ãå||F<> ýËîǘ¶:gµè±.[~,X­j¿.O\ß áó&†Í<>¸ÏJÍ8N†Ìðg,Ñ$ó1þüGÿž|ËÀù­Ù õ<>-eßµTü?~2µÅ¦aÇ ±°%«[—•Yý+#Ëi<C38B>àOxž6¤@Ò«‰N}Ìõ ½oÞN*Æ#ÀIlüô ¾ëS`]‡àݳhU„µ½Gü_\zÈêý<C3AA>!n
vRv<EFBFBD>µÍÜîÈoɽßlYUBØó.-A!>kg¤Ú4S!eµî\O·Í¯<C38D>;ÅÀOÔîãË<C3A3><C38B>·(j½‰½I6êabâ䤺;yD+¦O9²1U^ÁswîÕŒØÏtÃù«÷aO1<13>ãFìôedÅê‰ÚqÎQ&.™4nëÄ©Y¬sŠ¶Íêi‰ÖüeÍtqM¶Œ§fŸÜ?gù ÉI%]C)þ’ÈÅ$wR²”]-p|<Àm]Äß|cŸ^ëœÍåÍþý4_ÄÛÊ <0A>Tèlç­gªÍñ)²»„:9 ˆLƒ¼„rù¯?ùgø§#Êì¡•›ó–òÛ"æ‰lü®ñî<0E>T¢Z*¼ýUØIQŸ<51>œß9`ÐOzvb,§<><C2A7>˜âÓ°E>×.ä+ò†šš—9Ž õðÊ<>·º³º¸ìÍ®6 ™^…b³|…~I[ÒÕ<C392>Ñ"Ò6 ³il¶Í`ÐVÙY`=Û±àw %2”£î˜…™vl|T<0E>QváS ñ1á|eV |†Þ<1D>ŸËþnQ;Å èÁ¥‡)ž¢J¬1a—©Äm7vOgšQx…*²[™¸B)1Ž×¡ü|Èc/â<><5F>‡mpÌi:·<>¦9)›€ò>§Ê­î9ÎŒôñî-YǨo|AD[+û•tŸ¿p.µ¡¯(ZÊšÕ=ßÒ“o|•Í\Ó„æ`QÃÞøÐäC¯E½`ȱ4Äù.¥ÎÖ»L¨#VÎJcáVm§¸",!>ï^J]$.Ö?[®<>ýW¢9F„¬gD0^´åùg„Þ\£æå¿ nåàaV}B$¨îî‘A
Äl´x^ŒŠAŠÊO c€ö†Ü¤6V0+eY4`eYàÉß#ƒ·ãjˆÆZ ¢/—):ÙŒbp°üXDs³Úw]<5D> ûBŒù!ŸÕ|lpËi€,±pô™®* Úg$@dªSJ*õ®¤3{I<>pp<70>ò <68>gi<ÄÊŒ5xwcBà(ßµ<™«Ü}T7\ˆV9iÓꉹ@+ ¯/p1Õíü=q¼­ÖØoк 3D„:äœVÁiqNåå!ÞKnÏ^ö²ôÉÍ(†ŸqŒR~ä·hâX²U»¯z€L'~kC•|S:®c/÷¶snEì×2 ò­âW]<5D>Nh€íGHWãòˆð<10>Éžê5!ý<C3BD>R±üƒúy!××9A aq|¢o<C2A2>ÇZÀò¢žÜ³wT1Î&Ì÷Cä£M¹ëo,<2C>ô
÷°I³®EäÿNEo1T[ݡѽŠm*a—Cr Ú÷È,µmN™ŸÐ…ÿkî# L¹7Èát!¹uL„ƒNÖs;Æ<>«Ñ$ïÀeè0ÿ}°6f,É›'ð*ŒGrà} _~©Q {j+Ä»Ìu8HÔW ú hñܳï½mÖ\?—ð>ÂNy]ˆë9L4<z«U˜ 0NóÕç¶îÜË_¬5ýmh hãüCt@ †s´×Ç-¡†ìÏœ“?hzݾ¾ÍÎÿüy»{g>÷NÕ>e×?“mp\ãèr¢rÝÕä%<25><<3C> ,mœ<6D>•ouA¤ˆå 2oL -Ânš}ÂZÅqµ
ŸˆŠœhlF„Xi_<69>í¶¿±ò~Þ6ï-Ý ·“NlNWé¹ÝP»KmoQ~×!óëµ<C3AB>êÿÇ<C3BF>ðŠ¯v>¼!„W ›žÉ|¤SË]àƒ<C3A0>¸G$·\måpÌüó_žâ*³Ú!A5å]Ø¡&
ƒÏÔa'¶nÇ2xþhTš:ãtæ~:@€pÞþ¿JΞtîÆ=ùZ$–ܺ/Âå%1M"|.ÀBÙRt<e¬†ÇZC=B#c,síº>LïêNKz6ôwY†¤Ø,YËÿÊùL€h3áÑ®_ßZR—e¤?‡R°KŠ{ð;~úoÞ°~dPƒW¡@EÊàÞÚ£½CØS¦Á<Æ_Uît³<74> Ë$þh·p½sš †¿nE9…”§Ñ´æU^h꘰¤Ü<C2A4>³•x-çªo™µ÷¬XÕŸ¶]<5D>ë<EFBFBD>¨vá=ŸÅÃ{úœ{…•Á¶e#ð lÓk<C393>ëš# ˳<C38B><EFBFBD>¸$Ê8Ð2dd}<7D>¼~üà¿ë3h”DN£Oùßå3"bÁ-še?S+<2B>ص`$
*²6Ì­ûi¥õ"‡>4O~{„ùͶÉņ <E280A0>gAÞ…µUÍ'ý³<C3BD>-⎗¼&<26>cøàw?ô$]¥AZyß^³šrÕól?ô<>·¦[í HÉetç僧€S?õÚR§ÿòzža…ZFc65\û7^FI±ð2ÍËÐt?µ‚Ót¨WÖ; ¼”¥ÜeV0êàŸÍ'þ3½yë3/gÇGºýY4Ùï?¤æB3©7TŽRÈŸ‡6ÑÓùŽ`W´EFûrrwñKÄ’üš'vnì¤×9â<>GOË¿!Nl÷ó¡-|VjX¸VòØ“võÙì9ep<±ì¹9,r§Ë"ÏÌ…˜(<28>4ÃNæžæ2"¹ŠÊÿÒ¶²ÙÕʽ©è•ì±l¼® “1Ù\Ζn~××”¾Æ;K+hi¨(ü[úßÎÙ?ýüÇì¦-|<7C>Àåtrƒ±n¡_.•“=°E´—¼d¦ß¼žP!`Á{ç°¸àÝ2˜—'Æûèa$|¤¥w÷^øá/uˆó74d$gXÑE<¿[5<ïÀ"Å©ÑOXÛÈ”•<E2809D>®föå8{æ<00>._ àdÕujõ¢ÕHÈð0ìi6kâ¤ñPd“Q«Q0¦:gUe}t×Sò  ت‘Ý`"ÿöµÃ% Wàä$}µX5µY¶¤L2¢ñ{¾ÿñØ¡2xr„ÓâTaÛê¾N>ŒŒÇ#\ IÉ•E‡±7”*<2A>½vHcª<63>µŒï§d áúð9̾¶<C2BE>y5^
Sv 1;,ÚgŽÏ11Yp<59>Ïè/)_V;ÈÁÈ™(!<21>MpmŒô]^ló<72>R Å;Kä(“u%M¹†
»YW0 ¯×l˜ä0àJ4l0”£`Ù·`9úÁ”P]F:æniùÍ EªªKôUÀ«oš¬MçØT^¦Ql 0<E2809A>ýÕ‡kŠÔÅå1(€þÀQ©Ø(BVXÞ"Ѭ¯H±tZ<74>9U¤…ànon—½µ/¨ð©ßæÛ˜ÑÙ|7ÒÒu| p¡è÷w†,Œ£[²Ì›ÍÖ™²ºêï³)ÄûöT2Ò®ìÿó”h–€ÐØ[a«ï@ÌÜhÁq~-»êÐzm5Î@<Çøó÷͘·lÒ—ü©Â@Ñ
G<EFBFBD>A"ý±~a”ô°\<>ÀvÂfã×ËxÒTstõ%»¿GhÉóÆ?œ7 E.]<5D>÷ËN-öéë=Q±;5OéZŒøP@EÄ÷X<C3B7>Úó/Qq[sòš…f©Š2Ž4!¿%ÃuÒ"B²Y‡Ø Š•síîøÚùbLÜ þXÙo¦rˆVgÆÿP%édt|ON]‘¹h±K¿<0E>¢ª”G'®H0áÝØDÛyÔÐv ¼ê«Šk­ ïŒD,Jvò<76>ud¢nQû‡§¸Ù£ê*&bc…yŽ—ó<E28094>­§Ìš~‡úVmúK<13>¨<>r”ïùÈš䥉Ý×£ZX°<™W×} Ý j-Š¶„9ãÏk·c º+d¶¨Ìk»í<C2BB>X[þeËQ0è<><14>®æŠØY²X·ÿÝ„†*âeÄâmc(ÿÒ†Ž 'Ì<>TØßð4ô»ýN½a³(uͼZÞáDè­<>0¯íYô) aA"öÑ` N|"·ÝÞY„ÆU"´¯¶ñ§Ç²õ¥s§…d-£µ‡o@ž<04>a O˜.¼ÓÃd|Y(¾pÿÎÏ¡ƒÔÏ4sÉúÜÍK¹È,$\^»<>ýñŽÐ,Å)ðo5 (ã*è7©.d =½Ð-T¤o2Ù8­ë}~«<>ªŒ3"@´íŸs\Èü™F`„ƒùèF&€-šÆ—[<5B> D<><44>?õ.sio~_m΄¶éfêYíö )¼½ž`¼­ýšKŸá?Ç Ò€=„ ¢cÚCþ •!TrWoÚó…£(eÃ.všrWEb„ßø¯‡íáBŒ¯…<¢MÁ(†-ÄÍŸ<E280B9>G([Œá `ô)ÄÄš¸©ÿÈæB2{t¶¨I}Gé}ê+‰ óáËÖØ`š4¬xsêÇY%G¥>üg¼×`9põct[àf£;b"+,…ô¬n^».•†Í¡íÉŒÎbï©zQ—ô]Ÿ¬FÁÅÐûôLhîZîjJ¤5,ÿ“Ÿ¾½JÍèc¨K¬ÙÂ&f…rÞ­¥|\$j+µäà%…6™(ü+†É2ÐãȧÍë]FªG…â“9m…ª}$#>˜Ù´ÌA è{&ë¶jZ!×1šù:ò£EPãñü w=^†Ž¼Ü7Ÿù4°ç^ˆïäÊEKAó¤ãÉÖœîã•ÏQÉÀÕk­Ãå;öèòZêJYS—8ôï"eSà…ȦÝ.¼iÑ<69>pC¦ZsŸõË¥JÅê„8lýØB^Õî‹Œø|)D̡Ÿ'd<>ÀcÒŠçx}<7D>d-ý¢GƒìÙ@7Š¸ç)ÆàoAóþw¹>ëGYOŠ4Ù™+·±Uý£ÙqЦÎ-"ÊîWÏÈP•¸¨»wcÇ«Q(´“ÄM⮶»ó“\0†vØ\jF
(GÆèÿu3•Ó}H§ cZ¶_~#å']Ð/ˬÕ|K½pxC Û o¿ œa êóx%süeÆAzF+Â+ø[G‰™ÍŠÉ÷¦ïO«!m®w£JSêÄJcâ:Ãn]õµÙÖ×Õ/ê29‡Ýq¾ùÃWËQ‡¦o^Ѹˆ&ƊΤè0ðû;<3B>l,`¸.A…Ñy¸ç~{9ÚèmL¸ ákÅrˆ>=2˜€«&bŠlœOåm¨£7ncËó_gSl<)µü÷©¿ÃÃ)ÁÝî—Yĸ&«ù (ŸëÉõŠ}h~§z™êÁK„ùaš%å¥\Sž¸^ýì
š×(‰è}¦-u; G§NéhK_¨V"ŽýéNýÖÈ“~Nš­Zªab‰a¡JX3A—¥§8ä‰dŽÎDðÁ0<C381>&¬!Ñ8ü˜ðjèÚ•xêé·µOVº{¬…+ØD…A:ãm¢æ`!R4C£_C±ñë-Ú»öI¨[;o7ãÒdIg<HmUÎX(î½<C3AE>Œ}¼T¸!qdA'Iú£ßW0Q+ŸµêýQÛ9ë®?lÅ°Å2JJÁ¿äxl@Ë©Tøò1óUë|ªÑF1%­ñÂa•ƒy¼Egœ<67>»ãÂBášV¢j~ì<1F>ü²x>ygçâ¿hÊœK¢Lrä÷ë¦<E28098>~H©]<5D>Ù}7|Z.]±=áãÚ¾Ñwtd,»¡Íû‹`dA³rÅ+áŠE=õ4³¥n?Ká±…Ìê€Ô8ðÕ¼=µO4Xd1‡Ý<E280A1>ðo>ßÁ ±6ë6ÑÓŸyyr!(í¼`‡AzJÄG®}ìé<C3AC>E<EFBFBD>ººÅ”eBú0í«DD­42Y:³ªû.Äuù™¯Z¢WîÌû^=ï æƒUA¬dUBÅI‰9‰R¼zæs<16>¦™xqäE¤õ²© f#¼<E280BA>wÌ0Ûð˜%r*š’„:×Õã]£>`ý~Õ›ÜîÊ T&b`£ýsŒÇZk®¼Ñµ=ßOÈÕhœÅýMÔM®dåßÁËÜ"3bîýƒí6­¹/$n~<ַ˃ËÏÉ1-Ï?»´<Ý‹~!&L-<13>GÜe)h®ó¿²ï 4XôøÜì×É´»l‡D)zÔYH²"_:z?m1Ôcý„þ»©´¾xP싸¦]àì
÷‰51UJ½Ýþ“n <mÈÑ<14>ÞŸ±Y#õ‹ÀÑ¥Ç<C2A5>õg‰Ø Œ&©²C8'—c´[ãG1bÿ1pÉOÅÚ¤¼5‡wLÓ<>æ8Ž—Äzaë]¯-ÈpöS[]tBjDŠ<44>je téÖ"°(¼n¼I<C2BC>Z
½Ü<>¸P'ª!¸ãj3$û„ê.Æט¿6н§øŒvHOP3C”Öçàîʲ0ü2-äzŒèOsæÅyã‡EßÀ1¹ P'Ö#<I{XYf„bn¿c}Ißû=ô•Ì@Á»™’ˆúï%‡¤šçÄe€ã÷Ç7TKR^l¡ Bf'M=
‚Í †º"ç4þvðjÌ !i`¢×¶ÒÖp·¿l<;#̼·† £ÄA«Dîcæo"R{üšŠ<C5A1>¯»!…ø‘ÑÅ•!ÀÉ*çÂÝ5%sÉwñuiy}‘ÊÅœmí(J,ÙRó3'w„9Önè
1<>ðŸ!+7žm¼<03>t÷.à äNâß«ÀÁkf¸Êî 팿<ŽMæaÄßw ôÀÒ4!µ ¦h1ye_ìÛ^2xM·Ï¡¼q”×ÈïëÓ20§})tdð&í*Or|ˆò›±#<23><73>Oè¹ÖÚ™ëíFodG°öb ™’¼FÙdBè±,ðMäÛ1ñÿ>³"5j½g¾ïØ1ãý~<7E>é4KœX¢CA µ¸œ<4F>7yc8±"!/†«º+üãþÏ'#Õwô³B<C2B3>¬½šu…l…ÍWؾix.M5(Ç(&Àà™MOÖT¥ƒ1…#?¯¾®Q‡ù)vM'ŸFsÌ6iDÍD=EzÕˆúÊB<¶B²pë¿aÙƒ”àZ|ò1jî«\EŸ€d¿ìÃó·¼€%ʬ{‹öw=nܦ•¶Åä9ŽsË°L§Êe9ÜiÞÒµrêò?‡h)ÛïÐ"rÚÑ^®ßöÚJT5 >þR¦q£ào[Ë@
¡+݇Æ/
\Øhr»È»ôúÐ:§®Z®oEo™×ÝoqŸœ]HåÈD×fS}§€#>à ¦í²±o5(_Êm!<21>øõ÷T¯¿ùN@¦QLF»ðJÍË_š§=,“‡‰µ»é°yIÌ”®4â{&^DS¤!éÏl á¥×Îß肯¨ÇæÜÚh´añä—;g(Õ«¡|&Ô
n”R÷½ ü¦®Ÿ°Z1ÚÒ“V”€„¢SŽ§ï´‰9UÇHfw™è¾å|/Ç@ “„ܱÎ`R¥Šìù³6 ý1©þÛÔÏóе7ù|ƒÙÅ€ 4ÎɬÂH<C382>õÍ[êò ôÔ<C3B4>[<5B><>ŠBêÞk*ºîF³Ûò˜0£'M(šOüû<C3BC>*<2A>”&Èö³°"þoˆ<6F>mG@ÐÅ÷nm¿­PuZB˜à(²” J `2Ñ;é›â=P)PȽZÛD¸/ç… Å~1 ðÕ3â<33>Ž8æV—»O¼Z
Þ3oÁ£
·B§­§å—bÅL„äð°9 õÁ¸Ðsó1ŠPVØÈôbÉ=Žµ<é^Åví½K¿ÎßÏFí ¢Œ0» Ö9[…n_@ÀÝ\6qÆLW:w=t“Ï
ÑH@úÒ©ÓÚf³@5;` °¬˜Ã6áŸXñijׅPÇü¢ÛÀ—•RhÈS{æ_ŽŒ”Ü»ïádÞ¥ó_ô6¹‡¾»Ÿ3Œ@ƒRl¯h°Húj÷˜F¡{<16>ïö0wÝÀ¾‡ý„Wx÷[¿O„¢\]Gxq2g å¶nª!LŠ@u¶kcöÕTÔzÉUØ\~R”î¦xšl P£ÂGÛ³t½=#.8Ø´\rxË™zh<7A>QÕXƒUð$kBÐÕÕ¬’©œ»ZZ¨Ö/h§_òªòI‡c<™<>!nȵŠ`r«2æÚ¸<C39A>GVr…³×¢<C397>jl—•í°€õLP÷-íµŽàZz0öhâ†4;3|X“„•^ä¶/N2<4E>,˜®/ÁŸD@Dµ~ÐõЙnâ½=W,!bY¢v^Í>={ÀkjyèÁ8åUÓyíHD™²!Ñ5<35>§º—0þUå7']:>²0"çí¤’¢[Áu2cl§÷÷lJ¾²pÒœS2¶®ßF-½!I£/v;lŒî5® èÒ¾»âçÁL-£š¬B¶ù…Ç\ÕuüiìÜPèS^„yòã½öùìÙHÓÇ;WM¼ìbÝcAo)¹sx]lVh*KpÞžmL@|I' E¬hÍÐþ/N0Ïä“AY“¦” M9®Ù«[yRŒÁ¬ðL”M€Á¸ÝDÞÀyl¬4—ñàT l•°w»áÌð{™uåa<C3A5>r.UM×q&׌W;FÄm΋ÛÐ#ô|™–ò¼ŒžÕXž„-8ÁþOÿYÀ¹¿]ŸèÊrô GˆžÖ\:€¡Lö…⊦eµüänˆmiõäÞì¸6Èž<C388>½D»ìÏÙKƒÕ:$þ–ïër^°<>Íš<€ðúV5¼¿Lü‰™ewá¶o“ÜÞúËÝë<ÀâR
G„$T=é0˜HA}ë# Ë]QŒ/)îèu•²ºÂX}MVŠ8Œ>¿/\q$¬>}ï³Uø»ýÐ|ňö•nfÔ¶šO»qpD™gñïGƒ¤SSüçb*³ mMw9T õä=Ç<>¿R¿§ÎªÀñ¶Ŧåº%„ÂY<C382>˘ÇV?<3F>莨AÉê":¤;s<><73>ƒmŠ%,ãŠ<C3A3>íÉ¡¹eJåóÖ/PÓ<Q]K4ˆ Ù5<C399>6D7Y]·"<22>x¾Oì5tÕ¸|2µL´)ŸH"ûp¤¶®^| ”2I®Š-Ón¥¨-rI<72>ò—ªì†/R]<5D>à1nT߸óÚ:Ëø}æðâkÒùÿÆ 2iD<69>tm©Tá \+žÎ¥F %ðMi:3ˆ®#<0F>6¶fx èZSȇ¢½ˆ3`X€Z¢†øÅ<C3B8>­ÑÈh<> ÿê*ßÂòpŒÁm[<5B>Oýwý;8•<14>¯[¿úŠŒyóðÔ¶ûH|ú
ýì —¦MÇ´ZÍ»þ%.)Ú©–ZÌó–+MŠ]18h<38>êÁ+ÄçñßVÃ|kWHy©®`ŸG K,o<>_T4à•Þ¬ºÖδ洩ô³ªp5£DMd;ͱ@X¨ë
i”WLJæñ§œð(<28>kí]=ï¸þ®à<C2AE>Û5!þz]ÖƒeãÉ­æ-EÝu.dÿCÌxyºòàoSw)¢²»ÄOUš+"ò ƒö†.1³"sj#¥°Îîô[ÀóÃ))°´Þ¨a”_¬VïÔe…Í "sû+ɽö  <13>v-Îï…p_e~•[þ‘ýeCwbT “»‡øT+h'Ø'ý ðd¦àÙª6ŠI¢±32pµ XAGõ«$25Mˆ½ÜJ¸ë9æõMV¥Ý™€:íCáÔ°e5ú¶{.ÌwWk»²ÚKæ¶Á?><êóTB­¬Š·¦ìIŠFæéCý맙<C2A7>št Wq :RΨ„Ú|Á»`)ÇXÅîÛß?n©Ð}K2`¾ÆëšÝ€l
ÆÏô¿áoÀñ¸,k{,å
µtÀØêjÁ…m,GTíº ÝšüäUœHs¶Ý™…àÑX E_÷7ÇÔˆ‰°Š»
ž4fs×<10> ìëÑ€û⌎òO0²_CÇH^+ˆ3°Ð]<5D>Ä9þ;:4¼<34><C2BC>™PÞÁEÝŒPhŽLâa%.™"åš19û=<15>Oq˜5\zëÆÁU+J׈f}Hþ÷•â6o<36>šSØá‡ÿ®9éÕ©Bqñ•áPD)« 0ïcV°5à«ÖGzé]¨ªä¦ø°§ ,üÈ?ÞÑ™0ÊÕ·vó5ÜüÀ\‰ïŠ”:æô²…tOîκHIˆù˜ê«3ut.ðœz´Ùòõ +þnØö¨ uiŒ$à°‘üïÔêòá[Šd)¾À4ö”¼alåÁÒ´^FjZfYÿ´ÆŽîmþéȆ#cè%Âo;0¼Ï¡kû§`Ò¹Ås<C385>Ùÿ*DFjò ß´J4O3õDa†PèjÈÖÿ}+ñ€Z+ß ž¯ÛB¯ï<Žßí°q<C2B0>©¯Û̸ؘxe!å EGÆ+ä @€ôÅã–\"Øóa³.%ád"lû¥¦Š;´”Ù·ˆ8Iþsïï<C3AF>s[ûG·YÃñÙŸÕ‚Ã[Hw>õ Ã¿Lãó=pËéŠò9}BÓžÕdÈ<±ý4Åô.ïºÓþTž{¢Š½ã*ã˜-D<><44>nùfÄšÁ2;<56><kF—NüÍjb[»Òý¯¥ìÿwá± oGXRmjB¯6vô6TEàq«wÚ¦=æT:°ÔÑy šìî9åT&b?@†(<28>/·†ãä¿¡<C2BF>Yânˆ$i—yÙDTß/ sT_¿Ó]Ü™4Õù´Ä,*y” ‡-S#"_ÐÃ6} <20>Ô+¾kÌtÀR¼w©;ùí³ÕJçŠvm¿ãu¶¯ VÝ??ã36<46>]˜þòZ>äHC><3E>o ¦Ö#ÅŒWT^qŽÏi½<69>=cßI®»§&•g¨UE<E28093>Â…lõßI®èð<C3A8>äx*rýk!É›
ŽoÁ<ô…‘/‘Ä?¸ÿ ¹žú\Ï‹ B O4%ìsÕfä9_@H£‰ÙÚÇÙç!˾¤·˜[>Æor7+
ùõFgùéê¥Ï…_ÞL<¨hœ…U³6À7õ±×è°EhyäˆÇâ_óù6¼eI@ vfütíŠB7ƒ© %Ná‡aû\7ˆˆ~aƒb©µ7 =ú#£ûëžðY_S}[‚îû pšröëZüˆw²‡4m <09>˧~'6ð~¥šu ÊÓ+ü¨Ž²øoLx,ëíÒ››Ñ팅·¯ÊhO¬$çéi^òò«Ã1qlQZ~%,<åÈ*nš)¦Œ6ÐÊÝË9àÈÊI÷Ï*¤§ïþhƒ7ñ´Ëa³|2ƒðKiáXl¨¦Úýï¦ÚJ©
ðuYWH3.C4²ªÖ†wO,+Ç(^¦ªÀ»4^p¬‰ú
êM!MCFo<>±ÊÄr3¶Ø¢§ÆL<C386>æûÂ7åðKeÞF$ÃÄ£µHîÆZ à¸Ú+æ~rsLIO^¾÷I~
¬¦<11>MÐ1t_2 ÃÏœJ³SŒ^š"Ï ÊÉøé¸B<C2B8>Ç©Ú6B+2ц°±Vvfx£À6,'<02>*ed^~ìt£öÖ{SÙ6¡vA¦‡ã>Í4i^FCC©ým'Ÿå=".¯x¬€Rö3 zÒ§®uË.ÌW¬Â~¯€Y~Ö𵠱%¦¢’9~³JãK€Å7¾O'Fmîˆ>,½*à<>©ø×ÀËÔr êíú¬^×3»`ÖÞãM¦bÎ<11>ºSÈì*_QówäL¤5Ø8ß2Á“N-ÒȪÍÑuvUõíµ{›ü.±…¡C`eê ™¢†ÒžÜ²O$ô(¤<>îQ%óŸ­nFŽ 
$×°Ò÷û5½çèÙOý T9×gó±ãÜÉßK=ç®ñÒ<C3B1>Lë-÷“YkÓ}ÜæŠÚ§yñö½ñhcꔀgìÃ_¹ÓÀk6ͤ^-ǨbÁÑ ïçlvçií,[ÐBcšYÀý¶ü€böÕÄ{(äyÆn¤EÉ‚¼ïQu­PÕö7$¬IÒ'¥û/haO"m"× iô*iãÐ<C3A3>s ³®FOôÊý<C38A>ÙõJcs¸ ”/ûâöm×Üõ<>ƒ“ª_KêþM'5ʸ,}.ãgH^â$W1Z“®¢ãîx<C3AE>;/ϼ¯k´ïfR^<5E>ö…Ä%˜FÃPsÜLDgÕYÊnК,±»Õz$ŸB—æDÎm‰7q¤Så$÷n”áÝ™±Ié2qý©_0Uá¦*ʹt<C2B9>¥€VÔ¦wûÌ-Š$û1oø« q±†+&Š"?„çÊ”àt°^~ôž4Â_±>!÷µ—v߈7c³‰±ÔÞ£I}ï<E28099>'5ùo©rÉh©²' <>È¢Ì —åƒËùË âT"‡9 wþ„Ì8@h„î@fP{Ïd¤ûÃ¥òÆ¢K¨æ˶pyŒEÆ*¢å~_¬eŸ<65>Á‰S#—±¥ËHmÿÎÀÔ|ÑÆa7\Öz¯4þ“—bëf%xÄùþ„Áô/½È8üo¤Y Û¹<C39B>4ûG÷$°:dµ«k9”ŸµxÖ2Wïn•eÄ Ùä´<C3A4>ÿR­õ'ÂPÐ`¤«Éc°AcüHhB`òÏ<)°Qñºia9jÒÁ!2•<32>1"ƒ v†w1žÔ"Š-|OY¯0<C2AF>㺟Åú ¦iÚx˜Ï¹ºïb=¸Ñ‚³çª<<3C> Xá‘:Dò¦1ì*~÷jæ2çJ7{@jÒ`é<>£ÞÊõy“òë<4B>}5w$Œ&<26>R_="¬D•ÐáLÂoË<E2809A>Šh,øòqöÔˆº‰‹¢–½‰£üy<C3BC>Ýeçínc<>I];`×çÎPù¢ ëî´j<>é•2‡Ëƒ¦Uq«æK?u=ë3O¿Vî<56><>
)$(ÖöçÖôwŸo¼O Ø{ÑÊjX¾<17>[K8Aññq“á!pÚÕ <>^ÆBz:)±Û¿±aùK”£´<žÈÐ…Å>+SsÁï{Ù(¾‘^9]ûi»]PÚ+f0ØÁ¹ÂµaÖ<>9^YqN<71>©Õ‰ù<E280B0>âo¤~Nq|±A,Ë»RqŽãŠB³<42>yÒ¥(û¹Øñ)aé&YÅhŸy)Ø_i Þøk£Ÿj&àѶ°§ÿÜÅ ©Qq#ù/ [Ÿ>uà •–/Iîf*ª<>xÛâ&iyÔ½Åv‰ÛPø½š®ö@ˆËf%pº`œCjE3^<5E>ð/WŸEMÀ¶·û¿d@»)r>ÐrñárRÝtÂÂÚ¹¯\ièç{¬¸ýÐ=œ`_hc?ϪÝ×êÛSÀÑÄ!9(^Ú¼”¥á<>Œ#¯õ‡F•BÈC!­—²ÖJít¨'Zîé  äõºÀÎ pß³ÊÉÆÊObœ©Gž*=Úªe¹ûG|×»%%íÕuš"H°Ï¶UJú á<>E{ùxiÿ»¾ÀÏ<C380>4}îc“•Ýá"CáÞëeœ—=R²<52>Ìh1 C`oP¦;}ëG1è%ÊéÛ(ImÈ>ÍãÓ˜~¡ü°Š<C2B0>hÚ°Œýê÷Ÿë<C5B8>%Œ„bñêÆé{DžÁƒÃBÈ©¹H@þó¨ú#ï /×…òtþ<K§ ë _k±-= !píïB; -º‡S9ÙØ@KþgɦSÐTP~Td LIïC½ùúÉ\Ù"úi_pU0s@&¨^úFù4ü:¥ÆI!F‡±àtÓ"æ ŸàÎÔÿr
vRv<EFBFBD>µÍÜîÈoɽßlYUBØó.-A!>kg¤Ú4S!eµî\O·Í¯<C38D>;ÅÀOÔîãË<C3A3><C38B>·(j½‰½I6êabâ䤺;yD+¦O9²1U^ÁswîÕŒØÏtÃù«÷aO1<13>ãFìôedÅê‰ÚqÎQ&.™4nëÄ©Y¬sŠ¶Íêi‰ÖüeÍtqM¶Œ§fŸÜ?gù ÉI%]C)þ’ÈÅ$wR²”]-p|<Àm]Äß|cŸ^ëœÍåÍþý4_ÄÛÊ <0A>Tèlç­gªÍñ)²»„:9 ˆLƒ¼„rù¯?ùgø§#Êì¡•›ó–òÛ"æ‰lü®ñî<0E>T¢Z*¼ýUØIQŸ<51>œß9`ÐOzvb,§<><C2A7>˜âÓ°E>×.ä+ò†šš—9Ž õðÊ<>·º³º¸ìÍ®6 ™^…b³|…~I[ÒÕ<C392>Ñ"Ò6 ³il¶Í`ÐVÙY`=Û±àw %2”£î˜…™vl|T<0E>QváS ñ1á|eV |†Þ<1D>ŸËþnQ;Å èÁ¥‡)ž¢IõØ<ïRt®mÙû¿\ZEÈÛùG_ŠŸÕ·N2ìñE]¼>ßÜ)‰¹'cSúŽNBý'[eäG{J€TNq…vcÎL£¥09è²ã¬Íµn™€ ‡ D
u—oÛþ8!'ol(jm,½Q`§@…V‡yŠÂ$Ð\öCæe)lFilu'ƒ.0ÅõÆ!µm1Ö|°[Û92;iQ÷uY@S£áw<C3A1>ðÓ ¾‡Þ¬“ºª÷ÚtNþnB»$þßÒ&D0‰·]‹µü
¹çJO¤æÿ£¯ÇÊ#9Ó8:ãˆüÌ.5 ÖãöÍÃnáJ0c\ i êÌ?¡+²+­!† Þ„A#3Ð'ÇNQIÈ×öËe™ }qX°Â)x83l …§ÞDô­Ža[ÌϧeÇA‰õ1 W\C#R± /8xØ©Š|Aî;£`Ä ô„wˆµ˜[Jü<4A> ŽS.7®2g$™+ˆz¼®ú$f‰óˆ > ÄaTÛRç×Éøp³Ÿy:Kh¯dƒ)0V{Ô¼ ¶‰òÓ`B¦Õ¸äà r)#sV‰æ+PG`›£Èœ*¡œÂØ+)ž*Š€ÝÿÙ®_•ê{eü·œ:*[eç¶<C3A7>•ÞœÎö¤±J£¼k!”'ïíA3¦Þ<¿»ùn”dóÁ•hÀù1š~&|•ƒJÝà6]¾KË*2³b˜fÛ÷o°ËC#plí—/TÓõLEØA²¶{È°CY"o©i™Ô•®)'9“˜.ýfö 0áŧ”ƪGÁHû7ä^I¯¦qdJ2} Â6f÷ÒÈñ26Éj.'¢w¾<77>ɉ¹²#:Æ™<1A>&aR) q^G²éŠpñ·>)"¼ãèÈu§Ïz[±.â] ³ýn¥mª_ÿ+r©àÕ°ÎZun1÷Ò<C3B7>â±Ã]•&qYm·Ú€š^—&ׯÜprµ
ñâ°c». û4-Uì<55>w<EFBFBD>mŽ/Ä<06>ô †ªÍ€–¾CBj@RÀ)8t¤o¯òh~­)…b)¥½é@jÈ<7F>ÁÓƒ
ï ‚í!9¹F¹pöxÜx¥ã)'ö²ƒPåHJØNÚ¨@ÿ8UdwéÅR²¨X»Ã^Z.xDEŠ_rk\¼¦Sü¶·èªÍ)¾l_Ä'¡Xšh°e÷OÀÄŽØêüü ¤º² Õw@Ö®>sæauÈñ5•N8.|1ùŸküêƒäK3C¼çâj»ímSõðKt/Á-cÑ]S»RÊU×µ
É„¹Ìz~¥H{­'L¾jÝj<C39D>q™(ª y&š©S/`= V´T­CšÃÃMÑ«Ù­>/>áC;*æÌÁøò¥6<®Ï49дÙ;À>ÁŠ,DÄí°;Ál¸MÈY¦Mr°k3Õ†`øO¹ý^Z¾ÜÓUï¤Ò÷8¥W»ö¹üëg¾Ëd# ))4tû”Ï2ªç<C2AA>dI_q7"†ÞùNÓš<C393>c-³ÄÄŠ*×+tí ˆäT$¼ú£Ää<7Ùýž
6ýåùê°]µ>•0šýäYd.ø KW‡&VVúÆP¤ Ÿ3¸Z¤ï¥šËÆÞ\«…ˆ³ÝÁQ1<çq1yþØ2x.TÙ<54>ë³ ’uÄk ”•e¹”´K,¿ng9f¶ <>²ýËe£! Üþ¤yþ<79>`bûÆ<C3BB>Ý— õjS¾(;¨" ô~âjÀT†<3ðõÚ ®ûà8¸þ.oOŸ&`«cš,[0¦8³k4A€zY<7A>^
!H½ Ë[÷I8Ø—¶í1 T ·<C2A0>P' :¾é’¤À|ÀÊVeÕ¶¹âq\šÌeÇ=ß4H‰²ÔˆôlòöZ\Våø³:±bM6ÆÀó^ÒG_¶¸HI6Lõá˜H¡š÷IDLÞP „‚˜Á9MÀx€æÅV[údkzgÎÕêÞæÊŸoÇK1ô݈v«_ãˆhíM¦)sl†mØƾ‹ãQ“z¢:þŠm<76>¢‡<C2A2>@ÑÓükúË÷Ô;CkJùSá½>¼;ûãÓÃkgÁ»êŠlkÿšû§˜Sï0ôSªÄØRmQ·îgCˆ&&Ž6K„ñ1(1Ç8À씩6 £%²ø@gY%òvyÃs5õñ¤¸è§àÍÁ¦¾7È
œ²“ ´61žœÅ•è¥#ÔìÏ­ÿK ó
LÞ±DZ‰<EFBFBD>´“†Ê¾FÝr<1:§çA“<41>ŽQˆ¬"3cƒ
Ã@öÓ¡ç.PïýóýqW¯B·¼£H ™—<E284A2>¨³Á—Ÿi+íH3'=§<>¥ø©sÛÀ·0§H·óï<C3B3>´NÛ ˆTK™à¶°L|[´¢`V>€û»ë9dKpˆäÈe@ôyÒP”à*´ Í|D¹¬•›)<29>Ð<EFBFBD>gA0êÌÙg¬¹OŽWµÈê7õëÖt×<1C>[ؾ<C398>€ŠšA¿÷:ĨԬOm<4F>§Ø{Ý<>üw!ŽêS¦:²Žg~ë?Îtj°½io©õ§¢šˆîr§ÿ­
@šv(“ŠÀšèhü5èŽ*5JðêÚ³;Eºyvñ°¤ùJQð¬¿Ä±É¿e‰4ö€{/ J©#i¸/<2F>ÿŸM<C5B8>çœ(`õK%tÞÊ ¡Z™Ft‡è@¾o·VXRâhb[j¦£û¶ûÙú<C399>ÊeZôðÌtº]Ím§eøñÞmmÝ]´ÒFÖžpÐŒJZSÁòôs67®oÉ™…Ñ<E280A6>\ñ‡ïíŒÛçD²`è<>ߨVö*^rQåÑ]IAÅJÐwf
<EFBFBD>Çp?¥‘ï!?âb]zÜþ¦÷
¡Ž
áƒ)²9µ˜~<7E>T6—MÌ…çʹ¨àó\ídÆRÛ—nÁ:ÿŠOHn´c„0<1F>Ô¥¯yS°Õò<E280BA>—íªÇ?âµ<C3A2>ZB“êrk¿Lþ§ÐuÂÒ `êyœOdg+†OX6Õ—Dzæ´¬€ÚBÀÝ€<C39D>åÁPØß<>yζÚÆ‹Ð –ÜåpãU¹ñ'Vyýôuô@„ Žd#±ejW GÕ¦ù<C2A6>«Ò¶¸<C2B6>aTí ü”ä<1F>c<EFBFBD>Ÿ”šôzjúÆ|÷:µ÷ˆ03Î<33>¢~å›ð£%ªÎ4Åe‰ºº#ks-K½!N5¯êË:ܦ/ÈX²<¥©ÝÀïNq8Ëͬ~`h ·aY<61>™Ü<ÅÙ}üǬ­ÃÂì5ÎÎÕù $Õtì*ÅO³‰Œw• ´¤T$‡o˜oej÷¼²Ù®îdÚŠ£>uÃÎð€·û4 «$3'=ŠÅy®Š¦üòjTÜÑ2u¼<75>n<EFBFBD>°ÂGa¦PãXz²:Kƒ…> z~ÞAæLÕ¦«bžN6¾?œûÞÕtñØÅŽî—Ó<03>°seX}R¾f³rÕ1²[™Zâö/
…'<0E>ðþ%÷ <64>ȪÐüµ£*9 æ<>ß<EFBFBD> …‡Z¸ã<C2B8>Obå éñ°bÍèëãDýiˆrekT<°º„óŸM=¯äu<69>áñìfú rÆ®ªîÓŠÑ· ˜¬7&=²Y$œkçdû½^ÏV°²œác |8_<¢¾·!Ÿ›ž\b&§m6‡b…ÖÅŒßÝ«|ˆw+<2B>c3@妑: `ÕryV&g¹$þýhÐBÖT„fcAWÔÓT¢Å×ÎüÙ¬sAÕÕ£ÁžÉ@¸#ÉûŸØ7HDÚÇ£²¢XÓ¶Gr¶Î€ð B7<42>Ü0\Þ©01¸Ä…Æëç&h°½&Šˆ¨®Ô*¹\QqA¾Û_-Lt…çqcXA€qdÀëÁø ©V•
ýX…š/¼À|Û²®]+£l+ƒhP<68>:Cêd-<ŒE´Æ<C2B4>Å%1‰~ÕDt¤®®¡t«dý×ñ€^ªoõ=…xnåÉß8ò®6Öp.±¢ñu<ˆò…~oai³Y¾‚ýŸ,¢€`3¡“v,<2C>àNWé,b4¡²p ÚèP¨ðrRúY<C3BA>ixïGUµO­:ugÌA^¶ÿÖX¾ jÈãž%46: Ml£\Z}>ÑåÎÉ
ƒÏÚÅ{ÎÖ‰ÕŽˆMŽ>ˆ;â/p:<3A>b¡Â2ÓÎÊͺ¤ŒÁ·3繈ÊõúWÔŠÓŠÖ&Iæ-4j­G†±ÇZr„&þ>"( ».Áúz`b%-<2D>å;#ñÛ±üþ<C3BC>ú7¹Mì°wÂô;v¤A3<:Þxî«5e½DÁzœÜ [¼C@Lâw(Ïh-æ~YC0r—dH8êR[~<7E>ÓmÆŠïó¬mh¨… cF»Íš “ûprJ±ŽQTr|6<>.¨i¡3”ôBÏH<C38F>붳×ã<C397>¯j8d¬úVáýPÁCL´<>e}<7D>ÆJÓ$@††¼@<40>*ÎÀ^ŸåËÎR3<¸tjâèŽÜŒãm3~b¨÷¬¡VþžíyÞÇ¡6KôÉ'åVŠ$Ä]Ü<>®8AwÄüº3(Ñ)<29>®y6 ÆeŒÚøûë8¡8 µA<yE²"jÆøjñá#áL”î$ùdE¼1Çãj£¹ö… Š][gSMú¸|1îÂ(¹4Ÿ±P[•EñÉ„\ËìȆœüµå¢9/ÙöF¯Œ -ãxœäÃ<C3A4>SÜ<e~£DxWp¦øT7ˆŒðF±"‰£1Ö•z7½õ6iÏO‰|ø¾¦á 'ÆÈ“[ú™2hV~ ¼å…$»Æ;ë7¼ª¶æÀÍã<C38D>µç•
<EFBFBD>DÌp T;ŒªÃR7f N~¢žõ¢[ú·Òô7£ë™Èѓߤ8ý<38>çé-Ü}™ct7â.Úê{VvÃÒUw ²©a¹³o^aýl™¶1¶u¸òŒÖ¨xd…¹àÂõ²¯æwÝ<¨ˆ(;ÒJ´jR²¦ RMËî¡ 3+69&7Ò·=máÑž-TÜO¬{íÙ<16>ÉE!˜ÖêiC³ö-V2 7)fˆR‰uí8ÝòÛ…R79Ž¦ `È.‰¿0ét³rNiCMœtø˜4¼÷ø"¢-5É&ÅÛ˜¼«è©L5Šÿh3 žr<y|Ç5]ø¶F‡7`=èˆA˜J0¹2/ÆÏÈÔ9?ÀBO¤¥êoÒyŠK;TˆV/ö¸túc!OÍnoæ-•·):HÅX<C385>Ž5,Rçß­…\¦rQoÒ:•Z”yü!±äEÏÖ¼…ºÞ®<C39E>Šjd 8T šƒÅõ¢ï<C2A2>k",^²¬iip}<ÃÌ‘p>  LPûê†N<E280A0>a"Ý~dc&¢ä².)ÝS) Õ³ÐiFN[÷ƒ¶äCɱWBT<42><54>3`Èôðº<h<>ëlÿ£cØú¤™á
[5V(ÁO3ŠXÖ%…j¿:´qèkix0XŒÆç#?‚‰ÐÉ]»OVÂÒGòrël—-„)#Z fE~¦,AMÔnGKxæ0©iBø^ߨf°®àë¬Oq JŽáD!<21>67ÐéTk0œÒÙgëk8& (…<1C>ªH ÒÙ
çZ™Ä IÊ}¨Y™1aFYâ»\0׸‡rfü€!i_Mo¡%®ïz­`"0ô™¯ÑËܳ̽ôŒÃþÀ¤€`A1X}tSÄïÄ~—)ó™6(ÄêÄß]'a#äôï=F(>Û7ia¢I¢ªiýIŸùâ™Å»~T^J·! ê×aéÝfcvëòŽºq<C2BA> @³jYçÑÁ‡W §º»€pZ!#`iЂ‘óÎnÂ63è¨ÙÜØ/øÚøÇäüÓ0 ì pŸLI¤+!—Ò}:˜[°íäÒ<C3A4>Õ»Ã`ýøq
šõ]ùêi<C3AA>ž¤/Á)C‡=/ª ú©þ;Ç¥ð›ÂÄžðah0ÞÝm<C39D>9eØÑ7Òªpüбh‰_NšãÊ<C3A3>YZgœ\Ô{h&kEíúóUƒuȲr·ÃÔ³·³¾.¡ý<C2A1>þgÝG „þˆ8EÕ#ËÁéŸÃÙ(ngº
bÏžq;Я‚)±ë<C2B1>ÉxÒIC_[jáQÏ44´ ·¤€]̯s'Ç1Í*^ µjÔº?¨§O™æ¡vÊPâTÚ}Ÿ§a«ï ÊJë…}žèˆ(V`©€<ðxCfF#1دvÇ-ð­Èù®Þy:CŸÓ®ªqÔBïí¸%OŽ<4F>«R@OÔl6ê܇6ÙžD2üO"­è&søo IàŠù«F|ÞœØe0® <20>öñس¢.Ei‡Í2mÁÝt+³ƒô7A:܃úÆF‡2´vDH<44>±¥:òí[—j†Ï©ë(^Š®>(ÔyçSÑ¿7ô‰Z}¬2³oüžÑ·÷`M˜ö-~I²Ç–Œ<65>Uj&VaÍ¡uõ+¥4<C2A5>6a8ãè"„çì{ÉZ<>è0ú fmÄQmØh€i¬¾[ïñYkúãXÏãtùmñÈK°UgúÔ4«v¿Ó–®û.<05>ÁuµÊÕn-¥ì¨¯39eYd½KB¨~]ìù)t;R
cf¡u«.ó½¯=VöYóçѦ¨£ö>ïWŸ½¯аÛvC"÷×.MóÓ§k<C2A7>Ño)hI…MhA7SbGlio(­;©±o„ïDø·ß÷oVHQzY ă+ú…ÚßüǾ²‹‰ÓS˪j¦sì^2R°,WDÒŸ¯I™F6²|µ8
<EFBFBD>)TŒŠeÂ#75FŽù¯}¢å쓸êOSFùÀ²÷¶†º øûo5Km¸m•Ìˆ=ãq¹ÐeG,3z|þJ¢“…ò< Cî>Ü<>Ÿòf5VÀ°ÏÛàÀ®€¾ö0>@ø­1¾5ÑÕ0L{ÃŽdÃÅ*Ð7”õ‰¶XX~•~oýTÝ[§o)Ýð>¹c4Mn!ÔP„Ê´—Ö©ƒ¡<C692>Àùéš—á•Vm ò+Uáν§«= L¸gÉE«: -¦nD £aŒbÛcUÅFЎȾ¶Œ.-:ÿ> ¹ù ¢Ùµ*ÿ­«ÞûWLˆøâŠêå‚<03>s^òÊDwî+€ƒÖ ªBǶ`•§aRMYkž…l`è43‰ç|'d,žÂç‚gÆÀÊ¥WÇ5¾@«¿þÃráÏ}ºh"m(è(ç<´éÚþìOŠÉØŸáqaVÉ1¢tÌs'wÓ°Cê ÆQò»2vß\e>¥Kp÷&Àg?qÐa‡ðÚëü€up5ùaþ{{™ÁfO¦ÎB±ñÀ|¨2-•Î,<2C>þˆÞ¸2„Eƒ—ÕÀ<C395>ÄaF0¯ï綥¢JúìÉwû¤¯©ª 鲈¾ôxo)”º3IˆŒ<CB86>]§A&ÌÔA¶O†r •&õÞH·Ì<>%fó—ÚîEŽ`æ¥4=Ðwu¿dØ×l¹uw—pמ°ê×O<C397>³ïc.<> Zk<5A>XÇNƯ~æBIYvhM§<E2809A>>ÔÖéË<C3A9><C38B>˜øÙgþÖÜz<>ÒSöJM E¸ü€¯P8¼(ê;ˆT ÕRpQ÷ÀE®îüBê<42>Ú•ñy\Â>’ج¾¿DÀÕ¶sJ¤²Ñ¸<C391>ê@Öòþ(jÙ^¿æôº•`þÀÛ]ªnüˆoTàœñŸ,ˉ+تl®KÁSŽÚåòî”g^¤v ú†ªöÚ*HAäJÁ ŽÕ{%v¦U“Ìô¨œ]O€Í`À¯,Ë!qùyåÎ<C3A5>ŸTÙ²à5ñØGÑèÎ{ƹϵùzÌ/±<>u¬½Íþü{Òðóû^Ú©Ý·—áPˆVu %TR¾mgÝà—pSÌW:cQ£½4|¼ú©”È^¤»eùÍÛBDt||gVyßœ8aT" 2Ò2Ým˜<06>x1wÙ)÷<>B<EFBFBD>.ë&xˆW7È÷°Åfs Ya0gúu<16>·Àñ:¢¥§g%iN3€ûåK3ï,u¼†`ˆ,‡’™þ G[Ûèil\ß<>L„„ $Dœ±VGæQðˆ9Qã8>¶€žCÙ3g~ê·Èí]e5±( N¸ÁTC ‡Ã Ò­Ù¤ö‰QÓìÛÍÝ> ÿ<>¶\¨xy¾î¬ ˆ+cáwS Äé«ÙÈ7Éh©µ‡™ðô=˜œâ=<3D>¬iO¬Òw·¶#Ãi¹ÖõÕoJ¡Éî_Füy
ý<EFBFBD>lÑa×5ÐÄÛš%xŨ²ˆÃwW…WegLEÑXÌ7SÄpmêg˜Üf np=rÜ£wË*…’.Ö(왡ß0@Ó~l¥<6C>GTzXŒ<58>ç(o+
RùäMCÛÆgƒg«|!R ¬$B¯CBæ·:§ Ô¨ý$ÛÒŒ™WXüÂc/§7´î†îHYcÆ<><C386>+Npy“˜ZîÙÅyb¼À<í¸‡ÚÂ0W:üÅÓN²´mcˆ/äÄ‚Ô#f:Bø­HBÛ6̶ÎÒ*:/t¬95#Tz©^<5E>)Îo%\Á ÐŽÝBkÚýäîÃ˯Í+¡oN£­C³!¡ÑM\{HCßÆ OwÑAY$AêŒõÜ H¼2Qýƒ'*¯Û->Qi1¹4Üò?ú½Æ\ÐŶpê»ÁW&ï ádÒF»Xì£TÍb³Áù<<1C>¦­ÐO¤<4F>œ®õ®(õÖ&X¸<58>ß´ÇŽ¡X“g¾k2vt2SØÚ¤èűŠ ß—¼à™~yè»ÒèòOö©W§¢c{Užð“Ô¯<;€Ä;8|x«JÜ"·¹öê©–(u_ywf §OÜ1çN®»¡ê¦ø®€ß †í4ŽñJ©—P<>½9ú‹ú·:Ãø¤¡š¤±e,èE=÷ªÒV7ÇRôb$_?æ„mè„8Z¼!ª5bô uáÃ\g<>´V¯Î+ߌŠ³*ºÀMUûãò-ƒâãè°2¨õóÚÅR ¼ö‡jãFYéQdØÕ\«¡Gò=¶ß<C2B6>àpÔ”•ÙQ¥ŒÐŽùã#]/q-Ñ]>åA·Ô7'Æv$ÈÀ{é¥Æö›$Özn“æLsº17b¬k@nŠ:bó¯ˆ
ØJõ½P9­d®‡œipšÄmfƒ_)Ë,¸I\¤),¤Ü;
Èh Vq¥µY
Œ…ÊR^Ìo ø¡x]¹às°ó]ÿkÎÂ.Ùï]<5D>…Tù‰Ã ŽÆÀoÒ¦*fþºç%KPŠ^©lµÓFI÷ŸòÆ»¼ªƒÀ­£™ìŠéª î9щ,e4]÷!·EÔ'®<>2ð¿¼S\ñ<03>^³QŸÃ<C5B8><cÏox±åvÈwÂðBòLêŒVkgwYt*™(©Ž£x¤7̇q…í<C¬ti@m!öŸ!àßEÏyè<M†\i…HÉ/Û’Œ²ÏíÖÓ³Ù½êஇl¹_@YÉd€¨-ëæÐäl1“µøZkgƒž€J㾌ê}݇ ǬˆCR‡fZc!ð–*^‡—mÒÉBðÊõ}‡“ƧúéÁ.Ÿ5œXõ€k!ýౘÓtáõ@^ˆbi!M XF H_#þ¯çîŒK wÈñcõÔêÔŸÄŽ<C384>lZ¼Iác34ZÔá>©Ž<Ñ«ït
,ÕK%üÁ˜™É^zVYWÛºÞ¼ÝÊ÷LEÉ…æù<>OÁåæHc?¢ãŸ`äÿNð¿º\ñò²Õ<C2B2>Ùò[ÚDpøØô UËïð¡PìUÀØã)Ã0^úr™ÔR€ùÜJÂu_ ®…úlKùoÖ{ß ô ÉM¸8ŵGä…G{_ÏÖýtG2\¿_ &7Æ£U¬W³«HuŽ9÷£à‡á»ûÖÒHþÚ~<11>¾·EG}@·…´ µ°F95Å3)—iØBsÆâ!!P<>¦<Ç[µw¹•![ˆÈ™Ü@ÂûÙ¾eµu´É,,¦©<C2A6>ÍP-àä¯ð)>Œ<>º }¬»»§m
f p˜ß£ª&^³(=á{çÕÇü4üN<C3BC>Âns.|óêmH ¸Î—n·ˆ¬
Ÿ¡SÙ¾r±6¬Sj³ÑB=Ž"RÃË:˜jÁxì[Ę­¸þ‹Ð;ç_ÊãŽBñ/«³0Zî€ûçé‹ã%OyEpÅ1W$c½·D®á'„S-ÇŒIRÖú¸¦1O\s)§†ºÎÁ5µ#}¶Ù- ?fíQ ‘îÚÃ{@2°¯‰É)Ð|¯9+ wzç{Iˆañ¹ªø?92´‰:<>&oˆX'`<60>k¹`&!ô'¨JZÂËꔩM+©Dã%µÑDˆvý8cì:;];ÞKCoz¸“PôZMÕr>Ò8`ÓÜþíéìÔÓð~¸ÿœQ1U¼èçïc *@ÓøÎ|4ÝlŒkl…q¶Q*<2A>ò¬ô%XLì@° ȧÝúV/kìã Ð]ÀAšÛ9¢£_µC°–¼: ßÕ4—œ,±ÌGTŒæÔi
Ä:Cd_±Úæ¦<C3A6>ƒ_ðJäè V±g¿ñ= ž­?î b,…ÿAa¥,¨R—tŽ:4¢² >¼—4ý!Û <15>Ø<01>¾ÐõàPõïü®þR˜ùzñFøÖ Oº¼Û¬¸DlªºžxÙä'_X+ÿ#d·û쌭g0";œd%ܽ6_Syt}(tÓÓÔÔ¦<C394>Û•?•"CñØËœK´|õ¥¸ÞÆAÂ¥uy#Êl¤™„sX<0A>©<ÖÑ$¢ÏGý<>¼ ÍÄ:I<>«¸<GŨì¢2L®&ÊzOòc^ŠcÀ4W<>ô¡5OãÈ*©ÏxîBˆú…¾×ö”.“<>Á¿Í¯v£ áÖᮿþrSÌñZùYcøS¨ˆ\Ã)Üa$2¢Õáq<C3A1>·N
ÿæŒ+Ó°e©WLæOb÷cªf7Êߦˆ1y^Ôµ×à–‹ž®È»ÌËÐ!W ê
ic f}%6u¨z©_sòüþŸ¤Bƒçš]X?T®ÚLoý™z¹9iÚ~¾:áw}¹Ç€ÆÁ<>O.þ'`—Ðs™ê˜6Á,œœžn[í+¥Ê×-O©¿ûqÒ)¨ŸrNL%ó-éÁZÁ~OZ&l÷°h÷í6=tÓ÷ßmŸÝÄÃh.äÔ> Xqý‰º»$Îa3Ž´kBS µË=êSfŠ¢¤Pø…ýù±p¤ü NÛ[
ܜǥ@f0ÔÞÒ¦Þ7ëL£µu˜­3kŠ>Wt†…É6ÊŒR;o·ž:)<%Ø®hifÞ%×[dJIǞܠ懈(<28>>u[s.//co·"%Ó¢°]ŠM)ºuÐÌÍ|‰ÕÍGkg¹¨4dÈâ”ú[ñ¤î7u)è<>>€xV¥ÔRîÚ\ۃ݃ÉyÀâ‘ô¬å úëJÙ Ùq®>‰WPùH;LJCHr@¸‰JÆ#ßT^Ë*Ò<>EoÊX¤ýQC€1gmfCÛºÁ‰‚™¬*UùJ°«f²@e˜/¸ÈNíNhØ#¶ßbŽFX|°¸öêâsqZ%¼cèM¿#|ïp1E ò†Á1!ë0AÑï2{ý’ºý¾Øκé&ë×æšä!®ƒÈûx$ߎ<C39F>T´šL3²ră9ˆõ‰ è¿ÿÐ.ã/äT0Ä/j`"gŽm?ÌFÆl <0B>VPŽðó°{v€Ó§°Ð'hÎÎÜVsï\;ä× y%  fð'»b»­ÞZjš.—”:©ø@R—8ÔÕ ð°suXáõÍ ðÍn‡¥‚‹Û<12> qÑQpÅ1cŽM÷Šy®ß<C2AE>L}ìõ ªåbbÃؾ±K}ÝÖk8µŠ#áÄïïìQšmJÄòÝÈ¥Dôõ áy@˵ȇr !Ü¡#Ÿ,Y%aôß¼¿·ªÕaÒŸ1êr(d•ÜúZ÷®¿å2™3AFĬnÉ,Ïç¤xÝG<C39D>Öÿ==Q—0·S~²Z~ ýR*|:M܀ū³¤M´J_ §æ«ù’`jÉIU‰Jòå,nCùo æñˆýÿ²œ›/‡^Ls GœÐ^Ü<15> ÿBþ£ê!°–Ý<>ÿMdÚNFLFJ¿QÉÆã]>ͼ.~+"«Ê$¦*^!ßÈK!õ]SËñÈ*,ÓÓ'­ŠÖÌäÃC<C383>˜Œø"®ƒë.mY ׊'é†KVœƒv¹ß&úo¦Ü<17>™>ÝäGVòË°0 AnÇÐIå‰NdÙ©U îô$A^H+BäF8{åN<M¶}x¦ü…7:(àlø¡ØcVíQ»É°±úöN­b."L¼¬$Ñ©ÝQbh2¬óº,ù¡ûÅm±sHä·ùI ÆÎ<C386>¢Ê@ÕŽ÷Šqj àI½]ÒüÅ*<2A>mªõÍLªÃîÈ峦8~g&Ï÷,ƒ0”l§
endstream
endobj
605 0 obj
@ -7659,7 +7672,7 @@ endobj
/Type /ObjStm
/N 100
/First 898
/Length 17065
/Length 17061
>>
stream
529 0 530 154 535 301 87 355 532 408 539 527 537 661 541 808 91 862 538 915
@ -7671,7 +7684,7 @@ stream
203 5222 247 5276 246 5330 269 5384 200 5438 333 5492 199 5546 575 5600 583 5706 585 5820
248 5874 198 5928 311 5982 202 6036 582 6090 586 6183 587 6879 588 6947 589 7251 590 7379
591 7411 592 7431 593 8074 594 8446 595 9110 596 9500 597 10092 598 10720 599 11227 600 11872
601 12467 602 12819 604 13451 606 13844 608 14206 610 14540 612 14834 614 15153 616 15376 618 15620
601 12467 602 12819 604 13451 606 13840 608 14202 610 14536 612 14830 614 15149 616 15372 618 15616
% 529 0 obj
<<
/Type /Annot
@ -7826,7 +7839,7 @@ stream
>>
% 555 0 obj
<<
/Font << /F41 137 0 R /F15 136 0 R /F17 124 0 R /F43 175 0 R /F44 225 0 R /F18 265 0 R >>
/Font << /F41 137 0 R /F15 136 0 R /F17 124 0 R /F25 327 0 R /F44 225 0 R /F18 265 0 R >>
/ProcSet [ /PDF /Text ]
>>
% 561 0 obj
@ -8097,7 +8110,7 @@ stream
% 604 0 obj
<<
/Type /FontDescriptor
/FontName /XKTSPK+CMBX10
/FontName /FOOXCC+CMBX10
/Flags 4
/FontBBox [-56 -250 1164 750]
/Ascent 694
@ -8106,7 +8119,7 @@ stream
/ItalicAngle 0
/StemV 114
/XHeight 444
/CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/a/b/c/comma/d/e/eight/f/fi/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/period/q/question/quoteright/r/s/seven/six/t/three/two/u/v/w/z/zero)
/CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/U/a/b/c/comma/d/e/eight/f/fi/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/period/q/question/quoteright/r/s/seven/six/t/three/two/u/v/w/z/zero)
/FontFile 603 0 R
>>
% 606 0 obj
@ -9243,8 +9256,8 @@ endobj
672 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:20170421134257+01'00')
/ModDate (D:20170421134257+01'00')
/CreationDate (D:20170424154232+01'00')
/ModDate (D:20170424154232+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)
>>
@ -9406,7 +9419,7 @@ stream
<<
/Type /Font
/Subtype /Type1
/BaseFont /XKTSPK+CMBX10
/BaseFont /FOOXCC+CMBX10
/FontDescriptor 604 0 R
/FirstChar 12
/LastChar 122
@ -10061,20 +10074,20 @@ endobj
/W [1 3 1]
/Root 671 0 R
/Info 672 0 R
/ID [<DD55733DCC8DA75CC6981E87D3A86CAE> <DD55733DCC8DA75CC6981E87D3A86CAE>]
/ID [<C6E6BD31200F1D0EC56F31CD46BDCFAF> <C6E6BD31200F1D0EC56F31CD46BDCFAF>]
/Length 3370
>>
stream
ÿ1«>mCEmB°mA°'m@°9m? 
ÿ1°>mCEmB°mA°'m@°9m? 
°:m>  °;m= °Jm<°\m;°]m:6
m96m86m76+m66;m56Nm4 ¨m3!"¨ m2#$¨m1%&¨Wm0'(¨^m/)*m.+,m--.m,/0m+12m*34m)56"m(78&m'9:;?<=m
mmmB@ AFCgDmm IGáHKLMNOPQRSTUVWXYZ[\]^_`abc°°°°Jl°°m 5m°°°° ° ° °°°°°°°
°° Sd°m m(GB@'I<;°°°°°°°°° °!°"°qÝ/°%°$°(°#<>°&m°*°+°,°-°/°1°2°3°4°5°6°<°)ŽÑ°8°.°0°767>=F:°?°@°A°B°C°D°F°G°>°K°=« °I°E°Hm012?°N°LÅ›°M°P°R°OÔØ°Qm°U°Sä°T°W°Y°Vó²°X°^°Z(°[°a°b°c666666666°`6 °_P6 <02>.H)*+6 6666666 66mmmmmmmA6666666#6˜O6m 6 6!6"m6%6&6'6(6)6,6$ÀÈ6*6/606.626-÷Ó61,6465666768696E6F6B63j6:6<6=6>6?6@6A6M¨0¨M6G6H6I6J6K6D6O6C/µ6L6_6Q6R6S6T6U6V6W6X6Y6[6PT(6Z6c¨¨6]6`6\6^m¨6a6b!|¨¨¨¨Àš¨¨
¨ ¨¨ Ù¨ ¨¨¨¨¨¨¨¨¨¨à•¨¨¨¨¨¨ ¨!¨"¨#¨)¨ü¼¨$¨%¨&¨'¨(¨I¨@¨4¨9¨+¨-¨*ƨ,m¨1¨.&>¨/¨3¨7¨257¨5¨6¨<¨8¨:¨;¨>¨A¨=ŒÈ¨?¨E¨B°s¨C¨D¨G¨J¨FÃö¨Hm ¨N¨Kâ:¨L¨Q¨R¨S¨T¨U¨P¨X¨Oý6¨V¨Z¨[¨\¨_¨Y
/¨]¨b¨c¨a¨`R¿ÿ Qÿ  
s m!<04>cŽ± #•ú!3$¦u%-.C4Á(589m"JDÛ,EKLMNOPQRSTUVWXYZ[ãÉ\5]^·<>_Ø'`<12>abY<>cm°@@/m^emm ým¾<>m[mI.m¢¦mm#m$m%m&mDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm[m\m]m^m_m`ma­déð
mmmB@ AFCgDmm IGáHKLMNOPQRSTUVWXYZ[\]^_`abc°°°°Jl°°m 5w°°°° ° ° °°°°°°°
°° Sn°m m(GB@'I<;°°°°°°°°° °!°"°qç/°%°$°(°#‡š°&m°*°+°,°-°/°1°2°3°4°5°6°<°)ŽÛ°8°.°0°767>=F:°?°@°A°B°C°D°F°G°>°K°=«°I°E°Hm012?°N°LÅ¥°M°P°R°OÔâ°Qm°U°Sä°T°W°Y°Vó¼°X°^°Z2°[°a°b°c666666666°`6 °_Z6 <02>8H)*+6 6666666 66mmmmmmmA6666666#6˜Y6m 6 6!6"m6%6&6'6(6)6,6$ÀÒ6*6/606.626-÷Ý61,6465666768696E6F6B63t6:6<6=6>6?6@6A6M¨0¨M6G6H6I6J6K6D6O6C/¿6L6_6Q6R6S6T6U6V6W6X6Y6[6PT26Z6c¨¨6]6`6\6^m¨6a6b!†¨¨¨¨À¤¨¨
¨ ¨¨ Ù¨ ¨¨¨¨¨¨¨¨¨¨àŸ¨¨¨¨¨¨ ¨!¨"¨#¨)¨üƨ$¨%¨&¨'¨(¨I¨@¨4¨9¨+¨-¨*Ш,m¨1¨.&H¨/¨3¨7¨25A¨5¨6¨<¨8¨:¨;¨>¨A¨=ŒÒ¨?¨E¨B°}¨C¨D¨G¨J¨FĨHm ¨N¨KâD¨L¨Q¨R¨S¨T¨U¨P¨X¨Oý@¨V¨Z¨[¨\¨_¨Y
9¨]¨b¨c¨a¨`\ÆB R   
s<EFBFBD> m!<04>m` #<04>©!3$®$%-.C4È×589m"JDâÛEKLMNOPQRSTUVWXYZ[ëx\;Y]"^½Ó_Þj`Äa8bc Cm¶Fnmmƒm§<mÄÀmšmOmm¨åmm#m$m%m&mDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm[m\m]m^m_m`ma³£ð/
endstream
endobj
startxref
584176
585775
%%EOF

@ -856,31 +856,45 @@ as follows:
\clearpage
\section{Adding smoothers and solvers to MLD2P4\label{sec:adding}}
\textbf{Da ampliare e completare - SALVATORE.} \\
Completely new smoother and/or solver classes derived from the
base objects in the library may be used without recompiling the
library itself. Once the new smoother/solver class has been
developed, the user can declare a variable of that new type in the
application, and pass that variable to the \verb|p%set(solver,info)|
call; the new solver object is then dynamically included in the
preconditioner structure.
\ \\
If the user has developed a new type of smoother and/or
solver by extending one of the base MLD2P4 types, and has declared a
variable of the new type in the main program, it is possible to pass
the new smoother/solver variable to the setup routine as follows:
\section{Adding new smoothers and solvers to MLD2P4\label{sec:adding}}
Developers can add completely new smoother and/or solver classes
derived from the base objects in the library may be used without
recompiling the library itself. To do so it is necessary first to
select the base type to be extended; in our experience, it is quite
likely that the new application needs only require the definition of a
``solver'' object, which is almost always acting only on the local
part of the distributed matrix. The parallel actions required to
connect the various solver objects are most often already provided by
the Block Jacobi or the Additive Schwarz smoothers.
To define a new solver, the developer will then have to define its
components and methods, perhaps taking one of the predefined solvers
as a starting point if possible.
Once the new smoother/solver class has been developed, to use it in
the context of the multilevel preconditioners it is necessary to:
\begin{itemize}
\item Declare in the application program a variable of the new type;
\item Pass that variable as the argument to the se routine as in the
following:
\begin{center}
\verb|call p%set(smoother,info [,ilev, ilmax,pos])|\\
\verb|call p%set(solver,info [,ilev, ilmax,pos])|
\end{center}
In this way, the variable will act as a \emph{mold} to which the
preconditioner will conform, even though the MLD2P4 library is not
modified, and thus has no direct knowledge about the new type.
\item Link into the application executable the code implementing the
various methods.
\end{itemize}
The new solver object is then dynamically included in the
preconditioner structure, and will act as a \emph{mold} to which the
preconditioner will conform, even though the MLD2P4 library has not
been modified to account for this new development.
It is possible to define new values for the keyword \verb|WHAT| in the
\verb|set| routines; if the library code does not recognize a keyword,
it passes it down the composition hierarchy (levels containing
smoothers containing solvers), so that it can be eventually caught by
the new solver.
\ \\

@ -106,7 +106,7 @@ subroutine mld_ccprecseti(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_
integer(psb_ipk_) :: ilev_, nlev_, ilmax_, il
character(len=*), parameter :: name='mld_precseti'
info = psb_success_
@ -118,21 +118,32 @@ subroutine mld_ccprecseti(p,what,val,info,ilev,ilmax,pos)
&' should call MLD_PRECINIT'
return
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
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
select case(psb_toupper(what))
case ('MIN_COARSE_SIZE')
@ -151,14 +162,6 @@ subroutine mld_ccprecseti(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
if (ilev_ == 1) then
!
! Rules for fine level are slightly different.
!
call p%precv(ilev_)%set(what,val,info,pos=pos)
else if (ilev_ > 1) then
select case(psb_toupper(what))
case('SMOOTHER_TYPE','SUB_SOLVE','SMOOTHER_SWEEPS',&
& 'ML_CYCLE','PAR_AGGR_ALG','AGGR_ORD',&
@ -166,7 +169,9 @@ subroutine mld_ccprecseti(p,what,val,info,ilev,ilmax,pos)
& 'AGGR_EIG','SUB_RESTR','SUB_PROL', &
& 'SUB_OVR','SUB_FILLIN',&
& 'COARSE_MAT')
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
case('COARSE_SUBSOLVE')
if (ilev_ /= nlev_) then
@ -279,10 +284,11 @@ subroutine mld_ccprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set('SUB_FILLIN',val,info,pos=pos)
case default
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select
endif
else if (.not.present(ilev)) then
!
@ -469,7 +475,7 @@ subroutine mld_ccprecsetc(p,what,string,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_,val
integer(psb_ipk_) :: ilev_, nlev_,val,ilmax_, il
character(len=*), parameter :: name='mld_precsetc'
info = psb_success_
@ -478,26 +484,41 @@ subroutine mld_ccprecsetc(p,what,string,info,ilev,ilmax,pos)
info = 3111
return
endif
val = mld_stringval(string)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,ilmax=ilmax,pos=pos)
else
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',ilev_, nlev_
&': 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
val = mld_stringval(string)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,pos=pos)
else
call p%precv(ilev_)%set(what,string,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,string,info,pos=pos)
end do
end if
end subroutine mld_ccprecsetc
@ -556,8 +577,8 @@ subroutine mld_ccprecsetr(p,what,val,info,ilev,ilmax,pos)
integer(psb_ipk_), optional, intent(in) :: ilev,ilmax
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_,nlev_
! Local variables
integer(psb_ipk_) :: ilev_,nlev_, ilmax_, il
real(psb_spk_) :: thr
character(len=*), parameter :: name='mld_precsetr'
@ -584,20 +605,39 @@ subroutine mld_ccprecsetr(p,what,val,info,ilev,ilmax,pos)
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',&
& ilev_, nlev_
&': 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
!
! Set preconditioner parameters at level ilev.
!
if (present(ilev)) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
else if (.not.present(ilev)) then
!
@ -611,8 +651,8 @@ subroutine mld_ccprecsetr(p,what,val,info,ilev,ilmax,pos)
case default
do ilev_=1,nlev_
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=1,nlev_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select

@ -105,7 +105,7 @@ subroutine mld_cprecseti(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_
integer(psb_ipk_) :: ilev_, nlev_, ilmax_, il
character(len=*), parameter :: name='mld_precseti'
info = psb_success_
@ -121,8 +121,14 @@ subroutine mld_cprecseti(p,what,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
@ -131,6 +137,12 @@ subroutine mld_cprecseti(p,what,val,info,ilev,ilmax,pos)
&': 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
select case(what)
@ -150,12 +162,6 @@ subroutine mld_cprecseti(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
if (ilev_ == 1) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
else if (ilev_ > 1) then
select case(what)
case(mld_smoother_type_,mld_sub_solve_,mld_smoother_sweeps_,&
& mld_ml_cycle_,mld_par_aggr_alg_,mld_aggr_ord_,mld_aggr_type_,&
@ -163,7 +169,9 @@ subroutine mld_cprecseti(p,what,val,info,ilev,ilmax,pos)
& mld_sub_restr_,mld_sub_prol_, &
& mld_sub_ovr_,mld_sub_fillin_,&
& mld_coarse_mat_)
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
case(mld_coarse_subsolve_)
if (ilev_ /= nlev_) then
@ -194,14 +202,64 @@ subroutine mld_cprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
#endif
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
case(mld_slu_,mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
case(mld_slu_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
case(mld_mumps_)
#if defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_umf_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_sludist_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_jac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_diag_scale_,info,pos=pos)
@ -227,11 +285,11 @@ subroutine mld_cprecseti(p,what,val,info,ilev,ilmax,pos)
end if
call p%precv(nlev_)%set(mld_sub_fillin_,val,info,pos=pos)
case default
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select
endif
else if (.not.present(ilev)) then
!
! ilev not specified: set preconditioner parameters at all the appropriate
@ -259,31 +317,80 @@ subroutine mld_cprecseti(p,what,val,info,ilev,ilmax,pos)
case(mld_coarse_solve_)
if (nlev_ > 1) then
call p%precv(nlev_)%set(mld_coarse_solve_,val,info,pos=pos)
call p%precv(nlev_)%set('COARSE_SOLVE',val,info,pos=pos)
select case (val)
case(mld_bjac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
#endif
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info)
case(mld_slu_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
case(mld_slu_,mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
case(mld_mumps_)
#if defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_umf_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_sludist_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_jac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_diag_scale_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
end select
endif
case(mld_coarse_subsolve_)
@ -343,7 +450,11 @@ subroutine mld_cprecsetsm(p,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
ilmin_ = ilev
ilmax_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmin_ = 1
@ -356,7 +467,12 @@ subroutine mld_cprecsetsm(p,val,info,ilev,ilmax,pos)
& ': 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)
@ -397,20 +513,29 @@ subroutine mld_cprecsetsv(p,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
ilmin_ = ilev
ilmax_ = 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)
@ -474,7 +599,7 @@ subroutine mld_cprecsetc(p,what,string,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_,val
integer(psb_ipk_) :: ilev_, nlev_,val,ilmax_, il
character(len=*), parameter :: name='mld_precsetc'
info = psb_success_
@ -499,7 +624,38 @@ subroutine mld_cprecsetc(p,what,string,info,ilev,ilmax,pos)
endif
val = mld_stringval(string)
if (val >=0) call p%set(what,val,info,ilev=ilev,pos=pos)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,ilmax=ilmax,pos=pos)
else
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
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 il=ilev_, ilmax_
call p%precv(il)%set(what,string,info,pos=pos)
end do
end if
end subroutine mld_cprecsetc
@ -559,7 +715,7 @@ subroutine mld_cprecsetr(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_,nlev_
integer(psb_ipk_) :: ilev_,nlev_, ilmax_, il
real(psb_spk_) :: thr
character(len=*), parameter :: name='mld_precsetr'
@ -571,12 +727,6 @@ subroutine mld_cprecsetr(p,what,val,info,ilev,ilmax,pos)
return
end select
if (present(ilev)) then
ilev_ = ilev
else
ilev_ = 1
end if
if (.not.allocated(p%precv)) then
write(psb_err_unit,*) name,&
&': Error: uninitialized preconditioner,',&
@ -585,12 +735,27 @@ subroutine mld_cprecsetr(p,what,val,info,ilev,ilmax,pos)
return
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',&
& ilev_, nlev_
&': 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
@ -599,7 +764,9 @@ subroutine mld_cprecsetr(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
else if (.not.present(ilev)) then
!
@ -613,8 +780,8 @@ subroutine mld_cprecsetr(p,what,val,info,ilev,ilmax,pos)
case default
do ilev_=1,nlev_
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=1,nlev_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select

@ -112,7 +112,7 @@ subroutine mld_dcprecseti(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_
integer(psb_ipk_) :: ilev_, nlev_, ilmax_, il
character(len=*), parameter :: name='mld_precseti'
info = psb_success_
@ -124,21 +124,32 @@ subroutine mld_dcprecseti(p,what,val,info,ilev,ilmax,pos)
&' should call MLD_PRECINIT'
return
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
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
select case(psb_toupper(what))
case ('MIN_COARSE_SIZE')
@ -157,14 +168,6 @@ subroutine mld_dcprecseti(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
if (ilev_ == 1) then
!
! Rules for fine level are slightly different.
!
call p%precv(ilev_)%set(what,val,info,pos=pos)
else if (ilev_ > 1) then
select case(psb_toupper(what))
case('SMOOTHER_TYPE','SUB_SOLVE','SMOOTHER_SWEEPS',&
& 'ML_CYCLE','PAR_AGGR_ALG','AGGR_ORD',&
@ -172,7 +175,9 @@ subroutine mld_dcprecseti(p,what,val,info,ilev,ilmax,pos)
& 'AGGR_EIG','SUB_RESTR','SUB_PROL', &
& 'SUB_OVR','SUB_FILLIN',&
& 'COARSE_MAT')
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
case('COARSE_SUBSOLVE')
if (ilev_ /= nlev_) then
@ -299,10 +304,11 @@ subroutine mld_dcprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set('SUB_FILLIN',val,info,pos=pos)
case default
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select
endif
else if (.not.present(ilev)) then
!
@ -503,7 +509,7 @@ subroutine mld_dcprecsetc(p,what,string,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_,val
integer(psb_ipk_) :: ilev_, nlev_,val,ilmax_, il
character(len=*), parameter :: name='mld_precsetc'
info = psb_success_
@ -512,26 +518,41 @@ subroutine mld_dcprecsetc(p,what,string,info,ilev,ilmax,pos)
info = 3111
return
endif
val = mld_stringval(string)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,ilmax=ilmax,pos=pos)
else
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',ilev_, nlev_
&': 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
val = mld_stringval(string)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,pos=pos)
else
call p%precv(ilev_)%set(what,string,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,string,info,pos=pos)
end do
end if
end subroutine mld_dcprecsetc
@ -590,8 +611,8 @@ subroutine mld_dcprecsetr(p,what,val,info,ilev,ilmax,pos)
integer(psb_ipk_), optional, intent(in) :: ilev,ilmax
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_,nlev_
! Local variables
integer(psb_ipk_) :: ilev_,nlev_, ilmax_, il
real(psb_dpk_) :: thr
character(len=*), parameter :: name='mld_precsetr'
@ -618,20 +639,39 @@ subroutine mld_dcprecsetr(p,what,val,info,ilev,ilmax,pos)
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',&
& ilev_, nlev_
&': 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
!
! Set preconditioner parameters at level ilev.
!
if (present(ilev)) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
else if (.not.present(ilev)) then
!
@ -645,8 +685,8 @@ subroutine mld_dcprecsetr(p,what,val,info,ilev,ilmax,pos)
case default
do ilev_=1,nlev_
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=1,nlev_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select

@ -111,7 +111,7 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_
integer(psb_ipk_) :: ilev_, nlev_, ilmax_, il
character(len=*), parameter :: name='mld_precseti'
info = psb_success_
@ -127,8 +127,14 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
@ -137,6 +143,12 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
&': 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
select case(what)
@ -156,12 +168,6 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
if (ilev_ == 1) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
else if (ilev_ > 1) then
select case(what)
case(mld_smoother_type_,mld_sub_solve_,mld_smoother_sweeps_,&
& mld_ml_cycle_,mld_par_aggr_alg_,mld_aggr_ord_,mld_aggr_type_,&
@ -169,7 +175,9 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
& mld_sub_restr_,mld_sub_prol_, &
& mld_sub_ovr_,mld_sub_fillin_,&
& mld_coarse_mat_)
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
case(mld_coarse_subsolve_)
if (ilev_ /= nlev_) then
@ -202,22 +210,75 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
#endif
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
case(mld_slu_,mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
case(mld_slu_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
case(mld_mumps_)
#if defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_umf_)
#if defined(HAVE_UMF_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_sludist_)
#if defined(HAVE_SLUDIST_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#elif defined(HAVE_UMF_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_umf_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_jac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_diag_scale_,info,pos=pos)
@ -243,11 +304,11 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
end if
call p%precv(nlev_)%set(mld_sub_fillin_,val,info,pos=pos)
case default
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select
endif
else if (.not.present(ilev)) then
!
! ilev not specified: set preconditioner parameters at all the appropriate
@ -275,8 +336,7 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
case(mld_coarse_solve_)
if (nlev_ > 1) then
call p%precv(nlev_)%set(mld_coarse_solve_,val,info,pos=pos)
call p%precv(nlev_)%set('COARSE_SOLVE',val,info,pos=pos)
select case (val)
case(mld_bjac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
@ -284,32 +344,86 @@ subroutine mld_dprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_umf_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
#endif
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info)
case(mld_slu_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
case(mld_slu_,mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
#endif
case(mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
case(mld_mumps_)
#if defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_umf_)
#if defined(HAVE_UMF_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_sludist_)
#if defined(HAVE_SLUDIST_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#elif defined(HAVE_UMF_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_umf_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_jac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_diag_scale_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
end select
endif
case(mld_coarse_subsolve_)
@ -369,7 +483,11 @@ subroutine mld_dprecsetsm(p,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
ilmin_ = ilev
ilmax_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmin_ = 1
@ -382,7 +500,12 @@ subroutine mld_dprecsetsm(p,val,info,ilev,ilmax,pos)
& ': 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)
@ -423,20 +546,29 @@ subroutine mld_dprecsetsv(p,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
ilmin_ = ilev
ilmax_ = 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)
@ -500,7 +632,7 @@ subroutine mld_dprecsetc(p,what,string,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_,val
integer(psb_ipk_) :: ilev_, nlev_,val,ilmax_, il
character(len=*), parameter :: name='mld_precsetc'
info = psb_success_
@ -525,7 +657,38 @@ subroutine mld_dprecsetc(p,what,string,info,ilev,ilmax,pos)
endif
val = mld_stringval(string)
if (val >=0) call p%set(what,val,info,ilev=ilev,pos=pos)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,ilmax=ilmax,pos=pos)
else
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
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 il=ilev_, ilmax_
call p%precv(il)%set(what,string,info,pos=pos)
end do
end if
end subroutine mld_dprecsetc
@ -585,7 +748,7 @@ subroutine mld_dprecsetr(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_,nlev_
integer(psb_ipk_) :: ilev_,nlev_, ilmax_, il
real(psb_dpk_) :: thr
character(len=*), parameter :: name='mld_precsetr'
@ -597,12 +760,6 @@ subroutine mld_dprecsetr(p,what,val,info,ilev,ilmax,pos)
return
end select
if (present(ilev)) then
ilev_ = ilev
else
ilev_ = 1
end if
if (.not.allocated(p%precv)) then
write(psb_err_unit,*) name,&
&': Error: uninitialized preconditioner,',&
@ -611,12 +768,27 @@ subroutine mld_dprecsetr(p,what,val,info,ilev,ilmax,pos)
return
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',&
& ilev_, nlev_
&': 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
@ -625,7 +797,9 @@ subroutine mld_dprecsetr(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
else if (.not.present(ilev)) then
!
@ -639,8 +813,8 @@ subroutine mld_dprecsetr(p,what,val,info,ilev,ilmax,pos)
case default
do ilev_=1,nlev_
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=1,nlev_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select

@ -106,7 +106,7 @@ subroutine mld_scprecseti(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_
integer(psb_ipk_) :: ilev_, nlev_, ilmax_, il
character(len=*), parameter :: name='mld_precseti'
info = psb_success_
@ -118,21 +118,32 @@ subroutine mld_scprecseti(p,what,val,info,ilev,ilmax,pos)
&' should call MLD_PRECINIT'
return
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
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
select case(psb_toupper(what))
case ('MIN_COARSE_SIZE')
@ -151,14 +162,6 @@ subroutine mld_scprecseti(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
if (ilev_ == 1) then
!
! Rules for fine level are slightly different.
!
call p%precv(ilev_)%set(what,val,info,pos=pos)
else if (ilev_ > 1) then
select case(psb_toupper(what))
case('SMOOTHER_TYPE','SUB_SOLVE','SMOOTHER_SWEEPS',&
& 'ML_CYCLE','PAR_AGGR_ALG','AGGR_ORD',&
@ -166,7 +169,9 @@ subroutine mld_scprecseti(p,what,val,info,ilev,ilmax,pos)
& 'AGGR_EIG','SUB_RESTR','SUB_PROL', &
& 'SUB_OVR','SUB_FILLIN',&
& 'COARSE_MAT')
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
case('COARSE_SUBSOLVE')
if (ilev_ /= nlev_) then
@ -279,10 +284,11 @@ subroutine mld_scprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set('SUB_FILLIN',val,info,pos=pos)
case default
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select
endif
else if (.not.present(ilev)) then
!
@ -469,7 +475,7 @@ subroutine mld_scprecsetc(p,what,string,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_,val
integer(psb_ipk_) :: ilev_, nlev_,val,ilmax_, il
character(len=*), parameter :: name='mld_precsetc'
info = psb_success_
@ -478,26 +484,41 @@ subroutine mld_scprecsetc(p,what,string,info,ilev,ilmax,pos)
info = 3111
return
endif
val = mld_stringval(string)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,ilmax=ilmax,pos=pos)
else
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',ilev_, nlev_
&': 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
val = mld_stringval(string)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,pos=pos)
else
call p%precv(ilev_)%set(what,string,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,string,info,pos=pos)
end do
end if
end subroutine mld_scprecsetc
@ -556,8 +577,8 @@ subroutine mld_scprecsetr(p,what,val,info,ilev,ilmax,pos)
integer(psb_ipk_), optional, intent(in) :: ilev,ilmax
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_,nlev_
! Local variables
integer(psb_ipk_) :: ilev_,nlev_, ilmax_, il
real(psb_spk_) :: thr
character(len=*), parameter :: name='mld_precsetr'
@ -584,20 +605,39 @@ subroutine mld_scprecsetr(p,what,val,info,ilev,ilmax,pos)
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',&
& ilev_, nlev_
&': 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
!
! Set preconditioner parameters at level ilev.
!
if (present(ilev)) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
else if (.not.present(ilev)) then
!
@ -611,8 +651,8 @@ subroutine mld_scprecsetr(p,what,val,info,ilev,ilmax,pos)
case default
do ilev_=1,nlev_
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=1,nlev_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select

@ -105,7 +105,7 @@ subroutine mld_sprecseti(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_
integer(psb_ipk_) :: ilev_, nlev_, ilmax_, il
character(len=*), parameter :: name='mld_precseti'
info = psb_success_
@ -121,8 +121,14 @@ subroutine mld_sprecseti(p,what,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
@ -131,6 +137,12 @@ subroutine mld_sprecseti(p,what,val,info,ilev,ilmax,pos)
&': 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
select case(what)
@ -150,12 +162,6 @@ subroutine mld_sprecseti(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
if (ilev_ == 1) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
else if (ilev_ > 1) then
select case(what)
case(mld_smoother_type_,mld_sub_solve_,mld_smoother_sweeps_,&
& mld_ml_cycle_,mld_par_aggr_alg_,mld_aggr_ord_,mld_aggr_type_,&
@ -163,7 +169,9 @@ subroutine mld_sprecseti(p,what,val,info,ilev,ilmax,pos)
& mld_sub_restr_,mld_sub_prol_, &
& mld_sub_ovr_,mld_sub_fillin_,&
& mld_coarse_mat_)
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
case(mld_coarse_subsolve_)
if (ilev_ /= nlev_) then
@ -194,14 +202,64 @@ subroutine mld_sprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
#endif
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
case(mld_slu_,mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
case(mld_slu_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
case(mld_mumps_)
#if defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_umf_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_sludist_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_jac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_diag_scale_,info,pos=pos)
@ -227,11 +285,11 @@ subroutine mld_sprecseti(p,what,val,info,ilev,ilmax,pos)
end if
call p%precv(nlev_)%set(mld_sub_fillin_,val,info,pos=pos)
case default
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select
endif
else if (.not.present(ilev)) then
!
! ilev not specified: set preconditioner parameters at all the appropriate
@ -259,31 +317,80 @@ subroutine mld_sprecseti(p,what,val,info,ilev,ilmax,pos)
case(mld_coarse_solve_)
if (nlev_ > 1) then
call p%precv(nlev_)%set(mld_coarse_solve_,val,info,pos=pos)
call p%precv(nlev_)%set('COARSE_SOLVE',val,info,pos=pos)
select case (val)
case(mld_bjac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
#endif
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info)
case(mld_slu_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
case(mld_slu_,mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
case(mld_mumps_)
#if defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_umf_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_sludist_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_jac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_diag_scale_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
end select
endif
case(mld_coarse_subsolve_)
@ -343,7 +450,11 @@ subroutine mld_sprecsetsm(p,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
ilmin_ = ilev
ilmax_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmin_ = 1
@ -356,7 +467,12 @@ subroutine mld_sprecsetsm(p,val,info,ilev,ilmax,pos)
& ': 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)
@ -397,20 +513,29 @@ subroutine mld_sprecsetsv(p,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
ilmin_ = ilev
ilmax_ = 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)
@ -474,7 +599,7 @@ subroutine mld_sprecsetc(p,what,string,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_,val
integer(psb_ipk_) :: ilev_, nlev_,val,ilmax_, il
character(len=*), parameter :: name='mld_precsetc'
info = psb_success_
@ -499,7 +624,38 @@ subroutine mld_sprecsetc(p,what,string,info,ilev,ilmax,pos)
endif
val = mld_stringval(string)
if (val >=0) call p%set(what,val,info,ilev=ilev,pos=pos)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,ilmax=ilmax,pos=pos)
else
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
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 il=ilev_, ilmax_
call p%precv(il)%set(what,string,info,pos=pos)
end do
end if
end subroutine mld_sprecsetc
@ -559,7 +715,7 @@ subroutine mld_sprecsetr(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_,nlev_
integer(psb_ipk_) :: ilev_,nlev_, ilmax_, il
real(psb_spk_) :: thr
character(len=*), parameter :: name='mld_precsetr'
@ -571,12 +727,6 @@ subroutine mld_sprecsetr(p,what,val,info,ilev,ilmax,pos)
return
end select
if (present(ilev)) then
ilev_ = ilev
else
ilev_ = 1
end if
if (.not.allocated(p%precv)) then
write(psb_err_unit,*) name,&
&': Error: uninitialized preconditioner,',&
@ -585,12 +735,27 @@ subroutine mld_sprecsetr(p,what,val,info,ilev,ilmax,pos)
return
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',&
& ilev_, nlev_
&': 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
@ -599,7 +764,9 @@ subroutine mld_sprecsetr(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
else if (.not.present(ilev)) then
!
@ -613,8 +780,8 @@ subroutine mld_sprecsetr(p,what,val,info,ilev,ilmax,pos)
case default
do ilev_=1,nlev_
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=1,nlev_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select

@ -112,7 +112,7 @@ subroutine mld_zcprecseti(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_
integer(psb_ipk_) :: ilev_, nlev_, ilmax_, il
character(len=*), parameter :: name='mld_precseti'
info = psb_success_
@ -124,21 +124,32 @@ subroutine mld_zcprecseti(p,what,val,info,ilev,ilmax,pos)
&' should call MLD_PRECINIT'
return
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
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
select case(psb_toupper(what))
case ('MIN_COARSE_SIZE')
@ -157,14 +168,6 @@ subroutine mld_zcprecseti(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
if (ilev_ == 1) then
!
! Rules for fine level are slightly different.
!
call p%precv(ilev_)%set(what,val,info,pos=pos)
else if (ilev_ > 1) then
select case(psb_toupper(what))
case('SMOOTHER_TYPE','SUB_SOLVE','SMOOTHER_SWEEPS',&
& 'ML_CYCLE','PAR_AGGR_ALG','AGGR_ORD',&
@ -172,7 +175,9 @@ subroutine mld_zcprecseti(p,what,val,info,ilev,ilmax,pos)
& 'AGGR_EIG','SUB_RESTR','SUB_PROL', &
& 'SUB_OVR','SUB_FILLIN',&
& 'COARSE_MAT')
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
case('COARSE_SUBSOLVE')
if (ilev_ /= nlev_) then
@ -299,10 +304,11 @@ subroutine mld_zcprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set('SUB_FILLIN',val,info,pos=pos)
case default
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select
endif
else if (.not.present(ilev)) then
!
@ -503,7 +509,7 @@ subroutine mld_zcprecsetc(p,what,string,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_,val
integer(psb_ipk_) :: ilev_, nlev_,val,ilmax_, il
character(len=*), parameter :: name='mld_precsetc'
info = psb_success_
@ -512,26 +518,41 @@ subroutine mld_zcprecsetc(p,what,string,info,ilev,ilmax,pos)
info = 3111
return
endif
val = mld_stringval(string)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,ilmax=ilmax,pos=pos)
else
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',ilev_, nlev_
&': 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
val = mld_stringval(string)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,pos=pos)
else
call p%precv(ilev_)%set(what,string,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,string,info,pos=pos)
end do
end if
end subroutine mld_zcprecsetc
@ -590,8 +611,8 @@ subroutine mld_zcprecsetr(p,what,val,info,ilev,ilmax,pos)
integer(psb_ipk_), optional, intent(in) :: ilev,ilmax
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_,nlev_
! Local variables
integer(psb_ipk_) :: ilev_,nlev_, ilmax_, il
real(psb_dpk_) :: thr
character(len=*), parameter :: name='mld_precsetr'
@ -618,20 +639,39 @@ subroutine mld_zcprecsetr(p,what,val,info,ilev,ilmax,pos)
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',&
& ilev_, nlev_
&': 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
!
! Set preconditioner parameters at level ilev.
!
if (present(ilev)) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
else if (.not.present(ilev)) then
!
@ -645,8 +685,8 @@ subroutine mld_zcprecsetr(p,what,val,info,ilev,ilmax,pos)
case default
do ilev_=1,nlev_
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=1,nlev_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select

@ -111,7 +111,7 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_
integer(psb_ipk_) :: ilev_, nlev_, ilmax_, il
character(len=*), parameter :: name='mld_precseti'
info = psb_success_
@ -127,8 +127,14 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
@ -137,6 +143,12 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
&': 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
select case(what)
@ -156,12 +168,6 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
if (ilev_ == 1) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
else if (ilev_ > 1) then
select case(what)
case(mld_smoother_type_,mld_sub_solve_,mld_smoother_sweeps_,&
& mld_ml_cycle_,mld_par_aggr_alg_,mld_aggr_ord_,mld_aggr_type_,&
@ -169,7 +175,9 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
& mld_sub_restr_,mld_sub_prol_, &
& mld_sub_ovr_,mld_sub_fillin_,&
& mld_coarse_mat_)
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
case(mld_coarse_subsolve_)
if (ilev_ /= nlev_) then
@ -202,22 +210,75 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
#endif
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
case(mld_slu_,mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
case(mld_slu_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
case(mld_mumps_)
#if defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_umf_)
#if defined(HAVE_UMF_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_sludist_)
#if defined(HAVE_SLUDIST_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#elif defined(HAVE_UMF_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_umf_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_jac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_diag_scale_,info,pos=pos)
@ -243,11 +304,11 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
end if
call p%precv(nlev_)%set(mld_sub_fillin_,val,info,pos=pos)
case default
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select
endif
else if (.not.present(ilev)) then
!
! ilev not specified: set preconditioner parameters at all the appropriate
@ -275,8 +336,7 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
case(mld_coarse_solve_)
if (nlev_ > 1) then
call p%precv(nlev_)%set(mld_coarse_solve_,val,info,pos=pos)
call p%precv(nlev_)%set('COARSE_SOLVE',val,info,pos=pos)
select case (val)
case(mld_bjac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
@ -284,32 +344,86 @@ subroutine mld_zprecseti(p,what,val,info,ilev,ilmax,pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_umf_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
#endif
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info)
case(mld_slu_)
#if defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
case(mld_slu_,mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
#endif
case(mld_ilu_n_, mld_ilu_t_,mld_milu_n_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
case(mld_mumps_)
#if defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_umf_)
#if defined(HAVE_UMF_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_sludist_)
#if defined(HAVE_SLUDIST_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,val,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#elif defined(HAVE_UMF_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_umf_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_SLU_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_slu_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_repl_mat_,info,pos=pos)
#elif defined(HAVE_MUMPS_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_mumps_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#else
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_ilu_n_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
#endif
case(mld_jac_)
call p%precv(nlev_)%set(mld_smoother_type_,mld_bjac_,info,pos=pos)
call p%precv(nlev_)%set(mld_sub_solve_,mld_diag_scale_,info,pos=pos)
call p%precv(nlev_)%set(mld_coarse_mat_,mld_distr_mat_,info,pos=pos)
end select
endif
case(mld_coarse_subsolve_)
@ -369,7 +483,11 @@ subroutine mld_zprecsetsm(p,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
ilmin_ = ilev
ilmax_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmin_ = 1
@ -382,7 +500,12 @@ subroutine mld_zprecsetsm(p,val,info,ilev,ilmax,pos)
& ': 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)
@ -423,20 +546,29 @@ subroutine mld_zprecsetsv(p,val,info,ilev,ilmax,pos)
if (present(ilev)) then
ilev_ = ilev
ilmin_ = ilev
ilmax_ = 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)
@ -500,7 +632,7 @@ subroutine mld_zprecsetc(p,what,string,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_, nlev_,val
integer(psb_ipk_) :: ilev_, nlev_,val,ilmax_, il
character(len=*), parameter :: name='mld_precsetc'
info = psb_success_
@ -525,7 +657,38 @@ subroutine mld_zprecsetc(p,what,string,info,ilev,ilmax,pos)
endif
val = mld_stringval(string)
if (val >=0) call p%set(what,val,info,ilev=ilev,pos=pos)
if (val >=0) then
call p%set(what,val,info,ilev=ilev,ilmax=ilmax,pos=pos)
else
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
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 il=ilev_, ilmax_
call p%precv(il)%set(what,string,info,pos=pos)
end do
end if
end subroutine mld_zprecsetc
@ -585,7 +748,7 @@ subroutine mld_zprecsetr(p,what,val,info,ilev,ilmax,pos)
character(len=*), optional, intent(in) :: pos
! Local variables
integer(psb_ipk_) :: ilev_,nlev_
integer(psb_ipk_) :: ilev_,nlev_, ilmax_, il
real(psb_dpk_) :: thr
character(len=*), parameter :: name='mld_precsetr'
@ -597,12 +760,6 @@ subroutine mld_zprecsetr(p,what,val,info,ilev,ilmax,pos)
return
end select
if (present(ilev)) then
ilev_ = ilev
else
ilev_ = 1
end if
if (.not.allocated(p%precv)) then
write(psb_err_unit,*) name,&
&': Error: uninitialized preconditioner,',&
@ -611,12 +768,27 @@ subroutine mld_zprecsetr(p,what,val,info,ilev,ilmax,pos)
return
endif
nlev_ = size(p%precv)
if (present(ilev)) then
ilev_ = ilev
if (present(ilmax)) then
ilmax_ = ilmax
else
ilmax_ = ilev_
end if
else
ilev_ = 1
ilmax_ = ilev_
end if
if ((ilev_<1).or.(ilev_ > nlev_)) then
info = -1
write(psb_err_unit,*) name,&
& ': Error: invalid ILEV/NLEV combination',&
& ilev_, nlev_
&': 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
@ -625,7 +797,9 @@ subroutine mld_zprecsetr(p,what,val,info,ilev,ilmax,pos)
!
if (present(ilev)) then
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=ilev_, ilmax_
call p%precv(il)%set(what,val,info,pos=pos)
end do
else if (.not.present(ilev)) then
!
@ -639,8 +813,8 @@ subroutine mld_zprecsetr(p,what,val,info,ilev,ilmax,pos)
case default
do ilev_=1,nlev_
call p%precv(ilev_)%set(what,val,info,pos=pos)
do il=1,nlev_
call p%precv(il)%set(what,val,info,pos=pos)
end do
end select

Loading…
Cancel
Save