diff --git a/gprMax/geometry_outputs.py b/gprMax/geometry_outputs.py index b283fd5a..3416e8cb 100644 --- a/gprMax/geometry_outputs.py +++ b/gprMax/geometry_outputs.py @@ -487,17 +487,19 @@ class GeometryObjects: 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 + # Get materials present in subset of ID array and sort by material ID material_ids, inverse_map = np.unique(ID, return_inverse=True) + get_material = np.vectorize(lambda id: G.materials[id]) + materials = sorted(get_material(material_ids)) # Create map from material ID to 0 - number of materials - materials_map = {material_id: index for index, material_id in enumerate(material_ids)} + materials_map = {material.numID: index for index, material in enumerate(materials)} + map_materials = np.vectorize(lambda id: materials_map[id]) # 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) + ID = np.array(map_materials(material_ids))[inverse_map].reshape(ID.shape) data = G.solid[self.xs : self.xf, self.ys : self.yf, self.zs : self.zf].astype("int16") - map_materials = np.vectorize(lambda id: materials_map[id]) data = map_materials(data) rigidE = G.rigidE[:, self.xs : self.xf, self.ys : self.yf, self.zs : self.zf] @@ -520,8 +522,8 @@ class GeometryObjects: # Write materials list to a text file with open(self.filename_materials, "w") as fmaterials: - for numID in material_ids: - self.output_material(G.materials[numID], fmaterials) + for material in materials: + self.output_material(material, fmaterials) def output_material(self, material: Material, file: TextIOWrapper): file.write( @@ -586,15 +588,9 @@ class MPIGeometryObjects(GeometryObjects): materials = self.comm.gather(local_materials, root=0) if self.comm.rank == 0: - # Filter out duplicate materials + # Filter out duplicate materials and sort by material ID materials = np.fromiter(chain.from_iterable(materials), dtype=Material) - _, indices = np.unique(materials, return_index=True) - - # We want to sort the materials by the order they appear, - # not sorted alphabetically by ID (default behaviour using - # np.unique). This ensures user defined materials are lower - # indexed than compound materials. - global_materials = materials[sorted(indices)] + global_materials = np.unique(materials) global_material_ids = [m.ID for m in global_materials] else: diff --git a/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/full_volume.h5 b/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/full_volume.h5 index 0cd34b68..5d1fd6ae 100644 --- a/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/full_volume.h5 +++ b/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/full_volume.h5 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac30e1b942acb3e17bec7d2a16167429ed3b1590642d9c403ee5d0adb6be27c8 +oid sha256:2b2fbdb39eb6ad15c35877be207a7a0d3f19cc22faad223d058988f788842f7b size 75462640 diff --git a/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/full_volume_materials.txt b/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/full_volume_materials.txt index d7a4e603..7270aed4 100644 --- a/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/full_volume_materials.txt +++ b/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/full_volume_materials.txt @@ -1,9 +1,8 @@ -#material: 1 inf 1 0 pec -#material: 1 0 1 0 free_space -#material: 4.9 0 1 0 myWater #material: 3 0 2 0 boxMaterial +#material: 2 0 1.5 0 boxMaterial+boxMaterial+free_space+free_space #material: 1.5 0 1.25 0 boxMaterial+free_space+free_space+free_space -#material: 2 0 1.5 0 boxMaterial+free_space+free_space+boxMaterial -#material: 1.975 0 1 0 myWater+free_space+free_space+free_space -#material: 2.95 0 1 0 myWater+free_space+free_space+myWater -#material: 3.925 0 1 0 myWater+myWater+free_space+myWater +#material: 1 0 1 0 free_space +#material: 1.975 0 1 0 free_space+free_space+free_space+myWater +#material: 2.95 0 1 0 free_space+free_space+myWater+myWater +#material: 3.925 0 1 0 free_space+myWater+myWater+myWater +#material: 4.9 0 1 0 myWater diff --git a/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/partial_volume.h5 b/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/partial_volume.h5 index b46a2c6b..ad7fc33f 100644 --- a/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/partial_volume.h5 +++ b/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/partial_volume.h5 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:224975ddea1c1a4cd3f99aaa9e7ce1fb1ec31de07b0352424f66be73a5645a4f +oid sha256:6304565819cdb7c5b2af86d57bb25e3f22c92b9aae431934e2c2eca029928d59 size 4980400 diff --git a/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/partial_volume_materials.txt b/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/partial_volume_materials.txt index d7a4e603..7270aed4 100644 --- a/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/partial_volume_materials.txt +++ b/reframe_tests/regression_checks/TestGeometryObject_a6a096cb/partial_volume_materials.txt @@ -1,9 +1,8 @@ -#material: 1 inf 1 0 pec -#material: 1 0 1 0 free_space -#material: 4.9 0 1 0 myWater #material: 3 0 2 0 boxMaterial +#material: 2 0 1.5 0 boxMaterial+boxMaterial+free_space+free_space #material: 1.5 0 1.25 0 boxMaterial+free_space+free_space+free_space -#material: 2 0 1.5 0 boxMaterial+free_space+free_space+boxMaterial -#material: 1.975 0 1 0 myWater+free_space+free_space+free_space -#material: 2.95 0 1 0 myWater+free_space+free_space+myWater -#material: 3.925 0 1 0 myWater+myWater+free_space+myWater +#material: 1 0 1 0 free_space +#material: 1.975 0 1 0 free_space+free_space+free_space+myWater +#material: 2.95 0 1 0 free_space+free_space+myWater+myWater +#material: 3.925 0 1 0 free_space+myWater+myWater+myWater +#material: 4.9 0 1 0 myWater