#engine #internal #fuel #system #json-file #combustion

bin+lib lmb_engine_simulator

lmb_engine_simulator 库提供了一种简单的方式来模拟内燃机。

1 个不稳定版本

0.1.0 2021年1月20日

#317模拟

MIT/ApacheLGPL-3.0

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);
}

仿真引擎

要向系统添加引擎,必须使用SystemBuilderadd_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