From 5799f3ecbc89dd882e736195da513d75042f07df Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Thu, 23 Mar 2023 15:57:47 +0000 Subject: [PATCH 01/13] tutorial for nonaxisymmetric point-dipole sources in cylindrical coordinates --- .../Cylindrical_Coordinates.md | 23 +++ .../Local_Density_of_States.md | 2 +- .../cyl_nonaxisymmetric_source_flux_vs_m.png | Bin 0 -> 66967 bytes .../cyl_nonaxisymmetric_source_layout.png | Bin 0 -> 11632 bytes python/examples/nonaxisym_point_dipole_cyl.py | 157 ++++++++++++++++++ 5 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 doc/docs/images/cyl_nonaxisymmetric_source_flux_vs_m.png create mode 100644 doc/docs/images/cyl_nonaxisymmetric_source_layout.png create mode 100644 python/examples/nonaxisym_point_dipole_cyl.py diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index b3afbd60b..9c8a21060 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -585,3 +585,26 @@ Note that the volume specified in `get_farfields` via `center` and `size` is in Shown below is the far-field energy-density profile around the focal length for both the *r* and *z* coordinate directions for three lens designs with $N$ of 25, 50, and 100. The focus becomes sharper with increasing $N$ due to the enhanced constructive interference of the diffracted beam. As the number of zones $N$ increases, the size of the focal spot (full width at half maximum) at $z = 200$ μm decreases as $1/\sqrt{N}$ (see eq. 17 of the [reference](http://zoneplate.lbl.gov/theory)). This means that doubling the resolution (halving the spot width) requires quadrupling the number of zones. ![](../images/zone_plate_farfield.png#center) + +Non-axisymmetric Dipole Sources +------------------------------- + +In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting Diode (LED)](Local_Density_of_States.md#extraction-efficiency-of-a-light-emitting-diode-led), the extraction efficiency of the LED was computed using an axisymmetric point-dipole source at $r = 0$. This involved a single simulation with $m = \pm 1$. Simulating a point-dipole source at $r > 0$ is more challenging because it is nonaxisymmetric: any point source at $r > 0$ is equivalent to a ring source in cylindrical coordinates. In order to simulate a point-dipole source at $r > 0$, it is necessary to represent the $\delta(r)$ (Dirac delta function) current source as a Fourier-series expansion of the field angular dependence $\exp(im\phi)$. This computational approach involves two parts: (1) performing a series of simulations for $m = 0, 1, 2, ..., M$ where $M$ is the cutoff (described below), and (2) because of power orthogonality, summing the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. + +There are two useful features of this method: + +1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. For $m > M$, the field oscillations tend to be too rapid and the current source therefore does not radiate any power. As an example, a point dipole-source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would typically require 16 simulations. + +2. Each $m$-simulation is independent of the others. Each $m$-simulation can therefore be executed simultaneously using an embarassingly parallel approach. + +As a demonstration, we will repeat the calculation of the extraction efficiency of the LED using a point-dipole source at $r > 0$. The radiated flux of the point-dipole source (the numerator in the expression for the extraction efficiency) is computed using the Fourier--series-based method described above. A schematic of the simulation layout is shown below. + +![](../images/cyl_nonaxisymmetric_source_layout.png#center) + +![](../images/cyl_nonaxisymmetric_source_flux_vs_m.png#center) + +To convert the radiated flux at $r=0$ in cylindrical coordinates to 3d, the result must be multiplied by $2 / (\pi \Delta r)^2$ where $\Delta r$ is the grid size ($1/resolution$). + +The relationship between the radiated flux from a point dipole at $r = 0$ ($P(0)$) and $r > 0$ ($P(r)$) is $(\pi / (\Delta r)^2) P(0) = P(r) / (\pi r)^2$. + +The simulation script is in [examples/noaxisym_point_dipole_cyl.py](https://github.com/NanoComp/meep/blob/master/python/examples/nonaxisym_point_dipole_cyl.py). diff --git a/doc/docs/Python_Tutorials/Local_Density_of_States.md b/doc/docs/Python_Tutorials/Local_Density_of_States.md index fa9225629..540762de4 100644 --- a/doc/docs/Python_Tutorials/Local_Density_of_States.md +++ b/doc/docs/Python_Tutorials/Local_Density_of_States.md @@ -327,7 +327,7 @@ A more efficient approach to computing the total emitted power from the dipole i To demonstrate this feature of the LDOS, we will compute the extraction efficiency of an LED-like structure consisting of a point dipole embedded within a dielectric layer ($n$=2.4 and thickness 0.7 $\lambda/n$) surrounded by vacuum and positioned above an infinite ground plane of a lossless metal. We will compute the extraction efficiency (at a wavelength $\lambda$ = 1.0 μm for a dipole with polarization parallel to the ground plane) as a function of the height of the dipole source above the ground plane using two different coordinate systems — 3D Cartesian and cylindrical — and demonstrate that the results are equivalent (apart from discretization error). The key difference is that simulation using cylindrical (2D) coordinates is significantly faster and more memory efficient than 3D. -The simulation setup is shown in the figures below for 3D Cartesian (cross section in $xz$) and cylindrical coordinates. (Note that this single-dipole calculation differs from the somewhat related flux calculation in [Tutorials/Custom Source/Stochastic Dipole Emission in Light Emitting Diodes](Custom_Source.md#stochastic-dipole-emission-in-light-emitting-diodes) which involved modeling a *collection* of dipoles.) +The simulation setup is shown in the figures below for 3D Cartesian (cross section in $xz$) and cylindrical coordinates. (Note that this single-dipole calculation differs from the somewhat related flux calculation in [Tutorials/Custom Source/Stochastic Dipole Emission in Light Emitting Diodes](Custom_Source.md#stochastic-dipole-emission-in-light-emitting-diodes) which involved modeling a *collection* of dipoles.) In this example, the point-dipole source is positioned at $r=0$ which is relatively straightforward to set up. Non-axisymmetric dipoles (i.e., positioned at $r>0$), however, are more challenging because they involve combining the results of *multiple* (independent) simulations. For a demonstration, see [Cylindrical Coordinates/Non-axisymmetric Dipole Sources](Cylindrical_Cordinates.md#non-axisymmetric-dipole-sources). ![](../images/dipole_extraction_eff_3D.png#center) diff --git a/doc/docs/images/cyl_nonaxisymmetric_source_flux_vs_m.png b/doc/docs/images/cyl_nonaxisymmetric_source_flux_vs_m.png new file mode 100644 index 0000000000000000000000000000000000000000..ba968850ddb5a6669f5b15b80fb9d9fbb25d3cea GIT binary patch literal 66967 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 R)lK1_mBl{uGBdBU{{>EU*kJ$w literal 0 HcmV?d00001 diff --git a/doc/docs/images/cyl_nonaxisymmetric_source_layout.png b/doc/docs/images/cyl_nonaxisymmetric_source_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..971744522122880b92225edece444cceada62965 GIT binary patch literal 11632 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 literal 0 HcmV?d00001 diff --git a/python/examples/nonaxisym_point_dipole_cyl.py b/python/examples/nonaxisym_point_dipole_cyl.py new file mode 100644 index 000000000..9fa44a245 --- /dev/null +++ b/python/examples/nonaxisym_point_dipole_cyl.py @@ -0,0 +1,157 @@ +""" +Verifies that the radiated flux from a point dipole in a dielectric layer +above a lossless ground plane computed in cylindrical coordinates +is the same for a dipole placed at either r=0 or r≠0. +""" + +import argparse +import matplotlib + +matplotlib.use("agg") +import matplotlib.pyplot as plt +import meep as mp +import numpy as np + +parser = argparse.ArgumentParser() +parser.add_argument( + "-res", type=float, default=25.0, help="resolution (default: 25 pixels/um)" +) +parser.add_argument( + "-L", type=float, default=5.0, help="length of non-PML region (default: 5.0 um)" +) +parser.add_argument( + "-dpml", type=float, default=1.0, help="PML thickness in r and z (default: 1.0 um)" +) +args = parser.parse_args() + +resolution = args.res +L = args.L +dpml = args.dpml + +dair = 1.0 # thickness of air padding +n = 2.4 # refractive index of surrounding medium +wvl = 1.0 # wavelength (in vacuum) +fcen = 1 / wvl # center frequency of source/monitor + + +def radiated_flux(dmat: float, h: float, rpos: float, m: int) -> float: + """Computes the radiated flux of a point dipole embedded + within a dielectric layer above a lossless ground plane in + cylindrical coordinates. + + Args: + dmat: thickness of dielectric layer. + h: height of dipole above ground plane as fraction of dmat. + rpos: position of source in r direction. + m: angular φ dependence of the fields exp(imφ). + """ + sr = L + dpml + sz = dmat + dair + dpml + cell_size = mp.Vector3(sr, 0, sz) + + boundary_layers = [ + mp.PML(dpml, direction=mp.R), + mp.PML(dpml, direction=mp.Z, side=mp.High), + ] + + src_cmpt = mp.Er + src_pt = mp.Vector3(rpos, 0, -0.5 * sz + h * dmat) + sources = [ + mp.Source( + src=mp.GaussianSource(fcen, fwidth=0.1 * fcen), + component=src_cmpt, + center=src_pt, + ), + ] + + geometry = [ + mp.Block( + material=mp.Medium(index=n), + center=mp.Vector3(0, 0, -0.5 * sz + 0.5 * dmat), + size=mp.Vector3(mp.inf, mp.inf, dmat), + ) + ] + + sim = mp.Simulation( + resolution=resolution, + cell_size=cell_size, + dimensions=mp.CYLINDRICAL, + m=m, + boundary_layers=boundary_layers, + sources=sources, + geometry=geometry, + ) + + flux_air_z = sim.add_flux( + fcen, + 0, + 1, + mp.FluxRegion( + center=mp.Vector3(0.5 * L, 0, 0.5 * sz - dpml), + size=mp.Vector3(L, 0, 0), + ), + ) + + flux_air_r = sim.add_flux( + fcen, + 0, + 1, + mp.FluxRegion( + center=mp.Vector3(L, 0, 0.5 * sz - dpml - 0.5 * dair), + size=mp.Vector3(0, 0, dair), + ), + ) + + sim.run( + until_after_sources=mp.stop_when_fields_decayed( + 50.0, + src_cmpt, + src_pt, + 1e-8, + ), + ) + + flux_z = mp.get_fluxes(flux_air_z)[0] + flux_r = mp.get_fluxes(flux_air_r)[0] + flux_tot = flux_r + flux_z + print(f"flux:, {flux_r:.10f}, {flux_z:.10f}, {flux_tot:.10f}") + + return flux_tot + + +if __name__ == "__main__": + layer_thickness = 0.7 * wvl / n + dipole_height = 0.5 + + # r = 0 + rpos = 0 + m = +1 + ref_out_flux = radiated_flux( + layer_thickness, + dipole_height, + rpos, + m, + ) + print(f"flux0-m:, {m}, {ref_out_flux}") + + # r ≠ 0 + rpos = 1.0 + # empirical + cutoff_M = lambda rp: int(16 * rp + 8) + # analytic + # cutoff_M = int(2 * rp * 2 * np.pi * fcen * n) + 2 + ms = range(cutoff_M(rp) + 1) + out_flux = [] + for m in ms: + out_flux.append( + radiated_flux( + layer_thickness, + dipole_height, + rp, + m, + ) + ) + print(f"flux1-m:, {rp}, {m}, {out_flux[-1]}") + + flux_sum = out_flux[0] + 2 * sum(out_flux[1:]) + print(f"flux1:, {rp}, {flux_sum:.8f}") From 76b6609a4fbd7d4dfa1e74320160c0ef8a215b52 Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Thu, 30 Mar 2023 05:37:22 +0000 Subject: [PATCH 02/13] add results comparing radiated flux obtained from LED simulation in cylindrical coordinates to 3d --- .../Cylindrical_Coordinates.md | 168 +++++++++++++++++- .../Local_Density_of_States.md | 2 +- python/examples/nonaxisym_point_dipole_cyl.py | 121 +++++++------ 3 files changed, 230 insertions(+), 61 deletions(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 9c8a21060..6f1352575 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -595,7 +595,7 @@ There are two useful features of this method: 1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. For $m > M$, the field oscillations tend to be too rapid and the current source therefore does not radiate any power. As an example, a point dipole-source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would typically require 16 simulations. -2. Each $m$-simulation is independent of the others. Each $m$-simulation can therefore be executed simultaneously using an embarassingly parallel approach. +2. Each $m$-simulation is independent of the others. The simulations can therefore be executed simultaneously using an embarassingly parallel approach. As a demonstration, we will repeat the calculation of the extraction efficiency of the LED using a point-dipole source at $r > 0$. The radiated flux of the point-dipole source (the numerator in the expression for the extraction efficiency) is computed using the Fourier--series-based method described above. A schematic of the simulation layout is shown below. @@ -607,4 +607,170 @@ To convert the radiated flux at $r=0$ in cylindrical coordinates to 3d, the resu The relationship between the radiated flux from a point dipole at $r = 0$ ($P(0)$) and $r > 0$ ($P(r)$) is $(\pi / (\Delta r)^2) P(0) = P(r) / (\pi r)^2$. +Combining these two sets of results, to convert the radiated flux at $r > 0$ in cylindrical coordinates to 3d, the result must be multiplied by $2 / (\pi^5 * r^2)$. + +As a demonstration, we compute the radiated flux from the dipole at three different locations in the LED ($r = 0$ and $r > 0$). The results from the simulation in cylindrical coordinates are compared to the "correct" result from an identical 3d simulation. The results are shown in the table below. At this resolution, the relative error is at most ~5%. The error decreases with increasing resolution. + +| `rpos` | **flux** | **error** | +|:------:|:---------:|:---------:| +| 0 | 38.155237 | 0.069 | +| 4.5 | 40.018691 | 0.023 | +| 8.1 | 40.262199 | 0.017 | + The simulation script is in [examples/noaxisym_point_dipole_cyl.py](https://github.com/NanoComp/meep/blob/master/python/examples/nonaxisym_point_dipole_cyl.py). + +```py +import meep as mp +import numpy as np + +resolution = 50 # pixels/μm +n = 2.4 # refractive index of dielectric layer +wvl = 1.0 # wavelength (in vacuum) +fcen = 1 / wvl # center frequency of source/monitor + +def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: + """Computes the radiated flux of a point dipole embedded + within a dielectric layer above a lossless ground plane in + cylindrical coordinates. + + Args: + dmat: thickness of dielectric layer. + h: height of dipole above ground plane as fraction of dmat. + rpos: position of source in radial direction. + m: angular φ dependence of the fields exp(imφ). + """ + L = 20 # length of non-PML region in radial direction + dair = 1.0 # thickness of air padding + dpml = 1.0 # PML thickness + sr = L + dpml + sz = dmat + dair + dpml + cell_size = mp.Vector3(sr, 0, sz) + + boundary_layers = [ + mp.PML(dpml, direction=mp.R), + mp.PML(dpml, direction=mp.Z, side=mp.High), + ] + + src_cmpt = mp.Er + src_pt = mp.Vector3(rpos, 0, -0.5 * sz + h * dmat) + sources = [ + mp.Source( + src=mp.GaussianSource(fcen, fwidth=0.1 * fcen), + component=src_cmpt, + center=src_pt, + ), + ] + + geometry = [ + mp.Block( + material=mp.Medium(index=n), + center=mp.Vector3(0, 0, -0.5 * sz + 0.5 * dmat), + size=mp.Vector3(mp.inf, mp.inf, dmat), + ) + ] + + sim = mp.Simulation( + resolution=resolution, + cell_size=cell_size, + dimensions=mp.CYLINDRICAL, + m=m, + boundary_layers=boundary_layers, + sources=sources, + geometry=geometry, + ) + + flux_air_z = sim.add_flux( + fcen, + 0, + 1, + mp.FluxRegion( + center=mp.Vector3(0.5 * L, 0, 0.5 * sz - dpml), + size=mp.Vector3(L, 0, 0), + ), + ) + + flux_air_r = sim.add_flux( + fcen, + 0, + 1, + mp.FluxRegion( + center=mp.Vector3(L, 0, 0.5 * sz - dpml - 0.5 * dair), + size=mp.Vector3(0, 0, dair), + ), + ) + + sim.run( + until_after_sources=mp.stop_when_fields_decayed( + 50.0, + src_cmpt, + src_pt, + 1e-8, + ), + ) + + flux_z = mp.get_fluxes(flux_air_z)[0] + flux_r = mp.get_fluxes(flux_air_r)[0] + flux_tot = flux_r + flux_z + print(f"flux:, {flux_r:.6f}, {flux_z:.6f}, {flux_tot:.6f}") + + return flux_tot + + +def radiated_flux_3d(rpos: float) -> float: + """Computes the radiated flux in 3d using a point dipole source in + cylindrical coordinates. + + Args: + rpos: position of source in radial direction. + + Returns: + The radiated flux in 3d Cartesian coordinates. + """ + layer_thickness = 0.7 * wvl / n + dipole_height = 0.5 + + if rpos == 0: + # r = 0 source requires a single simulation with m = ±1 + m = 1 + out_flux = radiated_flux_cyl( + layer_thickness, + dipole_height, + rpos, + m, + ) + print(f"flux-m:, {rpos}, {m}, {out_flux:.6f}") + + return out_flux * 2 * (resolution / np.pi)**2 + + else: + # r > 0 source requires Fourier-series expansion of φ + flux_thresh = 1e-4 # threshold value for flux for truncating expansion + cutoff_M = int(2 * rpos * 2 * np.pi * fcen * n) + ms = range(cutoff_M + 1) + flux_tot = 0 + for m in ms: + out_flux = radiated_flux_cyl( + layer_thickness, + dipole_height, + rpos, + m, + ) + print(f"flux-m:, {rpos}, {m}, {out_flux:.6f}") + flux_tot += out_flux if m == 0 else 2*out_flux + if out_flux < flux_thresh: + break + + print(f"flux1:, {rpos}, {flux_tot:.6f}") + + return (flux_tot / rpos**2) * (2 / np.pi**5) + + +if __name__ == "__main__": + P_3d = 40.9739956441 # reference result from an identical simulation + + rs = [0, 4.5, 8.1] + for r in rs: + Pcyl = radiated_flux_3d(r) + err = abs(Pcyl - P_3d) / P_3d + print(f"flux:, {r}, {Pcyl:.6f}, {err:.6f}") +``` diff --git a/doc/docs/Python_Tutorials/Local_Density_of_States.md b/doc/docs/Python_Tutorials/Local_Density_of_States.md index 540762de4..224828280 100644 --- a/doc/docs/Python_Tutorials/Local_Density_of_States.md +++ b/doc/docs/Python_Tutorials/Local_Density_of_States.md @@ -327,7 +327,7 @@ A more efficient approach to computing the total emitted power from the dipole i To demonstrate this feature of the LDOS, we will compute the extraction efficiency of an LED-like structure consisting of a point dipole embedded within a dielectric layer ($n$=2.4 and thickness 0.7 $\lambda/n$) surrounded by vacuum and positioned above an infinite ground plane of a lossless metal. We will compute the extraction efficiency (at a wavelength $\lambda$ = 1.0 μm for a dipole with polarization parallel to the ground plane) as a function of the height of the dipole source above the ground plane using two different coordinate systems — 3D Cartesian and cylindrical — and demonstrate that the results are equivalent (apart from discretization error). The key difference is that simulation using cylindrical (2D) coordinates is significantly faster and more memory efficient than 3D. -The simulation setup is shown in the figures below for 3D Cartesian (cross section in $xz$) and cylindrical coordinates. (Note that this single-dipole calculation differs from the somewhat related flux calculation in [Tutorials/Custom Source/Stochastic Dipole Emission in Light Emitting Diodes](Custom_Source.md#stochastic-dipole-emission-in-light-emitting-diodes) which involved modeling a *collection* of dipoles.) In this example, the point-dipole source is positioned at $r=0$ which is relatively straightforward to set up. Non-axisymmetric dipoles (i.e., positioned at $r>0$), however, are more challenging because they involve combining the results of *multiple* (independent) simulations. For a demonstration, see [Cylindrical Coordinates/Non-axisymmetric Dipole Sources](Cylindrical_Cordinates.md#non-axisymmetric-dipole-sources). +The simulation setup is shown in the figures below for 3D Cartesian (cross section in $xz$) and cylindrical coordinates. (Note that this single-dipole calculation differs from the somewhat related flux calculation in [Tutorials/Custom Source/Stochastic Dipole Emission in Light Emitting Diodes](Custom_Source.md#stochastic-dipole-emission-in-light-emitting-diodes) which involved modeling a *collection* of dipoles.) In this example, the point-dipole source is positioned at $r=0$ which is relatively straightforward to set up. Non-axisymmetric dipoles positioned at $r>0$ are more challenging because they involve combining the results of *multiple* simulations. For a demonstration, see [Cylindrical Coordinates/Non-axisymmetric Dipole Sources](Cylindrical_Cordinates.md#non-axisymmetric-dipole-sources). ![](../images/dipole_extraction_eff_3D.png#center) diff --git a/python/examples/nonaxisym_point_dipole_cyl.py b/python/examples/nonaxisym_point_dipole_cyl.py index 9fa44a245..917a03081 100644 --- a/python/examples/nonaxisym_point_dipole_cyl.py +++ b/python/examples/nonaxisym_point_dipole_cyl.py @@ -1,50 +1,32 @@ """ -Verifies that the radiated flux from a point dipole in a dielectric layer +Demonstrates that the radiated flux from a point dipole in a dielectric layer above a lossless ground plane computed in cylindrical coordinates -is the same for a dipole placed at either r=0 or r≠0. +is the same for a dipole placed anywhere along the radial direction. """ -import argparse -import matplotlib - -matplotlib.use("agg") -import matplotlib.pyplot as plt import meep as mp import numpy as np -parser = argparse.ArgumentParser() -parser.add_argument( - "-res", type=float, default=25.0, help="resolution (default: 25 pixels/um)" -) -parser.add_argument( - "-L", type=float, default=5.0, help="length of non-PML region (default: 5.0 um)" -) -parser.add_argument( - "-dpml", type=float, default=1.0, help="PML thickness in r and z (default: 1.0 um)" -) -args = parser.parse_args() - -resolution = args.res -L = args.L -dpml = args.dpml - -dair = 1.0 # thickness of air padding -n = 2.4 # refractive index of surrounding medium +resolution = 50 # pixels/μm +n = 2.4 # refractive index of dielectric layer wvl = 1.0 # wavelength (in vacuum) fcen = 1 / wvl # center frequency of source/monitor -def radiated_flux(dmat: float, h: float, rpos: float, m: int) -> float: +def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: """Computes the radiated flux of a point dipole embedded within a dielectric layer above a lossless ground plane in cylindrical coordinates. Args: - dmat: thickness of dielectric layer. - h: height of dipole above ground plane as fraction of dmat. - rpos: position of source in r direction. - m: angular φ dependence of the fields exp(imφ). + dmat: thickness of dielectric layer. + h: height of dipole above ground plane as fraction of dmat. + rpos: position of source in radial direction. + m: angular φ dependence of the fields exp(imφ). """ + L = 20 # length of non-PML region in radial direction + dair = 1.0 # thickness of air padding + dpml = 1.0 # PML thickness sr = L + dpml sz = dmat + dair + dpml cell_size = mp.Vector3(sr, 0, sz) @@ -114,44 +96,65 @@ def radiated_flux(dmat: float, h: float, rpos: float, m: int) -> float: flux_z = mp.get_fluxes(flux_air_z)[0] flux_r = mp.get_fluxes(flux_air_r)[0] flux_tot = flux_r + flux_z - print(f"flux:, {flux_r:.10f}, {flux_z:.10f}, {flux_tot:.10f}") + print(f"flux:, {flux_r:.6f}, {flux_z:.6f}, {flux_tot:.6f}") return flux_tot -if __name__ == "__main__": +def radiated_flux_3d(rpos: float) -> float: + """Computes the radiated flux in 3d using a point dipole source in + cylindrical coordinates. + + Args: + rpos: position of source in radial direction. + + Returns: + The radiated flux in 3d Cartesian coordinates. + """ layer_thickness = 0.7 * wvl / n dipole_height = 0.5 - # r = 0 - rpos = 0 - m = +1 - ref_out_flux = radiated_flux( - layer_thickness, - dipole_height, - rpos, - m, - ) - print(f"flux0-m:, {m}, {ref_out_flux}") - - # r ≠ 0 - rpos = 1.0 - # empirical - cutoff_M = lambda rp: int(16 * rp + 8) - # analytic - # cutoff_M = int(2 * rp * 2 * np.pi * fcen * n) + 2 - ms = range(cutoff_M(rp) + 1) - out_flux = [] - for m in ms: - out_flux.append( - radiated_flux( + if rpos == 0: + # r = 0 source requires a single simulation with m = ±1 + m = 1 + out_flux = radiated_flux_cyl( + layer_thickness, + dipole_height, + rpos, + m, + ) + print(f"flux-m:, {rpos}, {m}, {out_flux:.6f}") + + return out_flux * 2 * (resolution / np.pi) ** 2 + + else: + # r > 0 source requires Fourier-series expansion of φ + flux_thresh = 1e-4 # threshold value for flux for truncating expansion + cutoff_M = int(2 * rpos * 2 * np.pi * fcen * n) + ms = range(cutoff_M + 1) + flux_tot = 0 + for m in ms: + out_flux = radiated_flux_cyl( layer_thickness, dipole_height, - rp, + rpos, m, ) - ) - print(f"flux1-m:, {rp}, {m}, {out_flux[-1]}") + print(f"flux-m:, {rpos}, {m}, {out_flux:.6f}") + flux_tot += out_flux if m == 0 else 2 * out_flux + if out_flux < flux_thresh: + break + + print(f"flux1:, {rpos}, {flux_tot:.6f}") + + return (flux_tot / rpos**2) * (2 / np.pi**5) + + +if __name__ == "__main__": + P_3d = 40.9739956441 # reference result from an identical 3d simulation - flux_sum = out_flux[0] + 2 * sum(out_flux[1:]) - print(f"flux1:, {rp}, {flux_sum:.8f}") + rs = [0, 4.5, 8.1] + for r in rs: + Pcyl = radiated_flux_3d(r) + err = abs(Pcyl - P_3d) / P_3d + print(f"flux:, {r}, {Pcyl:.6f}, {err:.6f}") From 8afff33b144f0c36c15dfbdb7707d59e174f488a Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Fri, 31 Mar 2023 06:04:16 +0000 Subject: [PATCH 03/13] additional results and fixes --- .../Cylindrical_Coordinates.md | 100 ++++++++++-------- python/examples/nonaxisym_point_dipole_cyl.py | 60 ++++++----- 2 files changed, 91 insertions(+), 69 deletions(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 6f1352575..d6ae2ffc5 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -586,36 +586,37 @@ Shown below is the far-field energy-density profile around the focal length for ![](../images/zone_plate_farfield.png#center) -Non-axisymmetric Dipole Sources +Nonaxisymmetric Dipole Sources ------------------------------- -In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting Diode (LED)](Local_Density_of_States.md#extraction-efficiency-of-a-light-emitting-diode-led), the extraction efficiency of the LED was computed using an axisymmetric point-dipole source at $r = 0$. This involved a single simulation with $m = \pm 1$. Simulating a point-dipole source at $r > 0$ is more challenging because it is nonaxisymmetric: any point source at $r > 0$ is equivalent to a ring source in cylindrical coordinates. In order to simulate a point-dipole source at $r > 0$, it is necessary to represent the $\delta(r)$ (Dirac delta function) current source as a Fourier-series expansion of the field angular dependence $\exp(im\phi)$. This computational approach involves two parts: (1) performing a series of simulations for $m = 0, 1, 2, ..., M$ where $M$ is the cutoff (described below), and (2) because of power orthogonality, summing the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. +In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting Diode (LED)](Local_Density_of_States.md#extraction-efficiency-of-a-light-emitting-diode-led), the extraction efficiency of an LED was computed using an axisymmetric point-dipole source at $r = 0$. This involved a single simulation with $m = \pm 1$. Simulating a point-dipole source at $r > 0$ (as shown in the schematic below) is more challenging because it is nonaxisymmetric: any point source at $r > 0$ is equivalent to a ring source in cylindrical coordinates. In order to simulate a point-dipole source at $r > 0$, it is necessary to represent the $\delta(r)$ (Dirac delta function) current source as a Fourier-series expansion of $\phi$ (the field angular dependence $\exp(im\phi)$). This computational approach involves two parts: (1) performing a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier series (described below), and (2) because of power orthogonality, summing the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. -There are two useful features of this method: - -1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. For $m > M$, the field oscillations tend to be too rapid and the current source therefore does not radiate any power. As an example, a point dipole-source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would typically require 16 simulations. +![](../images/cyl_nonaxisymmetric_source_layout.png#center) -2. Each $m$-simulation is independent of the others. The simulations can therefore be executed simultaneously using an embarassingly parallel approach. +Two features of this method may provide a significant speedup compared to an identical 3d simulation: -As a demonstration, we will repeat the calculation of the extraction efficiency of the LED using a point-dipole source at $r > 0$. The radiated flux of the point-dipole source (the numerator in the expression for the extraction efficiency) is computed using the Fourier--series-based method described above. A schematic of the simulation layout is shown below. +1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. For $m > M$, the field oscillations tend to be too rapid and the current source therefore cannot radiate any power into the far field. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M=16$ simulations. (In practice, however, we usually truncate the Fourier-series expansion earlier: whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. -![](../images/cyl_nonaxisymmetric_source_layout.png#center) +2. Each $m$-simulation in the Fourier-series expansion is independent of the others. The simulations can therefore be executed simultaneously using an embarassingly parallel approach. ![](../images/cyl_nonaxisymmetric_source_flux_vs_m.png#center) -To convert the radiated flux at $r=0$ in cylindrical coordinates to 3d, the result must be multiplied by $2 / (\pi \Delta r)^2$ where $\Delta r$ is the grid size ($1/resolution$). +The Poynting flux computed in cylindrical coordinates can be converted to 3d Cartesian coordinates with the use of various scaling factors: -The relationship between the radiated flux from a point dipole at $r = 0$ ($P(0)$) and $r > 0$ ($P(r)$) is $(\pi / (\Delta r)^2) P(0) = P(r) / (\pi r)^2$. +- To convert the radiated flux from a point dipole at $r=0$ in cylindrical coordinates to 3d, the result must be multiplied by $2 / (\pi \Delta r)^2$ where $\Delta r$ is the grid size ($1/resolution$). -Combining these two sets of results, to convert the radiated flux at $r > 0$ in cylindrical coordinates to 3d, the result must be multiplied by $2 / (\pi^5 * r^2)$. +- The relationship between the radiated flux $P(r)$ from a point dipole at $r = 0$ and $r > 0$ is $(\pi / (\Delta r)^2) P(0) = P(r) / (\pi r)^2$. -As a demonstration, we compute the radiated flux from the dipole at three different locations in the LED ($r = 0$ and $r > 0$). The results from the simulation in cylindrical coordinates are compared to the "correct" result from an identical 3d simulation. The results are shown in the table below. At this resolution, the relative error is at most ~5%. The error decreases with increasing resolution. +- Combining these two sets of results, to convert the radiated flux at $r > 0$ in cylindrical coordinates to 3d, the result must be multiplied by $2 / (\pi^5 * r^2)$. + +As a demonstration, we compute the radiated flux from a point dipole at three different locations with $r > 0$ within the LED. These results are compared to the radiated flux from a point dipole at $r = 0$. The results are shown in the table below. At this resolution, the relative error is at most ~4%. The error decreases with increasing resolution. | `rpos` | **flux** | **error** | |:------:|:---------:|:---------:| -| 0 | 38.155237 | 0.069 | -| 4.5 | 40.018691 | 0.023 | -| 8.1 | 40.262199 | 0.017 | +| 0 | 48.390787 | N/A | +| 3.3 | 49.038307 | 0.013 | +| 7.5 | 49.868279 | 0.031 | +| 12.1 | 50.124093 | 0.036 | The simulation script is in [examples/noaxisym_point_dipole_cyl.py](https://github.com/NanoComp/meep/blob/master/python/examples/nonaxisym_point_dipole_cyl.py). @@ -623,10 +624,12 @@ The simulation script is in [examples/noaxisym_point_dipole_cyl.py](https://gith import meep as mp import numpy as np -resolution = 50 # pixels/μm -n = 2.4 # refractive index of dielectric layer -wvl = 1.0 # wavelength (in vacuum) -fcen = 1 / wvl # center frequency of source/monitor + +resolution = 30 # pixels/μm +n = 2.4 # refractive index of dielectric layer +wvl = 1.0 # wavelength (in vacuum) +fcen = 1 / wvl # center frequency of source/monitor + def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: """Computes the radiated flux of a point dipole embedded @@ -635,13 +638,16 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: Args: dmat: thickness of dielectric layer. - h: height of dipole above ground plane as fraction of dmat. + h: height of dipole above ground plane as a fraction of dmat. rpos: position of source in radial direction. m: angular φ dependence of the fields exp(imφ). + + Returns: + The radiated flux in cylindrical coordinates. """ - L = 20 # length of non-PML region in radial direction - dair = 1.0 # thickness of air padding - dpml = 1.0 # PML thickness + L = 20 # length of non-PML region in radial direction + dair = 1.0 # thickness of air padding + dpml = 1.0 # PML thickness sr = L + dpml sz = dmat + dair + dpml cell_size = mp.Vector3(sr, 0, sz) @@ -711,20 +717,19 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: flux_z = mp.get_fluxes(flux_air_z)[0] flux_r = mp.get_fluxes(flux_air_r)[0] flux_tot = flux_r + flux_z - print(f"flux:, {flux_r:.6f}, {flux_z:.6f}, {flux_tot:.6f}") return flux_tot def radiated_flux_3d(rpos: float) -> float: - """Computes the radiated flux in 3d using a point dipole source in - cylindrical coordinates. + """Computes the radiated flux in 3d Cartesian coordinates using a + point-dipole source in cylindrical coordinates. - Args: - rpos: position of source in radial direction. + Args: + rpos: position of source in radial direction. - Returns: - The radiated flux in 3d Cartesian coordinates. + Returns: + The radiated flux in 3d Cartesian coordinates. """ layer_thickness = 0.7 * wvl / n dipole_height = 0.5 @@ -732,45 +737,50 @@ def radiated_flux_3d(rpos: float) -> float: if rpos == 0: # r = 0 source requires a single simulation with m = ±1 m = 1 - out_flux = radiated_flux_cyl( + flux_cyl = radiated_flux_cyl( layer_thickness, dipole_height, rpos, m, ) - print(f"flux-m:, {rpos}, {m}, {out_flux:.6f}") - return out_flux * 2 * (resolution / np.pi)**2 + flux_3d = flux_cyl * 2 * (resolution / np.pi) ** 2 else: # r > 0 source requires Fourier-series expansion of φ - flux_thresh = 1e-4 # threshold value for flux for truncating expansion + flux_tol = 1e-6 # relative tolerance for flux for truncating expansion cutoff_M = int(2 * rpos * 2 * np.pi * fcen * n) ms = range(cutoff_M + 1) - flux_tot = 0 + flux_cyl_tot = 0 + flux_cyl_max = 0 for m in ms: - out_flux = radiated_flux_cyl( + flux_cyl = radiated_flux_cyl( layer_thickness, dipole_height, rpos, m, ) - print(f"flux-m:, {rpos}, {m}, {out_flux:.6f}") - flux_tot += out_flux if m == 0 else 2*out_flux - if out_flux < flux_thresh: + print(f"flux-m:, {rpos}, {m}, {flux_cyl:.6f}") + flux_cyl_tot += flux_cyl if m == 0 else 2 * flux_cyl + if flux_cyl > flux_cyl_max: + flux_cyl_max = flux_cyl + if m > 0 and (flux_cyl / flux_cyl_max) < flux_tol: break - print(f"flux1:, {rpos}, {flux_tot:.6f}") + flux_3d = (flux_cyl_tot / rpos**2) * (2 / np.pi**5) + + print(f"flux-3d:, {rpos:.2f}, {flux_3d:.6f}") - return (flux_tot / rpos**2) * (2 / np.pi**5) + return flux_3d if __name__ == "__main__": - P_3d = 40.9739956441 # reference result from an identical simulation + # reference result for dipole at r = 0 + Pcyl_ref = radiated_flux_3d(0) - rs = [0, 4.5, 8.1] + rs = [3.3, 7.5, 12.1] for r in rs: Pcyl = radiated_flux_3d(r) - err = abs(Pcyl - P_3d) / P_3d - print(f"flux:, {r}, {Pcyl:.6f}, {err:.6f}") + err = abs(Pcyl - Pcyl_ref) / Pcyl_ref + print(f"err:, {r}, {Pcyl:.6f}, {err:.6f}") ``` diff --git a/python/examples/nonaxisym_point_dipole_cyl.py b/python/examples/nonaxisym_point_dipole_cyl.py index 917a03081..abffa78a1 100644 --- a/python/examples/nonaxisym_point_dipole_cyl.py +++ b/python/examples/nonaxisym_point_dipole_cyl.py @@ -1,13 +1,18 @@ -""" -Demonstrates that the radiated flux from a point dipole in a dielectric layer -above a lossless ground plane computed in cylindrical coordinates -is the same for a dipole placed anywhere along the radial direction. +"""Tutorial example for non-axisymmetric point sources in cylindrical coords. + +This example demonstrates that the radiated flux from a point dipole in +a dielectric layer above a lossless ground plane computed in cylindrical +coordinates is the same for a dipole placed anywhere along the radial +direction. + +Reference: https://meep.readthedocs.io/en/latest/Python_Tutorials/Cylindrical_Coordinates/#nonaxisymmetric-dipole-sources """ import meep as mp import numpy as np -resolution = 50 # pixels/μm + +resolution = 30 # pixels/μm n = 2.4 # refractive index of dielectric layer wvl = 1.0 # wavelength (in vacuum) fcen = 1 / wvl # center frequency of source/monitor @@ -20,9 +25,12 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: Args: dmat: thickness of dielectric layer. - h: height of dipole above ground plane as fraction of dmat. + h: height of dipole above ground plane as a fraction of dmat. rpos: position of source in radial direction. m: angular φ dependence of the fields exp(imφ). + + Returns: + The radiated flux in cylindrical coordinates. """ L = 20 # length of non-PML region in radial direction dair = 1.0 # thickness of air padding @@ -96,14 +104,13 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: flux_z = mp.get_fluxes(flux_air_z)[0] flux_r = mp.get_fluxes(flux_air_r)[0] flux_tot = flux_r + flux_z - print(f"flux:, {flux_r:.6f}, {flux_z:.6f}, {flux_tot:.6f}") return flux_tot def radiated_flux_3d(rpos: float) -> float: - """Computes the radiated flux in 3d using a point dipole source in - cylindrical coordinates. + """Computes the radiated flux in 3d Cartesian coordinates using a + point-dipole source in cylindrical coordinates. Args: rpos: position of source in radial direction. @@ -117,44 +124,49 @@ def radiated_flux_3d(rpos: float) -> float: if rpos == 0: # r = 0 source requires a single simulation with m = ±1 m = 1 - out_flux = radiated_flux_cyl( + flux_cyl = radiated_flux_cyl( layer_thickness, dipole_height, rpos, m, ) - print(f"flux-m:, {rpos}, {m}, {out_flux:.6f}") - return out_flux * 2 * (resolution / np.pi) ** 2 + flux_3d = flux_cyl * 2 * (resolution / np.pi) ** 2 else: # r > 0 source requires Fourier-series expansion of φ - flux_thresh = 1e-4 # threshold value for flux for truncating expansion + flux_tol = 1e-6 # relative tolerance for flux for truncating expansion cutoff_M = int(2 * rpos * 2 * np.pi * fcen * n) ms = range(cutoff_M + 1) - flux_tot = 0 + flux_cyl_tot = 0 + flux_cyl_max = 0 for m in ms: - out_flux = radiated_flux_cyl( + flux_cyl = radiated_flux_cyl( layer_thickness, dipole_height, rpos, m, ) - print(f"flux-m:, {rpos}, {m}, {out_flux:.6f}") - flux_tot += out_flux if m == 0 else 2 * out_flux - if out_flux < flux_thresh: + print(f"flux-m:, {rpos}, {m}, {flux_cyl:.6f}") + flux_cyl_tot += flux_cyl if m == 0 else 2 * flux_cyl + if flux_cyl > flux_cyl_max: + flux_cyl_max = flux_cyl + if m > 0 and (flux_cyl / flux_cyl_max) < flux_tol: break - print(f"flux1:, {rpos}, {flux_tot:.6f}") + flux_3d = (flux_cyl_tot / rpos**2) * (2 / np.pi**5) + + print(f"flux-3d:, {rpos:.2f}, {flux_3d:.6f}") - return (flux_tot / rpos**2) * (2 / np.pi**5) + return flux_3d if __name__ == "__main__": - P_3d = 40.9739956441 # reference result from an identical 3d simulation + # reference result for dipole at r = 0 + Pcyl_ref = radiated_flux_3d(0) - rs = [0, 4.5, 8.1] + rs = [3.3, 7.5, 12.1] for r in rs: Pcyl = radiated_flux_3d(r) - err = abs(Pcyl - P_3d) / P_3d - print(f"flux:, {r}, {Pcyl:.6f}, {err:.6f}") + err = abs(Pcyl - Pcyl_ref) / Pcyl_ref + print(f"err:, {r}, {Pcyl:.6f}, {err:.6f}") From 3e6d2551becd1b0b246cb9addf26327de1a5f91a Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Sat, 1 Apr 2023 23:41:45 -0700 Subject: [PATCH 04/13] Expanded discussion on point sources as Dirac delta functions, power orthogonality, and polarization --- doc/docs/Python_Tutorials/Cylindrical_Coordinates.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index d6ae2ffc5..22aa1666d 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -589,10 +589,18 @@ Shown below is the far-field energy-density profile around the focal length for Nonaxisymmetric Dipole Sources ------------------------------- -In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting Diode (LED)](Local_Density_of_States.md#extraction-efficiency-of-a-light-emitting-diode-led), the extraction efficiency of an LED was computed using an axisymmetric point-dipole source at $r = 0$. This involved a single simulation with $m = \pm 1$. Simulating a point-dipole source at $r > 0$ (as shown in the schematic below) is more challenging because it is nonaxisymmetric: any point source at $r > 0$ is equivalent to a ring source in cylindrical coordinates. In order to simulate a point-dipole source at $r > 0$, it is necessary to represent the $\delta(r)$ (Dirac delta function) current source as a Fourier-series expansion of $\phi$ (the field angular dependence $\exp(im\phi)$). This computational approach involves two parts: (1) performing a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier series (described below), and (2) because of power orthogonality, summing the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. +In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting Diode (LED)](Local_Density_of_States.md#extraction-efficiency-of-a-light-emitting-diode-led), the extraction efficiency of an LED was computed using an axisymmetric (i.e., rotationally invariant) point-dipole source at $r = 0$. This involved a single simulation with $m = \pm 1$. Simulating a point-dipole source at $r > 0$ (as shown in the schematic below) is challenging because it is nonaxisymmetric whereas any point source at $r > 0$ is equivalent to an axisymmetric ring source. ![](../images/cyl_nonaxisymmetric_source_layout.png#center) +A point-dipole source at $r > 0$ can be represented as a Dirac delta function in space: $\delta(r)\delta(\phi)\delta(z) / 2\pi r$. (The $2\pi r$ factor in the denominator is necessary to ensure correct normalization.) In order to set up such a source using only axisymmetric simulations, it is necessary to expand the $\delta(\phi)$ term as a Fourier series of $\phi$: $\delta(\phi) = \frac{1}{2\pi} \sum_m e^{im\phi}$. (The Fourier transform of a Dirac delta function is a [constant](https://en.wikipedia.org/wiki/Dirac_delta_function#Fourier_transform). Each spectral component has equal weighting in its Fourier-series expansion.) + +The computational approach for modeling a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion, and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. + +Physically, the *total* field $E(x,y,z)$ is a sum of $E_m(r,z)e^{im\phi}$ terms, one for the solution at each $m$ (similarly for $H$). Computing the total Poynting flux, however, involves integrating $\Re [E \times H^*]$ over a surface that includes an integral over $\phi$ in the range $[0,2\pi]$. The key point is that the cross terms $E_mH^*_ne^{i(m-n)\phi}$ integrate to zero due to Fourier orthogonality. **The total Poynting flux is therefore simply a sum over the Poynting fluxes calculated separately for each $m$.** + +A note regarding the source polarization at $r > 0$. The $\hat{x}$ polarization in 3d (the "in-plane" polarization) corresponds to the $\hat{r}$ polarization in cylindrical coordinates. An $\hat{r}$-polarized point-dipole source involves $\hat{r}$-polarized point sources in the $m$-simulations. Even though $\hat{r}$ is $\phi$-dependent, $\hat{r}$ is only evaluated at $\phi = 0$ because of $\delta(\phi)$. $\hat{r}$ is therefore equivalent to $\hat{x}$. This property does not hold for an $\hat{x}$-polarized point source at $r = 0$. A source at $r = 0$ does not involve $\delta(\phi)$ and thus $\hat{x} = \hat{r}\cos(\phi) - \hat{\phi}\sin(\phi)$. The $\sin$ and $\cos$ terms are why simulations for $m = \pm 1$ are necessary. See also [Tutorial/Scattering Cross Section of a Finite Dielectric Cylinder](#scattering-cross-section-of-a-finite-dielectric-cylinder). + Two features of this method may provide a significant speedup compared to an identical 3d simulation: 1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. For $m > M$, the field oscillations tend to be too rapid and the current source therefore cannot radiate any power into the far field. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M=16$ simulations. (In practice, however, we usually truncate the Fourier-series expansion earlier: whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. From c3320fb381492ab9d4e93a146a74ca83825fcb25 Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Sun, 2 Apr 2023 22:28:30 +0000 Subject: [PATCH 05/13] replace calculation of dimensionful radiated flux with dimensionless extraction efficiency --- .../Cylindrical_Coordinates.md | 145 ++++++++---------- ...oint_dipole_cyl.py => point_dipole_cyl.py} | 120 ++++++--------- 2 files changed, 111 insertions(+), 154 deletions(-) rename python/examples/{nonaxisym_point_dipole_cyl.py => point_dipole_cyl.py} (52%) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 22aa1666d..f70d01a76 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -589,60 +589,54 @@ Shown below is the far-field energy-density profile around the focal length for Nonaxisymmetric Dipole Sources ------------------------------- -In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting Diode (LED)](Local_Density_of_States.md#extraction-efficiency-of-a-light-emitting-diode-led), the extraction efficiency of an LED was computed using an axisymmetric (i.e., rotationally invariant) point-dipole source at $r = 0$. This involved a single simulation with $m = \pm 1$. Simulating a point-dipole source at $r > 0$ (as shown in the schematic below) is challenging because it is nonaxisymmetric whereas any point source at $r > 0$ is equivalent to an axisymmetric ring source. +In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting Diode (LED)](Local_Density_of_States.md#extraction-efficiency-of-a-light-emitting-diode-led), the extraction efficiency of an LED was computed using an axisymmetric point-dipole source at $r = 0$. This involved a single simulation with $m = \pm 1$. Simulating a point-dipole source at $r > 0$ (as shown in the schematic below) is more challenging because it is nonaxisymmetric whereas any point source at $r > 0$ is equivalent to an axisymmetric ring source. ![](../images/cyl_nonaxisymmetric_source_layout.png#center) A point-dipole source at $r > 0$ can be represented as a Dirac delta function in space: $\delta(r)\delta(\phi)\delta(z) / 2\pi r$. (The $2\pi r$ factor in the denominator is necessary to ensure correct normalization.) In order to set up such a source using only axisymmetric simulations, it is necessary to expand the $\delta(\phi)$ term as a Fourier series of $\phi$: $\delta(\phi) = \frac{1}{2\pi} \sum_m e^{im\phi}$. (The Fourier transform of a Dirac delta function is a [constant](https://en.wikipedia.org/wiki/Dirac_delta_function#Fourier_transform). Each spectral component has equal weighting in its Fourier-series expansion.) -The computational approach for modeling a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion, and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. +Simulating a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion, and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. Physically, the *total* field $E(x,y,z)$ is a sum of $E_m(r,z)e^{im\phi}$ terms, one for the solution at each $m$ (similarly for $H$). Computing the total Poynting flux, however, involves integrating $\Re [E \times H^*]$ over a surface that includes an integral over $\phi$ in the range $[0,2\pi]$. The key point is that the cross terms $E_mH^*_ne^{i(m-n)\phi}$ integrate to zero due to Fourier orthogonality. **The total Poynting flux is therefore simply a sum over the Poynting fluxes calculated separately for each $m$.** -A note regarding the source polarization at $r > 0$. The $\hat{x}$ polarization in 3d (the "in-plane" polarization) corresponds to the $\hat{r}$ polarization in cylindrical coordinates. An $\hat{r}$-polarized point-dipole source involves $\hat{r}$-polarized point sources in the $m$-simulations. Even though $\hat{r}$ is $\phi$-dependent, $\hat{r}$ is only evaluated at $\phi = 0$ because of $\delta(\phi)$. $\hat{r}$ is therefore equivalent to $\hat{x}$. This property does not hold for an $\hat{x}$-polarized point source at $r = 0$. A source at $r = 0$ does not involve $\delta(\phi)$ and thus $\hat{x} = \hat{r}\cos(\phi) - \hat{\phi}\sin(\phi)$. The $\sin$ and $\cos$ terms are why simulations for $m = \pm 1$ are necessary. See also [Tutorial/Scattering Cross Section of a Finite Dielectric Cylinder](#scattering-cross-section-of-a-finite-dielectric-cylinder). +A note regarding the source polarization at $r > 0$. The $\hat{x}$ polarization in 3d (the "in-plane" polarization) corresponds to the $\hat{r}$ polarization in cylindrical coordinates. An $\hat{r}$-polarized point-dipole source involves $\hat{r}$-polarized point sources in the $m$-simulations. Even though $\hat{r}$ is $\phi$-dependent, $\hat{r}$ is only evaluated at $\phi = 0$ because of $\delta(\phi)$. $\hat{r}$ is therefore equivalent to $\hat{x}$. This property does not hold for an $\hat{x}$-polarized point source at $r = 0$. A source at $r = 0$ does not involve $\delta(\phi)$. $\hat{x}$ is therefore defined in a more general way as $\hat{x} = \hat{r}\cos(\phi) - \hat{\phi}\sin(\phi)$. The $\sin$ and $\cos$ terms of this definition are why simulations for $m = \pm 1$ are necessary. See also [Tutorial/Scattering Cross Section of a Finite Dielectric Cylinder](#scattering-cross-section-of-a-finite-dielectric-cylinder). Two features of this method may provide a significant speedup compared to an identical 3d simulation: 1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. For $m > M$, the field oscillations tend to be too rapid and the current source therefore cannot radiate any power into the far field. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M=16$ simulations. (In practice, however, we usually truncate the Fourier-series expansion earlier: whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. -2. Each $m$-simulation in the Fourier-series expansion is independent of the others. The simulations can therefore be executed simultaneously using an embarassingly parallel approach. +2. Each $m$-simulation in the Fourier-series expansion is independent of the others. The simulations can therefore be executed simultaneously using an [embarassingly parallel](https://meep.readthedocs.io/en/latest/Parallel_Meep/#different-forms-of-parallelization) approach. ![](../images/cyl_nonaxisymmetric_source_flux_vs_m.png#center) -The Poynting flux computed in cylindrical coordinates can be converted to 3d Cartesian coordinates with the use of various scaling factors: +As a demonstration, we compute the [extraction efficiency of an LED](https://meep.readthedocs.io/en/latest/Python_Tutorials/Local_Density_of_States/#extraction-efficiency-of-a-light-emitting-diode-led) from a point dipole at $r = 0$ and three different locations at $r > 0$. These results are compared to an [identical calculation in 3d](https://github.com/NanoComp/meep/blob/1fe38999997f1825054fc978e473327c77169671/python/examples/extraction_eff_ldos.py#L100-L187) for which the extraction efficiency is 0.333718. Results for the simulations in cylindrical coordinates are shown in the table below. At this resolution, the relative error is at most ~4%. The error decreases with increasing resolution. -- To convert the radiated flux from a point dipole at $r=0$ in cylindrical coordinates to 3d, the result must be multiplied by $2 / (\pi \Delta r)^2$ where $\Delta r$ is the grid size ($1/resolution$). +| `rpos` | **extraction efficiency** | **relative error** | `M` (number of `m`-simulations) | +|:------:|:-------------------------:|:------------------:|:--------------------------------:| +| 0 | 0.310405 | 0.042 | 1 | +| 3.5 | 0.299407 | 0.041 | 56 | +| 6.7 | 0.300334 | 0.036 | 101 | +| 9.5 | 0.302234 | 0.028 | 141 | -- The relationship between the radiated flux $P(r)$ from a point dipole at $r = 0$ and $r > 0$ is $(\pi / (\Delta r)^2) P(0) = P(r) / (\pi r)^2$. - -- Combining these two sets of results, to convert the radiated flux at $r > 0$ in cylindrical coordinates to 3d, the result must be multiplied by $2 / (\pi^5 * r^2)$. - -As a demonstration, we compute the radiated flux from a point dipole at three different locations with $r > 0$ within the LED. These results are compared to the radiated flux from a point dipole at $r = 0$. The results are shown in the table below. At this resolution, the relative error is at most ~4%. The error decreases with increasing resolution. - -| `rpos` | **flux** | **error** | -|:------:|:---------:|:---------:| -| 0 | 48.390787 | N/A | -| 3.3 | 49.038307 | 0.013 | -| 7.5 | 49.868279 | 0.031 | -| 12.1 | 50.124093 | 0.036 | - -The simulation script is in [examples/noaxisym_point_dipole_cyl.py](https://github.com/NanoComp/meep/blob/master/python/examples/nonaxisym_point_dipole_cyl.py). +The simulation script is in [examples/point_dipole_cyl.py](https://github.com/NanoComp/meep/blob/master/python/examples/point_dipole_cyl.py). ```py +from typing import Tuple + import meep as mp import numpy as np -resolution = 30 # pixels/μm +resolution = 80 # pixels/μm n = 2.4 # refractive index of dielectric layer wvl = 1.0 # wavelength (in vacuum) fcen = 1 / wvl # center frequency of source/monitor -def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: - """Computes the radiated flux of a point dipole embedded - within a dielectric layer above a lossless ground plane in - cylindrical coordinates. +def led_flux(dmat: float, h: float, rpos: float, + m: int) -> Tuple[float, float]: + """Computes the radiated and total flux of a point source embedded + within a dielectric layer above a lossless ground plane. Args: dmat: thickness of dielectric layer. @@ -651,7 +645,7 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: m: angular φ dependence of the fields exp(imφ). Returns: - The radiated flux in cylindrical coordinates. + The radiated and total flux as a 2-Tuple. """ L = 20 # length of non-PML region in radial direction dair = 1.0 # thickness of air padding @@ -665,12 +659,11 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: mp.PML(dpml, direction=mp.Z, side=mp.High), ] - src_cmpt = mp.Er src_pt = mp.Vector3(rpos, 0, -0.5 * sz + h * dmat) sources = [ mp.Source( src=mp.GaussianSource(fcen, fwidth=0.1 * fcen), - component=src_cmpt, + component=mp.Er, center=src_pt, ), ] @@ -693,7 +686,7 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: geometry=geometry, ) - flux_air_z = sim.add_flux( + flux_air_mon = sim.add_flux( fcen, 0, 1, @@ -701,12 +694,6 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: center=mp.Vector3(0.5 * L, 0, 0.5 * sz - dpml), size=mp.Vector3(L, 0, 0), ), - ) - - flux_air_r = sim.add_flux( - fcen, - 0, - 1, mp.FluxRegion( center=mp.Vector3(L, 0, 0.5 * sz - dpml - 0.5 * dair), size=mp.Vector3(0, 0, dair), @@ -714,81 +701,69 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: ) sim.run( + mp.dft_ldos(fcen, 0, 1), until_after_sources=mp.stop_when_fields_decayed( 50.0, - src_cmpt, + mp.Er, src_pt, 1e-8, ), ) - flux_z = mp.get_fluxes(flux_air_z)[0] - flux_r = mp.get_fluxes(flux_air_r)[0] - flux_tot = flux_r + flux_z + flux_air = mp.get_fluxes(flux_air_mon)[0] - return flux_tot + if rpos == 0: + dV = np.pi / (resolution**3) + else: + dV = 2 * np.pi * rpos / (resolution**2) + # total flux from point source via LDOS + flux_src = -np.real(sim.ldos_Fdata[0] * np.conj(sim.ldos_Jdata[0])) * dV -def radiated_flux_3d(rpos: float) -> float: - """Computes the radiated flux in 3d Cartesian coordinates using a - point-dipole source in cylindrical coordinates. + print(f"flux-cyl:, {rpos:.2f}, {m:3d}, {flux_src:.6f}, {flux_air:.6f}") - Args: - rpos: position of source in radial direction. + return flux_air, flux_src - Returns: - The radiated flux in 3d Cartesian coordinates. - """ + +if __name__ == "__main__": layer_thickness = 0.7 * wvl / n dipole_height = 0.5 - if rpos == 0: - # r = 0 source requires a single simulation with m = ±1 - m = 1 - flux_cyl = radiated_flux_cyl( - layer_thickness, - dipole_height, - rpos, - m, - ) - - flux_3d = flux_cyl * 2 * (resolution / np.pi) ** 2 - - else: - # r > 0 source requires Fourier-series expansion of φ - flux_tol = 1e-6 # relative tolerance for flux for truncating expansion - cutoff_M = int(2 * rpos * 2 * np.pi * fcen * n) - ms = range(cutoff_M + 1) + # r = 0 source requires a single simulation with m = ±1 + rpos = 0 + m = 1 + flux_air, flux_src = led_flux( + layer_thickness, + dipole_height, + rpos, + m, + ) + ext_eff = flux_air / flux_src + print(f"exteff:, {rpos}, {ext_eff:.6f}") + + # r > 0 source requires Fourier-series expansion of φ + flux_thresh = 1e-5 # threshold value for flux for truncating expansion + rpos = [3.5, 6.7, 9.5] + for rp in rpos: + cutoff_M = int(2 * rp * 2 * np.pi * fcen * n) + ms = range(cutoff_M+1) + flux_src_tot = 0 flux_cyl_tot = 0 flux_cyl_max = 0 for m in ms: - flux_cyl = radiated_flux_cyl( + flux_cyl, flux_src = led_flux( layer_thickness, dipole_height, - rpos, + rp, m, ) - print(f"flux-m:, {rpos}, {m}, {flux_cyl:.6f}") flux_cyl_tot += flux_cyl if m == 0 else 2 * flux_cyl + flux_src_tot += flux_src if m == 0 else 2 * flux_src if flux_cyl > flux_cyl_max: flux_cyl_max = flux_cyl - if m > 0 and (flux_cyl / flux_cyl_max) < flux_tol: + if m > 0 and (flux_cyl / flux_cyl_max) < flux_thresh: break - flux_3d = (flux_cyl_tot / rpos**2) * (2 / np.pi**5) - - print(f"flux-3d:, {rpos:.2f}, {flux_3d:.6f}") - - return flux_3d - - -if __name__ == "__main__": - # reference result for dipole at r = 0 - Pcyl_ref = radiated_flux_3d(0) - - rs = [3.3, 7.5, 12.1] - for r in rs: - Pcyl = radiated_flux_3d(r) - err = abs(Pcyl - Pcyl_ref) / Pcyl_ref - print(f"err:, {r}, {Pcyl:.6f}, {err:.6f}") + ext_eff = flux_cyl_tot / flux_src_tot + print(f"exteff:, {rp}, {ext_eff:.6f}") ``` diff --git a/python/examples/nonaxisym_point_dipole_cyl.py b/python/examples/point_dipole_cyl.py similarity index 52% rename from python/examples/nonaxisym_point_dipole_cyl.py rename to python/examples/point_dipole_cyl.py index abffa78a1..2aaffee38 100644 --- a/python/examples/nonaxisym_point_dipole_cyl.py +++ b/python/examples/point_dipole_cyl.py @@ -1,27 +1,28 @@ -"""Tutorial example for non-axisymmetric point sources in cylindrical coords. +"""Tutorial example for point dipole sources in cylindrical coordinates. -This example demonstrates that the radiated flux from a point dipole in -a dielectric layer above a lossless ground plane computed in cylindrical -coordinates is the same for a dipole placed anywhere along the radial -direction. +This example demonstrates that the total and radiated flux from a point dipole +in a dielectric layer above a lossless ground plane (an LED) computed in +cylindrical coordinates as part of the calculation of the extraction efficiency +is independent of the dipole's location in the radial direction. Reference: https://meep.readthedocs.io/en/latest/Python_Tutorials/Cylindrical_Coordinates/#nonaxisymmetric-dipole-sources """ +from typing import Tuple + import meep as mp import numpy as np -resolution = 30 # pixels/μm +resolution = 80 # pixels/μm n = 2.4 # refractive index of dielectric layer wvl = 1.0 # wavelength (in vacuum) fcen = 1 / wvl # center frequency of source/monitor -def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: - """Computes the radiated flux of a point dipole embedded - within a dielectric layer above a lossless ground plane in - cylindrical coordinates. +def led_flux(dmat: float, h: float, rpos: float, m: int) -> Tuple[float, float]: + """Computes the radiated and total flux of a point source embedded + within a dielectric layer above a lossless ground plane. Args: dmat: thickness of dielectric layer. @@ -30,7 +31,7 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: m: angular φ dependence of the fields exp(imφ). Returns: - The radiated flux in cylindrical coordinates. + The radiated and total flux as a 2-Tuple. """ L = 20 # length of non-PML region in radial direction dair = 1.0 # thickness of air padding @@ -44,12 +45,11 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: mp.PML(dpml, direction=mp.Z, side=mp.High), ] - src_cmpt = mp.Er src_pt = mp.Vector3(rpos, 0, -0.5 * sz + h * dmat) sources = [ mp.Source( src=mp.GaussianSource(fcen, fwidth=0.1 * fcen), - component=src_cmpt, + component=mp.Er, center=src_pt, ), ] @@ -72,7 +72,7 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: geometry=geometry, ) - flux_air_z = sim.add_flux( + flux_air_mon = sim.add_flux( fcen, 0, 1, @@ -80,12 +80,6 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: center=mp.Vector3(0.5 * L, 0, 0.5 * sz - dpml), size=mp.Vector3(L, 0, 0), ), - ) - - flux_air_r = sim.add_flux( - fcen, - 0, - 1, mp.FluxRegion( center=mp.Vector3(L, 0, 0.5 * sz - dpml - 0.5 * dair), size=mp.Vector3(0, 0, dair), @@ -93,80 +87,68 @@ def radiated_flux_cyl(dmat: float, h: float, rpos: float, m: int) -> float: ) sim.run( + mp.dft_ldos(fcen, 0, 1), until_after_sources=mp.stop_when_fields_decayed( 50.0, - src_cmpt, + mp.Er, src_pt, 1e-8, ), ) - flux_z = mp.get_fluxes(flux_air_z)[0] - flux_r = mp.get_fluxes(flux_air_r)[0] - flux_tot = flux_r + flux_z + flux_air = mp.get_fluxes(flux_air_mon)[0] - return flux_tot + if rpos == 0: + dV = np.pi / (resolution**3) + else: + dV = 2 * np.pi * rpos / (resolution**2) + # total flux from point source via LDOS + flux_src = -np.real(sim.ldos_Fdata[0] * np.conj(sim.ldos_Jdata[0])) * dV -def radiated_flux_3d(rpos: float) -> float: - """Computes the radiated flux in 3d Cartesian coordinates using a - point-dipole source in cylindrical coordinates. + print(f"flux-cyl:, {rpos:.2f}, {m:3d}, {flux_src:.6f}, {flux_air:.6f}") - Args: - rpos: position of source in radial direction. + return flux_air, flux_src - Returns: - The radiated flux in 3d Cartesian coordinates. - """ + +if __name__ == "__main__": layer_thickness = 0.7 * wvl / n dipole_height = 0.5 - if rpos == 0: - # r = 0 source requires a single simulation with m = ±1 - m = 1 - flux_cyl = radiated_flux_cyl( - layer_thickness, - dipole_height, - rpos, - m, - ) - - flux_3d = flux_cyl * 2 * (resolution / np.pi) ** 2 - - else: - # r > 0 source requires Fourier-series expansion of φ - flux_tol = 1e-6 # relative tolerance for flux for truncating expansion - cutoff_M = int(2 * rpos * 2 * np.pi * fcen * n) + # r = 0 source requires a single simulation with m = ±1 + rpos = 0 + m = 1 + flux_air, flux_src = led_flux( + layer_thickness, + dipole_height, + rpos, + m, + ) + ext_eff = flux_air / flux_src + print(f"exteff:, {rpos}, {ext_eff:.6f}") + + # r > 0 source requires Fourier-series expansion of φ + flux_thresh = 1e-5 # threshold value for flux for truncating expansion + rpos = [3.5, 6.7, 9.5] + for rp in rpos: + cutoff_M = int(2 * rp * 2 * np.pi * fcen * n) ms = range(cutoff_M + 1) + flux_src_tot = 0 flux_cyl_tot = 0 flux_cyl_max = 0 for m in ms: - flux_cyl = radiated_flux_cyl( + flux_cyl, flux_src = led_flux( layer_thickness, dipole_height, - rpos, + rp, m, ) - print(f"flux-m:, {rpos}, {m}, {flux_cyl:.6f}") flux_cyl_tot += flux_cyl if m == 0 else 2 * flux_cyl + flux_src_tot += flux_src if m == 0 else 2 * flux_src if flux_cyl > flux_cyl_max: flux_cyl_max = flux_cyl - if m > 0 and (flux_cyl / flux_cyl_max) < flux_tol: + if m > 0 and (flux_cyl / flux_cyl_max) < flux_thresh: break - flux_3d = (flux_cyl_tot / rpos**2) * (2 / np.pi**5) - - print(f"flux-3d:, {rpos:.2f}, {flux_3d:.6f}") - - return flux_3d - - -if __name__ == "__main__": - # reference result for dipole at r = 0 - Pcyl_ref = radiated_flux_3d(0) - - rs = [3.3, 7.5, 12.1] - for r in rs: - Pcyl = radiated_flux_3d(r) - err = abs(Pcyl - Pcyl_ref) / Pcyl_ref - print(f"err:, {r}, {Pcyl:.6f}, {err:.6f}") + ext_eff = flux_cyl_tot / flux_src_tot + print(f"exteff:, {rp}, {ext_eff:.6f}") From bce12944d146c28a22e32207ef7c10e11a04e2dd Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Mon, 3 Apr 2023 21:49:35 +0000 Subject: [PATCH 06/13] additional notes on analytical expression for cutoff of Fourier series expansion --- .../Cylindrical_Coordinates.md | 10 +++---- python/examples/point_dipole_cyl.py | 30 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index f70d01a76..b8d5c2274 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -603,7 +603,7 @@ A note regarding the source polarization at $r > 0$. The $\hat{x}$ polarization Two features of this method may provide a significant speedup compared to an identical 3d simulation: -1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. For $m > M$, the field oscillations tend to be too rapid and the current source therefore cannot radiate any power into the far field. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M=16$ simulations. (In practice, however, we usually truncate the Fourier-series expansion earlier: whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. +1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M$ can be derived analytically as $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. This relationship comes from expressing the maximum phase of the fields of a *guided* mode in terms of the wavevector of a planewave in free space: $M = kr$ where $k = n\omega_0/c$ is the light line in a medium with index $n$ and $\omega_0$ is the angular frequency in vacuum ($c = 1$ in Meep units). For $m > M$, the field oscillations tend to be too rapid and the current source radiates power into non-guided (i.e., free space) modes. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M=16$ simulations. (In practice, however, we usually truncate the Fourier-series expansion earlier: whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. 2. Each $m$-simulation in the Fourier-series expansion is independent of the others. The simulations can therefore be executed simultaneously using an [embarassingly parallel](https://meep.readthedocs.io/en/latest/Parallel_Meep/#different-forms-of-parallelization) approach. @@ -613,10 +613,10 @@ As a demonstration, we compute the [extraction efficiency of an LED](https://mee | `rpos` | **extraction efficiency** | **relative error** | `M` (number of `m`-simulations) | |:------:|:-------------------------:|:------------------:|:--------------------------------:| -| 0 | 0.310405 | 0.042 | 1 | -| 3.5 | 0.299407 | 0.041 | 56 | -| 6.7 | 0.300334 | 0.036 | 101 | -| 9.5 | 0.302234 | 0.028 | 141 | +| 0 | 0.319556 | 0.042 | 1 | +| 3.5 | 0.319939 | 0.041 | 56 | +| 6.7 | 0.321860 | 0.036 | 101 | +| 9.5 | 0.324270 | 0.028 | 141 | The simulation script is in [examples/point_dipole_cyl.py](https://github.com/NanoComp/meep/blob/master/python/examples/point_dipole_cyl.py). diff --git a/python/examples/point_dipole_cyl.py b/python/examples/point_dipole_cyl.py index 2aaffee38..27a8fcc67 100644 --- a/python/examples/point_dipole_cyl.py +++ b/python/examples/point_dipole_cyl.py @@ -1,11 +1,11 @@ -"""Tutorial example for point dipole sources in cylindrical coordinates. +"""Tutorial example for point-dipole sources in cylindrical coordinates. This example demonstrates that the total and radiated flux from a point dipole -in a dielectric layer above a lossless ground plane (an LED) computed in -cylindrical coordinates as part of the calculation of the extraction efficiency -is independent of the dipole's location in the radial direction. +in a dielectric layer (a quantum well)) above a lossless ground plane (an LED) +computed in cylindrical coordinates as part of the calculation of the extraction +efficiency is independent of the dipole's position in the radial direction. -Reference: https://meep.readthedocs.io/en/latest/Python_Tutorials/Cylindrical_Coordinates/#nonaxisymmetric-dipole-sources +reference: https://meep.readthedocs.io/en/latest/Python_Tutorials/Cylindrical_Coordinates/#nonaxisymmetric-dipole-sources """ from typing import Tuple @@ -128,27 +128,27 @@ def led_flux(dmat: float, h: float, rpos: float, m: int) -> Tuple[float, float]: print(f"exteff:, {rpos}, {ext_eff:.6f}") # r > 0 source requires Fourier-series expansion of φ - flux_thresh = 1e-5 # threshold value for flux for truncating expansion + flux_tol = 1e-5 # threshold flux to determine when to truncate expansion rpos = [3.5, 6.7, 9.5] for rp in rpos: - cutoff_M = int(2 * rp * 2 * np.pi * fcen * n) + cutoff_M = int(rp * 2 * np.pi * fcen * n) # analytic upper bound on m ms = range(cutoff_M + 1) flux_src_tot = 0 - flux_cyl_tot = 0 - flux_cyl_max = 0 + flux_air_tot = 0 + flux_air_max = 0 for m in ms: - flux_cyl, flux_src = led_flux( + flux_air, flux_src = led_flux( layer_thickness, dipole_height, rp, m, ) - flux_cyl_tot += flux_cyl if m == 0 else 2 * flux_cyl + flux_air_tot += flux_air if m == 0 else 2 * flux_air flux_src_tot += flux_src if m == 0 else 2 * flux_src - if flux_cyl > flux_cyl_max: - flux_cyl_max = flux_cyl - if m > 0 and (flux_cyl / flux_cyl_max) < flux_thresh: + if flux_air > flux_air_max: + flux_air_max = flux_air + if m > 0 and (flux_air / flux_air_max) < flux_tol: break - ext_eff = flux_cyl_tot / flux_src_tot + ext_eff = flux_air_tot / flux_src_tot print(f"exteff:, {rp}, {ext_eff:.6f}") From 5ee309d0598d0b3c09111e0d4ca17b48daf8849e Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Tue, 4 Apr 2023 00:56:51 +0000 Subject: [PATCH 07/13] update figures and text --- .../Cylindrical_Coordinates.md | 43 +++++++++--------- .../Local_Density_of_States.md | 2 +- .../cyl_nonaxisymmetric_source_flux_vs_m.png | Bin 66967 -> 86992 bytes .../cyl_nonaxisymmetric_source_layout.png | Bin 11632 -> 9035 bytes python/examples/point_dipole_cyl.py | 6 ++- 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index b8d5c2274..09a01253e 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -603,20 +603,20 @@ A note regarding the source polarization at $r > 0$. The $\hat{x}$ polarization Two features of this method may provide a significant speedup compared to an identical 3d simulation: -1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M$ can be derived analytically as $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. This relationship comes from expressing the maximum phase of the fields of a *guided* mode in terms of the wavevector of a planewave in free space: $M = kr$ where $k = n\omega_0/c$ is the light line in a medium with index $n$ and $\omega_0$ is the angular frequency in vacuum ($c = 1$ in Meep units). For $m > M$, the field oscillations tend to be too rapid and the current source radiates power into non-guided (i.e., free space) modes. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M=16$ simulations. (In practice, however, we usually truncate the Fourier-series expansion earlier: whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. +1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M$ can be derived analytically as $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. This relationship comes from expressing the maximum phase of the fields of a *guided* mode in terms of the wavevector of a planewave in free space: $M = kr$ where $k = n\omega_0/c$ is the light line in a medium with index $n$ and $\omega_0$ is the angular frequency in vacuum ($c = 1$ in Meep units). For $m > M$, the field oscillations tend to be too rapid and the current source radiates power into non-guided (i.e., free space) modes. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M = 16$ simulations. (In practice, however, we can usually truncate the Fourier-series expansion earlier without significantly degrading accuracy whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions used in this tutorial example. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. 2. Each $m$-simulation in the Fourier-series expansion is independent of the others. The simulations can therefore be executed simultaneously using an [embarassingly parallel](https://meep.readthedocs.io/en/latest/Parallel_Meep/#different-forms-of-parallelization) approach. ![](../images/cyl_nonaxisymmetric_source_flux_vs_m.png#center) -As a demonstration, we compute the [extraction efficiency of an LED](https://meep.readthedocs.io/en/latest/Python_Tutorials/Local_Density_of_States/#extraction-efficiency-of-a-light-emitting-diode-led) from a point dipole at $r = 0$ and three different locations at $r > 0$. These results are compared to an [identical calculation in 3d](https://github.com/NanoComp/meep/blob/1fe38999997f1825054fc978e473327c77169671/python/examples/extraction_eff_ldos.py#L100-L187) for which the extraction efficiency is 0.333718. Results for the simulations in cylindrical coordinates are shown in the table below. At this resolution, the relative error is at most ~4%. The error decreases with increasing resolution. +As a demonstration, we compute the [extraction efficiency of an LED](https://meep.readthedocs.io/en/latest/Python_Tutorials/Local_Density_of_States/#extraction-efficiency-of-a-light-emitting-diode-led) from a point dipole at $r = 0$ and three different locations at $r > 0$. In this test, the extraction efficiency should be independent of the dipole location. The results are compared to an [identical calculation in 3d](https://github.com/NanoComp/meep/blob/1fe38999997f1825054fc978e473327c77169671/python/examples/extraction_eff_ldos.py#L100-L187) for which the extraction efficiency is 0.333718. Results are shown in the table below. At this resolution, the relative error is at most ~4% even when $M + 1$ is relatively large (141). The error decreases with increasing resolution. -| `rpos` | **extraction efficiency** | **relative error** | `M` (number of `m`-simulations) | -|:------:|:-------------------------:|:------------------:|:--------------------------------:| -| 0 | 0.319556 | 0.042 | 1 | -| 3.5 | 0.319939 | 0.041 | 56 | -| 6.7 | 0.321860 | 0.036 | 101 | -| 9.5 | 0.324270 | 0.028 | 141 | +| `rpos` | **extraction efficiency** | **relative error** | $M + 1$ | +|:------:|:-------------------------:|:------------------:|:--------:| +| 0 | 0.319556 | 0.042 | 1 | +| 3.5 | 0.319939 | 0.041 | 56 | +| 6.7 | 0.321860 | 0.036 | 101 | +| 9.5 | 0.324270 | 0.028 | 141 | The simulation script is in [examples/point_dipole_cyl.py](https://github.com/NanoComp/meep/blob/master/python/examples/point_dipole_cyl.py). @@ -633,8 +633,7 @@ wvl = 1.0 # wavelength (in vacuum) fcen = 1 / wvl # center frequency of source/monitor -def led_flux(dmat: float, h: float, rpos: float, - m: int) -> Tuple[float, float]: +def led_flux(dmat: float, h: float, rpos: float, m: int) -> Tuple[float, float]: """Computes the radiated and total flux of a point source embedded within a dielectric layer above a lossless ground plane. @@ -742,28 +741,30 @@ if __name__ == "__main__": print(f"exteff:, {rpos}, {ext_eff:.6f}") # r > 0 source requires Fourier-series expansion of φ - flux_thresh = 1e-5 # threshold value for flux for truncating expansion + flux_tol = 1e-5 # threshold flux to determine when to truncate expansion rpos = [3.5, 6.7, 9.5] for rp in rpos: - cutoff_M = int(2 * rp * 2 * np.pi * fcen * n) - ms = range(cutoff_M+1) + # analytic upper bound on m based on coupling to free-space modes + # in light cone of source medium + cutoff_M = int(rp * 2 * np.pi * fcen * n) + ms = range(cutoff_M + 1) flux_src_tot = 0 - flux_cyl_tot = 0 - flux_cyl_max = 0 + flux_air_tot = 0 + flux_air_max = 0 for m in ms: - flux_cyl, flux_src = led_flux( + flux_air, flux_src = led_flux( layer_thickness, dipole_height, rp, m, ) - flux_cyl_tot += flux_cyl if m == 0 else 2 * flux_cyl + flux_air_tot += flux_air if m == 0 else 2 * flux_air flux_src_tot += flux_src if m == 0 else 2 * flux_src - if flux_cyl > flux_cyl_max: - flux_cyl_max = flux_cyl - if m > 0 and (flux_cyl / flux_cyl_max) < flux_thresh: + if flux_air > flux_air_max: + flux_air_max = flux_air + if m > 0 and (flux_air / flux_air_max) < flux_tol: break - ext_eff = flux_cyl_tot / flux_src_tot + ext_eff = flux_air_tot / flux_src_tot print(f"exteff:, {rp}, {ext_eff:.6f}") ``` diff --git a/doc/docs/Python_Tutorials/Local_Density_of_States.md b/doc/docs/Python_Tutorials/Local_Density_of_States.md index 224828280..81441571e 100644 --- a/doc/docs/Python_Tutorials/Local_Density_of_States.md +++ b/doc/docs/Python_Tutorials/Local_Density_of_States.md @@ -327,7 +327,7 @@ A more efficient approach to computing the total emitted power from the dipole i To demonstrate this feature of the LDOS, we will compute the extraction efficiency of an LED-like structure consisting of a point dipole embedded within a dielectric layer ($n$=2.4 and thickness 0.7 $\lambda/n$) surrounded by vacuum and positioned above an infinite ground plane of a lossless metal. We will compute the extraction efficiency (at a wavelength $\lambda$ = 1.0 μm for a dipole with polarization parallel to the ground plane) as a function of the height of the dipole source above the ground plane using two different coordinate systems — 3D Cartesian and cylindrical — and demonstrate that the results are equivalent (apart from discretization error). The key difference is that simulation using cylindrical (2D) coordinates is significantly faster and more memory efficient than 3D. -The simulation setup is shown in the figures below for 3D Cartesian (cross section in $xz$) and cylindrical coordinates. (Note that this single-dipole calculation differs from the somewhat related flux calculation in [Tutorials/Custom Source/Stochastic Dipole Emission in Light Emitting Diodes](Custom_Source.md#stochastic-dipole-emission-in-light-emitting-diodes) which involved modeling a *collection* of dipoles.) In this example, the point-dipole source is positioned at $r=0$ which is relatively straightforward to set up. Non-axisymmetric dipoles positioned at $r>0$ are more challenging because they involve combining the results of *multiple* simulations. For a demonstration, see [Cylindrical Coordinates/Non-axisymmetric Dipole Sources](Cylindrical_Cordinates.md#non-axisymmetric-dipole-sources). +The simulation setup is shown in the figures below for 3D Cartesian (cross section in $xz$) and cylindrical coordinates. (Note that this single-dipole calculation differs from the somewhat related flux calculation in [Tutorials/Custom Source/Stochastic Dipole Emission in Light Emitting Diodes](Custom_Source.md#stochastic-dipole-emission-in-light-emitting-diodes) which involved modeling a *collection* of dipoles.) In this example, the point-dipole source is positioned at $r=0$ which involves a single simulation. Nonaxisymmetric dipoles positioned at $r>0$, however, are more challenging because they involve multiple simulations. For a demonstration, see [Cylindrical Coordinates/Nonaxisymmetric Dipole Sources](Cylindrical_Cordinates.md#nonaxisymmetric-dipole-sources). ![](../images/dipole_extraction_eff_3D.png#center) diff --git a/doc/docs/images/cyl_nonaxisymmetric_source_flux_vs_m.png b/doc/docs/images/cyl_nonaxisymmetric_source_flux_vs_m.png index ba968850ddb5a6669f5b15b80fb9d9fbb25d3cea..d8588fd57a124617d7adae6312486ba77ee63f95 100644 GIT binary patch literal 86992 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
^hduR)yiA~k_X#r;hXLTr}au6^x`~ehX%)k z$^r{mr0qjJVia}V4}hcb)9mn`SvOV8*AeRE%g`U|Vw?ogc#s8v%i}XQWQebO*&)1b z^XK(l4$J|rT|QN}qjcsLWh`cTz##L>!-R{<7_86LzM6l&RY=al96QK_Bw(8j%NE%5@|37v( z-h~^(@O&7qbCG%ZUwu{xS)}19KN;aB?Hx(I12)skzq#ONUwp-5!wAzO42%Ry zANS?>mQS&=Hg2y~a^z&r)a~8wd48o(X>?SU!HD5OUIjs3WS(05#e?O{=|1>dKnS^Q zb@!Uzh{z#^YK3oMPy|aIr}0U7-9Lr8A(CX%88h717Y*&o#KpyPD=K;iEqJ_Y8XFa( zqNCBWvh3go_VRBRbQT{sE#2DsA?PHSYD*%-A49-`k*+Tyz=}_{k_ob&?lTS z3DB^GHP|VGM+w@a1!YuLN+4mQ;^IUCmcXLEK0}bl^1zbk=H`ZcDzNq!*QZ^qdr#(C zH6(_LIbw&ry#tS^@v^2;2naEVnct1(BO%7_utwn0;{H@UA%Pod0-09PKSw`ohwjU* zTd@ZJkcE}3acFk*_0jO1p)v5vNw6z~v4bGh_BK_}!fy|`IZ4Upu`y0qL&>P9qH{Ry z+?J2c&CNNxxSYRu@yNZ*Og%X6XAh3a7&%q)hXa}FCOBQk(I_anQ1FM|X1 z9L}x`8wzU-r9RIJEqJ}o0wHeF?DVa7!SWEwRrVF_Mq;he4@>nVrSz6c_mNv1GJXf~ zVPJ(V!uF!A`e|aZSVgduTZDz7omN&>K80V)0R`sBkt38%SzN-!6H7}Ih+l&L=X@Bj zG2y>?7W*4+4Qh0A{kl=AlN53*c0UU{Di>7iT6|AXioYtbM(OWPP z%q%KRAAI=w?8*Hm$lcH~Fhn8tUr1QB0{w0A{wnkdprI%FNufhQsB0+>vVw9@ZrZ>xAIVb8ftzYrjo|Blh_Cv7B=SW|8@#l{h(?{s{2<64N0Z7 zwW)O7mpiJbr-$$9X|ML2@VIX04k!fM`XyiH)+J9%7MvhBHD5lClEX1e{m)3W{V}t2 zJCGSz$hEyHhS2EgbSLI6Ap&O=CLpitl^(G!CpX1M+ZT!f6tA1dY0{Nf`pqT z?ftm3AKd5s`A13&K&!%-o2!z1Cs}(UZeA^05{ zR9KYO2p$w+KM;6%C+NHEv7=FNvSj$nUz;%R>XzRMq9Tl}LN9Yh5H#jrh(r1i`d;J_s8E!wpJ_=GAXo zlnQ3_mcw+cxz>RQEjjiwB>pch2Ov;jEY!_um3K1R9h+R&{+r3~+_vwA5Mh_QLfCJq zamo^?kFw%{^o;|~LxJ>w*`Z?&=36F&B~aLnUoxj73OwWlC=%*pu6_;f!Jt(tPdx)M z1T+BfjFOnw1<=M&bGE^cy2i#o-_Iob2g55t^dvMGfFJ^+l5|WCl9o3RkLAwBLe;Wazg)opVWJ$rNx? zHE(e`W0R1OfND9<_Twj0n47bQ(4#;A4j@ga?*E1+bd98(Ara~6ECvP!#=WELnyhD} zA;-1<`$>RUabBc%G)Gy`nv3|^vo@giR6}Pt6n5+|a^N8n=R}%0ZjLO3Ijzj>f$SrB zZ~v(nWIAJZv_^Y8w2i&RJhsIfuW_LHJN^+)9D+wfSkRaL)F54tA>{d|0Y;foH}J{n z1-yKGLAy<5z-HM(GInL`a5rmZ4-#1e>Y4{Xd1MC(LL-hy#9NAFr-+FM)_IV2{yY*A zhE4aAPygyYTs?c{>#WJr))K4_;71zOUu|s#Nl*|IjY0dmo;(N^Uj$kf6BY0yJ3NOq z@o6XWPX1OLoS*K*3l{x{mt&s9F4D(4y1%3xnI%9>ml*nGW^tvLNI9gDzd{{2Tbd5I(X`Mc>yx=_q83lnfoC zr=KX7_jQ6M7>K}%c*{UEfqhGRUU=}V(|`rM7q9~<78yZY_M_D%-|^#b#>TAr z_6B5}0=B$1(s>LG4M`NU_9cT>oy}kQkV8DV73|50(A3X#wA*A6vc}_h91miZ4hgAy zH@C993>i35u$v?2k%4IZLX(*p$)h6XnB`?Jt?YA*kkn{}b|xO3r>b(Hl_<=X_B%TA zzJ$PfJ%{v417Pk=D!gTg{ecu!})G{AI5H5Qt@u>YAI z2=;hTS&81`j(DbUp_qjS`qxv9W;4ZpzZHZwafANasGlQ8bp>Xxl{_$eoLgE-gPbh| zUW|qe4nk*bNZo3fTF1>8!W65fI?iy>NyTNiXesy2n;ks z1C$$JY_Wc7L#$X1Mldw9`a#@jj=BiqPCU!!X}M|f_mdMKQYGcNM?AjAx2LoX$B9U7 zb*fWNe;>S)63Rz*n3A#uoHu1Iy(eW?-zy{g%Np~||J0j0hd)sv_RNwJQj~Lrsrnfk zIFTT9Tk7{236mQA-{t*VD~%;(PnCT#N)jKi{tZRclvZxSP z9yh^tw$@{3Yr9wyzT5d@p%Xc86B0H6oin@zPWxDeFf%2)6b+;hS~X9!_0qFf`v$=5+=v`u$iMpZMM?cOMFdO40>t_|(@w`g00-{04307^uyTSkCscZ1 zOG%uab=89IF<>ffffXhpKA!Ta!AbRB3%|3QwM_VXWkQC<#_iA0#YU@YX3l{KFi4lD$}SuV)CI2}SRQBl@k@ zUFejPpucagDCP3z;k#=RIi0ulpS5uK4@UyTw1!!i%s>;Hl++FhA&cZI z)4~(ZS5=bDdwQs`iA>kJi5fZlQDtT3>Dl-z2ZC&&OKKV^xNJ)uG~4$qYEgFr=P;w% z4|=~gwC@#!kACdC&cW}GLP=x~L_LYiQTZb?257Znl8!XtcrbC@`@SF49>lYaIxPSL7)FtoS z6$;Ec(&`f3ZPxAD&sB2B@P&EW_@VjZur$mz-Q6U%wh_-ydhW#1!`AxbUtYR?oB#6C zeXRNP|0?_LcrN?5{YyrqL@IkGEkr4MCT&``5>lx&%VIfj3}kDGP6^mC@Df# zMksr4e#cwg_w&8)=Xrk5_xt(dzF(Ek<+|S2dz|NS9>;NtKgh5BXjWRk{QQ^qTxp(J zrCeW56?82sxa#XG#OS`qaOC8<_vQ4imR>ikx(@2;`4T@|Dljnc*nwIjuS3mwm}sw% zBk}ccybyThS>wvrUC+dEdesHC%i}%ONn5}ke+z%5zccWB2yon!ao9@BUzVeqyGPo% z8s2IfNwA2g4|6wxg8P=C3l|Aya4hy@w6H`^kJec&*7WD~2~eIWJ~N2|b|3US(Q$F_ z&p3kEX$G@lvL6#IAb1$2KaJ0xU86kqjW*hpP_Uo4RIEHjp}Bb z`*^lSPxHS3B8@BBye(y;c&yUj+_~g0_exi{S-rH)OLT2;&n68}H+CVz22Xaqot?ZK zv~Zt3eS*OM)^YG{fj$=@mrHV;b-AbP%#G4F>@8Fe9=y3P3)~Q1xeIh0yO+Btz%(6S zV&&rU@$jI7qU}DsVi0YsSy^o)&18quZmQ1wVQnoS_^YTBq5&rW3BHBGi1uWs;oS5-=Aya>$}!Sx67VBeKXy|itP;z&Cn{RIYd{I z+WWM!_``=nuxS&~m?|3~3Je?85zR2kFUiT?o!)3R+_?w6!kCwf<>z0b?T7Jm6GTvp ziTMd6^UYu{=i`txJ|rm*fAMFAdHi4v5M9H^uV1g$)#(!!8i`{q23mJGpV~5D;@~hM zUK)O@{oV}gc(!GW{F9YOvl)411(Dh5zn(*m*Ij+s?ajWL?&YU5t`}B;yfcsDRkZ)u zEQLHC{frr@V^Ce0v8MzX!wsP@D ztZLZz%3ME|C`Bb6B?QHnN0 zE41hvN}q*e(>?N=HZ^amzq*WXaHcnx=Ww#u7FM5oSA9p=NV&4@;o+!o?>aRNy1=kS zyTiUFnbyfN9MjM$+B)f-y`0b|mJDmOYI!a0wRh?Y1r=_93r|{np1e)5ecBp5BFecf zQou$zzC}4}9Q7rwPkb&4Um)C3eLwsX2XVBrVGH^L1dJz7{Dt{6T19?e06eXyuM6kV z&@>yVQT_tAQWZ3EFOhGoBq-*|U^nVmaiBl^F1EMMBVSoZc!a{j1H7-U*wGo1>uWp& zFZ$B=k~do?ul`M7Eixd9;{9P@^)L#gp^n5Y2Q)Wei;_7%&e*rx)6W>%rqwA43C}0H z8mSStn#~mrwACi>dfgQ zxlS*bXI8bw{r>7Jw)(?}0)Qq_)K0xBCQHvd+}|Q*>2~gv-E08xzUw7YSc09warZbJ zeCA}1NWs26ymhnyv2&)005(8}!M5A=Re%}O8!j?ak_f)uPHN>M%TaJxl3~x*QF9=7 zhLw%YL73tANrh_+#ieu$7Ep0t>>FeDl@`bk!@`zxxwkwAeLaxaD=r-{?58=nI~2O)5YDeCt2{@kq?j**@E$USF1b|A~h_v+OJNCnZ@?;cbR zB=bX691c{0w{Ne}%YzcO;bNyad`?z~i|-kzg1bop66|?Y#$-=coY|whMkE5Vb%iej zlnFSYhik2SEs>nSfj#j|xv<98t!fYV3*iOw$e2|KOwLU98bNUebQ7c|I(~;%wlkb5 zjvl0|lGRa^@PfKgD}83y<|j*6zI=SVIaAb3a@#ZHPZTRJ@0`^Uj=WIVR}l#-L9U(; zpC9e1KXc{`Q35T-d?_eUH~E^v1i*|_*-6$cZ`u|?`^TQDS)|52_2`wDR0Y_X(z@Y5D zu6%tOC2Pp$Ksa)`_E!QYwpcAi1AQWtMnaw2>D(G}Xqdb{I>Qi{dOg1H&kRne_?_H& zA0MC9NthdPBbe=9lJM;jq9p#%gD)b;bh(%W)AtX z4xio3lmnFyP3HnvSJ&)`pHGRukHpbz??Xo&=!s$nGN3CZ>+^V#?WV>qhW54)rf7@s z!&#SQ9mmGUn_v=k1;rsZ0##v2(-8$a5r-4F4+pfAU5`Fd`$2oaj2*Culvl|B7aMo{ zGsW3n(a^v`5ox$20bJ=_~H64*qPGd zy%iZAyr1amQd!^$71KFAOBOI^SH1jaa$p<c=N={FLA{lv|( zu#}qw&D6Iqdgfcfg*QES{_%?!HC^z2DEm5nr}egV37ze5bflhWUol%`BI{nlPXLct z`(>hup|{^Lqo9MHv3Xk(c7+#Ro_pjA>oB`E%gMPNF|AJ`Efjbx(7?n5JGTh+ z4dJ}Z+TCy$^5QsZPeb)Vk;$2grU{Oc(1jCZKI~{OHiNBbVac$F+vCUQM+z0`-~bcr zE6v()hc+&hm1tNwE{paW_infZE(2s}T-bxJ?Of?E^{$xp3iqApgI6bguhyN|U;J>_ zErQ_?i~)Pktt^Gp(@l$A^RpcW6A{DfTfSMA(O<|T}PEX_2}bmt{j61*QGHMeauf{g@e$!-AyIU_K!4`*7(=DwaH5j&#f>ibrKlO-j| z=C|{+72Ai%WWND|U@dw&m`Ut45MTZiE@7e4JErU^*TO3;UXSh=Wq~ON_q7bu<-1p* zTO}y+TL5Wd=O;om5fKrxA>l8RCv1)!IYRJjD&N4a{<}pUT!p=cJFDQAwLHRUfC(Jn zpu2Z{%akVDo06aVBv}r)mc4<2uwUlEQD55BkNB*jvSLEQ}rlH`5ccwoSPFf^; zp(Me(A8!u~+V;0VTAt-SJwmS|H&%gXQ{7$xY>*40i?@_KaNg6%cRr78`eolvEAFSQ$F+5 zJfOR|*Y1k3Z--#Z7J@B=RQ4SkE@68$yF$n)x^HNIO|V@gt}H$mQ$okUx$svQ<2t4indvL+V zpv~>ryeC2zwPfSIe}C}`? zhki_M4qso3xH3i_)aao1s818h=1&Y7sj zcsM;Ek9%EM*o^b{H3E(GM(cgVn3-r8Si0;#fKjcXVE|^q=C@++GAQJRv7Wh0x`0Pmb2^-5LiDurG%s^6}%g>5*$5JQ6LZr zV!OHvCE`T>4&bOCZ%jQ-#|VfAi9?RMjGqD@pb2P#t***j%l>}Vw+W-*S>oKbxuzBx zz(z;IaYUlJawOOw;qdQ%fQND&=>zt-l*U`lQ|;x?LDJG?mJrQ+0upvh1cNQ+u9H0O z?$7QfhlGZDUtiL>!A%}AtmVnuye5V_=TnGcq_gs}v$IR44Rm2$TRsR7nwP-D2!Bmo z#2pDl4Ea{2Ks1d}btmtdjF*-pr02id6n*1|w#_0ee;jI7K2kDWk$; zFmff~#P=R<>YI8A{gA^4r@}Y7I%c{)!FoEju95WZv-bSQ)sC}_Zn?#j1ykStujdnN zxF@QDTU$@wW!7J~@tMv?PXO*Gh$SqlZI&Zly85;?rzV^s4kq^U6a^N6PJ|;OnG8U+ z7FeAp;B5LhKAx006EA$wqnH!+O@$uKh65a!hH~h zsJb(EBO(N#jJCiah^$;`b1s@WTPs4jyCOFz1!$GM)6i-NX(Ua#1H)M~idDF8V{eT^ z$oYECvZ=wI7TM@J1gU+*b^~EJ*}}f}+|ka0G7TsWj@UI zXB(JCG>$0hIA^_Uv)vUVVQH@w8f`uJ68Y7+s;TFs?H~#dX|eBN@Mt_NS%Koh&EVjs z=m6yc;HQ!0XCy%}f`K9jc@XLtB9_ggwfCS40&S*trY9^~)!u@{velCY*_7zEgD5|E1G>%S=P462!a-Rr%FF zI^PNXsXVsMsWb)s^Tk$&iw2^l4T7Z>i^LAeTeU4D{;++07R0=kCGRMDv*%8a=uxWb z>h60?18&EreFX4dv$pF5dx)5> z`_uT$cTKa&3dK7x28mG#;v z%QB_WW3X%<>xd5UOEa%cTSOcqzkdDdmv-pj!EYgYW@7A}Nb+s-#O#PfzGD_R1El1?*JwNI*oEEj+VkKcYK4vV#*a-3j}Ol%fd{O@_rw z`}%YYxiAdkPz>9?eY+|kF!VG`!sI7PUlQ)a6v-q;>)(d&ZSxkl%9-$nJw2qq@TBps zugl1rZ%I-MjUx;(1ZIM8@HN@onpSJ}3X3PvvPILGbp&Y#fopqqdnmTje6PBzFy4UUP}Y|2f_fk@L>P@T}k!;=oI zFeQLQlNKoeulLfT$-r1jROm)#$PHCi*W)i)%PgF9Qb zQ_}g^c@5x{u)!C8Z{vgIzxpK>hc`E*rzT(_nlYypcY}^lh@Un&z_V+xg1}Q##PBBj z!088%9<5MP%K2>jIpS`0b+ts}V0>Hk!ckgyy`7j96!6>kwU{JTs!Qn-&v@;UxI(haj8Yh`kxvNv&j@T|)Hjc!7;EXc6 z$EMAj=TR3&y3X3>#p~N$zHD^rw+DyayXCK6zedqCs&-^flWXu~Q&^>NUOb`*KqOrHd&g6BS|5UN{G5 zJa{02wl~Gy;GLUEBs#swV70PLI_&jd{%Y83V?e9PLRS0{?jVGNiP(};!S-4C%p#u6 z6m|Ojot0a9OaBs&o&B+SBU=!UH>qT{sh8sW^@F#YywPXtFdVk1Z}+e8e=4J)b>lE} zVnbSS`AFQC^%Y$#z`w!KyM*)(Oa?fil)!I=d@clnHl{o~Wd&bb_1Wyy)Mb?9*-s+V zX;|USpu1J57(PGAL|&ZG*30FH1Q(zE zebs``kYVFs?@Fn+&@(lSE6cWCExf{}SgZTfmd?ZmUkmszgl%@;Xz z(NUkxfME=r?Qe952%HS%+C0^;irlc>f=j87l-$jdPVe%S>m&mf7Z=AVYas}JOZU}y zwztGlh1k@`IX`V&F1Cj_lJ}l8(0fMe61d#plo+{cUIDuO$L|sHYr%@!-JUpG|(wxD+2N_ z-h@QQ%Aihq1_r_fE-x?FS3#WOt;o`jTG6ZBq4APM06dI74+zcnQNMpo2tH22 z*ZE*Dzh=$y^KJC&a00LeIW~dZGWX$_%QZ2gt?DowDC~+w!HIl&u0bjCzfB&zjO!cVK?Duwwh)erp$qyTt-ey{HS9Zfl zFmKWS_>+qw<`g>QekEQLFaw`r&$)~RPx*qCU>@Z2FAw?b_an5blk}f_{>L99`8)aO zdlQTUpCINrYycO#FlQL@=kLsXSbnCD^f`tlAmf4s1<1WE5p^}UzP)k5?)^G_kQ&K> z{ps^(DZn^zzz~9sJn3o+N82EUV&$?ad)$aNj^{KG3mV-CT13Ny1{QlB;Q{sZFFj^auLop|0REJ<)^+oJ^#X9XZC; z$;OMrokw&@I0Ya<5?S!l1zXd*yT+ABKaeT#w6-?pI)g#$j=~JX>_k=GgNX!tF+JtW znEIrj193$nKHy-mM}Z9uN9Z}bbL6cOWpBzNH#)j9ESzqW$tzEvgj=Q~J2WRB>m?_Pi?d z&vrND=z&#$OQWp4gm55)R<7LY?c>7+D#LN0+h=Wo=J&AyluLM)PKK$k!-V;vKMRs!Z{U zcmy%VADTo`=6TmFa|bEyc&J@wz+GZlHUYZbR2vd;$zfz_A?LfYG7hR^R`bxILwA)v z)Hk{^9ItqY2!NULKzhZDe08FGeRiKarHZ*UVDn)Yybc+;xVQ??#^zYcH1?_jaIx{Y z=q-6R#r$*3o_UlIC`;%{|Ja3)Lp-2XfQk5SS=X8Db(y`vWQV753k(V>KgC*DrglVS zb}E^0H<-ZxSqi_F8(Ncl*8f~Ape!~vImxVaaflTciD@K;Fyy*q+~B0rHss<+8>h35 zM39tVHs*uoB;jU|&MEUK;x|@qURAGpH6VZkP;hi(E)ZE7H%XIfNwueynO(Er){t3z z988h|)OFT^DRKlxE!%E!M2<{_$3A_^jwQ2_VkNwl=@Agc7~wF+P7$m2kcqrDDU5Ju;sW;HqO;c;b{6!tsBC zwT-D)1%UYDhYz=Q)Muqrsz|%LQ(VCxo<|)=WpBgK2N|4$doaN}%D14lP;RchV+R|> zxISlS|D(+TiUZ!1sy)`TLG^)Ng24$%NN8m=UtQ;c(AbvCqu(m<3p#4xy?{1)?sNa` z+qc6;a>kl{arveK&n2Uu6uKMpFm!&LQU&0ojt*LtDLrbm1+>IWm7YF9G6)(sf@2%o z)SS1rqd8aBdmEvp79|K4e%67zc>Q}R!Kog*Jgbz>qpv~)^FLzN3|H-V^X84_#z&FGhU<~g3g#~wU< zs9UKi)9c%t*K%>F<9MYdEFvkwf8~|8W?UOgn$R0PY8ji^^{Sz9qrtREoqfwSvO|M) z@7dONIyS5802og2w_%}hrr#`Ac47Fm4#*fGf#S(lNJzw&7%4SP8?$OIpDS#-fjC55 zPe!|I+n+0s-+@OGMFA-UxWP;j$_oksq@w^5v5W&eE)pZP=o5a_zKI^UO6;Nx_)9ST zNvOVM3oSVL^M6%wN#hu_Js12EZ&3SV-XowDpvhCmMnut_cBw>G*9J5tX$B|D^6l)) z8;khlmtq*nZ)-q^6YWf#Kgoyy6C}wX&By-Hrg!TSq#cvp8)rWyj*jj=dg0Al9OxkWrDhxBV&T(1bmNjEmrcwvO4WvS(2;60WEBe_=S~ zRcn*ywjC{ElQta6+4{@6hZ`-`H*M!d{BBmRT*)bKy?W=aUHxcl!Grz93$Ph!caH=2XTbNy`BjPS zlXVul>@Lb54j33*L$pu9KDp$Y*U-SmKpnuB7cN{NT&l;FKg|M0=k7mq}0mgintL5y}8{)k()Vi`P#w<(nL5sZYCpeMxl7_{^>r*n5%D zB}-(Ezt(o=JRwg2M1$Q^vt8aK9~ouvqiMf2&OeldQSCGKi3k{i8!jRF0Xl5KKlVyr zS@O+T@F4)y6A*!o5&v*dKTDr%4j-7=h&u;F|8|fGkUf`5_b#;AG zQlyjZoHHl&F%E=%i&fZnD=V0E%o^&dVPCA+M-hpN;q0jE?0nUQem1o@oM_!5E>~FR zZ9@v{gJ{d-I37%@GfQBb=agXgKcf_lh2k@3m+r{y+C=1U^|+w z5sPN|%WiL+Pgogi*UtMU*X!zLVl0~eh-coRBS+3bm@|oU(csG}^Doua-e`$51wKi} z@E5%#m+6bEmtNH>y2dFr52v&$kTn!DeGq1Fb+@;lh=5wkIpobjE30Iei1>Trh@*b2 zK1||);M`psgpsv73xT6M5Fl)_8yi>w;LWVDtO~ zC{KPM3vhtkU4(S?65M@#i?DqB1sNxJRNF{5Gs-W9-M(P5Y&WN_HFPWY;onKZN|z1U z_y5d}zc+_FM1Vd`WM~9oCD1pvHwd#EyOMCipfE9?B81GakwL4ZFhL3Z#ve~nZlTbh z>rrD&NpYW5pblUe1P!!mtfdUEGEKd{ci40u_|b5Fi_@%W^tuG_70i++^WX|g@o~Ks zf`KyR0#`Jn%M*%>ynFMcyQY;sSC$n5Pxiu@HH9!)ZSUT|3WJd&yF$cX0)(_fZfJxc z4Ew9=t)jt=ftn~xy~!)j6w|S>*+i!%xu8I?dD?FH=f_svABP+xgQ*SfcG<{*In?XRFQ{YMI-tO)4OO~hY%8AY7^$fL^qILb{w@r*xs2i zP3=x3IBx-5GZ#5;%!)vE(%>>_O554+2tUn_>E?zsZha8>ZOfa6c+edU zbw5ULTYMZC!bCUDqh%mUlBm213tD1Y#r_EbLq-ab40*h0XPlxO5aiHP1t_Qt)m9}K zuBTYh$j9@}9q#E7>|?6P5qLK5#sra=#J2(0G8!28*9NNZAYE&?zB;iCW! z;sXOT_BlVfcN=%_7YJeDexs^$u7XR z(B{JfB|K)-To8pJNxaeI`t1cj#4gjlQ6LR4VFza;HOrS}W!jYB$&)8J`5Lhc=Uu9J zq%F_{Ad?+C5k1KvkP8+0^KF>cuB*ko5=D)2-|WM^tLZ4sTC#CPZ$?C1lX(2{xAyi` z*f)-UO*vZt@t`Pq?UV=VrZ2v^{>(*0JknGDv{40Uxvy(<9wKtB_9o+F;YupBZPv>? znA|7x5I{WELuGm?v4I9Ozyt(C{p869f#A~h-wihz1ctoTwdr%^AqNMCM`@@G7C`*y zNs=Ix?$s|`c%F#Rv1)cz_RURdp@LXW`yCy#63y!6rzg31dBsS}0#pPOtJ@&!SOzdu z7+EwUirfWAZ#}N@$Ydr~HMC$eSc?66==N)D&x{ybb`m-z7a3++@33$3kLu=sf+gw~+((`(u2!5ZIJUm)TJo`w-M_v>5?lmBw-7kq)X?VQEIFa;{ znbEvESxR>);*#9R%)-#0JYSR~!Dj$o0vLAv8!sjBrUkGCci+Rd5Yb2q> zgtyRgtTt4*_>y9EsBz85#N1ZEJPm!u67p5)*UtM~%J4 z5G93at*SSZ;o#snn|ee}NomjZdl3=Z7o4fW-LPSQ|KwI;eSJMpy3^o%?!fYY{^G@L z5eFBS4>dKq&|D&#^hU*S~(aIg@Wl)qQLb0zbpdvN@ zIB9BP;-rw5o2wOFUOX`|k)AA~3xZ#*3$;5O&&K_SP%6>UJ32eRfAwn1o%g3>9zD9! z_D8;tq+8=2-2XLA&x-DDQ)LwuSHEZbXy)hl3X$tZYc1IJeq!21K1>UhBD5jd_+c4M zs3f_y@v*V(S@j>lD{X6Q^J)V=up>7h(Kah=bky#VH|6R^hP1A+u^o{{kyXLIcCSjV z=mQ#VjR{hm3mI-4okvmM68e@fP}JT)Mp}wmz1@Qb&ALTERi+j!IgbC*`$$rho4W=l nMX9P`%&15~{Nn%k$3JrXaH3txtXW`+Yf?M5YH7r)A9MeI8Ugm; literal 66967 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 R)lK1_mBl{uGBdBU{{>EU*kJ$w diff --git a/doc/docs/images/cyl_nonaxisymmetric_source_layout.png b/doc/docs/images/cyl_nonaxisymmetric_source_layout.png index 971744522122880b92225edece444cceada62965..a306566a5255480820bff1dc20ff8b2154335ea4 100644 GIT binary patch literal 9035 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 DKN!xH literal 11632 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 diff --git a/python/examples/point_dipole_cyl.py b/python/examples/point_dipole_cyl.py index 27a8fcc67..ef4ce1afe 100644 --- a/python/examples/point_dipole_cyl.py +++ b/python/examples/point_dipole_cyl.py @@ -1,7 +1,7 @@ """Tutorial example for point-dipole sources in cylindrical coordinates. This example demonstrates that the total and radiated flux from a point dipole -in a dielectric layer (a quantum well)) above a lossless ground plane (an LED) +in a dielectric layer (a quantum well) above a lossless ground plane (an LED) computed in cylindrical coordinates as part of the calculation of the extraction efficiency is independent of the dipole's position in the radial direction. @@ -131,7 +131,9 @@ def led_flux(dmat: float, h: float, rpos: float, m: int) -> Tuple[float, float]: flux_tol = 1e-5 # threshold flux to determine when to truncate expansion rpos = [3.5, 6.7, 9.5] for rp in rpos: - cutoff_M = int(rp * 2 * np.pi * fcen * n) # analytic upper bound on m + # analytic upper bound on m based on coupling to free-space modes + # in light cone of source medium + cutoff_M = int(rp * 2 * np.pi * fcen * n) ms = range(cutoff_M + 1) flux_src_tot = 0 flux_air_tot = 0 From a2f4830be22f76414f3d1cb0159b652b74f4ff61 Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Tue, 4 Apr 2023 09:30:52 -0700 Subject: [PATCH 08/13] Update doc/docs/Python_Tutorials/Cylindrical_Coordinates.md Co-authored-by: Steven G. Johnson --- doc/docs/Python_Tutorials/Cylindrical_Coordinates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 09a01253e..1174ded2b 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -593,7 +593,7 @@ In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting D ![](../images/cyl_nonaxisymmetric_source_layout.png#center) -A point-dipole source at $r > 0$ can be represented as a Dirac delta function in space: $\delta(r)\delta(\phi)\delta(z) / 2\pi r$. (The $2\pi r$ factor in the denominator is necessary to ensure correct normalization.) In order to set up such a source using only axisymmetric simulations, it is necessary to expand the $\delta(\phi)$ term as a Fourier series of $\phi$: $\delta(\phi) = \frac{1}{2\pi} \sum_m e^{im\phi}$. (The Fourier transform of a Dirac delta function is a [constant](https://en.wikipedia.org/wiki/Dirac_delta_function#Fourier_transform). Each spectral component has equal weighting in its Fourier-series expansion.) +A point-dipole source at $r_0 > 0$ can be represented as a Dirac delta function in space: $\delta(r - r_0)\delta(\phi)\delta(z) / r_0$. (The $r_0$ factor in the denominator is [necessary to ensure correct normalization](https://math.stackexchange.com/questions/398777/dirac-delta-in-polar-coordinates).) In order to set up such a source using only axisymmetric simulations, it is necessary to expand the $\delta(\phi)$ term as a Fourier series of $\phi$: $\delta(\phi) = \frac{1}{2\pi} \sum_m e^{im\phi}$. (The Fourier transform of a Dirac delta function is a [constant](https://en.wikipedia.org/wiki/Dirac_delta_function#Fourier_transform). Each spectral component has equal weighting in its Fourier-series expansion.) Simulating a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion, and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. From fa61d75f30640ef02cf1f62842153cacd99252c3 Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Tue, 4 Apr 2023 09:33:29 -0700 Subject: [PATCH 09/13] Update doc/docs/Python_Tutorials/Cylindrical_Coordinates.md Co-authored-by: Steven G. Johnson --- doc/docs/Python_Tutorials/Cylindrical_Coordinates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 1174ded2b..014be92ea 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -595,7 +595,7 @@ In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting D A point-dipole source at $r_0 > 0$ can be represented as a Dirac delta function in space: $\delta(r - r_0)\delta(\phi)\delta(z) / r_0$. (The $r_0$ factor in the denominator is [necessary to ensure correct normalization](https://math.stackexchange.com/questions/398777/dirac-delta-in-polar-coordinates).) In order to set up such a source using only axisymmetric simulations, it is necessary to expand the $\delta(\phi)$ term as a Fourier series of $\phi$: $\delta(\phi) = \frac{1}{2\pi} \sum_m e^{im\phi}$. (The Fourier transform of a Dirac delta function is a [constant](https://en.wikipedia.org/wiki/Dirac_delta_function#Fourier_transform). Each spectral component has equal weighting in its Fourier-series expansion.) -Simulating a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion, and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. +Simulating a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion (the solutions for $\pm$ are simply complex conjugates, so we can omit $m <0$ and simply double the powers for $m > 0$ in the sum), and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. Physically, the *total* field $E(x,y,z)$ is a sum of $E_m(r,z)e^{im\phi}$ terms, one for the solution at each $m$ (similarly for $H$). Computing the total Poynting flux, however, involves integrating $\Re [E \times H^*]$ over a surface that includes an integral over $\phi$ in the range $[0,2\pi]$. The key point is that the cross terms $E_mH^*_ne^{i(m-n)\phi}$ integrate to zero due to Fourier orthogonality. **The total Poynting flux is therefore simply a sum over the Poynting fluxes calculated separately for each $m$.** From 90454ff766a450853d1dfa89b1103f4c85e2c530 Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Tue, 4 Apr 2023 12:33:51 -0400 Subject: [PATCH 10/13] Update doc/docs/Python_Tutorials/Cylindrical_Coordinates.md --- doc/docs/Python_Tutorials/Cylindrical_Coordinates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 014be92ea..50d2ad048 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -595,7 +595,7 @@ In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting D A point-dipole source at $r_0 > 0$ can be represented as a Dirac delta function in space: $\delta(r - r_0)\delta(\phi)\delta(z) / r_0$. (The $r_0$ factor in the denominator is [necessary to ensure correct normalization](https://math.stackexchange.com/questions/398777/dirac-delta-in-polar-coordinates).) In order to set up such a source using only axisymmetric simulations, it is necessary to expand the $\delta(\phi)$ term as a Fourier series of $\phi$: $\delta(\phi) = \frac{1}{2\pi} \sum_m e^{im\phi}$. (The Fourier transform of a Dirac delta function is a [constant](https://en.wikipedia.org/wiki/Dirac_delta_function#Fourier_transform). Each spectral component has equal weighting in its Fourier-series expansion.) -Simulating a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion (the solutions for $\pm$ are simply complex conjugates, so we can omit $m <0$ and simply double the powers for $m > 0$ in the sum), and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. +Simulating a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion (the solutions for $\pm m$ are simply complex conjugates, so we can omit $m <0$ and simply double the powers for $m > 0$ in the sum), and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. Physically, the *total* field $E(x,y,z)$ is a sum of $E_m(r,z)e^{im\phi}$ terms, one for the solution at each $m$ (similarly for $H$). Computing the total Poynting flux, however, involves integrating $\Re [E \times H^*]$ over a surface that includes an integral over $\phi$ in the range $[0,2\pi]$. The key point is that the cross terms $E_mH^*_ne^{i(m-n)\phi}$ integrate to zero due to Fourier orthogonality. **The total Poynting flux is therefore simply a sum over the Poynting fluxes calculated separately for each $m$.** From 244f3fa5f08e0883874e5af53289c9bd75c23d5a Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Tue, 4 Apr 2023 12:34:51 -0400 Subject: [PATCH 11/13] Update doc/docs/Python_Tutorials/Cylindrical_Coordinates.md --- doc/docs/Python_Tutorials/Cylindrical_Coordinates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 50d2ad048..634e7948c 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -595,7 +595,7 @@ In [Tutorial/Local Density of States/Extraction Efficiency of a Light-Emitting D A point-dipole source at $r_0 > 0$ can be represented as a Dirac delta function in space: $\delta(r - r_0)\delta(\phi)\delta(z) / r_0$. (The $r_0$ factor in the denominator is [necessary to ensure correct normalization](https://math.stackexchange.com/questions/398777/dirac-delta-in-polar-coordinates).) In order to set up such a source using only axisymmetric simulations, it is necessary to expand the $\delta(\phi)$ term as a Fourier series of $\phi$: $\delta(\phi) = \frac{1}{2\pi} \sum_m e^{im\phi}$. (The Fourier transform of a Dirac delta function is a [constant](https://en.wikipedia.org/wiki/Dirac_delta_function#Fourier_transform). Each spectral component has equal weighting in its Fourier-series expansion.) -Simulating a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion (the solutions for $\pm m$ are simply complex conjugates, so we can omit $m <0$ and simply double the powers for $m > 0$ in the sum), and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing where the $m \neq 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. +Simulating a point-dipole source involves two parts: (1) perform a series of simulations for $m = 0, 1, 2, ..., M$ for some cutoff $M$ of the Fourier-series expansion (the solutions for $\pm m$ are simply complex conjugates), and (2) because of power orthogonality, sum the results from each $m$-simulation in post processing, where the $m > 0$ terms are multiplied by two to account for the $-m$ solutions. This procedure is described in more detail below. Physically, the *total* field $E(x,y,z)$ is a sum of $E_m(r,z)e^{im\phi}$ terms, one for the solution at each $m$ (similarly for $H$). Computing the total Poynting flux, however, involves integrating $\Re [E \times H^*]$ over a surface that includes an integral over $\phi$ in the range $[0,2\pi]$. The key point is that the cross terms $E_mH^*_ne^{i(m-n)\phi}$ integrate to zero due to Fourier orthogonality. **The total Poynting flux is therefore simply a sum over the Poynting fluxes calculated separately for each $m$.** From 2bb1e22fa8a0e2f1c09c32b432ad54e0b9c494ba Mon Sep 17 00:00:00 2001 From: "Steven G. Johnson" Date: Tue, 4 Apr 2023 12:44:20 -0400 Subject: [PATCH 12/13] Update doc/docs/Python_Tutorials/Cylindrical_Coordinates.md --- doc/docs/Python_Tutorials/Cylindrical_Coordinates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 634e7948c..6ec9c4896 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -599,7 +599,7 @@ Simulating a point-dipole source involves two parts: (1) perform a series of sim Physically, the *total* field $E(x,y,z)$ is a sum of $E_m(r,z)e^{im\phi}$ terms, one for the solution at each $m$ (similarly for $H$). Computing the total Poynting flux, however, involves integrating $\Re [E \times H^*]$ over a surface that includes an integral over $\phi$ in the range $[0,2\pi]$. The key point is that the cross terms $E_mH^*_ne^{i(m-n)\phi}$ integrate to zero due to Fourier orthogonality. **The total Poynting flux is therefore simply a sum over the Poynting fluxes calculated separately for each $m$.** -A note regarding the source polarization at $r > 0$. The $\hat{x}$ polarization in 3d (the "in-plane" polarization) corresponds to the $\hat{r}$ polarization in cylindrical coordinates. An $\hat{r}$-polarized point-dipole source involves $\hat{r}$-polarized point sources in the $m$-simulations. Even though $\hat{r}$ is $\phi$-dependent, $\hat{r}$ is only evaluated at $\phi = 0$ because of $\delta(\phi)$. $\hat{r}$ is therefore equivalent to $\hat{x}$. This property does not hold for an $\hat{x}$-polarized point source at $r = 0$. A source at $r = 0$ does not involve $\delta(\phi)$. $\hat{x}$ is therefore defined in a more general way as $\hat{x} = \hat{r}\cos(\phi) - \hat{\phi}\sin(\phi)$. The $\sin$ and $\cos$ terms of this definition are why simulations for $m = \pm 1$ are necessary. See also [Tutorial/Scattering Cross Section of a Finite Dielectric Cylinder](#scattering-cross-section-of-a-finite-dielectric-cylinder). +A note regarding the source polarization at $r > 0$. The $\hat{x}$ polarization in 3d (the "in-plane" polarization) corresponds to the $\hat{r}$ polarization in cylindrical coordinates. An $\hat{r}$-polarized point-dipole source involves $\hat{r}$-polarized point sources in the $m$-simulations. Even though $\hat{r}$ is $\phi$-dependent, $\hat{r}$ is only evaluated at $\phi = 0$ because of $\delta(\phi)$. $\hat{r}$ is therefore equivalent to $\hat{x}$. This property does not hold for an $\hat{x}$-polarized point source at $r = 0$ (where $\delta(\phi)$ is replaced by $1/2\pi$): in that case, we write $\hat{x} = \hat{r}\cos(\phi) - \hat{\phi}\sin(\phi)$, and the $\sin$ and $\cos$ terms yield simulations for $m = \pm 1$. See also [Tutorial/Scattering Cross Section of a Finite Dielectric Cylinder](#scattering-cross-section-of-a-finite-dielectric-cylinder). Two features of this method may provide a significant speedup compared to an identical 3d simulation: From fdca86165bf2f968c9bfcb8b60663e5394bc033f Mon Sep 17 00:00:00 2001 From: Ardavan Oskooi Date: Tue, 4 Apr 2023 10:03:36 -0700 Subject: [PATCH 13/13] Update doc/docs/Python_Tutorials/Cylindrical_Coordinates.md Co-authored-by: Steven G. Johnson --- doc/docs/Python_Tutorials/Cylindrical_Coordinates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md index 6ec9c4896..ed77b081d 100644 --- a/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md +++ b/doc/docs/Python_Tutorials/Cylindrical_Coordinates.md @@ -603,7 +603,7 @@ A note regarding the source polarization at $r > 0$. The $\hat{x}$ polarization Two features of this method may provide a significant speedup compared to an identical 3d simulation: -1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M$ can be derived analytically as $M \approx r \omega$ where $\omega$ is the angular frequency of the source within the source medium. This relationship comes from expressing the maximum phase of the fields of a *guided* mode in terms of the wavevector of a planewave in free space: $M = kr$ where $k = n\omega_0/c$ is the light line in a medium with index $n$ and $\omega_0$ is the angular frequency in vacuum ($c = 1$ in Meep units). For $m > M$, the field oscillations tend to be too rapid and the current source radiates power into non-guided (i.e., free space) modes. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M = 16$ simulations. (In practice, however, we can usually truncate the Fourier-series expansion earlier without significantly degrading accuracy whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions used in this tutorial example. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. +1. Convergence of the Fourier series may require only a small number ($M + 1$) of simulations. For a given source position $r$, $M$ can be estimated analytically as $M \approx k r$ where $k = n\omega/c$ is the wavenumber of the source within the source medium. This comes from the fact that a source $\sim e^{im\phi}$ at $r$ oscillates in the angular direction with a spatial frequency $m/r$, but $m/r > k$ waves are evanescent, so for $m \gtrsim kr$ the radiated power tends to drop exponentially. As an example, a point-dipole source with wavelength of $1.0 \mu m$ at a radial position of $r = 1.0 \mu m$ within a medium of $n = 2.4$ would require roughly $M = 16$ simulations. (In practice, however, we can usually truncate the Fourier-series expansion earlier without significantly degrading accuracy whenever the radiated flux at some $m$ has dropped to some small fraction of its maximum value in the summation.) The plot below shows the radiated flux vs. $m$ for three different source positions used in this tutorial example. Generally, the farther the point source is from $r = 0$, the more simulations are required for the Fourier-series summation to converge. 2. Each $m$-simulation in the Fourier-series expansion is independent of the others. The simulations can therefore be executed simultaneously using an [embarassingly parallel](https://meep.readthedocs.io/en/latest/Parallel_Meep/#different-forms-of-parallelization) approach.