00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef PCTWOLEVELSBLOCKDIAGONAL_HPP_
00031 #define PCTWOLEVELSBLOCKDIAGONAL_HPP_
00032
00033 #include <cassert>
00034 #include <petscvec.h>
00035 #include <petscmat.h>
00036 #include <petscksp.h>
00037 #include <petscpc.h>
00038 #include "PetscTools.hpp"
00039
00050 #if (PETSC_VERSION_MAJOR == 3 && PETSC_VERSION_MINOR == 1) //PETSc 3.1
00051 PetscErrorCode PCTwoLevelsBlockDiagonalApply(PC pc_context, Vec x, Vec y);
00052 #else
00053 PetscErrorCode PCTwoLevelsBlockDiagonalApply(void* pc_context, Vec x, Vec y);
00054 #endif
00055
00057
00080 class PCTwoLevelsBlockDiagonal
00081 {
00082 public:
00086 typedef struct{
00087 Mat A11_matrix_subblock;
00088 Mat A22_B1_matrix_subblock;
00089 Mat A22_B2_matrix_subblock;
00090 PC PC_amg_A11;
00091 PC PC_amg_A22_B1;
00092 PC PC_amg_A22_B2;
00093 Vec x1_subvector;
00094 Vec x21_subvector;
00095 Vec x22_subvector;
00096 Vec y1_subvector;
00097 Vec y21_subvector;
00098 Vec y22_subvector;
00099 VecScatter A11_scatter_ctx;
00100 VecScatter A22_B1_scatter_ctx;
00101 VecScatter A22_B2_scatter_ctx;
00103 } PCTwoLevelsBlockDiagonalContext;
00104
00105 PCTwoLevelsBlockDiagonalContext mPCContext;
00106 PC mPetscPCObject;
00108 public:
00109
00116 PCTwoLevelsBlockDiagonal(KSP& rKspObject, std::vector<PetscInt>& rBathNodes);
00117
00118 ~PCTwoLevelsBlockDiagonal();
00119
00120 private:
00127 void PCTwoLevelsBlockDiagonalCreate(KSP& rKspObject, std::vector<PetscInt>& rBathNodes);
00128
00132 void PCTwoLevelsBlockDiagonalSetUp();
00133 };
00134 #endif