32 #include "TCCDeposito.h"
39 #include "TValvula4T.h"
41 #include "TDiscoRotativo.h"
42 #include "TLumbrera.h"
43 #include "TValvulaContr.h"
44 #include "TWasteGate.h"
45 #include "TEstatorTurbina.h"
46 #include "TRotorTurbina.h"
47 #include "TCDExterno.h"
48 #include "TMariposa.h"
50 #include "TDepVolVariable.h"
51 #include "TDepVolCte.h"
52 #include "TTurbinaSimple.h"
53 #include "TTurbinaTwin.h"
55 #include "TUnionDireccional.h"
59 #include "TCanalDPF.h"
64 TCCDeposito::TCCDeposito(nmTypeBC TipoCC,
int numCC, nmTipoCalculoEspecies SpeciesModel,
int numeroespecies,
65 nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
66 TCondicionContorno(TipoCC, numCC, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
73 FVelocidadGarganta = 0;
75 FRelacionPresionGarganta = 1;
76 FSentidoFlujo = nmParado;
88 TCCDeposito::~TCCDeposito() {
90 delete[] FTuboExtremo;
102 void TCCDeposito::ReadBoundaryData(
const char *FileWAM, fpos_t &filepos,
int NumberOfPipes,
TTubo **Pipe,
int nDPF,
109 FTuboExtremo[0].Pipe = NULL;
110 #ifdef ParticulateFilter
111 FTuboExtremo[0].DPF = NULL;
113 FTuboExtremo[0].NumeroHaz = -1;
114 FTuboExtremo[0].TipoCanal = -1;
118 while(FNumeroTubosCC < 1 && i < NumberOfPipes) {
119 if(Pipe[i]->getNodoIzq() == FNumeroCC) {
120 FTuboExtremo[FNumeroTubosCC].Pipe = Pipe[i];
121 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmLeft;
124 FCC = &(FTuboExtremo[FNumeroTubosCC].Beta);
125 FCD = &(FTuboExtremo[FNumeroTubosCC].Landa);
130 if(Pipe[i]->getNodoDer() == FNumeroCC) {
131 FTuboExtremo[FNumeroTubosCC].Pipe = Pipe[i];
132 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmRight;
133 FNodoFin = Pipe[i]->getNin() - 1;
135 FCC = &(FTuboExtremo[FNumeroTubosCC].Landa);
136 FCD = &(FTuboExtremo[FNumeroTubosCC].Beta);
143 #ifdef ParticulateFilter
146 while(FNumeroTubosCC < 1 && j < nDPF) {
147 while(k < DPF[j]->getNumeroHacesCanales()) {
148 if(DPF[j]->GetCanal(k, 0)->getNodoIzq() == FNumeroCC) {
149 FTuboExtremo[FNumeroTubosCC].NumeroHaz = k;
150 FTuboExtremo[FNumeroTubosCC].TipoCanal = 0;
151 FTuboExtremo[FNumeroTubosCC].DPF = DPF[j];
152 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmLeft;
155 FCC = & (FTuboExtremo[FNumeroTubosCC].Beta);
156 FCD = & (FTuboExtremo[FNumeroTubosCC].Landa);
159 if(DPF[j]->GetCanal(k, 0)->getNodoDer() == FNumeroCC) {
160 FTuboExtremo[FNumeroTubosCC].NumeroHaz = k;
161 FTuboExtremo[FNumeroTubosCC].TipoCanal = 0;
162 FTuboExtremo[FNumeroTubosCC].DPF = DPF[j];
163 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmRight;
164 FNodoFin = DPF[j]->GetCanal(k, 0)->getNin() - 1;
166 FCC = & (FTuboExtremo[FNumeroTubosCC].Landa);
167 FCD = & (FTuboExtremo[FNumeroTubosCC].Beta);
170 if(DPF[j]->GetCanal(k, 1)->getNodoIzq() == FNumeroCC) {
171 FTuboExtremo[FNumeroTubosCC].NumeroHaz = k;
172 FTuboExtremo[FNumeroTubosCC].TipoCanal = 1;
173 FTuboExtremo[FNumeroTubosCC].DPF = DPF[j];
174 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmLeft;
177 FCC = & (FTuboExtremo[FNumeroTubosCC].Beta);
178 FCD = & (FTuboExtremo[FNumeroTubosCC].Landa);
181 if(DPF[j]->GetCanal(k, 1)->getNodoDer() == FNumeroCC) {
182 FTuboExtremo[FNumeroTubosCC].NumeroHaz = k;
183 FTuboExtremo[FNumeroTubosCC].TipoCanal = 1;
184 FTuboExtremo[FNumeroTubosCC].DPF = DPF[j];
185 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmRight;
186 FNodoFin = DPF[j]->GetCanal(k, 1)->getNin() - 1;
188 FCC = & (FTuboExtremo[FNumeroTubosCC].Landa);
189 FCD = & (FTuboExtremo[FNumeroTubosCC].Beta);
201 FILE *fich = fopen(FileWAM,
"r");
202 fsetpos(fich, &filepos);
206 fscanf(fich,
"%d ", &FNumeroDeposito);
208 fgetpos(fich, &filepos);
212 FFraccionMasicaEspecie =
new double[FNumeroEspecies - FIntEGR];
214 for(
int i = 0; i < FNumeroEspecies - FIntEGR; i++) {
218 #ifdef ParticulateFilter
219 for(
int i = 0; i < FNumeroEspecies - FIntEGR; i++) {
220 FFraccionMasicaEspecie[i] = FTuboExtremo[0].DPF->GetCanal(FTuboExtremo[0].NumeroHaz, 0)->GetFraccionMasicaInicial(i);
225 }
catch(exception & N) {
226 std::cout <<
"ERROR: TCCDeposito::LeeCCDeposito en la condicion de contorno: " << FNumeroCC << std::endl;
227 std::cout <<
"Tipo de error: " << N.what() << std::endl;
235 void TCCDeposito::AsignaDeposito(
TDeposito **Plenum) {
238 FDeposito = Plenum[FNumeroDeposito - 1];
239 FValvula->PutPlenum(FDeposito);
241 }
catch(exception & N) {
242 std::cout <<
"ERROR: TCCDeposito::AsignaDeposito en la condicion de contorno: " << FNumeroCC << std::endl;
243 std::cout <<
"Tipo de error: " << N.what() << std::endl;
251 void TCCDeposito::AsignaTipoValvula(
TTipoValvula **Origen,
int Valv,
int i) {
254 switch(Origen[Valv - 1]->getTypeOfValve()) {
256 FValvula =
new TCDFijo(
dynamic_cast<TCDFijo*
>(Origen[Valv - 1]), i);
262 FValvula =
new TLamina(
dynamic_cast<TLamina*
>(Origen[Valv - 1]), i);
264 case nmDiscoRotativo:
291 FValvula->PutPipe(FTuboExtremo[0].Pipe, FNodoFin);
292 FValvula->PutDiametroTubo(FTuboExtremo[0].Pipe->GetDiametro(FNodoFin));
294 #ifdef ParticulateFilter
295 FValvula->PutDiametroTubo(FTuboExtremo[0].DPF->GetCanal(FTuboExtremo[0].NumeroHaz,
296 FTuboExtremo[0].TipoCanal)->GetDiametro(FNodoFin));
300 if(FValvula->getTypeOfValve() == nmCDFijo) {
302 FCDEntrada = FValvula->getCDTubVol();
303 FCDSalida = FValvula->getCDVolTub();
305 if(FCDEntrada > 1.) {
306 FValvula->AsignaCRecuperacion(FCDEntrada - 1.);
308 FValvula->AsignaCRecuperacion(0.);
311 }
catch(exception & N) {
312 std::cout <<
"ERROR: TCCDeposito::AsignaTipoValvula en la condicion de contorno: " << FNumeroCC << std::endl;
313 std::cout <<
"Tipo de error: " << N.what() << std::endl;
321 void TCCDeposito::CalculaCoeficientesDescarga(
double TiempoActual,
double mfcomb,
double RegimenMotor) {
323 double PVol = 0., PTub = 0., PAdm = 0., DeltaP = 0., distancia = 0., CDExt = 0., nodoadm = 0., p1 = 0., p2 = 0.;
324 int turb = 0, entr = 0, NodoFin = 0;
326 switch(FValvula->getTypeOfValve()) {
328 dynamic_cast<TCDFijo*
>(FValvula)->CalculaCD();
332 if(FValvula->getControlRegimen() == nmMotor) {
333 FRegimen = RegimenMotor;
335 FRegimen = FValvula->getRegimen();
338 FTime1 = TiempoActual;
339 FDeltaT = FTime1 - FTime0;
340 FDeltaAngulo = 360. * FRegimen * FValvula->getRelacionVelocidades() / 60. * FDeltaT;
341 FAnguloAnterior = FAnguloActual;
342 FAnguloActual = FAnguloAnterior + FDeltaAngulo;
343 if(FAnguloActual > 360.) {
344 FAnguloActual -= 360.;
346 dynamic_cast<TValvula4T*
>(FValvula)->CalculaCD(FAnguloActual);
358 if(FTuboExtremo[0].TipoExtremo == nmLeft) {
361 NodoFin = FTuboExtremo[0].Pipe->getNin() - 1;
362 DeltaP = FTuboExtremo[0].Pipe->
GetPresion(NodoFin) - FDeposito->getPressure();
363 dynamic_cast<TLamina*
>(FValvula)->CalculaCD(DeltaP, FTuboExtremo[0].Pipe->getTime1());
366 case nmDiscoRotativo:
367 if(FValvula->getControlRegimen() == nmMotor) {
368 FRegimen = RegimenMotor;
370 FRegimen = FValvula->getRegimen();
373 FTime1 = TiempoActual;
374 FDeltaT = FTime1 - FTime0;
375 FDeltaAngulo = 360. * FRegimen * FValvula->getRelacionVelocidades() / 60. * FDeltaT;
376 FAnguloAnterior = FAnguloActual;
377 FAnguloActual = FAnguloAnterior + FDeltaAngulo;
378 if(FAnguloActual > 360.) {
379 FAnguloActual -= 360.;
381 dynamic_cast<TDiscoRotativo*
>(FValvula)->CalculaCD(FAnguloActual);
387 FTime1 = TiempoActual;
388 FDeltaT = FTime1 - FTime0;
389 FDeltaAngulo = 360. * FRegimen *
dynamic_cast<TDepVolVariable*
>(FDeposito)->getRelacionVelocidades() / 60. * FDeltaT;
390 FAnguloAnterior = FAnguloActual;
391 FAnguloActual = FAnguloAnterior + FDeltaAngulo;
392 if(FAnguloActual > 360.) {
393 FAnguloActual -= 360.;
395 dynamic_cast<TLumbrera*
>(FValvula)->CalculaCD(FAnguloActual);
399 FRegimen = RegimenMotor;
401 FTime1 = TiempoActual;
402 FDeltaT = FTime1 - FTime0;
403 FDeltaAngulo = 360. * FRegimen / 60. * FDeltaT;
404 FAnguloAnterior = FAnguloActual;
405 FAnguloActual = FAnguloAnterior + FDeltaAngulo;
406 if(FAnguloActual > 720.) {
407 FAnguloActual -= 720.;
409 dynamic_cast<TValvulaContr*
>(FValvula)->CalculaCD(FAnguloActual, mfcomb);
413 if(FTuboExtremo[0].TipoExtremo == nmLeft) {
416 NodoFin = FTuboExtremo[0].Pipe->getNin() - 1;
417 PTub = FTuboExtremo[0].Pipe->
GetPresion(NodoFin);
418 PVol = FDeposito->getPressure();
419 nodoadm =
dynamic_cast<TWasteGate*
>(FValvula)->getNodoAdm();
420 distancia =
dynamic_cast<TWasteGate*
>(FValvula)->getDist();
421 p1 =
dynamic_cast<TWasteGate*
>(FValvula)->getTuboAdm()->GetPresion(nodoadm);
422 p2 =
dynamic_cast<TWasteGate*
>(FValvula)->getTuboAdm()->GetPresion(nodoadm + 1);
423 PAdm = Interpola(p1, p2, 1.0, distancia);
424 dynamic_cast<TWasteGate*
>(FValvula)->CalculaCD(PAdm, PTub, PVol, FTuboExtremo[0].Pipe->getTime1());
428 dynamic_cast<TCDExterno*
>(FValvula)->CalculaCD();
432 dynamic_cast<TMariposa*
>(FValvula)->CalculaCD(TiempoActual);
436 FCDEntrada = FValvula->getCDTubVol();
437 FCDEntrada = FValvula->getCDTubVol();
438 FCDSalida = FValvula->getCDVolTub();
439 FCTorbellino = FValvula->getCTorb();
440 if(FCDEntrada > 1.) {
441 FValvula->AsignaCRecuperacion(FCDEntrada - 1.);
443 FValvula->AsignaCRecuperacion(0.);
445 if(FCDEntrada > 2.0 || FCDEntrada < 0.0) {
446 printf(
"ERROR: TCCDeposito::CalculaCoeficientesDescarga, en calculo coeficiente descarga entrante: %lf, en %lf grados,en la condicion de contorno: %d \n",
447 FCDEntrada, FAnguloActual,
450 "ERROR: TCCDeposito::CalculaCoeficientesDescarga en calculo coeficiente descarga entrante: " + std::to_string(
451 FCDEntrada) +
", en " + std::to_string(FAnguloActual) +
" grados ");
454 if(FCDSalida > 1.0 || FCDSalida < 0.0) {
455 printf(
"ERROR: TCCDeposito::CalculaCoeficientesDescarga, en calculo coeficiente descarga saliente: %lf, en %lf grados, en la condicion de contorno: %d\n",
456 FCDSalida, FAnguloActual,
459 "ERROR: TCCDeposito::CalculaCoeficientesDescarga en calculo coeficiente descarga saliente: " + std::to_string(
460 FCDSalida) +
", en " + std::to_string(FAnguloActual) +
" grados ");
462 }
catch(exception & N) {
463 std::cout <<
"ERROR: TCCDeposito::CalculaCoeficientesDescarga en la condicion de contorno: " << FNumeroCC << std::endl;
464 std::cout <<
"Tipo de error: " << N.what() << std::endl;
472 void TCCDeposito::IniciaGamma() {
476 FRMezcla = FTuboExtremo[0].Pipe->
GetRMezcla(FNodoFin);
477 FGamma = FTuboExtremo[0].Pipe->
GetGamma(FNodoFin);
478 FSeccionTubo = __geom::Circle_area(FTuboExtremo[0].Pipe->GetDiametro(FNodoFin));
480 #ifdef ParticulateFilter
481 FRMezcla = FTuboExtremo[0].DPF->GetCanal(FTuboExtremo[0].NumeroHaz,
482 FTuboExtremo[0].TipoCanal)->GetRMezcla(FNodoFin);
483 FGamma = FTuboExtremo[0].DPF->GetCanal(FTuboExtremo[0].NumeroHaz,
484 FTuboExtremo[0].TipoCanal)->GetGamma(FNodoFin);
485 FSeccionTubo = __geom::Circle_area(
486 FTuboExtremo[0].DPF->GetCanal(
487 FTuboExtremo[0].NumeroHaz,
488 FTuboExtremo[0].TipoCanal)->GetDiametro(
492 FSeccionValvula = FSeccionTubo;
494 }
catch(exception & N) {
495 std::cout <<
"ERROR: TCCDeposito::CalculaCondicionContorno en la condicion de contorno: " << FNumeroCC << std::endl;
496 std::cout <<
"Tipo de error: " << N.what() << std::endl;
504 void TCCDeposito::CalculaCondicionContorno(
double Time) {
506 double rel_CCon_Entropia, FraccionMasicaAcum = 0.;
509 FGamma = FTuboExtremo[0].Pipe->
GetGamma(FNodoFin);
511 #ifdef ParticulateFilter
512 FGamma = FTuboExtremo[0].DPF->GetCanal(FTuboExtremo[0].NumeroHaz, FTuboExtremo[0].TipoCanal)->GetGamma(FNodoFin);
515 FGamma1 = __Gamma::G1(FGamma);
516 FGamma2 = __Gamma::G2(FGamma);
517 FGamma3 = __Gamma::G3(FGamma);
518 FGamma4 = __Gamma::G4(FGamma);
519 FGamma5 = __Gamma::G5(FGamma);
520 FGamma6 = __Gamma::G6(FGamma);
522 FAd = pow(FDeposito->getPressure() / FPref, 1. / FGamma4);
523 rel_CCon_Entropia = *FCC / FTuboExtremo[0].Entropia;
524 FAdCr = FAd / sqrt(1 +
pow2(FMachVenturi) * FGamma3);
526 if(rel_CCon_Entropia / FAdCr > 1 + 1e-5) {
527 FValvula->GetCDin(Time);
528 FCDEntrada = FValvula->getCDTubVol();
529 FSentidoFlujo = nmEntrante;
530 if(FCDEntrada > 0.0001) {
531 if(FCDEntrada <= 1.0) {
532 FSeccionEficaz = FCDEntrada * FSeccionValvula;
533 FlujoEntranteDeposito();
535 FEDRecuperacionEnergiaCinetica();
539 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
543 #ifdef ParticulateFilter
544 FFraccionMasicaEspecie[j] = FTuboExtremo[0].DPF->GetCanal(FTuboExtremo[0].NumeroHaz,
545 FTuboExtremo[0].TipoCanal)->GetFraccionMasicaCC(FIndiceCC, j);
548 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
550 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
553 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FTuboExtremo[0].Pipe->
GetFraccionMasicaCC(FIndiceCC, FNumeroEspecies - 1);
555 #ifdef ParticulateFilter
556 if(FHayEGR) FFraccionMasicaEspecie[FNumeroEspecies - 1] = FTuboExtremo[0].DPF->GetCanal(FTuboExtremo[0].NumeroHaz,
557 FTuboExtremo[0].TipoCanal)->GetFraccionMasicaCC(FIndiceCC, FNumeroEspecies - 1);
567 }
else if(rel_CCon_Entropia / FAdCr < 1 - 1e-5) {
568 FSentidoFlujo = nmSaliente;
569 FValvula->GetCDout(Time);
570 FCDSalida = FValvula->getCDVolTub();
571 if(FCDSalida > 0.0001) {
573 FSeccionEficaz = FCDSalida * FSeccionValvula;
574 if(FDeposito->getTipoDeposito() == nmUnionDireccional) {
575 FValvula->AsignaCDVolTub(FCDSalida);
577 FlujoSalienteDeposito();
580 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
581 FFraccionMasicaEspecie[j] = FDeposito->GetFraccionMasicaEspecie(j);
582 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
584 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
586 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FDeposito->GetFraccionMasicaEspecie(FNumeroEspecies - 1);
596 FSentidoFlujo = nmParado;
603 FValvula->AcumulaCDMedio(Time);
604 }
catch(exception & N) {
605 std::cout <<
"ERROR: TCCDeposito::CalculaCondicionContorno en la condicion de contorno: " << FNumeroCC << std::endl;
606 std::cout <<
"Tipo de error: " << N.what() << std::endl;
614 void TCCDeposito::FEDRecuperacionEnergiaCinetica() {
616 double xaa2 = 0., ed = 0., ei = 0., a1 = 0., a2supuesta = 0.;
619 ei = *FCC * 2. / FGamma2;
622 stRecover FA2(FTuboExtremo[0].Entropia, FAdCr, FGamma, FValvula->getCRecuperacion(), *FCC);
623 double error = FA2(a2supuesta);
628 FVelocidadGarganta = FA2.UThroat;
631 FVelocity = 0.9999 * ei;
633 FVelocidadGarganta = FA2.UThroat;
637 xaa2 = pow(FTuboExtremo[0].Entropia, FGamma4);
638 *FCD = FSonido - FGamma3 * FVelocity;
639 *FCC = FSonido + FGamma3 * FVelocity;
640 FGasto = __units::BarToPa(-FGamma * FSeccionTubo * pow(FSonido,
641 2 * FGamma6) * FVelocity) / (__cons::ARef * xaa2);
642 FRelacionPresionGarganta = pow(FSonido / (FTuboExtremo[0].Entropia * FAdCr), FGamma4);
643 FGastoGarganta = FGasto / (FValvula->getCRecuperacion() * FSeccionValvula);
644 FMachGarganta = FVelocidadGarganta / a1;
646 }
catch(exception & N) {
647 std::cout <<
"ERROR: TCCDeposito::FEDRecuperacionEnergiaCinetica en la condicion de contorno: " << FNumeroCC <<
649 std::cout <<
"Tipo de error: " << N.what() << std::endl;
657 void TCCDeposito::FlujoEntranteDeposito() {
659 double vel_son_garganta = 0., velocidad_garganta = 0., Mach = 0., xaa2 = 0., ycal = 0., d1 = 0.;
661 Fk = FSeccionTubo / FSeccionEficaz;
664 vel_son_garganta = FTuboExtremo[0].Entropia * FAdCr;
668 FCaso = nmFlujoEntranteSaltoSubcritico;
670 FSonido = FTuboExtremo[0].Entropia * FAdCr;
671 FVelocity = (*FCC - FSonido) / FGamma3;
673 Resolucion(vel_son_garganta, *FCC, FCaso, &FVelocity, &FSonido);
676 velocidad_garganta = sqrt(2. * FGamma6 * (
pow2(FSonido) + FGamma3 *
pow2(FVelocity) -
pow2(vel_son_garganta)));
680 if(velocidad_garganta > vel_son_garganta) {
681 FCaso = nmFlujoEntranteSaltoSupercritico;
682 Resolucion(0.0, 1.0, FCaso, &ycal, &Mach);
683 FVelocity = *FCC / (1 / Mach + FGamma3);
684 FSonido = FVelocity / Mach;
686 d1 = Fk * FVelocity * pow(FSonido, 1. / FGamma3);
687 vel_son_garganta = pow(d1, FGamma1 / FGamma2);
688 velocidad_garganta = vel_son_garganta;
692 xaa2 = pow(FTuboExtremo[0].Entropia, FGamma4);
693 FGasto = __units::BarToPa(-FGamma * FSeccionTubo * pow(FSonido,
694 2 * FGamma6) * FVelocity) / (__cons::ARef * xaa2);
695 *FCD = FSonido - FGamma3 * FVelocity;
696 *FCC = FSonido + FGamma3 * FVelocity;
697 FRelacionPresionGarganta = pow(FSonido / (FTuboExtremo[0].Entropia * FAdCr), FGamma4);
698 FGastoGarganta = FGasto / (FCDEntrada * FSeccionValvula);
699 FMachGarganta = velocidad_garganta / vel_son_garganta;
701 FVelocidadGarganta = velocidad_garganta;
705 catch(exception & N) {
706 std::cout <<
"ERROR: TCCDeposito::FlujoEntranteDeposito en la condicion de contorno: " << FNumeroCC << std::endl;
707 std::cout <<
"Tipo de error: " << N.what() << std::endl;
715 void TCCDeposito::FlujoSalienteDeposito() {
718 double a1 = 0., xx = 0., yy = 0., d1 = 0.;
719 double a2cr = 0., val1 = 0., val2 = 0., u2cr = 0., ycal = 0., error = 0., valde = 0., miembro2 = 0.;
721 double relacion_velocidades_son, Mach_tras_ondachoque, Mach, temp_antes_ondachoque, temp_tras_ondachoque;
723 Fk = FSeccionTubo / FSeccionEficaz;
729 u2cr = FDeposito->getSpeedsound() * sqrt(2. / FGamma2) * (sqrt(
pow2(Fk) + FGamma1 * FGamma2) - Fk) / FGamma1;
730 a2cr = sqrt(
pow2(FDeposito->getSpeedsound()) - FGamma3 *
pow2(u2cr));
737 stFSSub FSA2(FTuboExtremo[0].Entropia, FAdCr, FGamma, Fk, *FCC, FDeposito->getSpeedsound());
746 a1 = sqrt(2. / FGamma2) * FDeposito->getSpeedsound();
747 FVelocidadGarganta = a1;
748 xx = pow(FAdCr / FDeposito->getSpeedsound(), FGamma4);
749 yy = pow(a1, 2. / FGamma1);
750 Fcc = FVelocidadGarganta * yy * xx / Fk;
752 stFSSup FU2(FTuboExtremo[0].Entropia, Fcc, FGamma, Fk, *FCC, FDeposito->getSpeedsound());
753 val1 = FU2(FVelocidadGarganta);
757 valde = FVelocidadGarganta;
759 double Epsilon = numeric_limits<double>::epsilon();
760 valde = FDeposito->getSpeedsound() / sqrt(FGamma3) - Epsilon;
765 FCaso = nmFlujoSalienteSaltoSupercritico;
766 Resolucion(0.0, valde, FCaso, &FVelocity, &FSonido);
769 xx = pow(sqrt(2. / FGamma2), (FGamma2 / FGamma1));
770 yy = pow(FAdCr, FGamma4);
771 FGasto = __units::BarToPa(FCDSalida * FSeccionValvula * FGamma * xx * yy) / (FDeposito->getSpeedsound() * __cons::ARef);
777 Mach = FVelocity / FSonido;
778 xx = *FCC + FGamma3 * FVelocity;
779 FTuboExtremo[0].Entropia = FTuboExtremo[0].Entropia * FSonido / xx;
786 xx = FGamma4 *
pow2(Mach) - 1.;
787 Mach_tras_ondachoque = sqrt((
pow2(Mach) + 2. / FGamma1) / xx);
788 temp_tras_ondachoque = FGamma3 *
pow2(Mach) + 1.;
789 temp_antes_ondachoque = FGamma3 *
pow2(Mach_tras_ondachoque) + 1.;
790 relacion_velocidades_son = sqrt(temp_tras_ondachoque / temp_antes_ondachoque);
791 FSonido = FSonido * relacion_velocidades_son;
792 FVelocity = FSonido * Mach_tras_ondachoque;
793 d1 = xx * FGamma1 / FGamma2;
794 FTuboExtremo[0].Entropia = FTuboExtremo[0].Entropia * relacion_velocidades_son / pow(d1, FGamma5);
799 FCaso = nmFlujoSalienteSaltoSubcritico;
800 Resolucion(a2cr, FDeposito->getSpeedsound(), FCaso, &ycal, &FSonido);
802 FVelocity = sqrt((
pow2(FDeposito->getSpeedsound()) -
pow2(FSonido)) / FGamma3);
805 a1 = FDeposito->getSpeedsound() * (*FCC + FGamma3 * FVelocity) / (FTuboExtremo[0].Entropia * FAd);
806 FVelocidadGarganta = Fk *
pow2(a1) * FVelocity /
pow2(FSonido);
807 FGasto = __units::BarToPa(FCDSalida * FSeccionValvula * FGamma * pow(FAd / FDeposito->getSpeedsound(),
808 FGamma4) * FVelocidadGarganta * pow(a1, 2. / FGamma1)) / __cons::ARef;
809 xx = *FCC + FGamma3 * FVelocity;
810 FTuboExtremo[0].Entropia = FTuboExtremo[0].Entropia * FSonido / xx;
813 *FCD = FSonido + FGamma3 * FVelocity;
814 *FCC = FSonido - FGamma3 * FVelocity;
815 d1 = FSonido / (FTuboExtremo[0].Entropia * FAdCr);
816 FRelacionPresionGarganta = pow(d1, FGamma4);
817 FMachGarganta = FVelocidadGarganta / a1;
818 FGastoGarganta = FGasto / (FCDSalida * FSeccionValvula);
819 }
catch(exception & N) {
820 std::cout <<
"ERROR: TCCDeposito::FlujoSalienteDeposito en la condicion de contorno: " << FNumeroCC << std::endl;
821 std::cout <<
"Tipo de error: " << N.what() << std::endl;
828 void TCCDeposito::Resolucion(
double ext1,
double ext2, nmCaso Caso,
double *u2t,
double *a2t) {
835 if(Caso == nmFlujoEntranteSaltoSubcritico) {
836 stFESub FEA2(FTuboExtremo[0].Entropia, FAdCr, FGamma, Fk, *FCC);
839 }
else if(Caso == nmFlujoEntranteSaltoSupercritico) {
841 *a2t =
FindRoot(FMatch, ext1, ext2);
843 }
else if(Caso == nmFlujoSalienteSaltoSubcritico) {
844 stFSSub FSA2(FTuboExtremo[0].Entropia, FAdCr, FGamma, Fk, *FCC, FDeposito->getSpeedsound());
847 }
else if(Caso == nmFlujoSalienteSaltoSupercritico) {
848 stFSSup FU2(FTuboExtremo[0].Entropia, Fcc, FGamma, Fk, *FCC, FDeposito->getSpeedsound());
852 printf(
"Error en la definicion del flujo TCCDeposito::Resolucion en la condicion de contorno: %d\n", FNumeroCC);
857 catch(exception & N) {
858 std::cout <<
"ERROR: TCCDeposito::Resolucion en la condicion de contorno: " << FNumeroCC << std::endl;
859 std::cout <<
"Tipo de error: " << N.what() << std::endl;
983 #pragma package(smart_init)