Move materials back into FDTDGrid class

Materials are used to by the grid to build PMLs and components as well
as creating new materials to voltage sources. Additionally, didn't parts
of the grid will need a different subset of materials. Storing in Grid
could in the future reduce data duplication and the duplicate
computation looks to be minimal.
这个提交包含在:
nmannall
2024-05-20 15:11:41 +01:00
父节点 b7e9bd7678
当前提交 672dd44094
共有 3 个文件被更改,包括 24 次插入20 次删除

查看文件

@@ -1292,13 +1292,15 @@ class Material(UserObjectMulti):
if sm < 0:
logger.exception(f"{self.params_str()} requires a positive value for magnetic loss.")
raise ValueError
if any(x.ID == material_id for x in model.materials):
grid = uip.grid
if any(x.ID == material_id for x in grid.materials):
logger.exception(f"{self.params_str()} with ID {material_id} already exists")
raise ValueError
# Create a new instance of the Material class material
# (start index after pec & free_space)
m = MaterialUser(len(model.materials), material_id)
m = MaterialUser(len(grid.materials), material_id)
m.se = se
m.mr = mr
m.sm = sm
@@ -1314,7 +1316,7 @@ class Material(UserObjectMulti):
f"created."
)
model.materials.append(m)
grid.materials.append(m)
class AddDebyeDispersion(UserObjectMulti):
@@ -1351,7 +1353,8 @@ class AddDebyeDispersion(UserObjectMulti):
raise ValueError
# Look up requested materials in existing list of material instances
materials = [y for x in material_ids for y in model.materials if y.ID == x]
grid = uip.grid
materials = [y for x in material_ids for y in grid.materials if y.ID == x]
if len(materials) != len(material_ids):
notfound = [x for x in material_ids if x not in materials]
@@ -1381,12 +1384,12 @@ class AddDebyeDispersion(UserObjectMulti):
config.get_model_config().materials["maxpoles"] = disp_material.poles
# Replace original material with newly created DispersiveMaterial
model.materials = [
disp_material if mat.numID == material.numID else mat for mat in model.materials
grid.materials = [
disp_material if mat.numID == material.numID else mat for mat in grid.materials
]
logger.info(
f"{self.model_name(model)}Debye disperion added to {disp_material.ID} "
f"{self.grid_name(grid)}Debye disperion added to {disp_material.ID} "
f"with delta_eps_r={', '.join(f'{deltaer:4.2f}' for deltaer in disp_material.deltaer)}, "
f"and tau={', '.join(f'{tau:4.3e}' for tau in disp_material.tau)} secs created."
)
@@ -1428,14 +1431,14 @@ class AddLorentzDispersion(UserObjectMulti):
raise ValueError
# Look up requested materials in existing list of material instances
materials = [y for x in material_ids for y in model.materials if y.ID == x]
grid = uip.grid
materials = [y for x in material_ids for y in grid.materials if y.ID == x]
if len(materials) != len(material_ids):
notfound = [x for x in material_ids if x not in materials]
logger.exception(f"{self.params_str()} material(s) {notfound} do not exist")
raise ValueError
grid = uip.grid
for material in materials:
disp_material = DispersiveMaterialUser(material.numID, material.ID)
disp_material.er = material.er
@@ -1463,12 +1466,12 @@ class AddLorentzDispersion(UserObjectMulti):
config.get_model_config().materials["maxpoles"] = disp_material.poles
# Replace original material with newly created DispersiveMaterial
model.materials = [
disp_material if mat.numID == material.numID else mat for mat in model.materials
grid.materials = [
disp_material if mat.numID == material.numID else mat for mat in grid.materials
]
logger.info(
f"{self.model_name(model)}{self.grid_name(grid)}Lorentz disperion added to {disp_material.ID} "
f"{self.grid_name(grid)}Lorentz disperion added to {disp_material.ID} "
f"with delta_eps_r={', '.join(f'{deltaer:4.2f}' for deltaer in disp_material.deltaer)}, "
f"omega={', '.join(f'{omega:4.3e}' for omega in disp_material.tau)} secs, "
f"and gamma={', '.join(f'{delta:4.3e}' for delta in disp_material.alpha)} created."
@@ -1507,14 +1510,14 @@ class AddDrudeDispersion(UserObjectMulti):
raise ValueError
# Look up requested materials in existing list of material instances
materials = [y for x in material_ids for y in model.materials if y.ID == x]
grid = uip.grid
materials = [y for x in material_ids for y in grid.materials if y.ID == x]
if len(materials) != len(material_ids):
notfound = [x for x in material_ids if x not in materials]
logger.exception(f"{self.params_str()} material(s) {notfound} do not exist.")
raise ValueError
grid = uip.grid
for material in materials:
disp_material = DispersiveMaterialUser(material.numID, material.ID)
disp_material.er = material.er
@@ -1540,12 +1543,12 @@ class AddDrudeDispersion(UserObjectMulti):
config.get_model_config().materials["maxpoles"] = disp_material.poles
# Replace original material with newly created DispersiveMaterial
model.materials = [
disp_material if mat.numID == material.numID else mat for mat in model.materials
grid.materials = [
disp_material if mat.numID == material.numID else mat for mat in grid.materials
]
logger.info(
f"{self.model_name(model)}{self.grid_name(grid)}Drude disperion added to {disp_material.ID} "
f"{self.grid_name(grid)}Drude disperion added to {disp_material.ID} "
f"with omega={', '.join(f'{omega:4.3e}' for omega in disp_material.tau)} secs, "
f"and gamma={', '.join(f'{alpha:4.3e}' for alpha in disp_material.alpha)} secs created."
)

查看文件

@@ -32,7 +32,7 @@ from gprMax import config
from gprMax.cython.yee_cell_build import build_electric_components, build_magnetic_components
# from gprMax.geometry_outputs import GeometryObjects, GeometryView
from gprMax.materials import process_materials
from gprMax.materials import Material, process_materials
from gprMax.pml import CFS, PML, build_pml, print_pml_info
from gprMax.receivers import Rx
from gprMax.snapshots import Snapshot
@@ -94,6 +94,7 @@ class FDTDGrid:
# corrections will be different.
self.pmls["thickness"] = OrderedDict((key, 10) for key in PML.boundaryIDs)
self.materials: List[Material] = []
self.waveforms: List[Waveform] = []
self.voltagesources: List[VoltageSource] = []
self.hertziandipoles: List[HertzianDipole] = []
@@ -104,6 +105,8 @@ class FDTDGrid:
self.rxsteps: List[int] = [0, 0, 0]
self.snapshots: List[Snapshot] = []
self.averagevolumeobjects = True
@property
def dx(self) -> float:
return self.dl[0]

查看文件

@@ -67,10 +67,8 @@ class Model:
self.G = self._create_grid()
self.subgrids: List[SubGridBaseGrid] = []
self.materials: List[Material] = []
self.mixingmodels: List[Union[PeplinskiSoil, RangeMaterial, ListMaterial]] = []
self.fractalvolumes: List[FractalVolume] = []
self.averagevolumeobjects = True
self.geometryviews: List[GeometryView] = []
self.geometryobjects: List[GeometryObjects] = []