Remove extra materials output by serial geometry objects

这个提交包含在:
nmannall
2024-10-14 10:28:32 +01:00
父节点 24157076a4
当前提交 272fc5d1ff

查看文件

@@ -411,45 +411,45 @@ class GeometryObjects:
pbar: Progress bar class instance.
"""
ID = G.ID[:, self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1]
# Get materials present in subset of ID array
material_ids, inverse_map = np.unique(ID, return_inverse=True)
# Create map from material ID to 0 - number of materials
materials_map = {material_id: index for index, material_id in enumerate(material_ids)}
# Remap ID array to the reduced list of materials
ID = np.array([materials_map[id] for id in material_ids])[inverse_map].reshape(ID.shape)
data = G.solid[self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1].astype(
"int16"
)
map_materials = np.vectorize(lambda id: materials_map[id])
data = map_materials(data)
rigidE = G.rigidE[:, self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1]
rigidH = G.rigidH[:, self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1]
with h5py.File(self.filename_hdf5, "w") as fdata:
fdata.attrs["gprMax"] = __version__
fdata.attrs["Title"] = title
fdata.attrs["dx_dy_dz"] = (G.dx, G.dy, G.dz)
# Get minimum and maximum integers of materials in geometry objects volume
minmat = np.amin(
G.ID[:, self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1]
)
maxmat = np.amax(
G.ID[:, self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1]
)
fdata["/data"] = (
G.solid[self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1].astype(
"int16"
)
- minmat
)
fdata["/data"] = data
pbar.update(self.solidsize)
fdata["/rigidE"] = G.rigidE[
:, self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1
]
fdata["/rigidH"] = G.rigidH[
:, self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1
]
fdata["/rigidE"] = rigidE
fdata["/rigidH"] = rigidH
pbar.update(self.rigidsize)
fdata["/ID"] = (
G.ID[:, self.xs : self.xf + 1, self.ys : self.yf + 1, self.zs : self.zf + 1]
- minmat
)
fdata["/ID"] = ID
pbar.update(self.IDsize)
# Write materials list to a text file
# This includes all materials in range whether used in volume or not
with open(self.filename_materials, "w") as fmaterials:
for numID in range(minmat, maxmat + 1):
for material in G.materials:
if material.numID == numID:
self.output_material(material, fmaterials)
for numID in material_ids:
self.output_material(G.materials[numID], fmaterials)
def output_material(self, material: Material, file: TextIOWrapper):
file.write(