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.6.1-DEV] - 2026-09-11
Added
- Added FixedHeatFlux boundary condition #149
- Added AMG-preconditioned stabilized biconjugate gradient for solving non-symmetric equations/ #150
- Added
potential_flow!to initialise a simulation from a divergence-free potential-flow field. Velocity boundary conditions supply the initial face flux, and velocity-potential boundary conditions are inferred from the pressure boundary conditions: fixed pressure becomes fixed zero potential, periodic patches stay periodic, and every other patch uses zero normal gradient. Supports non-orthogonal correctors throughncorrectors#158
Changed
- Cached the sparse index maps the assembly writes through. The CSR sparsity pattern is fixed for the life of an equation, so
ScalarEquationandVectorEquationnow carrydiag_nzandface_nz, thenzvalindex of the diagonal and of each cell-neighbour coefficient, resolved once at construction instead of searched for on every assembly. Both types gain a type parameter and two fields #161 - Cached the Laplacian face coefficient on the mesh.
Mesh2andMesh3gain a type parameter and theface_gDifffield, derived from the face geometry at construction rather than passed in, and refreshed byupdate_face_gDiff!for readers that fill the geometry afterwards. The internal-face formnorm(((Sf⋅Sf)/(Sf⋅e))*e)/deltareduces exactly toarea/(|normal⋅e|*delta), and boundary faces keeparea/delta, which is what every@define_boundaryLaplacian block already uses. A mesh serialised with an earlier version can no longer be loaded and must be regenerated #161 - Turbulence models now build the wall-function accumulators once in
initialiseinstead of allocating and zeroing two cell-sized arrays on every outer iteration. The pair isnothingwhen no patch uses a wall function #161 - Threaded the diagonal preconditioner application.
LinearOperators'opDiagonalapplies the diagonal with a serial broadcast, once (Cg) or twice (Bicgstab) per Krylov iteration, and threading it is worth about 6% of every Krylov iteration on themotorBikecase #161 activate_multithread(backend::CPU)now defaultsnthreadstoThreads.nthreads()rather than 1. Krylov.jl sends every dot and axpy on aVector{Float64}to BLAS, so this setting also decides how those are threaded #161- The SIMPLE and KOmega flux fields are built without a mesh reference, and their consumers take the mesh from the cell field. A field struct that stores a mesh costs 416 bytes of per-thread local memory (an adapted
Mesh3) in every GPU kernel whose argument aggregate is not scalarised, which is 13.6% of amotorBikeGPU run #161 - The KOmega cell and face loops keep the mesh out of the kernel.
xcal_foreachdispatches on the backend so the GPU path calls the closure directly, whereAcceleratedKernelspassed it to a callee that is not inlined and spilled the captured environment, and both loops bind their fields to their bare storage. The production loop drops from 7112 bytes of stack frame and 11.0 ms per launch to none and 0.20 ms, the viscosity loop from 1840 bytes and 8.86 ms to none and 0.12 ms. On the CPU theAcceleratedKernelstask partitioning is unchanged. Together with the field change above,motorBikeruns 500 iterations in 21.0 s against 26.3 s #161 - Removed the unused
kfandomegaffields fromKOmega. They were allocated and destructured but never read, and were carried into every kernel that takes the turbulence model #161 - Removed the undocumented
XCALIBRE_AMG_DEVICE_COARSE_SOLVE,XCALIBRE_AMG_DEVICE_COARSE_MAXITERandXCALIBRE_AMG_DEVICE_COARSE_RTOLenvironment variables. They enabled a second, parallel device coarse-solve path that duplicatedcoarse_solve = OnDeviceKrylov()and reached it only withmode = Cg(), the one combination theAMGconstructor rejects because an inner Krylov solve is nonlinear in its right-hand side and breaks the fixed-operator assumption of preconditioned CG. The documentedcoarse_solvekeyword is now the only way to choose how the coarsest level is solved, and it is described in the user guide #159 - Removed the
coarse_tmpscratch vector fromAMGLevel. It was written only by the removed path, so every level allocated a full-length vector on the device that nothing read #159
Fixed
- Fixed mesh readers orienting some face normals into their owner cell. The orientation was decided by testing each normal against an estimated cell centre, which lies on the wrong side of a face in skewed or concave cells: 39 cells of a 0.6M-cell and 92 of a 10M-cell snappyHexMesh motorBike mesh did not close (sum of outward face areas up to 52% of the cell surface), and a concave 2D cell got wrong
nsignentries and a wrong area. Faces are now oriented from each cell's topology (edges traversed in opposite directions by adjacent faces, overall sign from the divergence theorem), which is exact for any closed cell, inUNV3D_mesh,UNV2D_meshandBlockMesher2D;FOAM3D_meshkeeps OpenFOAM's own orientation, which the format defines.nsignis now set from ownership in 2D, as in 3D, and 2D cell areas no longer depend on the orientation test. The VTK writer orders polyhedral face nodes from the same orientation instead of its own centre test #163 - Fixed missing density term in set_production! needed for cases with non-unity density #151
- Fixed
wall_shear_stressto apply the effective viscosity (nueff) scaling to the x-component of the shear stress vector - previously only the y and z components were scaled #152 - Fixed OpenFOAM
boundaryfile parsing so that patch groups (inGroups) no longer corrupt the patch list. The parser is now token based, ignores unknown dictionary entries, and reports malformed files with anArgumentError#153 - Fixed OpenFOAM mesh writer truncating point coordinates to six significant figures, which prevented a written mesh from round-tripping #153
- Fixed
reconstruct!omitting boundary faces when rebuilding a cell vector from a face-normal flux. The accumulation looped overcell_faces, which holds internal faces only. A cell becomes genuinely rank deficient when a direction is spanned by no internal face at all, as on a one cell thick mesh with anemptypatch: onOF_pitzDailythe through-thickness moment is zero for all 12225 cells and the reconstruction returns the zero vector everywhere. Boundary faces now contribute to the least-squares system #155 - Fixed the invertibility test in
reconstruct!comparing an area-cubed determinant against the absolute toleranceeps(TF). The moments scale with face area, so on a millimetre-scale mesh the determinant of a perfectly conditioned interior cell is already beloweps(6.4e-29on the 1 mm lid-driven cavity) and the reconstruction is silently zeroed everywhere, interior cells included, and at far coarser scales inFloat32. The test is now scaled by the magnitude of the moments #155 - Fixed
WallandRotatingWalldiffusion imposing only the tangential part of the boundary velocity together with the cell's own normal component, which let the wall-normal velocity float instead of being held at the prescribed value. Both now impose the full boundary velocity, matchingDirichlet#156 - Fixed
Slipcontributing nothing to vector diffusion. NoLaplacian{Linear}method was defined for vector fields, so the unqualified method returned zero coefficients for a slip patch.Slipnow projects onto the face tangent plane and matchesSymmetrycoefficient for coefficient, and gains the missingSimethod #156 - Fixed
SlipDivergence{BoundedUpwind}dropping the face-normal component for vector fields #156 - Fixed simulation start-up scaling with the number of boundary patches instead of mesh size. Patch sizes were passed to the
KernelAbstractionskernel constructor, where they becomeStaticSizetype parameters, so every kernel launched once per patch was compiled again for each distinct patch size. On themotorBikecase (354k cells, 72 patches) the first SIMPLE iteration spent 259 s in compilation, against 51 s for a 1.68M cell case with 6 patches, which presents as the solver hanging afterStarting SIMPLE loops.... Sizes are now passed at launch through_dynamic_setup, so all patches share one compiled kernel and the same first iteration takes 73 s #158 - Fixed wall functions racing on cells that own more than one wall face.
set_production!,constrain!and the mixing-lengthcorrect_nut_wall!assigned the cell value directly, so with several faces writing the same cell the result depended on which face won, both within a patch and across patches, and varied from run to run. They now sum the contributions of every face that touches the cell and divide by their number, so each face carries equal weight and the result no longer depends on the order the faces are processed in. On themotorBikecase 3220 of 45454 wall cells own 2 or 3 wall faces; single-face cells are unchanged and residuals are now reproducible run to run #158 - Fixed the mass flux correction using the relaxed pressure field. The pressure equation is solved for the full predicted continuity error, so correcting the flux with a relaxed pressure removes only a fraction of it and leaves a residual imbalance that does not vanish as the solution converges. The flux is now corrected from the unrelaxed solution and relaxation is applied afterwards, to the momentum correction only #158
- Fixed
WallandRotatingWallDivergence{BoundedUpwind}returning a zero source for vector fields. The bounded scheme subtractsapfrom the diagonal, so a zero source implicitly convects the cell's own velocity through the wall face instead of the prescribed boundary velocity. Both now carry the boundary velocity on the right-hand side #158 - Fixed
set_production!evaluating theKWallFunctionproduction against a hard-coded zero wall velocity, which overpredicts the shear at a moving or rotating wall. The wall velocity is now taken fromUf#158 - Fixed the pressure flux at
Extrapolatedpressure patches not being propagated to the boundary mass flux. The patch's Laplacian contribution is assembled from the owner-cell pressure available at assembly time, so once the pressure equation is solved the boundary flux is stale. The correction is now deferred and applied for patches whose velocity boundary condition is pressure-adjustable #158 - Fixed the non-orthogonal face correction being applied to the pressure equation but not to the mass flux, so continuity did not close on non-orthogonal meshes. The correction is now stored per face and subtracted from the mass flux #158
Changed
- 3D mesh geometry is now computed by a single shared routine used by both the UNV3 and OpenFOAM readers, which previously disagreed on cell centroids and volumes for the same mesh #153
- The OpenFOAM writer now preserves a complete existing
constant/polyMeshinstead of overwriting it, so results can be written alongside the original mesh #153 - The OpenFOAM writer compares the point and face counts declared by an existing
constant/polyMeshwith the simulation mesh, and warns and rewrites the mesh files when they disagree #153 2D_compression_corner.jland2D_cylinder_transonic_RANS.jlnow useSlipon patches that are physically symmetry planes or inviscid walls, replacingZerogradient#156_nonorthogonal_face_correctionnow builds the correction from a projected-delta correction vector rather than the over-relaxedEf/T_hatdecomposition, andcorrection_weightis no longer needed #158CSIMPLEnow relaxes pressure explicitly forCompressiblefluids, as it already did forWeaklyCompressibleones, instead of relaxing the pressure equation implicitly throughirelax. Relaxation had to move after the mass-flux correction so that the flux is built from the unrelaxed solution, and implicit relaxation cannot be deferred in the same way because it alters the matrix the flux is reconstructed from. Compressible cases converge along a different path and may need their pressure relaxation factor retuned #1582D_bump_NASA_kwSST.jl,2D_compression_corner.jland2D_cylinder_transonic_RANS.jlsolver tolerances and relaxation factors retuned for the corrected fluxes #158
Breaking
assignnow requires every mesh boundary to be assigned exactly once and throws anArgumentErrornaming any missing or duplicated patch. Previously only the number of boundary conditions was checked, so an assignment that named one patch twice and omitted another was accepted, leaving a patch without a boundary condition #154
Deprecated
- No functions deprecated
Removed
Version v0.6.0 - 2026-07-17
Added
- Added optional adaptive time stepping based on Courant number control (
AdaptiveTimeStepping) #98 - Added runtime calculation of Q-criterion #107
- Added explicit Godunov-type compressible solver (
godunov!) forSupersonicflows using Rusanov (local Lax-Friedrichs) and HLLC flux schemes with first and second order spatial reconstruction (MinMod, VanLeer, Superbee limiters) and adaptive CFL-based time stepping. This is the recommended solver for high-speed flows in the range 0.8 < M < 5 approximately #112 - Added experimental incompressible steady MFR solver #114
- Added runtime probe extraction #115
- Added initialisation logic for new Multiphase solver user-level API #117
- New Eulerian Thin Film model solver (2D only) #120
- Added
setField_Expression!toSetFieldsutility to initialise function-based fields. #124 - Added VanLeer, upwind, and gradient interpolation schemes for scalar and vector face fields #124
- Added multiphase solver (VOF model only) with two supporting functionality tests. #132
- Added mixture model inside multiphase solver with supporting unit and functionality tests. #136
- Extended
initialise!API with function-based overloads forScalarFieldandVectorField#135 - Pressure-based compressible solvers have been extended to include
SensibleEnthalpyandInternalEnergyformulations. The solver now correctly handlesCompressiblefluids, activating the transonic correction that allows shock capturing for moderate high-speed applications, typically in the range 0.8 < M < 2 #145
Fixed
- Add implementation of
Periodicboundaries to handle the implicit source term - fixes operation of models that useSiterms #95 - Fixed implementation of implicit boundaries in #96 which where missing atomics #100
- Fixed calculation of the residuals to use the relative residual norm, norm(b - Ax)/norm(b), the numerator in this expression was calculated incorrectly previously, giving a 1/sqrt(n) relation (where n is the number of cells in the grid). whilst the operation of the solvers remains the same, user may find that convergence criteria may need to be increased (specially for larger grids)#102. Move calculation to scale residuals in #134
- UNV2: Fix calculation of cell volumes and centroid for boundary cells was incorrect and missing boundary face contributions (only for 2D UNV meshes)#106
- Fixed implementation of k-omega LKE transition model and how wall distance field is calculated to ensure it is GPU compatible #109
- Fixed mixed-precision mesh conversion to preserve user-selected integer and floating-point types #125
- Fixed pressure boundary mass-flux correction #125
- Fixed turbulent effective viscosity updates so turbulence models include eddy viscosity again, reverting a regression introduced in #120 #125
- Add missing constructor for LES{Laminar} supporting qDNS simulations #144
Changed
- Improved stability of
Periodicboundaries by making the implementation fully implicit #96 - 4x speed improvement for the method
construct_periodic#97 - +50x speed improvement for the method
construct_periodicand also more robust algorithm used #100 - Implementation to correct mass flux uses matrix coefficients directly for better stability when using periodic boundary conditions #100
- New method to enforce matrix symmetry of scalar model equations when the only term is a laplacian #100
- Change calculation of face interpolation weights to use face normal aligned weights, this is more physical than the current method using face-based distances (in preparation for formal support for non-orthogonality correction)#101
- 20x improvement loading and processing 3D UNV mesh files #106
- Updated discretisation, boundary condition, turbulence, solver, and preconditioner paths to avoid unintended
Float64promotion onFloat32meshes #125 - FOAM reader has been updated for robustness and speed (~4x faster) #126
- Rewrote
pressure_forceandviscous_forceas backend-agnostic (CPU/GPU) kernels, changed their signature to(patch, model, config), and corrected the pressure force to scale by reference density only for incompressible (kinematic pressure) flows #129 - Improved calculation of viscous force using wall eddy viscosity and perpendicular cell-to-face distance #130
Breaking
- Pressure-based compressible solvers (for
WeaklyCompressibleandCompressiblefluids) have been extended to work withSensibleEnthalpyandInternalEnergyformulations. Thus, to capture this change, the energy field has been renamedheinstead ofh#145
Deprecated
- No functions deprecated
Removed
- No functionality has been removed
Version v0.5.2 - 2025-01-16
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 - Implementation of a new AMG solver for symmetric matrices #141
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
- Improved calculation of wall distance for turbulence models to prevent negative square roots resulting in DomainErrors #139
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!