Tidying line lengths and comments

这个提交包含在:
Craig Warren
2022-11-29 13:08:37 +00:00
父节点 0fca2a2576
当前提交 ff2be95cc8
共有 4 个文件被更改,包括 343 次插入221 次删除

查看文件

@@ -21,7 +21,7 @@ cimport numpy as np
from cython.parallel import prange from cython.parallel import prange
cpdef void cython_update_electric_os( cpdef void update_electric_os(
np.float64_t[:, :] updatecoeffsE, np.float64_t[:, :] updatecoeffsE,
np.uint32_t[:, :, :, :] ID, np.uint32_t[:, :, :, :] ID,
int face, int face,
@@ -48,6 +48,7 @@ cpdef void cython_update_electric_os(
Args: Args:
subgrid: Subgrid class instance. subgrid: Subgrid class instance.
n: string for the normal to the face to update. n: string for the normal to the face to update.
nwn: int for the number of working cell in the normal direction nwn: int for the number of working cell in the normal direction
to the face. to the face.
lookup_id: int id of the H component to update at each node. lookup_id: int id of the H component to update at each node.
@@ -62,9 +63,9 @@ cpdef void cython_update_electric_os(
s: int for separation of inner and outer surfaces. s: int for separation of inner and outer surfaces.
nb: int for number of boundary cells. nb: int for number of boundary cells.
""" """
# Comments here as as per left and right face
cdef Py_ssize_t l, m, l_s, m_s, n_s_l, n_s_r, material_e_l, material_e_r, i0, j0, k0, i1, j1, k1, i2, j2, k2, i3, j3, k3 cdef Py_ssize_t l, m, l_s, m_s, n_s_l, n_s_r, material_e_l, material_e_r
cdef Py_ssize_t i0, j0, k0, i1, j1, k1, i2, j2, k2, i3, j3, k3
cdef int os cdef int os
cdef double inc_n, inc_f cdef double inc_n, inc_f
@@ -94,21 +95,21 @@ cpdef void cython_update_electric_os(
else: else:
m_s = os + (m - m_l) * r + r // 2 m_s = os + (m - m_l) * r + r // 2
# left and right # Left and right
if face == 2: if face == 2:
# main grid index # Main grid index
i0, j0, k0 = n_l, l, m i0, j0, k0 = n_l, l, m
# equivalent subgrid index # Equivalent subgrid index
i1, j1, k1 = n_s_l, l_s, m_s i1, j1, k1 = n_s_l, l_s, m_s
i2, j2, k2 = n_u, l, m i2, j2, k2 = n_u, l, m
i3, j3, k3 = n_s_r, l_s, m_s i3, j3, k3 = n_s_r, l_s, m_s
# front and back # Front and back
if face == 3: if face == 3:
i0, j0, k0 = l, n_l, m i0, j0, k0 = l, n_l, m
i1, j1, k1 = l_s, n_s_l, m_s i1, j1, k1 = l_s, n_s_l, m_s
i2, j2, k2 = l, n_u, m i2, j2, k2 = l, n_u, m
i3, j3, k3 = l_s, n_s_r, m_s i3, j3, k3 = l_s, n_s_r, m_s
# top bottom # Top and bottom
if face == 1: if face == 1:
i0, j0, k0 = l, m, n_l i0, j0, k0 = l, m, n_l
i1, j1, k1 = l_s, m_s, n_s_l i1, j1, k1 = l_s, m_s, n_s_l
@@ -129,7 +130,7 @@ cpdef void cython_update_electric_os(
field[i2, j2, k2] += updatecoeffsE[material_e_r, co] * inc_f field[i2, j2, k2] += updatecoeffsE[material_e_r, co] * inc_f
cpdef void cython_update_magnetic_os( cpdef void update_magnetic_os(
np.float64_t[:, :] updatecoeffsH, np.float64_t[:, :] updatecoeffsH,
np.uint32_t[:, :, :, :] ID, np.uint32_t[:, :, :, :] ID,
int face, int face,
@@ -154,12 +155,10 @@ cpdef void cython_update_magnetic_os(
): ):
""" """
Args: Args:
r: int for subgrid ratio.
s: int for separation of inner and outer surfaces.
nb: int for number of boundary cells.
""" """
cdef Py_ssize_t l, m, l_s, m_s, n_s_l, n_s_r, material_e_l, material_e_r, i0, j0, k0, i1, j1, k1, i2, j2, k2, i3, j3, k3 cdef Py_ssize_t l, m, l_s, m_s, n_s_l, n_s_r, material_e_l, material_e_r
cdef Py_ssize_t i0, j0, k0, i1, j1, k1, i2, j2, k2, i3, j3, k3
cdef int os cdef int os
cdef double inc_n, inc_f cdef double inc_n, inc_f
@@ -168,43 +167,43 @@ cpdef void cython_update_magnetic_os(
# Normal index for the subgrid far face e node # Normal index for the subgrid far face e node
n_s_r = nb + nwn + s * r n_s_r = nb + nwn + s * r
# os inner index for the sub grid # OS inner index for the sub grid
os = nb - r * s os = nb - r * s
for l in prange(l_l, l_u, nogil=True, schedule='static', num_threads=nthreads): for l in prange(l_l, l_u, nogil=True, schedule='static', num_threads=nthreads):
# y coord of the Ex field component # y-coord of the Ex field component
if mid == 1: if mid == 1:
l_s = os + (l - l_l) * r + r // 2 l_s = os + (l - l_l) * r + r // 2
# y coord of the Ez field component # y-coord of the Ez field component
else: else:
l_s = os + (l - l_l) * r l_s = os + (l - l_l) * r
for m in range(m_l, m_u): for m in range(m_l, m_u):
# z coordinate of the Ex node in the subgrid # z-coord of the Ex node in the subgrid
if mid == 1: if mid == 1:
m_s = os + (m - m_l) * r m_s = os + (m - m_l) * r
else: else:
m_s = os + (m - m_l) * r + r // 2 m_s = os + (m - m_l) * r + r // 2
# associate the given indices with their i, j, k values # Associate the given indices with their i, j, k values
# left and right # Left and right
if face == 2: if face == 2:
# main grid index # Main grid index
i0, j0, k0 = n_l, l, m i0, j0, k0 = n_l, l, m
# equivalent subgrid index # Equivalent subgrid index
i1, j1, k1 = n_s_l, l_s, m_s i1, j1, k1 = n_s_l, l_s, m_s
i2, j2, k2 = n_u, l, m i2, j2, k2 = n_u, l, m
i3, j3, k3 = n_s_r, l_s, m_s i3, j3, k3 = n_s_r, l_s, m_s
# front and back # Front and back
if face == 3: if face == 3:
i0, j0, k0 = l, n_l, m i0, j0, k0 = l, n_l, m
i1, j1, k1 = l_s, n_s_l, m_s i1, j1, k1 = l_s, n_s_l, m_s
i2, j2, k2 = l, n_u, m i2, j2, k2 = l, n_u, m
i3, j3, k3 = l_s, n_s_r, m_s i3, j3, k3 = l_s, n_s_r, m_s
# top bottom # Top and bottom
if face == 1: if face == 1:
i0, j0, k0 = l, m, n_l i0, j0, k0 = l, m, n_l
i1, j1, k1 = l_s, m_s, n_s_l i1, j1, k1 = l_s, m_s, n_s_l
@@ -214,7 +213,7 @@ cpdef void cython_update_magnetic_os(
material_e_l = ID[lookup_id, i0, j0, k0] material_e_l = ID[lookup_id, i0, j0, k0]
inc_n = inc_field[i1, j1, k1] * sign_n inc_n = inc_field[i1, j1, k1] * sign_n
# make sure these are the correct grid # Make sure these are the correct grid
field[i0, j0, k0] += updatecoeffsH[material_e_l, co] * inc_n field[i0, j0, k0] += updatecoeffsH[material_e_l, co] * inc_n
# Far face # Far face
@@ -223,7 +222,7 @@ cpdef void cython_update_magnetic_os(
field[i2, j2, k2] += updatecoeffsH[material_e_r, co] * inc_f field[i2, j2, k2] += updatecoeffsH[material_e_r, co] * inc_f
cpdef void cython_update_is( cpdef void update_is(
int nwx, int nwx,
int nwy, int nwy,
int nwz, int nwz,
@@ -249,7 +248,8 @@ cpdef void cython_update_is(
Args: Args:
""" """
cdef Py_ssize_t l, m, i1, j1, k1, i2, j2, k2, field_material_l, field_material_u, inc_i, inc_j cdef Py_ssize_t l, m, i1, j1, k1, i2, j2, k2
cdef Py_ssize_t field_material_l, field_material_u, inc_i, inc_j
cdef double inc_l, inc_u, f_l, f_u cdef double inc_l, inc_u, f_l, f_u
# For inner faces H nodes are 1 cell before n boundary cells # For inner faces H nodes are 1 cell before n boundary cells
cdef int n_o = n + offset cdef int n_o = n + offset
@@ -257,15 +257,15 @@ cpdef void cython_update_is(
for l in prange(n, nwl + n, nogil=True, schedule='static', num_threads=nthreads): for l in prange(n, nwl + n, nogil=True, schedule='static', num_threads=nthreads):
for m in range(n, nwm + n): for m in range(n, nwm + n):
# bottom and top # Bottom and top
if face == 1: if face == 1:
i1, j1, k1 = l, m, n_o i1, j1, k1 = l, m, n_o
i2, j2, k2 = l, m, n + nwz i2, j2, k2 = l, m, n + nwz
# left and right # Left and right
if face == 2: if face == 2:
i1, j1, k1 = n_o, l, m i1, j1, k1 = n_o, l, m
i2, j2, k2 = n + nwx, l, m i2, j2, k2 = n + nwx, l, m
# front and back # Front and back
if face == 3: if face == 3:
i1, j1, k1 = l, n_o, m i1, j1, k1 = l, n_o, m
i2, j2, k2 = l, n + nwy, m i2, j2, k2 = l, n + nwy, m

查看文件

@@ -119,13 +119,13 @@ class Snapshot:
for k, v in self.outputs.items(): for k, v in self.outputs.items():
if v: if v:
self.snapfields[k] = np.zeros((self.nx, self.ny, self.nz), self.snapfields[k] = np.zeros((self.nx, self.ny, self.nz),
dtype=config.sim_config.dtypes['float_or_double']) dtype=config.sim_config.dtypes['float_or_double'])
self.nbytes += (self.snapfields[k].nbytes) self.nbytes += (self.snapfields[k].nbytes)
else: else:
# If output is not required for snapshot just use a mimimal # If output is not required for snapshot just use a mimimal
# size of array - still required to pass to Cython function # size of array - still required to pass to Cython function
self.snapfields[k] = np.zeros((1, 1, 1), self.snapfields[k] = np.zeros((1, 1, 1),
dtype=config.sim_config.dtypes['float_or_double']) dtype=config.sim_config.dtypes['float_or_double'])
def store(self, G): def store(self, G):
"""Store (in memory) electric and magnetic field values for snapshot. """Store (in memory) electric and magnetic field values for snapshot.

查看文件

@@ -253,7 +253,7 @@ class PrecursorNodesBase:
if ('left' in obj[0] or if ('left' in obj[0] or
'bottom' in obj[0] or 'bottom' in obj[0] or
'front' in obj[0]): 'front' in obj[0]):
w = self.l_weight w = self.l_weight
else: else:
w = self.r_weight w = self.r_weight
@@ -303,42 +303,42 @@ class PrecursorNodes(PrecursorNodesBase):
slices = [ slices = [
['hy_left_1', False, ['hy_left_1', False,
(self.i0 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i0 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i0, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Hy], (self.i0, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Hy],
['hy_right_1', False, ['hy_right_1', False,
(self.i1 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i1 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Hy], (self.i1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Hy],
['hz_left_1', True, ['hz_left_1', True,
(self.i0 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i0 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i0, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Hz], (self.i0, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Hz],
['hz_right_1', True, ['hz_right_1', True,
(self.i1 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i1 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Hz], (self.i1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Hz],
['hx_front_1', False, ['hx_front_1', False,
(slice(i0, i1 + 1, 1), self.j0 - 1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j0 - 1, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j0, slice(k0, k1, 1)), self.Hx], (slice(i0, i1 + 1, 1), self.j0, slice(k0, k1, 1)), self.Hx],
['hx_back_1', False, ['hx_back_1', False,
(slice(i0, i1 + 1, 1), self.j1 - 1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j1 - 1, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j1, slice(k0, k1, 1)), self.Hx], (slice(i0, i1 + 1, 1), self.j1, slice(k0, k1, 1)), self.Hx],
['hz_front_1', True, ['hz_front_1', True,
(slice(i0, i1, 1), self.j0 - 1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j0 - 1, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j0, slice(k0, k1 + 1, 1)), self.Hz], (slice(i0, i1, 1), self.j0, slice(k0, k1 + 1, 1)), self.Hz],
['hz_back_1', True, ['hz_back_1', True,
(slice(i0, i1, 1), self.j1 - 1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j1 - 1, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j1, slice(k0, k1 + 1, 1)), self.Hz], (slice(i0, i1, 1), self.j1, slice(k0, k1 + 1, 1)), self.Hz],
['hx_bottom_1', False, ['hx_bottom_1', False,
# check these indexes # check these indexes
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 - 1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 - 1),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0), self.Hx], (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0), self.Hx],
['hx_top_1', False, ['hx_top_1', False,
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 - 1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 - 1),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1), self.Hx], (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1), self.Hx],
['hy_bottom_1', True, ['hy_bottom_1', True,
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 - 1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 - 1),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0), self.Hy], (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0), self.Hy],
['hy_top_1', True, ['hy_top_1', True,
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 - 1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 - 1),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1), self.Hy] (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1), self.Hy]
] ]
for obj in slices: for obj in slices:
@@ -357,7 +357,7 @@ class PrecursorNodes(PrecursorNodesBase):
#j1 = self.j1 + 1 #j1 = self.j1 + 1
#k1 = self.k1 + 1 #k1 = self.k1 + 1
# not extended # Not extended
i0 = self.i0 i0 = self.i0
j0 = self.j0 j0 = self.j0
k0 = self.k0 k0 = self.k0
@@ -367,20 +367,30 @@ class PrecursorNodes(PrecursorNodesBase):
# Spatially interpolate nodes # Spatially interpolate nodes
slices = [ slices = [
['ex_front_1', True, (slice(i0, i1, 1), self.j0, slice(k0, k1 + 1, 1)), self.Ex], ['ex_front_1', True,
['ex_back_1', True, (slice(i0, i1, 1), self.j1, slice(k0, k1 + 1, 1)), self.Ex], (slice(i0, i1, 1), self.j0, slice(k0, k1 + 1, 1)), self.Ex],
['ez_front_1', False, (slice(i0, i1 + 1, 1), self.j0, slice(k0, k1, 1)), self.Ez], ['ex_back_1', True,
['ez_back_1', False, (slice(i0, i1 + 1, 1), self.j1, slice(k0, k1, 1)), self.Ez], (slice(i0, i1, 1), self.j1, slice(k0, k1 + 1, 1)), self.Ex],
['ez_front_1', False,
['ey_left_1', True, (self.i0, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Ey], (slice(i0, i1 + 1, 1), self.j0, slice(k0, k1, 1)), self.Ez],
['ey_right_1', True, (self.i1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Ey], ['ez_back_1', False,
['ez_left_1', False, (self.i0, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Ez], (slice(i0, i1 + 1, 1), self.j1, slice(k0, k1, 1)), self.Ez],
['ez_right_1', False, (self.i1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Ez], ['ey_left_1', True,
(self.i0, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Ey],
['ex_bottom_1', True, (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0), self.Ex], ['ey_right_1', True,
['ex_top_1', True, (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1), self.Ex], (self.i1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Ey],
['ey_bottom_1', False, (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0), self.Ey], ['ez_left_1', False,
['ey_top_1', False, (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1), self.Ey] (self.i0, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Ez],
['ez_right_1', False,
(self.i1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Ez],
['ex_bottom_1', True,
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0), self.Ex],
['ex_top_1', True,
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1), self.Ex],
['ey_bottom_1', False,
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0), self.Ey],
['ey_top_1', False,
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1), self.Ey]
] ]
for obj in slices: for obj in slices:
@@ -419,7 +429,7 @@ class PrecursorNodesFiltered(PrecursorNodesBase):
#j1 = self.j1 + 1 #j1 = self.j1 + 1
#k1 = self.k1 + 1 #k1 = self.k1 + 1
# not extended # Not extended
i0 = self.i0 i0 = self.i0
j0 = self.j0 j0 = self.j0
k0 = self.k0 k0 = self.k0
@@ -429,66 +439,66 @@ class PrecursorNodesFiltered(PrecursorNodesBase):
slices = [ slices = [
['hy_left_1', False, ['hy_left_1', False,
(self.i0 - 2, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i0 - 2, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i0 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i0 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i0, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i0, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i0 + 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Hy], (self.i0 + 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Hy],
['hy_right_1', False, ['hy_right_1', False,
(self.i1 - 2, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i1 - 2, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i1 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i1 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i1 + 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Hy], (self.i1 + 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Hy],
['hz_left_1', True, ['hz_left_1', True,
(self.i0 - 2, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i0 - 2, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i0 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i0 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i0, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i0, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i0 + 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Hz], (self.i0 + 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Hz],
['hz_right_1', True, ['hz_right_1', True,
(self.i1 - 2, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i1 - 2, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i1 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i1 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i1 + 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Hz], (self.i1 + 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Hz],
['hx_front_1', False, ['hx_front_1', False,
(slice(i0, i1 + 1, 1), self.j0 - 2, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j0 - 2, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j0 - 1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j0 - 1, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j0, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j0, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j0 + 1, slice(k0, k1, 1)), self.Hx], (slice(i0, i1 + 1, 1), self.j0 + 1, slice(k0, k1, 1)), self.Hx],
['hx_back_1', False, ['hx_back_1', False,
(slice(i0, i1 + 1, 1), self.j1 - 2, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j1 - 2, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j1 - 1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j1 - 1, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j1, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j1 + 1, slice(k0, k1, 1)), self.Hx], (slice(i0, i1 + 1, 1), self.j1 + 1, slice(k0, k1, 1)), self.Hx],
['hz_front_1', True, ['hz_front_1', True,
(slice(i0, i1, 1), self.j0 - 2, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j0 - 2, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j0 - 1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j0 - 1, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j0, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j0, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j0 + 1, slice(k0, k1 + 1, 1)), self.Hz], (slice(i0, i1, 1), self.j0 + 1, slice(k0, k1 + 1, 1)), self.Hz],
['hz_back_1', True, ['hz_back_1', True,
(slice(i0, i1, 1), self.j1 - 2, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j1 - 2, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j1 - 1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j1 - 1, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j1, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j1 + 1, slice(k0, k1 + 1, 1)), self.Hz], (slice(i0, i1, 1), self.j1 + 1, slice(k0, k1 + 1, 1)), self.Hz],
['hx_bottom_1', False, ['hx_bottom_1', False,
# check these indexes # Check these indexes
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 - 2), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 - 2),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 - 1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 - 1),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 + 1), self.Hx], (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 + 1), self.Hx],
['hx_top_1', False, ['hx_top_1', False,
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 - 2), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 - 2),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 - 1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 - 1),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 + 1), self.Hx], (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 + 1), self.Hx],
['hy_bottom_1', True, ['hy_bottom_1', True,
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 - 2), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 - 2),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 - 1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 - 1),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 + 1), self.Hy], (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 + 1), self.Hy],
['hy_top_1', True, ['hy_top_1', True,
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 - 2), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 - 2),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 - 1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 - 1),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 + 1), self.Hy] (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 + 1), self.Hy]
] ]
for obj in slices: for obj in slices:
@@ -507,7 +517,7 @@ class PrecursorNodesFiltered(PrecursorNodesBase):
#j1 = self.j1 + 1 #j1 = self.j1 + 1
#k1 = self.k1 + 1 #k1 = self.k1 + 1
# not extended # Not extended
i0 = self.i0 i0 = self.i0
j0 = self.j0 j0 = self.j0
k0 = self.k0 k0 = self.k0
@@ -518,66 +528,53 @@ class PrecursorNodesFiltered(PrecursorNodesBase):
# Spatially interpolate nodes # Spatially interpolate nodes
slices = [ slices = [
['ex_front_1', True, ['ex_front_1', True,
(slice(i0, i1, 1), self.j0 - 1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j0 - 1, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j0, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j0, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j0 + 1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j0 + 1, slice(k0, k1 + 1, 1)), self.Ex],
self.Ex],
['ex_back_1', True, ['ex_back_1', True,
(slice(i0, i1, 1), self.j1 - 1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j1 - 1, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j1, slice(k0, k1 + 1, 1)),
(slice(i0, i1, 1), self.j1 + 1, slice(k0, k1 + 1, 1)), (slice(i0, i1, 1), self.j1 + 1, slice(k0, k1 + 1, 1)), self.Ex],
self.Ex],
['ez_front_1', False, ['ez_front_1', False,
(slice(i0, i1 + 1, 1), self.j0 - 1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j0 - 1, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j0, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j0, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j0 + 1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j0 + 1, slice(k0, k1, 1)), self.Ez],
self.Ez],
['ez_back_1', False, ['ez_back_1', False,
(slice(i0, i1 + 1, 1), self.j1 - 1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j1 - 1, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j1, slice(k0, k1, 1)),
(slice(i0, i1 + 1, 1), self.j1 + 1, slice(k0, k1, 1)), (slice(i0, i1 + 1, 1), self.j1 + 1, slice(k0, k1, 1)), self.Ez],
self.Ez],
['ey_left_1', True, ['ey_left_1', True,
(self.i0 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i0 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i0, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i0, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i0 + 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i0 + 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Ey],
self.Ey],
['ey_right_1', True, ['ey_right_1', True,
(self.i1 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i1 - 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)),
(self.i1 + 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), (self.i1 + 1, slice(j0, j1, 1), slice(k0, k1 + 1, 1)), self.Ey],
self.Ey],
['ez_left_1', False, ['ez_left_1', False,
(self.i0 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i0 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i0, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i0, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i0 + 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i0 + 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Ez],
self.Ez],
['ez_right_1', False, ['ez_right_1', False,
(self.i1 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i1 - 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)),
(self.i1 + 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), (self.i1 + 1, slice(j0, j1 + 1, 1), slice(k0, k1, 1)), self.Ez],
self.Ez],
['ex_bottom_1', True, ['ex_bottom_1', True,
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 - 1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 - 1),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 + 1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k0 + 1), self.Ex],
self.Ex],
['ex_top_1', True, ['ex_top_1', True,
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 - 1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 - 1),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1),
(slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 + 1), (slice(i0, i1, 1), slice(j0, j1 + 1, 1), self.k1 + 1), self.Ex],
self.Ex],
['ey_bottom_1', False, ['ey_bottom_1', False,
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 - 1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 - 1),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 + 1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k0 + 1), self.Ey],
self.Ey],
['ey_top_1', False, ['ey_top_1', False,
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 - 1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 - 1),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1),
(slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 + 1), (slice(i0, i1 + 1, 1), slice(j0, j1, 1), self.k1 + 1), self.Ey]
self.Ey]
] ]
for obj in slices: for obj in slices:

查看文件

@@ -20,9 +20,8 @@ import logging
import gprMax.config as config import gprMax.config as config
from ..cython.fields_updates_hsg import (cython_update_electric_os, from ..cython.fields_updates_hsg import (update_electric_os, update_is,
cython_update_is, update_magnetic_os)
cython_update_magnetic_os)
from .grid import SubGridBaseGrid from .grid import SubGridBaseGrid
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -30,61 +29,119 @@ logger = logging.getLogger(__name__)
class SubGridHSG(SubGridBaseGrid): class SubGridHSG(SubGridBaseGrid):
gridtype = '3DSUBGRID'
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
self.gridtype = SubGridHSG.gridtype
def update_magnetic_is(self, precursors): def update_magnetic_is(self, precursors):
"""Updates the subgrid nodes at the IS with the currents derived """Updates the subgrid nodes at the IS with the currents derived
from the main grid. from the main grid.
Args: Args:
nwl, nwm, nwn, face, field, inc_field, lookup_id, sign, mod, co precursors:
""" """
# Form of FDTD update equations for H
# Hz = c0Hz - c1Ey + c2Ex # Hz = c0Hz - c1Ey + c2Ex
# Hy = c0Hy - c3Ex + c1Ez # Hy = c0Hy - c3Ex + c1Ez
# Hx = c0Hx - c2Ez + c3Ey # Hx = c0Hx - c2Ez + c3Ey
# Bottom and Top
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID, self.n_boundary_cells, -1, self.nwx, self.nwy + 1, self.nwz, 1, self.Hy, precursors.ex_bottom, precursors.ex_top, self.IDlookup['Hy'], 1, -1, 3, config.get_model_config().ompthreads)
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID, self.n_boundary_cells, -1, self.nwx + 1, self.nwy, self.nwz, 1, self.Hx, precursors.ey_bottom, precursors.ey_top, self.IDlookup['Hx'], -1, 1, 3, config.get_model_config().ompthreads)
# Left and Right # Bottom and top
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID, self.n_boundary_cells, -1, self.nwy, self.nwz + 1, self.nwx, 2, self.Hz, precursors.ey_left, precursors.ey_right, self.IDlookup['Hz'], 1, -1, 1, config.get_model_config().ompthreads) update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID,
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID, self.n_boundary_cells, -1, self.nwy + 1, self.nwz, self.nwx, 2, self.Hy, precursors.ez_left, precursors.ez_right, self.IDlookup['Hy'], -1, 1, 1, config.get_model_config().ompthreads) self.n_boundary_cells, -1, self.nwx, self.nwy + 1, self.nwz, 1,
self.Hy, precursors.ex_bottom, precursors.ex_top,
self.IDlookup['Hy'], 1, -1, 3,
config.get_model_config().ompthreads)
# Front and Back update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID,
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID, self.n_boundary_cells, -1, self.nwx, self.nwz + 1, self.nwy, 3, self.Hz, precursors.ex_front, precursors.ex_back, self.IDlookup['Hz'], -1, 1, 2, config.get_model_config().ompthreads) self.n_boundary_cells, -1, self.nwx + 1, self.nwy, self.nwz, 1,
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID, self.n_boundary_cells, -1, self.nwx + 1, self.nwz, self.nwy, 3, self.Hx, precursors.ez_front, precursors.ez_back, self.IDlookup['Hx'], 1, -1, 2, config.get_model_config().ompthreads) self.Hx, precursors.ey_bottom, precursors.ey_top,
self.IDlookup['Hx'], -1, 1, 3,
config.get_model_config().ompthreads)
# Left and right
update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID,
self.n_boundary_cells, -1, self.nwy, self.nwz + 1, self.nwx, 2,
self.Hz, precursors.ey_left, precursors.ey_right,
self.IDlookup['Hz'], 1, -1, 1,
config.get_model_config().ompthreads)
update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID,
self.n_boundary_cells, -1, self.nwy + 1, self.nwz, self.nwx, 2,
self.Hy, precursors.ez_left, precursors.ez_right,
self.IDlookup['Hy'], -1, 1, 1,
config.get_model_config().ompthreads)
# Front and back
update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID,
self.n_boundary_cells, -1, self.nwx, self.nwz + 1, self.nwy, 3,
self.Hz, precursors.ex_front, precursors.ex_back,
self.IDlookup['Hz'], -1, 1, 2,
config.get_model_config().ompthreads)
update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsH, self.ID,
self.n_boundary_cells, -1, self.nwx + 1, self.nwz, self.nwy, 3,
self.Hx, precursors.ez_front, precursors.ez_back,
self.IDlookup['Hx'], 1, -1, 2,
config.get_model_config().ompthreads)
def update_electric_is(self, precursors): def update_electric_is(self, precursors):
"""Updates the subgrid nodes at the IS with the currents derived """Updates the subgrid nodes at the IS with the currents derived
from the main grid. from the main grid.
Args: Args:
nwl, nwm, nwn, face, field, inc_field, lookup_id, sign, mod, co precursors
""" """
# Form of FDTD update equations for E
# Ex = c0(Ex) + c2(dHz) - c3(dHy) # Ex = c0(Ex) + c2(dHz) - c3(dHy)
# Ey = c0(Ey) + c3(dHx) - c1(dHz) # Ey = c0(Ey) + c3(dHx) - c1(dHz)
# Ez = c0(Ez) + c1(dHy) - c2(dHx) # Ez = c0(Ez) + c1(dHy) - c2(dHx)
# Bottom and Top # Bottom and top
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID, self.n_boundary_cells, 0, self.nwx, self.nwy + 1, self.nwz, 1, self.Ex, precursors.hy_bottom, precursors.hy_top, self.IDlookup['Ex'], 1, -1, 3, config.get_model_config().ompthreads) update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID,
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID, self.n_boundary_cells, 0, self.nwx + 1, self.nwy, self.nwz, 1, self.Ey, precursors.hx_bottom, precursors.hx_top, self.IDlookup['Ey'], -1, 1, 3, config.get_model_config().ompthreads) self.n_boundary_cells, 0, self.nwx, self.nwy + 1, self.nwz, 1,
self.Ex, precursors.hy_bottom, precursors.hy_top,
self.IDlookup['Ex'], 1, -1, 3,
config.get_model_config().ompthreads)
# Left and Right update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID,
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID, self.n_boundary_cells, 0, self.nwy, self.nwz + 1, self.nwx, 2, self.Ey, precursors.hz_left, precursors.hz_right, self.IDlookup['Ey'], 1, -1, 1, config.get_model_config().ompthreads) self.n_boundary_cells, 0, self.nwx + 1, self.nwy, self.nwz, 1,
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID, self.n_boundary_cells, 0, self.nwy + 1, self.nwz, self.nwx, 2, self.Ez, precursors.hy_left, precursors.hy_right, self.IDlookup['Ez'], -1, 1, 1, config.get_model_config().ompthreads) self.Ey, precursors.hx_bottom, precursors.hx_top,
self.IDlookup['Ey'], -1, 1, 3,
config.get_model_config().ompthreads)
# Front and Back # Left and right
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID, self.n_boundary_cells, 0, self.nwx, self.nwz + 1, self.nwy, 3, self.Ex, precursors.hz_front, precursors.hz_back, self.IDlookup['Ex'], -1, 1, 2, config.get_model_config().ompthreads) update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID,
cython_update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID, self.n_boundary_cells, 0, self.nwx + 1, self.nwz, self.nwy, 3, self.Ez, precursors.hx_front, precursors.hx_back, self.IDlookup['Ez'], 1, -1, 2, config.get_model_config().ompthreads) self.n_boundary_cells, 0, self.nwy, self.nwz + 1, self.nwx, 2,
self.Ey, precursors.hz_left, precursors.hz_right,
self.IDlookup['Ey'], 1, -1, 1,
config.get_model_config().ompthreads)
update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID,
self.n_boundary_cells, 0, self.nwy + 1, self.nwz, self.nwx, 2,
self.Ez, precursors.hy_left, precursors.hy_right,
self.IDlookup['Ez'], -1, 1, 1,
config.get_model_config().ompthreads)
# Front and back
update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID,
self.n_boundary_cells, 0, self.nwx, self.nwz + 1, self.nwy, 3,
self.Ex, precursors.hz_front, precursors.hz_back,
self.IDlookup['Ex'], -1, 1, 2,
config.get_model_config().ompthreads)
update_is(self.nwx, self.nwy, self.nwz, self.updatecoeffsE, self.ID,
self.n_boundary_cells, 0, self.nwx + 1, self.nwz, self.nwy, 3,
self.Ez, precursors.hx_front, precursors.hx_back,
self.IDlookup['Ez'], 1, -1, 2,
config.get_model_config().ompthreads)
def update_electric_os(self, main_grid): def update_electric_os(self, main_grid):
"""""" """
Args:
main_grid: FDTDGrid class describing a grid in a model.
"""
i_l = self.i0 - self.is_os_sep i_l = self.i0 - self.is_os_sep
i_u = self.i1 + self.is_os_sep i_u = self.i1 + self.is_os_sep
j_l = self.j0 - self.is_os_sep j_l = self.j0 - self.is_os_sep
@@ -92,26 +149,62 @@ class SubGridHSG(SubGridBaseGrid):
k_l = self.k0 - self.is_os_sep k_l = self.k0 - self.is_os_sep
k_u = self.k1 + self.is_os_sep k_u = self.k1 + self.is_os_sep
# Args: sub_grid, normal, l_l, l_u, m_l, m_u, n_l, n_u, nwn, lookup_id, field, inc_field, co, sign_n, sign_f
# Form of FDTD update equations for E # Form of FDTD update equations for E
# Ex = c0(Ex) + c2(dHz) - c3(dHy) # Ex = c0(Ex) + c2(dHz) - c3(dHy)
# Ey = c0(Ey) + c3(dHx) - c1(dHz) # Ey = c0(Ey) + c3(dHx) - c1(dHz)
# Ez = c0(Ez) + c1(dHy) - c2(dHx) # Ez = c0(Ez) + c1(dHy) - c2(dHx)
cython_update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 3, i_l, i_u, k_l, k_u + 1, j_l, j_u, self.nwy, main_grid.IDlookup['Ex'], main_grid.Ex, self.Hz, 2, 1, -1, 1, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) # Front and back
cython_update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 3, i_l, i_u + 1, k_l, k_u, j_l, j_u, self.nwy, main_grid.IDlookup['Ez'], main_grid.Ez, self.Hx, 2, -1, 1, 0, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 3,
i_l, i_u, k_l, k_u + 1, j_l, j_u, self.nwy,
main_grid.IDlookup['Ex'], main_grid.Ex, self.Hz,
2, 1, -1, 1, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
# Left and Right update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 3,
cython_update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 2, j_l, j_u, k_l, k_u + 1, i_l, i_u, self.nwx, main_grid.IDlookup['Ey'], main_grid.Ey, self.Hz, 1, -1, 1, 1, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) i_l, i_u + 1, k_l, k_u, j_l, j_u, self.nwy,
cython_update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 2, j_l, j_u + 1, k_l, k_u, i_l, i_u, self.nwx, main_grid.IDlookup['Ez'], main_grid.Ez, self.Hy, 1, 1, -1, 0, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) main_grid.IDlookup['Ez'], main_grid.Ez, self.Hx,
2, -1, 1, 0, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
# Bottom and Top # Left and right
cython_update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 1, i_l, i_u, j_l, j_u + 1, k_l, k_u, self.nwz, main_grid.IDlookup['Ex'], main_grid.Ex, self.Hy, 3, -1, 1, 1, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 2,
cython_update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 1, i_l, i_u + 1, j_l, j_u, k_l, k_u, self.nwz, main_grid.IDlookup['Ey'], main_grid.Ey, self.Hx, 3, 1, -1, 0, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) j_l, j_u, k_l, k_u + 1, i_l, i_u, self.nwx,
main_grid.IDlookup['Ey'], main_grid.Ey, self.Hz,
1, -1, 1, 1, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 2,
j_l, j_u + 1, k_l, k_u, i_l, i_u, self.nwx,
main_grid.IDlookup['Ez'], main_grid.Ez, self.Hy,
1, 1, -1, 0, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
# Bottom and top
update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 1,
i_l, i_u, j_l, j_u + 1, k_l, k_u, self.nwz,
main_grid.IDlookup['Ex'], main_grid.Ex, self.Hy,
3, -1, 1, 1, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
update_electric_os(main_grid.updatecoeffsE, main_grid.ID, 1,
i_l, i_u + 1, j_l, j_u, k_l, k_u, self.nwz,
main_grid.IDlookup['Ey'], main_grid.Ey, self.Hx,
3, 1, -1, 0, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
def update_magnetic_os(self, main_grid): def update_magnetic_os(self, main_grid):
"""""" """
Args:
main_grid: FDTDGrid class describing a grid in a model.
"""
i_l = self.i0 - self.is_os_sep i_l = self.i0 - self.is_os_sep
i_u = self.i1 + self.is_os_sep i_u = self.i1 + self.is_os_sep
j_l = self.j0 - self.is_os_sep j_l = self.j0 - self.is_os_sep
@@ -124,23 +217,55 @@ class SubGridHSG(SubGridBaseGrid):
# Hy = c0Hy - c3Ex + c1Ez # Hy = c0Hy - c3Ex + c1Ez
# Hx = c0Hx - c2Ez + c3Ey # Hx = c0Hx - c2Ez + c3Ey
# Args: sub_grid, normal, l_l, l_u, m_l, m_u, n_l, n_u, nwn, lookup_id, field, inc_field, co, sign_n, sign_f):
# Front and back # Front and back
cython_update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 3, i_l, i_u, k_l, k_u + 1, j_l - 1, j_u, self.nwy, main_grid.IDlookup['Hz'], main_grid.Hz, self.Ex, 2, 1, -1, 1, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 3,
cython_update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 3, i_l, i_u + 1, k_l, k_u, j_l - 1, j_u, self.nwy, main_grid.IDlookup['Hx'], main_grid.Hx, self.Ez, 2, -1, 1, 0, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) i_l, i_u, k_l, k_u + 1, j_l - 1, j_u, self.nwy,
main_grid.IDlookup['Hz'], main_grid.Hz, self.Ex,
2, 1, -1, 1, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
# Left and Right update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 3,
cython_update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 2, j_l, j_u, k_l, k_u + 1, i_l - 1, i_u, self.nwx, main_grid.IDlookup['Hz'], main_grid.Hz, self.Ey, 1, -1, 1, 1, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) i_l, i_u + 1, k_l, k_u, j_l - 1, j_u, self.nwy,
cython_update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 2, j_l, j_u + 1, k_l, k_u, i_l - 1, i_u, self.nwx, main_grid.IDlookup['Hy'], main_grid.Hy, self.Ez, 1, 1, -1, 0, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) main_grid.IDlookup['Hx'], main_grid.Hx, self.Ez,
2, -1, 1, 0, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
# Bottom and Top # Left and right
cython_update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 1, i_l, i_u, j_l, j_u + 1, k_l - 1, k_u, self.nwz, main_grid.IDlookup['Hy'], main_grid.Hy, self.Ex, 3, -1, 1, 1, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 2,
cython_update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 1, i_l, i_u + 1, j_l, j_u, k_l - 1, k_u, self.nwz, main_grid.IDlookup['Hx'], main_grid.Hx, self.Ey, 3, 1, -1, 0, self.ratio, self.is_os_sep, self.n_boundary_cells, config.get_model_config().ompthreads) j_l, j_u, k_l, k_u + 1, i_l - 1, i_u, self.nwx,
main_grid.IDlookup['Hz'], main_grid.Hz, self.Ey,
1, -1, 1, 1, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 2,
j_l, j_u + 1, k_l, k_u, i_l - 1, i_u, self.nwx,
main_grid.IDlookup['Hy'], main_grid.Hy, self.Ez,
1, 1, -1, 0, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
# Bottom and top
update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 1,
i_l, i_u, j_l, j_u + 1, k_l - 1, k_u, self.nwz,
main_grid.IDlookup['Hy'], main_grid.Hy, self.Ex,
3, -1, 1, 1, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
update_magnetic_os(main_grid.updatecoeffsH, main_grid.ID, 1,
i_l, i_u + 1, j_l, j_u, k_l - 1, k_u, self.nwz,
main_grid.IDlookup['Hx'], main_grid.Hx, self.Ey,
3, 1, -1, 0, self.ratio, self.is_os_sep,
self.n_boundary_cells,
config.get_model_config().ompthreads)
def print_info(self): def print_info(self):
"""Prints information about the subgrid. """Prints information about the subgrid.
Useful info:
Total region = working region + Total region = working region +
2 * (is_os_sep * pml_separation * pml_thickness) 2 * (is_os_sep * pml_separation * pml_thickness)
is_os_sep: number of main grid cells between the Inner Surface and is_os_sep: number of main grid cells between the Inner Surface and
@@ -161,7 +286,7 @@ class SubGridHSG(SubGridBaseGrid):
self.k1 * self.dz * self.ratio)) self.k1 * self.dz * self.ratio))
logger.info('') logger.info('')
logger.debug(f'[{self.name}] Type: {self.gridtype}') logger.debug(f'[{self.name}] Type: {self.__class__.__name__}')
logger.info(f'[{self.name}] Ratio: 1:{self.ratio}') logger.info(f'[{self.name}] Ratio: 1:{self.ratio}')
logger.info(f'[{self.name}] Spatial discretisation: {self.dx:g} x ' + logger.info(f'[{self.name}] Spatial discretisation: {self.dx:g} x ' +
f'{self.dy:g} x {self.dz:g}m') f'{self.dy:g} x {self.dz:g}m')