35 #include "TCompresorDep.h"
37 #include "TDeposito.h"
41 TCompresorDep::TCompresorDep(
int i, nmTipoCalculoEspecies SpeciesModel,
int numeroespecies,
42 nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
43 TCompresor(i, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
45 FModeloCompresor = nmCompPlenums;
52 TCompresorDep::~TCompresorDep() {
58 void TCompresorDep::LeeCompresor(
const char *FileWAM, fpos_t &filepos) {
61 FILE *fich = fopen(FileWAM,
"r");
62 fsetpos(fich, &filepos);
66 fgetpos(fich, &filepos);
68 }
catch(exception & N) {
69 std::cout <<
"ERROR: TCompresorDep::LeeCompresor en el compresor: " << FNumeroCompresor << std::endl;
70 std::cout <<
"Tipo de error: " << N.what() << std::endl;
71 throw Exception(
"ERROR: LeeCompresor en el compresor: " + std::to_string(FNumeroCompresor) + N.what());
78 void TCompresorDep::RelacionDepositoCompresor(
TDeposito *DepositoRot,
TDeposito *DepositoEst) {
81 FDepositoRot = DepositoRot;
82 FDepositoEst = DepositoEst;
84 FDepositoRot->AsignaCompresor(
this, -1);
85 FDepositoEst->AsignaCompresor(
this, 1);
87 }
catch(exception & N) {
88 std::cout <<
"ERROR: TCompTubos::RelacionTubos en el compresor: " << FNumeroCompresor << std::endl;
89 std::cout <<
"Tipo de error: " << N.what() << std::endl;
90 throw Exception(
"ERROR: LeeCompresor en el compresor: " + std::to_string(FNumeroCompresor) + N.what());
94 void TCompresorDep::Initialize() {
96 FTemperatura10 = __units::degCToK(FDepositoRot->getTemperature());
109 void TCompresorDep::CalculaGasto(
double TrabajoInsTurbina,
double TiempoActual) {
119 double ErrorMasa = 0.;
130 double DescorrigeGasto = 0.;
134 FGamma = FDepositoRot->getGamma();
135 FRMezcla = FDepositoRot->getR();
136 FGamma4 = __Gamma::G4(FGamma);
137 FGamma5 = __Gamma::G5(FGamma);
139 FPresion10 = FDepositoRot->getPressure();
140 FPresion20 = FDepositoEst->getPressure();
141 FTemperatura10 =
pow2(FDepositoRot->getSpeedsound() * __cons::ARef) / FRMezcla / FGamma;
142 FRelacionCompresion = FPresion20 / FPresion10;
143 FDeltaTiempo = TiempoActual - FTiempo0;
144 FTiempo0 = TiempoActual;
145 DescorrigeGasto = __units::BarToPa(FPresion10) / Mapa->getPresionRef() / sqrt(FTemperatura10 / Mapa->getTempRef());
147 if(FRelacionCompresion <= 1.) {
148 FGastoCorregido = Mapa->getGastoRelComp1();
149 FGastoCompresor = Mapa->getGastoRelComp1() * DescorrigeGasto;
150 FRendimiento = Mapa->EvaluaRendSplines(Mapa->getGastoRelComp1());
151 FTrabajo = FGastoCompresor * FRMezcla * FGamma4 / 2 * FTemperatura10 * (pow(FRelacionCompresion,
152 2. * FGamma5) - 1.) / FRendimiento;
153 FTempGasto = FTemperatura10
156 PuntosDeCruce =
new int[Mapa->getNumPuntos()];
157 Aux0 = Mapa->GetRelCompInt(0) - FRelacionCompresion;
159 for(
int i = 0; i < Mapa->getNumPuntos(); i++) {
160 Aux1 = Mapa->GetRelCompInt(i + 1) - FRelacionCompresion;
161 if(Aux0 * Aux1 < 0) {
162 PuntosDeCruce[NumGastos] = i;
168 FRendimiento = Mapa->EvaluaRendSplines(Mapa->getGastoBombeo());
169 FTrabajo = Mapa->getGastoBombeo() * DescorrigeGasto * FRMezcla * FGamma4 / 2 * FTemperatura10 * (pow(
170 Mapa->getRelCompBombeo(), 2. * FGamma5) - 1.) / FRendimiento;
171 FTempGasto = FTemperatura10 + (pow(FRelacionCompresion, FGamma5 * 2) - 1) * FTemperatura10 / FRendimiento;
172 FGastoCompresor = 0.;
174 RelComp =
new double[NumGastos];
175 Gastos =
new double[NumGastos];
176 Trab =
new double[NumGastos];
177 Rnd =
new double[NumGastos];
178 for(
int i = 0; i < NumGastos; i++) {
182 Masa0 = Mapa->GetGastoInt(PuntosDeCruce[0]);
183 RC0 = Mapa->GetRelCompInt(PuntosDeCruce[0]);
184 Masa1 = Mapa->GetGastoInt(PuntosDeCruce[0] + 1);
186 while(ErrorMasa > 1e-5 && ErrorRC > 1e-5 && Contador < 100) {
187 MasaX = (Masa0 + Masa1) / 2.;
188 RCX = Mapa->EvaluaRCHermite(MasaX);
189 if((RC0 - FRelacionCompresion) * (RCX - FRelacionCompresion) < 0) {
192 ErrorMasa = fabs(Masa0 - MasaX);
194 ErrorMasa = fabs(Masa0 - MasaX);
198 ErrorRC = fabs(RCX - FRelacionCompresion);
203 Rnd[i] = Mapa->EvaluaRendSplines(Gastos[i]);
204 Trab[i] = Gastos[i] * DescorrigeGasto * FRMezcla * FGamma4 / 2. * FTemperatura10 * (pow(RelComp[i],
205 FGamma5 * 2.) - 1.) / Rnd[i];
208 DeltaWork =
new double[NumGastos];
209 for(
int i = 0; i < NumGastos; i++) {
210 DeltaWork[i] = fabs(Trab[i] - TrabajoInsTurbina);
214 for(
int j = 1; j < NumGastos; j++) {
215 if(DeltaWork[j] < Min) {
220 FGastoCorregido = Gastos[PuntoMin];
221 FGastoCompresor = Gastos[PuntoMin] * DescorrigeGasto;
222 FTrabajo = Trab[PuntoMin];
223 FTempGasto = FTemperatura10 + (pow(RelComp[PuntoMin], FGamma5 * 2) - 1) * FTemperatura10 / Rnd[PuntoMin];
224 FRendimiento = Rnd[PuntoMin];
226 FGastoCorregido = Gastos[0];
227 FGastoCompresor = Gastos[0] * DescorrigeGasto;
229 FTempGasto = FTemperatura10 + (pow(RelComp[0], FGamma5 * 2) - 1) * FTemperatura10 / Rnd[0];
230 FRendimiento = Rnd[0];
234 FASonidoSalida = sqrt(FGamma * FRMezcla * FTempGasto);
235 FTrabajo *= FDeltaTiempo;
236 FPotencia = FTrabajo / FDeltaTiempo;
237 FTrabajoPaso += FTrabajo;
238 FDeltaTPaso += FDeltaTiempo;
239 FRegimenCorregido = Mapa->getRegimenCorregido();
241 }
catch(exception & N) {
242 std::cout <<
"ERROR: TCompresorDep::CalculaGasto en el compresor: " << FNumeroCompresor << std::endl;
243 std::cout <<
"Tipo de error: " << N.what() << std::endl;
244 throw Exception(
"ERROR: CalculaGasto en el compresor: " + std::to_string(FNumeroCompresor) + N.what());
251 #pragma package(smart_init)