Extraction process calculation toolkit for liquid-liquid extraction and solid-liquid leaching
moon version --all
moon updatemoon fmt --check
moon check --target all --deny-warn
moon test --deny-warnmoon build cmd/extractor --target native
moon run --target native cmd/extractor -- --help| 命令 | 用途 |
|---|---|
| distribution <x> <y> | 计算分配系数 |
| single <L> <xF> <V> <K> [yS] | 单级液液萃取 |
| countercurrent <L> <xF> <V> <K> <N> [yS] | 逆流多级萃取 |
| leach <B> <M0> <x0> <W> <R> [xW] | 单级固液浸取/洗涤 |
| stages-linear <L> <V> <xF> <xR> <K> [yS] | 线性平衡关系下的级数计算 |
| solvent-design <L> <xF> <K> <xR> <N> | 溶剂量与流程方案比较 |
| sensitivity <L> <xF> <V> <K> [step] | 局部灵敏度与情景审计 |
moon run --target native cmd/extractor -- distribution 0.10 0.40
# distribution_coefficient=4
moon run --target native cmd/extractor -- single 100 0.10 50 2
# raffinate_concentration=0.05
# extract_concentration=0.1
# recovery=0.5
# balance_residual=0test {
let result = @moonbit_extractor.single_stage_constant_k(
feed_flow=100.0,
feed_concentration=0.1,
solvent_flow=50.0,
distribution=2.0,
)
assert_true(result.recovery.is_close(0.5))
}test {
let points = [
@domain.EquilibriumPoint::new(x=0.0, y=0.0),
@domain.EquilibriumPoint::new(x=0.1, y=0.2),
@domain.EquilibriumPoint::new(x=0.2, y=0.3),
]
let equilibrium = @interpolation.EquilibriumTable::new(points)
let result = @liquid.single_stage_table(
feed_flow=100.0,
feed_concentration=0.1,
solvent_flow=50.0,
equilibrium~,
)
assert_true(result.balance_residual.abs() < 1.0e-8)
}cmd/extractor 命令行入口与参数校验
cmd/benchmark 可复现基准入口
│
├── facade 根包门面 API
├── domain 领域类型、错误和输入约束
├── liquid 液液萃取物料衡算
├── leaching 固液浸取与洗涤
├── stages 级数与级效率
├── ternary 三元相平衡和几何
├── data CSV 数据读取
├── design 方案设计和灵敏度
├── analysis 情景、统计和衡算审计
└── supporting 插值、单位、校准、优化、报告和导出moon run --target native cmd/benchmarkcases=20
average_recovery=0.3796434209968044
maximum_balance_residual=8.881784197001252e-16moon test --deny-warn
moon check --target all --deny-warn
moon infofn analysis_balance_report(summary : BalanceAudit, tolerance~ : Double) -> AuditReport raise ExtractionErrorfn approximately_equal(left : Double, right : Double, tolerance? : Double) -> Boolfn audit_balances(results : ArrayView[ScenarioResult], tolerance? : Double) -> BalanceAudit raise ExtractionErrorfn balance_report(name~ : String, residuals : ArrayView[Double], tolerance~ : Double) -> AuditReport raise ExtractionErrorfn bounded_minimize(objective : (Double) -> Double raise ExtractionError, lower~ : Double, upper~ : Double, tolerance? : Double, maximum_iterations? : Int) -> SearchResult raise ExtractionErrorfn calibrate_efficiency(ideal_stages : ArrayView[Double], actual_stages : ArrayView[Double]) -> EfficiencyCalibration raise ExtractionErrorfn compare_contact_patterns(carrier_flow~ : Double, feed_concentration~ : Double, distribution~ : Double, target_raffinate~ : Double, maximum_stages? : Int) -> Array[SolventDesign] raise ExtractionErrorfn concentration_from_fraction(fraction : Double, carrier_mass : Mass) -> Concentration raise ExtractionErrorfn countercurrent_constant_k(carrier_flow~ : Double, feed_concentration~ : Double, solvent_flow~ : Double, solvent_inlet_concentration? : Double, distribution~ : Double, stage_count~ : Int) -> CountercurrentResult raise ExtractionErrorfn crosscurrent_constant_k(feed_flow~ : Double, feed_concentration~ : Double, solvent_flows : ArrayView[Double], solvent_concentrations? : Array[Double], distribution~ : Double) -> CrosscurrentResult raise ExtractionErrorfn crosscurrent_equal_solvent(feed_flow~ : Double, feed_concentration~ : Double, total_solvent~ : Double, stage_count~ : Int, distribution~ : Double) -> CrosscurrentResult raise ExtractionErrorfn crosscurrent_equal_wash(dry_solid_mass~ : Double, initial_solution_mass~ : Double, initial_solute_fraction~ : Double, total_wash_mass~ : Double, stage_count~ : Int, retention_ratio~ : Double) -> CrosscurrentLeachingResult raise ExtractionErrorfn crosscurrent_leach(dry_solid_mass~ : Double, initial_solution_mass~ : Double, initial_solute_fraction~ : Double, wash_masses : ArrayView[Double], wash_solute_fractions? : Array[Double], retention_ratio~ : Double) -> CrosscurrentLeachingResult raise ExtractionErrorfn distribution_coefficient(raffinate_concentration : Double, extract_concentration : Double) -> Double raise ExtractionErrorfn extraction_factor(distribution~ : Double, solvent_flow~ : Double, carrier_flow~ : Double) -> Double raise ExtractionErrorfn fit_polynomial(observations : ArrayView[Observation], degree : Int) -> RegressionModel raise ExtractionErrorfn from_cartesian(point : CartesianPoint, tolerance? : Double) -> TernaryComposition raise ExtractionErrorfn grid_minimize(objective : (Double) -> Double raise ExtractionError, lower~ : Double, upper~ : Double, samples~ : Int) -> SearchResult raise ExtractionErrorfn latin_hypercube(ranges : ArrayView[Range], samples : Int) -> Array[Array[Double]] raise ExtractionErrorfn leave_one_out(observations : ArrayView[Observation], degree : Int) -> CrossValidation raise ExtractionErrorfn ledger_entry(name~ : String, inlet~ : Double, outlet~ : Double, generated? : Double, consumed? : Double) -> LedgerEntry raise ExtractionErrorfn lever_rule(overall : TernaryComposition, first : TernaryComposition, second : TernaryComposition, total_amount? : Double, tolerance? : Double) -> LeverResult raise ExtractionErrorfn mccabe_thiele_stages(equilibrium~ : EquilibriumTable, carrier_flow~ : Double, solvent_flow~ : Double, feed_concentration~ : Double, target_raffinate~ : Double, solvent_inlet_concentration? : Double, maximum_stages? : Int, tolerance? : Double) -> StageCountResult raise ExtractionErrorfn minimum_countercurrent_stages(carrier_flow~ : Double, feed_concentration~ : Double, solvent_flow~ : Double, solvent_inlet_concentration? : Double, distribution~ : Double, target_raffinate~ : Double, maximum_stages? : Int) -> CountercurrentResult raise ExtractionErrorfn mix_point(first : TernaryComposition, second : TernaryComposition, first_amount~ : Double, second_amount~ : Double) -> TernaryComposition raise ExtractionErrorfn operating_line(carrier_flow~ : Double, solvent_flow~ : Double, raffinate_product~ : Double, solvent_inlet~ : Double, xs : ArrayView[Double]) -> Array[EquilibriumPoint] raise ExtractionErrorfn parse_equilibrium_csv(text : String, options? : CsvOptions, extrapolation? : Extrapolation) -> EquilibriumTable raise ExtractionErrorfn parse_tie_lines_csv(text : String, options? : CsvOptions) -> Array[TieLine] raise ExtractionErrorfn recommended_safety_factor(uncertainty_fraction : Double, minimum? : Double) -> Double raise ExtractionErrorfn recovery_fraction(inlet_solute : Double, raffinate_solute : Double) -> Double raise ExtractionErrorfn run_single_stage_scenario(scenario : SingleStageScenario) -> ScenarioResult raise ExtractionErrorfn run_single_stage_scenarios(scenarios : ArrayView[SingleStageScenario]) -> Array[ScenarioResult] raise ExtractionErrorfn selectivity(solute_a_raffinate~ : Double, solute_a_extract~ : Double, solute_b_raffinate~ : Double, solute_b_extract~ : Double) -> Double raise ExtractionErrorfn shortcut_actual_stages(theoretical_stages : Double, overall_efficiency : Double) -> Double raise ExtractionErrorfn single_stage_constant_k(feed_flow~ : Double, feed_concentration~ : Double, solvent_flow~ : Double, solvent_concentration? : Double, distribution~ : Double) -> SingleStageResult raise ExtractionErrorfn single_stage_leach(dry_solid_mass~ : Double, initial_solution_mass~ : Double, initial_solute_fraction~ : Double, wash_solution_mass~ : Double, wash_solute_fraction? : Double, retention_ratio~ : Double) -> LeachingStageResult raise ExtractionErrorfn single_stage_recovery_envelope(feed_flow~ : Double, feed_concentration~ : Double, nominal_solvent_flow~ : Double, solvent_flow_lower~ : Double, solvent_flow_upper~ : Double, nominal_distribution~ : Double, distribution_lower~ : Double, distribution_upper~ : Double) -> RecoveryEnvelope raise ExtractionErrorfn single_stage_sensitivity(carrier_flow~ : Double, feed_concentration~ : Double, solvent_flow~ : Double, distribution~ : Double, relative_step? : Double) -> Array[SensitivityPoint] raise ExtractionErrorfn single_stage_table(feed_flow~ : Double, feed_concentration~ : Double, solvent_flow~ : Double, solvent_concentration? : Double, equilibrium~ : EquilibriumTable, tolerance? : Double, max_iterations? : Int) -> SingleStageResult raise ExtractionErrorfn solvent_for_countercurrent(carrier_flow~ : Double, feed_concentration~ : Double, distribution~ : Double, target_raffinate~ : Double, stage_count~ : Int, solvent_inlet_concentration? : Double, tolerance? : Double) -> SolventDesign raise ExtractionErrorfn solvent_for_crosscurrent(carrier_flow~ : Double, feed_concentration~ : Double, distribution~ : Double, target_raffinate~ : Double, stage_count~ : Int, tolerance? : Double) -> SolventDesign raise ExtractionErrorfn solvent_for_single_stage(carrier_flow~ : Double, feed_concentration~ : Double, distribution~ : Double, target_raffinate~ : Double) -> SolventDesign raise ExtractionErrorfn split_on_tie_line(overall : TernaryComposition, tie_line : TieLine, total_amount? : Double, tolerance? : Double) -> PhaseSplit raise ExtractionErrorfn stages_with_efficiency_profile(equilibrium~ : EquilibriumTable, carrier_flow~ : Double, solvent_flow~ : Double, feed_concentration~ : Double, target_raffinate~ : Double, efficiencies : ArrayView[Double], solvent_inlet_concentration? : Double, tolerance? : Double) -> EfficiencyStageResult raise ExtractionErrorfn stages_with_uniform_efficiency(equilibrium~ : EquilibriumTable, carrier_flow~ : Double, solvent_flow~ : Double, feed_concentration~ : Double, target_raffinate~ : Double, efficiency~ : Double, solvent_inlet_concentration? : Double, maximum_stages? : Int, tolerance? : Double) -> EfficiencyStageResult raise ExtractionErrorfn summarize_scenarios(results : ArrayView[ScenarioResult]) -> ScenarioSummary raise ExtractionErrorfn sweep_distribution(feed_flow~ : Double, feed_concentration~ : Double, solvent_flow~ : Double, distributions : ArrayView[Double]) -> Array[ScenarioResult] raise ExtractionErrorfn sweep_solvent_flow(feed_flow~ : Double, feed_concentration~ : Double, solvent_flows : ArrayView[Double], distribution~ : Double) -> Array[ScenarioResult] raise ExtractionErrorfn validate_curve(curve : EquilibriumCurve, tolerance~ : Double) -> Array[String] raise ExtractionErrorfn wash_for_target(dry_solid_mass~ : Double, initial_solution_mass~ : Double, initial_solute_fraction~ : Double, stage_count~ : Int, retention_ratio~ : Double, target_remaining_fraction~ : Double, tolerance? : Double, max_wash_mass? : Double) -> CrosscurrentLeachingResult raise ExtractionErrorInstall
Download zipExtraction process calculation toolkit for liquid-liquid extraction and solid-liquid leaching