This is a read only copy of the old FEniCS QA forum. Please visit the new QA forum to ask questions

compile_extension_module() 2017.1.0 gives error "petscsys.h: No such file or directory"

+1 vote

Hello,

I am teaching myself instant, and am not able to compile using either dolfin::compile_extension_module() or instant::build_module() using version 2017.1.0.

my minimal example :

from fenics import *
import instant
import os


# open the cpp code for evaluating the basis functions :
cpp_src_dir = os.path.dirname(os.path.abspath(__file__)) + "/"
header_file = open(cpp_src_dir + "test.h", "r")
code        = header_file.read()
header_file.close()

system_headers = ['numpy/arrayobject.h',
                  'dolfin/geometry/BoundingBoxTree.h',
                  'dolfin/function/FunctionSpace.h']
swigargs       = ['-c++', '-fcompact', '-fopenmp', '-O', '-I.', '-small']
cmake_packages = ['DOLFIN']
sources        = ["test.cpp"]
source_dir     = cpp_src_dir
include_dirs   = [".", cpp_src_dir]
module_name    = "test"
additional_decl = """
%init%{
  import_array();
  %}

  // Include global SWIG interface files:
  // Typemaps, shared_ptr declarations, exceptions, version
  %include <boost_shared_ptr.i>

  // Global typemaps and forward declarations
  %include "dolfin/swig/typemaps/includes.i"
  %include "dolfin/swig/forwarddeclarations.i"

  // Global exceptions
  %include <exception.i>

  // Local shared_ptr declarations
  %shared_ptr(dolfin::Function)
  %shared_ptr(dolfin::FunctionSpace)

  // %import types from submodule function of SWIG module function
  %import(module="dolfin.cpp.function") "dolfin/function/Function.h"
  %import(module="dolfin.cpp.function") "dolfin/function/FunctionSpace.h"

  %feature("autodoc", "1");
"""
compiled_module = instant.build_module(
    modulename = module_name,
    code=code,
    source_directory=source_dir,
    additional_declarations=additional_decl,
    system_headers=system_headers,
    include_dirs=include_dirs,
    swigargs=swigargs,
    sources=sources,
    cmake_packages=cmake_packages)

# compile this with Instant JIT compiler :
#inst_params = {'code'                      : code,
#               'module_name'               : module_name,
#               'source_directory'          : cpp_src_dir,
#               'sources'                   : sources,
#               'additional_system_headers' : ["petscsys.h"],
#               'include_dirs'              : include_dirs}
#compiled_module = compile_extension_module(**inst_params)

with test.h

#ifndef __test_H
#define __test_H

#include <dolfin/function/FunctionSpace.h>
#include <dolfin/geometry/BoundingBoxTree.h>

namespace dolfin
{
  class MPMModel
  {
    public:
      MPMModel(const FunctionSpace& V);
      void eval(const Array<double>& x);

    private:
      const FunctionSpace* Q;
      std::shared_ptr<const FiniteElement> element;
      std::unique_ptr<Cell> cell;
      unsigned int cell_id;
      std::size_t gdim;
      std::size_t sdim;
      std::shared_ptr<const dolfin::Mesh> mesh;
  };
}
#endif

and test.cpp

#include "test.h"

using namespace dolfin;

test::test(const FunctionSpace& V)
{
  Q       = &V;
  mesh    = V.mesh();
  element = V.element();

  gdim    = mesh->geometry().dim();
  sdim    = element->space_dimension();
}

void MPMModel::eval(const Array<double>& x)
{
  const Point x_pt(gdim, x.data());
  cell_id = mesh->bounding_box_tree()->compute_first_entity_collision(x_pt);
  return cell_id;
}

I get the error :

make[2]: Leaving directory '/home/pf4d/crap/test'
make -f CMakeFiles/source_file_lib.dir/build.make CMakeFiles/source_file_lib.dir/build
make[2]: Entering directory '/home/pf4d/crap/test'
[ 20%] Building CXX object CMakeFiles/source_file_lib.dir/test.cpp.o
/usr/bin/c++   -DDOLFIN_LA_INDEX_SIZE=4 -DDOLFIN_SIZE_T=8 -DDOLFIN_VERSION=\"2017.1.0\" -DHAS_CHOLMOD -DHAS_HDF5 -DHAS_MPI -DHAS_OPENMP -DHAS_PETSC -DHAS_PETSC4PY -DHAS_SCOTCH -DHAS_SLEPC -DHAS_SLEPC4PY -DHAS_UMFPACK -DHAS_VTK -DHAS_ZLIB -DNDEBUG -DNPY_NO_DEPRECATED_API=NPY_1_11_API_VERSION -DNUMPY_VERSION_MAJOR=1 -DNUMPY_VERSION_MICRO=0 -DNUMPY_VERSION_MINOR=11 -D_FORTIFY_SOURCE=2 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DvtkFiltersFlowPaths_AUTOINIT="1(vtkFiltersParallelFlowPaths)" -DvtkIOExodus_AUTOINIT="1(vtkIOParallelExodus)" -DvtkIOGeometry_AUTOINIT="1(vtkIOMPIParallel)" -DvtkIOImage_AUTOINIT="1(vtkIOMPIImage)" -DvtkIOSQL_AUTOINIT="2(vtkIOMySQL,vtkIOPostgreSQL)" -DvtkRenderingContext2D_AUTOINIT="1(vtkRenderingContextOpenGL)" -DvtkRenderingCore_AUTOINIT="4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)" -DvtkRenderingFreeType_AUTOINIT="2(vtkRenderingFreeTypeFontConfig,vtkRenderingMatplotlib)" -DvtkRenderingLIC_AUTOINIT="1(vtkRenderingParallelLIC)" -DvtkRenderingVolume_AUTOINIT="1(vtkRenderingVolumeOpenGL)" -isystem /usr/include/vtk-6.2 -isystem /usr/include/freetype2 -isystem /usr/include/x86_64-linux-gnu/freetype2 -I/usr/include/jsoncpp -isystem /usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent -isystem /usr/lib/openmpi/include/openmpi/opal/mca/event/libevent2021/libevent/include -isystem /usr/lib/openmpi/include -isystem /usr/lib/openmpi/include/openmpi -I/usr/include/python2.7 -isystem /usr/include/x86_64-linux-gnu -I/usr/include/hdf5/serial -I/usr/include/libxml2 -I/usr/include/tcl -isystem /usr/lib/python2.7/dist-packages/ffc/backends/ufc -isystem /usr/include/suitesparse -isystem /usr/include/scotch -isystem /usr/include/eigen3 -isystem /usr/include/hdf5/openmpi -I/home/pf4d/crap/test/. -I/home/pf4d/crap -I/usr/lib/python2.7/dist-packages/numpy/core/include -I/usr/lib/python2.7/dist-packages/petsc4py/include -I/usr/lib/python2.7/dist-packages/slepc4py/include -I/home/pf4d/crap/test  -fpermissive    -fopenmp -O2 -fpic   -std=c++11 -o CMakeFiles/source_file_lib.dir/test.cpp.o -c /home/pf4d/crap/test/test.cpp
In file included from /usr/include/dolfin/fem/FiniteElement.h:25:0,
                 from /usr/include/dolfin/function/FunctionSpace.h:37,
                 from /home/pf4d/crap/test.h:4,
                 from /home/pf4d/crap/test/test.cpp:1:
/usr/include/dolfin/common/types.h:24:22: fatal error: petscsys.h: No such file or directory
compilation terminated.
CMakeFiles/source_file_lib.dir/build.make:62: recipe for target 'CMakeFiles/source_file_lib.dir/test.cpp.o' failed
make[2]: *** [CMakeFiles/source_file_lib.dir/test.cpp.o] Error 1
make[2]: Leaving directory '/home/pf4d/crap/test'
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/source_file_lib.dir/all' failed
make[1]: *** [CMakeFiles/source_file_lib.dir/all] Error 2
make[1]: Leaving directory '/home/pf4d/crap/test'
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

What is strange is that yesterday I got this error, and I reinstalled fenics from the ppa and it suddenly worked. Now the problem is back and reinstalling does not fix.

Anyone?

asked May 18, 2017 by pf4d FEniCS User (2,970 points)
edited May 18, 2017 by pf4d

This could be this bug.

Yes, that's the thing I'm sure.

Although, I do not appear to have the environment variable os.environ['SLEPC_DIR'] set.

2 Answers

+1 vote

Sorry if this is too obvious, but it looks like your PETSc installation is at some non-standard place (or more likely some cmake rules script is not returning the right strings for the compiler and linker) and the compiler is not finding the headers. Have you tried finding out what include path it is and adding the flag -I /whatever/path/here to the compile options? I guess then you will have the same problem with the library so you might need to pass -L whatever to the linker as well.

answered May 19, 2017 by mdbenito FEniCS User (4,530 points)
+1 vote

If you have installed FEniCS and all dependencies with Ubuntu the standard way, i.e.,

sudo add-apt-repository ppa:fenics-packages/fenics
sudo apt-get update
sudo apt-get install --no-install-recommends fenics
sudo apt-get dist-upgrade

Petsc can be located with $locate petsc, then copy the resulting a path -- for Ubuntu 16.04 LTS, it is /usr/lib/petscdir/3.7.3/x86_64-linux-gnu-real/include/ -- to the list include_dirs :

from fenics import *
import instant
import os

cpp_src_dir = os.path.dirname(os.path.abspath(__file__)) + "/"

header_file = open(cpp_src_dir + "test.h", "r")
code        = header_file.read()
header_file.close()

system_headers = ['numpy/arrayobject.h',
                  'dolfin/geometry/BoundingBoxTree.h',
                  'dolfin/function/FunctionSpace.h']
cmake_packages = ['DOLFIN']
sources        = ["test.cpp"]
source_dir     = cpp_src_dir
include_dirs   = [".", cpp_src_dir, '/usr/lib/petscdir/3.7.3/x86_64-linux-gnu-real/include/']
module_name    = "test"

# compile this with Instant JIT compiler :
inst_params = {'code'                      : code,
               'module_name'               : module_name,
               'source_directory'          : cpp_src_dir,
               'sources'                   : sources,
               'additional_system_headers' : ["petscsys.h"],
               'include_dirs'              : include_dirs}
compiled_module = compile_extension_module(**inst_params)
answered May 19, 2017 by pf4d FEniCS User (2,970 points)
...