/**************************************************************************** ** ** Copyright (C) 2019 Minnesota Department of Transportation ** Office of Materials & Road Research ** 1400 Gervais Avenue ** Saint Paul, Minnesota 55109-2044 ** USA ** http://www.dot.state.mn.us/materials/pvmtdesign/software.html ** ** ** $QT_BEGIN_LICENSE:GPL$ ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** If you did not receive a copy of the GNU General Public License ** see http://www.gnu.org/licenses ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef CALC_H #define CALC_H #include #include const int SPRINGDUR = 14; const int SIGFIG = 4; const int MNDEC = 4; // renamed from MAXDEC which is defined as 6 in globals const double H_EXP = 5.; // KF1 exponent for fatigue in thin pavements // Unit conversion factors not in globals const double MPH_F = 0.3125; // convert mph to frequency for Witczak eqn. const double PIX_MI = 1.22; // convert pixels to miles on MN map const int DEC_P = 0; // formerly P_DEC const int DEC_POI = 2; // POI_DEC const int DEC_R = 0; // R_DEC const int DEC_DCP = 0; // DCP_DEC const int DEC_CBR = 0; // CBR_DEC const int DEC_CV = 0; // CV_DEC const int DEC_WT = 0; // LB_DEC const int FIG_WT = 3; // LB_FIG const int FIG_E = 3; // E_FIG const int DEC_PCT = 2; // PCT_DEC const int FIG_DAM = 3; // DAM_FIG const int DEC_UE = 1; // UE_DEC const int DEC_N = 1; // N_DEC const int DEC_REL = 1; // REL_DEC const int DEC_RF = 1; // RF_DEC // Rigid pavement design const long MAX_TRUCKS = 2147483647; // data limit in damage.exe const double MAX_H = 12.1; // value to show when h exceeds 12" // Increment values for UpDown controls const double INCR_IN1 = 0.5; //AC_INCR_IN const double INCR_MM1 = 10.; // AC_INCR_MM const double INCR_IN = 1.; // OTHER_INCR_IN const double INCR_MM = 25.; // OTHER_INCR_MM // SI UNITS // Load and Eval const int ESAL = 8; // index const int CUSTOM = 9; // index // Minimum and Maximum values const double X_SPACE_IN = 13.5; const double Y_SPACE_IN = 54.0; const double X_MIN_IN = 6.0; const double Y_MIN_IN = 18.0; const double X_MAX_IN = 36.0; const double Y_MAX_IN = 120.0; const double P_MIN_PSI = 25.0; const double P_MAX_PSI = 250.0; const double WT_MIN_LB = 1.0; const double WT_MAX_LB = 100.0; const double ESAL_KIP = 18.0; const double MN3AXLE = 0.35; // Proportion of 3-axle semis in FWHA Type 8 // Temperature const double TA_MIN_F = -20.0; const double TA_MAX_F = 120.0; const double T_MIN_F = -25.0; const double T_MAX_F = 160.0; // Layer thickness const double H_MIN_IN = 0.; // 2018 const double H_MIN_IN1 = 1.; // HMA const double H_MAX_IN = 297.; const double H_MAX_IN1 = 72.; // HMA const double LIFT_MAX = 24.0; const double LIFT_MAX1 = 99.0; const double AGG_MIN = 3.0; // Design modulus const double HMA_MIN_PSI = 5000.0; const double HMA_NOM_PSI = 500000.0; const double HMA_MAX_PSI = 5000000.0; const double HMA_MAX_KPA = 34473786.4; const double AGG_MIN_PSI = 5000.0; const double AGG_NOM_PSI = 20000.0; const double AGG_MAX_PSI = 50000.0; const double SOI_MIN_PSI = 1500.0; const double SOI_NOM_PSI = 15000.0; const double SOI_MAX_PSI = 50000.0; const double INS_MIN_PSI = 750.0; const double INS_MAX_PSI = 50000.0; const double ROC_MIN_PSI = 50000.0; const double ROC_NOM_PSI = 1000000.0; const double ROC_MAX_PSI = 4000000.0; const double WAT_MIN_PSI = 20000.0; const double WAT_NOM_PSI = 50000.0; const double WAT_MAX_PSI = 100000.0; const double RPC_MIN_PSI = 38000.0; const double RPC_MON_PSI = 78000.0; const double RPC_MAX_PSI = 160000.0; const double CIR_MIN_PSI = 5000.0; const double CIR_NOM_PSI = 250000.0; const double CIR_MAX_PSI = 1000000.0; const double SFD_MIN_PSI = 5000.0; const double SFD_NOM_PSI = 250000.0; const double SFD_MAX_PSI = 1000000.0; const double OTH_MIN_PSI = 1000.0; const double OTH_NOM_PSI = 5000.0; const double OTH_MAX_PSI = 10000000.0; // Poisson's Ratio const double HMA_MIN_POI = 0.15; // MIN_AC_POI const double HMA_NOM_POI = 0.35; // NOM_AC_POI const double HMA_MAX_POI = 0.50; // MAX_AC_POI const double AGG_MIN_POI = 0.35; // MIN_AGG_POI const double AGG_NOM_POI = 0.40; // NOM_AGG_POI const double AGG_MAX_POI = 0.45; // MAX_AGG_POI const double SOI_MIN_POI = 0.20; // MIN_SOIL_POI const double SOI_NOM_POI = 0.45; // NOM_SOIL_POI const double SOI_MAX_POI = 0.50; // MAX_SOIL_POI const double ROC_MIN_POI = 0.10; // MIN_ROCK_POI const double ROC_NOM_POI = 0.15; // NOM_ROCK_POI const double ROC_MAX_POI = 0.25; // MAX_ROCK_POI const double WAT_MIN_POI = 0.10; // MIN_WATER_POI const double WAT_NOM_POI = 0.35; // NOM_WATER_POI const double WAT_MAX_POI = 0.50; // MAX_WATER_POI const double RPC_MIN_POI = 0.15; // MIN_RPCC_POI const double RPC_NOM_POI = 0.35; // NOM_RPCC_POI const double RPC_MAX_POI = 0.50; // MAX_RPCC_POI const double CIR_MIN_POI = 0.15; // MIN_CIR_POI const double CIR_NOM_POI = 0.35; // NOM_CIR_POI const double CIR_MAX_POI = 0.50; // MAX_CIR_POI const double SFT_MIN_POI = 0.15; // MIN_SFDR_POI const double SFT_NOM_POI = 0.35; // NOM_SFDR_POI const double SFD_MAX_POI = 0.50; // MAX_SFDR_POI const double OTH_MIN_POI = 0.10; // MIN_OTHER_POI const double OTH_NOM_POI = 0.35; // NOM_OTHER_POI const double OTH_MAX_POI = 0.50; // MAX_OTHER_POI const double R_VALUE_MIN = 5.0; // MIN_R_VALUE const double R_VALUE_MAX = 75.0; // MAX_R_VALUE const double CBR_MIN = 3.0; // MIN_CBR const double CBR_MAX = 100.0; // MAX_CBR const double DCP_MIN = 1.0; // MIN_DCP const double DCP_MAX = 100.0; // MAX_DCP const double COV_MIN = 0.0; // MIN_CV const double COV_MAX = 1000.0; // MAX_CV const double MULT_MIN = 0.1; // MIN_MULT const double MULT_MAX = 10.0; // MAX_MULT const double GE_HMA_MIN = 7.0; // MIN_AC_GE const double GE_FD_MIN = 5.0; // MIN_FD_AC const double GE_HMA_HV = 2.25; // AC_GE_HV const double GE_HMA_LV = 2.0; // AC_GE_LV const double GE_AGG_MIN = 3.0; // MIN_GB_GE const double GE_CL3 = 8.0; // CL3_GE const double GE_SEGRAN = 0.5; // SELGRAN_GE const double HMATHRESH = -70.0; // horizontal microstrains below which perpetual pavement is assumed const double SOILTHRESH = 300.0; // vertical microstrains below which perpetual pavement is assumed const double CONFIDENCE = 70.0; // default confidence level for modulus estimation, formerly 85 (70 is more compatible with Monte Carlo expectations) //February 2002 values // Optimal aggregate base multipliers const double OPT_F_AGG_MULT = 1.0; const double OPT_W_AGG_MULT = 10.0; const double OPT_T_AGG_MULT = 0.3; const double OPT_R_AGG_MULT = 0.7; const double OPT_S_AGG_MULT = 0.85; // Wet aggregate base multipliers const double WET_F_AGG_MULT = 1.43; const double WET_W_AGG_MULT = 14.29; const double WET_T_AGG_MULT = 0.43; const double WET_R_AGG_MULT = 1.0; const double WET_S_AGG_MULT = 1.21; // Optimal subbase multipliers const double OPT_F_SB_MULT = 1.0; const double OPT_W_SB_MULT = 10.0; const double OPT_T_SB_MULT = 0.3; const double OPT_R_SB_MULT = 0.7; const double OPT_S_SB_MULT = 0.85; // Wet aggregate subbase multipliers const double WET_F_SB_MULT = 1.43; const double WET_W_SB_MULT = 14.29; const double WET_T_SB_MULT = 0.43; const double WET_R_SB_MULT = 1.0; const double WET_S_SB_MULT = 1.21; // Optimal soil multipliers const double OPT_F_SOIL_MULT = 1.0; const double OPT_W_SOIL_MULT = 10.0; const double OPT_T_SOIL_MULT = 10.0; const double OPT_R_SOIL_MULT = 0.7; const double OPT_S_SOIL_MULT = 0.85; // Wet soil multipliers const double WET_F_SOIL_MULT = 1.43; const double WET_W_SOIL_MULT = 14.29; const double WET_T_SOIL_MULT = 14.29; const double WET_R_SOIL_MULT = 1.0; const double WET_S_SOIL_MULT = 1.21; // Multiplier to convert engineered soil modulus to undisturbed modulus const double INSITU = 0.5; // Coefficient of Variation // Thickness const double H1_CV = 5.0; const double H2_CV = 8.0; const double H3_CV = 15.0; const double H4_CV = 20.0; // Modulus const double CV_HMA = 20.0; // AC_CV const double CV_OLD = 50.0; // EXAC_CV const double CV_AGG = 30.0; // AGG_CV const double CV_SOI = 40.0; // SOIL_CV const double CV_INS = 75.0; // INSITU_CV const double CV_PCC = 15.0; // PCC_CV const double CV_ROC = 50.0; // ROCK_CV const double CV_WAT = 50.0; // WATER_CV const double CV_RPC = 58.0; // RPCC_CV const double CV_CIR = 50.0; // CIR_CV const double CV_SFD = 50.0; // SFDR_CV const double CV_OTH = 70.0; // OTHER_CV // Modulus Equations // Default HMA properties const double VA = 6.0; const double VAB = 8.0; const double PB = 5.0; const double PBA = 1.0; const double GB = 1.02; const double GSB = 2.65; // Power A coefficients for soil modulus calculation: Ln(E, MPa) // Ln(E) = a*(clay^b + silt^b) const double LNEA = 1.930349; const double LNEB = -0.05576; const double LNEC = -0.0514; // NormsInv calculation (regression to estimate Z for a given probability) // NormsInv = a*sqrt(p) + b*ln(p) + c*exp(-x) + d*tan(x) + e const double NINVA = 0.912451332; const double NINVB = 0.330936499; const double NINVC = -0.044652304; const double NINVD = 0.857550602; const double NINVE = -0.857924882; // Temperature/Viscosity coefficients // KV = kinematic visc@135°C (cSt) const double A_AC20 = 13.107; const double VTS_AC20 = -4.4775; const double KV_AC20 = 397.0; const double A_120150 = 12.952; const double VTS_120150 = -4.4307; const double KV_120150 = 271.0; const double A_5234 = 12.85; const double VTS_5234 = -4.4089; const double KV_5234 = 194.0; const double A_5828 = 12.787; const double VTS_5828 = -4.3719; const double KV_5828 = 297.0; const double A_5834 = 10.61; const double VTS_5834 = -3.5888; const double KV_5834 = 407.0; const double A_5840 = 8.2798; const double VTS_5840 = -2.738; const double KV_5840 = 581.0; const double A_6428 = 11.725; const double VTS_6428 = -3.9763; const double KV_6428 = 460.0; const double A_6434 = 9.0208; const double VTS_6434 = -3.0026; const double KV_6434 = 700.0; const double A_6440 = 9.444; const double VTS_6440 = -3.181; const double KV_6440 = 0.0; const double A_7028 = 9.263; const double VTS_7028 = -3.0842; const double KV_7028 = 845.0; const double A_7034 = 9.618; const double VTS_7034 = -3.234; const double KV_7034 = 0.0; const double A_6422 = 12.82; const double VTS_6422 = -4.3721; const double KV_6422 = 447.0; const double A_7016 = 12.852; const double VTS_7016 = -4.372; const double KV_7016 = 0.0; // polymer correction factors const double PMULT = 4.0; const double FPOLY_5834 = 0.139; const double FPOLY_5840 = 0.196; const double FPOLY_6428 = 0.061; const double FPOLY_6434 = 0.226; const double FPOLY_6440 = 0.279; const double FPOLY_7028 = 0.260; const double FPOLY_7034 = 0.352; const double RPOLY_5834 = 0.143; const double RPOLY_5840 = 0.143; const double RPOLY_6428 = 0.143; const double RPOLY_6434 = 0.143; const double RPOLY_6440 = 0.143; const double RPOLY_7028 = 0.143; const double RPOLY_7034 = 0.143; // Standard errors and slopes for backcalculated moduli const double SEE_AB = 0.110; const double SEE_FD = 0.021; const double M_HMA_AB = -0.015; const double M_HMA_FD = -0.022; const double FWD_ADT = 343.0; const double FWD_R = 0.11; // Mohr-Coulomb (using Class 5 wet data for now) const double MOHR_H_MM = 152.4; // 6.0 in. Mohr-Coulomb depth (or bottom of layer) const double CKPA_CL7_W = 41.37; // CL7_C 600655 const double CKPA_CL7_D = 45.16; const double CKPA_CL6_W = 41.37; // CL6_C 600734 const double CKPA_CL6_D = 50.61; const double CKPA_CL5_W = 41.37; // CL5_C 600655 const double CKPA_CL5_D = 45.16; const double CKPA_CL4_W = 41.37; // CL4_C 600838 const double CKPA_CL4_D = 57.78; const double CKPA_CL3_W = 41.37; // CL3_C 600838 const double CKPA_CL3_D = 57.78; const double CKPA_SEL_W = 41.37; // SELGRAN_C 600838 const double CKPA_SEL_D = 57.78; const double CKPA_GRN_W = 0.0; // GRAN_C const double CKPA_GRN_D = 0.0; const double PHI_CL7_W = 24.0; // CL7_PHI 240437 const double PHI_CL7_D = 43.7; const double PHI_CL6_W = 24.0; // CL6_PHI 240482 const double PHI_CL6_D = 48.2; const double PHI_CL5_W = 24.0; // CL5_PHI 240437 const double PHI_CL5_D = 43.7; const double PHI_CL4_W = 24.0; // CL4_PHI 240392 const double PHI_CL4_D = 39.2; const double PHI_CL3_W = 24.0; // CL3_PHI 240392 const double PHI_CL3_D = 39.2; const double PHI_SEL_W = 24.0; // SELGRAN_PHI 240392 const double PHI_SEL_D = 39.2; const double PHI_GRN_W = 0.0; // GRAN_PHI const double PHI_GRN_D = 0.0; const double MOHR_WT1_KIP = 22.0; const double MOHR_WT2_KIP = 28.0; // 20120724 the following were changed back to heaviest axles for version 6.202 // in response to reports that low-volume roads have frequent over-weight vehicles // In the future the user may be given the option to change this based on % Heavy Commercial const double MOHR_LV1_KIP = 22.0; // 12. const double MOHR_LV2_KIP = 28.0; // 20. const double MOHR_P1_PSI = 100.0; const double MOHR_P2_PSI = 100.0; const double MOHR_X1_IN = 0.0; const double MOHR_X2_IN = 13.5; const double UWT_HMA_PCI = 145.0; const double UWT_AGG_PCI = 145.0; const double UWT_SUB_PCI = 145.0; const double UWT_SOI_PCI = 125.0; const double KO_AGG = 0.5; const double KO_SB = 0.5; const double KO_SOIL = 0.5; // Output const long CYCLES = 5000; const long MAXCYCLES = 30000; const int NS_X = 0; const int NS_Y = 50; const int NS_Z = 100; const int SS_YZ = 150; const int SS_XZ = 200; const int SS_XY = 250; const int D_X = 600; const int D_Y = 650; const int D_Z = 700; const int NE_X = 750; const int NE_Y = 800; const int NE_Z = 850; const double S_LIMIT = 0.05; const double D_LIMIT = 0.001; const QPoint OUTPT = QPoint(353, 103); // number of default damage models const int NDEFFAT = 5; const int NDEFRUT = 6; class calc { public: calc(); double airT(double paveTemp, double z); double paveT(double airTemp, double z); // Traffic double esal2aadt(double esals, int road, double SN); double LEF(int axles, double SN, double pt, double kips); QString txtLEF(int axles, double SN, double pt, double kips); // Structure void aggC(double *defaultAggC); void aggData(int nIndex, double *defaultAggData); void aggK(double *MrC, double *MrData, double *K123); void eWitczak(double T, double *w, double *a, double *E, double *U); void Luk(bool coef, int pvt, int func, double yrs, double h, double eSoil, double dESAL, double *results); void mnPSR(bool coef, bool mo, double yrs, double h, double esoil, double desal, double *results); int TBinder(bool bHi, int nInd); long calcTrucks(double rigdata[]); double calcRigid(int rignum[], double rigdata[], long *trucks, double *rel, double *cr); double BB80(bool bFD, double mils, double F, double HAC); double BBAD(int nADT, double h); double BELLS3(double IR, double d, double oneday, double hr); double ClaySilt(double clay, double silt); double ConfidenceValue(double ExpVal, double PctCOV, double PctConf, bool bLognormal = true); double dec2clay(double value, bool bInt = false); double dec2silt(double value, bool bInt = false); double ECIR(double LayerTemp, double COV); //FHWA-ICT-09-036, Cold In-place Recycling and Full-depth Recycling with Asphalt Products, Marshall Thompson et al 2009 double EClaySilt(double ClaySilt, double PctCOV); // regression estimates E(psi) of soil double EThompson(double H, double D0, double D12, double D24, double D36, bool FullDepth); double HEq(int nL, double *h, double *e, double *u, bool bTopDown = false); double MinGE(bool bAgg, long ESALs); double MRF(bool crack, double EHMA, double oldT = 77.); double NormsInv(double p); // regression estimates the inverse of the standard normal cumulative distribution double setSpin(int delta, double value, double incr); double Vb(double *Pb, double *Va, double *Pba, double *Gb, double *Gsb); double Vbeff(double *Pb, double *Va, double *Pba, double *Gb, double *Gsb); QString getCBColor(int ncolor, int nvalue, bool bblacktext = false); // nvalue ranges from 0 to 8 (0 in 255 in increments of 32) QString getPBColor(int ncolor, int nvalue, bool bblacktext = false); // nvalue ranges from 0 to 8 (0 in 255 in increments of 32) // Output void ms2hms(long int nms, int *nh, int *nm, int *ns, bool *blong); void OverBurden(double *h1, double *h2, double *h3, double *h4, double *gamma1, double *gamma2, double *gamma3, double *gamma4, double *ko2, double *ko3, double *ko4, int *layer, int *loc, double *z, double *obx, double *oby, double *obz, bool bzpct); void PrincipalStress(bool bZero, double sx, double sy, double sz, double txy, double txz, double tyz, double *s1, double *s2, double *s3); double quad(double a, double b, double c, bool bmax = true); }; #endif // CALC_H