1 个不稳定版本
0.1.0 | 2021年1月20日 |
---|
#317 在 模拟
170KB
3.5K SLoC
发动机-模拟器
坎皮纳斯大学(UNICAMP)生物燃料发动机实验室(LMB)开发的库。
开发者:Felipe Augusto Ferreira Gomes,邮箱:[email protected]
lib.rs
:
lmb_engine_simulator
lmb_engine_simulator
包提供了一种简单的方式来模拟内燃机。
此库使用了 Builder 模式,因此用户感觉就像在真正构建一个发动机系统。为了构建系统,使用 SystemBuilder
结构体来添加所需组件。构建完成后,可以使用 build_system()
方法返回一个 System
对象,该对象用于数值求解组件。
当前阶段
该库允许您构建气体、零维和连接器对象。程序的基本逻辑是使用SystemBuilder
构建所有对象,然后指示对象之间的连接方式。基本上,所有维度对象都需要创建一个Gas
,并且一个Gas
对象是从.json文件创建的。目前,唯一可用的一个是air.json
。然而,它们被设计得很容易构建。一旦添加了所有维度对象和连接,SystemBuilder
对象就可以使用方法build_system()
来创建一个类型为System
的对象,该对象将携带所有零维和连接器对象。《code>System对象负责管理对象之间的交互、仿真过程、可存储变量。
为了进行仿真,可以使用两种方法:advance(dt)
,通过dt
推进对象的状,以及advance_to_steady_state()
,推进到系统达到稳态。**注意:到目前为止,尚未检查稳态条件。该方法运行足够长的时间,几乎每个系统都会达到稳态。**对于引擎仿真,通常使用advance_to_steady_state()
。仿真完成后,所有存储的变量只能通过将它们写入文件通过系统方法write_to_file()
来访问。
示例
创建并仿真了一个由储罐和环境通过一个孔板连接的简单系统,直到达到稳态。之后,存储的数据被写入两个文件。
use lmb::Gas;
use lmb_engine_simulator as lmb;
fn main() {
let mut gas_ambient = Gas::new("air.json");
gas_ambient.TPX(293.0, 2.0*101325.0, "O2:0.21, N2:0.79");
let mut gas_chamber = Gas::new("air.json");
gas_chamber.TPX(293.0, 101325.0, "O2:0.21, N2:0.79");
let mut builder = lmb::SystemBuilder::new();
builder
.add_environment("ambient", &gas_ambient)
.add_reservoir("chamber", 500.0, &gas_chamber)
.add_orifice("orifice", 50.0, 0.9, vec!["ambient", "chamber"]);
let mut system = builder.build_system();
// Calculating
system.advance_to_steady_state();
// Writting data
system.write_to_file("chamber.txt", "chamber", None);
system.write_to_file("orifice.txt", "orifice", None);
}
仿真引擎
要向系统添加引擎,必须使用SystemBuilder
的add_engine("engine_file.json", "gas")
方法。将engine_file.json
读取到结构体json_engine
中。此文件**必须**至少包含以下属性
- "速度"以RPM表示,
- "偏心"以毫米表示,
- "连杆"以毫米表示,
- "排量"以立方厘米表示,
- "缸径"以毫米表示,
- "点火顺序"作为字符串 - 即 "1-3-2",
- "气缸"作为一个结构体向量
json_cylinder
engine_file.json
文件的所有可能属性可以在完整的文档中找到,链接为 Json Reader
。 注意在输入曲轴角度时! 曲轴角度的参考点为零时位于压缩行程的上止点(TDC),它只接受正数。因此,整个循环从0 CA度开始,到720 CA度结束。
示例
让我们模拟一个简单的发动机系统,该系统具有进气歧管和排气歧管作为 环境,通过仅两个阀门(进气和排气)连接到单个气缸。engine.json
文件将是
{
"speed": 3000.0,
"eccentricity": 0.0,
"conrod": 145.6,
"displacement": 400.0,
"bore": 80.0,
"firing_order": "1",
"combustion": {
"model": "Two-zone model",
"comb_ini": 690.0,
"wiebe": {
"m": 2.0,
"a": 6.908,
"comb_duration": 40.0
}
},
"injector": {
"inj_type": "port",
"air_fuel_ratio": 1.0,
"fuel": {
"name": "C2H5OH",
"state": "liquid",
"lhv": 25.858e06,
"heat_vap": 900.0e3
}
},
"cylinders": [
{
"name": "cyl_1",
"compression_ratio": 12.50,
"wall_temperature": 520.0,
"store_species": true,
"intake_valves": [
{
"name": "valve_int",
"opening_angle": 340.0,
"closing_angle": 570.0,
"diameter": 30.93,
"max_lift": 9.30
}
],
"exhaust_valves": [
{
"name": "valve_exh",
"opening_angle": 130.0,
"closing_angle": 375.0,
"diameter": 28.27,
"max_lift": 8.48
}
]
}
]
}
在这个例子中,我们添加了一个 injector
,其空燃比等于1.0,以乙醇(C2H5OH)为燃料,以及一个 combustion
模型。如果不添加它们,发动机将以发电机模式运行。目前,唯一实现的燃烧模型 是“两区模型”。注意,cylinder
需要连接到它的进气和排气 valves
。在 main.rs
中,我们需要使用 connect_from_to("valve_name", "object_name")
方法将阀门连接到它们的端口。
main.rs
可以写成
use lmb::Gas;
use lmb_engine_simulator as lmb;
fn main() {
let gas_intake = Gas::new("air.json");
let mut gas_exhaust = Gas::new("air.json");
gas_exhaust.TPX(500.0, 101325.0, "N2:0.662586, H2O:0.202449, CO2:0.134965");
let mut builder = lmb::SystemBuilder::new();
builder
.add_engine("engine.json", &gas_intake)
.add_environment("intake_port", &gas_intake)
.add_environment("exhaust_port", &gas_exhaust)
.connect_from_to("valve_int", "intake_port")
.connect_from_to("valve_exh", "exhaust_port");
let mut system = builder.build_system();
// Calculating
system.advance_to_steady_state();
// Writting data
system.write_to_file("cylinder.txt", "cyl_1", None);
system.write_to_file("intake_valve.txt", "valve_int", None);
system.write_to_file("exhaust_valve.txt", "valve_exh", None);
}
有关真实发动机模拟的示例,请参阅 发动机示例
依赖关系
~2.4–3.5MB
~68K SLoC