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
00030 #ifndef _PETSCSETUPANDFINALIZE_HPP_
00031 #define _PETSCSETUPANDFINALIZE_HPP_
00032
00038 #ifdef TEST_FOR_FPE
00039 #include <fenv.h>
00040 #include <signal.h>
00041 #endif
00042
00043 #include <cxxtest/GlobalFixture.h>
00044 #include <petsc.h>
00045 #include <cstdlib>
00046 #include <cassert>
00047 #include <cstring>
00048 #include <unistd.h>
00049 #include <iostream>
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:
00078 bool setUpWorld()
00079 {
00084 CommandLineArguments* p_args = CommandLineArguments::Instance();
00085 PETSCEXCEPT(PetscInitialize(p_args->p_argc, p_args->p_argv,
00086 PETSC_NULL, PETSC_NULL) );
00087
00088
00089 std::string cwd = GetCurrentWorkingDirectory() + "/";
00090 if (strcmp(cwd.c_str(), ChasteBuildRootDir()) != 0)
00091 {
00092 #define COVERAGE_IGNORE
00093
00094 std::cout << std::endl << "Changing directory from '" << cwd << "' to '" << ChasteBuildRootDir() << "'." << std::endl;
00095 EXPECT0(chdir, ChasteBuildRootDir());
00096 std::cout << "CWD now: " << GetCurrentWorkingDirectory() << std::endl;
00097 #undef COVERAGE_IGNORE
00098 }
00099
00100 #ifdef TEST_FOR_FPE
00101
00102 feenableexcept(FE_DIVBYZERO | FE_INVALID );
00103
00104 struct sigaction sa;
00105 sa.sa_sigaction = FpeSignalToAbort;
00106 sa.sa_flags = SA_RESETHAND|SA_SIGINFO;
00107 sa.sa_restorer = 0;
00108 sigaction(SIGFPE, &sa, NULL);
00109 #endif
00110 return true;
00111 }
00113 bool tearDownWorld()
00114 {
00115
00116 PETSCEXCEPT(PetscFinalize());
00117 return true;
00118 }
00119 };
00120
00121 static PetscSetup thisSetup;
00122
00123
00124 #endif //_PETSCSETUPANDFINALIZE_HPP_