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:
1398 gasent = -dynamic_cast<TCCDeposito *>
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) double GetFraccionMasica(int j, int i)
double GetPresion(int i) const
Gets the fluid pressure.
T pow2(T x)
Returns x to the power of 2.
double GetVelocidad(int i) const
Gets the fluid speed.
double getPresionInicial() const
Gets the initial pressure.
double GetRMezcla(int i) const
Gets the gas constant of the mixture at a given cell.
a Finite differences pipe.
double GetAsonido(int i) const
Gets the speed of sound.
double getVelocidadMedia() const
Gets the mean speed.