Far-field projection¶
Substrate projections: substantial measured error
An open plane or box over a substrate is an approximation. In this guide's dipole cases at substrate index 1.45, the pattern error is 13.5 to 21.6 % of the peak within 30 degrees, and the cone-power error is about 3 to 17 %. The range covers the open box and planes with and without a window, not one plane configuration. Higher substrate indices are outside what was measured.
Settings: vacuum wavelength 1 µm; dipole 0.48 µm above the interface;
uniform mesh at 20 / 30 cells per substrate wavelength; flat interface
on a grid line; subpixel averaging on, subpixel_method="contour";
no dispersion; PML one substrate wavelength thick; at most 100 periods
with the default shutoff. See the surface comparisons and cone
angles before using a substrate result.
A monitor records the field close to a device. An antenna, a grating
coupler or a metalens is judged by the light far away. far_field carries
a recorded surface to the far zone. It turns the tangential E and H on the
surface into equivalent surface currents and integrates what they radiate.
The result holds the far-field amplitudes, the intensity, the radiated
power and the directivity.
This guide declares a surface, projects it, reads the labelled results and puts a recorded plane's E and H on common points. It then says when an open surface holds, what the warnings mean and how accurate the projection is. Every call is documented in Far field and diffraction.
The subpixel setting subpixel_method="contour" has an exact geometric
fill only for boxes and vertical polygons. Cylinders and spheres use the
supersampled fill.
Declare the surface¶
Declare the surface in the simulation with ph.FarFieldMonitor. A box
encloses the sources. A plane looks into one half space.
import numpy as np
import photonhub as ph
from photonhub.analysis import far_field
ff = ph.FarFieldMonitor.box("ff", center_um=(0, 0, 0), size_um=(4, 4, 3),
wlens_um=[1.50, 1.55, 1.60])
up = ph.FarFieldMonitor.plane("up", axis="z", position_um=1.2, direction="+",
wlens_um=1.55, pts_per_wlen=10)
sim = ph.Simulation(..., monitors=[ff, up])
data = ph.run_local(sim)
The simulation records the surface the way far_field reads it best:
- A box becomes six field monitors,
ff.x_minustoff.z_plus. Each records the four tangential components at every cell, one cell thick along its normal and one cell past the box in its plane. The solver stores E and H half a cell apart; the two samples along the normal letfar_fieldbring them onto one surface. - A plane becomes one monitor,
up.z_plus. It spans the domain inside the PML unless you givesize_umwithcenter_um.pts_per_wlensets an in-plane stride that keeps that many samples per wavelength in the plane's medium. - Each face sits on the grid line nearest its declared plane.
- The run keeps the recipe in
client.jsonbeside its results: the faces, their outward normals, the medium they sit in, and any symmetry planes, faces left out and edge window.
Building the simulation refuses a surface the projection cannot read, and names the face. It refuses a face in a PML or absorber layer, a face across a structure or a medium boundary, and faces in different media. It refuses a medium that is anisotropic, custom, PEC or lossy (a loss tangent above 1e-3). The build also warns: see Warnings.
Symmetry planes. Declare the box across a symmetry plane, centred on it
or starting on it. The simulation records only the kept part, and
far_field mirrors it back. A box or a plane that does not reach a
symmetry plane, or crosses it off centre, is refused.
Open boxes and windows. exclude=("-z",) leaves out the box face whose
outward normal is -z, for example above a substrate. window=(0.2, 0.2)
on a plane scales the currents by sin² over the outer 20 % of the plane at
each end, along both in-plane axes. The window is off by default, and a box
refuses it. Read When an open surface holds
before you use either.
Project¶
theta = np.linspace(0.0, np.pi, 91)
phi = np.linspace(0.0, 2 * np.pi, 72, endpoint=False)
pat = far_field(data, "ff", theta_rad=theta, phi_rad=phi)
far_field finds the faces by the monitor's name. It projects into the
medium the faces sit in. Pass n_medium to override it: an index, not a
permittivity. The medium must be homogeneous and lossless; a loss tangent
above 1e-3 is refused. A layered half space, such as a cladding over a
substrate, is outside the model. Record a plane in each half space instead.
Give one target grid per call:
| Target grid | Arguments | Result dims |
|---|---|---|
| Directions | theta_rad, phi_rad |
(f, theta, phi) |
| Direction cosines | ux, uy |
(f, ux, uy) |
| Points on a plane | plane_axis, plane_um, x_um, y_um |
(f, x, y) on a plane normal to z |
| Paired points | any of the above with mesh=False |
(f, point) |
theta_radis the polar angle from +z;phi_radthe azimuth from +x.uxanduyare direction cosines along the two in-plane axes ofplane_axis, in xyz order. A plane uses its own normal and side. A box needsplane_axis=, anddirection="-"for the half space below it. A point withux² + uy² > 1has no direction: its fields arenanand its intensity 0.- On a plane over one period of a periodic structure, the point
u = mλ/(nL)is the direction of grating orderm. The order's power isU (λ/n)² / (A cos θ)in W, withUthe intensity there,Athe period's area in m² andθthe angle from the plane's normal. To compare it withdiffraction_orders, mind two conventions. That function's(k1, k2)run along itsin_plane_axesin cyclic order, so on a plane normal to y itsk1isuyand itsk2isux, times the wavenumber. Its order powers carry the period's area in µm², 1e12 times the watts of the formula. x_umandy_umrun along the plane's two in-plane axes, in xyz order. Each point reads the direction it lies in fromorigin_um, the surface's centre by default. Passorigin_umto compare two runs.
The field at a finite distance. The far-field approximation drops the
terms that fall faster than 1/r. exact=True evaluates the field the
currents radiate at each point with the full Green's function of the
medium:
xs = ys = np.linspace(-10.0, 10.0, 81) # um
spot = far_field(data, "ff", plane_axis="z", plane_um=20.0,
x_um=xs, y_um=ys, exact=True)
sphere = far_field(data, "ff", theta_rad=theta, phi_rad=phi,
exact=True, r_um=5.0)
A meshed grid of points on a plane parallel to an evenly sampled recorded plane uses that plane's angular spectrum. Anything else, and a spectrum that does not settle within its padding, sums over every recorded sample, so its cost grows as the number of points times the number of samples.
Read the results¶
far_field returns a FarField. Its dataset is an xarray.Dataset
labelled by frequency and by the grid's own axes. Along f every array
carries the vacuum wavelength wlen_um and the index n_medium.
ds = pat.dataset
f = float(ds["f"][1]) # Hz, the middle wavelength, 1.55 um
U = ds["intensity"].sel(f=f) # W/sr, dims (theta, phi)
D = ds["directivity"].sel(f=f, phi=0.0) # 4 pi U / P, the phi = 0 cut
P = ds["radiated_power"] # W, one per frequency
e_thetaande_phi(V) are the far-field amplitudes, with thee^{ikr}/rspreading removed. An exact projection addse_r,h_r,h_thetaandh_phi.intensity(W/sr) is the power per unit solid angle.radiated_power(W) anddirectivitycome on a meshed angle grid. The power integrates over the grid's directions, so it is the total only when the grid covers the whole sphere, or the whole half space a plane faces.
The methods return labelled results too:
| Call | What it gives |
|---|---|
pat.gain(p_in) |
4πU / P_in. Pass the power the source delivers. |
pat.cross_section() |
dσ/dΩ = U / I_inc in µm²/sr. A run driven by one TFSFBox supplies I_inc; otherwise pass it. |
pat.polarization("ludwig3") |
Co- and cross-polar amplitudes, Ludwig's third definition, about +z by default on an angle grid; undefined opposite the boresight. |
pat.polarization("circular") |
Right- and left-hand amplitudes, IEEE handedness with e^{-iωt}. |
pat.renormalize(distance_um) |
A copy read at that distance, for power_density() (W/m²) and cartesian() (Ex ... Hz). |
ph.viz.plot_far_field_cut(pat, phi_rad=0.0, freq_hz=f) |
A polar cut through phi and phi + π. |
ph.viz.plot_far_field_map(pat, freq_hz=f) |
A map over direction cosines, or over a Cartesian plane. |
On an angle grid, Ludwig-3 defaults to the +z boresight even when the
recorded plane faces downward. Its basis is undefined opposite the
boresight. For numerical stability, co and cross are nan throughout
the small antipodal neighborhood 1 + r_hat.dot(boresight_hat) <= 1e-12,
where both vectors are unit vectors. With boresight="+z", this includes
theta = pi and directions within approximately 1.4e-6 radians of it.
The SDK emits a UserWarning identifying the selected boresight when
requested directions enter this neighborhood. A NumPy sum that includes
those samples is also nan; the finite circular amplitudes at the same
directions do not indicate a field-projection failure. For a
downward hemisphere, choose boresight="-z", reference="x" explicitly. This puts the
masked neighborhood around theta = 0, outside that hemisphere. For a
full sphere, partition the directions and choose a boresight for each
hemisphere. The full-sphere grid above includes an undefined pole for
either choice. Changing the boresight changes the co/cross basis.
Polarization methods return amplitudes, so a sum of their squared
magnitudes is not an integrated power share. Integrate with the solid-angle
weight sin(theta) dtheta dphi, then normalize. For a downward pattern
down on an increasing theta grid from pi/2 to pi and a uniformly
spaced full azimuth grid with endpoint=False:
pol = down.polarization("ludwig3", boresight="-z", reference="x")
angular_power = (
(abs(pol)**2 * np.sin(pol["theta"])).mean("phi") * (2 * np.pi)
).integrate("theta")
total = angular_power["co"] + angular_power["cross"]
co_share = angular_power["co"] / total
cross_share = angular_power["cross"] / total
This gives one share per frequency. The common factor 1 / (2 eta)
cancels in the shares; divide angular_power by 2 eta for watts, using
the projected medium's impedance at each frequency. The azimuth mean
above covers the periodic interval without duplicating its endpoint.
The plots draw one frequency. With several, pick it with freq_hz=; the
plot takes the projected frequency nearest it.
The projection cannot tell how much power the source delivers, so gain
requires it. Measure it with PowerMonitor planes that close a small box
centred on the source. Off centre, the box's total is off by an amount
first order in the cell size times the offset. A dipole's own analytic
power holds only when it sits alone in a homogeneous lossless medium.
Earlier releases returned flat arrays indexed [frequency, point]. They
still work for one release, with a FutureWarning that names the
replacement. For example, pat.reshape(theta.size, phi.size)["intensity"][0]
becomes pat.dataset["intensity"].isel(f=0).values, the same numbers.
Near fields on a recorded plane¶
The solver records each field component at its own point in the cell.
data[name] labels them all with the cell's corner. A product such as
E × H* read at those labels is wrong at first order in the cell.
colocated_fields puts every component on the same points:
from photonhub.analysis import colocated_fields
nf = colocated_fields(data, "ff.z_plus") # dims (f, x, y)
sz = 0.5 * np.real(nf["Ex"] * np.conj(nf["Hy"]) - nf["Ey"] * np.conj(nf["Hx"]))
It reads a ProfileMonitor plane, a FarFieldMonitor face such as
"ff.z_plus" (every cell, one cell thick), or a FarFieldMonitor plane by
its own name. In the plane, a component half a cell off a grid point is
interpolated linearly from the two samples either side. A plane recorded
with a stride (pts_per_wlen, every s cells) is interpolated across the
stride, about 2s - 1 times less accurately: for a product of E and H,
record every cell. Along the normal, a plane recorded one cell thick
has E and H on one surface. Every FarFieldMonitor face is. A plane with
one sample keeps H half a cell above E, and warns when it holds both.
Record a plane one cell thick for any product of E and H. On a uniform
mesh, give it the size dl along its normal, centred at (k + 3/4) dl.
Keep it clear of sources: the interpolation's error grows fast near one.
On a dipole's exact field (λ = 1 µm), a plane recorded one cell thick
reads each component within 2.2 % of its peak at 20 cells per wavelength
and 0.59 % at 40 when it lies 0.3 to 0.6 µm from the dipole, but 32 to 62 %
and 9.5 to 13 % when it lies 0.09 µm away. For the power alone, a
PowerMonitor is exact on the solver's grid. To project a surface, use
far_field, which reads each component where it was recorded.
When an open surface holds¶
A closed box in one medium sees all the light. An open box and a single plane are truncated surfaces. Each reads the pattern well only where the field it cuts off is small, such as a beam that has died out well inside the plane's edges. A point dipole's field is not small there, and the error shows even straight ahead.
Measured on a dipole in a medium of index 1.45 at λ0 = 1 µm, at 20 / 30 cells per wavelength in the medium (uniform mesh, PML one medium wavelength thick, no structures and so no subpixel averaging, no dispersion, at most 100 periods with the default shutoff), against a closed box 0.62 µm around the dipole, as a fraction of the peak:
| Open surface | Within 30° | Within 60° |
|---|---|---|
| Plane 0.62 µm away, 2.41 µm half width, no window | 36.8 / 36.1 % | 41.4 / 42.2 % |
| The same plane, window 0.2 | 14.2 / 14.8 % | 33.6 / 33.7 % |
| The same plane, window 0.4 | 7.8 / 7.5 % | 57.2 / 58.1 % |
| Box 0.62 µm half width, one face left out (its closed side) | 10.2 / 10.1 % | 22.9 / 22.8 % |
The dipole's exact fields on the same surfaces read about the same (35 %, 15 % and 7.3 % for the plane; 10.2 % and 22.9 % for the box): the differences belong to the open surfaces, not to the solver. The power within a cone reads closer in one medium: within 2 % for the open box, up to 7.4 % for the plane. Where the open edge is declared matters. Moving the open box's declared edge by one cell, at 20 cells per wavelength, moved its pattern by 8.5 % of the peak within 30°.
Over a substrate the cone power is off too. The scene: a dipole 0.48 µm
above a half space of index 1.45, vacuum above, λ0 = 1 µm; 20 / 30 cells
per substrate wavelength on a uniform mesh; the substrate's flat top on a
grid line, with the default subpixel averaging (subpixel_method="contour");
no dispersion; PML one
substrate wavelength thick; at most 100 periods with the default shutoff.
Against the closed form of a dipole above a half space:
- the box open toward the substrate, its open edge 0.14 µm above it, reads the upper half space 13.7 / 13.5 % of the peak off within 30°, and its cone power by +3.9 / +3.5 % within 30° and -10.8 / -10.8 % within 80°;
- a plane at the box's top reads 21.6 / 21.3 % off within 30° (14.1 / 14.0 % with a window of 0.4), and the windowed plane's cone power is off by +17.1 / +16.6 % within 30°.
A wider plane with a window helps fast. On the dipole's exact fields in index 1.45, at 20 cells per medium wavelength, a plane 0.9 medium wavelengths from the dipole with a half width of 14 medium wavelengths and a window of 0.2 reads within 0.27 % of the peak within 30°. Toward the plane's edge the window costs accuracy: within 60°, 7.3 % with a window of 0.2 and 2.4 % with 0.4. A larger open box helps much less: on the same exact fields, 10.2 %, 10.8 %, 8.5 % and 6.9 % within 30° of its closed side at half widths of 0.9, 1.8, 3.6 and 7.2 medium wavelengths.
So:
- Close the box in one medium wherever the scene allows.
- Use an open surface for fields that fall off before its edges.
- For a dipole-like emitter in one medium, quote the power in a cone, not the pattern. Over a substrate the cone power is off by 3 to 17 % as well, so check it against a wider surface, a window or a second open-edge position.
- Declare an open box with
exclude=. A face list given by hand is read without its open edge.
Warnings¶
Far zone. On a grid of points, the far-field approximation reads each
point with the amplitude of its direction. It needs the point in the far
zone. far_field warns for points nearer than 2D²/λ, with D twice the
surface's farthest reach from origin_um and λ in the medium. There the
approximation's phase error passes π/8. Use exact=True closer in.
Near the surface. The exact projection loses accuracy close to the
currents. far_field warns for points within two sample spacings or a
tenth of a wavelength of them, whichever is farther. On a dipole's exact
fields on a box (an x dipole 0.14 µm off the centre of a box 1.2 µm wide,
vacuum, λ = 1 µm, uniform mesh) at 20 cells per wavelength, the error is 3
to 6 % of the peak one sample spacing out. Over the box's edges it grows on finer meshes:
up to 11 % at 40 cells and 21 % at 80, one spacing out. It refuses points
inside a box and points behind a plane. Directions of a plane's grid that
end at or behind it read nan, with a warning.
Near a face. Building the simulation warns when a source or a structure lies within 2 cells of a face's innermost sample, since the error grows sharply there. It measures each source where the solver runs it: a point dipole on the nearest grid point of its field component, which can be half a cell from where you placed it; a plane wave or mode source on the grid line it is injected on, with the row of its correction half a cell before it; and each face of a TF/SF box on its grid line, with that row half a cell outside the box. It warns when a face is closer than half a wavelength to a structure: the near field there is not radiation. On a graded mesh it warns when a box face is nearer than 0.35 wavelengths to a change of cell size, or a source nearer than 0.1 wavelengths to one (see On a graded mesh).
Medium and recipe. A result reloaded without its client.json
projects from the face names, with a warning, into vacuum unless you pass
n_medium. It reads the faces as recorded, with no open edge and no
window.
Accuracy¶
Each figure below is the worst over the stated directions, as a fraction of the pattern's peak, unless it says otherwise.
A closed box in vacuum¶
The error is second order in the cell: about 4x smaller per halving. For a point dipole in vacuum at λ0 = 1 µm and 25 cells per wavelength (uniform mesh, no structures and so no subpixel averaging, no dispersion, 25 PML layers, a box 1.2 wavelengths wide, at most 200 periods with the default shutoff), the front/back asymmetry is 0.1 % with the dipole half a cell from the box centre, up to about 0.80 % with the dipole near a box corner (0.10 to 0.12 µm from each of the three faces there) and up to about 1.06 % near a box edge, two faces near and the third coordinate centred: the worst measured over the placements the build does not warn about. The bound is 2 % of the peak wherever the build does not warn. The radiated power stays within 0.21 % of the near-field flux at every placement measured.
In a dielectric¶
Count the cells per medium wavelength, λ0/n, and use at least 30, where
the bound is 2 % of the peak wherever the build does not warn. The
solver's time step follows the vacuum limit, so at a fixed count the error
grows with the index. For the vacuum box above in a uniform medium, every
length scaled to the medium wavelength and every run to its 200-period
step cap, a dipole near a box edge (two
faces near, the third coordinate centred) reads up to 0.96 %, 1.07 %
and 1.11 % at index 1.5, 2.5 and 3.5 at 30 cells. The worst of 22 other
placements (both corners, both signs along each axis, four held three
cells from a face, and eight fixed in space) reads:
| Index | 25 cells | 30 cells | 35 cells |
|---|---|---|---|
| 1.5 | 0.96 % | 0.70 % | 0.53 % |
| 2.5 | 1.11 % | 0.81 % | 0.61 % |
| 3.5 | 1.15 % | 0.84 % | 0.64 % |
For a source fixed in space it falls as the square of the cell. The radiated power stays within 0.27 % of the near-field flux.
On a graded mesh¶
Count the cells per wavelength in the background and use at least 30. Keep every box face at least 0.35 wavelengths from the nearest grid line where the cell size changes, along its normal, on either side. Keep every source at least 0.1 wavelengths from one. End a refinement inside the box with that room to spare, or carry it that far past every face.
In that range, for the vacuum dipole box above (MeshOverride grading by
up to 1.4 per cell, no structures, no dispersion, PML one wavelength thick,
at most 100 periods), the front/back asymmetry stays within 2 % at 30
background cells per wavelength wherever the build does not warn. The
worst measured reads (the carried-past figures ran on the GPU solver,
which stops on energy decay alone and agrees with the CPU within 0.15 % of
each value):
| Refinement | Inside the box, near a box edge | Inside the box, at a box corner | Carried past every face |
|---|---|---|---|
| 2 times as fine | 0.90 % | 0.67 % | 0.13 % |
| 3 times as fine | 0.93 % | 0.71 % | 0.055 % |
It falls at about second order for a source fixed in space, and the radiated power stays within 0.24 % of the near-field flux. Higher ratios are not covered. Outside the range no bound is given. A source on or just past the edge of a refined region radiates an asymmetric field by itself: up to 1.085 % at 3 times as fine and 0.92 % at 2 times, at 30 background cells. A refined region that ends just outside a box face reads 1.79 %, 1.25 % and 0.92 % at 25, 30 and 35 background cells (2 times as fine, the worst of 33 placements).
Directivity and gain¶
On an Ex dipole in vacuum at λ = 1 µm (a FarFieldMonitor box of half
width 0.6 µm, uniform mesh, PML one wavelength thick, the default DFT
shutoff, no structures, no dispersion), the peak directivity reads 1.5156,
1.5067 and 1.5037 at 20, 30 and 40 cells per wavelength. The analytic value
is 1.5; the error falls at second order. The gain from six PowerMonitor
planes closing a box of half width 0.3 µm centred on the dipole reads
1.5166, 1.5070 and 1.5038.
Symmetry planes¶
A closed box in a run with symmetry planes projects as the full run does,
within the projection's own second-order error. On dipole boxes in vacuum
at 16 cells per wavelength (three cases: three planes; two planes; a graded
mesh), a closed FarFieldMonitor box reads 0.15 to 0.43 % of the peak
intensity away from the same declaration on the full run, and 0.04 to
0.10 % at 32 cells. The full run's far-side faces sit a cell nearer the
planes, since each face snaps to the grid line nearest its plane.
Open surfaces differ more. On exact fields in vacuum at λ = 1 µm and 16 cells per wavelength, of an Ex dipole 3.5 cells from the symmetry plane and, in the full run, its mirror image, about 0.5 µm below a plane 2 µm wide:
- without a window, the plane differs between the two runs by up to 7.5 % of the peak within 30°: its recorded block ends half a cell differently at one edge;
- with a window of 0.2, it reads the same to round-off;
- a box 1 µm wide, centred on the symmetry plane and open on one side, differs by 1.2 % within 30° of its closed side, 3.5 % over that hemisphere and 7.7 % on its open side.
Scattering cross sections¶
On a sphere of index 1.5 and radius 0.6 µm at λ = 1 µm (a 6 µm vacuum cube,
PML 0.5 µm, uniform mesh, the default subpixel averaging, no dispersion, a
TFSFBox of half width 1.25 µm, a FarFieldMonitor box of half width
1.75 µm), cross_section() reads within 0.96 %, 0.80 % and 0.68 % of the
Mie series' peak at 20, 25 and 30 cells per wavelength.
A sphere near a sharp resonance needs a long run. A sphere of index 2 and radius 1 µm in the same scene sits beside one: a 0.5 % lower index moves the series by 37 % of its peak. Once the pattern settles (1200 periods at 20 and 30 cells, 2400 at 25), it reads 3.8 %, 1.95 % and 1.4 % at 20, 25 and 30 cells per wavelength. After 100 to 300 periods it read 2.3 to 2.7 % at 25 cells. One frequency does not stand for the band: the 2400-period run at 25 cells reads 4.6 to 19.7 % at 0.9 to 1.1 times that frequency, each beside a mode the grid shifts.
Direction cosines and diffraction orders¶
On a 2-D grating at λ = 1 µm (a block of index 2 in a 2.1 × 1.5 µm vacuum
cell, a normal-incidence plane wave polarized along x, 11 orders leaving;
uniform mesh, the default
subpixel averaging, no dispersion, PML one wavelength thick, at most 100
periods with the default shutoff), the order powers read from a k-space
grid agree with diffraction_orders within 1.1e-4 at 20 cells per
wavelength and 3.8e-5 at 30. The order directions agree exactly.
The exact projection¶
On a dipole's exact fields on a box (an x dipole 0.14 µm off the centre of
a box 1.2 µm wide, vacuum, λ = 1 µm, uniform mesh), the exact field matches
the dipole's own from 5 to 320 µm to 0.52 to 0.57 % of the peak at 20 cells
per wavelength and 0.12 to 0.13 % at 40, and at 1.2 µm, just past the box's
corners, to 0.70 % and 0.16 %. On FDTD, the exact projection of a
FarFieldMonitor box of half width 0.6 µm around an Ex dipole onto a plane
1.5 µm above the dipole, 0.9 µm beyond the box, reads the field the solver
recorded there to 1.12 %, 0.51 % and 0.29 % of the peak at 20, 30 and 40
cells per wavelength, second order (vacuum, λ = 1 µm, uniform mesh, no
structures, no dispersion, PML one wavelength thick, at most 100 periods
with the default shutoff).
Near fields¶
On an Ex dipole in vacuum at λ = 1 µm (uniform mesh, PML 0.5 µm, no
structures, no dispersion), the power through a plane 0.6 µm above it, whose
edges reach
the PML, read from colocated_fields against a PowerMonitor on the same
plane:
| Cells per wavelength | 20 | 30 | 40 | 60 |
|---|---|---|---|---|
| Recorded one cell thick | -0.46 % | -0.21 % | -0.12 % | -0.052 % |
| Recorded with one sample | -2.0 % | -1.3 % | -0.91 % | -0.59 % |
The first row is second order. The second is first order, from where the plane meets the PML. A plane cut in the open loses about one cell's strip at its edges: -1.8 %, -1.1 %, -0.78 % and -0.50 % cut 1 µm from the dipole axis. Record such a plane a few cells wider than the region you integrate over.
On a dipole's exact field at λ = 1 µm, the interpolation reads each component of the plane, as a fraction of that component's peak:
| Plane | Recorded one cell thick | Recorded with one sample |
|---|---|---|
| 0.3 to 0.6 µm from the dipole, 20 cells per wavelength | 2.2 % | 1.9 % |
| 0.3 to 0.6 µm from the dipole, 40 cells per wavelength | 0.59 % | 0.47 % |
| 0.09 µm from the dipole, 20 cells per wavelength | 32 to 62 % | 24 to 34 % |
| 0.09 µm from the dipole, 40 cells per wavelength | 9.5 to 13 % | 8.0 to 9.7 % |
The near-source ranges cover the dipole's orientation and the plane's axis and side.
See also Known limitations.