Source and receiver steps now stored in a tuple (x, y, z).

Corrected FFT calculation used to give dispersion warning (was 20log10, now 10log10).
Simplified current calc functions.
这个提交包含在:
Craig Warren
2016-09-30 14:19:40 +01:00
父节点 3c85d5c3c8
当前提交 f9c7731ae2

查看文件

@@ -93,18 +93,15 @@ class FDTDGrid(Grid):
self.averagevolumeobjects = True self.averagevolumeobjects = True
self.fractalvolumes = [] self.fractalvolumes = []
self.geometryviews = [] self.geometryviews = []
self.geometryobjectswrite = []
self.waveforms = [] self.waveforms = []
self.voltagesources = [] self.voltagesources = []
self.hertziandipoles = [] self.hertziandipoles = []
self.magneticdipoles = [] self.magneticdipoles = []
self.transmissionlines = [] self.transmissionlines = []
self.rxs = [] self.rxs = []
self.srcstepx = 0 self.srcsteps = (0, 0, 0)
self.srcstepy = 0 self.rxsteps = (0, 0, 0)
self.srcstepz = 0
self.rxstepx = 0
self.rxstepy = 0
self.rxstepz = 0
self.snapshots = [] self.snapshots = []
def initialise_geometry_arrays(self): def initialise_geometry_arrays(self):
@@ -181,13 +178,13 @@ def dispersion_check(G):
# Ensure source waveform is not being overly truncated before attempting any FFT # Ensure source waveform is not being overly truncated before attempting any FFT
if np.abs(waveformvalues[-1]) < np.abs(np.amax(waveformvalues)) / 100: if np.abs(waveformvalues[-1]) < np.abs(np.amax(waveformvalues)) / 100:
# Calculate magnitude of frequency spectra of waveform # Calculate magnitude of frequency spectra of waveform
power = 20 * np.log10(np.abs(np.fft.fft(waveformvalues))**2) power = 10 * np.log10(np.abs(np.fft.fft(waveformvalues))**2)
freqs = np.fft.fftfreq(power.size, d=G.dt) freqs = np.fft.fftfreq(power.size, d=G.dt)
# Shift powers so that frequency with maximum power is at zero decibels # Shift powers so that frequency with maximum power is at zero decibels
power -= np.amax(power) power -= np.amax(power)
# Set maximum frequency to -60dB from maximum power # Set maximum frequency to -60dB from maximum power, ignoring DC value
freq = np.where((np.amax(power[1::]) - power[1::]) > 60)[0][0] + 1 freq = np.where((np.amax(power[1::]) - power[1::]) > 60)[0][0] + 1
maxfreqs.append(freqs[freq]) maxfreqs.append(freqs[freq])
@@ -242,11 +239,11 @@ def Ix(x, y, z, Hy, Hz, G):
if y == 0 or z == 0: if y == 0 or z == 0:
Ix = 0 Ix = 0
return Ix
else: else:
Ix = G.dy * (Hy[x, y, z - 1] - Hy[x, y, z]) + G.dz * (Hz[x, y, z] - Hz[x, y - 1, z]) Ix = G.dy * (Hy[x, y, z - 1] - Hy[x, y, z]) + G.dz * (Hz[x, y, z] - Hz[x, y - 1, z])
return Ix
return Ix
def Iy(x, y, z, Hx, Hz, G): def Iy(x, y, z, Hx, Hz, G):
@@ -260,11 +257,11 @@ def Iy(x, y, z, Hx, Hz, G):
if x == 0 or z == 0: if x == 0 or z == 0:
Iy = 0 Iy = 0
return Iy
else: else:
Iy = G.dx * (Hx[x, y, z] - Hx[x, y, z - 1]) + G.dz * (Hz[x - 1, y, z] - Hz[x, y, z]) Iy = G.dx * (Hx[x, y, z] - Hx[x, y, z - 1]) + G.dz * (Hz[x - 1, y, z] - Hz[x, y, z])
return Iy
return Iy
def Iz(x, y, z, Hx, Hy, G): def Iz(x, y, z, Hx, Hy, G):
@@ -278,8 +275,8 @@ def Iz(x, y, z, Hx, Hy, G):
if x == 0 or y == 0: if x == 0 or y == 0:
Iz = 0 Iz = 0
return Iz
else: else:
Iz = G.dx * (Hx[x, y - 1, z] - Hx[x, y, z]) + G.dy * (Hy[x, y, z] - Hy[x - 1, y, z]) Iz = G.dx * (Hx[x, y - 1, z] - Hx[x, y, z]) + G.dy * (Hy[x, y, z] - Hy[x - 1, y, z])
return Iz
return Iz