OpenMC/tests/unit_tests/mesh_to_vtk/test.py
Patrick Shriwise 9942269a91
Updates to VTK data checks (#3371)
Co-authored-by: Paul Romano <paul.k.romano@gmail.com>
2025-05-05 18:55:14 +00:00

103 lines
3.1 KiB
Python

import difflib
import filecmp
import numpy as np
from pathlib import Path
import openmc
import pytest
from tests.regression_tests import config
pytest.importorskip('vtk')
def full_path(f):
return Path(__file__).parent.absolute() / f
def diff_file(file1, file2):
with open(file1) as fh:
f1_text = fh.readlines()
with open(file2) as fh:
f2_text = fh.readlines()
diff_lines = difflib.unified_diff(f1_text, f2_text)
return ''.join(diff_lines)
# test meshes
reg_mesh = openmc.RegularMesh()
reg_mesh.lower_left = (0, 0, 0)
reg_mesh.upper_right = (20, 50, 50)
reg_mesh.dimension = (10, 20, 30)
rect_mesh = openmc.RectilinearMesh()
rect_mesh.x_grid = np.linspace(0, 10, 5)
rect_mesh.y_grid = np.geomspace(5., 20., 10)
rect_mesh.z_grid = np.linspace(1, 100, 20)
cyl_mesh = openmc.CylindricalMesh(
origin=(10, 10, -10),
r_grid=np.linspace(0, 5, 5),
phi_grid=np.linspace(0, 2 * np.pi, 4),
z_grid=np.linspace(0, 2, 4),
)
sphere_mesh = openmc.SphericalMesh(
origin=(10, 10, -10),
r_grid=np.linspace(0, 5, 3),
theta_grid=np.linspace(0, 0.5 * np.pi, 4),
phi_grid=np.linspace(0, 2*np.pi, 8),
)
def mesh_data(mesh_dims):
data = 100 * np.arange(np.prod(mesh_dims), dtype=float)
# data is returned reshaped with order 'F' to ensure that
# the resulting data is interpreted correctly by the
# write_data_to_vtk method
return data.reshape(*mesh_dims, order='F')
test_data = ((reg_mesh, False, 'regular'),
(rect_mesh, False, 'rectilinear'),
(cyl_mesh, False, 'cylindrical-linear'),
(cyl_mesh, True, 'cylindrical-curvilinear'),
(sphere_mesh, False, 'spherical-linear'),
(sphere_mesh, True, 'spherical-curvilinear'))
@pytest.mark.parametrize('mesh_params',
test_data,
ids=lambda params: params[2])
def test_mesh_write_vtk(mesh_params, run_in_tmpdir):
mesh, curvilinear, filename = mesh_params
test_data = full_path(filename + ".vtk")
kwargs = {}
if curvilinear:
kwargs['curvilinear'] = curvilinear
# set output filename based on test configuration
filename = test_data if config['update'] else filename + "-actual.vtk"
# write the mesh file and compare to the expected version
mesh.write_data_to_vtk(filename, **kwargs)
try:
assert filecmp.cmp(test_data, filename)
except AssertionError as e:
diff = diff_file(test_data, filename)
raise AssertionError(diff) from e
# check data writing
def test_mesh_write_vtk_data(run_in_tmpdir):
data = {'ascending_data': mesh_data(cyl_mesh.dimension)}
filename_expected = full_path('cyl-data.vtk')
filename_actual = full_path('cyl-data-actual.vtk')
# update the test file if requested
filename = filename_expected if config['update'] else filename_actual
cyl_mesh.write_data_to_vtk(filename, datasets=data, volume_normalization=False)
try:
assert filecmp.cmp(filename, filename_expected)
except AssertionError as e:
diff = diff_file(filename_expected, filename)
raise AssertionError(diff) from e