• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

ml_struct.h

Go to the documentation of this file.
00001 /* ******************************************************************** */
00002 /* See the file COPYRIGHT for a complete copyright notice, contact      */
00003 /* person and disclaimer.                                               */
00004 /* ******************************************************************** */
00005 
00006 /* ******************************************************************** */
00007 /* Declaration of the ML structure                                      */
00008 /* ******************************************************************** */
00009 /* Author        : Charles Tong (LLNL) and Raymond Tuminaro (SNL)       */
00010 /* Date          : March, 1999                                          */
00011 /* ******************************************************************** */
00012 
00013 #ifndef __MLSTRUCT__
00014 #define __MLSTRUCT__
00015 
00016 /* ******************************************************************** */
00017 /* data structure type definition                                       */
00018 /* ******************************************************************** */
00019 
00020 typedef struct ML_Struct ML;
00021 
00022 /* ******************************************************************** */
00023 /* local include files                                                  */
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 /* WKC -- added header(s) for the new datastructures */
00054 #include <Epetra_MultiVector.h>
00055 #include <Epetra_LocalMap.h>
00056 #endif
00057 
00058 /* ******************************************************************** */
00059 /* ******************************************************************** */
00060 /* data definition for the ML Class                                     */
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;       /* Same idea as MultiLevelPreconditioner().
00079                                      Logically, levels run from 0,...,L, where
00080                                      0 is the finest level and L is the
00081                                      coarsest.  Internally, the fine level's
00082                                      array index is LevelID[0], and the coarse
00083                                      level L's array index is LevelID[L]. */
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; /* turn repartitioning [off]/on */
00091    ML_Partitioner partitioner; /*which partitioner to use: zoltan,parmetis,jostle */
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 /*      User Interface Proto-types                                      */
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 /* WKC -- new prototype for V-cycle solve */
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 /* WKC -- new prototype for V-cycle solve */
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