Split build_obj into seperate functions to build Model and FDTDGrid objects

这个提交包含在:
nmannall
2024-04-19 10:23:10 +01:00
父节点 7f3cf49349
当前提交 0c0e0d9208
共有 3 个文件被更改,包括 46 次插入11 次删除

查看文件

@@ -23,6 +23,7 @@ import numpy as np
import gprMax.config as config import gprMax.config as config
from gprMax.grid.fdtd_grid import FDTDGrid from gprMax.grid.fdtd_grid import FDTDGrid
from gprMax.model import Model
from gprMax.user_inputs import MainGridUserInput from gprMax.user_inputs import MainGridUserInput
from .pml import PML from .pml import PML
@@ -51,7 +52,7 @@ class UserObjectSingle(ABC):
setattr(self.props, k, v) setattr(self.props, k, v)
@abstractmethod @abstractmethod
def build(self, grid: FDTDGrid, uip: MainGridUserInput): def build(self, model: Model, uip: MainGridUserInput):
pass pass
# TODO: Check if this is actually needed # TODO: Check if this is actually needed

查看文件

@@ -26,6 +26,7 @@ from gprMax.cmds_geometry.cmds_geometry import UserObjectGeometry
from gprMax.cmds_geometry.fractal_box import FractalBox from gprMax.cmds_geometry.fractal_box import FractalBox
from gprMax.cmds_multiuse import UserObjectMulti from gprMax.cmds_multiuse import UserObjectMulti
from gprMax.cmds_singleuse import Discretisation, Domain, TimeWindow, UserObjectSingle from gprMax.cmds_singleuse import Discretisation, Domain, TimeWindow, UserObjectSingle
from gprMax.grid.fdtd_grid import FDTDGrid
from gprMax.materials import create_built_in_materials from gprMax.materials import create_built_in_materials
from gprMax.model import Model from gprMax.model import Model
from gprMax.subgrids.grid import SubGridBaseGrid from gprMax.subgrids.grid import SubGridBaseGrid
@@ -61,8 +62,8 @@ class Scene:
logger.exception("This object is unknown to gprMax") logger.exception("This object is unknown to gprMax")
raise ValueError raise ValueError
def build_obj(self, obj, grid): def build_grid_obj(self, obj: Union[UserObjectMulti, UserObjectGeometry], grid: FDTDGrid):
"""Builds objects. """Builds objects in FDTDGrids.
Args: Args:
obj: user object obj: user object
@@ -75,6 +76,20 @@ class Scene:
logger.exception("Error creating user input object") logger.exception("Error creating user input object")
raise raise
def build_model_obj(self, obj: UserObjectSingle, model: Model):
"""Builds objects in models.
Args:
obj: user object
model: Model being built
"""
uip = create_user_input_points(model.G, obj)
try:
obj.build(model, uip)
except ValueError:
logger.exception("Error creating user input object")
raise
def process_subgrid_cmds(self, model: Model): def process_subgrid_cmds(self, model: Model):
"""Process all commands in any sub-grids.""" """Process all commands in any sub-grids."""
@@ -102,7 +117,10 @@ class Scene:
grid = model.G if subgrid is None else subgrid grid = model.G if subgrid is None else subgrid
cmds_sorted = sorted(commands, key=lambda cmd: cmd.order) cmds_sorted = sorted(commands, key=lambda cmd: cmd.order)
for obj in cmds_sorted: for obj in cmds_sorted:
self.build_obj(obj, grid) if isinstance(obj, UserObjectSingle):
self.build_model_obj(obj, model)
else:
self.build_grid_obj(obj, grid)
return self return self
@@ -111,7 +129,7 @@ class Scene:
proc_cmds = [] proc_cmds = []
for obj in commands: for obj in commands:
if isinstance(obj, (FractalBox, AddGrass, AddSurfaceRoughness, AddSurfaceWater)): if isinstance(obj, (FractalBox, AddGrass, AddSurfaceRoughness, AddSurfaceWater)):
self.build_obj(obj, grid) self.build_grid_obj(obj, grid)
if isinstance(obj, (FractalBox)): if isinstance(obj, (FractalBox)):
proc_cmds.append(obj) proc_cmds.append(obj)
else: else:
@@ -119,7 +137,7 @@ class Scene:
# Process all geometry commands # Process all geometry commands
for obj in proc_cmds: for obj in proc_cmds:
self.build_obj(obj, grid) self.build_grid_obj(obj, grid)
return self return self

查看文件

@@ -15,12 +15,18 @@
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with gprMax. If not, see <http://www.gnu.org/licenses/>. # along with gprMax. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import logging import logging
from typing import Union
import numpy as np import numpy as np
import gprMax.config as config import gprMax.config as config
from gprMax.cmds_geometry.cmds_geometry import UserObjectGeometry
from gprMax.cmds_multiuse import UserObjectMulti
from gprMax.cmds_singleuse import UserObjectSingle
from gprMax.grid.fdtd_grid import FDTDGrid
from .subgrids.grid import SubGridBaseGrid from .subgrids.grid import SubGridBaseGrid
from .utilities.utilities import round_value from .utilities.utilities import round_value
@@ -37,7 +43,9 @@ logger = logging.getLogger(__name__)
""" """
def create_user_input_points(grid, user_obj): def create_user_input_points(
grid: FDTDGrid, user_obj: Union[UserObjectSingle, UserObjectMulti, UserObjectGeometry]
) -> Union[MainGridUserInput, SubgridUserInput]:
"""Returns a point checker class based on the grid supplied.""" """Returns a point checker class based on the grid supplied."""
if isinstance(grid, SubGridBaseGrid): if isinstance(grid, SubGridBaseGrid):
@@ -108,7 +116,9 @@ class MainGridUserInput(UserInput):
p = self.check_point(p, cmd_str, name) p = self.check_point(p, cmd_str, name)
if self.grid.within_pml(p): if self.grid.within_pml(p):
logger.warning(f"'{cmd_str}' sources and receivers should not normally be positioned within the PML.") logger.warning(
f"'{cmd_str}' sources and receivers should not normally be positioned within the PML."
)
return p return p
@@ -117,7 +127,9 @@ class MainGridUserInput(UserInput):
p2 = self.check_point(p2, cmd_str, name="upper") p2 = self.check_point(p2, cmd_str, name="upper")
if np.greater(p1, p2).any(): if np.greater(p1, p2).any():
logger.exception(f"'{cmd_str}' the lower coordinates should be less than the upper coordinates.") logger.exception(
f"'{cmd_str}' the lower coordinates should be less than the upper coordinates."
)
raise ValueError raise ValueError
return p1, p2 return p1, p2
@@ -152,7 +164,9 @@ class SubgridUserInput(MainGridUserInput):
super().__init__(grid) super().__init__(grid)
# Defines the region exposed to the user # Defines the region exposed to the user
self.inner_bound = np.array([grid.n_boundary_cells_x, grid.n_boundary_cells_y, grid.n_boundary_cells_z]) self.inner_bound = np.array(
[grid.n_boundary_cells_x, grid.n_boundary_cells_y, grid.n_boundary_cells_z]
)
self.outer_bound = np.subtract([grid.nx, grid.ny, grid.nz], self.inner_bound) self.outer_bound = np.subtract([grid.nx, grid.ny, grid.nz], self.inner_bound)
@@ -186,7 +200,9 @@ class SubgridUserInput(MainGridUserInput):
# Provide user within a warning if they have placed objects within # Provide user within a warning if they have placed objects within
# the OS non-working region. # the OS non-working region.
if np.less(p_t, self.inner_bound).any() or np.greater(p_t, self.outer_bound).any(): if np.less(p_t, self.inner_bound).any() or np.greater(p_t, self.outer_bound).any():
logger.warning(f"'{cmd_str}' this object traverses the Outer Surface. This is an advanced feature.") logger.warning(
f"'{cmd_str}' this object traverses the Outer Surface. This is an advanced feature."
)
return p_t return p_t
def discretise_static_point(self, p): def discretise_static_point(self, p):