你已经派生过 gprMax
镜像自地址
https://gitee.com/sunhf/gprMax.git
已同步 2025-08-08 07:24:19 +08:00
Moved some methods to OpenCL grid class
这个提交包含在:
105
gprMax/grid.py
105
gprMax/grid.py
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
import decimal as d
|
import decimal as d
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
from importlib import import_module
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
@@ -309,6 +310,8 @@ class CUDAGrid(FDTDGrid):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
self.gpuarray = import_module("pycuda.gpuarray")
|
||||||
|
|
||||||
# Threads per block - used for main electric/magnetic field updates
|
# Threads per block - used for main electric/magnetic field updates
|
||||||
self.tpb = (128, 1, 1)
|
self.tpb = (128, 1, 1)
|
||||||
# Blocks per grid - used for main electric/magnetic field updates
|
# Blocks per grid - used for main electric/magnetic field updates
|
||||||
@@ -321,81 +324,73 @@ class CUDAGrid(FDTDGrid):
|
|||||||
|
|
||||||
self.bpg = (int(np.ceil(((self.nx + 1) * (self.ny + 1) * (self.nz + 1)) / self.tpb[0])), 1, 1)
|
self.bpg = (int(np.ceil(((self.nx + 1) * (self.ny + 1) * (self.nz + 1)) / self.tpb[0])), 1, 1)
|
||||||
|
|
||||||
def htod_geometry_arrays(self, queue=None):
|
def htod_geometry_arrays(self):
|
||||||
|
"""Initialise an array for cell edge IDs (ID) on compute device."""
|
||||||
|
|
||||||
|
self.ID_dev = self.gpuarray.to_gpu(self.ID)
|
||||||
|
|
||||||
|
def htod_field_arrays(self):
|
||||||
|
"""Initialise field arrays on compute device."""
|
||||||
|
|
||||||
|
self.Ex_dev = self.gpuarray.to_gpu(self.Ex)
|
||||||
|
self.Ey_dev = self.gpuarray.to_gpu(self.Ey)
|
||||||
|
self.Ez_dev = self.gpuarray.to_gpu(self.Ez)
|
||||||
|
self.Hx_dev = self.gpuarray.to_gpu(self.Hx)
|
||||||
|
self.Hy_dev = self.gpuarray.to_gpu(self.Hy)
|
||||||
|
self.Hz_dev = self.gpuarray.to_gpu(self.Hz)
|
||||||
|
|
||||||
|
def htod_dispersive_arrays(self):
|
||||||
|
"""Initialise dispersive material coefficient arrays on compute device."""
|
||||||
|
|
||||||
|
self.updatecoeffsdispersive_dev = self.gpuarray.to_gpu(self.updatecoeffsdispersive)
|
||||||
|
self.Tx_dev = self.gpuarray.to_gpu(self.Tx)
|
||||||
|
self.Ty_dev = self.gpuarray.to_gpu(self.Ty)
|
||||||
|
self.Tz_dev = self.gpuarray.to_gpu(self.Tz)
|
||||||
|
|
||||||
|
|
||||||
|
class OpenCLGrid(FDTDGrid):
|
||||||
|
"""Additional grid methods for solving on compute device using OpenCL."""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self.clarray = import_module("pyopencl.array")
|
||||||
|
|
||||||
|
def htod_geometry_arrays(self, queue):
|
||||||
"""Initialise an array for cell edge IDs (ID) on compute device.
|
"""Initialise an array for cell edge IDs (ID) on compute device.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
queue: pyopencl queue.
|
queue: pyopencl queue.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if config.sim_config.general["solver"] == "cuda":
|
self.ID_dev = self.clarray.to_device(queue, self.ID)
|
||||||
import pycuda.gpuarray as gpuarray
|
|
||||||
|
|
||||||
self.ID_dev = gpuarray.to_gpu(self.ID)
|
def htod_field_arrays(self, queue):
|
||||||
|
|
||||||
elif config.sim_config.general["solver"] == "opencl":
|
|
||||||
import pyopencl.array as clarray
|
|
||||||
|
|
||||||
self.ID_dev = clarray.to_device(queue, self.ID)
|
|
||||||
|
|
||||||
def htod_field_arrays(self, queue=None):
|
|
||||||
"""Initialise field arrays on compute device.
|
"""Initialise field arrays on compute device.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
queue: pyopencl queue.
|
queue: pyopencl queue.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if config.sim_config.general["solver"] == "cuda":
|
self.Ex_dev = self.clarray.to_device(queue, self.Ex)
|
||||||
import pycuda.gpuarray as gpuarray
|
self.Ey_dev = self.clarray.to_device(queue, self.Ey)
|
||||||
|
self.Ez_dev = self.clarray.to_device(queue, self.Ez)
|
||||||
|
self.Hx_dev = self.clarray.to_device(queue, self.Hx)
|
||||||
|
self.Hy_dev = self.clarray.to_device(queue, self.Hy)
|
||||||
|
self.Hz_dev = self.clarray.to_device(queue, self.Hz)
|
||||||
|
|
||||||
self.Ex_dev = gpuarray.to_gpu(self.Ex)
|
def htod_dispersive_arrays(self, queue):
|
||||||
self.Ey_dev = gpuarray.to_gpu(self.Ey)
|
|
||||||
self.Ez_dev = gpuarray.to_gpu(self.Ez)
|
|
||||||
self.Hx_dev = gpuarray.to_gpu(self.Hx)
|
|
||||||
self.Hy_dev = gpuarray.to_gpu(self.Hy)
|
|
||||||
self.Hz_dev = gpuarray.to_gpu(self.Hz)
|
|
||||||
|
|
||||||
elif config.sim_config.general["solver"] == "opencl":
|
|
||||||
import pyopencl.array as clarray
|
|
||||||
|
|
||||||
self.Ex_dev = clarray.to_device(queue, self.Ex)
|
|
||||||
self.Ey_dev = clarray.to_device(queue, self.Ey)
|
|
||||||
self.Ez_dev = clarray.to_device(queue, self.Ez)
|
|
||||||
self.Hx_dev = clarray.to_device(queue, self.Hx)
|
|
||||||
self.Hy_dev = clarray.to_device(queue, self.Hy)
|
|
||||||
self.Hz_dev = clarray.to_device(queue, self.Hz)
|
|
||||||
|
|
||||||
def htod_dispersive_arrays(self, queue=None):
|
|
||||||
"""Initialise dispersive material coefficient arrays on compute device.
|
"""Initialise dispersive material coefficient arrays on compute device.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
queue: pyopencl queue.
|
queue: pyopencl queue.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if config.sim_config.general["solver"] == "cuda":
|
self.updatecoeffsdispersive_dev = self.clarray.to_device(queue, self.updatecoeffsdispersive)
|
||||||
import pycuda.gpuarray as gpuarray
|
# self.updatecoeffsdispersive_dev = self.clarray.to_device(queue, np.ones((95,95,95), dtype=np.float32))
|
||||||
|
self.Tx_dev = self.clarray.to_device(queue, self.Tx)
|
||||||
self.Tx_dev = gpuarray.to_gpu(self.Tx)
|
self.Ty_dev = self.clarray.to_device(queue, self.Ty)
|
||||||
self.Ty_dev = gpuarray.to_gpu(self.Ty)
|
self.Tz_dev = self.clarray.to_device(queue, self.Tz)
|
||||||
self.Tz_dev = gpuarray.to_gpu(self.Tz)
|
|
||||||
self.updatecoeffsdispersive_dev = gpuarray.to_gpu(self.updatecoeffsdispersive)
|
|
||||||
elif config.sim_config.general["solver"] == "opencl":
|
|
||||||
import pyopencl.array as clarray
|
|
||||||
|
|
||||||
self.Tx_dev = clarray.to_device(queue, self.Tx)
|
|
||||||
self.Ty_dev = clarray.to_device(queue, self.Ty)
|
|
||||||
self.Tz_dev = clarray.to_device(queue, self.Tz)
|
|
||||||
self.updatecoeffsdispersive_dev = clarray.to_device(queue, self.updatecoeffsdispersive)
|
|
||||||
|
|
||||||
|
|
||||||
class OpenCLGrid(CUDAGrid):
|
|
||||||
"""Additional grid methods for solving on compute device using OpenCL."""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
def set_blocks_per_grid(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def dispersion_analysis(G):
|
def dispersion_analysis(G):
|
||||||
|
在新工单中引用
屏蔽一个用户