From a31be536d680e0deb635f604cf35372db6367af6 Mon Sep 17 00:00:00 2001 From: nmannall Date: Wed, 15 May 2024 16:27:03 +0100 Subject: [PATCH] Begin moving subgrids into Model class --- gprMax/grid/fdtd_grid.py | 1 - gprMax/model.py | 14 ++++++-------- gprMax/subgrids/grid.py | 2 ++ gprMax/subgrids/user_objects.py | 29 ++++++++++++++--------------- 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/gprMax/grid/fdtd_grid.py b/gprMax/grid/fdtd_grid.py index db22af42..560013c4 100644 --- a/gprMax/grid/fdtd_grid.py +++ b/gprMax/grid/fdtd_grid.py @@ -89,7 +89,6 @@ class FDTDGrid: self.srcsteps: List[int] = [0, 0, 0] self.rxsteps: List[int] = [0, 0, 0] self.snapshots = [] - self.subgrids = [] @property def dx(self) -> float: diff --git a/gprMax/model.py b/gprMax/model.py index 1b107ce5..a2abec3d 100644 --- a/gprMax/model.py +++ b/gprMax/model.py @@ -17,10 +17,9 @@ # along with gprMax. If not, see . import datetime -import itertools import logging import sys -from typing import Any, Tuple +from typing import List import humanize import numpy as np @@ -29,22 +28,19 @@ from colorama import Fore, Style, init from gprMax.grid.cuda_grid import CUDAGrid from gprMax.grid.opencl_grid import OpenCLGrid +from gprMax.subgrids.grid import SubGridBaseGrid init() -from terminaltables import SingleTable from tqdm import tqdm import gprMax.config as config -from .cython.yee_cell_build import build_electric_components, build_magnetic_components from .fields_outputs import write_hdf5_outputfile from .geometry_outputs import save_geometry_views -from .grid.fdtd_grid import FDTDGrid, dispersion_analysis -from .materials import process_materials -from .pml import CFS, build_pml, print_pml_info +from .grid.fdtd_grid import FDTDGrid from .snapshots import save_snapshots -from .utilities.host_info import mem_check_build_all, mem_check_run_all, set_omp_threads +from .utilities.host_info import set_omp_threads from .utilities.utilities import get_terminal_width logger = logging.getLogger(__name__) @@ -67,6 +63,8 @@ class Model: self.timewindow = 0.0 self.G = self._create_grid() + self.subgrids: List[SubGridBaseGrid] = [] + # Monitor memory usage self.p = None diff --git a/gprMax/subgrids/grid.py b/gprMax/subgrids/grid.py index 20118026..aa33d958 100644 --- a/gprMax/subgrids/grid.py +++ b/gprMax/subgrids/grid.py @@ -36,6 +36,8 @@ class SubGridBaseGrid(FDTDGrid, ABC): # Name of the grid self.name = kwargs["id"] + self.parent_grid: FDTDGrid + self.iterations = 0 self.filter = kwargs["filter"] diff --git a/gprMax/subgrids/user_objects.py b/gprMax/subgrids/user_objects.py index 942684c8..86d0ad7a 100644 --- a/gprMax/subgrids/user_objects.py +++ b/gprMax/subgrids/user_objects.py @@ -23,6 +23,7 @@ from typing import List, Tuple, Union import numpy as np from gprMax.grid.fdtd_grid import FDTDGrid +from gprMax.model import Model from gprMax.subgrids.grid import SubGridBaseGrid from gprMax.user_inputs import MainGridUserInput @@ -85,24 +86,24 @@ class SubGridBase(UserObjectMulti): sg.ny = 2 * sg.n_boundary_cells_y + sg.nwy sg.nz = 2 * sg.n_boundary_cells_z + sg.nwz - def set_iterations(self, sg: SubGridBaseGrid, main: FDTDGrid): + def set_iterations(self, sg: SubGridBaseGrid, model: Model): """Sets number of iterations that will take place in the subgrid.""" - sg.iterations = main.iterations * sg.ratio + sg.iterations = model.iterations * sg.ratio - def setup(self, sg: SubGridBaseGrid, grid: FDTDGrid, uip: MainGridUserInput): + def setup(self, sg: SubGridBaseGrid, model: Model, uip: MainGridUserInput): """ "Common setup to both all subgrid types.""" p1 = self.kwargs["p1"] p2 = self.kwargs["p2"] p1, p2 = uip.check_box_points(p1, p2, self.__str__()) - self.set_discretisation(sg, grid) + self.set_discretisation(sg, model.G) # Set temporal discretisation including any inherited time step # stability factor from the main grid sg.calculate_dt() - if grid.dt_mod: - sg.dt = sg.dt * grid.dt_mod + if model.dt_mod: + sg.dt = sg.dt * model.dt_mod # Set the indices related to the subgrids main grid placement self.set_main_grid_indices(sg, uip, p1, p2) @@ -120,29 +121,27 @@ class SubGridBase(UserObjectMulti): self.set_working_region_cells(sg) self.set_total_cells(sg) - self.set_iterations(sg, grid) + self.set_iterations(sg, model) self.set_name(sg) # Copy a reference for the main grid to the sub grid - sg.parent_grid = grid - - sg.timewindow = grid.timewindow + sg.parent_grid = model.G # Copy a subgrid reference to self so that children.build(grid, uip) # can access the correct grid. self.subgrid = sg # Copy over built in materials - sg.materials = [copy(m) for m in grid.materials if m.type == "builtin"] + sg.materials = [copy(m) for m in model.G.materials if m.type == "builtin"] # Don't mix and match different subgrid types - for sg_made in grid.subgrids: + for sg_made in model.subgrids: if type(sg) != type(sg_made): logger.exception(f"{self.__str__()} please only use one type of subgrid") raise ValueError # Reference the subgrid under the main grid to which it belongs - grid.subgrids.append(sg) + model.subgrids.append(sg) class SubGridHSG(SubGridBase): @@ -199,7 +198,7 @@ class SubGridHSG(SubGridBase): self.order = 18 self.hash = "#subgrid_hsg" - def build(self, grid: FDTDGrid, uip: MainGridUserInput) -> SubGridHSGUser: + def build(self, model: Model, uip: MainGridUserInput) -> SubGridHSGUser: sg = SubGridHSGUser(**self.kwargs) - self.setup(sg, grid, uip) + self.setup(sg, model, uip) return sg