synthetic surface and spm specific features
This commit is contained in:
64
tests/node_tests/lateral_force_sim.py
Normal file
64
tests/node_tests/lateral_force_sim.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import numpy as np
|
||||
import pytest
|
||||
from tests.node_tests._shared import make_field
|
||||
|
||||
|
||||
def test_output_shapes():
|
||||
"""Both forward and reverse outputs must have the same shape as the input."""
|
||||
from backend.nodes.lateral_force_sim import LateralForceSim
|
||||
|
||||
node = LateralForceSim()
|
||||
field = make_field(shape=(48, 64))
|
||||
|
||||
for direction in ("forward", "reverse", "both"):
|
||||
fwd, rev = node.process(field, direction, 0.3, 1e-9, 10e-9)
|
||||
assert fwd.data.shape == field.data.shape, f"forward shape mismatch for direction={direction}"
|
||||
assert rev.data.shape == field.data.shape, f"reverse shape mismatch for direction={direction}"
|
||||
|
||||
|
||||
def test_flat_surface_uniform():
|
||||
"""A flat (constant) topography has zero slope everywhere, so the lateral
|
||||
force should be spatially uniform (pure friction, no topographic component)."""
|
||||
from backend.nodes.lateral_force_sim import LateralForceSim
|
||||
|
||||
node = LateralForceSim()
|
||||
data = np.full((32, 32), 5e-9, dtype=np.float64)
|
||||
field = make_field(data=data)
|
||||
|
||||
fwd, rev = node.process(field, "both", 0.3, 1e-9, 10e-9)
|
||||
|
||||
# All values in each output should be identical (uniform)
|
||||
assert np.ptp(fwd.data) < 1e-20, "Forward lateral force is not uniform on flat surface"
|
||||
assert np.ptp(rev.data) < 1e-20, "Reverse lateral force is not uniform on flat surface"
|
||||
|
||||
|
||||
def test_forward_reverse_different():
|
||||
"""For a non-flat surface with 'both' direction, forward and reverse
|
||||
lateral force signals should differ (topographic artifact is direction-dependent)."""
|
||||
from backend.nodes.lateral_force_sim import LateralForceSim
|
||||
|
||||
node = LateralForceSim()
|
||||
# Create a steep ramp in x so there is a significant slope
|
||||
ramp = np.tile(np.linspace(0.0, 500e-9, 64), (64, 1))
|
||||
field = make_field(data=ramp)
|
||||
|
||||
fwd, rev = node.process(field, "both", 0.3, 1e-9, 10e-9)
|
||||
|
||||
# Forward and reverse differ due to slope-dependent asymmetry;
|
||||
# use strict tolerance to detect the difference at nanoNewton scale.
|
||||
assert not np.allclose(fwd.data, rev.data, atol=0, rtol=1e-6), (
|
||||
"Forward and reverse should differ on a sloped surface"
|
||||
)
|
||||
|
||||
|
||||
def test_finite_values():
|
||||
"""All output values must be finite (no NaN or inf) for typical inputs."""
|
||||
from backend.nodes.lateral_force_sim import LateralForceSim
|
||||
|
||||
node = LateralForceSim()
|
||||
field = make_field() # random topography
|
||||
|
||||
for direction in ("forward", "reverse", "both"):
|
||||
fwd, rev = node.process(field, direction, 0.3, 1e-9, 10e-9)
|
||||
assert np.isfinite(fwd.data).all(), f"Non-finite values in forward output (direction={direction})"
|
||||
assert np.isfinite(rev.data).all(), f"Non-finite values in reverse output (direction={direction})"
|
||||
Reference in New Issue
Block a user