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
00041 #ifdef TEST_FOR_FPE
00042 #include <fenv.h>
00043 #include <signal.h>
00044 #endif
00045 #include <cxxtest/GlobalFixture.h>
00046 #include <petsc.h>
00047 #include <cstdlib>
00048 #include <unistd.h>
00049 #include <iostream>
00050 #include "Exception.hpp"
00051 #include "PetscException.hpp"
00052 #include "PetscArguments.hpp"
00053 #include "Version.hpp"
00054
00055 #ifdef TEST_FOR_FPE
00056 void FpeSignalToAbort(int sig_num, siginfo_t* info, void* context )
00057 {
00058 if ( info->si_code == FPE_FLTDIV)
00059 {
00060 std::cerr<<"SIGFPE: floating point exception was divide by zero.\n";
00061 }
00062 else if ( info->si_code == FPE_FLTINV)
00063 {
00064 std::cerr<<"SIGFPE: floating point exception was an invalid operation (like 0.0/0.0).\n";
00065 }
00066 else
00067 {
00068 std::cerr<<"SIGFPE: unexpected error code.\n";
00069 }
00070 }
00071 #endif
00072
00073 class PetscSetup : public CxxTest::GlobalFixture
00074 {
00075 public:
00077 bool setUpWorld()
00078 {
00083 PetscArguments *p_args = PetscArguments::Instance();
00084 PETSCEXCEPT(PetscInitialize(p_args->p_argc, p_args->p_argv,
00085 PETSC_NULL, PETSC_NULL) );
00086
00087 char buf[10000];
00088 std::cout << std::endl << "CWD: " << getcwd(buf, 10000) << std::endl;
00089 std::cout << "Root: " << GetChasteRoot() << std::endl;
00090 EXPECT0(chdir, GetChasteRoot());
00091 std::cout << "CWD: " << getcwd(buf, 10000) << std::endl;
00092
00093 #ifdef TEST_FOR_FPE
00094
00095 feenableexcept(FE_DIVBYZERO | FE_INVALID );
00096
00097 struct sigaction sa;
00098 sa.sa_sigaction = FpeSignalToAbort;
00099 sa.sa_flags = SA_RESETHAND|SA_SIGINFO;
00100 sa.sa_restorer = 0;
00101 sigaction(SIGFPE, &sa, NULL);
00102 #endif
00103 return true;
00104 }
00106 bool tearDownWorld()
00107 {
00108
00109 PETSCEXCEPT(PetscFinalize());
00110 return true;
00111 }
00112 };
00113
00114 static PetscSetup thisSetup;
00115
00116
00117 #endif //_PETSCSETUPANDFINALIZE_HPP_