Replace Python numerical kernels with native C execution
This commit is contained in:
1 parent
48da6be21c
commit
3b38f73fe0
227 files changed
+16801
-75499
No files matched your search
@@ -23,50 +23,8 @@ class AmesimMechanicalPublicComponentTests(unittest.TestCase):
|
||||
(("port_2", "left"), ("port_1", "right")),
|
||||
)
|
||||
|
||||
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.assertEqual(
|
||||
converter.pressure_flow_equation_values(),
|
||||
tuple(residual.value for residual in residuals),
|
||||
)
|
||||
self.assertAlmostEqual(residuals[0].value, 0.0)
|
||||
self.assertEqual(converter.component_result_values(), {"force": 20.0})
|
||||
self.assertEqual(converter.parameter_values, {"direction": 1.0})
|
||||
|
||||
def test_forc_negative_direction_reverses_applied_force(self) -> None:
|
||||
converter = AmesimForc.create(
|
||||
name="force_reverse",
|
||||
medium=self.medium,
|
||||
parameters={"direction": -1.0},
|
||||
)
|
||||
converter.res.signal = 20.0
|
||||
converter.port_2.f = 20.0
|
||||
|
||||
residuals = converter.pressure_flow_equation_residuals()
|
||||
|
||||
self.assertEqual(
|
||||
converter.pressure_flow_equation_values(),
|
||||
tuple(residual.value for residual in residuals),
|
||||
)
|
||||
self.assertAlmostEqual(residuals[0].value, 0.0)
|
||||
self.assertEqual(converter.parameter_values, {"direction": -1.0})
|
||||
self.assertEqual(converter.component_result_values(), {"force": -20.0})
|
||||
|
||||
def test_forc_direction_only_accepts_positive_or_negative_one(self) -> None:
|
||||
definition = AmesimForc.PARAMETERS[0]
|
||||
@@ -81,46 +39,7 @@ class AmesimMechanicalPublicComponentTests(unittest.TestCase):
|
||||
with self.assertRaisesRegex(ValueError, "must be one of 1, -1"):
|
||||
AmesimForc("invalid_force", direction=0.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_uses_amesim_one_two_friction_encoding(self) -> None:
|
||||
disabled = AmesimMecmas21(
|
||||
"mass_disabled",
|
||||
self.medium,
|
||||
useFriction=1.0,
|
||||
fcoul=5.0,
|
||||
v0=2.0,
|
||||
)
|
||||
enabled = AmesimMecmas21(
|
||||
"mass_enabled",
|
||||
self.medium,
|
||||
useFriction=2.0,
|
||||
fcoul=5.0,
|
||||
v0=2.0,
|
||||
)
|
||||
|
||||
self.assertFalse(disabled.use_friction)
|
||||
self.assertEqual(disabled._dry_friction_force(), 0.0)
|
||||
self.assertTrue(enabled.use_friction)
|
||||
self.assertEqual(enabled._dry_friction_force(), -5.0)
|
||||
|
||||
def test_mecmas21_choice_metadata_preserves_amesim_codes(self) -> None:
|
||||
definitions = {
|
||||
@@ -223,34 +142,6 @@ class AmesimMechanicalPublicComponentTests(unittest.TestCase):
|
||||
with self.subTest(always_visible=name):
|
||||
self.assertEqual(definitions[name].visible_when, ())
|
||||
|
||||
def test_lmechn1_ties_active_port_kinematics_and_balances_force(self) -> None:
|
||||
node = AmesimLmechn1("node_1", self.medium, v1=2.0, sum=1.0)
|
||||
node.port_1.x = 0.2
|
||||
node.port_1.v = 0.3
|
||||
node.port_1.f = 4.0
|
||||
node.port_2.x = 0.2
|
||||
node.port_2.v = 0.3
|
||||
node.port_2.f = 6.0
|
||||
node.port_3.x = 0.2
|
||||
node.port_3.v = 0.3
|
||||
node.port_3.f = -10.0
|
||||
|
||||
residuals = node.pressure_flow_equation_residuals()
|
||||
|
||||
self.assertEqual(node.active_ports, ("port_1", "port_2", "port_3"))
|
||||
self.assertEqual(
|
||||
tuple(definition.name for definition in node.active_port_definitions),
|
||||
node.active_ports,
|
||||
)
|
||||
self.assertAlmostEqual(node.total_force, 10.0)
|
||||
self.assertAlmostEqual(node.force_balance, 0.0)
|
||||
self.assertEqual(len(residuals), 5)
|
||||
self.assertEqual(
|
||||
node.pressure_flow_equation_values(),
|
||||
tuple(residual.value for residual in residuals),
|
||||
)
|
||||
self.assertTrue(all(abs(residual.value) <= 1.0e-12 for residual in residuals))
|
||||
self.assertEqual(node.component_result_values(), {"tforce": 10.0})
|
||||
|
||||
def test_lmechn1_defaults_to_two_right_ports(self) -> None:
|
||||
node = AmesimLmechn1("node_default", self.medium)
|
||||
@@ -276,39 +167,7 @@ class AmesimMechanicalPublicComponentTests(unittest.TestCase):
|
||||
with self.assertRaisesRegex(ValueError, "must be at most 20"):
|
||||
AmesimLmechn1("node_21", self.medium, v1=21.0, sum=1.0)
|
||||
|
||||
def test_lstp00a_generates_opposing_contact_forces(self) -> None:
|
||||
contact = AmesimLstp00a(
|
||||
"contact_1",
|
||||
self.medium,
|
||||
gap0=0.0,
|
||||
kcont=1000.0,
|
||||
rcont=10.0,
|
||||
)
|
||||
contact.port_1.x = 0.002
|
||||
contact.port_2.x = 0.0
|
||||
contact.port_1.v = 0.1
|
||||
contact.port_2.v = 0.0
|
||||
contact.port_1.f = 3.0
|
||||
contact.port_2.f = -3.0
|
||||
|
||||
self.assertAlmostEqual(contact.gap, -0.002)
|
||||
self.assertAlmostEqual(contact.penetration, 0.002)
|
||||
self.assertAlmostEqual(contact.contact_force, 3.0)
|
||||
self.assertEqual(
|
||||
contact.component_result_values(),
|
||||
{"gap": -0.002, "penetration": 0.002, "force": 3.0},
|
||||
)
|
||||
residuals = contact.pressure_flow_equation_residuals()
|
||||
self.assertAlmostEqual(residuals[0].value, 0.0)
|
||||
self.assertAlmostEqual(residuals[1].value, 0.0)
|
||||
|
||||
def test_lstp00a_returns_zero_before_contact(self) -> None:
|
||||
contact = AmesimLstp00a("contact_1", self.medium, gap0=0.001, kcont=1000.0)
|
||||
contact.port_1.x = 0.0005
|
||||
contact.port_2.x = 0.0
|
||||
|
||||
self.assertAlmostEqual(contact.gap, 0.0005)
|
||||
self.assertAlmostEqual(contact.contact_force, 0.0)
|
||||
|
||||
def test_mecmas21_registry_rejects_fractional_choice_value(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "must be one of"):
|
||||
|
||||
Reference in new issue
Block a user