package com.ruoyi.caltools.controller;


import com.ruoyi.caltools.model.FlowProps;
import com.ruoyi.caltools.model.GasProps;

import javax.swing.*;
import java.util.Optional;

import static com.ruoyi.caltools.controller.FlowController.FlowConvert_BaseToWork;
import static com.ruoyi.caltools.controller.FlowController.YaLiSunShi;


public class DpFlowCalc {
    /**
     标准孔板流量计算
     */
    public  void OFlowCal(GasProps gasProps, FlowProps flowProps){

        flowProps.setdOrificeD(flowProps.getdOrificeD() * (1 + 0.000001 * (flowProps.getdOrificeMaterial()) * (flowProps.getdTf() - 293.15)));
        flowProps.setdPipeD(flowProps.getdPipeD() * (1 + 0.000001 * (flowProps.getdPipeMaterial()) * (flowProps.getdTf() - 293.15)));
        flowProps.setdBeta(flowProps.getdOrificeD() / flowProps.getdPipeD());
//        flowProps.setdBeta(0.5972);

        //求渐近速度系数 E
        flowProps.setdE(1 / Math.pow((1 - Math.pow(flowProps.getdBeta(), 4)), 0.5));
//    flowProps.setdE(1.0615);

        //求相对密度系数 FG
        // LiuTiType = 1
        flowProps.setdFG(Math.pow((1 / gasProps.dRD_Real), 0.5));
//    flowProps.setdFG(1.2531);
        //求流动温度系数 'FT
        flowProps.setdFT(Math.pow((293.15 / flowProps.getdTf()), 0.5));
//    flowProps.setdFT(1.0086);
        //求等熵指数?????????????????????????????????

        flowProps.setdKappa(gasProps.dKappa);
//    flowProps.setdKappa(1.357);

        //求动力粘度 dlnd
        flowProps.setdDViscosity(Dlndjs(flowProps.getdPf()/1e6, flowProps.getdTf()));
//    flowProps.setdDViscosity(0.01096);

        //求可膨胀系数
        flowProps.setdDExpCoefficient(KePenZhang_JiSuan(flowProps.getdPf() , flowProps.getdDp(), flowProps.getdBeta(), gasProps.getdKappa(), flowProps.getdCoreType(), 0));
//    flowProps.setdDExpCoefficient(0.9977);

//    gasProps.dFpv=1.0195;
//    gasProps.dHhvv=39.944;
//    gasProps.dRD_Real=0.6368;

        //迭代计算流量和流出系数

        double conQvA = 0.0000031795 * (1530000.0D * gasProps.dRD_Real / (flowProps.getdDViscosity() * flowProps.getdOrificeD())) * flowProps.getdE() * Math.pow(flowProps.getdOrificeD(), 2) * gasProps.dFpv * flowProps.getdFG() * flowProps.getdDExpCoefficient() * flowProps.getdFT() * Math.sqrt(flowProps.getdPf() * flowProps.getdDp() / 1e6);
        double[] XQv = new double[4];
        double[] CQv = new double[4];
        double[] dQv = new double[4];
        double Qn = 0;
        int n ;
        XQv[0] = 1000000.0F;
        boolean xhFlag=true;
        _100000:

        while(xhFlag) {
            for (n = 1; n <= 2; n++) {
                CQv[n] = C_JiSuan(flowProps.getdOrificeD(), flowProps.getdBeta(), XQv[n - 1], conQvA, flowProps.getdPtmode(), flowProps.getdCoreType(), 0);
                XQv[n] = conQvA * CQv[n];
                dQv[n] = XQv[n] - XQv[n - 1];
            }
            if (XQv[2] == XQv[1] || dQv[2] == dQv[1]) {
                Qn = conQvA * flowProps.getdDViscosity() * flowProps.getdOrificeD() * CQv[2] / (1530000.0D * gasProps.dRD_Real);
                //管道雷诺数
                flowProps.setdRnPipe(XQv[2]);
                //流出系数
                flowProps.setdCd(CQv[2]);

            }
            if (Math.abs((conQvA - XQv[2] / CQv[1]) / conQvA) > 0.00000000000000005) {
                XQv[0] = XQv[n - 1] - dQv[n - 1] * ((XQv[n - 1] - XQv[n - 2]) / (dQv[n - 1] - dQv[n - 2]));
//C# TO JAVA CONVERTER TODO TASK: There is no 'goto' in Java:
                continue _100000;
            }
            else
            {
                xhFlag=false;
            }
        }

        //孔板锐利度系数Bk
        flowProps.setdOrificeSharpness(1);
        if (flowProps.getdCoreType() == 0)
        {
            flowProps.setdBk((flowProps.getdOrificeSharpness() == 0) ? (BkTable(flowProps.getdOrificeRk(), flowProps.getdOrificeD(), 1)) : (flowProps.getdOrificeSharpness()));
        }
        else
        {
            flowProps.setdBk(1);
        }


        //管道粗糙度系数 Gme
        flowProps.setdRoughNessPipe(CcdXsjs(flowProps.getdPipeType(), flowProps.getdPipeD(), flowProps.getdBeta(), flowProps.getdRnPipe()));
        //修正后的流出系数
        flowProps.setdCd(flowProps.getdCd() * flowProps.getdBk() * flowProps.getdRoughNessPipe());
//        flowProps.setdCd(0.6039);
        //标况体积流量 m³、s
        flowProps.setdVFlowb(Qn * flowProps.getdBk() * flowProps.getdRoughNessPipe());
        //工况体积流量
        flowProps.setdVFlowf(FlowConvert_BaseToWork(flowProps, gasProps));
        //标况质量流量
        flowProps.setdMFlowb(flowProps.getdVFlowb() * gasProps.dRhob);
        //标况能量流量
        flowProps.setdEFlowb(flowProps.getdVFlowb() * gasProps.dHhvv);
        //管道内天然气流速
        flowProps.setdVelocityFlow(flowProps.getdVFlowf() / (3.1415926 * Math.pow((flowProps.getdPipeD() / 2000), 2)));
        //压力损失
        flowProps.setdPressLost(YaLiSunShi(flowProps.getdCd(), flowProps.getdBeta(), flowProps.getdDp(), flowProps.getdCoreType()));
    }

    /**
     * 计算管道绝对粗糙度 K (GB/T 21446-2008 附录C)
     * @param flowProps
     * @return 粗糙度修正系数 K (保留4位小数)
     */
    public  static  double calculateK(FlowProps flowProps){
        double Jdccd;
        switch (flowProps.getdPipeType()) {

            case 0:
                Jdccd = 0.029F;
                break;
            case 1:
            case 2:
            case 3:
                Jdccd = 0.075F;
                break;
            case 4:
                Jdccd = 0.1F;
                break;
            case 5:
                Jdccd = 0.15F;
                break;
            case 6:
                Jdccd = 1;
                break;
            case 7:
                Jdccd = 2.1F;
                break;
            case 8:
                Jdccd = 0.04F;
                break;
            case 9:
                Jdccd = 0.15F;
                break;
            case 10:
                Jdccd = 0.13F;
                break;
            case 11:
                Jdccd = 0.25F;
                break;
            default:
                // 处理未知类型（可选）
                throw new IllegalArgumentException("未知的管道类型: ");
        }
        return Jdccd;
    }

    /**
     * 计算管道粗糙度修正系数 G_me (GB/T 21446-2008 附录C)
     * @param D_pipe 管道内径 (mm)
     * @param K 绝对粗糙度 (mm)
     * @param C 未修正的流出系数
     * @return 粗糙度修正系数 G_me (保留4位小数)
     */
    public static double calculateRoughnessFactor(double D_pipe, double K, double C) {
        // 计算相对粗糙度 K/D
        double K_over_D = K / D_pipe;

        // 判断是否需要修正
        if (K_over_D <= 0.0004) {
            return 1.0000;
        }

        // 计算修正项
        double term = (K_over_D * 1e6) - 400; // 转换为无量纲项
        if (term < 0) {
            throw new IllegalArgumentException("K/D 超出修正公式适用范围");
        }

        double G_me = 1 + (0.011 / C) * Math.sqrt(term);
        return FormatUtil.format(G_me, Optional.of(4)); // 保留四位小数
    }

    /**
     * 热膨胀修正（GB/T 21446-2008 第6.2.1节）
     * @param flowProps 流量参数
     */
    public static void thermalExpansionCorrection(FlowProps flowProps) {
        // 孔板孔径修正
        double dOrificeMaterial = flowProps.getdOrificeMaterial(); // 材料膨胀系数 (e.g. 16e-6/℃)
        double dOrificeD = flowProps.getdOrificeD(); // 初始孔径(mm)
        double dOrificeD_corrected = dOrificeD * (1 +  0.000001*dOrificeMaterial * (flowProps.getdTf() - 293.15)); // 20℃为参考温度
        flowProps.setdOrificeD(FormatUtil.format(dOrificeD_corrected, Optional.of(2)));

        // 管道内径修正
        double dPipeMaterial = flowProps.getdPipeMaterial();
        double dPipeD = flowProps.getdPipeD();
        double dPipeD_corrected = dPipeD * (1 + 0.000001*dPipeMaterial * (flowProps.getdTf() - 293.15));
        flowProps.setdPipeD(FormatUtil.format(dPipeD_corrected,Optional.of(2)));

        // 更新直径比β
        flowProps.setdBeta( FormatUtil.format(flowProps.getdOrificeD() / flowProps.getdPipeD(),Optional.of(4)));
    }

    /**
     * 计算渐近速度系数E（GB/T 21446-2008 式(8)）
     */
    public static void calculateE(FlowProps flowProps) {
        double beta = flowProps.getdBeta();
        flowProps.setdE( FormatUtil.format(1 / Math.sqrt(1 - Math.pow(beta, 4)),Optional.of(4)));
    }

    /**
     * 计算相对密度系数FG（GB/T 21446-2008 式(9)）
     */
    public static void calculateFG(FlowProps flowProps,GasProps gasProps) {
        gasProps.setdRD_Real(gasProps.getdRD_Real());
        flowProps.setdFG( FormatUtil.format(1 / Math.sqrt(gasProps.dRD_Real),Optional.of(4)));
    }

    /**
     * 计算流动温度系数FT（GB/T 21446-2008 式(10)）
     */
    public static void calculateFT(FlowProps flowProps) {
        double Tb = flowProps.getdTb_M() ; // 参比温度转K
        double Tf = flowProps.getdTf() ;   // 工况温度转K
        flowProps.setdFT( FormatUtil.format(Math.sqrt(Tb / Tf),Optional.of(4)));
    }

    /**
     * 计算可膨胀系数ε（GB/T 21446-2008 式(11)）
     */
    public static void calculateEpsilon(FlowProps flowProps, GasProps gasProps) {
        double P1 = flowProps.getdPf();          // 上游绝对压力(Pa)
        double deltaP = flowProps.getdDp();      // 差压(Pa)
        double beta = flowProps.getdBeta();
        double kappa = flowProps.getdKappa();

        double tau =  FormatUtil.format((P1 - deltaP) / P1, Optional.of(4));         // 压力比
        double epsilon=1 - (0.351 + 0.256 * Math.pow(beta, 4) + 0.93 * Math.pow(beta, 8)) * (1 - Math.pow(tau, 1/kappa));

        flowProps.setdDExpCoefficient( FormatUtil.format(epsilon,Optional.of(4)));
    }
    /**
     * 计算等熵指数κ（GB/T 21446-2008 推荐方法）
     * @param gasProps 气体参数（需包含等熵指数或热容比）
     * @return 等熵指数κ
     */
    public static double calculateKappa(GasProps gasProps) {
        // 若已通过AGA 8或其他方法计算，直接返回
//        if (gasProps.getdKappa() > 0) {
//            return gasProps.getdKappa();
//        }

        // 近似公式：基于理想气体比热比和压缩因子修正
        double gamma = 1.3; // 天然气典型比热比（Cp/Cv≈1.3）
        double Z = gasProps.getdZf(); // 工况压缩因子

        // 修正公式（经验关系）
        double kappa = gamma / (1 - (gamma - 1) * (1 / Z - 1));
        return  FormatUtil.format(kappa,Optional.of(4));
    }



    /**
     * 迭代计算流量（GB/T 21446-2008 第7章）
     * @param flowProps 流量参数
     * @param gasProps 气体参数
     */
    public static void iterativeFlowCalculation(FlowProps flowProps, GasProps gasProps) {
        // 0. 单位转换
        double D = flowProps.getdPipeD() / 1000.0;   // 管道内径(m)
        double d = flowProps.getdOrificeD() / 1000.0; // 孔板孔径(m)
        double beta = flowProps.getdBeta();
        double P1 = flowProps.getdPf();             // 绝对压力(Pa)
        double deltaP = flowProps.getdDp();         // 差压(Pa)
        double Tf = flowProps.getdTf() ;    // 工况温度(K)

        flowProps.setdPb_M(gasProps.getdPb());
        flowProps.setdTb_M(gasProps.getdTb());
        flowProps.setdFpv(FormatUtil.format(gasProps.dFpv,Optional.of(4)));

        // 1. 计算中间参数
        calculateE(flowProps);
        calculateFG(flowProps,gasProps);
        calculateFT(flowProps);

        flowProps.setdKappa( calculateKappa(gasProps));
//        flowProps.setdDViscosity( calculateDynamicViscosity(gasProps));
        flowProps.setdDViscosity(FormatUtil.format( Dlndjs(flowProps.getdPf()/1e6,flowProps.getdTf()),Optional.of(5)));
        calculateEpsilon(flowProps, gasProps);
//
//        flowProps.setdKappa(1.357);
//        flowProps.setdBeta(0.5792);
//        flowProps.setdFpv(1.0195);
//        flowProps.setdFG(1.2531);
//        flowProps.setdE(1.0615);
//        flowProps.setdDExpCoefficient(0.9977);
//        flowProps.setdFT(1.0086);


        // 2. 初始雷诺数估算（假设初始C=0.6）
        double C_initial = 0.6;
        double Qf_initial = (C_initial * flowProps.getdE() * flowProps.getdDExpCoefficient() * Math.PI * Math.pow(d, 2) / 4)
                * Math.sqrt(2 * deltaP / (gasProps.dRhof * (1 - Math.pow(beta, 4))));
        flowProps.setdVFlowf(Qf_initial); // 初始工况流量(m³/s)

        // 3. 迭代参数
        double tolerance = 1e-6;
        int maxIter = 100;
        double currentC = C_initial;
        double currentReD = calculateReD(Qf_initial, D, gasProps.dRhof, flowProps.getdDViscosity());
        int iter = 0;
        double prevC=0;
        // 4. 迭代循环
        do {
            prevC = currentC;

            // 4.1 计算流出系数C（GB/T 21446-2008 附录A）
//            currentC =FormatUtil.format( calculateCd(beta, currentReD, flowProps.getdPipeD(), flowProps.getdPtmode()),Optional.of(4));
            currentC = calculateCd(beta, currentReD, flowProps.getdPipeD(), flowProps.getdPtmode());

            // 4.2 更新流量
//            double Qf =FormatUtil.format ((currentC  * flowProps.getdDExpCoefficient() * Math.PI * Math.pow(d, 2) / 4)
//                    * Math.sqrt(2 * deltaP / (gasProps.dRhof * (1 - Math.pow(beta, 4)))),Optional.of(4));
            double Qf =(currentC  * flowProps.getdDExpCoefficient() * Math.PI * Math.pow(d, 2) / 4)
                    * Math.sqrt(2 * deltaP / (gasProps.dRhof * (1 - Math.pow(beta, 4))));
            flowProps.setdVFlowf(Qf);

            // 4.3 更新雷诺数
//            currentReD =FormatUtil.format( calculateReD(Qf, D, gasProps.dRhof, flowProps.getdDViscosity()), Optional.of(2));
            currentReD = calculateReD(Qf, D, gasProps.dRhof, flowProps.getdDViscosity());

            iter++;
            if (iter > maxIter) {
                throw new RuntimeException("迭代未收敛，超过最大迭代次数！");
            }
        } while (Math.abs(currentC - prevC) / currentC > tolerance);
        // 5. 保存最终结果

        // 在迭代计算流出系数后，添加粗糙度修正

        double K = calculateK(flowProps); // 根据实际管道类型选择
        double G_me = calculateRoughnessFactor(flowProps.getdPipeD(), K, currentC);
        double C_corrected = FormatUtil.format(currentC * G_me, Optional.of(4));

        flowProps.setdCd(C_corrected);
        flowProps.setdRoughNessPipe(G_me);
        flowProps.setdRnPipe(currentReD);




        // 6. 计算标况流量（GB/T 21446-2008 式(1)）
        double Qn = flowProps.getdVFlowf() * (flowProps.getdFpv()*flowProps.getdFpv() * P1 / flowProps.getdPb_M())
                * (flowProps.getdTb_M()) / Tf;
        flowProps.setdVFlowb(FormatUtil.format(Qn,Optional.of(5)));

        flowProps.setdBk(1);

        //标况质量流量
        flowProps.setdMFlowb(FormatUtil.format(flowProps.getdVFlowb() * gasProps.dRhob,Optional.of(5)));
        //标况能量流量
        flowProps.setdEFlowb(FormatUtil.format(flowProps.getdVFlowb() * gasProps.dHhvv,Optional.of(5)));
        //管道内天然气流速
        flowProps.setdVelocityFlow(FormatUtil.format(flowProps.getdVFlowf() / (Math.PI * Math.pow((flowProps.getdPipeD() / 2000), 2)),Optional.of(3)));
        //压力损失
        flowProps.setdPressLost(FormatUtil.format(YaLiSunShi(flowProps.getdCd(), flowProps.getdBeta(), flowProps.getdDp(), flowProps.getdCoreType()),Optional.of(2)));

    }





    /**
     * 计算天然气动力粘度（Sutherland公式简化版，适用于低压天然气）
     * @param gasProps 气体参数（需包含温度、密度、组分）
     * @return 动力粘度 (Pa·s)
     */
    public static double calculateDynamicViscosity(GasProps gasProps) {
        double T = gasProps.getdTf() ; // 工况温度(K)
        double rho = gasProps.getdRhof();      // 工况密度(kg/m³)
        double Rd = gasProps.getdRD_Real();    // 真实相对密度

        // Sutherland常数（天然气典型值，C=120）
        double C = 120.0;                      // Sutherland常数
        double mu0 = 1.0e-5;                   // 参考粘度 (Pa·s，@293.15K)

        // 计算粘度（简化公式，忽略压力修正）
        double mu = mu0 * Math.pow(T / 293.15, 0.7) * (293.15 + C) / (T + C);

        // 密度修正（经验公式）
        mu *= 1 + 0.001 * (rho - 1.2);        // 密度对粘度的粗略修正

        return FormatUtil.format( mu*1000,Optional.of(5));
    }
    /**
     * 计算雷诺数ReD（GB/T 21446-2008 式(5)）
     */
    public static double calculateReD(double Qf, double D, double rho, double mu) {
        return  FormatUtil.format( (4 * Qf * rho*1000) / (Math.PI * D * mu),Optional.of(2)); // Qf: m³/s, D: m, rho: kg/m³, mu: Pa·s
    }

    /**
     * 计算流出系数C（GB/T 21446-2008 附录A）
     */
    public static double calculateCd(double beta, double ReD, double D_mm, int ptMode) {
        double L1, L2;
        // 根据取压方式确定L1/L2（角接取压）
        switch (ptMode) {
            case 1: // 角接取压
                L1 = L2 = 0; // D单位为mm
                break;
            case 0: // 法兰取压
                L1 = L2 = 25.4 / D_mm;
                break;
            case 2: // D-D/2取压
                L1 = 1.0;
                L2 = 0.47;
                break;
            default:
                throw new IllegalArgumentException("不支持的取压方式");
        }

        double term1 = 0.5961 + 0.0261 * Math.pow(beta, 2) - 0.216 * Math.pow(beta, 8);
        double term2 = 0.000521 * Math.pow(1e6 * beta / ReD, 0.7);
        double A = Math.pow(19000 * beta / ReD, 0.8);
        double term3 = (0.0188 + 0.0063 * A) * Math.pow(beta, 3.5) * Math.pow(1e6 / ReD, 0.3);
        double term4 = (0.043 + 0.08 * Math.exp(-10 * L1) - 0.123 * Math.exp(-7 * L1))
                * (1 - 0.11 * A) * Math.pow(beta, 4) / (1 - Math.pow(beta, 4));
        double term5 = -0.031 * (2 * L2 / (1 - beta) - 0.8 * Math.pow(2 * L2 / (1 - beta), 1.1))
                * Math.pow(beta, 1.3);

        double Cd = term1 + term2 + term3 + term4 + term5;

        // 孔径<71.12mm修正
        if (D_mm < 71.12) {
            Cd += 0.011 * (0.75 - beta) * (2.8 - D_mm / 25.4);
        }
        return  FormatUtil.format(Cd,Optional.of(4));
    }
    //查表计算粘度μ
    public static double Dlndjs(double tempP_jy, double tempT)
    {  double[][] Dlndjs_Dlnd_Data = new double[8][11];
        double[] Dlndjs_Dlnd_T = new double[8];
        double[] Dlndjs_Dlnd_P = new double[11];
        double s1 ;
        double s2 ;
        double ky ;
        double kx ;
        int i ;
        int m = 0;
        int n = 0;
        //On Error Resume Next VBConversions Warning: On Error Resume Next not supported in C#
        Dlndjs_Dlnd_T[0] = -15 + 273.15;
        Dlndjs_Dlnd_T[1] = 0 + 273.15;
        Dlndjs_Dlnd_T[2] = 15 + 273.15;
        Dlndjs_Dlnd_T[3] = 30 + 273.15;
        Dlndjs_Dlnd_T[4] = 45 + 273.15;
        Dlndjs_Dlnd_T[5] = 60 + 273.15;
        Dlndjs_Dlnd_T[6] = 75 + 273.15;
        Dlndjs_Dlnd_T[7] = 90 + 273.15;

        Dlndjs_Dlnd_P[0] = 0.1F;
        Dlndjs_Dlnd_P[1] = 1;
        Dlndjs_Dlnd_P[2] = 2;
        Dlndjs_Dlnd_P[3] = 3;
        Dlndjs_Dlnd_P[4] = 4;
        Dlndjs_Dlnd_P[5] = 5;
        Dlndjs_Dlnd_P[6] = 6;
        Dlndjs_Dlnd_P[7] = 7;
        Dlndjs_Dlnd_P[8] = 8;
        Dlndjs_Dlnd_P[9] = 9;
        Dlndjs_Dlnd_P[10] = 10;
        Dlndjs_Dlnd_Data[0][0] = 976;
        Dlndjs_Dlnd_Data[1][0] = 1027;
        Dlndjs_Dlnd_Data[2][0] = 1071;
        Dlndjs_Dlnd_Data[3][0] = 1123;
        Dlndjs_Dlnd_Data[4][0] = 1167;
        Dlndjs_Dlnd_Data[5][0] = 1213;
        Dlndjs_Dlnd_Data[6][0] = 1260;
        Dlndjs_Dlnd_Data[7][0] = 1303;
        Dlndjs_Dlnd_Data[0][1] = 991;
        Dlndjs_Dlnd_Data[1][1] = 1040;
        Dlndjs_Dlnd_Data[2][1] = 1082;
        Dlndjs_Dlnd_Data[3][1] = 1135;
        Dlndjs_Dlnd_Data[4][1] = 1178;
        Dlndjs_Dlnd_Data[5][1] = 1224;
        Dlndjs_Dlnd_Data[6][1] = 1270;
        Dlndjs_Dlnd_Data[7][1] = 1312;
        Dlndjs_Dlnd_Data[0][2] = 1014;
        Dlndjs_Dlnd_Data[1][2] = 1063;
        Dlndjs_Dlnd_Data[2][2] = 1106;
        Dlndjs_Dlnd_Data[3][2] = 1153;
        Dlndjs_Dlnd_Data[4][2] = 1196;
        Dlndjs_Dlnd_Data[5][2] = 1239;
        Dlndjs_Dlnd_Data[6][2] = 1281;
        Dlndjs_Dlnd_Data[7][2] = 1323;
        Dlndjs_Dlnd_Data[0][3] = 1044;
        Dlndjs_Dlnd_Data[1][3] = 1091;
        Dlndjs_Dlnd_Data[2][3] = 1127;
        Dlndjs_Dlnd_Data[3][3] = 1174;
        Dlndjs_Dlnd_Data[4][3] = 1216;
        Dlndjs_Dlnd_Data[5][3] = 1257;
        Dlndjs_Dlnd_Data[6][3] = 1297;
        Dlndjs_Dlnd_Data[7][3] = 1338;
        Dlndjs_Dlnd_Data[0][4] = 1073;
        Dlndjs_Dlnd_Data[1][4] = 1118;
        Dlndjs_Dlnd_Data[2][4] = 1149;
        Dlndjs_Dlnd_Data[3][4] = 1195;
        Dlndjs_Dlnd_Data[4][4] = 1236;
        Dlndjs_Dlnd_Data[5][4] = 1275;
        Dlndjs_Dlnd_Data[6][4] = 1313;
        Dlndjs_Dlnd_Data[7][4] = 1352;
        Dlndjs_Dlnd_Data[0][5] = 1114;
        Dlndjs_Dlnd_Data[1][5] = 1151;
        Dlndjs_Dlnd_Data[2][5] = 1180;
        Dlndjs_Dlnd_Data[3][5] = 1224;
        Dlndjs_Dlnd_Data[4][5] = 1261;
        Dlndjs_Dlnd_Data[5][5] = 1297;
        Dlndjs_Dlnd_Data[6][5] = 1333;
        Dlndjs_Dlnd_Data[7][5] = 1372;
        Dlndjs_Dlnd_Data[0][6] = 1156;
        Dlndjs_Dlnd_Data[1][6] = 1185;
        Dlndjs_Dlnd_Data[2][6] = 1211;
        Dlndjs_Dlnd_Data[3][6] = 1253;
        Dlndjs_Dlnd_Data[4][6] = 1287;
        Dlndjs_Dlnd_Data[5][6] = 1320;
        Dlndjs_Dlnd_Data[6][6] = 1352;
        Dlndjs_Dlnd_Data[7][6] = 1391;
        Dlndjs_Dlnd_Data[0][7] = 1207;
        Dlndjs_Dlnd_Data[1][7] = 1230;
        Dlndjs_Dlnd_Data[2][7] = 1250;
        Dlndjs_Dlnd_Data[3][7] = 1289;
        Dlndjs_Dlnd_Data[4][7] = 1318;
        Dlndjs_Dlnd_Data[5][7] = 1346;
        Dlndjs_Dlnd_Data[6][7] = 1374;
        Dlndjs_Dlnd_Data[7][7] = 1412;
        Dlndjs_Dlnd_Data[0][8] = 1261;
        Dlndjs_Dlnd_Data[1][8] = 1276;
        Dlndjs_Dlnd_Data[2][8] = 1289;
        Dlndjs_Dlnd_Data[3][8] = 1324;
        Dlndjs_Dlnd_Data[4][8] = 1350;
        Dlndjs_Dlnd_Data[5][8] = 1373;
        Dlndjs_Dlnd_Data[6][8] = 1396;
        Dlndjs_Dlnd_Data[7][8] = 1432;
        Dlndjs_Dlnd_Data[0][9] = 1331;
        Dlndjs_Dlnd_Data[1][9] = 1331;
        Dlndjs_Dlnd_Data[2][9] = 1335;
        Dlndjs_Dlnd_Data[3][9] = 1366;
        Dlndjs_Dlnd_Data[4][9] = 1385;
        Dlndjs_Dlnd_Data[5][9] = 1403;
        Dlndjs_Dlnd_Data[6][9] = 1424;
        Dlndjs_Dlnd_Data[7][9] = 1456;
        Dlndjs_Dlnd_Data[0][10] = 1405;
        Dlndjs_Dlnd_Data[1][10] = 1389;
        Dlndjs_Dlnd_Data[2][10] = 1383;
        Dlndjs_Dlnd_Data[3][10] = 1409;
        Dlndjs_Dlnd_Data[4][10] = 1421;
        Dlndjs_Dlnd_Data[5][10] = 1435;
        Dlndjs_Dlnd_Data[6][10] = 1451;
        Dlndjs_Dlnd_Data[7][10] = 1482;

        if (tempT < Dlndjs_Dlnd_T[0])
        {
            tempT = Dlndjs_Dlnd_T[0];
        }
        if (tempT > Dlndjs_Dlnd_T[7])
        {
            tempT = Dlndjs_Dlnd_T[7];
        }
        if (tempP_jy < Dlndjs_Dlnd_P[0])
        {
            tempP_jy = Dlndjs_Dlnd_P[0];
        }
        if (tempP_jy > Dlndjs_Dlnd_P[10])
        {
            tempP_jy = Dlndjs_Dlnd_P[10];
        }

        for (  i = 0; i <= 6; i++)
        {
            if (tempT >= Dlndjs_Dlnd_T[i] && tempT <= Dlndjs_Dlnd_T[i + 1])
            {
                m = i;
                break;
            }
        }

        for (i = 0; i <= 9; i++)
        {
            if (tempP_jy >= Dlndjs_Dlnd_P[i] && tempP_jy <= Dlndjs_Dlnd_P[i + 1])
            {
                n = i;
                break;
            }
        }

        if (Dlndjs_Dlnd_P[n + 1] - Dlndjs_Dlnd_P[n] != 0)
        {
            ky = (tempP_jy - Dlndjs_Dlnd_P[n]) / (Dlndjs_Dlnd_P[n + 1] - Dlndjs_Dlnd_P[n]);
        }
        else
        {
            ky = 0;
        }
        if (Dlndjs_Dlnd_T[m + 1] - Dlndjs_Dlnd_T[m] != 0)
        {
            kx = (tempT - Dlndjs_Dlnd_T[m]) / (Dlndjs_Dlnd_T[m + 1] - Dlndjs_Dlnd_T[m]);
        }
        else
        {
            kx = 0;
        }
        s1 = Dlndjs_Dlnd_Data[m][n] + (Dlndjs_Dlnd_Data[m][n + 1] - Dlndjs_Dlnd_Data[m][n]) * ky;
        s2 = Dlndjs_Dlnd_Data[m + 1][n] + (Dlndjs_Dlnd_Data[m + 1][n + 1] - Dlndjs_Dlnd_Data[m + 1][n]) * ky;
        return (s1 + (s2 - s1) * kx) / 100000.0D;
    }
    //可膨胀系数计算
    private double KePenZhang_JiSuan(double tempP_jy, double tempDp_Pa, double tempZjb, double tempDszs, int JIeliuType, int JiSuanBiaoZhun) // 求可膨胀系数
    {
        double returnValue = 0;
        //0标准孔板
        //1ISA1932喷嘴
        //2长径喷嘴
        //3文丘里喷嘴
        //4粗铸收缩段经典文丘里管
        //5机械加工收缩段经典文丘里管
        //6粗焊铁板收缩段经典文丘里管
        //7 1/4圆孔板

        double tuo ;
        switch (JIeliuType)
        {
            case 0: //孔板流量计算
                switch (JiSuanBiaoZhun)
                {
                    case 0: //6143-2004
                        tuo = (tempP_jy  - tempDp_Pa) / (tempP_jy );
                        returnValue = 1 - (0.351 + 0.256 * Math.pow(tempZjb, 4) + 0.93 * Math.pow(tempZjb, 8)) * (1 - Math.pow(tuo, (1 / tempDszs)));
                        break;
                    case 1: //6143-1996
                        returnValue = 1 - (0.41 + 0.35 * Math.pow(tempZjb, 4)) * tempDp_Pa / ( tempP_jy * tempDszs);
                        break;
                }
                break;
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
                switch (JiSuanBiaoZhun)
                {
                    case 0:
                        //标准喷嘴  iso5167-2002
                        tuo = (tempP_jy  - tempDp_Pa) / (tempP_jy );
                        returnValue = Math.pow((((tempDszs * Math.pow(tuo, (2 / tempDszs))) / (tempDszs - 1)) * ((1 - Math.pow(tempZjb, 4)) / (1 - Math.pow(tempZjb, 4) * Math.pow(tuo, (2 / tempDszs)))) * ((1 - Math.pow(tuo, ((tempDszs - 1) / tempDszs))) / (1 - tuo))), 0.5);
                        break;

                    case 1: //iso5167-93
                        returnValue = 1 - (0.41 + 0.35 * Math.pow(tempZjb, 4)) * tempDp_Pa / (  tempP_jy * tempDszs);
                        break;
                }
                break;
            case 7: //1/4圆孔板
                returnValue = 1 - (0.41 + 0.35 * Math.pow(tempZjb, 4)) * tempDp_Pa / (  tempP_jy  * tempDszs);
                break;
            case 8: //锥形入口孔板
                tuo = (tempP_jy  - tempDp_Pa) / (tempP_jy );
                returnValue = 1 - (0.351 + 0.256 * Math.pow(tempZjb, 4) + 0.93 * Math.pow(tempZjb, 8)) * (1 - Math.pow(tuo, (1 / tempDszs)));

                tuo = (tempP_jy  - tempDp_Pa) / (tempP_jy );

                returnValue = 0.5 * (returnValue + Math.pow((((tempDszs * Math.pow(tuo, (2 / tempDszs))) / (tempDszs - 1)) * ((1 - Math.pow(tempZjb, 4)) / (1 - Math.pow(tempZjb, 4) * Math.pow(tuo, (2 / tempDszs)))) * ((1 - Math.pow(tuo, ((tempDszs - 1) / tempDszs))) / (1 - tuo))), 0.5));
                break;
            case 9: //偏心孔板
                returnValue = 1 - (0.41 + 0.35 * Math.pow(tempZjb, 4)) * tempDp_Pa / ( tempP_jy * tempDszs);
                break;

        }
        return returnValue;
    }
    //流出系数计算
    public final double C_JiSuan(double tempGj, double tempZjb, double tempReD, double tempconQvA, int tempQyfs, int JieLiuType, int JiSuanBiaoZhun)
    {
        double returnValue = 0;
        //流出系数计算函数
        //输入：直径比，雷诺数，取压方式，节流装置类型，计算采用标准
        //输出:流出系数

        //jieliutype

        //0标准孔板
        //1ISA1932喷嘴
        //2长径喷嘴
        //3文丘里喷嘴
        //4粗铸收缩段经典文丘里管
        //5机械加工收缩段经典文丘里管
        //6粗焊铁板收缩段经典文丘里管

        double L1 = 0;
        double L2 = 0;
        switch (JieLiuType)
        {
            case 0: //孔板
                switch (tempQyfs)
                {
                    case 0:
                        L1 = 25.4 / tempGj;
                        L2 = L1;
                        break;
                    case 1:
                        L1 = 0;
                        L2 = 0;
                        break;
                    case 2:
                        L1 = 1;
                        L2 = 0.47F;
                        break;
                }
                switch (JiSuanBiaoZhun)
                {
                    case 0: //6143-2004
                        if (tempGj >= 71.12)
                        {
                            returnValue = 0.5961 + 0.0261 * Math.pow(tempZjb, 2) - 0.216 * Math.pow(tempZjb, 8) + 0.000521 * Math.pow((1000000.0D * tempZjb / tempReD), 0.7) + (0.0188 + 0.0063 * Math.pow((19000 * tempZjb / tempReD), 0.8)) * Math.pow(tempZjb, 3.5) * Math.pow((1000000.0D / tempReD), 0.3) + (0.043 + 0.08 * Math.exp(-10 * L1) - 0.123 * Math.exp(-7 * L1)) * (1 - 0.11 * Math.pow((19000 * tempZjb / tempReD), 0.8)) * (Math.pow(tempZjb, 4) * Math.pow((1 - Math.pow(tempZjb, 4)), (-1))) - 0.031 * (2 * L2 / (1 - tempZjb) - 0.8 * Math.pow((2 * L2 / (1 - tempZjb)), 1.1)) * Math.pow(tempZjb, 1.3);
                        }
                        else if (tempGj < 71.12)
                        {
                            returnValue = (0.5961 + 0.0261 * Math.pow(tempZjb, 2) - 0.216 * Math.pow(tempZjb, 8) + 0.000521 * Math.pow((1000000.0D * tempZjb / tempReD), 0.7) + (0.0188 + 0.0063 * Math.pow((19000 * tempZjb / tempReD), 0.8)) * Math.pow(tempZjb, 3.5) * Math.pow((1000000.0D / tempReD), 0.3) + (0.043 + 0.08 * Math.exp(-10 * L1) - 0.123 * Math.exp(-7 * L1)) * (1 - 0.11 * Math.pow((19000 * tempZjb / tempReD), 0.8)) * Math.pow(tempZjb, 4) * Math.pow((1 - Math.pow(tempZjb, 4)), (-1)) - 0.031 * (2 * L2 / (1 - tempZjb) - 0.8 * Math.pow((2 * L2 * (1 - tempZjb)), 1.1)) * Math.pow(tempZjb, 1.3) + 0.011 * (0.75 - tempZjb) * (2.8 - tempGj / 25.4));
                        }
                        break;
                    case 1: //6143-1996
                        if (0.09 * L1 >= 0.039)
                        {
                            returnValue = 0.5959 + 0.0312 * Math.pow(tempZjb, (2.1)) - 0.184 * Math.pow(tempZjb, 8) + 0.0029 * Math.pow(tempZjb, 2.5) * Math.pow((1000000.0D / tempReD), 0.75) + 0.039 * Math.pow(tempZjb, 4) * Math.pow((1 - Math.pow(tempZjb, 4)), (-1)) - 0.0337 * L1 * Math.pow(tempZjb, 3);
                        }
                        else if (0.09 * L1 < 0.039)
                        {
                            returnValue = (0.5959 + 0.0312 * Math.pow(tempZjb, (2.1)) - 0.184 * Math.pow(tempZjb, 8) + 0.0029 * Math.pow(tempZjb, 2.5) * Math.pow((1000000.0D / tempReD), 0.75) + 0.09 * L1 * Math.pow(tempZjb, 4) * Math.pow((1 - Math.pow(tempZjb, 4)), (-1)) - 0.0337 * L1 * Math.pow(tempZjb, 3));
                        }
                        break;
                }
                break;
            case 1: //ISA1932喷嘴
                returnValue = (0.99 - 0.2262 * Math.pow(tempZjb, 4.1) - (0.00175 * Math.pow(tempZjb, 2) - 0.0033 * Math.pow(tempZjb, 4.15)) * (1000000.0D / Math.pow(tempReD, 1.15)));
                break;

            case 2: //长径喷嘴
                returnValue = (0.9965 - 0.00653 * Math.pow(tempZjb, 0.5) * Math.pow((1000000.0D / tempReD), 0.5));
                break;
            case 3: //文丘里喷嘴
                returnValue = (0.9858 - 0.196 * Math.pow(tempZjb, 4.5));
                break;
            case 4: //粗铸收缩段经典文丘里管
                returnValue = (0.984F);
                break;
            case 5: //机械加工收缩段经典文丘里管
                returnValue = (0.995F);
                break;
            case 6: //粗焊铁板收缩段经典文丘里管
                returnValue = (0.985F);
                break;
            case 7: //1/4圆孔板
                returnValue = 0.73823 - 0.3309 * tempZjb - 1.1615 * Math.pow(tempZjb, 2) + 1.5084 * Math.pow(tempZjb, 3);
                break;
            case 8: //锥形入口孔板
                returnValue = (0.734F);
                break;
            case 9: //偏心孔板
                returnValue = 0.9355 - 1.6889 * tempZjb + 3.0428 * Math.pow(tempZjb, 2) - 1.7989 * Math.pow(tempZjb, 3);
                break;
        }
        double tempRed1 ;
        switch (JieLiuType)
        {
            case 0: //孔板流量计算
                tempRed1 = tempconQvA * returnValue;
                switch (JieLiuType)
                {
                    case 0:
                        if (tempRed1 < (170 * Math.pow(tempZjb, 2) * tempGj))
                        {
                            JOptionPane.showMessageDialog(null, "雷诺数超过标准孔板的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                            return returnValue;
                        }
                        break;
                    case 1:
                        if (tempZjb >= 0.1 & tempZjb <= 0.56)
                        {
                            if (tempRed1 < 5000)
                            {
                                JOptionPane.showMessageDialog(null, "雷诺数超过标准喷嘴的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                                return returnValue;
                            }
                        }
                        if (tempZjb > 0.56)
                        {
                            if (tempRed1 < (16000 * Math.pow(tempZjb, 2) * tempGj))
                            {
                                JOptionPane.showMessageDialog(null, "雷诺数超过标准喷嘴的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                                return returnValue;
                            }
                        }
                        break;
                }
                break;

            case 1: //标准喷嘴
                tempRed1 = tempconQvA * returnValue;
                if (tempZjb >= 0.3 & tempZjb < 0.44)
                {
                    if (tempRed1 < 70000 | tempRed1 > 10000000.0D)
                    {
                        JOptionPane.showMessageDialog(null, "雷诺数超过标准喷嘴的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                    }
                }
                if (tempZjb >= 0.44 & tempZjb < 0.8)
                {
                    if (tempRed1 < 20000 | tempRed1 > 10000000.0D)
                    {
                        JOptionPane.showMessageDialog(null, "雷诺数超过标准喷嘴的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                    }
                }
                break;
            case 2: //长径喷嘴
                tempRed1 = tempconQvA * returnValue;
                if (tempRed1 < 10000.0D | tempRed1 > 10000000.0D)
                {
                    JOptionPane.showMessageDialog(null, "雷诺数超过长径喷嘴的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                }
                break;
            case 3: //文丘里喷嘴
                tempRed1 = tempconQvA * returnValue;
                if (tempRed1 < 150000.0D | tempRed1 > 2000000.0D)
                {
                    JOptionPane.showMessageDialog(null, "雷诺数超过文丘里喷嘴的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                }
                break;
            case 4: //粗铸收缩段经典文丘里管
                tempRed1 = tempconQvA * returnValue;
                if (tempRed1 < 200000.0D | tempRed1 > 2000000.0D)
                {
                    JOptionPane.showMessageDialog(null, "雷诺数超过粗铸收缩段经典文丘里管的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                    return returnValue;
                }
                break;
            case 5: //机械加工收缩段经典文丘里管
                tempRed1 = tempconQvA * returnValue;
                if (tempRed1 < 200000.0D | tempRed1 > 1000000.0D)
                {
                    JOptionPane.showMessageDialog(null, "雷诺数超过机械加工收缩段经典文丘里管的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                }
                break;
            case 6: //粗焊铁板收缩段经典文丘里管
                tempRed1 = tempconQvA * returnValue;
                if (tempRed1 < 200000.0D | tempRed1 > 2000000.0D)
                {
                    JOptionPane.showMessageDialog(null, "雷诺数超过粗焊铁板收缩段经典文丘里管的使用范围！停止计算！", "提示", JOptionPane.PLAIN_MESSAGE);
                }
                break;

            //标准孔板
            //ISA1932喷嘴
            //长径喷嘴
            //文丘里喷嘴
            //粗铸收缩段经典文丘里管
            //机械加工收缩段经典文丘里管
            //粗焊铁板收缩段经典文丘里管




        }
        return returnValue;
    }

    private static double BkTable(double temPrk, double tempKj, int tempBkjsff) {
        double[] BkTable_x = new double[10];
        double[] BkTable_Y = new double[10];
        //On Error Resume Next VBConversions Warning: On Error Resume Next not supported in C#
        if (tempBkjsff == 1) {
            double tempRkBiKj = temPrk / tempKj;
            // static double[] x = new double[10]; //VBConversions Note: Static variable moved to class level and renamed BkTable_x. Local static variables are not supported in C#.
            // static double[] Y = new double[10]; //VBConversions Note: Static variable moved to class level and renamed BkTable_Y. Local static variables are not supported in C#.
            int i;
            int xIndex = 0;
            //If x(0) = 0 Then
            BkTable_x[0] = 0.0004F;
            BkTable_x[1] = 0.001F;
            BkTable_x[2] = 0.002F;
            BkTable_x[3] = 0.004F;
            BkTable_x[4] = 0.006F;
            BkTable_x[5] = 0.008F;
            BkTable_x[6] = 0.01F;
            BkTable_x[7] = 0.012F;
            BkTable_x[8] = 0.014F;
            BkTable_x[9] = 0.015F;

            BkTable_Y[0] = 1;
            BkTable_Y[1] = 1.005F;
            BkTable_Y[2] = 1.012F;
            BkTable_Y[3] = 1.022F;
            BkTable_Y[4] = 1.032F;
            BkTable_Y[5] = 1.04F;
            BkTable_Y[6] = 1.048F;
            BkTable_Y[7] = 1.055F;
            BkTable_Y[8] = 1.062F;
            BkTable_Y[9] = 1.065F;
            //End If

            if (tempRkBiKj <= 0.0004) {
                return 1;
            }
            if (tempRkBiKj > 0.015) {
                return 1.065F;
            }
            for (i = 0; i <= 8; i++) {
                if (tempRkBiKj >= BkTable_x[i] && tempRkBiKj <= BkTable_x[i + 1]) {
                    xIndex = i;
                    break;
                }
            }
            return BkTable_Y[xIndex] + (tempRkBiKj - BkTable_x[xIndex]) * (BkTable_Y[xIndex + 1] - BkTable_Y[xIndex]) / (BkTable_x[xIndex + 1] - BkTable_x[xIndex]);
        }
        return 0;
    }
    //管道粗糙度计算
    private double CcdXsjs(double tempPipeType, double tempGj, double tempZjb, double TempRed)
    {
        double returnValue ;
        //粗糙度系数计算
        double Jdccd = 0; //绝对粗糙度
        double Xdccd ; //相对粗糙度
        //Dim CcdXs As single
        double s1 ;
        double s2 ;
        double ky ;
        double kx ;
        int i ;
        int m = 0;
        int n = 0;
        if (tempPipeType == 0)
        {
            Jdccd = 0.029F;}
        else if (tempPipeType == 1)
        {
            Jdccd = 0.075F;
        }
        else if (tempPipeType == 2)
        {
            Jdccd = 0.075F;
        }
        else if (tempPipeType == 3)
        {
            Jdccd = 0.075F;
        }
        else if (tempPipeType == 4)
        {
            Jdccd = 0.1F;
        }
        else if (tempPipeType == 5)
        {
            Jdccd = 0.15F;
        }
        else if (tempPipeType == 6)
        {
            Jdccd = 1;
        }
        else if (tempPipeType == 7)
        {
            Jdccd = 2.1F;
        }
        else if (tempPipeType == 8)
        {
            Jdccd = 0.04F;
        }
        else if (tempPipeType == 9)
        {
            Jdccd = 0.15F;
        }
        else if (tempPipeType == 10)
        {
            Jdccd = 0.13F;
        }
        else if (tempPipeType == 11)
        {
            Jdccd = 0.25F;
        }
        Xdccd = tempGj / Jdccd;
        if (Xdccd < 400)
        {
            JOptionPane.showMessageDialog(null, "粗糙度取得太高,粗略计算", "提示", JOptionPane.PLAIN_MESSAGE);
            Xdccd = 400;
        }
        if (Xdccd >= 3400)
        {
            Xdccd = 3400;
        }

        if (Xdccd < 3200 & Math.pow(tempZjb, 2) > 0.1 & Math.pow(tempZjb, 2) < 0.64)
        {

            int[] Xdccdb = new int[10];
            double[] Btf = new double[8];
            double[][] CcdXsb = new double[10][8];

            Xdccdb[0] = 400;
            Xdccdb[1] = 800;
            Xdccdb[2] = 1200;
            Xdccdb[3] = 1600;
            Xdccdb[4] = 2000;
            Xdccdb[5] = 2400;
            Xdccdb[6] = 2800;
            Xdccdb[7] = 3200;
            Xdccdb[8] = 3400;

            Btf[0] = 0.1F;
            Btf[1] = 0.2F;
            Btf[2] = 0.3F;
            Btf[3] = 0.4F;
            Btf[4] = 0.5F;
            Btf[5] = 0.6F;
            Btf[6] = 0.64F;

            CcdXsb[0][0] = 1.002;
            CcdXsb[1][0] = 1;
            CcdXsb[2][0] = 1;
            CcdXsb[3][0] = 1;
            CcdXsb[4][0] = 1;
            CcdXsb[5][0] = 1;
            CcdXsb[6][0] = 1;
            CcdXsb[7][0] = 1;
            CcdXsb[8][0] = 1;
            CcdXsb[0][1] = 1.003;
            CcdXsb[1][1] = 1.002;
            CcdXsb[2][1] = 1.001;
            CcdXsb[3][1] = 1;
            CcdXsb[4][1] = 1;
            CcdXsb[5][1] = 1;
            CcdXsb[6][1] = 1;
            CcdXsb[7][1] = 1;

            CcdXsb[0][2] = 1.006;
            CcdXsb[1][2] = 1.004;
            CcdXsb[2][2] = 1.002;
            CcdXsb[3][2] = 1.001;
            CcdXsb[4][2] = 1;
            CcdXsb[5][2] = 1;
            CcdXsb[6][2] = 1;
            CcdXsb[7][2] = 1;

            CcdXsb[0][3] = 1.009;
            CcdXsb[1][3] = 1.006;
            CcdXsb[2][3] = 1.004;
            CcdXsb[3][3] = 1.002;
            CcdXsb[4][3] = 1.001;
            CcdXsb[5][3] = 1;
            CcdXsb[6][3] = 1;
            CcdXsb[7][3] = 1;

            CcdXsb[0][4] = 1.014;
            CcdXsb[1][4] = 1.009;
            CcdXsb[2][4] = 1.006;
            CcdXsb[3][4] = 1.004;
            CcdXsb[4][4] = 1.002;
            CcdXsb[5][4] = 1.001;
            CcdXsb[6][4] = 1;
            CcdXsb[7][4] = 1;

            CcdXsb[0][5] = 1.02;
            CcdXsb[1][5] = 1.013;
            CcdXsb[2][5] = 1.009;
            CcdXsb[3][5] = 1.006;
            CcdXsb[4][5] = 1.003;
            CcdXsb[5][5] = 1.002;
            CcdXsb[6][5] = 1;
            CcdXsb[7][5] = 1;

            CcdXsb[0][6] = 1.024;
            CcdXsb[1][6] = 1.016;
            CcdXsb[2][6] = 1.011;
            CcdXsb[3][6] = 1.007;
            CcdXsb[4][6] = 1.004;
            CcdXsb[5][6] = 1.002;
            CcdXsb[6][6] = 1.002;
            CcdXsb[7][6] = 1;


            for (i = 0; i <= 8; i++)
            {
                if (Xdccd >= Xdccdb[i] && Xdccd <= Xdccdb[i + 1])
                {
                    m = i;
                    break;
                }
            }
            for (i = 0; i <= 6; i++)
            {
                if (Math.pow(tempZjb, 2) >= Btf[i] && Math.pow(tempZjb, 2) <= Btf[i + 1])
                {
                    n = i;
                    break;
                }
            }

            ky = (Btf[n + 1] - Btf[n] != 0) ? ((Math.pow(tempZjb, 2) - Btf[n]) / (Btf[n + 1] - Btf[n])) : 0;

            kx = (Xdccdb[m + 1] - Xdccdb[m] != 0) ? ((Xdccd - Xdccdb[m]) / (Xdccdb[m + 1] - Xdccdb[m])) : 0;

            s1 = CcdXsb[m][n] + (CcdXsb[m][n + 1] - CcdXsb[m][n]) * ky;
            s2 = CcdXsb[m + 1][n] + (CcdXsb[m + 1][n + 1] - CcdXsb[m + 1][n]) * ky;
            returnValue = s1 + (s2 - s1) * kx;

            returnValue = TempRed > 1000000.0 ? returnValue : ((returnValue - 1) * Math.pow((Math.log10(TempRed) / 2), 2) + 1);

        }
        else
        {
            returnValue = 1;
        }
        return returnValue;
    }
}
