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
00030
00031
00032
00033
00034
00035
00036 #ifndef PCLDUFACTORISATION_HPP_
00037 #define PCLDUFACTORISATION_HPP_
00038
00039 #include <cassert>
00040 #include <petscvec.h>
00041 #include <petscmat.h>
00042 #include <petscksp.h>
00043 #include <petscpc.h>
00044 #include "PetscTools.hpp"
00045
00056 #if (PETSC_VERSION_MAJOR == 3 && PETSC_VERSION_MINOR >= 1) //PETSc 3.1 or later
00057 PetscErrorCode PCLDUFactorisationApply(PC pc_object, Vec x, Vec y);
00058 #else
00059 PetscErrorCode PCLDUFactorisationApply(void* pc_context, Vec x, Vec y);
00060 #endif
00061
00107 class PCLDUFactorisation
00108 {
00109 public:
00110
00114 typedef struct{
00115 Mat A11_matrix_subblock;
00116 Mat A22_matrix_subblock;
00117 Mat B_matrix_subblock;
00118 PC PC_amg_A11;
00119 PC PC_amg_A22;
00120 Vec x1_subvector;
00121 Vec x2_subvector;
00122 Vec y1_subvector;
00123 Vec y2_subvector;
00124 Vec z;
00125 Vec temp;
00126 VecScatter A11_scatter_ctx;
00127 VecScatter A22_scatter_ctx;
00128 #ifdef TRACE_KSP
00129 double mScatterTime;
00130 double mA1PreconditionerTime;
00131 double mA2PreconditionerTime;
00132 double mExtraLAOperations;
00133 double mGatherTime;
00134 #endif
00135
00136 } PCLDUFactorisationContext;
00137
00138 PCLDUFactorisationContext mPCContext;
00139 PC mPetscPCObject;
00141 public:
00142
00148 PCLDUFactorisation(KSP& rKspObject);
00149
00150 ~PCLDUFactorisation();
00151
00152 private:
00153
00159 void PCLDUFactorisationCreate(KSP& rKspObject);
00160
00164 void PCLDUFactorisationSetUp();
00165 };
00166
00167 #endif