Release Notes
All notable changes to GeometricIntegratorsBase.jl.
This package is pre-1.0, so every minor release is potentially breaking in the sense of SemVer for 0.x versions. The sections below name what actually changed, so that a compat-only bump can be told apart from an interface change.
Unreleased
Changed
- CI uploads coverage from the
Julia 1 - ubuntu-latestjob instead ofJulia min, and a test job saves the Julia cache only when it succeeds.
0.6.9
Compatibility
- The floors of GeometricEquations and GeometricSolutions exclude the versions on which the suite fails and which the old floors
"0.21"and"0.6.3"admitted: on GeometricSolutions 0.6.3compute_invariant_errorhas no method for aScalarDataSeriestime argument, and on 0.6.4 the accuracy and convergence tests oftest/integrators/common.jlmeasure aNaNerror. GeometricEquations 0.21.0 does not resolve with the test dependency Parameters 0.13. A compat-only change; no behaviour, signature or result changes. Fixes K9 (#53). - The floors rise to Julia 1.11, GeometricBase 0.15.0, GeometricEquations 0.21.5, GeometricSolutions 0.6.6 and SimpleSolvers 0.14.1, because GeometricBase 0.15 declares its stubs public and requires Julia 1.11.
Tests
Test suite reorganized to enable code quality checks and cleaner test discovery. Files renamed to mirror
src/structure (e.g.test/cache_tests.jl→test/cache.jl;test/solver_tests.jl→test/solvers.jl), and the whole-package interface test goes totest/integration/interface.jl. Tests now use the GROUPS convention (core/slow) viaARGSand@safetestset(one per file).integrators/common.jltakes about 62 s and runs in theslowgroup; all other files run incore. Test problems moved fromtest/examples/totest/helpers/with each test file including only what it uses.New code-quality test
test/quality/aqua.jlrunsAqua.test_allwith three checks marked broken: issue #39 (undefined exportinitialguess!), #40 (stale dependencySafeTestsets), #41 (piracy ofintegrate/integrate!). Aqua and Random added to test dependencies;[extras]removed fromProject.toml. The emptyinitialguess_tests.jlandprojection_tests.jlare deleted, and the profiling scripttest/profile.jl, which holds no test, moves toscripts/profile.jl.solutionsteptest now uses a fixed seed.Four assertions in
test/method.jlandtest/solvers.jltest a predicate directly —@test issymplectic(ImplicitMidpoint()),@test !default_linesearch().expand— not== trueor== false. They are stricter, as a non-Boolresult now fails. Nothing undersrc/changes.test/Project.tomlno longer has[compat]entries forGeometricEquations("0.21.4") andGeometricSolutions("0.6.5"). Both are dependencies of the package, so the rootProject.tomlalone bounds them; atest/ordocs/environment gives no[compat]entry for a dependency of the root. The test environment now resolves within the root's bounds and no narrower.
0.6.8
Changed
Every tracked source file is now Unicode NFC-normalised. Seven files stored
ṗ(192 times),ẋ(163),ḡ(4),ū(4) andṫ(3) as a base letter plus a combining mark, inherited from macOS rather than chosen.Nothing about the compiled code changes: Julia's parser normalises identifiers to NFC, so the symbols were already precomposed and dispatch, field names and method resolution are untouched. The only string literals affected are the two docstrings in
src/extrapolation/hermite.jl, which mentionẋand are rendered rather than compared; the package has no doctests. What changes is that the source now matches what a keyboard, an editor search, agreppattern or an automated replacement produces — in an NFD file a pattern typed in NFC matches nothing at all, silently.The diff is mechanical and can be checked as such: every changed file is exactly the NFC normalisation of its predecessor. Note that this is not the same as having no combining marks —
q̇,v̄andf̄have no precomposed codepoint and remain two codepoints, andṗ̄composes only its first mark.
0.6.7
Fixes
The method properties this package defines are now the same functions the rest of the ecosystem asks.
isexplicit,isimplicit,issymmetric,issymplectic,isenergypreserving,isstifflyaccurateandreferenceare declared byGeometricBaseand are not exported by it, sousing GeometricBasenever brought them into scope here and every definition insrc/was creating a second generic function of the same name instead of adding a method toGeometricBase's. They are now imported explicitly. No definition site changed, and none of the answers this package gives changed either.What a caller could observe: the same question had two answers depending on which module it was asked through.
GeometricBase.issymplectic(ImplicitMidpoint())wasmissingwhileGeometricIntegratorsBase.issymplectic(ImplicitMidpoint())wastrue, and code that askedGeometricBase— the package that declares the property — got the fallback. Measured onImplicitMidpoint, four properties now answer throughGeometricBasethat previously did not:isexplicit,isimplicit,issymmetric,issymplectic. Across the stack the effect is larger: withGeometricIntegratorsloaded,GeometricBase.isexplicitcarries 40 methods where it previously had only its ownmissingfallback.GeometricBase.referencegoes from 47 methods to 48, not from 1 —RungeKuttaimports it and attaches its tableau references to it already, so the only thing missing from it was this package's ownGeometricMethodfallback.What a downstream package must now avoid: defining a method on both
GeometricBase.isexplicitandGeometricIntegratorsBase.isexplicitfor the same type. Those names were two independent generics before this change and are one function afterwards, so the second definition silently overwrites the first instead of standing beside it. Nothing in the ecosystem does this —GeometricIntegratorstakesreferencefromGeometricBaseand the predicates from here, and never both for one name.Two things this does not fix, both pre-existing and neither caused by the shadowing:
GeometricBase.isAbstractMethodstill returnsfalsefor the methods in this package. It requires all ten properties to be non-missing, andisenergypreserving,isstifflyaccurate,order,name,descriptionandreferenceare simply not defined for them. Sharing the generics was necessary for that predicate to be reachable at all; it is not sufficient.print_referencestill prints nothing for the Runge-Kutta method families. It now readsGeometricBase.referencerather than a private generic, so it prints for any method that defines that — which the new test asserts — butRungeKutta's reference strings are attached to its tableau types, and nothing in the ecosystem definesGeometricBase.referenceon a method wrapper.GeometricIntegratorsprints references for those families through its ownprint_reference, which is a separate generic from this package's; unifying the two is out of scope here.
cache,methodandinitialize!(SimpleSolvers) andproblem(GeometricEquations) were re-defined too, and are now imported as well.problemis the one case where the upstream name is exported: a definition here wins over a name thatusingonly made visible, so it was shadowed for a different reason than the other ten. None of the four was broken for anyone — every call site in this package passes this package's own types — but they were one downstream definition away from the same failure.
Tests
test/interface_tests.jlasserts that no name this package owns collides with a function of the same name owned by one of its dependencies. It derives the dependency list from the loaded modules rather than a hardcoded list, so a new dependency is covered without editing the test, and it reports every dependency that owns a colliding name rather than the first one it happens to find — a name can collide with two at once, andissymmetricdoes, so a reader who acted on the first hit could import the wrong generic and fix nothing. It covers types as well as functions and macros, 112 bindings against nine dependencies, because a colliding name is a collision whatever kind of thing it names; submodule contents and package extensions are outside it, which the test records, and this package has neither. The existing method-property assertions intest/method_tests.jlcould not have caught any of this: they used the bare exported names, which pass whichever function those names point at.
0.6.6
Documentation
The manual builds again. It had been failing since 0.6.5 — including the
v0.6.5tag, so the published manual for that release was never rendered — with sixCannot resolve @referrors andmakedocs encountered an error [:cross_references].Nothing in this package caused it.
docs/src/deps/problems.mdrenders the GeometricEquations docstrings forSDEProblem,PSDEProblemandSPSDEProblem, and GeometricEquations 0.21.3 added the stochastic-process typesWienerProcessandGridProcessand rewrote all three of those docstrings to reference them. Neither type was rendered anywhere in this manual, so the three docstrings × two references had no anchor to point at. Upstream's own manual is green with the identical docstrings because it does render them.[compat]allows"0.21"for GeometricEquations, so the break arrived with a registration rather than with any commit here.Both types are now documented under Stochastic Processes on the problems page. They have to be added as a pair — the
WienerProcessdocstring itself referencesGridProcess. Why only the instance was fixed and not the failure class is under Open Issues.
0.6.5
New Features
default_extrapolation(method), dispatched on the method and exported, with the previousMidpointExtrapolation(default_extrapolation_stages)as its default.solutionstepnow takes itsextrapdefault from it rather than from the zero-argumentdefault_extrapolation(), which is unchanged, still available, and now exported alongside it.SolutionStepcarries states att₋₁, t₋₂, …that no initial condition supplies, andinitialize!manufactures them by running the problem backwards fromt₀. For a deterministic problem this is well defined and midpoint extrapolation does it accurately. For a stochastic problem it is not defined at all — the past of a sample path is not a function of its present, and running an SDE backwards is not the inverse of running it forwards — and the fixed default madeintegratefail outright on an SDE problem, with aMethodErrorabout a missing_extrapolate!rather than anything a caller could act on. A family of methods can now returnNoExtrapolation()instead, which copies the initial state into the history slots.Purely additive: every existing method keeps the extrapolation it had, and a caller passing
extrapexplicitly is unaffected.
0.6.4
Written up retrospectively — the release itself predates this file.
Compatibility
- Allow
SimpleSolvers0.13 (#33). A compat-only release:Project.tomlwas the sole file touched, and no behaviour, signature or result changed.
0.6.3
Breaking Changes
Requires SimpleSolvers 0.12.1. 0.12 is breaking for a caller of this package in one way that matters: a
NonlinearSolverno longer emits line-search warnings from inside its iteration, so a rejected line search reaches its caller through the returned status and nobody at all if the caller drops it. That is what the change below is for. The other two breaks of 0.12 —NonlinearSolverStatusgaining a field, and aLinesearchMethodimplementingsolve_with_statusrather thansolve— do not reach this package, which constructs neither.Nothing measurable moves. 0.12's other behavioural change,
Bisectionbisecting toward a minimum rather than toward whichever root the value bracket held, does not apply here either:default_linesearchisBacktrackingand every method in this package solves withNewton(). The full suite passes unedited, including the two assertions that would have caught a change in what a solve says —test/integrators/common_tests.jl, which requires a converged solve to be silent, andtest/integrator_tests.jl, which pins the exact wording of the failure warning.
New Features
Every nonlinear solve now goes through
solve_with_status!rather thansolve!, and theSimpleSolvers.NonlinearSolverStatusit returns is handed to a newcheck_solver_status. This is the sevenintegrate_step!methods ofImplicitEuler,ImplicitMidpointandCrankNicolson, and it replaces the pair of commented-out stubs (# println(status(solver)),# println(meets_stopping_criteria(status(solver)))) that had sat under the solve since before the status existed in its current form.solve_with_status!is used in its state-taking form, added in SimpleSolvers 0.12.1 at this package's request. The other two forms build aNonlinearSolverStateper call, which in a time-stepping loop is one allocation per step and would also have detached the status fromsolverstate(int)— the object a caller reads a solve through afterwards, as GeometricIntegrators' SPARK tests do.The migration costs nothing. That is worth stating because it was not true of the first cut:
solve_with_status!wassolve!followed bystatus(s, state), andsolve!had already built a status internally to hand to its own warning path and then discarded it — so reading the outcome cost a secondNonlinearSolverStatus, i.e. fivel2normpasses per solve, per step. The review of the upstream pull request caught it, and 0.12.1 ships both entry points sharing one body that returns the status the loop built. So the status is now genuinely free: it is the value SimpleSolvers computes for its own report either way, handed back instead of thrown away.check_solver_status(status, int)is silent by default, deliberately, and the docstring says why at length: SimpleSolvers reports a solve that did not converge itself, once per solve and with a back-off (occurrences 1, 2, 4, 8, …) that exists precisely because a time-stepping loop is the case that floods. Warning here as well would say the same thing twice per step. What the function buys is that the status is never silently dropped and that there is one place to change the policy for all of them — overriding it is how a downstream family of methods becomes strict about non-convergence, in the same way that overridingdefault_optionsis how it changes solver options in one place. It is exported for that reason.The line-search tally is covered by
test/solver_tests.jl. It is the one thing the migration exists for and the one thing nothing asserted: the suite pinned the wording of the non-convergence warning and required a converged solve to be silent, but a rejected line search — the diagnostic 0.12 stopped logging from inside the iteration — was checked by nothing, which is why widening the compat entry alone passed CI green. The new assertion drives a solve onto an ascent direction with a sign-flipped Jacobian and requires the rejection to be readable off the status that reachescheck_solver_status.It asks
dominant_linesearch_outcome(status, false)rather thanlinesearch_failures(status) > 0because the latter is vacuous here: a converged solve reaches the merit's round-off floor on its last step,LINESEARCH_FLOORcounts as a failure, and the bare count is therefore positive for a solve where nothing went wrong. The converged solve is asserted the same question alongside it, so the two readings differ for the reason claimed.
0.6.2
Breaking Changes
ExplicitEulerandImplicitEulerdispatch onProblemODErather thanAbstractProblemODE. The latter includesDAEProblem, sointegrate(daeproblem(), ExplicitEuler())used to return a solution that silently ignored the constraint.DAEProblemis the only type removed.A fallback
integrate_step!throws theArgumentErrorofinitsolververbatim, so every unsupported method/problem combination is now rejected in the same words. Previously the rejection surfaced as whatever exception the first unimplemented piece of the machinery happened to raise — aMethodErrorfor the symplectic Euler methods, aFieldErrorforImplicitEuleron aPDAEProblem, anArgumentErrorfor the implicit ODE methods.Shipped as a patch rather than as 0.7.0; this was a maintainer's call recorded in the commit.
New Features
ImplicitMidpointandCrankNicolsonforPODEProblemandHODEProblem, through the same structs and the same traits mechanism that already carried their IODE/LODE support. For q̇ = v(t,q,p), ṗ = f(t,q,p) the solver solution vector holds both stage vector fields, so the nonlinear system is twice the size of the one for an ordinary differential equation.- A new
ProblemPODEunion alongsideProblemODEandProblemIODE, so thatPDAEProblemandHDAEProblemkeep being rejected rather than integrated as if their constraint were absent.symplectic_euler.jlis switched to it as well.
Tests
- The test suite is reorganised: test problems to
test/examples/, per-method test files totest/integrators/, mirroringsrc/integrators/.euler_tests.jlbecomesexplicit_euler_tests.jl. - The five method files repeated the same tests almost verbatim. They now live in
test/integrators/common_tests.jl, driven by a table of every method with the problem types it implements, the order it converges at and the accuracy it reaches. Coverage grows from 373 to 558 assertions: unsupported-problem rejection now covers 51 method/problem combinations instead of 19. - Both partitioned test problems were linear and separable, so the off-diagonal blocks of the residual Jacobian vanished and the two halves of the solver solution vector were never actually coupled. A nonlinear, non-separable partitioned problem and its equivalent first order system are added, so the equivalence tests pin the coupled residual down.
0.6.1
Documentation
default_optionsgains a docstring covering the merge semantics and the reasoning behind each of its defaults, andsrc/solvers.jlis rendered in the manual on a new Solvers page. Every@autodocsblock here isPages-filtered andsolvers.jlwas in none of them, so a dangling reference in these docstrings used to fail GeometricIntegrators' documentation build rather than this one.
0.6.0
Breaking Changes
- Requires SimpleSolvers 0.11. Nothing this package used was removed — the one breaking change upstream is
Backtrackinglosing itsα₀key, theDEFAULT_ARMIJO_α₀constant and the positional constructor, none of which appear here. - SimpleSolvers 0.11 tests
all(isfinite, direction)where 0.10 tested onlyisnan, so an overflowed direction — which used to pass every guard and stall silently,Inf * nan_factorbeingInf— now raisesNonlinearSolverException. The time-stepping loop catches it, warns naming the timestep, and breaks, as the adjacentisnancheck does. Thebreakprecedes thecopy!, so the solution holds valid data up ton-1; the warning says where the valid data ends, since the entries past it are zeros rather than anything a caller can recognise. Only that one exception type is caught; anything else is rethrown.
New Features
f_stall_window = 50indefault_options, SimpleSolvers 0.11's criterion for the casemax_stallscannot see: the residual sitting on a floor abovef_abstolwhile the iterate keeps moving, so that no criterion fires and the solve spendsmax_iterations— 1000 by default — on every single time step. 50 is conservative: atf_stall_factor = 0.5it gives up only on a linear rate ρ > 2^(-1/50) ≈ 0.986, and it stays aboveSimpleSolvers.F_STALL_REPORT_MINIMUM. It is justified forNewton(); a fixed-point iteration converging at a rate that close to the limit would now be cut off, which is recorded as a limitation. Options are merged, so a caller overrides it with one keyword.default_linesearch(::Type{T}, method)forT <: Real, alongside the untyped hook that GeometricIntegrators calls for DIRK.Backtracking()is alwaysBacktracking{Float64}, so aFloat32integration made theLinesearchconstructor do achange_precisionthe caller could have avoided.Realrather thanAbstractFloat, so thatForwardDiff.Dualdoes not silently fall through to the untyped hook.
The Backtracking expansion phase added in SimpleSolvers 0.11 is deliberately not enabled: it costs a full residual evaluation on a direction whose scale is wrong and gains nothing on one whose scale is right, a Newton step already sitting at its model minimum.
0.5.3
Breaking Changes
ImplicitMidpointandCrankNicolsondispatch on unions of the unconstrained problem types. The problem unions of GeometricEquations also cover the constrained variants, so dispatching onAbstractProblemIODEletIDAEProblems andLDAEProblems through, and they were integrated as if the constraint were absent — multipliers left at zero, ϕ, u and g never evaluated. The same held forDAEProblems on the ODE side.
New Features
- IODE/LODE versions of
ImplicitMidpointandCrankNicolson. Theisiodemethodandislodemethodtraits are set accordingly, which cannot follow from the supertype.
Fixes
- Problem types a method does not implement at all used to run into the generic
NoCachefallback and propagate amissingsolution vector into the solver constructor, failing with an error that gave no hint as to why.initsolvernow checks for this and names both the method and the problem type.
0.5.2
New Features
SymplecticEulerAandSymplecticEulerB, partitioned methods for separable Hamiltonians H(t,q,p) = T(t,p) + V(t,q). Under that assumption the otherwise implicit scheme decouples into two explicit substeps, so neither a nonlinear solver nor an initial guess is required. Both cover PODE and HODE problems.ImplicitMidpointandCrankNicolsonforAbstractProblemODE, followingImplicitEulerin structure. The nonlinear unknown is the stage vector field in both cases. The Crank-Nicolson cache holds v(t̄, q̄) at working precision, so that it survives the automatic differentiation of the residual, where it is a constant.All three reproduce the corresponding tableau-driven methods of GeometricIntegrators: symplectic Euler A/B bit for bit on PODE, HODE and non-autonomous problems, implicit midpoint and Crank-Nicolson to round-off.
All method implementations are collected in a flat
src/integrators/directory.
Fixes
ExplicitEulerevaluated the vector field at the end of the step. On entry tointegrate_step!,sol.talready holds tₙ₊₁ whilesol.qstill holds qₙ, sov(sol.t, sol.q)gave v(tₙ₊₁, qₙ). The scheme stays first order consistent, which is why no test caught it, and the harmonic oscillator is autonomous, so those results are unchanged — but on a non-autonomous problem the method was simply not explicit Euler.compute_energy_errorin the harmonic oscillator test problem referencedDataSeries.nt, a field that no longer exists, so any call threw. Two further bugs were hidden behind it:axes(q, 2)returnsOneTo(1)for a one-dimensionalDataSeries, so the loop covered a single index rather than all time steps, andq[:, i]extracts one component across all times instead of the state at timei. It now delegates to thecompute_invariantandcompute_relative_errorutilities of GeometricSolutions.
Tests
- None of the committed test problems was non-autonomous, so nothing exercised the time arguments of the integrators: swapping t̄ for
sol.tin any of them left the entire suite green.test/nonautonomous.jladds q̇ = cos(t) q, whose exact solution is known, and the separable Hamiltonian H(t,q,p) = p²/2 + (1+t) q²/2 as PODE and HODE.
0.5.1
Fixes
- Restore a minimum
f_abstolof8eps(T). Withmax(8, solversize(method, problem))the tolerance now resolves to 1.8e-15 … 3.6e-15 for the methods here, above their residual floors.
0.5.0
Breaking Changes
solversizeanddefault_optionstake their arguments in a uniform(method, problem)order, so that all methods dispatch the same way and callers no longer have to remember a per-function convention. TheImplicitEulerspecialization ofsolversizeand the generic fallback inmethod.jlare flipped accordingly, andinitmethod's two-argument fallback is widened to::GeometricProblemfor consistency.default_optionssizesf_abstolfromsolversize(method, problem), which is what the new argument order is for.
Fixes
maximum(2, ...)threw aMethodError, treating2as a function passed tomaximum(f, itr); corrected tomax(2, ...).
0.4.3
Breaking Changes
Requires SimpleSolvers 0.10, which removes the root cause of the solver and line-search warning floods downstream packages had built log-suppression scaffolding around: a line search now shares its solver's
Options(soverbosity = 0reaches it), converged-at-floor solves are silent, and a stalled solve stops aftermax_stallsinstead of spinning tomax_iterations.default_optionsis merged with the caller's options rather than replaced wholesale. Passing any option used to discard the entire default set — a documented trap downstream, and one that changes results rather than just performance, since silently losingmin_iterations = 1controls whether a step is taken at all now that SimpleSolvers tests its stopping criteria before the first step.f_abstolis dropped fromdefault_options. It is an absolute bound on ‖F(x)‖, so it has to sit above the round-off floor of the residual — which is the cancellation level of the termsresidual!sums, not a property of the solver.8eps() ≈ 1.78e-15is below that floor for essentially every non-trivial problem, so the criterion was unreachable and Newton ran to its iteration limit.f_reltoldoes not rescue this: it is anchored at the initial residual, so the Hermite-extrapolation initial guess used throughout these integrators — good enough that Newton converges in one iteration — makes the relative gate tighter, not looser.(Partly reverted in 0.5.0/0.5.1, which reintroduce a size-scaled
f_abstolwith an8eps(T)floor rather than a flat one.)
Tests
- The tolerances this made unnecessary are cleaned up: the below-floor and no-longer-load-bearing
f_abstol/max_iterationsvalues are dropped, the now-redundantmin_iterations = 1restatements removed, and converged solves assert silence via@test_nowarn, which is usable as a regression tripwire again now that a converging solve is silent.
0.4.2
New Features
NormalizedHermiteExtrapolation, a version of the Hermite extrapolation normalised to the interval [0,1]. Instead of the sample times t₀ and t₁ and the time tᵢ to extrapolate to, it takes a normalised time cᵢ with tᵢ = t₁ + cᵢ Δt, so that cᵢ = -1 reproduces the first and cᵢ = 0 the second sample; all derivative values are with respect to the normalised time. Both versions share a single kernel;HermiteExtrapolationis unchanged in signature, behaviour and allocations.
Fixes
NormalizedHermiteExtrapolation'ssolutionstep!methods took Δt fromtimestep(problem)while taking t₁ from the history. Whenever the spacing of the history differs from the nominal timestep the resulting polynomial was silently wrong, and thet₀ == t₁guard ofHermiteExtrapolationwas lost. Δt = t₁ - t₀ is now taken from the history, so that both versions agree unconditionally.
0.4.1
- Removes PProf and ProfileView from the explicit test dependencies.
0.4.0
Breaking Changes
SolutionStep'sreset!method takes a time rather than a timestep.
0.3.3
Fixes
- Fix in midpoint extrapolation.
0.3.2
- Use the default linesearch as prescribed by SimpleSolvers, rather than naming one here.
0.3.1
Breaking Changes
- Requires SimpleSolvers 0.9.
0.3.0
Breaking Changes
- The dimension type parameter is removed from
Cache, and the cache constructors are generalised. - The type parameter order of
IntegratorCacheis changed to comply with the order of its subtypes. NoSolveris moved to GeometricBase.- The
Newtonalias is removed; it is not available in SimpleSolvers. - The
Parametersdependency is dropped. - The
GeometricIntegratorfallback constructor returnsmissingrather thannothing. - Two cases of type piracy are removed:
ndimsin the main module, andprince_referenceforGeometricMethod, which was wrapped in atry/catchthat swallowed unrelated failures. - Assertions and generic
@errors are replaced by specificArgumentErrors throughout, so a misuse now fails with a message that names what was wrong.
Fixes
- Fixes in Euler and midpoint extrapolation, and a simplification of the Hermite interpolation.
update!(solstep, ...)no longer leaves a partially mutated state behind when it fails.- Bugfixes in
SolutionStep. - A fallback for
reference(::GeometricMethod)and a missingisdelemethod. - Dead code and redundant
localkeywords removed;residual!cleaned up.
0.2.2
Fixes
- Fix solver initialisation.
0.2.1
- Cleanup in tests.
0.2.0
Breaking Changes
SolutionStepis revised, both for correctness and to fix performance problems.- Requires GeometricBase 0.14, GeometricEquations 0.21 and GeometricSolutions 0.6.1.
Tests
- Tests for extrapolation of velocity and force, and for Hermite extrapolation of PODE and IODE problems.
0.1.11
New Features
initsolveris generalised to arbitrary nonlinear solvers rather than just Newton.
0.1.10
Breaking Changes
- Requires Julia 1.10 and SimpleSolvers 0.7.5.
0.1.9
Breaking Changes
- Requires SimpleSolvers 0.7.
0.1.8
New Features
- NaN detection in the main
integratemethod: the time-stepping loop stops and warns rather than filling the rest of the solution with garbage.
0.1.7
Breaking Changes
- Requires SimpleSolvers 0.6 and Julia 1.8.
New Features
- A custom time step for the midpoint extrapolation of PODE problems.
0.1.6
Fixes
- Fix in Hermite extrapolation.
0.1.5
Fixes
- Fix midpoint extrapolation.
0.1.4
New Features
NoInitialGuessandNoExtrapolationtypes.- A time step limiter for the midpoint extrapolation.
Breaking Changes
- The problem-specific solution type unions move to GeometricSolutions.
0.1.3
Fixes
- Minor bugfixes and extensions around the extrapolation methods and the initialisation of
SolutionStep.
0.1.2
Fixes
- Import
integrate!from GeometricBase, so that it is extended rather than shadowed.
0.1.1
Fixes
- Cleanup and fixes in the
enforce_periodicity!methods. - Fix the
copy!calls inset_property!forSolutionStep. - Several further fixes in
SolutionStep.
0.1.0
Initial release. The integrator framework extracted from GeometricIntegrators.jl, so that packages implementing their own methods can depend on the framework without pulling in the full method collection:
SolutionStepand the solution machinery.GeometricMethod,GeometricIntegratorand the trait interface.CacheandCacheDict.- The extrapolation methods:
EulerExtrapolation,MidpointExtrapolationandHermiteExtrapolation, withNoExtrapolationandNoInitialGuess. - The explicit and implicit Euler integrators.