公开更多 AMESim 组件并接入信号机械闭环

This commit is contained in:
huojiarong committed 2026-07-30 10:11:08 +00:00
1 parent db4bdb4b70
commit 3f51a124d6
28 files changed
+3397 -58

No files matched your search

+44 -14
View File
@@ -134,12 +134,12 @@ class PressureFlowSolver:
if not changed:
break
def _scales(self) -> tuple[float, float]:
def _scales(self) -> dict[str, float]:
pressure_scale = max(
[
abs(unknown.read())
for unknown in self.unknowns
if unknown.role == "effort" and unknown.read() > 0.0
if unknown.variable == "p" and unknown.read() > 0.0
]
+ [1e5]
)
@@ -148,16 +148,31 @@ class PressureFlowSolver:
for component in self.network.components.values()
if hasattr(component, "K_eff")
]
flow_scale = max(
mass_flow_scale = max(
estimated_flows
+ [
abs(unknown.read())
for unknown in self.unknowns
if unknown.role == "flow"
if unknown.variable == "m_flow"
]
+ [1e-3]
)
return pressure_scale, flow_scale
return {
"p": pressure_scale,
"m_flow": mass_flow_scale,
"x": max(
[abs(unknown.read()) for unknown in self.unknowns if unknown.variable == "x"]
+ [1.0]
),
"v": max(
[abs(unknown.read()) for unknown in self.unknowns if unknown.variable == "v"]
+ [1.0]
),
"f": max(
[abs(unknown.read()) for unknown in self.unknowns if unknown.variable == "f"]
+ [1.0]
),
}
def solve(self) -> AlgebraicSolveDiagnostics:
try:
@@ -169,11 +184,13 @@ class PressureFlowSolver:
) from exc
self._seed_equal_pressures()
pressure_scale, flow_scale = self._scales()
scales = self._scales()
pressure_scale = scales["p"]
flow_scale = scales["m_flow"]
positive_pressures = [
unknown.read()
for unknown in self.unknowns
if unknown.role == "effort" and unknown.read() > 0.0
if unknown.variable == "p" and unknown.read() > 0.0
]
fallback_pressure = (
sum(positive_pressures) / len(positive_pressures)
@@ -182,13 +199,28 @@ class PressureFlowSolver:
)
def variable_scale(unknown: AlgebraicUnknown) -> float:
return pressure_scale if unknown.role == "effort" else flow_scale
return scales.get(unknown.variable, max(abs(unknown.read()), 1.0))
def equation_scale(equation) -> float:
variable_names = [
variable.rsplit(".", 1)[-1]
for variable in equation.variables
]
if equation.role == "flow":
return scales["f"] if "f" in variable_names else flow_scale
if equation.role == "effort":
if "x" in variable_names:
return scales["x"]
if "v" in variable_names:
return scales["v"]
return pressure_scale
return max([scales.get(name, 1.0) for name in variable_names] + [1.0])
x0 = np.asarray(
[
(
unknown.read()
if unknown.role != "effort" or unknown.read() > 0.0
if unknown.variable != "p" or unknown.read() > 0.0
else fallback_pressure
)
/ variable_scale(unknown)
@@ -198,7 +230,7 @@ class PressureFlowSolver:
)
lower = np.asarray(
[
1.0 / pressure_scale if unknown.role == "effort" else -np.inf
1.0 / pressure_scale if unknown.variable == "p" else -np.inf
for unknown in self.unknowns
]
)
@@ -213,8 +245,7 @@ class PressureFlowSolver:
equations = self.network.pressure_flow_equation_residuals()
return np.asarray(
[
equation.value
/ (pressure_scale if equation.role == "effort" else flow_scale)
equation.value / equation_scale(equation)
for equation in equations
],
dtype=float,
@@ -234,8 +265,7 @@ class PressureFlowSolver:
equations = self.network.pressure_flow_equation_residuals()
scaled = [
abs(
equation.value
/ (pressure_scale if equation.role == "effort" else flow_scale)
equation.value / equation_scale(equation)
)
for equation in equations
]