IFPACK
Development
Toggle main menu visibility
Loading...
Searching...
No Matches
src
euclid
Euclid_dh.h
1
/*@HEADER
2
// ***********************************************************************
3
//
4
// Ifpack: Object-Oriented Algebraic Preconditioner Package
5
// Copyright (2002) Sandia Corporation
6
//
7
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8
// license for use of this work by or on behalf of the U.S. Government.
9
//
10
// Redistribution and use in source and binary forms, with or without
11
// modification, are permitted provided that the following conditions are
12
// met:
13
//
14
// 1. Redistributions of source code must retain the above copyright
15
// notice, this list of conditions and the following disclaimer.
16
//
17
// 2. Redistributions in binary form must reproduce the above copyright
18
// notice, this list of conditions and the following disclaimer in the
19
// documentation and/or other materials provided with the distribution.
20
//
21
// 3. Neither the name of the Corporation nor the names of the
22
// contributors may be used to endorse or promote products derived from
23
// this software without specific prior written permission.
24
//
25
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
//
37
// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38
//
39
// ***********************************************************************
40
//@HEADER
41
*/
42
43
#ifndef EUCLID_MPI_INTERFACE_DH
44
#define EUCLID_MPI_INTERFACE_DH
45
46
#define DEFAULT_DROP_TOL 0.01
47
48
#include "euclid_common.h"
49
50
/*======================================================================
51
* Naming convention: functions ending in _mpi are located in
52
* src/Euclid_mpi.c; those ending in _seq are in src/Euclid_seq.c;
53
* most others should be in Euclid_all.c.
54
*
55
* Exceptions: all Apply() (triangular solves) are in src/Euclid_apply.c;
56
* except for the Apply for MPI PILU, which is called
57
* Mat_dhSolve, and is in src/Mat_dh.c
58
*
59
* Users should only need to call functions with names of the form
60
* Euclid_dhXXX (public functions).
61
*
62
* Some of the functions whose names are of the form XXX_private_XXX,
63
* as could easily be static functions; similarly, the enums and
64
* structs do need to be public. They are, primarily, for ease in
65
* debugging and ready reference.
66
*
67
* Exceptions: the apply_private functions aren't listed here --- they're
68
* all static in src/Euclid_apply.c
69
*======================================================================*/
70
#ifdef __cplusplus
71
extern
"C"
72
{
73
#endif
74
75
extern
void
Euclid_dhCreate (Euclid_dh * ctxOUT);
76
extern
void
Euclid_dhDestroy (Euclid_dh ctx);
77
extern
void
Euclid_dhSetup (Euclid_dh ctx);
78
extern
void
Euclid_dhSolve (Euclid_dh ctx, Vec_dh lhs, Vec_dh rhs,
79
int
*its);
80
extern
void
Euclid_dhApply (Euclid_dh ctx,
double
*lhs,
double
*rhs);
81
82
extern
void
Euclid_dhPrintTestData (Euclid_dh ctx, FILE * fp);
83
extern
void
Euclid_dhPrintScaling (Euclid_dh ctx, FILE * fp);
84
85
extern
void
Euclid_dhPrintStatsShort (Euclid_dh ctx,
double
setup,
86
double
solve, FILE * fp);
87
88
89
extern
void
Euclid_dhPrintStatsShorter (Euclid_dh ctx, FILE * fp);
90
/* on-line reporting, for making quick tables */
91
92
extern
void
Euclid_dhPrintHypreReport (Euclid_dh ctx, FILE * fp);
93
94
extern
void
Euclid_dhPrintStats (Euclid_dh ctx, FILE * fp);
95
/* prints same info as Euclid_dhPrintParams(), but also
96
prints timing information, number of iterations, etc;
97
may be called after solve is completed.
98
*/
99
100
101
/*----------------------------------------------------------------------
102
* Private data structures
103
*----------------------------------------------------------------------*/
104
105
#define MAX_OPT_LEN 20
106
107
/* for internal timing */
108
#define TIMING_BINS 10
109
enum
110
{ SOLVE_START_T,
111
TRI_SOLVE_T,
/* triangular solves */
112
SETUP_T,
/* total setup */
113
SUB_GRAPH_T,
/* setup SubdomainGraph_dh */
114
FACTOR_T,
/* factorization */
115
SOLVE_SETUP_T,
/* setup for solves */
116
COMPUTE_RHO_T,
117
/* note: SETUP_T - (FACTOR_T + SUB_GRAPH_T) should be small! */
118
TOTAL_SOLVE_TEMP_T,
119
TOTAL_SOLVE_T
120
};
121
122
/* for statistical reporting */
123
#define STATS_BINS 10
124
enum
125
{ NZA_STATS,
/* cumulative nonzeros for all systems solved */
126
NZF_STATS,
/* cumulative nonzeros for all systems solved */
127
NZA_USED_STATS,
/* cumulative nonzeros NOT dropped by sparseA */
128
NZA_RATIO_STATS
/* NZA_USED_STATS/NZA_STATS, over all processors */
129
};
130
131
132
/* primary data structure: this is monstrously long; but it works.
133
Users must ensure the following fields are initialized prior
134
to calling Euclid_dhSetup(): m, n, beg_row, A
135
*/
136
struct
_mpi_interface_dh
137
{
138
bool
isSetup;
139
140
double
rho_init;
141
double
rho_final;
142
/* Memory allocation for factor; will initially allocate space for
143
rho_init*nzA nonzeros; rho_final is computed after factorization,
144
and is the minimum that rho_init whoulc have been to avoid
145
memory reallocation; rho_final is a maximum across all processors.
146
*/
147
148
int
m;
/* local rows in matrix */
149
int
n;
/* global rows in matrix */
150
double
*rhs;
/* used for debugging; this vector is not owned! */
151
void
*A;
/* void-pointer to Epetra_CrsMatrix */
152
Factor_dh F;
/* data structure for the factor, F = L+U-I */
153
SubdomainGraph_dh sg;
154
155
REAL_DH *scale;
/* row scaling vector */
156
bool
isScaled;
/* set at runtime, turns scaling on or off */
157
158
/* workspace for factorization and triangular solves */
159
double
*work;
160
double
*work2;
161
int
from, to;
/* which local rows to factor or solve */
162
163
/* runtime parameters (mostly) */
164
char
algo_par[MAX_OPT_LEN];
/* parallelization strategy */
165
char
algo_ilu[MAX_OPT_LEN];
/* ILU factorization method */
166
int
level;
/* for ILU(k) */
167
double
droptol;
/* for ILUT */
168
double
sparseTolA;
/* for sparsifying A */
169
double
sparseTolF;
/* for sparsifying the factors */
170
double
pivotMin;
/* if pivots are <= to this value, fix 'em */
171
double
pivotFix;
/* multiplier for adjusting small pivots */
172
double
maxVal;
/* largest abs. value in matrix */
173
174
/* data structures for parallel ilu (pilu) */
175
SortedList_dh slist;
176
ExternalRows_dh extRows;
177
178
/* for use with Euclid's internal krylov solvers; */
179
char
krylovMethod[MAX_OPT_LEN];
180
int
maxIts;
181
double
rtol;
182
double
atol;
183
int
its;
/* number of times preconditioner was applied since last call to Setup */
184
int
itsTotal;
/* cululative number of times preconditioner was applied */
185
186
/* internal statistics */
187
int
setupCount;
188
int
logging;
189
double
timing[TIMING_BINS];
190
double
stats[STATS_BINS];
191
bool
timingsWereReduced;
192
bool
printStats;
/* if true, on 2nd and subsequent calls to Setup,
193
calls Euclid_dhPrintStatsShorter(). Intent is to
194
print out stats for each setup phase when
195
using Euclid, e.g, for nonlinear solves.
196
*/
197
};
198
199
#ifdef __cplusplus
200
}
201
#endif
202
#endif
/* #ifndef EUCLID_MPI_INTERFACE_DH */
_mpi_interface_dh
Definition
Euclid_dh.h:137
Generated by
1.17.0