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  *
24  * HYPRE_ParCSRLSICG interface
25  *
26  *****************************************************************************/
27 
28 extern void *hypre_LSICGCreate();
29 extern int  hypre_LSICGDestroy(void *);
30 extern int  hypre_LSICGSetup(void *, void *, void *, void *);
31 extern int  hypre_LSICGSolve(void *, void  *, void  *, void  *);
32 extern int  hypre_LSICGSetTol(void *, double);
33 extern int  hypre_LSICGSetMaxIter(void *, int);
34 extern int  hypre_LSICGSetStopCrit(void *, double);
35 extern int  hypre_LSICGSetPrecond(void *, int (*precond)(void*,void*,void*,void*),
36                                   int (*precond_setup)(void*,void*,void*,void*), void *);
37 extern int  hypre_LSICGSetLogging(void *, int);
38 extern int  hypre_LSICGGetNumIterations(void *,int *);
39 extern int hypre_LSICGGetFinalRelativeResidualNorm(void *, double *);
40 
41 /*--------------------------------------------------------------------------
42  * HYPRE_ParCSRLSICGCreate
43  *--------------------------------------------------------------------------*/
44 
HYPRE_ParCSRLSICGCreate(MPI_Comm comm,HYPRE_Solver * solver)45 int HYPRE_ParCSRLSICGCreate( MPI_Comm comm, HYPRE_Solver *solver )
46 {
47    *solver = (HYPRE_Solver) hypre_LSICGCreate( );
48 
49    return 0;
50 }
51 
52 /*--------------------------------------------------------------------------
53  * HYPRE_ParCSRLSICGDestroy
54  *--------------------------------------------------------------------------*/
55 
HYPRE_ParCSRLSICGDestroy(HYPRE_Solver solver)56 int HYPRE_ParCSRLSICGDestroy( HYPRE_Solver solver )
57 {
58    return( hypre_LSICGDestroy( (void *) solver ) );
59 }
60 
61 /*--------------------------------------------------------------------------
62  * HYPRE_ParCSRLSICGSetup
63  *--------------------------------------------------------------------------*/
64 
HYPRE_ParCSRLSICGSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,HYPRE_ParVector b,HYPRE_ParVector x)65 int HYPRE_ParCSRLSICGSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
66                             HYPRE_ParVector b, HYPRE_ParVector x      )
67 {
68    return( hypre_LSICGSetup( (void *) solver, (void *) A, (void *) b,
69                                  (void *) x ) );
70 }
71 
72 /*--------------------------------------------------------------------------
73  * HYPRE_ParCSRLSICGSolve
74  *--------------------------------------------------------------------------*/
75 
HYPRE_ParCSRLSICGSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,HYPRE_ParVector b,HYPRE_ParVector x)76 int HYPRE_ParCSRLSICGSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
77                                 HYPRE_ParVector b, HYPRE_ParVector x      )
78 {
79    return( hypre_LSICGSolve( (void *) solver, (void *) A,
80                                  (void *) b, (void *) x ) );
81 }
82 
83 /*--------------------------------------------------------------------------
84  * HYPRE_ParCSRLSICGSetTol
85  *--------------------------------------------------------------------------*/
86 
HYPRE_ParCSRLSICGSetTol(HYPRE_Solver solver,double tol)87 int HYPRE_ParCSRLSICGSetTol( HYPRE_Solver solver, double tol    )
88 {
89    return( hypre_LSICGSetTol( (void *) solver, tol ) );
90 }
91 
92 /*--------------------------------------------------------------------------
93  * HYPRE_ParCSRLSICGSetMaxIter
94  *--------------------------------------------------------------------------*/
95 
HYPRE_ParCSRLSICGSetMaxIter(HYPRE_Solver solver,int max_iter)96 int HYPRE_ParCSRLSICGSetMaxIter( HYPRE_Solver solver, int max_iter )
97 {
98    return( hypre_LSICGSetMaxIter( (void *) solver, max_iter ) );
99 }
100 
101 /*--------------------------------------------------------------------------
102  * HYPRE_ParCSRLSICGetStopCrit
103  *--------------------------------------------------------------------------*/
104 
HYPRE_ParCSRLSICGSetStopCrit(HYPRE_Solver solver,int stop_crit)105 int HYPRE_ParCSRLSICGSetStopCrit( HYPRE_Solver solver, int stop_crit )
106 {
107    return( hypre_LSICGSetStopCrit( (void *) solver, stop_crit ) );
108 }
109 
110 /*--------------------------------------------------------------------------
111  * HYPRE_ParCSRLSICGSetPrecond
112  *--------------------------------------------------------------------------*/
113 
HYPRE_ParCSRLSICGSetPrecond(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)114 int HYPRE_ParCSRLSICGSetPrecond( HYPRE_Solver  solver,
115           int (*precond)      (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
116 			       HYPRE_ParVector b, HYPRE_ParVector x),
117           int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
118 			       HYPRE_ParVector b, HYPRE_ParVector x),
119           void *precond_data )
120 {
121    return( hypre_LSICGSetPrecond( (void *) solver,
122 								  (HYPRE_Int (*)(void*,void*,void*,void*))precond,
123 								  (HYPRE_Int (*)(void*,void*,void*,void*))precond_setup,
124 								  precond_data ) );
125 }
126 
127 /*--------------------------------------------------------------------------
128  * HYPRE_ParCSRLSICGSetLogging
129  *--------------------------------------------------------------------------*/
130 
HYPRE_ParCSRLSICGSetLogging(HYPRE_Solver solver,int logging)131 int HYPRE_ParCSRLSICGSetLogging( HYPRE_Solver solver, int logging)
132 {
133    return( hypre_LSICGSetLogging( (void *) solver, logging ) );
134 }
135 
136 /*--------------------------------------------------------------------------
137  * HYPRE_ParCSRLSICGetNumIterations
138  *--------------------------------------------------------------------------*/
139 
HYPRE_ParCSRLSICGGetNumIterations(HYPRE_Solver solver,int * num_iterations)140 int HYPRE_ParCSRLSICGGetNumIterations(HYPRE_Solver solver,int *num_iterations)
141 {
142    return( hypre_LSICGGetNumIterations( (void *) solver, num_iterations ) );
143 }
144 
145 /*--------------------------------------------------------------------------
146  * HYPRE_ParCSRLSICGGetFinalRelativeResidualNorm
147  *--------------------------------------------------------------------------*/
148 
HYPRE_ParCSRLSICGGetFinalRelativeResidualNorm(HYPRE_Solver solver,double * norm)149 int HYPRE_ParCSRLSICGGetFinalRelativeResidualNorm( HYPRE_Solver  solver,
150                                                        double *norm   )
151 {
152    return( hypre_LSICGGetFinalRelativeResidualNorm( (void *) solver, norm ) );
153 }
154 
155