31 #include "TDepVolVariable.h"
33 #include "TCCDeposito.h"
34 #include "TCCUnionEntreDepositos.h"
40 TDepVolVariable::TDepVolVariable(
int i,
int ncv, nmTipoCalculoEspecies SpeciesModel,
int numeroespecies,
41 nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
42 TDeposito(i, nmDepVolVble, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
44 FNumeroCompresorVol = ncv + 1;
51 TDepVolVariable::~TDepVolVariable() {
57 void TDepVolVariable::LeeDatosDepVolVariable(
const char *FileWAM, fpos_t &filepos,
bool HayMotor) {
60 int ControlRegimen = 0;
62 FILE *fich = fopen(FileWAM,
"r");
63 fsetpos(fich, &filepos);
65 fscanf(fich,
"%lf %lf %lf ", &FLBiela, &FCarrera, &FDiametro);
66 fscanf(fich,
"%lf %lf %lf ", &FRelCompre, &FDesfase, &FDescentramiento);
68 fscanf(fich,
"%d ", &ControlRegimen);
70 switch(ControlRegimen) {
72 FControlRegimen = nmPropio;
75 FControlRegimen = nmMotor;
78 if(FControlRegimen == nmPropio) {
79 fscanf(fich,
"%lf ", &FRegimen);
80 FRelacionVelocidades = 1.;
81 }
else if(FControlRegimen == nmMotor && HayMotor) {
82 fscanf(fich,
"%lf ", &FRelacionVelocidades);
84 std::cout <<
"ERROR: TDepVolVariable::LeeDatosIniciales Lectura del Control del Regimen erronea " << std::endl;
88 fgetpos(fich, &filepos);
91 FVolumenMuerto = __geom::Circle_area(FDiametro) * FCarrera / (FRelCompre - 1.);
93 }
catch(exception &N) {
94 std::cout <<
"ERROR: TDepVolVariable::LeeDatosDepVolVariable en el compresor volumetrico: " << FNumeroCompresor <<
104 void TDepVolVariable::ActualizaPropiedades(
double TimeCalculo) {
108 double MasaEntrante, FraccionMasicaAcum = 0.;
109 double DeltaT = 0., DeltaAngulo = 0.;
110 double g = 0., v = 0., a = 0., m = 0.;
111 int SignoFlujo = 1, SignoFlujoED = 1;
117 DeltaT = TimeCalculo - FTime;
118 DeltaAngulo = 360 * FRegimen / 60. * DeltaT;
119 FAngulo += DeltaAngulo;
120 FVolumen0 = FVolumen;
121 FVolumen = CalculaVolumen(FAngulo, FCarrera, FLBiela, FDiametro, FVolumenMuerto);
123 if(FCalculoEspecies == nmCalculoCompleto) {
125 FRMezcla = CalculoCompletoRMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2], 0,
126 FCalculoGamma, nmMEP);
127 FCpMezcla = CalculoCompletoCpMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2], 0,
128 __units::degCToK(FTemperature), FCalculoGamma, nmMEP);
129 FGamma = CalculoCompletoGamma(FRMezcla, FCpMezcla, FCalculoGamma);
131 }
else if(FCalculoEspecies == nmCalculoSimple) {
133 FRMezcla = CalculoSimpleRMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FCalculoGamma, nmMEP);
134 FCvMezcla = CalculoSimpleCvMezcla(__units::degCToK(FTemperature), FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1],
135 FCalculoGamma, nmMEP);
136 FGamma = CalculoSimpleGamma(FRMezcla, FCvMezcla, FCalculoGamma);
140 for(
int i = 0; i < FNumeroUniones; i++) {
141 if(
dynamic_cast<TCCDeposito *
>(FCCDeposito[i])->getSentidoFlujo() == nmEntrante) {
143 }
else if(
dynamic_cast<TCCDeposito *
>(FCCDeposito[i])->getSentidoFlujo() == nmSaliente) {
146 g = (double) -
dynamic_cast<TCCDeposito *
>(FCCDeposito[i])->getMassflow();
147 m = g * DeltaT * FCCDeposito[i]->GetTuboExtremo(0).Pipe->getNumeroConductos();
148 v = (double) SignoFlujo *
dynamic_cast<TCCDeposito *
>(FCCDeposito[i])->getVelocity();
149 a =
dynamic_cast<TCCDeposito *
>(FCCDeposito[i])->getSpeedSound();
152 H += EntalpiaEntrada(a, v, m, FAsonido, FMasa0, FCCDeposito[i]->getGamma());
154 for(
int j = 0; j < FNumeroEspecies - FIntEGR; j++) {
155 FMasaEspecie[j] += FCCDeposito[i]->GetFraccionMasicaEspecie(j) * m;
158 for(
int i = 0; i < FNumeroUnionesED; i++) {
160 if(FNumeroDeposito ==
dynamic_cast<TCCUnionEntreDepositos *
>(FCCUnionEntreDep[i])->getNumeroDeposito1()) {
162 }
else if(FNumeroDeposito ==
dynamic_cast<TCCUnionEntreDepositos *
>(FCCUnionEntreDep[i])->getNumeroDeposito2()) {
165 printf(
"ERROR:TDepVolVariable::ActualizaPropiedades en el deposito %d, union entre depositos %d\n", FNumeroDeposito, i);
172 H += EntalpiaEntrada(a, 0, m, FAsonido, FMasa0, FCCUnionEntreDep[i]->getGamma());
174 for(
int j = 0; j < FNumeroEspecies - FIntEGR; j++) {
175 FMasaEspecie[j] += FCCUnionEntreDep[i]->GetFraccionMasicaEspecie(j) * m;
178 FMasa = FMasa0 + MasaEntrante;
179 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
180 FFraccionMasicaEspecie[j] = FMasaEspecie[j] / FMasa;
181 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
183 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
185 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FMasaEspecie[FNumeroEspecies - 1] / FMasa;
187 Energia = pow(FVolumen0 * FMasa / FMasa0 / FVolumen * exp(H), __Gamma::G1(FGamma));
188 FAsonido *= sqrt(Energia);
189 FPressure = __units::PaToBar(
pow2(__cons::ARef * FAsonido) * FMasa / (FGamma * FVolumen));
190 FPresionIsen = pow(FPressure / FPresRef, __Gamma::G5(FGamma));
191 FTemperature = __units::KTodegC(
pow2(FAsonido * __cons::ARef) / (FGamma * FRMezcla));
197 }
catch(exception &N) {
198 std::cout <<
"ERROR: TDepVolVariable::ActualizaPropiedades en el compresor volumetrico: " << FNumeroCompresorVol <<
200 std::cout <<
"Tipo de error: " << N.what() << std::endl;
208 double TDepVolVariable::CalculaVolumen(
double CrankAngle,
double carrera,
double lbiela,
double diametro,
210 double c = 0., tt = 0., ttt = 0.;
215 c = __units::DegToRad(CrankAngle);
217 tt -=
pow2(carrera * sin(c) / 2.);
219 ttt = lbiela + carrera * (1. - cos(c)) / 2. - tt;
220 ret_val = ttt * __geom::Circle_area(diametro);
221 ret_val += vol_muerto;
224 }
catch(exception &N) {
225 std::cout <<
"ERROR: TDepVolVariable::CalculaVolumen en el compresor volumetrico: " << FNumeroCompresorVol << std::endl;
226 std::cout <<
"Tipo de error: " << N.what() << std::endl;
234 void TDepVolVariable::IniciaVolumen(
double Theta) {
236 FAngulo = Theta - FDesfase;
237 FVolumen = CalculaVolumen(FAngulo, FCarrera, FLBiela, FDiametro, FVolumenMuerto);
238 FMasa = FVolumen * FGamma * __units::BarToPa(FPressure) /
pow2(FAsonido * __cons::ARef);
239 FVolumen0 = FVolumen;
240 }
catch(exception &N) {
241 std::cout <<
"ERROR: TDepVolVariable::IniciaVolumen en el compresor volumetrico: " << FNumeroCompresorVol << std::endl;
242 std::cout <<
"Tipo de error: " << N.what() << std::endl;
247 void TDepVolVariable::UpdateProperties0DModel(
double TimeCalculo) {
249 ActualizaPropiedades(TimeCalculo);
251 AcumulaResultadosMedios(TimeCalculo);
255 void TDepVolVariable::UpdateSpeed(
double NewSpeed) {
256 FRegimen = NewSpeed * FRelacionVelocidades;
262 #pragma package(smart_init)