PCLDUFactorisation.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 PCLDUFACTORISATION_HPP_
00030 #define PCLDUFACTORISATION_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 PCLDUFactorisationApply(PC pc_object, Vec x, Vec y);
00051 #else
00052 PetscErrorCode PCLDUFactorisationApply(void* pc_context, Vec x, Vec y);
00053 #endif
00054
00104 class PCLDUFactorisation
00105 {
00106 public:
00107
00111 typedef struct{
00112 Mat A11_matrix_subblock;
00113 Mat A22_matrix_subblock;
00114 Mat B_matrix_subblock;
00115 PC PC_amg_A11;
00116 PC PC_amg_A22;
00117 Vec x1_subvector;
00118 Vec x2_subvector;
00119 Vec y1_subvector;
00120 Vec y2_subvector;
00121 Vec z;
00122 Vec temp;
00123 VecScatter A11_scatter_ctx;
00124 VecScatter A22_scatter_ctx;
00125 #ifdef TRACE_KSP
00126 double mScatterTime;
00127 double mA1PreconditionerTime;
00128 double mA2PreconditionerTime;
00129 double mExtraLAOperations;
00130 double mGatherTime;
00131 #endif
00132
00133 } PCLDUFactorisationContext;
00134
00135 PCLDUFactorisationContext mPCContext;
00136 PC mPetscPCObject;
00138 public:
00139
00145 PCLDUFactorisation(KSP& rKspObject);
00146
00147 ~PCLDUFactorisation();
00148
00149 private:
00150
00156 void PCLDUFactorisationCreate(KSP& rKspObject);
00157
00161 void PCLDUFactorisationSetUp();
00162 };
00163
00164 #endif