OpenWAM
TTGV.cpp
1 /*--------------------------------------------------------------------------------*\
2 ==========================|
3  \\ /\ /\ // O pen | OpenWAM: The Open Source 1D Gas-Dynamic Code
4  \\ | X | // W ave |
5  \\ \/_\/ // A ction | CMT-Motores Termicos / Universidad Politecnica Valencia
6  \\/ \// M odel |
7  ----------------------------------------------------------------------------------
8  License
9 
10  This file is part of OpenWAM.
11 
12  OpenWAM is free software: you can redistribute it and/or modify
13  it under the terms of the GNU General Public License as published by
14  the Free Software Foundation, either version 3 of the License, or
15  (at your option) any later version.
16 
17  OpenWAM is distributed in the hope that it will be useful,
18  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  GNU General Public License for more details.
21 
22  You should have received a copy of the GNU General Public License
23  along with OpenWAM. If not, see <http://www.gnu.org/licenses/>.
24 
25 
26  \*--------------------------------------------------------------------------------*/
27 
28 //---------------------------------------------------------------------------
29 #pragma hdrstop
30 
31 #include "TTGV.h"
32 //---------------------------------------------------------------------------
33 //---------------------------------------------------------------------------
34 
35 TTGV::TTGV() {
36  FAEstator = 995.38; // en mm2
37  FARotor = 1452.2; // en mm2
38 
39  FKc1 = 0.1;
40  FKi1 = 0.1;
41  FKd1 = 0.1;
42  FKc2 = 0.1;
43  FKi2 = 0.1;
44  FKd2 = 0.1;
45 
46  FError = 0.;
47  FErrorI = 0.;
48 
49  FPosicionTurbina = 61.08;
50 
51  FDistanciasVastago = NULL;
52 
53  FPrimeraVez = false;
54 
55 }
56 
57 //---------------------------------------------------------------------------
58 //---------------------------------------------------------------------------
59 
60 TTGV::~TTGV() {
61  delete[] FDistanciasVastago;
62 }
63 
64 //---------------------------------------------------------------------------
65 //---------------------------------------------------------------------------
66 
67 void TTGV::LeeDatosEntrada(char *Ruta, FILE *fich) {
68  char *FileTGV;
69  char *DatosTGV;
70 
71  try {
72 
73  for(int i = 0; i <= (int) strlen(Ruta); i++) {
74  DatosTGV[i] = Ruta[i];
75  }
76 
77  fscanf(fich, "%s ", &FileTGV);
78  strcat(DatosTGV, FileTGV);
79 
80  FichTGV = fopen(DatosTGV, "r");
81  if((FichTGV = fopen(DatosTGV, "r")) == NULL) {
82  std::cout << "ERROR: Fichero de TGV no cargado";
83  } else {
84  fscanf(FichTGV, "%lf %lf %lf ", &FKc1, &FKi1, &FKd1);
85  fscanf(FichTGV, "%lf %lf %lf ", &FKc2, &FKi2, &FKd2);
86  fscanf(FichTGV, "%lf %lf %lf ", &FCorr0, &FCorr1, &FCorr2);
87  fscanf(FichTGV, "%lf %lf %lf ", &FCorr4, &FCorr6, &FCorr8);
88  fscanf(FichTGV, "%lf %lf ", &FCorr10, &FCorr12);
89  fscanf(FichTGV, "%d %d ", &FNumeroDatos_Regimen, &FNumeroDatos_Mf);
90 
91  FVector_Mf_mapa = new double[FNumeroDatos_Mf];
92  FVector_Regimen_mapa = new double[FNumeroDatos_Regimen];
93 
94  FMapa_PosicionTurbina = new double*[FNumeroDatos_Mf];
95  FMapa_Padmision = new double*[FNumeroDatos_Mf];
96  for(int i = 0; i < FNumeroDatos_Mf; i++) {
97  FMapa_PosicionTurbina[i] = new double[FNumeroDatos_Regimen];
98  FMapa_Padmision[i] = new double[FNumeroDatos_Regimen];
99  }
100 
101  for(int i = 0; i < FNumeroDatos_Regimen; i++) {
102  fscanf(FichTGV, "%lf ", &FVector_Regimen_mapa[i]);
103  }
104  for(int i = 0; i < FNumeroDatos_Mf; i++) {
105  fscanf(FichTGV, "%lf ", &FVector_Mf_mapa[i]);
106  }
107  for(int i = 0; i < FNumeroDatos_Mf; i++) {
108  for(int j = 0; j < FNumeroDatos_Regimen; j++) {
109  fscanf(FichTGV, "%lf ", &FMapa_PosicionTurbina[i][j]);
110  }
111  }
112  for(int i = 0; i < FNumeroDatos_Mf; i++) {
113  for(int j = 0; j < FNumeroDatos_Regimen; j++) {
114  fscanf(FichTGV, "%lf ", &FMapa_Padmision[i][j]);
115  }
116  }
117  fclose(FichTGV);
118  }
119 
120  FDistanciasVastago = new double[8];
121  FDistanciasVastago[0] = 0;
122  FDistanciasVastago[1] = 1;
123  FDistanciasVastago[2] = 2;
124  FDistanciasVastago[3] = 4;
125  FDistanciasVastago[4] = 6;
126  FDistanciasVastago[5] = 8;
127  FDistanciasVastago[6] = 10;
128  FDistanciasVastago[7] = 12;
129 
130  } catch(exception &N) {
131  std::cout << "ERROR: TTGV::LeeDatosEntrada (DLL)" << std::endl;
132  std::cout << "Tipo de error: " << N.what() << std::endl;
133  throw Exception(N.what());
134  }
135 }
136 
137 //---------------------------------------------------------------------------
138 //---------------------------------------------------------------------------
139 
140 void TTGV::CalculaTurbina(nmTipoControl TipoControl, double MasaFuel, double Regimen, double PresionAdmision,
141  double RelacionCinematica, double RelExp, double RegTurboCorr, double GastoCorr, double Tiempo) {
142  try {
143  int contador = 0, x1, x2;
144  double Rendimiento1 = 0., Rendimiento2 = 0., AefecEstator = 0., AefecRotor = 0.;
145  if(TipoControl == nmControlPadm) {
146 
147  MasaFuel = MasaFuel * 1e6; // en (mg/cc)
148 
149  FPresionAdmisionConsigna = Interpolacion_bidimensional(Regimen, MasaFuel, FVector_Mf_mapa, FVector_Regimen_mapa,
150  FMapa_Padmision, FNumeroDatos_Regimen, FNumeroDatos_Mf) / 1000.; //en (bar)
151 
152  FError_ant = FError;
153  FErrorIAnt = FErrorI;
154  FError = (PresionAdmision - FPresionAdmisionConsigna) / FPresionAdmisionConsigna;
155 
156  if(FError > 0) {
157  FPrimeraVez = true;
158  }
159  if(Tiempo > 0) {
160  if(FPrimeraVez) {
161  FErrorI = 0.;
162  } else {
163  FErrorI = FErrorI + FError;
164  }
165 
166  /* PID Posicion Turbine */
167  FP = -FKc1 * FError;
168  FI = -FKi1 * (FErrorI);
169  FD = -FKd1 * (FError - FError_ant);
170 
171  if(FPosicionTurbina + FP + FI + FD > FCierreMaximo) {
172  if(FError < 0) {
173  FErrorI = FErrorIAnt;
174  FI = -FKi1 * (FErrorI);
175  }/*else{
176  FErrorI=FErrorI+FError;
177  } */
178  } else if(FPosicionTurbina + FP + FI + FD < 0.) {
179  if(FError > 0) {
180  FErrorI = FErrorIAnt;
181  FI = -FKi1 * (FErrorI);
182  }/*else{
183  FErrorI=FErrorI+FError;
184  } */
185  }
186  } else {
187  FErrorI = FErrorI + FError;
188 
189  // PID Posicion Turbine
190  FP = -FKc2 * FError;
191  FI = -FKi2 * (FErrorI);
192  FD = -FKd2 * (FError - FError_ant);
193 
194  if(FPosicionTurbina + FP + FI + FD > FCierreMaximo) {
195  if(FError < 0) {
196  FErrorI = FErrorIAnt;
197  FI = -FKi2 * (FErrorI);
198  } //else{
199  // FErrorI=FErrorI+FError;
200  // }
201  } else if(FPosicionTurbina + FP + FI + FD < 0.) {
202  if(FError > 0) {
203  FErrorI = FErrorIAnt;
204  FI = -FKi2 * (FErrorI);
205  } //else{
206  // FErrorI=FErrorI+FError;
207  // }
208  }
209  }
210 
211  FPosicionTurbina = FPosicionTurbina + FP + FI + FD; // Posicion de la turbina en % (100% cerrada - 0% abierta)
212  if(FPosicionTurbina > FCierreMaximo) {
213  FPosicionTurbina = FCierreMaximo;
214  } else if(FPosicionTurbina < 0.) {
215  FPosicionTurbina = 0.;
216  }
217 
218  } else if(TipoControl == nmControlMasaAire) {
219 
220  MasaFuel = MasaFuel * 1e6; // en (mg/cc)
221 
222  FPosicionTurbina = Interpolacion_bidimensional(Regimen, MasaFuel, FVector_Mf_mapa, FVector_Regimen_mapa,
223  FMapa_PosicionTurbina, FNumeroDatos_Regimen, FNumeroDatos_Mf); // en % (100% cerrada - 0% abierta)
224  }
225 
226 // CALCULO DEL RENDIMIENTO
227  FDistanciaVastago = -(FPosicionTurbina - 100) / 8.3333; // en (mm)
228  if(FDistanciaVastago > 12.) {
229  FDistanciaVastago = 12.;
230  }
231  while(FDistanciasVastago[contador] <= FDistanciaVastago) {
232  x1 = contador;
233  x2 = contador + 1;
234  contador++;
235  }
236 
237  if(x1 == 0) { // Distancia del vastago 0 mm
238  Rendimiento1 = 1.6122 * pow3(RelacionCinematica) - 3.6641 * pow2(RelacionCinematica) + 2.0753 * RelacionCinematica;
239  Rendimiento2 = 1.3275 * pow3(RelacionCinematica) - 3.42625 * pow2(RelacionCinematica) + 2.1998 * RelacionCinematica;
240 // Rendimiento1=-1.5*(-12.5)*0.38*pow(RelacionCinematica,2.)-12.5*pow(RelacionCinematica,3.);
241 // Rendimiento2=-1.5*(-12.7)*0.4*pow(RelacionCinematica,2.)-12.7*pow(RelacionCinematica,3.);
242  FRendimiento = (Rendimiento1 - (FDistanciasVastago[x1] - FDistanciaVastago) * (Rendimiento1 - Rendimiento2) /
243  (FDistanciasVastago[x1] - FDistanciasVastago[x2])) * FCorr0;
244 
245  } else if(x1 == 1) { // Distancia del vastago 1 mm
246  Rendimiento1 = 1.3275 * pow3(RelacionCinematica) - 3.42625 * pow2(RelacionCinematica) + 2.1998 * RelacionCinematica;
247  Rendimiento2 = 0.6491229 * pow3(RelacionCinematica) - 2.646368 * pow2(RelacionCinematica) + 2.2409 * RelacionCinematica;
248 
249 // Rendimiento1=-1.5*(-12.7)*0.4*pow(RelacionCinematica,2.)-12.7*pow(RelacionCinematica,3.);
250 // Rendimiento2=-1.5*(-9.2)*0.48*pow(RelacionCinematica,2.)-9.2*pow(RelacionCinematica,3.);
251  FRendimiento = (Rendimiento1 - (FDistanciasVastago[x1] - FDistanciaVastago) * (Rendimiento1 - Rendimiento2) /
252  (FDistanciasVastago[x1] - FDistanciasVastago[x2])) * FCorr1;
253 // FRendimiento=(0.6491229*pow(RelacionCinematica,3.)-2.646368*pow(RelacionCinematica,2.)+2.2409*RelacionCinematica)*1.25;
254  } else if(x1 == 2) { // Distancia del vastago 2 mm
255  Rendimiento1 = (0.6491229 * pow3(RelacionCinematica) - 2.646368 * pow2(RelacionCinematica) + 2.2409 *
256  RelacionCinematica);
257  Rendimiento2 = (-0.316970 * pow3(RelacionCinematica) - 1.5838 * pow2(RelacionCinematica) + 2.1257 * RelacionCinematica);
258 
259  //Rendimiento1=(-1.5*(-9.2)*0.48*pow(RelacionCinematica,2.)-9.2*pow(RelacionCinematica,3.))*1.25;
260  //Rendimiento2=(-1.5*(-6.5)*0.58*pow(RelacionCinematica,2.)-6.5*pow(RelacionCinematica,3.))*1.1;
261  FRendimiento = (Rendimiento1 - (FDistanciasVastago[x1] - FDistanciaVastago) * (Rendimiento1 - Rendimiento2) /
262  (FDistanciasVastago[x1] - FDistanciasVastago[x2])) * FCorr2;
263  } else if(x1 == 3) { // Distancia del vastago 4 mm
264  Rendimiento1 = (-0.316970 * pow3(RelacionCinematica) - 1.5838 * pow2(RelacionCinematica) + 2.1257 * RelacionCinematica);
265  Rendimiento2 = (-0.20288 * pow3(RelacionCinematica) - 1.457777 * pow2(RelacionCinematica) + 2.0414 *
266  RelacionCinematica);
267 
268  //Rendimiento1=(-1.5*(-6.5)*0.58*pow(RelacionCinematica,2.)-6.5*pow(RelacionCinematica,3.))*1.1;
269  //Rendimiento2=-1.5*(-6.4)*0.59*pow(RelacionCinematica,2.)-6.4*pow(RelacionCinematica,3.);
270  FRendimiento = (Rendimiento1 - (FDistanciasVastago[x1] - FDistanciaVastago) * (Rendimiento1 - Rendimiento2) /
271  (FDistanciasVastago[x1] - FDistanciasVastago[x2])) * FCorr4;
272  } else if(x1 == 4) { // Distancia del vastago 6 mm
273  Rendimiento1 = (-0.20288 * pow3(RelacionCinematica) - 1.457777 * pow2(RelacionCinematica) + 2.0414 *
274  RelacionCinematica);
275  Rendimiento2 = (-0.17608 * pow3(RelacionCinematica) - 1.37028 * pow2(RelacionCinematica) + 1.8979 * RelacionCinematica);
276 
277  //Rendimiento1=-1.5*(-6.4)*0.59*pow(RelacionCinematica,2.)-6.4*pow(RelacionCinematica,3.);
278  //Rendimiento2=-1.5*(-5.35)*0.61*pow(RelacionCinematica,2.)-5.35*pow(RelacionCinematica,3.);
279  FRendimiento = (Rendimiento1 - (FDistanciasVastago[x1] - FDistanciaVastago) * (Rendimiento1 - Rendimiento2) /
280  (FDistanciasVastago[x1] - FDistanciasVastago[x2])) * FCorr6;
281  } else if(x1 == 5) { // Distancia del vastago 8 mm
282  Rendimiento1 = (-0.17608 * pow3(RelacionCinematica) - 1.37028 * pow2(RelacionCinematica) + 1.8979 * RelacionCinematica);
283  Rendimiento2 = (0.00635 * pow3(RelacionCinematica) - 1.5031 * pow2(RelacionCinematica) + 1.79457 * RelacionCinematica);
284 
285  //Rendimiento1=-1.5*(-5.35)*0.61*pow(RelacionCinematica,2.)-5.35*pow(RelacionCinematica,3.);
286  //Rendimiento2=-1.5*(-5.2)*0.59*pow(RelacionCinematica,2.)-5.2*pow(RelacionCinematica,3.);
287  FRendimiento = (Rendimiento1 - (FDistanciasVastago[x1] - FDistanciaVastago) * (Rendimiento1 - Rendimiento2) /
288  (FDistanciasVastago[x1] - FDistanciasVastago[x2])) * FCorr8;
289  } else if(x1 == 6) { // Distancia del vastago 10 mm
290  Rendimiento1 = (0.00635 * pow3(RelacionCinematica) - 1.5031 * pow2(RelacionCinematica) + 1.79457 * RelacionCinematica);
291  Rendimiento2 = (0.39258 * pow3(RelacionCinematica) - 1.90361 * pow2(RelacionCinematica) + 1.7190 * RelacionCinematica);
292 
293  //Rendimiento1=-1.5*(-5.2)*0.59*pow(RelacionCinematica,2.)-5.2*pow(RelacionCinematica,3.);
294  //Rendimiento2=-1.5*(-6.95)*0.5*pow(RelacionCinematica,2.)-6.95*pow(RelacionCinematica,3.);
295  FRendimiento = (Rendimiento1 - (FDistanciasVastago[x1] - FDistanciaVastago) * (Rendimiento1 - Rendimiento2) /
296  (FDistanciasVastago[x1] - FDistanciasVastago[x2])) * FCorr10;
297  } else if(x1 == 7) { // Distancia del vastago 12 mm
298  FRendimiento = ((0.39258 * pow3(RelacionCinematica) - 1.90361 * pow2(RelacionCinematica) + 1.7190 * RelacionCinematica))
299  * FCorr12;
300 
301  //FRendimiento=-1.5*(-6.95)*0.5*pow(RelacionCinematica,2.)-6.95*pow(RelacionCinematica,3.);
302  }
303 
304 // CALCULO DEL COEFICIENTE DE DESCARGA DEL ESTATOR
305  AefecEstator = -1.818 * pow2(FDistanciaVastago) + 54.4 * FDistanciaVastago + 73.88; // en (mm2)
306  FCDStator = AefecEstator / FAEstator;
307 
308 // CALCULO DEL COEFICIENTE DE DESCARGA DEL ROTOR
309  AefecRotor = 59.9801 * GastoCorr - 2.79195 * RegTurboCorr + 0.695835 * RelExp * GastoCorr - 1.30223 * pow(GastoCorr,
310  2.) + 35.9154 + 10.1818 * pow(RelExp, 2.) - 29.9162 * RelExp; // en (mm2)
311  FCDRotor = AefecRotor / FARotor;
312  FCDRotor = FCDStator / 1.5;
313 
314  if(FCDStator < 0.) {
315  FCDStator = 0.05;
316  } else if(FCDStator > 0.8) {
317  FCDStator = 0.8;
318  }
319 
320  if(FCDRotor < 0.11) {
321  FCDRotor = 0.11;
322  } else if(FCDRotor > 0.8) {
323  FCDRotor = 0.8;
324  }
325 
326  } catch(exception &N) {
327  std::cout << "ERROR: CalculaTurbina (DLL)" << std::endl;
328  std::cout << "Tipo de error: " << N.what() << std::endl;
329  throw Exception(N.what());
330  }
331 }
332 
333 //---------------------------------------------------------------------------
334 //---------------------------------------------------------------------------
335 
336 #pragma package(smart_init)
337 
pow3
T pow3(T x)
Returns x to the power of 3.
Definition: Math_wam.h:101
Exception
Custom exception class.
Definition: Exception.hpp:39
pow2
T pow2(T x)
Returns x to the power of 2.
Definition: Math_wam.h:88