mirror of
https://github.com/openmc-dev/openmc.git
synced 2026-07-25 12:35:29 -04:00
103 lines
3.1 KiB
Python
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
|
|
|
|
|
|
|