diff --git a/gprMax/grid.py b/gprMax/grid.py index f619c174..83e93b8e 100644 --- a/gprMax/grid.py +++ b/gprMax/grid.py @@ -28,9 +28,11 @@ np.seterr(invalid='raise') from gprMax.constants import c from gprMax.constants import floattype from gprMax.constants import complextype +from gprMax.exceptions import GeneralError from gprMax.materials import Material from gprMax.pml import PML from gprMax.utilities import fft_power +from gprMax.utilities import human_size from gprMax.utilities import round_value @@ -234,8 +236,8 @@ class FDTDGrid(Grid): # Check if model can be run on specified GPU if required if self.gpu is not None: if self.memoryusage > self.gpu.totalmem: - if snapmemsize != 0: - G.snapsgpu2cpu = True + if snapsmemsize != 0: + self.snapsgpu2cpu = True else: raise GeneralError('Memory (RAM) required ~{} exceeds {} detected on specified {} - {} GPU!\n'.format(human_size(self.memoryusage), human_size(self.gpu.totalmem, a_kilobyte_is_1024_bytes=True), self.gpu.deviceID, self.gpu.name)) diff --git a/gprMax/materials.py b/gprMax/materials.py index 5165b678..c7065e01 100644 --- a/gprMax/materials.py +++ b/gprMax/materials.py @@ -282,7 +282,7 @@ class PeplinskiSoil(object): erealw = Material.watereri + ((Material.waterdeltaer) / (1 + (w * Material.watertau)**2)) a = 0.65 # Experimentally derived constant - es = (1.01 + 0.44 * self.rs)**2 - 0.062 # Relative permittivity of sand particles + es = (1.01 + 0.44 * self.rs)**2 - 0.062 #  Relative permittivity of sand particles b1 = 1.2748 - 0.519 * self.S - 0.152 * self.C b2 = 1.33797 - 0.603 * self.S - 0.166 * self.C diff --git a/gprMax/model_build_run.py b/gprMax/model_build_run.py index 42611c40..d6442faf 100644 --- a/gprMax/model_build_run.py +++ b/gprMax/model_build_run.py @@ -547,33 +547,33 @@ def solve_gpu(currentmodelrun, modelend, G): # Store field component values for every receiver if G.rxs: store_outputs_gpu(np.int32(len(G.rxs)), np.int32(iteration), - rxcoords_gpu.gpudata, rxs_gpu.gpudata, - G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, - G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, - block=(1, 1, 1), grid=(round32(len(G.rxs)), 1, 1)) + rxcoords_gpu.gpudata, rxs_gpu.gpudata, + G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, + G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, + block=(1, 1, 1), grid=(round32(len(G.rxs)), 1, 1)) # Store any snapshots for i, snap in enumerate(G.snapshots): if snap.time == iteration + 1: store_snapshot_gpu(np.int32(i), np.int32(snap.xs), - np.int32(snap.xf), np.int32(snap.ys), - np.int32(snap.yf), np.int32(snap.zs), - np.int32(snap.zf), np.int32(snap.dx), - np.int32(snap.dy), np.int32(snap.dz), - G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, - G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, - snapEx_gpu.gpudata, snapEy_gpu.gpudata, snapEz_gpu.gpudata, - snapHx_gpu.gpudata, snapHy_gpu.gpudata, snapHz_gpu.gpudata, - block=Snapshot.tpb, grid=Snapshot.bpg) + np.int32(snap.xf), np.int32(snap.ys), + np.int32(snap.yf), np.int32(snap.zs), + np.int32(snap.zf), np.int32(snap.dx), + np.int32(snap.dy), np.int32(snap.dz), + G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, + G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, + snapEx_gpu.gpudata, snapEy_gpu.gpudata, snapEz_gpu.gpudata, + snapHx_gpu.gpudata, snapHy_gpu.gpudata, snapHz_gpu.gpudata, + block=Snapshot.tpb, grid=Snapshot.bpg) if G.snapsgpu2cpu: gpu_get_snapshot_array(snapEx_gpu.get(), snapEy_gpu.get(), snapEz_gpu.get(), - snapHx_gpu.get(), snapHy_gpu.get(), snapHz_gpu.get(), i, snap) + snapHx_gpu.get(), snapHy_gpu.get(), snapHz_gpu.get(), i, snap) # Update magnetic field components update_h_gpu(np.int32(G.nx), np.int32(G.ny), np.int32(G.nz), - G.ID_gpu.gpudata, G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, - G.Hz_gpu.gpudata, G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, - G.Ez_gpu.gpudata, block=G.tpb, grid=G.bpg) + G.ID_gpu.gpudata, G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, + G.Hz_gpu.gpudata, G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, + G.Ez_gpu.gpudata, block=G.tpb, grid=G.bpg) # Update magnetic field components with the PML correction for pml in G.pmls: @@ -582,28 +582,28 @@ def solve_gpu(currentmodelrun, modelend, G): # Update magnetic field components for magetic dipole sources if G.magneticdipoles: update_magnetic_dipole_gpu(np.int32(len(G.magneticdipoles)), np.int32(iteration), - floattype(G.dx), floattype(G.dy), floattype(G.dz), - srcinfo1_magnetic_gpu.gpudata, srcinfo2_magnetic_gpu.gpudata, - srcwaves_magnetic_gpu.gpudata, G.ID_gpu.gpudata, - G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, - block=(1, 1, 1), grid=(round32(len(G.magneticdipoles)), 1, 1)) + floattype(G.dx), floattype(G.dy), floattype(G.dz), + srcinfo1_magnetic_gpu.gpudata, srcinfo2_magnetic_gpu.gpudata, + srcwaves_magnetic_gpu.gpudata, G.ID_gpu.gpudata, + G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, + block=(1, 1, 1), grid=(round32(len(G.magneticdipoles)), 1, 1)) # Update electric field components # If all materials are non-dispersive do standard update if Material.maxpoles == 0: update_e_gpu(np.int32(G.nx), np.int32(G.ny), np.int32(G.nz), G.ID_gpu.gpudata, - G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, - G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, - block=G.tpb, grid=G.bpg) + G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, + G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, + block=G.tpb, grid=G.bpg) # If there are any dispersive materials do 1st part of dispersive update # (it is split into two parts as it requires present and updated electric field values). else: update_e_dispersive_A_gpu(np.int32(G.nx), np.int32(G.ny), np.int32(G.nz), - np.int32(Material.maxpoles), G.updatecoeffsdispersive_gpu.gpudata, - G.Tx_gpu.gpudata, G.Ty_gpu.gpudata, G.Tz_gpu.gpudata, G.ID_gpu.gpudata, - G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, - G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, - block=G.tpb, grid=G.bpg) + np.int32(Material.maxpoles), G.updatecoeffsdispersive_gpu.gpudata, + G.Tx_gpu.gpudata, G.Ty_gpu.gpudata, G.Tz_gpu.gpudata, G.ID_gpu.gpudata, + G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, + G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata, + block=G.tpb, grid=G.bpg) # Update electric field components with the PML correction for pml in G.pmls: @@ -612,28 +612,28 @@ def solve_gpu(currentmodelrun, modelend, G): # Update electric field components for voltage sources if G.voltagesources: update_voltage_source_gpu(np.int32(len(G.voltagesources)), np.int32(iteration), - floattype(G.dx), floattype(G.dy), floattype(G.dz), - srcinfo1_voltage_gpu.gpudata, srcinfo2_voltage_gpu.gpudata, - srcwaves_voltage_gpu.gpudata, G.ID_gpu.gpudata, - G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, - block=(1, 1, 1), grid=(round32(len(G.voltagesources)), 1, 1)) + floattype(G.dx), floattype(G.dy), floattype(G.dz), + srcinfo1_voltage_gpu.gpudata, srcinfo2_voltage_gpu.gpudata, + srcwaves_voltage_gpu.gpudata, G.ID_gpu.gpudata, + G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, + block=(1, 1, 1), grid=(round32(len(G.voltagesources)), 1, 1)) # Update electric field components for Hertzian dipole sources (update any Hertzian dipole sources last) if G.hertziandipoles: update_hertzian_dipole_gpu(np.int32(len(G.hertziandipoles)), np.int32(iteration), - floattype(G.dx), floattype(G.dy), floattype(G.dz), - srcinfo1_hertzian_gpu.gpudata, srcinfo2_hertzian_gpu.gpudata, - srcwaves_hertzian_gpu.gpudata, G.ID_gpu.gpudata, - G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, - block=(1, 1, 1), grid=(round32(len(G.hertziandipoles)), 1, 1)) + floattype(G.dx), floattype(G.dy), floattype(G.dz), + srcinfo1_hertzian_gpu.gpudata, srcinfo2_hertzian_gpu.gpudata, + srcwaves_hertzian_gpu.gpudata, G.ID_gpu.gpudata, + G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, + block=(1, 1, 1), grid=(round32(len(G.hertziandipoles)), 1, 1)) # If there are any dispersive materials do 2nd part of dispersive update (it is split into two parts as it requires present and updated electric field values). Therefore it can only be completely updated after the electric field has been updated by the PML and source updates. if Material.maxpoles > 0: update_e_dispersive_B_gpu(np.int32(G.nx), np.int32(G.ny), np.int32(G.nz), - np.int32(Material.maxpoles), G.updatecoeffsdispersive_gpu.gpudata, - G.Tx_gpu.gpudata, G.Ty_gpu.gpudata, G.Tz_gpu.gpudata, G.ID_gpu.gpudata, - G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, - block=G.tpb, grid=G.bpg) + np.int32(Material.maxpoles), G.updatecoeffsdispersive_gpu.gpudata, + G.Tx_gpu.gpudata, G.Ty_gpu.gpudata, G.Tz_gpu.gpudata, G.ID_gpu.gpudata, + G.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata, + block=G.tpb, grid=G.bpg) # Copy output from receivers array back to correct receiver objects if G.rxs: @@ -643,7 +643,7 @@ def solve_gpu(currentmodelrun, modelend, G): if G.snapshots and not G.snapsgpu2cpu: for i, snap in enumerate(G.snapshots): gpu_get_snapshot_array(snapEx_gpu.get(), snapEy_gpu.get(), snapEz_gpu.get(), - snapHx_gpu.get(), snapHy_gpu.get(), snapHz_gpu.get(), i, snap) + snapHx_gpu.get(), snapHy_gpu.get(), snapHz_gpu.get(), i, snap) iterend.record() iterend.synchronize() diff --git a/gprMax/snapshots.py b/gprMax/snapshots.py index ac91704a..1525980a 100644 --- a/gprMax/snapshots.py +++ b/gprMax/snapshots.py @@ -174,7 +174,7 @@ def gpu_initialise_snapshot_array(G): G (class): Grid class instance - holds essential parameters describing the model. Returns: - snapE*_gpu, snapH*_gpu (float): numpy arrays of snapshot data on GPU. + snapE_gpu, snapH_gpu (float): numpy arrays of snapshot data on GPU. """ import pycuda.gpuarray as gpuarray @@ -220,8 +220,8 @@ def gpu_get_snapshot_array(snapEx_gpu, snapEy_gpu, snapEz_gpu, snapHx_gpu, snapH """ snap.electric = np.stack((snapEx_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf], - snapEy_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf], - snapEz_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf])).reshape(-1, order='F') + snapEy_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf], + snapEz_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf])).reshape(-1, order='F') snap.magnetic = np.stack((snapHx_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf], - snapHy_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf], - snapHz_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf])).reshape(-1, order='F') + snapHy_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf], + snapHz_gpu[i, snap.xs:snap.xf, snap.ys:snap.yf, snap.zs:snap.zf])).reshape(-1, order='F') diff --git a/gprMax/utilities.py b/gprMax/utilities.py index 5f823688..0a64bbac 100644 --- a/gprMax/utilities.py +++ b/gprMax/utilities.py @@ -392,4 +392,3 @@ def detect_gpus(): print('GPU(s) detected: {}'.format(' | '.join(gputext))) return gpus -