你已经派生过 gprMax
镜像自地址
https://gitee.com/sunhf/gprMax.git
已同步 2025-08-08 07:24:19 +08:00
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.
这个提交包含在:
@@ -1292,13 +1292,15 @@ class Material(UserObjectMulti):
|
|||||||
if sm < 0:
|
if sm < 0:
|
||||||
logger.exception(f"{self.params_str()} requires a positive value for magnetic loss.")
|
logger.exception(f"{self.params_str()} requires a positive value for magnetic loss.")
|
||||||
raise ValueError
|
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")
|
logger.exception(f"{self.params_str()} with ID {material_id} already exists")
|
||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
# Create a new instance of the Material class material
|
# Create a new instance of the Material class material
|
||||||
# (start index after pec & free_space)
|
# (start index after pec & free_space)
|
||||||
m = MaterialUser(len(model.materials), material_id)
|
m = MaterialUser(len(grid.materials), material_id)
|
||||||
m.se = se
|
m.se = se
|
||||||
m.mr = mr
|
m.mr = mr
|
||||||
m.sm = sm
|
m.sm = sm
|
||||||
@@ -1314,7 +1316,7 @@ class Material(UserObjectMulti):
|
|||||||
f"created."
|
f"created."
|
||||||
)
|
)
|
||||||
|
|
||||||
model.materials.append(m)
|
grid.materials.append(m)
|
||||||
|
|
||||||
|
|
||||||
class AddDebyeDispersion(UserObjectMulti):
|
class AddDebyeDispersion(UserObjectMulti):
|
||||||
@@ -1351,7 +1353,8 @@ class AddDebyeDispersion(UserObjectMulti):
|
|||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
# Look up requested materials in existing list of material instances
|
# 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):
|
if len(materials) != len(material_ids):
|
||||||
notfound = [x for x in material_ids if x not in materials]
|
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
|
config.get_model_config().materials["maxpoles"] = disp_material.poles
|
||||||
|
|
||||||
# Replace original material with newly created DispersiveMaterial
|
# Replace original material with newly created DispersiveMaterial
|
||||||
model.materials = [
|
grid.materials = [
|
||||||
disp_material if mat.numID == material.numID else mat for mat in model.materials
|
disp_material if mat.numID == material.numID else mat for mat in grid.materials
|
||||||
]
|
]
|
||||||
|
|
||||||
logger.info(
|
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"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."
|
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
|
raise ValueError
|
||||||
|
|
||||||
# Look up requested materials in existing list of material instances
|
# 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):
|
if len(materials) != len(material_ids):
|
||||||
notfound = [x for x in material_ids if x not in materials]
|
notfound = [x for x in material_ids if x not in materials]
|
||||||
logger.exception(f"{self.params_str()} material(s) {notfound} do not exist")
|
logger.exception(f"{self.params_str()} material(s) {notfound} do not exist")
|
||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
grid = uip.grid
|
|
||||||
for material in materials:
|
for material in materials:
|
||||||
disp_material = DispersiveMaterialUser(material.numID, material.ID)
|
disp_material = DispersiveMaterialUser(material.numID, material.ID)
|
||||||
disp_material.er = material.er
|
disp_material.er = material.er
|
||||||
@@ -1463,12 +1466,12 @@ class AddLorentzDispersion(UserObjectMulti):
|
|||||||
config.get_model_config().materials["maxpoles"] = disp_material.poles
|
config.get_model_config().materials["maxpoles"] = disp_material.poles
|
||||||
|
|
||||||
# Replace original material with newly created DispersiveMaterial
|
# Replace original material with newly created DispersiveMaterial
|
||||||
model.materials = [
|
grid.materials = [
|
||||||
disp_material if mat.numID == material.numID else mat for mat in model.materials
|
disp_material if mat.numID == material.numID else mat for mat in grid.materials
|
||||||
]
|
]
|
||||||
|
|
||||||
logger.info(
|
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"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"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."
|
f"and gamma={', '.join(f'{delta:4.3e}' for delta in disp_material.alpha)} created."
|
||||||
@@ -1507,14 +1510,14 @@ class AddDrudeDispersion(UserObjectMulti):
|
|||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
# Look up requested materials in existing list of material instances
|
# 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):
|
if len(materials) != len(material_ids):
|
||||||
notfound = [x for x in material_ids if x not in materials]
|
notfound = [x for x in material_ids if x not in materials]
|
||||||
logger.exception(f"{self.params_str()} material(s) {notfound} do not exist.")
|
logger.exception(f"{self.params_str()} material(s) {notfound} do not exist.")
|
||||||
raise ValueError
|
raise ValueError
|
||||||
|
|
||||||
grid = uip.grid
|
|
||||||
for material in materials:
|
for material in materials:
|
||||||
disp_material = DispersiveMaterialUser(material.numID, material.ID)
|
disp_material = DispersiveMaterialUser(material.numID, material.ID)
|
||||||
disp_material.er = material.er
|
disp_material.er = material.er
|
||||||
@@ -1540,12 +1543,12 @@ class AddDrudeDispersion(UserObjectMulti):
|
|||||||
config.get_model_config().materials["maxpoles"] = disp_material.poles
|
config.get_model_config().materials["maxpoles"] = disp_material.poles
|
||||||
|
|
||||||
# Replace original material with newly created DispersiveMaterial
|
# Replace original material with newly created DispersiveMaterial
|
||||||
model.materials = [
|
grid.materials = [
|
||||||
disp_material if mat.numID == material.numID else mat for mat in model.materials
|
disp_material if mat.numID == material.numID else mat for mat in grid.materials
|
||||||
]
|
]
|
||||||
|
|
||||||
logger.info(
|
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"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."
|
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.cython.yee_cell_build import build_electric_components, build_magnetic_components
|
||||||
|
|
||||||
# from gprMax.geometry_outputs import GeometryObjects, GeometryView
|
# 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.pml import CFS, PML, build_pml, print_pml_info
|
||||||
from gprMax.receivers import Rx
|
from gprMax.receivers import Rx
|
||||||
from gprMax.snapshots import Snapshot
|
from gprMax.snapshots import Snapshot
|
||||||
@@ -94,6 +94,7 @@ class FDTDGrid:
|
|||||||
# corrections will be different.
|
# corrections will be different.
|
||||||
self.pmls["thickness"] = OrderedDict((key, 10) for key in PML.boundaryIDs)
|
self.pmls["thickness"] = OrderedDict((key, 10) for key in PML.boundaryIDs)
|
||||||
|
|
||||||
|
self.materials: List[Material] = []
|
||||||
self.waveforms: List[Waveform] = []
|
self.waveforms: List[Waveform] = []
|
||||||
self.voltagesources: List[VoltageSource] = []
|
self.voltagesources: List[VoltageSource] = []
|
||||||
self.hertziandipoles: List[HertzianDipole] = []
|
self.hertziandipoles: List[HertzianDipole] = []
|
||||||
@@ -104,6 +105,8 @@ class FDTDGrid:
|
|||||||
self.rxsteps: List[int] = [0, 0, 0]
|
self.rxsteps: List[int] = [0, 0, 0]
|
||||||
self.snapshots: List[Snapshot] = []
|
self.snapshots: List[Snapshot] = []
|
||||||
|
|
||||||
|
self.averagevolumeobjects = True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dx(self) -> float:
|
def dx(self) -> float:
|
||||||
return self.dl[0]
|
return self.dl[0]
|
||||||
|
@@ -67,10 +67,8 @@ class Model:
|
|||||||
self.G = self._create_grid()
|
self.G = self._create_grid()
|
||||||
self.subgrids: List[SubGridBaseGrid] = []
|
self.subgrids: List[SubGridBaseGrid] = []
|
||||||
|
|
||||||
self.materials: List[Material] = []
|
|
||||||
self.mixingmodels: List[Union[PeplinskiSoil, RangeMaterial, ListMaterial]] = []
|
self.mixingmodels: List[Union[PeplinskiSoil, RangeMaterial, ListMaterial]] = []
|
||||||
self.fractalvolumes: List[FractalVolume] = []
|
self.fractalvolumes: List[FractalVolume] = []
|
||||||
self.averagevolumeobjects = True
|
|
||||||
|
|
||||||
self.geometryviews: List[GeometryView] = []
|
self.geometryviews: List[GeometryView] = []
|
||||||
self.geometryobjects: List[GeometryObjects] = []
|
self.geometryobjects: List[GeometryObjects] = []
|
||||||
|
在新工单中引用
屏蔽一个用户