- Added a new
SimulationUnitSystem
class for handling unit systems in simulations, especially for N-body simulations.
- This release fixes the wheel builds for linux and mac and no new features or bug fixes are included.
- Added an option to specify a multiprocessing or parallel processing pool when computing basis function coefficients for the SCF potential from discrete particles.
- Added the Burkert potential as a built-in cpotential.
- Added a method to generate the Burkert potential with just r0 as an input
- Added new particle spray method by Chen et al. (2024).
- Fixed the parameter values in the
FardalStreamDF
class to be consistent with the values used in Fardal et al. (2015). Added an optiongala_modified
to the class to enable using the new (correct) parameter values, but the default will continue to use the Gala modified values (for backwards compatibility). - Improved internal efficiency of
DirectNBody
. - Fixed a bug in which passing a
DirectNBody
instance to theMockStreamGenerator. run()
would fail ifsave_all=False
in the nbody instance. - Fixed an incompatibility with Astropy v6.1 and above where
_make_getter
was removed.
- Deprecated
gala.integrate.Integrator.run
forgala.integrate.Integrator.__call__
. The old method will raise a warning and will be removed in a future release.
- New release to fix upload to PyPI from GitHub Actions and invalid pin in pyia dependency.
- Added a
.guiding_center()
method toPhaseSpacePosition
andOrbit
to compute the guiding center radius. - Added a way to convert Gala potential instances to Agama potential instances.
- Fixed a bug with the
plot_contours()
andplot_density_contours()
methods so that times specified are now passed through correctly to the potential methods. - Fixed the YAML output to use
default_flow_style=None
for serializing potential objects, which leads to a more efficient array output. scf.compute_coeffs_discrete
now raises an error if GSL is not enabled rather than silently returning zerosSCFPotential
will now work with IO functions (save
&load
)- Fixes compatibility with Astropy v6.0
- Changed the way potential interoperability is done with other Galactic dynamics
packages (Agama, galpy, etc.). It is now handled by the
Potential.as_interop()
method on all potential class instances.
- Switched build system to use pyproject.toml instead of setup.cfg
- Added a method to export the internal components of an
MN3ExponentialDiskPotential()
to threeMiyamotoNagaiPotential
instances. - Added a new Milky Way potential model:
MilkyWayPotential2022
, which is based on updated measurements of the disk structure and circular velocity curve of the disk. - Added the ability to use leapfrog integration within the
DirectNBody
integrator. - Added a new coordinate frame for the Vasiliev+2021 Sagittarius stream coordinate
system,
SagittariusVasiliev21
.
- Fixed a bug with the
OrphanKoposov19()
coordinate frame that caused the wrong rotation matrix to be returned. - Fixed an
AstropyDeprecationWarning
resulting from the use ofoverride__dir__
. - Fixed a bug in
Orbit.estimate_period()
that would cause the method to fail with aUnitsError
if one orbit returned a nan value for the period. - Fixed a bug when compiling the
dop853
integrator.
- Refactored the way
GreatCircleICRSFrame()
works to be more consistent and unambiguous with coordinate frame definitions. The frame now requires an input pole and origin, but can be initialized in old ways using thefrom_*()
class methods (e.g., withpole
andra0
values).
- Properly incorporate commits related to
SCFInterpolatedPotential
.
- Added a
.replicate()
method to Potential classes to enable copying potential objects but modifying some parameter values. - Added a new potential class
MN3ExponentialDiskPotential
based on Smith et al. (2015): an approximation of the potential generated by a double exponential disk using a sum of three Miyamoto-Nagai disks. - The
Orbit.estimate_period()
method now returns period estimates in all phase-space components instead of just the radial period. - Added a
store_all
flag to the integrators to control whether to save phase-space information for all timesteps or only the final timestep. - Added a
plot_rotation_curve()
method to all potential objects to make a 1D plot of the circular velocity curve. - Added a new potential for representing multipole expansions
MultipolePotential
. - Added a new potential
CylSplinePotential
for flexible representation of axisymmetric potentials by allowing passing in grids of potential values evaluated grids of R, z values (like theCylSpline
potential in Agama). - Added a
show_time
flag toOrbit.animate()
to control whether to show the current timestep. - Changed
Orbit.animate()
to allow for differentmarker_style
andsegment_style
options for individual orbits by passing a list of dicts instead of just a dict. - Added an experimental new class
SCFInterpolatedPotential
that accepts a time series of coefficients and interpolates the coefficient values to any evaluation time.
- Fixed a bug where the
NFWPotential
energy was nan when evaluating at the origin, and added tests for all potentials to check for a finite value of the potential at the origin (when expected). - Fixed a bug in
NFWPotential.from_M200_c()
where the incorrect scale radius was computed (Cython does not always use Python 3 division rules for dividing integers!). - Fixed a bug in the (C-level/internal) estimation of the 2nd derivative of the potential, used to generate mock streams, that affects non-conservative force fields.
- The
Orbit.estimate_period()
method now returns period estimates in all phase-space components instead of just the radial period.
- Implemented a basic progress bar for integrating orbits and mock streams. Pass
progress=True
withIntegrator_kwargs
when calling.integrate_orbit()
, or passprogress=True
toMockStreamGenerator.run()
. - Added a new symplectic integrator: The Ruth 4th-order integrator, implemented
with the class
Ruth4Integrator
. - Added a
Orbit.animate()
method to makematplotlib
animations of orbits. - Modified
Orbit._max_helper()
to use a parabola instead of interpolation - Added functionality to transform from action-angle coordinates to Cartesian
position velocity coordinates in the Isochrone potential:
gala.dynamics.actionangle.isochrone_aa_to_xv()
. - Added a new method on
DirectNBody
to enable computing the instantaneous, mutual, N-body acceleration vectorsDirectNBody.acceleration()
.
- Fixed
find_actions()
to accept anOrbit
instance with multiple orbits. - Fixed a bug that appeared when trying to release all mock stream particles at the same timestep (e.g., pericenter).
- Fixed a bug where time arrays returned from
parse_time_specification
could come back with a non-float64 dtype. - Fixed a bug with
DirectNBody
with composite potentials where only the first potential component would move as a body / particle. - Fixed a bug with the Python implementation of Leapfrog integration
LeapfrogIntegrator
that led to incorrect orbits for non-conservative systems that were integrated backwards (i.e. withdt<<0
). - Fixed a bug with the
FlattenedNFW
potential class in which the energy and gradient functions were not using the inputted flattening (c
value) and were instead defaulting to the spherical NFW model. - Enabled pickling
Frame
instances and therefore nowHamiltonian
instances. - Fixed a bug with
autolim=True
during Orbit plotting where the axes limits were only dependent on the most recent Orbit rather than all that were present on the axis
- Renamed
gala.dynamics.actionangle.isochrone_to_aa()
togala.dynamics.actionangle.isochrone_xv_to_aa()
- Renamed
gala.dynamics.actionangle.find_actions()
togala.dynamics.actionangle.find_actions_o2gf()
- Fixed a RST bug that caused the README to fail to render.
UnitSystem
objects can now be created with custom units passed in as AstropyQuantity
objects.- Added functionality to convert Gala potential objects to Galpy potential objects, or to create Gala potential objects from a pre-existing Galpy potential.
- Added a
plot_3d()
method forOrbit
objects to make 3D plots of the orbital trajectories.
- Fixed a bug when calling
orbit.norbits
when the representation is not cartesian. - Fixed a bug with
GreatCircleICRSFrame.from_endpoints()
that caused an error when the input coordinates had associated velocity data. - Fixed a bug with the
JaffePotential
density evaluation, which was too low by a factor of two. - Implemented a density function for
LogarithmicPotential
, which was missing previously. - The analytic action-angle and
find_actions()
utilities now correctly return frequencies with angular frequency units rather than frequency.
- Removed the deprecated
gala.coordinates.get_galactocentric2019()
function.
- Added a new
.to_sympy()
classmethod for thePotential
classes to return a sympy expression and variables. - Added a method,
.to_galpy_orbit()
, to convert GalaOrbit
instances to GalpyOrbit
objects. - The
NFWPotential
can now be instantiated via a new classmethod:NFWPotential.from_M200_c()
, which accepts a virial mass and a concentration. - Added a fast way of computing the Staeckel focal length,
Delta
, using Gala potential classes,gala.dynamics.get_staeckel_fudge_delta
- Fixed a bug with
Potential
classes.replace_units()
so that classes with dimensionless unit systems cannot be replaced with physical unit systems, and vice versa. - Implemented Hessian functions for most potentials.
- Fixed
.to_latex()
to properly return a latex representation of the potential. This uses the new.to_sympy()
method under the hood. - Potential classes now validate that input positions have dimensionality that matches what is expected for each potential.
- Changed the way new
Potential
classes are defined: they now rely on defining class-levelPotentialParameter
objects, which reduces a significant amount of boilerplate code in the built-in potentials.
- Gala now builds on Windows!
- Added a coordinate frame for the Pal 13 stream,
Pal13Shipp20
.
- Fixed a bug with the mock stream machinery in which the stream would not
integrate for the specified number of timesteps if an array of
n_particles
was passed in with 0's near the end of the array.
- Potential objects now support replacing the unit system with the
.replace_units()
method, or by updating the.units
attribute on an existing instance. - Added a
DirectNBody
class that supports direct N-body orbit integration in (optional) external background potentials. - Added a coordinate frame for the Jhelum stream,
JhelumBonaca19
. - Added a function for retrieving a more modern Galactocentric reference frame,
gala.coordinates.get_galactocentric2019()
. - Added a classmethod to allow initializing a
GreatCircleICRSFrame
from a rotation matrix that specifies the transformation fromICRS
to the great circle frame.
- Fixed an issue that led to incorrect
GreatCircleICRSFrame
transformations when nora0
was provided. - Fixed a bug in the
OrphanKoposov19
transformation.
- Overhauled the mock stellar stream generation methodology to allow for more
general stream generation. See
MockStreamGenerator
and the stream distribution function classes, e.g.,FardalStreamDF
. - Removed deprecated
CartesianPhaseSpacePosition
class. - Removed long deprecated
Quaternion
class.
- Added a new coordinate frame for great circle coordinate systems defined by a pole. This frame can be created with a pole and origin, a pole and longitude zero point, by two points along a great circle, or by specifying the cartesian basis vectors of the new frame.
- Added a function to transform a proper motion covariance matrix to a new coordinate frame.
- Added support for compiling Gala with or without the GNU Scientific Library (GSL), which is needed for the new potential classes indicated below.
- Added a new
PowerLawCutoffPotential
class for a power-law density distribution with an exponential cutoff (requires GSL). - Added an implementation of the
MWPotential2014
fromgalpy
(calledBovyMWPotential2014
ingala
) (requires GSL). - Added an implementation of the Self-Consistent Field (SCF) basis function expansion method for representing potential-density pairs (requires GSL).
- Most Potential classes now support rotations and origin shifts through the
R
andorigin
arguments. - Added a
progress
argument to the Python integrators to display a progress bar when stepping the integrators. - When generating mock stellar streams and storing snapshots (rather than just
the final phase-space positions of the particles) now supports specifying the
snapshot frequency with the
output_every
argument.
- Stream frames now properly wrap the longitude (
phi1
) components to the range (-180, 180) deg.
- Stream classes have been renamed to reflect the author that defined them.
- Proper motion and coordinate velocity transformations have now been removed in favor of the implementations in Astropy.
- Added a
.data
attribute toPhaseSpacePosition
objects that returns aRepresentation
orNDRepresentation
instance with velocity data (differentials) attached.
- Added a
NullPotential
class that has 0 mass and serves as a placeholder. - Added a new
zmax()
method on theOrbit
class to compute the maximum z heights and times, or the mean maximum z height. Similar toapocenter()
andpericenter()
. - Added a new generator method on the
Orbit
class for easy iteration over orbits.
Orbit.norbits
now works...oops.apocenter()
andpericenter()
now work when more than one orbit is stored in anOrbit
class.
- Added a new coordinate frame aligned with the Palomar 5 stream.
- Added a function
gala.dynamics.combine
to combinePhaseSpacePosition
orOrbit
objects.
- Added a density function for the Kepler potential.
- Added a density function for the Long & Murali bar potential
- Added JOSS paper.
- Cleaned up some tests and documentation to use the
Hamiltonian
object.
- Array parameters are now numpy.ravel'd before being passed to the
CPotentialWrapper
class methods. - Added attribution to Bovy 2015 for disk potential in MilkyWayPotential
- Added a new potential class for the Satoh density (Satoh 1980).
- Added support for Leapfrog integration when generating mock stellar streams.
- Added new colormaps and defaults for the matplotlib style.
- Added support for non-inertial reference frames and implemented a constant rotating reference frame.
- Added a new class -
Hamiltonian
- for storing potentials with reference frames. This should be used for easy orbit integration instead of the potential classes. - Added a new argument to the mock stream generation functions t output orbits of all of the mock stream star particles to an HDF5 file.
- Cleaned up and simplified the process of subclassing a C-implemented gravitational potential.
- Gravitational potential class instances can now be composed by just adding the instances.
- Added a
MilkyWayPotential
class.
CartesianPhaseSpacePosition
andCartesianOrbit
are deprecated. UsePhaseSpacePosition
andOrbit
with a Cartesian representation instead.- Overhauled the storage of position and velocity information on
PhaseSpacePosition
andOrbit
classes. This uses new features in Astropy 2.0 that allow attaching "differential" classes to representation classes for storing velocity information..pos
and.vel
no longer point to arrays of Cartesian coordinates, but now instead point to astropy.coordinates representation and differential objects, respectively.
- Removed debug statement.
- Added 'Why' page to documentation.
- Initial release.