update fdtd and add some fdtd tests
parent
ecaf9fa3d0
commit
dd4e6f294f
@ -0,0 +1,68 @@
|
||||
import unittest
|
||||
import numpy
|
||||
|
||||
from fdfd_tools import fdtd
|
||||
|
||||
class TestBasic2D(unittest.TestCase):
|
||||
def setUp(self):
|
||||
shape = [3, 5, 5, 1]
|
||||
dt = 0.5
|
||||
epsilon = numpy.ones(shape, dtype=float)
|
||||
|
||||
src_mask = numpy.zeros_like(epsilon, dtype=bool)
|
||||
src_mask[1, 2, 2, 0] = True
|
||||
|
||||
e = numpy.zeros_like(epsilon)
|
||||
h = numpy.zeros_like(epsilon)
|
||||
e[src_mask] = 32
|
||||
es = [e]
|
||||
hs = [h]
|
||||
|
||||
eh2h = fdtd.maxwell_h(dt=dt)
|
||||
eh2e = fdtd.maxwell_e(dt=dt)
|
||||
for _ in range(9):
|
||||
e = e.copy()
|
||||
h = h.copy()
|
||||
eh2h(e, h)
|
||||
eh2e(e, h, epsilon)
|
||||
es.append(e)
|
||||
hs.append(h)
|
||||
|
||||
self.es = es
|
||||
self.hs = hs
|
||||
self.dt = dt
|
||||
self.epsilon = epsilon
|
||||
self.src_mask = src_mask
|
||||
|
||||
def test_initial_fields(self):
|
||||
# Make sure initial fields didn't change
|
||||
e0 = self.es[0]
|
||||
h0 = self.hs[0]
|
||||
self.assertEqual(e0[1, 2, 2, 0], 32)
|
||||
|
||||
self.assertFalse(e0[~self.src_mask].any())
|
||||
self.assertFalse(h0.any())
|
||||
|
||||
|
||||
def test_initial_energy(self):
|
||||
e0 = self.es[0]
|
||||
h0 = self.hs[0]
|
||||
h1 = self.hs[1]
|
||||
mask = self.src_mask[1]
|
||||
|
||||
# Make sure initial energy and E dot J are correct
|
||||
energy0 = fdtd.energy_estep(h0=h0, e1=e0, h2=self.hs[1])
|
||||
e_dot_j_0 = fdtd.delta_energy_j(j0=e0 - 0, e1=e0)
|
||||
self.assertEqual(energy0[mask], 32 * 32)
|
||||
self.assertFalse(energy0[~mask].any())
|
||||
self.assertEqual(e_dot_j_0[mask], 32 * 32)
|
||||
self.assertFalse(e_dot_j_0[~mask].any())
|
||||
|
||||
|
||||
def test_energy_conservation(self):
|
||||
for ii in range(1, 8):
|
||||
with self.subTest(i=ii):
|
||||
u_estep = fdtd.energy_estep(h0=self.hs[ii], e1=self.es[ii], h2=self.hs[ii + 1])
|
||||
u_hstep = fdtd.energy_hstep(e0=self.es[ii-1], h1=self.hs[ii], e2=self.es[ii])
|
||||
self.assertTrue(numpy.allclose(u_estep.sum(), 32 * 32))
|
||||
self.assertTrue(numpy.allclose(u_hstep.sum(), 32 * 32))
|
Loading…
Reference in New Issue