你已经派生过 gprMax
镜像自地址
https://gitee.com/sunhf/gprMax.git
已同步 2025-08-07 23:14:03 +08:00
install gprMax as a module
这个提交包含在:
@@ -1 +1,4 @@
|
|||||||
from gprMax._version import __version__
|
from ._version import __version__
|
||||||
|
from .gprMax import api as run
|
||||||
|
|
||||||
|
__name__ = 'gprMax'
|
||||||
|
@@ -18,33 +18,38 @@
|
|||||||
|
|
||||||
"""gprMax.gprMax: provides entry point main()."""
|
"""gprMax.gprMax: provides entry point main()."""
|
||||||
|
|
||||||
import argparse, datetime, itertools, os, psutil, sys
|
import argparse
|
||||||
from time import perf_counter
|
import datetime
|
||||||
from enum import Enum
|
import itertools
|
||||||
|
import os
|
||||||
|
import psutil
|
||||||
|
import sys
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
import gprMax
|
from time import perf_counter
|
||||||
from gprMax.constants import c, e0, m0, z0, floattype
|
from enum import Enum
|
||||||
from gprMax.exceptions import GeneralError
|
from ._version import __version__
|
||||||
from gprMax.fields_update import update_electric, update_magnetic, update_electric_dispersive_multipole_A, update_electric_dispersive_multipole_B, update_electric_dispersive_1pole_A, update_electric_dispersive_1pole_B
|
from .constants import c, e0, m0, z0
|
||||||
from gprMax.grid import FDTDGrid, dispersion_check
|
from .exceptions import GeneralError
|
||||||
from gprMax.input_cmds_geometry import process_geometrycmds
|
from .fields_update import update_electric, update_magnetic, update_electric_dispersive_multipole_A, update_electric_dispersive_multipole_B, update_electric_dispersive_1pole_A, update_electric_dispersive_1pole_B
|
||||||
from gprMax.input_cmds_file import process_python_include_code, write_processed_file, check_cmd_names
|
from .grid import FDTDGrid, dispersion_check
|
||||||
from gprMax.input_cmds_multiuse import process_multicmds
|
from .input_cmds_geometry import process_geometrycmds
|
||||||
from gprMax.input_cmds_singleuse import process_singlecmds
|
from .input_cmds_file import process_python_include_code, write_processed_file, check_cmd_names
|
||||||
from gprMax.materials import Material
|
from .input_cmds_multiuse import process_multicmds
|
||||||
from gprMax.writer_hdf5 import prepare_hdf5, write_hdf5
|
from .input_cmds_singleuse import process_singlecmds
|
||||||
from gprMax.pml import build_pmls, update_electric_pml, update_magnetic_pml
|
from .materials import Material
|
||||||
from gprMax.utilities import update_progress, logo, human_size
|
from .writer_hdf5 import prepare_hdf5, write_hdf5
|
||||||
from gprMax.yee_cell_build import build_electric_components, build_magnetic_components
|
from .pml import build_pmls, update_electric_pml, update_magnetic_pml
|
||||||
|
from .utilities import update_progress, logo, human_size
|
||||||
|
from .yee_cell_build import build_electric_components, build_magnetic_components
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""This is the main function for gprMax."""
|
"""This is the main function for gprMax."""
|
||||||
|
|
||||||
# Print gprMax logo, version, and licencing/copyright information
|
# Print gprMax logo, version, and licencing/copyright information
|
||||||
logo(gprMax.__version__ + ' (Bowmore)')
|
logo(__version__ + ' (Bowmore)')
|
||||||
|
|
||||||
# Parse command line arguments
|
# Parse command line arguments
|
||||||
parser = argparse.ArgumentParser(prog='gprMax', description='Electromagnetic modelling software based on the Finite-Difference Time-Domain (FDTD) method')
|
parser = argparse.ArgumentParser(prog='gprMax', description='Electromagnetic modelling software based on the Finite-Difference Time-Domain (FDTD) method')
|
||||||
@@ -57,6 +62,31 @@ def main():
|
|||||||
parser.add_argument('--write-processed', action='store_true', default=False, help='write an input file after any Python code and include commands in the original input file have been processed')
|
parser.add_argument('--write-processed', action='store_true', default=False, help='write an input file after any Python code and include commands in the original input file have been processed')
|
||||||
parser.add_argument('--opt-taguchi', action='store_true', default=False, help='optimise parameters using the Taguchi optimisation method')
|
parser.add_argument('--opt-taguchi', action='store_true', default=False, help='optimise parameters using the Taguchi optimisation method')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
run_main(args)
|
||||||
|
|
||||||
|
|
||||||
|
def api(inputfile, n=1, mpi=False, benchmark=False, geometry_only=False, geometry_fixed=False, write_processed=False, opt_taguchi=False):
|
||||||
|
"""If you have installed gprMax as a module this is the entry point"""
|
||||||
|
class ImportArguments:
|
||||||
|
pass
|
||||||
|
|
||||||
|
args = ImportArguments()
|
||||||
|
|
||||||
|
args.inputfile = inputfile
|
||||||
|
args.n = n
|
||||||
|
args.mpi = mpi
|
||||||
|
args.benchmark = benchmark
|
||||||
|
args.geometry_only = geometry_only
|
||||||
|
args.geometry_fixed = geometry_fixed
|
||||||
|
args.write_processed = write_processed
|
||||||
|
args.opt_taguchi = opt_taguchi
|
||||||
|
|
||||||
|
run_main(args)
|
||||||
|
|
||||||
|
|
||||||
|
def run_main(args):
|
||||||
|
|
||||||
numbermodelruns = args.n
|
numbermodelruns = args.n
|
||||||
inputdirectory = os.path.dirname(os.path.abspath(args.inputfile))
|
inputdirectory = os.path.dirname(os.path.abspath(args.inputfile))
|
||||||
inputfile = os.path.abspath(os.path.join(inputdirectory, os.path.basename(args.inputfile)))
|
inputfile = os.path.abspath(os.path.join(inputdirectory, os.path.basename(args.inputfile)))
|
||||||
|
@@ -17,26 +17,25 @@
|
|||||||
# along with gprMax. If not, see <http://www.gnu.org/licenses/>.
|
# along with gprMax. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import h5py
|
import h5py
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
import gprMax
|
from ._version import __version__
|
||||||
from gprMax.constants import floattype
|
from gprMax.constants import floattype
|
||||||
from gprMax.grid import Ix, Iy, Iz
|
from gprMax.grid import Ix, Iy, Iz
|
||||||
|
|
||||||
|
|
||||||
def prepare_hdf5(outputfile, G):
|
def prepare_hdf5(outputfile, G):
|
||||||
"""Prepares an output file in HDF5 format for writing.
|
"""Prepares an output file in HDF5 format for writing.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
outputfile (str): Name of the output file.
|
outputfile (str): Name of the output file.
|
||||||
G (class): Grid class instance - holds essential parameters describing the model.
|
G (class): Grid class instance - holds essential parameters describing the model.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
f (file object): File object for the file to be written to.
|
f (file object): File object for the file to be written to.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
f = h5py.File(outputfile, 'w')
|
f = h5py.File(outputfile, 'w')
|
||||||
f.attrs['gprMax'] = gprMax.__version__
|
f.attrs['gprMax'] = __version__
|
||||||
f.attrs['Title'] = G.title
|
f.attrs['Title'] = G.title
|
||||||
f.attrs['Iterations'] = G.iterations
|
f.attrs['Iterations'] = G.iterations
|
||||||
f.attrs['nx, ny, nz'] = (G.nx, G.ny, G.nz)
|
f.attrs['nx, ny, nz'] = (G.nx, G.ny, G.nz)
|
||||||
@@ -47,7 +46,7 @@ def prepare_hdf5(outputfile, G):
|
|||||||
f.attrs['nrx'] = len(G.rxs)
|
f.attrs['nrx'] = len(G.rxs)
|
||||||
f.attrs['srcsteps'] = (G.srcstepx, G.srcstepy, G.srcstepz)
|
f.attrs['srcsteps'] = (G.srcstepx, G.srcstepy, G.srcstepz)
|
||||||
f.attrs['rxsteps'] = (G.rxstepx, G.rxstepy, G.rxstepz)
|
f.attrs['rxsteps'] = (G.rxstepx, G.rxstepy, G.rxstepz)
|
||||||
|
|
||||||
|
|
||||||
# Create group for sources (except transmission lines); add type and positional data attributes
|
# Create group for sources (except transmission lines); add type and positional data attributes
|
||||||
srclist = G.voltagesources + G.hertziandipoles + G.magneticdipoles
|
srclist = G.voltagesources + G.hertziandipoles + G.magneticdipoles
|
||||||
@@ -55,7 +54,7 @@ def prepare_hdf5(outputfile, G):
|
|||||||
grp = f.create_group('/srcs/src' + str(srcindex + 1))
|
grp = f.create_group('/srcs/src' + str(srcindex + 1))
|
||||||
grp.attrs['Type'] = type(src).__name__
|
grp.attrs['Type'] = type(src).__name__
|
||||||
grp.attrs['Position'] = (src.xcoord * G.dx, src.ycoord * G.dy, src.zcoord * G.dz)
|
grp.attrs['Position'] = (src.xcoord * G.dx, src.ycoord * G.dy, src.zcoord * G.dz)
|
||||||
|
|
||||||
# Create group for transmission lines; add positional data, line resistance and line discretisation attributes; initialise arrays for line voltages and currents
|
# Create group for transmission lines; add positional data, line resistance and line discretisation attributes; initialise arrays for line voltages and currents
|
||||||
if G.transmissionlines:
|
if G.transmissionlines:
|
||||||
for tlindex, tl in enumerate(G.transmissionlines):
|
for tlindex, tl in enumerate(G.transmissionlines):
|
||||||
@@ -68,7 +67,7 @@ def prepare_hdf5(outputfile, G):
|
|||||||
grp['Iinc'] = tl.Iinc
|
grp['Iinc'] = tl.Iinc
|
||||||
grp.create_dataset('Vtotal', (G.iterations, ), dtype=floattype)
|
grp.create_dataset('Vtotal', (G.iterations, ), dtype=floattype)
|
||||||
grp.create_dataset('Itotal', (G.iterations, ), dtype=floattype)
|
grp.create_dataset('Itotal', (G.iterations, ), dtype=floattype)
|
||||||
|
|
||||||
# Create group and add positional data and initialise field component arrays for receivers
|
# Create group and add positional data and initialise field component arrays for receivers
|
||||||
for rxindex, rx in enumerate(G.rxs):
|
for rxindex, rx in enumerate(G.rxs):
|
||||||
grp = f.create_group('/rxs/rx' + str(rxindex + 1))
|
grp = f.create_group('/rxs/rx' + str(rxindex + 1))
|
||||||
@@ -83,7 +82,7 @@ def prepare_hdf5(outputfile, G):
|
|||||||
|
|
||||||
def write_hdf5(f, timestep, Ex, Ey, Ez, Hx, Hy, Hz, G):
|
def write_hdf5(f, timestep, Ex, Ey, Ez, Hx, Hy, Hz, G):
|
||||||
"""Writes field component values to an output file in HDF5 format.
|
"""Writes field component values to an output file in HDF5 format.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
f (file object): File object for the file to be written to.
|
f (file object): File object for the file to be written to.
|
||||||
timestep (int): Current iteration number.
|
timestep (int): Current iteration number.
|
||||||
@@ -116,4 +115,3 @@ def write_hdf5(f, timestep, Ex, Ey, Ez, Hx, Hy, Hz, G):
|
|||||||
for tlindex, tl in enumerate(G.transmissionlines):
|
for tlindex, tl in enumerate(G.transmissionlines):
|
||||||
f['/tls/tl' + str(tlindex + 1) + '/Vtotal'][timestep] = tl.voltage[tl.antpos]
|
f['/tls/tl' + str(tlindex + 1) + '/Vtotal'][timestep] = tl.voltage[tl.antpos]
|
||||||
f['/tls/tl' + str(tlindex + 1) + '/Itotal'][timestep] = tl.current[tl.antpos]
|
f['/tls/tl' + str(tlindex + 1) + '/Itotal'][timestep] = tl.current[tl.antpos]
|
||||||
|
|
||||||
|
37
setup.py
37
setup.py
@@ -27,28 +27,30 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError('gprMax requires the NumPy package.')
|
raise ImportError('gprMax requires the NumPy package.')
|
||||||
|
|
||||||
import glob, os, shutil, sys
|
import glob
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
|
||||||
|
# Importing _version__.py before building can cause issues.
|
||||||
|
with open('gprMax/_version.py', 'r') as fd:
|
||||||
|
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]',
|
||||||
|
fd.read(), re.MULTILINE).group(1)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Parse package name from init file. Importing __init__.py / gprMax will
|
||||||
|
break as gprMax depends on compiled .pyx files.
|
||||||
|
"""
|
||||||
|
with open('gprMax/__init__.py', 'r') as fd:
|
||||||
|
packagename = re.search(r'^__name__\s*=\s*[\'"]([^\'"]*)[\'"]',
|
||||||
|
fd.read(), re.MULTILINE).group(1)
|
||||||
|
|
||||||
# Python version
|
# Python version
|
||||||
if sys.version_info[:2] < (3, 4):
|
if sys.version_info[:2] < (3, 4):
|
||||||
print('gprMax requires Python 3.4 or newer')
|
print('gprMax requires Python 3.4 or newer')
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
import gprMax
|
|
||||||
|
|
||||||
# Package name
|
|
||||||
packagename = gprMax.__name__
|
|
||||||
|
|
||||||
# Package version
|
|
||||||
version = gprMax.__version__
|
|
||||||
|
|
||||||
# Process 'install' command line argument
|
|
||||||
if 'install' in sys.argv:
|
|
||||||
print("'install' is not required for this package, running 'build_ext --inplace' instead.")
|
|
||||||
sys.argv.remove('install')
|
|
||||||
sys.argv.append('build_ext')
|
|
||||||
sys.argv.append('--inplace')
|
|
||||||
|
|
||||||
# Process 'build' command line argument
|
# Process 'build' command line argument
|
||||||
if 'build' in sys.argv:
|
if 'build' in sys.argv:
|
||||||
print("'build' is not required for this package, running 'build_ext --inplace' instead.")
|
print("'build' is not required for this package, running 'build_ext --inplace' instead.")
|
||||||
@@ -118,7 +120,7 @@ elif sys.platform == 'darwin':
|
|||||||
compile_args = ['-O3', '-w', '-fstrict-aliasing', '-fno-common', '-fopenmp']
|
compile_args = ['-O3', '-w', '-fstrict-aliasing', '-fno-common', '-fopenmp']
|
||||||
linker_args = ['-fopenmp']
|
linker_args = ['-fopenmp']
|
||||||
extra_objects = []
|
extra_objects = []
|
||||||
|
|
||||||
# If user is cwarren do static linking as this is for binaries uploaded to GitHub
|
# If user is cwarren do static linking as this is for binaries uploaded to GitHub
|
||||||
# if os.getlogin() == 'cwarren':
|
# if os.getlogin() == 'cwarren':
|
||||||
# linker_args = ['-static-libgcc']
|
# linker_args = ['-static-libgcc']
|
||||||
@@ -176,4 +178,5 @@ setup(name=packagename,
|
|||||||
'Topic :: Scientific/Engineering'
|
'Topic :: Scientific/Engineering'
|
||||||
],
|
],
|
||||||
ext_modules=extensions,
|
ext_modules=extensions,
|
||||||
|
packages=['gprMax'],
|
||||||
include_dirs=[np.get_include()])
|
include_dirs=[np.get_include()])
|
||||||
|
在新工单中引用
屏蔽一个用户