PlasmaPy v0.8.1 (2022-07-05)
============================

This release of PlasmaPy includes 158 pull requests closing 60 issues by
37 people, of which 31 are new contributors.

The people who have contributed to the code for this release are:

- Afzal Rao\ :sup:`*`
- Alexis Jeandet\ :sup:`*`
- Andrew Sheng\ :sup:`*`
- Anna Lanteri\ :sup:`*`
- Chris Hoang\ :sup:`*`
- Christopher Arran\ :sup:`*`
- Chun Hei Yip\ :sup:`*`
- Dominik Stańczak
- Elliot Johnson\ :sup:`*`
- Erik Everson
- flaixman\ :sup:`*`
- Haman Bagherianlemraski\ :sup:`*`
- Isaias McHardy\ :sup:`*`
- itsraashi\ :sup:`*`
- James Kent\ :sup:`*`
- Joao Victor Martinelli\ :sup:`*`
- Leo Murphy\ :sup:`*`
- Luciano Silvestri\ :sup:`*`
- Mahima Pannala\ :sup:`*`
- Marco Gorelli\ :sup:`*`
- Nick Murphy
- Nicolas Lequette
- Nikita Smirnov\ :sup:`*`
- Peter Heuer
- Pey Lian Lim\ :sup:`*`
- Rajagopalan Gangadharan\ :sup:`*`
- Raymon Skjørten Hansen\ :sup:`*`
- Reynaldo Rojas Zelaya\ :sup:`*`
- Riley Britten\ :sup:`*`
- sandshrew118\ :sup:`*`
- seanjunheng2\ :sup:`*`
- Shane Brown\ :sup:`*`
- Suzanne Nie\ :sup:`*`
- Terrance Takho Lee\ :sup:`*`
- Tien Vo\ :sup:`*`
- Tiger Du
- Tomás Stinson\ :sup:`*`

An asterisk indicates that this release contains their first
contribution to PlasmaPy.

Backwards Incompatible Changes
------------------------------

- In `~plasmapy.diagnostics.thomson.spectral_density`, the arguments
  ``Te`` and ``Ti`` have been renamed ``T_e`` and ``T_i`` and are now
  required |keyword-only| arguments. (`#974
  <https://github.com/plasmapy/plasmapy/pull/974>`__)
- Moved the ``grid_resolution`` attribute from
  `~plasmapy.plasma.grids.AbstractGrid` to
  `~plasmapy.plasma.grids.CartesianGrid` and
  `~plasmapy.plasma.grids.NonUniformCartesianGrid` separately. This
  fixes a potential future bug, because this attribute is only valid
  as written when all axes share the same units. (`#1295
  <https://github.com/plasmapy/plasmapy/pull/1295>`__)
- Changed the behavior of the ``__repr__`` method of |CustomParticle|
  to display the symbol as well if it was provided. (`#1397
  <https://github.com/plasmapy/plasmapy/pull/1397>`__)
- Removed a block of code that printed out special particle properties
  when ``plasmapy.particles.special_particles`` (renamed to
  ``plasmapy.particles._special_particles``) was executed. (`#1440
  <https://github.com/plasmapy/plasmapy/pull/1440>`__)
- Renamed ``plasmapy.particles.elements`` to
  ``plasmapy.particles._elements``, ``plasmapy.particles.isotopes`` to
  ``plasmapy.particles._isotopes``, ``plasmapy.particles.parsing`` to
  ``plasmapy.particles._parsing``, and
  ``plasmapy.particles.special_particles`` to
  ``plasmapy.particles._special_particles``. Consequently, these
  modules are no longer part of PlasmaPy's public API. Most of these
  modules did not contain any public objects, except for
  ``plasmapy.particles.special_particles.ParticleZoo`` which was
  renamed to ``plasmapy.particles._special_particles.particle_zoo``
  and removed from the public API. (`#1440
  <https://github.com/plasmapy/plasmapy/pull/1440>`__)
- The parameters ``Z`` and ``mass_numb`` to |Particle| are now
  |keyword-only|. (`#1456
  <https://github.com/plasmapy/plasmapy/pull/1456>`__)


Deprecations and Removals
-------------------------

- Officially deprecated ``plasmapy.formulary.parameters`` and scheduled
  its permanent removal for the ``v0.9.0`` release. (`#1453
  <https://github.com/plasmapy/plasmapy/pull/1453>`__)
- Dropped support for Python 3.7 in accordance with the deprecation
  policy laid out in `NumPy Enhancement Proposal 29
  <https://numpy.org/neps/nep-0029-deprecation_policy.html>`__. (`#1465
  <https://github.com/plasmapy/plasmapy/pull/1465>`__)
- The ``[all]`` option when using |pip| to install `plasmapy` is now
  deprecated and may be removed in a future release. Packages that
  were previously optional (|h5py|, |lmfit|, |mpmath|, and Numba)
  are now installed by default when running ``pip install
  plasmapy``. To install all packages required for code development of
  PlasmaPy, instead run ``pip install plasmapy[developer]``. (`#1482
  <https://github.com/plasmapy/plasmapy/pull/1482>`__)
- Removed ``plasmapy.optional_deps``. (`#1482
  <https://github.com/plasmapy/plasmapy/pull/1482>`__)


Features
--------

- `~plasmapy.diagnostics.thomson.spectral_density` and
  `~plasmapy.diagnostics.thomson.spectral_density_model` now support
  `~plasmapy.particles.particle_collections` objects as input to the
  ``ions`` keywords. (`#974
  <https://github.com/plasmapy/plasmapy/pull/974>`__)
- Created a :term:`lite-function` for
  `~plasmapy.diagnostics.thomson.spectral_density`,
  `~plasmapy.diagnostics.thomson.spectral_density_lite`. (`#974
  <https://github.com/plasmapy/plasmapy/pull/974>`__)
- Added a fitting function for 1D spectra,
  `~plasmapy.diagnostics.thomson.spectral_density_model`, to the
  Thomson scattering diagnostic module. (`#974
  <https://github.com/plasmapy/plasmapy/pull/974>`__)
- Created function
  ``plasmapy.formulary.parameters.thermal_speed_coefficients`` to
  support ``plasmapy.formulary.parameters.thermal_speed_lite`` usage
  by calculating the various thermal speed coefficients.
  ``plasmapy.formulary.parameters.thermal_speed_coefficients`` is also
  bound to ``plasmapy.formulary.parameters.thermal_speed`` as the
  ``coefficients`` attribute. (`#1145
  <https://github.com/plasmapy/plasmapy/pull/1145>`__)
- Created decorator
  `~plasmapy.utils.decorators.lite_func.bind_lite_func` for handling
  the binding of :term:`lite-functions` and any supporting functions
  to a parent function. (`#1145
  <https://github.com/plasmapy/plasmapy/pull/1145>`__)
- Introduced the concept of :term:`lite-functions`, by creating the
  lite-function ``plasmapy.formulary.parameters.thermal_speed_lite``,
  which is a simplified and Numba jitted version of
  ``plasmapy.formulary.parameters.thermal_speed``.  These functions
  are intended for computational use and as such have no validation of
  input or output values.
  ``plasmapy.formulary.parameters.thermal_speed_lite`` is also bound
  to ``plasmapy.formulary.parameters.thermal_speed`` as the ``lite``
  attribute. (`#1145
  <https://github.com/plasmapy/plasmapy/pull/1145>`__)
- Added the :file:`hollweg_.py` module to the
  `~plasmapy.dispersion.numerical` subpackage to numerically solve the
  dispersion relation using Hollweg's method
  :cite:p:`hollweg:1999,bellan:2012`. (`#1189
  <https://github.com/plasmapy/plasmapy/pull/1189>`__)
- Implemented non-breaking speed improvements on the methods
  `~plasmapy.plasma.grids.CartesianGrid.nearest_neighbor_interpolator`
  and
  `~plasmapy.plasma.grids.CartesianGrid.volume_averaged_interpolator`
  for `~plasmapy.plasma.grids.CartesianGrid`. The new interpolators
  now require that the grid axes be sorted, which is always true for
  uniform grids. Added a new test to ensure this stays true. (`#1295
  <https://github.com/plasmapy/plasmapy/pull/1295>`__)
- Refactored the interpolator methods on objects defined in
  `~plasmapy.plasma.grids`.  All interpolators are now defined in the
  subclasses of `~plasmapy.plasma.grids.AbstractGrid`.  Calling the
  interpolator methods on `~plasmapy.plasma.grids.AbstractGrid` raises
  a `NotImplementedError` exception. (`#1295
  <https://github.com/plasmapy/plasmapy/pull/1295>`__)
- Created :term:`lite-function`
  ``plasmapy.formulary.parameters.plasma_frequency_lite``. (`#1308
  <https://github.com/plasmapy/plasmapy/pull/1308>`__)
- Added the `~plasmapy.particles.particle_class.molecule` function to
  build |CustomParticle| objects from a `str` representing a molecule
  symbol. (`#1309 <https://github.com/plasmapy/plasmapy/pull/1309>`__)
- Added the
  `~plasmapy.particles.particle_collections.ParticleList.is_category`
  method for |ParticleList| objects.  This method is analogous to the
  `~plasmapy.particles.particle_class.Particle.is_category` method for
  |Particle| objects. (`#1378
  <https://github.com/plasmapy/plasmapy/pull/1378>`__)
- Created the prototype analysis tool `plasmapy.analysis.nullpoint`
  for finding the null points in a vector space using the trilinear
  interpolation method of :cite:t:`haynes:2007`. (`#1383
  <https://github.com/plasmapy/plasmapy/pull/1383>`__)
- Created `plasmapy.formulary.lengths` to contain length related
  plasma parameters, and migrated
  `~plasmapy.formulary.lengths.Debye_length`,
  `~plasmapy.formulary.lengths.gyroradius`, and
  `~plasmapy.formulary.lengths.inertial_length` from
  ``plasmapy.formulary.parameters`` to the new module.  Related aliases
  were also migrated. (`#1434
  <https://github.com/plasmapy/plasmapy/pull/1434>`__)
- Created `plasmapy.formulary.frequencies` to contain frequency
  related plasma parameters, and migrated
  `~plasmapy.formulary.frequencies.gyrofrequency`,
  `~plasmapy.formulary.frequencies.plasma_frequency`,
  `~plasmapy.formulary.frequencies.plasma_frequency_lite`,
  `~plasmapy.formulary.frequencies.lower_hybrid_frequency`, and
  `~plasmapy.formulary.frequencies.upper_hybrid_frequency` from
  ``plasmapy.formulary.parameters`` to the new module.  Related aliases
  were also migrated. (`#1439
  <https://github.com/plasmapy/plasmapy/pull/1439>`__)
- Migrated `~plasmapy.formulary.dimensionless.Debye_number`, and
  `~plasmapy.formulary.dimensionless.Hall_parameter` from
  ``plasmapy.formulary.parameters`` to
  `plasmapy.formulary.dimensionless`.  Related aliases were also
  migrated. (`#1444
  <https://github.com/plasmapy/plasmapy/pull/1444>`__)
- Created `plasmapy.formulary.speeds` to contain frequency related
  plasma parameters, and migrated
  `~plasmapy.formulary.speeds.Alfven_speed`,
  `~plasmapy.formulary.speeds.ion_sound_speed`,
  `~plasmapy.formulary.speeds.kappa_thermal_speed`,
  `~plasmapy.formulary.speeds.thermal_speed`,
  `~plasmapy.formulary.speeds.thermal_speed_coefficients`, and
  `~plasmapy.formulary.speeds.thermal_speed_lite` from
  ``plasmapy.formulary.parameters`` to the new module.  Related aliases
  were also migrated. (`#1448
  <https://github.com/plasmapy/plasmapy/pull/1448>`__)
- Created `plasmapy.formulary.misc` to contain functionality for
  miscellaneous plasma parameters, and migrated
  ``~plasmapy.formulary.misc._grab_charge``,
  `~plasmapy.formulary.misc.Bohm_diffusion`,
  `~plasmapy.formulary.misc.magnetic_energy_density`,
  `~plasmapy.formulary.misc.magnetic_pressure`,
  ``plasmapy.formulary.misc.mass_density``, and
  `~plasmapy.formulary.misc.thermal_pressure` from
  ``plasmapy.formulary.parameters`` to the new module.  Related aliases
  were also migrated. (`#1453
  <https://github.com/plasmapy/plasmapy/pull/1453>`__)
- Created :term:`lite-functions`
  ``plasmapy.dispersion.dispersion_functions.plasma_dispersion_func_lite``
  and
  ``plasmapy.dispersion.dispersion_functions.plasma_dispersion_func_deriv_lite``
  for `~plasmapy.dispersion.dispersion_functions.plasma_dispersion_func`
  and
  `~plasmapy.dispersion.dispersion_functions.plasma_dispersion_func_deriv`
  respectively. (`#1473
  <https://github.com/plasmapy/plasmapy/pull/1473>`__)
- Created :term:`lite-function`
  `plasmapy.formulary.dielectric.permittivity_1D_Maxwellian_lite` for
  `plasmapy.formulary.dielectric.permittivity_1D_Maxwellian`. (`#1476
  <https://github.com/plasmapy/plasmapy/pull/1476>`__)
- Added the :file:`stix_.py` module to the
  `~plasmapy.dispersion.analytical` subpackage which contains the Stix
  cold-plasma dispersion solution
  :func:`~plasmapy.dispersion.analytical.stix_.stix`,
  :cite:p:`stix:1992,bellan:2012`. (`#1511
  <https://github.com/plasmapy/plasmapy/pull/1511>`__)
- ``Particle("Li").ionize()`` no longer results in a
  `~plasmapy.particles.exceptions.ChargeError`. Instead, ionization of
  a neutral atom is assumed. (`#1514
  <https://github.com/plasmapy/plasmapy/pull/1514>`__)
- Created the |ParticleListLike| typing construct and added
  :term:`particle-list-like` to the |glossary|. (`#1528
  <https://github.com/plasmapy/plasmapy/pull/1528>`__)
- Added a null point classifier function which determines the type of
  a given 3D magnetic null point. (`#1554
  <https://github.com/plasmapy/plasmapy/pull/1554>`__)
- Added support for arbitrarily shaped input arrays to the function
  `plasmapy.formulary.collisions.lengths.impact_parameter`. (`#1604
  <https://github.com/plasmapy/plasmapy/pull/1604>`__)


Bug Fixes
---------

- Fixed a bug in the ``_make_grid`` method of
  `~plasmapy.plasma.grids.AbstractGrid` that would fail to smoothly
  handle invalid user input if the ``start``, ``stop``, or ``num``
  keywords were not the correct type. (`#1295
  <https://github.com/plasmapy/plasmapy/pull/1295>`__)
- Fixed a bug with |Particle| where ``Particle("p+") == Particle("H",
  Z=1, mass_numb=1)`` led to a |ParticleError|. (`#1366
  <https://github.com/plasmapy/plasmapy/pull/1366>`__)
- For ``plasmapy.formulary.parameters.gyroradius``, updated the
  default keyword arguments and conditional for issuing the
  `~plasmapy.utils.exceptions.PlasmaPyFutureWarning`.  This addresses
  the incorrect behavior where a `ValueError` is raised if an array is
  passed to the deprecated keyword ``T_i``. (`#1430
  <https://github.com/plasmapy/plasmapy/pull/1430>`__)
- Exposed `plasmapy.formulary.misc` to the `plasmapy.formulary`
  namespace. (`#1471
  <https://github.com/plasmapy/plasmapy/pull/1471>`__)
- Replaced misuse of ``max_exp_bias - max_exp_bias`` with
  ``max_exp_bias - min_exp_bias`` when creating seed parameters for
  the bimaxwellian fit function inside
  :func:`~plasmapy.diagnostics.langmuir.get_electron_temperature`. (`#1487
  <https://github.com/plasmapy/plasmapy/pull/1487>`__)
- Corrected the improper inversion of the electron temperature for the
  non-bimaxwellian case for
  :func:`~plasmapy.diagnostics.langmuir.get_electron_temperature`.
  The electron temperature, and not the slope, is a fit parameter of
  the curve used by
  :func:`~plasmapy.diagnostics.langmuir.get_electron_temperature`, so
  there is no need for the inversion.  The returned value is now the
  electron temperature and not its reciprocal. (`#1487
  <https://github.com/plasmapy/plasmapy/pull/1487>`__)
- Exposed the `~plasmapy.analysis` and `~plasmapy.dispersion`
  subpackages to the `plasmapy` namespace. (`#1512
  <https://github.com/plasmapy/plasmapy/pull/1512>`__)
- Changed the
  :meth:`~plasmapy.analysis.fit_functions.Linear.curve_fit` method on
  `plasmapy.analysis.fit_functions.Linear` so that the arbitrary
  keyword arguments get passed to `scipy.stats.linregress`.
  Previously,
  :meth:`~plasmapy.analysis.fit_functions.Linear.curve_fit` had
  accepted arbitrary keyword arguments but did not pass them along to
  `~scipy.stats.linregress`. (`#1518
  <https://github.com/plasmapy/plasmapy/pull/1518>`__)
- Fixed a bug in
  :func:`~plasmapy.dispersion.numerical.hollweg_.hollweg` that did not
  allow for arguments ``theta`` and ``k`` to simultaneously be
  arrays. (`#1529 <https://github.com/plasmapy/plasmapy/pull/1529>`__)
- Fixed the ``Z`` dependence in
  `~plasmapy.formulary.collisions.frequencies.fundamental_electron_collision_freq`,
  by replacing ``n_e`` with ``n_i`` while calling
  `~plasmapy.formulary.collisions.frequencies.collision_frequency`. (`#1546
  <https://github.com/plasmapy/plasmapy/pull/1546>`__)
- Updated the regular expression matching used by
  `~plasmapy.particles.particle_class.Particle` to parse and identify
  a :term:`particle-like` string.  This fixes the bug where a string
  with a trailing space (e.g. ``"Ar "``) was converted into a
  negatively charged ion (e.g. ``"Ar -1"``). (`#1555
  <https://github.com/plasmapy/plasmapy/pull/1555>`__)
- Exposed `plasmapy.formulary.radiation` and functions therein to the
  `plasmapy.formulary` namespace. (`#1572
  <https://github.com/plasmapy/plasmapy/pull/1572>`__)


Improved Documentation
----------------------

- Added a :term:`lite-function` group to the configuration value
  :confval:`automodapi_custom_groups` that introduces the
  ``__lite_funcs__`` dunder for listing the lite-functions in a module
  (akin to the ``__all__`` dunder). (`#1145
  <https://github.com/plasmapy/plasmapy/pull/1145>`__)
- Added a page in the |contributor guide| that describes how to add
  changelog entries. (`#1198
  <https://github.com/plasmapy/plasmapy/pull/1198>`__)
- Created an example notebook that lets users input plasma properties
  and get plasma parameters. (`#1229
  <https://github.com/plasmapy/plasmapy/pull/1229>`__)
- The file :file:`docs/_static/css/admonition_color_contrast.css` was
  added to include color customizations for |Sphinx| admonitions that
  originally came from `sphinx_rtd_theme_ext_color_contrast
  <https://github.com/AaltoSciComp/sphinx_rtd_theme_ext_color_contrast>`_.
  (`#1287 <https://github.com/plasmapy/plasmapy/pull/1287>`__)
- Changed the color contrast of links and admonitions to be consistent
  with the `Web Content Accessibility Guidelines 2 Level AA
  Conformance
  <https://www.w3.org/TR/2021/WD-WCAG22-20210521/#contrast-minimum>`__
  for contrast. (`#1287
  <https://github.com/plasmapy/plasmapy/pull/1287>`__)
- Re-organized CSS files for the online documentation. The file
  :file:`docs/_static/rtd_theme_overrides.css` was re-organized, renamed
  to :file:`docs/_static/css/plasmapy.css`, and updated with comments
  to help someone unfamiliar with CSS to understand the file and
  syntax. (`#1287 <https://github.com/plasmapy/plasmapy/pull/1287>`__)
- Put references from `plasmapy.formulary` into
  :file:`docs/bibliography.bib` in BibTeX format. (`#1299
  <https://github.com/plasmapy/plasmapy/pull/1299>`__)
- Added a discussion of test parametrization with argument unpacking
  to the |testing guide| in the |contributor guide|. (`#1316
  <https://github.com/plasmapy/plasmapy/pull/1316>`__)
- Adopted the `Contributor Covenant Code of Conduct version 2.1
  <https://www.contributor-covenant.org/version/2/1/code_of_conduct/>`__
  and updated the :ref:`Contributor Covenant Code of Conduct
  <plasmapy-code-of-conduct>` page accordingly. (`#1324
  <https://github.com/plasmapy/plasmapy/pull/1324>`__)
- Updated deprecated meeting and calendar links in
  :file:`README.md`. (`#1327
  <https://github.com/plasmapy/plasmapy/pull/1327>`__)
- Enabled the `sphinx-hoverxref
  <https://sphinx-hoverxref.readthedocs.io>`_ extension to
  |Sphinx|. (`#1353
  <https://github.com/plasmapy/plasmapy/pull/1353>`__)
- Added bullet points on module level docstrings and ``__all__`` to
  the documentation guide. (`#1359
  <https://github.com/plasmapy/plasmapy/pull/1359>`__)
- Reverted the code syntax highlighting style back to the ``pygments``
  default. The minimum version of ``pygments`` was set to ``2.11.0``
  because the default style was changed to meet accessibility
  guidelines for contrast in this release. (`#1361
  <https://github.com/plasmapy/plasmapy/pull/1361>`__)
- Described additional environments for building the documentation
  with ``make`` in the |documentation guide|. (`#1373
  <https://github.com/plasmapy/plasmapy/pull/1373>`__)
- Moved references from individual docstrings to the
  |bibliography|. (`#1374
  <https://github.com/plasmapy/plasmapy/pull/1374>`__)
- Fixed the docstring of
  `~plasmapy.formulary.collisions.dimensionless.coupling_parameter`. (`#1379
  <https://github.com/plasmapy/plasmapy/pull/1379>`__)
- Added an example notebook that introduces how to use
  `astropy.units`. (`#1380
  <https://github.com/plasmapy/plasmapy/pull/1380>`__)
- Added a "Getting Started" page to the documentation sidebar and a
  "Getting Started" section to the examples gallery. (`#1380
  <https://github.com/plasmapy/plasmapy/pull/1380>`__)
- Added an example notebook that introduces how to use
  `plasmapy.particles`. (`#1382
  <https://github.com/plasmapy/plasmapy/pull/1382>`__)
- Described the |plasma-calculator| in the narrative
  documentation. (`#1390
  <https://github.com/plasmapy/plasmapy/pull/1390>`__)
- Updated the cold magnetized plasma dielectric permittivity tensor
  notebook. (`#1396
  <https://github.com/plasmapy/plasmapy/pull/1396>`__)
- Configured the |Sphinx| extension ``sphinx-hoverxref``. (`#1437
  <https://github.com/plasmapy/plasmapy/pull/1437>`__)
- Removed the following files from :file:`docs/api_static`\ :
  ``plasmapy.particles.elements.rst``,
  ``plasmapy.particles.isotopes.rst``,
  ``plasmapy.particles.parsing.rst``, and
  ``plasmapy.particles.special_particles.rst``. These files
  corresponded to modules that were renamed with a leading underscore
  to indicate that they are no longer part of the public API. (`#1440
  <https://github.com/plasmapy/plasmapy/pull/1440>`__)
- Updated the docstring for
  `plasmapy.particles.particle_class.molecule`. (`#1455
  <https://github.com/plasmapy/plasmapy/pull/1455>`__)
- Hid the documentation page that contained the subpackage stability
  matrix. (`#1466 <https://github.com/plasmapy/plasmapy/pull/1466>`__)
- Added a discussion of doctests to the |documentation guide|. (`#1478
  <https://github.com/plasmapy/plasmapy/pull/1478>`__)
- Removed the section on package requirements from the instructions on
  how to install `plasmapy`. (`#1482
  <https://github.com/plasmapy/plasmapy/pull/1482>`__)
- Updated the instructions on how to install `plasmapy`. (`#1482
  <https://github.com/plasmapy/plasmapy/pull/1482>`__)
- Defined ``autodoc_typehints_format="short"`` so signature type hints
  are displayed in short form, i.e. without the leading module
  names. (`#1488 <https://github.com/plasmapy/plasmapy/pull/1488>`__)
- Set minimum version of `sphinx` to ``v4.4``. (`#1488
  <https://github.com/plasmapy/plasmapy/pull/1488>`__)
- Defined the :confval:`nitpick_ignore_regex` configuration variable
  in :file:`docs/conf.py` to specify regular expressions for objects
  to ignore in nitpicky documentation builds. (`#1509
  <https://github.com/plasmapy/plasmapy/pull/1509>`__)
- Made numerous minor updates and fixes to |reStructuredText| links in docstrings
  and the narrative documentation. (`#1509
  <https://github.com/plasmapy/plasmapy/pull/1509>`__)
- Described the GitHub Action for `codespell
  <https://github.com/codespell-project/codespell>`__ in the |testing
  guide|. (`#1530 <https://github.com/plasmapy/plasmapy/pull/1530>`__)
- Added the ``sphinx-issues`` extension to |Sphinx| to simplify linking
  to GitHub issues, pull requests, users, and commits. (`#1532
  <https://github.com/plasmapy/plasmapy/pull/1532>`__)
- Added the `sphinx.ext.extlinks` extension to |Sphinx| to simplify
  adding links to external domains which have a common base
  URL. (`#1532 <https://github.com/plasmapy/plasmapy/pull/1532>`__)
- Added the ``sphinx-notfound-page`` extension to |Sphinx| so that the
  documentation now has a :wikipedia:`404 <HTTP_404>` page in the same
  style as the rest of the documentation. (`#1532
  <https://github.com/plasmapy/plasmapy/pull/1532>`__)
- Added a notebook on using `~plasmapy.formulary.dimensionless.beta`
  from the `plasmapy.formulary` module to calculate plasma β in
  different parts of the solar atmosphere. (`#1552
  <https://github.com/plasmapy/plasmapy/pull/1552>`__)
- Added an example notebook for the null point finder module. (`#1554
  <https://github.com/plasmapy/plasmapy/pull/1554>`__)
- Added an example notebook that calculates plasma parameters
  associated with the Magnetospheric Multiscale Mission (MMS). (`#1568
  <https://github.com/plasmapy/plasmapy/pull/1568>`__)
- Added an example notebook that discusses Coulomb collisions. (`#1569
  <https://github.com/plasmapy/plasmapy/pull/1569>`__)
- Increased the strictness of the ``build_docs`` tox environment so
  that broken |reStructuredText| links now emit warnings which are then treated as
  errors, fixed the new errors, removed the ``build_docs_nitpicky``
  tox environment, and updated the |documentation guide|
  accordingly. (`#1587
  <https://github.com/plasmapy/plasmapy/pull/1587>`__)
- Renamed the :file:`magnetic_statics.ipynb` notebook to
  :file:`magnetostatics.ipynb`, and made some minor edits to its text
  and plotting code. (`#1588
  <https://github.com/plasmapy/plasmapy/pull/1588>`__)
- Added examples sections to the documentation pages for several
  modules within `plasmapy.formulary`. (`#1590
  <https://github.com/plasmapy/plasmapy/pull/1590>`__)
- Re-organized the directory structure for example notebooks. (`#1590
  <https://github.com/plasmapy/plasmapy/pull/1590>`__)
- Alphabetized the author list in :file:`docs/about/credits.rst`, and
  added missing authors from using ``git log`` and the pull request
  history. (`#1599
  <https://github.com/plasmapy/plasmapy/pull/1599>`__)
- Renamed :file:`docs/development` → :file:`docs/contributing`, and
  set up redirects from the original hyperlinks to the new ones for
  the contributor guide. (`#1605
  <https://github.com/plasmapy/plasmapy/pull/1605>`__)
- Added ``sphinx-reredirects`` as a |Sphinx| extension to allow website
  redirects. (`#1605
  <https://github.com/plasmapy/plasmapy/pull/1605>`__)
- Added a :file:`robots.txt` file to the online documentation to tell
  web crawlers to ignore all but ``stable`` and ``latest``
  documentation builds when indexing for search engines. (`#1607
  <https://github.com/plasmapy/plasmapy/pull/1607>`__)


Trivial/Internal Changes
------------------------

- Streamlined `~plasmapy.utils.decorators.helpers.preserve_signature`
  such that it only binds ``__signature__`` to the wrapped function,
  i.e. it no longer touches any other attribute of the wrapped
  function. (`#1145
  <https://github.com/plasmapy/plasmapy/pull/1145>`__)
- Moved all tests associated with calculating the thermal speed from
  test file :file:`plasmapy/formulary/tests/test_parameters.py` to
  :file:`plasmapy/formulary/tests/test_thermal_speed.py`. (`#1145
  <https://github.com/plasmapy/plasmapy/pull/1145>`__)
- Applied |reStructuredText| substitutions for `plasmapy.particles` and
  |ParticleTracker| in the narrative documentation. (`#1158
  <https://github.com/plasmapy/plasmapy/pull/1158>`__)
- Added `csslint <https://github.com/CSSLint/csslint>`_ to the
  |pre-commit| configuration to check the formatting and style of CSS
  files. (`#1287 <https://github.com/plasmapy/plasmapy/pull/1287>`__)
- Added Python 3.10 to the |GitHub Actions| test suite. (`#1292
  <https://github.com/plasmapy/plasmapy/pull/1292>`__)
- Parametrized tests for
  ``plasmapy.formulary.parameters.ion_sound_speed``. (`#1313
  <https://github.com/plasmapy/plasmapy/pull/1313>`__)
- Added cron tests of the development versions of |matplotlib| and
  |SciPy|, while changing the cadence of cron tests to be run
  approximately fortnightly. (`#1333
  <https://github.com/plasmapy/plasmapy/pull/1333>`__)
- Applied `pytest.warns` in several tests to catch warnings that are
  being issued during execution of the test suite. (`#1345
  <https://github.com/plasmapy/plasmapy/pull/1345>`__)
- Split the tests running on pull requests into multiple stages. The
  various `pytest` test environments, including code coverage, now run
  conditionally given successful execution of a basic test environment
  and the linter checks. This change also prevents code coverage
  prompts from appearing twice, with incomplete information on the
  first time. (`#1350
  <https://github.com/plasmapy/plasmapy/pull/1350>`__)
- Added a helper function that takes an iterable and creates a `dict`
  with physical types as keys and the corresponding objects from that
  iterable as values. This change updates the minimum required version
  of |Astropy| to 4.3.1. (`#1360
  <https://github.com/plasmapy/plasmapy/pull/1360>`__)
- Added the module ``plasmapy.particles._factory`` which contains a
  private function that accepts arguments that can be provided to
  |Particle|, |CustomParticle|, or |ParticleList| and returns the
  appropriate instance of one of those three classes. (`#1365
  <https://github.com/plasmapy/plasmapy/pull/1365>`__)
- Used the extract method refactoring pattern on the initialization of
  |Particle| objects. (`#1366
  <https://github.com/plasmapy/plasmapy/pull/1366>`__, `#1368
  <https://github.com/plasmapy/plasmapy/pull/1368>`__)
- Refactored tests in `plasmapy.particles`. (`#1369
  <https://github.com/plasmapy/plasmapy/pull/1369>`__)
- |CustomParticle| and |DimensionlessParticle| no longer emit a
  warning when the charge and/or mass is not provided and got assigned
  a value of |nan| in the appropriate units. (`#1399
  <https://github.com/plasmapy/plasmapy/pull/1399>`__)
- Added unit test cases for manual entry of vector values in order to
  improve code coverage in the null point finder. (`#1427
  <https://github.com/plasmapy/plasmapy/pull/1427>`__)
- Consolidated and parametrized tests associated with
  ``plasmapy.formulary.parameters.gyroradius``. (`#1430
  <https://github.com/plasmapy/plasmapy/pull/1430>`__)
- Within `plasmapy.particles` modules, the ``_elements``,
  ``_isotopes``, ``_parsing``, and ``_special_particles`` modules are
  now imported directly. Before this, objects within these modules
  were typically imported. (`#1440
  <https://github.com/plasmapy/plasmapy/pull/1440>`__)
- Renamed objects within the source code for `plasmapy.particles` to
  conform with :pep:`8` naming conventions (e.g., ``ParticleZooClass``
  → ``ParticleZoo``, ``ParticleZoo`` → ``particle_zoo``, and
  ``Particles`` → ``particles``). (`#1440
  <https://github.com/plasmapy/plasmapy/pull/1440>`__)
- Applied automated refactorings from `Sourcery
  <https://sourcery.ai/>`__ to `plasmapy.utils`. (`#1463
  <https://github.com/plasmapy/plasmapy/pull/1463>`__)
- Applied automated refactorings from `Sourcery
  <https://sourcery.ai/>`__ to `plasmapy.plasma`. (`#1464
  <https://github.com/plasmapy/plasmapy/pull/1464>`__)
- Bumped the minimum version of `h5py` to ``3.0.0``. (`#1465
  <https://github.com/plasmapy/plasmapy/pull/1465>`__)
- Changed the raised exception to `ImportError` (from a general
  `Exception`) when attempting to import `plasmapy` from a Python
  version below the minimum supported version. (`#1465
  <https://github.com/plasmapy/plasmapy/pull/1465>`__)
- Added a workflow to label pull requests based on size. (`#1467
  <https://github.com/plasmapy/plasmapy/pull/1467>`__, `#1492
  <https://github.com/plasmapy/plasmapy/pull/1492>`__)
- Separated ``plasmapy.analysis.nullpoint.null_point_find`` into two
  functions named `~plasmapy.analysis.nullpoint.null_point_find` and
  `plasmapy.analysis.nullpoint.uniform_null_point_find`.
  `~plasmapy.analysis.nullpoint.null_point_find` finds the null points
  of a vector space whose values are manually entered.
  `plasmapy.analysis.nullpoint.uniform_null_point_find` finds the null
  points of a uniform vector space whose values are generated by a
  function provided by the user. (`#1477
  <https://github.com/plasmapy/plasmapy/pull/1477>`__)
- Applied automated refactorings from `Sourcery
  <https://sourcery.ai/>`__ to `plasmapy.particles`. (`#1479
  <https://github.com/plasmapy/plasmapy/pull/1479>`__)
- Applied automated refactorings from `Sourcery
  <https://sourcery.ai/>`__ to `plasmapy.formulary`. (`#1480
  <https://github.com/plasmapy/plasmapy/pull/1480>`__)
- Bumped the minimum versions of |mpmath| to ``1.2.1``, `numpy` to
  ``1.19.0``, `pandas` to ``1.0.0``, `pytest` to ``5.4.0``, `scipy` to
  ``1.5.0``, and |xarray| to ``0.15.0``. (`#1482
  <https://github.com/plasmapy/plasmapy/pull/1482>`__)
- Moved |h5py|, |lmfit|, |mpmath|, and Numba out of the
  ``extras`` requirements category and into the ``install``
  requirements category.  These packages are now installed when
  running ``pip install plasmapy``. (`#1482
  <https://github.com/plasmapy/plasmapy/pull/1482>`__)
- Added ``dlint``, ``flake8``, ``flake8-absolute-import``,
  ``flake8-rst-docstrings``, ``flake8-use-fstring``, ``pydocstyle``, and
  ``pygments`` into the ``tests`` requirements category and |pre-commit|
  into the ``extras`` requirements category. These dependencies are
  not required for basic installation with |pip|. (`#1482
  <https://github.com/plasmapy/plasmapy/pull/1482>`__)
- Updated :file:`docs/environment.yml` to use |pip| to install all
  requirements specified by :file:`requirements.txt` when creating a
  Conda environment. (`#1482
  <https://github.com/plasmapy/plasmapy/pull/1482>`__)
- Used `codespell <https://github.com/codespell-project/codespell>`__
  to fix typos. (`#1493
  <https://github.com/plasmapy/plasmapy/pull/1493>`__)
- Used `contextlib.suppress` to suppress exceptions, instead of
  ``try`` & ``except`` blocks. (`#1494
  <https://github.com/plasmapy/plasmapy/pull/1494>`__)
- Added a |pre-commit| hook that transforms relative imports to
  absolute imports, except in :file:`docs/plasmapy_sphinx`. (`#1499
  <https://github.com/plasmapy/plasmapy/pull/1499>`__)
- Added a test that ``import plasmapy`` does not raise an
  exception. (`#1501
  <https://github.com/plasmapy/plasmapy/pull/1501>`__)
- Added a GitHub Action for `codespell
  <https://github.com/codespell-project/codespell>`__, and updated the
  corresponding tox environment to print out contextual
  information. (`#1530
  <https://github.com/plasmapy/plasmapy/pull/1530>`__)
- Added :file:`plasmapy/utils/units_definitions.py` to precompute
  units which were applied to optimize functionality in
  :file:`plasmapy/formulary/distribution.py`. (`#1531
  <https://github.com/plasmapy/plasmapy/pull/1531>`__)
- Replaced ``except Exception`` clauses in ``formulary``,
  ``particles``, and ``utils`` with specific exception
  statements. (`#1541
  <https://github.com/plasmapy/plasmapy/pull/1541>`__)
- Added tests for passing array valued ``k`` and ``theta`` arguments
  to :func:`~plasmapy.dispersion.numerical.hollweg_.hollweg`, which
  was an added feature in :pr:`1529`. (`#1549
  <https://github.com/plasmapy/plasmapy/pull/1549>`__)
- Added `flake8-implicit-str-concat
  <https://github.com/flake8-implicit-str-concat/flake8-implicit-str-concat>`__
  and `flake8-mutable <https://github.com/ebeweber/flake8-mutable>`__
  as extensions for ``flake8``. (`#1557
  <https://github.com/plasmapy/plasmapy/pull/1557>`__)
- Added `flake8-simplify
  <https://github.com/MartinThoma/flake8-simplify>`__ as an extension
  for ``flake8``. (`#1558
  <https://github.com/plasmapy/plasmapy/pull/1558>`__)
- Applied automated refactorings from `Sourcery
  <https://sourcery.ai/>`__ to `plasmapy.dispersion`. (`#1562
  <https://github.com/plasmapy/plasmapy/pull/1562>`__)
- Applied automated refactorings from `Sourcery
  <https://sourcery.ai/>`__ to `plasmapy.diagnostics`. (`#1563
  <https://github.com/plasmapy/plasmapy/pull/1563>`__)
- Applied automated refactorings from `Sourcery
  <https://sourcery.ai/>`__ to `plasmapy.analysis`. (`#1564
  <https://github.com/plasmapy/plasmapy/pull/1564>`__)
- Removed an extraneous `print` statement from
  `~plasmapy.formulary.collisions.frequencies.collision_frequency` that activated
  when the colliding particles were both electrons. (`#1570
  <https://github.com/plasmapy/plasmapy/pull/1570>`__)
- Changed the type hints for ``z_mean`` in
  `plasmapy.formulary.collisions` functions from
  ``astropy.units.dimensionless_unscaled`` to
  `~numbers.Real`. Consequently, ``z_mean`` will no longer be
  processed by
  `~plasmapy.utils.decorators.validators.validate_quantities`. Previously,
  ``z_mean`` issued a warning when a real number was provided instead
  of a dimensionless |Quantity|. (`#1570
  <https://github.com/plasmapy/plasmapy/pull/1570>`__)
- Updated the version of ``black`` to 22.3.0 in PlasmaPy's |pre-commit|
  configuration. This update included a formatting change where spaces
  around power operators were removed for sufficiently simple operands
  (e.g., ``a ** b`` → ``a**b``). (`#1582
  <https://github.com/plasmapy/plasmapy/pull/1582>`__)
- Renamed ``units_definitions`` to ``_units_definitions`` and
  ``units_helpers`` to ``_units_helpers`` in `plasmapy.utils` to mark
  these modules as private. (`#1587
  <https://github.com/plasmapy/plasmapy/pull/1587>`__)
- Updated the :file:`codemeta.json` file with metadata for the version
  ``0.8.1`` release. (`#1606
  <https://github.com/plasmapy/plasmapy/pull/1606>`__)
