1
<center><a href="symmlq.c">Actual source code: symmlq.c</a></center><br>
6
<meta name="generator" content="c2html 0.9.1">
7
<meta name="date" content="2002-05-31T16:27:26+00:00">
10
<body bgcolor="#FFFFFF">
11
<pre width="80"><a name="line1"> 1: </a><font color="#B22222">/*$Id: symmlq.c,v 1.16 2001/08/07 03:03:56 balay Exp $*/</font>
12
<a name="line2"> 2: </a><font color="#B22222">/* </font>
13
<a name="line3"> 3: </a><font color="#B22222"> This code implements the SYMMLQ method. </font>
14
<a name="line4"> 4: </a><font color="#B22222"> Reference: Paige & Saunders, 1975.</font>
16
<a name="line6"> 6: </a><font color="#B22222"> Contributed by: Hong Zhang</font>
17
<a name="line7"> 7: </a><font color="#B22222">*/</font>
18
<a name="line8"> 8: </a> #include <A href="../../../../../src/sles/ksp/kspimpl.h.html">src/sles/ksp/kspimpl.h</A>
20
<a name="line10"> 10: </a><font color="#4169E1">typedef</font> <font color="#4169E1">struct</font> {
21
<a name="line11"> 11: </a> PetscReal haptol;
22
<a name="line12"> 12: </a>} KSP_SYMMLQ;
24
<a name="line14"> 14: </a><strong><font color="#4169E1"><a name="KSPSetUp_SYMMLQ"></a>int KSPSetUp_SYMMLQ(<A href="../../../../../docs/manualpages/KSP/KSP.html#KSP">KSP</A> ksp)</font></strong>
25
<a name="line15"> 15: </a>{
27
<a name="line19"> 19: </a> <font color="#4169E1">if</font> (ksp->pc_side == PC_RIGHT) {
28
<a name="line20"> 20: </a> <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(2,<font color="#666666">"No right preconditioning for KSPSYMMLQ"</font>);
29
<a name="line21"> 21: </a> } <font color="#4169E1">else</font> <font color="#4169E1">if</font> (ksp->pc_side == PC_SYMMETRIC) {
30
<a name="line22"> 22: </a> <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(2,<font color="#666666">"No symmetric preconditioning for KSPSYMMLQ"</font>);
31
<a name="line23"> 23: </a> }
32
<a name="line24"> 24: </a> KSPDefaultGetWork(ksp,9);
33
<a name="line25"> 25: </a> <font color="#4169E1">return</font>(0);
34
<a name="line26"> 26: </a>}
36
<a name="line28"> 28: </a><strong><font color="#4169E1"><a name="KSPSolve_SYMMLQ"></a>int KSPSolve_SYMMLQ(<A href="../../../../../docs/manualpages/KSP/KSP.html#KSP">KSP</A> ksp,int *its)</font></strong>
37
<a name="line29"> 29: </a>{
38
<a name="line30"> 30: </a> int ierr,i,maxit;
39
<a name="line31"> 31: </a> <A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> alpha,malpha,beta,mbeta,ibeta,betaold,beta1,ceta,ceta_oold = 0.0, ceta_old = 0.0,ceta_bar;
40
<a name="line32"> 32: </a> <A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> c=1.0,cold=1.0,s=0.0,sold=0.0,coold,soold,ms,rho0,rho1,rho2,rho3;
41
<a name="line33"> 33: </a> <A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A> mone = -1.0,zero = 0.0,dp = 0.0;
42
<a name="line34"> 34: </a> PetscReal np,s_prod;
43
<a name="line35"> 35: </a> <A href="../../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> X,B,R,Z,U,V,W,UOLD,VOLD,Wbar;
44
<a name="line36"> 36: </a> <A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> Amat,Pmat;
45
<a name="line37"> 37: </a> <A href="../../../../../docs/manualpages/Mat/MatStructure.html#MatStructure">MatStructure</A> pflag;
46
<a name="line38"> 38: </a> KSP_SYMMLQ *symmlq = (KSP_SYMMLQ*)ksp->data;
47
<a name="line39"> 39: </a> <A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> diagonalscale;
49
<a name="line42"> 42: </a> ierr = <A href="../../../../../docs/manualpages/PC/PCDiagonalScale.html#PCDiagonalScale">PCDiagonalScale</A>(ksp->B,&diagonalscale);
50
<a name="line43"> 43: </a> <font color="#4169E1">if</font> (diagonalscale) <A href="../../../../../docs/manualpages/Sys/SETERRQ1.html#SETERRQ1">SETERRQ1</A>(1,<font color="#666666">"Krylov method %s does not support diagonal scaling"</font>,ksp->type_name);
52
<a name="line45"> 45: </a> maxit = ksp->max_it;
53
<a name="line46"> 46: </a> X = ksp->vec_sol;
54
<a name="line47"> 47: </a> B = ksp->vec_rhs;
55
<a name="line48"> 48: </a> R = ksp->work[0];
56
<a name="line49"> 49: </a> Z = ksp->work[1];
57
<a name="line50"> 50: </a> U = ksp->work[2];
58
<a name="line51"> 51: </a> V = ksp->work[3];
59
<a name="line52"> 52: </a> W = ksp->work[4];
60
<a name="line53"> 53: </a> UOLD = ksp->work[5];
61
<a name="line54"> 54: </a> VOLD = ksp->work[6];
62
<a name="line55"> 55: </a> Wbar = ksp->work[7];
63
<a name="line56"> 56: </a>
64
<a name="line57"> 57: </a> <A href="../../../../../docs/manualpages/PC/PCGetOperators.html#PCGetOperators">PCGetOperators</A>(ksp->B,&Amat,&Pmat,&pflag);
66
<a name="line59"> 59: </a> ksp->its = 0;
68
<a name="line61"> 61: </a> <A href="../../../../../docs/manualpages/Vec/VecSet.html#VecSet">VecSet</A>(&zero,UOLD); <font color="#B22222">/* u_old <- zeros; */</font>
69
<a name="line62"> 62: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(UOLD,VOLD); <font color="#B22222">/* v_old <- u_old; */</font>
70
<a name="line63"> 63: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(UOLD,W); <font color="#B22222">/* w <- u_old; */</font>
71
<a name="line64"> 64: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(UOLD,Wbar); <font color="#B22222">/* w_bar <- u_old; */</font>
72
<a name="line65"> 65: </a> <font color="#4169E1">if</font> (!ksp->guess_zero) {
73
<a name="line66"> 66: </a> KSP_MatMult(ksp,Amat,X,R); <font color="#B22222">/* r <- b - A*x */</font>
74
<a name="line67"> 67: </a> <A href="../../../../../docs/manualpages/Vec/VecAYPX.html#VecAYPX">VecAYPX</A>(&mone,B,R);
75
<a name="line68"> 68: </a> } <font color="#4169E1">else</font> {
76
<a name="line69"> 69: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(B,R); <font color="#B22222">/* r <- b (x is 0) */</font>
77
<a name="line70"> 70: </a> }
79
<a name="line72"> 72: </a> KSP_PCApply(ksp,ksp->B,R,Z); <font color="#B22222">/* z <- B*r */</font>
80
<a name="line73"> 73: </a> <A href="../../../../../docs/manualpages/Vec/VecDot.html#VecDot">VecDot</A>(R,Z,&dp); <font color="#B22222">/* dp = r'*z; */</font>
81
<a name="line74"> 74: </a> <font color="#4169E1">if</font> (PetscAbsScalar(dp) < symmlq->haptol) {
82
<a name="line75"> 75: </a> <A href="../../../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(ksp,<font color="#666666">"KSPSolve_SYMMLQ:Detected happy breakdown %g tolerance %gn"</font>,PetscAbsScalar(dp),symmlq->haptol);
83
<a name="line76"> 76: </a> dp = 0.0;
84
<a name="line77"> 77: </a> }
86
<a name="line79"> 79: </a><font color="#A020F0">#if !defined(PETSC_USE_COMPLEX)</font>
87
<a name="line80"> 80: </a> <font color="#4169E1">if</font> (dp < 0.0) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(PETSC_ERR_KSP_BRKDWN,<font color="#666666">"Indefinite preconditioner"</font>);
88
<a name="line81"> 81: </a><font color="#A020F0">#endif</font>
89
<a name="line82"> 82: </a> dp = PetscSqrtScalar(dp);
90
<a name="line83"> 83: </a> beta = dp; <font color="#B22222">/* beta <- sqrt(r'*z) */</font>
91
<a name="line84"> 84: </a> beta1 = beta;
92
<a name="line85"> 85: </a> s_prod = PetscAbsScalar(beta1);
94
<a name="line87"> 87: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(R,V); <font color="#B22222">/* v <- r; */</font>
95
<a name="line88"> 88: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(Z,U); <font color="#B22222">/* u <- z; */</font>
96
<a name="line89"> 89: </a> ibeta = 1.0 / beta;
97
<a name="line90"> 90: </a> <A href="../../../../../docs/manualpages/Vec/VecScale.html#VecScale">VecScale</A>(&ibeta,V); <font color="#B22222">/* v <- ibeta*v; */</font>
98
<a name="line91"> 91: </a> <A href="../../../../../docs/manualpages/Vec/VecScale.html#VecScale">VecScale</A>(&ibeta,U); <font color="#B22222">/* u <- ibeta*u; */</font>
99
<a name="line92"> 92: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(U,Wbar); <font color="#B22222">/* w_bar <- u; */</font>
100
<a name="line93"> 93: </a> <A href="../../../../../docs/manualpages/Vec/VecNorm.html#VecNorm">VecNorm</A>(Z,NORM_2,&np); <font color="#B22222">/* np <- ||z|| */</font>
101
<a name="line94"> 94: </a> (*ksp->converged)(ksp,0,np,&ksp->reason,ksp->cnvP); <font color="#B22222">/* test for convergence */</font>
102
<a name="line95"> 95: </a> <font color="#4169E1">if</font> (ksp->reason) {*its = 0; <font color="#4169E1">return</font>(0);}
103
<a name="line96"> 96: </a> KSPLogResidualHistory(ksp,np);
104
<a name="line97"> 97: </a> KSPMonitor(ksp,0,np); <font color="#B22222">/* call any registered monitor routines */</font>
105
<a name="line98"> 98: </a> ksp->rnorm = np;
107
<a name="line100">100: </a> <font color="#4169E1">for</font> (i=0; i<maxit; i++){
108
<a name="line101">101: </a> ksp->its = i+1;
110
<a name="line103">103: </a> <font color="#B22222">/* Update */</font>
111
<a name="line104">104: </a> <font color="#4169E1">if</font> (ksp->its > 1){
112
<a name="line105">105: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(V,VOLD); <font color="#B22222">/* v_old <- v; */</font>
113
<a name="line106">106: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(U,UOLD); <font color="#B22222">/* u_old <- u; */</font>
114
<a name="line107">107: </a>
115
<a name="line108">108: </a> ibeta = 1.0 / beta;
116
<a name="line109">109: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(R,V);
117
<a name="line110">110: </a> <A href="../../../../../docs/manualpages/Vec/VecScale.html#VecScale">VecScale</A>(&ibeta,V); <font color="#B22222">/* v <- ibeta*r; */</font>
118
<a name="line111">111: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(Z,U);
119
<a name="line112">112: </a> <A href="../../../../../docs/manualpages/Vec/VecScale.html#VecScale">VecScale</A>(&ibeta,U); <font color="#B22222">/* u <- ibeta*z; */</font>
121
<a name="line114">114: </a> <A href="../../../../../docs/manualpages/Vec/VecCopy.html#VecCopy">VecCopy</A>(Wbar,W);
122
<a name="line115">115: </a> <A href="../../../../../docs/manualpages/Vec/VecScale.html#VecScale">VecScale</A>(&c,W);
123
<a name="line116">116: </a> <A href="../../../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&s,U,W); <font color="#B22222">/* w <- c*w_bar + s*u; (w_k) */</font>
124
<a name="line117">117: </a> ms = -s;
125
<a name="line118">118: </a> <A href="../../../../../docs/manualpages/Vec/VecScale.html#VecScale">VecScale</A>(&ms,Wbar);
126
<a name="line119">119: </a> <A href="../../../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&c,U,Wbar); <font color="#B22222">/* w_bar <- -s*w_bar + c*u; (w_bar_(k+1)) */</font>
127
<a name="line120">120: </a> <A href="../../../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&ceta,W,X); <font color="#B22222">/* x <- x + ceta * w; (xL_k) */</font>
129
<a name="line122">122: </a> ceta_oold = ceta_old;
130
<a name="line123">123: </a> ceta_old = ceta;
131
<a name="line124">124: </a> }
133
<a name="line126">126: </a> <font color="#B22222">/* Lanczos */</font>
134
<a name="line127">127: </a> KSP_MatMult(ksp,Amat,U,R); <font color="#B22222">/* r <- Amat*u; */</font>
135
<a name="line128">128: </a> <A href="../../../../../docs/manualpages/Vec/VecDot.html#VecDot">VecDot</A>(U,R,&alpha); <font color="#B22222">/* alpha <- u'*r; */</font>
136
<a name="line129">129: </a> KSP_PCApply(ksp,ksp->B,R,Z); <font color="#B22222">/* z <- B*r; */</font>
138
<a name="line131">131: </a> malpha = - alpha;
139
<a name="line132">132: </a> <A href="../../../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&malpha,V,R); <font color="#B22222">/* r <- r - alpha* v; */</font>
140
<a name="line133">133: </a> <A href="../../../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&malpha,U,Z); <font color="#B22222">/* z <- z - alpha* u; */</font>
141
<a name="line134">134: </a> mbeta = - beta;
142
<a name="line135">135: </a> <A href="../../../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&mbeta,VOLD,R); <font color="#B22222">/* r <- r - beta * v_old; */</font>
143
<a name="line136">136: </a> <A href="../../../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&mbeta,UOLD,Z); <font color="#B22222">/* z <- z - beta * u_old; */</font>
144
<a name="line137">137: </a> betaold = beta; <font color="#B22222">/* beta_k */</font>
145
<a name="line138">138: </a> <A href="../../../../../docs/manualpages/Vec/VecDot.html#VecDot">VecDot</A>(R,Z,&dp); <font color="#B22222">/* dp <- r'*z; */</font>
146
<a name="line139">139: </a> <font color="#4169E1">if</font> (PetscAbsScalar(dp) < symmlq->haptol) {
147
<a name="line140">140: </a> <A href="../../../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(ksp,<font color="#666666">"KSPSolve_SYMMLQ:Detected happy breakdown %g tolerance %gn"</font>,PetscAbsScalar(dp),symmlq->haptol);
148
<a name="line141">141: </a> dp = 0.0;
149
<a name="line142">142: </a> }
151
<a name="line144">144: </a><font color="#A020F0">#if !defined(PETSC_USE_COMPLEX)</font>
152
<a name="line145">145: </a> <font color="#4169E1">if</font> (dp < 0.0) <A href="../../../../../docs/manualpages/Sys/SETERRQ.html#SETERRQ">SETERRQ</A>(PETSC_ERR_KSP_BRKDWN,<font color="#666666">"Indefinite preconditioner"</font>);
153
<a name="line146">146: </a><font color="#A020F0">#endif</font>
154
<a name="line147">147: </a> beta = PetscSqrtScalar(dp); <font color="#B22222">/* beta = sqrt(dp); */</font>
156
<a name="line149">149: </a> <font color="#B22222">/* QR factorization */</font>
157
<a name="line150">150: </a> coold = cold; cold = c; soold = sold; sold = s;
158
<a name="line151">151: </a> rho0 = cold * alpha - coold * sold * betaold; <font color="#B22222">/* gamma_bar */</font>
159
<a name="line152">152: </a> rho1 = PetscSqrtScalar(rho0*rho0 + beta*beta); <font color="#B22222">/* gamma */</font>
160
<a name="line153">153: </a> rho2 = sold * alpha + coold * cold * betaold; <font color="#B22222">/* delta */</font>
161
<a name="line154">154: </a> rho3 = soold * betaold; <font color="#B22222">/* epsilon */</font>
163
<a name="line156">156: </a> <font color="#B22222">/* Givens rotation: [c -s; s c] (different from the Reference!) */</font>
164
<a name="line157">157: </a> c = rho0 / rho1; s = beta / rho1;
166
<a name="line159">159: </a> <font color="#4169E1">if</font> (ksp->its==1){
167
<a name="line160">160: </a> ceta = beta1/rho1;
168
<a name="line161">161: </a> } <font color="#4169E1">else</font> {
169
<a name="line162">162: </a> ceta = -(rho2*ceta_old + rho3*ceta_oold)/rho1;
170
<a name="line163">163: </a> }
171
<a name="line164">164: </a>
172
<a name="line165">165: </a> s_prod = s_prod*PetscAbsScalar(s);
173
<a name="line166">166: </a> <font color="#4169E1">if</font> (c == 0.0){
174
<a name="line167">167: </a> np = s_prod*1.e16;
175
<a name="line168">168: </a> } <font color="#4169E1">else</font> {
176
<a name="line169">169: </a> np = s_prod/PetscAbsScalar(c); <font color="#B22222">/* residual norm for xc_k (CGNORM) */</font>
177
<a name="line170">170: </a> }
178
<a name="line171">171: </a> ksp->rnorm = np;
179
<a name="line172">172: </a> KSPLogResidualHistory(ksp,np);
180
<a name="line173">173: </a> KSPMonitor(ksp,i+1,np);
181
<a name="line174">174: </a> (*ksp->converged)(ksp,i+1,np,&ksp->reason,ksp->cnvP); <font color="#B22222">/* test for convergence */</font>
182
<a name="line175">175: </a> <font color="#4169E1">if</font> (ksp->reason) <font color="#4169E1">break</font>;
183
<a name="line176">176: </a> }
185
<a name="line178">178: </a> <font color="#B22222">/* move to the CG point: xc_(k+1) */</font>
186
<a name="line179">179: </a> <font color="#4169E1">if</font> (c == 0.0){
187
<a name="line180">180: </a> ceta_bar = ceta*1.e15;
188
<a name="line181">181: </a> } <font color="#4169E1">else</font> {
189
<a name="line182">182: </a> ceta_bar = ceta/c;
190
<a name="line183">183: </a> }
191
<a name="line184">184: </a> <A href="../../../../../docs/manualpages/Vec/VecAXPY.html#VecAXPY">VecAXPY</A>(&ceta_bar,Wbar,X); <font color="#B22222">/* x <- x + ceta_bar*w_bar */</font>
193
<a name="line186">186: </a> <font color="#4169E1">if</font> (i == maxit) {
194
<a name="line187">187: </a> ksp->reason = KSP_DIVERGED_ITS;
195
<a name="line188">188: </a> }
196
<a name="line189">189: </a> *its = ksp->its;
198
<a name="line191">191: </a> <font color="#4169E1">return</font>(0);
199
<a name="line192">192: </a>}
201
<a name="line194">194: </a><strong><font color="#4169E1"><a name="KSPCreate_SYMMLQ"></a>EXTERN_C_BEGIN</font></strong>
202
<a name="line195">195: </a><strong><font color="#4169E1">int KSPCreate_SYMMLQ(<A href="../../../../../docs/manualpages/KSP/KSP.html#KSP">KSP</A> ksp)</font></strong>
203
<a name="line196">196: </a>{
204
<a name="line197">197: </a> KSP_SYMMLQ *symmlq;
207
<a name="line202">202: </a> ksp->pc_side = PC_LEFT;
209
<a name="line204">204: </a> ierr = <A href="../../../../../docs/manualpages/Sys/PetscNew.html#PetscNew">PetscNew</A>(KSP_SYMMLQ,&symmlq);
210
<a name="line205">205: </a> symmlq->haptol = 1.e-18;
211
<a name="line206">206: </a> ksp->data = (void*)symmlq;
213
<a name="line208">208: </a> <font color="#B22222">/*</font>
214
<a name="line209">209: </a><font color="#B22222"> Sets the functions that are associated with this data structure </font>
215
<a name="line210">210: </a><font color="#B22222"> (in C++ this is the same as defining virtual functions)</font>
216
<a name="line211">211: </a><font color="#B22222"> */</font>
217
<a name="line212">212: </a> ksp->ops->setup = KSPSetUp_SYMMLQ;
218
<a name="line213">213: </a> ksp->ops->solve = KSPSolve_SYMMLQ;
219
<a name="line214">214: </a> ksp->ops->destroy = KSPDefaultDestroy;
220
<a name="line215">215: </a> ksp->ops->setfromoptions = 0;
221
<a name="line216">216: </a> ksp->ops->buildsolution = KSPDefaultBuildSolution;
222
<a name="line217">217: </a> ksp->ops->buildresidual = KSPDefaultBuildResidual;
224
<a name="line219">219: </a> <font color="#4169E1">return</font>(0);
225
<a name="line220">220: </a>}
226
<a name="line221">221: </a>EXTERN_C_END