From 06c8908c2cd4011505c9af8f201c496d4f4b04a5 Mon Sep 17 00:00:00 2001 From: nmannall Date: Tue, 21 May 2024 10:25:56 +0100 Subject: [PATCH] Move srcsteps and rxsteps into Model class --- gprMax/cmds_singleuse.py | 8 ++++---- gprMax/fields_outputs.py | 15 +++++++++------ gprMax/grid/fdtd_grid.py | 10 ++++------ gprMax/model.py | 7 +++++-- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/gprMax/cmds_singleuse.py b/gprMax/cmds_singleuse.py index 7018ad7c..51cba84a 100644 --- a/gprMax/cmds_singleuse.py +++ b/gprMax/cmds_singleuse.py @@ -378,16 +378,16 @@ class RxSteps(UserObjectSingle): super().__init__(**kwargs) self.order = 9 - def build(self, G, uip): + def build(self, model, uip): try: - G.rxsteps = uip.discretise_point(self.kwargs["p1"]) + model.rxsteps = uip.discretise_point(self.kwargs["p1"]) except KeyError: 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 " + f"All receivers will step {model.rxsteps[0] * model.dx:g}m, " + f"{model.rxsteps[1] * model.dy:g}m, {model.rxsteps[2] * model.dz:g}m " "for each model run." ) diff --git a/gprMax/fields_outputs.py b/gprMax/fields_outputs.py index 6970598a..58bd5c84 100644 --- a/gprMax/fields_outputs.py +++ b/gprMax/fields_outputs.py @@ -68,7 +68,10 @@ def write_hdf5_outputfile(outputfile: Path, title: str, model): f = h5py.File(outputfile, "w") f.attrs["gprMax"] = __version__ f.attrs["Title"] = title - write_hd5_data(f, model.G, model.iterations) + f.attrs["Iterations"] = model.iterations + f.attrs["srcsteps"] = model.srcsteps + f.attrs["rxsteps"] = model.rxsteps + write_hd5_data(f, model.G) # Write meta data and data for any subgrids sg_rxs = [True for sg in model.subgrids if sg.rxs] @@ -76,12 +79,12 @@ def write_hdf5_outputfile(outputfile: Path, title: str, model): if sg_rxs or sg_tls: for sg in model.subgrids: grp = f.create_group(f"/subgrids/{sg.name}") - write_hd5_data(grp, sg, sg.iterations, is_subgrid=True) + write_hd5_data(grp, sg, is_subgrid=True) logger.basic(f"Written output file: {outputfile.name}") -def write_hd5_data(basegrp, grid, iterations, is_subgrid=False): +def write_hd5_data(basegrp, grid, is_subgrid=False): """Writes grid meta data and data to HDF5 group. Args: @@ -91,7 +94,6 @@ def write_hd5_data(basegrp, grid, iterations, is_subgrid=False): """ # Write meta data for grid - basegrp.attrs["Iterations"] = iterations basegrp.attrs["nx_ny_nz"] = (grid.nx, grid.ny, grid.nz) basegrp.attrs["dx_dy_dz"] = (grid.dx, grid.dy, grid.dz) basegrp.attrs["dt"] = grid.dt @@ -100,11 +102,12 @@ def write_hd5_data(basegrp, grid, iterations, is_subgrid=False): ) basegrp.attrs["nsrc"] = nsrc basegrp.attrs["nrx"] = len(grid.rxs) - basegrp.attrs["srcsteps"] = grid.srcsteps - basegrp.attrs["rxsteps"] = grid.rxsteps if is_subgrid: # Write additional meta data about subgrid + basegrp.attrs["Iterations"] = grid.iterations + basegrp.attrs["srcsteps"] = grid.srcsteps + basegrp.attrs["rxsteps"] = grid.rxsteps basegrp.attrs["is_os_sep"] = grid.is_os_sep basegrp.attrs["pml_separation"] = grid.pml_separation basegrp.attrs["subgrid_pml_thickness"] = grid.pmls["thickness"]["x0"] diff --git a/gprMax/grid/fdtd_grid.py b/gprMax/grid/fdtd_grid.py index 1840c706..524070ea 100644 --- a/gprMax/grid/fdtd_grid.py +++ b/gprMax/grid/fdtd_grid.py @@ -110,8 +110,6 @@ class FDTDGrid: self.magneticdipoles: List[MagneticDipole] = [] self.transmissionlines: List[TransmissionLine] = [] self.rxs: List[Rx] = [] - self.srcsteps: List[int] = [0, 0, 0] - self.rxsteps: List[int] = [0, 0, 0] self.snapshots: List[Snapshot] = [] self.averagevolumeobjects = True @@ -233,18 +231,18 @@ class FDTDGrid: item.ycoord = item.ycoordorigin + step_number * step_size[1] item.zcoord = item.zcoordorigin + step_number * step_size[2] - def update_simple_source_positions(self, step: int = 0) -> None: + def update_simple_source_positions(self, step_size: List[int], step: int = 0) -> None: try: self._update_positions( - itertools.chain(self.hertziandipoles, self.magneticdipoles), self.srcsteps, step + itertools.chain(self.hertziandipoles, self.magneticdipoles), step_size, step ) except ValueError as e: logger.exception("Source(s) will be stepped to a position outside the domain.") raise ValueError from e - def update_receiver_positions(self, step: int = 0) -> None: + def update_receiver_positions(self, step_size: List[int], step: int = 0) -> None: try: - self._update_positions(self.rxs, self.rxsteps, step) + self._update_positions(self.rxs, step_size, step) except ValueError as e: logger.exception("Receiver(s) will be stepped to a position outside the domain.") raise ValueError from e diff --git a/gprMax/model.py b/gprMax/model.py index d298cba1..cc282db6 100644 --- a/gprMax/model.py +++ b/gprMax/model.py @@ -62,6 +62,9 @@ class Model: self.iterations = 0 # Total number of iterations self.timewindow = 0.0 + self.srcsteps: List[int] = [0, 0, 0] + self.rxsteps: List[int] = [0, 0, 0] + self.G = self._create_grid() self.subgrids: List[SubGridBaseGrid] = [] @@ -173,8 +176,8 @@ class Model: # Adjust position of simple sources and receivers if required model_num = config.sim_config.current_model - G.update_simple_source_positions(step=model_num) - G.update_receiver_positions(step=model_num) + G.update_simple_source_positions(self.srcsteps, step=model_num) + G.update_receiver_positions(self.rxsteps, step=model_num) # Write files for any geometry views and geometry object outputs if (