Skip to content

Commit 26b9e51

Browse files
Getahun-yw-Mahlpre-commit-ci[bot]namurphy
authored
created intensity function (PlasmaPy#3032)
* created intensity function * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add changelog entry * fix formatting * fix units and formatting * add tests for intensity function * fix parameter for test_intensity_errors * fix formatting * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix units in documentation * Update src/plasmapy/formulary/laser.py Co-authored-by: Nick Murphy <namurphy@users.noreply.github.com> * Update src/plasmapy/formulary/laser.py Co-authored-by: Nick Murphy <namurphy@users.noreply.github.com> * Update src/plasmapy/formulary/laser.py Co-authored-by: Nick Murphy <namurphy@users.noreply.github.com> * Update src/plasmapy/formulary/laser.py Co-authored-by: Nick Murphy <namurphy@users.noreply.github.com> --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Nick Murphy <namurphy@users.noreply.github.com>
1 parent 1f8e45d commit 26b9e51

File tree

3 files changed

+93
-2
lines changed

3 files changed

+93
-2
lines changed

changelog/3032.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Added the second function to `plasmapy.formulary.laser`, `~plasmapy.formulary.laser.intensity`, which calculates intensity from the electric field amplitude.

src/plasmapy/formulary/laser.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88

99
__all__ = [
1010
"electric_field_amplitude",
11+
"intensity",
1112
]
12-
__aliases__ = ["E0_"]
13+
__aliases__ = ["E0_", "I_"]
1314

1415
import astropy.units as u
1516
import numpy as np
@@ -68,3 +69,53 @@ def electric_field_amplitude(
6869

6970
E0_ = electric_field_amplitude
7071
"""Alias to `~plasmapy.formulary.laser.electric_field_amplitude`."""
72+
73+
74+
@validate_quantities(
75+
electric_field_amplitude={"can_be_negative": False},
76+
)
77+
def intensity(
78+
electric_field_amplitude: u.Quantity[u.V / u.m],
79+
) -> u.Quantity[u.watt / u.m**2]:
80+
r"""
81+
Calculate the intensity :math:`I` of a laser from the
82+
electric field amplitude :math:`E_0`.
83+
84+
The intensity of an electromagnetic plane wave in vacuum
85+
is calculated using:
86+
87+
.. math::
88+
I=\frac{1}{2} c ε_0 E_0^2,
89+
90+
where :math:`c` is the speed of light and
91+
:math:`ε_0` is the permittivity of free space.
92+
93+
**Aliases:** `I_`
94+
95+
Parameters
96+
----------
97+
electric_field_amplitude: `~astropy.units.Quantity`
98+
Electric field amplitude of an electromagnetic plane wave
99+
(convertible to V / m).
100+
101+
Returns
102+
-------
103+
Int : `~astropy.units.Quantity`
104+
Intensity for the electric field amplitude provided.
105+
106+
Notes
107+
-----
108+
For details, see :cite:t:`ling:2016`\ .
109+
110+
Examples
111+
--------
112+
>>> import astropy.units as u
113+
>>> intensity(0.8680211 * u.V / u.m)
114+
<Quantity 0.001 W / m2>
115+
"""
116+
117+
return (1 / 2) * c * eps0 * electric_field_amplitude**2
118+
119+
120+
I_ = intensity
121+
"""Alias to `~plasmapy.formulary.laser.intensity`."""

tests/formulary/test_laser.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import pytest
66
from astropy.tests.helper import assert_quantity_allclose
77

8-
from plasmapy.formulary.laser import E0_, electric_field_amplitude
8+
from plasmapy.formulary.laser import E0_, I_, electric_field_amplitude, intensity
99

1010

1111
@pytest.mark.parametrize(
@@ -50,8 +50,47 @@ def test_electric_field_amplitude_warnings(intensity, expected_warning) -> None:
5050
("alias", "parent"),
5151
[
5252
(E0_, electric_field_amplitude),
53+
(I_, intensity),
5354
],
5455
)
5556
def test_aliases(alias, parent) -> None:
5657
"""Test all aliases defined in laser.py"""
5758
assert alias is parent
59+
60+
61+
@pytest.mark.parametrize(
62+
("electric_field_amplitude", "expected"),
63+
[
64+
(0.8680211 * u.V / u.m, 1e-3 * u.watt / u.m**2),
65+
([0.8680211, 0] * u.V / u.m, [1, 0] * u.milliWatt / u.m**2),
66+
(np.nan * u.V / u.m, np.nan * u.watt / u.m**2),
67+
],
68+
)
69+
@pytest.mark.filterwarnings("ignore::astropy.units.UnitsWarning")
70+
def test_intensity(electric_field_amplitude, expected) -> None:
71+
result = intensity(electric_field_amplitude=electric_field_amplitude)
72+
assert_quantity_allclose(result, expected, rtol=1e-6, equal_nan=True, verbose=True)
73+
assert result.unit == u.Watt / u.m**2
74+
75+
76+
@pytest.mark.parametrize(
77+
("electric_field_amplitude", "expected"),
78+
[
79+
(-5e4 * u.V / u.m, ValueError),
80+
(1 * u.kg, u.UnitTypeError),
81+
],
82+
)
83+
def test_intensity_errors(electric_field_amplitude, expected) -> None:
84+
with pytest.raises(expected):
85+
intensity(electric_field_amplitude=electric_field_amplitude)
86+
87+
88+
@pytest.mark.parametrize(
89+
("electric_field_amplitude", "expected_warning"),
90+
[
91+
(5, u.UnitsWarning),
92+
],
93+
)
94+
def test_intensity_warnings(electric_field_amplitude, expected_warning) -> None:
95+
with pytest.warns(expected_warning):
96+
intensity(electric_field_amplitude=electric_field_amplitude)

0 commit comments

Comments
 (0)