公开更多 AMESim 组件并接入信号机械闭环
This commit is contained in:
1 parent
db4bdb4b70
commit
3f51a124d6
28 files changed
+3397
-58
No files matched your search
@@ -0,0 +1,69 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
|
||||
from app.simulation.components.amesim.mechanical.translational import (
|
||||
AmesimF000,
|
||||
AmesimForc,
|
||||
AmesimMecmas21,
|
||||
)
|
||||
from app.simulation.core.medium import IdealGasMedium
|
||||
from app.simulation.registry import COMPONENT_MODEL_REGISTRY
|
||||
|
||||
|
||||
class AmesimMechanicalPublicComponentTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.medium = IdealGasMedium()
|
||||
|
||||
def test_f000_constrains_mechanical_port_force_to_zero(self) -> None:
|
||||
source = AmesimF000("zero_1")
|
||||
source.port_1.f = 12.5
|
||||
|
||||
residuals = source.pressure_flow_equation_residuals()
|
||||
|
||||
self.assertEqual(len(residuals), 1)
|
||||
self.assertEqual(residuals[0].variables, ("zero_1.port_1.f",))
|
||||
self.assertAlmostEqual(residuals[0].value, 12.5)
|
||||
|
||||
def test_forc_converts_signal_to_opposing_source_port_force(self) -> None:
|
||||
converter = AmesimForc("force_1")
|
||||
converter.res.signal = 20.0
|
||||
converter.port_2.f = -20.0
|
||||
|
||||
residuals = converter.pressure_flow_equation_residuals()
|
||||
|
||||
self.assertAlmostEqual(converter.output_force, 20.0)
|
||||
self.assertAlmostEqual(residuals[0].value, 0.0)
|
||||
self.assertEqual(converter.component_result_values(), {"force": 20.0})
|
||||
|
||||
def test_mecmas21_acceleration_uses_connected_port_forces(self) -> None:
|
||||
mass = AmesimMecmas21(
|
||||
"mass_1",
|
||||
self.medium,
|
||||
mass=2.0,
|
||||
fcoul=0.0,
|
||||
rvisc=0.0,
|
||||
wind=0.0,
|
||||
x0=0.1,
|
||||
v0=0.2,
|
||||
)
|
||||
mass.port_1.f = 10.0
|
||||
mass.port_2.f = -2.0
|
||||
|
||||
self.assertEqual(mass.get_state_vector(), [0.2, 0.1])
|
||||
self.assertAlmostEqual(mass.acceleration(), 4.0)
|
||||
self.assertEqual(mass.state_derivative_from_ports({}), [4.0, 0.2])
|
||||
self.assertAlmostEqual(mass.port_1.x, 0.1)
|
||||
self.assertAlmostEqual(mass.port_2.v, 0.2)
|
||||
|
||||
def test_mecmas21_registry_rejects_fractional_integer_options(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "useFriction must be an integer"):
|
||||
COMPONENT_MODEL_REGISTRY["amesim_mecmas21"].create(
|
||||
"mass_1",
|
||||
self.medium,
|
||||
{"useFriction": 0.5},
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user