source: CIVL/examples/mpi-omp/AMG2013/parcsr_ls/HYPRE_parcsr_pcg.c

main
Last change on this file was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5704 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 9.0 KB
Line 
1/*BHEADER**********************************************************************
2 * Copyright (c) 2008, Lawrence Livermore National Security, LLC.
3 * Produced at the Lawrence Livermore National Laboratory.
4 * This file is part of HYPRE. See file COPYRIGHT for details.
5 *
6 * HYPRE is free software; you can redistribute it and/or modify it under the
7 * terms of the GNU Lesser General Public License (as published by the Free
8 * Software Foundation) version 2.1 dated February 1999.
9 *
10 * $Revision: 2.4 $
11 ***********************************************************************EHEADER*/
12
13
14
15
16/******************************************************************************
17 *
18 * HYPRE_ParCSRPCG interface
19 *
20 *****************************************************************************/
21#include "headers.h"
22
23/*--------------------------------------------------------------------------
24 * HYPRE_ParCSRPCGCreate
25 *--------------------------------------------------------------------------*/
26
27int
28HYPRE_ParCSRPCGCreate( MPI_Comm comm, HYPRE_Solver *solver )
29{
30 /* The function names with a PCG in them are in
31 parcsr_ls/pcg_par.c . These functions do rather little -
32 e.g., cast to the correct type - before calling something else.
33 These names should be called, e.g., hypre_struct_Free, to reduce the
34 chance of name conflicts. */
35 hypre_PCGFunctions * pcg_functions =
36 hypre_PCGFunctionsCreate(
37 hypre_CAlloc, hypre_ParKrylovFree, hypre_ParKrylovCommInfo,
38 hypre_ParKrylovCreateVector,
39 hypre_ParKrylovDestroyVector, hypre_ParKrylovMatvecCreate,
40 hypre_ParKrylovMatvec, hypre_ParKrylovMatvecDestroy,
41 hypre_ParKrylovInnerProd, hypre_ParKrylovCopyVector,
42 hypre_ParKrylovClearVector,
43 hypre_ParKrylovScaleVector, hypre_ParKrylovAxpy,
44 hypre_ParKrylovIdentitySetup, hypre_ParKrylovIdentity );
45
46 *solver = ( (HYPRE_Solver) hypre_PCGCreate( pcg_functions ) );
47 if (!solver) hypre_error_in_arg(2);
48
49 return hypre_error_flag;
50}
51
52/*--------------------------------------------------------------------------
53 * HYPRE_ParCSRPCGDestroy
54 *--------------------------------------------------------------------------*/
55
56int
57HYPRE_ParCSRPCGDestroy( HYPRE_Solver solver )
58{
59 return( hypre_PCGDestroy( (void *) solver ) );
60}
61
62/*--------------------------------------------------------------------------
63 * HYPRE_ParCSRPCGSetup
64 *--------------------------------------------------------------------------*/
65
66int
67HYPRE_ParCSRPCGSetup( HYPRE_Solver solver,
68 HYPRE_ParCSRMatrix A,
69 HYPRE_ParVector b,
70 HYPRE_ParVector x )
71{
72 return( HYPRE_PCGSetup( solver,
73 (HYPRE_Matrix) A,
74 (HYPRE_Vector) b,
75 (HYPRE_Vector) x ) );
76}
77
78/*--------------------------------------------------------------------------
79 * HYPRE_ParCSRPCGSolve
80 *--------------------------------------------------------------------------*/
81
82int
83HYPRE_ParCSRPCGSolve( HYPRE_Solver solver,
84 HYPRE_ParCSRMatrix A,
85 HYPRE_ParVector b,
86 HYPRE_ParVector x )
87{
88 return( HYPRE_PCGSolve( solver,
89 (HYPRE_Matrix) A,
90 (HYPRE_Vector) b,
91 (HYPRE_Vector) x ) );
92}
93
94/*--------------------------------------------------------------------------
95 * HYPRE_ParCSRPCGSetTol
96 *--------------------------------------------------------------------------*/
97
98int
99HYPRE_ParCSRPCGSetTol( HYPRE_Solver solver,
100 double tol )
101{
102 return( HYPRE_PCGSetTol( solver, tol ) );
103}
104
105/*--------------------------------------------------------------------------
106 * HYPRE_ParCSRPCGSetMaxIter
107 *--------------------------------------------------------------------------*/
108
109int
110HYPRE_ParCSRPCGSetMaxIter( HYPRE_Solver solver,
111 int max_iter )
112{
113 return( HYPRE_PCGSetMaxIter( solver, max_iter ) );
114}
115
116/*--------------------------------------------------------------------------
117 * HYPRE_ParCSRPCGSetStopCrit
118 *--------------------------------------------------------------------------*/
119
120int
121HYPRE_ParCSRPCGSetStopCrit( HYPRE_Solver solver,
122 int stop_crit )
123{
124 return( HYPRE_PCGSetStopCrit( solver, stop_crit ) );
125}
126
127/*--------------------------------------------------------------------------
128 * HYPRE_ParCSRPCGSetTwoNorm
129 *--------------------------------------------------------------------------*/
130
131int
132HYPRE_ParCSRPCGSetTwoNorm( HYPRE_Solver solver,
133 int two_norm )
134{
135 return( HYPRE_PCGSetTwoNorm( solver, two_norm ) );
136}
137
138/*--------------------------------------------------------------------------
139 * HYPRE_ParCSRPCGSetRelChange
140 *--------------------------------------------------------------------------*/
141
142int
143HYPRE_ParCSRPCGSetRelChange( HYPRE_Solver solver,
144 int rel_change )
145{
146 return( HYPRE_PCGSetRelChange( solver, rel_change ) );
147}
148
149/*--------------------------------------------------------------------------
150 * HYPRE_ParCSRPCGSetPrecond
151 *--------------------------------------------------------------------------*/
152
153int
154HYPRE_ParCSRPCGSetPrecond( HYPRE_Solver solver,
155 HYPRE_PtrToParSolverFcn precond,
156 HYPRE_PtrToParSolverFcn precond_setup,
157 HYPRE_Solver precond_solver )
158{
159 return( HYPRE_PCGSetPrecond( solver,
160 (HYPRE_PtrToSolverFcn) precond,
161 (HYPRE_PtrToSolverFcn) precond_setup,
162 precond_solver ) );
163}
164
165/*--------------------------------------------------------------------------
166 * HYPRE_ParCSRPCGGetPrecond
167 *--------------------------------------------------------------------------*/
168
169int
170HYPRE_ParCSRPCGGetPrecond( HYPRE_Solver solver,
171 HYPRE_Solver *precond_data_ptr )
172{
173 return( HYPRE_PCGGetPrecond( solver, precond_data_ptr ) );
174}
175
176/*--------------------------------------------------------------------------
177 * HYPRE_ParCSRPCGSetPrintLevel
178 * an obsolete function; use HYPRE_PCG* functions instead
179 *--------------------------------------------------------------------------*/
180
181int
182HYPRE_ParCSRPCGSetPrintLevel( HYPRE_Solver solver,
183 int level )
184{
185 return( HYPRE_PCGSetPrintLevel( solver, level ) );
186}
187
188/*--------------------------------------------------------------------------
189 * HYPRE_ParCSRPCGSetLogging
190 * an obsolete function; use HYPRE_PCG* functions instead
191 *--------------------------------------------------------------------------*/
192
193int
194HYPRE_ParCSRPCGSetLogging( HYPRE_Solver solver,
195 int level )
196{
197 return( HYPRE_PCGSetLogging( solver, level ) );
198}
199
200/*--------------------------------------------------------------------------
201 * HYPRE_ParCSRPCGGetNumIterations
202 *--------------------------------------------------------------------------*/
203
204int
205HYPRE_ParCSRPCGGetNumIterations( HYPRE_Solver solver,
206 int *num_iterations )
207{
208 return( HYPRE_PCGGetNumIterations( solver, num_iterations ) );
209}
210
211/*--------------------------------------------------------------------------
212 * HYPRE_ParCSRPCGGetFinalRelativeResidualNorm
213 *--------------------------------------------------------------------------*/
214
215int
216HYPRE_ParCSRPCGGetFinalRelativeResidualNorm( HYPRE_Solver solver,
217 double *norm )
218{
219 return( HYPRE_PCGGetFinalRelativeResidualNorm( solver, norm ) );
220}
221
222/*--------------------------------------------------------------------------
223 * HYPRE_ParCSRDiagScaleSetup
224 *--------------------------------------------------------------------------*/
225
226int
227HYPRE_ParCSRDiagScaleSetup( HYPRE_Solver solver,
228 HYPRE_ParCSRMatrix A,
229 HYPRE_ParVector y,
230 HYPRE_ParVector x )
231{
232 return 0;
233}
234
235/*--------------------------------------------------------------------------
236 * HYPRE_ParCSRDiagScale
237 *--------------------------------------------------------------------------*/
238
239int
240HYPRE_ParCSRDiagScale( HYPRE_Solver solver,
241 HYPRE_ParCSRMatrix HA,
242 HYPRE_ParVector Hy,
243 HYPRE_ParVector Hx )
244{
245 hypre_ParCSRMatrix *A = (hypre_ParCSRMatrix *) HA;
246 hypre_ParVector *y = (hypre_ParVector *) Hy;
247 hypre_ParVector *x = (hypre_ParVector *) Hx;
248 double *x_data = hypre_VectorData(hypre_ParVectorLocalVector(x));
249 double *y_data = hypre_VectorData(hypre_ParVectorLocalVector(y));
250 double *A_data = hypre_CSRMatrixData(hypre_ParCSRMatrixDiag(A));
251 int *A_i = hypre_CSRMatrixI(hypre_ParCSRMatrixDiag(A));
252 int local_size = hypre_VectorSize(hypre_ParVectorLocalVector(x));
253 int i, ierr = 0;
254
255 for (i=0; i < local_size; i++)
256 {
257 x_data[i] = y_data[i]/A_data[A_i[i]];
258 }
259
260 return ierr;
261}
262
Note: See TracBrowser for help on using the repository browser.