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 /******************************************************************************
22  *
23  * HYPRE_ParCSRSymQMR interface
24  *
25  *****************************************************************************/
26 
27 extern void *hypre_SymQMRCreate();
28 extern int  hypre_SymQMRDestroy(void *);
29 extern int  hypre_SymQMRSetup(void *, void *, void *, void *);
30 extern int  hypre_SymQMRSolve(void *, void *, void *, void *);
31 extern int  hypre_SymQMRSetTol(void *, double);
32 extern int  hypre_SymQMRSetMaxIter(void *, int);
33 extern int  hypre_SymQMRSetStopCrit(void *, double);
34 extern int  hypre_SymQMRSetPrecond(void *, int (*precond)(void*,void*,void*,void*),
35                                    int (*precond_setup)(void*,void*,void*,void*), void *);
36 extern int  hypre_SymQMRSetLogging(void *, int );
37 extern int  hypre_SymQMRGetNumIterations(void *, int *);
38 extern int  hypre_SymQMRGetFinalRelativeResidualNorm(void *, double *);
39 
40 /*--------------------------------------------------------------------------
41  * HYPRE_ParCSRSymQMRCreate
42  *--------------------------------------------------------------------------*/
43 
HYPRE_ParCSRSymQMRCreate(MPI_Comm comm,HYPRE_Solver * solver)44 int HYPRE_ParCSRSymQMRCreate( MPI_Comm comm, HYPRE_Solver *solver )
45 {
46    *solver = (HYPRE_Solver) hypre_SymQMRCreate( );
47 
48    return 0;
49 }
50 
51 /*--------------------------------------------------------------------------
52  * HYPRE_ParCSRSymQMRDestroy
53  *--------------------------------------------------------------------------*/
54 
HYPRE_ParCSRSymQMRDestroy(HYPRE_Solver solver)55 int HYPRE_ParCSRSymQMRDestroy( HYPRE_Solver solver )
56 {
57    return( hypre_SymQMRDestroy( (void *) solver ) );
58 }
59 
60 /*--------------------------------------------------------------------------
61  * HYPRE_ParCSRSymQMRSetup
62  *--------------------------------------------------------------------------*/
63 
HYPRE_ParCSRSymQMRSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,HYPRE_ParVector b,HYPRE_ParVector x)64 int HYPRE_ParCSRSymQMRSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
65                              HYPRE_ParVector b, HYPRE_ParVector x      )
66 {
67    return( hypre_SymQMRSetup( (void *) solver, (void *) A, (void *) b,
68                               (void *) x ) );
69 }
70 
71 /*--------------------------------------------------------------------------
72  * HYPRE_ParCSRSymQMRSolve
73  *--------------------------------------------------------------------------*/
74 
HYPRE_ParCSRSymQMRSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,HYPRE_ParVector b,HYPRE_ParVector x)75 int HYPRE_ParCSRSymQMRSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
76                                 HYPRE_ParVector b, HYPRE_ParVector x      )
77 {
78    return( hypre_SymQMRSolve( (void *) solver, (void *) A,
79                               (void *) b, (void *) x ) );
80 }
81 
82 /*--------------------------------------------------------------------------
83  * HYPRE_ParCSRSymQMRSetTol
84  *--------------------------------------------------------------------------*/
85 
HYPRE_ParCSRSymQMRSetTol(HYPRE_Solver solver,double tol)86 int HYPRE_ParCSRSymQMRSetTol( HYPRE_Solver solver, double tol    )
87 {
88    return( hypre_SymQMRSetTol( (void *) solver, tol ) );
89 }
90 
91 /*--------------------------------------------------------------------------
92  * HYPRE_ParCSRSymQMRSetMaxIter
93  *--------------------------------------------------------------------------*/
94 
HYPRE_ParCSRSymQMRSetMaxIter(HYPRE_Solver solver,int max_iter)95 int HYPRE_ParCSRSymQMRSetMaxIter( HYPRE_Solver solver, int max_iter )
96 {
97    return( hypre_SymQMRSetMaxIter( (void *) solver, max_iter ) );
98 }
99 
100 /*--------------------------------------------------------------------------
101  * HYPRE_ParCSRSymQMRSetStopCrit
102  *--------------------------------------------------------------------------*/
103 
HYPRE_ParCSRSymQMRSetStopCrit(HYPRE_Solver solver,int stop_crit)104 int HYPRE_ParCSRSymQMRSetStopCrit( HYPRE_Solver solver, int stop_crit )
105 {
106    return( hypre_SymQMRSetStopCrit( (void *) solver, stop_crit ) );
107 }
108 
109 /*--------------------------------------------------------------------------
110  * HYPRE_ParCSRSymQMRSetPrecond
111  *--------------------------------------------------------------------------*/
112 
HYPRE_ParCSRSymQMRSetPrecond(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)113 int HYPRE_ParCSRSymQMRSetPrecond( HYPRE_Solver  solver,
114           int (*precond)      (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
115 			       HYPRE_ParVector b, HYPRE_ParVector x),
116           int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
117 			       HYPRE_ParVector b, HYPRE_ParVector x),
118           void                *precond_data )
119 {
120    return( hypre_SymQMRSetPrecond( (void *) solver,
121 								   (HYPRE_Int (*)(void*,void*,void*,void*))precond,
122 								   (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup,
123 								   precond_data ) );
124 }
125 
126 /*--------------------------------------------------------------------------
127  * HYPRE_ParCSRSymQMRSetLogging
128  *--------------------------------------------------------------------------*/
129 
HYPRE_ParCSRSymQMRSetLogging(HYPRE_Solver solver,int logging)130 int HYPRE_ParCSRSymQMRSetLogging( HYPRE_Solver solver, int logging)
131 {
132    return( hypre_SymQMRSetLogging( (void *) solver, logging ) );
133 }
134 
135 /*--------------------------------------------------------------------------
136  * HYPRE_ParCSRSymQMRetNumIterations
137  *--------------------------------------------------------------------------*/
138 
HYPRE_ParCSRSymQMRGetNumIterations(HYPRE_Solver solver,int * num_iterations)139 int HYPRE_ParCSRSymQMRGetNumIterations(HYPRE_Solver solver,int *num_iterations)
140 {
141    return( hypre_SymQMRGetNumIterations( (void *) solver, num_iterations ) );
142 }
143 
144 /*--------------------------------------------------------------------------
145  * HYPRE_ParCSRSymQMRGetFinalRelativeResidualNorm
146  *--------------------------------------------------------------------------*/
147 
HYPRE_ParCSRSymQMRGetFinalRelativeResidualNorm(HYPRE_Solver solver,double * norm)148 int HYPRE_ParCSRSymQMRGetFinalRelativeResidualNorm( HYPRE_Solver  solver,
149                                                        double *norm   )
150 {
151    return( hypre_SymQMRGetFinalRelativeResidualNorm( (void *) solver, norm ) );
152 }
153 
154