Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 6 additions & 19 deletions openmc/mesh.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ def write_data_to_vtk(self, points, filename, datasets, volume_normalization=Tru
datasets_out.append(dataset)

if volume_normalization:
dataset /= self.volumes.flatten()
dataset /= self.volumes.T.flatten()

dataset_array = vtk.vtkDoubleArray()
dataset_array.SetName(label)
Expand Down Expand Up @@ -1012,7 +1012,7 @@ def write_data_to_vtk(self, filename, datasets, volume_normalization=True):
the VTK object
"""
# create points
pts_cartesian = np.array([[x, y, z] for z in self.z_grid for y in self.y_grid for x in self.x_grid])
pts_cartesian = self.vertices.T.reshape(-1, 3)

return super().write_data_to_vtk(
points=pts_cartesian,
Expand Down Expand Up @@ -1303,14 +1303,8 @@ def write_data_to_vtk(self, filename, datasets, volume_normalization=True):
the VTK object
"""
# create points
pts_cylindrical = np.array(
[
[r, phi, z]
for z in self.z_grid
for phi in self.phi_grid
for r in self.r_grid
]
)
pts_cylindrical = self.vertices.T.reshape(-1, 3)

pts_cartesian = np.copy(pts_cylindrical)
r, phi = pts_cylindrical[:, 0], pts_cylindrical[:, 1]
pts_cartesian[:, 0] = r * np.cos(phi)
Expand Down Expand Up @@ -1534,16 +1528,9 @@ def write_data_to_vtk(self, filename, datasets, volume_normalization=True):
vtk.vtkStructuredGrid
the VTK object
"""

# create points
pts_spherical = np.array(
[
[r, theta, phi]
for phi in self.phi_grid
for theta in self.theta_grid
for r in self.r_grid
]
)
pts_spherical = self.vertices.T.reshape(-1, 3)

pts_cartesian = np.copy(pts_spherical)
r, theta, phi = pts_spherical[:, 0], pts_spherical[:, 1], pts_spherical[:, 2]
pts_cartesian[:, 0] = r * np.sin(phi) * np.cos(theta)
Expand Down
73 changes: 70 additions & 3 deletions tests/unit_tests/test_mesh_to_vtk.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ def test_write_data_to_vtk(mesh, tmpdir):
# BUILD
filename = Path(tmpdir) / "out.vtk"

data = np.random.random(mesh.num_mesh_cells)
# use mesh element volumes as data to check volume-normalization ordering
# kji (i changing fastest) orering is expected for input data
# by using the volumes transposed as the data here, we can ensure the
# normalization is happening correctly
data = mesh.volumes.T

# RUN
mesh.write_data_to_vtk(filename=filename, datasets={"label1": data, "label2": data})
Expand All @@ -56,8 +60,13 @@ def test_write_data_to_vtk(mesh, tmpdir):
assert array2.GetName() == "label2"

# check size of datasets
assert nps.vtk_to_numpy(array1).size == data.size
assert nps.vtk_to_numpy(array2).size == data.size
data1 = nps.vtk_to_numpy(array1)
data2 = nps.vtk_to_numpy(array2)
assert data1.size == data.size
assert data2.size == data.size

assert all(data1 == data2)
assert all(data1 == 1.0)


@pytest.mark.parametrize("mesh", [cylinder_mesh, regular_mesh, rectilinear_mesh, spherical_mesh])
Expand All @@ -82,3 +91,61 @@ def test_write_data_to_vtk_size_mismatch(mesh):
)
with pytest.raises(ValueError, match=expected_error_msg):
mesh.write_data_to_vtk(filename="out.vtk", datasets={"label": data})

def test_write_data_to_vtk_round_trip(run_in_tmpdir):
cmesh = openmc.CylindricalMesh()
cmesh.r_grid = (0.0, 1.0, 2.0)
cmesh.z_grid = (0.0, 2.0, 4.0, 5.0)
cmesh.phi_grid = (0.0, 3.0, 6.0)

smesh = openmc.SphericalMesh()
smesh.r_grid = (0.0, 1.0, 2.0)
smesh.theta_grid = (0.0, 2.0, 4.0, 5.0)
smesh.phi_grid = (0.0, 3.0, 6.0)

rmesh = openmc.RegularMesh()
rmesh.lower_left = (0.0, 0.0, 0.0)
rmesh.upper_right = (1.0, 3.0, 5.0)
rmesh.dimension = (2, 1, 6)

for mesh in [smesh, cmesh, rmesh]:

filename = "mesh.vtk"
data = np.array([1.0] * 12) # there are 12 voxels in each mesh
mesh.write_data_to_vtk(
filename=filename,
datasets={"normalized": data},
volume_normalization=True
)

reader = vtk.vtkStructuredGridReader()
reader.SetFileName(filename)
reader.ReadAllFieldsOn()
reader.Update()

cell_data = reader.GetOutput().GetCellData()
uniform_array = cell_data.GetArray("normalized")
num_tuples = uniform_array.GetNumberOfTuples()
vtk_values = [uniform_array.GetValue(i) for i in range(num_tuples)]

# checks that the vtk cell values are equal to the data / mesh volumes
assert np.allclose(vtk_values, data / mesh.volumes.T.flatten())

mesh.write_data_to_vtk(
filename=filename,
datasets={"not_normalized": data},
volume_normalization=False,
)

reader = vtk.vtkStructuredGridReader()
reader.SetFileName(filename)
reader.ReadAllFieldsOn()
reader.Update()

cell_data = reader.GetOutput().GetCellData()
uniform_array = cell_data.GetArray("not_normalized")
num_tuples = uniform_array.GetNumberOfTuples()
vtk_values = [uniform_array.GetValue(i) for i in range(num_tuples)]

# checks that the vtk cell values are equal to the data
assert np.array_equal(vtk_values, data)