This pages stores a list of common problem and issues that occasionally crop up, together with their solutions. Please update problems and solutions if needed, and add new problems as they crop up.
Table of Contents
- Chaste (Running Tests)
- An exception occurs but the exception message is not shown
- The directory output was written to seems empty
- Strange error about semget and setnum
- Running an already compiled test executable manually (instead of compiling and running with scons) fails
- Appear to get incorrect answers when solving a PDE
- Compilation and linking errors
- The compiler complains that a variable has not been defined when it clearly has been, in a base class
- Get a mental, extremely long, set of compilation errors, appears to be something to do with Boost (mpl or ublas)
- Undefined reference errors on linking
- A "comparison between signed and unsigned integer expressions" error (possibly) in a file in the CxxTest folder
- "Error: void <YOUR_TEST_CLASS>::<YOUR_TEST_METHOD>() is private"
- Compiler says c_vector or c_matrix was not declared (perhaps even if you are including <boost/numeric/ublas/matrix.hpp>)
- Get a "Assertion 'petsc_is_initialised' failed" error
- "Fatal error; unknown error handler. May be MPI call before MPI_INIT. Error message is MPI_COMM_RANK and code is 197"
Chaste (Running Tests)
An exception occurs but the exception message is not shown
Add throw(Exception) after the method declaration in the failing test, i.e.
void TestSomething() throw(Exception) { // test }
The directory output was written to seems empty
If, in a terminal, you are in an output directory, and rerun a test that involves that directory being wiped and recreated, the terminal might act as if there's nothing in the directory, i.e. an ls displays no files. Just cd out and back into the directory again.
Strange error about semget and setnum
Problem: The following error message occurs when running a test
Running 9 testssemget failed for setnum = 0
This happens occasionally. Rerun the test. If that fails do
./mpi/sbin/cleanipcs
Running an already compiled test executable manually (instead of compiling and running with scons) fails
Some environment variables are setup by the SCons scripts, you need to export them yourself.
cdchaste export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/lib ./component/build/whatever/TestXRunner
Also, if files are output to the current directory rather than /tmp/chaste/testoutput/, also do
export CHASTE_TEST_OUTPUT=/tmp/chaste/testoutput/
(or /tmp/whatever/testoutput).
Appear to get incorrect answers when solving a PDE
If you try to solve a simple PDE with Neumann boundary conditions, with a known solution, but appear to get incorrect answers, you may have done one of two things incorrectly. For the elliptic PDE "du/dt = div (D grad_u) + f", where D is a matrix, the Neumann boundary condition that you specify (using BoundaryConditionsContainer and ConstBoundaryConditions` etc) is the value of "(D grad_u) dot n" (where n is the unit outward facing normal), not the value of du/dn and not du/dx in 1D. In particular, in 1D, on the left-hand side n=-1 and you need to specify "-D du/dx", not just du/dx. See UserTutorials/SolvingLinearPdes for an example.
Compilation and linking errors
The compiler complains that a variable has not been defined when it clearly has been, in a base class
If class A and class B are both templated, and B<DIM> inherits from A<DIM>, then the compiler won't be able to locate variables defined in the base class if used in the child unless the base is specified. The solution is to write this-> before the variable in question. i.e.
template<int DIM> class A { public: double x; }; template<int DIM> class B : public A<DIM> { void run() { std::cout << x; } };
won't compile, whereas
template<int DIM> class A { public: double x; }; template<int DIM> class B : public A<DIM> { void run() { std::cout << this->x; } };
will do.
Get a mental, extremely long, set of compilation errors, appears to be something to do with Boost (mpl or ublas)
Try putting
#include "UblasIncludes.hpp"
as the first include in the source file being compiled (generally either a cpp file or the test being run).
Undefined reference errors on linking
Problem: Undefined reference errors on linking, such as:
undefined reference to `Node<1u>::AddElement(unsigned int)'
This may mean that you are using a templated class which has been written using Explicit Instantiation, and you are using a value for one of the template parameters for which there isn't an instantiation. Not all classes are instantiated for all dimensions in order to reduce compilation time. Look at the bottom of the cpp file for the class in question (e.g. Node.cpp in the example above) and check if there is a line like
template class Node<1>;
at the bottom of the file. Add the missing dimension if not.
Note that for some classes (e.g. SimpleDg0ParabolicAssembler) the situation is more complex, since we don't just template over dimension. In such cases there should be a file named like SimpleDg0ParabolicAssemblerImplementation.hpp which you can include, either in the hpp file (if you do not provide a cpp) or in your cpp file (and add further explicit instantiations there). See MonodomainDg0Assembler.cpp for an example.
A "comparison between signed and unsigned integer expressions" error (possibly) in a file in the CxxTest folder
The following error (or actually, warning, which is then taken as an error)
cxxtest/cxxtest/TestSuite.h: In function 'bool CxxTest::equals(X, Y) [with X = long unsigned int, Y = int]': cxxtest/cxxtest/TestSuite.h:58: instantiated from 'void CxxTest::doAssertEquals(const char*, unsigned int, const char*, X, const char*, Y, const char*) [with X = long unsigned int, Y = int]' .<FILE_NAME>:<LINE_NUMBER> instantiated from here cxxtest/cxxtest/TestSuite.h:49: warning: comparison between signed and unsigned integer expressions
is usually due to a comparison between an unsigned variable and a hardcoded number (taken as an int by the compiler) in a TS_ASSERT_EQUALS, for example
unsigned my_var = 10; TS_ASSERT_EQUALS(my_var, 10);
To tell the compiler to treat the (second) 10 as an unsigned, do the following
TS_ASSERT_EQUALS(my_var, 10u);
"Error: void <YOUR_TEST_CLASS>::<YOUR_TEST_METHOD>() is private"
Remember all test methods need to be declared as public.
Compiler says c_vector or c_matrix was not declared (perhaps even if you are including <boost/numeric/ublas/matrix.hpp>)
These are ublas vectors and matrices. Do
#include "UblasCustomFunctions.hpp"
Note that it is not enough to do
#include <boost/numeric/ublas/matrix.hpp>
as then you would have to write boost::numeric::ublas::c_matrix<double,2,2> instead of c_matrix<double,2,2>.
Get a "Assertion 'petsc_is_initialised' failed" error
If the following is printed
global/src/DistributedVector.cpp:47: static void DistributedVector::CheckForPetsc(): Assertion `petsc_is_initialised' failed.
it is probably because you have forgotten to do
#include "PetscSetupAndFinalize.hpp"
in your test.
"Fatal error; unknown error handler. May be MPI call before MPI_INIT. Error message is MPI_COMM_RANK and code is 197"
You may have included PetscSetupAndFinalize.hpp in a source file - it should only be included in test files (and must be included in all tests files that use Petsc).