АШИГТ МАЛТМАЛЫН БАЯЖУУЛАЛТЫН ТЕХНИК, ТЕХНОЛОГИ

Ашигт малтмалын баяжуулалтын чиглэлээр сурч буй оюутан сурагчид, залуу инженерүүдэд зориулав.

Friday, January 23, 2026

ФЛОРТАЦИЙН МАШИНЫ ТООЦОО (PYTHON)



Энэхүү программ нь флотацийн машин сонгох тооцоолол гүйцэтгэх ба хэрэглэгч бага зэрэг өөрчлөн өөрийн төслийн тооцоог хялбар гүйцэтгэж болно.
Нөгөө талаас Python дээр class бүтцийг хэрхэн ашиглах талаар зөвлөмж болох юм.

import math
from dataclasses import dataclass

# ============================================= 
# 1.Лабораторийн кинетик болон пульпын мэдээлэл
# =============================================

@dataclass
class SlurryConditions:
    Q_s_tph: float          # Хүчин чадал [т/ц]
    w_s: float              # Хатуугийн агуулга (жишээ нь 32%-ийг 0.32 гэж өгнө)
    rho_s: float = 2.8      # Хүдрийн нягт [т/м3]
    rho_w: float = 1.0      # Шингэний нягт [т/м3]

    def slurry_flows(self):# Пульпын урсгалын дэд программ
        """
        Тооцох нь:
            Q_slurry_mass [t/h],
            Q_water_mass [t/h],
            Q_slurry_vol [m3/h]
        """
        # Урсгалын нийт жин [т/ц]
        Q_slurry_mass = self.Q_s_tph / self.w_s

        # Усны нийт жин [т/ц]
        Q_water_mass = Q_slurry_mass - self.Q_s_tph

        # Урсгалын эзэлхүүн [м3/ц]
        Q_s_vol = self.Q_s_tph / self.rho_s
        Q_w_vol = Q_water_mass / self.rho_w

        Q_slurry_vol = Q_s_vol + Q_w_vol

        return Q_slurry_mass, Q_water_mass, Q_slurry_vol


@dataclass
class LabKinetics:
    k_lab: float      # Лабораторийн кинетикийн тогтмол [1/мин]
    R_inf: float      # Хамгийн их авалт (0-1)

    def ideal_time_for_recovery(self, R_target: float) -> float:
        """
        Compute ideal residence time (no scale-up) for target recovery.
        """
        if R_target >= self.R_inf:
            raise ValueError("R_target must be less than R_inf.")
        t_ideal = -1.0 / self.k_lab * math.log(1.0 - R_target / self.R_inf)
        return t_ideal


# ==========================================
# 2. Флотацийн машины тооцоо
# ==========================================

@dataclass
class RougherDesign:
    slurry: SlurryConditions
    kinetics: LabKinetics
    R_target: float          # Зорилтот металл авалт (0-1)
    scale_factor: float      # Лаб-аас үйлддвэрлэлд шилжих коэфф-т
    cell_volume_m3: float    # Нэг камерийн эзэлхүүн [м3]

    def design(self):
        # ---- Slurry flow ----
        Q_slurry_mass, Q_water_mass, Q_slurry_vol = self.slurry.slurry_flows()

        # ---- Time: lab -> plant ----
        t_ideal = self.kinetics.ideal_time_for_recovery(self.R_target)
        t_design = t_ideal * self.scale_factor

        # ---- Total required volume ----
        V_total = Q_slurry_vol * (t_design / 60.0)   # [m3]

        # ---- Number of cells ----
        N_cells = math.ceil(V_total / self.cell_volume_m3)
        V_installed = N_cells * self.cell_volume_m3
        t_actual = V_installed / Q_slurry_vol * 60.0  # [min]

        return {
            "Q_slurry_mass_tph": Q_slurry_mass,
            "Q_water_mass_tph": Q_water_mass,
            "Q_slurry_vol_m3ph": Q_slurry_vol,
            "t_ideal_min": t_ideal,
            "t_design_min": t_design,
            "V_total_required_m3": V_total,
            "cell_volume_m3": self.cell_volume_m3,
            "N_cells": N_cells,
            "V_installed_m3": V_installed,
            "t_actual_min": t_actual
        }


# ==================================================
# 3. Optional: first-order recovery check for a bank
# ==================================================

def bank_recovery_first_order(k: float, t_cell_min: float, N_cells: int, R_inf: float = 0.95) -> float:
    """
    Approximate recovery in a bank of N CSTRs in series
    using first-order kinetics.

    k          : rate constant [1/min]
    t_cell_min : residence time per cell [min]
    N_cells    : number of cells
    R_inf      : ultimate recovery (0-1)

    Returns:
        R_bank : total recovery (0-1)
    """
    # Single CSTR recovery (underlying form)
    # C_out/C_in = 1 / (1 + k * t_cell)
    # Overall bank: (C_out/C_in)^N
    theta = 1.0 / (1.0 + k * t_cell_min)
    C_out_over_C_in = theta ** N_cells
    R_bank = R_inf * (1.0 - C_out_over_C_in)
    return R_bank


# =======================================================================
# 4. ЖИШЭЭ: 1812 т/ц хүчин чадалтай си-мо цехийн үндсэн флотацийн тооцоо
#    хатуугийн агуулга - 32% , Зорилтот металл авалт (R_target) = 92%
# =======================================================================

if __name__ == "__main__":
    # ---- Inputs you can change ----
    Q_s_tph = 1812.0
    w_s = 0.32
    rho_s = 2.8

    R_target = 0.92         # 92% target rougher recovery
    k_lab = 0.25            # 1/min (example lab kinetic constant)
    R_inf = 0.95            # 95% ultimate
    scale_factor = 1.5      # lab -> plant scale-up
    cell_volume_m3 = 160.0  # chosen cell size

    # ---- Build objects ----
    slurry = SlurryConditions(Q_s_tph=Q_s_tph, w_s=w_s, rho_s=rho_s)
    kinetics = LabKinetics(k_lab=k_lab, R_inf=R_inf)
    rougher = RougherDesign(
        slurry=slurry,
        kinetics=kinetics,
        R_target=R_target,
        scale_factor=scale_factor,
        cell_volume_m3=cell_volume_m3
    )

    # ---- Run design ----
    results = rougher.design()

    # ---- Үр дүнг хэвлэх ----
    print("=== Cu-Mo Үндсэн флотацийн төсөл ===")
    print(f"Хүчин чадал          : {Q_s_tph:.1f} т/ц")
    print(f"Хатуугийн агуулга (%): {w_s*100:.1f} %")
    print(f"Пульпын урсгал       : {results['Q_slurry_mass_tph']:.1f} т/ц")
    print(f"Урсгал дахь ус       : {results['Q_water_mass_tph']:.1f} т/ц")
    print(f"Пульпын эзэлхүүн     : {results['Q_slurry_vol_m3ph']:.1f} m3/h")
    print()
    print(f"Лабораторийн  k      : {k_lab:.3f} 1/мин")
    print(f"Лаб. авалт  R_хяз    : {R_inf*100:.1f} %")
    print(f"Зорилтот авалт R     : {R_target*100:.1f} %")
    print(f"Флот.хугацаа         : {results['t_ideal_min']:.2f} мин")
    print(f"Флот.хугацаа (төсөл) : {results['t_design_min']:.2f} мин")
    print()
    print(f"Шаардлагатай  V      : {results['V_total_required_m3']:.1f} м3")
    print(f"Камерийн      V      : {results['cell_volume_m3']:.1f} м3")
    print(f"Камерийн тоо         : {results['N_cells']}")
    print(f"Нийт эзэлхүүн        : {results['V_installed_m3']:.1f}м3")
    print(f"Флот.хугацаа(жинхэнэ): {results['t_actual_min']:.2f} мин")
    
    

No comments:

Post a Comment