Release notes
The format used for this changelog is based on Keep a Changelog, and this project adheres to Semantic Versioning. Notice that until the package reaches version v1.0.0 minor releases are likely to be breaking. Starting from version v0.3.1 breaking changes will be recorded here.
Version v0.5.2 - 2025-XX-XX
Added
- Initial support for mixed precision (UNV meshes only) #67
- New solver for simulating conduction in solids #65
- New LES turbulent kinetic energy one equation model (
KEquation) #71 - Surface tension model for fluids #72
- High fidelity viscosity models for H2 and N2 #72
- High fidelity thermal conductivity models for H2 and N2 #72
SetFieldsutility that allows to set a field to desired value within a box / circle / sphere #73- Helmholtz Energy equation of state and supporting framework for it for H2 and N2 #75
FieldAverageandFieldRMSof Vector and Scalar fields #78- Added
RotatingWallvelocity boundary condition #81 - Added
KOmegaSSTturbulence model #82 - Added capability to write out TensorFields to .vtk/vtu including Reynolds Stress Tensor #84
- Added capablity to write out TensorFields to .vtk/vtu including Reynolds Stress Tensor #87
- Extended
DirichLetFunctionto accept functions defining boundary condition forScalarFields#89 - Implemented
CrankNicolsontime scheme (second order implicit-explicit) #90
Fixed
- The
UNV3D_meshreader has been updated to ensure that the ordering of face nodes is determined in a more robust manner. This resolves some issues when loading aUNVmesh that is later used to store simulation results in theOpenFOAMformat #64 - In the construction of a
Physicsobject, theboundary_mapfunction returned aboundary_infostruct which was incorrectly using an abstract typeInteger. This resulted in a failure to convert aPhysicsobject to the cpu and back to the gpu #67 - Fixed calculation of interpolation weights for 2D UNV grids #68
- Added method for boundary interpolation when using
LUSTandDirichletFunction#68 - Fixed
boundary_interpolationforDirichletFunctionwhen a function is passed #79
Changed
- The constructors for
ScalarFieldandFaceScalarFieldnow include astore_meshkeyword argument to request a reference of the mesh to be stored (default) or not (settingstore_mesh=false). This can be used to not include references to the mesh for each field inVectorFieldsandTensorFields. This has improved compile times and decreased simulation times (particularly on the GPU - perhaps due to freeing registers used to carry unnecessary type information) #69 - Internally, the calculation of interpolation weights and other geometric properties are calculated using the same function (defined in the
Meshmodule) #69 - The default discretisation for laplacian terms uses the over-relaxed formulation by default. This will have no effect on orthogonal grids, but tends to be more robust in complex geometries at the expense of accuracy, which can be recovered by adding additional orthogonal correction loops (using the key word argument
ncorrectorsin therun!function) #73 - Cleaned code for all solvers and improved stability of incompressible solver by removing the update of the mass flow based on the velocity field from the previous iteration. The mass flow is now corrected directly from the latest pressure solution #76
Breaking
- No breaking changes
Deprecated
- No functions deprecated
Removed
- No functionality has been removed
Version v0.5.1 - 2025-07-03
Added
- New
Emptyboundary condition allowing 2D simulations with OpenFOAM 2D-compatible grids#63 - Tests for the
SmagorinskyLES model have been included #63
Fixed
- No fixes included
Changed
- Transient simulation results for
VTKandVTUfiles use the formattime_<iteration>#63
Breaking
- No breaking changes
Deprecated
- No functions deprecated
Removed
- No functionality has been removed
Version v0.5.0 - 2025-06-28
Added
- New boundary conditions
ExtrapolatedandZerogradienthave been added. Both assign a zero gradient boundary condition, however, their implementation differs.Extrapolatedassigns the zero gradient condition semi-implicitly (using the cell centre unknown and the cell centre value from the previous iteration).Zerogradientassigns the gradient in the boundary faces explicitly #61 - The workgroup size for the CPU backend can now be automatically chosen when
workgroup=AutoTune(). This uses a simple ceiling division internally where the number of elements in the kernel are divided by the number of available threads. This results in a small 10% performance gain #61
Fixed
- Fixed the implementation for the calculation of the wall distance to work on GPUs #49
- The new approach for handling user-provided boundary conditions now allows extracting the wall velocity specified by the user for the
Wallboundary condition #61
Changed
- In the calculation of wall function properties the user-provided wall velocity is now used, instead of hard-coded to no-slip #49
- The functions
set_production!,set_cell_value!andcorrect_nut_wall!, inRANS_functions.jlhave been updated, removing conditional branch used in the generated calling them. Now these functions use multiple dispatch to allow specialising the wall function framework to ease the development of new wall functions #57 - New
NeumannFunctionhas been created, mirroring the DirichletFunction, providing a Neumann boundary condition defined with a user-provided struct (a generic framework accepting a function to set the gradient at the boundary is not yet available) #57 update_user_boundaryfunction, extension has been reverted, overwriting the changes made to expose theModelEquationtype to it in #55- User-provided boundary conditions are no longer stored within fields, instead a
NamedTupleis constructed using the functionassign, which is passed to solvers using theConfigurationstruct. - Configuration setting provided by the user at the top-level API are now stored in predefined structs, instead of using
NamedTuples, this change should put less pressure on the compiler #61 - Internally, kernel launches have been updated to use a static
NDrange. This resulted in a 20% speed improvement on GPU backends (only NVidia GPUs tested) #61
Breaking
- The definition of Krylov solvers in the previous API used types exported directly from
Krylov.jl. Now solvers are defined using instances of types defined inXCALibre.jl. As an example, previously the CG solver was defined using the typeCgSolvernow this solver is defined using the instanceCg()where the suffix "Solver" has been dropped. This applies to all previously available solver choices #60 - The Green-Gauss method for calculating the gradient is now
Gausswhich is more descriptive than the previous nameOrthogonal - The internals for handling user-provided boundary conditions have been updated in preparation for extending the code for handling multiple regions. Thus, the syntax for assigning boundary conditions has changed. The most noticeable change is the removal of the the
@assign!macro, replaced by the functionassign. See the documentation for details #61 - The
set_solver,set_hardwareandset_runtimetop-level functions have been replaced withSolverSetup,HardwareandRuntimestructures. This allowed storing user-provided setup information in structs instead ofNamedTuplesto reduce the burden on the compiler #61 - The implementation of the
FixedTemperatureboundary condition has been simplified, resulting in a breaking change. The definition of the boundary condition now requires users to provide anEnthalphymodel. This interface should make it easier to extend the current implementation to new forms of the energy equation #61
Deprecated
- No functions deprecated
Removed
- The functions
set_solver,set_runtime,set_hardwareand the macro@assign!have been removed/replaced #61
Version v0.4.2 - 2025-04-02
Added
- A very simple 2D block mesh generator has been added (not ready for general use as it needs to be documented)#41
- Implementation of
Wallboundary conditions specialised forScalarField#45 - Simulation results can now be written to
VTKandOpenFOAMformats. The format can be selected using theoutputkeyword argument in therun!function. The formats available areVTK()andOpenFOAM()#47
Fixed
- Fixed the implementation for the calculation of the wall distance #45
Changed
- In preparation for hybrid RANS/LES models, the object
Turbulenceis now passed to theTurbulenceModelobject to allow for a more general call ofturbulence!. This changes the implementation ofturbulence!for all models slightly #46 - Improved stability on meshes with warped faces by changing how face normals are calculated. XCALibre now uses an area-weighted face normal calculation based on the decomposition of faces into triangles #47
- Removed
VTKmodule and moved functionality to a newIOFormatsmodule #47 - Internally the function
model2vtkhas been replaced withsave_outputwithin all solvers. The specialisation for writingModelPhysicsmodels to file has also changed tosave_output. The arguements pass to this function have also changed, thenameof the file is not passed to the function, instead, the current runtime variabletimeis required #47 - The
Momentumobject, part of theModelPhysicsobject, now includes theFaceScalarFieldandFaveVectorFieldin addition to existing fields in preparation for non-uniform boundary definition when using theOpenFOAMoutput format #47
Breaking
- No breaking changes
Deprecated
- No functions deprecated
Removed
- No functionality has been removed
Version v0.4.1 - 2025-03-06
Added
- No new functionality has been added
Fixed
- Remove fragile precompile statements of the form
var"#*#*"causing errors in Julia v1.12 #40
Changed
- In preparation for implementation of hybrid models e.g. DES, the signature of the
turbulence!function has been updated to use theAbstractTurbulenceModel#39 - New semi-implicit implementation for periodic boundary conditions (implicit treatment of laplacian terms)#40
Breaking
- No breaking changes
Deprecated
- No functions deprecated
Removed
- No functionality has been removed
Version v0.4.0 - 2025-02-17
Added
- Implementation of
Symmetryboundary condition forScalarFieldtypes #30 - New macro to help define boundary conditions that will dispatch to
ScalarorVectorFieldtypes #30 - Added
eltypemethod for bothScalarandVectorFieldtypes to simplify the development of new kernels where type information is needed #30 - New gradient limiters
FaceBasedandMFaceBasedfor limiting gradients based on cell faces, whereMFaceBasedis a multidimensional version, and it is generally recommended overFaceBased#30 - Support for INTEL hardware #32
Fixed
- Calling
JacobiSmoothernow works on the GPU #30 - Implemented
SparseXCSRas wrapper forSparseMatrixCSRon the CPU to resolve display/print errors #30 - The convergence criteria for solvers is used consistently to stop/control simulation runtime #36
- Consistent display of residuals on screen during simulations #36
- Fixed calculation of wall distance and
apply_boundary_conditions!arguments forLKEmodel #36
Changed
- The calculation of gradients has been improved by merging computations into a single kernel, improving performance of gradient kernels by around 10-30%, most noticable for vector gradients #30
- Improved calculation of non-orthogonal calculation (more tests are still needed), although tests have proven to be stable #30
- Improved documentation/readme on supported GPU backends/hardware and make users aware of potential
F32limitation on some hardware
Breaking
- The top level API for all solvers no longer takes the keyword argument
limit_gradientfor activating gradient limiter. New gradient limiters have been added and can be selected/configured when assigning numerical schemes with theSchemesfunction #30
Deprecated
- No functions deprecated
Removed
- No functionality has been removed
Version v0.3.3 - 2024-12-24
Added
- Added experimental support for NVIDIA ILU0 and IC0 preconditioners #23
- Added
JacobiSmootherthat can be used with all linear solvers (improving initial guess) #23 - New function
activate_multithreadis available to set up matrix-vector multiplication in parallel on the CPU - Initial benchmark added in the documentation
Fixed
- No fixes
Changed
- Internally the sparse matrix format has been changed to CSR. This has improved performance by 2x-4x (case dependent)
- Multithreaded sparse matrix vector multiplication is now functional #23
- Precompilation errors on Julia v1.11 addressed by bringing code from
ThreadedSparseCSR.jl#24 - Update compat entry for
Atomix.jlto v1.0,0 #24 DILUpreconditioner is now implemented to work with sparse matrices in CSR format and uses a hybrid approach (running on CPU) to allow working when using GPU backends (further work needed) #26- The implementation of RANS models and wall functions has been improved for consistency (resulting in some computational gains). The calculation of
yPlusLamis only done once when constructing the wall function objects. The calculation of the velocity gradient is now only done within the turbulence model main function (turbulence!) #28
Breaking
- No breaking changes
Deprecated
- No functions deprecated
Removed
- The
ILU0andLDLpreconditioners has been temporarily removed #23
Version v0.3.2 - 2024-11-08
Added
- Added support for CI testing, Dependabot, and CompatHelper
Fixed
- Fixed tests for mesh conversion and standardised tolerances for test checks of incompressible solvers #16
Changed
- No changes
Breaking
- No breaking changes
Deprecated
- No functions deprecated
Removed
- No functionality has been removed
Version v0.3.1 - 2024-10-18
Added
- Vastly improved documentation with new examples provided #12
- Changelog added to record changes more clearly. Record kept in Release notes
Fixed
- The calculation of gradients can be limited for stability. This functionality can be activated by passing the key work argument
limit_gradientto therun!function. The implementation has been improved for robustness #12 - Removed face information being printed when
Meshobjects are created to stop printing aERROR: Scalar indexing is disallowedmessage #13
Changed
- Master branch protected and requires PRs to push changes
Breaking
- No breaking changes
Deprecated
- No functions deprecated
Removed
- No functionality has been removed
Version v0.3.0 - 2024-09-21
- New name - XCALibre.jl - which is now registered in the General Julia registry
- Can do 3D and GPU accelerated simulations
- Can read .unv and OpenFOAM mesh files (3D)
- Can do incompressible and compressible simulations
- RANS and LES models available
- User-provided functions or neural networks for boundary conditions
- Reasonably complete "user" documentation now provided
- Made repository public (in v0.2 the work was kept in a private repository and could only do 2D simulations)
- Tidy up mesh type definitions by @mberto79 in #5
- Adapt code base to work with new mesh format by @mberto79 in #6
- Mesh boundary struct changes PR by @TomMazin in #7
- Mesh boundary struct changes PR fix by @TomMazin in #8
Version v0.2.0 - 2023-01-23
- New mesh format and type implemented that are GPU friendly.
- No functionality changes
Version v0.1.0 - 2023-01-23
Initial release
2D implementation of classic incompressible solvers for laminar and turbulent flows:
- Framework for equation definition
- SIMPLE nad PISO algorithms
- Read UNV meshes in 2D
- Capability for RANS models
- Various discretisation schemes available
- Planned extension to 3D and GPU acceleration!