31 #include "TCCCompresorVolumetrico.h"
39 TCCCompresorVolumetrico::TCCCompresorVolumetrico(nmTypeBC TipoCC,
int numCC, nmTipoCalculoEspecies SpeciesModel,
40 int numeroespecies, nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
41 TCondicionContorno(TipoCC, numCC, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
46 FResMediosCV.Potencia =
false;
47 FResMediosCV.Massflow =
false;
48 FResMediosCV.Pressure =
false;
50 FResInstantCV.Potencia =
false;
51 FResInstantCV.Massflow =
false;
52 FResInstantCV.Pressure =
false;
61 TCCCompresorVolumetrico::~TCCCompresorVolumetrico() {
63 delete[] FTuboExtremo;
64 if(FComposicion != NULL)
65 delete[] FComposicion;
72 void TCCCompresorVolumetrico::LeeCCCompresorVol(
const char *FileWAM, fpos_t &filepos,
int NumberOfPipes,
TTubo **Pipe,
75 int i = 0, ControlRegimen;
76 double fracciontotal = 0.;
79 FTuboExtremo[0].Pipe = NULL;
81 while(FNumeroTubosCC < 1 && i < NumberOfPipes) {
82 if(Pipe[i]->getNodoIzq() == FNumeroCC) {
83 FTuboExtremo[FNumeroTubosCC].Pipe = Pipe[i];
84 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmLeft;
87 FCC = &(FTuboExtremo[FNumeroTubosCC].Beta);
88 FCD = &(FTuboExtremo[FNumeroTubosCC].Landa);
89 FSeccionTubo = __geom::Circle_area(Pipe[i]->GetDiametro(FNodoFin));
92 if(Pipe[i]->getNodoDer() == FNumeroCC) {
93 FTuboExtremo[FNumeroTubosCC].Pipe = Pipe[i];
94 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmRight;
95 FNodoFin = Pipe[i]->getNin() - 1;
97 FCC = &(FTuboExtremo[FNumeroTubosCC].Landa);
98 FCD = &(FTuboExtremo[FNumeroTubosCC].Beta);
99 FSeccionTubo = __geom::Circle_area(Pipe[i]->GetDiametro(FNodoFin));
105 FILE *fich = fopen(FileWAM,
"r");
106 fsetpos(fich, &filepos);
108 fscanf(fich,
"%d ", &ControlRegimen);
110 switch(ControlRegimen) {
112 FControlRegimen = nmPropio;
115 FControlRegimen = nmMotor;
119 if(FControlRegimen == nmPropio) {
120 fscanf(fich,
"%lf ", &FRegimen);
121 FRelacionVelocidadesCV = 1.;
122 }
else if(FControlRegimen == nmMotor && HayMotor) {
123 fscanf(fich,
"%lf ", &FRelacionVelocidadesCV);
126 "ERROR: TCCCompresorVolumetrico::LeeCCDeposito Lectura del Control del Regimen erronea en la condicion de contorno: " <<
127 FNumeroCC << std::endl;
131 fscanf(fich,
"%lf %lf ", &FPresionCV, &FTemperaturaCV);
132 fscanf(fich,
"%lf %lf %lf ", &FC1Caudal, &FC2Caudal, &FC3Caudal);
133 fscanf(fich,
"%lf %lf %lf ", &FC1Temperatura, &FC2Temperatura, &FC3Temperatura);
134 fscanf(fich,
"%lf %lf %lf ", &FC1Potencia, &FC2Potencia, &FC3Potencia);
135 fscanf(fich,
"%lf %lf %lf ", &FC4Potencia, &FC5Potencia, &FC6Potencia);
138 FFraccionMasicaEspecie =
new double[FNumeroEspecies - FIntEGR];
139 FComposicion =
new double[FNumeroEspecies - FIntEGR];
140 for(
int i = 0; i < FNumeroEspecies - 1; i++) {
141 fscanf(fich,
"%lf ", &FComposicion[i]);
143 fracciontotal += FComposicion[i];
147 if(FCalculoEspecies == nmCalculoCompleto) {
148 if(FComposicion[0] > 0.2)
149 FComposicion[FNumeroEspecies - 1] = 0.;
151 FComposicion[FNumeroEspecies - 1] = 1.;
153 if(FComposicion[0] > 0.5)
154 FComposicion[FNumeroEspecies - 1] = 1.;
156 FComposicion[FNumeroEspecies - 1] = 0.;
159 if(fracciontotal != 1.) {
161 "ERROR: La fraccion masica total no puede ser distinta de 1. Repasa la lectura en la condicion de contorno " <<
162 FNumeroCC << std::endl;
166 fgetpos(fich, &filepos);
171 catch(exception &N) {
172 std::cout <<
"ERROR: TCCCompresorVolumetrico::LeeCCCompresorVol en la condicion de contorno: " << FNumeroCC <<
174 std::cout <<
"Tipo de error: " << N.what() << std::endl;
182 void TCCCompresorVolumetrico::ObtencionValoresInstantaneos(
double RegimenMotor) {
185 FPressure = FTuboExtremo[FNumeroTubosCC - 1].Pipe->
GetPresion(FNodoFin);
186 if(FControlRegimen == nmMotor) {
187 FRegimen = RegimenMotor;
190 }
catch(exception &N) {
191 std::cout <<
"ERROR: TCCCompresorVolumetrico::ObtencionValoresInstantaneos en la condicion de contorno: " << FNumeroCC
193 std::cout <<
"Tipo de error: " << N.what() << std::endl;
203 double ei, ed, massflow, entropia, FraccionMasicaAcum = 0.;
206 FGamma = FTuboExtremo[0].Pipe->
GetGamma(FNodoFin);
207 FRMezcla = FTuboExtremo[0].Pipe->
GetRMezcla(FNodoFin);
208 FGamma3 = __Gamma::G3(FGamma);
209 FGamma4 = __Gamma::G4(FGamma);
212 massflow = FC1Caudal + FC2Caudal * FPressure + FC3Caudal * FRelacionVelocidadesCV * FRegimen;
215 FDensidad = __units::BarToPa(FPresionCV) / (FRMezcla * __units::degCToK(FTemperaturaCV));
216 FGasto = massflow * FDensidad / 1000.;
219 FTemperature = FC1Temperatura *
pow2(FPressure) + FC2Temperatura * FPressure + FC3Temperatura;
222 FSonido = sqrt(FGamma * __units::degCToK(FTemperature) * FRMezcla) / __cons::ARef;
225 FPotencia = FC1Potencia *
pow3(FPressure) + FC2Potencia *
pow2(FPressure) + FC3Potencia * FPressure + FC4Potencia +
226 FC5Potencia * exp(FC6Potencia * FRelacionVelocidadesCV * FRegimen);
232 stComprVol CV(FTuboExtremo[0].Entropia, *FCC, FGamma, FSonido, FGasto, FSeccionTubo, __cons::PRef, __cons::ARef);
240 FTuboExtremo[0].Entropia = CV.entropia;
241 *FCC = FSonido - FGamma3 * FVelocity;
242 *FCD = FSonido + FGamma3 * FVelocity;
246 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
248 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
250 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
251 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FTuboExtremo[0].Pipe->
GetFraccionMasicaCC(FIndiceCC, FNumeroEspecies - 1);
252 }
else if(*FCD > *FCC) {
253 for(
int j = 0; j < FNumeroEspecies - FIntEGR; j++) {
254 FFraccionMasicaEspecie[j] = FComposicion[j];
260 AcumulaResultadosMediosCV(Time);
262 }
catch(exception &N) {
263 std::cout <<
"ERROR: TCCCompresorVolumetrico::CalculaCondicionContorno en la condicion de contorno: " << FNumeroCC <<
265 std::cout <<
"Tipo de error: " << N.what() << std::endl;
296 void TCCCompresorVolumetrico::ReadAverageResultsCV(
const char *FileWAM, fpos_t &filepos) {
298 int nvars = 0, var = 0;
300 FILE *fich = fopen(FileWAM,
"r");
301 fsetpos(fich, &filepos);
303 fscanf(fich,
"%d ", &nvars);
304 for(
int i = 0; i < nvars; i++) {
305 fscanf(fich,
"%d ", &var);
308 FResMediosCV.Potencia =
true;
311 FResMediosCV.Massflow =
true;
314 FResMediosCV.Pressure =
true;
317 std::cout <<
"Resultados medios en CV(BC) " << FNumeroCC <<
" no implementados " << std::endl;
321 fgetpos(fich, &filepos);
323 }
catch(exception &N) {
324 std::cout <<
"ERROR: TCCCompresorVolumetrico::ReadAverageResultsCV en la BC " << FNumeroCC << std::endl;
325 std::cout <<
"Tipo de error: " << N.what() << std::endl;
333 void TCCCompresorVolumetrico::CabeceraResultadosMedCV(stringstream& medoutput) {
339 if(FResMediosCV.Potencia) {
341 medoutput << Label.c_str();
343 if(FResMediosCV.Massflow) {
345 medoutput << Label.c_str();
347 if(FResMediosCV.Pressure) {
349 medoutput << Label.c_str();
353 }
catch(exception &N) {
354 std::cout <<
"ERROR: TCCCompresorVolumetrico::CabeceraResultadosMedCV en la BC " << FNumeroCC << std::endl;
355 std::cout <<
"Tipo de error: " << N.what() << std::endl;
363 void TCCCompresorVolumetrico::ImprimeResultadosMedCV(stringstream& medoutput) {
367 if(FResMediosCV.Potencia)
368 medoutput <<
"\t" << FResMediosCV.PotenciaMED;
369 if(FResMediosCV.Potencia)
370 medoutput <<
"\t" << FResMediosCV.GastoMED;
371 if(FResMediosCV.Potencia)
372 medoutput <<
"\t" << FResMediosCV.PresionMED;
375 }
catch(exception &N) {
376 std::cout <<
"ERROR: TCCCompresorVolumetrico::ImprimerResultadosMedCV en la BC " << FNumeroCC << std::endl;
377 std::cout <<
"Tipo de error: " << N.what() << std::endl;
385 void TCCCompresorVolumetrico::IniciaMedias() {
388 FResMediosCV.PotenciaSUM = 0.;
389 FResMediosCV.GastoSUM = 0.;
390 FResMediosCV.PresionSUM = 0.;
391 FResMediosCV.TiempoSUM = 0.;
392 FResMediosCV.Tiempo0 = 0.;
394 }
catch(exception &N) {
395 std::cout <<
"ERROR: TCCCompresorVolumetrico::IniciaMedias en la BC: " << FNumeroCC << std::endl;
404 void TCCCompresorVolumetrico::ResultadosMediosCV() {
406 if(FResMediosCV.Potencia) {
407 FResMediosCV.PotenciaMED = FResMediosCV.PotenciaSUM / FResMediosCV.TiempoSUM;
408 FResMediosCV.PotenciaSUM = 0.;
410 if(FResMediosCV.Massflow) {
411 FResMediosCV.GastoMED = FResMediosCV.GastoSUM / FResMediosCV.TiempoSUM;
412 FResMediosCV.GastoSUM = 0.;
414 if(FResMediosCV.Pressure) {
415 FResMediosCV.PresionMED = FResMediosCV.PresionSUM / FResMediosCV.TiempoSUM;
416 FResMediosCV.PresionSUM = 0.;
418 FResMediosCV.TiempoSUM = 0;
419 }
catch(exception &N) {
420 std::cout <<
"ERROR: TCCCompresorVolumetrico::ResultadosMediosCV en la BC: " << FNumeroCC << std::endl;
421 std::cout <<
"Tipo de error: " << N.what() << std::endl;
429 void TCCCompresorVolumetrico::AcumulaResultadosMediosCV(
double Actual) {
432 double Delta = Actual - FResMediosCV.Tiempo0;
434 if(FResMediosCV.Potencia) {
435 FResMediosCV.PotenciaSUM += FPotencia * Delta;
437 if(FResMediosCV.Massflow) {
438 FResMediosCV.GastoSUM += FGasto * Delta;
440 if(FResMediosCV.Pressure) {
441 FResMediosCV.PresionSUM += FPressure * Delta;
444 FResMediosCV.TiempoSUM += Delta;
445 FResMediosCV.Tiempo0 = Delta;
446 }
catch(exception &N) {
447 std::cout <<
"ERROR: TCCCompresorVolumetrico::AcumulaResultadosMediosCV en la BC: " << FNumeroCC << std::endl;
448 std::cout <<
"Tipo de error: " << N.what() << std::endl;
456 void TCCCompresorVolumetrico::LeeResultadosInstantCV(
const char *FileWAM, fpos_t &filepos) {
457 int nvars = 0, var = 0;
460 FILE *fich = fopen(FileWAM,
"r");
461 fsetpos(fich, &filepos);
463 fscanf(fich,
"%d ", &nvars);
464 for(
int i = 0; i < nvars; i++) {
465 fscanf(fich,
"%d ", &var);
468 FResInstantCV.Potencia =
true;
471 FResInstantCV.Massflow =
true;
474 FResInstantCV.Pressure =
true;
477 std::cout <<
"Resultados medios en CV(BC) " << FNumeroCC <<
" no implementados " << std::endl;
480 fgetpos(fich, &filepos);
482 }
catch(exception &N) {
483 std::cout <<
"ERROR: TCCCompresorVolumetrico::LeeResultadosInstantCV en la BC " << FNumeroCC << std::endl;
484 std::cout <<
"Tipo de error: " << N.what() << std::endl;
492 void TCCCompresorVolumetrico::CabeceraResultadosInstantCV(stringstream& insoutput) {
497 if(FResInstantCV.Potencia) {
499 insoutput << Label.c_str();
501 if(FResInstantCV.Massflow) {
503 insoutput << Label.c_str();
505 if(FResInstantCV.Pressure) {
507 insoutput << Label.c_str();
510 }
catch(exception &N) {
511 std::cout <<
"ERROR: TCCCompresorVolumetrico::CabeceraResultadosInstantCV en la BC " << FNumeroCC << std::endl;
512 std::cout <<
"Tipo de error: " << N.what() << std::endl;
520 void TCCCompresorVolumetrico::ResultadosInstantCV() {
522 if(FResInstantCV.Potencia)
523 FResInstantCV.PotenciaINS = FPotencia;
524 if(FResInstantCV.Massflow)
525 FResInstantCV.GastoINS = FGasto;
526 if(FResInstantCV.Pressure)
527 FResInstantCV.PresionINS = FPressure;
529 }
catch(exception &N) {
530 std::cout <<
"ERROR: TCCCompresorVolumetrico::ResultadosInstantCV en la BC " << FNumeroCC << std::endl;
531 std::cout <<
"Tipo de error: " << N.what() << std::endl;
539 void TCCCompresorVolumetrico::ImprimeResultadosInstantCV(stringstream& insoutput) {
543 if(FResInstantCV.Potencia)
544 insoutput <<
"\t" << FResInstantCV.PotenciaINS;
545 if(FResInstantCV.Massflow)
546 insoutput <<
"\t" << FResInstantCV.GastoINS;
547 if(FResInstantCV.Pressure)
548 insoutput <<
"\t" << FResInstantCV.PresionINS;
551 }
catch(exception &N) {
552 std::cout <<
"ERROR: TCCCompresorVolumetrico::ImprimeResultadosInstantCV en la BC " << FNumeroCC << std::endl;
553 std::cout <<
"Tipo de error: " << N.what() << std::endl;
561 #pragma package(smart_init)