FieldMesh ConversionĀ¶
InĀ [1]:
Copied!
from pmd_beamphysics import FieldMesh
import numpy as np
import matplotlib.pyplot as plt
from pmd_beamphysics import FieldMesh
import numpy as np
import matplotlib.pyplot as plt
2D cylindrically symmetric RF gun FieldMeshĀ¶
This data was originally generated using Superfish.
InĀ [2]:
Copied!
FM1 = FieldMesh("../data/rfgun.h5")
FM1.plot("re_E", aspect="equal", figsize=(12, 4))
FM1 = FieldMesh("../data/rfgun.h5")
FM1.plot("re_E", aspect="equal", figsize=(12, 4))
3D rectangular field from ANSYSĀ¶
InĀ [3]:
Copied!
FM3D = FieldMesh.from_ansys_ascii_3d(
efile="../data/ansys_rfgun_2856MHz_E.dat",
hfile="../data/ansys_rfgun_2856MHz_H.dat",
frequency=2856e6,
)
FM3D
FM3D = FieldMesh.from_ansys_ascii_3d(
efile="../data/ansys_rfgun_2856MHz_E.dat",
hfile="../data/ansys_rfgun_2856MHz_H.dat",
frequency=2856e6,
)
FM3D
Out[3]:
<FieldMesh with rectangular geometry and (3, 3, 457) shape at 0x7f92acfd02d0>
This will convert to 2D cylindrical:
InĀ [4]:
Copied!
FM2 = FM3D.to_cylindrical()
FM2
FM2 = FM3D.to_cylindrical()
FM2
Out[4]:
<FieldMesh with cylindrical geometry and (2, 1, 457) shape at 0x7f92ad486ad0>
Spacing is different:
InĀ [5]:
Copied!
FM1.dr, FM2.dr
FM1.dr, FM2.dr
Out[5]:
(np.float64(0.00025), np.float64(0.001))
Set a scale to rotate and normalize Ez to be mostly real
InĀ [6]:
Copied!
E0 = FM2.components["electricField/z"][0, 0, 0]
FM2.scale = -np.exp(-1j * np.angle(E0)) / np.abs(E0) # - sign to agree with FM1
FM2.Ez[0, 0, 0]
E0 = FM2.components["electricField/z"][0, 0, 0]
FM2.scale = -np.exp(-1j * np.angle(E0)) / np.abs(E0) # - sign to agree with FM1
FM2.Ez[0, 0, 0]
Out[6]:
np.complex128(-1-1.890985933883628e-16j)
InĀ [7]:
Copied!
z1 = FM1.coord_vec("z")
z2 = FM2.coord_vec("z")
fig, ax = plt.subplots()
ax.plot(z1, np.real(FM1.Ez[0, 0, :]), label="Superfish")
ax.plot(z2, np.real(FM2.Ez[0, 0, :]), label="ANSYS")
ax.set_xlabel(r"$z$ (m)")
ax.set_ylabel(r"$E_z$ (V/m)")
plt.legend()
z1 = FM1.coord_vec("z")
z2 = FM2.coord_vec("z")
fig, ax = plt.subplots()
ax.plot(z1, np.real(FM1.Ez[0, 0, :]), label="Superfish")
ax.plot(z2, np.real(FM2.Ez[0, 0, :]), label="ANSYS")
ax.set_xlabel(r"$z$ (m)")
ax.set_ylabel(r"$E_z$ (V/m)")
plt.legend()
Out[7]:
<matplotlib.legend.Legend at 0x7f92acf56cf0>
InĀ [8]:
Copied!
fig, ax = plt.subplots()
ax.plot(z1, np.imag(FM1.Btheta[4, 0, :]), label="superfish")
ax.plot(z2, np.imag(FM2.Btheta[1, 0, :]), label="ansys")
ax.set_title(rf"$r$ = {FM2.dr*1000} mm")
ax.set_xlabel(r"$z$ (m)")
ax.set_ylabel(r"$B_\theta$ (T)")
plt.legend()
fig, ax = plt.subplots()
ax.plot(z1, np.imag(FM1.Btheta[4, 0, :]), label="superfish")
ax.plot(z2, np.imag(FM2.Btheta[1, 0, :]), label="ansys")
ax.set_title(rf"$r$ = {FM2.dr*1000} mm")
ax.set_xlabel(r"$z$ (m)")
ax.set_ylabel(r"$B_\theta$ (T)")
plt.legend()
Out[8]:
<matplotlib.legend.Legend at 0x7f92a4d52350>
The magnetic field is out of phase, so use the im_
syntax:
InĀ [9]:
Copied!
FM2.plot("im_Btheta", aspect="equal", figsize=(12, 4))
FM2.plot("im_Btheta", aspect="equal", figsize=(12, 4))
Max on-axis field:
InĀ [10]:
Copied!
np.abs(FM2.Ez[0, 0, :]).max()
np.abs(FM2.Ez[0, 0, :]).max()
Out[10]:
np.float64(1.0153992993439902)
Verify the oscillationĀ¶
Complex fields oscillate as $e^{-i\omega t}$. For TM fields, the spatial components $E_z$ and $B_\theta$ near the axis
$\Re E_{z} = -\frac{r}{2}\frac{\omega}{c^2} \Im B_\theta$
InĀ [11]:
Copied!
def check_oscillation(FM, label=""):
c_light = 299792458.0
dr = FM.dr
omega = FM.frequency * 2 * np.pi
# Check the first off-axis grid points
z0 = FM.z
Ez0 = np.real(FM.Ez[0, 0, :])
B1 = -np.imag(FM.Btheta[1, 0, :])
plt.plot(z0, Ez0, label=r"$\Re \left( E_z\right)$")
plt.plot(
z0,
B1 * 2 / dr * c_light**2 / omega,
"--",
label=r"$-\frac{r}{2}\frac{\omega}{c^2} \Im\left(B_\theta\right)$",
)
plt.ylabel("field (V/m)")
plt.xlabel("z (m)")
plt.legend()
plt.title(rf"Complex field oscillation{label}")
def check_oscillation(FM, label=""):
c_light = 299792458.0
dr = FM.dr
omega = FM.frequency * 2 * np.pi
# Check the first off-axis grid points
z0 = FM.z
Ez0 = np.real(FM.Ez[0, 0, :])
B1 = -np.imag(FM.Btheta[1, 0, :])
plt.plot(z0, Ez0, label=r"$\Re \left( E_z\right)$")
plt.plot(
z0,
B1 * 2 / dr * c_light**2 / omega,
"--",
label=r"$-\frac{r}{2}\frac{\omega}{c^2} \Im\left(B_\theta\right)$",
)
plt.ylabel("field (V/m)")
plt.xlabel("z (m)")
plt.legend()
plt.title(rf"Complex field oscillation{label}")
InĀ [12]:
Copied!
check_oscillation(FM1, ", Superfish")
check_oscillation(FM1, ", Superfish")
InĀ [13]:
Copied!
check_oscillation(FM2, ", ANSYS")
check_oscillation(FM2, ", ANSYS")