00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MLSTRUCT__
00014 #define __MLSTRUCT__
00015
00016
00017
00018
00019
00020 typedef struct ML_Struct ML;
00021
00022
00023
00024
00025
00026 #include "ml_common.h"
00027 #include "ml_defs.h"
00028 #include "ml_bdrypts.h"
00029 #include "ml_mapper.h"
00030 #include "ml_grid.h"
00031 #include "ml_smoother.h"
00032 #include "ml_comminfoop.h"
00033 #include "ml_1level.h"
00034 #include "ml_operator.h"
00035 #include "ml_csolve.h"
00036 #include "ml_operatoragx.h"
00037 #include "ml_comm.h"
00038 #include "ml_gridfunc.h"
00039 #include "ml_vec.h"
00040 #include "ml_rap.h"
00041 #include "ml_utils.h"
00042 #include "ml_mat_formats.h"
00043 #include "ml_solver.h"
00044 #include "ml_krylov.h"
00045 #include "ml_mat_formats.h"
00046 #include "ml_amg.h"
00047 #include "ml_aggregate.h"
00048 #include "ml_mls.h"
00049 #include <string.h>
00050 #include "ml_qr_fix.h"
00051
00052 #ifdef WKC
00053
00054 #include <Epetra_MultiVector.h>
00055 #include <Epetra_LocalMap.h>
00056 #endif
00057
00058
00059
00060
00061
00062
00067 struct ML_Struct {
00068 int id;
00069 char *label;
00070 int ML_init_flag;
00071 int ML_scheme;
00072 int ML_num_levels;
00073 int ML_num_actual_levels;
00076 int ML_num_transfers;
00077 int ML_finest_level, ML_coarsest_level;
00078 int *LevelID;
00079
00080
00081
00082
00083
00084 int symmetrize_matrix;
00085 int output_level;
00086 int res_output_freq;
00087 int MinPerProc_repartition;
00088 int PutOnSingleProc_repartition;
00089 double LargestMinMaxRatio_repartition;
00090 int use_repartitioning;
00091 ML_Partitioner partitioner;
00092 double tolerance;
00093 int max_iterations;
00094 double *spectral_radius;
00095 ML_Smoother *pre_smoother;
00096 ML_Smoother *post_smoother;
00097 ML_CSolve *csolve;
00098 ML_Operator *Amat, *Rmat, *Pmat;
00099 ML_Grid *Grid;
00100 ML_BdryPts *BCs;
00101 ML_Mapper *eqn2grid;
00102 ML_Mapper *grid2eqn;
00103 ML_1Level *SingleLevel;
00104 ML_DVector *Amat_Normalization;
00105 struct ML_Timing
00106 *timing;
00107 ML_Comm *comm;
00108 int *int_options;
00109 double *dble_options;
00110 void *void_options;
00111 int (*func)(void);
00113 };
00114 struct ML_Timing {
00115 double precond_apply_time;
00116 double total_build_time;
00117 };
00118
00123 typedef struct ML_PrintControl_Struct ML_PrintControl;
00124
00125 struct ML_PrintControl_Struct {
00126 int output_level;
00127 };
00128
00129 extern ML_PrintControl ML_PrintLevel;
00130
00131
00132
00133
00134
00135
00136
00137 #ifndef ML_CPP
00138 #ifdef __cplusplus
00139 extern "C" {
00140 #endif
00141 #endif
00142
00143 extern int ML_Create(ML **ml, int Nlevels);
00144 extern int ML_build_ggb( ML *ml, void *data);
00145 extern void ML_build_ggb_cheap(ML *ml, void *data);
00146 extern void ML_build_ggb_fat(ML *ml, void *data);
00147 extern int ML_Set_Symmetrize(ML *ml, int true_or_false);
00148 extern int ML_Set_OutputLevel(ML *ml, int output_level);
00149 extern int ML_Set_PrintLevel(int);
00150 extern int ML_Get_PrintLevel(void);
00151 extern int ML_Set_ResidualOutputFrequency(ML *ml, int output_freq);
00152 extern int ML_Set_Tolerance(ML *ml, double tolerance);
00153 extern int ML_Set_MaxIterations(ML *ml, int iterations);
00154 extern int ML_Print_Timing(ML *ml);
00155 extern int ML_Set_SpectralNormScheme_Calc( ML *ml);
00156 extern int ML_Set_SpectralNormScheme_Anorm( ML *ml);
00157 extern int ML_Set_SpectralNormScheme_Anasazi( ML *ml);
00158 extern int ML_Set_SpectralNormScheme_PowerMethod(ML *ml);
00159 extern int ML_Set_SpectralNorm_Iterations(ML *ml, int its);
00160
00161
00162 extern int ML_Destroy(ML **ml);
00163 #ifdef GREG
00164 extern int ML_Destroy2(ML **ml);
00165 #endif
00166 extern void ML_Solve_SmootherDestroy(void *data);
00167
00168 extern int ML_Init_Comm(ML *ml);
00169 extern int ML_Set_Comm_MyRank(ML *ml, int myrank);
00170 extern int ML_Set_Comm_Nprocs(ML *ml, int nprocs);
00171 extern int ML_Set_Comm_Communicator(ML *ml, USR_COMM com);
00172 extern int ML_Set_Comm_Send(ML *ml, int (*send)(void*,unsigned int,int,int,USR_COMM));
00173 extern int ML_Set_Comm_Recv(ML *ml, int (*recv)(void*,unsigned int,int*,int*,USR_COMM,USR_REQ*));
00174 extern int ML_Set_Comm_Wait(ML *ml, int (*wait)(void*,unsigned int,int*,int*,USR_COMM,USR_REQ*));
00175
00176 extern int ML_Set_Comm(ML *ml, ML_Comm *comm);
00177
00178 extern int ML_Init_Grid(ML *, int nl, void *grid);
00179 extern int ML_Set_Grid_GridFunc(ML *, int nl, ML_GridFunc *);
00180 extern int ML_Set_Grid_MaxVertPerElmnt(ML *, int, int nvert);
00181 extern int ML_Set_Grid_GetDimension(ML *, int nl, int (*func)(void *));
00182 extern int ML_Set_Grid_GetNVert(ML *, int nl, int (*func)(void *));
00183 extern int ML_Set_Grid_GetNElmnt(ML *, int nl, int (*func)(void *));
00184 extern int ML_Set_Grid_GetElmntNVert(ML *, int nl, int (*func)(void *, int));
00185 extern int ML_Set_Grid_GetElmntVertList(ML *, int nl, int (*func)(void *, int, int *));
00186 extern int ML_Set_Grid_GetVertGlobalNum(ML *, int nl, int (*func)(void *, int));
00187 extern int ML_Set_Grid_GetElmntGlobalNum(ML *, int nl, ml_big_int (*func)(void *, int));
00188 extern int ML_Set_Grid_GetVertCoordinate(ML *, int nl, int (*func)(void *, int, double *));
00189 extern int ML_Set_Grid_ComputeBasisCoef(ML *, int nl, int (*func)(void*,int,double*,int,double*,int*));
00190 extern int ML_Set_Grid_GetElmntVolume(ML *, int nl, int (*func)(void*,int,int*,double*));
00191 extern int ML_Set_Grid_GetElmntMatrix(ML *, int nl, int (*func)(void*,int,double**));
00192 extern int ML_Set_Grid_GetElmntNullSpace(ML *, int, int (*func)(void*,int,double*));
00193
00194
00195 extern int ML_Gen_GridXsferUsingFEBasis(ML *, int L1, int L2, int stride);
00196 extern int ML_Gen_MGHierarchyVanek(ML *, int start, int increment_or_decrement);
00197
00198 extern int ML_Set_Grid(ML *, int nl, void *grid, ML_GridFunc *);
00199
00200 extern int ML_Init_Amatrix(ML *,int level,int ilen,int olen,void *data);
00201 extern int ML_Get_Amatrix(ML *ml, int level, ML_Operator **matrix);
00202 extern int ML_Set_Amatrix_Matvec(ML*,int,
00203 int (*func)(ML_Operator*,int,double*,int,double*));
00204 extern int ML_Set_Amatrix_Diag(ML*,int,int, double *);
00205 extern int ML_Set_Amatrix_Getrow(ML *ml, int level,
00206 int (*getrow)(ML_Operator*,int,int*,int,int*,double*,int*),
00207 int (*comm )(double *vec, void *data), int comm_vec_leng);
00208 extern int ML_Set_Amatrix_GetrowNeighbors(ML*,int,int N_neigh,int *nlist);
00209 extern int ML_Set_Amatrix_GetrowCommInfo(ML *, int level, int neighbor,
00210 int N_rcv, int *rcv_list, int N_send, int *send_list);
00211 extern int ML_Set_Amatrix_NormalizationFactors(ML*,int,int n,double *fact);
00212 extern int ML_Set_Amatrix_NullSpace(ML *, int, int, int, double *);
00213
00214 extern void ML_setup_grid_xsfer_op(void *, ML_GridFunc *, void *,
00215 ML_GridFunc *, void **xsfer, ML_Comm *);
00216
00217 extern int ML_Init_Restrictor(ML*,int L1,int L2,int,int,void *data);
00218 extern int ML_Set_Restrictor_Matvec(ML*,int,
00219 int (*func)(ML_Operator*,int,double*,int,double*));
00220 extern int ML_Set_Restrictor_Getrow(ML *ml, int level,
00221 int (*getrow)(ML_Operator*,int,int*,int,int*,double*,int*),
00222 int (*comm )(double *vec, void *data), int comm_vec_leng);
00223 extern int ML_Set_Restrictor_GetrowNeighbors(ML *ml,int level,int N_neigh,
00224 int *neigh_list);
00225 extern int ML_Set_Restrictor_GetrowCommInfo(ML *ml,int level,int neighbor,
00226 int N_rcv, int *rcv_list, int N_send, int *send_list);
00227
00228 extern int ML_Init_Prolongator(ML*,int L1,int L2,int,int,void *data);
00229 extern int ML_Set_Prolongator_Matvec(ML *ml, int level,
00230 int (*func) (ML_Operator *,int, double *, int, double *));
00231 extern int ML_Set_Prolongator_Getrow(ML *ml, int level,
00232 int (*getrow)(ML_Operator*,int,int*,int,int*,double*,int*),
00233 int (*comm )(double *vec, void *data), int comm_vec_leng);
00234 extern int ML_Set_Prolongator_GetrowNeighbors(ML *ml,int level,int N_neigh,
00235 int *neigh_list);
00236 extern int ML_Set_Prolongator_GetrowCommInfo(ML *ml,int level,int neighbor,
00237 int N_rcv, int *rcv_list, int N_send, int *send_list);
00238
00239 extern int ML_Gen_Blocks_Metis(ML *ml, int level, int *nblocks,int **block_list);
00240
00241 extern int ML_Gen_Smoother_Jacobi( ML *, int nl, int pre_or_post,
00242 int ntimes, double omega );
00243 extern int ML_Gen_Smoother_GaussSeidel(ML*,int nl,int pre_post,int ntimes,double);
00244 extern int ML_Gen_Smoother_Hiptmair(ML*,int nl,int pre_post,int ntimes,
00245 ML_Operator**, ML_Operator**, ML_Operator*, ML_Operator**,
00246 void *, void **,
00247 void *, void **, int);
00248 extern int ML_Gen_Smoother_Hiptmair2(ML*,int nl,int pre_post,int ntimes,
00249 ML_Operator**, ML_Operator**, ML_Operator*, ML_Operator**,ML_Operator*,
00250 void *, void **,
00251 void *, void **, int);
00252 extern int ML_Gen_Smoother_BlockHiptmair(ML*,int nl,int pre_post,int ntimes,
00253 ML_Operator**, ML_Operator**, ML_Operator*,
00254 void *, void **,
00255 void *, void **, int);
00256 extern int ML_Gen_Smoother_SymGaussSeidel(ML*,int nl,int pre_post,int ntimes,
00257 double omega);
00258 extern int ML_Gen_Smoother_EffSymGaussSeidel(ML*,int nl,int pre_post,int ntimes,
00259 double omega);
00260 extern int ML_Gen_Smoother_SymGaussSeidelSequential(ML*,int nl,int pre_post,
00261 int ntimes, double omega);
00262 extern int ML_Gen_Smoother_MLS(ML*,int nl,int pre_post, double eig,
00263 int degree);
00264 extern int ML_Gen_Smoother_Cheby(ML*,int nl,int pre_post, double eig,
00265 int degree);
00266 extern int ML_Gen_Smoother_ERF_1StepKrylov(ML *ml, int nl, int pre_or_post);
00267
00268 extern int ML_Gen_Smoother_SubdomainOverlap(ML *ml, int level, int overlap);
00269
00270 extern int ML_Gimmie_Eigenvalues(ML_Operator *Amat, int scale_by_diag,
00271 int matrix_is_nonsymmetric, int symmetrize_matrix);
00272 extern int ML_Gen_Smoother_BlockDiagScaledCheby(ML *ml, int nl,
00273 int pre_or_post,
00274 double eig_ratio, int deg,
00275 int nBlocks, int *blockIndices);
00276 extern int ML_Gen_BlockScaledMatrix_with_Eigenvalues(ML_Operator *Amat,
00277 int nBlocks,
00278 int *blockIndices,
00279 ML_Operator **blockMat,
00280 struct MLSthing *widget);
00281
00282 extern int ML_Gen_Smoother_OrderedSymGaussSeidel(ML *ml , int nl, int pre_or_post,
00283 int ntimes, double omega);
00284
00285 extern int ML_Gen_Smoother_ParaSails(ML *ml, int nl, int pre_or_post, int ntimes,
00286 int sym, double thresh, int num_levels, double filter, int , int);
00287
00288 extern int ML_Gen_Smoother_SymBlockGaussSeidel(ML*,int nl,int pre_post,
00289 int ntimes, double omega, int blocksize);
00290 extern int ML_Gen_Smoother_BlockGaussSeidel(ML*,int nl,int pre_post,int ntimes,
00291 double omega, int blocksize);
00292 extern void BGS_Clean(void *data);
00293 extern int ML_Gen_Smoother_VBlockJacobi(ML*,int nl,int pre_post, int ntimes,
00294 double omeg, int Nblocks, int *blockList);
00295 extern int ML_Gen_Smoother_VBlockSymGaussSeidel(ML*,int nl,int pre_post,
00296 int ntimes, double omega, int Nblocks, int *blockList);
00297 extern int ML_Gen_Smoother_VBlockSymGaussSeidelSequential(ML*,int nl, int,
00298 int ntimes,double omega,int Nblocks,int *blockList);
00299 extern int ML_Gen_Smoother_VBlockKrylovJacobi(ML*,int nl,int pre_post, int ntimes,
00300 double omeg, int Nblocks, int *blockList);
00301 extern int ML_Gen_Smoother_OverlappedDDILUT(ML*,int nl,int pre_post);
00302 extern int ML_Gen_Smoother_VBlockAdditiveSchwarz(ML *,int nl,int pre_or_post,
00303 int ntimes, int length, int *blkinfo);
00304 extern int ML_Gen_Smoother_VBlockMultiplicativeSchwarz(ML *,int nl,
00305 int pre_or_post, int ntimes, int length, int *blkinfo);
00306 #include "ml_petsc.h"
00307 #ifdef HAVE_PETSC
00308 extern int ML_Gen_Smoother_Petsc(ML *ml, int level, int pre_or_post, int ntimes, ML_PetscKSP petscKSP);
00309 #endif
00310
00311 extern int ML_Gen_Smoother_GSextra( ML *ml , int nl, int pre_or_post,
00312 int ntimes, double omega, int Nextra, int extra[]);
00313 extern int ML_Set_Smoother(ML *, int nl , int pre_post, void *obj,
00314 int (*func)(ML_Smoother *, int, double *, int, double *),
00315 char *);
00316
00317 extern int ML_Gen_CoarseSolverSuperLU(ML *ml_handle, int level);
00318 extern int ML_Gen_CoarseSolverAggregation(ML *ml_handle, int level,
00319 ML_Aggregate *ag);
00320
00321 extern int ML_Gen_AmatrixRAP(ML *ml, int to_level, int from_level);
00322 extern int ML_Gen_Amatrix_Global(ML_Matrix_DCSR *inmat,
00323 ML_Matrix_DCSR *outmat, ML_Comm *comm, int *offset);
00324
00325 extern int ML_Set_EqnToGridMapFunc(ML *, int,int fleng,int tleng,
00326 int (*func)(void*,double*,double*));
00327 extern int ML_Set_GridToEqnMapFunc(ML *, int,int fleng,int tleng,
00328 int (*func)(void*,double*,double*));
00329 extern int ML_Set_BoundaryTypes(ML*,int level,int type,int n,int *data);
00330
00331 extern int ML_Setup(ML *ml, int method, int finest_level, int, void *);
00332
00333 extern int ML_Gen_Solver(ML *ml, int method, int finest_level, int);
00334 extern int ML_Iterate(ML *ml, double *sol, double *rhs);
00335 extern int ML_Solve(ML *ml, int inlen, double *sol, int outlen, double *rhs);
00336
00337 int ML_Solve_MGV( ML *ml , double *din, double *dout);
00338
00339
00340
00341
00342 #ifdef WKC
00343
00344 int ML_Solve_MGV( ML *ml , const Epetra_MultiVector &in ,
00345 Epetra_MultiVector &out );
00346 #endif
00347
00348 extern int ML_Solve_MGFull( ML *ml , double *din, double *dout);
00349 extern int ML_Solve_Smoother(void *data, int isize, double *x, int osize,
00350 double *rhs);
00351
00352 extern double ML_Cycle_MG(ML_1Level *curr, double *sol, double *rhs,
00353 int approx_all_zeros, ML_Comm *comm, int, ML *ml);
00354
00355 extern int ML_Cycle_GGB(ML *ml_ggb, double *sol, double *rhs);
00356
00357
00358 #ifdef WKC
00359
00360 extern double ML_Cycle_MG(ML_1Level *curr, Epetra_MultiVector &ep_sol,
00361 Epetra_MultiVector &ep_rhs,
00362 int approx_all_zeros, ML_Comm *comm, int, ML *ml);
00363 #endif
00364
00365 extern double ML_Cycle_MGFull(ML_1Level *curr, double *sol, double *rhs,
00366 int approx_all_zeros, ML_Comm *comm, int, ML *ml);
00367 extern int ML_Solve_AMGV( ML *ml , double *din, double *dout);
00368 extern double ML_Cycle_AMGV(ML_1Level *curr, double *sol, double *rhs,
00369 int approx_all_zeros, ML_Comm *comm);
00370 extern int ML_Solve_ProjectedAMGV( ML *ml , double *din, double *dout);
00371 extern int ML_Gen_SmootherGSextra( ML *ml , int nl, int pre_or_post,
00372 int ntimes, double omega, int Nextra,
00373 int extra[]);
00374 extern int ML_MLS_Setup_Coef(void *sm, int deg, int symmetrize);
00375 extern int ML_Seg_Solve( ML *ml , double *din, double *dout);
00376 extern int ML_Clean_CSolveSuperLU( void *vsolver, ML_CSolveFunc *func);
00377 extern int ML_Solver_SetScheme(ML *ml, int scheme);
00378 extern int ML_Smoother_Reinit(ML *ml);
00379
00380 extern void ML_Repartition_Set_LargestMinMaxRatio(ML*, double);
00381 extern double ML_Repartition_Get_LargestMinMaxRatio(ML* ml);
00382 extern void ML_Repartition_Set_MinPerProc(ML*, int);
00383 extern void ML_Repartition_Set_PutOnSingleProc(ML*, int);
00384 extern int ML_Repartition_Get_MinPerProc(ML* ml);
00385 extern void ML_Repartition_Set_Partitioner(ML*, ML_Partitioner);
00386 extern ML_Partitioner ML_Repartition_Get_Partitioner(ML* ml);
00387 extern void ML_Repartition_Activate(ML* ml);
00388 extern void ML_Repartition_Deactivate(ML* ml);
00389 extern int ML_Repartition_Status(ML* ml);
00390 extern int ML_Use_LowMemory();
00391 extern void ML_Enable_LowMemory();
00392 extern void ML_Disable_LowMemory();
00393 extern void ML_Set_LevelID(ML *ml, int incr_or_decr);
00394 extern int ML_Get_LevelID(ML *ml, int logical_level);
00395 extern void ML_Set_Label( ML *ml, char *label);
00396 extern int ML_Get_Label( ML *ml, char *label);
00397
00398 #ifndef ML_CPP
00399 #ifdef __cplusplus
00400 }
00401 #endif
00402 #endif
00403
00404 #endif
00405
00406
00407