diff --git a/gprMax/cmds_multiuse.py b/gprMax/cmds_multiuse.py index d2d005e7..3a8515e2 100644 --- a/gprMax/cmds_multiuse.py +++ b/gprMax/cmds_multiuse.py @@ -114,14 +114,12 @@ class Waveform(UserObjectMulti): try: wavetype = self.kwargs['wave_type'].lower() except KeyError: - logger.exception( - f"{self.params_str()} must have one of the following types {','.join(WaveformUser.types)}." - ) + logger.exception(f"{self.params_str()} must have one of the " + + f"following types {','.join(WaveformUser.types)}.") raise if wavetype not in WaveformUser.types: - logger.exception( - f"{self.params_str()} must have one of the following types {','.join(WaveformUser.types)}." - ) + logger.exception(f"{self.params_str()} must have one of the " + + f"following types {','.join(WaveformUser.types)}.") raise ValueError if wavetype != 'user': @@ -836,14 +834,15 @@ class Rx(UserObjectMulti): r.outputs[field] = np.zeros(grid.iterations, dtype=config.sim_config.dtypes['float_or_double']) else: - logger.exception( - f'{self.params_str()} contains an output type that is not allowable. Allowable outputs in current context are {allowableoutputs}.' - ) + logger.exception(f'{self.params_str()} contains an output ' + f'type that is not allowable. Allowable ' + f'outputs in current context are ' + f'{allowableoutputs}.') raise ValueError - logger.info( - f"{self.grid_name(grid)}Receiver at {p2[0]:g}m, {p2[1]:g}m, {p2[2]:g}m with output component(s) {', '.join(r.outputs)} created." - ) + logger.info(f"{self.grid_name(grid)}Receiver at {p2[0]:g}m, {p2[1]:g}m, " + f"{p2[2]:g}m with output component(s) " + f"{', '.join(r.outputs)} created.") grid.rxs.append(r) @@ -910,9 +909,10 @@ class RxArray(UserObjectMulti): 'not be less than the spatial discretisation.') raise ValueError - logger.info( - f'{self.grid_name(grid)}Receiver array {p3[0]:g}m, {p3[1]:g}m, {p3[2]:g}m, to {p4[0]:g}m, {p4[1]:g}m, {p4[2]:g}m with steps {dx * grid.dx:g}m, {dy * grid.dy:g}m, {dz * grid.dz:g}m' - ) + logger.info(f'{self.grid_name(grid)}Receiver array ' + f'{p3[0]:g}m, {p3[1]:g}m, {p3[2]:g}m, to ' + f'{p4[0]:g}m, {p4[1]:g}m, {p4[2]:g}m with steps ' + f'{dx * grid.dx:g}m, {dy * grid.dy:g}m, {dz * grid.dz:g}m') for x in range(xs, xf + 1, dx): for y in range(ys, yf + 1, dy): @@ -1024,9 +1024,10 @@ class Snapshot(UserObjectMulti): # Check and set output names for output in tmp: if output not in SnapshotUser.allowableoutputs.keys(): - logger.exception( - f"{self.params_str()} contains an output type that is not allowable. Allowable outputs in current context are {', '.join(SnapshotUser.allowableoutputs.keys())}." - ) + logger.exception(f"{self.params_str()} contains an output " + f"type that is not allowable. Allowable " + f"outputs in current context are " + f"{', '.join(SnapshotUser.allowableoutputs.keys())}.") raise ValueError else: outputs[output] = True @@ -1084,35 +1085,33 @@ class Material(UserObjectMulti): sm = self.kwargs['sm'] material_id = self.kwargs['id'] except KeyError: - logger.exception(f'{self.params_str()} requires exactly five parameters.') + logger.exception(f'{self.params_str()} requires exactly five ' + f'parameters.') raise if er < 1: - logger.exception( - f'{self.params_str()} requires a positive value of one or greater for static (DC) permittivity.' - ) + logger.exception(f'{self.params_str()} requires a positive value of ' + f'one or greater for static (DC) permittivity.') raise ValueError if se != 'inf': se = float(se) if se < 0: - logger.exception( - f'{self.params_str()} requires a positive value for electric conductivity.' - ) + logger.exception(f'{self.params_str()} requires a positive ' + f'value for electric conductivity.') raise ValueError else: se = float('inf') if mr < 1: - logger.exception( - f'{self.params_str()} requires a positive value of one or greater for magnetic permeability.' - ) + logger.exception(f'{self.params_str()} requires a positive value of ' + f'one or greater for magnetic permeability.') raise ValueError if sm < 0: - logger.exception( - f'{self.params_str()} requires a positive value for magnetic loss.' - ) + logger.exception(f'{self.params_str()} requires a positive value ' + f'for magnetic loss.') raise ValueError if any(x.ID == material_id for x in grid.materials): - logger.exception(f'{self.params_str()} with ID {material_id} already exists') + logger.exception(f'{self.params_str()} with ID {material_id} ' + f'already exists') raise ValueError # Create a new instance of the Material class material @@ -1127,9 +1126,9 @@ class Material(UserObjectMulti): m.averagable = False m.er = er - logger.info( - f'{self.grid_name(grid)}Material {m.ID} with eps_r={m.er:g}, sigma={m.se:g} S/m; mu_r={m.mr:g}, sigma*={m.sm:g} Ohm/m created.' - ) + logger.info(f'{self.grid_name(grid)}Material {m.ID} with eps_r={m.er:g}, ' + f'sigma={m.se:g} S/m; mu_r={m.mr:g}, sigma*={m.sm:g} Ohm/m ' + f'created.') grid.materials.append(m) @@ -1202,9 +1201,9 @@ class AddDebyeDispersion(UserObjectMulti): # Replace original material with newly created DispersiveMaterial grid.materials = [disp_material if mat.numID==material.numID else mat for mat in grid.materials] - logger.info( - f"{self.grid_name(grid)}Debye disperion added to {disp_material.ID} with delta_eps_r={', '.join('%4.2f' % deltaer for deltaer in disp_material.deltaer)}, and tau={', '.join('%4.3e' % tau for tau in disp_material.tau)} secs created." - ) + logger.info(f"{self.grid_name(grid)}Debye disperion added to {disp_material.ID} " + f"with delta_eps_r={', '.join('%4.2f' % deltaer for deltaer in disp_material.deltaer)}, " + f"and tau={', '.join('%4.3e' % tau for tau in disp_material.tau)} secs created.") class AddLorentzDispersion(UserObjectMulti): @@ -1280,8 +1279,10 @@ class AddLorentzDispersion(UserObjectMulti): grid.materials = [disp_material if mat.numID==material.numID else mat for mat in grid.materials] logger.info( - f"{self.grid_name(grid)}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' % omega for omega in disp_material.tau)} secs, and gamma={', '.join('%4.3e' % delta for delta in disp_material.alpha)} created." - ) + f"{self.grid_name(grid)}Lorentz disperion added to {disp_material.ID} " + f"with delta_eps_r={', '.join('%4.2f' % deltaer for deltaer in disp_material.deltaer)}, " + f"omega={', '.join('%4.3e' % omega for omega in disp_material.tau)} secs, " + f"and gamma={', '.join('%4.3e' % delta for delta in disp_material.alpha)} created.") class AddDrudeDispersion(UserObjectMulti): @@ -1351,8 +1352,9 @@ class AddDrudeDispersion(UserObjectMulti): grid.materials = [disp_material if mat.numID==material.numID else mat for mat in grid.materials] logger.info( - f"{self.grid_name(grid)}Drude disperion added to {disp_material.ID} with omega={', '.join('%4.3e' % omega for omega in disp_material.tau)} secs, and gamma={', '.join('%4.3e' % alpha for alpha in disp_material.alpha)} secs created." - ) + f"{self.grid_name(grid)}Drude disperion added to {disp_material.ID} " + f"with omega={', '.join('%4.3e' % omega for omega in disp_material.tau)} secs, " + f"and gamma={', '.join('%4.3e' % alpha for alpha in disp_material.alpha)} secs created.") class SoilPeplinski(UserObjectMulti): @@ -1513,7 +1515,8 @@ class MaterialRange(UserObjectMulti): # Create a new instance of the Material class material # (start index after pec & free_space) - s = RangeMaterialUser(ID, (er_lower, er_upper), (sigma_lower, sigma_upper), (mr_lower, mr_upper), (ro_lower, ro_upper)) + s = RangeMaterialUser(ID, (er_lower, er_upper), (sigma_lower, sigma_upper), + (mr_lower, mr_upper), (ro_lower, ro_upper)) logger.info(self.grid_name(grid) + 'Material properties used to ' f'create {s.ID} with range(s) {s.er[0]:g} to {s.er[1]:g}, relative permittivity ' @@ -1547,8 +1550,7 @@ class MaterialList(UserObjectMulti): logger.exception(self.params_str() + ' requires at at least 2 ' 'parameters.') raise - - + if any(x.ID == ID for x in grid.mixingmodels): logger.exception(self.params_str() + f' with ID {ID} already exists') raise ValueError @@ -1564,7 +1566,6 @@ class MaterialList(UserObjectMulti): grid.mixingmodels.append(s) - class GeometryView(UserObjectMulti): """Outputs to file(s) information about the geometry (mesh) of model. @@ -1625,7 +1626,6 @@ class GeometryView(UserObjectMulti): dx, dy, dz = uip.discretise_static_point(dl) - if dx < 0 or dy < 0 or dz < 0: logger.exception(self.params_str() + ' the step size should not be ' 'less than zero.') diff --git a/gprMax/cmds_singleuse.py b/gprMax/cmds_singleuse.py index debc4e61..c0de561d 100644 --- a/gprMax/cmds_singleuse.py +++ b/gprMax/cmds_singleuse.py @@ -97,19 +97,16 @@ class Discretisation(UserObjectSingle): raise if G.dl[0] <= 0: - logger.exception( - f'{self.__str__()} discretisation requires the x-direction spatial step to be greater than zero' - ) + logger.exception(f'{self.__str__()} discretisation requires the ' + f'x-direction spatial step to be greater than zero') raise ValueError if G.dl[1] <= 0: - logger.exception( - f'{self.__str__()} discretisation requires the y-direction spatial step to be greater than zero' - ) + logger.exception(f'{self.__str__()} discretisation requires the ' + f'y-direction spatial step to be greater than zero') raise ValueError if G.dl[2] <= 0: - logger.exception( - f'{self.__str__()} discretisation requires the z-direction spatial step to be greater than zero' - ) + logger.exception(f'{self.__str__()} discretisation requires the ' + f'z-direction spatial step to be greater than zero') raise ValueError logger.info(f'Spatial discretisation: {G.dl[0]:g} x {G.dl[1]:g} x {G.dl[2]:g}m') @@ -134,9 +131,8 @@ class Domain(UserObjectSingle): raise if G.nx == 0 or G.ny == 0 or G.nz == 0: - logger.exception( - f'{self.__str__()} requires at least one cell in every dimension' - ) + logger.exception(f'{self.__str__()} requires at least one cell in ' + f'every dimension') raise ValueError logger.info(f"Domain size: {self.kwargs['p1'][0]:g} x {self.kwargs['p1'][1]:g} x " + @@ -190,9 +186,8 @@ class TimeStepStabilityFactor(UserObjectSingle): raise if f <= 0 or f > 1: - logger.exception( - f'{self.__str__()} requires the value of the time step stability factor to be between zero and one' - ) + logger.exception(f'{self.__str__()} requires the value of the time ' + f'step stability factor to be between zero and one') raise ValueError G.dt = G.dt * f @@ -256,14 +251,12 @@ class OMPThreads(UserObjectSingle): try: n = self.kwargs['n'] except KeyError: - logger.exception( - f'{self.__str__()} requires exactly one parameter to specify the number of CPU OpenMP threads to use' - ) + logger.exception(f'{self.__str__()} requires exactly one parameter ' + f'to specify the number of CPU OpenMP threads to use') raise if n < 1: - logger.exception( - f'{self.__str__()} requires the value to be an integer not less than one' - ) + logger.exception(f'{self.__str__()} requires the value to be an ' + f'integer not less than one') raise ValueError config.get_model_config().ompthreads = set_omp_threads(n) @@ -341,13 +334,9 @@ class SrcSteps(UserObjectSingle): logger.exception(f'{self.__str__()} requires exactly three parameters') raise - logger.info( - ( - f'Simple sources will step {G.srcsteps[0] * G.dx:g}m, ' - + f'{G.srcsteps[1] * G.dy:g}m, {G.srcsteps[2] * G.dz:g}m ' - + 'for each model run.' - ) - ) + logger.info(f'Simple sources will step {G.srcsteps[0] * G.dx:g}m, ' + + f'{G.srcsteps[1] * G.dy:g}m, {G.srcsteps[2] * G.dz:g}m ' + + 'for each model run.') class RxSteps(UserObjectSingle): @@ -368,13 +357,9 @@ class RxSteps(UserObjectSingle): logger.exception(f'{self.__str__()} requires exactly three parameters') raise - logger.info( - ( - f'All receivers will step {G.rxsteps[0] * G.dx:g}m, ' - + f'{G.rxsteps[1] * G.dy:g}m, {G.rxsteps[2] * G.dz:g}m ' - + 'for each model run.' - ) - ) + logger.info(f'All receivers will step {G.rxsteps[0] * G.dx:g}m, ' + + f'{G.rxsteps[1] * G.dy:g}m, {G.rxsteps[2] * G.dz:g}m ' + + 'for each model run.') class ExcitationFile(UserObjectSingle): diff --git a/gprMax/config.py b/gprMax/config.py index 5525b85b..19564d92 100644 --- a/gprMax/config.py +++ b/gprMax/config.py @@ -224,15 +224,14 @@ class SimulationConfig: # solver: cpu, cuda, opencl. # subgrid: whether the simulation uses sub-grids. # precision: data type for electromagnetic field output (single/double). + # progressbars: progress bars on stdoout or not - switch off + # progressbars when logging level is greater than + # info (20) - self.general = { - 'solver': 'cpu', - 'subgrid': False, - 'precision': 'single', - 'progressbars': args.log_level <= 20, - } - # Progress bars on stdoout or not - switch off progressbars when - # logging level is greater than info (20) + self.general = {'solver': 'cpu', + 'subgrid': False, + 'precision': 'single', + 'progressbars': args.log_level <= 20} self.em_consts = {'c': c, # Speed of light in free space (m/s) 'e0': e0, # Permittivity of free space (F/m) diff --git a/gprMax/geometry_outputs.py b/gprMax/geometry_outputs.py index 471c0221..62e05fca 100644 --- a/gprMax/geometry_outputs.py +++ b/gprMax/geometry_outputs.py @@ -277,11 +277,10 @@ class Comments(): """ # Comments for Paraview macro - comments = {'gprMax_version': __version__, 'dx_dy_dz': self.dx_dy_dz_comment()} - comments['nx_ny_nz'] = self.nx_ny_nz_comment() - - # Write the name and numeric ID for each material - comments['Materials'] = self.materials_comment() + comments = {'gprMax_version': __version__, + 'dx_dy_dz': self.dx_dy_dz_comment(), + 'nx_ny_nz': self.nx_ny_nz_comment(), + 'Materials': self.materials_comment()} # Write the name and numeric ID for each material # Write information on PMLs, sources, and receivers if not self.materials_only: diff --git a/gprMax/hash_cmds_file.py b/gprMax/hash_cmds_file.py index b4a60826..9dac055d 100644 --- a/gprMax/hash_cmds_file.py +++ b/gprMax/hash_cmds_file.py @@ -178,9 +178,8 @@ def write_processed_file(processedlines): for item in processedlines: f.write(f'{item}') - logger.info( - f'Written input commands, after processing any Python code and include commands, to file: {processedfile}\n' - ) + logger.info(f'Written input commands, after processing any Python code and ' + f'include commands, to file: {processedfile}\n') def check_cmd_names(processedlines, checkessential=True): diff --git a/gprMax/materials.py b/gprMax/materials.py index b58ec8f0..a16a905d 100644 --- a/gprMax/materials.py +++ b/gprMax/materials.py @@ -620,13 +620,11 @@ def process_materials(G): z += 3 # Construct information on material properties for printing table - materialtext = [ - str(material.numID), - material.ID[:50] if len(material.ID) > 50 else material.ID, - material.type, - f'{material.er:g}', - f'{material.se:g}', - ] + materialtext = [str(material.numID), + material.ID[:50] if len(material.ID) > 50 else material.ID, + material.type, + f'{material.er:g}', + f'{material.se:g}'] if config.get_model_config().materials['maxpoles'] > 0: if 'debye' in material.type: materialtext.append('\n'.join('{:g}'.format(deltaer) for deltaer in material.deltaer)) @@ -646,9 +644,7 @@ def process_materials(G): else: materialtext.extend(['', '', '', '', '']) - materialtext.extend( - (f'{material.mr:g}', f'{material.sm:g}', material.averagable) - ) + materialtext.extend((f'{material.mr:g}', f'{material.sm:g}', material.averagable)) materialsdata.append(materialtext) return materialsdata \ No newline at end of file diff --git a/gprMax/waveforms.py b/gprMax/waveforms.py index b6fbfeca..84c65f4e 100644 --- a/gprMax/waveforms.py +++ b/gprMax/waveforms.py @@ -56,13 +56,11 @@ class Waveform: if self.freq is None: raise ValueError("Frequency is not specified") - if self.type in [ - 'gaussian', - 'gaussiandot', - 'gaussiandotnorm', - 'gaussianprime', - 'gaussiandoubleprime', - ]: + if self.type in ['gaussian', + 'gaussiandot', + 'gaussiandotnorm', + 'gaussianprime', + 'gaussiandoubleprime']: self.chi = 1 / self.freq self.zeta = 2 * np.pi**2 * self.freq**2 elif self.type in ['gaussiandotdot', 'gaussiandotdotnorm', 'ricker']: diff --git a/setup.py b/setup.py index 540b7c92..44bfa294 100644 --- a/setup.py +++ b/setup.py @@ -216,13 +216,11 @@ else: pass os.environ['MIN_SUPPORTED_MACOSX_DEPLOYMENT_TARGET'] = MIN_MACOS_VERSION # Sometimes worth testing with '-fstrict-aliasing', '-fno-common' - compile_args = [ - '-O3', - '-w', - '-fopenmp', - '-march=native', - f'-mmacosx-version-min={MIN_MACOS_VERSION}', - ] + compile_args = ['-O3', + '-w', + '-fopenmp', + '-march=native', + f'-mmacosx-version-min={MIN_MACOS_VERSION}'] linker_args = ['-fopenmp', f'-mmacosx-version-min={MIN_MACOS_VERSION}'] libraries=['gomp'] @@ -258,42 +256,37 @@ else: with open('README.rst','r') as fd: long_description = fd.read() - setup( - name='gprMax', - version=version, - author='Craig Warren, Antonis Giannopoulos, and John Hartley', - url='http://www.gprmax.com', - description='Electromagnetic Modelling Software based on the ' - + 'Finite-Difference Time-Domain (FDTD) method', - long_description=long_description, - long_description_content_type="text/x-rst", - license='GPLv3+', - python_requires=f'>{str(MIN_PYTHON_VERSION[0])}.{str(MIN_PYTHON_VERSION[1])}', - install_requires=[ - 'colorama', - 'cython', - 'h5py', - 'jinja2', - 'matplotlib', - 'numpy', - 'psutil', - 'scipy', - 'terminaltables', - 'tqdm', - ], + setup(name='gprMax', + version=version, + author='Craig Warren, Antonis Giannopoulos, and John Hartley', + url='http://www.gprmax.com', + description='Electromagnetic Modelling Software based on the ' + + 'Finite-Difference Time-Domain (FDTD) method', + long_description=long_description, + long_description_content_type="text/x-rst", + license='GPLv3+', + python_requires=f'>{str(MIN_PYTHON_VERSION[0])}.{str(MIN_PYTHON_VERSION[1])}', + install_requires=['colorama', + 'cython', + 'h5py', + 'jinja2', + 'matplotlib', + 'numpy', + 'psutil', + 'scipy', + 'terminaltables', + 'tqdm'], ext_modules=extensions, packages=find_packages(), include_package_data=True, include_dirs=[np.get_include()], zip_safe=False, - classifiers=[ - 'Environment :: Console', - 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', - 'Operating System :: MacOS', - 'Operating System :: Microsoft :: Windows', - 'Operating System :: POSIX :: Linux', - 'Programming Language :: Cython', - 'Programming Language :: Python :: 3', - 'Topic :: Scientific/Engineering', - ], + classifiers=['Environment :: Console', + 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', + 'Operating System :: MacOS', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Cython', + 'Programming Language :: Python :: 3', + 'Topic :: Scientific/Engineering'], )