- New
FiniteSplitterWallstructure.
particlebeamandrandominside_xyφfunctions.
- It is now possible in
timeseries!to evolve a particle until a certain boolean condition is met.
- It is now possible to create animations as gifs.
- Walls can have their normal vector automatically calculated, pointing to the left of the endpoint - startpoint.
- New function
billiard_verticesthat creates a billiard out of vertices.
extrapolateis now mentioned in the documentation and has a docstring.
- Bugfix of
timeseriesfunction where if thedtwas larger than the collision time, the returned timevector was wrong.
- Keyword
particle_Kwargsofanimate_evolutioncan now conveniently benothing, in which case the particles are not plotted, only their trajectories.
- New function
visited_obstacles!. - 2D and 3D chaotic phase space volumes now in
MushroomTools.
- Lyapunov computation and perturbation growth can now accept integer time (which means amount of collisions).
- Replaced all instances of
pertubationwithperturbation. A deprecation is thrown.
- New perturbation growth functions.
law_of_refraction: new function that returns transmission and refraction functions based on Snell's law and refractive indices.- Plenty of doc corrections.
- Plotting functions now overload
plotinstead. There is no moreplot_obstacle,plot_billiardandplot_particle.plot_boundarymapandanimate_evolutionremain the same though. constructis removed.boundarymapcall signature and return values are reworked.
- Brand new evolution animation function (replaced the old). It now animates in real-time!!! (you can use
dt = Infto obtain the old behavior). In addition it supports animating the evolution of multiple particles in parallel!!! - New function
timeseriescreates the timeseries of the particle evolution in a billiard. This does pretty much whatconstruct(evolve...)used to do. - New obstacle:
Ellipse. - Much more robust propagation algorithm that is less prone to errors and "weird behaviors"!
- Test suite reworked almost from scratch: More tests, more specific tests, more robust tests, easier to debug tests!
totallengthis exported.plot(bd, x, y)(using the timeseries oftimeseries) now also works for non-periodic billiards as well, for convenience.- Automatic parallelization is now possible for some functions, given by the
parallelizefunction.
These changes are not actually breaking, unless someone used the low-level interface. The docs also changed and much less than the low level interface is exposed.
-
Renamed
collisiontimeto justcollision, since now it returns both the time and the estimated collision point. -
Many low-level functions are not exported any more, for safety and because it didn't make much sense:
normvalvec, distance, cellsize, ``propagate!,relocate!,resolvecollision!,periodicity!,specular!realangle. For the low level interface onlypropagate!,bounce!,collisionandnext_collisionare exposed. Onlybounce!is exposed as public API. The low level interface is still documented though. -
Change of the internal propagation algorithm:
- the function
collision(previouslycollisiontime) returns both the time until collision as well as the collision point (most methods computed it already anyways). - The
timeprecand all those nonsense are removed. It is the duty ofcollisionto returnInfif the particle is very close to the collision point (realangleusesaccuracy, while for straight propagation the direction of travel is enough). - The particle is then "teleported" to this point by setting its
pos. For the case of magnetic propagation the velocity is propagated by the collision time. This brings very high accuracy, as the velocity vector is not multiplied with time and then added to the position vector. - The
distanceis checked. If it has wrong sign, arelocationsimply relocates the particle in the direction of thenormalvec, for amount(1+eps())*distance. - Specular reflection / periodicity is done.
- the function
-
Renamed
distancechecktoaccuracy
- Now you can write
p.ωas well asp.omegafor magnetic particles. - New
ispinnedfunction that returns Bool of whether a particle is pinned or not. Also works with periodic billiards.
- Standard billiards can now also be created with keyword arguments.
- Logo billiard is now exported by the function
billiard_logo.
- Better limits of axis for periodic rectangular billiards.
- Added some methods for high level functions (like e.g.
evolve) that if not given a particle they pick on fromrandominside. - Documentation improvements.
- Bug fix in the expressions for the chaotic phase space volume of mushrooms.
-
3 orders of magnitude performance gains on all functions!!!
- Reduced a lot of allocations done all over the place. In most places allocations done are now exactly zero! ZEROOOOOOOOOOOO
- Fixed many instances of broadcasting with static vectors (which is bad).
- Utilized metaprogramming to manually unroll some loops.
- If a billiard is periodic it is now known at compile time. This gives massive performance benefits in functions like
evolve, which have to check if the collision occured with periodic walls.
-
Symver will now be properly respected from 2.0 onwards.
-
Automatic saving of animations to video via
ffmpeg!!! -
Hexagonal periodic plotting.
-
Lyapunov exponents for magnetic particles are now possible!
-
Added boundary map computation function which works for any billiard and any particle. It assumes that the obstacles are sorted counter clockwise.
- Added
to_bcoords,totallength - Added
plot_boundarymapthat plots the boundary map and the obstacle boundaries.
- Added
-
Added robust coordinate change transformation from 3D real space to 2D boundary space, see
to_bcoords,from_bcoordsandarclengths. -
Added two novel high-level functions that compute the phase-space portion an orbit covers as the particle evolves:
boundarymap_portionandphasespace_portion. -
Added Poincare surface of section function, which computes intersections with arbitrary planes!
-
It is now possible to affect many different obstacles during ray-splitting!
-
Plotting is now available the moment the user does
using PyPlot. Done through theRequiresmodule. The functionenableplotting()does not exist anymore! -
Re-organized all source code into a much more readable state, and as a result significantly reduced the total lines of code.
-
added
evolvefunction that simply deepcopies particle. -
Added convenience function to compute the mean collision time in a billiard.
-
New low-level function
bounce!that propagates a particle from one collision to the next. In essence does whatevolve!does witht=1, but without creating a bunch of saving stuff. All high level functions usebounce!.
- Default colors for plotting have been changed (random obstacles are purple,
particle orbit is
"C0"). - [BREAKING] Overhauled what a "billiard table" is: Now, called simply
Billiardis a dedicated struct that stores the obstacles as a tuple. This means that all functions do not accept aVector{Obstacle}anymore but rather aBilliard. - [BREAKING]
timeprecnow takes argumentstimeprec(::Particle, ::Obstacle)to utilize better multiple dispatch and reduce code repetition. - [BREAKING]
realanglenow only takes one intersection and simply returns the real angle. - [BREAKING]
animate_evolutionnow does not have!at the end, because it deepcopies the particle. - [BREAKING] Re-worked ray-splitting: We now use the
RaySplitterstruct. See docs.
Updated the documentation to reflect the new changes of v1.6.0
- [BREAKING] Function
animate_evolutionhas been renamed toanimate_evolution!to remind users that it mutates the particle. - [BREAKING]
FiniteWallhas been renamed toInfiniteWalland works as before for convex billiards. A new typeFiniteWallis introduced that can work for non-convex billiards.FiniteWallhas some extra fields for enabling this.FiniteWallhas a boolean fieldisdoor, that designates the given wall to beDoor. This is used inescapetime.
- MASSIVE: Added function
escapetime(p, bt)which calculates the escape time of a particle from a billiard table. The escape time is the time until the particle collides with aDoor(anyDoor). animate_evolution!can create a new figure and plot the billiard table on user input. This happens by default.- Bugfix: relocation in magnetic case was not adaptive (for the backwards method).
- MASSIVE: Added a
Semicircletype! For both types of evolution!- added Bunimovich billiard
billiard_bunimovich - added mushroom billiard
billiard_mushroom
- added Bunimovich billiard
- Added possibility to calculate the Lyapunov spectrum of a billiard
system. Currently this is available only for
Particles.- use the function
lyapunovspectrumfor the computation.
- use the function
- Changed the relocating algorithm to be geometric. i.e. the time adjusting is done geometrically (self-multiplying the adjustment by 10 at each repeated step).
- Magnetic propagation and straight propagation now both use
timeprec(T)(see below). For both cases the maximum number of geometric iterations is 1 (for the default value oftimeprec(T). - This
timepreccannot be used PeriodWall and RaySplitting obstacles with MagneticParticles because when magnetic and relocating forward you get extremely shallow angles and you need huge changes in time for even tiny changes in position.- For this special case the function
timeprec_forward(T)is used instead. This function results to on average 3-5 geometric relocation steps.
- For this special case the function
- Fixed many issues and bugs.
- All major types defined by
DynamicalBilliardshave been changed to parametric types with parameterT<:AbstractFloat.- The above makes the billiard table type annotation be
bt::Vector{<:Obstacle{T}}) where {T<:AbstractFloat}instead of the oldbt::Vector{Obstacle}.
- The above makes the billiard table type annotation be
- Particle evolution algorithm has fundamentally changed.
The way the algorithm works now is described in the documentation in the Physics page.
- This point with conjuction with the above made the package much faster.
- Positional argument
warningofevolve!()has been changed to keyword argument. - The raysplitting functions must always accept 3 arguments, even in the case of straight propagation. The best way is to have the third argument have a default value.
- All
distancefunctions can now take a position as an argument (giving a particle simply passes the position). - Removed redundant functions like
magnetic2standard. - The package is now precompiled.
- Tests have been restructured to be faster, more efficient, and use the
@testsettype of syntax. - Documentation has been made more clear.
Changelog will be kept from this version. See the releases page for info on previous versions.