Add geometry view reframe tests

这个提交包含在:
nmannall
2024-12-04 12:06:33 +00:00
父节点 32392aba42
当前提交 e8205cd85f
共有 12 个文件被更改,包括 138 次插入4 次删除

3
.gitattributes vendored
查看文件

@@ -1 +1,4 @@
tools/Jupyter_notebooks/* linguist-vendored tools/Jupyter_notebooks/* linguist-vendored
reframe_tests/regression_checks/TestGeometryView_5176823e/partial_volume.vtkhdf filter=lfs diff=lfs merge=lfs -text
reframe_tests/regression_checks/TestGeometryView_5176823e/full_volume.vtkhdf filter=lfs diff=lfs merge=lfs -text
reframe_tests/regression_checks/TestGeometryView_77980202/full_volume.vtkhdf filter=lfs diff=lfs merge=lfs -text

查看文件

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4a8134fca3e6228211e4a4bc3e504e64f888c55f22e025b482ec501e0051d253
size 75740296

查看文件

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2ccd95ff4ef73c224c99a8c321ad6f8014c673a1b33bbb741bff415dfbffd0aa
size 4931176

查看文件

@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:82b8ac914a9fe20b49f2512215782f01305a2e3211aaac51913f88296a0e3ac5
size 4012444

查看文件

@@ -182,7 +182,7 @@ class GprMaxBaseTest(RunOnlyRegressionTest):
else: else:
return self.getdep(variant) return self.getdep(variant)
def build_reference_filepath(self, name: Union[str, os.PathLike]) -> Path: def build_reference_filepath(self, name: Union[str, os.PathLike], suffix: str = ".h5") -> Path:
"""Build path to the specified reference file. """Build path to the specified reference file.
Reference files are saved in directories per test case. If this Reference files are saved in directories per test case. If this
@@ -192,6 +192,7 @@ class GprMaxBaseTest(RunOnlyRegressionTest):
Args: Args:
name: Name of the file. name: Name of the file.
suffix: File extension. Default ".h5".
Returns: Returns:
filepath: Absolute path to the reference file. filepath: Absolute path to the reference file.
@@ -202,7 +203,7 @@ class GprMaxBaseTest(RunOnlyRegressionTest):
else: else:
reference_dir = target.short_name reference_dir = target.short_name
reference_file = Path("regression_checks", reference_dir, name).with_suffix(".h5") reference_file = Path("regression_checks", reference_dir, name).with_suffix(suffix)
return reference_file.absolute() return reference_file.absolute()
# TODO: Change CreatePyenvTest to a fixture instead of a test dependency # TODO: Change CreatePyenvTest to a fixture instead of a test dependency

查看文件

@@ -9,6 +9,7 @@ from typing_extensions import TYPE_CHECKING
from reframe_tests.tests.base_tests import GprMaxBaseTest from reframe_tests.tests.base_tests import GprMaxBaseTest
from reframe_tests.tests.regression_checks import ( from reframe_tests.tests.regression_checks import (
GeometryViewRegressionCheck,
ReceiverRegressionCheck, ReceiverRegressionCheck,
RegressionCheck, RegressionCheck,
SnapshotRegressionCheck, SnapshotRegressionCheck,
@@ -77,6 +78,50 @@ class SnapshotMixin(GprMaxMixin):
self.regression_checks.append(regression_check) self.regression_checks.append(regression_check)
class GeometryOnlyMixin(GprMaxMixin):
"""Run test with geometry only flag"""
@run_after("setup")
def add_geometry_only_flag(self):
self.executable_opts += ["--geometry-only"]
class GeometryViewMixin(GprMaxMixin):
"""Add regression tests for geometry views.
Attributes:
geometry_views (list[str]): List of geometry views to run
regression checks on.
"""
geometry_views = variable(typ.List[str], value=[])
def build_geometry_view_filepath(self, geometry_view: str) -> Path:
"""Build filepath to the specified geometry view.
Args:
geometry_view: Name of the geometry view.
"""
return Path(geometry_view).with_suffix(".vtkhdf")
@run_after("setup")
def add_geometry_view_regression_checks(self):
"""Add a regression check for each geometry view.
The test will be skipped if no geometry views have been specified.
"""
self.skip_if(
len(self.geometry_views) < 0,
f"Must provide a list of geometry views.",
)
for geometry_view in self.geometry_views:
geometry_view_file = self.build_geometry_view_filepath(geometry_view)
reference_file = self.build_reference_filepath(geometry_view, ".vtkhdf")
regression_check = GeometryViewRegressionCheck(geometry_view_file, reference_file)
self.regression_checks.append(regression_check)
class PythonApiMixin(GprMaxMixin): class PythonApiMixin(GprMaxMixin):
"""Use the GprMax Python API rather than a standard input file.""" """Use the GprMax Python API rather than a standard input file."""

查看文件

@@ -74,7 +74,12 @@ class RegressionCheck:
h5diff = "h5diff" h5diff = "h5diff"
h5diff_output = osext.run_command( h5diff_output = osext.run_command(
[h5diff, *self.h5diff_options, str(self.output_file), str(self.reference_file)] [
h5diff,
*self.h5diff_options,
str(self.output_file.absolute()),
str(self.reference_file),
]
) )
return sn.assert_true( return sn.assert_true(
@@ -135,3 +140,11 @@ class SnapshotRegressionCheck(RegressionCheck):
@property @property
def error_msg(self) -> str: def error_msg(self) -> str:
return f"Snapshot '{self.output_file.name}' failed regression check " return f"Snapshot '{self.output_file.name}' failed regression check "
class GeometryViewRegressionCheck(RegressionCheck):
"""Run regression check on a GprMax GeometryView."""
@property
def error_msg(self) -> str:
return f"GeometryView '{self.output_file.name}' failed regression check "

查看文件

@@ -0,0 +1,17 @@
#title: Hertzian dipole in free-space
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#material: 4.9 0 1 0 myWater
#material: 2 0 1.4 0 unusedMaterial
#material: 3 0 2 0 boxMaterial
#sphere: 0.05 0.05 0.05 0.03 myWater y
#box: 0.01 0.01 0.01 0.09 0.025 0.025 boxMaterial y
#geometry_view: 0.02 0.02 0.02 0.06 0.06 0.06 0.001 0.001 0.001 partial_volume f
#geometry_view: 0 0 0 0.1 0.1 0.1 0.001 0.001 0.001 full_volume f

查看文件

@@ -0,0 +1,17 @@
#title: Hertzian dipole in free-space
#domain: 0.100 0.100 0.100
#dx_dy_dz: 0.001 0.001 0.001
#time_window: 3e-9
#waveform: gaussiandot 1 1e9 myWave
#hertzian_dipole: z 0.050 0.050 0.050 myWave
#material: 4.9 0 1 0 myWater
#material: 2 0 1.4 0 unusedMaterial
#material: 3 0 2 0 boxMaterial
#sphere: 0.05 0.05 0.05 0.03 myWater y
#box: 0.01 0.01 0.01 0.09 0.025 0.025 boxMaterial y
#geometry_view: 0.02 0.02 0.02 0.06 0.06 0.06 0.001 0.001 0.001 partial_volume n
#geometry_view: 0 0 0 0.1 0.1 0.1 0.001 0.001 0.001 full_volume n

查看文件

@@ -1,5 +1,10 @@
from reframe_tests.tests.base_tests import GprMaxBaseTest from reframe_tests.tests.base_tests import GprMaxBaseTest
from reframe_tests.tests.mixins import ReceiverMixin, SnapshotMixin from reframe_tests.tests.mixins import (
GeometryOnlyMixin,
GeometryViewMixin,
ReceiverMixin,
SnapshotMixin,
)
class GprMaxRegressionTest(ReceiverMixin, GprMaxBaseTest): class GprMaxRegressionTest(ReceiverMixin, GprMaxBaseTest):
@@ -8,3 +13,7 @@ class GprMaxRegressionTest(ReceiverMixin, GprMaxBaseTest):
class GprMaxSnapshotTest(SnapshotMixin, GprMaxBaseTest): class GprMaxSnapshotTest(SnapshotMixin, GprMaxBaseTest):
pass pass
class GprMaxGeometryViewTest(GeometryViewMixin, GeometryOnlyMixin, GprMaxBaseTest):
pass

查看文件

@@ -0,0 +1,20 @@
import reframe as rfm
from reframe.core.builtins import parameter
from reframe_tests.tests.mixins import MpiMixin
from reframe_tests.tests.standard_tests import GprMaxGeometryViewTest
@rfm.simple_test
class TestGeometryView(GprMaxGeometryViewTest):
tags = {"test", "serial", "geometry only", "geometry view"}
sourcesdir = "src/geometry_view_tests"
model = parameter(["geometry_view_voxel", "geometry_view_fine"])
geometry_views = ["partial_volume", "full_volume"]
@rfm.simple_test
class TestGeometryViewMPI(MpiMixin, TestGeometryView):
tags = {"test", "mpi", "geometry only", "geometry view"}
mpi_layout = parameter([[2, 2, 2], [4, 4, 1]])
test_dependency = TestGeometryView