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 #ifndef __HYPRE_FEI__
9 #define __HYPRE_FEI__
10 
11 #include "HYPRE.h"
12 #include "IJ_mv/HYPRE_IJ_mv.h"
13 #include "parcsr_mv/HYPRE_parcsr_mv.h"
14 #include "parcsr_mv/_hypre_parcsr_mv.h"
15 #include "parcsr_ls/_hypre_parcsr_ls.h"
16 #include "parcsr_ls/HYPRE_parcsr_ls.h"
17 
18 #ifdef __cplusplus
19 extern "C"
20 {
21 #endif
22 
23 #include "HYPRE_MHMatrix.h"
24 
25 typedef struct HYPRE_LSI_DDIlut_Struct
26 {
27    MPI_Comm  comm;
28    MH_Matrix *mh_mat;
29    double    thresh;
30    double    fillin;
31    int       overlap;
32    int       Nrows;
33    int       extNrows;
34    int       *mat_ia;
35    int       *mat_ja;
36    double    *mat_aa;
37    int       outputLevel;
38    int       reorder;
39    int       *order_array;
40    int       *reorder_array;
41 }
42 HYPRE_LSI_DDIlut;
43 
44 /* HYPRE_LSI_ddict.c */
45 int HYPRE_LSI_DDICTCreate( MPI_Comm comm, HYPRE_Solver *solver );
46 int HYPRE_LSI_DDICTDestroy( HYPRE_Solver solver );
47 int HYPRE_LSI_DDICTSetFillin( HYPRE_Solver solver, double fillin);
48 int HYPRE_LSI_DDICTSetOutputLevel( HYPRE_Solver solver, int level);
49 int HYPRE_LSI_DDICTSetDropTolerance( HYPRE_Solver solver, double thresh);
50 int HYPRE_LSI_DDICTSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
51 						  HYPRE_ParVector b,   HYPRE_ParVector x );
52 int HYPRE_LSI_DDICTSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
53 						  HYPRE_ParVector b,   HYPRE_ParVector x );
54 /* HYPRE_LSI_ddilut.c */
55 int HYPRE_LSI_DDIlutCreate( MPI_Comm comm, HYPRE_Solver *solver );
56 int HYPRE_LSI_DDIlutDestroy( HYPRE_Solver solver );
57 int HYPRE_LSI_DDIlutSetFillin( HYPRE_Solver solver, double fillin);
58 int HYPRE_LSI_DDIlutSetDropTolerance( HYPRE_Solver solver, double thresh);
59 int HYPRE_LSI_DDIlutSetOverlap( HYPRE_Solver solver );
60 int HYPRE_LSI_DDIlutSetReorder( HYPRE_Solver solver );
61 int HYPRE_LSI_DDIlutSetOutputLevel( HYPRE_Solver solver, int level);
62 int HYPRE_LSI_DDIlutSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
63 						   HYPRE_ParVector b,   HYPRE_ParVector x );
64 int HYPRE_LSI_DDIlutSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
65 						   HYPRE_ParVector b,   HYPRE_ParVector x );
66 int HYPRE_LSI_DDIlutGetRowLengths(MH_Matrix *Amat, int *leng, int **recv_leng,
67                                   MPI_Comm mpi_comm);
68 int HYPRE_LSI_DDIlutGetOffProcRows(MH_Matrix *Amat, int leng, int *recv_leng,
69                            int Noffset, int *map, int *map2, int **int_buf,
70 								   double **dble_buf, MPI_Comm mpi_comm);
71 int HYPRE_LSI_DDIlutComposeOverlappedMatrix(MH_Matrix *mh_mat,
72 											int *total_recv_leng, int **recv_lengths, int **int_buf,
73 											double **dble_buf, int **sindex_array, int **sindex_array2,
74 											int *offset, MPI_Comm mpi_comm);
75 int HYPRE_LSI_DDIlutDecompose(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat,
76 							  int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa,
77 							  int *map, int *map2, int Noffset);
78 int HYPRE_LSI_DDIlutDecompose2(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat,
79 							   int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa,
80 							   int *map, int *map2, int Noffset);
81 int HYPRE_LSI_DDIlutDecomposeNew(HYPRE_LSI_DDIlut *ilut_ptr,MH_Matrix *Amat,
82 								 int total_recv_leng, int *recv_lengths, int *ext_ja, double *ext_aa,
83 								 int *map, int *map2, int Noffset);
84 
85 /* hypre_lsi_misc.c */
86 void HYPRE_LSI_Get_IJAMatrixFromFile(double **val, int **ia,
87 									 int **ja, int *N, double **rhs, char *matfile, char *rhsfile);
88 int HYPRE_LSI_Search(int *list,int value,int list_length);
89 int HYPRE_LSI_Search2(int key, int nlist, int *list);
90 int HYPRE_LSI_GetParCSRMatrix(HYPRE_IJMatrix Amat, int nrows, int nnz,
91                               int *ia_ptr, int *ja_ptr, double *a_ptr) ;
92 void HYPRE_LSI_qsort1a( int *ilist, int *ilist2, int left, int right);
93 int HYPRE_LSI_SplitDSort2(double *dlist, int nlist, int *ilist, int limit);
94 int HYPRE_LSI_SplitDSort(double *dlist, int nlist, int *ilist, int limit);
95 int HYPRE_LSI_SolveIdentity(HYPRE_Solver solver, HYPRE_ParCSRMatrix Amat,
96                             HYPRE_ParVector b, HYPRE_ParVector x);
97 int HYPRE_LSI_Cuthill(int n, int *ia, int *ja, double *aa, int *order_array,
98                       int *reorder_array);
99 int HYPRE_LSI_MatrixInverse( double **Amat, int ndim, double ***Cmat );
100 int HYPRE_LSI_PartitionMatrix( int nRows, int startRow, int *rowLengths,
101                                int **colIndices, double **colValues,
102                                int *nLabels, int **labels);
103 
104 
105 /* HYPRE_LSI_poly.c */
106 int HYPRE_LSI_PolyCreate( MPI_Comm comm, HYPRE_Solver *solver );
107 int HYPRE_LSI_PolyDestroy( HYPRE_Solver solver );
108 int HYPRE_LSI_PolySetOrder( HYPRE_Solver solver, int order);
109 int HYPRE_LSI_PolySetOutputLevel( HYPRE_Solver solver, int level);
110 int HYPRE_LSI_PolySolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
111                                 HYPRE_ParVector b,   HYPRE_ParVector x );
112 int HYPRE_LSI_PolySetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
113                                 HYPRE_ParVector b,   HYPRE_ParVector x );
114 
115 /* HYPRE_LSI_schwarz.c */
116 int HYPRE_LSI_SchwarzCreate( MPI_Comm comm, HYPRE_Solver *solver );
117 int HYPRE_LSI_SchwarzDestroy( HYPRE_Solver solver );
118 int HYPRE_LSI_SchwarzSetBlockSize( HYPRE_Solver solver, int blksize);
119 int HYPRE_LSI_SchwarzSetNBlocks( HYPRE_Solver solver, int nblks);
120 int HYPRE_LSI_SchwarzSetILUTFillin( HYPRE_Solver solver, double fillin);
121 int HYPRE_LSI_SchwarzSetOutputLevel( HYPRE_Solver solver, int level);
122 int HYPRE_LSI_SchwarzSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
123 							HYPRE_ParVector b,   HYPRE_ParVector x );
124 int HYPRE_LSI_SchwarzSetup( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
125 							HYPRE_ParVector b,   HYPRE_ParVector x );
126 
127 /* HYPRE_parcsr_bicgs.c */
128 int HYPRE_ParCSRBiCGSCreate( MPI_Comm comm, HYPRE_Solver *solver );
129 int HYPRE_ParCSRBiCGSDestroy( HYPRE_Solver solver );
130 int HYPRE_ParCSRBiCGSSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
131 						   HYPRE_ParVector b, HYPRE_ParVector x );
132 int HYPRE_ParCSRBiCGSSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
133 						   HYPRE_ParVector b, HYPRE_ParVector x );
134 int HYPRE_ParCSRBiCGSSetTol( HYPRE_Solver solver, double tol );
135 int HYPRE_ParCSRBiCGSSetMaxIter( HYPRE_Solver solver, int max_iter );
136 int HYPRE_ParCSRBiCGSSetStopCrit( HYPRE_Solver solver, int stop_crit );
137 int HYPRE_ParCSRBiCGSSetPrecond( HYPRE_Solver  solver,
138 								 int (*precond)      (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
139 													  HYPRE_ParVector b, HYPRE_ParVector x),
140 								 int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
141 													  HYPRE_ParVector b, HYPRE_ParVector x),
142 								 void                *precond_data );
143 int HYPRE_ParCSRBiCGSSetLogging( HYPRE_Solver solver, int logging);
144 int HYPRE_ParCSRBiCGSGetNumIterations(HYPRE_Solver solver,
145 									  int *num_iterations);
146 int HYPRE_ParCSRBiCGSGetFinalRelativeResidualNorm(HYPRE_Solver solver,
147 												  double *norm );
148 
149 /* HYPRE_parcsr_bicgs.c */
150 int HYPRE_ParCSRBiCGSTABLCreate( MPI_Comm comm, HYPRE_Solver *solver );
151 int HYPRE_ParCSRBiCGSTABLDestroy( HYPRE_Solver solver );
152 int HYPRE_ParCSRBiCGSTABLSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
153                                HYPRE_ParVector b, HYPRE_ParVector x );
154 int HYPRE_ParCSRBiCGSTABLSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
155                                 HYPRE_ParVector b, HYPRE_ParVector x );
156 int HYPRE_ParCSRBiCGSTABLSetTol( HYPRE_Solver solver, double tol );
157 int HYPRE_ParCSRBiCGSTABLSetSize( HYPRE_Solver solver, int size );
158 int HYPRE_ParCSRBiCGSTABLSetMaxIter( HYPRE_Solver solver, int max_iter );
159 int HYPRE_ParCSRBiCGSTABLSetStopCrit( HYPRE_Solver solver, int stop_crit );
160 int HYPRE_ParCSRBiCGSTABLSetPrecond( HYPRE_Solver  solver,
161           int (*precond)      (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
162 			       HYPRE_ParVector b, HYPRE_ParVector x),
163           int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
164 			       HYPRE_ParVector b, HYPRE_ParVector x),
165           void               *precond_data );
166 int HYPRE_ParCSRBiCGSTABLSetLogging( HYPRE_Solver solver, int logging);
167 int HYPRE_ParCSRBiCGSTABLGetNumIterations(HYPRE_Solver solver,
168                                                  int *num_iterations);
169 int HYPRE_ParCSRBiCGSTABLGetFinalRelativeResidualNorm(HYPRE_Solver solver,
170                                                        double *norm );
171 
172 /* HYPRE_parcsr_fgmres.h */
173 int HYPRE_ParCSRFGMRESCreate( MPI_Comm comm, HYPRE_Solver *solver );
174 int HYPRE_ParCSRFGMRESDestroy( HYPRE_Solver solver );
175 int HYPRE_ParCSRFGMRESSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
176                                    HYPRE_ParVector b, HYPRE_ParVector x );
177 int HYPRE_ParCSRFGMRESSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
178                                    HYPRE_ParVector b, HYPRE_ParVector x );
179 int HYPRE_ParCSRFGMRESSetKDim(HYPRE_Solver solver, int kdim);
180 int HYPRE_ParCSRFGMRESSetTol(HYPRE_Solver solver, double tol);
181 int HYPRE_ParCSRFGMRESSetMaxIter(HYPRE_Solver solver, int max_iter);
182 int HYPRE_ParCSRFGMRESSetStopCrit(HYPRE_Solver solver, int stop_crit);
183 int HYPRE_ParCSRFGMRESSetPrecond(HYPRE_Solver  solver,
184           int (*precond)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
185 			HYPRE_ParVector b, HYPRE_ParVector x),
186           int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
187 			       HYPRE_ParVector b, HYPRE_ParVector x),
188           void *precond_data);
189 int HYPRE_ParCSRFGMRESSetLogging(HYPRE_Solver solver, int logging);
190 int HYPRE_ParCSRFGMRESGetNumIterations(HYPRE_Solver solver,
191                                               int *num_iterations);
192 int HYPRE_ParCSRFGMRESGetFinalRelativeResidualNorm(HYPRE_Solver solver,
193                                                           double *norm );
194 int HYPRE_ParCSRFGMRESUpdatePrecondTolerance(HYPRE_Solver  solver,
195                              int (*set_tolerance)(HYPRE_Solver sol, double));
196 
197 /* HYPRE_parcsr_lsicg.c */
198 int HYPRE_ParCSRLSICGCreate(MPI_Comm comm, HYPRE_Solver *solver);
199 int HYPRE_ParCSRLSICGDestroy(HYPRE_Solver solver);
200 int HYPRE_ParCSRLSICGSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
201                                   HYPRE_ParVector b, HYPRE_ParVector x );
202 int HYPRE_ParCSRLSICGSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
203                                   HYPRE_ParVector b, HYPRE_ParVector x );
204 int HYPRE_ParCSRLSICGSetTol(HYPRE_Solver solver, double tol);
205 int HYPRE_ParCSRLSICGSetMaxIter(HYPRE_Solver solver, int max_iter);
206 int HYPRE_ParCSRLSICGSetStopCrit(HYPRE_Solver solver, int stop_crit);
207 int HYPRE_ParCSRLSICGSetPrecond(HYPRE_Solver  solver,
208           int (*precond)      (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
209 			       HYPRE_ParVector b, HYPRE_ParVector x),
210           int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
211 			       HYPRE_ParVector b, HYPRE_ParVector x),
212           void *precond_data );
213 int HYPRE_ParCSRLSICGSetLogging(HYPRE_Solver solver, int logging);
214 int HYPRE_ParCSRLSICGGetNumIterations(HYPRE_Solver solver,
215                                              int *num_iterations);
216 int HYPRE_ParCSRLSICGGetFinalRelativeResidualNorm(HYPRE_Solver solver,
217                                                          double *norm );
218 
219 /* HYPRE_parcsr_maxwell.c */
220 int HYPRE_ParCSRCotreeCreate(MPI_Comm comm, HYPRE_Solver *solver);
221 int HYPRE_ParCSRCotreeDestroy(HYPRE_Solver solver);
222 int HYPRE_ParCSRCotreeSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
223                             HYPRE_ParVector b, HYPRE_ParVector x);
224 int HYPRE_ParCSRCotreeSolve(HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
225 							HYPRE_ParVector b, HYPRE_ParVector x);
226 int HYPRE_ParCSRCotreeSetTol(HYPRE_Solver solver, double tol);
227 int HYPRE_ParCSRCotreeSetMaxIter(HYPRE_Solver solver, int max_iter);
228 
229 /* HYPRE_parcsr_superlu.c */
230 int HYPRE_ParCSR_SuperLUCreate(MPI_Comm comm, HYPRE_Solver *solver);
231 int HYPRE_ParCSR_SuperLUDestroy(HYPRE_Solver solver);
232 int HYPRE_ParCSR_SuperLUSetOutputLevel(HYPRE_Solver solver, int);
233 int HYPRE_ParCSR_SuperLUSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
234 							  HYPRE_ParVector b,HYPRE_ParVector x);
235 int HYPRE_ParCSR_SuperLUSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
236 							  HYPRE_ParVector b, HYPRE_ParVector x);
237 
238 /* HYPRE_parcsr_symqmr.c */
239 int HYPRE_ParCSRSymQMRCreate( MPI_Comm comm, HYPRE_Solver *solver );
240 int HYPRE_ParCSRSymQMRDestroy( HYPRE_Solver solver );
241 int HYPRE_ParCSRSymQMRSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
242 							HYPRE_ParVector b, HYPRE_ParVector x );
243 int HYPRE_ParCSRSymQMRSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
244 							HYPRE_ParVector b, HYPRE_ParVector x );
245 int HYPRE_ParCSRSymQMRSetTol( HYPRE_Solver solver, double tol );
246 int HYPRE_ParCSRSymQMRSetMaxIter( HYPRE_Solver solver, int max_iter );
247 int HYPRE_ParCSRSymQMRSetStopCrit( HYPRE_Solver solver, int stop_crit );
248 int HYPRE_ParCSRSymQMRSetPrecond( HYPRE_Solver  solver,
249 								  int (*precond)      (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
250 													   HYPRE_ParVector b, HYPRE_ParVector x),
251 								  int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
252 													   HYPRE_ParVector b, HYPRE_ParVector x),
253 								  void                *precond_data );
254 int HYPRE_ParCSRSymQMRSetLogging( HYPRE_Solver solver, int logging);
255 int HYPRE_ParCSRSymQMRGetNumIterations(HYPRE_Solver solver,
256 									   int *num_iterations);
257 int HYPRE_ParCSRSymQMRGetFinalRelativeResidualNorm(HYPRE_Solver solver,
258 												   double *norm );
259 
260 /* HYPRE_parcsr_TFQmr.c */
261 int HYPRE_ParCSRTFQmrCreate( MPI_Comm comm, HYPRE_Solver *solver );
262 int HYPRE_ParCSRTFQmrDestroy( HYPRE_Solver solver );
263 int HYPRE_ParCSRTFQmrSetup(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
264                                HYPRE_ParVector b, HYPRE_ParVector x );
265 int HYPRE_ParCSRTFQmrSolve(HYPRE_Solver solver,HYPRE_ParCSRMatrix A,
266                                 HYPRE_ParVector b, HYPRE_ParVector x );
267 int HYPRE_ParCSRTFQmrSetTol( HYPRE_Solver solver, double tol );
268 int HYPRE_ParCSRTFQmrSetMaxIter( HYPRE_Solver solver, int max_iter );
269 int HYPRE_ParCSRTFQmrSetStopCrit( HYPRE_Solver solver, int stop_crit );
270 int HYPRE_ParCSRTFQmrSetPrecond( HYPRE_Solver  solver,
271           int (*precond)      (HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
272 			       HYPRE_ParVector b, HYPRE_ParVector x),
273           int (*precond_setup)(HYPRE_Solver sol, HYPRE_ParCSRMatrix matrix,
274 			       HYPRE_ParVector b, HYPRE_ParVector x),
275           void               *precond_data );
276 int HYPRE_ParCSRTFQmrSetLogging( HYPRE_Solver solver, int logging);
277 int HYPRE_ParCSRTFQmrGetNumIterations(HYPRE_Solver solver,
278                                                  int *num_iterations);
279 int HYPRE_ParCSRTFQmrGetFinalRelativeResidualNorm(HYPRE_Solver solver,
280                                                        double *norm );
281 
282 #ifdef __cplusplus
283 }
284 #endif
285 
286 #endif
287