30 #include "TCalculoExtern.h"
38 #include "TDeposito.h"
39 #include "TCCDeposito.h"
41 #include "TControlFuel.h"
43 #include "TRegimenMotor.h"
45 #include "TEjeTurbogrupo.h"
48 #include "TTipoValvula.h"
49 #include "TBloqueMotor.h"
50 #include "TRemansoMatlab.h"
51 #include "TCoefDescarga.h"
52 #include "TAjusteTransCalorCil.h"
53 #include "TCCUnionEntreDepositos.h"
54 #include "TControlInyeccion.h"
55 #include "TFraccionMasicaCilindro.h"
56 #include "TControlK.h"
60 TCalculoExtern::TCalculoExtern() {
73 FEntrada =
new double[FNumeroInMat];
76 FSalida =
new double[FNumeroOutMat];
84 FRemansoMatlab = NULL;
85 FAjusteTransCalorCil = NULL;
86 FFraccionMasicaCilindro = NULL;
87 FControlInyeccion = NULL;
92 FSensorTurbina = NULL;
102 FNSensTurbogrupo = 0;
109 FConvergencia =
false;
110 FCalculoGamma = nmComposicionTemperatura;
119 TCalculoExtern::~TCalculoExtern() {
123 for(
int i = 0; i < Fcontadortgv; i++) {
141 if(FAjusteTransCalorCil != NULL)
142 delete FAjusteTransCalorCil;
144 if(FFraccionMasicaCilindro != NULL)
145 delete FFraccionMasicaCilindro;
147 if(FControlInyeccion != NULL)
148 delete FControlInyeccion;
162 if(FSensorTubo != NULL)
163 delete[] FSensorTubo;
165 if(FSensorDep != NULL)
168 if(FSensorTG != NULL)
171 if(FSensorTurbina != NULL)
172 delete[] FSensorTurbina;
174 if(FSensorCil != NULL)
177 if(FSensorVent != NULL)
178 delete[] FSensorVent;
180 if(FSensorMotor != NULL)
181 delete[] FSensorMotor;
183 if(FRemansoMatlab != NULL) {
184 for(
int i = 0; i < Fnematlab; i++) {
185 delete FRemansoMatlab[i];
187 delete[] FRemansoMatlab;
190 if(FCoefDescarga != NULL) {
191 for(
int i = 0; i < Fnumunion; i++) {
192 delete FCoefDescarga[i];
194 delete[] FCoefDescarga;
197 if(FRutaTrabajo != NULL)
198 delete[] FRutaTrabajo;
200 if(FParametros != NULL)
201 delete[] FParametros;
207 void TCalculoExtern::LlamadaECU(
double DeltaT,
TBloqueMotor **Engine) {
291 FOutputs[0] = FTiempo * 0.02;
292 FOutputs[1] = FTiempo * 0.02;
298 }
catch(exception &N) {
299 std::cout <<
"ERROR: LlamadaECU" << std::endl;
300 std::cout <<
"Tipo de error: " << N.what() << std::endl;
308 void TCalculoExtern::FinECU() {
314 }
catch(exception &N) {
315 std::cout <<
"ERROR: PutInputdll" << std::endl;
316 std::cout <<
"Tipo de error: " << N.what() << std::endl;
324 double TCalculoExtern::GetOutput_dll(
int i) {
326 if(i < FNOutputsdll) {
329 std::cout <<
"WARNING: El valor de la salida de la dll se sale de rango" << std::endl;
330 std::cout <<
" Revisa el acceso a la dll" << std::endl;
333 }
catch(exception &N) {
334 std::cout <<
"ERROR: GetOutputdll" << std::endl;
335 std::cout <<
"Tipo de error: " << N.what() << std::endl;
346 return FRemansoMatlab[i];
352 }
catch(exception &N) {
353 std::cout <<
"ERROR: GetTRemansoMatlab" << std::endl;
354 std::cout <<
"Tipo de error: " << N.what() << std::endl;
365 return FCoefDescarga[i];
371 }
catch(exception &N) {
372 std::cout <<
"ERROR: GetTCoefDescarga" << std::endl;
373 std::cout <<
"Tipo de error: " << N.what() << std::endl;
390 }
catch(exception &N) {
391 std::cout <<
"ERROR: GetFuel" << std::endl;
392 std::cout <<
"Tipo de error: " << N.what() << std::endl;
400 void TCalculoExtern::LeeFicherosDLL(
const char *FileWAM, fpos_t &filepos,
int controlvalv,
int nematlab,
int ncilin,
401 int nunmat,
int CountVGT,
int numespecies,
int NumeroPerdidasPresion) {
403 FILE *fich = fopen(FileWAM,
"r");
404 fsetpos(fich, &filepos);
406 ObtenerRutaTrabajo(FileWAM);
408 int ecu = 0, iny = 0, mfcomb = 0, comb = 0, baraba = 0, Yespecies = 0, CalculoK = 0;
411 Fcontrolmfcomb =
false;
413 Fajustbaraba =
false;
414 FFraccionMasicaEspeciesCil =
false;
417 Ftmuestreoecu = 0.02;
418 fscanf(fich,
" %d ", &ecu);
419 ecu == 0 ? Fhayecu = false : Fhayecu =
true;
420 fscanf(fich,
"%d %d %d %d %d %d ", &iny, &mfcomb, &comb, &baraba, &Yespecies, &CalculoK);
421 iny == 0 ? Fcontroliny = false : Fcontroliny =
true;
422 mfcomb == 0 ? Fcontrolmfcomb = false : Fcontrolmfcomb =
true;
423 comb == 0 ? Fmodcomb = false : Fmodcomb =
true;
424 baraba == 0 ? Fajustbaraba = false : Fajustbaraba =
true;
425 Yespecies == 0 ? FFraccionMasicaEspeciesCil = false : FFraccionMasicaEspeciesCil =
true;
426 fscanf(fich,
"%d ", &Fngrafmat);
432 std::cout <<
"WARNING: Matlab link must be adapted with your Matlab version" << std::endl;
434 if(controlvalv == 1) {
447 Fntact += 18 * ncilin;
455 Fntact += 3 * ncilin;
456 Ffql =
new Tfql(ncilin);
458 if(FFraccionMasicaEspeciesCil) {
459 Fntact += numespecies * ncilin;
462 Fntact += nematlab * 2;
463 Fntact += CountVGT * 6;
464 Fcontadortgv = CountVGT;
466 FTGV =
new TTGV*[CountVGT];
467 for(
int i = 0; i < CountVGT; i++) {
468 FTGV[i] =
new TTGV();
475 FNumPerdidasPresion = 0;
477 FNumPerdidasPresion = NumeroPerdidasPresion;
478 FControlK =
new TControlK*[FNumPerdidasPresion];
479 for(
int i = 0; i < FNumPerdidasPresion; i++) {
482 Fntact += FNumPerdidasPresion;
485 Fnematlab = nematlab;
488 for(
int i = 0; i < Fnematlab; i++) {
495 FNOutputsdll = Fntact;
496 FOutputs =
new double[FNOutputsdll];
497 for(
int i = 0; i < FNOutputsdll; i++) {
501 fgetpos(fich, &filepos);
503 }
catch(exception &N) {
504 std::cout <<
"ERROR: LeeFicherosDLL" << std::endl;
505 std::cout <<
"Tipo de error: " << N.what() << std::endl;
513 void TCalculoExtern::Lee_Sens_Tubos(
const char *FileWAM, fpos_t &filepos,
TTubo **Pipe,
514 nmTipoCalculoEspecies SpeciesModel,
bool ThereIsEGR,
bool HayCombustible) {
516 FILE *fich = fopen(FileWAM,
"r");
517 fsetpos(fich, &filepos);
519 double T = 0., temp = 0., v1 = 0., den = 0.;
521 int tipo = 0, tubo = 0, nsensortubo = 0, ndistancias = 0;
524 fscanf(fich,
"%d ", &FNSensTubos);
525 fscanf(fich,
"%d ", &ndistancias);
528 if(FNSensTubos != 0) {
529 for(
int i = 0; i <= ndistancias - 1; ++i) {
530 fscanf(fich,
"%d %lf %d ", &tubo, &dist, &nsensortubo);
531 for(
int j = 0; j <= nsensortubo - 1; ++j) {
532 FSensorTubo[cont].tubo = tubo;
533 FSensorTubo[cont].distancia = dist;
534 fscanf(fich,
"%d ", &tipo);
537 FSensorTubo[cont].tipo = nmPrTubo;
540 FSensorTubo[cont].tipo = nmVelTubo;
543 FSensorTubo[cont].tipo = nmTempTubo;
546 FSensorTubo[cont].tipo = nmGastoTubo;
549 FSensorTubo[cont].tipo = nmN2Tubo;
552 FSensorTubo[cont].tipo = nmO2Tubo;
555 FSensorTubo[cont].tipo = nmCO2Tubo;
558 FSensorTubo[cont].tipo = nmH2OTubo;
561 FSensorTubo[cont].tipo = nmHCTubo;
564 FSensorTubo[cont].tipo = nmSootTubo;
567 FSensorTubo[cont].tipo = nmNOxTubo;
570 FSensorTubo[cont].tipo = nmCOTubo;
573 FSensorTubo[cont].tipo = nmAireFrTubo;
576 FSensorTubo[cont].tipo = nmGasQuemadoTubo;
579 FSensorTubo[cont].tipo = nmEGRTubo;
582 FSensorTubo[cont].tipo = nmCombustibleTubo;
585 printf(
"Error en el tipo de sensor\n");
588 fscanf(fich,
"%lf ", &FSensorTubo[cont].ganancia);
589 fscanf(fich,
"%lf ", &FSensorTubo[cont].ctetiempo);
591 FSensorTubo[cont].nodos = Pipe[FSensorTubo[cont].tubo - 1]->getNin();
592 FSensorTubo[cont].deltax = Pipe[FSensorTubo[cont].tubo - 1]->getXRef();
594 t = FSensorTubo[cont].tubo - 1;
596 switch(FSensorTubo[cont].tipo) {
599 FSensorTubo[cont].valreal = __units::KTodegC(temp * temp / Pipe[t]->GetGamma(0) / Pipe[t]->GetRMezcla(
601 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
602 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
603 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
607 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
608 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
609 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
613 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
614 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
615 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
619 T = __units::KTodegC(temp * temp / Pipe[t]->GetGamma(0) / Pipe[t]->GetRMezcla(0));
620 den = __units::BarToPa(Pipe[t]->getPresionInicial()) / Pipe[t]->
GetRMezcla(0) / __units::degCToK(T);
622 FSensorTubo[cont].valreal = __geom::Circle_area(Pipe[t]->GetDiametro(n1)) * v1 * den;
623 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
624 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
625 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
628 if(SpeciesModel == nmCalculoCompleto) {
634 printf(
"No puede haber sensor de N2 si el calculo de especies no es completo. Revisa la lectura.\n");
638 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
639 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
640 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
643 if(SpeciesModel == nmCalculoCompleto) {
646 printf(
"No puede haber sensor de O2 si el calculo de especies no es completo. Revisa la lectura.\n");
650 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
651 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
652 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
655 if(SpeciesModel == nmCalculoCompleto) {
658 printf(
"No puede haber sensor de CO2 si el calculo de especies no es completo. Revisa la lectura.\n");
662 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
663 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
664 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
667 if(SpeciesModel == nmCalculoCompleto) {
670 printf(
"No puede haber sensor de H2O si el calculo de especies no es completo. Revisa la lectura.\n");
674 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
675 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
676 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
679 if(SpeciesModel == nmCalculoCompleto) {
682 printf(
"No puede haber sensor de HC si el calculo de especies no es completo. Revisa la lectura.\n");
686 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
687 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
688 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
691 if(SpeciesModel == nmCalculoCompleto) {
694 printf(
"No puede haber sensor de Soot si el calculo de especies no es completo. Revisa la lectura.\n");
698 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
699 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
700 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
703 if(SpeciesModel == nmCalculoCompleto) {
706 printf(
"No puede haber sensor de NOx si el calculo de especies no es completo. Revisa la lectura.\n");
710 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
711 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
712 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
715 if(SpeciesModel == nmCalculoCompleto) {
718 printf(
"No puede haber sensor de CO si el calculo de especies no es completo. Revisa la lectura.\n");
722 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
723 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
724 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
727 if(SpeciesModel == nmCalculoSimple) {
729 FIndiceTuboAireFresco = 2;
731 FIndiceTuboAireFresco = 1;
733 printf(
"No puede haber sensor de Aire Fresco si el calculo de especies no es simple. Revisa la lectura.\n");
736 FSensorTubo[cont].valreal = Pipe[t]->
GetFraccionMasica(0, FIndiceTuboAireFresco);
737 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
738 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
739 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
741 case nmGasQuemadoTubo:
742 if(SpeciesModel == nmCalculoSimple) {
743 FIndiceTuboGasQuemado = 0;
745 printf(
"No puede haber sensor de Gas Quemado si el calculo de especies no es simple. Revisa la lectura.\n");
748 FSensorTubo[cont].valreal = Pipe[t]->
GetFraccionMasica(0, FIndiceTuboGasQuemado);
749 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
750 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
751 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
754 if(SpeciesModel == nmCalculoCompleto) {
759 printf(
"No puede haber sensor de EGR si no se transporta EGR. Revisa la lectura.\n");
766 printf(
"No puede haber sensor de EGR si no se transporta EGR. Revisa la lectura.\n");
775 printf(
"No puede haber sensor de EGR si no se transporta EGR. Revisa la lectura.\n");
782 printf(
"No puede haber sensor de EGR si no se transporta EGR. Revisa la lectura.\n");
788 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
789 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
790 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
792 case nmCombustibleTubo:
793 if(SpeciesModel == nmCalculoCompleto) {
797 printf(
"No puede haber sensor de Combustible si no se transporta. Revisa la lectura.\n");
804 printf(
"No puede haber sensor de Combustible si no se transporta. Revisa la lectura.\n");
809 FSensorTubo[cont].valact = FSensorTubo[cont].valreal;
810 FSensorTubo[cont].valant = FSensorTubo[cont].valreal;
811 FSensorTubo[cont].valrealant = FSensorTubo[cont].valreal;
821 fgetpos(fich, &filepos);
823 }
catch(exception &N) {
824 std::cout <<
"ERROR: Lee_Sens_Tubos" << std::endl;
825 std::cout <<
"Tipo de error: " << N.what() << std::endl;
833 void TCalculoExtern::Lee_Sens_Dep(
const char *FileWAM, fpos_t &filepos,
TDeposito **Plenum,
834 nmTipoCalculoEspecies SpeciesModel,
bool ThereIsEGR,
bool HayCombustible) {
836 FILE *fich = fopen(FileWAM,
"r");
837 fsetpos(fich, &filepos);
839 int tipo = 0, ndep = 0, deposito = 0, nsensdeposito = 0;
841 fscanf(fich,
"%d ", &FNSensDepositos);
842 fscanf(fich,
"%d ", &ndep);
845 if(FNSensDepositos != 0) {
846 for(
int i = 0; i <= ndep - 1; ++i) {
847 fscanf(fich,
"%d %d ", &deposito, &nsensdeposito);
848 for(
int j = 0; j <= nsensdeposito - 1; ++j) {
849 FSensorDep[cont].deposito = deposito;
850 fscanf(fich,
"%d ", &tipo);
853 FSensorDep[cont].tipo = nmPrDep;
856 FSensorDep[cont].tipo = nmTempDep;
859 FSensorDep[cont].tipo = nmN2Dep;
862 FSensorDep[cont].tipo = nmO2Dep;
865 FSensorDep[cont].tipo = nmCO2Dep;
868 FSensorDep[cont].tipo = nmH2ODep;
871 FSensorDep[cont].tipo = nmHCDep;
874 FSensorDep[cont].tipo = nmSootDep;
877 FSensorDep[cont].tipo = nmNOxDep;
880 FSensorDep[cont].tipo = nmCODep;
883 FSensorDep[cont].tipo = nmAireFrDep;
886 FSensorDep[cont].tipo = nmGasQuemadoDep;
889 FSensorDep[cont].tipo = nmEGRDep;
892 FSensorDep[cont].tipo = nmCombustibleDep;
895 printf(
"Error en el tipo de sensor\n");
898 fscanf(fich,
"%lf ", &FSensorDep[cont].ganancia);
899 fscanf(fich,
"%lf ", &FSensorDep[cont].ctetiempo);
901 switch(FSensorDep[cont].tipo) {
903 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->getPressure();
904 FSensorDep[cont].valact = FSensorDep[cont].valreal;
905 FSensorDep[cont].valant = FSensorDep[cont].valreal;
906 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
909 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->getTemperature();
910 FSensorDep[cont].valact = FSensorDep[cont].valreal;
911 FSensorDep[cont].valant = FSensorDep[cont].valreal;
912 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
915 if(SpeciesModel == nmCalculoCompleto) {
921 printf(
"No puede haber sensor de N2 si el calculo de especies no es completo. Revisa la lectura.\n");
924 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepN2);
925 FSensorDep[cont].valact = FSensorDep[cont].valreal;
926 FSensorDep[cont].valant = FSensorDep[cont].valreal;
927 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
930 if(SpeciesModel == nmCalculoCompleto) {
933 printf(
"No puede haber sensor de O2 si el calculo de especies no es completo. Revisa la lectura.\n");
936 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepO2);
937 FSensorDep[cont].valact = FSensorDep[cont].valreal;
938 FSensorDep[cont].valant = FSensorDep[cont].valreal;
939 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
942 if(SpeciesModel == nmCalculoCompleto) {
945 printf(
"No puede haber sensor de CO2 si el calculo de especies no es completo. Revisa la lectura.\n");
948 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepCO2);
949 FSensorDep[cont].valact = FSensorDep[cont].valreal;
950 FSensorDep[cont].valant = FSensorDep[cont].valreal;
951 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
954 if(SpeciesModel == nmCalculoCompleto) {
957 printf(
"No puede haber sensor de H2O si el calculo de especies no es completo. Revisa la lectura.\n");
960 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepH2O);
961 FSensorDep[cont].valact = FSensorDep[cont].valreal;
962 FSensorDep[cont].valant = FSensorDep[cont].valreal;
963 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
966 if(SpeciesModel == nmCalculoCompleto) {
969 printf(
"No puede haber sensor de HC si el calculo de especies no es completo. Revisa la lectura.\n");
972 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepHC);
973 FSensorDep[cont].valact = FSensorDep[cont].valreal;
974 FSensorDep[cont].valant = FSensorDep[cont].valreal;
975 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
978 if(SpeciesModel == nmCalculoCompleto) {
981 printf(
"No puede haber sensor de Soot si el calculo de especies no es completo. Revisa la lectura.\n");
984 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepSoot);
985 FSensorDep[cont].valact = FSensorDep[cont].valreal;
986 FSensorDep[cont].valant = FSensorDep[cont].valreal;
987 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
990 if(SpeciesModel == nmCalculoCompleto) {
993 printf(
"No puede haber sensor de NOx si el calculo de especies no es completo. Revisa la lectura.\n");
996 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepNOx);
997 FSensorDep[cont].valact = FSensorDep[cont].valreal;
998 FSensorDep[cont].valant = FSensorDep[cont].valreal;
999 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
1002 if(SpeciesModel == nmCalculoCompleto) {
1005 printf(
"No puede haber sensor de CO si el calculo de especies no es completo. Revisa la lectura.\n");
1008 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepCO);
1009 FSensorDep[cont].valact = FSensorDep[cont].valreal;
1010 FSensorDep[cont].valant = FSensorDep[cont].valreal;
1011 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
1014 if(SpeciesModel == nmCalculoSimple) {
1015 if(HayCombustible) {
1016 FIndiceDepAireFresco = 2;
1018 FIndiceDepAireFresco = 1;
1020 printf(
"No puede haber sensor de Aire Fresco si el calculo de especies no es simple. Revisa la lectura.\n");
1023 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepAireFresco);
1024 FSensorDep[cont].valact = FSensorDep[cont].valreal;
1025 FSensorDep[cont].valant = FSensorDep[cont].valreal;
1026 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
1028 case nmGasQuemadoDep:
1029 if(SpeciesModel == nmCalculoSimple) {
1030 FIndiceDepGasQuemado = 0;
1032 printf(
"No puede haber sensor de Gas Quemado si el calculo de especies no es simple. Revisa la lectura.\n");
1035 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepGasQuemado);
1036 FSensorDep[cont].valact = FSensorDep[cont].valreal;
1037 FSensorDep[cont].valant = FSensorDep[cont].valreal;
1038 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
1041 if(SpeciesModel == nmCalculoCompleto) {
1042 if(HayCombustible) {
1046 printf(
"No puede haber sensor de EGR si no se transporta EGR. Revisa la lectura.\n");
1053 printf(
"No puede haber sensor de EGR si no se transporta EGR. Revisa la lectura.\n");
1058 if(HayCombustible) {
1062 printf(
"No puede haber sensor de EGR si no se transporta EGR. Revisa la lectura.\n");
1069 printf(
"No puede haber sensor de EGR si no se transporta EGR. Revisa la lectura.\n");
1074 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepEGR);
1075 FSensorDep[cont].valact = FSensorDep[cont].valreal;
1076 FSensorDep[cont].valant = FSensorDep[cont].valreal;
1077 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
1079 case nmCombustibleDep:
1080 if(SpeciesModel == nmCalculoCompleto) {
1081 if(HayCombustible) {
1084 printf(
"No puede haber sensor de Combustible si no se transporta. Revisa la lectura.\n");
1088 if(HayCombustible) {
1091 printf(
"No puede haber sensor de Combustible si no se transporta. Revisa la lectura.\n");
1095 FSensorDep[cont].valreal = Plenum[FSensorDep[cont].deposito - 1]->GetFraccionMasicaEspecie(FIndiceDepComb);
1096 FSensorDep[cont].valact = FSensorDep[cont].valreal;
1097 FSensorDep[cont].valant = FSensorDep[cont].valreal;
1098 FSensorDep[cont].valrealant = FSensorDep[cont].valreal;
1106 fgetpos(fich, &filepos);
1108 }
catch(exception &N) {
1109 std::cout <<
"ERROR: Lee_Sens_Dep" << std::endl;
1110 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1118 void TCalculoExtern::Lee_Sens_TG(
const char *FileWAM, fpos_t &filepos,
TEjeTurbogrupo **Axis) {
1120 FILE *fich = fopen(FileWAM,
"r");
1121 fsetpos(fich, &filepos);
1123 int tipo = 0, ntg = 0, turbogrupo = 0, nsensturbogrupo = 0;
1125 fscanf(fich,
"%d ", &FNSensTurbogrupo);
1126 fscanf(fich,
"%d ", &ntg);
1128 FSensorTG =
new stSensorTG[FNSensTurbogrupo];
1129 if(FNSensTurbogrupo != 0) {
1130 for(
int i = 0; i <= ntg - 1; ++i) {
1131 fscanf(fich,
"%d %d ", &turbogrupo, &nsensturbogrupo);
1132 for(
int j = 0; j <= nsensturbogrupo - 1; ++j) {
1133 FSensorTG[cont].turbogrupo = turbogrupo;
1134 fscanf(fich,
"%d ", &tipo);
1137 FSensorTG[cont].tipo = nmRTCTG;
1140 printf(
"Error en el tipo de sensor\n");
1143 fscanf(fich,
"%lf ", &FSensorTG[cont].ganancia);
1144 fscanf(fich,
"%lf ", &FSensorTG[cont].ctetiempo);
1146 switch(FSensorTG[cont].tipo) {
1148 FSensorTG[cont].valreal = Axis[FSensorTG[cont].turbogrupo - 1]->getRegimen();
1149 FSensorTG[cont].valact = FSensorTG[cont].valreal;
1150 FSensorTG[cont].valant = FSensorTG[cont].valreal;
1151 FSensorTG[cont].valrealant = FSensorTG[cont].valreal;
1159 fgetpos(fich, &filepos);
1161 }
catch(exception &N) {
1162 std::cout <<
"ERROR: Lee_Sens_TG" << std::endl;
1163 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1171 void TCalculoExtern::Lee_Sens_Turbina(
const char *FileWAM, fpos_t &filepos,
TTurbina **Turbine) {
1173 FILE *fich = fopen(FileWAM,
"r");
1174 fsetpos(fich, &filepos);
1176 int tipo = 0, nturbinas = 0, turbina = 0, nsensturbina = 0;
1178 fscanf(fich,
"%d ", &FNSensTurbina);
1179 fscanf(fich,
"%d ", &nturbinas);
1182 if(FNSensTurbina != 0) {
1183 for(
int i = 0; i <= nturbinas - 1; ++i) {
1184 fscanf(fich,
"%d %d ", &turbina, &nsensturbina);
1185 for(
int j = 0; j <= nsensturbina - 1; ++j) {
1186 FSensorTurbina[cont].turbina = turbina;
1187 fscanf(fich,
"%d ", &tipo);
1190 FSensorTurbina[cont].tipo = nmRelaci1;
1193 FSensorTurbina[cont].tipo = nmRelaci2;
1196 printf(
"Error en el tipo de sensor\n");
1199 fscanf(fich,
"%lf ", &FSensorTurbina[cont].ganancia);
1200 fscanf(fich,
"%lf ", &FSensorTurbina[cont].ctetiempo);
1202 switch(FSensorTurbina[cont].tipo) {
1204 FSensorTurbina[cont].valreal = Turbine[FSensorTurbina[cont].turbina - 1]->GetRelacionCinematica(0);
1205 FSensorTurbina[cont].valact = FSensorTurbina[cont].valreal;
1206 FSensorTurbina[cont].valant = FSensorTurbina[cont].valreal;
1207 FSensorTurbina[cont].valrealant = FSensorTurbina[cont].valreal;
1210 FSensorTurbina[cont].valreal = Turbine[FSensorTurbina[cont].turbina - 1]->GetRelacionCinematica(1);
1211 FSensorTurbina[cont].valact = FSensorTurbina[cont].valreal;
1212 FSensorTurbina[cont].valant = FSensorTurbina[cont].valreal;
1213 FSensorTurbina[cont].valrealant = FSensorTurbina[cont].valreal;
1221 fgetpos(fich, &filepos);
1223 }
catch(exception &N) {
1224 std::cout <<
"ERROR: TCalculoExtern::Lee_Sens_Turbina" << std::endl;
1225 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1233 void TCalculoExtern::Lee_Sens_Cil(
const char *FileWAM, fpos_t &filepos,
TBloqueMotor **Engine) {
1235 FILE *fich = fopen(FileWAM,
"r");
1236 fsetpos(fich, &filepos);
1238 int tipo = 0, ncil = 0, cilindro = 0, nsenscilindro = 0;
1240 fscanf(fich,
"%d ", &FNSensCilindros);
1241 fscanf(fich,
"%d ", &ncil);
1244 if(FNSensCilindros != 0) {
1245 for(
int i = 0; i <= ncil - 1; ++i) {
1246 fscanf(fich,
"%d %d ", &cilindro, &nsenscilindro);
1247 for(
int j = 0; j <= nsenscilindro - 1; ++j) {
1248 FSensorCil[cont].cilindro = cilindro;
1249 fscanf(fich,
"%d ", &tipo);
1252 FSensorCil[cont].tipo = nmPrCil;
1255 FSensorCil[cont].tipo = nmTempCil;
1258 FSensorCil[cont].tipo = nmMfCil;
1261 FSensorCil[cont].tipo = nmAFRCil;
1264 printf(
"Error en el tipo de sensor\n");
1267 fscanf(fich,
"%lf ", &FSensorCil[cont].ganancia);
1268 fscanf(fich,
"%lf ", &FSensorCil[cont].ctetiempo);
1270 switch(FSensorCil[cont].tipo) {
1272 FSensorCil[cont].valreal = Engine[0]->GetCilindro(FSensorCil[cont].cilindro - 1)->getTemperature();
1273 FSensorCil[cont].valact = FSensorCil[cont].valreal;
1274 FSensorCil[cont].valant = FSensorCil[cont].valreal;
1275 FSensorCil[cont].valrealant = FSensorCil[cont].valreal;
1278 FSensorCil[cont].valreal = Engine[0]->GetCilindro(FSensorCil[cont].cilindro - 1)->getPressure();
1279 FSensorCil[cont].valact = FSensorCil[cont].valreal;
1280 FSensorCil[cont].valant = FSensorCil[cont].valreal;
1281 FSensorCil[cont].valrealant = FSensorCil[cont].valreal;
1284 FSensorCil[cont].valreal = Engine[0]->GetCilindro(FSensorCil[cont].cilindro - 1)->getMasaFuel();
1285 FSensorCil[cont].valact = FSensorCil[cont].valreal;
1286 FSensorCil[cont].valant = FSensorCil[cont].valreal;
1287 FSensorCil[cont].valrealant = FSensorCil[cont].valreal;
1290 FSensorCil[cont].valreal = 15;
1291 FSensorCil[cont].valact = FSensorCil[cont].valreal;
1292 FSensorCil[cont].valant = FSensorCil[cont].valreal;
1293 FSensorCil[cont].valrealant = FSensorCil[cont].valreal;
1302 fgetpos(fich, &filepos);
1304 }
catch(exception &N) {
1305 std::cout <<
"ERROR: Lee_Sens_Cil" << std::endl;
1306 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1314 void TCalculoExtern::Lee_Sens_Vent(
const char *FileWAM, fpos_t &filepos,
TVenturi **Venturi) {
1316 FILE *fich = fopen(FileWAM,
"r");
1317 fsetpos(fich, &filepos);
1320 double prent = 0., prgar = 0., velent = 0., vellat = 0., gasent = 0., gaslat = 0.;
1321 int tipo = 0, nventuris = 0, venturi = 0, nsensventuri = 0, v = 0;
1323 fscanf(fich,
"%d ", &FNSensVenturis);
1324 fscanf(fich,
"%d ", &nventuris);
1327 if(FNSensVenturis != 0) {
1328 for(
int i = 0; i <= nventuris - 1; ++i) {
1329 fscanf(fich,
"%d %d ", &venturi, &nsensventuri);
1330 for(
int j = 0; j <= nsensventuri - 1; ++j) {
1331 FSensorVent[cont].venturi = venturi;
1332 fscanf(fich,
"%d ", &tipo);
1335 FSensorVent[cont].tipo = nmPrEntVent;
1338 FSensorVent[cont].tipo = nmPrGarVent;
1341 FSensorVent[cont].tipo = nmVelEntVent;
1344 FSensorVent[cont].tipo = nmVelLatVent;
1347 FSensorVent[cont].tipo = nmGastoEntVent;
1350 FSensorVent[cont].tipo = nmGastoLatVent;
1353 printf(
"Error en el tipo de sensor\n");
1356 fscanf(fich,
"%lf ", &FSensorVent[cont].ganancia);
1357 fscanf(fich,
"%lf ", &FSensorVent[cont].ctetiempo);
1359 v = FSensorVent[cont].venturi - 1;
1360 switch(FSensorVent[FNSensVenturis].tipo) {
1362 prent = Venturi[v]->getPressure();
1363 FSensorVent[cont].valreal = prent;
1364 FSensorVent[cont].valact = FSensorVent[cont].valreal;
1365 FSensorVent[cont].valant = FSensorVent[cont].valreal;
1366 FSensorVent[cont].valrealant = FSensorVent[cont].valreal;
1369 prent = Venturi[v]->getPressure();
1370 prgar = prent / pow(1 + Venturi[v]->getgamma3() * pow(
dynamic_cast<TCCDeposito *
>
1371 (Venturi[v]->getCCLateral())->getValvula()->getCRecuperacion(), 2.),
1372 Venturi[v]->getGamma() / Venturi[v]->getgamma1());
1373 FSensorVent[cont].valreal = prgar;
1374 FSensorVent[cont].valact = FSensorVent[cont].valreal;
1375 FSensorVent[cont].valant = FSensorVent[cont].valreal;
1376 FSensorVent[cont].valrealant = FSensorVent[cont].valreal;
1379 if(
dynamic_cast<TCCDeposito *
>(Venturi[v]->getCCEntrada())->getSentidoFlujo() == nmEntrante) {
1381 }
else if(
dynamic_cast<TCCDeposito *
>(Venturi[v]->getCCEntrada())->getSentidoFlujo() == nmSaliente) {
1384 velent =
dynamic_cast<TCCDeposito *
>(Venturi[v]->getCCEntrada())->getVelocity() * signo * __cons::ARef;
1385 FSensorVent[cont].valreal = velent;
1386 FSensorVent[cont].valact = FSensorVent[cont].valreal;
1387 FSensorVent[cont].valant = FSensorVent[cont].valreal;
1388 FSensorVent[cont].valrealant = FSensorVent[cont].valreal;
1391 vellat =
dynamic_cast<TCCDeposito *
>(Venturi[v]->getCCLateral())->getVelocity() * __cons::ARef;
1392 FSensorVent[cont].valreal = vellat;
1393 FSensorVent[cont].valact = FSensorVent[cont].valreal;
1394 FSensorVent[cont].valant = FSensorVent[cont].valreal;
1395 FSensorVent[cont].valrealant = FSensorVent[cont].valreal;
1397 case nmGastoEntVent:
1399 (Venturi[v]->getCCEntrada())->getMassflow();
1401 FSensorVent[cont].valreal = gasent;
1402 FSensorVent[cont].valact = FSensorVent[cont].valreal;
1403 FSensorVent[cont].valant = FSensorVent[cont].valreal;
1404 FSensorVent[cont].valrealant = FSensorVent[cont].valreal;
1406 case nmGastoLatVent:
1407 gaslat =
dynamic_cast<TCCDeposito *
>(Venturi[v]->getCCLateral())->getMassflow();
1408 FSensorVent[cont].valreal = gaslat;
1409 FSensorVent[cont].valact = FSensorVent[cont].valreal;
1410 FSensorVent[cont].valant = FSensorVent[cont].valreal;
1411 FSensorVent[cont].valrealant = FSensorVent[cont].valreal;
1421 fgetpos(fich, &filepos);
1423 }
catch(exception &N) {
1424 std::cout <<
"ERROR: Lee_Sens_Vent" << std::endl;
1425 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1433 void TCalculoExtern::Lee_Sens_Motor(
const char *FileWAM, fpos_t &filepos,
double CrankAngle,
double ene,
1434 double AcumulatedTime) {
1436 FILE *fich = fopen(FileWAM,
"r");
1437 fsetpos(fich, &filepos);
1440 fscanf(fich,
"%d ", &FNSensMotor);
1441 if(ene < 0. && FNSensMotor != 0) {
1442 std::cout <<
"ERROR: No puede haber sensores en el motor,pues no hay motor.Comprobad la lectura " << std::endl;
1446 if(FNSensMotor != 0) {
1447 for(
int i = 0; i <= FNSensMotor - 1; ++i) {
1448 fscanf(fich,
"%d ", &tipo);
1449 FSensorMotor[i].motor = 1;
1452 FSensorMotor[i].tipo = nmAngulo;
1455 FSensorMotor[i].tipo = nmReg;
1458 FSensorMotor[i].tipo = nmTiempo;
1461 printf(
"Error en el tipo de sensor\n");
1465 fscanf(fich,
"%lf ", &FSensorMotor[i].ganancia);
1466 fscanf(fich,
"%lf ", &FSensorMotor[i].ctetiempo);
1468 switch(FSensorMotor[i].tipo) {
1470 FSensorMotor[i].valreal = CrankAngle;
1471 FSensorMotor[i].valact = FSensorMotor[i].valreal;
1472 FSensorMotor[i].valant = FSensorMotor[i].valreal;
1473 FSensorMotor[i].valrealant = FSensorMotor[i].valreal;
1476 FSensorMotor[i].valreal = ene;
1477 FSensorMotor[i].valact = FSensorMotor[i].valreal;
1478 FSensorMotor[i].valant = FSensorMotor[i].valreal;
1479 FSensorMotor[i].valrealant = FSensorMotor[i].valreal;
1482 FSensorMotor[i].valreal = AcumulatedTime;
1483 FSensorMotor[i].valact = FSensorMotor[i].valreal;
1484 FSensorMotor[i].valant = FSensorMotor[i].valreal;
1485 FSensorMotor[i].valrealant = FSensorMotor[i].valreal;
1491 fgetpos(fich, &filepos);
1493 }
catch(exception &N) {
1494 std::cout <<
"ERROR: Lee_Sens_Motor" << std::endl;
1495 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1503 void TCalculoExtern::Lee_Sens_UED(
const char *FileWAM, fpos_t &filepos,
TCondicionContorno **BC) {
1505 FILE *fich = fopen(FileWAM,
"r");
1506 fsetpos(fich, &filepos);
1507 int nUED = 0, CCued = 0, nsensUED = 0;
1509 fscanf(fich,
"%d ", &FNSensUED);
1510 fscanf(fich,
"%d ", &nUED);
1512 if(FNSensUED != 0) {
1513 for(
int i = 0; i <= nUED - 1; ++i) {
1514 fscanf(fich,
"%d %d ", &CCued, &nsensUED);
1515 for(
int j = 0; j <= nsensUED - 1; ++j) {
1516 FSensorUED[cont].CCUED = CCued;
1517 fscanf(fich,
"%d ", &tipo);
1520 FSensorUED[cont].tipo = nmGasto;
1523 printf(
"Error en el tipo de sensor\n");
1527 fscanf(fich,
"%lf ", &FSensorUED[cont].ganancia);
1528 fscanf(fich,
"%lf ", &FSensorUED[cont].ctetiempo);
1530 switch(FSensorUED[cont].tipo) {
1532 FSensorUED[cont].valreal =
dynamic_cast<TCCUnionEntreDepositos*
>(BC[FSensorUED[cont].CCUED - 1])->getGastoImpreso();
1533 FSensorUED[cont].valact = FSensorUED[cont].valreal;
1534 FSensorUED[cont].valant = FSensorUED[cont].valreal;
1535 FSensorUED[cont].valrealant = FSensorUED[cont].valreal;
1542 fgetpos(fich, &filepos);
1544 }
catch(exception &N) {
1545 std::cout <<
"ERROR: Lee_Sens_UED" << std::endl;
1546 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1554 void TCalculoExtern::Lectura_Datos_Adicionales(
const char *FileWAM, fpos_t &filepos) {
1557 }
catch(exception &N) {
1558 std::cout <<
"ERROR: Lectura_Datos_Adicionales" << std::endl;
1559 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1567 void TCalculoExtern::IniciaEntradaDLL() {
1569 FNInputsdll = FNSensTubos + FNSensDepositos + FNSensTurbogrupo + FNSensTurbina + FNSensMotor + FNSensVenturis +
1570 FNSensCilindros + FNSensUED;
1571 FInputs =
new double[FNInputsdll];
1572 }
catch(exception &N) {
1573 std::cout <<
"ERROR: IniciaEntradaDLL" << std::endl;
1574 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1581 void TCalculoExtern::Calculo_Sensores_Tubos(
TTubo **Pipe,
double deltaT) {
1583 double dist = 0., T = 0., temp = 0., v1 = 0., v2 = 0., den = 0., d = 0., p = 0., gto1 = 0., gto2 = 0., gamma, Rmezcla;
1584 int n1 = 0, j = 0, n2 = 0;
1585 for(
int i = 0; i <= FNSensTubos - 1; i++) {
1586 dist = FSensorTubo[i].distancia / FSensorTubo[i].deltax;
1587 n1 = (int) floor(dist);
1588 j = FSensorTubo[i].tubo - 1;
1589 if(n1 == FSensorTubo[i].nodos - 1) {
1590 switch(FSensorTubo[i].tipo) {
1592 temp = Pipe[j]->
GetAsonido(n1) * __cons::ARef;
1593 FSensorTubo[i].valreal = __units::KTodegC(temp * temp / Pipe[j]->GetGamma(n1) / Pipe[j]->GetRMezcla(n1));
1594 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1595 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1597 FSensorTubo[i].valant = FSensorTubo[i].valact;
1598 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1601 FSensorTubo[i].valreal = Pipe[j]->
GetPresion(n1);
1602 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1603 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1605 FSensorTubo[i].valant = FSensorTubo[i].valact;
1606 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1609 FSensorTubo[i].valreal = Pipe[j]->
GetVelocidad(n1) * __cons::ARef;
1610 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1611 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1613 FSensorTubo[i].valant = FSensorTubo[i].valact;
1614 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1617 temp = Pipe[j]->
GetAsonido(n1) * __cons::ARef;
1618 T = __units::KTodegC(temp * temp / Pipe[j]->GetGamma(n1) / Pipe[j]->GetRMezcla(n1));
1619 den = __units::BarToPa(Pipe[j]->GetPresion(n1)) / Pipe[j]->
GetRMezcla(n1) / __units::degCToK(T);
1621 FSensorTubo[i].valreal = (
pow2(Pipe[j]->GetDiametro(n1)) * __cons::Pi) * v1 * den;
1622 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1623 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1625 FSensorTubo[i].valant = FSensorTubo[i].valact;
1626 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1630 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1631 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1633 FSensorTubo[i].valant = FSensorTubo[i].valact;
1634 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1638 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1639 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1641 FSensorTubo[i].valant = FSensorTubo[i].valact;
1642 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1646 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1647 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1649 FSensorTubo[i].valant = FSensorTubo[i].valact;
1650 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1654 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1655 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1657 FSensorTubo[i].valant = FSensorTubo[i].valact;
1658 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1662 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1663 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1665 FSensorTubo[i].valant = FSensorTubo[i].valact;
1666 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1670 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1671 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1673 FSensorTubo[i].valant = FSensorTubo[i].valact;
1674 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1678 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1679 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1681 FSensorTubo[i].valant = FSensorTubo[i].valact;
1682 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1686 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1687 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1689 FSensorTubo[i].valant = FSensorTubo[i].valact;
1690 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1694 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1695 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1697 FSensorTubo[i].valant = FSensorTubo[i].valact;
1698 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1700 case nmGasQuemadoTubo:
1702 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1703 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1705 FSensorTubo[i].valant = FSensorTubo[i].valact;
1706 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1710 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1711 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1713 FSensorTubo[i].valant = FSensorTubo[i].valact;
1714 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1716 case nmCombustibleTubo:
1718 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1719 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1721 FSensorTubo[i].valant = FSensorTubo[i].valact;
1722 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1728 switch(FSensorTubo[i].tipo) {
1730 temp = xit_(Pipe[j]->GetAsonido(n1), Pipe[j]->GetAsonido(n2), 1.0, d) * __cons::ARef;
1731 gamma = xit_(Pipe[j]->GetGamma(n1), Pipe[j]->GetGamma(n2), 1.0, d);
1732 Rmezcla = xit_(Pipe[j]->GetRMezcla(n1), Pipe[j]->GetRMezcla(n2), 1.0, d);
1733 FSensorTubo[i].valreal = __units::KTodegC(temp * temp / gamma / Rmezcla);
1734 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1735 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1737 FSensorTubo[i].valant = FSensorTubo[i].valact;
1738 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1741 FSensorTubo[i].valreal = xit_(Pipe[j]->GetPresion(n1), Pipe[j]->GetPresion(n2), 1.0, d);
1742 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1743 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1745 FSensorTubo[i].valant = FSensorTubo[i].valact;
1746 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1749 FSensorTubo[i].valreal = xit_(Pipe[j]->GetVelocidad(n1), Pipe[j]->GetVelocidad(n2), 1.0, d) * __cons::ARef;
1750 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1751 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1753 FSensorTubo[i].valant = FSensorTubo[i].valact;
1754 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1757 temp = xit_(Pipe[j]->GetAsonido(n1), Pipe[j]->GetAsonido(n2), 1.0, d) * __cons::ARef;
1758 gamma = xit_(Pipe[j]->GetGamma(n1), Pipe[j]->GetGamma(n2), 1.0, d);
1759 Rmezcla = xit_(Pipe[j]->GetRMezcla(n1), Pipe[j]->GetRMezcla(n2), 1.0, d);
1760 T = __units::KTodegC(temp * temp / gamma / Rmezcla);
1761 p = xit_(Pipe[j]->GetPresion(n1), Pipe[j]->GetPresion(n2), 1.0, d);
1762 den = __units::BarToPa(p) / Rmezcla / __units::degCToK(T);
1765 gto1 = __geom::Circle_area(Pipe[j]->GetDiametro(n1));
1766 gto2 = __geom::Circle_area(Pipe[j]->GetDiametro(n2));
1769 FSensorTubo[i].valreal = xit_(gto1, gto2, 1.0, d) * den;
1770 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1771 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1773 FSensorTubo[i].valant = FSensorTubo[i].valact;
1774 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1777 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboN2), Pipe[j]->GetFraccionMasica(n1,
1778 FIndiceTuboN2), 1.0, d);
1779 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1780 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1782 FSensorTubo[i].valant = FSensorTubo[i].valact;
1783 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1786 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboO2), Pipe[j]->GetFraccionMasica(n1,
1787 FIndiceTuboO2), 1.0, d);
1788 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1789 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1791 FSensorTubo[i].valant = FSensorTubo[i].valact;
1792 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1795 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboCO2), Pipe[j]->GetFraccionMasica(n1,
1796 FIndiceTuboCO2), 1.0, d);
1797 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1798 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1800 FSensorTubo[i].valant = FSensorTubo[i].valact;
1801 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1804 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboH2O), Pipe[j]->GetFraccionMasica(n1,
1805 FIndiceTuboH2O), 1.0, d);
1806 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1807 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1809 FSensorTubo[i].valant = FSensorTubo[i].valact;
1810 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1813 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboHC), Pipe[j]->GetFraccionMasica(n1,
1814 FIndiceTuboHC), 1.0, d);
1815 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1816 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1818 FSensorTubo[i].valant = FSensorTubo[i].valact;
1819 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1822 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboSoot), Pipe[j]->GetFraccionMasica(n1,
1823 FIndiceTuboSoot), 1.0, d);
1824 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1825 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1827 FSensorTubo[i].valant = FSensorTubo[i].valact;
1828 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1831 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboNOx), Pipe[j]->GetFraccionMasica(n1,
1832 FIndiceTuboNOx), 1.0, d);
1833 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1834 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1836 FSensorTubo[i].valant = FSensorTubo[i].valact;
1837 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1840 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboCO), Pipe[j]->GetFraccionMasica(n1,
1841 FIndiceTuboCO), 1.0, d);
1842 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1843 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1845 FSensorTubo[i].valant = FSensorTubo[i].valact;
1846 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1849 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboAireFresco), Pipe[j]->GetFraccionMasica(n1,
1850 FIndiceTuboAireFresco), 1.0, d);
1851 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1852 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1854 FSensorTubo[i].valant = FSensorTubo[i].valact;
1855 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1857 case nmGasQuemadoTubo:
1858 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboGasQuemado), Pipe[j]->GetFraccionMasica(n1,
1859 FIndiceTuboGasQuemado), 1.0, d);
1860 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1861 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1863 FSensorTubo[i].valant = FSensorTubo[i].valact;
1864 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1867 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboEGR), Pipe[j]->GetFraccionMasica(n1,
1868 FIndiceTuboEGR), 1.0, d);
1869 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1870 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1872 FSensorTubo[i].valant = FSensorTubo[i].valact;
1873 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1875 case nmCombustibleTubo:
1876 FSensorTubo[i].valreal = xit_(Pipe[j]->GetFraccionMasica(n1, FIndiceTuboComb), Pipe[j]->GetFraccionMasica(n1,
1877 FIndiceTuboComb), 1.0, d);
1878 FSensorTubo[i].valact = ((2 * FSensorTubo[i].ctetiempo - deltaT) * FSensorTubo[i].valant + deltaT *
1879 FSensorTubo[i].ganancia * (FSensorTubo[i].valreal + FSensorTubo[i].valrealant)) / (2 * FSensorTubo[i].ctetiempo +
1881 FSensorTubo[i].valant = FSensorTubo[i].valact;
1882 FSensorTubo[i].valrealant = FSensorTubo[i].valreal;
1888 }
catch(exception &N) {
1889 std::cout <<
"ERROR: Calculo_Sensores_Tubos" << std::endl;
1890 std::cout <<
"Tipo de error: " << N.what() << std::endl;
1898 void TCalculoExtern::Calculo_Sensores_Deposito(
TDeposito **Plenum,
double deltaT) {
1900 for(
int i = 0; i <= FNSensDepositos - 1; i++) {
1901 switch(FSensorDep[i].tipo) {
1903 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->getPressure();
1904 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1905 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1906 FSensorDep[i].valant = FSensorDep[i].valact;
1907 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1910 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->getTemperature();
1911 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1912 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1913 FSensorDep[i].valant = FSensorDep[i].valact;
1914 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1917 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboN2);
1918 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1919 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1920 FSensorDep[i].valant = FSensorDep[i].valact;
1921 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1924 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboO2);
1925 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1926 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1927 FSensorDep[i].valant = FSensorDep[i].valact;
1928 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1931 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboCO2);
1932 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1933 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1934 FSensorDep[i].valant = FSensorDep[i].valact;
1935 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1938 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboH2O);
1939 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1940 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1941 FSensorDep[i].valant = FSensorDep[i].valact;
1942 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1945 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboHC);
1946 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1947 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1948 FSensorDep[i].valant = FSensorDep[i].valact;
1949 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1952 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboSoot);
1953 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1954 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1955 FSensorDep[i].valant = FSensorDep[i].valact;
1956 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1959 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboNOx);
1960 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1961 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1962 FSensorDep[i].valant = FSensorDep[i].valact;
1963 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1966 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboCO);
1967 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1968 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1969 FSensorDep[i].valant = FSensorDep[i].valact;
1970 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1973 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboAireFresco);
1974 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1975 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1976 FSensorDep[i].valant = FSensorDep[i].valact;
1977 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1979 case nmGasQuemadoDep:
1980 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboGasQuemado);
1981 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1982 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1983 FSensorDep[i].valant = FSensorDep[i].valact;
1984 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1987 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboEGR);
1988 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1989 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1990 FSensorDep[i].valant = FSensorDep[i].valact;
1991 FSensorDep[i].valrealant = FSensorDep[i].valreal;
1993 case nmCombustibleDep:
1994 FSensorDep[i].valreal = Plenum[FSensorDep[i].deposito - 1]->GetFraccionMasicaEspecie(FIndiceTuboComb);
1995 FSensorDep[i].valact = ((2 * FSensorDep[i].ctetiempo - deltaT) * FSensorDep[i].valant + deltaT * FSensorDep[i].ganancia
1996 * (FSensorDep[i].valreal + FSensorDep[i].valrealant)) / (2 * FSensorDep[i].ctetiempo + deltaT);
1997 FSensorDep[i].valant = FSensorDep[i].valact;
1998 FSensorDep[i].valrealant = FSensorDep[i].valreal;
2002 }
catch(exception &N) {
2003 std::cout <<
"ERROR: Calculo_Sensores_Deposito" << std::endl;
2004 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2012 void TCalculoExtern::Calculo_Sensores_TG(
double deltaT,
TEjeTurbogrupo **Axis) {
2014 for(
int i = 0; i <= FNSensTurbogrupo - 1; i++) {
2015 switch(FSensorTG[i].tipo) {
2017 FSensorTG[i].valreal = Axis[FSensorTG[i].turbogrupo - 1]->getRegimen();
2018 FSensorTG[i].valact = ((2 * FSensorTG[i].ctetiempo - deltaT) * FSensorTG[i].valant + deltaT * FSensorTG[i].ganancia *
2019 (FSensorTG[i].valreal + FSensorTG[i].valrealant)) / (2 * FSensorTG[i].ctetiempo + deltaT);
2020 FSensorTG[i].valant = FSensorTG[i].valact;
2021 FSensorTG[i].valrealant = FSensorTG[i].valreal;
2025 }
catch(exception &N) {
2026 std::cout <<
"ERROR: Calculo_Sensores_TG" << std::endl;
2027 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2035 void TCalculoExtern::Calculo_Sensores_Turbina(
double deltaT,
TTurbina **Turbine) {
2037 for(
int i = 0; i <= FNSensTurbina - 1; i++) {
2038 switch(FSensorTurbina[i].tipo) {
2040 FSensorTurbina[i].valreal = Turbine[FSensorTurbina[i].turbina - 1]->GetRelacionCinematica(0);
2041 FSensorTurbina[i].valact = ((2 * FSensorTurbina[i].ctetiempo - deltaT) * FSensorTurbina[i].valant + deltaT *
2042 FSensorTurbina[i].ganancia * (FSensorTurbina[i].valreal + FSensorTurbina[i].valrealant)) /
2043 (2 * FSensorTurbina[i].ctetiempo + deltaT);
2044 FSensorTurbina[i].valant = FSensorTurbina[i].valact;
2045 FSensorTurbina[i].valrealant = FSensorTurbina[i].valreal;
2048 FSensorTurbina[i].valreal = Turbine[FSensorTurbina[i].turbina - 1]->GetRelacionCinematica(1);
2049 FSensorTurbina[i].valact = ((2 * FSensorTurbina[i].ctetiempo - deltaT) * FSensorTurbina[i].valant + deltaT *
2050 FSensorTurbina[i].ganancia * (FSensorTurbina[i].valreal + FSensorTurbina[i].valrealant)) /
2051 (2 * FSensorTurbina[i].ctetiempo + deltaT);
2052 FSensorTurbina[i].valant = FSensorTurbina[i].valact;
2053 FSensorTurbina[i].valrealant = FSensorTurbina[i].valreal;
2057 }
catch(exception &N) {
2058 std::cout <<
"ERROR: TCalculoExtern::Calculo_Sensores_Turbina " << std::endl;
2059 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2067 void TCalculoExtern::Calculo_Sensores_Cilindro(
double deltaT,
TBloqueMotor **Engine) {
2069 for(
int i = 0; i <= FNSensCilindros - 1; i++) {
2070 switch(FSensorCil[i].tipo) {
2072 FSensorCil[i].valreal = Engine[0]->GetCilindro(FSensorCil[i].cilindro - 1)->getTemperature();
2073 FSensorCil[i].valact = ((2 * FSensorCil[i].ctetiempo - deltaT) * FSensorCil[i].valant + deltaT * FSensorCil[i].ganancia
2074 * (FSensorCil[i].valreal + FSensorCil[i].valrealant)) / (2 * FSensorCil[i].ctetiempo + deltaT);
2075 FSensorCil[i].valant = FSensorCil[i].valact;
2076 FSensorCil[i].valrealant = FSensorCil[i].valreal;
2079 FSensorCil[i].valreal = Engine[0]->GetCilindro(FSensorCil[i].cilindro - 1)->getPressure();
2080 FSensorCil[i].valact = ((2 * FSensorCil[i].ctetiempo - deltaT) * FSensorCil[i].valant + deltaT * FSensorCil[i].ganancia
2081 * (FSensorCil[i].valreal + FSensorCil[i].valrealant)) / (2 * FSensorCil[i].ctetiempo + deltaT);
2082 FSensorCil[i].valant = FSensorCil[i].valact;
2083 FSensorCil[i].valrealant = FSensorCil[i].valreal;
2086 FSensorCil[i].valreal = Engine[0]->GetCilindro(FSensorCil[i].cilindro - 1)->getMasaFuel();
2087 FSensorCil[i].valact = ((2 * FSensorCil[i].ctetiempo - deltaT) * FSensorCil[i].valant + deltaT * FSensorCil[i].ganancia
2088 * (FSensorCil[i].valreal + FSensorCil[i].valrealant)) / (2 * FSensorCil[i].ctetiempo + deltaT);
2089 FSensorCil[i].valant = FSensorCil[i].valact;
2090 FSensorCil[i].valrealant = FSensorCil[i].valreal;
2093 FSensorCil[i].valreal = Engine[0]->GetCilindro(FSensorCil[i].cilindro - 1)->getAFR();
2094 FSensorCil[i].valact = ((2 * FSensorCil[i].ctetiempo - deltaT) * FSensorCil[i].valant + deltaT * FSensorCil[i].ganancia
2095 * (FSensorCil[i].valreal + FSensorCil[i].valrealant)) / (2 * FSensorCil[i].ctetiempo + deltaT);
2096 FSensorCil[i].valant = FSensorCil[i].valact;
2097 FSensorCil[i].valrealant = FSensorCil[i].valreal;
2102 }
catch(exception &N) {
2103 std::cout <<
"ERROR: Calculo_Sensores_Cilindro" << std::endl;
2104 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2112 void TCalculoExtern::Calculo_Sensores_Venturi(
double deltaT,
TVenturi **Venturi) {
2115 double prent = 0., prgar = 0., velent = 0., vellat = 0., gasent = 0., gaslat = 0.;
2117 for(
int i = 0; i <= FNSensVenturis - 1; i++) {
2118 switch(FSensorVent[i].tipo) {
2120 prent = Venturi[FSensorVent[i].venturi - 1]->getPressure();
2121 FSensorVent[i].valreal = prent;
2122 FSensorVent[i].valact = ((2 * FSensorVent[i].ctetiempo - deltaT) * FSensorVent[i].valant + deltaT *
2123 FSensorVent[i].ganancia * (FSensorVent[i].valreal + FSensorVent[i].valrealant)) / (2 * FSensorVent[i].ctetiempo +
2125 FSensorVent[i].valant = FSensorVent[i].valact;
2126 FSensorVent[i].valrealant = FSensorVent[i].valreal;
2129 prent = Venturi[FSensorVent[i].venturi - 1]->getPressure();
2130 prgar = prent / pow(
2131 1 + Venturi[FSensorVent[i].venturi - 1]->getgamma3() * pow(
dynamic_cast<TCCDeposito *
>
2132 (Venturi[FSensorVent[i].venturi - 1]->getCCLateral())->getValvula()->getCRecuperacion(), 2.),
2133 Venturi[FSensorVent[i].venturi - 1]->getGamma() / Venturi[FSensorVent[i].venturi - 1]->getgamma1());
2134 FSensorVent[i].valreal = prgar;
2135 FSensorVent[i].valact = ((2 * FSensorVent[i].ctetiempo - deltaT) * FSensorVent[i].valant + deltaT *
2136 FSensorVent[i].ganancia * (FSensorVent[i].valreal + FSensorVent[i].valrealant)) / (2 * FSensorVent[i].ctetiempo +
2138 FSensorVent[i].valant = FSensorVent[i].valact;
2139 FSensorVent[i].valrealant = FSensorVent[i].valreal;
2142 if(
dynamic_cast<TCCDeposito *
>(Venturi[FSensorVent[i].venturi - 1]->getCCEntrada())->getSentidoFlujo() == nmEntrante) {
2144 }
else if(
dynamic_cast<TCCDeposito *
>(Venturi[FSensorVent[i].venturi - 1]->getCCEntrada())->getSentidoFlujo() ==
2148 velent =
dynamic_cast<TCCDeposito *
>(Venturi[FSensorVent[i].venturi - 1]->getCCEntrada())->getVelocity() * signo *
2150 FSensorVent[i].valreal = velent;
2151 FSensorVent[i].valact = ((2 * FSensorVent[i].ctetiempo - deltaT) * FSensorVent[i].valant + deltaT *
2152 FSensorVent[i].ganancia * (FSensorVent[i].valreal + FSensorVent[i].valrealant)) / (2 * FSensorVent[i].ctetiempo +
2154 FSensorVent[i].valant = FSensorVent[i].valact;
2155 FSensorVent[i].valrealant = FSensorVent[i].valreal;
2158 vellat =
dynamic_cast<TCCDeposito *
>(Venturi[FSensorVent[i].venturi - 1]->getCCLateral())->getVelocity() * __cons::ARef;
2159 FSensorVent[i].valreal = vellat;
2160 FSensorVent[i].valact = ((2 * FSensorVent[i].ctetiempo - deltaT) * FSensorVent[i].valant + deltaT *
2161 FSensorVent[i].ganancia * (FSensorVent[i].valreal + FSensorVent[i].valrealant)) / (2 * FSensorVent[i].ctetiempo +
2163 FSensorVent[i].valant = FSensorVent[i].valact;
2164 FSensorVent[i].valrealant = FSensorVent[i].valreal;
2166 case nmGastoEntVent:
2167 gasent = -
dynamic_cast<TCCDeposito *
>(Venturi[FSensorVent[i].venturi -
2168 1]->getCCEntrada())->getMassflow();
2170 FSensorVent[i].valreal = gasent;
2171 FSensorVent[i].valact = ((2 * FSensorVent[i].ctetiempo - deltaT) * FSensorVent[i].valant + deltaT *
2172 FSensorVent[i].ganancia * (FSensorVent[i].valreal + FSensorVent[i].valrealant)) / (2 * FSensorVent[i].ctetiempo +
2174 FSensorVent[i].valant = FSensorVent[i].valact;
2175 FSensorVent[i].valrealant = FSensorVent[i].valreal;
2177 case nmGastoLatVent:
2178 gaslat =
dynamic_cast<TCCDeposito *
>(Venturi[FSensorVent[i].venturi - 1]->getCCLateral())->getMassflow();
2179 FSensorVent[i].valreal = gaslat;
2180 FSensorVent[i].valact = ((2 * FSensorVent[i].ctetiempo - deltaT) * FSensorVent[i].valant + deltaT *
2181 FSensorVent[i].ganancia * (FSensorVent[i].valreal + FSensorVent[i].valrealant)) / (2 * FSensorVent[i].ctetiempo +
2183 FSensorVent[i].valant = FSensorVent[i].valact;
2184 FSensorVent[i].valrealant = FSensorVent[i].valreal;
2189 }
catch(exception &N) {
2190 std::cout <<
"ERROR: Calculo_Sensores_Venturi" << std::endl;
2191 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2199 void TCalculoExtern::Calculo_Sensores_Motor(
double deltaT,
TBloqueMotor **Engine,
double AcumulatedTime) {
2201 for(
int i = 0; i <= FNSensMotor - 1; i++) {
2202 switch(FSensorMotor[i].tipo) {
2204 FSensorMotor[i].valreal = Engine[0]->getTheta();
2205 FSensorMotor[i].valact = ((2 * FSensorMotor[i].ctetiempo - deltaT) * FSensorMotor[i].valant + deltaT *
2206 FSensorMotor[i].ganancia * (FSensorMotor[i].valreal + FSensorMotor[i].valrealant)) /
2207 (2 * FSensorMotor[i].ctetiempo + deltaT);
2208 FSensorMotor[i].valant = FSensorMotor[i].valact;
2209 FSensorMotor[i].valrealant = FSensorMotor[i].valreal;
2212 FSensorMotor[i].valreal = Engine[0]->getRegimen();
2213 FSensorMotor[i].valact = ((2 * FSensorMotor[i].ctetiempo - deltaT) * FSensorMotor[i].valant + deltaT *
2214 FSensorMotor[i].ganancia * (FSensorMotor[i].valreal + FSensorMotor[i].valrealant)) /
2215 (2 * FSensorMotor[i].ctetiempo + deltaT);
2216 FSensorMotor[i].valant = FSensorMotor[i].valact;
2217 FSensorMotor[i].valrealant = FSensorMotor[i].valreal;
2220 FSensorMotor[i].valreal = AcumulatedTime;
2221 FSensorMotor[i].valact = ((2 * FSensorMotor[i].ctetiempo - deltaT) * FSensorMotor[i].valant + deltaT *
2222 FSensorMotor[i].ganancia * (FSensorMotor[i].valreal + FSensorMotor[i].valrealant)) /
2223 (2 * FSensorMotor[i].ctetiempo + deltaT);
2224 FSensorMotor[i].valant = FSensorMotor[i].valact;
2225 FSensorMotor[i].valrealant = FSensorMotor[i].valreal;
2230 }
catch(exception &N) {
2231 std::cout <<
"ERROR: Calculo_Sensores_Cilindro" << std::endl;
2232 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2242 for(
int i = 0; i <= FNSensUED - 1; i++) {
2243 switch(FSensorUED[i].tipo) {
2245 FSensorUED[i].valreal =
dynamic_cast<TCCUnionEntreDepositos*
>(BC[FSensorUED[i].CCUED - 1])->getGastoImpreso();
2246 FSensorUED[i].valact = ((2 * FSensorUED[i].ctetiempo - deltaT) * FSensorUED[i].valant + deltaT * FSensorUED[i].ganancia
2247 * (FSensorUED[i].valreal + FSensorUED[i].valrealant)) / (2 * FSensorUED[i].ctetiempo + deltaT);
2248 FSensorUED[i].valant = FSensorUED[i].valact;
2249 FSensorUED[i].valrealant = FSensorUED[i].valreal;
2253 }
catch(exception &N) {
2254 std::cout <<
"ERROR: Calculo_Sensores_UED" << std::endl;
2255 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2263 double TCalculoExtern::xit_(
double vizq,
double vder,
double axid,
double xif) {
2265 double xx = 0., yy = 0.;
2266 double ret_val = 0.;
2270 yy = xx / axid * xif;
2271 ret_val = vizq + yy;
2273 printf(
"ERROR: valores entrada xit\n");
2277 }
catch(exception &N) {
2278 std::cout <<
"ERROR: xit_" << std::endl;
2279 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2286 void TCalculoExtern::InicializaMedias() {
2291 printf(
"Recuerda que debes inicializar las variables que quieres graficar\n");
2293 PosicionTurbinaSUM = 0.;
2294 SensorGastoAdmisionSUM = 0.;
2298 SensorRegimenTurboSUM = 0.;
2299 }
catch(exception &N) {
2300 std::cout <<
"ERROR: InicializaMedias" << std::endl;
2301 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2308 void TCalculoExtern::AcumulaMedias(
double DeltaT) {
2311 }
catch(exception &N) {
2312 std::cout <<
"ERROR: AcumulaMedias: " << std::endl;
2313 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2321 void TCalculoExtern::CalculaMedias() {
2341 }
catch(exception &N) {
2342 std::cout <<
"ERROR: CalculaMedias: " << std::endl;
2343 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2351 void TCalculoExtern::ImprimeCabeceraMedias(stringstream& medoutput) {
2368 }
catch(exception &N) {
2369 std::cout <<
"ERROR: ImprimeCabeceraMedias: " << std::endl;
2370 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2378 void TCalculoExtern::ImprimeGraficosMedias(stringstream& medoutput) {
2393 }
catch(exception &N) {
2394 std::cout <<
"ERROR: ImprimeGraficosMedias: " << std::endl;
2395 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2402 void TCalculoExtern::ImprimeCabeceraInstantaneas(stringstream& insoutput) {
2411 }
catch(exception &N) {
2412 std::cout <<
"ERROR: ImprimeCabeceraInstantaneas: " << std::endl;
2413 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2421 void TCalculoExtern::ImprimeGraficosInstantaneas(stringstream& insoutput) {
2429 }
catch(exception &N) {
2430 std::cout <<
"ERROR: ImprimeGraficosInstantaneas: " << std::endl;
2431 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2439 void TCalculoExtern::ObtenerRutaTrabajo(
const char *origin) {
2442 for(
int i = (
int) strlen(origin) - 1; i >= 0; i--) {
2443 if(origin[i] ==
'\\') {
2448 FRutaTrabajo =
new char[contpunto + 1];
2449 for(
int i = 0; i < contpunto; i++) {
2450 FRutaTrabajo[i] = origin[i];
2452 FRutaTrabajo[contpunto] =
'\0';
2454 }
catch(exception &N) {
2455 std::cout <<
"ERROR: ObtenerRutaTrabajo: " << std::endl;
2456 std::cout <<
"Tipo de error: " << N.what() << std::endl;
2463 #pragma package(smart_init)