differt.em.Dipole#
- class Dipole(frequency, num_wavelengths=0.5, *, length=None, moment=Array([0., 0., 1.], dtype=float32), current=1.0, charge=None, center=Array([0., 0., 0.], dtype=float32), look_at=None)[source]#
Bases:
AntennaA simple electrical (or Hertzian) dipole.
Equations were obtained from [17, 18, 19, 20], and assume a constant current across the dipole length.
- Parameters:
frequency (
Float[ArrayLike, '']) – The frequency at which the antenna is operating.num_wavelengths (
Float[ArrayLike, '']) – The length of the dipole, relative to the wavelength.length (
Float[ArrayLike, '']|None) – The absolute length of the dipole, supersedesnum_wavelengths.moment (
Float[ArrayLike, '3']|None) –The dipole moment.
By default, the dipole is aligned with the z-axis.
current (
Float[ArrayLike, '']|None) –The current (in A) flowing in the dipole.
If this is provided, which is the default, only the direction of the moment vector is used, and its intensity is set to match the dipole moment with specified current.
charge (
Float[ArrayLike, '']|None) –The dipole charge (in Coulomb), assuming opposite charges on either ends of the dipole.
If this is provided, this takes precedence over
current.center (
Float[ArrayLike, '3']) – The center position of the antenna, from which the fields are radiated.look_at (
Float[ArrayLike, '3']|None) –When provided, re-orient the antenna to look at the given point.
This overrides the direction of the dipole moment.
Examples
The following example shows how to plot the radiation pattern (antenna power) at 1 meter.
>>> from differt.em import Dipole >>> >>> ant = Dipole(frequency=1e9) >>> fig = ant.plot_radiation_pattern(backend="plotly") >>> fig
The second example shows how to plot the radiation pattern (antenna power) at 1 meter, but only in the x-z plane, for multiple dipole lengths.
>>> from differt.em import Dipole >>> >>> theta = jnp.linspace(0, 2 * jnp.pi, 200) >>> r = jnp.stack( ... (jnp.cos(theta), jnp.zeros_like(theta), jnp.sin(theta)), axis=-1 ... ) >>> fig = plt.figure() >>> ax = fig.add_subplot( ... projection="polar", facecolor="lightgoldenrodyellow" ... ) >>> for ratio in [0.5, 1.0, 1.25, 1.5, 2.0]: ... ant = Dipole(1e9, ratio) ... power = jnp.linalg.norm(ant.poynting_vector(r), axis=-1) ... _ = ax.plot(theta, power, label=rf"$\ell/\lambda = {ratio:1.2f}$") >>> >>> ax.tick_params(grid_color="palegoldenrod") >>> ax.set_rscale("log") >>> angle = jnp.deg2rad(-10) >>> ax.legend( ... loc="upper left", ... bbox_to_anchor=(0.5 + jnp.cos(angle) / 2, 0.5 + jnp.sin(angle) / 2), ... ) >>> plt.show()
The third example shows how to orient the antenna to look at a given point.
>>> from differt.em import Dipole >>> >>> ant = Dipole(frequency=1e9, look_at=jnp.array([0.0, -1.0, -1.0])) >>> fig = ant.plot_radiation_pattern(backend="plotly") >>> fig
Attributes
The angular frequency \(\omega = 2 \pi f\).
The aperture \(A\) of an isotropic antenna.
The period \(T = 1/f\).
The reference power (W) radiated by this antenna.
The wavelength \(\lambda = c / f\).
The wavenumber \(k = \omega / c\).
Dipole length (in meter).
Dipole moment (in Coulomb-meter).
The frequency \(f\) at which the antenna is operating.
The center position of the antenna, from which the fields are radiated.
Methods
directive_gain([num_points])Compute an estimate of the antenna directive gain.
directivity([num_points])Compute an estimate of the antenna directivity for azimuthal and elevation angles.
fields(r[, t])Compute electric and magnetic fields in vacuum at given position and (optional) time.
plot_radiation_pattern([num_points, ...])Plot the radiation pattern (normalized power) of this antenna.
poynting_vector(r[, t])Compute the Poynting vector in vacuum at given position and (optional) time.
Detailed documentation
-
center:
Float[Array, '3']# The center position of the antenna, from which the fields are radiated.
Default value is the origin.
- directive_gain(num_points=int(1e2))[source]#
Compute an estimate of the antenna directive gain.
Note
Subclasses may provide a more accurate or exact implementation.
- Parameters:
num_points (
int) – The number of points used for the estimate.- Return type:
- Returns:
The antenna directive gain.
See also
- directivity(num_points=int(1e2))[source]#
Compute an estimate of the antenna directivity for azimuthal and elevation angles.
Note
Subclasses may provide a more accurate or exact implementation.
- Parameters:
num_points (
int) –The number of points to sample along the elevation axis.
Twice this number of points are sampled on the azimuthal axis.
- Return type:
tuple[Float[Array, '2*{num_points}'],Float[Array, '{num_points}'],Float[Array, '2*{num_points} {num_points}']]- Returns:
Azimuthal and elevation angles, as well as corresponding directivity values.
See also
- fields(r, t=None)[source]#
Compute electric and magnetic fields in vacuum at given position and (optional) time.
- Parameters:
r (
Float[ArrayLike, '*#batch 3']) – The array of positions.t (
Float[ArrayLike, '*#batch']|None) –The array of time instants.
If not provided, initial time instant is assumed.
- Return type:
tuple[Inexact[Array, '*batch 3'],Inexact[Array, '*batch 3']]- Returns:
The electric \(\vec{E}\) and magnetic \(\vec{B}\) fields.
Fields can be either real or complex-valued.
-
frequency:
Float[Array, '']# The frequency \(f\) at which the antenna is operating.
-
length:
Float[Array, '']# Dipole length (in meter).
-
moment:
Float[Array, '3']# Dipole moment (in Coulomb-meter).
- plot_radiation_pattern(num_points=int(1e2), distance=1.0, num_wavelengths=None, **kwargs)[source]#
Plot the radiation pattern (normalized power) of this antenna.
The power is computed on points on a sphere around the antenna.
- Parameters:
num_points (
int) –The number of points to sample along the elevation axis.
Twice this number of points are sampled on the azimuthal axis.
distance (
Float[ArrayLike, '']) – The distance from the antenna at which power samples are evaluated.num_wavelengths (
Float[ArrayLike, '']|None) – If provided, supersedesdistanceby setting the distance relatively to thewavelength.kwargs (
Any) – Keyword arguments passed todraw_surface.
- Return type:
- Returns:
The resulting plot output.
- poynting_vector(r, t=None)[source]#
Compute the Poynting vector in vacuum at given position and (optional) time.
- Parameters:
r (
Float[ArrayLike, '*#batch 3']) – The array of positions.t (
Float[ArrayLike, '*#batch']|None) –The array of time instants.
If not provided, initial time instant is assumed.
- Return type:
- Returns:
The Poynting vector \(\vec{S}\).
It can be either real or complex-valued.