~ubuntu-branches/ubuntu/warty/petsc/warty

« back to all changes in this revision

Viewing changes to src/sles/pc/impls/jacobi/jacobi.c.html

  • Committer: Bazaar Package Importer
  • Author(s): Adam C. Powell, IV
  • Date: 2004-06-07 13:41:43 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040607134143-92p586zrauvie0le
Tags: 2.2.0-2
* Upstream patch level 2.
* New PETSC_BOPT_EXTRA option for different BOPT and lib names, with _c++
  symlinks only for plain and single (closes: #249617).
* New DEBIAN_DIST=contrib option to link with hypre, parmetis (closes:
  #249619).
* Combined petsc-c and petsc-fortran substvars into petsc-compilers.
* Extra quote in -dev prerm eliminates "too many arguments" problem.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<center><a href="jacobi.c">Actual source code: jacobi.c</a></center><br>
2
 
 
3
 
<html>
4
 
<head>
5
 
<title></title>
6
 
<meta name="generator" content="c2html 0.9.1">
7
 
<meta name="date" content="2002-05-31T16:21:49+00:00">
8
 
</head>
9
 
 
10
 
<body bgcolor="#FFFFFF">
11
 
<pre width="80"><a name="line1">  1: </a><font color="#B22222">/*$Id: jacobi.c,v 1.75 2001/08/07 03:03:32 balay Exp $*/</font>
12
 
 
13
 
<a name="line3">  3: </a><font color="#B22222">/*  -------------------------------------------------------------------- </font>
14
 
 
15
 
<a name="line5">  5: </a><font color="#B22222">     This file implements a Jacobi preconditioner for matrices that use</font>
16
 
<a name="line6">  6: </a><font color="#B22222">     the <A href="../../../../../docs/manualpages/Mat/Mat.html#Mat">Mat</A> interface (various matrix formats).  Actually, the only</font>
17
 
<a name="line7">  7: </a><font color="#B22222">     matrix operation used here is <A href="../../../../../docs/manualpages/Mat/MatGetDiagonal.html#MatGetDiagonal">MatGetDiagonal</A>(), which extracts </font>
18
 
<a name="line8">  8: </a><font color="#B22222">     diagonal elements of the preconditioning matrix.</font>
19
 
 
20
 
<a name="line10"> 10: </a><font color="#B22222">     The following basic routines are required for each preconditioner.</font>
21
 
<a name="line11"> 11: </a><font color="#B22222">          PCCreate_XXX()          - Creates a preconditioner context</font>
22
 
<a name="line12"> 12: </a><font color="#B22222">          PCSetFromOptions_XXX()  - Sets runtime options</font>
23
 
<a name="line13"> 13: </a><font color="#B22222">          PCApply_XXX()           - Applies the preconditioner</font>
24
 
<a name="line14"> 14: </a><font color="#B22222">          PCDestroy_XXX()         - Destroys the preconditioner context</font>
25
 
<a name="line15"> 15: </a><font color="#B22222">     where the suffix "_XXX" denotes a particular implementation, in</font>
26
 
<a name="line16"> 16: </a><font color="#B22222">     this case we use _Jacobi (e.g., PCCreate_Jacobi, PCApply_Jacobi).</font>
27
 
<a name="line17"> 17: </a><font color="#B22222">     These routines are actually called via the common user interface</font>
28
 
<a name="line18"> 18: </a><font color="#B22222">     routines <A href="../../../../../docs/manualpages/PC/PCCreate.html#PCCreate">PCCreate</A>(), <A href="../../../../../docs/manualpages/PC/PCSetFromOptions.html#PCSetFromOptions">PCSetFromOptions</A>(), <A href="../../../../../docs/manualpages/PC/PCApply.html#PCApply">PCApply</A>(), and <A href="../../../../../docs/manualpages/PC/PCDestroy.html#PCDestroy">PCDestroy</A>(), </font>
29
 
<a name="line19"> 19: </a><font color="#B22222">     so the application code interface remains identical for all </font>
30
 
<a name="line20"> 20: </a><font color="#B22222">     preconditioners.  </font>
31
 
 
32
 
<a name="line22"> 22: </a><font color="#B22222">     Another key routine is:</font>
33
 
<a name="line23"> 23: </a><font color="#B22222">          PCSetUp_XXX()           - Prepares for the use of a preconditioner</font>
34
 
<a name="line24"> 24: </a><font color="#B22222">     by setting data structures and options.   The interface routine <A href="../../../../../docs/manualpages/PC/PCSetUp.html#PCSetUp">PCSetUp</A>()</font>
35
 
<a name="line25"> 25: </a><font color="#B22222">     is not usually called directly by the user, but instead is called by</font>
36
 
<a name="line26"> 26: </a><font color="#B22222">     <A href="../../../../../docs/manualpages/PC/PCApply.html#PCApply">PCApply</A>() if necessary.</font>
37
 
 
38
 
<a name="line28"> 28: </a><font color="#B22222">     Additional basic routines are:</font>
39
 
<a name="line29"> 29: </a><font color="#B22222">          PCView_XXX()            - Prints details of runtime options that</font>
40
 
<a name="line30"> 30: </a><font color="#B22222">                                    have actually been used.</font>
41
 
<a name="line31"> 31: </a><font color="#B22222">     These are called by application codes via the interface routines</font>
42
 
<a name="line32"> 32: </a><font color="#B22222">     <A href="../../../../../docs/manualpages/PC/PCView.html#PCView">PCView</A>().</font>
43
 
 
44
 
<a name="line34"> 34: </a><font color="#B22222">     The various types of solvers (preconditioners, Krylov subspace methods,</font>
45
 
<a name="line35"> 35: </a><font color="#B22222">     nonlinear solvers, timesteppers) are all organized similarly, so the</font>
46
 
<a name="line36"> 36: </a><font color="#B22222">     above description applies to these categories also.  One exception is</font>
47
 
<a name="line37"> 37: </a><font color="#B22222">     that the analogues of <A href="../../../../../docs/manualpages/PC/PCApply.html#PCApply">PCApply</A>() for these components are <A href="../../../../../docs/manualpages/KSP/KSPSolve.html#KSPSolve">KSPSolve</A>(), </font>
48
 
<a name="line38"> 38: </a><font color="#B22222">     <A href="../../../../../docs/manualpages/SNES/SNESSolve.html#SNESSolve">SNESSolve</A>(), and TSSolve().</font>
49
 
 
50
 
<a name="line40"> 40: </a><font color="#B22222">     Additional optional functionality unique to preconditioners is left and</font>
51
 
<a name="line41"> 41: </a><font color="#B22222">     right symmetric preconditioner application via <A href="../../../../../docs/manualpages/PC/PCApplySymmetricLeft.html#PCApplySymmetricLeft">PCApplySymmetricLeft</A>() </font>
52
 
<a name="line42"> 42: </a><font color="#B22222">     and <A href="../../../../../docs/manualpages/PC/PCApplySymmetricRight.html#PCApplySymmetricRight">PCApplySymmetricRight</A>().  The Jacobi implementation is </font>
53
 
<a name="line43"> 43: </a><font color="#B22222">     PCApplySymmetricLeftOrRight_Jacobi().</font>
54
 
 
55
 
<a name="line45"> 45: </a><font color="#B22222">    -------------------------------------------------------------------- */</font>
56
 
 
57
 
<a name="line47"> 47: </a><font color="#B22222">/* </font>
58
 
<a name="line48"> 48: </a><font color="#B22222">   Include files needed for the Jacobi preconditioner:</font>
59
 
<a name="line49"> 49: </a><font color="#B22222">     pcimpl.h - private include file intended for use by all preconditioners </font>
60
 
<a name="line50"> 50: </a><font color="#B22222">*/</font>
61
 
 
62
 
<a name="line52"> 52: </a> #include <A href="../../../../../src/sles/pc/pcimpl.h.html">src/sles/pc/pcimpl.h</A>
63
 
 
64
 
<a name="line54"> 54: </a><font color="#B22222">/* </font>
65
 
<a name="line55"> 55: </a><font color="#B22222">   Private context (data structure) for the Jacobi preconditioner.  </font>
66
 
<a name="line56"> 56: </a><font color="#B22222">*/</font>
67
 
<a name="line57"> 57: </a><font color="#4169E1">typedef</font> <font color="#4169E1">struct</font> {
68
 
<a name="line58"> 58: </a>  <A href="../../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A>        diag;               <font color="#B22222">/* vector containing the reciprocals of the diagonal elements</font>
69
 
<a name="line59"> 59: </a><font color="#B22222">                                    of the preconditioner matrix */</font>
70
 
<a name="line60"> 60: </a>  <A href="../../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A>        diagsqrt;           <font color="#B22222">/* vector containing the reciprocals of the square roots of</font>
71
 
<a name="line61"> 61: </a><font color="#B22222">                                    the diagonal elements of the preconditioner matrix (used </font>
72
 
<a name="line62"> 62: </a><font color="#B22222">                                    only for symmetric preconditioner application) */</font>
73
 
<a name="line63"> 63: </a>  <A href="../../../../../docs/manualpages/Sys/PetscTruth.html#PetscTruth">PetscTruth</A> userowmax;
74
 
<a name="line64"> 64: </a>} PC_Jacobi;
75
 
 
76
 
<a name="line66"> 66: </a><strong><font color="#4169E1"><a name="PCJacobiSetUseRowMax_Jacobi"></a>EXTERN_C_BEGIN</font></strong>
77
 
<a name="line67"> 67: </a><strong><font color="#4169E1">int PCJacobiSetUseRowMax_Jacobi(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc)</font></strong>
78
 
<a name="line68"> 68: </a>{
79
 
<a name="line69"> 69: </a>  PC_Jacobi *j;
80
 
 
81
 
<a name="line72"> 72: </a>  j            = (PC_Jacobi*)pc-&gt;data;
82
 
<a name="line73"> 73: </a>  j-&gt;userowmax = PETSC_TRUE;
83
 
<a name="line74"> 74: </a>  <font color="#4169E1">return</font>(0);
84
 
<a name="line75"> 75: </a>}
85
 
<a name="line76"> 76: </a>EXTERN_C_END
86
 
 
87
 
<a name="line78"> 78: </a><font color="#B22222">/* -------------------------------------------------------------------------- */</font>
88
 
<a name="line79"> 79: </a><font color="#B22222">/*</font>
89
 
<a name="line80"> 80: </a><font color="#B22222">   PCSetUp_Jacobi - Prepares for the use of the Jacobi preconditioner</font>
90
 
<a name="line81"> 81: </a><font color="#B22222">                    by setting data structures and options.   </font>
91
 
 
92
 
<a name="line83"> 83: </a><font color="#B22222">   Input Parameter:</font>
93
 
<a name="line84"> 84: </a><font color="#B22222">.  pc - the preconditioner context</font>
94
 
 
95
 
<a name="line86"> 86: </a><font color="#B22222">   Application Interface Routine: <A href="../../../../../docs/manualpages/PC/PCSetUp.html#PCSetUp">PCSetUp</A>()</font>
96
 
 
97
 
<a name="line88"> 88: </a><font color="#B22222">   Notes:</font>
98
 
<a name="line89"> 89: </a><font color="#B22222">   The interface routine <A href="../../../../../docs/manualpages/PC/PCSetUp.html#PCSetUp">PCSetUp</A>() is not usually called directly by</font>
99
 
<a name="line90"> 90: </a><font color="#B22222">   the user, but instead is called by <A href="../../../../../docs/manualpages/PC/PCApply.html#PCApply">PCApply</A>() if necessary.</font>
100
 
<a name="line91"> 91: </a><font color="#B22222">*/</font>
101
 
<a name="line92"> 92: </a><strong><font color="#4169E1"><a name="PCSetUp_Jacobi"></a>static int PCSetUp_Jacobi(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc)</font></strong>
102
 
<a name="line93"> 93: </a>{
103
 
<a name="line94"> 94: </a>  PC_Jacobi     *jac = (PC_Jacobi*)pc-&gt;data;
104
 
<a name="line95"> 95: </a>  <A href="../../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A>           diag,diagsqrt;
105
 
<a name="line96"> 96: </a>  int           ierr,n,i,zeroflag=0;
106
 
<a name="line97"> 97: </a>  <A href="../../../../../docs/manualpages/Sys/PetscScalar.html#PetscScalar">PetscScalar</A>   *x;
107
 
 
108
 
 
109
 
<a name="line101">101: </a>  <font color="#B22222">/*</font>
110
 
<a name="line102">102: </a><font color="#B22222">       For most preconditioners the code would begin here something like</font>
111
 
 
112
 
<a name="line104">104: </a><font color="#B22222">  if (pc-&gt;setupcalled == 0) { allocate space the first time this is ever called</font>
113
 
<a name="line105">105: </a><font color="#B22222">    <A href="../../../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(pc-&gt;vec,&amp;jac-&gt;diag);</font>
114
 
<a name="line106">106: </a><font color="#B22222">    PetscLogObjectParent(pc,jac-&gt;diag);</font>
115
 
<a name="line107">107: </a><font color="#B22222">  }</font>
116
 
 
117
 
<a name="line109">109: </a><font color="#B22222">    But for this preconditioner we want to support use of both the matrix' diagonal</font>
118
 
<a name="line110">110: </a><font color="#B22222">    elements (for left or right preconditioning) and square root of diagonal elements</font>
119
 
<a name="line111">111: </a><font color="#B22222">    (for symmetric preconditioning).  Hence we do not allocate space here, since we</font>
120
 
<a name="line112">112: </a><font color="#B22222">    don't know at this point which will be needed (diag and/or diagsqrt) until the user</font>
121
 
<a name="line113">113: </a><font color="#B22222">    applies the preconditioner, and we don't want to allocate BOTH unless we need</font>
122
 
<a name="line114">114: </a><font color="#B22222">    them both.  Thus, the diag and diagsqrt are allocated in PCSetUp_Jacobi_NonSymmetric()</font>
123
 
<a name="line115">115: </a><font color="#B22222">    and PCSetUp_Jacobi_Symmetric(), respectively.</font>
124
 
<a name="line116">116: </a><font color="#B22222">  */</font>
125
 
 
126
 
<a name="line118">118: </a>  <font color="#B22222">/*</font>
127
 
<a name="line119">119: </a><font color="#B22222">    Here we set up the preconditioner; that is, we copy the diagonal values from</font>
128
 
<a name="line120">120: </a><font color="#B22222">    the matrix and put them into a format to make them quick to apply as a preconditioner.</font>
129
 
<a name="line121">121: </a><font color="#B22222">  */</font>
130
 
<a name="line122">122: </a>  diag     = jac-&gt;diag;
131
 
<a name="line123">123: </a>  diagsqrt = jac-&gt;diagsqrt;
132
 
 
133
 
<a name="line125">125: </a>  <font color="#4169E1">if</font> (diag) {
134
 
<a name="line126">126: </a>    <font color="#4169E1">if</font> (jac-&gt;userowmax) {
135
 
<a name="line127">127: </a>      <A href="../../../../../docs/manualpages/Mat/MatGetRowMax.html#MatGetRowMax">MatGetRowMax</A>(pc-&gt;pmat,diag);
136
 
<a name="line128">128: </a>    } <font color="#4169E1">else</font> {
137
 
<a name="line129">129: </a>      <A href="../../../../../docs/manualpages/Mat/MatGetDiagonal.html#MatGetDiagonal">MatGetDiagonal</A>(pc-&gt;pmat,diag);
138
 
<a name="line130">130: </a>    }
139
 
<a name="line131">131: </a>    <A href="../../../../../docs/manualpages/Vec/VecReciprocal.html#VecReciprocal">VecReciprocal</A>(diag);
140
 
<a name="line132">132: </a>    <A href="../../../../../docs/manualpages/Vec/VecGetLocalSize.html#VecGetLocalSize">VecGetLocalSize</A>(diag,&amp;n);
141
 
<a name="line133">133: </a>    <A href="../../../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(diag,&amp;x);
142
 
<a name="line134">134: </a>    <font color="#4169E1">for</font> (i=0; i&lt;n; i++) {
143
 
<a name="line135">135: </a>      <font color="#4169E1">if</font> (x[i] == 0.0) {
144
 
<a name="line136">136: </a>        x[i]     = 1.0;
145
 
<a name="line137">137: </a>        zeroflag = 1;
146
 
<a name="line138">138: </a>      }
147
 
<a name="line139">139: </a>    }
148
 
<a name="line140">140: </a>    <A href="../../../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(diag,&amp;x);
149
 
<a name="line141">141: </a>  }
150
 
<a name="line142">142: </a>  <font color="#4169E1">if</font> (diagsqrt) {
151
 
<a name="line143">143: </a>    <font color="#4169E1">if</font> (jac-&gt;userowmax) {
152
 
<a name="line144">144: </a>      <A href="../../../../../docs/manualpages/Mat/MatGetRowMax.html#MatGetRowMax">MatGetRowMax</A>(pc-&gt;pmat,diagsqrt);
153
 
<a name="line145">145: </a>    } <font color="#4169E1">else</font> {
154
 
<a name="line146">146: </a>      <A href="../../../../../docs/manualpages/Mat/MatGetDiagonal.html#MatGetDiagonal">MatGetDiagonal</A>(pc-&gt;pmat,diagsqrt);
155
 
<a name="line147">147: </a>    }
156
 
<a name="line148">148: </a>    <A href="../../../../../docs/manualpages/Vec/VecGetLocalSize.html#VecGetLocalSize">VecGetLocalSize</A>(diagsqrt,&amp;n);
157
 
<a name="line149">149: </a>    <A href="../../../../../docs/manualpages/Vec/VecGetArray.html#VecGetArray">VecGetArray</A>(diagsqrt,&amp;x);
158
 
<a name="line150">150: </a>    <font color="#4169E1">for</font> (i=0; i&lt;n; i++) {
159
 
<a name="line151">151: </a>      <font color="#4169E1">if</font> (x[i] != 0.0) x[i] = 1.0/sqrt(PetscAbsScalar(x[i]));
160
 
<a name="line152">152: </a>      <font color="#4169E1">else</font> {
161
 
<a name="line153">153: </a>        x[i]     = 1.0;
162
 
<a name="line154">154: </a>        zeroflag = 1;
163
 
<a name="line155">155: </a>      }
164
 
<a name="line156">156: </a>    }
165
 
<a name="line157">157: </a>    <A href="../../../../../docs/manualpages/Vec/VecRestoreArray.html#VecRestoreArray">VecRestoreArray</A>(diagsqrt,&amp;x);
166
 
<a name="line158">158: </a>  }
167
 
<a name="line159">159: </a>  <font color="#4169E1">if</font> (zeroflag) {
168
 
<a name="line160">160: </a>    <A href="../../../../../docs/manualpages/Profiling/PetscLogInfo.html#PetscLogInfo">PetscLogInfo</A>(pc,<font color="#666666">"PCSetUp_Jacobi:Zero detected in diagonal of matrix, using 1 at those locationsn"</font>);
169
 
<a name="line161">161: </a>  }
170
 
 
171
 
<a name="line163">163: </a>  <font color="#4169E1">return</font>(0);
172
 
<a name="line164">164: </a>}
173
 
<a name="line165">165: </a><font color="#B22222">/* -------------------------------------------------------------------------- */</font>
174
 
<a name="line166">166: </a><font color="#B22222">/*</font>
175
 
<a name="line167">167: </a><font color="#B22222">   PCSetUp_Jacobi_Symmetric - Allocates the vector needed to store the</font>
176
 
<a name="line168">168: </a><font color="#B22222">   inverse of the square root of the diagonal entries of the matrix.  This</font>
177
 
<a name="line169">169: </a><font color="#B22222">   is used for symmetric application of the Jacobi preconditioner.</font>
178
 
 
179
 
<a name="line171">171: </a><font color="#B22222">   Input Parameter:</font>
180
 
<a name="line172">172: </a><font color="#B22222">.  pc - the preconditioner context</font>
181
 
<a name="line173">173: </a><font color="#B22222">*/</font>
182
 
<a name="line174">174: </a><strong><font color="#4169E1"><a name="PCSetUp_Jacobi_Symmetric"></a>static int PCSetUp_Jacobi_Symmetric(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc)</font></strong>
183
 
<a name="line175">175: </a>{
184
 
<a name="line176">176: </a>  int        ierr;
185
 
<a name="line177">177: </a>  PC_Jacobi  *jac = (PC_Jacobi*)pc-&gt;data;
186
 
 
187
 
 
188
 
<a name="line181">181: </a>  <A href="../../../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(pc-&gt;vec,&amp;jac-&gt;diagsqrt);
189
 
<a name="line182">182: </a>  PetscLogObjectParent(pc,jac-&gt;diagsqrt);
190
 
<a name="line183">183: </a>  PCSetUp_Jacobi(pc);
191
 
<a name="line184">184: </a>  <font color="#4169E1">return</font>(0);
192
 
<a name="line185">185: </a>}
193
 
<a name="line186">186: </a><font color="#B22222">/* -------------------------------------------------------------------------- */</font>
194
 
<a name="line187">187: </a><font color="#B22222">/*</font>
195
 
<a name="line188">188: </a><font color="#B22222">   PCSetUp_Jacobi_NonSymmetric - Allocates the vector needed to store the</font>
196
 
<a name="line189">189: </a><font color="#B22222">   inverse of the diagonal entries of the matrix.  This is used for left of</font>
197
 
<a name="line190">190: </a><font color="#B22222">   right application of the Jacobi preconditioner.</font>
198
 
 
199
 
<a name="line192">192: </a><font color="#B22222">   Input Parameter:</font>
200
 
<a name="line193">193: </a><font color="#B22222">.  pc - the preconditioner context</font>
201
 
<a name="line194">194: </a><font color="#B22222">*/</font>
202
 
<a name="line195">195: </a><strong><font color="#4169E1"><a name="PCSetUp_Jacobi_NonSymmetric"></a>static int PCSetUp_Jacobi_NonSymmetric(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc)</font></strong>
203
 
<a name="line196">196: </a>{
204
 
<a name="line197">197: </a>  int        ierr;
205
 
<a name="line198">198: </a>  PC_Jacobi  *jac = (PC_Jacobi*)pc-&gt;data;
206
 
 
207
 
 
208
 
<a name="line202">202: </a>  <A href="../../../../../docs/manualpages/Vec/VecDuplicate.html#VecDuplicate">VecDuplicate</A>(pc-&gt;vec,&amp;jac-&gt;diag);
209
 
<a name="line203">203: </a>  PetscLogObjectParent(pc,jac-&gt;diag);
210
 
<a name="line204">204: </a>  PCSetUp_Jacobi(pc);
211
 
<a name="line205">205: </a>  <font color="#4169E1">return</font>(0);
212
 
<a name="line206">206: </a>}
213
 
<a name="line207">207: </a><font color="#B22222">/* -------------------------------------------------------------------------- */</font>
214
 
<a name="line208">208: </a><font color="#B22222">/*</font>
215
 
<a name="line209">209: </a><font color="#B22222">   PCApply_Jacobi - Applies the Jacobi preconditioner to a vector.</font>
216
 
 
217
 
<a name="line211">211: </a><font color="#B22222">   Input Parameters:</font>
218
 
<a name="line212">212: </a><font color="#B22222">.  pc - the preconditioner context</font>
219
 
<a name="line213">213: </a><font color="#B22222">.  x - input vector</font>
220
 
 
221
 
<a name="line215">215: </a><font color="#B22222">   Output Parameter:</font>
222
 
<a name="line216">216: </a><font color="#B22222">.  y - output vector</font>
223
 
 
224
 
<a name="line218">218: </a><font color="#B22222">   Application Interface Routine: <A href="../../../../../docs/manualpages/PC/PCApply.html#PCApply">PCApply</A>()</font>
225
 
<a name="line219">219: </a><font color="#B22222"> */</font>
226
 
<a name="line220">220: </a><strong><font color="#4169E1"><a name="PCApply_Jacobi"></a>static int PCApply_Jacobi(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc,<A href="../../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> x,<A href="../../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> y)</font></strong>
227
 
<a name="line221">221: </a>{
228
 
<a name="line222">222: </a>  PC_Jacobi *jac = (PC_Jacobi*)pc-&gt;data;
229
 
<a name="line223">223: </a>  int       ierr;
230
 
 
231
 
<a name="line226">226: </a>  <font color="#4169E1">if</font> (!jac-&gt;diag) {
232
 
<a name="line227">227: </a>    PCSetUp_Jacobi_NonSymmetric(pc);
233
 
<a name="line228">228: </a>  }
234
 
<a name="line229">229: </a>  <A href="../../../../../docs/manualpages/Vec/VecPointwiseMult.html#VecPointwiseMult">VecPointwiseMult</A>(x,jac-&gt;diag,y);
235
 
<a name="line230">230: </a>  <font color="#4169E1">return</font>(0);
236
 
<a name="line231">231: </a>}
237
 
<a name="line232">232: </a><font color="#B22222">/* -------------------------------------------------------------------------- */</font>
238
 
<a name="line233">233: </a><font color="#B22222">/*</font>
239
 
<a name="line234">234: </a><font color="#B22222">   PCApplySymmetricLeftOrRight_Jacobi - Applies the left or right part of a</font>
240
 
<a name="line235">235: </a><font color="#B22222">   symmetric preconditioner to a vector.</font>
241
 
 
242
 
<a name="line237">237: </a><font color="#B22222">   Input Parameters:</font>
243
 
<a name="line238">238: </a><font color="#B22222">.  pc - the preconditioner context</font>
244
 
<a name="line239">239: </a><font color="#B22222">.  x - input vector</font>
245
 
 
246
 
<a name="line241">241: </a><font color="#B22222">   Output Parameter:</font>
247
 
<a name="line242">242: </a><font color="#B22222">.  y - output vector</font>
248
 
 
249
 
<a name="line244">244: </a><font color="#B22222">   Application Interface Routines: <A href="../../../../../docs/manualpages/PC/PCApplySymmetricLeft.html#PCApplySymmetricLeft">PCApplySymmetricLeft</A>(), <A href="../../../../../docs/manualpages/PC/PCApplySymmetricRight.html#PCApplySymmetricRight">PCApplySymmetricRight</A>()</font>
250
 
<a name="line245">245: </a><font color="#B22222">*/</font>
251
 
<a name="line246">246: </a><strong><font color="#4169E1"><a name="PCApplySymmetricLeftOrRight_Jacobi"></a>static int PCApplySymmetricLeftOrRight_Jacobi(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc,<A href="../../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> x,<A href="../../../../../docs/manualpages/Vec/Vec.html#Vec">Vec</A> y)</font></strong>
252
 
<a name="line247">247: </a>{
253
 
<a name="line248">248: </a>  int       ierr;
254
 
<a name="line249">249: </a>  PC_Jacobi *jac = (PC_Jacobi*)pc-&gt;data;
255
 
 
256
 
<a name="line252">252: </a>  <font color="#4169E1">if</font> (!jac-&gt;diagsqrt) {
257
 
<a name="line253">253: </a>    PCSetUp_Jacobi_Symmetric(pc);
258
 
<a name="line254">254: </a>  }
259
 
<a name="line255">255: </a>  <A href="../../../../../docs/manualpages/Vec/VecPointwiseMult.html#VecPointwiseMult">VecPointwiseMult</A>(x,jac-&gt;diagsqrt,y);
260
 
<a name="line256">256: </a>  <font color="#4169E1">return</font>(0);
261
 
<a name="line257">257: </a>}
262
 
<a name="line258">258: </a><font color="#B22222">/* -------------------------------------------------------------------------- */</font>
263
 
<a name="line259">259: </a><font color="#B22222">/*</font>
264
 
<a name="line260">260: </a><font color="#B22222">   PCDestroy_Jacobi - Destroys the private context for the Jacobi preconditioner</font>
265
 
<a name="line261">261: </a><font color="#B22222">   that was created with PCCreate_Jacobi().</font>
266
 
 
267
 
<a name="line263">263: </a><font color="#B22222">   Input Parameter:</font>
268
 
<a name="line264">264: </a><font color="#B22222">.  pc - the preconditioner context</font>
269
 
 
270
 
<a name="line266">266: </a><font color="#B22222">   Application Interface Routine: <A href="../../../../../docs/manualpages/PC/PCDestroy.html#PCDestroy">PCDestroy</A>()</font>
271
 
<a name="line267">267: </a><font color="#B22222">*/</font>
272
 
<a name="line268">268: </a><strong><font color="#4169E1"><a name="PCDestroy_Jacobi"></a>static int PCDestroy_Jacobi(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc)</font></strong>
273
 
<a name="line269">269: </a>{
274
 
<a name="line270">270: </a>  PC_Jacobi *jac = (PC_Jacobi*)pc-&gt;data;
275
 
<a name="line271">271: </a>  int       ierr;
276
 
 
277
 
<a name="line274">274: </a>  <font color="#4169E1">if</font> (jac-&gt;diag)     {<A href="../../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(jac-&gt;diag);}
278
 
<a name="line275">275: </a>  <font color="#4169E1">if</font> (jac-&gt;diagsqrt) {<A href="../../../../../docs/manualpages/Vec/VecDestroy.html#VecDestroy">VecDestroy</A>(jac-&gt;diagsqrt);}
279
 
 
280
 
<a name="line277">277: </a>  <font color="#B22222">/*</font>
281
 
<a name="line278">278: </a><font color="#B22222">      Free the private data structure that was hanging off the <A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A></font>
282
 
<a name="line279">279: </a><font color="#B22222">  */</font>
283
 
<a name="line280">280: </a>  <A href="../../../../../docs/manualpages/Sys/PetscFree.html#PetscFree">PetscFree</A>(jac);
284
 
<a name="line281">281: </a>  <font color="#4169E1">return</font>(0);
285
 
<a name="line282">282: </a>}
286
 
 
287
 
<a name="line284">284: </a><strong><font color="#4169E1"><a name="PCSetFromOptions_Jacobi"></a>static int PCSetFromOptions_Jacobi(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc)</font></strong>
288
 
<a name="line285">285: </a>{
289
 
<a name="line286">286: </a>  PC_Jacobi  *jac = (PC_Jacobi*)pc-&gt;data;
290
 
<a name="line287">287: </a>  int        ierr;
291
 
 
292
 
<a name="line290">290: </a>  <A href="../../../../../docs/manualpages/Sys/PetscOptionsHead.html#PetscOptionsHead">PetscOptionsHead</A>(<font color="#666666">"Jacobi options"</font>);
293
 
<a name="line291">291: </a>    <A href="../../../../../docs/manualpages/Sys/PetscOptionsLogical.html#PetscOptionsLogical">PetscOptionsLogical</A>(<font color="#666666">"-pc_jacobi_rowmax"</font>,<font color="#666666">"Use row maximums for diagonal"</font>,<font color="#666666">"<A href="../../../../../docs/manualpages/PC/PCJacobiSetUseRowMax.html#PCJacobiSetUseRowMax">PCJacobiSetUseRowMax</A>"</font>,jac-&gt;userowmax,
294
 
<a name="line292">292: </a>                          &amp;jac-&gt;userowmax,PETSC_NULL);
295
 
<a name="line293">293: </a>  <A href="../../../../../docs/manualpages/Sys/PetscOptionsTail.html#PetscOptionsTail">PetscOptionsTail</A>();
296
 
<a name="line294">294: </a>  <font color="#4169E1">return</font>(0);
297
 
<a name="line295">295: </a>}
298
 
 
299
 
<a name="line297">297: </a><font color="#B22222">/* -------------------------------------------------------------------------- */</font>
300
 
<a name="line298">298: </a><font color="#B22222">/*</font>
301
 
<a name="line299">299: </a><font color="#B22222">   PCCreate_Jacobi - Creates a Jacobi preconditioner context, PC_Jacobi, </font>
302
 
<a name="line300">300: </a><font color="#B22222">   and sets this as the private data within the generic preconditioning </font>
303
 
<a name="line301">301: </a><font color="#B22222">   context, <A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A>, that was created within <A href="../../../../../docs/manualpages/PC/PCCreate.html#PCCreate">PCCreate</A>().</font>
304
 
 
305
 
<a name="line303">303: </a><font color="#B22222">   Input Parameter:</font>
306
 
<a name="line304">304: </a><font color="#B22222">.  pc - the preconditioner context</font>
307
 
 
308
 
<a name="line306">306: </a><font color="#B22222">   Application Interface Routine: <A href="../../../../../docs/manualpages/PC/PCCreate.html#PCCreate">PCCreate</A>()</font>
309
 
<a name="line307">307: </a><font color="#B22222">*/</font>
310
 
<a name="line308">308: </a><strong><font color="#4169E1"><a name="PCCreate_Jacobi"></a>EXTERN_C_BEGIN</font></strong>
311
 
<a name="line309">309: </a><strong><font color="#4169E1">int PCCreate_Jacobi(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc)</font></strong>
312
 
<a name="line310">310: </a>{
313
 
<a name="line311">311: </a>  PC_Jacobi *jac;
314
 
<a name="line312">312: </a>  int       ierr;
315
 
 
316
 
 
317
 
<a name="line316">316: </a>  <font color="#B22222">/*</font>
318
 
<a name="line317">317: </a><font color="#B22222">     Creates the private data structure for this preconditioner and</font>
319
 
<a name="line318">318: </a><font color="#B22222">     attach it to the <A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> object.</font>
320
 
<a name="line319">319: </a><font color="#B22222">  */</font>
321
 
<a name="line320">320: </a>  ierr      = <A href="../../../../../docs/manualpages/Sys/PetscNew.html#PetscNew">PetscNew</A>(PC_Jacobi,&amp;jac);
322
 
<a name="line321">321: </a>  pc-&gt;data  = (void*)jac;
323
 
 
324
 
<a name="line323">323: </a>  <font color="#B22222">/*</font>
325
 
<a name="line324">324: </a><font color="#B22222">     Logs the memory usage; this is not needed but allows PETSc to </font>
326
 
<a name="line325">325: </a><font color="#B22222">     monitor how much memory is being used for various purposes.</font>
327
 
<a name="line326">326: </a><font color="#B22222">  */</font>
328
 
<a name="line327">327: </a>  PetscLogObjectMemory(pc,<font color="#4169E1">sizeof</font>(PC_Jacobi));
329
 
 
330
 
<a name="line329">329: </a>  <font color="#B22222">/*</font>
331
 
<a name="line330">330: </a><font color="#B22222">     Initialize the pointers to vectors to ZERO; these will be used to store</font>
332
 
<a name="line331">331: </a><font color="#B22222">     diagonal entries of the matrix for fast preconditioner application.</font>
333
 
<a name="line332">332: </a><font color="#B22222">  */</font>
334
 
<a name="line333">333: </a>  jac-&gt;diag          = 0;
335
 
<a name="line334">334: </a>  jac-&gt;diagsqrt      = 0;
336
 
<a name="line335">335: </a>  jac-&gt;userowmax     = PETSC_FALSE;
337
 
 
338
 
<a name="line337">337: </a>  <font color="#B22222">/*</font>
339
 
<a name="line338">338: </a><font color="#B22222">      Set the pointers for the functions that are provided above.</font>
340
 
<a name="line339">339: </a><font color="#B22222">      Now when the user-level routines (such as <A href="../../../../../docs/manualpages/PC/PCApply.html#PCApply">PCApply</A>(), <A href="../../../../../docs/manualpages/PC/PCDestroy.html#PCDestroy">PCDestroy</A>(), etc.)</font>
341
 
<a name="line340">340: </a><font color="#B22222">      are called, they will automatically call these functions.  Note we</font>
342
 
<a name="line341">341: </a><font color="#B22222">      choose not to provide a couple of these functions since they are</font>
343
 
<a name="line342">342: </a><font color="#B22222">      not needed.</font>
344
 
<a name="line343">343: </a><font color="#B22222">  */</font>
345
 
<a name="line344">344: </a>  pc-&gt;ops-&gt;apply               = PCApply_Jacobi;
346
 
<a name="line345">345: </a>  pc-&gt;ops-&gt;applytranspose      = PCApply_Jacobi;
347
 
<a name="line346">346: </a>  pc-&gt;ops-&gt;setup               = PCSetUp_Jacobi;
348
 
<a name="line347">347: </a>  pc-&gt;ops-&gt;destroy             = PCDestroy_Jacobi;
349
 
<a name="line348">348: </a>  pc-&gt;ops-&gt;setfromoptions      = PCSetFromOptions_Jacobi;
350
 
<a name="line349">349: </a>  pc-&gt;ops-&gt;view                = 0;
351
 
<a name="line350">350: </a>  pc-&gt;ops-&gt;applyrichardson     = 0;
352
 
<a name="line351">351: </a>  pc-&gt;ops-&gt;applysymmetricleft  = PCApplySymmetricLeftOrRight_Jacobi;
353
 
<a name="line352">352: </a>  pc-&gt;ops-&gt;applysymmetricright = PCApplySymmetricLeftOrRight_Jacobi;
354
 
<a name="line353">353: </a>  <A href="../../../../../docs/manualpages/Sys/PetscObjectComposeFunctionDynamic.html#PetscObjectComposeFunctionDynamic">PetscObjectComposeFunctionDynamic</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)pc,<font color="#666666">"PCJacobiSetUseRowMax_C"</font>,<font color="#666666">"PCJacobiSetUseRowMax_Jacobi"</font>,
355
 
<a name="line354">354: </a>                    PCJacobiSetUseRowMax_Jacobi);
356
 
<a name="line355">355: </a>  <font color="#4169E1">return</font>(0);
357
 
<a name="line356">356: </a>}
358
 
<a name="line357">357: </a>EXTERN_C_END
359
 
 
360
 
<a name="line359">359: </a><font color="#B22222">/*@</font>
361
 
<a name="line360">360: </a><font color="#B22222">   <A href="../../../../../docs/manualpages/PC/PCJacobiSetUseRowMax.html#PCJacobiSetUseRowMax">PCJacobiSetUseRowMax</A> - Causes the Jacobi preconditioner to use the </font>
362
 
<a name="line361">361: </a><font color="#B22222">      maximum entry in each row as the diagonal preconditioner, instead of</font>
363
 
<a name="line362">362: </a><font color="#B22222">      the diagonal entry</font>
364
 
 
365
 
<a name="line364">364: </a><font color="#B22222">   Collective on <A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A></font>
366
 
 
367
 
<a name="line366">366: </a><font color="#B22222">   Input Parameters:</font>
368
 
<a name="line367">367: </a><font color="#B22222">.  pc - the preconditioner context</font>
369
 
 
370
 
 
371
 
<a name="line370">370: </a><font color="#B22222">   Options Database Key:</font>
372
 
<a name="line371">371: </a><font color="#B22222">.  -pc_jacobi_rowmax </font>
373
 
 
374
 
<a name="line373">373: </a><font color="#B22222">   Level: intermediate</font>
375
 
 
376
 
<a name="line375">375: </a><font color="#B22222">   Concepts: Jacobi preconditioner</font>
377
 
 
378
 
<a name="line377">377: </a><font color="#B22222">@*/</font>
379
 
<a name="line378">378: </a><strong><font color="#4169E1"><a name="PCJacobiSetUseRowMax"></a>int <A href="../../../../../docs/manualpages/PC/PCJacobiSetUseRowMax.html#PCJacobiSetUseRowMax">PCJacobiSetUseRowMax</A>(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A> pc)</font></strong>
380
 
<a name="line379">379: </a>{
381
 
<a name="line380">380: </a>  int ierr,(*f)(<A href="../../../../../docs/manualpages/PC/PC.html#PC">PC</A>);
382
 
 
383
 
<a name="line384">384: </a>  <A href="../../../../../docs/manualpages/Sys/PetscObjectQueryFunction.html#PetscObjectQueryFunction">PetscObjectQueryFunction</A>((<A href="../../../../../docs/manualpages/Sys/PetscObject.html#PetscObject">PetscObject</A>)pc,<font color="#666666">"PCJacobiSetRowMax_C"</font>,(void (**)(void))&amp;f);
384
 
<a name="line385">385: </a>  <font color="#4169E1">if</font> (f) {
385
 
<a name="line386">386: </a>    (*f)(pc);
386
 
<a name="line387">387: </a>  }
387
 
<a name="line388">388: </a>  <font color="#4169E1">return</font>(0);
388
 
<a name="line389">389: </a>}
389
 
 
390
 
</pre>
391
 
</body>
392
 
 
393
 
</html>