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 PCBLOCKDIAGONAL_HPP_
00031 #define PCBLOCKDIAGONAL_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 PCBlockDiagonalApply(PC pc_context, Vec x, Vec y);
00052 #else
00053 PetscErrorCode PCBlockDiagonalApply(void* pc_context, Vec x, Vec y);
00054 #endif
00055
00079 class PCBlockDiagonal
00080 {
00081 public:
00085 typedef struct{
00086 Mat A11_matrix_subblock;
00087 Mat A22_matrix_subblock;
00088 PC PC_amg_A11;
00089 PC PC_amg_A22;
00090 Vec x1_subvector;
00091 Vec x2_subvector;
00092 Vec y1_subvector;
00093 Vec y2_subvector;
00094 VecScatter A11_scatter_ctx;
00095 VecScatter A22_scatter_ctx;
00097 } PCBlockDiagonalContext;
00098
00099 PCBlockDiagonalContext mPCContext;
00100 PC mPetscPCObject;
00102 public:
00103
00109 PCBlockDiagonal(KSP& rKspObject);
00110
00111 ~PCBlockDiagonal();
00112
00113 private:
00119 void PCBlockDiagonalCreate(KSP& rKspObject);
00120
00124 void PCBlockDiagonalSetUp();
00125 };
00126 #endif