1 /******************************************************************************
2  * Copyright 1998-2019 Lawrence Livermore National Security, LLC and other
3  * HYPRE Project Developers. See the top-level COPYRIGHT file for details.
4  *
5  * SPDX-License-Identifier: (Apache-2.0 OR MIT)
6  ******************************************************************************/
7 
8 #include <stdlib.h>
9 #include <string.h>
10 #include <stdio.h>
11 #include <math.h>
12 
13 #include "utilities/_hypre_utilities.h"
14 #include "HYPRE.h"
15 #include "IJ_mv/HYPRE_IJ_mv.h"
16 #include "parcsr_mv/HYPRE_parcsr_mv.h"
17 #include "parcsr_mv/_hypre_parcsr_mv.h"
18 #include "parcsr_ls/HYPRE_parcsr_ls.h"
19 
20 #include "HYPRE_FEI.h"
21 #include "_hypre_FEI.h"
22 
23 /******************************************************************************
24  *
25  * HYPRE_ParCSRBiCGSTABL interface
26  *
27  *****************************************************************************/
28 
29 extern void *hypre_BiCGSTABLCreate();
30 extern int  hypre_BiCGSTABLDestroy(void *);
31 extern int  hypre_BiCGSTABLSetup(void *, void *, void *, void *);
32 extern int  hypre_BiCGSTABLSolve(void *, void *, void *, void *);
33 extern int  hypre_BiCGSTABLSetTol(void *, double);
34 extern int  hypre_BiCGSTABLSetSize(void *, int);
35 extern int  hypre_BiCGSTABLSetMaxIter(void *, int);
36 extern int  hypre_BiCGSTABLSetStopCrit(void *, double);
37 extern int  hypre_BiCGSTABLSetPrecond(void *, int (*precond)(void*,void*,void*,void*),
38 									  int (*precond_setup)(void*,void*,void*,void*), void *);
39 extern int  hypre_BiCGSTABLSetLogging(void *, int);
40 extern int  hypre_BiCGSTABLGetNumIterations(void *,int *);
41 extern int  hypre_BiCGSTABLGetFinalRelativeResidualNorm(void *, double *);
42 
43 /*--------------------------------------------------------------------------
44  * HYPRE_ParCSRBiCGSTABLCreate
45  *--------------------------------------------------------------------------*/
46 
HYPRE_ParCSRBiCGSTABLCreate(MPI_Comm comm,HYPRE_Solver * solver)47 int HYPRE_ParCSRBiCGSTABLCreate( MPI_Comm comm, HYPRE_Solver *solver )
48 {
49    *solver = (HYPRE_Solver) hypre_BiCGSTABLCreate( );
50 
51    return 0;
52 }
53 
54 /*--------------------------------------------------------------------------
55  * HYPRE_ParCSRBiCGSTABLDestroy
56  *--------------------------------------------------------------------------*/
57 
HYPRE_ParCSRBiCGSTABLDestroy(HYPRE_Solver solver)58 int HYPRE_ParCSRBiCGSTABLDestroy( HYPRE_Solver solver )
59 {
60    return( hypre_BiCGSTABLDestroy( (void *) solver ) );
61 }
62 
63 /*--------------------------------------------------------------------------
64  * HYPRE_ParCSRBiCGSTABLSetup
65  *--------------------------------------------------------------------------*/
66 
HYPRE_ParCSRBiCGSTABLSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,HYPRE_ParVector b,HYPRE_ParVector x)67 int HYPRE_ParCSRBiCGSTABLSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
68                                HYPRE_ParVector b, HYPRE_ParVector x      )
69 {
70    return( hypre_BiCGSTABLSetup( (void *) solver, (void *) A, (void *) b,
71                                  (void *) x ) );
72 }
73 
74 /*--------------------------------------------------------------------------
75  * HYPRE_ParCSRBiCGSTABLSolve
76  *--------------------------------------------------------------------------*/
77 
HYPRE_ParCSRBiCGSTABLSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,HYPRE_ParVector b,HYPRE_ParVector x)78 int HYPRE_ParCSRBiCGSTABLSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
79                                 HYPRE_ParVector b, HYPRE_ParVector x      )
80 {
81    return( hypre_BiCGSTABLSolve( (void *) solver, (void *) A,
82                                  (void *) b, (void *) x ) );
83 }
84 
85 /*--------------------------------------------------------------------------
86  * HYPRE_ParCSRBiCGSTABLSetTol
87  *--------------------------------------------------------------------------*/
88 
HYPRE_ParCSRBiCGSTABLSetTol(HYPRE_Solver solver,double tol)89 int HYPRE_ParCSRBiCGSTABLSetTol( HYPRE_Solver solver, double tol    )
90 {
91    return( hypre_BiCGSTABLSetTol( (void *) solver, tol ) );
92 }
93 
94 /*--------------------------------------------------------------------------
95  * HYPRE_ParCSRBiCGSTABLSetSize
96  *--------------------------------------------------------------------------*/
97 
HYPRE_ParCSRBiCGSTABLSetSize(HYPRE_Solver solver,int size)98 int HYPRE_ParCSRBiCGSTABLSetSize( HYPRE_Solver solver, int size )
99 {
100    return( hypre_BiCGSTABLSetSize( (void *) solver, size ) );
101 }
102 
103 /*--------------------------------------------------------------------------
104  * HYPRE_ParCSRBiCGSTABLSetMaxIter
105  *--------------------------------------------------------------------------*/
106 
107 int
HYPRE_ParCSRBiCGSTABLSetMaxIter(HYPRE_Solver solver,int max_iter)108 HYPRE_ParCSRBiCGSTABLSetMaxIter( HYPRE_Solver solver, int max_iter )
109 {
110    return( hypre_BiCGSTABLSetMaxIter( (void *) solver, max_iter ) );
111 }
112 
113 /*--------------------------------------------------------------------------
114  * HYPRE_ParCSRBiCGSTABSetStopCrit
115  *--------------------------------------------------------------------------*/
116 
117 int
HYPRE_ParCSRBiCGSTABLSetStopCrit(HYPRE_Solver solver,int stop_crit)118 HYPRE_ParCSRBiCGSTABLSetStopCrit( HYPRE_Solver solver, int stop_crit )
119 {
120    return( hypre_BiCGSTABLSetStopCrit( (void *) solver, stop_crit ) );
121 }
122 
123 /*--------------------------------------------------------------------------
124  * HYPRE_ParCSRBiCGSTABLSetPrecond
125  *--------------------------------------------------------------------------*/
126 
HYPRE_ParCSRBiCGSTABLSetPrecond(HYPRE_Solver solver,int (* precond)(HYPRE_Solver sol,HYPRE_ParCSRMatrix matrix,HYPRE_ParVector b,HYPRE_ParVector x),int (* precond_setup)(HYPRE_Solver sol,HYPRE_ParCSRMatrix matrix,HYPRE_ParVector b,HYPRE_ParVector x),void * precond_data)127 int HYPRE_ParCSRBiCGSTABLSetPrecond( HYPRE_Solver  solver,
128           int (*precond)      (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
129 			       HYPRE_ParVector b, HYPRE_ParVector x),
130           int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
131 			       HYPRE_ParVector b, HYPRE_ParVector x),
132           void               *precond_data )
133 {
134    return( hypre_BiCGSTABLSetPrecond( (void *) solver,
135 									  (HYPRE_Int (*)(void*,void*,void*,void*))precond,
136 									  (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup,
137 									  precond_data ) );
138 }
139 
140 /*--------------------------------------------------------------------------
141  * HYPRE_ParCSRBiCGSTABLSetLogging
142  *--------------------------------------------------------------------------*/
143 
HYPRE_ParCSRBiCGSTABLSetLogging(HYPRE_Solver solver,int logging)144 int HYPRE_ParCSRBiCGSTABLSetLogging( HYPRE_Solver solver, int logging)
145 {
146    return( hypre_BiCGSTABLSetLogging( (void *) solver, logging ) );
147 }
148 
149 /*--------------------------------------------------------------------------
150  * HYPRE_ParCSRBiCGSTABGetNumIterations
151  *--------------------------------------------------------------------------*/
152 
HYPRE_ParCSRBiCGSTABLGetNumIterations(HYPRE_Solver solver,int * num_iterations)153 int HYPRE_ParCSRBiCGSTABLGetNumIterations(HYPRE_Solver solver,int *num_iterations)
154 {
155    return( hypre_BiCGSTABLGetNumIterations( (void *) solver, num_iterations ) );
156 }
157 
158 /*--------------------------------------------------------------------------
159  * HYPRE_ParCSRBiCGSTABLGetFinalRelativeResidualNorm
160  *--------------------------------------------------------------------------*/
161 
HYPRE_ParCSRBiCGSTABLGetFinalRelativeResidualNorm(HYPRE_Solver solver,double * norm)162 int HYPRE_ParCSRBiCGSTABLGetFinalRelativeResidualNorm( HYPRE_Solver  solver,
163                                                        double *norm   )
164 {
165    return( hypre_BiCGSTABLGetFinalRelativeResidualNorm( (void *) solver, norm ) );
166 }
167 
168