This is a slightly more readable, and therefore incomplete, summary of the changes from the full changelog
4.4.1 is a bugfix release:
- Fixed some issues building BOUT++ on MacOS
- Fixed some issues when installing
- Fixed some issues when downloading SUNDIALS and netCDF C++
- Fixed some out of date documentation
- Some improvements/fixes to the
beuler/snessolver
4.4.0 is a feature release. The main new features are:
- The CMake support has been expanded, and will replace the autotools build system in the next major release. See the CMake installation instructions for details on building with CMake.
- Output files can now handle
FieldPerp,std::vector<int>, andstd::string, while input options can now handleFieldPerp. - Output and evolving variables can now have an optional description
- The
boutdataandboututilspython libraries have been moved to standalone packages. BOUT++ still comes bundled with them as submodules, but you can now install them separately. - Staggered grids now work with
InvertParand split flux derivatives. - User code can set default values that override the library's default values.
- Timing information can be output in a table at the end of the run with
time_report:show - Some basic provenance information tracking has been enabled: each run now generates a random unique ID. Hypnotoad grid files that contain a UUID will also be tracked.
- A new time solver has been added, an adaptive, arbitrary order Adams-Bashforth solver.
- FFTs can use the
FFTW_EXHAUSTIVEinput option.
4.3.3 is a bugfix release:
- Better documentation and tests
- Fix
shiftOutputfor aligned fields - Some improvements to the Python API, including support for Python's
exponentiation operator
**, and MPI-aware logging - Fix an uninitialised variable in
Delp2 - Bump the version of jinja2 from 2.10 to 2.11
- Fix for some Solvers not always using user preconditioner/Jacobian
- Some minor fixes to the build systems
4.3.2 is a bugfix release:
- Make downloading the submodules a bit nicer, including an option for
using non-bundled versions when using
configure - Make
dzin the Python API a property - Make
Div_par_K_Grad_parcheck the staggered location of its inputs - Enable split-flux derivatives on staggered fields
- Fix
Grad2_par2implementation inInvertParCR - Fix an issue writing
FieldPerps - Make it easier to compile the examples with different versions of
BOUT++, plus fixes for the
tokamak-2fluidexample - Fix
Div_parwhen using more than one y-guard cell - Fix an issue with text attributes in HDF5 files
4.3.1 is a bugfix release, with a few minor fixes to library code, notably:
- Fix the creation of the
RGN_OUTER_Xregion - Several small bugs in the Python API
- Preserve restart files if there's a crash during initialisation
- Fix some segfaults in the PvodeSolver
- Fix some issues with Hypnotoad (see #1783 (friva000))
Other changes are mostly housekeeping changes for the BOUT++ project.
4.3.0 is a big feature release:
Fields are now "tagged" with their "y-direction": that is, whether they are in field-aligned space or not. This allows us to perform more internal checking, for example, that only field-alignedField3Ds are passed tofromFieldAlignedand that calculations are done in the correct y-direction space. Users may need to callf.setDirectionY(YDirectionType::Aligned)for aField3D fto set the direction tag- Add
toFieldAlignedandfromFieldAlignedfree functions bout::utils::is_Fieldand variants provide simpler methods of checking that input types areFields in templated code- Many, many more functions and operators support staggering. We're now also much more consistent about checking function arguments have compatible staggered locations
- New
emptyFrom(f)andzeroFrom(f)helper functions for creatingFields either allocated but not initialised, or allocated and initialised to0.0respectively, while ensuring the result is compatible with theFieldf(same mesh, same staggering, etc.) - Expressions used in input files now have support for unicode, escaping characters and implicit multiplication. See #1333 for more details.
- Internationalisation support, including translations for French, German, Spanish, and Simplified and Traditional Chinese
- Keyword arguments for boundaries in input files, e.g.
dirichlet(1, width=3) - File-level attributes in output files
- Write more things to output files, including processor indices and parallel transform information
- Complete overhaul of the derivative operators:
- derivative operators can now use native vectorisation where possible, as well parallelisation via OpenMP.
- users can register their own derivative operators and choose them at runtime
- more consistent handling of staggering in all directions and for
all
Fieldtypes - better handling of field-aligned
Fields
- Various bug fixes for parallel derivative inversions
- Introduced
zstartandzend, in preparation for introducing guard cells in the z-direction Optionshas several new features:- it can now store
Fields. This uses an implementation of C++17'sstd::variantbackported to work with C++11. Unfortunately, there are some compilers which have problems (see installation issues for help) Options::isSectiongained the ability to check whether an input argument is a subsection or not- now records the type of the option when used
- gained the
.docmethod which allows documentation to be added as an attribute, which can be recorded in theBOUT.settingsfile post-run
- it can now store
- FFTW is now an optional dependency
- A non-Fourier implementation of
Delp2 - A generic linear operator inversion class (see #1439)
Array,MatrixandTensorall gained areallocatemethod. This allows dynamic resizing of those objects, but invalidates the existing dataFieldFactorynow has separate parsing and generating stages, so functions can be parsed once and evaluated multiple times (e.g. for time-dependent functions)- Enable communications for simulations with no core, only divertor legs
Coordinateson staggered grids can now be read from grid files- New
FDDX_U2implementation - Support for SUNDIALS versions 2.6 to 4.1.0
BoutInitialisehas been pulled apart into separate utility functions under thebout::experimentalnamespace so that they can be used individuallyLaplaceCyclicnow acceptsC1andC2coefficients which may be differentLaplaceNaulinmay use the DC parts ofCfor faster convergenceLaplaceNaulinalso gained an under-relaxation factor, which may improve convergence and robustness- The
Laplacesolvers gained auses3DCoefsmethod. This returnstrueif the solver can make use ofField3Dcoefficients rather than using the DC component of them - A new time
Solver: Runge-Kutta-Legendre stabilised explicit method,splitrk. See #1673 for more details - Experimental support for CMake
- Added
HeatFluxSNBwhich calculates heat flux using the Shurtz-Nicolai-Busquet (SNB) model. Nonlocal (kinetic) corrections to the Spitzer-Harm collisional heat flux, which become important when the mean free path becomes a small (~1%) fraction of the temperature scale length - The new
BOUT_SCOREP_REGION("name")will automatically instrument a scope with Score-P if BOUT++ was compiled with Score-P support (see the documentation for more information) NYPEmay be given instead ofNXPEin input files for decomposing the mesh in(x, y)- Many fixes and improvements for Hypnotoad:
- Use centred differencing to compute
dxfrompsiinstead of forward differencing - Fix for when the separatrix is exactly on a grid point
- Fix for when the separatrix is very close to the X-point
- Fix computation of
ShiftAngle - Add a checkbox to the 'Output' tab, which if selected outputs
metrics for orthogonal coordinates (i.e. using
ShiftedMetric) - We now check what coordinate system was used to generate grid files in Hypnotoad when reading them in BOUT++
- Lots of fixes for non-orthogonal grids (see #1593, #1596, and #1636)
- Use double precision everywhere
- Add option to write y-boundary guard cells
- See here for a complete list
- Use centred differencing to compute
- Many, many more tests! Unit test coverage since v4.2.0 has doubled
- We have begun to move parts of the codebase into a
bout::namespace. This should help ensure we play nice with other libraries, as well as logically group related things across parts of the codebase
Deprecations:
invert_laplace: create an instance of aLaplacianviaLaplacian::createand use thesetCoef*andsolvemethods- Karniadakis time
Solver: the current implementation is very slow and will be removed in 5.0 MsgStack::setPoint: useMsgStack::push("")- The following
Meshmethods were experimental, low-level communication routines that turned out to not be so useful:sendToProcreceiveFromProcUpXSplitIndexDownXSplitIndexsendYOutIndestsendYOutOutdestsendYInIndestsendYInOutdestirecvYOutIndestirecvYOutOutdestirecvYInIndestirecvYInOutdest
Mesh::XGLOBALandMesh::YGLOBAL: useMesh::getGlobalXIndexand eitherMesh::getGlobalYIndexNoBoundariesorMesh::getGlobalYIndexinstead. The former (NoBoundaries) is a direct replacement forYGLOBAL, whereas the latter includes the boundaries and so is consistent withXGLOBALwhich does tooLaplacian::setFlags: useLaplacian::setGlobalFlags,Laplacian::setInnerBoundaryFlagsandLaplacian::setOuterBoundaryFlagsinstead- The staggered parallel differential operators that end
CtoLorLtoC(e.g.Div_par_CtoL,Grad_par_LtoC): the corresponding versions without the suffix now support staggering. For example, instead ofDiv_par_CtoL(f)useDiv_par(f, CELL_YLOW)instead
Removed:
- The
serialimplementation ofparderiv. Thecyclicversion works both serially and in parallel comm_group: not used internally and too low-level to be useful- Support for the
scipyandscientificnetCDF libraries inboututilshas been dropped. These were very slow andscientificis no longer available Laplace3D: useLaplacianinstead
4.2.0 is a big feature release:
- Large number of optimisations (as much as 140% faster than v4.1.2!)
- OpenMP in many more places, enables parallelisation in Z (as well as X for FCI)
- Better support for OpenMP, including in Python tools
- Much more versatile region system, allowing arbitrary regions (can e.g. mask certain parts of the domain for most common operations)
- Specialised macro for looping over Fields, handles arbitrary regions, OpenMP parallelisation, while also supporting native vectorisation
- Add support for new region system to many functions
- Better support for staggered grids: many bugfixes and many more functions support setting the location
Coordinatesobjects can be created at different locations, through theMesh::getCoordinatesandField::getCoordinatesmethods- Support for compiling as a shared library
- Experimental Python API via Cython module
- Arithmetic operators on fields are now generated using Jinja2
- Improved PETSc compatibility (better support out of the box, supports up to 3.9, drops support for versions before 3.4)
- New support classes for 2D/3D arrays (Matrix/Tensor)
- New interface for Options
- Divergence operators for FCI
- Support for attributes in NetCDF files
- Default Laplacian changed to cyclic
- Many C++ modernisation fixes
- New monotonic Hermite spline interpolator
- Better configure experience
- Zoidberg can produce curvilinear grids in all three directions (enables e.g. stellarator geometry. Current version of BOUT++ can't actually handle this yet -- upcoming version!)
- Many more tests, and a better testing framework for the integrated tests
- Some potential memory leaks and null pointer dereferences fixed
Deprecations:
DataIteratoris deprecated in favour of the newRegionandInd2D/3D/Perpfamily. This should not affect user code -- if it does, replacingDataIteratorwithautoshould do the right thing in most casesDataFile::writeVar: useDataFile::addOnceField::setNameandField::getName: just useField::namedirectly insteadField::errorandbout_error: useBoutExceptioninsteadrvector/rmatrix/rtensorfamilies of functions: useMatrix/Tensorinsteadoperator^(Vector2D/Vector3D): usecross()instead- The derivative function overloads with this order of arguments:
DD?(..., DIFF_METHOD, CELL_LOC, REGION). Instead, useDD?(..., CELL_LOC, DIFF_METHOD, REGION) - Vector derivative function overloads with three separate
outloc_[xyz]arguments: use the versions with a singleoutlocargument instead CyclicReduce::setCoefsandsolveoverloads that takeT[]orT**: use the version that takesArray<T>instead- The
FCIclass constructors that take abool yperiodicargument: this is no longer supported Mesh::coordinatesis deprecated in favour of the more consistently-namedMesh::getCoordinates. There is also nowField::getCoordinateswhich may be more convenient
Removed functions:
PhysicsModel::addToRestartandSolver::addToRestart: userestart.adddirectly insteadSolver::addMonitor(MonitorFunc): use theMonitor*overloads instead- The
get/setarray/datamethods in theFieldclasses: these methods are no longer supported
4.1.0 has some interesting new features:
- A way to cleanly stop simulations either through a stop-file, or via a KILL signal
- User-defined multiple monitors with different frequencies
- Four new boundary iterators for the inner and outer boundaries in double null configurations
- Better handling of 1D/2D Fields
- Dumping the actual settings used during a simulation to a file
- Colour output to highlight warnings/errors, along with options to increase/decrease verbosity
- Configure-time options to enable profiling with Score-P and coverage checking with gcov
- Removal of various functions deprecated in v4.0.0
- An overhauled testing framework with unit tests using GoogleTest
4.0.1 is purely a bug-fix release, with various fixes to some of the python tools, patching several memory leaks, and some important fixes for Intel compilers.