Add factory functions to grids for fractal volumes

这个提交包含在:
Nathan Mannall
2025-05-20 16:06:56 +01:00
父节点 5ee013d9fe
当前提交 8c15235f37
共有 3 个文件被更改,包括 38 次插入21 次删除

查看文件

@@ -21,7 +21,7 @@ import itertools
import logging
import sys
from collections import OrderedDict
from typing import Any, Iterable, List, Tuple, Union
from typing import Any, Iterable, List, Optional, Tuple, Union
import numpy as np
import numpy.typing as npt
@@ -32,6 +32,7 @@ from typing_extensions import TypeVar
from gprMax import config
from gprMax.cython.pml_build import pml_average_er_mr
from gprMax.cython.yee_cell_build import build_electric_components, build_magnetic_components
from gprMax.fractals.fractal_volume import FractalVolume
from gprMax.materials import ListMaterial, Material, PeplinskiSoil, RangeMaterial, process_materials
from gprMax.pml import CFS, PML, print_pml_info
from gprMax.receivers import Rx
@@ -110,7 +111,7 @@ class FDTDGrid:
# Materials used by this grid
self.materials: List[Material] = []
self.mixingmodels: List[Union[PeplinskiSoil, RangeMaterial, ListMaterial]] = []
self.fractalvolumes = [] # List[FractalVolume]
self.fractalvolumes: List[FractalVolume] = []
# Sources and receivers contained inside this grid
self.waveforms: List[Waveform] = []
@@ -184,6 +185,21 @@ class FDTDGrid:
self.pmls["thickness"]["ymax"] = int(thickness[4])
self.pmls["thickness"]["zmax"] = int(thickness[5])
def add_fractal_volume(
self,
xs: int,
xf: int,
ys: int,
yf: int,
zs: int,
zf: int,
frac_dim: float,
seed: Optional[int],
) -> FractalVolume:
volume = FractalVolume(xs, xf, ys, yf, zs, zf, frac_dim, seed)
self.fractalvolumes.append(volume)
return volume
def add_source(self, source: Source):
if isinstance(source, VoltageSource):
self.voltagesources.append(source)

查看文件

@@ -28,6 +28,7 @@ from numpy import ndarray
from gprMax import config
from gprMax.cython.pml_build import pml_sum_er_mr
from gprMax.fractals.fractal_volume import MPIFractalVolume
from gprMax.grid.fdtd_grid import FDTDGrid
from gprMax.pml import MPIPML, PML
from gprMax.receivers import Rx
@@ -128,6 +129,23 @@ class MPIGrid(FDTDGrid):
if self.has_neighbour(Dim.Z, Dir.POS):
self.pmls["thickness"]["zmax"] = 0
def add_fractal_volume(
self,
xs: int,
xf: int,
ys: int,
yf: int,
zs: int,
zf: int,
frac_dim: float,
seed: Optional[int],
) -> MPIFractalVolume:
volume = MPIFractalVolume(
xs, xf, ys, yf, zs, zf, frac_dim, seed, self.comm, self.nx, self.ny, self.nz
)
self.fractalvolumes.append(volume)
return volume
def is_coordinator(self) -> bool:
"""Test if the current rank is the coordinator.

查看文件

@@ -22,9 +22,8 @@ import numpy as np
import gprMax.config as config
from gprMax.cython.geometry_primitives import build_voxels_from_array, build_voxels_from_array_mask
from gprMax.fractals.fractal_volume import FractalVolume, MPIFractalVolume
from gprMax.fractals.fractal_volume import MPIFractalVolume
from gprMax.grid.fdtd_grid import FDTDGrid
from gprMax.grid.mpi_grid import MPIGrid
from gprMax.materials import ListMaterial
from gprMax.user_objects.cmds_geometry.cmds_geometry import check_averaging, rotate_2point_object
from gprMax.user_objects.rotatable import RotatableMixin
@@ -168,23 +167,7 @@ class FractalBox(RotatableMixin, GeometryUserObject):
)
raise ValueError
if isinstance(grid, MPIGrid):
self.volume = MPIFractalVolume(
xs,
xf,
ys,
yf,
zs,
zf,
frac_dim,
seed,
grid.comm,
grid.nx,
grid.ny,
grid.nz,
)
else:
self.volume = FractalVolume(xs, xf, ys, yf, zs, zf, frac_dim, seed)
self.volume = grid.add_fractal_volume(xs, xf, ys, yf, zs, zf, frac_dim, seed)
self.volume.ID = ID
self.volume.operatingonID = mixing_model_id
self.volume.nbins = nbins