31 #include "TLumbrera.h"
32 #include "TCilindro.h"
36 TLumbrera::TLumbrera(
double Biela,
double Carrera) :
49 TLumbrera::~TLumbrera() {
56 TLumbrera::TLumbrera(
TLumbrera *Origen,
int Valvula) :
60 FAltura = Origen->FAltura;
61 FAnchura = Origen->FAnchura;
62 FRadioSup = Origen->FRadioSup;
63 FRadioInf = Origen->FRadioInf;
64 FPosicionPMI = Origen->FPosicionPMI;
65 FDiametroRef = Origen->FDiametroRef;
67 FDiamRef = FDiametroRef;
69 FNumeroOrden = Origen->FNumeroOrden;
71 FNumCD = Origen->FNumCD;
73 FAnguloApertura = Origen->FAnguloApertura;
74 FAnguloCierre = Origen->FAnguloCierre;
75 FBiela = Origen->FBiela;
76 FCarrera = Origen->FCarrera;
78 FApertura.resize(Origen->FApertura.size());
79 FDatosCDEntrada.resize(Origen->FDatosCDEntrada.size());
80 FDatosCDSalida.resize(Origen->FDatosCDSalida.size());
82 for(
int i = 0; i < FNumCD; i++) {
83 FApertura[i] = Origen->FApertura[i];
84 FDatosCDEntrada[i] = Origen->FDatosCDEntrada[i];
85 FDatosCDSalida[i] = Origen->FDatosCDSalida[i];
94 void TLumbrera::LeeDatosIniciales(
const char *FileWAM, fpos_t &filepos,
int norden,
bool HayMotor,
98 FILE *fich = fopen(FileWAM,
"r");
99 fsetpos(fich, &filepos);
101 FNumeroOrden = norden;
103 fscanf(fich,
"%lf %lf %lf %lf %lf %lf ", &FAltura, &FAnchura, &FRadioSup, &FRadioInf, &FPosicionPMI, &FDiametroRef);
104 fscanf(fich,
"%d ", &FNumCD);
106 FApertura.resize(FNumCD);
107 FDatosCDEntrada.resize(FNumCD);
108 FDatosCDSalida.resize(FNumCD);
110 for(
int j = 0; j < FNumCD; ++j) {
111 fscanf(fich,
"%lf ", &FApertura[j]);
113 for(
int j = 0; j < FNumCD; ++j) {
114 fscanf(fich,
"%lf ", &FDatosCDEntrada[j]);
116 for(
int j = 0; j < FNumCD; ++j) {
117 fscanf(fich,
"%lf ", &FDatosCDSalida[j]);
120 CalculateOpeningANDClose();
122 fgetpos(fich, &filepos);
125 }
catch(exception &N) {
126 std::cout <<
"ERROR: LeeDatosIniciales Lumbrera" << std::endl;
136 void TLumbrera::CalculaCD(
double Angulo) {
138 FApertActual = FAltura + FPosicionPMI - CalculaDistPMI(Angulo);
140 if(FApertActual <= 0) {
145 FCDTubVol = fun_CDin->interp(FApertActual);
146 FCDVolTub = fun_CDout->interp(FApertActual);
150 void TLumbrera::GetCDin(
double Time) {
152 double Angulo = FCylinder->getAnguloActual();
154 FApertActual = FAltura + FPosicionPMI - CalculaDistPMI(Angulo);
156 if(FApertActual <= 0) {
160 FCDTubVol = fun_CDin->interp(FApertActual);
164 void TLumbrera::GetCDout(
double Time) {
166 double Angulo = FCylinder->getAnguloActual();
168 FApertActual = FAltura + FPosicionPMI - CalculaDistPMI(Angulo);
170 if(FApertActual <= 0) {
174 FCDVolTub = fun_CDout->interp(FApertActual);
181 inline double TLumbrera::CalculaDistPMI(
double x) {
183 double c = __units::DegToRad(x);
185 return FCarrera - (FBiela + FCarrera * (1. - cos(c)) / 2. - sqrt(
pow2(FBiela) -
pow2(FCarrera * sin(c) / 2.)));
188 inline double TLumbrera::CalculaApertura(
double x) {
189 return FAltura + FPosicionPMI - CalculaDistPMI(x);
192 void TLumbrera::CalculateOpeningANDClose() {
193 bool ang_found =
false;
196 double apt0 = FAltura + FPosicionPMI - CalculaDistPMI(ang0);
197 double apt1 = FAltura + FPosicionPMI - CalculaDistPMI(ang1);
198 double ang = 0., apt = 0.;
199 while(ang1 - ang0 > 0.01) {
200 ang = (ang1 + ang0) / 2.;
201 apt = FAltura + FPosicionPMI - CalculaDistPMI(ang);
210 FAnguloApertura = ang;
211 FAnguloCierre = 360. - ang;
215 #pragma package(smart_init)