100 lines
4.4 KiB
Python
100 lines
4.4 KiB
Python
"""Direct-current-header regression; historical candidate manifests stay frozen."""
|
|
|
|
import importlib.util
|
|
from pathlib import Path
|
|
import shutil
|
|
import sys
|
|
from tempfile import TemporaryDirectory
|
|
import unittest
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
HELPERS = ROOT / "tests/validation/les"
|
|
sys.path.insert(0, str(HELPERS))
|
|
spec = importlib.util.spec_from_file_location(
|
|
"smagorinsky_oracle", HELPERS / "test_candidate.py"
|
|
)
|
|
oracle = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(oracle)
|
|
HEADER = Path("src/CelerisLab/lbm/kernels/operators/turbulence_smag.cuh")
|
|
DESCRIPTORS = Path("src/CelerisLab/lbm/kernels/core/descriptors.cuh")
|
|
|
|
|
|
class SmagorinskyNormalization(unittest.TestCase):
|
|
def test_current_header_matches_independent_tensor_oracle(self):
|
|
with TemporaryDirectory() as directory:
|
|
build_dir = Path(directory)
|
|
for dim in (2, 3):
|
|
for cs in (0.0, 0.16):
|
|
# Compile directly against this checkout, not saved candidate headers.
|
|
closed = oracle.build(
|
|
ROOT.parent, ROOT.name, dim, cs, 1, 3, build_dir
|
|
)
|
|
converged = oracle.build(
|
|
ROOT.parent, ROOT.name, dim, cs, 0, 200, build_dir
|
|
)
|
|
for rho in (0.7, 1.0, 1.3):
|
|
for tau0 in (0.56, 0.8):
|
|
for kind, magnitude in (
|
|
("equilibrium", 0.0),
|
|
("shear", -0.02),
|
|
("shear", 0.02),
|
|
("extension", -0.02),
|
|
("extension", 0.02),
|
|
):
|
|
stress = oracle.tensor(
|
|
dim, kind, magnitude * rho, 0, dim - 1
|
|
)
|
|
f, eq = oracle.state(dim, rho, stress)
|
|
expected = 1 / oracle.standard_tau(
|
|
tau0, cs, oracle.norm(stress), rho
|
|
)
|
|
with self.subTest(
|
|
dim=dim,
|
|
cs=cs,
|
|
rho=rho,
|
|
tau=tau0,
|
|
kind=kind,
|
|
sign=magnitude,
|
|
):
|
|
self.assertAlmostEqual(
|
|
closed(f, eq, rho, tau0), expected, delta=3e-6
|
|
)
|
|
self.assertAlmostEqual(
|
|
converged(f, eq, rho, tau0),
|
|
expected,
|
|
delta=3e-6,
|
|
)
|
|
if cs == 0:
|
|
f, eq = oracle.state(
|
|
dim, 1.0, oracle.tensor(dim, "equilibrium", 0.0)
|
|
)
|
|
self.assertAlmostEqual(
|
|
closed(f, eq, 1.0, 0.50001), 1.99, delta=3e-6
|
|
)
|
|
self.assertAlmostEqual(
|
|
closed(f, eq, 1.0, 200.0), 0.01, delta=3e-6
|
|
)
|
|
|
|
def test_removing_sqrt_two_is_detected(self):
|
|
with TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
for relative in (HEADER, DESCRIPTORS):
|
|
target = root / "old_convention" / relative
|
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
shutil.copyfile(ROOT / relative, target)
|
|
target = root / "old_convention" / HEADER
|
|
text = target.read_text()
|
|
factor = "18.0f * sqrtf(2.0f) * smag_const_sq"
|
|
self.assertEqual(text.count(factor), 2)
|
|
target.write_text(text.replace(factor, "18.0f * smag_const_sq"))
|
|
for dim in (2, 3):
|
|
old = oracle.build(root, "old_convention", dim, 0.16, 1, 3, root)
|
|
stress = oracle.tensor(dim, "shear", 0.02)
|
|
f, eq = oracle.state(dim, 1.0, stress)
|
|
expected = 1 / oracle.standard_tau(0.8, 0.16, oracle.norm(stress), 1.0)
|
|
self.assertGreater(abs(old(f, eq, 1.0, 0.8) - expected), 1e-3)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|