/home/kcamus/qaas_runs/169-443-9681/intel/AMG/build/AMG/AMG/parcsr_ls/ams.c: 63 - 331
--------------------------------------------------------------------------------

63: {
64:    HYPRE_Int sweep;
65: 
66:    HYPRE_Real *u_data = hypre_VectorData(hypre_ParVectorLocalVector(u));
67:    HYPRE_Real *f_data = hypre_VectorData(hypre_ParVectorLocalVector(f));
68:    HYPRE_Real *v_data = hypre_VectorData(hypre_ParVectorLocalVector(v));
69: 
70:    for (sweep = 0; sweep < relax_times; sweep++)
71:    {
72:       if (relax_type == 1) /* l1-scaled Jacobi */
73:       {
74: 	 HYPRE_Int i, num_rows = hypre_ParCSRMatrixNumRows(A);
75:          hypre_ParVectorCopy(f,v);
76:          hypre_ParCSRMatrixMatvec(-relax_weight, A, u, relax_weight, v);
77:          /* u += w D^{-1}(f - A u), where D_ii = ||A(i,:)||_1 */
78:          for (i = 0; i < num_rows; i++)
79:             u_data[i] += v_data[i] / l1_norms[i];
80:       }
81:       else if (relax_type == 2 || relax_type == 4) /* offd-l1-scaled block GS */
82:       {
83:          hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A);
84:          HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag);
85:          HYPRE_Int *A_diag_I = hypre_CSRMatrixI(A_diag);
86:          HYPRE_Int *A_diag_J = hypre_CSRMatrixJ(A_diag);
87: 
88:          hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A);
89:          HYPRE_Int *A_offd_I = hypre_CSRMatrixI(A_offd);
90:          HYPRE_Int *A_offd_J = hypre_CSRMatrixJ(A_offd);
91:          HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd);
92: 
93:          HYPRE_Int i, j;
94:          HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag);
95:          HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd);
96:          HYPRE_Real *u_offd_data = hypre_TAlloc(HYPRE_Real,num_cols_offd);
97: 
98:          HYPRE_Real res;
99: 
100:          HYPRE_Int num_procs;
101:          hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &num_procs);
102: 
103:          /* Copy off-diagonal values of u to the current processor */
104:          if (num_procs > 1)
105:          {
106:             hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A);
107:             HYPRE_Int num_sends;
108:             HYPRE_Real *u_buf_data;
109:             hypre_ParCSRCommHandle *comm_handle;
110: 
111:             HYPRE_Int index = 0, start;
112: 
113:             if (!comm_pkg)
114:             {
115:                hypre_MatvecCommPkgCreate(A);
116:                comm_pkg = hypre_ParCSRMatrixCommPkg(A);
117:             }
118: 
119:             num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg);
120:             u_buf_data = hypre_TAlloc(HYPRE_Real,
121:                                       hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends));
122: 
123:             for (i = 0; i < num_sends; i++)
124:             {
125:                start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i);
126:                for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg,i+1); j++)
127:                   u_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)];
128:             }
129:             comm_handle = hypre_ParCSRCommHandleCreate(1,comm_pkg,u_buf_data,u_offd_data);
130:             hypre_ParCSRCommHandleDestroy(comm_handle);
131: 
132:             hypre_TFree(u_buf_data);
133:          }
134: 
135:          if (relax_weight == 1.0 && omega == 1.0) /* symmetric Gauss-Seidel */
136:          {
137:             /* Forward local pass */
138:             for (i = 0; i < num_rows; i++)
139:             {
140:                res = f_data[i];
141:                for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
142:                   res -= A_diag_data[j] * u_data[A_diag_J[j]];
143:                if (num_cols_offd)
144:                   for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++)
145:                      res -= A_offd_data[j] * u_offd_data[A_offd_J[j]];
146:                u_data[i] += res / l1_norms[i];
147:             }
148:             /* Backward local pass */
149:             for (i = num_rows-1; i > -1; i--)
150:             {
151:                res = f_data[i];
152:                for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
153:                   res -= A_diag_data[j] * u_data[A_diag_J[j]];
154:                if (num_cols_offd)
155:                   for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++)
156:                      res -= A_offd_data[j] * u_offd_data[A_offd_J[j]];
157:                u_data[i] += res / l1_norms[i];
158:             }
159:          }
160:          else if (relax_weight == 1.0) /* SSOR */
161:          {
162:             /* Forward local pass */
163:             for (i = 0; i < num_rows; i++)
164:             {
165:                res = f_data[i];
166:                for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
167:                   res -= A_diag_data[j] * u_data[A_diag_J[j]];
168:                if (num_cols_offd)
169:                   for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++)
170:                      res -= A_offd_data[j] * u_offd_data[A_offd_J[j]];
171:                u_data[i] += omega * res / l1_norms[i];
172:             }
173:             /* Backward local pass */
174:             for (i = num_rows-1; i > -1; i--)
175:             {
176:                res = f_data[i];
177:                for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
178:                   res -= A_diag_data[j] * u_data[A_diag_J[j]];
179:                if (num_cols_offd)
180:                   for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++)
181:                      res -= A_offd_data[j] * u_offd_data[A_offd_J[j]];
182:                u_data[i] += omega * res / l1_norms[i];
[...]
188:             HYPRE_Real c1 = omega * relax_weight;
189:             HYPRE_Real c2 = omega * (1.0 - relax_weight);
190: 
191:             /* Forward local pass (save initial guess in v_data) */
192:             for (i = 0; i < num_rows; i++)
193:             {
194:                dif = 0.0;
195:                v_data[i] = u_data[i];
196:                res = f_data[i];
197:                for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
198:                {
199:                   res -= A_diag_data[j] * u_data[A_diag_J[j]];
200:                   if (A_diag_J[j] < i)
201:                      dif += A_diag_data[j] * (v_data[A_diag_J[j]] - u_data[A_diag_J[j]]);
202:                }
203:                if (num_cols_offd)
204:                   for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++)
205:                      res -= A_offd_data[j] * u_offd_data[A_offd_J[j]];
206:                u_data[i] += (c1 * res + c2 * dif) / l1_norms[i];
207:             }
208:             /* Backward local pass */
209:             for (i = num_rows-1; i > -1; i--)
210:             {
211:                dif = 0.0;
212:                res = f_data[i];
213:                for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
214:                {
215:                   res -= A_diag_data[j] * u_data[A_diag_J[j]];
216:                   if (A_diag_J[j] > i)
217:                      dif += A_diag_data[j] * (v_data[A_diag_J[j]] - u_data[A_diag_J[j]]);
218:                }
219:                if (num_cols_offd)
220:                   for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++)
221:                      res -= A_offd_data[j] * u_offd_data[A_offd_J[j]];
222:                u_data[i] += (c1 * res + c2 * dif) / l1_norms[i];
223:             }
224:          }
225: 
226:          hypre_TFree(u_offd_data);
227:       }
228:       else if (relax_type == 3) /* Kaczmarz */
229:       {
230:          hypre_CSRMatrix *A_diag = hypre_ParCSRMatrixDiag(A);
231:          HYPRE_Real *A_diag_data = hypre_CSRMatrixData(A_diag);
232:          HYPRE_Int *A_diag_I = hypre_CSRMatrixI(A_diag);
233:          HYPRE_Int *A_diag_J = hypre_CSRMatrixJ(A_diag);
234: 
235:          hypre_CSRMatrix *A_offd = hypre_ParCSRMatrixOffd(A);
236:          HYPRE_Int *A_offd_I = hypre_CSRMatrixI(A_offd);
237:          HYPRE_Int *A_offd_J = hypre_CSRMatrixJ(A_offd);
238:          HYPRE_Real *A_offd_data = hypre_CSRMatrixData(A_offd);
239: 
240:          HYPRE_Int i, j;
241:          HYPRE_Int num_rows = hypre_CSRMatrixNumRows(A_diag);
242:          HYPRE_Int num_cols_offd = hypre_CSRMatrixNumCols(A_offd);
243:          HYPRE_Real *u_offd_data = hypre_TAlloc(HYPRE_Real,num_cols_offd);
244: 
245:          HYPRE_Real res;
246: 
247:          HYPRE_Int num_procs;
248:          hypre_MPI_Comm_size(hypre_ParCSRMatrixComm(A), &num_procs);
249: 
250:          /* Copy off-diagonal values of u to the current processor */
251:          if (num_procs > 1)
252:          {
253:             hypre_ParCSRCommPkg *comm_pkg = hypre_ParCSRMatrixCommPkg(A);
254:             HYPRE_Int num_sends;
255:             HYPRE_Real *u_buf_data;
256:             hypre_ParCSRCommHandle *comm_handle;
257: 
258:             HYPRE_Int index = 0, start;
259: 
260:             if (!comm_pkg)
261:             {
262:                hypre_MatvecCommPkgCreate(A);
263:                comm_pkg = hypre_ParCSRMatrixCommPkg(A);
264:             }
265: 
266:             num_sends = hypre_ParCSRCommPkgNumSends(comm_pkg);
267:             u_buf_data = hypre_TAlloc(HYPRE_Real,
268:                                       hypre_ParCSRCommPkgSendMapStart(comm_pkg, num_sends));
269: 
270:             for (i = 0; i < num_sends; i++)
271:             {
272:                start = hypre_ParCSRCommPkgSendMapStart(comm_pkg, i);
273:                for (j = start; j < hypre_ParCSRCommPkgSendMapStart(comm_pkg,i+1); j++)
274:                   u_buf_data[index++] = u_data[hypre_ParCSRCommPkgSendMapElmt(comm_pkg,j)];
275:             }
276:             comm_handle = hypre_ParCSRCommHandleCreate(1,comm_pkg,u_buf_data,u_offd_data);
277:             hypre_ParCSRCommHandleDestroy(comm_handle);
278: 
279:             hypre_TFree(u_buf_data);
280:          }
281: 
282:          /* Forward local pass */
283:          for (i = 0; i < num_rows; i++)
284:          {
285:             res = f_data[i];
286:             for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
287:                res -= A_diag_data[j] * u_data[A_diag_J[j]];
288:             if (num_cols_offd)
289:                for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++)
290:                   res -= A_offd_data[j] * u_offd_data[A_offd_J[j]];
291:             res /= l1_norms[i];
292:             for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
293:                u_data[A_diag_J[j]] += omega * res * A_diag_data[j];
294:          }
295: 
296:          /* Backward local pass */
297:          for (i = num_rows-1; i > -1; i--)
298:          {
299:             res = f_data[i];
300:             for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
301:                res -= A_diag_data[j] * u_data[A_diag_J[j]];
302:             if (num_cols_offd)
303:                for (j = A_offd_I[i]; j < A_offd_I[i+1]; j++)
304:                   res -= A_offd_data[j] * u_offd_data[A_offd_J[j]];
305:             res /= l1_norms[i];
306:             for (j = A_diag_I[i]; j < A_diag_I[i+1]; j++)
307:                u_data[A_diag_J[j]] += omega * res * A_diag_data[j];
308:          }
309: 
310:          hypre_TFree(u_offd_data);
[...]
316:             hypre_ParCSRRelax_Cheby(A,
[...]
326:             hypre_BoomerAMGRelax(A, f, NULL, hypre_abs(relax_type), 0, relax_weight,
327:                                  omega, l1_norms, u, v, z);
328:       }
329:    }
330:    return hypre_error_flag;
331: }
