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 #include "HYPRE_parcsr_fgmres.h"
20 
21 #include "HYPRE_FEI.h"
22 #include "_hypre_FEI.h"
23 
24 //extern void *hypre_FGMRESCreate();
25 //extern int  hypre_FGMRESDestroy(void *);
26 //extern int  hypre_FGMRESSetup(void *, void *, void *, void *);
27 //extern int  hypre_FGMRESSolve(void *, void *, void *, void *);
28 //extern int  hypre_FGMRESSetKDim(void *, int);
29 //extern int  hypre_FGMRESSetTol(void *, double);
30 //extern int  hypre_FGMRESSetMaxIter(void *, int);
31 //extern int  hypre_FGMRESSetStopCrit(void *, double);
32 //extern int  hypre_FGMRESSetPrecond(void *, int (*precond)(void*,void*,void*,void*),
33 //                                 int (*precond_setup)(void*,void*,void*,void*),void *precond_data);
34 //extern int  hypre_FGMRESGetPrecond(void *, HYPRE_Solver *);
35 //extern int  hypre_FGMRESSetLogging(void *, int);
36 //extern int  hypre_FGMRESGetNumIterations(void *, int *);
37 //extern int  hypre_FGMRESGetFinalRelativeResidualNorm(void *,double *);
38 //extern int  hypre_FGMRESUpdatePrecondTolerance(void *, int (*update_tol)(HYPRE_Solver,double));
39 
40 /******************************************************************************
41  *
42  * HYPRE_ParCSRFGMRES interface
43  *
44  *****************************************************************************/
45 
46 /*--------------------------------------------------------------------------
47  * HYPRE_ParCSRFGMRESCreate
48  *--------------------------------------------------------------------------*/
49 
HYPRE_ParCSRFGMRESCreate(MPI_Comm comm,HYPRE_Solver * solver)50 int HYPRE_ParCSRFGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver )
51 {
52    *solver = (HYPRE_Solver) hypre_FGMRESCreate( );
53 
54    return 0;
55 }
56 
57 /*--------------------------------------------------------------------------
58  * HYPRE_ParCSRFGMRESDestroy
59  *--------------------------------------------------------------------------*/
60 
HYPRE_ParCSRFGMRESDestroy(HYPRE_Solver solver)61 int HYPRE_ParCSRFGMRESDestroy( HYPRE_Solver solver )
62 {
63    return( hypre_FGMRESDestroy( (void *) solver ) );
64 }
65 
66 /*--------------------------------------------------------------------------
67  * HYPRE_ParCSRFGMRESSetup
68  *--------------------------------------------------------------------------*/
69 
HYPRE_ParCSRFGMRESSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,HYPRE_ParVector b,HYPRE_ParVector x)70 int HYPRE_ParCSRFGMRESSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
71                              HYPRE_ParVector b, HYPRE_ParVector x      )
72 {
73    return( hypre_FGMRESSetup( (void *) solver, (void *) A, (void *) b,
74                               (void *) x ) );
75 }
76 
77 /*--------------------------------------------------------------------------
78  * HYPRE_ParCSRFGMRESSolve
79  *--------------------------------------------------------------------------*/
80 
HYPRE_ParCSRFGMRESSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,HYPRE_ParVector b,HYPRE_ParVector x)81 int HYPRE_ParCSRFGMRESSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
82                              HYPRE_ParVector b, HYPRE_ParVector x      )
83 {
84    return( hypre_FGMRESSolve( (void *) solver, (void *) A,
85                               (void *) b, (void *) x ) );
86 }
87 
88 /*--------------------------------------------------------------------------
89  * HYPRE_ParCSRFGMRESSetKDim
90  *--------------------------------------------------------------------------*/
91 
HYPRE_ParCSRFGMRESSetKDim(HYPRE_Solver solver,int dim)92 int HYPRE_ParCSRFGMRESSetKDim( HYPRE_Solver solver, int dim    )
93 {
94    return( hypre_FGMRESSetKDim( (void *) solver, dim ) );
95 }
96 
97 /*--------------------------------------------------------------------------
98  * HYPRE_ParCSRFGMRESSetTol
99  *--------------------------------------------------------------------------*/
100 
HYPRE_ParCSRFGMRESSetTol(HYPRE_Solver solver,double tol)101 int HYPRE_ParCSRFGMRESSetTol( HYPRE_Solver solver, double tol    )
102 {
103    return( hypre_FGMRESSetTol( (void *) solver, tol ) );
104 }
105 
106 /*--------------------------------------------------------------------------
107  * HYPRE_ParCSRFGMRESSetMaxIter
108  *--------------------------------------------------------------------------*/
109 
HYPRE_ParCSRFGMRESSetMaxIter(HYPRE_Solver solver,int max_iter)110 int HYPRE_ParCSRFGMRESSetMaxIter( HYPRE_Solver solver, int max_iter )
111 {
112    return( hypre_FGMRESSetMaxIter( (void *) solver, max_iter ) );
113 }
114 
115 /*--------------------------------------------------------------------------
116  * HYPRE_ParCSRFGMRESetStopCrit
117  *--------------------------------------------------------------------------*/
118 
HYPRE_ParCSRFGMRESSetStopCrit(HYPRE_Solver solver,int stop_crit)119 int HYPRE_ParCSRFGMRESSetStopCrit( HYPRE_Solver solver, int stop_crit )
120 {
121    return( hypre_FGMRESSetStopCrit( (void *) solver, stop_crit ) );
122 }
123 
124 /*--------------------------------------------------------------------------
125  * HYPRE_ParCSRFGMRESSetPrecond
126  *--------------------------------------------------------------------------*/
127 
HYPRE_ParCSRFGMRESSetPrecond(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)128 int HYPRE_ParCSRFGMRESSetPrecond( HYPRE_Solver  solver,
129           int (*precond)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
130 			HYPRE_ParVector b, HYPRE_ParVector x),
131           int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
132 			       HYPRE_ParVector b, HYPRE_ParVector x),
133           void *precond_data )
134 {
135    return( hypre_FGMRESSetPrecond( (void *) solver,
136                                    (HYPRE_Int (*)(void*,void*,void*,void*))precond,
137 								   (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup,
138 								   precond_data ) );
139 }
140 
141 /*--------------------------------------------------------------------------
142  * HYPRE_ParCSRFGMRESSetLogging
143  *--------------------------------------------------------------------------*/
144 
HYPRE_ParCSRFGMRESSetLogging(HYPRE_Solver solver,int logging)145 int HYPRE_ParCSRFGMRESSetLogging( HYPRE_Solver solver, int logging)
146 {
147    return( hypre_FGMRESSetLogging( (void *) solver, logging ) );
148 }
149 
150 /*--------------------------------------------------------------------------
151  * HYPRE_ParCSRFGMRESetNumIterations
152  *--------------------------------------------------------------------------*/
153 
HYPRE_ParCSRFGMRESGetNumIterations(HYPRE_Solver solver,int * num_iterations)154 int HYPRE_ParCSRFGMRESGetNumIterations(HYPRE_Solver solver,int *num_iterations)
155 {
156    return( hypre_FGMRESGetNumIterations( (void *) solver, num_iterations ) );
157 }
158 
159 /*--------------------------------------------------------------------------
160  * HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm
161  *--------------------------------------------------------------------------*/
162 
HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver,double * norm)163 int HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm( HYPRE_Solver  solver,
164                                                     double *norm   )
165 {
166    return( hypre_FGMRESGetFinalRelativeResidualNorm( (void *) solver, norm ) );
167 }
168 
169 /*--------------------------------------------------------------------------
170  * HYPRE_ParCSRFGMRESUpdatePrecondTolerance
171  *--------------------------------------------------------------------------*/
172 
HYPRE_ParCSRFGMRESUpdatePrecondTolerance(HYPRE_Solver solver,int (* update_tol)(HYPRE_Solver sol,double))173 int HYPRE_ParCSRFGMRESUpdatePrecondTolerance( HYPRE_Solver  solver,
174           int (*update_tol)(HYPRE_Solver sol, double ) )
175 {
176 	return( hypre_FGMRESUpdatePrecondTolerance(solver,(int(*) (int*, double)) update_tol) );
177 }
178 
179