diff --git a/gprMax/cmds_multiple.py b/gprMax/cmds_multiple.py index 07d75b50..edc2cab5 100644 --- a/gprMax/cmds_multiple.py +++ b/gprMax/cmds_multiple.py @@ -84,7 +84,7 @@ class Waveform(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 0 + self.order = 1 self.hash = '#waveform' def create(self, grid, uip): @@ -133,7 +133,7 @@ class VoltageSource(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 1 + self.order = 2 self.hash = '#voltage_source' def create(self, grid, uip): @@ -219,7 +219,7 @@ class HertzianDipole(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 2 + self.order = 3 self.hash = '#hertzian_dipole' def create(self, grid, uip): @@ -315,7 +315,7 @@ class MagneticDipole(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 3 + self.order = 4 self.hash = '#magnetic_dipole' def create(self, grid, uip): @@ -401,7 +401,7 @@ class TransmissionLine(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 4 + self.order = 5 self.hash = '#transmission_line' def create(self, grid, uip): @@ -490,7 +490,7 @@ class Rx(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 5 + self.order = 6 self.hash = '#rx' self.constructor = RxUser @@ -544,7 +544,7 @@ class RxArray(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 6 + self.order = 7 self.hash = '#rx_array' def create(self, grid, uip): @@ -617,7 +617,7 @@ class Snapshot(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 19 + self.order = 8 self.hash = '#snapshot' def create(self, grid, uip): @@ -684,7 +684,7 @@ class Material(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 8 + self.order = 9 self.hash = '#material' def create(self, grid, uip): @@ -744,12 +744,12 @@ class AddDebyeDispersion(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 9 + self.order = 10 self.hash = '#add_dispersion_debye' def create(self, grid, uip): try: - poles = self.kwargs['n_poles'] + poles = self.kwargs['poles'] er_delta = self.kwargs['er_delta'] tau = self.kwargs['tau'] material_ids = self.kwargs['material_ids'] @@ -782,8 +782,8 @@ class AddDebyeDispersion(UserObjectMulti): disp_material.tau.append(tau[i]) else: raise CmdInputError(f"'{self.params_str()}' requires positive values for the permittivity difference.") - if disp_material.poles > config.model_configs[grid.model_num].materials['maxpoles']: - config.model_configs[grid.model_num].materials['maxpoles'] = disp_material.poles + if disp_material.poles > config.get_model_config().materials['maxpoles']: + config.get_model_config().materials['maxpoles'] = disp_material.poles # Replace original material with newly created DispersiveMaterial grid.materials = [disp_material if mat.numID==material.numID else mat for mat in grid.materials] @@ -808,12 +808,12 @@ class AddLorentzDispersion(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 10 + self.order = 11 self.hash = '#add_dispersion_lorentz' def create(self, grid, uip): try: - poles = self.kwargs['n_poles'] + poles = self.kwargs['poles'] er_delta = self.kwargs['er_delta'] tau = self.kwargs['omega'] alpha = self.kwargs['delta'] @@ -832,20 +832,28 @@ class AddLorentzDispersion(UserObjectMulti): raise CmdInputError(f"'{self.params_str()}' material(s) {notfound} do not exist") for material in materials: - material.type = 'lorentz' - material.poles = poles - material.averagable = False + disp_material = DispersiveMaterialUser(material.numID, material.ID) + disp_material.er = material.er + disp_material.se = material.se + disp_material.mr = material.mr + disp_material.sm = material.sm + disp_material.type = 'lorentz' + disp_material.poles = poles + disp_material.averagable = False for i in range(0, poles): if er_delta[i] > 0 and tau[i] > grid.dt and alpha[i] > grid.dt: - material.deltaer.append(er_delta[i]) - material.tau.append(tau[i]) - material.alpha.append(alpha[i]) + disp_material.deltaer.append(er_delta[i]) + disp_material.tau.append(tau[i]) + disp_material.alpha.append(alpha[i]) else: raise CmdInputError(f"'{self.params_str()}' requires positive values for the permittivity difference and frequencies, and associated times that are greater than the time step for the model.") - if material.poles > MaterialUser.maxpoles: - MaterialUser.maxpoles = material.poles + if disp_material.poles > config.get_model_config().materials['maxpoles']: + config.get_model_config().materials['maxpoles'] = disp_material.poles - log.info(f"Lorentz disperion added to {material.ID} with delta_eps_r={', '.join('%4.2f' % deltaer for deltaer in material.deltaer)}, omega={', '.join('%4.3e' % tau for tau in material.tau)} secs, and gamma={', '.join('%4.3e' % alpha for alpha in material.alpha)} created.") + # Replace original material with newly created DispersiveMaterial + grid.materials = [disp_material if mat.numID==material.numID else mat for mat in grid.materials] + + log.info(f"Lorentz disperion added to {disp_material.ID} with delta_eps_r={', '.join('%4.2f' % deltaer for deltaer in disp_material.deltaer)}, omega={', '.join('%4.3e' % tau for tau in disp_material.tau)} secs, and gamma={', '.join('%4.3e' % alpha for alpha in disp_material.alpha)} created.") class AddDrudeDispersion(UserObjectMulti): @@ -863,12 +871,12 @@ class AddDrudeDispersion(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 11 - self.hash = '#add_dispersion_Drude' + self.order = 12 + self.hash = '#add_dispersion_drude' def create(self, grid, uip): try: - poles = self.kwargs['n_poles'] + poles = self.kwargs['poles'] tau = self.kwargs['tau'] alpha = self.kwargs['alpha'] material_ids = self.kwargs['material_ids'] @@ -886,19 +894,27 @@ class AddDrudeDispersion(UserObjectMulti): raise CmdInputError(f"'{self.params_str()}' material(s) {notfound} do not exist") for material in materials: - material.type = 'drude' - material.poles = poles - material.averagable = False + disp_material = DispersiveMaterialUser(material.numID, material.ID) + disp_material.er = material.er + disp_material.se = material.se + disp_material.mr = material.mr + disp_material.sm = material.sm + disp_material.type = 'drude' + disp_material.poles = poles + disp_material.averagable = False for i in range(0, poles): if tau[i] > 0 and alpha[i] > grid.dt: - material.tau.append(tau[i]) - material.alpha.append(alpha[i]) + disp_material.tau.append(tau[i]) + disp_material.alpha.append(alpha[i]) else: raise CmdInputError(f"'{self.params_str()}' requires positive values for the frequencies, and associated times that are greater than the time step for the model.") - if material.poles > MaterialUser.maxpoles: - MaterialUser.maxpoles = material.poles + if disp_material.poles > config.get_model_config().materials['maxpoles']: + config.get_model_config().materials['maxpoles'] = disp_material.poles - log.info(f"Drude disperion added to {material.ID} with omega={', '.join('%4.3e' % tau for tau in material.tau)} secs, and gamma={', '.join('%4.3e' % alpha for alpha in material.alpha)} secs created.") + # Replace original material with newly created DispersiveMaterial + grid.materials = [disp_material if mat.numID==material.numID else mat for mat in grid.materials] + + log.info(f"Drude disperion added to {disp_material.ID} with omega={', '.join('%4.3e' % tau for tau in disp_material.tau)} secs, and gamma={', '.join('%4.3e' % alpha for alpha in disp_material.alpha)} secs created.") class SoilPeplinski(UserObjectMulti): @@ -920,7 +936,7 @@ class SoilPeplinski(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 12 + self.order = 13 self.hash = '#soil_peplinski' def create(self, grid, uip): @@ -977,7 +993,7 @@ class GeometryView(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 18 + self.order = 14 self.hash = '#geometry_view' self.multi_grid = False @@ -1056,7 +1072,7 @@ class GeometryObjectsWrite(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 14 + self.order = 15 self.hash = '#geometry_objects_write' def create(self, grid, uip): @@ -1112,7 +1128,7 @@ class PMLCFS(UserObjectMulti): def __init__(self, **kwargs): super().__init__(**kwargs) - self.order = 15 + self.order = 16 self.hash = '#pml_cfs' PMLCFS.count += 1 if PMLCFS.count == 2: diff --git a/gprMax/grid.py b/gprMax/grid.py index 1170c7bc..ca7062cf 100644 --- a/gprMax/grid.py +++ b/gprMax/grid.py @@ -288,6 +288,7 @@ class CUDAGrid(FDTDGrid): """Additional grid methods for solving on GPU using CUDA.""" def __init__(self): + super().__init__() # Threads per block - used for main electric/magnetic field updates self.tpb = (128, 1, 1) diff --git a/gprMax/hash_cmds_file.py b/gprMax/hash_cmds_file.py index ad4b668c..940f31ac 100644 --- a/gprMax/hash_cmds_file.py +++ b/gprMax/hash_cmds_file.py @@ -140,8 +140,9 @@ def process_include_files(hashcmds, inputfile): includefile = includefile[1] # See if file exists at specified path and if not try input file directory - if not os.path.isfile(includefile): - includefile = os.path.join(os.path.dirname(inputfile.name), includefile) + includefile = Path(includefile) + if not includefile.exists(): + includefile = Path(config.sim_config.input_file_path.parent, includefile) with open(includefile, 'r') as f: # Strip out any newline characters and comments that must begin with double hashes diff --git a/gprMax/hash_cmds_geometry.py b/gprMax/hash_cmds_geometry.py index 800ceede..09a75b6b 100644 --- a/gprMax/hash_cmds_geometry.py +++ b/gprMax/hash_cmds_geometry.py @@ -18,7 +18,6 @@ import numpy as np -from .cmds_geometry.geometry_objects_read import GeometryObjectsRead from .cmds_geometry.edge import Edge from .cmds_geometry.plate import Plate from .cmds_geometry.triangle import Triangle @@ -52,6 +51,8 @@ def process_geometrycmds(geometry): tmp = object.split() if tmp[0] == '#geometry_objects_read:': + from .cmds_geometry.geometry_objects_read import GeometryObjectsRead + if len(tmp) != 6: raise CmdInputError("'" + ' '.join(tmp) + "'" + ' requires exactly five parameters') diff --git a/gprMax/hash_cmds_multiuse.py b/gprMax/hash_cmds_multiuse.py index 94679929..ca51a70c 100644 --- a/gprMax/hash_cmds_multiuse.py +++ b/gprMax/hash_cmds_multiuse.py @@ -193,7 +193,7 @@ def process_multicmds(multicmds): er_delta.append(float(tmp[pole])) tau.append(float(tmp[pole + 1])) - debye_dispersion = AddDebyeDispersion(pole=poles, er_delta=er_delta, tau=tau, material_ids=material_ids) + debye_dispersion = AddDebyeDispersion(poles=poles, er_delta=er_delta, tau=tau, material_ids=material_ids) scene_objects.append(debye_dispersion) cmdname = '#add_dispersion_lorentz' diff --git a/gprMax/snapshots.py b/gprMax/snapshots.py index 1aa410cd..88a00fdd 100644 --- a/gprMax/snapshots.py +++ b/gprMax/snapshots.py @@ -199,7 +199,7 @@ def htod_snapshot_array(G): # 4D arrays to store snapshots on GPU, e.g. snapEx(time, x, y, z); # if snapshots are not being stored on the GPU during the simulation then # they are copied back to the host after each iteration, hence numsnaps = 1 - numsnaps = 1 if config.model_configs[G.model_num].cuda['snapsgpu2cpu'] else len(G.snapshots) + numsnaps = 1 if config.get_model_config().cuda['snapsgpu2cpu'] else len(G.snapshots) snapEx = np.zeros((numsnaps, Snapshot.nx_max, Snapshot.ny_max, Snapshot.nz_max), dtype=config.sim_config.dtypes['float_or_double']) snapEy = np.zeros((numsnaps, Snapshot.nx_max, Snapshot.ny_max, Snapshot.nz_max), diff --git a/gprMax/updates.py b/gprMax/updates.py index 4d27736c..182ce8ce 100644 --- a/gprMax/updates.py +++ b/gprMax/updates.py @@ -421,8 +421,7 @@ class CUDAUpdates: """Snapshots - initialise arrays on GPU, prepare kernel and get kernel function. """ - self.snapEx_gpu, self.snapEy_gpu, self.snapEz_gpu, - self.snapHx_gpu, self.snapHy_gpu, self.snapHz_gpu = htod_snapshot_array(self.grid) + self.snapEx_gpu, self.snapEy_gpu, self.snapEz_gpu, self.snapHx_gpu, self.snapHy_gpu, self.snapHz_gpu = htod_snapshot_array(self.grid) kernel_store_snapshot = self.source_module(kernel_template_store_snapshot.substitute( REAL=config.sim_config.dtypes['C_float_or_double'], NX_SNAPS=Snapshot.nx_max, @@ -504,12 +503,12 @@ class CUDAUpdates: block=Snapshot.tpb, grid=Snapshot.bpg) if config.get_model_config().cuda['snapsgpu2cpu']: - dtoh_snapshot_array(self.grid.snapEx_gpu.get(), - self.grid.snapEy_gpu.get(), - self.grid.snapEz_gpu.get(), - self.grid.snapHx_gpu.get(), - self.grid.snapHy_gpu.get(), - self.grid.snapHz_gpu.get(), + dtoh_snapshot_array(self.snapEx_gpu.get(), + self.snapEy_gpu.get(), + self.snapEz_gpu.get(), + self.snapHx_gpu.get(), + self.snapHy_gpu.get(), + self.snapHz_gpu.get(), 0, snap) def update_magnetic(self):