README
is currently under revision and will be moved
This package provides python language bindings for the C++ library preCICE. Note that the first two digits of the version number of the bindings indicate the major and minor version of the preCICE version that the bindings support. The last digit represents the version of the bindings. Example: v3.1.0
and v3.1.1
of the bindings represent versions 0
and 1
of the bindings that are compatible with preCICE v3.1.x
. Note that this versioning scheme was introduced from bindings v3.1.0
, which is different than the old versioning scheme.
Please refer to the preCICE documentation for information on how to install and use the python bindings. Information below is intended for advanced users and developers.
preCICE: Refer to the preCICE documentation for information on building and installation.
C++: A working C++ compiler, e.g., g++
.
MPI: mpi4py
requires MPI to be installed on your system.
We recommend using pip3 (version 19.0.0 or newer required) for the sake of simplicity. You can check your pip3 version via pip3 --version
. To update pip3, use the following line:
$ pip3 install --user --upgrade pip
For system installs of preCICE, installation works out of the box. There are different ways how pip can be used to install pyprecice. pip will fetch cython and other build-time dependencies, compile the bindings and finally install the package pyprecice.
-
(recommended) install pyprecice from PyPI
$ pip3 install --user pyprecice
-
provide the link to this repository to pip (replace
<branch>
with the branch you want to use, preferablymaster
ordevelop
)$ pip3 install --user https://github.com/precice/python-bindings/archive/<branch>.zip
-
if you already cloned this repository, execute the following command from this directory:
$ pip3 install --user .
note the dot at the end of the line
If preCICE (the C++ library) was installed in a custom prefix, or only built but not installed at all, you have to extend the following environment variables:
LIBRARY_PATH
,LD_LIBRARY_PATH
to the library location, or$prefix/lib
CPATH
either to thesrc
directory or the$prefix/include
The preCICE documentation provides more informaiton on linking preCICE.
You can also install the python language bindings for preCICE via Spack by installing the Spack package py-pyprecice
. Refer to our installation guide for preCICE via Spack for getting started with Spack.
In this directory, execute:
$ python3 setup.py install --user
see above. Then run
$ python3 setup.py install --user
-
Install cython and other dependencies via pip3
$ pip3 install --user setuptools wheel cython packaging numpy
-
Open terminal in this folder.
-
Build the bindings
$ python3 setup.py build_ext --include-dirs=$PRECICE_ROOT/src --library-dirs=$PRECICE_ROOT/build/last
Options:
--include-dirs=
, default:''
Path to the headers of preCICE, point to the sources$PRECICE_ROOT/src
, or the your custom install prefix$prefix/include
.
NOTES:
- If you have built preCICE using CMake, you can pass the path to the CMake binary directory using
--library-dirs
. - It is recommended to use preCICE as a shared library here.
-
Install the bindings
$ python3 setup.py install --user
-
Clean-up optional
$ python3 setup.py clean --all
Update LD_LIBRARY_PATH
such that python can find precice.so
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PRECICE_ROOT/build/last
Run the following to test the installation:
$ python3 -c "import precice"
-
Clean-up mandatory (because we must not link against the real
precice.so
, but we use a mocked version)$ python3 setup.py clean --all
-
Set
CPLUS_INCLUDE_PATH
(we cannot usebuild_ext
and the--include-dirs
option here)$ export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$PRECICE_ROOT/src
-
Run tests with
$ python3 setup.py test
You can find the documentation of the implemented interface in the file precice.pyx
. For an example of how pyprecice
can be used please refer to the 1D elastic tube example.
Note The python package that is installed is called pyprecice
. It provides the python module precice
that can be use in your code via import precice
, for example.
The following error shows up during installation, if preCICE is not found:
/tmp/pip-install-d_fjyo1h/pyprecice/precice.cpp:643:10: fatal error: precice/Participant.hpp: No such file or directory
643 | #include "precice/Participant.hpp"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
ERROR: Failed building wheel for pyprecice
Failed to build pyprecice
ERROR: Could not build wheels for pyprecice which use PEP 517 and cannot be installed directly
Or, for preCICE v2:
/tmp/pip-install-d_fjyo1h/pyprecice/precice.cpp:643:10: fatal error: precice/SolverInterface.hpp: No such file or directory
643 | #include "precice/SolverInterface.hpp"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
ERROR: Failed building wheel for pyprecice
Failed to build pyprecice
ERROR: Could not build wheels for pyprecice which use PEP 517 and cannot be installed directly
There are two possible reasons, why preCICE is not found:
- preCICE is not installed. Please download and install the C++ library preCICE. See above.
- preCICE is installed, but cannot be found. Please make sure that preCICE can be found during the installation process. See our wiki page on linking to preCICE and the instructions above.
In case the compilation fails with shared_ptr.pxd not found
messages, check if you use the latest version of Cython.
$ python3 -m pip install pyprecice
Collecting pyprecice
...
/tmp/pip-build-7rj4_h93/pyprecice/precice.cpp:25:20: fatal error: Python.h: No such file or directory
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Failed building wheel for pyprecice
Please try to install python3-dev
. E.g. via apt install python3-dev
. Please make sure that you use the correct version (e.g. python3.5-dev
or python3.6-dev
). You can check your version via python3 --version
.
$ python3 -c "import precice"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: libprecice.so.2: cannot open shared object file: No such file or directory
Make sure that your LD_LIBRARY_PATH
includes the directory that contains libprecice.so
. The actual path depends on how you installed preCICE. Example: If preCICE was installed using sudo make install
and you did not define a CMAKE_INSTALL_PREFIX
the library path is /usr/local/lib
. This means you have to export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
.
If you want to use the old experimental python bindings (released with preCICE version < 2.0.0), please refer to the corresponding preCICE version. Example: for preCICE v1.6.1 there are three different versions of the python bindings: precice_future
, precice
and PySolverInterface
. Installation instructions can be found in the corresponding README
files.
Note that the instructions in this section are outdated and refer to the deprecated python bindings. Until we have updated information on the installation procedure for the python bindings under this use-case, we will keep these instructions, since they might still be very useful (Originally contributed by huangq1234553 to the precice wiki in precice/precice/wiki:8bb74b7
.)
show details
This guide provides steps to install python bindings for precice-1.6.1 for a conda environment Python 2.7.17 on the CoolMUC. Note that preCICE no longer supports Python 2 after v1.4.0. Hence, some modifications to the python setup code was necessary. Most steps are similar if not identical to the basic guide without petsc or python above. This guide assumes that the Eigen dependencies have already been installed.
Load the prerequisite libraries:
module load gcc/7
module unload mpi.intel
module load mpi.intel/2018_gcc
module load cmake/3.12.1
At the time of this writing module load boost/1.68.0
is no longer available. Instead
boost 1.65.1 was installed per the boost and yaml-cpp
guide above.
In order to have the right python dependencies, a packaged conda environment was transferred to SuperMUC. The following dependencies were installed:
- numpy
- mpi4py
With the python environment active, we have to feed the right python file directories to the cmake command. Note that -DPYTHON_LIBRARY expects a python shared library. You can likely modify the version to fit what is required.
mkdir build && cd build
cmake -DBUILD_SHARED_LIBS=ON -DPRECICE_FEATURE_PETSC_MAPPING=OFF -DPRECICE_FEATURE_PYTHON_ACTIONS=ON -DCMAKE_INSTALL_PREFIX=/path/to/precice -DCMAKE_BUILD_TYPE=Debug .. -DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR')+'/libpython2.7.so')") -DNumPy_INCLUDE_DIR=$(python -c "import numpy; print(numpy.get_include())")
make -j 12
make install
After installing, make sure you add the preCICE installation paths to your .bashrc
, so that other programs can find it:
export PRECICE_ROOT="path/to/precice_install"
export PKG_CONFIG_PATH="path/to/precice_install/lib/pkgconfig:${PKG_CONFIG_PATH}"
export CPLUS_INCLUDE_PATH="path/to/precice_install/include:${CPLUS_INCLUDE_PATH}"
export LD_LIBRARY_PATH="path/to/precice_install/lib:${LD_LIBRARY_PATH}"
Then, navigate to the python_future bindings script.
cd /path/to/precice/src/precice/bindings/python_future
Append the following to the head of the file to allow Python2 to run Python3 code. Note that
importing unicode_literals
from future
will cause errors in setuptools
methods as string literals
in code are interpreted as unicode
with this import.
from __future__ import (absolute_import, division,
print_function)
from builtins import (
bytes, dict, int, list, object, range, str,
ascii, chr, hex, input, next, oct, open,
pow, round, super,
filter, map, zip)
Modify mpicompiler_default = "mpic++"
to mpicompiler_default = "mpicxx"
in line 100.
Run the setup file using the default Python 2.7.17.
python setup.py install --user
If you face the error:
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject
make sure that you are using an up-to-date version of NumPy. You can update NumPy with
pip3 install numpy --upgrade
Bindings versions up to v3.0.0.0
have four digits, where the first three digits are the supported preCICE version, and the fourth digit is the bindings version. Example: v2.0.0.1
and v2.0.0.2
of the bindings represent versions 1
and 2
of the bindings that are compatible with preCICE v2.0.0
. We dropped the third digit of the preCICE version as bugfix releases are always compatible and do not impact the bindings. The new three digit format is now consistent with other preCICE bindings.
- Benjamin Rodenberg
- Ishaan Desai
- Saumitra Vinay Joshi contributed first working prototype in
3db9c9
onprecice/precice
- Frédéric Simonis
- Florian Lindner
- Benjamin Uekermann
- Gerasimos Chourdakis