Only initialise field/PML arrays on host when using CPU.

这个提交包含在:
Craig Warren
2019-07-31 09:41:43 +01:00
父节点 84fbc065fd
当前提交 c9902b2909
共有 3 个文件被更改,包括 32 次插入19 次删除

查看文件

@@ -254,12 +254,12 @@ class FDTDGrid(Grid):
import pycuda.gpuarray as gpuarray import pycuda.gpuarray as gpuarray
self.ID_gpu = gpuarray.to_gpu(self.ID) self.ID_gpu = gpuarray.to_gpu(self.ID)
self.Ex_gpu = gpuarray.to_gpu(self.Ex) self.Ex_gpu = gpuarray.to_gpu(np.zeros((self.nx + 1, self.ny + 1, self.nz + 1), dtype=floattype))
self.Ey_gpu = gpuarray.to_gpu(self.Ey) self.Ey_gpu = gpuarray.to_gpu(np.zeros((self.nx + 1, self.ny + 1, self.nz + 1), dtype=floattype))
self.Ez_gpu = gpuarray.to_gpu(self.Ez) self.Ez_gpu = gpuarray.to_gpu(np.zeros((self.nx + 1, self.ny + 1, self.nz + 1), dtype=floattype))
self.Hx_gpu = gpuarray.to_gpu(self.Hx) self.Hx_gpu = gpuarray.to_gpu(np.zeros((self.nx + 1, self.ny + 1, self.nz + 1), dtype=floattype))
self.Hy_gpu = gpuarray.to_gpu(self.Hy) self.Hy_gpu = gpuarray.to_gpu(np.zeros((self.nx + 1, self.ny + 1, self.nz + 1), dtype=floattype))
self.Hz_gpu = gpuarray.to_gpu(self.Hz) self.Hz_gpu = gpuarray.to_gpu(np.zeros((self.nx + 1, self.ny + 1, self.nz + 1), dtype=floattype))
def gpu_initialise_dispersive_arrays(self): def gpu_initialise_dispersive_arrays(self):
"""Initialise dispersive material coefficient arrays on GPU.""" """Initialise dispersive material coefficient arrays on GPU."""

查看文件

@@ -180,7 +180,8 @@ def run_model(args, currentmodelrun, modelend, numbermodelruns, inputfile, usern
G.initialise_geometry_arrays() G.initialise_geometry_arrays()
# Initialise arrays for the field components # Initialise arrays for the field components
G.initialise_field_arrays() if G.gpu is None:
G.initialise_field_arrays()
# Process geometry commands in the order they were given # Process geometry commands in the order they were given
process_geometrycmds(geometry, G) process_geometrycmds(geometry, G)
@@ -296,12 +297,13 @@ def run_model(args, currentmodelrun, modelend, numbermodelruns, inputfile, usern
if G.messages: if G.messages:
print(Fore.GREEN + '{} {}\n'.format(inputfilestr, '-' * (get_terminal_width() - 1 - len(inputfilestr))) + Style.RESET_ALL) print(Fore.GREEN + '{} {}\n'.format(inputfilestr, '-' * (get_terminal_width() - 1 - len(inputfilestr))) + Style.RESET_ALL)
# Clear arrays for field components if G.gpu is None:
G.initialise_field_arrays() # Clear arrays for field components
G.initialise_field_arrays()
# Clear arrays for fields in PML # Clear arrays for fields in PML
for pml in G.pmls: for pml in G.pmls:
pml.initialise_field_arrays() pml.initialise_field_arrays()
# Adjust position of simple sources and receivers if required # Adjust position of simple sources and receivers if required
if G.srcsteps[0] != 0 or G.srcsteps[1] != 0 or G.srcsteps[2] != 0: if G.srcsteps[0] != 0 or G.srcsteps[1] != 0 or G.srcsteps[2] != 0:

查看文件

@@ -196,7 +196,8 @@ class PML(object):
self.CFS = G.cfs self.CFS = G.cfs
self.initialise_field_arrays() if G.gpu is None:
self.initialise_field_arrays()
def initialise_field_arrays(self): def initialise_field_arrays(self):
"""Initialise arrays to store fields in PML.""" """Initialise arrays to store fields in PML."""
@@ -308,19 +309,31 @@ class PML(object):
import pycuda.gpuarray as gpuarray import pycuda.gpuarray as gpuarray
self.EPhi1_gpu = gpuarray.to_gpu(self.EPhi1)
self.EPhi2_gpu = gpuarray.to_gpu(self.EPhi2)
self.ERA_gpu = gpuarray.to_gpu(self.ERA) self.ERA_gpu = gpuarray.to_gpu(self.ERA)
self.ERB_gpu = gpuarray.to_gpu(self.ERB) self.ERB_gpu = gpuarray.to_gpu(self.ERB)
self.ERE_gpu = gpuarray.to_gpu(self.ERE) self.ERE_gpu = gpuarray.to_gpu(self.ERE)
self.ERF_gpu = gpuarray.to_gpu(self.ERF) self.ERF_gpu = gpuarray.to_gpu(self.ERF)
self.HPhi1_gpu = gpuarray.to_gpu(self.HPhi1)
self.HPhi2_gpu = gpuarray.to_gpu(self.HPhi2)
self.HRA_gpu = gpuarray.to_gpu(self.HRA) self.HRA_gpu = gpuarray.to_gpu(self.HRA)
self.HRB_gpu = gpuarray.to_gpu(self.HRB) self.HRB_gpu = gpuarray.to_gpu(self.HRB)
self.HRE_gpu = gpuarray.to_gpu(self.HRE) self.HRE_gpu = gpuarray.to_gpu(self.HRE)
self.HRF_gpu = gpuarray.to_gpu(self.HRF) self.HRF_gpu = gpuarray.to_gpu(self.HRF)
if self.direction[0] == 'x':
self.EPhi1_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx + 1, self.ny, self.nz + 1), dtype=floattype))
self.EPhi2_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx + 1, self.ny + 1, self.nz), dtype=floattype))
self.HPhi1_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx, self.ny + 1, self.nz), dtype=floattype))
self.HPhi2_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx, self.ny, self.nz + 1), dtype=floattype))
elif self.direction[0] == 'y':
self.EPhi1_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx, self.ny + 1, self.nz + 1), dtype=floattype))
self.EPhi2_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx + 1, self.ny + 1, self.nz), dtype=floattype))
self.HPhi1_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx + 1, self.ny, self.nz), dtype=floattype))
self.HPhi2_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx, self.ny, self.nz + 1), dtype=floattype))
elif self.direction[0] == 'z':
self.EPhi1_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx, self.ny + 1, self.nz + 1), dtype=floattype))
self.EPhi2_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx + 1, self.ny, self.nz + 1), dtype=floattype))
self.HPhi1_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx + 1, self.ny, self.nz), dtype=floattype))
self.HPhi2_gpu = gpuarray.to_gpu(np.zeros((len(self.CFS), self.nx, self.ny + 1, self.nz), dtype=floattype))
def gpu_get_update_funcs(self, kernelselectric, kernelsmagnetic): def gpu_get_update_funcs(self, kernelselectric, kernelsmagnetic):
"""Get update functions from PML kernels. """Get update functions from PML kernels.
@@ -329,8 +342,6 @@ class PML(object):
kernelsmagnetic: PyCuda SourceModule containing PML kernels for magnetic updates. kernelsmagnetic: PyCuda SourceModule containing PML kernels for magnetic updates.
""" """
from pycuda.compiler import SourceModule
self.update_electric_gpu = kernelselectric.get_function('order' + str(len(self.CFS)) + '_' + self.direction) self.update_electric_gpu = kernelselectric.get_function('order' + str(len(self.CFS)) + '_' + self.direction)
self.update_magnetic_gpu = kernelsmagnetic.get_function('order' + str(len(self.CFS)) + '_' + self.direction) self.update_magnetic_gpu = kernelsmagnetic.get_function('order' + str(len(self.CFS)) + '_' + self.direction)