More work on snapshot field choice

这个提交包含在:
craig-warren
2022-11-12 17:12:12 +00:00
父节点 ebbfca834d
当前提交 0b1adc7169
共有 2 个文件被更改,包括 59 次插入61 次删除

查看文件

@@ -26,12 +26,12 @@ cpdef void calculate_snapshot_fields(
int ny,
int nz,
int nthreads,
bint Ex,
bint Ey,
bint Ez,
bint Hx,
bint Hy,
bint Hz,
bint isEx,
bint isEy,
bint isEz,
bint isHx,
bint isHy,
bint isHz,
float_or_double[:, :, ::1] Exslice,
float_or_double[:, :, ::1] Eyslice,
float_or_double[:, :, ::1] Ezslice,
@@ -51,6 +51,7 @@ cpdef void calculate_snapshot_fields(
Args:
nx, ny, nz: ints for size of snapshot array.
nthreads: int for number of threads to use.
is: boolean to determine whether that field snapshot is required.
slice: memoryviews to access slices of field arrays.
snap: memoryviews to access snapshot arrays.
"""
@@ -62,17 +63,17 @@ cpdef void calculate_snapshot_fields(
for k in range(nz):
# The electric field component value at a point comes from the
# average of the 4 electric field component values in that cell.
if Ex:
if isEx:
Exsnap[i, j, k] = (Exslice[i, j, k] +
Exslice[i, j + 1, k] +
Exslice[i, j, k + 1] +
Exslice[i, j + 1, k + 1]) / 4
if Ey:
if isEy:
Eysnap[i, j, k] = (Eyslice[i, j, k] +
Eyslice[i + 1, j, k] +
Eyslice[i, j, k + 1] +
Eyslice[i + 1, j, k + 1]) / 4
if Ez:
if isEz:
Ezsnap[i, j, k] = (Ezslice[i, j, k] +
Ezslice[i + 1, j, k] +
Ezslice[i, j + 1, k] +
@@ -81,12 +82,12 @@ cpdef void calculate_snapshot_fields(
# The magnetic field component value at a point comes from
# average of 2 magnetic field component values in that cell and
# the neighbouring cell.
if Hx:
if isHx:
Hxsnap[i, j, k] = (Hxslice[i, j, k] +
Hxslice[i + 1, j, k]) / 2
if Hy:
if isHy:
Hysnap[i, j, k] = (Hyslice[i, j, k] +
Hyslice[i, j + 1, k]) / 2
if Hz:
if isHz:
Hzsnap[i, j, k] = (Hzslice[i, j, k] +
Hzslice[i, j, k + 1]) / 2

查看文件

@@ -89,9 +89,8 @@ class Snapshot:
dx, dy, dz: ints for the spatial discretisation in cells.
time: int for the iteration number to take the snapshot on.
filename: string for the filename to save to.
fileext: string for the file extension.
outputs: optional list of outputs for receiver. It can be any
selection from Ex, Ey, Ez, Hx, Hy, or Hz.
fileext: optional string for the file extension.
outputs: optional dict of booleans for fields to use for snapshot.
"""
self.fileext = fileext
@@ -113,8 +112,20 @@ class Snapshot:
self.sx = slice(self.xs, self.xf + self.dx, self.dx)
self.sy = slice(self.ys, self.yf + self.dy, self.dy)
self.sz = slice(self.zs, self.zf + self.dz, self.dz)
self.nbytes = (6 * self.nx * self.ny * self.nz *
np.dtype(config.sim_config.dtypes['float_or_double']).itemsize)
self.nbytes = 0
# Create arrays to hold the field data for snapshot
self.snapfields = {}
for k, v in self.outputs.items():
if v:
self.snapfields[k] = np.zeros((self.nx, self.ny, self.nz),
dtype=config.sim_config.dtypes['float_or_double'])
self.nbytes += (self.snapfields[k].nbytes)
else:
# If output is not required for snapshot just use a mimimal
# size of array - still required to pass to Cython function
self.snapfields[k] = np.zeros((1, 1, 1),
dtype=config.sim_config.dtypes['float_or_double'])
def store(self, G):
"""Store (in memory) electric and magnetic field values for snapshot.
@@ -131,20 +142,6 @@ class Snapshot:
Hyslice = np.ascontiguousarray(G.Hy[self.sx, self.sy, self.sz])
Hzslice = np.ascontiguousarray(G.Hz[self.sx, self.sy, self.sz])
# Create arrays to hold the field data for snapshot
self.Exsnap = np.zeros((self.nx, self.ny, self.nz),
dtype=config.sim_config.dtypes['float_or_double'])
self.Eysnap = np.zeros((self.nx, self.ny, self.nz),
dtype=config.sim_config.dtypes['float_or_double'])
self.Ezsnap = np.zeros((self.nx, self.ny, self.nz),
dtype=config.sim_config.dtypes['float_or_double'])
self.Hxsnap = np.zeros((self.nx, self.ny, self.nz),
dtype=config.sim_config.dtypes['float_or_double'])
self.Hysnap = np.zeros((self.nx, self.ny, self.nz),
dtype=config.sim_config.dtypes['float_or_double'])
self.Hzsnap = np.zeros((self.nx, self.ny, self.nz),
dtype=config.sim_config.dtypes['float_or_double'])
# Calculate field values at points (comes from averaging field components in cells)
calculate_snapshot_fields(
self.nx,
@@ -163,12 +160,12 @@ class Snapshot:
Hxslice,
Hyslice,
Hzslice,
self.Exsnap,
self.Eysnap,
self.Ezsnap,
self.Hxsnap,
self.Hysnap,
self.Hzsnap
self.snapfields['Ex'],
self.snapfields['Ey'],
self.snapfields['Ez'],
self.snapfields['Hx'],
self.snapfields['Hy'],
self.snapfields['Hz']
)
def write_file(self, pbar, G):
@@ -198,17 +195,17 @@ class Snapshot:
for k, v in self.outputs.items():
if v:
if k == 'Ex':
celldata[k] = self.Exsnap
celldata[k] = self.snapfields['Ex']
if k == 'Ey':
celldata[k] = self.Eysnap
celldata[k] = self.snapfields['Ey']
if k == 'Ez':
celldata[k] = self.Ezsnap
celldata[k] = self.snapfields['Ez']
if k == 'Hx':
celldata[k] = self.Hxsnap
celldata[k] = self.snapfields['Hx']
if k == 'Hy':
celldata[k] = self.Hysnap
celldata[k] = self.snapfields['Hy']
if k == 'Hz':
celldata[k] = self.Hzsnap
celldata[k] = self.snapfields['Hz']
imageToVTK(str(self.filename.with_suffix('')),
origin=((self.xs * self.dx * G.dx),
@@ -239,23 +236,23 @@ class Snapshot:
f.attrs['time'] = self.time * G.dt
if self.outputs['Ex']:
f['Ex'] = self.Exsnap
pbar.update(n=self.Exsnap.nbytes)
f['Ex'] = self.snapfields['Ex']
pbar.update(n=self.snapfields['Ex'].nbytes)
if self.outputs['Ey']:
f['Ey'] = self.Eysnap
pbar.update(n=self.Eysnap.nbytes)
f['Ey'] = self.snapfields['Ey']
pbar.update(n=self.snapfields['Ey'].nbytes)
if self.outputs['Ez']:
f['Ez'] = self.Ezsnap
pbar.update(n=self.Ezsnap.nbytes)
f['Ez'] = self.snapfields['Ez']
pbar.update(n=self.snapfields['Ez'].nbytes)
if self.outputs['Hx']:
f['Hx'] = self.Hxsnap
pbar.update(n=self.Hxsnap.nbytes)
f['Hx'] = self.snapfields['Hx']
pbar.update(n=self.snapfields['Hx'].nbytes)
if self.outputs['Hy']:
f['Hy'] = self.Hysnap
pbar.update(n=self.Hysnap.nbytes)
f['Hy'] = self.snapfields['Hy']
pbar.update(n=self.snapfields['Hy'].nbytes)
if self.outputs['Hz']:
f['Hz'] = self.Hzsnap
pbar.update(n=self.Hzsnap.nbytes)
f['Hz'] = self.snapfields['Hz']
pbar.update(n=self.snapfields['Hz'].nbytes)
f.close()
@@ -340,9 +337,9 @@ def dtoh_snapshot_array(snapEx_dev, snapEy_dev, snapEz_dev, snapHx_dev, snapHy_d
snap: Snapshot class instance
"""
snap.Exsnap = snapEx_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.Eysnap = snapEy_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.Ezsnap = snapEz_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.Hxsnap = snapHx_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.Hysnap = snapHy_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.Hzsnap = snapHz_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.snapfields['Ex'] = snapEx_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.snapfields['Ey'] = snapEy_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.snapfields['Ez'] = snapEz_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.snapfields['Hx'] = snapHx_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.snapfields['Hy'] = snapHy_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]
snap.snapfields['Hz'] = snapHz_dev[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf]