你已经派生过 gprMax
镜像自地址
https://gitee.com/sunhf/gprMax.git
已同步 2025-08-07 15:10:13 +08:00
Add geometry view reframe tests
这个提交包含在:
@@ -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:
|
||||
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.
|
||||
|
||||
Reference files are saved in directories per test case. If this
|
||||
@@ -192,6 +192,7 @@ class GprMaxBaseTest(RunOnlyRegressionTest):
|
||||
|
||||
Args:
|
||||
name: Name of the file.
|
||||
suffix: File extension. Default ".h5".
|
||||
|
||||
Returns:
|
||||
filepath: Absolute path to the reference file.
|
||||
@@ -202,7 +203,7 @@ class GprMaxBaseTest(RunOnlyRegressionTest):
|
||||
else:
|
||||
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()
|
||||
|
||||
# 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.regression_checks import (
|
||||
GeometryViewRegressionCheck,
|
||||
ReceiverRegressionCheck,
|
||||
RegressionCheck,
|
||||
SnapshotRegressionCheck,
|
||||
@@ -77,6 +78,50 @@ class SnapshotMixin(GprMaxMixin):
|
||||
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):
|
||||
"""Use the GprMax Python API rather than a standard input file."""
|
||||
|
||||
|
@@ -74,7 +74,12 @@ class RegressionCheck:
|
||||
h5diff = "h5diff"
|
||||
|
||||
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(
|
||||
@@ -135,3 +140,11 @@ class SnapshotRegressionCheck(RegressionCheck):
|
||||
@property
|
||||
def error_msg(self) -> str:
|
||||
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.mixins import ReceiverMixin, SnapshotMixin
|
||||
from reframe_tests.tests.mixins import (
|
||||
GeometryOnlyMixin,
|
||||
GeometryViewMixin,
|
||||
ReceiverMixin,
|
||||
SnapshotMixin,
|
||||
)
|
||||
|
||||
|
||||
class GprMaxRegressionTest(ReceiverMixin, GprMaxBaseTest):
|
||||
@@ -8,3 +13,7 @@ class GprMaxRegressionTest(ReceiverMixin, GprMaxBaseTest):
|
||||
|
||||
class GprMaxSnapshotTest(SnapshotMixin, GprMaxBaseTest):
|
||||
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
|
在新工单中引用
屏蔽一个用户