diff --git a/gprMax/gprMax.py b/gprMax/gprMax.py index ec66123f..a6f7ba14 100644 --- a/gprMax/gprMax.py +++ b/gprMax/gprMax.py @@ -317,9 +317,11 @@ def run_model(args, modelrun, numbermodelruns, inputfile, usernamespace): # Create built-in materials m = Material(0, 'pec') m.se = float('inf') + m.type = 'builtin' m.average = False G.materials.append(m) m = Material(1, 'free_space') + m.type = 'builtin' G.materials.append(m) # Process parameters for commands that can only occur once in the model @@ -437,7 +439,7 @@ def run_model(args, modelrun, numbermodelruns, inputfile, usernamespace): # Absolute time abstime = 0 - for timestep in tqdm(range(G.iterations), desc='Running model ' + str(modelrun) + ' of ' + str(numbermodelruns), ncols=get_terminal_size()[0] - 1): + for timestep in tqdm(range(G.iterations), desc='Calculating model ' + str(modelrun) + ' of ' + str(numbermodelruns), ncols=get_terminal_size()[0] - 1): # Store field component values for every receiver and transmission line store_outputs(timestep, G.Ex, G.Ey, G.Ez, G.Hx, G.Hy, G.Hz, G) diff --git a/gprMax/input_cmds_geometry.py b/gprMax/input_cmds_geometry.py index f2f3787d..9b979afb 100644 --- a/gprMax/input_cmds_geometry.py +++ b/gprMax/input_cmds_geometry.py @@ -351,7 +351,8 @@ def process_geometrycmds(geometry, G): else: numID = len(G.materials) m = Material(numID, requiredID) - # Create averaged constituents for material + m.type = 'dielectric-smoothed' + # Create dielectric-smoothed constituents for material m.er = np.mean((materials[0].er, materials[1].er, materials[2].er), axis=0) m.se = np.mean((materials[0].se, materials[1].se, materials[2].se), axis=0) m.mr = np.mean((materials[0].mr, materials[1].mr, materials[2].mr), axis=0) @@ -458,7 +459,8 @@ def process_geometrycmds(geometry, G): else: numID = len(G.materials) m = Material(numID, requiredID) - # Create averaged constituents for material + m.type = 'dielectric-smoothed' + # Create dielectric-smoothed constituents for material m.er = np.mean((materials[0].er, materials[1].er, materials[2].er), axis=0) m.se = np.mean((materials[0].se, materials[1].se, materials[2].se), axis=0) m.mr = np.mean((materials[0].mr, materials[1].mr, materials[2].mr), axis=0) @@ -538,7 +540,8 @@ def process_geometrycmds(geometry, G): else: numID = len(G.materials) m = Material(numID, requiredID) - # Create averaged constituents for material + m.type = 'dielectric-smoothed' + # Create dielectric-smoothed constituents for material m.er = np.mean((materials[0].er, materials[1].er, materials[2].er), axis=0) m.se = np.mean((materials[0].se, materials[1].se, materials[2].se), axis=0) m.mr = np.mean((materials[0].mr, materials[1].mr, materials[2].mr), axis=0) @@ -627,7 +630,8 @@ def process_geometrycmds(geometry, G): else: numID = len(G.materials) m = Material(numID, requiredID) - # Create averaged constituents for material + m.type = 'dielectric-smoothed' + # Create dielectric-smoothed constituents for material m.er = np.mean((materials[0].er, materials[1].er, materials[2].er), axis=0) m.se = np.mean((materials[0].se, materials[1].se, materials[2].se), axis=0) m.mr = np.mean((materials[0].mr, materials[1].mr, materials[2].mr), axis=0) @@ -736,7 +740,8 @@ def process_geometrycmds(geometry, G): else: numID = len(G.materials) m = Material(numID, requiredID) - # Create averaged constituents for material + m.type = 'dielectric-smoothed' + # Create dielectric-smoothed constituents for material m.er = np.mean((materials[0].er, materials[1].er, materials[2].er), axis=0) m.se = np.mean((materials[0].se, materials[1].se, materials[2].se), axis=0) m.mr = np.mean((materials[0].mr, materials[1].mr, materials[2].mr), axis=0) @@ -1029,6 +1034,7 @@ def process_geometrycmds(geometry, G): if not any(x.ID == 'water' for x in G.materials): m = Material(len(G.materials), 'water') m.average = False + m.type = 'builtin, debye' m.er = Material.watereri m.deltaer.append(Material.waterdeltaer) m.tau.append(Material.watertau) @@ -1176,6 +1182,7 @@ def process_geometrycmds(geometry, G): if not any(x.ID == 'grass' for x in G.materials): m = Material(len(G.materials), 'grass') m.average = False + m.type = 'builtin, debye' m.er = Material.grasseri m.deltaer.append(Material.grassdeltaer) m.tau.append(Material.grasstau) diff --git a/gprMax/input_cmds_multiuse.py b/gprMax/input_cmds_multiuse.py index e2199df9..54bc0235 100644 --- a/gprMax/input_cmds_multiuse.py +++ b/gprMax/input_cmds_multiuse.py @@ -526,7 +526,7 @@ def process_multicmds(multicmds, G): raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' material(s) {} do not exist'.format(notfound)) for material in materials: - material.type = 'debye' + material.type = 'user-defined, debye' material.poles = poles material.average = False for pole in range(1, 2 * poles, 2): @@ -561,7 +561,7 @@ def process_multicmds(multicmds, G): raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' material(s) {} do not exist'.format(notfound)) for material in materials: - material.type = 'lorentz' + material.type = 'user-defined, lorentz' material.poles = poles material.average = False for pole in range(1, 3 * poles, 3): @@ -597,7 +597,7 @@ def process_multicmds(multicmds, G): raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' material(s) {} do not exist'.format(notfound)) for material in materials: - material.type = 'drude' + material.type = 'user-defined, drude' material.poles = poles material.average = False for pole in range(1, 2 * poles, 2): diff --git a/gprMax/materials.py b/gprMax/materials.py index 98674b53..51b158f1 100644 --- a/gprMax/materials.py +++ b/gprMax/materials.py @@ -27,9 +27,6 @@ class Material(object): # Maximum number of dispersive material poles in a model maxpoles = 0 - # Types of material - types = ['standard', 'debye', 'lorentz', 'drude'] - # Properties of water from: http://dx.doi.org/10.1109/TGRS.2006.873208 waterer = 80.1 watereri = 4.9 @@ -51,7 +48,7 @@ class Material(object): self.numID = numID self.ID = ID - self.type = 'standard' + self.type = 'user-defined' # Default material averaging self.average = True @@ -99,16 +96,16 @@ class Material(object): self.eqt2 = np.zeros(self.maxpoles, dtype=complextype) for x in range(self.poles): - if self.type == 'debye': + if 'debye' in self.type: self.w[x] = self.deltaer[x] / self.tau[x] self.q[x] = -1 / self.tau[x] - elif self.type == 'lorentz': + elif 'lorentz' in self.type: # tau for Lorentz materials are pole frequencies # alpha for Lorentz materials are the damping coefficients wp2 = (2 * np.pi * self.tau[x])**2 self.w[x] = -1j * ((wp2 * self.deltaer[x]) / np.sqrt(wp2 - self.alpha[x]**2)) self.q[x] = -self.alpha[x] + (1j * np.sqrt(wp2 - self.alpha[x]**2)) - elif self.type == 'drude': + elif 'drude' in self.type: # tau for Drude materials are pole frequencies # alpha for Drude materials are the inverse of relaxation times wp2 = (2 * np.pi * self.tau[x])**2 @@ -155,9 +152,9 @@ def process_materials(G): if G.messages: print('\nMaterials:') if Material.maxpoles == 0: - materialsdata = [['\nID', '\nName', '\neps_r', 'sigma\n[S/m]', '\nmu_r', 'sigma*\n[S/m]', 'Dielectric\nsmoothing']] + materialsdata = [['\nID', '\nName', '\neps_r', 'sigma\n[S/m]', '\nmu_r', 'sigma*\n[S/m]', 'Dielectric\nsmoothable', '\nType']] else: - materialsdata = [['\nID', '\nName', '\neps_r', 'sigma\n[S/m]', '\nDelta eps_r', 'tau\n[s]', '\nmu_r', 'sigma*\n[S/m]', 'Dielectric\nsmoothing']] + materialsdata = [['\nID', '\nName', '\neps_r', 'sigma\n[S/m]', '\nDelta eps_r', 'tau\n[s]', '\nmu_r', 'sigma*\n[S/m]', 'Dielectric\nsmoothable', '\nType']] for material in G.materials: # Calculate update coefficients for material @@ -192,6 +189,7 @@ def process_materials(G): materialtext.append('{:g}'.format(material.mr)) materialtext.append('{:g}'.format(material.sm)) materialtext.append(material.average) + materialtext.append(material.type) materialsdata.append(materialtext) if G.messages: @@ -273,6 +271,7 @@ class PeplinskiSoil(object): self.startmaterialnum = len(G.materials) if not material: m = Material(len(G.materials), requiredID) + m.type = 'debye' m.average = False m.er = eri m.se = sig diff --git a/gprMax/sources.py b/gprMax/sources.py index 5e5edb9e..2a890124 100644 --- a/gprMax/sources.py +++ b/gprMax/sources.py @@ -108,6 +108,7 @@ class VoltageSource(Source): newmaterial.ID = material.ID + '+VoltageSource_' + str(self.resistance) newmaterial.numID = len(G.materials) newmaterial.average = False + newmaterial.type = 'dielectric-smoothed, voltage source' # Add conductivity of voltage source to underlying conductivity if self.polarisation == 'x': diff --git a/gprMax/yee_cell_build.pyx b/gprMax/yee_cell_build.pyx index 617d97e8..a7adbbf7 100644 --- a/gprMax/yee_cell_build.pyx +++ b/gprMax/yee_cell_build.pyx @@ -50,6 +50,7 @@ cpdef void create_electric_average(int i, int j, int k, int numID1, int numID2, # Create new material newNumID = len(G.materials) m = Material(newNumID, requiredID) + m.type = 'dielectric-smoothed' # Create averaged constituents for material m.er = np.mean((G.materials[numID1].er, G.materials[numID2].er, G.materials[numID3].er, G.materials[numID4].er), axis=0) m.se = np.mean((G.materials[numID1].se, G.materials[numID2].se, G.materials[numID3].se, G.materials[numID4].se), axis=0) @@ -88,6 +89,7 @@ cpdef void create_magnetic_average(int i, int j, int k, int numID1, int numID2, # Create new material newNumID = len(G.materials) m = Material(newNumID, requiredID) + m.type = 'dielectric-smoothed' # Create averaged constituents for material m.er = np.mean((G.materials[numID1].er, G.materials[numID2].er), axis=0) m.se = np.mean((G.materials[numID1].se, G.materials[numID2].se), axis=0)