diff --git a/gprMax/fields_output.py b/gprMax/fields_output.py index a34e21f3..330db1a1 100644 --- a/gprMax/fields_output.py +++ b/gprMax/fields_output.py @@ -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: diff --git a/gprMax/input_cmds_multiuse.py b/gprMax/input_cmds_multiuse.py index dd827dad..42fce881 100644 --- a/gprMax/input_cmds_multiuse.py +++ b/gprMax/input_cmds_multiuse.py @@ -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) diff --git a/gprMax/receivers.py b/gprMax/receivers.py index 657a38eb..0b303fb8 100644 --- a/gprMax/receivers.py +++ b/gprMax/receivers.py @@ -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 \ No newline at end of file