PCBlockDiagonal.hpp
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 #ifndef PCBLOCKDIAGONAL_HPP_
00030 #define PCBLOCKDIAGONAL_HPP_
00031
00032 #include <cassert>
00033 #include <petscvec.h>
00034 #include <petscmat.h>
00035 #include <petscksp.h>
00036 #include <petscpc.h>
00037 #include "PetscTools.hpp"
00038
00049 #if (PETSC_VERSION_MAJOR == 3 && PETSC_VERSION_MINOR == 1) //PETSc 3.1
00050 PetscErrorCode PCBlockDiagonalApply(PC pc_context, Vec x, Vec y);
00051 #else
00052 PetscErrorCode PCBlockDiagonalApply(void* pc_context, Vec x, Vec y);
00053 #endif
00054
00082 class PCBlockDiagonal
00083 {
00084 public:
00085
00089 typedef struct{
00090 Mat A11_matrix_subblock;
00091 Mat A22_matrix_subblock;
00092 PC PC_amg_A11;
00093 PC PC_amg_A22;
00094 Vec x1_subvector;
00095 Vec x2_subvector;
00096 Vec y1_subvector;
00097 Vec y2_subvector;
00098 VecScatter A11_scatter_ctx;
00099 VecScatter A22_scatter_ctx;
00100 #ifdef TRACE_KSP
00101 double mScatterTime;
00102 double mA1PreconditionerTime;
00103 double mA2PreconditionerTime;
00104 double mGatherTime;
00105 #endif
00106
00107 } PCBlockDiagonalContext;
00108
00109 PCBlockDiagonalContext mPCContext;
00110 PC mPetscPCObject;
00117 PCBlockDiagonal(KSP& rKspObject);
00118
00119 ~PCBlockDiagonal();
00120
00121 private:
00122
00128 void PCBlockDiagonalCreate(KSP& rKspObject);
00129
00133 void PCBlockDiagonalSetUp();
00134 };
00135
00136 #endif