void txEmissionsBase::compareAlpha() { ma_diff_alpha.clear(); ma_diff_alpha.resize(m_numberOfPoints); if ( m_EGRcalc == EGRCALC_YES ) { double concO2mix = 0; const double concO2air = m_commonParameters->val_concO2air(); if ( concO2air < 1 ) { throw txError("Incorrect \"concO2air\" parameter!"); } for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { concO2mix = concO2air * (1.0 - ma_rEGR[i] / 100.0) + ma_CO2[i] * ma_rEGR[i] / 100.0; ma_alpha_O2[i] = (0.01 * concO2mix * (1.0 - 0.01 * ma_CO2[i]) + 0.0683185 * 0.01 * ma_CO2[i]) / (0.01 * concO2mix - 0.01 * ma_CO2[i]); ma_diff_alpha[i] = (ma_alpha_res[i] - ma_alpha_O2[i]) / ma_alpha_O2[i] * 100.0; } } else if ( m_EGRcalc == EGRCALC_NO ) { for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_diff_alpha[i] = (ma_alpha[i] - ma_alpha_O2[i]) / ma_alpha_O2[i] * 100.0; } } else { throw txError("Incorrect task for EGR ratio calculation!"); } }
void txPointsOfCycle::prepSrcData(const QVector<QVector<double> > &srcdata) { if ( srcdata.isEmpty() ) { throw txError("Incorrect source data array!"); } if ( srcdata[0].size() != SRCDATACAPTIONS_11.size() && srcdata[0].size() != SRCDATACAPTIONS_6.size() ) { throw txError("Incorrect source data array!"); } int currstd = m_calculationOptions->val_standard(); if ( currstd == STD_EU6 || currstd == STD_EU5 || currstd == STD_EU4 || currstd == STD_EU3 ) { m_n_hi = srcdata[0][ 0]; m_n_lo = srcdata[0][ 1]; m_idle = srcdata[0][ 2]; m_n_rated = srcdata[0][ 3]; m_N_fan_rated = srcdata[0][ 4]; m_Ne_A = srcdata[0][ 5]; m_Ne_B = srcdata[0][ 6]; m_Ne_C = srcdata[0][ 7]; m_Ne_a1 = srcdata[0][ 8]; m_Ne_a2 = srcdata[0][ 9]; m_Ne_a3 = srcdata[0][10]; ABC(m_n_hi, m_n_lo, &m_A, &m_B, &m_C, &m_a1, &m_a2, &m_a3, &m_n_ref); } else if ( (currstd == STD_EU2) || (currstd == STD_EU1) || (currstd == STD_EU0) || (currstd == STD_OST3700123481) || (currstd == STD_GOST17220597) || (currstd == STD_R96E8) || (currstd == STD_R96F8) || (currstd == STD_R96G8) || (currstd == STD_R96D8) || (currstd == STD_R96E5) || (currstd == STD_R96F5) || (currstd == STD_R96G5) || (currstd == STD_R96D5) || (currstd == STD_R96H8) || (currstd == STD_R96I8) || (currstd == STD_R96J8) || (currstd == STD_R96K8) || (currstd == STD_R96H5) || (currstd == STD_R96I5) || (currstd == STD_R96J5) || (currstd == STD_R96K5) || (currstd == STD_C1) || (currstd == STD_D1) || (currstd == STD_D2) || (currstd == STD_E1) || (currstd == STD_E2) || (currstd == STD_E3) || (currstd == STD_E5) || (currstd == STD_F) || (currstd == STD_G1) || (currstd == STD_G2) ) { m_idle = srcdata[0][ 0]; m_n_interim = srcdata[0][ 1]; m_n_rated = srcdata[0][ 2]; m_N_fan_rated = srcdata[0][ 3]; m_Ne_interim = srcdata[0][ 4]; m_Ne_rated = srcdata[0][ 5]; } else { throw txError("Unknown value of parameter \"standard\"!"); } }
void txAlfaBravoCharlie(MorseToken code) { // uint8_t n(m2a(code) - 'A'); uint8_t n(0); if (1 < symbolStackSize()) { n = 10 * s(1).m2i() + s(0).m2i(); popN(2); } else if (symbolStackSize()) { n = m2i(s(0)); popN(1); } if (0 <= n && n <= ('Z' - 'A')) { char letterName[1 + sizeof "NOVEMBER"]; const char* p(alphaBravoCharlie); size_t i(0); while (*p) { if (*p == ' ') { if (n) { --n; } else { break; } } else if (!n) { letterName[i++] = *p; } ++p; } letterName[i] = '\000'; txString(letterName); } else { txError(); Serial.println("txAlfaBravoCharlie: Range error."); } }
/// Just like txAlfaBravoCharlie, but adds digits from /// the stack to expose the entire alphabet. void txAlphaNNN(MorseToken) { uint8_t n(0); uint8_t k(symbolStackSize()); if (0 < k) { n += s(0).m2i(); popSymbolStack(MorseToken()); } if (1 < k) { n += 10 * s(1).m2i(); popSymbolStack(MorseToken()); } if (0 <= n && n <= ('Z' - 'A')) { char letterName[1 + sizeof "NOVEMBER"]; const char* p(alphaBravoCharlie); size_t i(0); while (*p) { if (*p == ' ') { if (n) { --n; } else { break; } } else if (!n) { letterName[i++] = *p; } ++p; } txString(letterName); } else { txError(); } }
QString txEmissionsBase::saveCalcOptions() const { QDir calcConfDir; const QString fullPath = calcConfDir.relativeFilePath(m_fullReportsPath) + QDir::separator() + m_currTime + ".conf"; QFile confFile(fullPath); if ( !confFile.open(QFile::WriteOnly) ) { throw txError("Can not open file " + fullPath + "!"); } QTextStream fout(&confFile); fout << "task" << "=" << m_calculationOptions->val_task() << "\n" << "Vh" << "=" << m_calculationOptions->val_Vh() << "\n" << "standard" << "=" << m_calculationOptions->val_standard() << "\n" << "chargingType" << "=" << m_calculationOptions->val_chargingType() << "\n" << "fuelType" << "=" << m_calculationOptions->val_fuelType() << "\n" << "NOxSample" << "=" << m_calculationOptions->val_NOxSample() << "\n" << "PTcalc" << "=" << m_calculationOptions->val_PTcalc() << "\n" << "PTmass" << "=" << m_calculationOptions->val_PTmass() << "\n" << "addPointsCalc" << "=" << m_calculationOptions->val_addPointsCalc() << "\n" << "testDate" << "=" << m_calculationOptions->val_testDate() << "\n" << "calcConfigFile" << "=" << m_calculationOptions->val_calcConfigFile() << "\n"; confFile.close(); return "libtoxic: Calculation config file \"" + fullPath + "\" created.\n"; }
/// Note: Since txTick() takes a significant amount of time, the /// fastest the metronome will currently go is 240 bpm. void txMetronome(MorseToken) { uint8_t bpm(60); switch (symbolStackSize()) { case 3: bpm = 100 * s(2).m2i() + 10 * s(1).m2i() + s(0).m2i(); popN(3); break; case 2: bpm = 10 * s(1).m2i() + s(0).m2i(); popN(2); break; case 1: bpm = s(0).m2i(); popN(1); break; default: txError(); } uint32_t timeout(60 * 1000000 / bpm); elapsedMicros sinceTick(0); while (!touchPoll(dahPin)) { if (timeout < sinceTick) { sinceTick = 0; txTick(MorseToken()); } } }
double pa(double t0) { const QVector< QVector<double> > arr = { // t0 {-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}, // pa {0.1029076,0.113305,0.1246355,0.1368991,0.1503624,0.1650254,0.1808881,0.1980838,0.2168791,0.237274,0.2594018,0.2832625,0.3093893,0.3375156,0.3680413,0.4009664,0.4366908,0.4753478,0.5170707,0.5619928,0.6103807,0.657169,0.705157,0.758477,0.81313,0.871782,0.934433,1.001083,1.073065,1.147713,1.227693,1.311672,1.402316,1.496959,1.598267,1.704907,1.816879,1.936849,2.063484,2.196784,2.338082,2.486045,2.643339,2.808631,2.983254,3.167208,3.360493,3.564442,3.779055,4.004332,4.241606,4.49221,4.753478,5.029409,5.31867,5.622594,5.939848,6.274431,6.618345,6.990252,7.374156,7.776722,8.19795,8.63784,9.099058,9.581604,10.084145,10.61068,11.158543,11.733066,12.331583,12.95676,13.60993,14.28976,14.99625,15.7294,16.50254,17.30234,18.14213,19.00858,19.91502,20.84812,21.83454,22.84762,23.90069,24.99375,26.14013,27.3265,28.55286,29.81921,31.15221,32.51187,33.93818,35.41781,36.95076,38.53703,40.17662,41.86953,43.62909,45.4553,47.33483,49.28101,51.30717,53.39998,55.55944,57.79888,60.10497,62.47771,64.93043,67.46313,70.08914,72.79513,75.5811,78.46038,81.43297,84.49887,87.65808,90.92393,94.28309,97.73556,101.308} }; if ( arr[0].size() != arr[1].size() ) { throw txError("Wrong dependence of \"pa\" to \"t0\"!"); } for ( ptrdiff_t i=0; i<arr[0].size(); i++ ) { if ( t0 > arr[0][i] && t0 < arr[0][i+1] ) { return arr[1][i] + (arr[1][i+1] - arr[1][i]) * (t0 - arr[0][i]) / (arr[0][i+1] - arr[0][i]); } else if (t0 == arr[0][i]) { return arr[1][i]; } else if (t0 == arr[0][i+1]) { return arr[1][i+1]; } } return 0; }
void ABC(double n_hi, double n_lo, double *A, double *B, double *C, double *a1, double *a2, double *a3, double *n_ref) { if (n_hi < n_lo) { throw txError("n_hi must be greater than n_lo!"); } const double delta = (n_hi - n_lo) / 4.0; *A = n_lo + delta; *B = *A + delta; *C = *B + delta; *a1 = (*B + *C) / 2.0; *a2 = (*A + *B) / 2.0; *a3 = (*B + *C) / 2.0; *n_ref = n_lo + 0.95 * (n_hi - n_lo); }
/// If the top two elements of the stack are digits, convert them to a /// number between 0-99 inclusive. Play the corresponding note. void playNote(MorseToken) { if (1 < symbolStackSize() && isdigit(s(0).toChar()) && isdigit(s(1).toChar())) { size_t note(10 * (s(1).toChar() - '0') + (s(0).toChar() - '0')); playTone(noteHz[note] + 0.5, getDitMicros() * 60); txUnsigned(note); } else { txError(); } }
QString txEmissionsBase::saveSourceData() const { QDir reportDir; const QString fullPath = reportDir.relativeFilePath(m_fullReportsPath) + QDir::separator() + "SourceData_" + m_calculationOptions->defStandardName( m_calculationOptions->val_standard() ) + "_" + m_currTime + ".dat"; QFile srcData(fullPath); if ( !srcData.open(QFile::WriteOnly) ) { throw txError("Can not open file " + fullPath + "!"); } QTextStream fout(&srcData); fout << right << qSetFieldWidth(COLUMNWIDTH); for ( ptrdiff_t i=0; i<SRCDATACAPTIONS_EMISSIONS.size(); i++ ) { fout << SRCDATACAPTIONS_EMISSIONS[i]; } fout << qSetFieldWidth(0) << "\n" << fixed << qSetFieldWidth(COLUMNWIDTH) << qSetRealNumberPrecision(PRECISION+1); for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { fout << qSetFieldWidth(COLUMNWIDTH); fout << i + 1; fout << ma_n[i] << ma_Me_brutto[i] << ma_Ne_brutto[i] << ma_N_fan[i] << ma_w[i] << ma_t0[i] << ma_B0[i] << ma_Ra[i] << ma_dPn[i] << ma_Gair[i] << ma_Gfuel[i] << ma_CNOx[i] << ma_gNOx[i] << ma_CCO[i] << ma_CCH[i] << ma_CCO2in[i] << ma_CCO2out[i] << ma_CO2[i] << ma_Ka1m[i] << ma_KaPerc[i] << ma_FSN[i] << ma_Pr[i] << ma_ts[i] << ma_tauf[i] << ma_qmdw[i] << ma_qmdew[i] << ma_rd[i]; fout << qSetFieldWidth(0) << "\n"; } srcData.close(); return "libtoxic: Source data file \"" + fullPath + "\" created.\n"; }
void txCommonParameters::createNeededFiles() { QDir dir; QFileInfo fileInfo; QString absPath; if ( !dir.exists(m_commonDirName) ) { if ( !dir.mkdir(m_commonDirName) ) { throw txError("Can not create directory " + m_commonDirName); } } fileInfo.setFile(m_srcFileNameEU3); absPath = fileInfo.absoluteDir().absolutePath(); if ( !dir.exists(absPath) ) { if ( !dir.mkdir(absPath) ) { throw txError("Can not create directory " + absPath); } } fileInfo.setFile(m_srcFileNameEU0); absPath = fileInfo.absoluteDir().absolutePath(); if ( !dir.exists(absPath) ) { if ( !dir.mkdir(absPath) ) { throw txError("Can not create directory " + absPath); } } fileInfo.setFile(m_srcFileNamePoints); absPath = fileInfo.absoluteDir().absolutePath(); if ( !dir.exists(absPath) ) { if ( !dir.mkdir(absPath) ) { throw txError("Can not create directory " + absPath); } } fileInfo.setFile(m_srcFileNameRedPwr); absPath = fileInfo.absoluteDir().absolutePath(); if ( !dir.exists(absPath) ) { if ( !dir.mkdir(absPath) ) { throw txError("Can not create directory " + absPath); } } if ( !dir.exists(m_reportsDirName) ) { if ( !dir.mkdir(m_reportsDirName) ) { throw txError("Can not create directory " + m_reportsDirName); } } }
QString txReducedPower::saveSourceData() const { QDir reportDir; const QString fullPath = reportDir.relativeFilePath(m_fullReportsPath) + QDir::separator() + "SourceData_R85_" + m_currTime + ".dat"; QFile srcData(fullPath); if ( !srcData.open(QFile::WriteOnly) ) { throw txError("Can not open file " + fullPath + "!"); } QTextStream fout(&srcData); fout << right << qSetFieldWidth(COLUMNWIDTH); for ( ptrdiff_t i=0; i<SRCDATACAPTIONS_REDPOWER.size(); i++ ) { fout << SRCDATACAPTIONS_REDPOWER[i]; } fout << qSetFieldWidth(0) << "\n" << fixed << qSetFieldWidth(COLUMNWIDTH) << qSetRealNumberPrecision(PRECISION+1); for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { fout << qSetFieldWidth(COLUMNWIDTH); fout << i + 1; fout << ma_n[i] << ma_Me_brutto[i] << ma_t0[i] << ma_B0[i] << ma_Ra[i] << ma_S[i] << ma_pk[i] << ma_Gfuel[i] << ma_N_k[i] << ma_N_fan[i] << ma_t_cool[i] << ma_t_oil[i] << ma_tk[i] << ma_tks[i] << ma_t_fuel[i] << ma_pks[i] << ma_Gair[i]; fout << qSetFieldWidth(0) << "\n"; } srcData.close(); return "libtoxic: Source data file \"" + fullPath + "\" created.\n"; }
void gradeNext(MorseToken) { if (1 < symbolStackSize()) { if (s(1) == s(0)) { txString("Y"); popSymbolStack(MorseToken()); popSymbolStack(MorseToken()); } else { txString("N"); popSymbolStack(MorseToken()); txSymbolStackTop(MorseToken()); popSymbolStack(MorseToken()); } } else { txError(); } }
void txReducedPower::setSourceData() { QSharedPointer<txDataReader> dataReader(new txDataReader()); dataReader->readFile(m_commonParameters->val_srcFileNameRedPwr(), " "); QVector< QVector<double> > srcdata = dataReader->val_data(); if ( srcdata.isEmpty() ) { throw txError("No data to calculate!"); } // m_numberOfPoints = srcdata.size(); prepSrcArrays(srcdata); }
QString txPointsOfCycle::createReports() { const QString filenamePoints = m_commonParameters->val_srcFileNamePoints(); QFile dataFile(filenamePoints); if ( !dataFile.open(QFile::WriteOnly) ) { throw txError("Can not open file " + filenamePoints + "!"); } QTextStream fout(&dataFile); fout << right << qSetFieldWidth(COLUMNWIDTH); for ( ptrdiff_t i=0; i<SRCDATACAPTIONS_EMISSIONS.size(); i++ ) { fout << SRCDATACAPTIONS_EMISSIONS[i]; } fout << qSetFieldWidth(0) << "\n" << fixed; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { fout << qSetFieldWidth(COLUMNWIDTH) << qSetRealNumberPrecision(0); fout << (i + 1) << ma_n[i]; fout << qSetRealNumberPrecision(PRECISION); fout << ma_Me_brutto[i] << ma_Ne_brutto[i] << ma_N_fan[i]; fout << qSetRealNumberPrecision(PRECISION+1); fout << ma_w[i]; fout << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0" << "0"; fout << qSetFieldWidth(0) << "\n"; } dataFile.close(); return "libtoxic: File \"" + filenamePoints + "\" rewrited.\n"; }
void txPointsOfCycle::setSourceData() { const int currstd = m_calculationOptions->val_standard(); QSharedPointer<txDataReader> dataReader(new txDataReader()); if ( currstd == STD_EU6 || currstd == STD_EU5 || currstd == STD_EU4 || currstd == STD_EU3 ) { dataReader->readFile(m_commonParameters->val_srcFileNameEU3(), " "); } else { dataReader->readFile(m_commonParameters->val_srcFileNameEU0(), " "); } QVector< QVector<double> > srcdata = dataReader->val_data(); if ( srcdata.isEmpty() ) { throw txError("No data to calculate!"); } prepSrcData(srcdata); }
void txReducedPower::calculate() { m_currTime = QDateTime::currentDateTime().toString("dd-MM-yyyy_hh-mm-ss"); // ma_Ne_brutto.clear(); ma_Ne_brutto.resize(m_numberOfPoints); ma_ge_brutto.clear(); ma_ge_brutto.resize(m_numberOfPoints); ma_qcs.clear(); ma_qcs.resize(m_numberOfPoints); ma_fm.clear(); ma_fm.resize(m_numberOfPoints); ma_pa.clear(); ma_pa.resize(m_numberOfPoints); ma_ps.clear(); ma_ps.resize(m_numberOfPoints); ma_fa.clear(); ma_fa.resize(m_numberOfPoints); ma_alphad.clear(); ma_alphad.resize(m_numberOfPoints); ma_Ne_reduced.clear(); ma_Ne_reduced.resize(m_numberOfPoints); ma_Ne_netto_reduced.clear(); ma_Ne_netto_reduced.resize(m_numberOfPoints); ma_Me_netto_reduced.clear(); ma_Me_netto_reduced.resize(m_numberOfPoints); ma_ge_netto_reduced.clear(); ma_ge_netto_reduced.resize(m_numberOfPoints); defRate(); const double Vh = m_calculationOptions->val_Vh(); const int chargtype = m_calculationOptions->val_chargingType(); for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Ne_brutto[i] = ma_Me_brutto[i] * ma_n[i] / 9550.0; ma_ge_brutto[i] = ma_Gfuel[i] / ma_Ne_brutto[i] * 1000.0; if ( chargtype == CHARGINGTYPE_NO ) { ma_qcs[i] = 1; } else { ma_qcs[i] = ( (ma_Gfuel[i] * 1000000.0) / (30.0 * ma_n[i] * Vh) ) / ( (ma_pk[i] + ma_B0[i]) / (ma_S[i] + ma_B0[i]) ); } if ( ma_qcs[i] < 40.0 ) { ma_fm[i] = 0.3; } else if ( ma_qcs[i] > 65.0 ) { ma_fm[i] = 1.2; } else { ma_fm[i] = 0.036 * ma_qcs[i] - 1.14; } ma_pa[i] = (0.506 + 0.1 * ma_t0[i] - 0.00245 * pow(ma_t0[i], 2.0) + 0.0001 * pow(ma_t0[i], 3.0)) * (ma_Ra[i] / 100.0); ma_ps[i] = ma_B0[i] - ma_pa[i]; if ( chargtype == CHARGINGTYPE_NO ) { ma_fa[i] = (99.0 / ma_ps[i]) * pow( (ma_t0[i] + 273.0) / 298.0, 0.7 ); } else { ma_fa[i] = pow( 99.0 / ma_ps[i], 0.7 ) * pow( (ma_t0[i] + 273.0) / 298.0, 1.5 ); } ma_alphad[i] = pow(ma_fa[i], ma_fm[i]); if ( ma_alphad[i] < 0.9 || ma_alphad[i] > 1.1 ) { throw txError("Parameter \"alphad\" " "is out-of-range (0.9..1.1)!"); } ma_Ne_reduced[i] = ma_alphad[i] * ma_Ne_brutto[i]; ma_N_fan[i] = N_fan(m_N_fan_rated, ma_n[i], m_n_rated); ma_Ne_netto_reduced[i] = ma_Ne_reduced[i] - ma_N_fan[i] + ma_N_k[i]; ma_Me_netto_reduced[i] = ma_Ne_netto_reduced[i] * 9550.0 / ma_n[i]; ma_ge_netto_reduced[i] = ma_Gfuel[i] / ma_Ne_netto_reduced[i] * 1000.0; } }
/// The top three entries on the stack are two digits to add and their /// proported sum mod 10. Transmit Y/N to indicate whether or not the /// sum is correct. If the sum is not correct, transmit the correct /// sum. Update the weights to bias future random number selection. void gradeSum(MorseToken) { if (2 < symbolStackSize()) { uint8_t s1(s(1).m2i()); uint8_t s2(s(2).m2i()); uint8_t s0(s(0).toChar()); uint8_t sum((s1 + s2) % 10); Serial.print(s2); Serial.print(" "); Serial.print(s1); Serial.print(" "); Serial.print(s0); Serial.print(" sum: "); Serial.println(sum); bool correct(s(0).m2i() == sum); if (correct) { txString("Y"); // Decrease the error counts associated with the digits the user // just added incorrectly, taking care not to underflow. uint8_t d1(!!digitErr[s1]); uint8_t d2(!!digitErr[s2]); digitErr[s1] -= d1; digitErr[s2] -= d2; digitErrCount -= (d1 + d2); Serial.print("Decrementing "); Serial.print(s1); Serial.print(". New weight is: "); Serial.println(digitErr[s1]); Serial.print("Decrementing "); Serial.print(s2); Serial.print(". New weight is: "); Serial.println(digitErr[s2]); } else { // 012345678901 char buffer[] = "N a + b = c"; buffer[3] = s2 + '0'; buffer[7] = s1 + '0'; buffer[11] = sum + '0'; txString(buffer); // Increase the error counts associated with the digits the user // just added incorrectly, taking care not to overflow. uint8_t d1(3 * (digitErr[s1] - 3 < 255)); uint8_t d2(3 * (digitErr[s2] - 3 < 255)); digitErr[s1] += d1; digitErr[s2] += d2; digitErrCount += d1 + d2; Serial.print("Incrementing "); Serial.print(s1); Serial.print(". New weight is: "); Serial.println(digitErr[s1]); Serial.print("Incrementing "); Serial.print(s2); Serial.print(". New weight is: "); Serial.println(digitErr[s2]); } // If the user plays long enough without a reset to saturate two // of the digits chosen at random, divide all the error counts // by 2. if (digitErr[s1] == 255 && digitErr[s2] == 255) { for (uint8_t i(0); i < 10; ++i) { digitErr[i] <<= 1; } digitErrCount <<= 1; Serial.println("Halving all weights."); } Serial.print("Digit error count is: "); Serial.println(digitErrCount); popN(3); } else { txError(); } }
void txEmissionsBase::baseCalc() { ma_alpha.clear(); ma_alpha.resize(m_numberOfPoints); ma_alpha_O2.clear(); ma_alpha_O2.resize(m_numberOfPoints); ma_Pb.clear(); ma_Pb.resize(m_numberOfPoints); ma_Pa.clear(); ma_Pa.resize(m_numberOfPoints); ma_fa.clear(); ma_fa.resize(m_numberOfPoints); ma_ge_brutto.clear(); ma_ge_brutto.resize(m_numberOfPoints); const double Dn = m_commonParameters->val_Dn(); if ( Dn < 1 ) { throw txError("Incorrect \"Dn\" parameter!"); } const double concO2air = m_commonParameters->val_concO2air(); if ( concO2air < 1 ) { throw txError("Incorrect \"concO2air\" parameter!"); } const int chargtype = m_calculationOptions->val_chargingType(); for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { if ( m_NeCalcMethod == NECALCMETHOD_THROUGHNE ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } else if ( m_NeCalcMethod == NECALCMETHOD_THROUGHME ) { ma_Ne_brutto[i] = ma_Me_brutto[i] * ma_n[i] / 9550.0; } else { throw txError("Incorrect Ne_netto calculation method!"); } if ( m_GairVals == GAIRVALS_THROUGHNOZZLE ) { ma_Gair[i] = Gair(Dn, ma_B0[i], ma_t0[i], ma_dPn[i]); } ma_alpha[i] = ma_Gair[i] / (ma_Gfuel[i] * m_commonParameters->val_L0()); if ( m_checkMeas == CHECKMEAS_YES && m_EGRcalc == EGRCALC_NO ) { ma_alpha_O2[i] = (0.01 * concO2air * (1.0 - 0.01 * ma_CO2[i]) + 0.0683185 * 0.01 * ma_CO2[i]) / (0.01 * concO2air - 0.01 * ma_CO2[i]); } ma_Pb[i] = ma_B0[i]; ma_Pa[i] = pa(ma_t0[i]); if ( chargtype == CHARGINGTYPE_NO ) { ma_fa[i] = (99.0 / (ma_Pb[i] - ma_Ra[i] * ma_Pa[i] * 0.01)) * pow((ma_t0[i] + 273.0) / 298, 0.7); } else if ( chargtype == CHARGINGTYPE_GASTURBINE ) { ma_fa[i] = pow(99.0 / (ma_Pb[i] - ma_Ra[i] * ma_Pa[i] * 0.01), 0.7) * pow((ma_t0[i] + 273.0) / 298, 1.5); } else { throw txError("Incorrect charging type!"); } ma_ge_brutto[i] = ma_Gfuel[i] / ma_Ne_brutto[i] * 1000.0; } }
void txEmissionsBase::prepSrcArrays( const QVector< QVector<double> > &srcdata ) { if ( srcdata.isEmpty() ) { throw txError("Incorrect source data array!"); } ma_n.clear(); ma_n.resize(m_numberOfPoints); ma_Me_brutto.clear(); ma_Me_brutto.resize(m_numberOfPoints); ma_Ne_brutto.clear(); ma_Ne_brutto.resize(m_numberOfPoints); ma_N_fan.clear(); ma_N_fan.resize(m_numberOfPoints); ma_w.clear(); ma_w.resize(m_numberOfPoints); ma_t0.clear(); ma_t0.resize(m_numberOfPoints); ma_B0.clear(); ma_B0.resize(m_numberOfPoints); ma_Ra.clear(); ma_Ra.resize(m_numberOfPoints); ma_dPn.clear(); ma_dPn.resize(m_numberOfPoints); ma_Gair.clear(); ma_Gair.resize(m_numberOfPoints); ma_Gfuel.clear(); ma_Gfuel.resize(m_numberOfPoints); ma_CNOx.clear(); ma_CNOx.resize(m_numberOfPoints); ma_gNOx.clear(); ma_gNOx.resize(m_numberOfPoints); ma_CCO.clear(); ma_CCO.resize(m_numberOfPoints); ma_CCH.clear(); ma_CCH.resize(m_numberOfPoints); ma_CCO2in.clear(); ma_CCO2in.resize(m_numberOfPoints); ma_CCO2out.clear(); ma_CCO2out.resize(m_numberOfPoints); ma_CO2.clear(); ma_CO2.resize(m_numberOfPoints); ma_Ka1m.clear(); ma_Ka1m.resize(m_numberOfPoints); ma_KaPerc.clear(); ma_KaPerc.resize(m_numberOfPoints); ma_FSN.clear(); ma_FSN.resize(m_numberOfPoints); ma_Pr.clear(); ma_Pr.resize(m_numberOfPoints); ma_ts.clear(); ma_ts.resize(m_numberOfPoints); ma_tauf.clear(); ma_tauf.resize(m_numberOfPoints); ma_qmdw.clear(); ma_qmdw.resize(m_numberOfPoints); ma_qmdew.clear(); ma_qmdew.resize(m_numberOfPoints); ma_rd.clear(); ma_rd.resize(m_numberOfPoints); for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { if ( srcdata[i].size() != SRCDATACAPTIONS_EMISSIONS.size() ) { throw txError("Incorrect source data array!"); } ma_n [i] = srcdata[i][ 1]; ma_Me_brutto[i] = srcdata[i][ 2]; ma_Ne_brutto[i] = srcdata[i][ 3]; ma_N_fan [i] = srcdata[i][ 4]; ma_w [i] = srcdata[i][ 5]; ma_t0 [i] = srcdata[i][ 6]; ma_B0 [i] = srcdata[i][ 7]; ma_Ra [i] = srcdata[i][ 8]; ma_dPn [i] = srcdata[i][ 9]; ma_Gair [i] = srcdata[i][10]; ma_Gfuel [i] = srcdata[i][11]; ma_CNOx [i] = srcdata[i][12]; ma_gNOx [i] = srcdata[i][13]; ma_CCO [i] = srcdata[i][14]; ma_CCH [i] = srcdata[i][15]; ma_CCO2in [i] = srcdata[i][16]; ma_CCO2out [i] = srcdata[i][17]; ma_CO2 [i] = srcdata[i][18]; ma_Ka1m [i] = srcdata[i][19]; ma_KaPerc [i] = srcdata[i][20]; ma_FSN [i] = srcdata[i][21]; ma_Pr [i] = srcdata[i][22]; ma_ts [i] = srcdata[i][23]; ma_tauf [i] = srcdata[i][24]; ma_qmdw [i] = srcdata[i][25]; ma_qmdew [i] = srcdata[i][26]; ma_rd [i] = srcdata[i][27]; } }
void txReducedPower::prepSrcArrays( const QVector< QVector<double> > &srcdata ) { if ( srcdata.isEmpty() ) { throw txError("Incorrect source data array!"); } ma_n.clear(); ma_n.resize(m_numberOfPoints); ma_Me_brutto.clear(); ma_Me_brutto.resize(m_numberOfPoints); ma_t0.clear(); ma_t0.resize(m_numberOfPoints); ma_B0.clear(); ma_B0.resize(m_numberOfPoints); ma_Ra.clear(); ma_Ra.resize(m_numberOfPoints); ma_S.clear(); ma_S.resize(m_numberOfPoints); ma_pk.clear(); ma_pk.resize(m_numberOfPoints); ma_Gfuel.clear(); ma_Gfuel.resize(m_numberOfPoints); ma_N_k.clear(); ma_N_k.resize(m_numberOfPoints); ma_N_fan.clear(); ma_N_fan.resize(m_numberOfPoints); ma_t_cool.clear(); ma_t_cool.resize(m_numberOfPoints); ma_t_oil.clear(); ma_t_oil.resize(m_numberOfPoints); ma_tk.clear(); ma_tk.resize(m_numberOfPoints); ma_tks.clear(); ma_tks.resize(m_numberOfPoints); ma_t_fuel.clear(); ma_t_fuel.resize(m_numberOfPoints); ma_pks.clear(); ma_pks.resize(m_numberOfPoints); ma_Gair.clear(); ma_Gair.resize(m_numberOfPoints); for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { if ( srcdata[i].size() != SRCDATACAPTIONS_REDPOWER.size() ) { throw txError("Incorrect source data array!"); } ma_n [i] = srcdata[i][ 1]; ma_Me_brutto[i] = srcdata[i][ 2]; ma_t0 [i] = srcdata[i][ 3]; ma_B0 [i] = srcdata[i][ 4]; ma_Ra [i] = srcdata[i][ 5]; ma_S [i] = srcdata[i][ 6]; ma_pk [i] = srcdata[i][ 7]; ma_Gfuel [i] = srcdata[i][ 8]; ma_N_k [i] = srcdata[i][ 9]; ma_N_fan [i] = srcdata[i][10]; ma_t_cool [i] = srcdata[i][11]; ma_t_oil [i] = srcdata[i][12]; ma_tk [i] = srcdata[i][13]; ma_tks [i] = srcdata[i][14]; ma_t_fuel [i] = srcdata[i][15]; ma_pks [i] = srcdata[i][16]; ma_Gair [i] = srcdata[i][17]; } if ( zeroArray(ma_n) || zeroArray(ma_Me_brutto) || zeroArray(ma_t0) || zeroArray(ma_B0) || zeroArray(ma_Ra) || zeroArray(ma_pk) || zeroArray(ma_Gfuel) || (m_calculationOptions->val_Vh() < 0.0000001) ) { throw txError("Incorrect source data!\n" "Please check Vh value and arrays of values " "n, Me, t0, B0, Ra, pk and Gfuel."); } }
/// Play one of 10 sound effects based on the digit on the stack. void playSoundEffect(MorseToken code) { pwmFrequency(noteHz[48]+0.5); pwmWrite(getDuty()); delayMicroseconds(getDitMicros()); pwmWrite(0); if (symbolStackSize()) { uint8_t n(s(0).m2i()); elapsedMicros t; size_t steps[] = { 0, 2, 3, 5, 7, 8, 10 }; switch (n) { case 0: t = 0; // Low pulsing static rumble while (t < 60 * getDitMicrosDefault()) { for (int i(1); i < 25; ++i) { dWrite(HIGH); delayMicroseconds((1 + random(i)) * 1136); dWrite(LOW); delayMicroseconds((1 + random(i)) * 1136); } } break; case 1: shufflingCash(120 * getDitMicrosDefault()); break; case 2: t = 0; // Descending beats while (t < 120 * getDitMicrosDefault()) { for (int i(1); i < 75; ++i) { dWrite(HIGH); delayMicroseconds(i * 1136/12); dWrite(LOW); delayMicroseconds(i * 1136/12); } } break; case 3: t = 0; // Buzzer while (t < 60 * getDitMicrosDefault()) { playTone(noteHz[36], getDitMicrosDefault()/30); playTone(noteHz[48], getDitMicrosDefault()/30); playTone(noteHz[52], getDitMicrosDefault()/60); playTone(noteHz[57], getDitMicrosDefault()/60); } break; case 4: t = 0; // Humm, kinda like a machine hum. while (t < 60 * getDitMicrosDefault()) { for (int i(0); i < 49; ++i) { playTone(noteHz[i], getDitMicrosDefault()/10); } } break; case 5: t = 0; // ascending and repeating while (t < 60 * getDitMicrosDefault()) { for (int i(0); i < 49; ++i) { playTone(noteHz[i], getDitMicrosDefault()/2); } } break; case 6: t = 0; // ascending more quickly while (t < 60 * getDitMicrosDefault()) { for (int i(0); i < 49; ++i) { playTone(noteHz[random(1,96)], getDitMicrosDefault()/10); } } break; case 7: t = 0; // ? while (t < 60 * getDitMicrosDefault()) { for (int i(0); i < 7; ++i) { playTone(noteHz[(24 + steps[i % 7]) % 97], getDitMicrosDefault()); } } break; case 8: t = 0; // Almost white noise, like water from a tap while (t < 60 * getDitMicrosDefault()) { dWrite(HIGH); delayMicroseconds(random(100,1000)); dWrite(LOW); delayMicroseconds(random(100,1000)); } break; case 9: t = 0; // Almost white noise, like water from a tap while (t < 60 * getDitMicrosDefault()) { dWrite(HIGH); delayMicroseconds(random(10,8000)); dWrite(LOW); delayMicroseconds(random(10,8000)); } t = 0; // Sort of like a pinball machine { int i(2); while (t < 60 * getDitMicrosDefault()) { for (int k(0); k < 10; ++k) { dWrite(HIGH); delayMicroseconds(i); dWrite(LOW); delayMicroseconds(i); } i <<= 2; if (4000 < i) { i = 2; } } } } txString("K"); } else { txError(); } }
void txCommonParameters::readConfigFile(const QString &cfgFileName) { createNeededFiles(); QFile cfgFile1(cfgFileName); QFile cfgFile2(QDir::homePath() + QDir::separator() + cfgFileName); QFile cfgFile; if ( cfgFile1.exists() ) { cfgFile.setFileName(cfgFile1.fileName()); } else if ( cfgFile2.exists() ) { cfgFile.setFileName(cfgFile2.fileName()); } else { const QString myPreferences = "//\n// This is r49 configuration file. " "Parameter-Value delimeter is \"=\" symbol.\n// " "Text after \"//\" is comment.\n//\n\n" "// Temporary rewrited source data files\nsrc_file_name_EU3=" + m_srcFileNameEU3 + "\n" "src_file_name_EU0=" + m_srcFileNameEU0 + "\n" "src_file_name_points=" + m_srcFileNamePoints + "\n" "src_file_name_redpwr=" + m_srcFileNameRedPwr + "\n\n" "// Directory for calculation results\nreports_dir_name=" + m_reportsDirName + "\n\n" "// Measuring nozzle diameter " "(engine inlet air mass flow calculation)\nDn=" + QString::number(m_Dn) + "\n\n" "// Air oxygen concentration\nconc_O2air=" + QString::number(m_concO2air) + "\n\n" "//\nRr=" + QString::number(m_Rr) + "\n\n" "// Stoichiometric air/fuel ratio\nL0=" + QString::number(m_L0) + "\n\n" "// Opacimeter effective base\nL=" + QString::number(m_L) + "\n\n" "// Air carbon dioxide concentration\nconc_CO2air=" + QString::number(m_concCO2air) + "\n\n" "// Fuel percentage\nWH=" + QString::number(m_WH) + "\n" "WO2=" + QString::number(m_WO2) + "\n" "WN=" + QString::number(m_WN) + "\n\n" "// Molecular weights\nmuNO2=" + QString::number(m_muNO2) + "\n" "muCO=" + QString::number(m_muCO) + "\n" "muCH=" + QString::number(m_muCH) + "\n"; if ( cfgFile1.open(QIODevice::WriteOnly | QIODevice::Text) ) { cfgFile1.write(myPreferences.toUtf8()); cfgFile1.close(); cfgFile.setFileName(cfgFile1.fileName()); } else if ( cfgFile2.open(QIODevice::WriteOnly | QIODevice::Text) ) { cfgFile2.write(myPreferences.toUtf8()); cfgFile2.close(); cfgFile.setFileName(cfgFile2.fileName()); } else { throw txError("Can not create config file!"); } return; } if ( !cfgFile.open(QIODevice::ReadOnly | QIODevice::Text) ) { throw txError("Can not open config file " + cfgFileName + "!"); } QString s; QStringList elements; QRegExp rx("^//"); while ( !cfgFile.atEnd() ) { s = cfgFile.readLine().trimmed(); if ( s.isEmpty() || s.contains(rx) ) { continue; } elements = s.split("="); if ( elements[0] == "src_file_name_EU3" ) { m_srcFileNameEU3 = elements[1]; } else if ( elements[0] == "src_file_name_EU0" ) { m_srcFileNameEU0 = elements[1]; } else if ( elements[0] == "src_file_name_points" ) { m_srcFileNamePoints = elements[1]; } else if ( elements[0] == "src_file_name_redpwr" ) { m_srcFileNameRedPwr = elements[1]; } else if ( elements[0] == "reports_dir_name" ) { m_reportsDirName = elements[1]; } else if ( elements[0] == "Dn" ) { m_Dn = (elements[1]).toDouble(); } else if ( elements[0] == "conc_O2air" ) { m_concO2air = (elements[1]).toDouble(); } else if ( elements[0] == "Rr" ) { m_Rr = (elements[1]).toDouble(); } else if ( elements[0] == "L0" ) { m_L0 = (elements[1]).toDouble(); } else if ( elements[0] == "L" ) { m_L = (elements[1]).toDouble(); } else if ( elements[0] == "conc_CO2air" ) { m_concCO2air = (elements[1]).toDouble(); } else if ( elements[0] == "WH" ) { m_WH = (elements[1]).toDouble(); } else if ( elements[0] == "WO2" ) { m_WO2 = (elements[1]).toDouble(); } else if ( elements[0] == "WN" ) { m_WN = (elements[1]).toDouble(); } else if ( elements[0] == "muNO2" ) { m_muNO2 = (elements[1]).toDouble(); } else if ( elements[0] == "muCO" ) { m_muCO = (elements[1]).toDouble(); } else if ( elements[0] == "muCH" ) { m_muCH = (elements[1]).toDouble(); } elements.clear(); } elements.clear(); cfgFile.close(); }
QString txReducedPower::saveCheckoutData() const { QDir reportDir; const QString fullPath = reportDir.relativeFilePath(m_fullReportsPath) + QDir::separator() + "CheckoutData_R85_" + m_currTime + ".dat"; QFile choutData(fullPath); if ( !choutData.open(QFile::WriteOnly) ) { throw txError("Can not open file " + fullPath + "!"); } QTextStream fout(&choutData); fout << right << qSetFieldWidth(COLUMNWIDTH); for ( ptrdiff_t i=0; i<SRCDATACAPTIONS_REDPOWER.size(); i++ ) { fout << SRCDATACAPTIONS_REDPOWER[i]; } fout << "Ne_b[kW]" << "ge_b[g/kWh]" << "qcs[mg/cyc.l]" << "fm[-]" << "pa[kPa]" << "ps[kPa]" << "fa[-]" << "alphad[-]" << "Ne_r[kW]" << "Ne_nr[kW]" << "Me_nr[Nm]" << "ge_nr[g/kWh]"; fout << qSetFieldWidth(0) << "\n" << fixed << qSetFieldWidth(COLUMNWIDTH) << qSetRealNumberPrecision(PRECISION+1); for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { fout << qSetFieldWidth(COLUMNWIDTH) << qSetRealNumberPrecision(PRECISION); fout << (i + 1) << ma_n[i] << ma_Me_brutto[i] << ma_t0[i] << ma_B0[i] << ma_Ra[i] << ma_S[i] << ma_pk[i] << ma_Gfuel[i] << ma_N_k[i] << ma_N_fan[i] << ma_t_cool[i] << ma_t_oil[i] << ma_tk[i] << ma_tks[i] << ma_t_fuel[i] << ma_pks[i] << ma_Gair[i] << ma_Ne_brutto[i] << ma_ge_brutto[i] << ma_qcs[i] << ma_fm[i] << ma_pa[i] << ma_ps[i]; fout << qSetRealNumberPrecision(PRECISION+2); fout << ma_fa[i] << ma_alphad[i]; fout << qSetRealNumberPrecision(PRECISION); fout << ma_Ne_reduced[i] << ma_Ne_netto_reduced[i] << ma_Me_netto_reduced[i] << ma_ge_netto_reduced[i]; fout << qSetFieldWidth(0) << "\n"; } choutData.close(); return "libtoxic: Checkout data file \"" + fullPath + "\" created.\n"; }
void txPointsOfCycle::calculate() { const int currstd = m_calculationOptions->val_standard(); const int addpoints = m_calculationOptions->val_addPointsCalc(); if ( currstd == STD_EU6 || currstd == STD_EU5 || currstd == STD_EU4 || currstd == STD_EU3 ) { if ( addpoints == ADDPOINTSCALC_YES ) { m_numberOfPoints = ESCPOINTSNUMBER+ESCADDPOINTSNUMBER; } else { m_numberOfPoints = ESCPOINTSNUMBER; } prepArrays(); ma_n[ 0] = m_idle; ma_n[ 1] = m_A; ma_n[ 2] = m_B; ma_n[ 3] = m_B; ma_n[ 4] = m_A; ma_n[ 5] = m_A; ma_n[ 6] = m_A; ma_n[ 7] = m_B; ma_n[ 8] = m_B; ma_n[ 9] = m_C; ma_n[10] = m_C; ma_n[11] = m_C; ma_n[12] = m_C; if ( addpoints == ADDPOINTSCALC_YES ) { ma_n[13] = m_a1; ma_n[14] = m_a2; ma_n[15] = m_a3; } for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_N_fan[i] = N_fan(m_N_fan_rated, ma_n[i], m_n_rated); } ma_Ne_brutto[ 0] = 0; ma_Ne_brutto[ 1] = m_Ne_A; ma_Ne_brutto[ 2] = 0.50 * (m_Ne_B - ma_N_fan[2]) + ma_N_fan[2]; ma_Ne_brutto[ 3] = 0.75 * (m_Ne_B - ma_N_fan[3]) + ma_N_fan[3]; ma_Ne_brutto[ 4] = 0.50 * (m_Ne_A - ma_N_fan[4]) + ma_N_fan[4]; ma_Ne_brutto[ 5] = 0.75 * (m_Ne_A - ma_N_fan[5]) + ma_N_fan[5]; ma_Ne_brutto[ 6] = 0.25 * (m_Ne_A - ma_N_fan[6]) + ma_N_fan[6]; ma_Ne_brutto[ 7] = m_Ne_B; ma_Ne_brutto[ 8] = 0.25 * (m_Ne_B - ma_N_fan[8]) + ma_N_fan[8]; ma_Ne_brutto[ 9] = m_Ne_C; ma_Ne_brutto[10] = 0.25 * (m_Ne_C - ma_N_fan[10]) + ma_N_fan[10]; ma_Ne_brutto[11] = 0.75 * (m_Ne_C - ma_N_fan[11]) + ma_N_fan[11]; ma_Ne_brutto[12] = 0.50 * (m_Ne_C - ma_N_fan[12]) + ma_N_fan[12]; if ( addpoints == ADDPOINTSCALC_YES ) { ma_Ne_brutto[13] = 0.875 * (m_Ne_a1 - ma_N_fan[13]) + ma_N_fan[13]; ma_Ne_brutto[14] = 0.625 * (m_Ne_a2 - ma_N_fan[14]) + ma_N_fan[14]; ma_Ne_brutto[15] = 0.375 * (m_Ne_a3 - ma_N_fan[15]) + ma_N_fan[15]; } for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[ 0] = 0.15; ma_w[ 1] = 0.08; ma_w[ 2] = 0.10; ma_w[ 3] = 0.10; ma_w[ 4] = 0.05; ma_w[ 5] = 0.05; ma_w[ 6] = 0.05; ma_w[ 7] = 0.09; ma_w[ 8] = 0.10; ma_w[ 9] = 0.08; ma_w[10] = 0.05; ma_w[11] = 0.05; ma_w[12] = 0.05; if ( addpoints == ADDPOINTSCALC_YES ) { ma_w[13] = 1.0; ma_w[14] = 1.0; ma_w[15] = 1.0; } } else if ( currstd == STD_EU2 || currstd == STD_EU1 || currstd == STD_EU0 ) { m_numberOfPoints = ESCPOINTSNUMBER; prepArrays(); ma_n[ 0] = m_idle; ma_n[ 1] = m_n_interim; ma_n[ 2] = m_n_interim; ma_n[ 3] = m_n_interim; ma_n[ 4] = m_n_interim; ma_n[ 5] = m_n_interim; ma_n[ 6] = m_idle; ma_n[ 7] = m_n_rated; ma_n[ 8] = m_n_rated; ma_n[ 9] = m_n_rated; ma_n[10] = m_n_rated; ma_n[11] = m_n_rated; ma_n[12] = m_idle; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_N_fan[i] = N_fan(m_N_fan_rated, ma_n[i], m_n_rated); } ma_Ne_brutto[ 0] = 0; ma_Ne_brutto[ 1] = 0.10 * (m_Ne_interim - ma_N_fan[1]) + ma_N_fan[1]; ma_Ne_brutto[ 2] = 0.25 * (m_Ne_interim - ma_N_fan[2]) + ma_N_fan[2]; ma_Ne_brutto[ 3] = 0.50 * (m_Ne_interim - ma_N_fan[3]) + ma_N_fan[3]; ma_Ne_brutto[ 4] = 0.75 * (m_Ne_interim - ma_N_fan[4]) + ma_N_fan[4]; ma_Ne_brutto[ 5] = m_Ne_interim; ma_Ne_brutto[ 6] = 0; ma_Ne_brutto[ 7] = m_Ne_rated; ma_Ne_brutto[ 8] = 0.75 * (m_Ne_rated - ma_N_fan[8]) + ma_N_fan[8]; ma_Ne_brutto[ 9] = 0.50 * (m_Ne_rated - ma_N_fan[9]) + ma_N_fan[9]; ma_Ne_brutto[10] = 0.25 * (m_Ne_rated - ma_N_fan[10]) + ma_N_fan[10]; ma_Ne_brutto[11] = 0.10 * (m_Ne_rated - ma_N_fan[11]) + ma_N_fan[11]; ma_Ne_brutto[12] = 0; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[ 0] = 0.0833; ma_w[ 1] = 0.080; ma_w[ 2] = 0.080; ma_w[ 3] = 0.080; ma_w[ 4] = 0.080; ma_w[ 5] = 0.250; ma_w[ 6] = 0.0833; ma_w[ 7] = 0.100; ma_w[ 8] = 0.020; ma_w[ 9] = 0.020; ma_w[10] = 0.020; ma_w[11] = 0.020; ma_w[12] = 0.0833; } else if ( currstd == STD_OST3700123481 || currstd == STD_GOST17220597 ) { m_numberOfPoints = ESCPOINTSNUMBER; prepArrays(); ma_n[ 0] = m_idle; ma_n[ 1] = m_n_interim; ma_n[ 2] = m_n_interim; ma_n[ 3] = m_n_interim; ma_n[ 4] = m_n_interim; ma_n[ 5] = m_n_interim; ma_n[ 6] = m_idle; ma_n[ 7] = m_n_rated; ma_n[ 8] = m_n_rated; ma_n[ 9] = m_n_rated; ma_n[10] = m_n_rated; ma_n[11] = m_n_rated; ma_n[12] = m_idle; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_N_fan[i] = N_fan(m_N_fan_rated, ma_n[i], m_n_rated); } ma_Ne_brutto[ 0] = 0; if ( currstd == STD_OST3700123481 ) { ma_Ne_brutto[ 1] = 0.02 * (m_Ne_interim - ma_N_fan[1]) + ma_N_fan[1]; } else { ma_Ne_brutto[ 1] = 0.10 * (m_Ne_interim - ma_N_fan[1]) + ma_N_fan[1]; } ma_Ne_brutto[ 2] = 0.25 * (m_Ne_interim - ma_N_fan[2]) + ma_N_fan[2]; ma_Ne_brutto[ 3] = 0.50 * (m_Ne_interim - ma_N_fan[3]) + ma_N_fan[3]; ma_Ne_brutto[ 4] = 0.75 * (m_Ne_interim - ma_N_fan[4]) + ma_N_fan[4]; ma_Ne_brutto[ 5] = m_Ne_interim; ma_Ne_brutto[ 6] = 0; ma_Ne_brutto[ 7] = m_Ne_rated; ma_Ne_brutto[ 8] = 0.75 * (m_Ne_rated - ma_N_fan[8]) + ma_N_fan[8]; ma_Ne_brutto[ 9] = 0.50 * (m_Ne_rated - ma_N_fan[9]) + ma_N_fan[9]; ma_Ne_brutto[10] = 0.25 * (m_Ne_rated - ma_N_fan[10]) + ma_N_fan[10]; if ( currstd == STD_OST3700123481 ) { ma_Ne_brutto[11] = 0.02 * (m_Ne_rated - ma_N_fan[11]) + ma_N_fan[11]; } else { ma_Ne_brutto[11] = 0.10 * (m_Ne_rated - ma_N_fan[11]) + ma_N_fan[11]; } ma_Ne_brutto[12] = 0; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } if ( currstd == STD_OST3700123481 ) { ma_w[ 0] = 0.066666667; ma_w[ 1] = 0.080; ma_w[ 2] = 0.080; ma_w[ 3] = 0.080; ma_w[ 4] = 0.080; ma_w[ 5] = 0.080; ma_w[ 6] = 0.066666667; ma_w[ 7] = 0.080; ma_w[ 8] = 0.080; ma_w[ 9] = 0.080; ma_w[10] = 0.080; ma_w[11] = 0.080; ma_w[12] = 0.066666667; } else { ma_w[ 0] = 0.0833; ma_w[ 1] = 0.080; ma_w[ 2] = 0.080; ma_w[ 3] = 0.080; ma_w[ 4] = 0.080; ma_w[ 5] = 0.250; ma_w[ 6] = 0.0833; ma_w[ 7] = 0.100; ma_w[ 8] = 0.020; ma_w[ 9] = 0.020; ma_w[10] = 0.020; ma_w[11] = 0.020; ma_w[12] = 0.0833; } } else if ( currstd == STD_R96E8 || currstd == STD_R96F8 || currstd == STD_R96G8 || currstd == STD_R96D8 || currstd == STD_R96H8 || currstd == STD_R96I8 || currstd == STD_R96J8 || currstd == STD_R96K8 ) { m_numberOfPoints = H8POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = m_n_rated; ma_n[2] = m_n_rated; ma_n[3] = m_n_rated; ma_n[4] = m_n_interim; ma_n[5] = m_n_interim; ma_n[6] = m_n_interim; ma_n[7] = m_idle; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.50 * m_Ne_rated; ma_Ne_brutto[3] = 0.10 * m_Ne_rated; ma_Ne_brutto[4] = m_Ne_interim; ma_Ne_brutto[5] = 0.75 * m_Ne_interim; ma_Ne_brutto[6] = 0.50 * m_Ne_interim; ma_Ne_brutto[7] = 0; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; ma_N_fan[i] = N_fan(m_N_fan_rated, ma_n[i], m_n_rated); } ma_w[0] = 0.15; ma_w[1] = 0.15; ma_w[2] = 0.15; ma_w[3] = 0.10; ma_w[4] = 0.10; ma_w[5] = 0.10; ma_w[6] = 0.10; ma_w[7] = 0.15; } else if ( currstd == STD_R96E5 || currstd == STD_R96F5 || currstd == STD_R96G5 || currstd == STD_R96D5 || currstd == STD_R96H5 || currstd == STD_R96I5 || currstd == STD_R96J5 || currstd == STD_R96K5 ) { m_numberOfPoints = H5POINTSNUMBER; prepArrays(); ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.50 * m_Ne_rated; ma_Ne_brutto[3] = 0.25 * m_Ne_rated; ma_Ne_brutto[4] = 0.10 * m_Ne_rated; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_n[i] = m_n_rated; ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; ma_N_fan[i] = m_N_fan_rated; } ma_w[0] = 0.05; ma_w[1] = 0.25; ma_w[2] = 0.30; ma_w[3] = 0.30; ma_w[4] = 0.10; } else if ( currstd == STD_C1 ) { m_numberOfPoints = C1POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = m_n_rated; ma_n[2] = m_n_rated; ma_n[3] = m_n_rated; ma_n[4] = m_n_interim; ma_n[5] = m_n_interim; ma_n[6] = m_n_interim; ma_n[7] = m_idle; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.5 * m_Ne_rated; ma_Ne_brutto[3] = 0.1 * m_Ne_rated; ma_Ne_brutto[4] = m_Ne_interim; ma_Ne_brutto[5] = 0.75 * m_Ne_interim; ma_Ne_brutto[6] = 0.5 * m_Ne_interim; ma_Ne_brutto[7] = 0; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[0] = 0.15; ma_w[1] = 0.15; ma_w[2] = 0.15; ma_w[3] = 0.1; ma_w[4] = 0.1; ma_w[5] = 0.1; ma_w[6] = 0.1; ma_w[7] = 0.15; } else if ( currstd == STD_D1 ) { m_numberOfPoints = D1POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = m_n_rated; ma_n[2] = m_n_rated; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.5 * m_Ne_rated; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[0] = 0.3; ma_w[1] = 0.5; ma_w[2] = 0.2; } else if ( currstd == STD_D2 ) { m_numberOfPoints = D2POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = m_n_rated; ma_n[2] = m_n_rated; ma_n[3] = m_n_rated; ma_n[4] = m_n_rated; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.5 * m_Ne_rated; ma_Ne_brutto[3] = 0.25 * m_Ne_rated; ma_Ne_brutto[4] = 0.1 * m_Ne_rated; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[0] = 0.05; ma_w[1] = 0.25; ma_w[2] = 0.3; ma_w[3] = 0.3; ma_w[4] = 0.1; } else if ( currstd == STD_E1 ) { m_numberOfPoints = E1POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = m_n_rated; ma_n[2] = m_n_interim; ma_n[3] = m_n_interim; ma_n[4] = m_idle; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.75 * m_Ne_interim; ma_Ne_brutto[3] = 0.5 * m_Ne_interim; ma_Ne_brutto[4] = 0; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[0] = 0.08; ma_w[1] = 0.11; ma_w[2] = 0.19; ma_w[3] = 0.32; ma_w[4] = 0.3; } else if ( currstd == STD_E2 ) { m_numberOfPoints = E2POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = m_n_rated; ma_n[2] = m_n_rated; ma_n[3] = m_n_rated; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.5 * m_Ne_rated; ma_Ne_brutto[3] = 0.25 * m_Ne_rated; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[0] = 0.2; ma_w[1] = 0.5; ma_w[2] = 0.15; ma_w[3] = 0.15; } else if ( currstd == STD_E3 ) { m_numberOfPoints = E3POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = 0.91 * m_n_rated; ma_n[2] = 0.8 * m_n_rated; ma_n[3] = 0.63 * m_n_rated; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.5 * m_Ne_rated; ma_Ne_brutto[3] = 0.25 * m_Ne_rated; ma_w[0] = 0.2; ma_w[1] = 0.5; ma_w[2] = 0.15; ma_w[3] = 0.15; } else if ( currstd == STD_E5 ) { m_numberOfPoints = E5POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = 0.91 * m_n_rated; ma_n[2] = 0.8 * m_n_rated; ma_n[3] = 0.63 * m_n_rated; ma_n[4] = m_idle; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.5 * m_Ne_rated; ma_Ne_brutto[3] = 0.25 * m_Ne_rated; ma_Ne_brutto[4] = 0; ma_w[0] = 0.08; ma_w[1] = 0.13; ma_w[2] = 0.17; ma_w[3] = 0.32; ma_w[4] = 0.3; } else if ( currstd == STD_F ) { m_numberOfPoints = FPOINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = m_n_interim; ma_n[2] = m_idle; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.5 * m_Ne_interim; ma_Ne_brutto[2] = 0; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[0] = 0.25; ma_w[1] = 0.15; ma_w[2] = 0.6; } else if ( currstd == STD_G1 ) { m_numberOfPoints = G1POINTSNUMBER; prepArrays(); ma_n[0] = m_n_interim; ma_n[1] = m_n_interim; ma_n[2] = m_n_interim; ma_n[3] = m_n_interim; ma_n[4] = m_n_interim; ma_n[5] = m_idle; ma_Ne_brutto[0] = m_Ne_interim; ma_Ne_brutto[1] = 0.75 * m_Ne_interim; ma_Ne_brutto[2] = 0.5 * m_Ne_interim; ma_Ne_brutto[3] = 0.25 * m_Ne_interim; ma_Ne_brutto[4] = 0.1 * m_Ne_interim; ma_Ne_brutto[5] = 0; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[0] = 0.09; ma_w[1] = 0.2; ma_w[2] = 0.29; ma_w[3] = 0.3; ma_w[4] = 0.07; ma_w[5] = 0.05; } else if ( currstd == STD_G2 ) { m_numberOfPoints = G2POINTSNUMBER; prepArrays(); ma_n[0] = m_n_rated; ma_n[1] = m_n_rated; ma_n[2] = m_n_rated; ma_n[3] = m_n_rated; ma_n[4] = m_n_rated; ma_n[5] = m_idle; ma_Ne_brutto[0] = m_Ne_rated; ma_Ne_brutto[1] = 0.75 * m_Ne_rated; ma_Ne_brutto[2] = 0.5 * m_Ne_rated; ma_Ne_brutto[3] = 0.25 * m_Ne_rated; ma_Ne_brutto[4] = 0.1 * m_Ne_rated; ma_Ne_brutto[5] = 0; for ( ptrdiff_t i=0; i<m_numberOfPoints; i++ ) { ma_Me_brutto[i] = ma_Ne_brutto[i] * 9550.0 / ma_n[i]; } ma_w[0] = 0.09; ma_w[1] = 0.2; ma_w[2] = 0.29; ma_w[3] = 0.3; ma_w[4] = 0.07; ma_w[5] = 0.05; } else { throw txError("Unknown value of parameter \"standard\"!"); } }
QString objDescr() { QFile engDescrFile("r49data/engdescr.conf"); if ( !engDescrFile.exists() ) { return "..."; } if ( !engDescrFile.open(QIODevice::ReadOnly | QIODevice::Text) ) { throw txError("Can not open engine description file " + engDescrFile.fileName() + "!"); } QString str; QStringList elements; QRegExp comment("^//"); QStringList formattedBlocks; QString formattedDescr; while ( !engDescrFile.atEnd() ) { str = engDescrFile.readLine().trimmed(); if ( str.isEmpty() || str.contains(comment) ) { continue; } elements = str.split("="); if ( elements.size() != 2 ) { continue; } formattedBlocks.push_back(elements[0] + " " + elements[1] + "; "); elements.clear(); } engDescrFile.close(); if ( formattedBlocks.isEmpty() ) { return "..."; } if ( formattedBlocks.size() == 1 ) { QString retstr = formattedBlocks[0]; retstr.truncate(retstr.size()-2); return retstr; } else { QString currStr = formattedBlocks[0]; ptrdiff_t currStrNum = 0; ptrdiff_t maxStrWidth = 110; for ( ptrdiff_t i=1; i<formattedBlocks.size(); i++ ) { if ( currStrNum > 0 ) { maxStrWidth = 135; } if ( (currStr.size() + formattedBlocks[i].size()) <= maxStrWidth ) { currStr.append(formattedBlocks[i]); } else { formattedDescr.append(currStr); currStr = "\n "; currStr.append(formattedBlocks[i]); currStrNum++; } } formattedDescr.append(currStr); } formattedDescr.truncate(formattedDescr.size()-2); return formattedDescr; }