21 个版本 (13 个稳定版)
新版本 3.0.0 | 2024年8月23日 |
---|---|
2.1.1 | 2024年8月20日 |
2.1.0 | 2024年7月12日 |
1.4.0 | 2024年7月2日 |
0.3.0 | 2024年3月3日 |
#156 在 算法 中
每月249次 下载
用于 潜水报告
71KB
1.5K SLoC
dive-deco
潜水减压模型库。
Buehlmann ZH-L16C
Bühlmann 减压参数集是一种哈达尼亚数学模型,描述了随着环境压力的变化,惰性气体进入和离开人体的方式。这些版本用于创建 Bühlmann 减压表,并在个人潜水电脑中实时计算潜水的不减压极限和减压计划。^1
功能
- 使用深度、时间和使用的气体(包括氦气混合物)进行逐步减压模型(ZH-L16C 参数版本)计算
- GF(梯度因素)上升轮廓保守性
- 当前的减压运行时间/减压停点计划器
- 根据当前模型状态运行时的减压阶段
- TTS(当前时间到水面,包括上升和所有减压停点)
- TTS @+5(给定恒定深度和呼吸混合物后的 5 分钟 TTS)
- TTS Δ+5(给定当前深度和气体混合物后的 5 分钟 TTS 的绝对变化)
- NDL(不减压极限)
- 减压上限
- 过饱和
- GF99(在当前深度处的 Bühlmann 过饱和的原始百分比,即超饱和百分比梯度)
- GFsurf(上升梯度因素,即相对于水面的超饱和百分比梯度)
- CNS(中枢神经系统毒性)
- 可配置的模型设置
- 梯度因素
- 水面压力
计划的功能
- 扩展减压模型配置 [公制/英制单位、水的密度等](目前假设公制和密度为 1.03kg/l 的海水)
- OTU(氧气毒性单位)
- 旅行记录优化(使用 Schreiner 方程而不是迭代哈达尼亚方程的线性上升/下降记录)
- 其他减压算法(VPM-B)
- 其他优化
API
用法
模型初始化
使用默认配置
use dive_deco::{ BuehlmannConfig, BuehlmannModel, DecoModel };
fn main() {
// model with default config (GF 100/100)
let model = BuehlmannModel::default();
println!("{:?}", model.config()); // BuehlmannConfig { gf: (100, 100) }
}
使用配置构建器
当前配置选项
gradient_factors
- 梯度因素设置 ([GFlow], [GFhigh])
默认:(100, 100)
)surface_pressure
- 模型初始化时的水面大气压力,假设在整个模型生命周期中保持恒定
// fluid-interface-like built config
let config = BuehlmannConfig::new()
.gradient_factors(30, 70)
.surface_pressure(1013);
let model = BuehlmannModel::new(config);
println!("{:?}", model.config()); // BuehlmannConfig { gf: (30, 70) }
更新模型状态
记录
DecoModel特征方法,表示单个模型记录作为数据点。
.记录(深度,时间,气体)
- 深度 - 当前msw中的当前深度
- 时间 - 以秒为单位的持续时间
- 气体 - 本记录持续时间使用的呼吸混合物
let depth = 20.;
let time = 1; // 1 second
let nitrox = Gas::new(0.32, 0.);
// register 1 second at 20 msw breathing nitrox 32
model.record(depth, time, &nitrox);
记录行程
DecoModel特征方法,表示深度的线性变化。它假设从深度A(当前模型状态深度)到B(目标深度)的行程,速率由深度和时间的变化得出。
.record_travel(目标深度,时间,气体)
- 目标深度 - 行程结束时的最终深度
- 时间 - 以秒为单位的行程持续时间
- 气体:本记录持续时间使用的呼吸混合物
let target_depth = 30.;
let descent_time = 4 * 60; // 4 minutes as seconds
let nitrox = Gas::new(0.32, 0.);
// register a 4 minute descent to 30m using nitrox 32
model.record_travel(target_depth, time, &nitrox);
减压数据/模型状态
减压阶段(当前减压运行时间)+ TTS
计算所有减压阶段以清除减压义务并以最有效的方式上升 - 从当前模型状态到上升的减压运行时间的部分。
.deco(Vec<Gas>) -> DecoRuntime {
deco_stages: Vec<DecoStage>,
tts: u64,
tts_at_5: u64,
tts_delta_at_5: i64
DecoStage
stage_type
(枚举)Ascent
- 线性上升到最浅深度,由减压停止深度(使用默认3m减压停止窗口进行四舍五入)或水面定义,如果没有减压义务DecoStop
- 必须进行的减压停留,以便充分去饱和,以继续到下一个阶段GasSwitch
- 根据MOD和氧气含量切换到另一个(最有效)的减压气体。只有在当前处于减压状态时,才考虑切换到另一个气体的气体切换
start_depth
- 减压阶段开始时的深度end_depth
- 减压阶段结束时的深度
duration
- 减压阶段持续时间的秒数tts
- 当前以分钟为单位的上升时间。根据当前模型,不违反减压义务可以上升的最短时间。包括所有必要的减压停留时间(假设切换到最优化减压气体)以及它们之间的旅行时间tts_at_5
(又称 @+5) - 假设恒定深度和气体混合物,5分钟内的TTStts_delta_at_5
(又称 Δ+5) - 假设恒定深度和气体混合物,5分钟后TTS的绝对变化
let config = BuehlmannConfig::new().gradient_factors(30, 70);
let mut model = BuehlmannModel::new(config);
// bottom gas
let air = Gas::air();
// deco gases
let ean_50 = Gas::new(0.5, 0.);
let oxygen = Gas::new(1., 0.);
let available_gas_mixes = vec![
air,
ean_50,
oxygen,
];
let bottom_depth = 40.;
let bottom_time = 20 * 60; // 20 min
// descent to 40m at a rate of 9min/min using air
model.record_travel_with_rate(bottom_depth, 9., &available_gas_mixes[0]);
// 20 min bottom time
model.record(bottom_depth, bottom_time, &air);
// calculate deco runtime providing available gasses
let deco_runtime = model.deco(available_gas_mixes);
println!("{:#?}", deco_runtime);
输出
DecoRuntime{deco_stages: [DecoStage{stage_type:Ascent,start_depth: 40.0,end_depth: 22.0,duration: 120,气体:气体{o2_pp: 0.21,n2_pp: 0.79,he_pp: 0.0,
},
},DecoStage{stage_type:GasSwitch,start_depth: 22.0,end_depth: 22.0,duration: 0,气体:气体{o2_pp: 0.5,n2_pp: 0.5,he_pp: 0.0,
},
},DecoStage{stage_type:Ascent,start_depth: 22.0,end_depth: 6.000000000000001,duration: 106,气体:气体{o2_pp: 0.5,n2_pp: 0.5,he_pp: 0.0,
},
},DecoStage{stage_type:GasSwitch,start_depth: 6.000000000000001,end_depth: 6.000000000000001,duration: 0,气体:气体{o2_pp: 1.0,n2_pp: 0.0,he_pp: 0.0,
},
},DecoStage{stage_type:DecoStop,start_depth: 6.000000000000001,end_depth: 6.000000000000001,duration: 410,气体:气体{o2_pp: 1.0,n2_pp: 0.0,he_pp: 0.0,
},
},DecoStage{stage_type:Ascent,start_depth: 6.000000000000001,end_depth: 3.0,duration: 20,气体:气体{o2_pp: 1.0,n2_pp: 0.0,he_pp: 0.0,
},
},DecoStage{stage_type:DecoStop,start_depth: 3.0,end_depth: 3.0,duration: 226,气体:气体{o2_pp: 1.0,n2_pp: 0.0,he_pp: 0.0,
},
},DecoStage{stage_type:Ascent,start_depth: 3.0,end_depth: 0.0,duration: 20,气体:气体{o2_pp: 1.0,n2_pp: 0.0,he_pp: 0.0,
},
},
],tts: 16,tts_at_5: 20,tts_delta_at_5: 4,
}
⚠️当前减压停留实现考虑基于MOD的气体切换 - 不要与缺氧混合物一起使用
NDL(不减压极限)
NDL是通过计算身体中惰性气体的吸收和释放得到的理论时间,该时间确定潜水员在给定深度理论上可以停留的时间间隔,而不会获得任何减压义务(假设恒定深度和气体混合物)。
ndl()
- 假设恒定深度和气体混合物,当前模型状态的无减压限制(以分钟为单位)。此方法在99分钟处有截止值
use dive_deco::{DecoModel, BuehlmannModel, BuehlmannConfig, Gas};
fn main() {
// initialize a Buehlmann ZHL-16C deco model with default config (GF 100/100)
let config = BuehlmannConfig::default();
let mut model = BuehlmannModel::new(config);
let air = Gas::new(0.21, 0.);
let depth = 30.;
let bottom_time_minutes = 10;
// a simulated instantaneous drop to 20m with a single record simulating 20 minutes bottom time using air
model.record(depth, bottom_time_minutes * 60, &air);
// model.record(....)
// model.record(....)
// current NDL (no-decompression limit)
let current_ndl = model.ndl();
println!("NDL: {} min", current_ndl); // output: NDL: 5 min
}
减压上限
目前可以到达的最小理论深度,而不会打破减压义务。在Buehlmann算法的情况下,由M值限制,该值由领先组织的饱和度和梯度因子设置给出。
ceiling()
- 给定当前模型状态和梯度因子设置,当前的减压上限(以msw为单位)
use dive_deco::{ BuehlmannConfig, BuehlmannModel, DecoModel, Gas };
fn main() {
let mut model = BuehlmannModel::new(BuehlmannConfig::default());
let nitrox_32 = Gas::new(0.32, 0.);
// ceiling after 20 min at 20 meters using EAN32 - ceiling at 0m
model.record(20., 20 * 60, &nitrox_32);
println!("Ceiling: {}m", model.ceiling()); // Ceiling: 0m
// ceiling after another 42 min at 30 meters using EAN32 - ceiling at 3m
model.record(30., 42 * 60, &nitrox_32);
println!("Ceiling: {},", model.ceiling()); // Ceiling: 3.004(..)m
}
当前组织过度饱和(梯度因子)
当前组织过度饱和作为梯度因子。
supersaturation() -> Supersaturation { gf_99, gf_surf }
- 相对于M值的百分比超饱和度 (%)- gf_99 (f64) - GF99,相对于环境压力的当前过饱和度
- gf_surf (f64) - 表面GF,相对于表面压力的当前过饱和度
// given model state after 120 seconds at 40 msw breathing air
// (...)
// on-gassing, gf99: 0%, surfGF: 71%
let supersaturation = model.supersaturation(); // Supersaturation { gf_99: 0.0, gf_surf: 71.09852831834125 }
CNS (中枢神经系统毒性)
当前中枢神经系统毒性百分比(来自NOAA限制)。测量与给定范围的允许最大暴露时间的升高氧分压累积暴露的百分比。
cns()
- CNS %
// given model
// (...)
let cns = model.cns(); // 32.5
常见
气体
模型中使用的呼吸气体。
新版本(o2,he)
- o2 - 氧分压
- he - 氦分压
partial_pressures(depth)
- 某一深度的混合气体成分的分压inspired_partial_pressures(depth)
- 考虑到肺泡水蒸气压的肺泡吸入气体的分压maximum_operating_depth(pp_o2_limit)
- 考虑氧分压的最大操作深度,以最大氧分压为参数equivalent_narcotic_depth(depth)
- 给定气体具有与空气相同的中枢神经系统毒性的等效深度。假设氧-氮1:1的中枢神经系统毒性比率。
let mix = Gas::new(0.21, 0.);
mix.partial_pressures(10.); // PartialPressures { o2: 0.42, n2: 1.58, he: 0.0 }
mix.inspired_partial_pressures(10.); // PartialPressures { o2: 0.406833, n2: 1.530467, he: 0.0 }
参考文献
- Eric C. Baker, P.E. 溶解气体减压建模
- Eric C. Baker, P.E. (1998) 理解M值
- Eric C Baker, P.E., 氧中毒计算
- Workman RD. 氮氧和氦氧潜水减压计划的计算。
- Ralph Lembcke 和 Matthias Heinrichs (2020),OSTC中的减压计算
- "潜水医学",Albert A. Bühlmann,Ernst B. Völlm (合作者),P. Nussberger;2002年第5版,Springer,ISBN 3-540-42979-4
- Salm, Albi & Eisenstein, Yael & Vered, Nurit & Rosenblat, Miri. (2022). 关于ZH-L氦系数任意性的讨论(2022年8月16日)。10.13140/RG.2.2.19048.55040。
- Rosenblat, Miri & Salm, Albi. (2024)。减压计算简介。
⚠️ 声明:不适用于潜水规划,正在开发中的模型 此减压模型目前处于开发阶段,应被视为正在进行的工作。用户应谨慎使用此模型生成的信息,并可能包含错误。重要的是要小心行事,并通过其他来源验证模型提供的任何关键信息。本模型不是潜水规划软件,潜水存在固有风险,准确规划对安全至关重要。强烈建议用户依赖专业的潜水规划软件,并与认证的潜水专业人士咨询,以获取准确可靠的潜水活动相关信息。用户通过使用本模型承认,它不能替代专业建议或为特定任务设计的专用工具,开发者不对使用由本模型生成信息产生的任何后果承担责任。