Overview
OpFlow (运筹) is an embedded domain specific language (EDSL) for partial differential equation (PDE) solver composing. It adopts the meta programming facilities provided by modern C++ extensively to provide an expressive front-end user interface. With expression templates and stencil auto-generation, OpFlow is able to perform both explicit expression evaluation and implicit linear system solving. With isolated expression, operator & evaluation engine's implementation, OpFlow makes the algorithm, data structure and execution scheduler fully decoupled. OpFlow's advantages are:
- Fully static. No dynamic dispatching on the critical path
- Zero-cost abstraction. All operations are well-defined at compile time and force inlined
- Automatic parallelization. Partition & evaluation of expressions are automatically parallelized by user defined strategies
- Implicit equation solving. OpFlow can solve arbitrary user provided implicit equations as long as they are well-defined
- Header only & C++ embedded. OpFlow itself is header-only and embedded in C++. It's straight forward to integrate OpFlow into existing numerical codes
- Mathematical API notations. The front-end interface of OpFlow is very similar to mathematical notations. Little language noise will occur while writing equations
- Proper level of abstraction. OpFlow tries to eliminate the need to write bare schemes while keeping all the transformations & operations performed at the front-end. It's straight forward to see how each term is discretized, while keeping all expressions in a unified fashion. This is different from packing all things into modules, or looping over each element on the front stage.
Examples
Quick start
- Install all dependencies:
- Linux: (Ubuntu for example)
sudo apt install -y gcc-10 g++-10 libopenmpi-dev libhdf5-mpi-dev libhdf5-dev python3-pip python3-sphinx lcov
python3 -m pip install sphinx-rtd-dark-theme
- macOS: (using Homebrew)
brew install [email protected] open-mpi hdf5-mpi sphinx lcov
python3 -m pip install sphinx-rtd-dark-theme
- Configure
mkdir build && cd build
cmake -DCMAKE_C_COMPILER=gcc-10 -DCMAKE_CXX_COMPILER=g++-10 -DOPFLOW_BUILD_ALL=ON -DOPFLOW_WITH_VTK=OFF ..
- Build & Run
cmake --build . -t CONV1D && ./examples/CONV1D/CONV1D
Installation
Please refer to the documentation for installation instructions.