33 #include "TBloqueMotor.h"
39 TBloqueMotor::TBloqueMotor(
double AmbientPressure,
double AmbientTemperature, nmTipoCalculoEspecies SpeciesModel,
40 int numeroespecies, nmCalculoGamma GammaCalculation,
bool ThereIsEGR) {
44 FPresionAmbiente = AmbientPressure;
46 FCalculoGamma = GammaCalculation;
48 FNumeroEspecies = numeroespecies;
49 FCalculoEspecies = SpeciesModel;
50 FComposicionInicial = NULL;
51 FComposicionAtmosfera = NULL;
56 FPrimeravezAcumulaFuel =
true;
64 FTemperaturaAmbiente = __units::degCToK(AmbientTemperature);
68 FImponerComposicionAE =
false;
70 FRPMControlled =
false;
71 FMfControlled =
false;
72 FInjectionSys.InjectPCtrd =
false;
78 TBloqueMotor::~TBloqueMotor() {
81 if(FGeom.NCilin > 0 && FCilindro != NULL) {
82 for(
int i = 0; i < FGeom.NCilin; i++)
89 if(FComposicionInicial != NULL)
90 delete[] FComposicionInicial;
91 if(FComposicionAtmosfera != NULL)
92 delete[] FComposicionAtmosfera;
99 void TBloqueMotor::LeeMotor(
const char *FileWAM, fpos_t &filepos, nmTipoModelado& SimulationType,
100 int CiclosSinInerciaTermica, nmTipoMotor EngineType,
double *AtmosphericComposition) {
104 int tipodesfa = 0, cil = 0, tipocombustion = 0, TipoPresionAAE = 0;
105 int NumeroLeyesQuemado = 0, CalculoTempPared = 0, nwiebes = 0, ImponerComposicionAE = 0;
107 FTipoMotor = EngineType;
108 FTipoModelado = SimulationType;
109 FILE *fich = fopen(FileWAM,
"r");
110 fsetpos(fich, &filepos);
117 fscanf(fich,
"%d ", &aux);
118 aux == 0 ? FACT = false : FACT =
true;
120 fscanf(fich,
"%lf ", &FMixtureProcessCte);
121 cout << FMixtureProcessCte << endl;
123 std::cout <<
"WARNING: If the combustion is calculated by ACT and the engine" << std::endl;
124 std::cout <<
" has EGR, you must select the option 'To calculate" << std::endl;
125 std::cout <<
" EGR transport, in the other case, the results" << std::endl;
126 std::cout <<
" provided by ACT won't be correct" << std::endl;
134 fscanf(fich,
"%d ", &FGeom.NCilin);
135 FDesfase =
new double[FGeom.NCilin];
137 FCilindro =
new TCilindro*[FGeom.NCilin];
138 if(FTipoMotor == nm2T) {
139 FAngTotalCiclo = 360.;
141 FAngTotalCiclo = 720.;
148 fscanf(fich,
"%lf ", &FRegimen);
149 fscanf(fich,
"%lf ", &FPresionInicialRCA);
150 fscanf(fich,
"%lf ", &FMasaInicial);
151 FComposicionInicial =
new double[FNumeroEspecies - FIntEGR];
152 FComposicionAtmosfera =
new double[FNumeroEspecies - FIntEGR];
153 fscanf(fich,
"%d ", &ImponerComposicionAE);
154 ImponerComposicionAE == 0 ? FImponerComposicionAE = false : FImponerComposicionAE =
true;
155 for(
int i = 0; i < FNumeroEspecies - 1; i++) {
156 fscanf(fich,
"%lf ", &FComposicionInicial[i]);
157 FComposicionAtmosfera[i] = AtmosphericComposition[i];
161 if(FCalculoEspecies == nmCalculoCompleto) {
162 FComposicionAtmosfera[FNumeroEspecies - 1] = 0.;
163 if(FComposicionInicial[0] > 0.2)
164 FComposicionInicial[FNumeroEspecies - 1] = 0.;
166 FComposicionInicial[FNumeroEspecies - 1] = 1.;
168 FComposicionAtmosfera[FNumeroEspecies - 1] = 0.;
169 if(FComposicionInicial[0] > 0.5)
170 FComposicionInicial[FNumeroEspecies - 1] = 1.;
172 FComposicionInicial[FNumeroEspecies - 1] = 0.;
176 fscanf(fich,
"%d ", &TipoPresionAAE);
177 if(TipoPresionAAE == 0) {
178 FCalculoDePAAE = nmPAAECalculada;
180 }
else if(TipoPresionAAE == 1) {
181 FCalculoDePAAE = nmPAAEImpuesta;
182 fscanf(fich,
"%lf ", &FPresionAAE);
185 fscanf(fich,
"%d ", &tipocombustion);
186 if(tipocombustion == 0) {
187 FCombustible = nmMEC;
188 }
else if(tipocombustion == 1) {
189 FCombustible = nmMEP;
191 std::cout <<
"ERROR: Tipo de combustible mal definido " << std::endl;
193 if(FCombustible == nmMEC) {
194 fscanf(fich,
"%lf ", &FMasaFuel);
196 fscanf(fich,
"%lf ", &FDosadoInicial);
199 fscanf(fich,
"%lf ", &FRendimientoCombustion);
200 fscanf(fich,
"%lf ", &FPoderCalorifico);
201 fscanf(fich,
"%lf ", &FDensidadCombustible);
203 fscanf(fich,
"%d ", &FNumTuboRendVol);
208 FNumeroCiclosSinInerciaTermica = CiclosSinInerciaTermica;
209 fscanf(fich,
"%lf ", &FTempInicial.Piston);
210 fscanf(fich,
"%lf ", &FTempInicial.Culata);
211 fscanf(fich,
"%lf ", &FTempInicial.Cylinder);
213 fscanf(fich,
"%lf ", &FGeom.AreaPiston);
214 fscanf(fich,
"%lf ", &FGeom.AreaCulata);
216 fscanf(fich,
"%lf %lf %lf %lf ", &FParedPiston.Espesor, &FParedPiston.Conductividad, &FParedPiston.Density,
217 &FParedPiston.CalorEspecifico);
218 fscanf(fich,
"%lf %lf %lf %lf ", &FParedCulata.Espesor, &FParedCulata.Conductividad, &FParedCulata.Density,
219 &FParedCulata.CalorEspecifico);
220 fscanf(fich,
"%lf %lf %lf %lf ", &FParedCilindro.Espesor, &FParedCilindro.Conductividad, &FParedCilindro.Density,
221 &FParedCilindro.CalorEspecifico);
223 fscanf(fich,
"%lf %lf %lf %lf", &FAjusteTranCalAdm, &FAjusteTranCalEsc, &FParPotMax, &FTempRefrigerante);
225 fscanf(fich,
"%d ", &CalculoTempPared);
226 switch(CalculoTempPared) {
228 FCalculoPared = nmConInercia;
231 FCalculoPared = nmSinInercia;
234 FCalculoPared = nmTempFija;
241 fscanf(fich,
"%lf ", &FWoschni.cw1);
242 fscanf(fich,
"%lf ", &FWoschni.cw2);
243 fscanf(fich,
"%lf ", &FWoschni.xpe);
249 fscanf(fich,
"%lf ", &FGeom.Biela);
250 fscanf(fich,
"%lf ", &FGeom.Carrera);
251 fscanf(fich,
"%lf ", &FGeom.Diametro);
252 fscanf(fich,
"%lf ", &FGeom.RelaCompresion);
253 fscanf(fich,
"%lf ", &FGeom.DiametroBowl);
254 fscanf(fich,
"%lf ", &FGeom.AlturaBowl);
255 fscanf(fich,
"%lf ", &FGeom.DistanciaValvulas);
256 fscanf(fich,
"%lf ", &FGeom.AreaBlowBy);
257 fscanf(fich,
"%lf ", &FGeom.CDBlowBy);
258 fscanf(fich,
"%lf ", &FGeom.Excentricidad);
259 fscanf(fich,
"%lf ", &FGeom.DiametroBulon);
260 fscanf(fich,
"%lf ", &FGeom.AlturaCoronaPiston);
261 fscanf(fich,
"%lf ", &FGeom.MasaBiela);
262 fscanf(fich,
"%lf ", &FGeom.MasaPistonSegmentosBulon);
263 fscanf(fich,
"%lf ", &FGeom.ModuloElasticidad);
264 fscanf(fich,
"%lf ", &FGeom.CoefDeformaciones);
266 FGeom.VCC = __geom::Cylinder_volume(FGeom.Diametro, FGeom.Carrera) / (FGeom.RelaCompresion - 1.);
267 FGeom.CilindradaUnitaria = __geom::Cylinder_volume(FGeom.Diametro, FGeom.Carrera);
268 FGeom.CilindradaTotal = FGeom.CilindradaUnitaria * (double) FGeom.NCilin;
274 fscanf(fich,
"%lf %lf %lf %lf ", &FPerMec.Coef0, &FPerMec.Coef1, &FPerMec.Coef2, &FPerMec.Coef3);
280 if(SimulationType == nmTransitorioRegimen) {
281 double mv = 0., mt = 0., mr = 0.;
282 double Imc = 0., Ict = 0., Itr = 0.;
285 fscanf(fich,
"%lf %lf %lf ", &mv, &mt, &mr);
286 FMasaTotalVehiculo = mv + mt + 4 * mr;
289 fscanf(fich,
"%lf %lf %lf ", &Imc, &Ict, &Itr);
292 fscanf(fich,
"%lf %lf %lf ", &FRelCajaCambios, &FRendCajaCambios, &FRelTrasmision);
295 fscanf(fich,
"%lf ", &FRadioRueda);
298 fscanf(fich,
"%lf ", &FAnguloCarretera);
300 FInerciaTotal =
pow2(FRelCajaCambios * FRelTrasmision) * Imc +
pow2(FRelTrasmision) * Ict + Itr + FMasaTotalVehiculo *
303 FPendiente = FMasaTotalVehiculo * 9.81 * sin(FAnguloCarretera);
305 FCoeficienteInercias = FRendCajaCambios *
pow2(FRelCajaCambios * FRelTrasmision) / (FInerciaTotal + FMasaTotalVehiculo *
309 fscanf(fich,
"%lf %lf %lf ", &FCoefRoadLoad.A0, &FCoefRoadLoad.B0, &FCoefRoadLoad.C0);
310 fscanf(fich,
"%lf %lf %lf %lf ", &FCoefRoadLoad.n, &FCoefRoadLoad.cd, &FCoefRoadLoad.rho, &FCoefRoadLoad.A);
314 fscanf(fich,
"%d ", &FInjectionSys.HoleNumber);
315 fscanf(fich,
"%lf ", &FInjectionSys.HoleDiame);
316 fscanf(fich,
"%lf ", &FInjectionSys.CDHole);
317 fscanf(fich,
"%lf ", &FInjectionSys.InjectPressure);
319 fscanf(fich,
"%lf ", &FInjectionSys.PendOpen_A1);
320 fscanf(fich,
"%lf ", &FInjectionSys.PendOpen_A2);
321 fscanf(fich,
"%lf ", &FInjectionSys.LevMax_B1);
322 fscanf(fich,
"%lf ", &FInjectionSys.LevMax_B2);
323 fscanf(fich,
"%lf ", &FInjectionSys.PendClose_C1);
324 fscanf(fich,
"%lf ", &FInjectionSys.PendClose_C2);
325 fscanf(fich,
"%lf ", &FInjectionSys.Desfase_D1);
326 fscanf(fich,
"%lf ", &FInjectionSys.Desfase_D2);
327 fscanf(fich,
"%d ", &FInjectionSys.NumPulsos);
331 for(
int i = 0; i < FInjectionSys.NumPulsos; ++i) {
332 fscanf(fich,
"%lf ", &aux2.Angulo);
333 fscanf(fich,
"%lf ", &aux2.Masa);
334 fscanf(fich,
"%d ", &aux2.CtrAngID);
335 if(aux2.CtrAngID > 0)
338 aux2.CtrAngd =
false;
339 fscanf(fich,
"%d ", &aux2.CtrMasID);
340 if(aux2.CtrMasID > 0)
343 aux2.CtrMasd =
false;
344 FInjecPulse.push_back(aux2);
358 fscanf(fich,
"%d ", &FNumeroLeyesQuemado);
359 for(
int j = 0; j < FNumeroLeyesQuemado; ++j) {
360 fscanf(fich,
"%lf %lf %lf", &LeyQuemadoSimple.ma, &LeyQuemadoSimple.mf, &LeyQuemadoSimple.n);
361 if(LeyQuemadoSimple.ma > FLQMaMax)
362 FLQMaMax = LeyQuemadoSimple.ma;
363 if(LeyQuemadoSimple.mf > FLQMfMax)
364 FLQMfMax = LeyQuemadoSimple.mf;
365 if(LeyQuemadoSimple.n > FLQRegMax)
366 FLQRegMax = LeyQuemadoSimple.n;
367 fscanf(fich,
"%d ", &FNWiebes);
368 for(
int i = 0; i < FNWiebes; i++) {
369 fscanf(fich,
"%lf %lf %lf %lf %lf ", &WiebeSimple.m, &WiebeSimple.C, &WiebeSimple.Beta, &WiebeSimple.IncAlpha,
370 &WiebeSimple.Alpha0);
371 WiebeSimple.Alpha0 = -WiebeSimple.Alpha0;
372 WiebeSimple.Inicia = WiebeSimple.Alpha0;
373 LeyQuemadoSimple.Wiebes.push_back(WiebeSimple);
375 FLeyQuemadoBD.push_back(LeyQuemadoSimple);
376 LeyQuemadoSimple.Wiebes.clear();
384 fscanf(fich,
"%d ", &FTipoDatosIny);
385 switch(FTipoDatosIny) {
387 FNumeroInyecciones = 0;
390 fscanf(fich,
"%d ", &FNumeroInyecciones);
391 if(FNumeroInyecciones == 0) {
395 FAngIny.resize(FNumeroInyecciones);
396 FTIny.resize(FNumeroInyecciones);
397 FPercentIny.resize(FNumeroInyecciones);
398 for(
int i = 0; i < FNumeroInyecciones; i++) {
399 fscanf(fich,
"%lf %lf %lf ", &FAngIny[i], &FTIny[i],
404 fscanf(fich,
"%lf %lf", &FAngIniIny, &FTStepIny);
405 fscanf(fich,
"%d ", &xnum);
407 for(
int i = 0; i < xnum; i++) {
408 fscanf(fich,
"%lf ", &FY_dat[i]);
411 FX_dat[0] = FAngIniIny;
412 FAStepIny = FTStepIny * FRegimen / 60. * 360. / 1000.;
413 for(
int i = 1; i < xnum; i++) {
414 FX_dat[i] = FX_dat[i - 1] + FAStepIny;
417 for(
int i = 0; i < xnum; i++) {
418 FFuelTasaInt += FY_dat[i] * FTStepIny / 1000.;
420 for(
int i = 0; i < xnum; i++) {
421 FY_dat[i] = FY_dat[i] * FMasaFuel / FFuelTasaInt;
423 fscanf(fich,
"%d ", &TipoInterp);
445 if(FGeom.NCilin > 1) {
446 fscanf(fich,
"%d ", &tipodesfa);
449 FTipoDesfase = nmPersonalizado;
452 FTipoDesfase = nmImpuesto;
455 if(FTipoDesfase == nmPersonalizado) {
456 for(
int i = 0; i < FGeom.NCilin; ++i) {
457 fscanf(fich,
"%lf ", &FDesfase[i]);
458 if(FTipoMotor == nm2T) {
459 FCilindro[i] =
new TCilindro2T(
this, i + 1, FHayEGR);
461 FCilindro[i] =
new TCilindro4T(
this, i + 1, FHayEGR);
465 for(
int i = 0; i < FGeom.NCilin; ++i) {
466 fscanf(fich,
"%d ", &cil);
467 FDesfase[cil - 1] = (double) i * FAngTotalCiclo / (
double) FGeom.NCilin;
468 if(FTipoMotor == nm2T) {
469 FCilindro[cil - 1] =
new TCilindro2T(
this, cil, FHayEGR);
471 FCilindro[cil - 1] =
new TCilindro4T(
this, cil, FHayEGR);
477 if(FTipoMotor == nm2T) {
485 fscanf(fich,
"%d ", &controllers);
486 for(
int i = 0; i < controllers; ++i) {
487 fscanf(fich,
"%d ", ¶m);
490 fscanf(fich,
"%d ", &FRPMControllerID);
491 FRPMControlled =
true;
492 SimulationType = nmTransitorioRegimen;
495 fscanf(fich,
"%d ", &FInjectionSys.InjectPCtrID);
496 FInjectionSys.InjectPCtrd =
true;
501 int MfControllerID = 0;
502 for(
int i = 0; i < FGeom.NCilin; ++i) {
503 fscanf(fich,
"%d ", &controllers);
504 for(
int j = 0; j < controllers; ++j) {
505 fscanf(fich,
"%d ", ¶m);
508 fscanf(fich,
"%d ", &MfControllerID);
509 FCilindro[i]->PutMfControllerID(MfControllerID);
515 fgetpos(fich, &filepos);
517 }
catch(exception & N) {
518 std::cout <<
"ERROR: TBloqueMotor::LeeMotor en el Bloque Engine. " << std::endl;
519 std::cout <<
"Tipo de error: " << N.what() << std::endl;
527 void TBloqueMotor::AsignacionTuboRendVol(
TTubo **Pipe) {
532 FTuboRendVol = Pipe[FNumTuboRendVol - 1];
534 FNodoMedio = floor((FTuboRendVol->getNin()) / 2.);
536 }
catch(exception & N) {
537 std::cout <<
"ERROR: TBloqueMotor::AsignacionTuboRendVol en el Bloque Engine. " << std::endl;
538 std::cout <<
"Tipo de error: " << N.what() << std::endl;
546 void TBloqueMotor::IniciaAnguloCalculo() {
548 if(FTipoMotor == nm4T) {
549 FTheta = FCilindro[0]->getDistribucion().CA;
550 }
else if(FTipoMotor == nm2T) {
553 std::cout <<
"ERROR: Tipo de motor mal definido" << std::endl;
555 }
catch(exception & N) {
556 std::cout <<
"ERROR: TBloqueMotor::IniciaAnguloCalculo en el Bloque Engine. " << std::endl;
557 std::cout <<
"Tipo de error: " << N.what() << std::endl;
565 void TBloqueMotor::ReadAverageResultsBloqueMotor(
const char *FileWAM, fpos_t &filepos) {
567 int nvars = 0, Tipovar = 0;
569 FILE *fich = fopen(FileWAM,
"r");
570 fsetpos(fich, &filepos);
572 FResMediosMotor.ParNeto =
false;
573 FResMediosMotor.ParNetoSUM = 0.;
574 FResMediosMotor.ParNetoMED = 0.;
575 FResMediosMotor.PMN =
false;
576 FResMediosMotor.PMNMED = 0.;
577 FResMediosMotor.ParEfectivo =
false;
578 FResMediosMotor.ParEfectivoSUM = 0.;
579 FResMediosMotor.ParEfectivoMED = 0.;
580 FResMediosMotor.ParEfectivoCiclo =
false;
581 FResMediosMotor.ParEfectivoCicloMED = 0.;
582 FResMediosMotor.PME =
false;
583 FResMediosMotor.PMEMED = 0.;
584 FResMediosMotor.Potencia =
false;
585 FResMediosMotor.PotenciaMED = 0.;
586 FResMediosMotor.PotenciaCiclo =
false;
587 FResMediosMotor.PotenciaCicloMED = 0.;
588 FResMediosMotor.MasaAdmision =
false;
589 FResMediosMotor.MasaAdmisionMED = 0.;
590 FResMediosMotor.MasaAdmisionSUM = 0.;
591 FResMediosMotor.MasaFuel =
false;
592 FResMediosMotor.MasaFuelMED = 0.;
593 FResMediosMotor.MasaFuelSUM = 0.;
594 FResMediosMotor.RegimenGiro =
false;
595 FResMediosMotor.RegimenGiroSUM = 0.;
596 FResMediosMotor.RegimenGiroMED = 0.;
597 FResMediosMotor.RendimientoVolumetrico =
false;
598 FResMediosMotor.RendimientoVolumetricoMED = 0.;
599 FResMediosMotor.RendimientoVolumetricoAtm =
false;
600 FResMediosMotor.RendimientoVolumetricoAtmMED = 0.;
601 FResMediosMotor.ParPerdidasMecanicas =
false;
602 FResMediosMotor.ParPerdidasMecanicasSUM = 0.;
603 FResMediosMotor.ParPerdidasMecanicasMED = 0.;
604 FResMediosMotor.ParResistente =
false;
605 FResMediosMotor.ParResistenteSUM = 0.;
606 FResMediosMotor.ParResistenteMED = 0.;
607 FResMediosMotor.VelocidadVehiculo =
false;
608 FResMediosMotor.VelocidadVehiculoSUM = 0.;
609 FResMediosMotor.VelocidadVehiculoMED = 0.;
610 FResMediosMotor.DensidadReferenciaSUM = 0.;
611 FResMediosMotor.DensidadReferenciaMED = 0.;
612 FResMediosMotor.MasaTuboReferenciaSUM = 0.;
613 FResMediosMotor.MasaTuboReferenciaMED = 0.;
614 FResMediosMotor.GastoTuboReferenciaSUM = 0.;
615 FResMediosMotor.GastoTuboReferenciaMED = 0.;
616 FResMediosMotor.MasaAtrapada =
false;
617 FResMediosMotor.MasaAtrapadaMED = 0.;
618 FResMediosMotor.TrabajoNeto =
false;
619 FResMediosMotor.TrabajoNetoSUM = 0.;
620 FResMediosMotor.TrabajoNetoMED = 0.;
621 FResMediosMotor.TrabajoBombeo =
false;
622 FResMediosMotor.TrabajoBombeoSUM = 0.;
623 FResMediosMotor.TrabajoBombeoMED = 0.;
624 FResMediosMotor.PMNCiclo =
false;
625 FResMediosMotor.PMNCicloMED = 0.;
626 FResMediosMotor.PME =
false;
627 FResMediosMotor.PMECicloMED = 0.;
628 FResMediosMotor.PMBCiclo =
false;
629 FResMediosMotor.PMBCicloMED = 0.;
630 FResMediosMotor.PMICiclo =
false;
631 FResMediosMotor.PMICicloMED = 0.;
632 FResMediosMotor.RendEfectivo =
false;
633 FResMediosMotor.RendEfectivoMED = 0.;
634 FResMediosMotor.RendIndicado =
false;
635 FResMediosMotor.RendIndicadoMED = 0.;
636 FResMediosMotor.ConsumoEspecifico =
false;
637 FResMediosMotor.ConsumoEspecificoMED = 0.;
638 FResMediosMotor.Dosado =
false;
639 FResMediosMotor.DosadoMED = 0.;
640 FResMediosMotor.AFR =
false;
641 FResMediosMotor.AFRMED = 0.;
642 FResMediosMotor.Swirl =
false;
643 FResMediosMotor.SwirlMED = 0.;
645 FResMediosMotor.TiempoSUM = 0.;
646 FResMediosMotor.Tiempo0 = 0.;
648 fscanf(fich,
"%d ", &nvars);
649 for(
int i = 0; i < nvars; i++) {
650 fscanf(fich,
"%d ", &Tipovar);
653 FResMediosMotor.ParNeto =
true;
656 FResMediosMotor.ParEfectivo =
true;
659 FResMediosMotor.ParEfectivoCiclo =
true;
662 FResMediosMotor.ParPerdidasMecanicas =
true;
665 FResMediosMotor.TrabajoNeto =
true;
668 FResMediosMotor.TrabajoBombeo =
true;
671 FResMediosMotor.PMN =
true;
674 FResMediosMotor.PME =
true;
677 FResMediosMotor.PMNCiclo =
true;
680 FResMediosMotor.PMECiclo =
true;
683 FResMediosMotor.PMICiclo =
true;
686 FResMediosMotor.PMBCiclo =
true;
689 FResMediosMotor.Potencia =
true;
692 FResMediosMotor.PotenciaCiclo =
true;
695 FResMediosMotor.MasaAdmision =
true;
698 FResMediosMotor.MasaFuel =
true;
701 FResMediosMotor.MasaAtrapada =
true;
704 FResMediosMotor.RegimenGiro =
true;
707 FResMediosMotor.RendimientoVolumetrico =
true;
710 FResMediosMotor.RendimientoVolumetricoAtm =
true;
713 FResMediosMotor.RendEfectivo =
true;
716 FResMediosMotor.RendIndicado =
true;
719 FResMediosMotor.ConsumoEspecifico =
true;
722 FResMediosMotor.ParResistente =
true;
725 FResMediosMotor.VelocidadVehiculo =
true;
728 FResMediosMotor.Dosado =
true;
731 FResMediosMotor.AFR =
true;
734 FResMediosMotor.Swirl =
true;
737 std::cout <<
"Resultados medios en el motor (" << Tipovar <<
")no definido" << std::endl;
741 fgetpos(fich, &filepos);
744 }
catch(exception & N) {
745 std::cout <<
"ERROR: TBloqueMotor::ReadAverageResults en el Bloque Engine. " << std::endl;
746 std::cout <<
"Tipo de error: " << N.what() << std::endl;
754 void TBloqueMotor::HeaderAverageResultsBloqueMotor(stringstream& medoutput) {
759 if(FResMediosMotor.ParNeto) {
761 medoutput << Label.c_str();
763 if(FResMediosMotor.ParEfectivo) {
765 medoutput << Label.c_str();
767 if(FResMediosMotor.ParEfectivoCiclo) {
769 medoutput << Label.c_str();
771 if(FResMediosMotor.ParPerdidasMecanicas) {
773 medoutput << Label.c_str();
775 if(FResMediosMotor.TrabajoNeto) {
777 medoutput << Label.c_str();
779 if(FResMediosMotor.TrabajoBombeo) {
781 medoutput << Label.c_str();
783 if(FResMediosMotor.PMN) {
785 medoutput << Label.c_str();
787 if(FResMediosMotor.PME) {
789 medoutput << Label.c_str();
791 if(FResMediosMotor.PMNCiclo) {
793 medoutput << Label.c_str();
795 if(FResMediosMotor.PMECiclo) {
797 medoutput << Label.c_str();
799 if(FResMediosMotor.PMICiclo) {
801 medoutput << Label.c_str();
803 if(FResMediosMotor.PMBCiclo) {
805 medoutput << Label.c_str();
807 if(FResMediosMotor.Potencia) {
809 medoutput << Label.c_str();
811 if(FResMediosMotor.PotenciaCiclo) {
813 medoutput << Label.c_str();
815 if(FResMediosMotor.MasaAdmision) {
817 medoutput << Label.c_str();
819 if(FResMediosMotor.MasaFuel) {
821 medoutput << Label.c_str();
823 if(FResMediosMotor.MasaAtrapada) {
825 medoutput << Label.c_str();
827 if(FResMediosMotor.RegimenGiro) {
829 medoutput << Label.c_str();
831 if(FResMediosMotor.RendimientoVolumetrico) {
833 medoutput << Label.c_str();
835 if(FResMediosMotor.RendimientoVolumetricoAtm) {
837 medoutput << Label.c_str();
839 if(FResMediosMotor.RendEfectivo) {
841 medoutput << Label.c_str();
843 if(FResMediosMotor.RendIndicado) {
845 medoutput << Label.c_str();
847 if(FResMediosMotor.ConsumoEspecifico) {
849 medoutput << Label.c_str();
851 if(FResMediosMotor.ParResistente) {
853 medoutput << Label.c_str();
855 if(FResMediosMotor.VelocidadVehiculo) {
857 medoutput << Label.c_str();
859 if(FResMediosMotor.Dosado) {
861 medoutput << Label.c_str();
863 if(FResMediosMotor.AFR) {
865 medoutput << Label.c_str();
867 if(FResMediosMotor.Swirl) {
869 medoutput << Label.c_str();
873 }
catch(exception & N) {
874 std::cout <<
"ERROR: TBloqueMotor::HeaderAverageResults en el Bloque Engine. " << std::endl;
875 std::cout <<
"Tipo de error: " << N.what() << std::endl;
883 void TBloqueMotor::ImprimeResultadosMediosBloqueMotor(stringstream& medoutput) {
887 if(FResMediosMotor.ParNeto)
888 medoutput <<
"\t" << FResMediosMotor.ParNetoMED;
889 if(FResMediosMotor.ParEfectivo)
890 medoutput <<
"\t" << FResMediosMotor.ParEfectivoMED;
891 if(FResMediosMotor.ParEfectivoCiclo)
892 medoutput <<
"\t" << FResMediosMotor.ParEfectivoCicloMED;
893 if(FResMediosMotor.ParPerdidasMecanicas)
894 medoutput <<
"\t" << FResMediosMotor.ParPerdidasMecanicasMED;
895 if(FResMediosMotor.TrabajoNeto)
896 medoutput <<
"\t" << FResMediosMotor.TrabajoNetoMED;
897 if(FResMediosMotor.TrabajoBombeo)
898 medoutput <<
"\t" << FResMediosMotor.TrabajoBombeoMED;
899 if(FResMediosMotor.PMN)
900 medoutput <<
"\t" << FResMediosMotor.PMNMED;
901 if(FResMediosMotor.PME)
902 medoutput <<
"\t" << FResMediosMotor.PMEMED;
903 if(FResMediosMotor.PMNCiclo)
904 medoutput <<
"\t" << FResMediosMotor.PMNCicloMED;
905 if(FResMediosMotor.PMECiclo)
906 medoutput <<
"\t" << FResMediosMotor.PMECicloMED;
907 if(FResMediosMotor.PMICiclo)
908 medoutput <<
"\t" << FResMediosMotor.PMICicloMED;
909 if(FResMediosMotor.PMBCiclo)
910 medoutput <<
"\t" << FResMediosMotor.PMBCicloMED;
911 if(FResMediosMotor.Potencia)
912 medoutput <<
"\t" << FResMediosMotor.PotenciaMED;
913 if(FResMediosMotor.PotenciaCiclo)
914 medoutput <<
"\t" << FResMediosMotor.PotenciaCicloMED;
915 if(FResMediosMotor.MasaAdmision)
916 medoutput <<
"\t" << FResMediosMotor.MasaAdmisionMED;
917 if(FResMediosMotor.MasaFuel)
918 medoutput <<
"\t" << FResMediosMotor.MasaFuelMED;
919 if(FResMediosMotor.MasaAtrapada)
920 medoutput <<
"\t" << FResMediosMotor.MasaAtrapadaMED;
921 if(FResMediosMotor.RegimenGiro)
922 medoutput <<
"\t" << FResMediosMotor.RegimenGiroMED;
923 if(FResMediosMotor.RendimientoVolumetrico)
924 medoutput <<
"\t" << FResMediosMotor.RendimientoVolumetricoMED;
925 if(FResMediosMotor.RendimientoVolumetricoAtm)
926 medoutput <<
"\t" << FResMediosMotor.RendimientoVolumetricoAtmMED;
927 if(FResMediosMotor.RendEfectivo)
928 medoutput <<
"\t" << FResMediosMotor.RendEfectivoMED;
929 if(FResMediosMotor.RendIndicado)
930 medoutput <<
"\t" << FResMediosMotor.RendIndicadoMED;
931 if(FResMediosMotor.ConsumoEspecifico)
932 medoutput <<
"\t" << FResMediosMotor.ConsumoEspecificoMED;
933 if(FResMediosMotor.ParResistente)
934 medoutput <<
"\t" << FResMediosMotor.ParResistenteMED;
935 if(FResMediosMotor.VelocidadVehiculo)
936 medoutput <<
"\t" << FResMediosMotor.VelocidadVehiculoMED;
937 if(FResMediosMotor.Dosado)
938 medoutput <<
"\t" << FResMediosMotor.DosadoMED;
939 if(FResMediosMotor.AFR)
940 medoutput <<
"\t" << FResMediosMotor.AFRMED;
941 if(FResMediosMotor.Swirl)
942 medoutput <<
"\t" << FResMediosMotor.SwirlMED;
945 }
catch(exception & N) {
946 std::cout <<
"ERROR: TBloqueMotor::ImprimeResultadosMediosBloqueMotor " << std::endl;
947 std::cout <<
"Tipo de error: " << N.what() << std::endl;
955 void TBloqueMotor::ResultadosMediosBloqueMotor() {
957 double DensidadAtm = 0.;
958 double MasaAtrapadaSUM = 0.;
959 double FraccionAireFrescoSUM = 0., AFRSUM = 0.;
960 double swirltotal = 0.;
962 if(FResMediosMotor.RegimenGiro || FResMediosMotor.Potencia || FResMediosMotor.RendimientoVolumetricoAtm
963 || FResMediosMotor.RendimientoVolumetrico) {
964 FResMediosMotor.RegimenGiroMED = FResMediosMotor.RegimenGiroSUM / FResMediosMotor.TiempoSUM;
965 FResMediosMotor.RegimenGiroSUM = 0.;
967 if(FResMediosMotor.ParNeto || FResMediosMotor.PMN) {
968 FResMediosMotor.ParNetoMED = FResMediosMotor.ParNetoSUM / FResMediosMotor.TiempoSUM;
969 FResMediosMotor.ParNetoSUM = 0.;
971 if(FResMediosMotor.PMN) {
972 FResMediosMotor.PMNMED = FResMediosMotor.ParNetoMED * 16. / (FGeom.NCilin *
pow2(FGeom.Diametro) * FGeom.Carrera) /
975 if(FResMediosMotor.ParEfectivo || FResMediosMotor.PME || FResMediosMotor.Potencia) {
976 FResMediosMotor.ParEfectivoMED = FResMediosMotor.ParEfectivoSUM / FResMediosMotor.TiempoSUM;
977 FResMediosMotor.ParEfectivoSUM = 0.;
979 if(FResMediosMotor.PME) {
980 FResMediosMotor.PMEMED = FResMediosMotor.ParEfectivoMED * 16. / (FGeom.NCilin *
pow2(
981 FGeom.Diametro) * FGeom.Carrera) / 100000.;
983 if(FResMediosMotor.Potencia) {
984 FResMediosMotor.PotenciaMED = __units::To_kilo(FResMediosMotor.ParEfectivoMED * __cons::Pi_x_2 * __units::RPMToRPS(
985 FResMediosMotor.RegimenGiroMED));
987 if(FResMediosMotor.MasaAdmision) {
988 for(
int i = 0; i < FGeom.NCilin; i++) {
989 FResMediosMotor.MasaAdmisionSUM += FCilindro[i]->getMasaPorAdmision();
991 FResMediosMotor.MasaAdmisionMED = FResMediosMotor.MasaAdmisionSUM / FGeom.NCilin;
992 FResMediosMotor.MasaAdmisionSUM = 0.;
995 FResMediosMotor.MasaFuelMED = FResMediosMotor.MasaFuelSUM / FGeom.NCilin;
996 FResMediosMotor.MasaFuelSUM = 0.;
997 FPrimeravezAcumulaFuel =
true;
999 if(FResMediosMotor.MasaAtrapada || FResMediosMotor.RendimientoVolumetrico || FResMediosMotor.RendimientoVolumetricoAtm
1000 || FResMediosMotor.AFR) {
1001 for(
int i = 0; i < FGeom.NCilin; i++) {
1002 MasaAtrapadaSUM += FCilindro[i]->getMasaAtrapada();
1003 FraccionAireFrescoSUM += FCilindro[i]->getFraccionAireFresco();
1005 FResMediosMotor.MasaAtrapadaMED = MasaAtrapadaSUM / FGeom.NCilin;
1006 FResMediosMotor.FraccionAireFrescoMED = FraccionAireFrescoSUM / FGeom.NCilin;
1008 if(FResMediosMotor.RendimientoVolumetrico || FResMediosMotor.RendimientoVolumetricoAtm) {
1009 FResMediosMotor.GastoTuboReferenciaMED = FResMediosMotor.GastoTuboReferenciaSUM / FResMediosMotor.TiempoSUM;
1010 FResMediosMotor.GastoTuboReferenciaSUM = 0.;
1012 if(FResMediosMotor.RendimientoVolumetrico) {
1013 FResMediosMotor.DensidadReferenciaMED = FResMediosMotor.DensidadReferenciaSUM / FResMediosMotor.TiempoSUM;
1014 FResMediosMotor.RendimientoVolumetricoMED = fabs(FResMediosMotor.GastoTuboReferenciaMED) /
1015 FResMediosMotor.DensidadReferenciaMED / FGeom.CilindradaTotal / (FResMediosMotor.RegimenGiroMED / 60. *
1016 (360. / FAngTotalCiclo));
1017 FResMediosMotor.DensidadReferenciaSUM = 0;
1019 if(FResMediosMotor.ParPerdidasMecanicas) {
1020 FResMediosMotor.ParPerdidasMecanicasMED = FResMediosMotor.ParPerdidasMecanicasSUM / FResMediosMotor.TiempoSUM;
1021 FResMediosMotor.ParPerdidasMecanicasSUM = 0.;
1023 if(FResMediosMotor.ParResistente) {
1024 FResMediosMotor.ParResistenteMED = FResMediosMotor.ParResistenteSUM / FResMediosMotor.TiempoSUM;
1025 FResMediosMotor.ParResistenteSUM = 0.;
1027 if(FResMediosMotor.VelocidadVehiculo) {
1028 FResMediosMotor.VelocidadVehiculoMED = FResMediosMotor.VelocidadVehiculoSUM / FResMediosMotor.TiempoSUM;
1029 FResMediosMotor.VelocidadVehiculoSUM = 0.;
1031 if(FResMediosMotor.RendimientoVolumetricoAtm) {
1032 DensidadAtm = __units::BarToPa(FPresionAmbiente) / (__R::Air * FTemperaturaAmbiente);
1033 FResMediosMotor.RendimientoVolumetricoAtmMED = fabs(FResMediosMotor.GastoTuboReferenciaMED) / DensidadAtm /
1034 FGeom.CilindradaTotal / (FResMediosMotor.RegimenGiroMED / 120.);
1036 if(FResMediosMotor.Dosado) {
1037 FResMediosMotor.MasaTuboReferenciaMED = FResMediosMotor.MasaTuboReferenciaSUM / FResMediosMotor.TiempoSUM;
1038 FResMediosMotor.DosadoMED = FResMediosMotor.MasaFuelMED / fabs(FResMediosMotor.MasaTuboReferenciaMED);
1039 FResMediosMotor.MasaTuboReferenciaSUM = 0.;
1041 if(FResMediosMotor.AFR) {
1042 for(
int i = 0; i < FGeom.NCilin; i++) {
1043 AFRSUM += FCilindro[i]->getAFR();
1045 FResMediosMotor.AFRMED = AFRSUM / FGeom.NCilin;
1049 if(FResMediosMotor.Swirl) {
1050 for(
int i = 0; i < FGeom.NCilin; i++) {
1051 swirltotal += FCilindro[i]->getSwirlSUM() / FResMediosMotor.TiempoSUM;
1054 FResMediosMotor.SwirlMED = swirltotal / FGeom.NCilin;
1057 FResMediosMotor.TrabajoNetoMED = FResMediosMotor.TrabajoNetoSUM;
1058 FResMediosMotor.TrabajoNetoSUM = 0.;
1064 FResMediosMotor.TrabajoBombeoMED = FResMediosMotor.TrabajoBombeoSUM;
1065 FResMediosMotor.TrabajoBombeoSUM = 0.;
1067 FResMediosMotor.PMNCicloMED = __units::PaToBar(FResMediosMotor.TrabajoNetoMED / FGeom.CilindradaTotal);
1069 FResMediosMotor.PMBCicloMED = __units::PaToBar(FResMediosMotor.TrabajoBombeoMED / FGeom.CilindradaTotal);
1071 FResMediosMotor.PMICicloMED = FResMediosMotor.PMNCicloMED - FResMediosMotor.PMBCicloMED;
1073 FPMPMMotor = FPerMec.Coef0 + FPerMec.Coef1 * FResMediosMotor.RegimenGiroMED / 60. - FPerMec.Coef2 *
1074 FResMediosMotor.RegimenGiroMED * FResMediosMotor.RegimenGiroMED / 3600 + FPerMec.Coef3 * FResMediosMotor.PMICicloMED;
1075 FResMediosMotor.PMECicloMED = FResMediosMotor.PMNCicloMED - FPMPMMotor;
1077 FResMediosMotor.ParEfectivoCicloMED = __units::BarToPa(FResMediosMotor.PMECicloMED) * FGeom.CilindradaTotal /
1078 (__units::DegToRad(FAngTotalCiclo));
1080 FResMediosMotor.PotenciaCicloMED = __units::To_kilo(__cons::Pi_x_2 * FResMediosMotor.ParEfectivoCicloMED *
1081 __units::RPMToRPS(FResMediosMotor.RegimenGiroMED));
1083 if(FResMediosMotor.MasaFuelMED == 0) {
1084 FResMediosMotor.RendIndicadoMED = 0.;
1085 FResMediosMotor.RendEfectivoMED = 0.;
1086 FResMediosMotor.ConsumoEspecificoMED = 0.;
1088 FResMediosMotor.RendIndicadoMED = (FResMediosMotor.TrabajoNetoMED - FResMediosMotor.TrabajoBombeoMED) /
1089 (FGeom.NCilin * FResMediosMotor.MasaFuelMED * FPoderCalorifico);
1090 FResMediosMotor.RendEfectivoMED = __units::BarToPa(FResMediosMotor.PMECicloMED) * FGeom.CilindradaTotal /
1091 (FGeom.NCilin * FResMediosMotor.MasaFuelMED * FPoderCalorifico);
1092 FResMediosMotor.ConsumoEspecificoMED = 3.6e9 / (FResMediosMotor.RendEfectivoMED * FPoderCalorifico);
1095 FResMediosMotor.TiempoSUM = 0;
1096 }
catch(exception & N) {
1097 std::cout <<
"ERROR: TBloqueMotor::ResultadosMediosBloqueMotor " << std::endl;
1098 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1106 void TBloqueMotor::AcumulaResultadosMediosBloqueMotor(
double TActual,
int CilindroActual) {
1108 double partotalins = 0.;
1110 double DeltaT = TActual - FResMediosMotor.Tiempo0;
1113 if(FResMediosMotor.ParNeto || FResMediosMotor.PMN || FResMediosMotor.ParEfectivo || FResMediosMotor.PME
1114 || FResMediosMotor.Potencia) {
1115 for(
int i = 0; i < FGeom.NCilin; i++) {
1116 partotalins += FCilindro[i]->getParInstantaneo() * DeltaT;
1118 FResMediosMotor.ParNetoSUM += partotalins;
1121 if(FResMediosMotor.ParEfectivo || FResMediosMotor.PME || FResMediosMotor.Potencia) {
1122 FResMediosMotor.ParEfectivoSUM += partotalins - FParPerdidasMecanicas * DeltaT;
1125 if(FCilindro[0]->getAnguloActual() > FCilindro[0]->getDistribucion().CA
1126 && FCilindro[0]->getAnguloActual() <= FCilindro[0]->getDistribucion().CA + (FCilindro[0]->getAnguloActual() -
1127 FCilindro[0]->getAnguloAnterior())) {
1128 if(FPrimeravezAcumulaFuel) {
1129 for(
int i = 0; i < FGeom.NCilin; i++) {
1130 FResMediosMotor.MasaFuelSUM += FCilindro[i]->getMasaFuel();
1132 FPrimeravezAcumulaFuel =
false;
1136 if(FResMediosMotor.RendimientoVolumetrico || FResMediosMotor.Dosado) {
1137 FResMediosMotor.DensidadReferenciaSUM += FTuboRendVol->
GetDensidad(FNodoMedio) * DeltaT;
1138 FResMediosMotor.GastoTuboReferenciaSUM += (FTuboRendVol->
GetVelocidad(FNodoMedio) * __cons::ARef *
1143 if(FResMediosMotor.RendimientoVolumetrico || FResMediosMotor.Potencia || FResMediosMotor.RendimientoVolumetricoAtm) {
1144 FResMediosMotor.RegimenGiroSUM += FRegimen * DeltaT;
1147 if(FResMediosMotor.ParPerdidasMecanicas) {
1148 FResMediosMotor.ParPerdidasMecanicasSUM += FParPerdidasMecanicas * DeltaT;
1150 if(FResMediosMotor.ParResistente) {
1151 FResMediosMotor.ParResistenteSUM += FParResistente * DeltaT;
1153 if(FResMediosMotor.VelocidadVehiculo) {
1154 FResMediosMotor.VelocidadVehiculoSUM += FVelocidadVehiculo * DeltaT;
1156 if(FResMediosMotor.Dosado) {
1157 FResMediosMotor.MasaTuboReferenciaSUM += (FTuboRendVol->
GetVelocidad(FNodoMedio) * __cons::ARef * FTuboRendVol->
GetArea(
1158 FNodoMedio) * FTuboRendVol->
GetDensidad(FNodoMedio)) / FGeom.NCilin / (FRegimen / 120) * DeltaT;
1167 FResMediosMotor.TrabajoNetoSUM += __units::BarToPa(FCilindro[CilindroActual - 1]->getPreMed()) *
1168 (FCilindro[CilindroActual - 1]->getVolumen() - FCilindro[CilindroActual - 1]->getVolumen0());
1169 if(FCilindro[CilindroActual - 1]->getAnguloActual() > 180. && FCilindro[CilindroActual - 1]->getAnguloActual() < 540.) {
1170 FResMediosMotor.TrabajoBombeoSUM += __units::BarToPa(FCilindro[CilindroActual - 1]->getPreMed()) *
1171 (FCilindro[CilindroActual - 1]->getVolumen() - FCilindro[CilindroActual - 1]->getVolumen0());
1174 FResMediosMotor.TiempoSUM += DeltaT;
1175 FResMediosMotor.Tiempo0 = TActual;
1176 }
catch(exception & N) {
1177 std::cout <<
"ERROR: TBloqueMotor::AcumulaResultadosMediosBloqueMotor " << std::endl;
1178 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1186 void TBloqueMotor::PrestacionesMotor() {
1190 std::cout <<
"INFO:----------------------------------------------" << std::endl;
1191 std::cout <<
"INFO: ENGINE PERFORMANCE" << std::endl;
1192 std::cout <<
"INFO:----------------------------------------------" << std::endl;
1193 if(FResMediosMotor.ParNeto)
1194 std::cout <<
"INFO: Net torque: " << FResMediosMotor.ParNetoMED <<
" (Nm)" << std::endl;
1195 if(FResMediosMotor.ParEfectivo)
1196 std::cout <<
"INFO: Effective torque: " << FResMediosMotor.ParEfectivoMED <<
" (Nm)" << std::endl;
1197 if(FResMediosMotor.ParEfectivoCiclo)
1198 std::cout <<
"INFO: Effective torque cycle: " << FResMediosMotor.ParEfectivoCicloMED <<
" (Nm)" <<
1200 if(FResMediosMotor.ParPerdidasMecanicas)
1201 std::cout <<
"INFO: Torque of mechanical losses: " << FResMediosMotor.ParPerdidasMecanicasMED <<
" (Nm)" <<
1203 if(FResMediosMotor.TrabajoNeto)
1204 std::cout <<
"INFO: Net work: " << FResMediosMotor.TrabajoNetoMED <<
" (J)" << std::endl;
1205 if(FResMediosMotor.TrabajoBombeo)
1206 std::cout <<
"INFO: Pumping work: " << FResMediosMotor.TrabajoBombeoMED <<
" (J)" <<
1208 if(FResMediosMotor.PMN)
1209 std::cout <<
"INFO: NMEP (Mechanism): " << FResMediosMotor.PMNMED <<
" (bar)" << std::endl;
1210 if(FResMediosMotor.PME)
1211 std::cout <<
"INFO: BMEP (Mechanism): " << FResMediosMotor.PMEMED <<
" (bar)" << std::endl;
1212 if(FResMediosMotor.PMNCiclo)
1213 std::cout <<
"INFO: NMEP (Cycle): " << FResMediosMotor.PMNCicloMED <<
" (bar)" << std::endl;
1214 if(FResMediosMotor.PMECiclo)
1215 std::cout <<
"INFO: BMEP (Cycle): " << FResMediosMotor.PMECicloMED <<
" (bar)" << std::endl;
1216 if(FResMediosMotor.PMICiclo)
1217 std::cout <<
"INFO: IMEP (Cycle): " << FResMediosMotor.PMICicloMED <<
" (bar)" << std::endl;
1218 if(FResMediosMotor.PMBCiclo)
1219 std::cout <<
"INFO: PMEP (Cycle): " << FResMediosMotor.PMBCicloMED <<
" (bar)" << std::endl;
1220 if(FResMediosMotor.Potencia)
1221 std::cout <<
"INFO: Effective Power (Mechanism): " << FResMediosMotor.PotenciaMED <<
" (kW)" << std::endl;
1222 if(FResMediosMotor.PotenciaCiclo)
1223 std::cout <<
"INFO: Effective Power (Cycle): " << FResMediosMotor.PotenciaCicloMED <<
" (kW)" <<
1225 if(FResMediosMotor.MasaAdmision)
1226 std::cout <<
"INFO: Intake Mass: " << FResMediosMotor.MasaAdmisionMED <<
" (kg/cc)" <<
1228 if(FResMediosMotor.MasaFuel)
1229 std::cout <<
"INFO: Fuel Mass: " << FResMediosMotor.MasaFuelMED <<
" (kg/cc)" << std::endl;
1230 if(FResMediosMotor.MasaAtrapada)
1231 std::cout <<
"INFO: Trapped Mass: " << FResMediosMotor.MasaAtrapadaMED <<
" (kg/cc)" <<
1233 if(FResMediosMotor.RegimenGiro)
1234 std::cout <<
"INFO: Engine Speed: " << FResMediosMotor.RegimenGiroMED <<
" (rpm)" <<
1236 if(FResMediosMotor.RendimientoVolumetrico)
1237 std::cout <<
"INFO: Volumetric Efficiency (refered pipe n. " << FTuboRendVol->
getNumeroTubo() <<
"): " <<
1238 FResMediosMotor.RendimientoVolumetricoMED <<
" (-)" << std::endl;
1239 if(FResMediosMotor.RendimientoVolumetricoAtm)
1240 std::cout <<
"INFO: Volumetric Efficiency (Ambient Condic): " << FResMediosMotor.RendimientoVolumetricoAtmMED <<
" (-)"
1242 if(FResMediosMotor.RendEfectivo)
1243 std::cout <<
"INFO: Effective Efficiency: " << FResMediosMotor.RendEfectivoMED <<
" (-)" << std::endl;
1244 if(FResMediosMotor.RendIndicado)
1245 std::cout <<
"INFO: Indicated Efficiency: " << FResMediosMotor.RendIndicadoMED <<
" (-)" << std::endl;
1246 if(FResMediosMotor.ConsumoEspecifico)
1247 std::cout <<
"INFO: BSFC: " << FResMediosMotor.ConsumoEspecificoMED <<
" (g/kWh)" <<
1249 if(FResMediosMotor.ParResistente)
1250 std::cout <<
"INFO: Resistant Torque: " << FResMediosMotor.ParResistenteMED <<
" (Nm)" <<
1252 if(FResMediosMotor.VelocidadVehiculo)
1253 std::cout <<
"INFO: Vehicle Speed: " << FResMediosMotor.VelocidadVehiculoMED <<
" (Nm)" <<
1255 if(FResMediosMotor.Dosado)
1256 std::cout <<
"INFO: Fuel-to-air ratio:(refered pipe n. " << FTuboRendVol->
getNumeroTubo() <<
"): " <<
1257 FResMediosMotor.DosadoMED <<
" (-)" << std::endl;
1258 if(FResMediosMotor.AFR)
1259 std::cout <<
"INFO: AFR: " << FResMediosMotor.AFRMED <<
" (-)" << std::endl;
1260 if(FResMediosMotor.Swirl)
1261 std::cout <<
"INFO: Swirl at T.D.C.: " << FResMediosMotor.SwirlMED <<
" (-)" << std::endl;
1262 std::cout <<
"INFO:----------------------------------------------" << std::endl;
1264 }
catch(exception & N) {
1265 std::cout <<
"ERROR: TBloqueMotor::PrestacionesMotor en el Bloque Engine. " << std::endl;
1266 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1274 void TBloqueMotor::ModeloDeVehiculo(
double Time) {
1277 double DeltaT = Time - FTime;
1282 for(
int i = 0; i < FGeom.NCilin; i++) {
1283 ParNeto += FCilindro[i]->getParInstantaneo();
1285 FParPerdidasMecanicas = __units::BarToPa(FPMPMMotor) * FGeom.CilindradaTotal / (__units::DegToRad(FAngTotalCiclo));
1286 FParMotor = ParNeto - FParPerdidasMecanicas;
1289 FMasaFuel = FMfController->
Output(FTime);
1292 if(FRPMControlled) {
1293 FRegimen = FRPMController->
Output(FTime);
1296 if(FTipoModelado == nmTransitorioRegimen) {
1298 W = __units::RPMToRad_s(FRegimen);
1301 FRoadLoad = FCoefRoadLoad.A0 + (FCoefRoadLoad.B0 * W * FRadioRueda) / (FRelCajaCambios * FRelTrasmision) +
1302 FCoefRoadLoad.C0 * pow(W * FRadioRueda / (FRelCajaCambios * FRelTrasmision),
1303 FCoefRoadLoad.n) + (FCoefRoadLoad.cd * FCoefRoadLoad.rho * FCoefRoadLoad.A *
pow2(W * FRadioRueda) / (2 *
pow2(
1304 FRelCajaCambios * FRelTrasmision)));
1307 FParResistente = FRadioRueda * (FRoadLoad + FPendiente) / (FRendCajaCambios * FRelCajaCambios * FRelTrasmision);
1309 FRegimen = __units::Rad_sToRPM(((FParMotor - FParResistente) * FCoeficienteInercias * DeltaT + W));
1311 FVelocidadVehiculo = __units::m_sTokm_h((__units::RPMToRad_s(FRegimen) * FRadioRueda) /
1312 (FRelCajaCambios * FRelTrasmision));
1316 }
catch(exception & N) {
1317 std::cout <<
"ERROR: TBloqueMotor::ModeloDeVehiculo en el Bloque Engine. " << std::endl;
1318 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1326 TCilindro* TBloqueMotor::GetCilindro(
int i) {
1328 return FCilindro[i];
1329 }
catch(exception & N) {
1330 std::cout <<
"ERROR: TBloqueMotor::GetCilindro en el EngineBlock. " << std::endl;
1331 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1339 double TBloqueMotor::GetDesfase(
int i) {
1342 }
catch(exception & N) {
1343 std::cout <<
"ERROR: TBloqueMotor::GetCilindro en el EngineBlock. " << std::endl;
1344 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1366 void TBloqueMotor::PutATCAdm(
double valor) {
1369 FAjusteTranCalAdm = valor;
1371 }
catch(exception & N) {
1372 std::cout <<
"ERROR: TBloqueMotor::PutATCAdm en el EngineBlock. " << std::endl;
1373 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1381 void TBloqueMotor::PutATCEsc(
double valor) {
1384 FAjusteTranCalEsc = valor;
1386 }
catch(exception & N) {
1387 std::cout <<
"ERROR: TBloqueMotor::PutATCEsc en el EngineBlock. " << std::endl;
1388 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1428 void TBloqueMotor::IniciaVarCilindro() {
1431 for(
int i = 0; i < FGeom.NCilin; i++) {
1432 FCilindro[i]->IniciaVariables();
1435 }
catch(exception & N) {
1436 std::cout <<
"ERROR: TBloqueMotor::IniciaVarCilindro en el EngineBlock. " << std::endl;
1437 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1445 double TBloqueMotor::GetComposicionInicial(
int i) {
1448 return FComposicionInicial[i];
1450 }
catch(exception & N) {
1451 std::cout <<
"ERROR: TBloqueMotor::GetComposicionInicial en el EngineBlock. " << std::endl;
1452 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1460 double TBloqueMotor::GetComposicionAtmosfera(
int i) {
1463 return FComposicionAtmosfera[i];
1465 }
catch(exception & N) {
1466 std::cout <<
"ERROR: TBloqueMotor::GetComposicionAtmosfera en el EngineBlock. " << std::endl;
1467 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1475 void TBloqueMotor::AsignRPMController(
TController **Controller) {
1477 FRPMController = Controller[FRPMControllerID - 1];
1480 void TBloqueMotor::AsignMfController(
TController **Controller) {
1481 for(
int i = 0; i < FGeom.NCilin; i++) {
1482 FCilindro[i]->AsignMfController(Controller);
1487 for(
int i = 0; i < FInjectionSys.NumPulsos; ++i) {
1488 if(FInjecPulse[i].CtrAngd)
1489 FInjecPulse[i].CtrAng = Controller[FInjecPulse[i].CtrAngID - 1];
1490 if(FInjecPulse[i].CtrMasd)
1491 FInjecPulse[i].CtrMas = Controller[FInjecPulse[i].CtrMasID - 1];
1493 if(FInjectionSys.InjectPCtrd)
1494 FInjectionSys.InjectPCtr = Controller[FInjectionSys.InjectPCtrID - 1];
1501 void TBloqueMotor::NewInjectionData(
double Time) {
1502 vector<stInjecPulse>::size_type i;
1503 for(i = 0; i < FInjecPulse.size(); i++) {
1504 if(FInjecPulse[i].CtrAngd)
1505 FInjecPulse[i].Angulo = FInjecPulse[i].CtrAng->Output(Time);
1506 if(FInjecPulse[i].CtrMasd)
1507 FInjecPulse[i].Masa = FInjecPulse[i].CtrMas->Output(Time);
1509 if(FInjectionSys.InjectPCtrd)
1510 FInjectionSys.InjectPressure = FInjectionSys.InjectPCtr->
Output(Time);
1513 double TBloqueMotor::TasaInyInterp(
double Angle) {
1515 fOutput = fDatosTasa->interp(Angle);
1520 #pragma package(smart_init)