31 #include "TCCDescargaExtremoAbierto.h"
37 TCCDescargaExtremoAbierto::TCCDescargaExtremoAbierto(nmTypeBC TipoCC,
int numCC, nmTipoCalculoEspecies SpeciesModel,
38 int numeroespecies, nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
39 TCondicionContorno(TipoCC, numCC, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
40 if(TipoCC == nmOpenEndAtmosphere) {
41 FTipoDescarga = nmDescargaAtmosfera;
42 }
else if(TipoCC == nmOpenEndReservoir) {
43 FTipoDescarga = nmDescargaRemanso;
44 }
else if(TipoCC == nmOpenEndCalcExtern) {
45 FTipoDescarga = nmDescargaRemansoMatlab;
47 printf(
"ERROR:TCCDescargaExtremoAbierto:Asignacion Tipo BC,en la condicion de contorno: %d\n", FNumeroCC);
51 FVelocidadSonidoDep = 0;
58 TCCDescargaExtremoAbierto::~TCCDescargaExtremoAbierto() {
59 delete[] FTuboExtremo;
60 if(FComposicion != NULL)
61 delete[] FComposicion;
67 void TCCDescargaExtremoAbierto::AsignAmbientConditions(
double Tamb,
double Pamb,
double *AtmosphericComposition) {
69 double RMezclaDep = 0., CvMezclaDep = 0., CpMezclaDep = 0., GammaDep = 0.;
70 int modeladoescape = 0;
73 FTemperaturaDep = Tamb;
75 FFraccionMasicaEspecie =
new double[FNumeroEspecies - FIntEGR];
76 FComposicion =
new double[FNumeroEspecies - FIntEGR];
77 for(
int i = 0; i < FNumeroEspecies - FIntEGR; i++) {
78 FComposicion[i] = AtmosphericComposition[i];
81 if(FCalculoEspecies == nmCalculoCompleto) {
83 RMezclaDep = CalculoCompletoRMezcla(FComposicion[0], FComposicion[1], FComposicion[2], 0, FCalculoGamma, nmMEP);
84 CpMezclaDep = CalculoCompletoCpMezcla(FComposicion[0], FComposicion[1], FComposicion[2], 0,
85 __units::degCToK(FTemperaturaDep), FCalculoGamma, nmMEP);
86 GammaDep = CalculoCompletoGamma(RMezclaDep, CpMezclaDep, FCalculoGamma);
88 }
else if(FCalculoEspecies == nmCalculoSimple) {
90 RMezclaDep = CalculoSimpleRMezcla(FComposicion[0], 0, FCalculoGamma, nmMEP);
91 CvMezclaDep = CalculoSimpleCvMezcla(__units::degCToK(FTemperaturaDep), FComposicion[0], 0, FCalculoGamma, nmMEP);
92 GammaDep = CalculoSimpleGamma(RMezclaDep, CvMezclaDep, FCalculoGamma);
95 FVelocidadSonidoDep = sqrt(__units::degCToK(FTemperaturaDep) * GammaDep * RMezclaDep) / __cons::ARef;
102 void TCCDescargaExtremoAbierto::ReadBoundaryData(
const char *FileWAM, fpos_t &filepos,
int NumberOfPipes,
TTubo **Pipe,
103 int nDPF,
TDPF **DPF) {
106 double fracciontotal = 0.;
107 double RMezclaDep = 0., CvMezclaDep = 0., CpMezclaDep = 0., GammaDep = 0.;
108 int modeladoescape = 0;
111 FTuboExtremo[0].Pipe = NULL;
115 while(FNumeroTubosCC < 1 && i < NumberOfPipes) {
116 if(Pipe[i]->getNodoIzq() == FNumeroCC) {
117 FTuboExtremo[FNumeroTubosCC].Pipe = Pipe[i];
118 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmLeft;
119 FCC = &(FTuboExtremo[FNumeroTubosCC].Beta);
120 FCD = &(FTuboExtremo[FNumeroTubosCC].Landa);
125 if(Pipe[i]->getNodoDer() == FNumeroCC) {
126 FTuboExtremo[FNumeroTubosCC].Pipe = Pipe[i];
127 FTuboExtremo[FNumeroTubosCC].TipoExtremo = nmRight;
128 FCC = &(FTuboExtremo[FNumeroTubosCC].Landa);
129 FCD = &(FTuboExtremo[FNumeroTubosCC].Beta);
130 FNodoFin = FTuboExtremo[FNumeroTubosCC].Pipe->getNin() - 1;
137 FILE *fich = fopen(FileWAM,
"r");
138 fsetpos(fich, &filepos);
140 if(FTipoDescarga == nmDescargaAtmosfera) {
141 fscanf(fich,
"%lf ", &FPerdidaExtremo);
143 }
else if(FTipoDescarga == nmDescargaRemanso) {
144 fscanf(fich,
"%lf %lf %lf ", &FPressure, &FTemperaturaDep, &FPerdidaExtremo);
147 fscanf(fich,
"%d ", &modeladoescape);
148 modeladoescape == 0 ? FModeladoEscape = false : FModeladoEscape =
true;
151 FFraccionMasicaEspecie =
new double[FNumeroEspecies - FIntEGR];
152 FComposicion =
new double[FNumeroEspecies - FIntEGR];
153 for(
int i = 0; i < FNumeroEspecies - 1; i++) {
154 fscanf(fich,
"%lf ", &FComposicion[i]);
156 fracciontotal += FComposicion[i];
160 if(FCalculoEspecies == nmCalculoCompleto) {
161 if(FComposicion[0] > 0.20)
162 FComposicion[FNumeroEspecies - 1] = 0.;
164 FComposicion[FNumeroEspecies - 1] = 1.;
166 if(FComposicion[0] > 0.50)
167 FComposicion[FNumeroEspecies - 1] = 1.;
169 FComposicion[FNumeroEspecies - 1] = 0.;
172 if(fracciontotal < 1. - 1e-10 || fracciontotal > 1. + 1e-10) {
173 std::cout <<
"ERROR: Total mass fraction must be equal to 1. Check the input data for boundary condition " << FNumeroCC
177 if(FCalculoEspecies == nmCalculoCompleto) {
179 RMezclaDep = CalculoCompletoRMezcla(FComposicion[0], FComposicion[1], FComposicion[2], 0, FCalculoGamma, nmMEP);
180 CpMezclaDep = CalculoCompletoCpMezcla(FComposicion[0], FComposicion[1], FComposicion[2], 0,
181 __units::degCToK(FTemperaturaDep), FCalculoGamma, nmMEP);
182 GammaDep = CalculoCompletoGamma(RMezclaDep, CpMezclaDep, FCalculoGamma);
184 }
else if(FCalculoEspecies == nmCalculoSimple) {
186 RMezclaDep = CalculoSimpleRMezcla(FComposicion[0], 0, FCalculoGamma, nmMEP);
187 CvMezclaDep = CalculoSimpleCvMezcla(__units::degCToK(FTemperaturaDep), FComposicion[0], 0, FCalculoGamma, nmMEP);
188 GammaDep = CalculoSimpleGamma(RMezclaDep, CvMezclaDep, FCalculoGamma);
191 FVelocidadSonidoDep = sqrt(__units::degCToK(FTemperaturaDep) * GammaDep * RMezclaDep) / __cons::ARef;
193 }
else if(FTipoDescarga == nmDescargaRemansoMatlab) {
194 fscanf(fich,
"%lf %lf %lf ", &FPressure, &FTemperaturaDep, &FPerdidaExtremo);
197 fscanf(fich,
"%d ", &modeladoescape);
198 modeladoescape == 0 ? FModeladoEscape = false : FModeladoEscape =
true;
201 FFraccionMasicaEspecie =
new double[FNumeroEspecies - FIntEGR];
202 FComposicion =
new double[FNumeroEspecies - FIntEGR];
203 for(
int i = 0; i < FNumeroEspecies - 1; i++) {
204 fscanf(fich,
"%lf ", &FComposicion[i]);
206 fracciontotal += FComposicion[i];
210 if(FCalculoEspecies == nmCalculoCompleto) {
211 if(FComposicion[0] > 0.2)
212 FComposicion[FNumeroEspecies - 1] = 0.;
214 FComposicion[FNumeroEspecies - 1] = 1.;
216 if(FComposicion[0] > 0.5)
217 FComposicion[FNumeroEspecies - 1] = 1.;
219 FComposicion[FNumeroEspecies - 1] = 0.;
222 if(fracciontotal != 1.) {
224 "ERROR: La fraccion masica total no puede ser distinta de 1. Repasa la lectura en la condicion de contorno " <<
225 FNumeroCC << std::endl;
228 if(FCalculoEspecies == nmCalculoCompleto) {
230 RMezclaDep = CalculoCompletoRMezcla(FComposicion[0], FComposicion[1], FComposicion[2], 0, FCalculoGamma, nmMEP);
231 CpMezclaDep = CalculoCompletoCpMezcla(FComposicion[0], FComposicion[1], FComposicion[2], 0,
232 __units::degCToK(FTemperaturaDep), FCalculoGamma, nmMEP);
233 GammaDep = CalculoCompletoGamma(RMezclaDep, CpMezclaDep, FCalculoGamma);
235 }
else if(FCalculoEspecies == nmCalculoSimple) {
237 RMezclaDep = CalculoSimpleRMezcla(FComposicion[0], 0, FCalculoGamma, nmMEP);
238 CvMezclaDep = CalculoSimpleCvMezcla(__units::degCToK(FTemperaturaDep), FComposicion[0], 0, FCalculoGamma, nmMEP);
239 GammaDep = CalculoSimpleGamma(RMezclaDep, CvMezclaDep, FCalculoGamma);
242 FVelocidadSonidoDep = sqrt(__units::degCToK(FTemperaturaDep) * GammaDep * RMezclaDep) / __cons::ARef;
245 printf(
"ERROR:TCCDescargaExtremoAbierto::LeeDescargaExtremoAbierto.Asignacion Tipo BC\n");
247 fgetpos(fich, &filepos);
250 }
catch(exception & N) {
251 std::cout <<
"ERROR: TCCDescargaExtremoAbierto::LeeDescargaExtremoAbierto en la condicion de contorno: " << FNumeroCC <<
253 std::cout <<
"Tipo de error: " << N.what() << std::endl;
310 void TCCDescargaExtremoAbierto::CalculaCondicionContorno(
double Time) {
312 double rel_CCon_entropia, yyy, pplo, aap, xyx, b, a2, c, u_isen, a_isen, a_real, u_real;
313 double FraccionMasicaAcum = 0.;
315 FGamma = FTuboExtremo[0].Pipe->
GetGamma(FNodoFin);
316 FGamma3 = __Gamma::G3(FGamma);
318 rel_CCon_entropia = *FCC / FTuboExtremo[0].Entropia;
319 yyy = pow(FPressure / FPref, __Gamma::G5(FGamma));
320 if(rel_CCon_entropia / yyy >= 1.000005) {
324 *FCD = FTuboExtremo[0].Entropia * 2. * yyy - *FCC;
325 pplo = __Gamma::G7(FGamma) * *FCC;
330 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
332 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
334 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
336 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FTuboExtremo[0].Pipe->
GetFraccionMasicaCC(FIndiceCC, FNumeroEspecies - 1);
338 }
else if(rel_CCon_entropia / yyy < .999995) {
342 aap = FVelocidadSonidoDep / yyy;
343 xyx = aap / FTuboExtremo[0].Entropia;
344 b = __Gamma::G1(FGamma) * *FCC *
pow2(xyx) * FPerdidaExtremo;
345 a2 =
pow2(FGamma3 * xyx * FPerdidaExtremo) + FGamma3;
346 c =
pow2(xyx * *FCC) -
pow2(FVelocidadSonidoDep);
347 u_isen = (-b + sqrt(
pow2(b) - a2 * 4. * c)) / (2. * a2);
349 a_isen = sqrt(
pow2(FVelocidadSonidoDep) - FGamma3 *
pow2(u_isen));
350 u_real = u_isen * FPerdidaExtremo;
351 a_real = sqrt(
pow2(FVelocidadSonidoDep) - FGamma3 *
pow2(u_real));
352 aap = a_real / a_isen * aap;
353 if(fabs(u_real) > a_real) {
354 a_real = sqrt(2 / __Gamma::G2(FGamma)) * FVelocidadSonidoDep;
356 aap = FTuboExtremo[0].Entropia * a_real / (*FCC + FGamma3 * u_real);
358 *FCC = a_real - FGamma3 * u_real;
359 *FCD = a_real + FGamma3 * u_real;
360 FTuboExtremo[0].Entropia = aap;
362 if(!FModeladoEscape) {
363 for(
int j = 0; j < FNumeroEspecies - FIntEGR; j++) {
364 FFraccionMasicaEspecie[j] = FComposicion[j];
377 }
catch(exception & N) {
378 std::cout <<
"ERROR: TCCDescargaExtremoAbierto::CalculaCondicionesContorno en la condicion de contorno: " << FNumeroCC
380 std::cout <<
"Tipo de error: " << N.what() << std::endl;
388 #pragma package(smart_init)