你已经派生过 gprMax
镜像自地址
https://gitee.com/sunhf/gprMax.git
已同步 2025-08-07 23:14:03 +08:00
Changed name of config import.
这个提交包含在:
@@ -30,7 +30,7 @@ import numpy as np
|
|||||||
|
|
||||||
from gprMax._version import __version__
|
from gprMax._version import __version__
|
||||||
from gprMax._version import codename
|
from gprMax._version import codename
|
||||||
import gprMax.config
|
import gprMax.config as config
|
||||||
from gprMax.config import c
|
from gprMax.config import c
|
||||||
from gprMax.config import e0
|
from gprMax.config import e0
|
||||||
from gprMax.config import m0
|
from gprMax.config import m0
|
||||||
@@ -126,8 +126,8 @@ def run_main(args):
|
|||||||
# Flatten a list of lists
|
# Flatten a list of lists
|
||||||
if any(isinstance(element, list) for element in args.gpu):
|
if any(isinstance(element, list) for element in args.gpu):
|
||||||
args.gpu = [val for sublist in args.gpu for val in sublist]
|
args.gpu = [val for sublist in args.gpu for val in sublist]
|
||||||
gpus1, allgpustext = detect_check_gpus(args.gpu)
|
config.gpus, allgpustext = detect_check_gpus(args.gpu)
|
||||||
print('with GPU(s): {}'.format(' | '.join(allgpustext)))
|
print('GPU(s): {}'.format(' | '.join(allgpustext)))
|
||||||
|
|
||||||
# Process input file
|
# Process input file
|
||||||
with open_path_file(args.inputfile) as inputfile:
|
with open_path_file(args.inputfile) as inputfile:
|
||||||
@@ -167,8 +167,8 @@ def run_main(args):
|
|||||||
else:
|
else:
|
||||||
if args.task and args.restart:
|
if args.task and args.restart:
|
||||||
raise GeneralError('Job array and restart modes cannot be used together')
|
raise GeneralError('Job array and restart modes cannot be used together')
|
||||||
if gprMax.config.gpus:
|
if config.gpus:
|
||||||
gprMax.config.gpus = gprMax.config.gpus[0]
|
config.gpus = config.gpus[0]
|
||||||
run_std_sim(args, inputfile, usernamespace)
|
run_std_sim(args, inputfile, usernamespace)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -25,12 +25,11 @@ init()
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
np.seterr(invalid='raise')
|
np.seterr(invalid='raise')
|
||||||
|
|
||||||
import gprMax.config
|
import gprMax.config as config
|
||||||
from gprMax.config import c
|
from gprMax.config import c
|
||||||
from gprMax.config import floattype
|
from gprMax.config import floattype
|
||||||
from gprMax.config import complextype
|
from gprMax.config import complextype
|
||||||
from gprMax.config import numdispersion
|
from gprMax.config import numdispersion
|
||||||
from gprMax.config import gpus as gpu
|
|
||||||
from gprMax.config import hostinfo
|
from gprMax.config import hostinfo
|
||||||
from gprMax.exceptions import GeneralError
|
from gprMax.exceptions import GeneralError
|
||||||
from gprMax.materials import Material
|
from gprMax.materials import Material
|
||||||
@@ -211,17 +210,17 @@ class FDTDGrid(Grid):
|
|||||||
raise GeneralError('Memory (RAM) required ~{} exceeds {} detected!\n'.format(human_size(self.memoryusage), human_size(hostinfo['ram'], a_kilobyte_is_1024_bytes=True)))
|
raise GeneralError('Memory (RAM) required ~{} exceeds {} detected!\n'.format(human_size(self.memoryusage), human_size(hostinfo['ram'], a_kilobyte_is_1024_bytes=True)))
|
||||||
|
|
||||||
# Check if model can be run on specified GPU if required
|
# Check if model can be run on specified GPU if required
|
||||||
if gpu is not None:
|
if config.gpus is not None:
|
||||||
if self.memoryusage - snapsmemsize > gpu.totalmem:
|
if self.memoryusage - snapsmemsize > config.gpus.totalmem:
|
||||||
raise GeneralError('Memory (RAM) required ~{} exceeds {} detected on specified {} - {} GPU!\n'.format(human_size(self.memoryusage), human_size(gpu.totalmem, a_kilobyte_is_1024_bytes=True), gpu.deviceID, gpu.name))
|
raise GeneralError('Memory (RAM) required ~{} exceeds {} detected on specified {} - {} GPU!\n'.format(human_size(self.memoryusage), human_size(config.gpus.totalmem, a_kilobyte_is_1024_bytes=True), config.gpus.deviceID, config.gpus.name))
|
||||||
|
|
||||||
# If the required memory without the snapshots will fit on the GPU then transfer and store snaphots on host
|
# If the required memory without the snapshots will fit on the GPU then transfer and store snaphots on host
|
||||||
if snapsmemsize != 0 and self.memoryusage - snapsmemsize < gpu.totalmem:
|
if snapsmemsize != 0 and self.memoryusage - snapsmemsize < config.gpus.totalmem:
|
||||||
gprMax.config.snapsgpu2cpu = True
|
config.snapsgpu2cpu = True
|
||||||
|
|
||||||
def gpu_set_blocks_per_grid(self):
|
def gpu_set_blocks_per_grid(self):
|
||||||
"""Set the blocks per grid size used for updating the electric and magnetic field arrays on a GPU."""
|
"""Set the blocks per grid size used for updating the electric and magnetic field arrays on a GPU."""
|
||||||
gprMax.config.gpus.bpg = (int(np.ceil(((self.nx + 1) * (self.ny + 1) * (self.nz + 1)) / gpu.tpb[0])), 1, 1)
|
config.gpus.bpg = (int(np.ceil(((self.nx + 1) * (self.ny + 1) * (self.nz + 1)) / config.gpus.tpb[0])), 1, 1)
|
||||||
|
|
||||||
def gpu_initialise_arrays(self):
|
def gpu_initialise_arrays(self):
|
||||||
"""Initialise standard field arrays on GPU."""
|
"""Initialise standard field arrays on GPU."""
|
||||||
@@ -340,9 +339,9 @@ def dispersion_analysis(G):
|
|||||||
minwavelength = minvelocity / results['maxfreq']
|
minwavelength = minvelocity / results['maxfreq']
|
||||||
|
|
||||||
# Maximum spatial step
|
# Maximum spatial step
|
||||||
if '3D' in gprMax.config.mode:
|
if '3D' in config.mode:
|
||||||
delta = max(G.dx, G.dy, G.dz)
|
delta = max(G.dx, G.dy, G.dz)
|
||||||
elif '2D' in gprMax.config.mode:
|
elif '2D' in config.mode:
|
||||||
if G.nx == 1:
|
if G.nx == 1:
|
||||||
delta = max(G.dy, G.dz)
|
delta = max(G.dy, G.dz)
|
||||||
elif G.ny == 1:
|
elif G.ny == 1:
|
||||||
|
@@ -23,7 +23,7 @@ init()
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
|
||||||
import gprMax.config
|
import gprMax.config as config
|
||||||
from gprMax.config import z0
|
from gprMax.config import z0
|
||||||
from gprMax.config import floattype
|
from gprMax.config import floattype
|
||||||
from gprMax.config import gpus
|
from gprMax.config import gpus
|
||||||
@@ -101,11 +101,11 @@ def process_multicmds(multicmds, G):
|
|||||||
polarisation = tmp[0].lower()
|
polarisation = tmp[0].lower()
|
||||||
if polarisation not in ('x', 'y', 'z'):
|
if polarisation not in ('x', 'y', 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x, y, or z')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x, y, or z')
|
||||||
if '2D TMx' in gprMax.config.mode and (polarisation == 'y' or polarisation == 'z'):
|
if '2D TMx' in config.mode and (polarisation == 'y' or polarisation == 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x in 2D TMx mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x in 2D TMx mode')
|
||||||
elif '2D TMy' in gprMax.config.mode and (polarisation == 'x' or polarisation == 'z'):
|
elif '2D TMy' in config.mode and (polarisation == 'x' or polarisation == 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be y in 2D TMy mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be y in 2D TMy mode')
|
||||||
elif '2D TMz' in gprMax.config.mode and (polarisation == 'x' or polarisation == 'y'):
|
elif '2D TMz' in config.mode and (polarisation == 'x' or polarisation == 'y'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be z in 2D TMz mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be z in 2D TMz mode')
|
||||||
|
|
||||||
xcoord = G.calculate_coord('x', tmp[1])
|
xcoord = G.calculate_coord('x', tmp[1])
|
||||||
@@ -172,11 +172,11 @@ def process_multicmds(multicmds, G):
|
|||||||
polarisation = tmp[0].lower()
|
polarisation = tmp[0].lower()
|
||||||
if polarisation not in ('x', 'y', 'z'):
|
if polarisation not in ('x', 'y', 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x, y, or z')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x, y, or z')
|
||||||
if '2D TMx' in gprMax.config.mode and (polarisation == 'y' or polarisation == 'z'):
|
if '2D TMx' in config.mode and (polarisation == 'y' or polarisation == 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x in 2D TMx mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x in 2D TMx mode')
|
||||||
elif '2D TMy' in gprMax.config.mode and (polarisation == 'x' or polarisation == 'z'):
|
elif '2D TMy' in config.mode and (polarisation == 'x' or polarisation == 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be y in 2D TMy mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be y in 2D TMy mode')
|
||||||
elif '2D TMz' in gprMax.config.mode and (polarisation == 'x' or polarisation == 'y'):
|
elif '2D TMz' in config.mode and (polarisation == 'x' or polarisation == 'y'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be z in 2D TMz mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be z in 2D TMz mode')
|
||||||
|
|
||||||
xcoord = G.calculate_coord('x', tmp[1])
|
xcoord = G.calculate_coord('x', tmp[1])
|
||||||
@@ -234,7 +234,7 @@ def process_multicmds(multicmds, G):
|
|||||||
h.calculate_waveform_values(G)
|
h.calculate_waveform_values(G)
|
||||||
|
|
||||||
if messages:
|
if messages:
|
||||||
if '2D' in gprMax.config.mode:
|
if '2D' in config.mode:
|
||||||
print('Hertzian dipole is a line source in 2D with polarity {} at {:g}m, {:g}m, {:g}m,'.format(h.polarisation, h.xcoord * G.dx, h.ycoord * G.dy, h.zcoord * G.dz) + startstop + 'using waveform {} created.'.format(h.waveformID))
|
print('Hertzian dipole is a line source in 2D with polarity {} at {:g}m, {:g}m, {:g}m,'.format(h.polarisation, h.xcoord * G.dx, h.ycoord * G.dy, h.zcoord * G.dz) + startstop + 'using waveform {} created.'.format(h.waveformID))
|
||||||
else:
|
else:
|
||||||
print('Hertzian dipole with polarity {} at {:g}m, {:g}m, {:g}m,'.format(h.polarisation, h.xcoord * G.dx, h.ycoord * G.dy, h.zcoord * G.dz) + startstop + 'using waveform {} created.'.format(h.waveformID))
|
print('Hertzian dipole with polarity {} at {:g}m, {:g}m, {:g}m,'.format(h.polarisation, h.xcoord * G.dx, h.ycoord * G.dy, h.zcoord * G.dz) + startstop + 'using waveform {} created.'.format(h.waveformID))
|
||||||
@@ -253,11 +253,11 @@ def process_multicmds(multicmds, G):
|
|||||||
polarisation = tmp[0].lower()
|
polarisation = tmp[0].lower()
|
||||||
if polarisation not in ('x', 'y', 'z'):
|
if polarisation not in ('x', 'y', 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x, y, or z')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x, y, or z')
|
||||||
if '2D TMx' in gprMax.config.mode and (polarisation == 'y' or polarisation == 'z'):
|
if '2D TMx' in config.mode and (polarisation == 'y' or polarisation == 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x in 2D TMx mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x in 2D TMx mode')
|
||||||
elif '2D TMy' in gprMax.config.mode and (polarisation == 'x' or polarisation == 'z'):
|
elif '2D TMy' in config.mode and (polarisation == 'x' or polarisation == 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be y in 2D TMy mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be y in 2D TMy mode')
|
||||||
elif '2D TMz' in gprMax.config.mode and (polarisation == 'x' or polarisation == 'y'):
|
elif '2D TMz' in config.mode and (polarisation == 'x' or polarisation == 'y'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be z in 2D TMz mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be z in 2D TMz mode')
|
||||||
|
|
||||||
xcoord = G.calculate_coord('x', tmp[1])
|
xcoord = G.calculate_coord('x', tmp[1])
|
||||||
@@ -326,11 +326,11 @@ def process_multicmds(multicmds, G):
|
|||||||
polarisation = tmp[0].lower()
|
polarisation = tmp[0].lower()
|
||||||
if polarisation not in ('x', 'y', 'z'):
|
if polarisation not in ('x', 'y', 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x, y, or z')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x, y, or z')
|
||||||
if '2D TMx' in gprMax.config.mode and (polarisation == 'y' or polarisation == 'z'):
|
if '2D TMx' in config.mode and (polarisation == 'y' or polarisation == 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x in 2D TMx mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be x in 2D TMx mode')
|
||||||
elif '2D TMy' in gprMax.config.mode and (polarisation == 'x' or polarisation == 'z'):
|
elif '2D TMy' in config.mode and (polarisation == 'x' or polarisation == 'z'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be y in 2D TMy mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be y in 2D TMy mode')
|
||||||
elif '2D TMz' in gprMax.config.mode and (polarisation == 'x' or polarisation == 'y'):
|
elif '2D TMz' in config.mode and (polarisation == 'x' or polarisation == 'y'):
|
||||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be z in 2D TMz mode')
|
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' polarisation must be z in 2D TMz mode')
|
||||||
|
|
||||||
xcoord = G.calculate_coord('x', tmp[1])
|
xcoord = G.calculate_coord('x', tmp[1])
|
||||||
|
@@ -28,7 +28,7 @@ init()
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from scipy import interpolate
|
from scipy import interpolate
|
||||||
|
|
||||||
import gprMax.config
|
import gprMax.config as config
|
||||||
from gprMax.config import c
|
from gprMax.config import c
|
||||||
from gprMax.config import floattype
|
from gprMax.config import floattype
|
||||||
from gprMax.config import gpus as gpu
|
from gprMax.config import gpus as gpu
|
||||||
@@ -57,9 +57,9 @@ def process_singlecmds(singlecmds, G):
|
|||||||
if len(tmp) != 1:
|
if len(tmp) != 1:
|
||||||
raise CmdInputError(cmd + ' requires exactly one parameter')
|
raise CmdInputError(cmd + ' requires exactly one parameter')
|
||||||
if singlecmds[cmd].lower() == 'y':
|
if singlecmds[cmd].lower() == 'y':
|
||||||
gprMax.config.messages = True
|
config.messages = True
|
||||||
elif singlecmds[cmd].lower() == 'n':
|
elif singlecmds[cmd].lower() == 'n':
|
||||||
gprMax.config.messages = False
|
config.messages = False
|
||||||
else:
|
else:
|
||||||
raise CmdInputError(cmd + ' requires input values of either y or n')
|
raise CmdInputError(cmd + ' requires input values of either y or n')
|
||||||
|
|
||||||
@@ -84,34 +84,34 @@ def process_singlecmds(singlecmds, G):
|
|||||||
raise CmdInputError(cmd + ' requires exactly one parameter to specify the number of threads to use')
|
raise CmdInputError(cmd + ' requires exactly one parameter to specify the number of threads to use')
|
||||||
if tmp[0] < 1:
|
if tmp[0] < 1:
|
||||||
raise CmdInputError(cmd + ' requires the value to be an integer not less than one')
|
raise CmdInputError(cmd + ' requires the value to be an integer not less than one')
|
||||||
gprMax.config.hostinfo['ompthreads'] = tmp[0]
|
config.hostinfo['ompthreads'] = tmp[0]
|
||||||
os.environ['OMP_NUM_THREADS'] = str(gprMax.config.hostinfo['ompthreads'])
|
os.environ['OMP_NUM_THREADS'] = str(config.hostinfo['ompthreads'])
|
||||||
elif os.environ.get('OMP_NUM_THREADS'):
|
elif os.environ.get('OMP_NUM_THREADS'):
|
||||||
gprMax.config.hostinfo['ompthreads'] = int(os.environ.get('OMP_NUM_THREADS'))
|
config.hostinfo['ompthreads'] = int(os.environ.get('OMP_NUM_THREADS'))
|
||||||
else:
|
else:
|
||||||
# Set number of threads to number of physical CPU cores
|
# Set number of threads to number of physical CPU cores
|
||||||
gprMax.config.hostinfo['ompthreads'] = hostinfo['physicalcores']
|
config.hostinfo['ompthreads'] = hostinfo['physicalcores']
|
||||||
os.environ['OMP_NUM_THREADS'] = str(gprMax.config.hostinfo['ompthreads'])
|
os.environ['OMP_NUM_THREADS'] = str(config.hostinfo['ompthreads'])
|
||||||
|
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('CPU (OpenMP) threads: {}'.format(gprMax.config.hostinfo['ompthreads']))
|
print('CPU (OpenMP) threads: {}'.format(config.hostinfo['ompthreads']))
|
||||||
if gprMax.config.hostinfo['ompthreads'] > hostinfo['physicalcores']:
|
if config.hostinfo['ompthreads'] > hostinfo['physicalcores']:
|
||||||
print(Fore.RED + 'WARNING: You have specified more threads ({}) than available physical CPU cores ({}). This may lead to degraded performance.'.format(gprMax.config.hostinfo['ompthreads'], hostinfo['physicalcores']) + Style.RESET_ALL)
|
print(Fore.RED + 'WARNING: You have specified more threads ({}) than available physical CPU cores ({}). This may lead to degraded performance.'.format(config.hostinfo['ompthreads'], hostinfo['physicalcores']) + Style.RESET_ALL)
|
||||||
|
|
||||||
# Print information about any GPU in use
|
# Print information about any GPU in use
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
if gpu is not None:
|
if gpu is not None:
|
||||||
print('GPU: {} - {}'.format(gpu.deviceID, gpu.name))
|
print('GPU: {} - {}'.format(gpu.deviceID, gpu.name))
|
||||||
|
|
||||||
# Print information about precision of main field values
|
# Print information about precision of main field values
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('Output data type: {}\n'.format(np.dtype(floattype).name))
|
print('Output data type: {}\n'.format(np.dtype(floattype).name))
|
||||||
|
|
||||||
# Title
|
# Title
|
||||||
cmd = '#title'
|
cmd = '#title'
|
||||||
if singlecmds[cmd] is not None:
|
if singlecmds[cmd] is not None:
|
||||||
G.title = singlecmds[cmd]
|
G.title = singlecmds[cmd]
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('Model title: {}'.format(G.title))
|
print('Model title: {}'.format(G.title))
|
||||||
|
|
||||||
# Spatial discretisation
|
# Spatial discretisation
|
||||||
@@ -128,7 +128,7 @@ def process_singlecmds(singlecmds, G):
|
|||||||
G.dx = tmp[0]
|
G.dx = tmp[0]
|
||||||
G.dy = tmp[1]
|
G.dy = tmp[1]
|
||||||
G.dz = tmp[2]
|
G.dz = tmp[2]
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('Spatial discretisation: {:g} x {:g} x {:g}m'.format(G.dx, G.dy, G.dz))
|
print('Spatial discretisation: {:g} x {:g} x {:g}m'.format(G.dx, G.dy, G.dz))
|
||||||
|
|
||||||
# Domain
|
# Domain
|
||||||
@@ -141,35 +141,35 @@ def process_singlecmds(singlecmds, G):
|
|||||||
G.nz = round_value(tmp[2] / G.dz)
|
G.nz = round_value(tmp[2] / G.dz)
|
||||||
if G.nx == 0 or G.ny == 0 or G.nz == 0:
|
if G.nx == 0 or G.ny == 0 or G.nz == 0:
|
||||||
raise CmdInputError(cmd + ' requires at least one cell in every dimension')
|
raise CmdInputError(cmd + ' requires at least one cell in every dimension')
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('Domain size: {:g} x {:g} x {:g}m ({:d} x {:d} x {:d} = {:g} cells)'.format(tmp[0], tmp[1], tmp[2], G.nx, G.ny, G.nz, (G.nx * G.ny * G.nz)))
|
print('Domain size: {:g} x {:g} x {:g}m ({:d} x {:d} x {:d} = {:g} cells)'.format(tmp[0], tmp[1], tmp[2], G.nx, G.ny, G.nz, (G.nx * G.ny * G.nz)))
|
||||||
|
|
||||||
# Time step CFL limit (either 2D or 3D); switch off appropriate PMLs for 2D
|
# Time step CFL limit (either 2D or 3D); switch off appropriate PMLs for 2D
|
||||||
if G.nx == 1:
|
if G.nx == 1:
|
||||||
G.dt = 1 / (c * np.sqrt((1 / G.dy) * (1 / G.dy) + (1 / G.dz) * (1 / G.dz)))
|
G.dt = 1 / (c * np.sqrt((1 / G.dy) * (1 / G.dy) + (1 / G.dz) * (1 / G.dz)))
|
||||||
gprMax.config.mode = '2D TMx'
|
config.mode = '2D TMx'
|
||||||
G.pmlthickness['x0'] = 0
|
G.pmlthickness['x0'] = 0
|
||||||
G.pmlthickness['xmax'] = 0
|
G.pmlthickness['xmax'] = 0
|
||||||
elif G.ny == 1:
|
elif G.ny == 1:
|
||||||
G.dt = 1 / (c * np.sqrt((1 / G.dx) * (1 / G.dx) + (1 / G.dz) * (1 / G.dz)))
|
G.dt = 1 / (c * np.sqrt((1 / G.dx) * (1 / G.dx) + (1 / G.dz) * (1 / G.dz)))
|
||||||
gprMax.config.mode = '2D TMy'
|
config.mode = '2D TMy'
|
||||||
G.pmlthickness['y0'] = 0
|
G.pmlthickness['y0'] = 0
|
||||||
G.pmlthickness['ymax'] = 0
|
G.pmlthickness['ymax'] = 0
|
||||||
elif G.nz == 1:
|
elif G.nz == 1:
|
||||||
G.dt = 1 / (c * np.sqrt((1 / G.dx) * (1 / G.dx) + (1 / G.dy) * (1 / G.dy)))
|
G.dt = 1 / (c * np.sqrt((1 / G.dx) * (1 / G.dx) + (1 / G.dy) * (1 / G.dy)))
|
||||||
gprMax.config.mode = '2D TMz'
|
config.mode = '2D TMz'
|
||||||
G.pmlthickness['z0'] = 0
|
G.pmlthickness['z0'] = 0
|
||||||
G.pmlthickness['zmax'] = 0
|
G.pmlthickness['zmax'] = 0
|
||||||
else:
|
else:
|
||||||
G.dt = 1 / (c * np.sqrt((1 / G.dx) * (1 / G.dx) + (1 / G.dy) * (1 / G.dy) + (1 / G.dz) * (1 / G.dz)))
|
G.dt = 1 / (c * np.sqrt((1 / G.dx) * (1 / G.dx) + (1 / G.dy) * (1 / G.dy) + (1 / G.dz) * (1 / G.dz)))
|
||||||
gprMax.config.mode = '3D'
|
config.mode = '3D'
|
||||||
|
|
||||||
# Round down time step to nearest float with precision one less than hardware maximum.
|
# Round down time step to nearest float with precision one less than hardware maximum.
|
||||||
# Avoids inadvertently exceeding the CFL due to binary representation of floating point number.
|
# Avoids inadvertently exceeding the CFL due to binary representation of floating point number.
|
||||||
G.dt = round_value(G.dt, decimalplaces=d.getcontext().prec - 1)
|
G.dt = round_value(G.dt, decimalplaces=d.getcontext().prec - 1)
|
||||||
|
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('Mode: {}'.format(gprMax.config.mode))
|
print('Mode: {}'.format(config.mode))
|
||||||
print('Time step (at CFL limit): {:g} secs'.format(G.dt))
|
print('Time step (at CFL limit): {:g} secs'.format(G.dt))
|
||||||
|
|
||||||
# Time step stability factor
|
# Time step stability factor
|
||||||
@@ -181,7 +181,7 @@ def process_singlecmds(singlecmds, G):
|
|||||||
if tmp[0] <= 0 or tmp[0] > 1:
|
if tmp[0] <= 0 or tmp[0] > 1:
|
||||||
raise CmdInputError(cmd + ' requires the value of the time step stability factor to be between zero and one')
|
raise CmdInputError(cmd + ' requires the value of the time step stability factor to be between zero and one')
|
||||||
G.dt = G.dt * tmp[0]
|
G.dt = G.dt * tmp[0]
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('Time step (modified): {:g} secs'.format(G.dt))
|
print('Time step (modified): {:g} secs'.format(G.dt))
|
||||||
|
|
||||||
# Time window
|
# Time window
|
||||||
@@ -206,7 +206,7 @@ def process_singlecmds(singlecmds, G):
|
|||||||
G.iterations = int(np.ceil(tmp / G.dt)) + 1
|
G.iterations = int(np.ceil(tmp / G.dt)) + 1
|
||||||
else:
|
else:
|
||||||
raise CmdInputError(cmd + ' must have a value greater than zero')
|
raise CmdInputError(cmd + ' must have a value greater than zero')
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('Time window: {:g} secs ({} iterations)'.format(G.timewindow, G.iterations))
|
print('Time window: {:g} secs ({} iterations)'.format(G.timewindow, G.iterations))
|
||||||
|
|
||||||
# PML cells
|
# PML cells
|
||||||
@@ -248,7 +248,7 @@ def process_singlecmds(singlecmds, G):
|
|||||||
G.srcsteps[0] = round_value(float(tmp[0]) / G.dx)
|
G.srcsteps[0] = round_value(float(tmp[0]) / G.dx)
|
||||||
G.srcsteps[1] = round_value(float(tmp[1]) / G.dy)
|
G.srcsteps[1] = round_value(float(tmp[1]) / G.dy)
|
||||||
G.srcsteps[2] = round_value(float(tmp[2]) / G.dz)
|
G.srcsteps[2] = round_value(float(tmp[2]) / G.dz)
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('Simple sources will step {:g}m, {:g}m, {:g}m for each model run.'.format(G.srcsteps[0] * G.dx, G.srcsteps[1] * G.dy, G.srcsteps[2] * G.dz))
|
print('Simple sources will step {:g}m, {:g}m, {:g}m for each model run.'.format(G.srcsteps[0] * G.dx, G.srcsteps[1] * G.dy, G.srcsteps[2] * G.dz))
|
||||||
|
|
||||||
# rx_steps
|
# rx_steps
|
||||||
@@ -260,7 +260,7 @@ def process_singlecmds(singlecmds, G):
|
|||||||
G.rxsteps[0] = round_value(float(tmp[0]) / G.dx)
|
G.rxsteps[0] = round_value(float(tmp[0]) / G.dx)
|
||||||
G.rxsteps[1] = round_value(float(tmp[1]) / G.dy)
|
G.rxsteps[1] = round_value(float(tmp[1]) / G.dy)
|
||||||
G.rxsteps[2] = round_value(float(tmp[2]) / G.dz)
|
G.rxsteps[2] = round_value(float(tmp[2]) / G.dz)
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('All receivers will step {:g}m, {:g}m, {:g}m for each model run.'.format(G.rxsteps[0] * G.dx, G.rxsteps[1] * G.dy, G.rxsteps[2] * G.dz))
|
print('All receivers will step {:g}m, {:g}m, {:g}m for each model run.'.format(G.rxsteps[0] * G.dx, G.rxsteps[1] * G.dy, G.rxsteps[2] * G.dz))
|
||||||
|
|
||||||
# Excitation file for user-defined source waveforms
|
# Excitation file for user-defined source waveforms
|
||||||
@@ -284,7 +284,7 @@ def process_singlecmds(singlecmds, G):
|
|||||||
if not os.path.isfile(excitationfile):
|
if not os.path.isfile(excitationfile):
|
||||||
excitationfile = os.path.abspath(os.path.join(G.inputdirectory, excitationfile))
|
excitationfile = os.path.abspath(os.path.join(G.inputdirectory, excitationfile))
|
||||||
|
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('\nExcitation file: {}'.format(excitationfile))
|
print('\nExcitation file: {}'.format(excitationfile))
|
||||||
|
|
||||||
# Get waveform names
|
# Get waveform names
|
||||||
@@ -326,7 +326,7 @@ def process_singlecmds(singlecmds, G):
|
|||||||
# Interpolate waveform values
|
# Interpolate waveform values
|
||||||
w.userfunc = interpolate.interp1d(waveformtime, singlewaveformvalues, **kwargs)
|
w.userfunc = interpolate.interp1d(waveformtime, singlewaveformvalues, **kwargs)
|
||||||
|
|
||||||
if gprMax.config.messages:
|
if config.messages:
|
||||||
print('User waveform {} created using {} and, if required, interpolation parameters (kind: {}, fill value: {}).'.format(w.ID, timestr, kwargs['kind'], kwargs['fill_value']))
|
print('User waveform {} created using {} and, if required, interpolation parameters (kind: {}, fill value: {}).'.format(w.ID, timestr, kwargs['kind'], kwargs['fill_value']))
|
||||||
|
|
||||||
G.waveforms.append(w)
|
G.waveforms.append(w)
|
||||||
|
@@ -31,13 +31,13 @@ import numpy as np
|
|||||||
from terminaltables import SingleTable
|
from terminaltables import SingleTable
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
import gprMax.config as config
|
||||||
from gprMax.config import floattype
|
from gprMax.config import floattype
|
||||||
from gprMax.config import complextype
|
from gprMax.config import complextype
|
||||||
from gprMax.config import cudafloattype
|
from gprMax.config import cudafloattype
|
||||||
from gprMax.config import cudacomplextype
|
from gprMax.config import cudacomplextype
|
||||||
from gprMax.config import numdispersion
|
from gprMax.config import numdispersion
|
||||||
from gprMax.config import hostinfo
|
from gprMax.config import hostinfo
|
||||||
from gprMax.config import gpus as gpu
|
|
||||||
from gprMax.config import messages
|
from gprMax.config import messages
|
||||||
from gprMax.config import progressbars
|
from gprMax.config import progressbars
|
||||||
from gprMax.config import snapsgpu2cpu
|
from gprMax.config import snapsgpu2cpu
|
||||||
@@ -167,9 +167,10 @@ def run_model(args, currentmodelrun, modelend, numbermodelruns, inputfile, usern
|
|||||||
G.memory_estimate_basic()
|
G.memory_estimate_basic()
|
||||||
G.memory_check()
|
G.memory_check()
|
||||||
if messages:
|
if messages:
|
||||||
print('\nMemory (RAM) required: ~{}\n'.format(human_size(G.memoryusage)))
|
memGPU = ''
|
||||||
if gpu:
|
if config.gpus:
|
||||||
print('\nGPU memory (RAM) required: ~{}\n'.format(human_size(G.memoryusage)))
|
memGPU = ' host + ~{} GPU'.format(human_size(G.memoryusage))
|
||||||
|
print('\nMemory (RAM) required: ~{}{}\n'.format(human_size(G.memoryusage), memGPU))
|
||||||
|
|
||||||
# Initialise an array for volumetric material IDs (solid), boolean
|
# Initialise an array for volumetric material IDs (solid), boolean
|
||||||
# arrays for specifying materials not to be averaged (rigid),
|
# arrays for specifying materials not to be averaged (rigid),
|
||||||
@@ -362,7 +363,7 @@ def run_model(args, currentmodelrun, modelend, numbermodelruns, inputfile, usern
|
|||||||
print('\nOutput file: {}\n'.format(outputfile))
|
print('\nOutput file: {}\n'.format(outputfile))
|
||||||
|
|
||||||
# Main FDTD solving functions for either CPU or GPU
|
# Main FDTD solving functions for either CPU or GPU
|
||||||
if gpu is None:
|
if config.gpus is None:
|
||||||
tsolve = solve_cpu(currentmodelrun, modelend, G)
|
tsolve = solve_cpu(currentmodelrun, modelend, G)
|
||||||
else:
|
else:
|
||||||
tsolve, memsolve = solve_gpu(currentmodelrun, modelend, G)
|
tsolve, memsolve = solve_gpu(currentmodelrun, modelend, G)
|
||||||
@@ -386,9 +387,10 @@ def run_model(args, currentmodelrun, modelend, numbermodelruns, inputfile, usern
|
|||||||
if messages: print()
|
if messages: print()
|
||||||
|
|
||||||
if messages:
|
if messages:
|
||||||
print('Memory (RAM) used: ~{}'.format(human_size(p.memory_full_info().uss)))
|
memGPU = ''
|
||||||
if gpu:
|
if config.gpus:
|
||||||
print('GPU memory (RAM) used: ~{}'.format(human_size(memsolve)))
|
memGPU = ' host + ~{} GPU'.format(human_size(memsolve))
|
||||||
|
print('\nMemory (RAM) used: ~{}{}'.format(human_size(p.memory_full_info().uss), memGPU))
|
||||||
print('Solving time [HH:MM:SS]: {}'.format(datetime.timedelta(seconds=tsolve)))
|
print('Solving time [HH:MM:SS]: {}'.format(datetime.timedelta(seconds=tsolve)))
|
||||||
|
|
||||||
# If geometry information to be reused between model runs then FDTDGrid
|
# If geometry information to be reused between model runs then FDTDGrid
|
||||||
@@ -492,7 +494,7 @@ def solve_gpu(currentmodelrun, modelend, G):
|
|||||||
compiler_opts = None
|
compiler_opts = None
|
||||||
|
|
||||||
# Create device handle and context on specifc GPU device (and make it current context)
|
# Create device handle and context on specifc GPU device (and make it current context)
|
||||||
dev = drv.Device(gpu.deviceID)
|
dev = drv.Device(config.gpus.deviceID)
|
||||||
ctx = dev.make_context()
|
ctx = dev.make_context()
|
||||||
|
|
||||||
# Electric and magnetic field updates - prepare kernels, and get kernel functions
|
# Electric and magnetic field updates - prepare kernels, and get kernel functions
|
||||||
@@ -506,8 +508,8 @@ def solve_gpu(currentmodelrun, modelend, G):
|
|||||||
# Copy material coefficient arrays to constant memory of GPU (must be <64KB) for fields kernels
|
# Copy material coefficient arrays to constant memory of GPU (must be <64KB) for fields kernels
|
||||||
updatecoeffsE = kernels_fields.get_global('updatecoeffsE')[0]
|
updatecoeffsE = kernels_fields.get_global('updatecoeffsE')[0]
|
||||||
updatecoeffsH = kernels_fields.get_global('updatecoeffsH')[0]
|
updatecoeffsH = kernels_fields.get_global('updatecoeffsH')[0]
|
||||||
if G.updatecoeffsE.nbytes + G.updatecoeffsH.nbytes > gpu.constmem:
|
if G.updatecoeffsE.nbytes + G.updatecoeffsH.nbytes > config.gpus.constmem:
|
||||||
raise GeneralError('Too many materials in the model to fit onto constant memory of size {} on {} - {} GPU'.format(human_size(gpu.constmem), gpu.deviceID, gpu.name))
|
raise GeneralError('Too many materials in the model to fit onto constant memory of size {} on {} - {} GPU'.format(human_size(config.gpus.constmem), config.gpus.deviceID, config.gpus.name))
|
||||||
else:
|
else:
|
||||||
drv.memcpy_htod(updatecoeffsE, G.updatecoeffsE)
|
drv.memcpy_htod(updatecoeffsE, G.updatecoeffsE)
|
||||||
drv.memcpy_htod(updatecoeffsH, G.updatecoeffsH)
|
drv.memcpy_htod(updatecoeffsH, G.updatecoeffsH)
|
||||||
@@ -627,7 +629,7 @@ def solve_gpu(currentmodelrun, modelend, G):
|
|||||||
update_h_gpu(np.int32(G.nx), np.int32(G.ny), np.int32(G.nz),
|
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.ID_gpu.gpudata, G.Hx_gpu.gpudata, G.Hy_gpu.gpudata,
|
||||||
G.Hz_gpu.gpudata, G.Ex_gpu.gpudata, G.Ey_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.Ez_gpu.gpudata, block=config.gpus.tpb, grid=config.gpus.bpg)
|
||||||
|
|
||||||
# Update magnetic field components with the PML correction
|
# Update magnetic field components with the PML correction
|
||||||
for pml in G.pmls:
|
for pml in G.pmls:
|
||||||
@@ -648,7 +650,7 @@ def solve_gpu(currentmodelrun, modelend, G):
|
|||||||
update_e_gpu(np.int32(G.nx), np.int32(G.ny), np.int32(G.nz), G.ID_gpu.gpudata,
|
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.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata,
|
||||||
G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata,
|
G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata,
|
||||||
block=G.tpb, grid=G.bpg)
|
block=config.gpus.tpb, grid=config.gpus.bpg)
|
||||||
# If there are any dispersive materials do 1st part of dispersive update
|
# 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).
|
# (it is split into two parts as it requires present and updated electric field values).
|
||||||
else:
|
else:
|
||||||
@@ -657,7 +659,7 @@ def solve_gpu(currentmodelrun, modelend, G):
|
|||||||
G.Tx_gpu.gpudata, G.Ty_gpu.gpudata, G.Tz_gpu.gpudata, G.ID_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.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata,
|
||||||
G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata,
|
G.Hx_gpu.gpudata, G.Hy_gpu.gpudata, G.Hz_gpu.gpudata,
|
||||||
block=G.tpb, grid=G.bpg)
|
block=config.gpus.tpb, grid=config.gpus.bpg)
|
||||||
|
|
||||||
# Update electric field components with the PML correction
|
# Update electric field components with the PML correction
|
||||||
for pml in G.pmls:
|
for pml in G.pmls:
|
||||||
@@ -687,7 +689,7 @@ def solve_gpu(currentmodelrun, modelend, G):
|
|||||||
np.int32(Material.maxpoles), G.updatecoeffsdispersive_gpu.gpudata,
|
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.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.Ex_gpu.gpudata, G.Ey_gpu.gpudata, G.Ez_gpu.gpudata,
|
||||||
block=G.tpb, grid=G.bpg)
|
block=config.gpus.tpb, grid=config.gpus.bpg)
|
||||||
|
|
||||||
# Copy output from receivers array back to correct receiver objects
|
# Copy output from receivers array back to correct receiver objects
|
||||||
if G.rxs:
|
if G.rxs:
|
||||||
|
@@ -21,6 +21,7 @@ from importlib import import_module
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
import gprMax.config as config
|
||||||
from gprMax.config import e0
|
from gprMax.config import e0
|
||||||
from gprMax.config import z0
|
from gprMax.config import z0
|
||||||
from gprMax.config import floattype
|
from gprMax.config import floattype
|
||||||
@@ -302,7 +303,7 @@ class PML(object):
|
|||||||
G (class): Grid class instance - holds essential parameters describing the model.
|
G (class): Grid class instance - holds essential parameters describing the model.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.bpg = (int(np.ceil(((self.EPhi1.shape[1] + 1) * (self.EPhi1.shape[2] + 1) * (self.EPhi1.shape[3] + 1)) / G.tpb[0])), 1, 1)
|
config.gpus.bpg = (int(np.ceil(((self.EPhi1.shape[1] + 1) * (self.EPhi1.shape[2] + 1) * (self.EPhi1.shape[3] + 1)) / config.gpus.tpb[0])), 1, 1)
|
||||||
|
|
||||||
def gpu_initialise_arrays(self):
|
def gpu_initialise_arrays(self):
|
||||||
"""Initialise PML field and coefficient arrays on GPU."""
|
"""Initialise PML field and coefficient arrays on GPU."""
|
||||||
@@ -342,7 +343,7 @@ class PML(object):
|
|||||||
G (class): Grid class instance - holds essential parameters describing the model.
|
G (class): Grid class instance - holds essential parameters describing the model.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.update_electric_gpu(np.int32(self.xs), np.int32(self.xf), np.int32(self.ys), np.int32(self.yf), np.int32(self.zs), np.int32(self.zf), np.int32(self.EPhi1.shape[1]), np.int32(self.EPhi1.shape[2]), np.int32(self.EPhi1.shape[3]), np.int32(self.EPhi2.shape[1]), np.int32(self.EPhi2.shape[2]), np.int32(self.EPhi2.shape[3]), np.int32(self.thickness), 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, self.EPhi1_gpu.gpudata, self.EPhi2_gpu.gpudata, self.ERA_gpu.gpudata, self.ERB_gpu.gpudata, self.ERE_gpu.gpudata, self.ERF_gpu.gpudata, floattype(self.d), block=G.tpb, grid=self.bpg)
|
self.update_electric_gpu(np.int32(self.xs), np.int32(self.xf), np.int32(self.ys), np.int32(self.yf), np.int32(self.zs), np.int32(self.zf), np.int32(self.EPhi1.shape[1]), np.int32(self.EPhi1.shape[2]), np.int32(self.EPhi1.shape[3]), np.int32(self.EPhi2.shape[1]), np.int32(self.EPhi2.shape[2]), np.int32(self.EPhi2.shape[3]), np.int32(self.thickness), 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, self.EPhi1_gpu.gpudata, self.EPhi2_gpu.gpudata, self.ERA_gpu.gpudata, self.ERB_gpu.gpudata, self.ERE_gpu.gpudata, self.ERF_gpu.gpudata, floattype(self.d), block=config.gpus.tpb, grid=config.gpus.bpg)
|
||||||
|
|
||||||
def gpu_update_magnetic(self, G):
|
def gpu_update_magnetic(self, G):
|
||||||
"""This functions updates magnetic field components with the PML correction on the GPU.
|
"""This functions updates magnetic field components with the PML correction on the GPU.
|
||||||
@@ -351,7 +352,7 @@ class PML(object):
|
|||||||
G (class): Grid class instance - holds essential parameters describing the model.
|
G (class): Grid class instance - holds essential parameters describing the model.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.update_magnetic_gpu(np.int32(self.xs), np.int32(self.xf), np.int32(self.ys), np.int32(self.yf), np.int32(self.zs), np.int32(self.zf), np.int32(self.HPhi1.shape[1]), np.int32(self.HPhi1.shape[2]), np.int32(self.HPhi1.shape[3]), np.int32(self.HPhi2.shape[1]), np.int32(self.HPhi2.shape[2]), np.int32(self.HPhi2.shape[3]), np.int32(self.thickness), 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, self.HPhi1_gpu.gpudata, self.HPhi2_gpu.gpudata, self.HRA_gpu.gpudata, self.HRB_gpu.gpudata, self.HRE_gpu.gpudata, self.HRF_gpu.gpudata, floattype(self.d), block=G.tpb, grid=self.bpg)
|
self.update_magnetic_gpu(np.int32(self.xs), np.int32(self.xf), np.int32(self.ys), np.int32(self.yf), np.int32(self.zs), np.int32(self.zf), np.int32(self.HPhi1.shape[1]), np.int32(self.HPhi1.shape[2]), np.int32(self.HPhi1.shape[3]), np.int32(self.HPhi2.shape[1]), np.int32(self.HPhi2.shape[2]), np.int32(self.HPhi2.shape[3]), np.int32(self.thickness), 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, self.HPhi1_gpu.gpudata, self.HPhi2_gpu.gpudata, self.HRA_gpu.gpudata, self.HRB_gpu.gpudata, self.HRE_gpu.gpudata, self.HRF_gpu.gpudata, floattype(self.d), block=config.gpus.tpb, grid=config.gpus.bpg)
|
||||||
|
|
||||||
|
|
||||||
def build_pmls(G, pbar):
|
def build_pmls(G, pbar):
|
||||||
|
在新工单中引用
屏蔽一个用户