31 #include "TUnionDireccional.h"
33 #include "TCCDeposito.h"
34 #include "TCondicionContorno.h"
36 #include "TTipoValvula.h"
41 TUnionDireccional::TUnionDireccional(
int i,
int NUnionDireccional, nmTipoCalculoEspecies SpeciesModel,
42 int numeroespecies, nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
43 TDepVolCteBase(i, nmUnionDireccional, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
45 FNumUnionDireccional = NUnionDireccional;
49 FSentidoEntrada = NULL;
50 FCDSalidaInicial = NULL;
51 FVelocidadCorte = NULL;
62 TUnionDireccional::~TUnionDireccional() {
64 if(FNodoEntrada != NULL)
65 delete[] FNodoEntrada;
66 if(FSentidoEntrada != NULL)
67 delete[] FSentidoEntrada;
68 if(FCDSalidaInicial != NULL)
69 delete[] FCDSalidaInicial;
70 if(FVelocidadCorte != NULL)
71 delete[] FVelocidadCorte;
72 if(FVelocidadFin != NULL)
73 delete[] FVelocidadFin;
81 if(FCCEntrada != NULL)
89 void TUnionDireccional::LeeDatosUnionDireccional(
const char *FileWAM, fpos_t &filepos) {
93 FNodoEntrada =
new int[2];
94 FSentidoEntrada =
new int[2];
95 FCDSalidaInicial =
new double[2];
96 FVelocidadCorte =
new double[2];
97 FVelocidadFin =
new double[2];
98 FVelocity =
new double[2];
99 FCoefA =
new double[2];
100 FCoefB =
new double[2];
104 FILE *fich = fopen(FileWAM,
"r");
105 fsetpos(fich, &filepos);
107 fscanf(fich,
"%d ", &numid);
108 fscanf(fich,
"%d %d %d ", &FNodoEntrada[0], &FNodoEntrada[1], &FNodoSalida);
111 fscanf(fich,
"%lf %lf %lf ", &FCDSalidaInicial[0], &FVelocidadCorte[0], &FVelocidadFin[0]);
112 fscanf(fich,
"%lf %lf %lf ", &FCDSalidaInicial[1], &FVelocidadCorte[1], &FVelocidadFin[1]);
114 fgetpos(fich, &filepos);
117 FCoefA[0] = -FCDSalidaInicial[0] * FVelocidadFin[0] / (FVelocidadCorte[0] - FVelocidadFin[0]);
118 FCoefB[0] = FCDSalidaInicial[0] / (FVelocidadCorte[0] - FVelocidadFin[0]);
119 FCoefA[1] = -FCDSalidaInicial[1] * FVelocidadFin[1] / (FVelocidadCorte[1] - FVelocidadFin[1]);
120 FCoefB[1] = FCDSalidaInicial[1] / (FVelocidadCorte[1] - FVelocidadFin[1]);
122 }
catch(exception & N) {
123 std::cout <<
"ERROR: TUnionDireccional::LeeDatosUnionDireccional en el deposito: " << FNumeroDeposito << std::endl;
124 std::cout <<
"Tipo de error: " << N.what() << std::endl;
132 void TUnionDireccional::AsignaCCUnionDireccional() {
135 if(FTipoDeposito == nmUnionDireccional) {
136 for(
int i = 0; i < FNumeroUniones; i++) {
137 if(FCCDeposito[i]->getNumeroCC() == FNodoEntrada[0]) {
138 FCCEntrada[0] = FCCDeposito[i];
139 }
else if(FCCDeposito[i]->getNumeroCC() == FNodoEntrada[1]) {
140 FCCEntrada[1] = FCCDeposito[i];
141 }
else if(FCCDeposito[i]->getNumeroCC() == FNodoSalida) {
142 FCCSalida = FCCDeposito[i];
147 }
catch(exception & N) {
148 std::cout <<
"ERROR: TUnionDireccional::AsignaCCUnionDireccional en la union direccional " << FNumUnionDireccional <<
150 std::cout <<
"Tipo de error: " << N.what() << std::endl;
158 void TUnionDireccional::ActualizaPropiedades(
double TimeCalculo) {
162 double MasaEntrante, FraccionMasicaAcum = 0.;
164 double g = 0., v = 0., a = 0., m = 0.;
170 DeltaT = TimeCalculo - FTime;
172 if(FCalculoEspecies == nmCalculoCompleto) {
174 FRMezcla = CalculoCompletoRMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2], 0,
175 FCalculoGamma, nmMEP);
176 FCpMezcla = CalculoCompletoCpMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FFraccionMasicaEspecie[2], 0,
177 __units::degCToK(FTemperature), FCalculoGamma, nmMEP);
178 FGamma = CalculoCompletoGamma(FRMezcla, FCpMezcla, FCalculoGamma);
180 }
else if(FCalculoEspecies == nmCalculoSimple) {
182 FRMezcla = CalculoSimpleRMezcla(FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1], FCalculoGamma, nmMEP);
183 FCvMezcla = CalculoSimpleCvMezcla(__units::degCToK(FTemperature), FFraccionMasicaEspecie[0], FFraccionMasicaEspecie[1],
184 FCalculoGamma, nmMEP);
185 FGamma = CalculoSimpleGamma(FRMezcla, FCvMezcla, FCalculoGamma);
189 bool Converge =
false;
190 bool FirstStep =
true;
192 double Asonido0 = FAsonido;
193 double Asonido1 = FAsonido;
199 for(
int i = 0; i < FNumeroUniones; i++) {
200 if(
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getSentidoFlujo() == nmEntrante) {
202 }
else if(
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getSentidoFlujo() == nmSaliente) {
205 g = (double) -
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getMassflow();
206 v = (double) SignoFlujo *
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getVelocity();
207 a =
dynamic_cast<TCCDeposito*
>(FCCDeposito[i])->getSpeedSound();
208 m = g * DeltaT * FCCDeposito[i]->GetTuboExtremo(0).Pipe->getNumeroConductos();
211 for(
int j = 0; j < FNumeroEspecies - FIntEGR; j++) {
212 FMasaEspecie[j] += FCCDeposito[i]->GetFraccionMasicaEspecie(j) * m;
216 H += EntalpiaEntrada(a, v, m, FAsonido, FMasa, FCCDeposito[i]->getGamma());
221 FMasa = FMasa0 + MasaEntrante;
222 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
223 FFraccionMasicaEspecie[j] = FMasaEspecie[j] / FMasa;
224 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
226 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
228 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FMasaEspecie[FNumeroEspecies - 1] / FMasa;
233 Energia = pow(FMasa / FMasa0 * exp((H + H0) / 2), __Gamma::G1(FGamma));
234 Asonido1 = FAsonido * sqrt(Energia);
235 Error = (Diff = Asonido1 - Asonido0, fabs(Diff)) / Asonido1;
243 FTemperature = __units::KTodegC(
pow2(FAsonido * __cons::ARef) / (FGamma * FRMezcla));
244 FPressure = __units::PaToBar(
pow2(__cons::ARef * FAsonido) / FGamma / FVolumen * FMasa);
245 FPresionIsen = pow(FPressure / FPresRef, __Gamma::G5(FGamma));
247 }
catch(exception & N) {
248 std::cout <<
"ERROR: TUnionDireccional::ActualizaPropiedades en la union direccional: " << FNumUnionDireccional <<
250 std::cout <<
"Tipo de error: " << N.what() << std::endl;
258 void TUnionDireccional::CalculoUnionDireccional() {
261 double coefA = 0., coefB = 0.;
264 for(
int i = 0; i < 2; i++) {
265 if(
dynamic_cast<TCCDeposito*
>(FCCEntrada[i])->getSentidoFlujo() == nmEntrante) {
266 FSentidoEntrada[i] = 1;
267 }
else if(
dynamic_cast<TCCDeposito*
>(FCCEntrada[i])->getSentidoFlujo() == nmSaliente) {
268 FSentidoEntrada[i] = -1;
270 FSentidoEntrada[i] = 0;
271 FVelocity[i] = FSentidoEntrada[i] *
dynamic_cast<TCCDeposito*
>(FCCEntrada[i])->getVelocity() * __cons::ARef;
275 if(FVelocity[1] <= FVelocidadCorte[0]) {
276 dynamic_cast<TCCDeposito*
>(FCCEntrada[0])->PutCDSalida(FCDSalidaInicial[0]);
277 }
else if(FVelocity[1] >= FVelocidadFin[0]) {
278 dynamic_cast<TCCDeposito*
>(FCCEntrada[0])->PutCDSalida(0);
280 dynamic_cast<TCCDeposito*
>(FCCEntrada[0])->PutCDSalida(FCoefA[0] + FCoefB[0] * FVelocity[1]);
285 if(FVelocity[0] <= FVelocidadCorte[1]) {
286 dynamic_cast<TCCDeposito*
>(FCCEntrada[1])->PutCDSalida(FCDSalidaInicial[1]);
287 }
else if(FVelocity[0] >= FVelocidadFin[0]) {
288 dynamic_cast<TCCDeposito*
>(FCCEntrada[1])->PutCDSalida(0);
290 dynamic_cast<TCCDeposito*
>(FCCEntrada[1])->PutCDSalida(FCoefA[1] + FCoefB[1] * FVelocity[0]);
294 }
catch(exception & N) {
295 std::cout <<
"ERROR: TUnionDireccional::CalculoUnionDireccional en la union direccional: " << FNumUnionDireccional <<
297 std::cout <<
"Tipo de error: " << N.what() << std::endl;
302 void TUnionDireccional::UpdateProperties0DModel(
double TimeCalculo) {
303 ActualizaPropiedades(TimeCalculo);
305 CalculoUnionDireccional();
307 AcumulaResultadosMedios(TimeCalculo);
314 #pragma package(smart_init)