31 #include "TCilindro2T.h"
32 #include "TBloqueMotor.h"
33 #include "TCCCilindro.h"
40 TCilindro2T::TCilindro2T(
TBloqueMotor *Engine,
int nc,
bool ThereIsEGR) :
50 FAnguloRetrasoCombustion = 2.;
51 FPrimerInstanteCicloCerrado =
false;
59 TCilindro2T::~TCilindro2T() {
66 void TCilindro2T::ActualizaPropiedades(
double TiempoActual) {
68 double masavalesc, MasaAdmInstante = 0., MasaEscInstante = 0.;
69 double FraccionCC = 0., MasaCortocircuitoAdm = 0., MasaCortocircuitoEsc = 0.;
70 int NumeroUnionesEntrante = 0;
71 double FraccionMasicaAcum = 0., mfquefin = 0.;
73 double ctorbadmp = 0.;
75 if(FCicloCerrado && FPrimerInstanteCicloCerrado) {
77 FPrimerInstanteCicloCerrado =
false;
80 FMasaFuel = FMfController->
Output(TiempoActual);
81 else if(FMotor->getCombustible() == nmMEC)
82 FMasaFuel = FMotor->getMasaFuel();
86 FMaint = FMasaPorAdmision;
87 FRegInt = FMotor->getRegimen();
89 if(FMotor->getACT()) {
91 FMotor->NewInjectionData(TiempoActual);
93 VariableInicialesCicloACT();
95 for(
int i = 0; i < FIN; i++) {
96 FSOP[i] = FMotor->getInjecPulse(i).Angulo;
97 FMFI[i] = FMotor->getInjecPulse(i).Masa * FMotor->getMasaFuel() * 1e6;
101 CALCULUS_OF_INJECTION_RATE(FIN, FSOP, FMFI, FSOI, FEOI, Ftest_variables[0], FCAI, Ftest_variables[5], FA_TASA, FB_TASA,
102 FC_TASA, FD_TASA, Finjection_rate, FCAD_injection_rate);
104 ACT(Fengine_parameters, Fengine_model_constants, Ftest_variables, Finjection_rate, FCAD_injection_rate, Fsize_inlet_inj,
105 FIN, FSOI, FEOI, FCAI, FCAD_exit, FHRF_exit, FROHR_exit,
106 Fp_cyl_exit, Fdp_da_cyl_exit, FT_cyl_exit, FH_cooler_exit, Fmean_var_exit, Fheat_transfer, Finjection_rate_exit,
107 Faccum_injection_rate_exit, dataIN, &dataOUT);
110 double ACT_Correction = 0;
111 for(
int i = 0; i < 8; i++) {
112 ACT_Correction += dataOUT.species_EVO[i];
114 for(
int i = 0; i < 8; i++) {
115 dataOUT.species_EVO[i] = dataOUT.species_EVO[i] / ACT_Correction;
122 if(FCalcComb == nmFQL) {
124 InicioFinCombustion();
125 if(FMotor->getFTipoDatosIny() == 1) {
126 FNumIny = FMotor->getFNumeroInyecciones();
127 FTInyeccion = FMotor->getFTIny();
128 FPercentInyeccion = FMotor->getFPercentIny();
129 FAnguloInjeccion = FMotor->getFAngIny();
130 for(
int i = 0; i < FNumIny; i++) {
131 FTInyeccion[i] = FTInyeccion[i] * 1e-3;
132 FPercentInyeccion[i] = FPercentInyeccion[i] / 100;
134 if(FAnguloInjeccion[i] < 0) {
135 FAnguloInjeccion[i] = FAnguloInjeccion[i] + FMotor->getAngTotalCiclo();
141 }
else if(FMotor->getFTipoDatosIny() == 2) {
143 FAnguloInjeccion.resize(FNumIny);
144 FTInyeccion.resize(FNumIny);
145 FPercentInyeccion.resize(FNumIny);
146 if(FMotor->getFAngIniIny() < 0) {
147 FAnguloInjeccion[0] = FMotor->getFAngIniIny() + FMotor->getAngTotalCiclo();
149 FAnguloInjeccion[0] = FMotor->getFAngIniIny();
151 FPercentInyeccion[0] = 1.;
155 if(FMotor->getLeyQuemadoBD()[0].Wiebes.size() == 4) {
157 FAnguloInjeccion.resize(FNumIny);
158 FTInyeccion.resize(FNumIny);
159 FPercentInyeccion.resize(FNumIny);
160 FTInyeccion[0] = 5 / (FMotor->getRegimen() * 6.);
161 FTInyeccion[1] = (FFinComb - FIniComb) / (FMotor->getRegimen() * 6.) / 4.;
162 FPercentInyeccion[0] = FMotor->getLeyQuemadoBD()[0].Wiebes[0].Beta;
163 FPercentInyeccion[1] = 1. - FPercentInyeccion[0];
165 if(FMotor->getLeyQuemadoBD()[0].Wiebes[1].Alpha0 < 0) {
166 FAnguloInjeccion[1] = FMotor->getLeyQuemadoBD()[0].Wiebes[1].Alpha0 + FMotor->getAngTotalCiclo();
167 FAnguloInjeccion[0] = FMotor->getLeyQuemadoBD()[0].Wiebes[0].Alpha0 + FMotor->getAngTotalCiclo();
169 FAnguloInjeccion[1] = FMotor->getLeyQuemadoBD()[0].Wiebes[1].Alpha0;
170 FAnguloInjeccion[0] = FMotor->getLeyQuemadoBD()[0].Wiebes[0].Alpha0 + FMotor->getAngTotalCiclo();
174 FAnguloInjeccion.resize(FNumIny);
175 FPercentInyeccion.resize(FNumIny);
176 FTInyeccion.resize(FNumIny);
177 cout << FFinComb - FIniComb << endl;
178 FTInyeccion[0] = (FFinComb - FIniComb) / (FMotor->getRegimen() * 6.) / 4.;
179 FAnguloInjeccion[0] = FIniComb - FAnguloRetrasoCombustion +
180 FMotor->getAngTotalCiclo();
181 FPercentInyeccion[0] = 1;
184 }
else if(FCalcComb == nmACT) {
186 FAnguloInjeccion[0] = FMotor->getInjecPulse(0).Angulo;
187 FIniComb = FMotor->getInjecPulse(0).Angulo;
188 FFinComb = FDistribucion.AE;
193 std::cout <<
"INFO: Fuel mass: " << FMasaFuel * 1e6 <<
" (mg)" << std::endl;
194 std::cout <<
"____________________________________________________" << std::endl;
197 if(FMotor->getGammaCalculation() == nmGammaConstante) {
198 if(FMotor->getSpeciesModel() == nmCalculoCompleto) {
199 if(FMotor->getSpeciesNumber() == 9) {
200 FFraccionMasicaEspecieFuel = 0;
201 }
else if(FMotor->getSpeciesNumber() == 10) {
202 FFraccionMasicaEspecieFuel = FFraccionMasicaEspecie[7];
204 FRMezcla = CalculoCompletoRMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2],
205 FFraccionMasicaEspecieFuel, nmComposicionTemperatura,
206 FMotor->getCombustible());
207 FCpMezcla = CalculoCompletoCpMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2],
208 FFraccionMasicaEspecieFuel, __units::degCToK(FTemperature),
209 nmComposicionTemperatura, FMotor->getCombustible());
210 FGamma = CalculoCompletoGamma(FRMezcla, FCpMezcla, nmComposicionTemperatura);
212 }
else if(FMotor->getSpeciesModel() == nmCalculoSimple) {
213 FRMezcla = CalculoSimpleRMezcla(FComposicionCicloCerrado[0], FComposicionCicloCerrado[1], FMotor->getGammaCalculation(),
214 FMotor->getCombustible());
216 FCvMezcla = CalculoSimpleCvMezcla(__units::degCToK(FTemperature), FComposicionCicloCerrado[0],
217 FComposicionCicloCerrado[1], nmComposicionTemperatura, FMotor->getCombustible());
218 FGamma = CalculoSimpleGamma(FRMezcla, FCvMezcla, nmComposicionTemperatura);
221 }
else if(FMotor->getGammaCalculation() == nmComposicion || FMotor->getGammaCalculation() == nmComposicionTemperatura) {
222 if(FMotor->getSpeciesModel() == nmCalculoCompleto) {
223 if(FMotor->getSpeciesNumber() == 9) {
224 FFraccionMasicaEspecieFuel = 0;
225 }
else if(FMotor->getSpeciesNumber() == 10) {
226 FFraccionMasicaEspecieFuel = FFraccionMasicaEspecie[7];
228 FRMezcla = CalculoCompletoRMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2],
229 FFraccionMasicaEspecieFuel, FMotor->getGammaCalculation(),
230 FMotor->getCombustible());
231 FCpMezcla = CalculoCompletoCpMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2],
232 FFraccionMasicaEspecieFuel, __units::degCToK(FTemperature),
233 FMotor->getGammaCalculation(), FMotor->getCombustible());
234 FGamma = CalculoCompletoGamma(FRMezcla, FCpMezcla, FMotor->getGammaCalculation());
236 }
else if(FMotor->getSpeciesModel() == nmCalculoSimple) {
238 FRMezcla = CalculoSimpleRMezcla(FComposicionCicloCerrado[0], FComposicionCicloCerrado[1], FMotor->getGammaCalculation(),
239 FMotor->getCombustible());
242 FCvMezcla = CalculoSimpleCvMezcla(__units::degCToK(FTemperature), FComposicionCicloCerrado[0],
243 FComposicionCicloCerrado[1], FMotor->getGammaCalculation(), FMotor->getCombustible());
244 FGamma = CalculoSimpleGamma(FRMezcla, FCvMezcla, FMotor->getGammaCalculation());
248 FGamma1 = __Gamma::G1(FGamma);
249 FGamma2 = __Gamma::G2(FGamma);
250 FGamma4 = __Gamma::G4(FGamma);
251 FGamma6 = __Gamma::G6(FGamma);
255 FTime1 = TiempoActual;
256 FDeltaT = FTime1 - FTime0;
257 FDeltaAngulo = FMotor->getAngTotalCiclo() * FMotor->getRegimen() / 60. * FDeltaT;
258 FAnguloAnterior = FAnguloActual;
259 FAnguloActual = FAnguloAnterior + FDeltaAngulo;
260 if(FAnguloActual > FMotor->getAngTotalCiclo()) {
261 FAnguloActual -= FMotor->getAngTotalCiclo();
266 if(FAnguloActual > 180.) {
267 FAnguloComb0 = FAnguloActual - FMotor->getAngTotalCiclo() - FDeltaAngulo;
268 FAnguloComb = FAnguloActual - FMotor->getAngTotalCiclo();
270 FAnguloComb0 = FAnguloComb;
271 FAnguloComb = FAnguloActual;
274 if(FAnguloActual >= FDistribucion.AE && FAnguloAnterior < FDistribucion.AE) {
275 FCicloCerrado =
false;
276 FResMediosCilindro.CalorCombustionSUM = FCalor.LiberadoTotal;
277 FCalor.Liberado = 0.;
278 FCalor.LiberadoTotal = 0.;
285 if(FMotor->getACT()) {
286 for(
int i = 0; i < FNumeroUnionesAdm; i++) {
287 FPresionMedAdm += FCCValvulaAdm[i]->GetTuboExtremo(0).Pipe->
GetPresion(0) * FDeltaT / FNumeroUnionesAdm;
289 for(
int i = 0; i < FNumeroUnionesEsc; i++) {
290 FPresionMedEsc += FCCValvulaEsc[i]->GetTuboExtremo(0).Pipe->
GetPresion(0) * FDeltaT / FNumeroUnionesEsc;
292 FTimeAcumAct += FDeltaT;
300 if(!FCicloCerrado && FDeltaAngulo > 0.) {
302 for(
int i = 0; i < FNumeroUnionesAdm; i++) {
303 FMasaValvAdm = -
dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getMassflow() *
305 if(FAnguloActual - FDeltaAngulo < FDistribucion.CA
306 && FAnguloActual > FDistribucion.CA) {
307 FMasaValvAdm = FMasaValvAdm * (FDistribucion.CA - FAnguloActual + FDeltaAngulo) / FDeltaAngulo;
309 MasaAdmInstante += FMasaValvAdm;
310 FMasa += FMasaValvAdm;
312 FAcumMasaPorAdm += FMasaValvAdm;
315 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
316 FMasaEspecie[j] += FCCValvulaAdm[i]->GetFraccionMasicaEspecie(j) * FMasaValvAdm;
319 FAcumMasaEGR += FCCValvulaAdm[i]->GetFraccionMasicaEspecie(FMotor->getSpeciesNumber() - 1) * FMasaValvAdm;
322 for(
int i = 0; i < FNumeroUnionesEsc; i++) {
323 masavalesc = -
dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getMassflow() *
325 if(FAnguloActual - FDeltaAngulo < FDistribucion.CE && FAnguloActual > FDistribucion.CE) {
326 masavalesc = masavalesc * (FDistribucion.CE - FAnguloActual + FDeltaAngulo) /
329 MasaEscInstante += masavalesc;
331 FAcumMasaPorEsc += masavalesc;
334 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
335 FMasaEspecie[j] += FCCValvulaEsc[i]->GetFraccionMasicaEspecie(j) * masavalesc;
343 if(FPressure > FMotor->getPresionAmb() && FMotor->getGeometria().CDBlowBy > 0.) {
344 if(FMotor->getPresionAmb() / FPressure < pow(2. / FGamma2, FGamma6)) {
345 FPresionCarter = FPressure * pow(2. / FGamma2, FGamma4 / 2.);
348 FPresionCarter = FMotor->getPresionAmb();
350 z = FGamma4 * (pow(FPresionCarter / FPressure, 2 / FGamma) - pow(FPresionCarter / FPressure, FGamma2 / FGamma));
351 FGastoBlowBy = FMotor->getGeometria().CDBlowBy * 3.5e-5 * FMotor->getGeometria().Diametro * __units::BarToPa(
352 FPressure) * sqrt(z / FRMezcla / __units::degCToK(FTemperature));
356 FMasaBlowBy = FGastoBlowBy * FDeltaT;
363 for(
int i = 0; i < FNumIny; i++) {
364 if(FAnguloActual > FAnguloInjeccion[i] && FAnguloAnterior <= FAnguloInjeccion[i] && FMotor->getCombustible() == nmMEC) {
382 if(FMotor->getACT()) {
383 FTasaFuel = Interp1(FAnguloComb, FCAD_injection_rate, Finjection_rate, FCAI) / 1000.;
384 FFuelInstant = FTasaFuel * FDeltaT;
386 if(FAnguloComb > FCAD_injection_rate[FCAI - 1]) {
392 if(FMotor->getFTipoDatosIny() == 2) {
393 FTasaFuel = FMotor->TasaInyInterp(FAnguloComb);
395 FTasaFuel = FMasaFuel * FPercentInyeccion[ind] / FTInyeccion[ind];
397 FFuelInstant = FTasaFuel * FDeltaT;
400 if((FFuelAcum + FFuelInstant) > FMasaFuel * FPercentInyeccion[ind]) {
402 FFuelInstant = FMasaFuel * FPercentInyeccion[ind] - FFuelAcum;
406 FFuelAcum += FFuelInstant;
407 FFuelTotal += FFuelInstant;
413 FMasa = FMasa + FFuelInstant - FMasaBlowBy;
418 if(FAnguloActual > FDistribucion.CA && FAnguloAnterior <= FDistribucion.CA && !FCicloCerrado) {
420 FCicloCerrado =
true;
421 FPrimerInstanteCicloCerrado =
true;
422 FMasaPorAdmision = FAcumMasaPorAdm;
425 FMasaPorEscape = FAcumMasaPorEsc;
427 FMasaEGR = FAcumMasaEGR;
429 FMasaAtrapada = FMasa;
430 if(FMotor->getCombustible() == nmMEP) {
431 CalculaFuelMEP(FMasaPorAdmision);
433 FPresionRCA = FPressure;
435 if(FMotor->getACT()) {
436 if(FMotor->getSpeciesNumber() == 9) {
437 FSpecies_IVC[0] = FFraccionMasicaEspecie[7];
438 }
else if(FMotor->getSpeciesNumber() == 10) {
439 FSpecies_IVC[0] = FFraccionMasicaEspecie[8];
441 FSpecies_IVC[1] = FFraccionMasicaEspecie[0];
442 FSpecies_IVC[2] = FFraccionMasicaEspecie[1];
443 FSpecies_IVC[3] = FFraccionMasicaEspecie[2];
444 FSpecies_IVC[4] = FFraccionMasicaEspecie[5];
445 FSpecies_IVC[5] = FFraccionMasicaEspecie[6];
446 FSpecies_IVC[6] = FFraccionMasicaEspecie[4];
447 FSpecies_IVC[7] = FFraccionMasicaEspecie[3];
451 if(FMotor->getSpeciesModel() == nmCalculoCompleto) {
452 if(FMotor->getSpeciesNumber() == 9) {
453 for(
int i = 0; i < FMotor->getSpeciesNumber() - FIntEGR; i++) {
454 FFraccionComienzoCicloCerrado[i] = FFraccionMasicaEspecie[i];
456 FComposicionCicloCerrado[1] = 0.;
459 FComposicionCicloCerrado[2] = FFraccionMasicaEspecie[0] / FMotor->GetComposicionAtmosfera(0);
460 FComposicionCicloCerrado[0] = 1 - FComposicionCicloCerrado[2];
462 }
else if(FMotor->getSpeciesNumber() == 10) {
463 for(
int i = 0; i < FMotor->getSpeciesNumber() - FIntEGR; i++) {
464 FFraccionComienzoCicloCerrado[i] = FFraccionMasicaEspecie[i];
466 FComposicionCicloCerrado[1] = FFraccionMasicaEspecie[7];
469 FComposicionCicloCerrado[2] = FFraccionMasicaEspecie[0] / FMotor->GetComposicionAtmosfera(0);
470 FComposicionCicloCerrado[0] = 1 - FComposicionCicloCerrado[1] - FComposicionCicloCerrado[2];
472 }
else if(FMotor->getSpeciesModel() == nmCalculoSimple) {
473 if(FMotor->getSpeciesNumber() == 3) {
474 FComposicionCicloCerrado[1] = 0.;
476 FComposicionCicloCerrado[2] = FFraccionMasicaEspecie[1];
478 FComposicionCicloCerrado[0] = FFraccionMasicaEspecie[0];
481 }
else if(FMotor->getSpeciesNumber() == 4) {
482 FComposicionCicloCerrado[1] = FFraccionMasicaEspecie[1];
484 FComposicionCicloCerrado[2] = FFraccionMasicaEspecie[2];
486 FComposicionCicloCerrado[0] = FFraccionMasicaEspecie[0];
490 for(
int j = 0; j < 3; j++) {
491 FMasaEspecieCicloCerrado[j] = FMasa * FComposicionCicloCerrado[j];
495 FFraccionMasicaEspecie[FMotor->getSpeciesNumber() - 1] = 1.;
497 if(FMotor->getCombustible() == nmMEP) {
498 CalculaFuelMEP(FMasaEspecieCicloCerrado[2]);
501 std::cout <<
"INFO: End of Gas-exchange process in cylinder " << FNumeroCilindro << std::endl;
502 std::cout <<
"____________________________________________________" << std::endl;
503 std::cout <<
"INFO: Intake mass: " << FMasaPorAdmision * 1e3 <<
" (g)" << std::endl;
504 std::cout <<
"INFO: Exhaust mass: " << FMasaPorEscape * 1e3 <<
" (g)" << std::endl;
505 std::cout <<
"INFO: Trapped mass: " << FMasaAtrapada * 1e3 <<
" (g)" << std::endl;
507 std::cout <<
"INFO: Pressure at I.C.: " << FPresionRCA <<
" (bar)" << std::endl;
515 FVolumen0 = FVolumen;
516 FVolumen = CalculaVolumen(FAnguloActual);
521 if(FMotor->getCombustible() == nmMEP || FMotor->getCombustible() == nmMEC) {
525 double tcil = __units::degCToK(FTemperature);
526 double visc = 7.457e-6 + 4.1547e-8 * tcil - 7.4793e-12 *
pow2(tcil);
527 double dens = __units::BarToPa(FPressure) / FRMezcla / tcil;
528 double reyn = dens * FCm * FMotor->getGeometria().Diametro / visc;
529 double nuss = 0.26 * pow(reyn, 0.7);
530 double condk = 6.1944e-3 + 7.3814e-5 * tcil - 1.2491e-8 *
pow2(tcil);
531 Fh = condk * nuss / FMotor->getGeometria().Diametro;
536 if(FAnguloActual >= 0. && FAnguloActual <= 90.) {
537 Fequis = Fratioctm + 1 / (pow(cosh(FAnguloActual / 100.), 40.) + Fratioctm / (1 - Fratioctm));
538 }
else if(FAnguloActual >= 270. && FAnguloActual <= 360.) {
539 Fequis = Fratioctm + 1 / (pow(cosh((360. - FAnguloActual) / 100.), 40.) + Fratioctm / (1 - Fratioctm));
543 FCu = __units::RPMToRad_s(FMotor->getRegimen()) * Fequis * Fctorbadmp * FKctm *
pow2(
544 FMotor->getGeometria().Diametro) / (2. * FMotor->getGeometria().DiametroBowl);
547 if(FAnguloComb < FIniComb || FAnguloComb > FFinComb || FMasaFuel == 0.) {
554 double deltaP = __units::BarToPa(FPressure - FPresionRCA * pow(FVolumenCA / FVolumen, 1.36));
557 if(FAnguloActual >= 90. && FAnguloActual <= 180.) {
559 Fh = 1.2e-2 * pow(__units::BarToPa(FPressure), 0.8) * pow(__units::degCToK(FTemperature),
560 -0.53) * pow(FMotor->getGeometria().Diametro, -0.2) * pow(
561 (6.18 * FCm + 0.417 * FCu) * FMotor->getAjusteTranCalEsc() + Fc2 * deltaP * FMotor->getGeometria().CilindradaUnitaria /
562 FMasaAtrapada / FRMezcla, 0.8);
563 }
else if(FAnguloActual >= 180. && FAnguloActual <= 270.) {
565 Fh = 1.2e-2 * pow(__units::BarToPa(FPressure), 0.8) * pow(__units::degCToK(FTemperature),
566 -0.53) * pow(FMotor->getGeometria().Diametro, -0.2) * pow(
567 (6.18 * FCm + 0.417 * FCu) * FMotor->getAjusteTranCalAdm() + Fc2 * deltaP * FMotor->getGeometria().CilindradaUnitaria /
568 FMasaAtrapada / FRMezcla, 0.8);
570 Fh = 1.2e-2 * pow(__units::BarToPa(FPressure), 0.8) * pow(__units::degCToK(FTemperature),
571 -0.53) * pow(FMotor->getGeometria().Diametro, -0.2) * pow(
572 (FMotor->getWoschni().cw1 * FCm + FMotor->getWoschni().cw2 * FCu) + Fc2 * deltaP *
573 FMotor->getGeometria().CilindradaUnitaria / FMasaAtrapada / FRMezcla, 0.8);
577 if(FMotor->getCalculoPared() != nmTempFija)
578 CalculaTemperaturasPared();
581 FCalor.TransCilindro = Fh * (FTempPared[0].Cylinder - FTemperature) * 4 * (FVolumen / 2. + FVolumen0 / 2. -
582 FMotor->getGeometria().VCC) / FMotor->getGeometria().Diametro;
583 FCalor.TransPiston = Fh * (FTempPared[0].Piston - FTemperature) * FMotor->getGeometria().AreaPiston;
584 FCalor.TransCulata = Fh * (FTempPared[0].Culata - FTemperature) * FMotor->getGeometria().AreaCulata;
585 FCalor.TransTotal = (FCalor.TransCilindro + FCalor.TransPiston + FCalor.TransCulata) * FDeltaT;
589 if(FAnguloComb < FIniComb || FAnguloComb > FFinComb || FMasaFuel == 0.) {
590 FCalor.Liberado = 0.;
591 FCalor.LiberadoTotal = 0.;
595 FMasaEspecieCicloCerrado[0] = FMasaEspecieCicloCerrado[0] - FComposicionCicloCerrado[0] * FMasaBlowBy;
597 FMasaEspecieCicloCerrado[1] = FMasaEspecieCicloCerrado[1] + FFuelInstant;
598 FMasaEspecieCicloCerrado[2] = FMasaEspecieCicloCerrado[2] - FComposicionCicloCerrado[2] * FMasaBlowBy;
600 FComposicionCicloCerrado[0] = FMasaEspecieCicloCerrado[0] / FMasa;
601 FComposicionCicloCerrado[1] = FMasaEspecieCicloCerrado[1] / FMasa;
602 FComposicionCicloCerrado[2] = FMasaEspecieCicloCerrado[2] / FMasa;
606 if(FPrimeraCombustion) {
607 if(FCalcComb == nmFQL) {
612 FCalor.FQL0 = CalculaCalorLiberado(FAnguloComb - FDeltaAngulo);
614 FCalor.FQL0 = FCalor.FQL;
616 FPrimeraCombustion =
false;
618 if(FCalcComb == nmFQL) {
619 FUfgasoil = CalculoUfgasoil(FTemperature);
620 Fecg = (FHcl - FUfgasoil) * FFuelInstant;
622 FCalor.FQL = CalculaCalorLiberado(FAnguloComb);
623 FecgInt = (Fecg + Fecg0) / 2 * FDeltaT;
625 FecgTotal += (Fecg + Fecg0) / 2 * FDeltaT;
627 }
else if(FCalcComb == nmACT) {
628 FCalor.FQL = Interp1(FAnguloComb, FCAD_exit, FHRF_exit, FCAI);
630 FCalor.Liberado = (FCalor.FQL - FCalor.FQL0) * FMfint * FMotor->getPoderCalorifico() *
631 FMotor->getRendimientoCombustion();
632 FCalor.LiberadoTotal += FCalor.Liberado;
633 if(FCalor.Liberado < 0)
634 FCalor.Liberado = 0.;
637 FMfquem = FCalor.Liberado / FMotor->getPoderCalorifico();
638 FMairequem = FMfquem / FDosadoEstequiometrico;
639 if(FMairequem > (FMasaEspecieCicloCerrado[2])) {
641 mfquefin = FMasaEspecieCicloCerrado[2] * FDosadoEstequiometrico;
643 printf(
"WARNING: Cylinder %d does not have enough air at CrankAngle %lf\n", FNumeroCilindro, FAnguloActual);
644 FCalor.Liberado = (FCalor.FQL - FCalor.FQL0) * mfquefin * FMotor->getPoderCalorifico() *
645 FMotor->getRendimientoCombustion();
649 FMasaEspecieCicloCerrado[0] = FMasaEspecieCicloCerrado[0] + FMairequem + mfquefin - FComposicionCicloCerrado[0] *
652 FMasaEspecieCicloCerrado[1] = FMasaEspecieCicloCerrado[1] - mfquefin - FComposicionCicloCerrado[1] * FMasaBlowBy +
654 FMasaEspecieCicloCerrado[2] = 0.;
657 FCalor.Liberado = 0.;
659 FMasaEspecieCicloCerrado[0] = FMasaEspecieCicloCerrado[0] - FComposicionCicloCerrado[0] * FMasaBlowBy;
661 FMasaEspecieCicloCerrado[1] = FMasaEspecieCicloCerrado[1] - FComposicionCicloCerrado[1] * FMasaBlowBy +
668 FMasaEspecieCicloCerrado[0] = FMasaEspecieCicloCerrado[0] + FMairequem + FMfquem - FComposicionCicloCerrado[0] *
670 FMasaEspecieCicloCerrado[1] = FMasaEspecieCicloCerrado[1] - FMfquem - FComposicionCicloCerrado[1] * FMasaBlowBy +
672 FMasaEspecieCicloCerrado[2] = FMasaEspecieCicloCerrado[2] - FMairequem - FComposicionCicloCerrado[2] *
676 FComposicionCicloCerrado[0] = FMasaEspecieCicloCerrado[0] / FMasa;
677 FComposicionCicloCerrado[1] = FMasaEspecieCicloCerrado[1] / FMasa;
678 FComposicionCicloCerrado[2] = FMasaEspecieCicloCerrado[2] / FMasa;
680 FCalor.FQL0 = FCalor.FQL;
686 if(FMotor->getSpeciesModel() == nmCalculoCompleto) {
687 if(FMotor->getACT()) {
688 double Yfuel = (FFuelTotal - FMfint * FCalor.FQL) / FMasa;
692 FFraccionMasicaEspecie[0] = (FSpecies_IVC[1] * (1 - FCalor.FQL) + dataOUT.species_EVO[1] * FCalor.FQL) * (1 - Yfuel);
693 FFraccionMasicaEspecie[1] = (FSpecies_IVC[2] * (1 - FCalor.FQL) + dataOUT.species_EVO[2] * FCalor.FQL) * (1 - Yfuel);
694 FFraccionMasicaEspecie[2] = (FSpecies_IVC[3] * (1 - FCalor.FQL) + dataOUT.species_EVO[3] * FCalor.FQL) * (1 - Yfuel);
695 FFraccionMasicaEspecie[3] = (FSpecies_IVC[7] * (1 - FCalor.FQL) + dataOUT.species_EVO[7] * FCalor.FQL) * (1 - Yfuel);
696 FFraccionMasicaEspecie[4] = (FSpecies_IVC[6] * (1 - FCalor.FQL) + dataOUT.species_EVO[6] * FCalor.FQL) * (1 - Yfuel);
697 FFraccionMasicaEspecie[5] = (FSpecies_IVC[4] * (1 - FCalor.FQL) + dataOUT.species_EVO[4] * FCalor.FQL) * (1 - Yfuel);
698 FFraccionMasicaEspecie[6] = (FSpecies_IVC[5] * (1 - FCalor.FQL) + dataOUT.species_EVO[5] * FCalor.FQL) * (1 - Yfuel);
700 if(FMotor->getSpeciesNumber() == 9) {
701 FFraccionMasicaEspecie[3] += Yfuel;
702 FFraccionMasicaEspecie[7] = (FSpecies_IVC[0] * (1 - FCalor.FQL) + dataOUT.species_EVO[0] * FCalor.FQL) * (1 - Yfuel);
704 }
else if(FMotor->getSpeciesNumber() == 10) {
705 FFraccionMasicaEspecie[7] = Yfuel;
706 FFraccionMasicaEspecie[8] = (FSpecies_IVC[0] * (1 - FCalor.FQL) + dataOUT.species_EVO[0] * FCalor.FQL) * (1 - Yfuel);
708 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
709 FMasaEspecie[j] = FFraccionMasicaEspecie[j] * FMasa;
712 if(FMotor->getSpeciesNumber() == 9) {
714 FMolesCombQuemado = FMfquem / (FXComb * 12.01 + FYComb * 1.01 + FZComb *
717 FMolesCombQuemado = mfquefin / (FXComb * 12.01 + FYComb * 1.01 + FZComb *
720 FMasaO2Reactivos = FMolesCombQuemado * (FYComb / 4 + FXComb - FZComb / 2) * __PM::O2;
721 FMasaN2Reactivos = FMolesCombQuemado * (FYComb / 4 + FXComb - FZComb / 2) * FRelacionMolarN2_O2 * __PM::N2;
723 FMasaCO2Productos = FMolesCombQuemado * FXComb * __PM::CO2;
724 FMasaH2OProductos = FMolesCombQuemado * (FYComb / 2
727 FMasaN2Productos = FMolesCombQuemado * (FYComb / 4 + FXComb - FZComb / 2) * FRelacionMolarN2_O2 * __PM::N2;
729 FFraccionMasicaEspecie[0] = (FMasaEspecie[0] - FMasaO2Reactivos - FFraccionMasicaEspecie[0] * FMasaBlowBy) / FMasa;
731 FFraccionMasicaEspecie[1] = (FMasaEspecie[1] + FMasaCO2Productos - FFraccionMasicaEspecie[1] * FMasaBlowBy) / FMasa;
733 FFraccionMasicaEspecie[2] = (FMasaEspecie[2] + FMasaH2OProductos - FFraccionMasicaEspecie[2] *
734 FMasaBlowBy ) / FMasa;
736 FFraccionMasicaEspecie[7] = (FMasaEspecie[7] - FFraccionMasicaEspecie[7] * FMasaBlowBy) / FMasa;
737 FFraccionMasicaEspecie[3] = FComposicionCicloCerrado[1];
738 FFraccionMasicaEspecie[4] = 0;
739 FFraccionMasicaEspecie[5] = 0;
740 FFraccionMasicaEspecie[6] = 0;
741 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
742 FMasaEspecie[j] = FFraccionMasicaEspecie[j] * FMasa;
745 }
else if(FMotor->getSpeciesNumber() == 10) {
747 FMolesCombQuemado = FMfquem / (FXComb * 12.01 + FYComb * 1.01 + FZComb *
750 FMolesCombQuemado = mfquefin / (FXComb * 12.01 + FYComb * 1.01 + FZComb *
753 FMasaO2Reactivos = FMolesCombQuemado * (FYComb / 4 + FXComb - FZComb / 2) * __PM::O2;
754 FMasaN2Reactivos = FMolesCombQuemado * (FYComb / 4 + FXComb - FZComb / 2) * FRelacionMolarN2_O2 * __PM::N2;
756 FMasaCO2Productos = FMolesCombQuemado * FXComb * __PM::CO2;
757 FMasaH2OProductos = FMolesCombQuemado * (FYComb / 2
760 FMasaN2Productos = FMolesCombQuemado * (FYComb / 4 + FXComb - FZComb / 2) * FRelacionMolarN2_O2 * __PM::N2;
762 FFraccionMasicaEspecie[0] = (FMasaEspecie[0] - FMasaO2Reactivos - FFraccionMasicaEspecie[0] * FMasaBlowBy) / FMasa;
764 FFraccionMasicaEspecie[1] = (FMasaEspecie[1] + FMasaCO2Productos - FFraccionMasicaEspecie[1] * FMasaBlowBy) / FMasa;
766 FFraccionMasicaEspecie[2] = (FMasaEspecie[2] + FMasaH2OProductos - FFraccionMasicaEspecie[2] *
767 FMasaBlowBy ) / FMasa;
769 FFraccionMasicaEspecie[8] = (FMasaEspecie[8] - FFraccionMasicaEspecie[7] * FMasaBlowBy) / FMasa;
770 FFraccionMasicaEspecie[3] = 0;
771 FFraccionMasicaEspecie[4] = 0;
772 FFraccionMasicaEspecie[5] = 0;
773 FFraccionMasicaEspecie[6] = 0;
774 FFraccionMasicaEspecie[7] = FComposicionCicloCerrado[1];
775 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
776 FMasaEspecie[j] = FFraccionMasicaEspecie[j] * FMasa;
781 }
else if(FMotor->getSpeciesModel() == nmCalculoSimple) {
782 if(FMotor->getSpeciesNumber() == 3) {
783 FFraccionMasicaEspecie[0] = FComposicionCicloCerrado[0] + FComposicionCicloCerrado[1];
784 FFraccionMasicaEspecie[1] = FComposicionCicloCerrado[2];
786 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
787 FMasaEspecie[j] = FFraccionMasicaEspecie[j] * FMasa;
789 }
else if(FMotor->getSpeciesNumber() == 4) {
790 FFraccionMasicaEspecie[0] = FComposicionCicloCerrado[0];
791 FFraccionMasicaEspecie[1] = FComposicionCicloCerrado[1];
792 FFraccionMasicaEspecie[2] = FComposicionCicloCerrado[2];
794 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
795 FMasaEspecie[j] = FFraccionMasicaEspecie[j] * FMasa;
799 }
else if(!FCicloCerrado) {
800 for(
int j = 0; j < FMotor->getSpeciesNumber() - 2; j++) {
801 FFraccionMasicaEspecie[j] = (FMasaEspecie[j] - FFraccionMasicaEspecie[j] * FMasaBlowBy) / FMasa;
802 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
803 FMasaEspecie[j] = FFraccionMasicaEspecie[j] * FMasa;
805 FFraccionMasicaEspecie[FMotor->getSpeciesNumber() - 2] = 1. - FraccionMasicaAcum;
806 FMasaEspecie[FMotor->getSpeciesNumber() - 2] = FFraccionMasicaEspecie[FMotor->getSpeciesNumber() - 2] * FMasa;
808 FFraccionMasicaEspecie[FMotor->getSpeciesNumber() - 1] = (FMasaEspecie[FMotor->getSpeciesNumber() - 1] -
809 FFraccionMasicaEspecie[FMotor->getSpeciesNumber() - 1] * FMasaBlowBy) / FMasa;
810 FMasaEspecie[FMotor->getSpeciesNumber() - 1] = FFraccionMasicaEspecie[FMotor->getSpeciesNumber() - 1] * FMasa;
815 if(FAnguloActual > FDistribucion.CA && FAnguloAnterior <= FDistribucion.CA) {
816 if(FMasaFuel == 0.) {
819 FAFR = FMasaEspecieCicloCerrado[2] / FMasaFuel;
852 bool PrimerPaso =
true;
853 double ASon0 = FAsonido;
854 double ASon1 = FAsonido;
855 double Temp0 = FTemperature;
856 double Temp1 = FTemperature;
857 double MasTemp0 = 1 / __units::degCToK(FTemperature) / FMasa0;
858 double MasTemp1 = 1 / __units::degCToK(FTemperature) / FMasa0;
859 double MasTempMed = 0.;
860 bool CotaError =
false;
871 for(
int i = 0; i < FNumeroUnionesAdm; i++) {
872 if(
dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getMassflow() != 0
873 &&
dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getSentidoFlujo() == nmEntrante) {
875 H1 += EntalpiaEntrada(
dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getSpeedsound(),
876 dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getVelocity(),
877 -
dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getMassflow() * FDeltaT, ASon1 / __cons::ARef, FMasa0);
879 H1 += EntalpiaEntrada(
dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getSpeedsound(),
880 dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getVelocity(),
881 -
dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getMassflow() * FDeltaT, ASon1 / __cons::ARef, FMasa);
886 for(
int i = 0; i < FNumeroUnionesEsc; i++) {
887 if(
dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getMassflow() != 0
888 &&
dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getSentidoFlujo() == nmEntrante) {
890 H1 += EntalpiaEntrada(
dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getSpeedsound(),
891 dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getVelocity(),
892 -
dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getMassflow() * FDeltaT, ASon1 / __cons::ARef, FMasa0);
894 H1 += EntalpiaEntrada(
dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getSpeedsound(),
895 dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getVelocity(),
896 -
dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getMassflow() * FDeltaT, ASon1 / __cons::ARef, FMasa);
904 MasTempMed = (MasTemp0 + MasTemp1) / 2;
905 Energia = FVolumen0 * FMasa / FVolumen / FMasa0 * exp((H1 + H0) / 2. + (FCalor.TransTotal + FCalor.Liberado + FecgInt)
906 * (MasTempMed / FRMezcla));
907 Temp1 = __units::KTodegC(__units::degCToK(FTemperature) * pow(Energia, FGamma1));
908 Error = (Diff = Temp1 - Temp0, fabs(Diff)) / Temp1;
910 MasTemp1 = 1. / (__units::degCToK(Temp1) * FMasa);
923 FTemperatura0 = FTemperature;
924 FTemperature = Temp1;
926 FAsonido0 = FAsonido;
927 FAsonido = sqrt(FGamma * FRMezcla * __units::degCToK(FTemperature));
929 FPresion0 = FPressure;
930 FPressure = __units::PaToBar(__units::degCToK(FTemperature) * FMasa * FRMezcla / FVolumen);
931 if(FAnguloActual > FDistribucion.AE && FAnguloAnterior <= FDistribucion.AE) {
932 std::cout <<
"INFO: Begin gas-exchange process in cylinder " << FNumeroCilindro << std::endl;
933 std::cout <<
"____________________________________________________" << std::endl << std::endl;
934 std::cout <<
"INFO: Calculated pressure at E.O.: " << FPressure <<
" (bar)" << std::endl;
935 std::cout <<
"INFO: Calculated temperature at E.O.: " << FTemperature <<
" (\260C)" << std::endl;
936 if(FMotor->getCalculoDePAAE() == nmPAAEImpuesta) {
937 FPressure = FMotor->getPresionAAE();
938 FTemperature = __units::KTodegC(__units::BarToPa(FPressure) * FVolumen / FMasa / FRMezcla);
939 FAsonido = sqrt(FRMezcla * FGamma * __units::degCToK(FTemperature));
940 std::cout <<
"INFO: Imposed pressure at E.O.: " << FPressure <<
" (bar)" << std::endl;
941 std::cout <<
"INFO: Imposed temperature at E.O.: " << FTemperature <<
" (\260C)" << std::endl;
943 if(FMotor->getImponerComposicionAE()) {
944 for(
int i = 0; i < FMotor->getSpeciesNumber() - 1; i++) {
945 FFraccionMasicaEspecie[i] = FMotor->GetComposicionInicial(i);
948 std::cout <<
"____________________________________________________" << std::endl << std::endl;
955 double a = __units::DegToRad(FAnguloActual);
956 double L = FMotor->getGeometria().Biela;
957 double R = FMotor->getGeometria().Carrera / 2.;
958 double e = FMotor->getGeometria().Excentricidad / 1000;
959 double area = __geom::Circle_area(FMotor->getGeometria().Diametro);
961 double b = asin((e - R * sin(a)) / L);
964 FParInstantaneo = __units::BarToPa(FPressure - FMotor->getPresionAmb()) * area * R * sin(a - b) / cos(b);
966 FPreMed = (FPressure + FPresion0) / 2.;
968 FTrabajoNetoACUM += __units::BarToPa(FPreMed) * (FVolumen - FVolumen0);
969 if(FAnguloActual > 180 && FAnguloActual <= 540) {
970 FTrabajoBombeoACUM += __units::BarToPa(FPreMed) * (FVolumen - FVolumen0);
972 if(FAnguloActual < FAnguloAnterior) {
973 FTrabajoNeto = FTrabajoNetoACUM;
974 FTrabajoNetoACUM = 0.;
975 FPMN = __units::PaToBar(FTrabajoNeto / FMotor->getGeometria().CilindradaUnitaria);
976 FTrabajoBombeo = FTrabajoBombeoACUM;
977 FTrabajoBombeoACUM = 0.;
978 FPMB = __units::PaToBar(FTrabajoBombeo / FMotor->getGeometria().CilindradaUnitaria);
982 FDensidadReferencia = FMotor->getTuboRendVol()->
GetGamma(FMotor->getNodoMedio()) * __units::BarToPa(
983 FMotor->getTuboRendVol()->
GetPresion(FMotor->getNodoMedio())) /
pow2(
984 FMotor->getTuboRendVol()->
GetAsonido(FMotor->getNodoMedio()) * __cons::ARef);
990 if(FAnguloActual > FDistribucion.AA && FAnguloActual < FDistribucion.CE) {
991 if(MasaAdmInstante > 0. && MasaEscInstante < 0.) {
993 MasaCortocircuitoAdm = MasaAdmInstante * FAlphaEscape / __cons::Pi;
994 MasaCortocircuitoEsc = MasaEscInstante * (__cons::Pi_2 - FAlphaEscape) / __cons::Pi;
995 if(fabs(MasaCortocircuitoAdm) < fabs(MasaCortocircuitoEsc)) {
996 FMasaCortocircuito = fabs(MasaCortocircuitoAdm);
998 FMasaCortocircuito = fabs(MasaCortocircuitoEsc);
1000 FGastoCortocircuito = FMasaCortocircuito / FDeltaT;
1001 for(
int j = 0; j < FMotor->getSpeciesNumber() - 2; j++) {
1002 for(
int i = 0; i < FNumeroUnionesAdm; i++) {
1003 if(
dynamic_cast<TCCCilindro*
>(FCCValvulaAdm[i])->getSentidoFlujo() == nmEntrante) {
1004 FraccionCC += FCCValvulaAdm[i]->GetFraccionMasicaEspecie(j);
1005 NumeroUnionesEntrante++;
1008 FraccionCC = FraccionCC / NumeroUnionesEntrante;
1010 FComposicionSaliente[j] = FFraccionMasicaEspecie[j] * (MasaEscInstante + FMasaCortocircuito) / MasaEscInstante -
1011 FraccionCC * FMasaCortocircuito / MasaEscInstante;
1013 NumeroUnionesEntrante = 0;
1016 FComposicionSaliente[FMotor->getSpeciesNumber() - 1] = FFraccionMasicaEspecie[FMotor->getSpeciesNumber() - 1];
1017 }
else if(MasaAdmInstante < 0. && MasaEscInstante > 0.) {
1019 MasaCortocircuitoAdm = MasaAdmInstante * (__cons::Pi_2 - FAlphaAdmision) / __cons::Pi;
1020 MasaCortocircuitoEsc = MasaEscInstante * FAlphaAdmision / __cons::Pi;
1021 if(fabs(MasaCortocircuitoAdm) < fabs(MasaCortocircuitoEsc)) {
1022 FMasaCortocircuito = -fabs(MasaCortocircuitoAdm);
1024 FMasaCortocircuito = -fabs(MasaCortocircuitoEsc);
1026 FGastoCortocircuito = FMasaCortocircuito / FDeltaT;
1027 for(
int j = 0; j < FMotor->getSpeciesNumber() - 2; j++) {
1028 for(
int i = 0; i < FNumeroUnionesEsc; i++) {
1029 if(
dynamic_cast<TCCCilindro*
>(FCCValvulaEsc[i])->getSentidoFlujo() == nmEntrante) {
1030 FraccionCC += FCCValvulaEsc[i]->GetFraccionMasicaEspecie(j);
1031 NumeroUnionesEntrante++;
1034 FraccionCC = FraccionCC / NumeroUnionesEntrante;
1037 FComposicionSaliente[j] = FFraccionMasicaEspecie[j] * (MasaAdmInstante - FMasaCortocircuito) / MasaAdmInstante +
1038 FraccionCC * FMasaCortocircuito / MasaAdmInstante;
1040 NumeroUnionesEntrante = 0;
1043 FComposicionSaliente[FMotor->getSpeciesNumber() - 1] = FFraccionMasicaEspecie[FMotor->getSpeciesNumber() - 1];
1046 FMasaCortocircuito = 0.;
1047 FGastoCortocircuito = 0.;
1048 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
1049 FComposicionSaliente[j] = FFraccionMasicaEspecie[j];
1054 FMasaCortocircuito = 0.;
1055 FGastoCortocircuito = 0.;
1056 for(
int j = 0; j < FMotor->getSpeciesNumber() - FIntEGR; j++) {
1057 FComposicionSaliente[j] = FFraccionMasicaEspecie[j];
1061 }
catch(exception & N) {
1062 std::cout <<
"ERROR: TCilindro2T::ActualizaPropiedades en cilindro: " << FNumeroCilindro << std::endl;
1063 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1071 double TCilindro2T::EntalpiaEntrada(
double ASonEnt,
double VelEnt,
double MasEnt,
double ASonCil,
double MasCil) {
1073 double xx = 0., yy = 0., ret_val = 0.;
1075 if(fabs(MasEnt) != 0.) {
1076 xx = (ASonEnt * ASonEnt / ASonCil / ASonCil - 1.) / FGamma1;
1077 yy = VelEnt * VelEnt / ASonCil / ASonCil / 2.;
1078 ret_val = FGamma * MasEnt * (xx + yy) / MasCil;
1083 }
catch(exception & N) {
1084 std::cout <<
"ERROR: TCilindro2T::EntalpiaEntrada en cilindro: " << FNumeroCilindro << std::endl;
1085 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1093 void TCilindro2T::VariableInicialesCicloACT() {
1095 FPresionMedAdm /= FTimeAcumAct;
1096 FPresionMedEsc /= FTimeAcumAct;
1099 Ftest_variables[0] = FRegInt;
1100 if(FMasaPorAdmision != 0)
1101 Ftest_variables[1] = (FMasaPorAdmision - FMasaEGR) * 1000;
1103 Ftest_variables[2] = FMasaAtrapada * 1000;
1104 Ftest_variables[3] = __units::degCToK(FTemperature);
1105 Ftest_variables[4] = FMasaFuel * 1e6;
1106 Ftest_variables[5] = FMotor->getInjectionSys().InjectPressure;
1108 Ftest_variables[6] = __units::BarToPa(FPresionMedAdm);
1109 Ftest_variables[7] = __units::BarToPa(FPresionMedEsc);
1112 Ftest_variables[10] = 318.15;
1113 Ftest_variables[11] = __units::degCToK(FTempPared[0].Culata);
1115 Ftest_variables[12] = __units::degCToK(FTempPared[0].Cylinder);
1117 Ftest_variables[13] = __units::degCToK(FTempPared[0].Piston);
1118 if(FMotor->getSpeciesModel() == nmCalculoCompleto) {
1119 Ftest_variables[14] = FFraccionMasicaEspecie[5] * 1e6 * 1.587;
1121 Ftest_variables[15] = FFraccionMasicaEspecie[4] * 1e6;
1123 Ftest_variables[16] = FFraccionMasicaEspecie[6] * 1e6;
1125 Ftest_variables[17] = FFraccionMasicaEspecie[3] * 1e6;
1129 std::cout <<
"____________________________________________________" << std::endl;
1130 std::cout <<
"INFO: Engine speed: " << Ftest_variables[0] <<
" (rpm)" << std::endl;
1131 std::cout <<
"INFO: Intake mass: " << Ftest_variables[1] <<
" (kg/s)" << std::endl;
1132 std::cout <<
"INFO: Trapped mass: " << Ftest_variables[2] <<
" (g)" << std::endl;
1133 std::cout <<
"INFO: Temperature at IVC: " << Ftest_variables[3] <<
" (K)" << std::endl;
1134 std::cout <<
"INFO: Fuel mass: " << Ftest_variables[4] <<
" (mg)" << std::endl;
1135 std::cout <<
"INFO: Injection pressure: " << Ftest_variables[5] <<
" (bar)" << std::endl;
1136 std::cout <<
"INFO: Intake pressure: " << Ftest_variables[6] <<
" (Pa)" << std::endl;
1137 std::cout <<
"INFO: Exhaust pressure: " << Ftest_variables[7] <<
" (Pa)" << std::endl;
1138 std::cout <<
"____________________________________________________" << std::endl;
1139 }
catch(exception & N) {
1140 std::cout <<
"ERROR: TCilindro2T::VariableInicialesCicloACT en cilindro: " << FNumeroCilindro << std::endl;
1141 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1146 #pragma package(smart_init)