00001 00002 #ifndef AMGSOLVERSTRUCTURE_H 00003 #define AMGSOLVERSTRUCTURE_H 00004 00005 #include <petscksp.h> 00006 #include <petscmat.h> 00007 #include "uth_log.h" 00008 #include "uth_system.h" 00009 #include "../amg/RSCFSplitter.hpp" 00010 #include "../amg/GeneralRSCFSplitter.hpp" 00011 #include "../amg/GaussSidelMethod.hpp" 00012 #include "../amg/DirectSolver.hpp" 00013 #include "../amg/Interpolation/DirectInterpolation.hpp" 00014 #include "../amg/Interpolation/GeneralInterpolation.hpp" 00015 #include "ErrorEvaluator.hpp" 00016 #include "KnownSolutionErrorEvaluator.hpp" 00017 #include "ResidualBasedErrorEvaluator.hpp" 00018 00019 00020 class AMGSolverStructure 00021 { 00022 public: 00023 00024 AMGSolverStructure(Mat matrix, Vec rhs, int size, ErrorEvaluator* error_evaluator, bool create_coarsening_scheme); 00025 ~AMGSolverStructure(); 00026 void CreateAMGSolverLevels(int coarsening_algorithm, int interpolation_algorithm, double strength_threshold, int levels_number); 00027 Vec RunVCycle(int pre, int post, int global, int local); 00028 void RunVCycle(int levelId, double* X); 00029 void InitVCycle(); 00030 void EndVCycle(); 00031 void ExtractCoarseRowsNumbers(); 00032 void ChangeSystem(Vec rhs, int max_iterations); 00033 void MoveSolutionFromLevel(int level); 00034 void MoveSolutionToLevel(int level); 00035 00036 private: 00037 RSCFSplitter* GetSplitter(int levelNumber, double strength_threshold, int coarsening_algorithm, int interpolation_algorithm); 00038 void SmoothLevel(int level); 00039 void SolveFromLevel(int level,int pre, int post, int global, int local); 00040 void SolveFinalLevel(); 00041 00042 00043 Mat matrix; 00044 Vec rhs; 00045 int size; 00046 bool create_coarsening_scheme; 00047 00048 00049 Mat* amg_level_matrices; 00050 Mat* amg_interpolation_matrices; 00051 Vec* amg_level_rhs; 00052 Vec* amg_level_x; 00053 Vec* amg_level_residuals; 00054 int* amg_level_sizes; 00055 int levelsNumber; 00056 00057 CFSplitter** cf_splitters; 00058 Smoother** smoothers; 00059 ErrorEvaluator* error_evaluator; 00060 std::list<int> **coarseRowsNumbers; 00061 00062 int GetLevelsNumber(); 00063 void InitLevels(); 00064 void CreateNextLevel(int levelNumber); 00065 00066 }; 00067 00068 #endif