优化求解器重试并校正AMESim机械端口

This commit is contained in:
huojiarong committed 2026-08-03 09:54:46 +00:00
1 parent 971e8f2336
commit 18d9802f03
15 files changed
+383 -166

No files matched your search

@@ -87,6 +87,7 @@ class AmesimForc(AlgebraicComponent):
self.set_parameter_values({})
self.res = self.register_declared_port("res")
self.port_2 = self.register_declared_port("port_2")
self._orientation_sign = 1.0
@classmethod
def create(
@@ -98,6 +99,15 @@ class AmesimForc(AlgebraicComponent):
) -> "AmesimForc":
return cls(name=name)
def apply_layout_transform(self, *, rotation: int, mirrored: bool) -> None:
"""Apply the AMESim icon direction to the signed force output."""
normalized_rotation = int(rotation) % 360
if normalized_rotation not in {0, 90, 180, 270}:
raise ValueError("FORC rotation must be a multiple of 90 degrees.")
direction = -1.0 if normalized_rotation in {180, 270} else 1.0
self._orientation_sign = -direction if mirrored else direction
@property
def output_force(self) -> float:
return float(self.res.signal)
@@ -111,7 +121,7 @@ class AmesimForc(AlgebraicComponent):
relation="constitutive",
variables=(f"{self.name}.port_2.f", f"{self.name}.res.signal"),
role="flow",
value=self.port_2.f + self.output_force,
value=self.port_2.f + self._orientation_sign * self.output_force,
),
)
@@ -170,8 +180,8 @@ class AmesimMecmas21(DynamicComponent):
category_id="mechanical",
symbol="amesim_mecmas21",
ports=(
PortDisplaySpec("port_1", "left", order=10),
PortDisplaySpec("port_2", "right", order=20),
PortDisplaySpec("port_2", "left", order=10),
PortDisplaySpec("port_1", "right", order=20),
),
order=30,
)
@@ -426,11 +436,11 @@ class AmesimLstp00a(AlgebraicComponent):
assert self._causal_port_2_x is not None
penetration = (
self._causal_penetration
+ (self.port_2.x - self._causal_port_2_x)
- (self.port_1.x - self._causal_port_1_x)
+ (self.port_1.x - self._causal_port_1_x)
- (self.port_2.x - self._causal_port_2_x)
)
return -penetration
return self.gap0 - (self.port_2.x - self.port_1.x)
return self.gap0 + (self.port_2.x - self.port_1.x)
@property
def penetration(self) -> float:
@@ -438,7 +448,7 @@ class AmesimLstp00a(AlgebraicComponent):
@property
def penetration_velocity(self) -> float:
return self.port_2.v - self.port_1.v
return self.port_1.v - self.port_2.v
@property
def contact_force(self) -> float:
@@ -516,7 +526,7 @@ class AmesimLstp00a(AlgebraicComponent):
f"{self.name}.port_2.v",
),
role="flow",
value=self.port_1.f + force,
value=self.port_1.f - force,
),
EquationResidual(
id=f"{self.name}:port_2_contact_force",
@@ -531,7 +541,7 @@ class AmesimLstp00a(AlgebraicComponent):
f"{self.name}.port_2.v",
),
role="flow",
value=self.port_2.f - force,
value=self.port_2.f + force,
),
)