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