36 Tfql::Tfql(
int ncilin) {
49 if(Fpar_dist != NULL) {
50 for(
int i = 0; i < Fnparametros; ++i) {
51 delete[] Fpar_dist[i];
57 for(
int i = 0; i < Fnwiebe; ++i) {
64 for(
int i = 0; i < Fnwiebe; ++i) {
71 for(
int i = 0; i < Fnwiebe; ++i) {
78 for(
int i = 0; i < Fnwiebe; ++i) {
85 for(
int i = 0; i < Fnwiebe; ++i) {
92 for(
int i = 0; i < Fnwiebe; ++i) {
93 for(
int j = 0; j < Fnley; ++j) {
101 if(Fcombustion != NULL)
102 delete[] Fcombustion;
109 void Tfql::lee_leylib(
char *Ruta, FILE *fich) {
115 for(
int i = 0; i <= (int) strlen(Ruta); i++) {
116 Datosfql[i] = Ruta[i];
119 fscanf(fich,
"%s ", &Filefql);
120 strcat(Datosfql, Filefql);
122 Fichfql = fopen(Datosfql,
"r");
123 if((Fichfql = fopen(Datosfql,
"r")) == NULL) {
124 std::cout <<
"ERROR: Fichero de leyes de liberacion de calor no cargado";
126 fscanf(Fichfql,
"%d ", &Fnley);
127 fscanf(Fichfql,
"%d ", &Fnwiebe);
128 fscanf(Fichfql,
"%d ", &Fnparametros);
129 Fpar_dist =
new double *[Fnparametros];
130 for(
int i = 0; i <= Fnparametros - 1; ++i) {
131 Fpar_dist[i] =
new double[Fnley];
133 Fmax =
new double[Fnparametros];
134 for(
int k = 0; k <= Fnparametros - 1; k++) {
137 Flm =
new double*[Fnwiebe];
138 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
139 Flm[i] =
new double[Fnley];
141 Flc =
new double*[Fnwiebe];
142 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
143 Flc[i] =
new double[Fnley];
145 Flb =
new double*[Fnwiebe];
146 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
147 Flb[i] =
new double[Fnley];
149 Fli =
new double*[Fnwiebe];
150 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
151 Fli[i] =
new double[Fnley];
153 Fla =
new double*[Fnwiebe];
154 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
155 Fla[i] =
new double[Fnley];
158 Flab =
new double **[Fnwiebe];
159 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
160 Flab[i] =
new double *[Fnley];
161 for(
int j = 0; j <= Fnley - 1; ++j) {
162 Flab[i][j] =
new double[Fncilin];
166 Fcombustion =
new bool[Fncilin];
167 for(
int i = 0; i <= Fncilin - 1; ++i) {
168 Fcombustion[i] =
false;
171 printf(
"INFO: N. de leyes: %d\n", Fnley);
172 printf(
"INFO: N. de Wiebes: %d\n", Fnwiebe);
174 for(
int i = 0; i < Fnley; ++i) {
175 for(
int j = 0; j <= Fnparametros - 1; ++j) {
176 fscanf(Fichfql,
"%lf ", &Fpar_dist[j][i]);
177 if(Fmax[j] < fabs(Fpar_dist[j][i])) {
178 Fmax[j] = fabs(Fpar_dist[j][i]);
181 for(
int j = 0; j <= Fnwiebe - 1; ++j) {
182 fscanf(Fichfql,
"%lf %lf %lf %lf %lf ", &Flm[j][i], &Flc[j][i], &Flb[j][i], &Fli[j][i], &Fla[j][i]);
183 Fla[j][i] = 720. + Fla[j][i];
189 }
catch(exception &N) {
190 std::cout <<
"ERROR: lee_leylib (DLL)" << std::endl;
191 std::cout <<
"Tipo de error: " << N.what() << std::endl;
199 double Tfql::fql(
double x,
int j,
int i) {
203 double ret_val, wiebe = 0., c;
209 x = x - 720 * floor(c);
235 if(x > Fang0 + 719.75 && x < Fang0 + 720.25)
236 Fcombustion[i] =
true;
239 for(
int k = 0; k <= Fnwiebe - 1; ++k) {
240 wiebe = fun_wiebe(x, Flm[k][j], Flc[k][j], Fli[k][j], Flab[k][j][i]);
241 ret_val += wiebe * Flb[k][j];
250 catch(exception &N) {
251 std::cout <<
"ERROR: fql (DLL)" << std::endl;
252 std::cout <<
"Tipo de error: " << N.what() << std::endl;
260 double Tfql::fun_wiebe(
double x,
double m,
double c,
double ia,
double a0)
266 double ret_val = 0., xx = 0., xxx = 0.;
273 xxx = pow(xx, m + 1);
274 if((xxx * c) > 10.) {
277 ret_val = 1. - 1. / exp(xxx * c);
284 catch(exception &N) {
285 std::cout <<
"ERROR: fun_wiebe (DLL)" << std::endl;
286 std::cout <<
"Tipo de error: " << N.what() << std::endl;
294 void Tfql::calcula_angulos_combustion(
double *parametros,
int i) {
298 double up, down, ang01 = 0., tras = 0., a = 0., b = 0., c = 0., r = 0., s = 0., d = 0., densidad = 0., egr = 0., e;
310 for(
int j = 0; j < Fnley; ++j) {
318 r =
pow2((parametros[2] - Fpar_dist[2][j]) / Fmax[2]);
319 s =
pow2((parametros[5] - Fpar_dist[5][j]) / Fmax[5]);
320 d =
pow2((parametros[6] - Fpar_dist[6][j]) / Fmax[6]);
321 egr =
pow2((parametros[7] - Fpar_dist[7][j]) / Fmax[7]);
322 densidad =
pow2((parametros[8] - Fpar_dist[8][j]) / Fmax[8]);
323 b = c + r + s + d + egr + densidad;
336 up += (Fla[k][j] / dist);
341 Fang0 = ang01 - 720.;
342 Ffinc = ang01 - 720.;
344 for(
int j = 0; j < Fnley; ++j) {
345 tras = ang01 - Fla[k][j];
346 for(
int n = 0; n <= Fnwiebe - 1; ++n) {
347 Flab[n][j][i] = Fla[n][j] + tras;
349 if(Flab[0][j][i] - 720. < Fang0) {
350 Fang0 = Flab[0][j][i] - 720.;
352 if((Flab[Fnwiebe - 1][j][i] + Fli[Fnwiebe - 1][j] - 720.) > Ffinc) {
353 Ffinc = Flab[Fnwiebe - 1][j][i] + Fli[Fnwiebe - 1][j] - 720.;
358 catch(exception &N) {
359 std::cout <<
"ERROR: fql (DLL)" << std::endl;
360 std::cout <<
"Tipo de error: " << N.what() << std::endl;
368 double Tfql::calcula_fql(
double *parametros,
double x,
int i) {
371 double up, down, dist = 0., ret_val = 0., a = 0., b = 0., ley = 0., e;
377 for(j = 0; j < Fnley; ++j) {
379 for(
int k = 0; k < Fnparametros - 4; ++k) {
380 a =
pow2((parametros[k] - Fpar_dist[k][j]) / Fmax[k]);
389 printf(
"WARNING: Ley n. %d > 1. en %lf\n", j, x);
401 catch(exception &N) {
402 std::cout <<
"ERROR: calcula_fql (DLL)" << std::endl;
403 std::cout <<
"Tipo de error: " << N.what() << std::endl;
411 void Tfql::lee_leylib2(FILE *BaseDatos) {
413 fscanf(BaseDatos,
"%d ", &Fnley);
414 fscanf(BaseDatos,
"%d ", &Fnwiebe);
415 fscanf(BaseDatos,
"%d ", &Fnparametros);
416 Fpar_dist =
new double *[Fnparametros];
417 for(
int i = 0; i <= Fnparametros - 1; ++i) {
418 Fpar_dist[i] =
new double[Fnley];
420 Fmax =
new double[Fnparametros];
421 for(
int k = 0; k <= Fnparametros - 1; k++) {
424 Flm =
new double*[Fnwiebe];
425 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
426 Flm[i] =
new double[Fnley];
428 Flc =
new double*[Fnwiebe];
429 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
430 Flc[i] =
new double[Fnley];
432 Flb =
new double*[Fnwiebe];
433 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
434 Flb[i] =
new double[Fnley];
436 Fli =
new double*[Fnwiebe];
437 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
438 Fli[i] =
new double[Fnley];
440 Fla =
new double*[Fnwiebe];
441 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
442 Fla[i] =
new double[Fnley];
444 Flab =
new double **[Fnwiebe];
445 for(
int i = 0; i <= Fnwiebe - 1; ++i) {
446 Flab[i] =
new double *[Fnley];
447 for(
int j = 0; j <= Fnley - 1; ++j) {
448 Flab[i][j] =
new double[Fncilin];
452 printf(
"INFO: N. de leyes: %d\n", Fnley);
453 printf(
"INFO: N. de Wiebes: %d\n", Fnwiebe);
455 for(
int i = 0; i < Fnley; ++i) {
456 for(
int j = 0; j <= Fnparametros - 1; ++j) {
457 fscanf(BaseDatos,
"%lf ", &Fpar_dist[j][i]);
458 if(Fmax[j] < fabs(Fpar_dist[j][i])) {
459 Fmax[j] = fabs(Fpar_dist[j][i]);
462 for(
int j = 0; j <= Fnwiebe - 1; ++j) {
463 fscanf(BaseDatos,
"%lf %lf %lf %lf %lf ", &Flm[j][i], &Flc[j][i], &Flb[j][i], &Fli[j][i], &Fla[j][i]);
464 Fla[j][i] = 720. + Fla[j][i];
471 #pragma package(smart_init)