BOUT++ has grown organically over the years, and now we want to tidy things up, smooth off rough edges and redesign some important components. Some of these changes will necessarily be backwards-incompatible, and unfortunately may require changes to physics models. Where that is the case, we hope to be able to provide tools to make the changes as easy as possible.

This is a non-exhaustive list of features and changes we would like to implement in the next major release (v5) of BOUT++. We’ve separated the out into “smaller” and “larger”. Smaller changes are those we think should be orthogonal to other items, or won’t require much in the way of designing. Larger changes likely affect many separate parts of the framework, and will require some effort to design them correctly.


  • Integrate {fmt} and spdlog
  • Namespacing and header moving
    • Renaming/project layout
  • Replace FieldData, FieldGroup functionality
  • Investigate how much Vector2D/3D require base-class
  • Timer features and options for default Monitor
  • Remove non-PhysicsModel based solving
  • Remove (deprecated) invert_laplace
  • Standardise all factory methods
  • Improving the Python wrapper
    • Using Pybind11?
  • Mesh initialisation
  • Coordinates lazy computation of Christoffel symbols


  • Solver, PhysicsModel, Problem – ownership and interrelatedness
    • Separate PhysicsModel virtual for dumping?
    • Fields take the DataFile and handle writing itself?
    • How to handle dumping both local variables and evolving variables
  • Mesh rewrite
    • Simpler API
    • Fewer assumptions
    • More flexible domains
    • New way of specifying branch cuts alongside existing system
    • Non-logically-rectangular meshes
    • Higher-level topology API
    • What is the sufficient abstraction?
  • Coordinates rewrite
    • Output/convert to real space for visualisation/field line mapping etc.
    • Real space mapping inside BOUT++
    • New input format for geometry specification
  • Boundaries rewrite
    • Regions and operators
  • File I/O rewrite