diff --git a/changelog/1664.feature.rst b/changelog/1664.feature.rst new file mode 100644 index 0000000000..203787bad2 --- /dev/null +++ b/changelog/1664.feature.rst @@ -0,0 +1,2 @@ +Add the `~plasmapy.formulary.densities` submodule +Add the `~plasmapy.formulary.densities.critical_density` function to the `~plasmapy.formulary.densities` module. This function calculates the critical density of a plasma for a given frequency of radiation. diff --git a/docs/about/credits.rst b/docs/about/credits.rst index f19a25db77..0e611fbdc0 100644 --- a/docs/about/credits.rst +++ b/docs/about/credits.rst @@ -68,6 +68,7 @@ in parentheses are `ORCID author identifiers `__. * Jakub Polak * :user:`James Kent ` * :user:`Jasper Beckers ` +* :user:`Jayden Roberts ` * :user:`Joao Victor Martinelli ` * :user:`Joshua Munn ` * :user:`Isaias McHardy ` (:orcid:`0000-0001-5394-9445`) diff --git a/docs/formulary/densities.rst b/docs/formulary/densities.rst new file mode 100644 index 0000000000..fa3484a164 --- /dev/null +++ b/docs/formulary/densities.rst @@ -0,0 +1,9 @@ +.. _densities: + +****************************************************************** +Density Plasma Parameters (`plasmapy.formulary.densities`) +****************************************************************** + +.. currentmodule:: plasmapy.formulary.densities + +.. automodapi:: plasmapy.formulary.densities diff --git a/docs/formulary/index.rst b/docs/formulary/index.rst index 48d1636c63..2ebc848351 100644 --- a/docs/formulary/index.rst +++ b/docs/formulary/index.rst @@ -17,6 +17,9 @@ physical quantities helpful for plasma physics. | .. toctree:: Collisions | `plasmapy.formulary.collisions` | | :maxdepth: 1 | | +--------------------------------------------------------+-----------------------------------------+ + | .. toctree:: Densities | `plasmapy.formulary.densities` | + | :maxdepth: 1 | | + +--------------------------------------------------------+-----------------------------------------+ | .. toctree:: Dielectrics | `plasmapy.formulary.dielectric` | | :maxdepth: 1 | | +--------------------------------------------------------+-----------------------------------------+ diff --git a/plasmapy/formulary/__init__.py b/plasmapy/formulary/__init__.py index 18385e4530..c9d18f8437 100644 --- a/plasmapy/formulary/__init__.py +++ b/plasmapy/formulary/__init__.py @@ -8,6 +8,7 @@ from plasmapy.formulary.braginskii import * from plasmapy.formulary.collisions import * +from plasmapy.formulary.densities import * from plasmapy.formulary.dielectric import * from plasmapy.formulary.dimensionless import * from plasmapy.formulary.distribution import * @@ -37,6 +38,7 @@ for modname in ( "braginskii", "collisions", + "densities", "dielectric", "dimensionless", "distribution", diff --git a/plasmapy/formulary/densities.py b/plasmapy/formulary/densities.py new file mode 100644 index 0000000000..42299a192e --- /dev/null +++ b/plasmapy/formulary/densities.py @@ -0,0 +1,57 @@ +"""Functions to calculate plasma density parameters.""" +__all__ = [ + "critical_density", +] + +import astropy.units as u + +from astropy.constants.si import e, eps0, m_e + +from plasmapy.utils.decorators import validate_quantities + + +@validate_quantities( + omega={"can_be_negative": False}, + validations_on_return={ + "units": [u.m**-3], + }, +) +def critical_density(omega: u.rad / u.s) -> u.m**-3: + r"""Calculate the plasma critical density for a radiation of a given frequency. + + Parameters + ---------- + omega: `~astropy.units.Quantity` + The radiation frequency in units of angular frequency. + + Returns + ------- + n_c : `~astropy.units.Quantity` + The plasma critical density. + + Notes + ----- + The critical density for a given frequency of radiation is + defined as the value at which the electron plasma frequency equals + the frequency of the radiation. + + The critical density is given by the formula + + .. math:: + n_{c}=\frac{m_{e}\varepsilon_0\omega^{2}}{e^{2}} + + where :math:`m_{e}` is the mass of an electron, + :math:`\varepsilon_0` is the permittivity of free space, :math:`\omega` + is the radiation frequency, and :math:`e` is the elementary charge. + + Examples + -------- + >>> from astropy import units as u + >>> critical_density(5e15 * u.rad/u.s) + + + """ + + n_c = m_e * eps0 * omega**2 / (e**2) + + return n_c.to(u.m**-3, equivalencies=u.dimensionless_angles()) diff --git a/plasmapy/formulary/tests/test_densities.py b/plasmapy/formulary/tests/test_densities.py new file mode 100644 index 0000000000..e5352cf65a --- /dev/null +++ b/plasmapy/formulary/tests/test_densities.py @@ -0,0 +1,35 @@ +"""Tests for functionality contained in `plasmapy.formulary.frequencies`.""" +import astropy.units as u +import numpy as np +import pytest + +from plasmapy.formulary.densities import critical_density +from plasmapy.formulary.frequencies import plasma_frequency + + +class TestCriticalDensity: + """Test the plasma_critical_density function in densities.py.""" + + n_i = 5e19 * u.m**-3 + omega = plasma_frequency(n=n_i, particle="e-") + + @pytest.fixture() + def n_c(self): + """Get the critical density for the example frequency""" + return critical_density(self.omega) + + def test_units(self, n_c): + """Test the return units""" + + assert n_c.unit.is_equivalent(u.m**-3) + + def test_value(self, n_c): + """ + Compare the calculated critical density with the expected value. + + The plasma critical density for a given frequency of radiation is + defined as the value at which the electron plasma frequency equals + the frequency of the radiation. + """ + + assert np.isclose(n_c.value, self.n_i.value)