33 #include "TCilindro.h"
34 #include "TDeposito.h"
73 TLamina::TLamina(
TLamina *Origen,
int Valvula) :
83 FTipoLamina = Origen->FTipoLamina;
84 FSentidoLamina = Origen->FSentidoLamina;
85 FDiametroRef = Origen->FDiametroRef;
86 FNumeroOrden = Origen->FNumeroOrden;
88 FDiamRef = FDiametroRef;
90 FMasa = Origen->FMasa;
91 FDensidad = Origen->FDensidad;
92 FAmortiguamiento = Origen->FAmortiguamiento;
93 FArea = Origen->FArea;
94 FAnchoPetalo = Origen->FAnchoPetalo;
95 FRigidez = Origen->FRigidez;
96 FModuloYoung = Origen->FModuloYoung;
97 FEspesor = Origen->FEspesor;
98 FNumPestanyas = Origen->FNumPestanyas;
99 FLongitud = Origen->FLongitud;
100 FLongReal = Origen->FLongReal;
102 FKCDE = Origen->FKCDE;
103 FKCDS = Origen->FKCDS;
105 FNumLevCDE = Origen->FNumLevCDE;
106 FNumLevCDS = Origen->FNumLevCDS;
107 FIncrLev = Origen->FIncrLev;
109 FLiftCDin.resize(Origen->FLiftCDin.size());
110 FDatosCDEntrada.resize(Origen->FDatosCDEntrada.size());
111 FLiftCDout.resize(Origen->FLiftCDout.size());
112 FDatosCDSalida.resize(Origen->FDatosCDSalida.size());
113 for(dVector::size_type i = 0; i < FDatosCDEntrada.size(); i++) {
114 FLiftCDin[i] = Origen->FLiftCDin[i];
115 FDatosCDEntrada[i] = Origen->FDatosCDEntrada[i];
119 for(dVector::size_type i = 0; i < FDatosCDSalida.size(); i++) {
120 FLiftCDout[i] = Origen->FLiftCDout[i];
121 FDatosCDSalida[i] = Origen->FDatosCDSalida[i];
125 if(FTipoLamina == nmLamina2D) {
127 FDeltaX = FLongitud / double(FNodosLamina - 1);
128 FNodosFijos = floor((FLongReal - FLongitud) / FDeltaX);
129 FCoefC = FModuloYoung * FEspesor * FEspesor / 12. / FDensidad;
130 FAreaTrans = FEspesor * FAnchoPetalo * FNumPestanyas;
131 FFuerza =
new double[FNodosLamina + FNodosFijos + 2];
132 FLev1 =
new double[FNodosLamina + FNodosFijos + 3];
133 FLev2 =
new double[FNodosLamina + FNodosFijos + 3];
134 FLev3 =
new double[FNodosLamina + FNodosFijos + 3];
135 for(
int i = 0; i < FNodosLamina + FNodosFijos + 3; i++) {
142 FGraficasLam =
false;
149 void TLamina::LeeDatosIniciales(
const char *FileWAM, fpos_t &filepos,
int norden,
bool HayMotor,
TBloqueMotor *Engine) {
151 int tipo = 0, sentido = 0;
153 FILE *fich = fopen(FileWAM,
"r");
154 fsetpos(fich, &filepos);
156 FNumeroOrden = norden;
158 fscanf(fich,
"%d %lf %d ", &tipo, &FDiametroRef, &sentido);
161 FTipoLamina = nmLamina0D;
164 FTipoLamina = nmLamina1D;
167 FTipoLamina = nmLamina2D;
170 std::cout <<
"ERROR: Seleccion Tipo de Lamina" << std::endl;
181 std::cout <<
"ERROR: Seleccion Sentido de Lamina" << std::endl;
185 if(FTipoLamina == nmLamina1D) {
186 fscanf(fich,
"%lf %lf %lf %lf ", &FMasa, &FAmortiguamiento, &FRigidez, &FArea);
187 }
else if(FTipoLamina == nmLamina2D) {
188 fscanf(fich,
"%lf %lf %lf %lf %lf %d %lf %lf ", &FDensidad, &FAmortiguamiento, &FModuloYoung, &FAnchoPetalo, &FEspesor,
189 &FNumPestanyas, &FLongitud, &FLongReal);
191 fscanf(fich,
"%d %d ", &FNumLevCDE, &FNumLevCDS);
193 FLiftCDin.resize(FNumLevCDE);
194 FDatosCDEntrada.resize(FNumLevCDE);
195 FLiftCDout.resize(FNumLevCDS);
196 FDatosCDSalida.resize(FNumLevCDS);
198 fscanf(fich,
"%lf ", &FIncrLev);
199 fscanf(fich,
"%lf %lf ", &FKCDE, &FKCDS);
200 for(
int j = 0; j < FNumLevCDE; ++j) {
201 FLiftCDin[j] = (double) j * FIncrLev;
202 fscanf(fich,
"%lf ", &FDatosCDEntrada[j]);
204 for(
int j = 0; j < FNumLevCDS; ++j) {
205 FLiftCDout[j] = (double) j * FIncrLev;
206 fscanf(fich,
"%lf ", &FDatosCDSalida[j]);
209 fgetpos(fich, &filepos);
211 }
catch(exception &N) {
212 std::cout <<
"ERROR: LeeDatosIniciales Lamina" << std::endl;
222 void TLamina::CalculaCD(
double deltaP,
double ttotal) {
226 double deltaT = ttotal - FTime0;
231 double deltaP2 = deltaP * (double) FSentidoLamina;
233 switch(FTipoLamina) {
236 FCDTubVol = fun_CDin->interp(deltaP2) * FKCDE;
237 FCDVolTub = fun_CDout->interp(deltaP2) * FKCDS;
244 FddLev = (__units::BarToPa(deltaP2) * FArea - FRigidez * FLev - FAmortiguamiento * FdLev) / FMasa;
245 FLev = FLev + FdLev * deltaT + FddLev / 2 *
pow2(deltaT);
246 FdLev = FdLev + FddLev * deltaT;
248 if(FLev > 99999911.0e-3) {
249 FLev = 99999911.0e-3;
253 FCDTubVol = fun_CDin->interp(FLev) * FKCDE;
254 FCDVolTub = fun_CDout->interp(FLev) * FKCDS;
263 for(
int i = 0; i < (FNodosLamina + FNodosFijos + 2); ++i) {
264 FFuerza[i] = __units::BarToPa(deltaP2) * FAnchoPetalo * FNumPestanyas / FDensidad / FAreaTrans;
265 if(i < FNodosFijos + 1) {
268 if(i == FNodosFijos + 1 || i == FNodosFijos + FNodosLamina + 1) {
272 double deltaT2 = deltaT / (double) FBucle;
273 for(
int veces = 0; veces <= FBucle; ++veces) {
275 FLev2[FNodosLamina + FNodosFijos + 2] = 2 * FLev2[FNodosLamina + FNodosFijos + 1] - FLev2[FNodosLamina + FNodosFijos];
276 for(
int i = 2; i <= FNodosLamina + FNodosFijos; ++i) {
277 FDerivada4 = FLev2[i - 2] - 4 * FLev2[i - 1] + 6 * FLev2[i] - 4 * FLev2[i + 1] + FLev2[i + 2];
278 FDerivada4 = FDerivada4 /
pow4(FDeltaX);
279 FLev3[i] =
pow2(deltaT2) * (FFuerza[i] - FCoefC * FDerivada4) + (2 * FAmortiguamiento * deltaT2) * FLev2[i] - FLev1[i];
280 FLev3[i] = FLev3[i] / (1 + FAmortiguamiento * deltaT2);
285 FLev3[FNodosLamina + FNodosFijos + 1] = 2 * FLev3[FNodosLamina + FNodosFijos] - FLev3[FNodosLamina + FNodosFijos - 1];
286 if(FLev3[FNodosLamina + FNodosFijos + 1] < 0.)
287 FLev3[FNodosLamina + FNodosFijos + 1] = 0;
288 for(
int i = 1; i <= FNodosLamina + FNodosFijos + 1; ++i) {
293 FLev = FLev3[FNodosLamina + FNodosFijos + 1];
295 if(FLev > 99999911.0e-3) {
296 FLev = 99999911.0e-3;
300 FCDTubVol = fun_CDin->interp(FLev) * FKCDE;
301 FCDVolTub = fun_CDout->interp(FLev) * FKCDS;
310 FCDTubVol *= FSectionRatio;
311 FCDVolTub *= FSectionRatio;
312 }
catch(exception &N) {
313 std::cout <<
"ERROR: CalculaCD Lamina" << std::endl;
320 void TLamina::GetCDin(
double Time) {
322 double deltaT = Time - FTime0;
327 deltaP = (FPipe->
GetPresion(FPipeNode) - FCylinder->getPressure()) * (
double) FSentidoLamina;
329 deltaP = (FPipe->
GetPresion(FPipeNode) - FPlenum->getPressure()) * (
double) FSentidoLamina;
332 switch(FTipoLamina) {
335 FCDTubVol = fun_CDin->interp(deltaP) * FKCDE;
341 FddLev = (__units::BarToPa(deltaP) * FArea - FRigidez * FLev - FAmortiguamiento * FdLev) / FMasa;
342 FLev = FLev + FdLev * deltaT + FddLev / 2 *
pow2(deltaT);
343 FdLev = FdLev + FddLev * deltaT;
345 if(FLev > 99999911.0e-3) {
346 FLev = 99999911.0e-3;
350 FCDTubVol = fun_CDin->interp(FLev) * FKCDE;
359 for(
int i = 0; i < (FNodosLamina + FNodosFijos + 2); ++i) {
360 FFuerza[i] = __units::BarToPa(deltaP) * FAnchoPetalo * FNumPestanyas / FDensidad / FAreaTrans;
361 if(i < FNodosFijos + 1) {
364 if(i == FNodosFijos + 1 || i == FNodosFijos + FNodosLamina + 1) {
368 double deltaT2 = deltaT / (double) FBucle;
369 for(
int veces = 0; veces <= FBucle; ++veces) {
371 FLev2[FNodosLamina + FNodosFijos + 2] = 2 * FLev2[FNodosLamina + FNodosFijos + 1] - FLev2[FNodosLamina + FNodosFijos];
372 for(
int i = 2; i <= FNodosLamina + FNodosFijos; ++i) {
373 FDerivada4 = FLev2[i - 2] - 4 * FLev2[i - 1] + 6 * FLev2[i] - 4 * FLev2[i + 1] + FLev2[i + 2];
374 FDerivada4 = FDerivada4 /
pow4(FDeltaX);
375 FLev3[i] =
pow2(deltaT2) * (FFuerza[i] - FCoefC * FDerivada4) + (2 * FAmortiguamiento * deltaT2) * FLev2[i] - FLev1[i];
376 FLev3[i] = FLev3[i] / (1 + FAmortiguamiento * deltaT2);
381 FLev3[FNodosLamina + FNodosFijos + 1] = 2 * FLev3[FNodosLamina + FNodosFijos] - FLev3[FNodosLamina + FNodosFijos - 1];
382 if(FLev3[FNodosLamina + FNodosFijos + 1] < 0.)
383 FLev3[FNodosLamina + FNodosFijos + 1] = 0;
384 for(
int i = 1; i <= FNodosLamina + FNodosFijos + 1; ++i) {
389 FLev = FLev3[FNodosLamina + FNodosFijos + 1];
391 if(FLev > 99999911.0e-3) {
392 FLev = 99999911.0e-3;
396 FCDTubVol = fun_CDin->interp(FLev) * FKCDE;
404 FCDTubVol *= FSectionRatio;
407 void TLamina::GetCDout(
double Time) {
409 double deltaT = Time - FTime0;
414 deltaP = (FPipe->
GetPresion(FPipeNode) - FCylinder->getPressure()) * (
double) FSentidoLamina;
416 deltaP = (FPipe->
GetPresion(FPipeNode) - FPlenum->getPressure()) * (
double) FSentidoLamina;
419 switch(FTipoLamina) {
422 FCDVolTub = fun_CDout->interp(deltaP) * FKCDS;
428 FddLev = (__units::BarToPa(deltaP) * FArea - FRigidez * FLev - FAmortiguamiento * FdLev) / FMasa;
429 FLev = FLev + FdLev * deltaT + FddLev / 2 *
pow2(deltaT);
430 FdLev = FdLev + FddLev * deltaT;
432 if(FLev > 99999911.0e-3) {
433 FLev = 99999911.0e-3;
437 FCDVolTub = fun_CDout->interp(FLev) * FKCDS;
445 for(
int i = 0; i < (FNodosLamina + FNodosFijos + 2); ++i) {
446 FFuerza[i] = __units::BarToPa(deltaP) * FAnchoPetalo * FNumPestanyas / FDensidad / FAreaTrans;
447 if(i < FNodosFijos + 1) {
450 if(i == FNodosFijos + 1 || i == FNodosFijos + FNodosLamina + 1) {
454 double deltaT2 = deltaT / (double) FBucle;
455 for(
int veces = 0; veces <= FBucle; ++veces) {
457 FLev2[FNodosLamina + FNodosFijos + 2] = 2 * FLev2[FNodosLamina + FNodosFijos + 1] - FLev2[FNodosLamina + FNodosFijos];
458 for(
int i = 2; i <= FNodosLamina + FNodosFijos; ++i) {
459 FDerivada4 = FLev2[i - 2] - 4 * FLev2[i - 1] + 6 * FLev2[i] - 4 * FLev2[i + 1] + FLev2[i + 2];
460 FDerivada4 = FDerivada4 /
pow4(FDeltaX);
461 FLev3[i] =
pow2(deltaT2) * (FFuerza[i] - FCoefC * FDerivada4) + (2 * FAmortiguamiento * deltaT2) * FLev2[i] - FLev1[i];
462 FLev3[i] = FLev3[i] / (1 + FAmortiguamiento * deltaT2);
467 FLev3[FNodosLamina + FNodosFijos + 1] = 2 * FLev3[FNodosLamina + FNodosFijos] - FLev3[FNodosLamina + FNodosFijos - 1];
468 if(FLev3[FNodosLamina + FNodosFijos + 1] < 0.)
469 FLev3[FNodosLamina + FNodosFijos + 1] = 0;
470 for(
int i = 1; i <= FNodosLamina + FNodosFijos + 1; ++i) {
475 FLev = FLev3[FNodosLamina + FNodosFijos + 1];
477 if(FLev > 99999911.0e-3) {
478 FLev = 99999911.0e-3;
482 FCDVolTub = fun_CDout->interp(FLev) * FKCDS;
490 FCDVolTub *= FSectionRatio;
496 void TLamina::LeeDatosGraficas(
const char *FileWAM, fpos_t &filepos) {
498 int ndv = 0, var = 0;
499 FILE *fich = fopen(FileWAM,
"r");
500 fsetpos(fich, &filepos);
503 fscanf(fich,
" %d", &ndv);
504 for(
int i = 0; i < ndv; i++) {
505 fscanf(fich,
" %d", &var);
512 fgetpos(fich, &filepos);
514 }
catch(exception &N) {
515 std::cout <<
"ERROR: LeeDatosGraficas Lamina" << std::endl;
525 void TLamina::CabeceraGraficaINS(stringstream& insoutput,
int lam) {
533 insoutput << Label.c_str();
537 }
catch(exception &N) {
538 std::cout <<
"ERROR: CabeceraGrafica Lamina" << std::endl;
548 void TLamina::ImprimeGraficaINS(stringstream& insoutput) {
553 insoutput <<
"\t" << FLev;
556 }
catch(exception &N) {
557 std::cout <<
"ERROR: ImprimeGrafica Lamina" << std::endl;
567 #pragma package(smart_init)