37 #include "TCCCilindro.h"
44 #include "TValvula4T.h"
46 #include "TLumbrera.h"
48 #include "TBloqueMotor.h"
49 #include "TCilindro4T.h"
55 TCCCilindro::TCCCilindro(nmTypeBC TipoCC,
int numCC, nmTipoCalculoEspecies SpeciesModel,
int numeroespecies,
56 nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
57 TCondicionContorno(TipoCC, numCC, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
59 if(TipoCC == nmIntakeValve)
60 FTipoValv = nmValvAdmision;
61 else if(TipoCC == nmExhaustValve)
62 FTipoValv = nmValvEscape;
64 printf(
"ERROR en tipo de valvula TCCCilindro en la condicion de contorno: %d\n", FNumeroCC);
73 FVelocidadGarganta = 0.;
76 FRelacionPresionGarganta = 1.;
88 TCCCilindro::~TCCCilindro() {
90 delete[] FTuboExtremo;
102 void TCCCilindro::AsignaTipoValvula(
TTipoValvula **Origen,
int Valv,
int i) {
105 switch(Origen[Valv - 1]->getTypeOfValve()) {
110 FValvula =
new TLamina(
dynamic_cast<TLamina*
>(Origen[Valv - 1]), i);
119 FValvula->PutPipe(FTuboExtremo[0].Pipe, FNodoFin);
121 FSeccionValvula = __geom::Circle_area(FValvula->getDiametro());
122 FSeccionTubo = __geom::Circle_area(FTuboExtremo[0].Pipe->GetDiametro(FNodoFin));
124 }
catch(exception & N) {
125 std::cout <<
"ERROR: TCCCilindro::AsignaTipoValvula en la condicion de contorno: " << FNumeroCC << std::endl;
126 std::cout <<
"Tipo de error: " << N.what() << std::endl;
134 void TCCCilindro::ReadBoundaryData(
const char *FileWAM, fpos_t &filepos,
int NumberOfPipes,
TTubo **Pipe,
int nDPF,
141 FTuboExtremo[0].Pipe = NULL;
145 while(FNumeroTubosCC < 1 && i < NumberOfPipes) {
146 if(Pipe[i]->getNodoIzq() == FNumeroCC) {
147 FTuboExtremo[FNumeroTubosCC].Pipe = Pipe[i];
148 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmLeft;
151 FCC = &(FTuboExtremo[FNumeroTubosCC].Beta);
152 FCD = &(FTuboExtremo[FNumeroTubosCC].Landa);
155 if(Pipe[i]->getNodoDer() == FNumeroCC) {
156 FTuboExtremo[FNumeroTubosCC].Pipe = Pipe[i];
157 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmRight;
158 FNodoFin = Pipe[i]->getNin() - 1;
160 FCC = &(FTuboExtremo[FNumeroTubosCC].Landa);
161 FCD = &(FTuboExtremo[FNumeroTubosCC].Beta);
166 FILE *fich = fopen(FileWAM,
"r");
167 fsetpos(fich, &filepos);
171 fscanf(fich,
"%d ", &FNumeroCilindro);
173 fgetpos(fich, &filepos);
177 FFraccionMasicaEspecie =
new double[FNumeroEspecies - FIntEGR];
178 for(
int i = 0; i < FNumeroEspecies - FIntEGR; i++) {
184 catch(exception & N) {
185 std::cout <<
"ERROR: TCCCilindro::LeeCCCilindro en la condicion de contorno: " << FNumeroCC << std::endl;
186 std::cout <<
"Tipo de error: " << N.what() << std::endl;
194 void TCCCilindro::AsignaCilindro(
TBloqueMotor *EngineBlock) {
197 FMotor = EngineBlock;
198 FCilindro = EngineBlock->GetCilindro(FNumeroCilindro - 1);
199 FAnguloActual = FCilindro->getAnguloActual();
200 FValvula->PutCylider(FCilindro);
202 }
catch(exception & N) {
203 std::cout <<
"ERROR: TCCCilindro::AsignaCilindro en la condicion de contorno: " << FNumeroCC << std::endl;
204 std::cout <<
"Tipo de error: " << N.what() << std::endl;
212 void TCCCilindro::CalculaCondicionContorno(
double Time) {
214 double rel_CCon_Entropia, coef, FraccionMasicaAcum = 0.;
219 FGamma = FTuboExtremo[0].Pipe->
GetGamma(FNodoFin);
220 FGamma1 = __Gamma::G1(FGamma);
221 FGamma2 = __Gamma::G2(FGamma);
222 FGamma3 = __Gamma::G3(FGamma);
223 FGamma4 = __Gamma::G4(FGamma);
224 FGamma5 = __Gamma::G5(FGamma);
225 FGamma6 = __Gamma::G6(FGamma);
230 FAd = pow(FCilindro->getPressure() / FPref, 1. / FGamma4);
231 rel_CCon_Entropia = *FCC / FTuboExtremo[0].Entropia;
232 if(rel_CCon_Entropia / FAd > 1.000005) {
233 FSentidoFlujo = nmEntrante;
234 FValvula->GetCDin(FTime1);
235 FCDEntrada = FValvula->getCDTubVol();
236 if(FCDEntrada > 0.0001) {
237 FSeccionEficaz = FCDEntrada * FSeccionValvula;
238 FlujoEntranteCilindro();
241 FCTorbellino = FValvula->getCTorb();
242 if(FTipoValv == nmValvEscape) {
243 coef = FCTorbellino / 4.;
247 FMomento = coef *
pow2(__cons::ARef * FGasto) / (200000 * FMotor->getGeometria().Carrera * FGamma *
248 FCilindro->getPressure()) * (
pow2(*FCC + *FCD) / 4. + FGamma3 *
pow2(
249 ((*FCD - *FCC) / FGamma1)));
252 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
254 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
256 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
258 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FTuboExtremo[0].Pipe->
GetFraccionMasicaCC(FIndiceCC, FNumeroEspecies - 1);
265 FVelocidadGarganta = 0.;
268 FRelacionPresionGarganta = 0.;
272 }
else if(rel_CCon_Entropia / FAd < .999995) {
273 FSentidoFlujo = nmSaliente;
274 FValvula->GetCDout(FTime1);
275 FCDSalida = FValvula->getCDVolTub();
276 if(FCDSalida > 0.0001) {
277 FSeccionEficaz = FCDSalida * FSeccionValvula;
278 FlujoSalienteCilindro();
281 FMomento = -FCilindro->getMomentoAngular() * FGasto / FCilindro->getMasa();
285 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
286 FFraccionMasicaEspecie[j] = FCilindro->GetComposicionSaliente(j);
287 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
289 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
291 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FCilindro->GetComposicionSaliente(FNumeroEspecies - 1);
298 FVelocidadGarganta = 0.;
301 FRelacionPresionGarganta = 0.;
306 FSentidoFlujo = nmParado;
311 FVelocidadGarganta = 0.;
314 FRelacionPresionGarganta = 0.;
318 FValvula->AcumulaCDMedio(Time);
319 }
catch(exception & N) {
320 std::cout <<
"ERROR: TCCCilindro::CalculaCondicionContorno en la condicion de contorno: " << FNumeroCC << std::endl;
321 std::cout <<
"Tipo de error: " << N.what() << std::endl;
329 void TCCCilindro::FlujoEntranteCilindro() {
331 double vel_son_garganta = 0., velocidad_garganta = 0., Mach = 0., xaa2 = 0., ycal = 0., d1 = 0.;
333 Fk = FSeccionTubo / FSeccionEficaz;
336 vel_son_garganta = FTuboExtremo[0].Entropia * FAd;
339 FCaso = nmFlujoEntranteSaltoSubcritico;
341 FSonido = FTuboExtremo[0].Entropia * FAd;
342 FVelocity = (*FCC - FSonido) / FGamma3;
344 Resolucion(vel_son_garganta, *FCC, FCaso, &FVelocity, &FSonido);
347 velocidad_garganta = sqrt(2. * FGamma6 * (
pow2(FSonido) + FGamma3 *
pow2(FVelocity) -
pow2(vel_son_garganta)));
351 if(velocidad_garganta > vel_son_garganta) {
352 FCaso = nmFlujoEntranteSaltoSupercritico;
353 Resolucion(0.0, 1.0, FCaso, &ycal, &Mach);
354 FVelocity = *FCC / (1 / Mach + FGamma3);
355 FSonido = FVelocity / Mach;
357 d1 = Fk * FVelocity * pow(FSonido, 1. / FGamma3);
358 vel_son_garganta = pow(d1, FGamma1 / FGamma2);
359 velocidad_garganta = vel_son_garganta;
361 double Ga3U = FGamma3 * FVelocity;
364 xaa2 = pow(FTuboExtremo[0].Entropia, FGamma4);
365 FGasto = __units::BarToPa(-FGamma * FSeccionTubo * pow(FSonido,
366 2 * FGamma6) * FVelocity) / (__cons::ARef * xaa2);
367 *FCD = FSonido - Ga3U;
368 *FCC = FSonido + Ga3U;
369 FRelacionPresionGarganta = pow(FSonido / (FTuboExtremo[0].Entropia * FAd), FGamma4);
370 FGastoGarganta = FGasto / (FCDEntrada * FSeccionValvula);
371 FMachGarganta = -velocidad_garganta / vel_son_garganta;
372 FVelocidadGarganta = velocidad_garganta;
375 catch(exception & N) {
376 std::cout <<
"ERROR: TCCCilindro::FlujoEntranteCilindro en la condicion de contorno: " << FNumeroCC << std::endl;
377 std::cout <<
"Tipo de error: " << N.what() << std::endl;
385 void TCCCilindro::FlujoSalienteCilindro() {
388 double a1 = 0., xx = 0., yy = 0., d1 = 0., Ga3U = 0.;
389 double a2cr = 0., val1 = 0., val2 = 0., u2cr = 0., ycal = 0., error = 0., valde = 0., miembro2 = 0.;
391 double relacion_velocidades_son, Mach_tras_ondachoque, Mach, temp_antes_ondachoque, temp_tras_ondachoque;
394 Fk = FSeccionTubo / FSeccionEficaz;
398 double sqrtGa2 = sqrt(2. / FGamma2);
402 u2cr = FCilindro->getSpeedsound() / __cons::ARef * sqrtGa2 * (sqrt(
pow2(Fk) + FGamma1 * FGamma2) - Fk) / FGamma1;
403 a2cr = sqrt(
pow2(FCilindro->getSpeedsound() / __cons::ARef) - FGamma3 *
pow2(u2cr));
410 stFSSub FSA2(FTuboExtremo[0].Entropia, FAd, FGamma, Fk, *FCC, FCilindro->getSpeedsound() / __cons::ARef);
419 a1 = sqrtGa2 * FCilindro->getSpeedsound() / __cons::ARef;
420 FVelocidadGarganta = a1;
421 xx = pow(FAd / (FCilindro->getSpeedsound() / __cons::ARef), FGamma4);
422 yy = pow(a1, 2. / FGamma1);
423 Fcc = FVelocidadGarganta * yy * xx / Fk;
426 stFSSup FU2(FTuboExtremo[0].Entropia, Fcc, FGamma, Fk, *FCC, FCilindro->getSpeedsound() / __cons::ARef);
427 val1 = FU2(FVelocidadGarganta);
430 valde = FVelocidadGarganta;
432 valde = (FCilindro->getSpeedsound() / __cons::ARef) / sqrt(FGamma3);
436 FCaso = nmFlujoSalienteSaltoSupercritico;
437 Resolucion(0.0, valde, FCaso, &FVelocity, &FSonido);
438 Ga3U = FVelocity * FGamma3;
440 xx = pow(sqrtGa2, (FGamma2 / FGamma1));
441 yy = pow(FAd, FGamma4);
442 FGasto = __units::BarToPa(FCDSalida * FSeccionValvula * FGamma * xx * yy) / (FCilindro->getSpeedsound());
448 Mach = FVelocity / FSonido;
450 FTuboExtremo[0].Entropia = FTuboExtremo[0].Entropia * FSonido / xx;
457 xx = FGamma4 *
pow2(Mach) - 1.;
458 Mach_tras_ondachoque = sqrt((
pow2(Mach) + 2. / FGamma1) / xx);
459 temp_tras_ondachoque = FGamma3 *
pow2(Mach) + 1.;
460 temp_antes_ondachoque = FGamma3 *
pow2(Mach_tras_ondachoque) + 1.;
461 relacion_velocidades_son = sqrt(temp_tras_ondachoque / temp_antes_ondachoque);
462 FSonido = FSonido * relacion_velocidades_son;
463 FVelocity = FSonido * Mach_tras_ondachoque;
464 Ga3U = FVelocity * FGamma3;
465 d1 = xx * FGamma1 / FGamma2;
466 FTuboExtremo[0].Entropia = FTuboExtremo[0].Entropia * relacion_velocidades_son / pow(d1, FGamma5);
471 FCaso = nmFlujoSalienteSaltoSubcritico;
472 Resolucion(a2cr, FCilindro->getSpeedsound() / __cons::ARef, FCaso, &ycal, &FSonido);
474 root_a =
pow2(FCilindro->getSpeedsound() / __cons::ARef) -
pow2(FSonido);
476 FVelocity = sqrt((
pow2(FCilindro->getSpeedsound() / __cons::ARef) -
pow2(FSonido)) / FGamma3);
477 }
else if(root_a > -1e12) {
481 printf(
"ERROR: Calculating outflow in boundary %d", FNumeroCC);
483 Ga3U = FVelocity * FGamma3;
486 a1 = FCilindro->getSpeedsound() / __cons::ARef * xx / (FTuboExtremo[0].Entropia * FAd);
487 FVelocidadGarganta = Fk *
pow2(a1) * FVelocity /
pow2(FSonido);
488 FGasto = __units::BarToPa(FCDSalida * FSeccionValvula * FGamma * pow(FAd / (FCilindro->getSpeedsound() / __cons::ARef),
489 FGamma4) * FVelocidadGarganta * pow(a1, 2. / FGamma1)) / __cons::ARef;
491 FTuboExtremo[0].Entropia = FTuboExtremo[0].Entropia * FSonido / xx;
494 *FCD = FSonido + Ga3U;
495 *FCC = FSonido - Ga3U;
496 d1 = FSonido / (FTuboExtremo[0].Entropia * FAd);
497 FRelacionPresionGarganta = pow(d1, FGamma4);
498 FMachGarganta = FVelocidadGarganta / a1;
500 FGastoGarganta = FGasto / (FCDSalida * FSeccionValvula);
503 catch(exception & N) {
504 std::cout <<
"ERROR: TCCCilindro::FlujoSalienteCilindro en la condicion de contorno: " << FNumeroCC << std::endl;
505 std::cout <<
"Tipo de error: " << N.what() << std::endl;
513 void TCCCilindro::Resolucion(
double ext1,
double ext2, nmCaso Caso,
double *u2t,
double *a2t) {
515 if(Caso == nmFlujoEntranteSaltoSubcritico) {
516 stFESub FEA2(FTuboExtremo[0].Entropia, FAd, FGamma, Fk, *FCC);
519 }
else if(Caso == nmFlujoEntranteSaltoSupercritico) {
521 *a2t =
FindRoot(FMatch, ext1, ext2);
523 }
else if(Caso == nmFlujoSalienteSaltoSubcritico) {
524 stFSSub FSA2(FTuboExtremo[0].Entropia, FAd, FGamma, Fk, *FCC, FCilindro->getSpeedsound() / __cons::ARef);
527 }
else if(Caso == nmFlujoSalienteSaltoSupercritico) {
528 stFSSup FU2(FTuboExtremo[0].Entropia, Fcc, FGamma, Fk, *FCC, FCilindro->getSpeedsound() / __cons::ARef);
532 printf(
"Error en la definicion del flujo TCCDeposito::Resolucion en la condicion de contorno: %d\n", FNumeroCC);
537 catch(exception & N) {
538 std::cout <<
"ERROR: TCCCilindro::Resolucion en la condicion de contorno: " << FNumeroCC << std::endl;
539 std::cout <<
"Tipo de error: " << N.what() << std::endl;
664 FTime1 = TiempoActual;
665 FDeltaT = FTime1 - FTime0;
666 FDeltaAngulo = 360. * Regimen / 60. * FDeltaT;
667 FAnguloAnterior = FAnguloActual;
668 FAnguloActual = FAnguloAnterior + FDeltaAngulo;
669 if(FAnguloActual > 720.) {
670 FAnguloActual -= 720.;
673 }
catch(exception & N) {
674 std::cout <<
"ERROR: TCCCilindro::ActualizaAnguloValvula en la condicion de contorno: " << FNumeroCC << std::endl;
675 std::cout <<
"Tipo de error: " << N.what() << std::endl;
680 #pragma package(smart_init)