package com.huatek.busi.util;


import java.math.BigDecimal;
import java.math.RoundingMode;

public class CableFormulaCal {

    /**
     * 计算电缆载流能力
     * @param temp 高于环境温度的导体温升（光纤测温温度—环境温度）
     * R 最高工作温度下导体单位长度的交流电阻，Ω
     * Wd 导体绝缘单位长度的介质损耗
     * T1 一根导体和金属套之间单位长度的热阻
     * T2 内衬层与填料热阻 ==0.0212
     * T3 外护套单位长度热阻==0.1123
     * T4 电缆表面和周围媒质之间单位长度热阻==0.3247
     * @return Double
     * 计算公式：
     */
    public Double calcCurrent(double temp) {
        double n = 1d;
        double R = this.calcR();
        double Wd = this.calcWd();
        double T1 = this.calcT1();
        double T2 = Constant.T2;
        double T3 = Constant.T3;
        double T4 = Constant.T4;
        double rate1 = Constant.RATE_1;
        double rate2 = Constant.RATE_2;
        double up = temp - Wd * ((0.5d * T1) + n * (T2 + T3 + T4));
        double down = (R * T1) + (n * R * (1d + rate1) * T2) + (n * R * (1d + rate1 + rate2) * (T3 + T4));
        double result = Math.sqrt(up/down);
        return new BigDecimal(result).setScale(4, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 计算电缆载流能力
     * @return Double
     */
    public Double calcR(){
        double r1 = (1.7241 * (Math.pow(10d,-8))) * (1 + 0.00393 * (90 - 20));
        double x = ((8d * Math.PI * 50d)/r1) * (Math.pow(10d,-7)) * 1d;
        double ys = Math.pow(x,2)/(192 + 0.8 * Math.pow(x,2));
        double yp = 0d;
        double r = r1 * (1 + ys +yp);
        return new BigDecimal(r).setScale(16, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 单位长度电缆电容 (F/m）
     * 计算公式 (e/18ln(Di/Dc)) *10^-9
     * @return Double
     */
    public Double calcC(){
        double e = 3d;
        double di = 0.0447d;
//        double di = 0.058d;
        double dc = 0.0342d;
//        double dc = 0.035d;
        double x = Math.log(di/dc);
        double c = (e/(18d * x)) * (Math.pow(10d,-9));
        return new BigDecimal(c).setScale(16, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 单位长度电缆电容 (F/m）
     * 计算公式 2πf * c * u^2 * tan\delta
     * @return Double
     */
    public Double calcWd(){
        double f = 50d;
        double u = 380d;
//        double u = 500000d;
        double tan = 0.04d;
        double c = this.calcC();
        double wd = 2d * Math.PI * f * c * Math.pow(u,2) * tan;
        return new BigDecimal(wd).setScale(8, RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 计算一根导体和金属套之间单位长度的热阻
     * 计算公式 (eT/2π) * ln(1+2t1/dc)
     * @return Double
     */
    public Double calcT1(){
        double eT = 3.5d;
        double dc = 35d;
        double t1 = 50d;
        double T1 = (eT/(2 * Math.PI)) * Math.log(1 + (2 * (t1/dc)));
        return new BigDecimal(T1).setScale(4, RoundingMode.HALF_UP).doubleValue();
    }

//    /**
//     * 内衬及填料热阻计算取值==0.0212
//     * 计算内衬层与填料热阻
//     * 计算公式 (eT/6π) * G
//     * @return Double
//     */
//    public Double calcT2(){
//        double eT = 5d;
//        double g = 0.08;
//        double T2 = (eT/(6 * Math.PI)) * g;
//        return new BigDecimal(T2).setScale(4, RoundingMode.HALF_UP).doubleValue();
//    }
//
//    /**
//     * 外护套热阻计算取值==0.1123
//     * 计算外护套热阻
//     * 计算公式 (eT3/2π) * ln{(Doc +2 * t3)/[(Doc + Dit)/2 + ts]}
//     * @return Double
//     */
//    public Double calcT3( double Doc, double Dit){
//        double eT3 = 6d;
//        double t3 = 7d;
//        double ts = 3.5d;
//        double a = Doc + 2 * t3;
//        double b = (Doc + Dit)/2 + ts;
//        double T3 = (eT3/(2 * Math.PI)) * Math.log(a/b);;
//        return new BigDecimal(T3).setScale(4, RoundingMode.HALF_UP).doubleValue();
//    }
//
//    /**
//     * 周围媒质热阻取值==0.3247
//     * 计算周围媒质热阻取值
//     * 计算公式 T4' + T4''
//     * T4‘‘=（ρT /2π）{ln[u+（u2-1）1/2]+ln[1+(2L/s1)2]}===取值==0 由于电缆不埋入地下，此值=0
//     * @return Double
//     */
//    public Double calcT4( double dc){
//        double a = 5.2d;
//        double b = 1.1d;
//        double c = 0.011d;
//        double temp = 27d;
//        double eT = 0.6;
//        double l =1200;
//        double s1 = 1000;
//        double de = 3000;
//        double down = 1 + (0.1 * (b + c * temp) * dc);
//        double T41 = a/down;
//        double u = 2 * (l/de);
////        double T42 = (eT/(2 * Math.PI)) * (Math.log(u + Math.pow((Math.pow(u,2) - 1),0.50) + Math.log(1 + Math.pow((2 * l/s1),2))));
//        double T42 = 0d;
//        double T4 = T41 + T42;
//        return new BigDecimal(T4).setScale(4, RoundingMode.HALF_UP).doubleValue();
//    }
}
