152 |
assert(!isnan(data->R)); |
assert(!isnan(data->R)); |
153 |
#endif |
#endif |
154 |
|
|
155 |
|
fprintf(stderr,"helm_ideal_tau = %f\n",helm_ideal_tau(tau,delta,data->ideal)); |
156 |
|
fprintf(stderr,"helm_resid_tau = %f\n",helm_resid_tau(tau,delta,data)); |
157 |
|
fprintf(stderr,"helm_ideal = %f\n",helm_ideal(tau,delta,data->ideal)); |
158 |
|
fprintf(stderr,"helm_resid = %f\n",helm_resid(tau,delta,data)); |
159 |
return data->R * ( |
return data->R * ( |
160 |
tau * (helm_ideal_tau(tau,delta,data->ideal) + helm_resid_tau(tau,delta,data)) |
tau * (helm_ideal_tau(tau,delta,data->ideal) + helm_resid_tau(tau,delta,data)) |
161 |
- helm_ideal(tau,delta,data->ideal) - helm_resid(tau,delta,data) |
- helm_ideal(tau,delta,data->ideal) - helm_resid(tau,delta,data) |
214 |
sum += pt->a0 * pow(tau, pt->t0); |
sum += pt->a0 * pow(tau, pt->t0); |
215 |
} |
} |
216 |
|
|
217 |
#if 0 |
#if 1 |
218 |
et = &(data->et[0]); |
et = &(data->et[0]); |
219 |
for(i=0; i<data->ne; ++i, ++et){ |
for(i=0; i<data->ne; ++i, ++et){ |
220 |
sum += et->b * log( 1 - exp(- et->B * tau)); |
sum += et->b * log( 1 - exp(- et->B * tau)); |
240 |
sum += pt->a0 * pt->t0 * pow(tau, pt->t0 - 1); |
sum += pt->a0 * pt->t0 * pow(tau, pt->t0 - 1); |
241 |
} |
} |
242 |
|
|
243 |
#if 0 |
#if 1 |
244 |
|
/* FIXME we're missing the '2.5' in the alpha0 expression for Nitrogen... */ |
245 |
et = &(data->et[0]); |
et = &(data->et[0]); |
246 |
for(i=0; i<data->ne; ++i, ++et){ |
for(i=0; i<data->ne; ++i, ++et){ |
247 |
sum += et->b * log( 1 - exp(- et->B * tau)); |
sum += et->b * log( 1 - exp(- et->B * tau)); |
251 |
} |
} |
252 |
|
|
253 |
/** |
/** |
254 |
Residual part of helmholtz function. Note: we have NOT prematurely |
Residual part of helmholtz function. |
|
optimised here ;-) |
|
255 |
*/ |
*/ |
256 |
double helm_resid(double tau, double delta, const HelmholtzData *data){ |
double helm_resid(double tau, double delta, const HelmholtzData *data){ |
257 |
|
#if 0 |
258 |
|
double sum, res = 0; |
259 |
|
unsigned n, i; |
260 |
|
const HelmholtzPowTerm *pt; |
261 |
|
const HelmholtzExpTerm *et; |
262 |
|
|
263 |
|
n = data->np; |
264 |
|
pt = &(data->pt[0]); |
265 |
|
|
266 |
|
/* power terms */ |
267 |
|
sum = 0; |
268 |
|
unsigned oldl; |
269 |
|
for(i=0; i<n; ++i){ |
270 |
|
sum += pt->a * pow(tau, pt->t) * ipow(delta, pt->d); |
271 |
|
oldl = pt->l; |
272 |
|
++pt; |
273 |
|
if(i+1==n || oldl != pt->l){ |
274 |
|
if(oldl == 0){ |
275 |
|
res += sum; |
276 |
|
}else{ |
277 |
|
res += sum * exp(-ipow(delta,pt->l)); |
278 |
|
} |
279 |
|
sum = 0; |
280 |
|
} |
281 |
|
} |
282 |
|
|
283 |
|
/* now the exponential terms */ |
284 |
|
n = data->ne; |
285 |
|
et = &(data->et[0]); |
286 |
|
for(i=0; i< n; ++i){ |
287 |
|
fprintf(stderr,"i = %d, a = %e, t = %f, d = %d, phi = %d, beta = %d, gamma = %f\n",i+1, et->a, et->t, et->d, et->phi, et->beta, et->gamma); |
288 |
|
|
289 |
|
double e1 = -et->phi * delta*delta |
290 |
|
+ 2 * et->phi * delta |
291 |
|
- et->beta * tau * tau |
292 |
|
+ 2 * et->beta * et->gamma * tau |
293 |
|
- et->phi |
294 |
|
- et->beta * et->gamma * et->gamma; |
295 |
|
sum = et->a * pow(tau,et->t) * ipow(delta,et->d) * exp(e1); |
296 |
|
//fprintf(stderr,"sum = %f\n",sum); |
297 |
|
res += sum; |
298 |
|
++et; |
299 |
|
} |
300 |
|
|
301 |
|
return res; |
302 |
|
} |
303 |
|
|
304 |
|
#else |
305 |
double sum; |
double sum; |
306 |
double res = 0; |
double res = 0; |
307 |
double delX; |
double delX; |
308 |
unsigned l; |
unsigned l; |
309 |
unsigned np, i; |
unsigned n, i; |
310 |
const HelmholtzPowTerm *pt; |
const HelmholtzPowTerm *pt; |
311 |
|
const HelmholtzExpTerm *et; |
312 |
|
|
313 |
np = data->np; |
n = data->np; |
314 |
pt = &(data->pt[0]); |
pt = &(data->pt[0]); |
315 |
|
|
316 |
delX = 1; |
delX = 1; |
317 |
|
|
318 |
l = 0; |
l = 0; |
319 |
sum = 0; |
sum = 0; |
320 |
for(i=0; i<np; ++i){ |
for(i=0; i<n; ++i){ |
321 |
//fprintf(stderr,"i = %d, a = %e, t = %f, d = %d, l = %d\n",i+1, pt->a, pt->t, pt->d, pt->l); |
//fprintf(stderr,"i = %d, a = %e, t = %f, d = %d, l = %d\n",i+1, pt->a, pt->t, pt->d, pt->l); |
322 |
sum += pt->a * pow(tau, pt->t) * ipow(delta, pt->d); |
sum += pt->a * pow(tau, pt->t) * ipow(delta, pt->d); |
323 |
++pt; |
++pt; |
324 |
//fprintf(stderr,"l = %d\n",l); |
//fprintf(stderr,"l = %d\n",l); |
325 |
if(i+1==np || l != pt->l){ |
if(i+1==n || l != pt->l){ |
326 |
if(l==0){ |
if(l==0){ |
327 |
//fprintf(stderr,"Adding non-exp term\n"); |
//fprintf(stderr,"Adding non-exp term\n"); |
328 |
res += sum; |
res += sum; |
331 |
res += sum * exp(-delX); |
res += sum * exp(-delX); |
332 |
} |
} |
333 |
/* set l to new value */ |
/* set l to new value */ |
334 |
if(i+1!=np){ |
if(i+1!=n){ |
335 |
l = pt->l; |
l = pt->l; |
336 |
//fprintf(stderr,"New l = %d\n",l); |
//fprintf(stderr,"New l = %d\n",l); |
337 |
delX = ipow(delta,l); |
delX = ipow(delta,l); |
340 |
} |
} |
341 |
} |
} |
342 |
|
|
343 |
|
/* now the exponential terms */ |
344 |
|
n = data->ne; |
345 |
|
et = &(data->et[0]); |
346 |
|
for(i=0; i< n; ++i){ |
347 |
|
fprintf(stderr,"i = %d, a = %e, t = %f, d = %d, phi = %d, beta = %d, gamma = %f\n",i+1, et->a, et->t, et->d, et->phi, et->beta, et->gamma); |
348 |
|
|
349 |
|
double e1 = -et->phi * delta*delta |
350 |
|
+ 2 * et->phi * delta |
351 |
|
- et->beta * tau * tau |
352 |
|
+ 2 * et->beta * et->gamma * tau |
353 |
|
- et->phi |
354 |
|
- et->beta * et->gamma * et->gamma; |
355 |
|
sum = et->a * pow(tau,et->t) * ipow(delta,et->d) * exp(e1); |
356 |
|
//fprintf(stderr,"sum = %f\n",sum); |
357 |
|
res += sum; |
358 |
|
++et; |
359 |
|
} |
360 |
|
|
361 |
return res; |
return res; |
362 |
} |
} |
363 |
|
#endif |
364 |
|
|
365 |
/** |
/** |
366 |
Derivative of the helmholtz residual function with respect to |
Derivative of the helmholtz residual function with respect to |
407 |
double del2 = delta*delta; |
double del2 = delta*delta; |
408 |
double tau2 = tau*tau; |
double tau2 = tau*tau; |
409 |
double gam2 = et->gamma * et->gamma; |
double gam2 = et->gamma * et->gamma; |
410 |
sum = -et->a * pow(tau,et->t) * ipow(delta,et->d-1) |
double e1 = -et->phi * del2 |
|
* (2 * et->phi * del2 - 2 * et->phi * delta - et->d) |
|
|
* exp(-et->phi * del2 |
|
411 |
+ 2 * et->phi * delta |
+ 2 * et->phi * delta |
412 |
- et->beta * tau2 |
- et->beta * tau2 |
413 |
+ 2 * et->beta * et->gamma * tau |
+ 2 * et->beta * et->gamma * tau |
414 |
- et->phi |
- et->phi |
415 |
- et->beta * gam2 |
- et->beta * gam2; |
416 |
); |
sum = -et->a * pow(tau,et->t) * ipow(delta,et->d-1) |
417 |
|
* (2 * et->phi * del2 - 2 * et->phi * delta - et->d) |
418 |
|
* exp(e1); |
419 |
//fprintf(stderr,"sum = %f\n",sum); |
//fprintf(stderr,"sum = %f\n",sum); |
420 |
res += sum; |
res += sum; |
421 |
++et; |
++et; |
435 |
double res = 0; |
double res = 0; |
436 |
double delX; |
double delX; |
437 |
unsigned l; |
unsigned l; |
438 |
unsigned np, i; |
unsigned n, i; |
439 |
const HelmholtzPowTerm *pt; |
const HelmholtzPowTerm *pt; |
440 |
|
const HelmholtzExpTerm *et; |
441 |
|
|
442 |
np = data->np; |
n = data->np; |
443 |
pt = &(data->pt[0]); |
pt = &(data->pt[0]); |
444 |
|
|
445 |
delX = 1; |
delX = 1; |
446 |
|
|
447 |
l = 0; |
l = 0; |
448 |
sum = 0; |
sum = 0; |
449 |
for(i=0; i<np; ++i){ |
for(i=0; i<n; ++i){ |
450 |
if(pt->t){ |
if(pt->t){ |
451 |
//fprintf(stderr,"i = %d, a = %e, t = %f, d = %d, l = %d\n",i+1, pt->a, pt->t, pt->d, pt->l); |
//fprintf(stderr,"i = %d, a = %e, t = %f, d = %d, l = %d\n",i+1, pt->a, pt->t, pt->d, pt->l); |
452 |
sum += pt->a * pow(tau, pt->t - 1) * ipow(delta, pt->d) * pt->t; |
sum += pt->a * pow(tau, pt->t - 1) * ipow(delta, pt->d) * pt->t; |
453 |
} |
} |
454 |
++pt; |
++pt; |
455 |
//fprintf(stderr,"l = %d\n",l); |
//fprintf(stderr,"l = %d\n",l); |
456 |
if(i+1==np || l != pt->l){ |
if(i+1==n || l != pt->l){ |
457 |
if(l==0){ |
if(l==0){ |
458 |
//fprintf(stderr,"Adding non-exp term\n"); |
//fprintf(stderr,"Adding non-exp term\n"); |
459 |
res += sum; |
res += sum; |
462 |
res += sum * exp(-delX); |
res += sum * exp(-delX); |
463 |
} |
} |
464 |
/* set l to new value */ |
/* set l to new value */ |
465 |
if(i+1!=np){ |
if(i+1!=n){ |
466 |
l = pt->l; |
l = pt->l; |
467 |
//fprintf(stderr,"New l = %d\n",l); |
//fprintf(stderr,"New l = %d\n",l); |
468 |
delX = ipow(delta,l); |
delX = ipow(delta,l); |
471 |
} |
} |
472 |
} |
} |
473 |
|
|
474 |
|
#if 1 |
475 |
|
/* now the exponential terms */ |
476 |
|
n = data->ne; |
477 |
|
et = &(data->et[0]); |
478 |
|
for(i=0; i< n; ++i){ |
479 |
|
//fprintf(stderr,"i = %d, a = %e, t = %f, d = %d, phi = %d, beta = %d, gamma = %f\n",i+1, et->a, et->t, et->d, et->phi, et->beta, et->gamma); |
480 |
|
|
481 |
|
double tau2 = tau*tau; |
482 |
|
double del2 = delta*delta; |
483 |
|
double gam2 = et->gamma * et->gamma; |
484 |
|
double e1 = -et->phi * del2 |
485 |
|
+ 2 * et->phi * delta |
486 |
|
- et->beta * tau2 |
487 |
|
+ 2 * et->beta * et->gamma * tau |
488 |
|
- et->phi |
489 |
|
- et->beta * gam2; |
490 |
|
sum = -et->a * pow(tau,et->t - 1) * ipow(delta,et->d) |
491 |
|
* (2 * et->beta * tau2 - 2 * et->beta * et->gamma * tau - et->t) |
492 |
|
* exp(e1); |
493 |
|
//fprintf(stderr,"sum = %f\n",sum); |
494 |
|
res += sum; |
495 |
|
++et; |
496 |
|
} |
497 |
|
#endif |
498 |
|
|
499 |
|
return res; |
500 |
|
|
501 |
return res; |
return res; |
502 |
} |
} |
503 |
|
|