31 #include "TCCUnionEntreTubos.h"
39 TCCUnionEntreTubos::TCCUnionEntreTubos(nmTypeBC TipoCC,
int numCC, nmTipoCalculoEspecies SpeciesModel,
40 int numeroespecies, nmCalculoGamma GammaCalculation,
bool ThereIsEGR) :
41 TCondicionContorno(TipoCC, numCC, SpeciesModel, numeroespecies, GammaCalculation, ThereIsEGR) {
55 TCCUnionEntreTubos::~TCCUnionEntreTubos() {
57 if(FTuboExtremo != NULL)
58 delete[] FTuboExtremo;
63 if(FNumeroTubo != NULL)
77 void TCCUnionEntreTubos::ReadBoundaryData(
const char *FileWAM, fpos_t &filepos,
int NumberOfPipes,
TTubo **Pipe,
78 int nDPF,
TDPF **DPF) {
86 FNodoFin =
new int[2];
87 FIndiceCC =
new int[2];
90 FNumeroTubo =
new int[2];
93 for(
int i = 0; i < 2; i++) {
94 FTuboExtremo[i].Pipe = NULL;
97 while(FNumeroTubosCC < 2 && i < NumberOfPipes) {
98 if(Pipe[i]->getNodoIzq() == FNumeroCC || Pipe[i]->getNodoDer() == FNumeroCC) {
99 FTubo[FNumeroTubosCC] = i;
100 if(Pipe[FTubo[FNumeroTubosCC]]->getNodoIzq() == FNumeroCC) {
101 FNodoFin[FNumeroTubosCC] = 0;
103 if(Pipe[FTubo[FNumeroTubosCC]]->getNodoDer() == FNumeroCC) {
104 FNodoFin[FNumeroTubosCC] = Pipe[FTubo[FNumeroTubosCC]]->getNin() - 1;
113 if(Pipe[FTubo[0]]->GetDiametro(FNodoFin[0]) >= Pipe[FTubo[1]]->GetDiametro(FNodoFin[1])) {
114 if(Pipe[FTubo[0]]->getNodoIzq() == FNumeroCC) {
115 FTuboExtremo[1].Pipe = Pipe[FTubo[0]];
116 FTuboExtremo[1].TipoExtremo = nmLeft;
119 FNumeroTubo[1] = FTubo[0];
120 FCC[1] = &(FTuboExtremo[1].Beta);
121 FCD[1] = &(FTuboExtremo[1].Landa);
123 if(Pipe[FTubo[0]]->getNodoDer() == FNumeroCC) {
124 FTuboExtremo[1].Pipe = Pipe[FTubo[0]];
125 FTuboExtremo[1].TipoExtremo = nmRight;
126 FNodoFin[1] = Pipe[FTubo[0]]->getNin() - 1;
128 FNumeroTubo[1] = FTubo[0];
129 FCC[1] = &(FTuboExtremo[1].Landa);
130 FCD[1] = &(FTuboExtremo[1].Beta);
132 if(Pipe[FTubo[1]]->getNodoIzq() == FNumeroCC) {
133 FTuboExtremo[0].Pipe = Pipe[FTubo[1]];
134 FTuboExtremo[0].TipoExtremo = nmLeft;
137 FNumeroTubo[0] = FTubo[1];
138 FCC[0] = &(FTuboExtremo[0].Beta);
139 FCD[0] = &(FTuboExtremo[0].Landa);
141 if(Pipe[FTubo[1]]->getNodoDer() == FNumeroCC) {
142 FTuboExtremo[0].Pipe = Pipe[FTubo[1]];
143 FTuboExtremo[0].TipoExtremo = nmRight;
144 FNodoFin[0] = Pipe[FTubo[1]]->getNin() - 1;
146 FNumeroTubo[0] = FTubo[1];
147 FCC[0] = &(FTuboExtremo[0].Landa);
148 FCD[0] = &(FTuboExtremo[0].Beta);
152 if(Pipe[FTubo[1]]->getNodoIzq() == FNumeroCC) {
153 FTuboExtremo[1].Pipe = Pipe[FTubo[1]];
154 FTuboExtremo[1].TipoExtremo = nmLeft;
157 FNumeroTubo[1] = FTubo[1];
158 FCC[1] = &(FTuboExtremo[1].Beta);
159 FCD[1] = &(FTuboExtremo[1].Landa);
161 if(Pipe[FTubo[1]]->getNodoDer() == FNumeroCC) {
162 FTuboExtremo[1].Pipe = Pipe[FTubo[1]];
163 FTuboExtremo[1].TipoExtremo = nmRight;
164 FNodoFin[1] = Pipe[FTubo[1]]->getNin() - 1;
166 FNumeroTubo[1] = FTubo[1];
167 FCC[1] = &(FTuboExtremo[1].Landa);
168 FCD[1] = &(FTuboExtremo[1].Beta);
170 if(Pipe[FTubo[0]]->getNodoIzq() == FNumeroCC) {
171 FTuboExtremo[0].Pipe = Pipe[FTubo[0]];
172 FTuboExtremo[0].TipoExtremo = nmLeft;
175 FNumeroTubo[0] = FTubo[0];
176 FCC[0] = &(FTuboExtremo[0].Beta);
177 FCD[0] = &(FTuboExtremo[0].Landa);
179 if(Pipe[FTubo[0]]->getNodoDer() == FNumeroCC) {
180 FTuboExtremo[0].Pipe = Pipe[FTubo[0]];
181 FTuboExtremo[0].TipoExtremo = nmRight;
182 FNodoFin[0] = Pipe[FTubo[0]]->getNin() - 1;
184 FNumeroTubo[0] = FTubo[0];
185 FCC[0] = &(FTuboExtremo[0].Landa);
186 FCD[0] = &(FTuboExtremo[0].Beta);
191 FFraccionMasicaEspecie =
new double[FNumeroEspecies - FIntEGR];
192 for(
int i = 0; i < FNumeroEspecies - FIntEGR; i++) {
197 FILE *fich = fopen(FileWAM,
"r");
198 fsetpos(fich, &filepos);
200 fscanf(fich,
"%lf %lf", &FEspesor, &FConductividad);
203 fgetpos(fich, &filepos);
206 }
catch(exception & N) {
207 std::cout <<
"ERROR: TCCUnionEntreTubos::LeeUnionEntreTubos en la condicion de contorno: " << FNumeroCC << std::endl;
208 std::cout <<
"Tipo de error: " << N.what() << std::endl;
216 void TCCUnionEntreTubos::TuboCalculandose(
int TuboActual) {
218 FTuboActual = TuboActual;
219 }
catch(exception & N) {
220 std::cout <<
"ERROR: TCCUnionEntreTubos::TuboCalculandose en la condicion de contorno: " << FNumeroCC << std::endl;
221 std::cout <<
"Tipo de error: " << N.what() << std::endl;
229 void TCCUnionEntreTubos::CalculaCondicionContorno(
double Time) {
231 double rel_entropia = 0., rel_area = 0., vel_sonido_In = 0., vel_sonido_Out = 0., vel_In = 0., vel_Out = 0.,
232 correc_sonido_In = 0.;
233 double flujo, FraccionMasicaAcum = 0., exd, exi;
234 int TuboCalculado = 0;
236 if(FTuboActual == 10000) {
237 TuboCalculado = FTuboActual;
238 FGamma = FTuboExtremo[0].Pipe->
GetGamma(FNodoFin[0]);
240 for(
int i = 0; i < FNumeroTubosCC; i++) {
241 if(FNumeroTubo[i] == FTuboActual) {
245 FGamma = FTuboExtremo[TuboCalculado].Pipe->
GetGamma(FNodoFin[TuboCalculado]);
248 FGamma3 = __Gamma::G3(FGamma);
249 FGamma2 = __Gamma::G2(FGamma);
250 FGamma1 = __Gamma::G1(FGamma);
253 flujo = (*FCC[1] / FTuboExtremo[1].Entropia) / (*FCC[0] / FTuboExtremo[0].Entropia);
254 if(flujo < 0.999995) {
255 rel_entropia = FTuboExtremo[0].Entropia / FTuboExtremo[1].Entropia;
256 rel_area =
pow2(FTuboExtremo[1].Pipe->
GetDiametro(FNodoFin[1]) / FTuboExtremo[0].Pipe->GetDiametro(FNodoFin[0]));
261 exi = *FCC[0] * 2. / FGamma2;
264 stExpansion EnsA1(*FCC[0], *FCC[1], rel_entropia, rel_area, FGamma);
265 vel_sonido_Out =
FindRoot(EnsA1, exi, exd);
268 vel_sonido_In = EnsA1.A2;
269 correc_sonido_In = EnsA1.xx3;
273 if(TuboCalculado == 1) {
274 *FCD[1] = vel_sonido_In + FGamma3 * vel_In;
275 *FCC[1] = vel_sonido_In - FGamma3 * vel_In;
276 FTuboExtremo[1].Entropia = vel_sonido_In * FTuboExtremo[1].Entropia / correc_sonido_In;
278 }
else if(TuboCalculado == 0) {
279 *FCD[0] = vel_sonido_Out - FGamma3 * vel_Out;
281 }
else if(TuboCalculado == 10000) {
282 *FCD[1] = vel_sonido_In + FGamma3 * vel_In;
283 *FCC[1] = vel_sonido_In - FGamma3 * vel_In;
284 FTuboExtremo[1].Entropia = vel_sonido_In * FTuboExtremo[1].Entropia / correc_sonido_In;
285 *FCD[0] = vel_sonido_Out - FGamma3 * vel_Out;
290 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
292 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
294 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
296 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FTuboExtremo[0].Pipe->
GetFraccionMasicaCC(FIndiceCC[0],
297 FNumeroEspecies - 1);
299 }
else if(flujo > 1.000005) {
301 rel_entropia = FTuboExtremo[0].Entropia / FTuboExtremo[1].Entropia;
302 rel_area =
pow2(FTuboExtremo[0].Pipe->
GetDiametro(FNodoFin[0]) / FTuboExtremo[1].Pipe->GetDiametro(FNodoFin[1]));
308 exd = *FCC[1] * 2. / FGamma2;
310 stContraction EstU1(*FCC[1], *FCC[0], rel_entropia, rel_area, FGamma);
311 vel_Out =
FindRoot(EstU1, exi, exd);
312 vel_sonido_In = EstU1.A2;
313 vel_sonido_Out = EstU1.A1;
316 if(TuboCalculado == 0) {
317 *FCD[0] = vel_sonido_In + FGamma3 * vel_In;
318 *FCC[0] = vel_sonido_In - FGamma3 * vel_In;
319 FTuboExtremo[0].Entropia = FTuboExtremo[1].Entropia;
321 }
else if(TuboCalculado == 1) {
322 *FCD[1] = vel_sonido_Out - FGamma3 * vel_Out;
324 }
else if(TuboCalculado == 10000) {
325 *FCD[0] = vel_sonido_In + FGamma3 * vel_In;
326 *FCC[0] = vel_sonido_In - FGamma3 * vel_In;
327 FTuboExtremo[0].Entropia = FTuboExtremo[1].Entropia;
328 *FCD[1] = vel_sonido_Out - FGamma3 * vel_Out;
333 for(
int j = 0; j < FNumeroEspecies - 2; j++) {
335 FraccionMasicaAcum += FFraccionMasicaEspecie[j];
337 FFraccionMasicaEspecie[FNumeroEspecies - 2] = 1. - FraccionMasicaAcum;
339 FFraccionMasicaEspecie[FNumeroEspecies - 1] = FTuboExtremo[1].Pipe->
GetFraccionMasicaCC(FIndiceCC[1],
340 FNumeroEspecies - 1);
344 if(TuboCalculado == 0) {
346 }
else if(TuboCalculado == 1) {
348 }
else if(TuboCalculado == 10000) {
355 }
catch(exception & N) {
356 std::cout <<
"ERROR: TCCUnionEntreTubos::CalculaCondicionContorno en la condicion de contorno: " << FNumeroCC <<
358 std::cout <<
"Tipo de error: " << N.what() << std::endl;