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 PETSCTOOLS_HPP_
00030 #define PETSCTOOLS_HPP_
00031
00040 #include <string>
00041 #include <vector>
00042 #include <cstdlib>
00043
00044 #ifndef SPECIAL_SERIAL
00045 #include <petsc.h>
00046 #include <petscvec.h>
00047 #include <petscmat.h>
00048 #endif //SPECIAL_SERIAL
00049
00051 #define EXIT_IF_PARALLEL if(!PetscTools::IsSequential()){TS_TRACE("This test does not pass in parallel yet.");return;}
00052
00053 #define EXIT_IF_SEQUENTIAL if(PetscTools::IsSequential()){TS_TRACE("This test is not meant to be executed in sequential.");return;}
00054
00055
00056 #ifndef NDEBUG
00057
00058
00059 #endif
00060
00061
00065 class PetscTools
00066 {
00067 private:
00069 static bool mPetscIsInitialised;
00070
00072 static unsigned mNumProcessors;
00073
00074 #ifdef DEBUG_BARRIERS
00075
00076 static unsigned mNumBarriers;
00077 #endif
00078
00080 static unsigned mRank;
00081
00083 static inline void CheckCache()
00084 {
00085 if (mNumProcessors == 0)
00086 {
00087 ResetCache();
00088 }
00089 }
00090
00091 public:
00092
00096 static const unsigned MASTER_RANK=0;
00097
00102 static void ResetCache();
00103
00107 static bool IsSequential();
00108
00112 static unsigned GetNumProcs();
00113
00119 static unsigned GetMyRank();
00120
00126 static bool AmMaster();
00127
00133 static bool AmTopMost();
00134
00141 static void Barrier(const std::string callerId="");
00142
00143 #ifndef SPECIAL_SERIAL
00144
00151 static Vec CreateVec(int size, int localSize=PETSC_DECIDE);
00152
00158 static Vec CreateVec(std::vector<double> data);
00159
00167 static Vec CreateAndSetVec(int size, double value);
00168
00182 static void SetupMat(Mat& rMat, int numRows, int numColumns,
00183 unsigned rowPreallocation,
00184 int numLocalRows=PETSC_DECIDE,
00185 int numLocalColumns=PETSC_DECIDE);
00186
00193 static bool ReplicateBool(bool flag);
00194
00201 static void ReplicateException(bool flag);
00202
00209 static void DumpPetscObject(const Mat& rMat, const std::string& rOutputFileFullPath);
00210
00217 static void DumpPetscObject(const Vec& rVec, const std::string& rOutputFileFullPath);
00218
00226 static void ReadPetscObject(Mat& rMat, const std::string& rOutputFileFullPath, Vec rParallelLayout=NULL);
00227
00235 static void ReadPetscObject(Vec& rVec, const std::string& rOutputFileFullPath, Vec rParallelLayout=NULL);
00236
00237 #endif //SPECIAL_SERIAL (ifndef)
00238
00247 static void Terminate(const std::string& rMessage, const std::string& rFilename, unsigned lineNumber);
00248
00249
00250 };
00251
00258 #define TERMINATE(message) PetscTools::Terminate(message, __FILE__, __LINE__)
00259
00291 #define NEVER_REACHED PetscTools::Terminate("Should have been impossible to reach this line of code", __FILE__, __LINE__); exit(EXIT_FAILURE)
00292
00293 #endif