33 #include "TCCDeposito.h"
39 TTurbina::TTurbina(
int i, nmTipoDeposito TipoDeposito,
int nentradas, nmTipoCalculoEspecies SpeciesModel,
40 int numeroespecies, nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
41 TDepVolCteBase(i, TipoDeposito, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
42 asgNumeroTurbina =
false;
45 FNumeroEntradas = nentradas;
46 FNodoEntrada =
new int[nentradas];
47 FTuboEntrada =
new int[nentradas];
48 FExtremoEntrada =
new int[nentradas];
49 FSentidoEntrada =
new int[nentradas];
50 FPresionEntrada =
new double[nentradas];
51 FVelocidadEntrada =
new double[nentradas];
52 FGastoEntrada =
new double[nentradas];
53 FTempEntrada =
new double[nentradas];
54 FAsonidoEntrada =
new double[nentradas];
55 FRhoEntrada =
new double[nentradas];
56 FTemp0Entrada =
new double[nentradas];
57 FEntalpia0Entrada =
new double[nentradas];
58 FPresion0Entrada =
new double[nentradas];
59 FEntalpiaIsenSalida =
new double[nentradas];
60 FRelacionCinematica =
new double[nentradas];
61 FRendTurbina =
new double[nentradas];
64 FTrabajoRealPaso = 0.;
65 FRendInstantaneo = 0.;
66 FTrabajoIsenInstTotal = 0.;
68 FRelacionCinGlobalAcum = 0.;
69 FRelacionCinAcum =
new double[nentradas];
70 for(
int j = 0; j < nentradas; j++) {
71 FRelacionCinAcum[j] = 0.;
73 FPonderacionRelacionCinematica =
new double[nentradas];
77 FResMediosTurbina.RelaCinematica =
false;
78 FResMediosTurbina.RelaCinematicaMED = NULL;
79 FResInstantTurbina.RelaCinematicaINS = NULL;
80 FResInstantTurbina.RelaCinematica =
false;
82 FGastoCorregido = NULL;
83 FRegimenCorregido = NULL;
84 FRelacionExpansion = NULL;
85 FGastoCorregido =
new double[nentradas];
86 FRegimenCorregido =
new double[nentradas];
87 FRelacionExpansion =
new double[nentradas];
93 FRackIsControlled =
false;
101 TTurbina::~TTurbina() {
102 delete[] FRelacionCinAcum;
103 delete[] FTuboEntrada;
104 delete[] FNodoEntrada;
105 delete[] FExtremoEntrada;
106 delete[] FSentidoEntrada;
107 delete[] FPresionEntrada;
108 delete[] FVelocidadEntrada;
109 delete[] FGastoEntrada;
110 delete[] FTempEntrada;
111 delete[] FAsonidoEntrada;
112 delete[] FRhoEntrada;
113 delete[] FTemp0Entrada;
114 delete[] FEntalpia0Entrada;
115 delete[] FPresion0Entrada;
116 delete[] FEntalpiaIsenSalida;
117 delete[] FRelacionCinematica;
118 delete[] FRendTurbina;
119 delete[] FGastoCorregido;
120 delete[] FRegimenCorregido;
121 delete[] FRelacionExpansion;
122 delete[] FPonderacionRelacionCinematica;
124 if(FCCEntrada != NULL)
126 if(FCCSalida != NULL)
128 if(FResMediosTurbina.RelaCinematicaMED != NULL)
129 delete[] FResMediosTurbina.RelaCinematicaMED;
130 if(FResMediosTurbina.GastoCorregidoMED != NULL)
131 delete[] FResMediosTurbina.GastoCorregidoMED;
132 if(FResMediosTurbina.GastoCorregidoSUM != NULL)
133 delete[] FResMediosTurbina.GastoCorregidoSUM;
134 if(FResMediosTurbina.RegimenCorregidoMED != NULL)
135 delete[] FResMediosTurbina.RegimenCorregidoMED;
136 if(FResMediosTurbina.RegimenCorregidoSUM != NULL)
137 delete[] FResMediosTurbina.RegimenCorregidoSUM;
138 if(FResMediosTurbina.RelacionExpansionMED != NULL)
139 delete[] FResMediosTurbina.RelacionExpansionMED;
140 if(FResMediosTurbina.RelacionExpansionSUM != NULL)
141 delete[] FResMediosTurbina.RelacionExpansionSUM;
142 if(FResInstantTurbina.RelaCinematicaINS != NULL)
143 delete[] FResInstantTurbina.RelaCinematicaINS;
144 if(FResInstantTurbina.GastoCorregidoINS != NULL)
145 delete[] FResInstantTurbina.GastoCorregidoINS;
146 if(FResInstantTurbina.RegimenCorregidoINS != NULL)
147 delete[] FResInstantTurbina.RegimenCorregidoINS;
148 if(FResInstantTurbina.RelacionExpansionINS != NULL)
149 delete[] FResInstantTurbina.RelacionExpansionINS;
159 void TTurbina::ActualizaPropiedades(
double TimeCalculo) {
163 double MasaEntrante, FraccionMasicaAcum = 0.;
165 double g = 0., v = 0., a = 0., m = 0.;
172 DeltaT = TimeCalculo - FTime;
174 if(!(DoubEqZero(DeltaT))) {
175 if(FCalculoEspecies == nmCalculoCompleto) {
177 FRMezcla = CalculoCompletoRMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2], 0,
178 FCalculoGamma, nmMEP);
179 FCpMezcla = CalculoCompletoCpMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2], 0,
180 __units::degCToK(FTemperature), FCalculoGamma, nmMEP);
181 FGamma = CalculoCompletoGamma(FRMezcla, FCpMezcla, FCalculoGamma);
183 }
else if(FCalculoEspecies == nmCalculoSimple) {
185 FRMezcla = CalculoSimpleRMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FCalculoGamma, nmMEP);
186 FCvMezcla = CalculoSimpleCvMezcla(__units::degCToK(FTemperature), FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1],
187 FCalculoGamma, nmMEP);
188 FGamma = CalculoSimpleGamma(FRMezcla, FCvMezcla, FCalculoGamma);
192 bool FirstStep =
true;
193 bool Converge =
false;
195 double Ason1 = FAsonido;
196 double Ason0 = FAsonido;
197 double MTemp0 = 1 / (FMasa0 * FRMezcla * __units::degCToK(FTemperature));
198 double MTemp1 = 1 / (FMasa0 * FRMezcla * __units::degCToK(FTemperature));
203 FHeatPower = FHTM->Turb_Heat_Flow();
205 double Heat = FHeatPower * DeltaT;
209 for(
int i = 0; i < FNumeroUniones; i++) {
210 if(
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getSentidoFlujo() == nmEntrante) {
212 }
else if(
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getSentidoFlujo() == nmSaliente) {
215 g = (double) -
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getMassflow();
216 v = (double) SignoFlujo *
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getVelocity();
217 a =
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getSpeedSound();
218 m = g * DeltaT * FCCDeposito[i]->GetTuboExtremo(0).Pipe->getNumeroConductos();
221 for(
int j = 0; j < FNumeroEspecies - FIntEGR; j++) {
222 FMasaEspecie[j] += FCCDeposito[i]->GetFraccionMasicaEspecie(j) * m;
226 H += EntalpiaEntrada(a, v, m, Ason1, FMasa, FCCDeposito[i]->getGamma());
230 MTemp1 = FGamma / (
pow2(Ason1 * __cons::ARef) * FMasa);
233 FMasa = FMasa0 + MasaEntrante;
234 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
235 FFraccionMasicaEspecie[j] = FMasaEspecie[j] / FMasa;
236 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
238 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
240 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FMasaEspecie[FNumeroEspecies - 1] / FMasa;
245 MTemp = (MTemp0 + MTemp1) / 2.;
247 Energia = pow(FMasa / FMasa0 * exp((H + H0) / 2 - (FTrabajoFluido + Heat) * MTemp), __Gamma::G1(FGamma));
248 Ason1 = FAsonido * sqrt(Energia);
249 Error = (Diff = Ason1 - Ason0, fabs(Diff)) / Ason1;
260 FPressure = __units::PaToBar(
pow2(__cons::ARef * FAsonido) / FGamma / FVolumen * FMasa);
261 FPresionIsen = pow(FPressure / FPresRef, __Gamma::G5(FGamma));
262 FTemperature = __units::KTodegC(
pow2(FAsonido * __cons::ARef) / FGamma / FRMezcla);
265 }
catch(exception & N) {
266 std::cout <<
"ERROR: TTurbina::ActualizaPropiedades en la turbina " << FNumeroTurbina << std::endl;
267 std::cout <<
"Tipo de error: " << N.what() << std::endl;
275 void TTurbina::CalculoPotenciaPaso() {
278 if(FDeltaPaso != 0 & FTrabajoRealPaso != 0) {
279 FPotenciaPaso = FTrabajoRealPaso / FDeltaPaso;
280 FTrabajoRealPaso = 0.;
284 FTrabajoRealPaso = 0.;
288 }
catch(exception & N) {
289 std::cout <<
"ERROR: TTurbina::CalculoPotenciaPaso en el compresor: " << FNumeroTurbina << std::endl;
290 std::cout <<
"Tipo de error: " << N.what() << std::endl;
291 throw Exception(
"ERROR: TTurbina::CalculoPotenciaPaso en la turbina: " + std::to_string(FNumeroTurbina) + N.what());
297 void TTurbina::TransformaContorno(
double *L,
double *B,
double *E,
double *a,
double *v,
double *p,
int modo,
301 *L = (*a + (Gamma / 2) * *v);
302 *B = (*a - (Gamma / 2) * *v);
303 *E = *a / pow(*p, __Gamma::G5(Gamma));
306 *v = (*L - *B) / __Gamma::G1(Gamma);
307 *p = pow(*a / *E, __Gamma::G4(Gamma));
309 }
catch(exception & N) {
310 std::cout <<
"ERROR: TTurbina::TransformaContorno en la turbina " << FNumeroTurbina << std::endl;
311 std::cout <<
"Tipo de error: " << N.what() << std::endl;
319 void TTurbina::LeeTurbina(
const char *FileWAM, fpos_t &filepos) {
321 int rdturb = 0, tipoturb = 0, ctrl = 0, numctrl = 0, ac = 0;
322 double AngCritico = 0., Beta = 0.;
324 FILE *fich = fopen(FileWAM,
"r");
325 fsetpos(fich, &filepos);
327 fscanf(fich,
"%d ", &tipoturb);
330 FTipoTurbina = nmFixedTurbine;
333 FTipoTurbina = nmVariableGeometry;
336 FTipoTurbina = nmTurbineMap;
339 std::cout <<
"ERROR: Unknown turbine type " << std::endl;
341 fscanf(fich,
"%lf ", &FDiametroRodete);
342 if(FTipoTurbina == nmTurbineMap) {
344 fscanf(fich,
"%lf %lf %lf ", &FDiametroRodeteOut, &FDiametroTuerca, &FDiametroTurbinaIn);
345 fscanf(fich,
"%lf ", &AngCritico);
347 FMapa->LoadTurbineMap(fich, FDiametroRodete, FDiametroRodeteOut, FDiametroTuerca, FDiametroTurbinaIn, AngCritico);
349 fscanf(fich,
"%d ", &numctrl);
350 for(
int i = 0; i < numctrl; ++i) {
351 fscanf(fich,
"%d ", &ctrl);
354 FRackIsControlled =
true;
358 std::cout <<
"ERROR: Unknown controller for the turbine " << std::endl;
360 fscanf(fich,
"%d ", &FNumControlObject);
363 if(!FRackIsControlled)
364 fscanf(fich,
"%lf ", &FRack);
365 FCalRendTurbina = nmRendMapa;
369 fscanf(fich,
"%d ", &ac);
375 if(FTipoDeposito == nmTurbinaSimple) {
378 fscanf(fich,
"%d %d %d", &InID[0], &VolID[0], &OutID);
384 fscanf(fich,
"%d ", &rdturb);
387 FCalRendTurbina = nmWatson;
390 FCalRendTurbina = nmPolinomio;
391 fscanf(fich,
"%lf %lf %lf ", &FRcoptima, &FRcmaxima, &FRendmaximo);
394 FCalRendTurbina = nmCalcExtRD;
397 std::cout <<
"ERROR: Unknown method to calculate turbine efficiency " << std::endl;
401 fscanf(fich,
"%lf ", &FAjustRendTurb);
403 fgetpos(fich, &filepos);
405 }
catch(exception & N) {
406 std::cout <<
"ERROR: TTurbina::LeeRendimientoTurbina en la turbina " << FNumeroTurbina << std::endl;
407 std::cout <<
"Tipo de error: " << N.what() << std::endl;
452 void TTurbina::AsignaDatosSalida(
int nodsaltur,
int tubsaltur,
int extremo,
int sentido) {
454 FNodoSalida = nodsaltur;
455 FTuboSalida = tubsaltur;
456 FExtremoSalida = extremo;
457 FSentidoSalida = sentido;
458 }
catch(exception & N) {
459 std::cout <<
"ERROR: TTurbina::AsignaDatosSalida en la turbina " << FNumeroTurbina << std::endl;
460 std::cout <<
"Tipo de error: " << N.what() << std::endl;
468 double TTurbina::GetRelacionCinematica(
int i) {
470 if(FRelacionCinematica != NULL && i < FNumeroEntradas) {
471 return FRelacionCinematica[i];
473 std::cout <<
"ERROR: TTurbina::GetRelacionCinematica: " << FNumeroTurbina << std::endl;
474 std::cout <<
"ERROR: La entrada de la turbina indicada no existe " << std::endl;
477 }
catch(exception & N) {
478 std::cout <<
"ERROR: TTurbina::GetRelacionCinematica en la turbina " << FNumeroTurbina << std::endl;
479 std::cout <<
"Tipo de error: " << N.what() << std::endl;
487 void TTurbina::AsignaDatosEntrada(
int nodentur,
int tubsaltur,
int extremo,
int sentido,
int n) {
489 FNodoEntrada[n] = nodentur;
490 FTuboEntrada[n] = tubsaltur;
491 FExtremoEntrada[n] = extremo;
492 FSentidoEntrada[n] = sentido;
493 }
catch(exception & N) {
494 std::cout <<
"ERROR: TTurbina::AsignaDatosEntrada en la turbina " << FNumeroTurbina << std::endl;
495 std::cout <<
"Tipo de error: " << N.what() << std::endl;
504 if(FCCEntrada != NULL && i < FNumeroEntradas) {
505 return FCCEntrada[i];
507 std::cout <<
"ERROR: TTurbina::Peticion CCEntrada: " << FNumeroTurbina << std::endl;
515 if(FCCSalida != NULL && i < 1) {
518 std::cout <<
"ERROR: TTurbina::Peticion CCSalida: " << FNumeroTurbina << std::endl;
525 void TTurbina::AsignaRackController(
TController **Controller) {
526 if(FRackIsControlled)
527 FRackController = Controller[FNumControlObject - 1];
530 void TTurbina::AllocateDatosTGV(
stDatosTGV *DatosTGV) {
531 FDatosTGV = DatosTGV;
534 double TTurbina::CpTurbineSimple(
double Temperature,
double YBurnt) {
536 double R = __R::Burnt * YBurnt + (__R::Air * (1 - YBurnt - 0.0164) + 0.0164 * __R::H2O);
537 double RaizdeT = sqrt(Temperature);
539 double CvAir = -10.4199 * RaizdeT + 2522.88 + (-67227.1 * RaizdeT + 917124.4 - 4174853.6 / RaizdeT) / Temperature;
540 double CvBurnt = 641.154 + Temperature * (0.43045 + Temperature * (-0.0001125 + Temperature * 8.979e-9));
541 double CvH2O = (22.605 - 0.09067 * RaizdeT + (-826.53 * RaizdeT + 13970.1 - 82114 / RaizdeT) / Temperature) * __R::H2O -
544 double CpMezcla = CvBurnt * YBurnt + (CvAir * (1 - YBurnt - 0.0164) + 0.0164 * CvH2O) + R;
549 double TTurbina::CpTurbineComplete(
double YO2,
double YCO2,
double YH2O,
double Temperature) {
550 double YN2 = 1 - YO2 - YCO2 - YH2O;
552 double RaizdeT = sqrt(Temperature);
554 double CpN2 = (12.531 - 0.05932 * RaizdeT + (-352.3 * RaizdeT + 5279.1 - 27358 / RaizdeT) / Temperature) * __R::N2;
555 double CpO2 = (-0.112 + 0.0479 * RaizdeT + (195.42 * RaizdeT - 4426.1 + 32538 / RaizdeT) / Temperature) * __R::O2;
556 double CpCO2 = (12.019 - 0.03566 * RaizdeT + (-142.34 * RaizdeT - 163.7 + 9470 / RaizdeT) / Temperature) * __R::CO2;
557 double CpH2O = (22.605 - 0.09067 * RaizdeT + (-826.53 * RaizdeT + 13970.1 - 82114 / RaizdeT) / Temperature) * __R::H2O;
559 double CpMezcla = CpO2 * YO2 + CpCO2 * YCO2 + CpH2O * YH2O + CpN2 * (YN2 - 0.01292) + 520.32 * 0.01292;
564 void TTurbina::CalculateAdiabaticMap(
double TinC) {
565 FMapa->CalculateAdiabaticEfficiency(FHTM, TinC);
568 void TTurbina::AsignAcousticElements(
TTubo **Pipe) {
571 for(
int i = 0; i < FNumeroEntradas; i++) {
572 FAcTurb->AsignInPipe(Pipe, i);
575 FAcTurb->AsignOutPipe(Pipe);
579 #pragma package(smart_init)