36 #include "TMapaComp.h"
41 TMapaComp::TMapaComp(
int i) :
45 FGastoRelComp1 = NULL;
47 FRelCompBombeo = NULL;
53 FCoefSplBombeo = NULL;
56 FNumCurvasRenAd = NULL;
73 FRendCurvaBombeo = 0.4;
75 FRendGastoMaximo = 0.1;
82 TMapaComp::~TMapaComp() {
83 if(FGastoRelComp1 != NULL)
84 delete[] FGastoRelComp1;
85 if(FGastoBombeo != NULL)
86 delete[] FGastoBombeo;
87 if(FRelCompBombeo != NULL)
88 delete[] FRelCompBombeo;
89 if(FRelComp != NULL) {
90 for(
int i = 0; i < FNumCurvasReg; i++) {
95 if(FGastoRend != NULL) {
96 for(
int i = 0; i < FNumCurvasReg; i++) {
97 delete[] FGastoRend[i];
102 for(
int i = 0; i < FNumCurvasReg; i++) {
111 if(FCoefSplBombeo != NULL)
112 delete[] FCoefSplBombeo;
113 if(FRegimenCurva != NULL)
114 delete[] FRegimenCurva;
115 if(FNumCurvasRen != NULL)
116 delete[] FNumCurvasRen;
117 if(FNumCurvasRenAd != NULL)
118 delete[] FNumCurvasRenAd;
119 if(FCoefbSup != NULL) {
120 for(
int i = 0; i < FNumCurvasReg; i++) {
121 delete[] FCoefbSup[i];
125 if(FCoefbInf != NULL) {
126 for(
int i = 0; i < FNumCurvasReg; i++) {
127 delete[] FCoefbInf[i];
131 if(FCoefcSup != NULL) {
132 for(
int i = 0; i < FNumCurvasReg; i++) {
133 delete[] FCoefcSup[i];
137 if(FCoefcInf != NULL) {
138 for(
int i = 0; i < FNumCurvasReg; i++) {
139 delete[] FCoefcInf[i];
143 if(FCoefdSup != NULL) {
144 for(
int i = 0; i < FNumCurvasReg; i++) {
145 delete[] FCoefdSup[i];
149 if(FCoefdInf != NULL) {
150 for(
int i = 0; i < FNumCurvasReg; i++) {
151 delete[] FCoefdInf[i];
156 delete[] FRelCompInt;
161 if(FGastoAdim != NULL) {
162 for(
int i = 0; i < FNumCurvasReg; i++) {
163 delete[] FGastoAdim[i];
167 if(FRendAdim != NULL) {
168 for(
int i = 0; i < FNumCurvasReg; i++) {
169 delete[] FRendAdim[i];
173 if(FCoefSplRend != NULL) {
174 for(
int i = 0; i < FNumCurvasReg; i++) {
175 delete[] FCoefSplRend[i];
177 delete[] FCoefSplRend;
189 void TMapaComp::LeeMapa(FILE *fich) {
193 std::cout <<
"LECTURA MAPA COMPRESOR" << std::endl;
194 std::cout <<
"______________________" << std::endl;
195 fscanf(fich,
"%lf %lf ", &FPresionRef, &FTempRef);
196 FTempRef = __units::degCToK(FTempRef);
198 FPresionRef = __units::BarToPa(FPresionRef);
199 fscanf(fich,
"%lf %lf %lf ", &FMassMultiplier, &FCRMultiplier, &FEffMultiplier);
201 std::cout <<
"Datos de Referencia:" << std::endl;
202 std::cout <<
"Pressure: " << FPresionRef <<
" Pa" << std::endl;
203 std::cout <<
"Temperature: " << FTempRef <<
" K" << std::endl;
206 fscanf(fich,
"%lf %lf %lf ", &FRegMin, &FRegMax, &FIncReg);
207 FNumCurvasReg = floor(((FRegMax - FRegMin) / FIncReg) + 0.5) + 1;
210 fscanf(fich,
"%lf %lf %lf ", &FGastoMin, &FGastoMax, &FIncGasto);
211 FGastoMin *= FMassMultiplier;
212 FGastoMax *= FMassMultiplier;
213 FIncGasto *= FMassMultiplier;
214 FNumPuntosGasto = floor(((FGastoMax - FGastoMin) / FIncGasto) + 0.5) + 1;
217 fscanf(fich,
"%d ", &FNumCurvasRendMax);
221 FGastoRelComp1 =
new double[FNumCurvasReg];
222 FGastoBombeo =
new double[FNumCurvasReg + 1];
223 FRelCompBombeo =
new double[FNumCurvasReg + 1];
224 FRegimenCurva =
new double[FNumCurvasReg];
225 FNumCurvasRen =
new int[FNumCurvasReg];
226 FNumCurvasRenAd =
new int[FNumCurvasReg];
227 FCoefSplBombeo =
new double[FNumCurvasReg + 1];
228 FSpl =
new stSpline[FNumPuntosGasto + 1];
229 FOrtp =
new stOrtoPol[FNumCurvasRendMax + 1];
230 FRelComp =
new double*[FNumCurvasReg];
231 for(
int i = 0; i < FNumCurvasReg; i++) {
232 FRelComp[i] =
new double[FNumPuntosGasto];
234 FGastoInt =
new double[FNumPuntosGasto + 1];
235 FRelCompInt =
new double[FNumPuntosGasto + 1];
236 FCoefSplRC =
new double[FNumPuntosGasto + 1];
238 FGastoRend =
new double*[FNumCurvasReg];
239 FRend =
new double*[FNumCurvasReg];
240 for(
int i = 0; i < FNumCurvasReg; i++) {
241 FGastoRend[i] =
new double[FNumCurvasRendMax];
242 FRend[i] =
new double[FNumCurvasRendMax];
247 for(
int i = 0; i < FNumCurvasReg; i++) {
248 FRegimenCurva[i] = FRegMin + FIncReg * (double) i;
249 fscanf(fich,
"%lf ", &FGastoRelComp1[i]);
250 FGastoRelComp1[i] *= FMassMultiplier;
252 fscanf(fich,
"%lf %lf ", &FGastoBombeo[i], &FRelCompBombeo[i]);
253 FGastoBombeo[i] = FGastoBombeo[i] * FMassMultiplier;
254 FRelCompBombeo[i] = (FRelCompBombeo[i] - 1) * FCRMultiplier + 1;
256 for(
int j = 0; j < FNumPuntosGasto; j++) {
257 fscanf(fich,
"%lf ", &FRelComp[i][j]);
258 FRelComp[i][j] = (FRelComp[i][j] - 1) * FCRMultiplier + 1;
260 FNumCurvasRen[i] = 0;
261 for(
int j = 0; j < FNumCurvasRendMax; j++) {
262 fscanf(fich,
"%lf %lf ", &FGastoRend[i][j], &FRend[i][j]);
263 FGastoRend[i][j] = FGastoRend[i][j] * FMassMultiplier;
264 FRend[i][j] = FRend[i][j] * FEffMultiplier;
265 if(FRend[i][j] > 0.) {
268 if(FGastoRend[i][j] > FGastoRelComp1[i]) {
269 std::cout <<
"WARNING: Existen puntos de rendimiento en la curva de regimen: " << FRegimenCurva[i] << std::endl;
270 std::cout <<
" con valores de massflow mayores del massflow de relacion de compresion 1" << std::endl;
271 std::cout <<
" -Valor del massflow del punto de rendimiento: " << FGastoRend[i][j] << std::endl;
272 std::cout <<
" -Valor del massflow de relacion de compresion 1: " << FGastoRelComp1[i] << std::endl;
273 std::cout <<
" Revisa el mapa. Esto puede inducir errores importantes de interpolacion" << std::endl;
274 std::cout <<
" en el compresor numero " << FNumeroCompresor << std::endl << std::endl;
282 for(
int i = FNumCurvasReg; i > 0; --i) {
283 FGastoBombeo[i] = FGastoBombeo[i - 1];
284 FRelCompBombeo[i] = FRelCompBombeo[i - 1];
286 FGastoBombeo[0] = 0.;
287 FRelCompBombeo[0] = 1.;
289 Hermite(FNumCurvasReg + 1, FGastoBombeo, FRelCompBombeo, FCoefSplBombeo);
339 FGastoAdim =
new double*[FNumCurvasReg];
340 FRendAdim =
new double*[FNumCurvasReg];
341 FCoefSplRend =
new double*[FNumCurvasReg];
342 bool RendEnBombeo =
false;
343 for(
int i = 0; i < FNumCurvasReg; i++) {
344 if(FGastoRend[i][0] < FGastoBombeo[i + 1] * 1.001 && FGastoRend[i][0] > FGastoBombeo[i + 1] * 0.999) {
345 FNumCurvasRenAd[i] = FNumCurvasRen[i] + 1;
347 std::cout <<
"INFO: El punto de bombeo de la curva de " << FRegimenCurva[i] <<
" rpm tiene rendimiento" << std::endl;
349 FNumCurvasRenAd[i] = FNumCurvasRen[i] + 2;
350 RendEnBombeo =
false;
351 std::cout <<
"INFO: El punto de bombeo de la curva de " << FRegimenCurva[i] <<
" rpm no tiene rendimiento" << std::endl;
353 FGastoAdim[i] =
new double[FNumCurvasRenAd[i]];
354 FRendAdim[i] =
new double[FNumCurvasRenAd[i]];
355 FCoefSplRend[i] =
new double[FNumCurvasRenAd[i]];
357 FGastoAdim[i][0] = 0.;
359 FRendAdim[i][0] = FRend[i][0];
361 FRendAdim[i][0] = FRendCurvaBombeo;
364 FGastoAdim[i][FNumCurvasRenAd[i] - 1] = 1.;
365 FRendAdim[i][FNumCurvasRenAd[i] - 1] = FRendGastoMaximo;
366 for(
int j = 1; j < FNumCurvasRenAd[i] - 1; j++) {
368 FGastoAdim[i][j] = (FGastoRend[i][j] - FGastoBombeo[i + 1]) / (FGastoRelComp1[i] - FGastoBombeo[i + 1]);
369 FRendAdim[i][j] = FRend[i][j];
371 FGastoAdim[i][j] = (FGastoRend[i][j - 1] - FGastoBombeo[i + 1]) / (FGastoRelComp1[i] - FGastoBombeo[i + 1]);
372 FRendAdim[i][j] = FRend[i][j - 1];
374 if(FGastoAdim[i][j] <= FGastoAdim[i][j - 1]) {
375 std::cout <<
"WARNING: La tabla Massflow-Rendimiento en el regimen de " << FRegimenCurva[i] <<
" rpm esta desordenada"
377 std::cout <<
" Si se continua con este mapa pueden aparecer errores en la interpolacion" << std::endl;
378 std::cout <<
" Ordene los datos de forma creciente en massflow" << std::endl;
381 Hermite(FNumCurvasRenAd[i], FGastoAdim[i], FRendAdim[i], FCoefSplRend[i]);
385 }
catch(exception &N) {
386 std::cout <<
"ERROR: LeeMapa en el compresor: " << FNumeroCompresor << std::endl;
387 std::cout <<
"Tipo de error: " << N.what() << std::endl;
390 throw Exception(
"ERROR: LeeMapa en el compresor: " + std::to_string(FNumeroCompresor) + N.what());
400 void TMapaComp::Spline(
int n,
double *x,
double *y,
double *sol) {
402 double Espaciado = 0.;
404 for(
int i = 1; i < n; ++i) {
405 FSpl[i].h = x[i] - x[i - 1];
406 FSpl[i].dif = y[i] - y[i - 1];
407 if(FSpl[i].h <= 0.) {
408 std::cout <<
"ERROR: Error al crear la spline" << std::endl;
409 std::cout <<
" Los valores en X no estan ordenados o existen 2 puntos situados en el mismo X" << std::endl <<
411 throw Exception(
"ERROR: Error al crear la spline");
417 for(
int i = 1; i < n - 1; ++i) {
418 Espaciado = FSpl[i + 1].h / FSpl[i].h;
419 if(Espaciado < 0.1 || Espaciado > 10.) {
420 std::cout <<
"WARNING: Deberias utilizar una distribucion mas uniforme entre los valores de X" << std::endl;
421 std::cout <<
" utilizados para ajustar la spline y asi evitar problemas" << std::endl << std::endl;
423 FSpl[i].d = 2 * (FSpl[i + 1].h + FSpl[i].h);
424 FSpl[i].d1 = FSpl[i + 1].h;
425 FSpl[i].b = (FSpl[i + 1].dif / FSpl[i + 1].h - FSpl[i].dif / FSpl[i].h) * 6.;
428 FSpl[1].ud = sqrt(FSpl[1].d);
429 for(
int i = 2; i < n - 1; i++) {
430 FSpl[i - 1].ud1 = FSpl[i - 1].d1 / FSpl[i - 1].ud;
431 FSpl[i].ud = sqrt(FSpl[i].d - FSpl[i - 1].ud1 * FSpl[i - 1].ud1);
434 FSpl[1].yp = FSpl[1].b / FSpl[1].ud;
435 for(
int i = 2; i < n - 1; ++i) {
436 FSpl[i].yp = (FSpl[i].b - FSpl[i - 1].ud1 * FSpl[i - 1].yp) / FSpl[i].ud;
443 sol[n - 2] = FSpl[n - 2].yp / FSpl[n - 2].ud;
445 for(
int i = n - 3; i >= 1; --i) {
446 sol[i] = (FSpl[i].yp - FSpl[i].ud1 * sol[i + 1]) / FSpl[i].ud;
452 }
catch(exception &N) {
453 std::cout <<
"ERROR: Spline en el compresor: " << FNumeroCompresor << std::endl;
454 std::cout <<
"Tipo de error: " << N.what() << std::endl;
455 throw Exception(
"ERROR: Spline en el compresor: ");
465 double TMapaComp::EvaluaSpline(
double punto,
int n,
double *x,
double *y,
double *sol) {
469 while(x[k] < punto && k < n - 1) {
477 double h = x[k + 1] - x[k];
479 double dx1 = x[k + 1] - punto;
480 double dx2 = punto - x[k];
481 double dx13 =
pow3(dx1);
482 double dx23 =
pow3(dx2);
484 double ret_val = (sol[k] * dx13 + sol[k + 1] * dx23 + (6 * y[k + 1] - h2 * sol[k + 1]) * dx2 +
485 (6 * y[k] - h2 * sol[k]) * dx1) / (6 * h);
489 }
catch(exception &N) {
490 std::cout <<
"ERROR: EvaluaSpline en el compresor: " << FNumeroCompresor << std::endl;
491 std::cout <<
"Tipo de error: " << N.what() << std::endl;
492 throw Exception(
"ERROR: EvaluaSpline en el compresor: ");
502 double TMapaComp::EvaluaRCSplines(
double Massflow) {
505 if(Massflow < FGastoInt[0]) {
506 ret_val = FRelCompInt[0];
511 while(FGastoInt[k] < Massflow && k < n) {
519 double h = FGastoInt[k + 1] - FGastoInt[k];
521 double dx1 = FGastoInt[k + 1] - Massflow;
522 double dx2 = Massflow - FGastoInt[k];
523 double dx13 =
pow3(dx1);
524 double dx23 =
pow3(dx2);
526 ret_val = (FCoefSplRC[k] * dx13 + FCoefSplRC[k + 1] * dx23 + (6 * FRelCompInt[k + 1] - h2 * FCoefSplRC[k + 1]) * dx2 +
527 (6 * FRelCompInt[k] - h2 * FCoefSplRC[k]) * dx1) / (6 * h);
535 }
catch(exception &N) {
536 std::cout <<
"ERROR: EvaluaRCSpline en el compresor: " << FNumeroCompresor << std::endl;
537 std::cout <<
"Tipo de error: " << N.what() << std::endl;
538 throw Exception(
"ERROR: EvaluaRCSpline en el compresor: " + std::to_string(FNumeroCompresor) + N.what());
542 double TMapaComp::EvaluaRCHermite(
double Massflow) {
544 double ret_val = 0., t2 = 0., t3 = 0., t = 0., h00 = 0., h10 = 0., h01 = 0., h11 = 0., h = 0.;
546 if(Massflow < FGastoInt[0]) {
547 ret_val = FRelCompInt[0];
548 }
else if(Massflow >= FGastoInt[FNumPuntos]) {
554 while(FGastoInt[k] < Massflow && k < n) {
557 h = (FGastoInt[k] - FGastoInt[k - 1]);
558 t = (Massflow - FGastoInt[k - 1]) / h;
561 h00 = 2 * t3 - 3 * t2 + 1;
562 h10 = t3 - 2 * t2 + t;
563 h01 = -2 * t3 + 3 * t2;
565 ret_val = h00 * FRelCompInt[k - 1] + h * h10 * FCoefSplRC[k - 1] + h01 * FRelCompInt[k] + h * h11 * FCoefSplRC[k];
569 }
catch(exception &N) {
570 std::cout <<
"ERROR: EvaluaRCSpline en el compresor: " << FNumeroCompresor << std::endl;
571 std::cout <<
"Tipo de error: " << N.what() << std::endl;
572 throw Exception(
"ERROR: EvaluaRCSpline en el compresor: " + std::to_string(FNumeroCompresor) + N.what());
586 void TMapaComp::PolOrtogonal(
int nterms,
int npoint,
double *ma,
double *rd,
double *w,
double *b,
double *c,
590 for(
int j = 0; j < nterms; ++j) {
596 for(
int i = 0; i < npoint; ++i) {
597 d[0] += rd[i] * w[i];
598 b[0] += ma[i] * w[i];
602 for(
int i = 0; i < npoint; ++i) {
603 FOrtp[i].error = rd[i] - d[0];
606 for(
int i = 0; i < npoint; ++i) {
608 FOrtp[i].pj = ma[i] - b[0];
611 while(j < nterms - 1) {
613 for(
int i = 0; i < npoint; ++i) {
614 p = FOrtp[i].pj * w[i];
615 d[j] += FOrtp[i].error * p;
621 for(
int i = 0; i < npoint; ++i) {
622 FOrtp[i].error -= d[j] * FOrtp[i].pj;
626 c[j] = FOrtp[j].s / FOrtp[j - 1].s;
627 for(
int i = 0; i < npoint; ++i) {
629 FOrtp[i].pj = (ma[i] - b[j]) * FOrtp[i].pj - c[j] * FOrtp[i].pjm1;
634 }
catch(exception &N) {
635 std::cout <<
"ERROR: PolOrtogonal en el compresor: " << FNumeroCompresor << std::endl;
636 std::cout <<
"Tipo de error: " << N.what() << std::endl;
637 throw Exception(
"ERROR: PolOrtogonal en el compresor: ");
648 void TMapaComp::InterpolaMapa(
double rtc,
double AmbientTemperature) {
656 FRegComp = rtc * sqrt(FTempRef / AmbientTemperature);
661 for(
int i = 0; i < FNumCurvasReg - 1; ++i) {
662 if(FRegComp >= FRegimenCurva[i]) {
666 DeltaN = (FRegComp - FRegimenCurva[FCurvInf]) / FIncReg;
670 if(FRegComp > FRegMax) {
671 FGastoBombeoX = FGastoBombeo[FCurvInf + 1] + (FGastoBombeo[FCurvInf + 1] - FGastoBombeo[FCurvInf]) / FIncReg *
672 (FRegComp - FRegMax);
673 }
else if(FRegComp < FRegMin) {
674 FGastoBombeoX = FGastoBombeo[FCurvInf + 1] - (FGastoBombeo[FCurvInf + 2] - FGastoBombeo[FCurvInf + 1]) / FIncReg *
675 (FRegMin - FRegComp);
677 FGastoBombeoX = FGastoBombeo[FCurvInf + 1] + (FGastoBombeo[FCurvInf + 2] - FGastoBombeo[FCurvInf + 1]) * DeltaN;
679 if(FGastoBombeoX < 0)
682 FRelCompBombeoX = EvaluaHermite(FGastoBombeoX, FNumCurvasReg + 1, FGastoBombeo, FRelCompBombeo, FCoefSplBombeo);
684 if(FRegComp > FRegMax) {
685 FGastoRelComp1X = FGastoRelComp1[FCurvInf] + (FGastoRelComp1[FCurvInf] - FGastoRelComp1[FCurvInf - 1]) / FIncReg *
686 (FRegComp - FRegMax);
687 }
else if(FRegComp < FRegMin) {
688 FGastoRelComp1X = FGastoRelComp1[FCurvInf] - (FGastoRelComp1[FCurvInf + 1] - FGastoRelComp1[FCurvInf]) / FIncReg *
689 (FRegMin - FRegComp);
691 FGastoRelComp1X = FGastoRelComp1[FCurvInf] + (FGastoRelComp1[FCurvInf + 1] - FGastoRelComp1[FCurvInf]) * DeltaN;
698 if(FRegComp < FRegMin) {
699 FNumPuntos = floor(FGastoRelComp1X / FIncGasto) + 1;
702 while(FRelComp[FCurvInf][j] > 0. && j < FNumPuntosGasto - 1) {
711 if(FRegComp < FRegMin) {
712 for(
int j = 0; j < FNumPuntos; ++j) {
713 FGastoInt[j] = FGastoMin + FIncGasto * j;
714 FRelCompInt[j] = FRelComp[FCurvInf][j] - (FRelComp[FCurvInf + 1][j] - FRelComp[FCurvInf][j]) / FIncReg *
715 (FRegMin - FRegComp);
716 if(FRelCompInt[j] < 1.)
720 for(
int j = 0; j < FNumPuntos; ++j) {
721 FGastoInt[j] = FGastoMin + FIncGasto * j;
722 FRelCompInt[j] = FRelComp[FCurvInf][j] + (FRelComp[FCurvInf + 1][j] - FRelComp[FCurvInf][j]) * DeltaN;
725 FGastoInt[FNumPuntos] = FGastoRelComp1X;
726 FRelCompInt[FNumPuntos] = 1.;
728 FCurrentPresMAX = FRelCompInt[0];
729 for(
int j = 1; j < FNumPuntos; ++j) {
730 if(FRelCompInt[j] > FCurrentPresMAX)
731 FCurrentPresMAX = FRelCompInt[j];
736 Hermite(FNumPuntos, FGastoInt, FRelCompInt, FCoefSplRC);
768 }
catch(exception &N) {
769 std::cout <<
"ERROR: InterpolaMapa en el compresor: " << FNumeroCompresor << std::endl;
770 std::cout <<
"Tipo de error: " << N.what() << std::endl;
771 throw Exception(
"ERROR: InterpolaMapa en el compresor: ");
782 double TMapaComp::EvaluaRendimiento(
double MasaAire) {
789 ret_val = FCoefdX[k];
795 ret_val = FCoefdX[k] + (MasaAire - FCoefbX[k]) * prev - FCoefcX[k + 1] * prev2;
799 }
catch(exception &N) {
800 std::cout <<
"ERROR: EvaluaRendimiento en el compresor: " << FNumeroCompresor << std::endl;
801 std::cout <<
"Tipo de error: " << N.what() << std::endl;
802 throw Exception(
"ERROR: EvaluaRendimiento en el compresor: ");
809 double TMapaComp::EvaluaRendSplines(
double MasaAire) {
810 double AireAdim = 0.;
816 if(MasaAire < FGastoBombeoX) {
818 DeltaN = (FRegComp - FRegimenCurva[FCurvInf]) / FIncReg;
820 RendInf = FRendAdim[FCurvInf][0];
821 RendSup = FRendAdim[FCurvInf + 1][0];
823 if(FRegComp > FRegMax) {
824 ret_val = RendSup + (RendSup - RendInf) / FIncReg * (FRegComp - FRegMax);
825 }
else if(FRegComp < FRegMin) {
826 ret_val = RendInf - (RendSup - RendInf) / FIncReg * (FRegMin - FRegComp);
828 ret_val = RendInf + (RendSup - RendInf) * DeltaN;
830 }
else if(MasaAire > FGastoRelComp1X) {
831 ret_val = FRendGastoMaximo;
833 AireAdim = (MasaAire - FGastoBombeoX) / (FGastoRelComp1X - FGastoBombeoX);
835 RendInf = EvaluaHermite(AireAdim, FNumCurvasRenAd[FCurvInf], FGastoAdim[FCurvInf], FRendAdim[FCurvInf],
836 FCoefSplRend[FCurvInf]);
838 RendSup = EvaluaHermite(AireAdim, FNumCurvasRenAd[FCurvInf + 1], FGastoAdim[FCurvInf + 1], FRendAdim[FCurvInf + 1],
839 FCoefSplRend[FCurvInf + 1]);
841 DeltaN = (FRegComp - FRegimenCurva[FCurvInf]) / FIncReg;
843 if(FRegComp > FRegMax) {
844 ret_val = RendSup + (RendSup - RendInf) / FIncReg * (FRegComp - FRegMax);
845 }
else if(FRegComp < FRegMin) {
846 ret_val = RendInf - (RendSup - RendInf) / FIncReg * (FRegMin - FRegComp);
848 ret_val = RendInf + (RendSup - RendInf) * DeltaN;
852 }
catch(exception &N) {
853 std::cout <<
"ERROR: EvaluaRendSplines en el compresor: " << FNumeroCompresor << std::endl;
854 std::cout <<
"Tipo de error: " << N.what() << std::endl;
855 throw Exception(
"ERROR: EvaluaRendSplines en el compresor: ");
862 double TMapaComp::GetRelCompInt(
int i) {
864 return FRelCompInt[i];
865 }
catch(exception &N) {
866 std::cout <<
"ERROR: GetRelCompInt en el compresor: " << FNumeroCompresor << std::endl;
867 std::cout <<
"Tipo de error: " << N.what() << std::endl;
868 throw Exception(
"ERROR: GetRelCompInt en el compresor: ");
875 double TMapaComp::GetGastoInt(
int i) {
878 }
catch(exception &N) {
879 std::cout <<
"ERROR: GetGastoInt en el compresor: " << FNumeroCompresor << std::endl;
880 std::cout <<
"Tipo de error: " << N.what() << std::endl;
881 throw Exception(
"ERROR: GetGastoInt en el compresor: ");
888 double TMapaComp::BuscaRegimen(
double RC,
double Massflow,
double AmbientTemperature) {
892 double ret_val = 0., val1 = 0., val2 = 0.;
895 while(RC > RCSup && i < FNumCurvasReg) {
896 reg = FRegimenCurva[i] * AmbientTemperature / FTempRef;
897 InterpolaMapa(reg, AmbientTemperature);
899 if(Massflow < FGastoRelComp1[i]) {
900 RCSup = EvaluaRCSplines(Massflow);
908 std::cout <<
"WARNING: El Punto se sale por arriba del mapa " << std::endl;
913 reg = FRegimenCurva[inf] * AmbientTemperature / FTempRef;
914 InterpolaMapa(reg, AmbientTemperature);
916 if(Massflow < FGastoRelComp1[inf]) {
917 RCInf = EvaluaRCSplines(Massflow);
919 std::cout <<
"WARNING: El siguiente punto puede estar mal calculado:" << std::endl;
920 std::cout <<
" Relacionde compresion: " << RC << std::endl;
921 std::cout <<
" Massflow masico: " << Massflow << std::endl;
922 std::cout <<
" Deberias aumentar el numero de curvas del mapa" << std::endl << std::endl;
925 ret_val = (RC - RCInf) / (RCSup - RCInf) * (FRegimenCurva[sup] - FRegimenCurva[inf]) + FRegimenCurva[inf];
930 InterpolaMapa(FRegimenCurva[sup], __units::degCToK(AmbientTemperature));
931 RCSup = EvaluaRCSplines(Massflow);
932 val1 = (RC - RCInf) / (RCSup - RCInf) * (FRegimenCurva[sup] - FRegimenCurva[inf]) + FRegimenCurva[inf];
934 val2 = (RC - 1) / (RCInf - 1) * (FRegimenCurva[inf]);
935 ret_val = (val1 + val2) / 2;
936 std::cout <<
"WARNING: El siguiente punto puede estar mal calculado:" << std::endl;
937 std::cout <<
" Relacionde compresion: " << RC << std::endl;
938 std::cout <<
" Massflow masico: " << Massflow << std::endl;
939 std::cout <<
" Deberias incluir curvas con menor regimen de giro" << std::endl << std::endl;
942 }
catch(exception &N) {
943 std::cout <<
"ERROR: BuscaRegimen en el compresor: " << FNumeroCompresor << std::endl;
944 std::cout <<
"Tipo de error: " << N.what() << std::endl;
945 throw Exception(
"ERROR: BuscaRegimen en el compresor: ");
952 void TMapaComp::ImprimeMapa() {
953 std::cout <<
"Printing compresso map .";
955 fich = fopen(
"MapaSimple.txt",
"w");
959 massflow =
new double[200];
960 rc =
new double*[200];
961 for(
int j = 0; j < 200; j++) {
962 rc[j] =
new double[FNumCurvasReg];
964 inc = (FGastoMax - FGastoMin) / 200;
965 for(
int j = 0; j < 200; j++) {
966 massflow[j] = FGastoMin + inc * (double) j;
968 for(
int i = 0; i < FNumCurvasReg; i++) {
970 InterpolaMapa(FRegMin + FIncReg * (
double) i, FTempRef);
971 for(
int j = 0; j < 200; j++) {
972 rc[j][i] = EvaluaRCSplines(massflow[j]);
976 for(
int j = 0; j < 200; j++) {
977 if(j < FNumCurvasReg) {
978 fprintf(fich,
"%lf\t%lf\t", FGastoBombeo[j], FRelCompBombeo[j]);
980 fprintf(fich,
"\t\t");
982 fprintf(fich,
"%lf\t", massflow[j]);
983 for(
int i = 0; i < FNumCurvasReg; i++) {
984 fprintf(fich,
"%lf\t", rc[j][i]);
989 for(
int j = 0; j < 200; j++) {
993 std::cout <<
"Finished" << std::endl;
998 #pragma package(smart_init)