你已经派生过 gprMax
镜像自地址
https://gitee.com/sunhf/gprMax.git
已同步 2025-08-06 20:46:52 +08:00
Updated #rx command to allow user to specify an ID and also which field components should be output.
这个提交包含在:
@@ -40,7 +40,7 @@ def prepare_output_file(outputfile, G):
|
||||
f.attrs['dt'] = G.dt
|
||||
f.attrs['srcsteps'] = (G.srcstepx, G.srcstepy, G.srcstepz)
|
||||
f.attrs['rxsteps'] = (G.rxstepx, G.rxstepy, G.rxstepz)
|
||||
f.attrs['ntx'] = len(G.voltagesources) + len(G.hertziandipoles) + len(G.magneticdipoles)
|
||||
f.attrs['ntx'] = len(G.voltagesources + G.hertziandipoles + G.magneticdipoles)
|
||||
f.attrs['nrx'] = len(G.rxs)
|
||||
|
||||
# Create groups for txs, rxs
|
||||
@@ -60,12 +60,18 @@ def prepare_output_file(outputfile, G):
|
||||
for rxindex, rx in enumerate(G.rxs):
|
||||
tmp = f.create_group('/rxs/rx' + str(rxindex + 1))
|
||||
tmp['Position'] = (rx.positionx * G.dx, rx.positiony * G.dy, rx.positionz * G.dz)
|
||||
tmp['Ex'] = np.zeros(G.iterations, dtype=floattype)
|
||||
tmp['Ey'] = np.zeros(G.iterations, dtype=floattype)
|
||||
tmp['Ez'] = np.zeros(G.iterations, dtype=floattype)
|
||||
tmp['Hx'] = np.zeros(G.iterations, dtype=floattype)
|
||||
tmp['Hy'] = np.zeros(G.iterations, dtype=floattype)
|
||||
tmp['Hz'] = np.zeros(G.iterations, dtype=floattype)
|
||||
if 'Ex' in rx.outputs:
|
||||
tmp['Ex'] = np.zeros(G.iterations, dtype=floattype)
|
||||
if 'Ey' in rx.outputs:
|
||||
tmp['Ey'] = np.zeros(G.iterations, dtype=floattype)
|
||||
if 'Ez' in rx.outputs:
|
||||
tmp['Ez'] = np.zeros(G.iterations, dtype=floattype)
|
||||
if 'Hx' in rx.outputs:
|
||||
tmp['Hx'] = np.zeros(G.iterations, dtype=floattype)
|
||||
if 'Hy' in rx.outputs:
|
||||
tmp['Hy'] = np.zeros(G.iterations, dtype=floattype)
|
||||
if 'Hz' in rx.outputs:
|
||||
tmp['Hz'] = np.zeros(G.iterations, dtype=floattype)
|
||||
|
||||
return f
|
||||
|
||||
@@ -84,12 +90,18 @@ def write_output(f, timestep, Ex, Ey, Ez, Hx, Hy, Hz, G):
|
||||
if type(timestep) is not slice:
|
||||
# For each rx, write field component values at current timestep
|
||||
for rxindex, rx in enumerate(G.rxs):
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Ex'][timestep] = Ex[rx.positionx, rx.positiony, rx.positionz]
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Ey'][timestep] = Ey[rx.positionx, rx.positiony, rx.positionz]
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Ez'][timestep] = Ez[rx.positionx, rx.positiony, rx.positionz]
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Hx'][timestep] = Hx[rx.positionx, rx.positiony, rx.positionz]
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Hy'][timestep] = Hy[rx.positionx, rx.positiony, rx.positionz]
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Hz'][timestep] = Hz[rx.positionx, rx.positiony, rx.positionz]
|
||||
if 'Ex' in rx.outputs:
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Ex'][timestep] = Ex[rx.positionx, rx.positiony, rx.positionz]
|
||||
if 'Ey' in rx.outputs:
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Ey'][timestep] = Ey[rx.positionx, rx.positiony, rx.positionz]
|
||||
if 'Ez' in rx.outputs:
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Ez'][timestep] = Ez[rx.positionx, rx.positiony, rx.positionz]
|
||||
if 'Hx' in rx.outputs:
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Hx'][timestep] = Hx[rx.positionx, rx.positiony, rx.positionz]
|
||||
if 'Hy' in rx.outputs:
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Hy'][timestep] = Hy[rx.positionx, rx.positiony, rx.positionz]
|
||||
if 'Hz' in rx.outputs:
|
||||
f['/rxs/rx' + str(rxindex + 1) + '/Hz'][timestep] = Hz[rx.positionx, rx.positiony, rx.positionz]
|
||||
|
||||
# Field writing when converting old style output file to HDF5 format
|
||||
else:
|
||||
|
@@ -244,9 +244,9 @@ def process_multicmds(multicmds, G):
|
||||
if multicmds[cmdname] != 'None':
|
||||
for cmdinstance in multicmds[cmdname]:
|
||||
tmp = cmdinstance.split()
|
||||
if len(tmp) != 3:
|
||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' requires exactly three parameters')
|
||||
|
||||
if len(tmp) != 3 and len(tmp) < 5:
|
||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' has an incorrect number of parameters')
|
||||
|
||||
# Check position parameters
|
||||
positionx = rvalue(float(tmp[0])/G.dx)
|
||||
positiony = rvalue(float(tmp[1])/G.dy)
|
||||
@@ -260,8 +260,20 @@ def process_multicmds(multicmds, G):
|
||||
|
||||
r = Rx(positionx=positionx, positiony=positiony, positionz=positionz)
|
||||
|
||||
# If no ID or outputs are specified use default, i.e Ex, Ey, Ez, Hx, Hy, Hz
|
||||
if len(tmp) == 3:
|
||||
r.outputs = Rx.availableoutputs[0:5]
|
||||
else:
|
||||
r.ID = tmp[3]
|
||||
# Check and add field output names
|
||||
for field in tmp[4::]:
|
||||
if field in Rx.availableoutputs:
|
||||
r.outputs.append(field)
|
||||
else:
|
||||
raise CmdInputError("'" + cmdname + ': ' + ' '.join(tmp) + "'" + ' contains an output type that is not available')
|
||||
|
||||
if G.messages:
|
||||
print('Receiver at {:.3f}m, {:.3f}m, {:.3f}m created.'.format(r.positionx * G.dx, r.positiony * G.dy, r.positionz * G.dz))
|
||||
print('Receiver at {:.3f}m, {:.3f}m, {:.3f}m with field output(s) {} created.'.format(r.positionx * G.dx, r.positiony * G.dy, r.positionz * G.dz, ', '.join(r.outputs)))
|
||||
|
||||
G.rxs.append(r)
|
||||
|
||||
|
@@ -19,6 +19,8 @@
|
||||
class Rx:
|
||||
"""Receiever output points."""
|
||||
|
||||
availableoutputs = ['Ex', 'Ey', 'Ez', 'Hx', 'Hy', 'Hz']
|
||||
|
||||
def __init__(self, positionx=None, positiony=None, positionz=None):
|
||||
"""
|
||||
Args:
|
||||
@@ -26,6 +28,8 @@ class Rx:
|
||||
positiony (float): y-coordinate of location in model.
|
||||
positionz (float): z-coordinate of location in model.
|
||||
"""
|
||||
self.ID = None
|
||||
self.outputs = []
|
||||
self.positionx = positionx
|
||||
self.positiony = positiony
|
||||
self.positionz = positionz
|
在新工单中引用
屏蔽一个用户