优化求解器重试并校正AMESim机械端口
This commit is contained in:
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,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
Reference in new issue
Block a user