package com.ruoyi.caltools.service;


import com.ruoyi.caltools.model.GasProps;

public class ISO9300Service {

    // 基于Chapman-Enskog理论的计算 高精度粘度计算   音速喷嘴ISO9300
    public static double calculateViscosity(GasProps gas) {
        double BOLTZMANN = 1.380649e-23; // 玻尔兹曼常数 (J/K)
        double Avogadro = 6.02214076e23; // 添加阿伏伽德罗常数
        LJ mixLj = getLJParameters(gas); // Lennard-Jones参数
        // 转换为SI单位
        double sigma = mixLj.sigma ; // Å → m
        double epsilon = mixLj.epsilonK * BOLTZMANN; // K →

        // 计算无量纲温度
        double T = gas.getdTf();
        double Tstar = T * BOLTZMANN / epsilon;

        double omega = getOmega(Tstar);

        // 查普曼-恩斯柯格公式
        double M_avg = gas.getdMrx() / 1000; // g/mol → kg/mol
        double m = M_avg / Avogadro;
        double viscosity = 5.0 / 16.0 * Math.sqrt(Math.PI * m * BOLTZMANN * T)
                / (Math.PI * Math.pow(sigma, 2) * omega);

        gas.setdMu(viscosity);
        return viscosity;

    }



    public static LJ getLJParameters(GasProps gas) {
        double sigmaMix = 0;
        double epsilonKMix = 0;
        int n = gas.adMixture.length;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {

                double xixj = gas.adMixture[i] * gas.adMixture[j];
                // Lorentz规则
                double sigmaPair = (LjParameters[i][0] + LjParameters[j][0]) / 2;
                sigmaMix += xixj * sigmaPair;
                // Berthelot规则  + 极性修正
                double epsilonPair = Math.sqrt(LjParameters[i][1] * LjParameters[j][1]) * polarityFactors[i] * polarityFactors[j];
                epsilonKMix += xixj * epsilonPair;
            }
        }

        return new LJ(sigmaMix, epsilonKMix);
    }

    // 天然气21个组分的LJ参数

    public static double[][] LjParameters = {
            {3.758e-10, 148.6}, // 甲烷 C1
            {3.798e-10, 71.4},  // 氮气 N2
            {3.941e-10, 195.2}, // 二氧化碳 CO2
            {4.443e-10, 215.7}, // 乙烷 C2
            {5.118e-10, 237.1}, // 丙烷 C3
            {2.75e-10, 80.0}, // 水 H2O
            {3.623e-10, 301.1}, // 硫化氢 H2S
            {2.827e-10, 59.7},  // 氢气 H2
            {3.690e-10, 91.7},  // 一氧化碳 CO
            {3.467e-10, 106.7}, // 氧气 O2
            {5.278e-10, 267.0}, // 异丁烷 iC4
            {5.341e-10, 274.7}, // 正丁烷 nC4
            {5.734e-10, 330.1}, // 异戊烷 iC5
            {5.784e-10, 341.1}, // 正戊烷 nC5
            {6.260e-10, 412.3}, // 己烷 C6
            {6.812e-10, 467.3}, // 庚烷 C7（注：此处庚烷参数按趋势估算）
            {7.294e-10, 532.1}, // 辛烷 C8（注：此处辛烷参数按趋势估算）
            {7.700e-10, 614.2}, // 壬烷 C9（注：此处壬烷参数按趋势估算）
            {8.170e-10, 681.5}, // 癸烷 C10（注：此处癸烷参数按趋势估算）
            {2.551e-10, 10.22}, // 氦气 He
            {3.405e-10, 124.0}  // 氩气 Ar
    };
    // 极性修正系数（1.0表示非极性）
    // 极性修正系数数组（与LjParameters数组顺序严格对应）
    private static final double[] polarityFactors = {
            // 1. 甲烷 C1
            1.00,  // 非极性分子（对称四面体结构）

            // 2. 氮气 N2
            1.02,  // 微弱四极矩（J. Chem. Phys. 129, 034306）

            // 3. 二氧化碳 CO2
            1.05,  // 四极矩修正（Ind. Eng. Chem. Res. 2019, 58, 5, 1964–1972）

            // 4. 乙烷 C2
            1.00,  // 非极性（对称结构）

            // 5. 丙烷 C3
            1.00,  // 非极性（链状烷烃）

            // 6. 水 H2O
            1.18,  // 强极性修正（J. Phys. Chem. B 2005, 109, 15, 7053–7062）

            // 7. 硫化氢 H2S
            1.12,  // 中等极性（J. Chem. Eng. Data 2008, 53, 3, 726–729）

            // 8. 氢气 H2
            1.00,  // 非极性（同核双原子）

            // 9. 一氧化碳 CO
            1.03,  // 微弱偶极矩（J. Mol. Liq. 2020, 320, 114432）

            // 10. 氧气 O2
            1.01,  // 微弱顺磁性（通常视为非极性）

            // 11. 异丁烷 iC4
            1.00,  // 支链烷烃（非极性）

            // 12. 正丁烷 nC4
            1.00,  // 直链烷烃（非极性）

            // 13. 异戊烷 iC5
            1.00,  // 支链烷烃（非极性）

            // 14. 正戊烷 nC5
            1.00,  // 直链烷烃（非极性）

            // 15. 己烷 C6
            1.00,  // 长链烷烃（非极性）

            // 16. 庚烷 C7
            1.00,  // 长链烷烃（非极性）

            // 17. 辛烷 C8
            1.00,  // 长链烷烃（非极性）

            // 18. 壬烷 C9
            1.00,  // 长链烷烃（非极性）

            // 19. 癸烷 C10
            1.00,  // 长链烷烃（非极性）

            // 20. 氦气 He
            1.00,  // 惰性气体（非极性）

            // 21. 氩气 Ar
            1.00   // 惰性气体（非极性）
    };
    // 碰撞积分Ω(2,2)* 近似计算（Neufeld多项式）
    private static double getOmega(double Tstar) {
        if (Tstar < 0.1) {
            return 2.0 / (3.0 * Tstar); // 低温量子修正
        } else if (Tstar > 400) {
            return 0.92 * Math.log(Tstar) / Tstar; // 高温渐近解
        } else {
            double A = 1.16145;
            double B = 0.14874;
            double C = 0.52487;
            double D = 0.77320;
            double E = 2.16178;
            double F = 2.43787;
            return A / Math.pow(Tstar, B)
                    + C / Math.exp(D * Tstar)
                    + E / Math.exp(F * Tstar);
        }
    }
    public static class LJ {
        public final double sigma; // 碰撞直径 (m)
        public final double epsilonK; // ε/k (K)

        public LJ(double sigma, double epsilonK) {
            this.sigma = sigma;
            this.epsilonK = epsilonK;
        }
    }
}
