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
00051 #include "Exception.hpp"
00052 #include "PetscException.hpp"
00053 #include "CommandLineArguments.hpp"
00054 #include "ChasteBuildRoot.hpp"
00055 #include "GetCurrentWorkingDirectory.hpp"
00056
00057 #ifdef TEST_FOR_FPE
00058 void FpeSignalToAbort(int sig_num, siginfo_t* info, void* context )
00059 {
00060 if ( info->si_code == FPE_FLTDIV)
00061 {
00062 std::cerr<<"SIGFPE: floating point exception was divide by zero.\n";
00063 }
00064 else if ( info->si_code == FPE_FLTINV)
00065 {
00066 std::cerr<<"SIGFPE: floating point exception was an invalid operation (like 0.0/0.0).\n";
00067 }
00068 else
00069 {
00070 std::cerr<<"SIGFPE: unexpected error code.\n";
00071 }
00072 }
00073 #endif
00074
00075 class PetscSetup : public CxxTest::GlobalFixture
00076 {
00077 public:
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
00117 PETSCEXCEPT(PetscFinalize());
00118 return true;
00119 }
00120 };
00121
00122 static PetscSetup thisSetup;
00123
00124
00125 #endif //_PETSCSETUPANDFINALIZE_HPP_