31 #include "TDiscoRotativo.h"
32 #include "TCilindro.h"
34 #include "TBloqueMotor.h"
39 TDiscoRotativo::TDiscoRotativo() :
54 TDiscoRotativo::~TDiscoRotativo() {
61 TDiscoRotativo::TDiscoRotativo(
TDiscoRotativo *Origen,
int Valvula) :
64 FDiametroRef = Origen->FDiametroRef;
65 FNumeroPuntos = Origen->FNumeroPuntos;
67 FNumeroOrden = Origen->FNumeroOrden;
69 FEngine = Origen->FEngine;
73 FDiamRef = FDiametroRef;
75 FAngle0 = Origen->FAngle0;
77 FDCMultiplier = Origen->FDCMultiplier;
78 FShift = Origen->FShift;
79 FDuration = Origen->FDuration;
81 FAngulo.resize(Origen->FAngulo.size());
82 FDatosCDEntrada.resize(Origen->FDatosCDEntrada.size());
83 FDatosCDSalida.resize(Origen->FDatosCDSalida.size());
85 for(
int i = 0; i < FNumeroPuntos; i++) {
86 FAngulo[i] = Origen->FAngulo[i];
87 FDatosCDEntrada[i] = Origen->FDatosCDEntrada[i];
88 FDatosCDSalida[i] = Origen->FDatosCDSalida[i];
93 FRegimen = Origen->getRegimen();
94 FRelacionVelocidades = Origen->getRelacionVelocidades();
95 FControlRegimen = Origen->getControlRegimen();
101 void TDiscoRotativo::LeeDatosIniciales(
const char *FileWAM, fpos_t &filepos,
int norden,
bool HayMotor,
104 int ControlRegimen = 0;
106 FILE *fich = fopen(FileWAM,
"r");
107 fsetpos(fich, &filepos);
109 FNumeroOrden = norden;
113 fscanf(fich,
"%lf ", &FDiametroRef);
114 fscanf(fich,
"%lf %lf %lf ", &FDCMultiplier, &FShift, &FDuration);
116 fscanf(fich,
"%d ", &FNumeroPuntos);
118 FAngulo.resize(FNumeroPuntos);
119 FDatosCDEntrada.resize(FNumeroPuntos);
120 FDatosCDSalida.resize(FNumeroPuntos);
122 for(
int j = 0; j < FNumeroPuntos; ++j) {
123 fscanf(fich,
"%lf ", &FAngulo[j]);
124 FAngulo[j] *= FDuration;
126 for(
int j = 0; j < FNumeroPuntos; ++j) {
127 fscanf(fich,
"%lf ", &FDatosCDEntrada[j]);
128 FDatosCDEntrada[j] *= FDCMultiplier;
130 for(
int j = 0; j < FNumeroPuntos; ++j) {
131 fscanf(fich,
"%lf ", &FDatosCDSalida[j]);
132 FDatosCDEntrada[j] *= FDCMultiplier;
135 fscanf(fich,
"%d ", &ControlRegimen);
137 switch(ControlRegimen) {
139 FControlRegimen = nmPropio;
142 FControlRegimen = nmMotor;
145 if(FControlRegimen == nmPropio) {
146 fscanf(fich,
"%lf ", &FRegimen);
147 FRelacionVelocidades = 1.;
148 }
else if(FControlRegimen == nmMotor && HayMotor) {
149 fscanf(fich,
"%lf ", &FRelacionVelocidades);
151 std::cout <<
"ERROR: TDiscoRotativo::LeeDatosIniciales Lectura del Control del Regimen erronea " << std::endl;
155 fgetpos(fich, &filepos);
157 }
catch(exception &N) {
158 std::cout <<
"ERROR: LeeDatosIniciales DiscoRotativo" << std::endl;
168 void TDiscoRotativo::CalculaCD(
double AnguloActual) {
170 FCDTubVol = fun_CDin->interp(AnguloActual) * FSectionRatio;
171 FCDVolTub = fun_CDout->interp(AnguloActual) * FSectionRatio;
175 void TDiscoRotativo::GetCDin(
double Time) {
177 double X = 0., XLv = 0., XCd = 0., Angulo = 0.;
179 if(FControlRegimen == nmPropio) {
180 Angulo = 6. * FRegimen * Time - FShift;
183 Angulo = FCylinder->getAnguloActual() * 360. / FEngine->getAngTotalCiclo() - FShift;
186 double DeltaT = Time - FTime0;
188 double DeltaA = 6 * FEngine->getRegimen() * DeltaT * FRelacionVelocidades;
189 Angulo = DeltaA + FAngle0;
195 Angulo = Angulo - 360 * int(floor(Angulo / 360));
199 FCDTubVol = fun_CDin->interp(Angulo) * FSectionRatio;
206 void TDiscoRotativo::GetCDout(
double Time) {
207 double X = 0., XLv = 0., XCd = 0., Angulo = 0.;
209 if(FControlRegimen == nmPropio) {
210 Angulo = 360. * FRegimen / 60. * Time - FShift;
214 Angulo = FCylinder->getAnguloActual() * 360. / FEngine->getAngTotalCiclo() - FShift;
216 double DeltaT = Time - FTime0;
218 double DeltaA = 6 * FEngine->getRegimen() * DeltaT * FRelacionVelocidades;
219 Angulo = DeltaA + FAngle0;
226 Angulo = Angulo - 360 * int(floor(Angulo / 360));
230 FCDVolTub = fun_CDout->interp(Angulo) * FSectionRatio;
240 #pragma package(smart_init)