完善AMESim可配置参数交互
补充气动孔口、动态管路、UD00 与弹性接触组件的离散选项、条件显示和折叠分组。 增加目录协议、非法选项和前端参数表交互回归测试,不修改现有求解公式。
This commit is contained in:
1 parent
be54070855
commit
df1d676131
12 files changed
+1262
-69
No files matched your search
@@ -4,12 +4,71 @@ from collections.abc import Mapping
|
||||
from math import floor
|
||||
|
||||
from app.simulation.core.base import AlgebraicComponent
|
||||
from app.simulation.core.catalog import ComponentDisplaySpec, PortDisplaySpec
|
||||
from app.simulation.core.metadata import ParameterDefinition, ResultVariableDefinition
|
||||
from app.simulation.core.catalog import (
|
||||
ComponentDisplaySpec,
|
||||
ParameterGroupDisplaySpec,
|
||||
PortDisplaySpec,
|
||||
)
|
||||
from app.simulation.core.metadata import (
|
||||
ParameterCondition,
|
||||
ParameterDefinition,
|
||||
ParameterOption,
|
||||
ResultVariableDefinition,
|
||||
)
|
||||
from app.simulation.core.medium import IdealGasMedium
|
||||
from app.simulation.core.ports import PortDefinition
|
||||
|
||||
|
||||
def _ud00_stage_parameters(index: int) -> tuple[ParameterDefinition, ...]:
|
||||
visible_when = (
|
||||
()
|
||||
if index == 1
|
||||
else (
|
||||
ParameterCondition(
|
||||
"nstages",
|
||||
tuple(float(stage_count) for stage_count in range(index, 9)),
|
||||
),
|
||||
)
|
||||
)
|
||||
return (
|
||||
ParameterDefinition(
|
||||
f"start{index}",
|
||||
0.0 if index == 1 else 1.0,
|
||||
label=f"第 {index} 段起点",
|
||||
quantity="dimensionless",
|
||||
unit="",
|
||||
description=f"第 {index} 段开始时的输出值。",
|
||||
visible_when=visible_when,
|
||||
),
|
||||
ParameterDefinition(
|
||||
f"end{index}",
|
||||
1.0,
|
||||
label=f"第 {index} 段终点",
|
||||
quantity="dimensionless",
|
||||
unit="",
|
||||
description=f"第 {index} 段结束时的输出值。",
|
||||
visible_when=visible_when,
|
||||
),
|
||||
ParameterDefinition(
|
||||
f"t{index}",
|
||||
1.0 if index == 1 else 0.0,
|
||||
label=f"第 {index} 段时长",
|
||||
quantity="time",
|
||||
unit="s",
|
||||
minimum=0.0,
|
||||
description=f"第 {index} 段的持续时间。",
|
||||
visible_when=visible_when,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
_UD00_STAGE_PARAMETERS = tuple(
|
||||
parameter
|
||||
for stage_index in range(1, 9)
|
||||
for parameter in _ud00_stage_parameters(stage_index)
|
||||
)
|
||||
|
||||
|
||||
class AmesimStep0(AlgebraicComponent):
|
||||
"""AMESim STEP0 scalar step signal source."""
|
||||
|
||||
@@ -89,36 +148,48 @@ class AmesimUd00(AlgebraicComponent):
|
||||
"""AMESim UD00 piecewise-linear scalar signal source."""
|
||||
|
||||
MODEL_TYPE = "amesim_ud00"
|
||||
MODEL_VERSION = "0.1.0"
|
||||
MODEL_VERSION = "0.2.0"
|
||||
PORTS = (PortDefinition.signal("out", nominal_role="output"),)
|
||||
PARAMETERS = (
|
||||
ParameterDefinition("tstart", 0.0, label="启动时间", quantity="time", unit="s"),
|
||||
ParameterDefinition("start1", 0.0, label="第 1 段起点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("end1", 1.0, label="第 1 段终点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("t1", 1.0, label="第 1 段时长", quantity="time", unit="s", minimum=0.0),
|
||||
ParameterDefinition("start2", 1.0, label="第 2 段起点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("end2", 1.0, label="第 2 段终点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("t2", 0.0, label="第 2 段时长", quantity="time", unit="s", minimum=0.0),
|
||||
ParameterDefinition("start3", 1.0, label="第 3 段起点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("end3", 1.0, label="第 3 段终点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("t3", 0.0, label="第 3 段时长", quantity="time", unit="s", minimum=0.0),
|
||||
ParameterDefinition("start4", 1.0, label="第 4 段起点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("end4", 1.0, label="第 4 段终点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("t4", 0.0, label="第 4 段时长", quantity="time", unit="s", minimum=0.0),
|
||||
ParameterDefinition("start5", 1.0, label="第 5 段起点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("end5", 1.0, label="第 5 段终点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("t5", 0.0, label="第 5 段时长", quantity="time", unit="s", minimum=0.0),
|
||||
ParameterDefinition("start6", 1.0, label="第 6 段起点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("end6", 1.0, label="第 6 段终点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("t6", 0.0, label="第 6 段时长", quantity="time", unit="s", minimum=0.0),
|
||||
ParameterDefinition("start7", 1.0, label="第 7 段起点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("end7", 1.0, label="第 7 段终点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("t7", 0.0, label="第 7 段时长", quantity="time", unit="s", minimum=0.0),
|
||||
ParameterDefinition("start8", 1.0, label="第 8 段起点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("end8", 1.0, label="第 8 段终点", quantity="dimensionless", unit=""),
|
||||
ParameterDefinition("t8", 0.0, label="第 8 段时长", quantity="time", unit="s", minimum=0.0),
|
||||
ParameterDefinition("nstages", 1.0, label="段数", quantity="dimensionless", unit="", minimum=1.0, maximum=8.0),
|
||||
ParameterDefinition("iscyclic", 0.0, label="循环", quantity="dimensionless", unit="", minimum=0.0, maximum=1.0),
|
||||
ParameterDefinition(
|
||||
"tstart",
|
||||
0.0,
|
||||
label="启动时间",
|
||||
quantity="time",
|
||||
unit="s",
|
||||
description="分段信号开始输出第一段之前的等待时间。",
|
||||
),
|
||||
*_UD00_STAGE_PARAMETERS,
|
||||
ParameterDefinition(
|
||||
"nstages",
|
||||
1.0,
|
||||
label="段数",
|
||||
quantity="dimensionless",
|
||||
unit="",
|
||||
minimum=1.0,
|
||||
maximum=8.0,
|
||||
editor="choice",
|
||||
options=tuple(
|
||||
ParameterOption(float(stage_count), str(stage_count))
|
||||
for stage_count in range(1, 9)
|
||||
),
|
||||
description="参与输出计算的有效线性分段数量。",
|
||||
),
|
||||
ParameterDefinition(
|
||||
"iscyclic",
|
||||
0.0,
|
||||
label="循环",
|
||||
quantity="dimensionless",
|
||||
unit="",
|
||||
minimum=0.0,
|
||||
maximum=1.0,
|
||||
editor="choice",
|
||||
options=(
|
||||
ParameterOption(0.0, "否"),
|
||||
ParameterOption(1.0, "是"),
|
||||
),
|
||||
description="当前公共协议编码:0 表示单次输出,1 表示循环输出。",
|
||||
),
|
||||
)
|
||||
RESULT_VARIABLES = (
|
||||
ResultVariableDefinition("y", "输出", "dimensionless", "", "signal", 10),
|
||||
@@ -130,6 +201,16 @@ class AmesimUd00(AlgebraicComponent):
|
||||
symbol="amesim_ud00",
|
||||
ports=(PortDisplaySpec("out", "right", order=10),),
|
||||
order=20,
|
||||
parameter_groups=(
|
||||
ParameterGroupDisplaySpec(
|
||||
id="stages",
|
||||
label="分段参数",
|
||||
parameters=tuple(
|
||||
parameter.name for parameter in _UD00_STAGE_PARAMETERS
|
||||
),
|
||||
order=10,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
def __init__(
|
||||
@@ -174,10 +255,17 @@ class AmesimUd00(AlgebraicComponent):
|
||||
) -> "AmesimUd00":
|
||||
nstages = parameters["nstages"]
|
||||
iscyclic = parameters["iscyclic"]
|
||||
if not float(nstages).is_integer():
|
||||
raise ValueError("UD00 nstages must be an integer.")
|
||||
if not float(iscyclic).is_integer():
|
||||
raise ValueError("UD00 iscyclic must be 0 or 1.")
|
||||
definitions = {definition.name: definition for definition in cls.PARAMETERS}
|
||||
for parameter_name, value in (
|
||||
("nstages", nstages),
|
||||
("iscyclic", iscyclic),
|
||||
):
|
||||
numeric_value = float(value)
|
||||
if not numeric_value.is_integer():
|
||||
raise ValueError(f"UD00 {parameter_name} must be an integer.")
|
||||
message = definitions[parameter_name].validation_message(numeric_value)
|
||||
if message is not None:
|
||||
raise ValueError(f"UD00 {parameter_name} {message}.")
|
||||
return cls(
|
||||
name=name,
|
||||
medium=medium,
|
||||
|
||||
Reference in new issue
Block a user