31 #include "TEjeTurbogrupo.h"
37 #include "TCompresor.h"
38 #include "TCompTubDep.h"
45 TEjeTurbogrupo::TEjeTurbogrupo(
int i,
int ncilin) {
48 FNumeroCompresor = NULL;
50 FNumeroTurbina = NULL;
52 FNumCilindros = ncilin;
54 FResMediosEje.Regimen =
false;
57 FRPMControlled =
false;
71 TEjeTurbogrupo::~TEjeTurbogrupo() {
73 if(FNumeroCompresor != NULL)
74 delete[] FNumeroCompresor;
75 if(FCompresor != NULL)
78 if(FNumeroTurbina != NULL)
79 delete[] FNumeroTurbina;
87 if(FMechLosses != NULL)
96 void TEjeTurbogrupo::ReadTurbochargerAxis(
const char *FileWAM, fpos_t &filepos,
TCompresor **Compressor,
99 int variacion = 0, htm = 0;
101 FILE *fich = fopen(FileWAM,
"r");
102 fsetpos(fich, &filepos);
105 fscanf(fich,
"%lf %d", &FRegimenEje, &variacion);
108 FVariacionRegimen = nmVariable;
111 FVariacionRegimen = nmFixed;
114 std::cout <<
"ERROR: Reading turbocharger speed variation in axis: " << FNumeroEje << std::endl;
117 if(FVariacionRegimen == nmVariable) {
118 fscanf(fich,
"%lf ", &FMomentoInercia);
121 fscanf(fich,
"%d ", &FNumCompresoresAcoplados);
122 FCompresor =
new TCompresor*[FNumCompresoresAcoplados];
123 FNumeroCompresor =
new int[FNumCompresoresAcoplados];
124 for(
int i = 0; i < FNumCompresoresAcoplados; ++i) {
126 fscanf(fich,
"%d ", &FNumeroCompresor[i]);
127 FCompresor[i] = Compressor[FNumeroCompresor[i] - 1];
128 FCompresor[i]->IniciaMedias();
131 fscanf(fich,
"%d ", &FNumTurbinasAcopladas);
132 FTurbina =
new TTurbina*[FNumTurbinasAcopladas];
133 FNumeroTurbina =
new int[FNumTurbinasAcopladas];
134 for(
int i = 0; i < FNumTurbinasAcopladas; ++i) {
136 fscanf(fich,
"%d ", &FNumeroTurbina[i]);
138 FTurbina[i] = Turbine[FNumeroTurbina[i] - 1];
139 FTurbina[i]->PutRegimen(FRegimenEje);
142 fscanf(fich,
"%d ", &FControllerID);
143 if(FControllerID > 0)
144 FRPMControlled =
true;
148 fscanf(fich,
"%d ", &numide);
151 fscanf(fich,
"%d ", &htm);
154 if(FNumTurbinasAcopladas != 1 || FNumCompresoresAcoplados != 1) {
156 "ERROR: Turbocharger heat trasfer model is not adapted for more than one turbine" << std::endl;
158 " or more than one compressor in the same turbocharger"
163 fscanf(fich,
"%lf %lf %lf ", &FDShaft, &FJournalBLengh, &FHD);
165 fscanf(fich,
"%lf %lf", &FTthrustBRmin, &FTthrustBRmax);
167 fscanf(fich,
"%lf %lf", &FDoil, &FDwater);
169 fscanf(fich,
"%lf %lf %lf %lf %lf", &FJournalB_K, &Fk_m, &Fk_tb,
172 fscanf(fich,
"%lf %lf", &FCWArea, &FTWArea);
173 double DT = 0., LT = 0.;
174 fscanf(fich,
"%lf %lf", &DT, <);
175 double DC = 0., LC = 0.;
176 fscanf(fich,
"%lf %lf", &DC, &LC);
177 double DH = 0., LH = 0.;
178 fscanf(fich,
"%lf %lf", &DH, &LH);
181 fscanf(fich,
"%lf %lf %lf ", &FMoil, &FToil, &FPoil);
182 double K1 = 0., K2 = 0., K3 = 0.;
184 fscanf(fich,
"%lf %lf %lf ", &K1, &K2, &K3);
191 fscanf(fich,
"%lf %lf ", &FTwater, &FMwater);
196 FMechLosses =
new TurboBearings(FOil, FJournalBLengh, FDShaft / 2,
197 FHD, FJournalB_K, FCAC, FCAT, FCWArea, FTWArea, Fk_m,
198 FTthrustBRmin, FTthrustBRmax, Fk_tb);
200 FHTM->Read_HTM(fich);
202 FHTM->TurbochargerData(FDShaft, FHD, FDoil, FDwater, DT, LT, DC,
207 fgetpos(fich, &filepos);
210 }
catch(exception & N) {
211 std::cout <<
"ERROR: TEjeTurbogrupo::ReadTurbochargerAxis in the boundary condition: " << FNumeroEje << std::endl;
212 std::cout <<
"Tipo de error: " << N.what() << std::endl;
220 void TEjeTurbogrupo::InterpolaValoresMapa() {
223 for(
int i = 0; i < FNumCompresoresAcoplados; ++i) {
225 FCompresor[i]->InterpolaValoresMapa(FRegimenEje);
229 }
catch(exception & N) {
230 std::cout <<
"ERROR: TEjeTurbogrupo::InterpolaValoresMapa in the boundary condition: " << FNumeroEje << std::endl;
231 std::cout <<
"Tipo de error: " << N.what() << std::endl;
239 void TEjeTurbogrupo::CalculaEjesTurbogrupo(
double Theta, nmTipoModelado SimulationType,
double Time,
247 double DeltaTime = Time - FTime;
251 FRegimenEje = FController->
Output(FTime);
255 double p1 = FCompresor[0]->AcousticC()->P1() * 1e5;
256 double p2 = FCompresor[0]->AcousticC()->
P2() * 1e5;
257 double p3 = FTurbina[0]->AcousticT()->P3() * 1e5;
258 double p4 = FTurbina[0]->AcousticT()->P4() * 1e5;
259 FMechPower = FMechLosses->
P_oil(__units::degCToK(FToil),
260 Pi * FRegimenEje / 30, p1, p2, p3, p4, FMoil);
261 MechWork = FMechPower * DeltaTime;
262 if(FSumTrabajoTurbinas > MechWork) {
263 FMechEff = 1 - MechWork / FSumTrabajoTurbinas;
267 double T1 = FCompresor[0]->AcousticC()->T1();
268 double T2 = FCompresor[0]->AcousticC()->
T2();
269 double cr = FCompresor[0]->AcousticC()->CompRatio();
270 double efc = FCompresor[0]->getEfficiency();
272 FHTM->CompressorWorkingPoint(0, FCompresor[0]->getMassflow(),
273 __units::KTodegC(T1), p1, cr, efc);
275 double T3 = FTurbina[0]->AcousticT()->T3();
276 double er = FTurbina[0]->AcousticT()->ExpRatio();
277 double eft = FTurbina[0]->GetEfficiency();
279 FHTM->TurbineWorkingPoint(0, 0, FTurbina[0]->AcousticT()->MassIn(),
280 __units::KTodegC(T3), p3 / 1e5, er, eft);
282 FHTM->TurbochargerWorkingPoint(FRegimenEje, FMechEff, FMoil, FToil,
283 FPoil, FTwater, FMwater);
285 FHTM->SolveNodeTemperaturesTransient(T3, T2, T1, __units::degCToK(FToil),
286 FMoil, FMechPower, __units::degCToK(FTwater), __units::degCToK(FTamb), Time);
287 FHTM->SolveDeltaTempTr();
288 FHTM->SolveHeatFlowMatix();
290 FCompresor[0]->AcousticC()->PutHeatPower(FHTM->Comp_Heat_Flow());
291 FCompresor[0]->AcousticC()->PutHeatPowerIn
292 (FHTM->Comp_Heat_Flow_In());
295 if(FVariacionRegimen == nmVariable) {
296 if((Theta > 2880. && SimulationType != nmEstacionario) || (SimulationType == nmEstacionario && Theta > 50.
297 && FNumCilindros == 0) || (SimulationType == nmEstacionario && Theta > 2880 && FNumCilindros != 0)) {
299 FSumTrabajoCompresores = 0.;
300 FSumTrabajoTurbinas = 0.;
302 for(
int i = 0; i < FNumCompresoresAcoplados; i++) {
303 FCompresor[i]->CalculoPotenciaPaso();
304 FSumTrabajoCompresores += (FCompresor[i]->getPotenciaPaso() * DeltaTime);
307 for(
int i = 0; i < FNumTurbinasAcopladas; i++) {
308 FTurbina[i]->CalculoPotenciaPaso();
309 FSumTrabajoTurbinas += (FTurbina[i]->getPotenciaPaso() * DeltaTime);
312 FDeltaReg = __units::Rad_sToRPM(FSumTrabajoTurbinas - FSumTrabajoCompresores - MechWork) /
313 (FMomentoInercia * FRegimenEje);
314 FRegimenEje += FDeltaReg;
316 if(FRegimenEje < 10000)
323 for(
int i = 0; i < FNumCompresoresAcoplados; ++i) {
324 if(FCompresor[i]->getModeloCompresor() == nmCompPlenums || FCompresor[i]->getModeloCompresor() == nmCompPipes) {
325 FCompresor[i]->InterpolaValoresMapa(FRegimenEje);
326 }
else if(FCompresor[i]->getModeloCompresor() == nmCompOriginal) {
327 if(FVariacionRegimen == nmVariable
328 || (
dynamic_cast<TCompTubDep*
>(FCompresor[i]))->getEntradaCompresor() != nmAtmosphere) {
329 FCompresor[i]->InterpolaValoresMapa(FRegimenEje);
334 for(
int j = 0; j < FNumTurbinasAcopladas; ++j) {
335 FTurbina[j]->PutRegimen(FRegimenEje);
340 if(FResMediosEje.Regimen) {
341 FResMediosEje.RegimenSUM += FRegimenEje * DeltaTime;
343 FResMediosEje.TiempoSUM += DeltaTime;
350 if(CrankAngle - FAngle0 <= 0. && Theta >= 750.) {
353 printf(
"*****************************************************\n");
354 printf(
"***TURBOCHARGER AVERAGE VALUES %3d **CYCLE N. %3d ***\n", FNumeroEje, FNumCiclo);
355 printf(
"*****************************************************\n");
357 for(
int j = 0; j < FNumTurbinasAcopladas; ++j) {
358 FTurbina[j]->ImprimeResultadosMediosPantalla();
360 for(
int j = 0; j < FNumCompresoresAcoplados; ++j) {
361 FCompresor[j]->CalculaMedias();
362 printf(
"COMPRESSOR WORK %d = %6.3lf Julios \n", FNumeroCompresor[j], FCompresor[j]->getTrabCiclo());
363 printf(
"COMPRESSOR EFFICIENCY %d = %6.3lf \n", FNumeroCompresor[j], FCompresor[j]->getRendMed());
364 printf(
"COMPRESSOR MASS FLOW %d = %6.3lf g/s\n", FNumeroCompresor[j], FCompresor[j]->getGastoMed() * 1000);
365 printf(
"COMPRESSOR RATIO %d = %6.3lf \n", FNumeroCompresor[j], FCompresor[j]->getRCMed());
367 printf(
"TURBOCHARGER SPEED = %6.3lf r.p.m.\n", FResMediosEje.RegimenSUM / FResMediosEje.TiempoSUM);
368 printf(
"*****************************************************\n\n");
370 FAngle0 = CrankAngle;
372 }
catch(exception & N) {
373 std::cout <<
"ERROR: TEjeTurbogrupo::CalculaEjesTurbogrupo in the boundary condition: " << FNumeroEje << std::endl;
374 std::cout <<
"Tipo de error: " << N.what() << std::endl;
382 void TEjeTurbogrupo::ReadAverageResultsEje(
const char* FileWAM, fpos_t & filepos) {
384 int nvars = 0, var = 0;
386 FILE *fich = fopen(FileWAM,
"r");
387 fsetpos(fich, &filepos);
389 fscanf(fich,
"%d ", &nvars);
390 for(
int i = 0; i < nvars; i++) {
391 fscanf(fich,
"%d ", &var);
394 FResMediosEje.Regimen =
true;
397 std::cout <<
"Resultados medios en Axis " << FNumeroEje <<
" no implementados " << std::endl;
401 fgetpos(fich, &filepos);
403 }
catch(exception & N) {
404 std::cout <<
"ERROR: TEjeTurbogrupo::ReadAverageResultsEje en el eje " << FNumeroEje << std::endl;
405 std::cout <<
"Tipo de error: " << N.what() << std::endl;
413 void TEjeTurbogrupo::CabeceraResultadosMedEje(stringstream & medoutput) {
418 if(FResMediosEje.Regimen) {
420 medoutput << Label.c_str();
424 }
catch(exception & N) {
425 std::cout <<
"ERROR: TEjeTurbogrupo::CabeceraResultadosMedEje en el eje " << FNumeroEje << std::endl;
426 std::cout <<
"Tipo de error: " << N.what() << std::endl;
434 void TEjeTurbogrupo::ImprimeResultadosMedEje(stringstream & medoutput) {
438 if(FResMediosEje.Regimen)
439 medoutput <<
"\t" << FResMediosEje.RegimenMED;
442 }
catch(exception & N) {
443 std::cout <<
"ERROR: TEjeTurbogrupo::ImprimeResultadosMedEje en el eje " << FNumeroEje << std::endl;
444 std::cout <<
"Tipo de error: " << N.what() << std::endl;
452 void TEjeTurbogrupo::IniciaMedias() {
455 FResMediosEje.RegimenSUM = 0.;
456 FResMediosEje.TiempoSUM = 0.;
457 FResMediosEje.Tiempo0 = 0.;
459 }
catch(exception & N) {
460 std::cout <<
"ERROR: TEjeTurbogrupo::IniciaMedias en el eje: " << FNumeroEje << std::endl;
469 void TEjeTurbogrupo::ResultadosMediosEje() {
472 if(FResMediosEje.Regimen) {
473 FResMediosEje.RegimenMED = FResMediosEje.RegimenSUM / FResMediosEje.TiempoSUM;
474 FResMediosEje.RegimenSUM = 0.;
476 FResMediosEje.TiempoSUM = 0;
478 }
catch(exception & N) {
479 std::cout <<
"ERROR: TEjeTurbogrupo::ResultadosMediosEje en el eje: " << FNumeroEje << std::endl;
488 void TEjeTurbogrupo::AcumulaResultadosMediosEje(
double Actual) {
492 double Delta = Actual - FResMediosEje.Tiempo0;
494 if(FResMediosEje.Regimen) {
495 FResMediosEje.RegimenSUM += FRegimenEje * Delta;
497 FResMediosEje.TiempoSUM += Delta;
498 FResMediosEje.Tiempo0 = Delta;
500 }
catch(exception & N) {
501 std::cout <<
"ERROR: TEjeTurbogrupo::AcumulaResultadosMediosEje en el eje: " << FNumeroEje << std::endl;
510 void TEjeTurbogrupo::ReadInstantaneousResultsEje(
const char* FileWAM, fpos_t & filepos) {
512 int nvars = 0, var = 0;
514 FILE *fich = fopen(FileWAM,
"r");
515 fsetpos(fich, &filepos);
517 FResInstantEje.Regimen =
false;
518 FResInstantEje.MechPower =
false;
519 FResInstantEje.MechEff =
false;
520 FResInstantEje.NodeTemp =
false;
521 FResInstantEje.HeatFlow =
false;
523 fscanf(fich,
"%d ", &nvars);
524 for(
int i = 0; i < nvars; i++) {
525 fscanf(fich,
"%d ", &var);
528 FResInstantEje.Regimen =
true;
531 FResInstantEje.MechPower =
true;
534 FResInstantEje.MechEff =
true;
537 FResInstantEje.NodeTemp =
true;
540 FResInstantEje.HeatFlow =
true;
543 std::cout <<
"Instantaneous results in axis " << FNumeroEje <<
" are not implemented " << std::endl;
547 fgetpos(fich, &filepos);
549 }
catch(exception & N) {
550 std::cout <<
"ERROR: TEjeTurbogrupo::ReadInstantaneousResultsEje en el eje " << FNumeroEje << std::endl;
551 std::cout <<
"Tipo de error: " << N.what() << std::endl;
559 void TEjeTurbogrupo::HeaderInstantaneousResultsEje(stringstream & insoutput) {
565 if(FResInstantEje.Regimen) {
567 insoutput << Label.c_str();
569 if(FResInstantEje.MechPower) {
571 insoutput << Label.c_str();
573 if(FResInstantEje.MechEff) {
575 insoutput << Label.c_str();
578 if(FResInstantEje.NodeTemp) {
579 FHTM->HeaderInsTemperatures(insoutput);
581 if(FResInstantEje.HeatFlow) {
582 FHTM->HeaderInsHeatFlow(insoutput);
587 }
catch(exception & N) {
588 std::cout <<
"ERROR: TEjeTurbogrupo::HeaderInstantaneousResultsEje en el eje " << FNumeroEje << std::endl;
589 std::cout <<
"Tipo de error: " << N.what() << std::endl;
597 void TEjeTurbogrupo::ImprimeResultadosInstantaneosEje(stringstream & insoutput) {
601 if(FResInstantEje.Regimen)
602 insoutput <<
"\t" << FResInstantEje.RegimenINS;
603 if(FResInstantEje.MechPower)
604 insoutput <<
"\t" << FResInstantEje.MechPowerINS;
605 if(FResInstantEje.MechEff)
606 insoutput <<
"\t" << FResInstantEje.MechEffINS;
608 if(FResInstantEje.NodeTemp) {
609 FHTM->PrintInsTemperatures(insoutput);
611 if(FResInstantEje.HeatFlow) {
612 FHTM->PrintInsHeatFlow(insoutput);
617 }
catch(exception & N) {
618 std::cout <<
"ERROR: TEjeTurbogrupo::ImprimeResultadosInstantaneosEje en el eje " << FNumeroEje << std::endl;
619 std::cout <<
"Tipo de error: " << N.what() << std::endl;
627 void TEjeTurbogrupo::ResultadosInstantEje() {
629 if(FResInstantEje.Regimen)
630 FResInstantEje.RegimenINS = FRegimenEje;
631 if(FResInstantEje.MechPower)
632 FResInstantEje.MechPowerINS = FMechPower;
633 if(FResInstantEje.MechEff)
634 FResInstantEje.MechEffINS = FMechEff;
636 }
catch(exception & N) {
637 std::cout <<
"ERROR: TEjeTurbogrupo::ResultadosInstantEje en el eje " << FNumeroEje << std::endl;
638 std::cout <<
"Tipo de error: " << N.what() << std::endl;
646 int TEjeTurbogrupo::GetNumeroCompresor(
int i) {
648 return FNumeroCompresor[i];
655 void TEjeTurbogrupo::AsignaRPMController(
TController * *Controller) {
657 FController = Controller[FControllerID - 1];
660 void TEjeTurbogrupo::InitizlizeHTM(
double Tamb) {
665 double T1 = FCompresor[0]->AcousticC()->T1();
666 double T2 = FCompresor[0]->AcousticC()->
T2();
667 double T3 = FTurbina[0]->AcousticT()->T3();
669 FHTM->AsignTCMechLosses(FMechLosses);
671 FHTM->TurbochargerWorkingPoint(FRegimenEje, 0.9, FMoil, FToil, FPoil,
673 FHTM->CompressorData(FCompresor[0]->GetMap()->getPresionRef(),
674 FCompresor[0]->GetMap()->getTempRef(),
675 FCompresor[0]->GetMap()->getTempMeasure(),
676 FCompresor[0]->AcousticC()->Din());
677 FHTM->TurbineData(1, 300, FTurbina[0]->getMap()->getTempMeasure(),
678 FTurbina[0]->AcousticT()->DIn());
680 FTurbina[0]->AsignTCHTM(FHTM);
681 FTurbina[0]->CalculateAdiabaticMap(FCompresor[0]->GetMap()->getTempMeasure()
684 FCompresor[0]->AsignTCHTM(FHTM);
685 FCompresor[0]->GetMap()->CalculateAdiabaticEfficiency(FHTM,
686 FTurbina[0]->getMap()->getTempMeasure());
689 FHTM->InitializeTemp(T3, T2, T1, FToil, FTwater, Tamb);
697 #pragma package(smart_init)