PetscSetupAndFinalize.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 _PETSCSETUPANDFINALIZE_HPP_
00030 #define _PETSCSETUPANDFINALIZE_HPP_
00031
00037 #ifdef TEST_FOR_FPE
00038 #include <fenv.h>
00039 #include <signal.h>
00040 #endif
00041
00042 #include <cxxtest/GlobalFixture.h>
00043 #include <petsc.h>
00044 #include <cstdlib>
00045 #include <cassert>
00046 #include <cstring>
00047 #include <unistd.h>
00048 #include <iostream>
00049
00050 #include "Exception.hpp"
00051 #include "PetscException.hpp"
00052 #include "CommandLineArguments.hpp"
00053 #include "ChasteBuildRoot.hpp"
00054 #include "GetCurrentWorkingDirectory.hpp"
00055
00056 #ifdef TEST_FOR_FPE
00057 void FpeSignalToAbort(int sig_num, siginfo_t* info, void* context )
00058 {
00059 if ( info->si_code == FPE_FLTDIV)
00060 {
00061 std::cerr<<"SIGFPE: floating point exception was divide by zero.\n";
00062 }
00063 else if ( info->si_code == FPE_FLTINV)
00064 {
00065 std::cerr<<"SIGFPE: floating point exception was an invalid operation (like 0.0/0.0).\n";
00066 }
00067 else
00068 {
00069 std::cerr<<"SIGFPE: unexpected error code.\n";
00070 }
00071 }
00072 #endif
00073
00074 class PetscSetup : public CxxTest::GlobalFixture
00075 {
00076 public:
00077
00079 bool setUpWorld()
00080 {
00085 CommandLineArguments* p_args = CommandLineArguments::Instance();
00086 PETSCEXCEPT(PetscInitialize(p_args->p_argc, p_args->p_argv,
00087 PETSC_NULL, PETSC_NULL) );
00088
00089
00090 std::string cwd = GetCurrentWorkingDirectory() + "/";
00091 if (strcmp(cwd.c_str(), ChasteBuildRootDir()) != 0)
00092 {
00093 #define COVERAGE_IGNORE
00094
00095 std::cout << std::endl << "Changing directory from '" << cwd << "' to '" << ChasteBuildRootDir() << "'." << std::endl;
00096 EXPECT0(chdir, ChasteBuildRootDir());
00097 std::cout << "CWD now: " << GetCurrentWorkingDirectory() << std::endl;
00098 #undef COVERAGE_IGNORE
00099 }
00100
00101 #ifdef TEST_FOR_FPE
00102
00103 feenableexcept(FE_DIVBYZERO | FE_INVALID );
00104
00105 struct sigaction sa;
00106 sa.sa_sigaction = FpeSignalToAbort;
00107 sa.sa_flags = SA_RESETHAND|SA_SIGINFO;
00108 sa.sa_restorer = 0;
00109 sigaction(SIGFPE, &sa, NULL);
00110 #endif
00111 return true;
00112 }
00114 bool tearDownWorld()
00115 {
00116 PETSCEXCEPT(PetscFinalize());
00117 return true;
00118 }
00119 };
00120
00121 static PetscSetup thisSetup;
00122
00123 #endif //_PETSCSETUPANDFINALIZE_HPP_