- Remove VoronoiFVM solver strategies
- Stop re-exporting ForwardDiff.value
- Try to remove type piracies
- Remove
params
from edge, node structs (apparently never used)
- Allow to calculate node flux reconstruction from general function
- Runic formatting
- pre-commit checks
- update show methods for physics, grid
- Use
precs
based linear solver API, see SciML/LinearSolve.jl#514 with ExtendableSparse 1.6 - Deprecate VoronoiFVM solver strategies
- Allow to use result of time embedding a steady state for impedance
- Move to WIAS-PDELib org
- Add
params
to SystemState, allow to pass params to ODEProblem - Fix use of end results of time evolution as steady state for impedance calculations
- new internal solutionarray method.
Moved repository from https://github.com/j-fu/VoronoiFVM.jl to https://github.com/WIAS-PDELib/VoronoiFVM.jl. WIAS-PDELib is a github organization created to collectively manage the Julia packages developed under the lead of the WIAS Numerical Mathematics and Scientific Computing research group. According to the github docs on repository transfer, all links to the previous repository location are automatically redirected to the new location, and all relationships with forks stay intact.
- Features:
- Add VoronoiFVMExtendableFEMBaseExt extension allowing to use velocity fields calculated with ExtendableFEM in convection-diffusion problems
- Bugfixes
- replace internally used
values
andvec
methods by newdofs
- fix #119, update Example115, Example120, test sparse unknown storage & ODE solver
- directly re-export ForwardDiff.value, dont type-pirate a new method
- replace internally used
- Bugfixes
- fix case where the last element of a time solution is used as initial value for a next
solve
- fix case where the last element of a time solution is used as initial value for a next
- Removed deprecated solve methods:
solve(inival, system::VoronoiFVM.AbstractSystem, lambdas;kwargs...)
solve(inival, system::VoronoiFVM.AbstractSystem; kwargs...)
solve!(solution,inival, system::VoronoiFVM.AbstractSystem; kwargs...)
- History is now a field of the solution but not system, to be accessed with
history(solution)
, instead ofhistory(system)
both for stationary and transient solutions VoronoiFVM.Physics
callbacks (flux
,storage
, etc.) need adata
argument, even ifdata
is not provided duringPhysics
orSystem
construction
- Introduced
SystemState
which contains entries (matrix, residuals, data) which before were part ofSystem
. One can have different states with different data for the same system. - Introduced
solve!(state::SystemState; kwargs...)
method - Stationary solutions now contain a history entry and are subtypes of VoronoiFVM.AbstractSolutionArray
- Changelog now in package root
- Sparse solver default for Float64 in all space dimensions is now UMFPACKFactorization. For all other number types it is SparspakFactorization. Before it was KLU for 1D, Sparspak for 2D an UMFPACK for 3D.
VoronoiFVM.Physics
callbacks (flux
,storage
, etc.) withoutdata
argument are now deprecated
- Bernoulli function using expm1 (thanks @tcaduser !)
- Add
integrate(sys,solution)
method
- Multithreaded assembly
- Introduce nondelaunay method for checking Delaunay properties of grid
- Drop Julia 1.6 support, improve package quality (partial Aqua tests, explicit imports)
- Enable equation block preconditioning for sparse unknown storage
- Re-shoring of OrdinaryDiffEq interface, no need of VoronoiFVMDiffEq.jl anymore It appeared that it is sufficient to depend on SciMLBase for this, and all tests can be done with OrdinaryDiffEq.jl
- Bugfix for boundary node factors
- Bugfix with types for RecursiveArrayTools
- Bugfix for assembly of outflow bc
- Bugfix for matrixtype=:banded
- Updated
plothistory
:
- Adjusted time/embedding stepping scheme, added
num_final_steps
toVoronoiFVM.SolverControl
. This may lead to slightly different results when solving time dependent problems. Some unit test values have been adapted. Before, accidentally, very small time steps at the end of an evolution were possible.
- Add
Δu_max_factor
andΔt_decrease
toVoronoiFVM.SolverControl
. Before (with values 2.0 and 0.5, respectively) the were fixed. NewΔu_max_factor=1.2
default. - Add history to
VoronoiFVM.TransientSolution
, prepare deprecation ofsystem.history
- Add
plothistory
method
- Add
nodevolumes
method
- Add functionality for outflow boundary conditions
- Add
calc_divergences
method for checking velocity field divergences - Fix form factor calculation and velocity projecion for unstructructured grids and cylindrical symmetry
- Use AbstractTransientSolution in gridvisualize stuff
- With
control.handle_exceptions=true
, in case of a failing step, time stepping and embedding now returns the solution calculated so far instead of throwing an error
- LinearSolve 2.x
- Discrete Sobolev norms
- Rework linear solver strategies - prevent combinatorial explosion.
E.g.
gmres_iluzero
is nowGMRESIteration(ILUZeroPreconditioner())
etc.
- Introduced solver strategies like
gmres_iluzero()
,direct_umfpack()
etc. See documentation of the moduleVoronoiFVM.SolverStrategies
. More to come. - edgewise assembly - faster in particular for 3D
- Plan: edgewise assembly seems to be non-breaking, if this is confirmed, will be made default in 1.6 or (if it appears to be breaking for some) in 2.0.
- equation-block preconditioning support with the help of ExtendableSparse.jl
- inplace_linsolve! for dense linear system solution in flux functions
- Mixture flow example 510
- Initialization of quantities, create unknowns using Base.map
- Edge reactions, Joule heating
- full LinearSolve compatibility
This is a breaking release. Implementations using default solver settings should continue to work without modifications, albeit possibly showing deprecation and allocation warnings. Really breaking is control of iterative linear solvers and allocation checks.
- Make
solve
a method ofCommonSolve.solve
(and re-export it). - Rely on
LinearSolve.jl
for linear system solution including control of iterative solvers. - New verbosity handling.
verbose
can now be a Bool or a String of flag characters, allowing for control of different output categories. I would love to do this via logging, but there is still a long way to go IMHO - Allocation check is active by default with warnings instead of throwing an error. These warnings can be muted by passing a
verbose
string without 'a'. This is now the only control in this respect. Allcheck_allocs
methods/kwargs, control via environment variables have been removed. - Deprecation warnings can be switched off by passing a
verbose
string without 'd'. - Improve iteration logging etc., allow for logging of linear iterations ('l' flag character)
- Deprecated all
VoronoiFVM.solve
methods with signatures others thansolve(system; kwargs...)
which renders them incompatible to the philosophy of `CommonSolve. Updated examples accordingly. - Deprecated the following entries of SolverControl/solve kwargs:
:tol_absolute
=>:abstol
,:tol_relative
=>:reltol
,:damp
=>:damp_initial
,:damp_grow
=>:damp_growth
:max_iterations
=>e:maxiters
:tol_linear
=>:reltol_linear
:max_lureuse
=> NewtonControl
- Internal restructuring: remove
@create_physics_wrappers
macro, reduce boilerplate in assembly, wrap repeating pattenrns into functions. The price in the moment is a bit of a slowdown of assembly. - Fix parameter dependency handling (now we can get parameter derivative without solving in dual numbers; see the runh() example in Example430. However in the moment the advantatge is not very clear, so this is on hold...
- bump gridvisualize compat
- enable non-diagonal mass matrices for VoronoiFVMDiffEq
- ready for Julia 1.9, re-enable CI on nighly
- Add API methods used by VoronoiFVMDiffEq.jl
- Removed some allocations
- Emerging capability of differencing wrt. parameters (experimental, see example 430)
- Allow iterative methods from Krylov.jl
- Proper Dirichlet initialization with bcondition
- Allow for more general matrix structures (banded, tridiagonal, multidiagonal)
- Working spherical symmetry case
- Remove DifferentialEquations interface (move this to a glue package) The current method of activating it through require is too brittle with respect to versioning.
- Fix DifferentialEquations interface, start transition to LinearSolve
- ensure not to assemble data for species where they are not enabled This change should be breaking only for incorrect code where physics callbacks write into degrees of freedom which are not enabled
- add
iteration
to solver options, allow to choose :cg, :bicgstab. - allow setting penalty with boundary_dirichlet!
- fix x-t plots
- Linearization API
- relax some type constraints
- ExtendableGrids 0.9
- fix quantity postprocessing
- define unknown access for abstract vectors instead of vectors
- pass rhs/unknowns wrappers in postprocessing methods
- integrals as a wrapper type with proper quantity handling
- Expose ODEProblem (and possibly ODEFunc) from VoronoiFVM.System.
- Breaking: Remove
solve
wrapper for DifferentialEquations.solve, instead recommend to call that directly - Breaking: Handle DifferentialEquations.jl via Requires.jl.
- Documentation fixes
- Fix OrdinaryDiffEq interface
- added example for current calculation with Quantities
- Fixed type instabilities in quantities interface
- Breaking: History is not anymore returned by
solve
, instead it can be accessed viahistory
after the solution. - Cleaned API:
VoronoiFVM.solve(system::VoronoiFVM.AbstractSystem; kwargs...)
is now the main method ofsolve
which allows to access stationary, transient, embedding and DifferentialEquations based solvers.- Joint implementation for implicit Euler timestepping and parameter embedding
- Handle more kwargs via SolverControl (e.g. log)
- Use Parameters.jl in struct definition
- Add history types
NewtonSolverHistory
,TransientSolverHistory
detailed
andsummary
methods for both history types- Nonlinear solver example notebook (under development): [nonlinear-solvers.jl](@ref nonlinear-solvers)
- OrdinaryDiffEq solver now in CI
- scalarplot for 1D transient solutions
- Sparsity detection via Symbolics.jl instead of the sunsetted SparsityDetection.jl
Backward compatible, hopefully nonbreaking API simplification
- Boundary conditions are now specified in breaction.
Advantages:
- easy x/t dependency
- unified (upcoming) interface for parameters
- unified handling of standard and nonstandard boundary conditions
- simpler documentation
- Made NewtonControl alias of SolverControl, continue to work with SolverControl
- System constructor now directly takes physics callback functions, no need anymore to work with extra physics struct
- solve() now takes "SolverControl" parameters as kwargs,no need anymore to work with extra NewtonControl/SolverControl struct
- Notebooks as part of documentation and CI
- See also the pluto notebook [api-update.jl](@ref api-update)
- Bernoulli function overhaul
- sorted things with ExtendableGrids
- nodal flux reconstruction (e.g. for visualization)
- various bug fixes, explicit numbering of edge nodes
- Add quantity id
- Document quantities
Introduce the notion of quantities which can be continuous or discontinuous at interfaces.
- Quantity handling is implemented on top of species handling
- Unknowns u and rhs y now passed to callbacks as wrapper types, and can be indexed by quantity or by species numbers. Moreover, this will allow to abstract parameters, gradients etc. in future versions.
- By default, the
u
parameter in flux callbacks is now anspec x 2
array unknowns(edge,u)
,viewK, viewL
are obsolete, they still work for backward compatibilityphysics.num_species
is now meaningless, num_species is automatically detected.SparseSystem
andDenseSystem
are now type aliases of a parametrized type instead of two independent subtypes ofSystem
- increase chunk size threshold to match argument length in calls to vector_mode_jacobian
- First attempts on surface flux
- Assembly loops cleaned from type instabilities
- Optionally check for allocations due to type instabilities introduced in physics callbacks.
See
check_allocs!
for more information.
- Depending on Julia 1.5 now
- Lineaer solvers now based on factorize! from ExtendableSparse 0.5
- Documentation overhaul
- Re-checking impedance calculation
- Outflow boundary conditions
- TransientSolution structure, transient solve
- Solve compatible with DifferentialEquations.jl
- Introduce non-mutating solve
- Optionally record history if log kw is true in solve.
- Moving visualization to the package GridVisualize.jl, emerging from the visualization methods in ExtendableGrids
- Add the possibility to interface with DifferentialEquations.jl
- Breaking: The API change to passing the unknowns to the
an edge callback as a matrix turned out to be a dead end in the
strategic sense. In order to extend functionality, we need to be able
to pass more data to which we can apply differetiation. Particular plans
involve bifurcation parameters and reconstructed gradients.
So we return to the viewK/viewL pattern we had before. However,
these are now aliases:
viewK(edge,u)=unknowns(edge,u,1)
viewL(edge,u)=unknowns(edge,u,2)
In order to ease refactoring in the case where models have been implemented with Matrix access to the unknowns,unknowns(edge,u)
returns a matrix of the edge unknowns. For refactoring, just rewrite e.g.
function flux(y,u,edge)
for ispec=1:nspec
y[ispec]=u[ispec,1]-u[ispec,2]
end
end
to
function flux(y,u0,edge)
u=unknowns(edge,u0)
for ispec=1:nspec
y[ispec]=u[ispec,1]-u[ispec,2]
end
end
- allow any object in Physics.data (thanks Jan Weidner)
- add generic operator for non-canonical problem structures
- Update ExtendableGrids + ExtendableSparse
- Replace splatting by dispatch on availability of data record
- Form factors are now pre-calculated and stored
- Introduced update_grid! for triggering re-calculation if coordinates have changed
- Introduce evolve! : time solver with automatic timestep control
- Replaced VoronoiFVM grid module by ExtendableGrids.jl
- Moved grid generation, modification, plotting over to ExtendableGrids
- Necessary changes in codes using VoronoiFVM:
- Replace
grid.coord
bycoord
obtained viacoord=coordinates(grid)
orcoord=grid[Coordinates]
after importing ExtendableGrids - Replace
VoronoiFVM.plot
byExtendableGrids.plot
. - In the plot method, Plotter is now a keyword argument
VoronoiFVM.Grid()
now returns a ExtendableGrids.ExtendableGrid, in fact it is just an alias to ExtendableGrids.simplexgrid- For using any methods on grids like cellmask! one needs to use
ExtendableGrids
- Subgrids now are of the same type
ExtendableGrids
, views are currently defined for vectors only.
- Replace
-
API modification:
- Breaking:
-
data
parameter passed to physics callbacks only ifPhysics
object is created withdata
parameter.This makes the API more consistent in the case that parameters are just taken from the closure (the scope where the physics functions are defined) and no data
object
has been created. -
Replace
node.coord[i]
bynode[i]
. -
Replace
edge.coordK[i]
byedge[i,1]
. -
Replace
edge.coordL[i]
byedge[i,2]
.This now directly accesses the coordinate field of the grid and avoids copying of the coordinates
-
- Backward compatible:
- No need for
viewK and viewL
in edge callbacks (they also make trouble with allocations...)- Replace
uk[i]
byu[i,1]
- Replace
ul[i]
byu[i,2]
- Replace
- Replace
VoronoiFVM.DenseSystem(...)
byVoronoiFVM.System(..., unknown_storage=:dense)
- Replace
VoronoiFVM.SparseSystem(...)
byVoronoiFVM.System(..., unknown_storage=:sparse)
- No need for
- Breaking:
-
No allocations anymore in assembly loop:
- Replaced
ElasticArray
inGrid
by normal one - this was the largest regression - Return
nothing
from mutating methods to avoid some allocations - Indexing in
formfactors.jl
withInt
- Replaced
- use updateindex! for matrix, depend on ExtendableSparse 0.2.6
- Rearranged + commented boundary assembly loop
- Reworked + renamed some examples
- Document that unknowns doesn't initialize values.
remove xcolptrs call Update dependency on ExtendableSparse
Updated dependency list (Triangulate ^0.4.0)
- return "plotted" for being able to place colormap
- require Triangulate >= 0.3.0
- Removed Triangle submodule, depend on new Triangulate.jl Triangle wrapper
- link to source code in examples
- boundary_dirichlet! etc methods for setting boundary conditions
- Bug fixes
- check triangle input for min 3 points
- check triangle edgelist for C_NULL
- voronoi plot
- (Temporary) Copy of TriangleRaw as Triangle submodule. To be replaced by dependency on evisioned package
- Re-enabled ElasticArrays in grid structure (for the time being)
- Added potkink example: this adds an inner boundary
- triangle in optional submodule
- Modified API for plotting
- Removed formal dependency on Plots and PyPlot
- Use Plotter module as first parameter to plot methods - replaces fvmplot
and fvmpyplot functions. Use
VoronoiFVM.plot(PyPlot,...)
resp.VoronoiFVM.plot(Plots,...)
- No more complaints when package is used in environment with plots or pyplot installed
- Modified API for impedance
- Reorganized grid stuff
- Included triangle (after Ideas from TriangleMesh.jl)
- Fixed performance regression: AbstractArrays for Grid components were slow.
- Added handling of cylindrical coordinates
- Velocity projections
- Added edge handling to grid struct
- Replaced PyPlot by Plots
- Better and more examples
- Registered with Julia ecosystem
- Enhance Newton solver by embedding, exception handling
- Replace SparseMatrixCSC with ExtendableSparseMatrix
- fixed allocation issues in assembly
- assured that users get allocation stuff right via typed functions in physics structure
- more julianic API
- Renamed from TwoPointFluxFVM to VoronoiFVM
- Complete rewrite of assembly allowing sparse or dense matrix
to store degree of freedom information
- Solution is a nnodes x nspecies sparse or dense matrix
- The wonderful array interface of Julia still provides slicing etc in order to access species without need to write any bulk_solution stuff or whatever when using the sparse variant
- Re-export value() for debugging in physics functions
- Test function handling for flux calculation
- First working steps to impedance handling
- Abolished Graph in favor of Grid, Graph was premature optimization...
-
Changed signature of all callback functions: This also allows to pass user defined arrays etc. to the callback functions. In particular, velocity vectors can be passed this way.
-
Besides of
flux!()
, they now all havenode::VoronoiFVM.Node
as a second argument. -
flux!()
hasedge::VoronoiFVM.Edge
as a second argument -
the
x
argument insource!()
is omitted, the same data are now found innode.coord
-
-
New method
edgelength(edge::VoronoiFVM.Edge)
- Initial release