All notable changes to this project will be documented in this file (hopefully). No performance improvements will be notified but mainly the addition of new methods, the modifications of internal structs, etc.
get_adjoint_basisis replaced by the methods_get_kernel_basis_1d_from_eigensolver/_get_kernel_basis_1d_from_bls(resp. the Nd helpers), which now compute the right and left (adjoint) kernel vectors together__compute_bordered_vectors_fold/__compute_bordered_vectors_hopfare now also used to build the kernel basis of the normal forms (start_with_eigen = Val(false))
- add
∫_gaussto integrate arrays sampled at the Gauss points, i.e. in the row layout of the collocation operator, consistently with∫ - add the keyword
start_with_eigen = Val(true)toget_normal_form1d,get_normal_formNdand the codim 2 normal forms (hopf,cusp,bogdanov_takens,bautin,zero_hopf,hopf_hopf): withstart_with_eigen = Val(false), the (right/left) kernel basis is built with a bordered linear system (keywordsbls,bls_adjoint,bls_block) instead of the eigensolver, which is more robust for large-scale problems. The 1d basis is computed with the bordered-vector solvers__compute_bordered_vectors_fold/__compute_bordered_vectors_hopfand the Nd basis with__compute_nd_basis_from_bls.bautin_normal_formalso acceptsbls/bls_adjointlikehopf_normal_form - compute the parameter derivative
dFdpin the Moore-Penrose algorithm (newton_moore_penrose) with the (user provided)R01/R01!instead of first-order finite differences, and accumulate the number of linear iterations (itlineartot)
- evaluate all the integrands in
neimark_sacker_normal_form_ioossat the Gauss points and build the RHS of the homological equationsh20/h11in the row layout of the collocation operator. This removes the formerIcollmass-matrix pre-scaling and the ad-hoch20 ./= 2Ntst/h11 ./= 2Ntstrenormalizations. - evaluate all the integrands in
period_doubling_normal_form_ioossat the Gauss points and build the RHS of the homological equationsh₂/h₀₁in the row layout of the collocation operator, normalizingψ₁★with∫_gaussso that<ψ₁★, F(u₀)> = 1/2. This removes the formerIcollmass-matrix pre-scaling and fixes the scaling of the normal form coefficients.
detect_codim2_parametersis renamedmodify_contparams_for_codim2- the method
_compute_bordered_vectorsof the Fold/Hopf/PD/NS MA formulations is refactored into the methods__compute_bordered_vectors_fold/__compute_bordered_vectors_hopf
- add the bordered-vector kernels
__compute_bordered_vectors_fold/__compute_bordered_vectors_hopfwhich compute the right/left null vectors of the Fold / Hopf jacobians by a bordered linear system (factoring the Fold/Hopf initial eigenvector computation). These methods are also used to build the kernel basis of the normal forms withstart_with_eigen = Val(false) - allow plotting during NS (Neimark-Sacker) continuation
- Plots backend: plot several codim 1 branches in one figure
- improve codim 2 continuation of periodic orbits (PD/NS Jacobian borders, events on Fold of PO, simplified
get_normal_formfor codim 2 points of PO)
- correct
update!forNSMAProblem/PDMAProblem - robust mesh adaptation for
Collocation(improved predictor) - correct the Hopf predictor at Hopf-Hopf points
- filter infinite eigenvalues in generalized eigenvalue computations (
DefaultEig)
- 🚦🚦🚦
update!(prob, x)becomesrestore_problem!(prob, x, pars) getlinsolver/getblsbecomeget_bordered_linsolverOneParamCont,TwoParamCont,TwoParamPeriodicOrbitContbecomeAbstractOneParamCont,AbstractTwoParamCont,AbstractTwoParamPeriodicOrbitCont_getsolutionbecomessaved_solutiontangentfield inMoorePenrosebecomespredictor- remove
autodiffkeyword argument for computing normal forms FlowDEconstruction is now keyword-based- merge BT
nfsuppintonf
- add derivatives of the flow w.r.t. the parameter and higher-order differentials
R01,R11,R20,R30toFlow/FlowDE, computed with ForwardDiff by default and usable in the Poincaré return map and the normal forms - use
monodromy_matrix!in Shooting and Poincaré Shooting - rework the Poincaré return map around
_evolve_flow_prm; addR01,R11,R20,R30methods forPoincaréMapand collocation - rework the Jet traits:
R01/R02/R11are now computed by dispatch onAutoDiff()/FiniteDifferences()and generalized to anyAbstractBifurcationProblem - save/restore of the Poincaré section for
PoincareShooting(POSavedSolutionAndState_PSH,BVPSavedSolutionAndState_PSH), fixing issue #334 - add
AccumulatortoDeflationOperator - add eigenvalue solvers
EigenWaveandGEigenWavefor waves - add
__sort_spectrumand correct the spectrum sorting ofDefaultEig - add mechanism to switch the plot backend:
set_plot_backend!,get_plot_backendwithBK_Plots(),BK_Makie(),BK_NoPlot() - Makie: add
plot_stability_segments - Plots: add
:dotsstyle for the unstable part of the branch - add defaults to
ContStatefields andEmptyContState - refactor the generalized eigenvalue computation into
GeneralizedEigenSolver.jland the tangents intoTangents.jl - use an out-of-place formulation for waves
- add
∫_gaussto integrate arrays sampled at the Gauss points, i.e. in the row layout of the collocation operator, consistently with∫ - add the keyword
start_with_eigen = Val(true)toget_normal_form1d,get_normal_formNdand the codim 2 normal forms (hopf,cusp,bogdanov_takens,bautin,zero_hopf,hopf_hopf): withstart_with_eigen = Val(false), the (right/left) kernel basis is built with a bordered linear system (keywordsbls,bls_adjoint,bls_block) instead of the eigensolver, which is more robust for large-scale problems.bautin_normal_formalso acceptsbls/bls_adjointlikehopf_normal_form - compute the parameter derivative
dFdpin the Moore-Penrose algorithm (newton_moore_penrose) with the (user provided)R01/R01!instead of first-order finite differences, and accumulate the number of linear iterations (itlineartot)
- evaluate all the integrands of the NS Iooss normal form (
neimark_sacker_normal_form_iooss) at the Gauss points and build the RHS of the homological equationsh20/h11in the row layout of the collocation operator. This removes the formerIcollmass-matrix pre-scaling and the ad-hoch20 ./= 2Ntst/h11 ./= 2Ntstrenormalizations.
- add a new BVP interface:
BVPModel,PeriodicOrbitModel,DiscretizedBVP,discretize,generate_solution, the discretizersShooting,Trapeze,Collocationand the problemBVPBifProblem - add mesh adaptation for BVP problems
- add user-specified time interval for BVP problems
- add
BoundaryValueProblemContfor the continuation of BVP problems - add wrapper for deflated continuation of BVP problems
- add
TimeMeshstructure to support non-uniform meshes forTrapeze SolPeriodicOrbitbecomesBVPSolution,POSolutionbecomesPOInterpolation,POSolutionAndStatebecomesPOSavedSolutionAndState- rename
TrapintoTrapezein the BVP interface jacobian = :autobecomesjacobian = AutoDiffDense()in BVP Shooting- add
normal_formalias forget_normal_form
- Remove
AbstractPeriodicOrbitDiscretization, make subtypes inherit directly fromAbstractBoundaryValueDiscretization AbstractPODifferentialDiscretization→AbstractDifferentialDiscretizationAbstractPOFiniteDifferencesDiscretization→AbstractFiniteDifferencesDiscretizationAbstractPOShootingDiscretization→AbstractShootingDiscretization
- Change names
*ShootingProblemfor*Shooting,PeriodicOrbitOCollProblemforCollocationandPeriodicOrbitTrapProblemforTrapeze
- emove fields params and lens from PeriodicOrbitFunctionalTrap, PeriodicOrbitFunctionalSh, PeriodicOrbitFunctionalColl, WrapTW
- remove
paramfield from*MAProblemstructs (FoldMAProblem,HopfMAProblem,PDMAProblem,NSMAProblem,BTMAProblem) and fromWrapTW;getparamsnow delegates togetparams(get_formulation(prob)) - add
re_makemethods forAbstractMABifurcationProblem,AbstractWaveProblem,AbstractWrapperPeriodicOrbitProblem,AbstractPODifferentialDiscretization,AbstractPOShootingDiscretization,TWModel,AbstractMinimallyAugmentedFormulation - add
getlensmethod forTWModel
- add
AbstractBoundaryValueDiscretization,AbstractPeriodicOrbitDiscretization,AbstractPODifferentialDiscretization,AbstractPOFiniteDifferencesDiscretization AbstractPoincareShootingProblembecomesAbstractPoincareShootingDiscretizationAbstractShootingProblembecomesAbstractPOShootingDiscretizationBTProblemMinimallyAugmentedbecomesBTMinimallyAugmentedFormulationTWProblembecomesTWModel- remove
modify_po_finalise,modify_po_record,modify_tw_recordandFinalizer - change
Fold/Hopf/PeriodDoubling/NeimarkSackerProblemMinimallyAugmentedintoFold/Hopf/PeriodDoubling/NeimarkSackerMinimallyAugmentedFormulation AbstractProblemMinimallyAugmentedbecomesAbstractMinimallyAugmentedFormulation- make
AbstractMABifurcationProblem{T, Tjac}dependent on 2 parameters - add method
finalise_solution(iter::ContIterable, state::AbstractContinuationState, contRes) - remove
update_minaug_hopf,update_minaug_fold,update_min_aug_ns,update_min_aug_pd WrapPOCollbecomesPeriodicOrbitFunctionalCollWrapPOShbecomesPeriodicOrbitFunctionalShWrapPOTrapbecomesPeriodicOrbitFunctionalTrapcorrect_bifurcationbecomes_correct_event_labels- add
PeriodicOrbit{Tdisc},TravellingWave{Tdisc}to bridge discretization and problem - add
MASolution,MASolutionFreqto hold codim1 MA solutions (for mesh adaptation in codim2) - add
RecordForFold,RecordForHopf,RecordForPeriodicOrbits,RecordForNS,RecordForPD,RecordForTWto replace closure-based callbacks - add accessor methods
get_discretization,get_formulation,get_solution,getparams - add
update!forPDMAProblem,NSMAProblem,HopfMAProblemand periodic orbit wrappers TWModelinherits fromAbstractTravelingWaveDiscretizationinstead ofAbstractBifurcationProblem- change signature of
continuationfor periodic orbits:probPO::AbstractPeriodicOrbitProblembecomesdisc::AbstractPeriodicOrbitDiscretization DefaultLSusesVI.Zero()/VI.One()instead of literal 0 / 1- closure removal for
record_from_solutionin all continuation types (codim1 and codim2, periodic orbits, waves) - add mesh adaptation in codim2 continuation
- change initialization of
deltainBifurcationProblemto usegetdelta - simplify
is_event_crossedand refactor events - remove dead code in
_continuation(gh::Bautin) - various bug fixes: correction of jacobian selection in PD continuation, fix plotting in NS continuation, correct PD formulation, correct linear bordered solver
solve_bls_block, correct type stability of Hopf predictor, correct type assert in Bautin normal form, do not update MA problem when in bisection
- add
AbstractBifurcationPointCodim2,NdBranchPointfor bifurcation points with dim(Ker) > 1 - add method
minus(x::POSolutionAndState, y::POSolutionAndState)fordetect_loopwith collocation and mesh adaptation - add branching to curve of periodic orbits from curve of Hopf points
- set
PALC(tangent = Bordered())as default inautoswitchconstructor - remove type constraint
Tlens <: AllOpticTypesinBifurcationPoints - improve type stability of
get_normal_formNd,biorthogonalise, etc. - refactor
BranchSwitching.jl - simplify
multicontinuationto return aBranchinstead ofVector{Branch} - bump compat for
RecursiveArrayToolsto 4
- reorganise tests:
- each test belongs to a test category (like in previous versions)
- the test directory arborescence reflects this organisation
- the runtests.jl file is now generic and runs accepts arguments which define which tests will be run
- the .github/workflows/ci.yml can now run a subset of tests (using the previous runtests.jl modifications) bases on the labels of PR/commit/..
- examples of valid labels:
Run test(s): wave,Run test(s): wave | newton
- most Standard shooting code works with
VI.MinimalVec
- modify dispatch for get_time_slice and get_time_slices
- make BorderedArray comply with VectorInterface.jl (VI)
- most of BK code complies with VI
- bug correction in mesh adaptation for collocation
- massive improvement in computation of reduced equations. Improve type stability as well.
- export
ODEBifProblem - add new jacobian types
jadbecomesjacobian_adjoint
_eig_floquet_colis now_eig_floquet_collFloquetCollGEVis now calledFloquetGEVextract_periodis now called_extract_period- the struct
COPCACHEhas been changed a lot.
- add
ShiftInvert, new general composite eigen solver - add option
use_adapted_meshtogenerate_ci_problem(pb::PeriodicOrbitOCollProblem - add option
optimal_periodtogenerate_ci_problem(shooting::ShootingProblem - 🚦🚦🚦 change jacobian parameter in PeriodicOrbitTrapProblem from Symbol to custom type. See
?PeriodicOrbitTrapProblemfor more information - correct bug in
Naturalwhich improvesAutoSwitch - remove (some) closures from codim1 continuation
- add structures/normal form for CuspPO, R1, R2, etc
- make
WrapPOCollaAbstractWrapperFDProblem - 🚦🚦🚦 change
jacobian_maargument from Symbol to type. See docs for codim 2 continuation. For example,continuation(br ,1; jacobian_ma = :minaug)becomescontinuation(br ,1; jacobian_ma = MinAug()) - 🚦🚦🚦 add
update!function toBifurcationProblem. This allows to adapt the problem during continuation
- solve compile time issue for continuation of Fold of periodic orbits
- move test functions out of continuation function for
MinAug - emove the saving of AD generated BifFunction. Rely on dispatch instead.
- change type parameters in AbstractCodim2EigenSolver
- add Krylov.jl as possible linear solver
- add jacobian option MinAugMatrixBased to Fold/Hopf continuation
- remove reference to RecursiveVec
- change bordered linear solvers' interface
record_from_solutionhas been changed to the following definition
- Setfield.jl is not anymore the main component of BifurcationKit to support parameter axis. It has been changed in favour of Accessors.jl
- remove
Requires.jland use extensions. This requires julia>=1.9
- add field
save_solutiontoBifurcationProblem. Allows to save problem state along with the current solution. Useful for periodic orbits for example where we can save the phase condition and the mesh when the latter is adapted.
- add function
_keep_opts_contto filter continuation options - order 2 prediction for periodic orbit from Hopf bifurcation
- add
jacobian(Π::PoincaréMap{ <: WrapPOSh }, x, pars) hasstabilitybecomes_hasstabilitygetvectortypebecomes_getvectortype- add condensation of parameters, great speedup for collocation of periodic orbits
- add
in_bisectionfield in structContState - allow to do codim 2 continuation of PO with collocation and mesh adaptation
update_section_every_stepbecomes a UInt- add fields in
PeriodDoublingProblemMinimallyAugmentedandNeimarkSackerProblemMinimallyAugmentedfor holding Resonance test values - add specific finalizer for Fold of PO when using Collocation or shooting
- add struct
FinalisePO update_minaug_every_step = 1by default for Hopf / Fold continuationupdate_minaug_every_step = 1is default for for PD / NS continuation
- add
getDeltato the interface ofAbstractFlow - remove
finDiffEpsfromContinuationPar.
- use jvp function name in
Flowinterface - add radius to section of Poincare Shooting
- add _mesh field to reconstruct POColl problem (adapted mesh) from previous solution
- add new jacobian parametrization using
structs instead of Symbol - remove
θfrom ContinuationPar
- add delta keyword to BifurcationProblem constructor
MISSSINF
- new interface based on the problem
BifurcationProblem
- switch from
DiffEqBasetoSciMLBase - change function name
closesttozerotorightmost
- ⛳️ add a new interface for Flows
- add custom distance for
DeflationOperator - add possibility to use forward diff (AD) with deflation operator
- the method for periodic orbits
getMbecomesgetMeshSize
- add abstract types
AbstractDirectLinearSolverandAbstractIterativeLinearSolver - the function
getTrajectorybecomesgetPeriodicOrbit - add struct
SolPeriodicOrbitto allow for unified plotting interface with all methods for computing periodic orbits - ⛳️ the keyword argument
linearPOis renamed intojacobianPO - add newton / continuation methods for
TWProblem - add
GEigArpackgeneralized eigensolver
- remove documentation from package, it is now located in BifurcationKitDocs.jl
- change function name problemForBS into reMake for aBS of periodic orbits
- add function
generateSolutionto generate guess for computing orbits from a function solutiont -> orbit(t) - ⛳️ add orthogonal collocation method for periodic orbits
- add additional method for computing Floquet multipliers based on generalized eigenvalue problem
- add new problem for symmetries
TWProblem
- add example for wave computation
- refactoring, extractTimeSlices becomes getTimeSlices
- add a simple callback to limit residuals in Newton iterations
cbMaxNorm - ⛳️ add branch switching for branches of PO at BP / PD
- auto generate more tutorials
- rename
get3JetintogetJet - remove
BlockArrays.setblock!occurrences which are deprecated
- add
perturbGuessoption tomulticontinuation - change option
printSolutiontorecordFromSolutionin continuation and similar functions
- add new function getFirstPointsOnBranch to allow fine grained control of aBS
- add full automatic differentiation for Deflated Problems
- ⛳️ add computing full transcritical/pitchfork branch (not half) in
bifurcationDiagram
- move toward automatic generation of docs with figures
- add
applytoX, applytoYoption to plotting
- add function
get3Jetto compute Taylor expansion getLensParambecomesgetLensSymbol- add detection of codim 2 singularities
- rename
HopfBifPoint->Hopf - rename
GenericBifPointintoSpecialPointandbifpointtospecialpoint - add applytoY keyword to plot recipe
- remove
p->nothingas default argument incontinuationHopf - add bordered linear solver option in
newtonHopf
- remove type piracy for
iterate - put the computation of eigenvalues in the iterator
- correct mistake in bracketing interval in
locateBifurcation! - remove
GMRESIterativeSolvers!from linearsolvers
- correct bug in the interval locating the bifurcation point (in bisection method)
- ⛳️ add
bothsidekwargs to continuation to compute a branch on both sides of initial guess - update the Minimally augmented problem during the continuation. This is helpful otherwise the codim 2 continuation fails.
- [WIP] detection of Bogdanov-Takens and Fold-Hopf bifurcations
- remove field
foldpointfrom ContResult
- improve bordered solvers for POTrap based on the cyclic matrix
- ⛳️ update phase condition during continuation for shooting problems and Trapezoid method
- remove fields
n_unstable,n_imagandstabilityfromContResultand put it in the fieldbranch.
- the keyword argument
Jtfor the jacobian transpose is writtenJᵗ
- new way to use the argument
printSolutionincontinuation. You can return (Named) tuple now.
- add new type GenericBifPoint to record bifurcation points and also an interval which contains the bifurcation point
- add
kwargsto argumentsfinaliseSolution - add
kwargsto callback fromnewton. In particular, newton passesfromNewton=true, newtonPALC passesfromNewton = false - save intervals for the location of bifurcation points in the correct way, (min, max)
- better estimation of d2f/dpdx in normal form computation
- change of name
HyperplaneSections->SectionPSfor Poincare Shooting
- clamp values in [pMin, pMax] for continuation
- put arrow at the end of the branch (plotting)
- add eta parameter in ContinuationPar
- change name
PALCStateVariablesintoContStateandPALCIterableintoContIterable - ⛳️ add Deflated Continuation
- ⛳️ add Multiple predictor (this is needed to implement the
pmcontalgorithm frompde2path(Matlab)
- ⛳️ add Polynomial predictor
- ⛳️ add Branch switching for non-simple branch points
The package is registered.
- Rename option
ContinuationPar:saveSolEveryNsteps-->saveSolEveryStep - Rename option
ContinuationPar:saveEigEveryNsteps-->saveEigEveryStep - Rename option
ContinuationPar:plotEveryNsteps-->plotEveryStep
- change the name of the package into
BifurcationKit.jl
- The options
computeEigenvalueinContinuationParhas been removed. It is now controlled withdetectBifurcation.
- ⛳️ automatic branch switching from simple Hopf points
- ⛳️ automatic normal form computation for any kernel dimension
- ⛳️ automatic branch switching from simple branch points (equilibrium)
- ⛳️ automatic normal form computation