完善AMESim可配置参数交互

补充气动孔口、动态管路、UD00 与弹性接触组件的离散选项、条件显示和折叠分组。

增加目录协议、非法选项和前端参数表交互回归测试,不修改现有求解公式。
This commit is contained in:
ljz committed 2026-08-04 01:27:17 +08:00
1 parent be54070855
commit df1d676131
12 files changed
+1262 -69

No files matched your search

@@ -27,6 +27,8 @@ _MECMAS21_ELASTIC_STOP = ParameterCondition("stoptype", (2.0,))
_MECMAS21_RESTITUTION_STOP = ParameterCondition("stoptype", (3.0,))
_MECMAS21_ADVANCED_FRICTION = ParameterCondition("frictionType", (2.0,))
_MECMAS21_STRIBECK_ENABLED = ParameterCondition("strib", (2.0,))
_LSTP00A_NUMERICAL_STIFFNESS = ParameterCondition("stiffmode", (1.0,))
_LSTP00A_GEOMETRICAL_STIFFNESS = ParameterCondition("stiffmode", (2.0,))
class AmesimF000(AlgebraicComponent):
@@ -713,22 +715,126 @@ class AmesimLstp00a(AlgebraicComponent):
"""AMESim LSTP00A first public elastic contact component."""
MODEL_TYPE = "amesim_lstp00a"
MODEL_VERSION = "0.1.0"
MODEL_VERSION = "0.2.0"
PORTS = (
PortDefinition.mechanical_translational("port_1"),
PortDefinition.mechanical_translational("port_2"),
)
PARAMETERS = (
ParameterDefinition("na", 10.0, label="有效圈数", quantity="dimensionless", unit="", minimum=0.0, minimum_exclusive=True),
ParameterDefinition("gap0", 0.0, label="初始间隙", quantity="length", unit="m"),
ParameterDefinition("kcont", 1.0e6, label="接触刚度", quantity="translational_stiffness", unit="N/m", minimum=0.0),
ParameterDefinition("G", 8.57e10, label="剪切模量", quantity="pressure", unit="Pa", minimum=0.0),
ParameterDefinition("sdiam", 0.02, label="弹簧直径", quantity="length", unit="m", minimum=0.0),
ParameterDefinition("wdiam", 0.002, label="线径", quantity="length", unit="m", minimum=0.0),
ParameterDefinition("rcont", 0.0, label="接触阻尼", quantity="translational_damping", unit="N/(m/s)", minimum=0.0),
ParameterDefinition("Pdis", 1.0e-7, label="满阻尼穿透", quantity="length", unit="m", minimum=0.0),
ParameterDefinition("stiffmode", 1.0, label="刚度模式", quantity="dimensionless", unit="", minimum=0.0),
ParameterDefinition("discContactOption", 1.0, label="接触选项", quantity="dimensionless", unit="", minimum=0.0),
ParameterDefinition(
"na",
10.0,
label="有效圈数",
quantity="dimensionless",
unit="",
minimum=0.0,
minimum_exclusive=True,
description="几何刚度模式下使用的弹簧有效圈数。",
visible_when=(_LSTP00A_GEOMETRICAL_STIFFNESS,),
),
ParameterDefinition(
"gap0",
0.0,
label="初始间隙",
quantity="length",
unit="m",
description="两个机械端口开始产生接触力前的初始间隙。",
),
ParameterDefinition(
"kcont",
1.0e6,
label="接触刚度",
quantity="translational_stiffness",
unit="N/m",
minimum=0.0,
description="数值刚度模式下直接指定的接触刚度。",
visible_when=(_LSTP00A_NUMERICAL_STIFFNESS,),
),
ParameterDefinition(
"G",
8.57e10,
label="剪切模量",
quantity="pressure",
unit="Pa",
minimum=0.0,
description="几何刚度模式下的材料剪切模量。",
visible_when=(_LSTP00A_GEOMETRICAL_STIFFNESS,),
),
ParameterDefinition(
"sdiam",
0.02,
label="弹簧直径",
quantity="length",
unit="m",
minimum=0.0,
description="几何刚度模式下的弹簧平均直径。",
visible_when=(_LSTP00A_GEOMETRICAL_STIFFNESS,),
),
ParameterDefinition(
"wdiam",
0.002,
label="线径",
quantity="length",
unit="m",
minimum=0.0,
description="几何刚度模式下的弹簧线径。",
visible_when=(_LSTP00A_GEOMETRICAL_STIFFNESS,),
),
ParameterDefinition(
"rcont",
0.0,
label="接触阻尼",
quantity="translational_damping",
unit="N/(m/s)",
minimum=0.0,
description="接触穿透过程中使用的最大阻尼系数。",
),
ParameterDefinition(
"Pdis",
1.0e-7,
label="满阻尼穿透",
quantity="length",
unit="m",
minimum=0.0,
description="接触阻尼由零增至全值所需的穿透量。",
),
ParameterDefinition(
"stiffmode",
1.0,
label="刚度模式",
quantity="dimensionless",
unit="",
minimum=1.0,
maximum=2.0,
editor="choice",
options=(
ParameterOption(1.0, "数值刚度"),
ParameterOption(2.0, "几何参数"),
),
description=(
"AMESim 原始编码:1 直接使用接触刚度,2 使用弹簧几何参数。"
"当前公开求解器尚未实现由几何参数换算刚度,几何模式仍沿用"
"已保存的接触刚度值。"
),
),
ParameterDefinition(
"discContactOption",
1.0,
label="允许负接触力",
quantity="dimensionless",
unit="",
minimum=1.0,
maximum=2.0,
editor="choice",
options=(
ParameterOption(1.0, "允许负接触力"),
ParameterOption(2.0, "不允许负接触力"),
),
description=(
"AMESim 原始编码:1 保留阻尼项可能产生的负接触力,"
"2 将接触力限制为非负。"
),
),
)
RESULT_VARIABLES = (
ResultVariableDefinition("gap", "间隙", "length", "m", "derived", 10),
@@ -745,6 +851,20 @@ class AmesimLstp00a(AlgebraicComponent):
PortDisplaySpec("port_2", "right", order=20),
),
order=40,
parameter_groups=(
ParameterGroupDisplaySpec(
id="stiffness",
label="刚度",
parameters=("kcont", "G", "sdiam", "wdiam", "na"),
order=10,
),
ParameterGroupDisplaySpec(
id="contact",
label="接触",
parameters=("gap0", "rcont", "Pdis"),
order=20,
),
),
)
def __init__(self, name: str, medium: IdealGasMedium, **parameters: float) -> None:
@@ -773,9 +893,14 @@ class AmesimLstp00a(AlgebraicComponent):
medium: IdealGasMedium,
parameters: Mapping[str, float],
) -> "AmesimLstp00a":
definitions = {definition.name: definition for definition in cls.PARAMETERS}
for integer_name in ("stiffmode", "discContactOption"):
if not float(parameters[integer_name]).is_integer():
value = float(parameters[integer_name])
if not value.is_integer():
raise ValueError(f"LSTP00A {integer_name} must be an integer.")
message = definitions[integer_name].validation_message(value)
if message is not None:
raise ValueError(f"LSTP00A {integer_name} {message}.")
return cls(name=name, medium=medium, **dict(parameters))
@property