31 #include "TValvula4T.h"
32 #include "TCilindro.h"
34 #include "TBloqueMotor.h"
39 TValvula4T::TValvula4T() :
50 FVVTLiftMultiplier = 1.;
52 FVVTDurationMultiplier = 1.;
58 TValvula4T::~TValvula4T() {
69 TValvula4T::TValvula4T(
TValvula4T *Origen,
int Valvula) :
72 FCDEntrada = Origen->FCDEntrada;
73 FCDSalida = Origen->FCDSalida;
74 FDiametro = Origen->FDiametro;
75 FDiametroRef = Origen->FDiametroRef;
76 FAnguloApertura = Origen->FAnguloApertura;
77 FAnguloApertura0 = Origen->FAnguloApertura0;
78 FAnguloCierre = Origen->FAnguloCierre;
79 FCoefTorbMedio = Origen->FCoefTorbMedio;
80 FIncrLev = Origen->FIncrLev;
81 FIncrAng = Origen->FIncrAng;
82 FNumeroOrden = Origen->FNumeroOrden;
83 FAngle0 = Origen->FAngle0;
87 FDiamRef = FDiametroRef;
89 FEngine = Origen->FEngine;
91 FAngle.resize(Origen->FAngle.size());
92 FLevantamiento.resize(Origen->FLevantamiento.size());
93 FDatosCDEntrada.resize(Origen->FDatosCDEntrada.size());
94 FDatosCDSalida.resize(Origen->FDatosCDSalida.size());
95 FDatosTorbellino.resize(Origen->FDatosTorbellino.size());
96 FLiftCD.resize(Origen->FLiftCD.size());
98 for(dVector::size_type i = 0; i < Origen->FAngle.size(); i++) {
99 FAngle[i] = Origen->FAngle[i];
100 FLevantamiento[i] = Origen->FLevantamiento[i];
104 for(dVector::size_type i = 0; i < Origen->FLiftCD.size(); i++) {
105 FLiftCD[i] = Origen->FLiftCD[i];
106 FDatosCDEntrada[i] = Origen->FDatosCDEntrada[i];
107 FDatosCDSalida[i] = Origen->FDatosCDSalida[i];
108 FDatosTorbellino[i] = Origen->FDatosTorbellino[i];
115 FRegimen = Origen->getRegimen();
116 FRelacionVelocidades = Origen->getRelacionVelocidades();
117 FControlRegimen = Origen->getControlRegimen();
119 FVVTLift = Origen->FVVTLift;
120 FVVTTiming = Origen->FVVTTiming;
121 FVVTDuration = Origen->FVVTDuration;
125 FVVTLiftMultiplier = Origen->FVVTLiftMultiplier;
126 FVVTTimigGap = Origen->FVVTTimigGap;
127 FVVTDurationMultiplier = Origen->FVVTDurationMultiplier;
129 FVVTLiftCtrlID = Origen->FVVTLiftCtrlID;
130 FVVTTimingCtrlID = Origen->FVVTTimingCtrlID;
131 FVVTDurationCtrlID = Origen->FVVTDurationCtrlID;
137 void TValvula4T::LeeDatosIniciales(
const char *FileWAM, fpos_t &filepos,
int norden,
bool HayMotor,
140 int ControlRegimen, NumLev = 0, NumCD = 0;
144 FILE *fich = fopen(FileWAM,
"r");
145 fsetpos(fich, &filepos);
147 FNumeroOrden = norden;
149 fscanf(fich,
"%lf %d %lf %lf %lf %lf ", &FDiametro, &NumLev, &FIncrAng, &FAnguloApertura, &FDiametroRef,
152 FAnguloApertura0 = FAnguloApertura;
154 FAnguloCierre = FAnguloApertura + (double)(NumLev - 1) * FIncrAng;
157 FLevantamiento.resize(NumLev);
158 FAngle.resize(NumLev);
160 for(
int i = 0; i < NumLev; i++) {
161 FAngle[i] = (double) i * FIncrAng;
162 fscanf(fich,
" %lf", &FLevantamiento[i]);
165 fscanf(fich,
"%d %lf ", &NumCD, &FIncrLev);
167 FLiftCD.resize(NumCD);
168 FDatosCDEntrada.resize(NumCD);
169 FDatosCDSalida.resize(NumCD);
170 FDatosTorbellino.resize(NumCD);
172 for(
int i = 0; i < NumCD; i++) {
173 FLiftCD[i] = (double) i * FIncrLev;
174 fscanf(fich,
" %lf", &FDatosCDEntrada[i]);
176 for(
int i = 0; i < NumCD; i++) {
177 fscanf(fich,
" %lf", &FDatosCDSalida[i]);
179 for(
int i = 0; i < NumCD; i++) {
180 fscanf(fich,
" %lf", &FDatosTorbellino[i]);
183 fscanf(fich,
"%d ", &ControlRegimen);
185 switch(ControlRegimen) {
187 FControlRegimen = nmPropio;
190 FControlRegimen = nmMotor;
193 if(FControlRegimen == nmPropio) {
194 fscanf(fich,
"%lf ", &FRegimen);
195 FRelacionVelocidades = 1.;
196 }
else if(FControlRegimen == nmMotor && HayMotor) {
197 fscanf(fich,
"%lf ", &FRelacionVelocidades);
199 std::cout <<
"ERROR: TValvula4T::LeeDatosIniciales Lectura del Control del Regimen erronea " << std::endl;
204 fscanf(fich,
"%d ", &controllers);
205 for(
int i = 0; i < controllers; i++) {
206 fscanf(fich,
"%d ", ¶m);
209 fscanf(fich,
"%d ", &FVVTTimingCtrlID);
213 fscanf(fich,
"%d ", &FVVTLiftCtrlID);
217 fscanf(fich,
"%d", &FVVTDurationCtrlID);
221 if(FVVTLift || FVVTTiming || FVVTDuration)
225 fgetpos(fich, &filepos);
228 }
catch(exception & N) {
229 std::cout <<
"ERROR: LeeDatosIniciales Valvula4T" << std::endl;
239 void TValvula4T::CalculaCD(
double Angulo) {
241 double X = 0., XLv = 0., XCd = 0.;
243 if(Angulo <= FAnguloApertura || Angulo >= FAnguloCierre) {
247 X = Angulo - FAnguloApertura;
248 XLv = X / (FIncrAng * FVVTDurationMultiplier);
250 FApertura = fun_FLift->interp(XLv) * FVVTLiftMultiplier;
255 FCDTubVol = fun_CDin->interp(FApertura) * FSectionRatio;
256 FCDVolTub = fun_CDout->interp(FApertura) * FSectionRatio;
257 FCTorb = fun_Torb->interp(FApertura);
260 }
catch(exception & N) {
261 std::cout <<
"ERROR: LeeDatosIniciales Valvula4T" << std::endl;
268 void TValvula4T::GetCDin(
double Time) {
270 double X = 0., XLv = 0., XCd = 0., Angulo = 0.;
272 if(FControlRegimen == nmPropio) {
273 Angulo = 6. * FRegimen * Time;
276 Angulo = FCylinder->getAnguloActual();
278 double DeltaT = Time - FTime0;
280 double DeltaA = 6 * FEngine->getRegimen() * DeltaT * FRelacionVelocidades;
281 Angulo = DeltaA + FAngle0;
288 if(Angulo <= FAnguloApertura || Angulo >= FAnguloCierre) {
292 X = Angulo - FAnguloApertura;
293 XLv = X / FVVTDurationMultiplier;
297 FApertura = fun_FLift->interp(XLv) * FVVTLiftMultiplier;
302 FCDTubVol = fun_CDin->interp(FApertura) * FSectionRatio;
303 FCTorb = fun_Torb->interp(FApertura);
307 void TValvula4T::GetCDout(
double Time) {
308 double X = 0., XLv = 0., XCd = 0., Angulo = 0.;
310 if(FControlRegimen == nmPropio) {
311 Angulo = 360. * FRegimen / 60. * Time;
314 Angulo = FCylinder->getAnguloActual();
316 double DeltaT = Time - FTime0;
318 double DeltaA = 6 * FEngine->getRegimen() * DeltaT * FRelacionVelocidades;
319 Angulo = DeltaA + FAngle0;
326 if(Angulo <= FAnguloApertura || Angulo >= FAnguloCierre) {
330 X = Angulo - FAnguloApertura;
331 XLv = X / FVVTDurationMultiplier;
335 FApertura = fun_FLift->interp(XLv) * FVVTLiftMultiplier;
340 FCDVolTub = fun_CDout->interp(FApertura) * FSectionRatio;
341 FCTorb = fun_Torb->interp(FApertura);
345 void TValvula4T::VVTControl(
double Time) {
348 FVVTLiftMultiplier = FVVTLiftCtrl->
Output(Time);
351 FVVTTimigGap = FVVTTimingCtrl->
Output(Time);
354 FVVTDurationMultiplier = FVVTDurationCtrl->
Output(Time);
356 FAnguloApertura = FAnguloApertura0 + FVVTTimigGap;
357 FAnguloCierre = FAnguloApertura + (double)(FAngle.size() - 1) * FIncrAng * FVVTDurationMultiplier;
361 void TValvula4T::AsignaLevController(
TController **Controller) {
364 FVVTLiftCtrl = Controller[FVVTLiftCtrlID - 1];
367 FVVTTimingCtrl = Controller[FVVTTimingCtrlID - 1];
370 FVVTDurationCtrl = Controller[FVVTDurationCtrlID - 1];
375 #pragma package(smart_init)