244 serif::config::Config&
config = serif::config::Config::getInstance();
245 auto logFile =
config.get<std::string>(
"EOS:Helm:LogFile",
"log");
247 quill::Logger* logger = logManager.getLogger(logFile);
250 const double pi = std::numbers::pi;
251 const double amu = constants.
get(
"u").
value;
252 const double h = constants.
get(
"h").
value;
253 const double avo = constants.
get(
"N_a").
value;
254 const double kerg = constants.
get(
"kB").
value;
255 const double clight = constants.
get(
"c").
value;
257 const double kergavo = kerg*avo;
258 const double clight2 = clight * clight;
259 constexpr double ssol = 5.6704e-5;
260 const double asol = 4 * ssol / clight;
261 const double asoli3 = asol / 3;
262 const double sioncon = (2.0 * pi * amu * kerg)/(h*h);
263 constexpr double qe = 4.8032042712e-10;
264 constexpr double esqu = qe * qe;
265 constexpr double third = 1./3.;
266 std::array<double, 36> fi;
267 double T, rho, s, free, abar, zbar, ytot1, ye, ptot;
268 double prad, srad, erad, etot, stot;
269 double dpraddd, dpraddt, dpradda, dpraddz;
270 double deraddd, deraddt, deradda, deraddz;
271 double dsraddd, dsraddt, dsradda, dsraddz;
272 double dpiondd, dpiondt, dpionda, dpiondz;
273 double deiondd, deiondt, deionda, deiondz;
274 double dsiondd, dsiondt, dsionda, dsiondz;
275 double dpcouldd, dpcouldt, dpcoulda, dpcouldz;
276 double decouldd, decouldt, decoulda, decouldz;
277 double dscouldd, dscouldt, dscoulda, dscouldz;
278 double dpgasdd, dpgasdt, dpgasda, dpgasdz;
279 double degasdd, degasdt, degasda, degasdz;
280 double dsgasdd, dsgasdt, dsgasda, dsgasdz;
281 double dpepdd, dpepdt, dpepda, dpepdz;
282 double dsepdd, dsepdt, dsepda, dsepdz;
283 double deepdd, deepdt, deepda, deepdz;
284 double dxnidd, dxnida;
285 double dpresdd, dpresdt, dpresda, dpresdz;
286 double denerdd, denerdt, denerda, denerdz;
287 double dentrdd, dentrdt, dentrda, dentrdz;
288 double xni, sion, pion, eion, x, y, z;
289 double pgas, egas, sgas, pele, sele, eele, pcoul, scoul, ecoul;
303 prad = asoli3 * pow(T,4);
305 dpraddt = 4 * prad * Ti;
309 erad = 3 * prad * rhoi;
310 deraddd = -erad * rhoi;
311 deraddt = 3 * dpraddt * rhoi;
315 srad = (prad*rhoi + erad)*Ti;
316 dsraddd = (dpraddd*rhoi - prad*rhoi*rhoi + deraddd)*Ti;
317 dsraddt = (dpraddt*rhoi + deraddt - srad)*Ti;
323 xni = avo * ytot1 * rho;
324 dxnidd = avo * ytot1;
325 dxnida = -xni * ytot1;
328 dpiondd = dxnidd * kT;
329 dpiondt = xni * kerg;
330 dpionda = dxnida * kT;
333 eion = 1.5 * pion * rhoi;
334 deiondd = (1.5 * dpiondd - eion)*rhoi;
335 deiondt = 1.5 * dpiondt*rhoi;
336 deionda = 1.5 * dpionda*rhoi;
339 x = abar * abar * sqrt(abar) * rhoi/avo;
343 sion = (pion * rhoi + eion) * Ti + kergavo * ytot1 * y;
345 dsiondd = (dpiondd*rhoi - pion*rhoi*rhoi + deiondd)*Ti
346 - kergavo * rhoi * ytot1;
347 dsiondt = (dpiondt*rhoi + deiondt)*Ti - (pion*rhoi + eion) * Ti*Ti
348 + 1.5 * kergavo * Ti*ytot1;
350 dsionda = (dpionda*rhoi + deionda)*Ti + kergavo*ytot1*ytot1* (2.5 - y);
360 jat = max(0, min(jat, table.
jmax-1));
362 iat = max(0, min(iat, table.
imax-1));
365 fi[0] = table.
f[iat][jat];
366 fi[1] = table.
f[iat+1][jat];
367 fi[2] = table.
f[iat][jat+1];
368 fi[3] = table.
f[iat+1][jat+1];
369 fi[4] = table.
ft[iat][jat];
370 fi[5] = table.
ft[iat+1][jat];
371 fi[6] = table.
ft[iat][jat+1];
372 fi[7] = table.
ft[iat+1][jat+1];
373 fi[8] = table.
ftt[iat][jat];
374 fi[9] = table.
ftt[iat+1][jat];
375 fi[10] = table.
ftt[iat][jat+1];
376 fi[11] = table.
ftt[iat+1][jat+1];
377 fi[12] = table.
fd[iat][jat];
378 fi[13] = table.
fd[iat+1][jat];
379 fi[14] = table.
fd[iat][jat+1];
380 fi[15] = table.
fd[iat+1][jat+1];
381 fi[16] = table.
fdd[iat][jat];
382 fi[17] = table.
fdd[iat+1][jat];
383 fi[18] = table.
fdd[iat][jat+1];
384 fi[19] = table.
fdd[iat+1][jat+1];
385 fi[20] = table.
fdt[iat][jat];
386 fi[21] = table.
fdt[iat+1][jat];
387 fi[22] = table.
fdt[iat][jat+1];
388 fi[23] = table.
fdt[iat+1][jat+1];
389 fi[24] = table.
fddt[iat][jat];
390 fi[25] = table.
fddt[iat+1][jat];
391 fi[26] = table.
fddt[iat][jat+1];
392 fi[27] = table.
fddt[iat+1][jat+1];
393 fi[28] = table.
fdtt[iat][jat];
394 fi[29] = table.
fdtt[iat+1][jat];
395 fi[30] = table.
fdtt[iat][jat+1];
396 fi[31] = table.
fdtt[iat+1][jat+1];
397 fi[32] = table.
fddtt[iat][jat];
398 fi[33] = table.
fddtt[iat+1][jat];
399 fi[34] = table.
fddtt[iat][jat+1];
400 fi[35] = table.
fddtt[iat+1][jat+1];
402 double xt = (T - table.
t[jat]) * table.
dti_sav[jat];
403 double xd = (din - table.
d[iat]) * table.
ddi_sav[iat];
408 double si0t =
psi0(xt);
412 double si0mt =
psi0(mxt);
416 double si0d =
psi0(xd);
420 double si0md =
psi0(mxd);
426 double dsi1t =
dpsi1(xt);
430 double dsi1mt =
dpsi1(mxt);
434 double dsi1d =
dpsi1(xd);
438 double dsi1md =
dpsi1(mxd);
444 double ddsi2t =
ddpsi2(xt);
448 double ddsi2mt =
ddpsi2(mxt);
451 LOG_DEBUG(logger,
" xt, mxt = {} {}", xt, mxt);
452 LOG_DEBUG(logger,
" dti_sav[jat] = {}", table.
dti_sav[jat]);
453 LOG_DEBUG(logger,
" dt2i_sav[jat] = {}", table.
dt2i_sav[jat]);
454 LOG_DEBUG(logger,
" ddpsi0(xt) = {}",
ddpsi0(xt));
455 LOG_DEBUG(logger,
" ddpsi1(xt) = {}",
ddpsi1(xt));
456 LOG_DEBUG(logger,
" ddpsi2(xt) = {}",
ddpsi2(xt));
457 LOG_DEBUG(logger,
" ddpsi0(mxt) = {}",
ddpsi0(mxt));
458 LOG_DEBUG(logger,
" ddpsi1(mxt) = {}",
ddpsi1(mxt));
459 LOG_DEBUG(logger,
" ddpsi2(mxt) = {}",
ddpsi2(mxt));
460 LOG_DEBUG(logger,
" ddsi0t = {}", ddsi0t);
461 LOG_DEBUG(logger,
" ddsi1t = {}", ddsi1t);
462 LOG_DEBUG(logger,
" ddsi2t = {}", ddsi2t);
463 LOG_DEBUG(logger,
" ddsi0mt = {}", ddsi0mt);
464 LOG_DEBUG(logger,
" ddsi1mt = {}", ddsi1mt);
465 LOG_DEBUG(logger,
" ddsi2mt = {}", ddsi2mt);
468 ddsi0t = 0.0; ddsi1t = 0.0; ddsi2t = 1.0;
469 ddsi0mt = 0.0; ddsi1mt = 0.0; ddsi2mt = 0.0;
472 free =
h5(fi,si0t, si1t, si2t, si0mt, si1mt, si2mt,
473 si0d, si1d, si2d, si0md, si1md, si2md);
476 double df_d =
h5(fi, si0t, si1t, si2t, si0mt, si1mt, si2mt,
477 dsi0d, dsi1d, dsi2d, dsi0md, dsi1md, dsi2md);
480 double df_t =
h5(fi, dsi0t, dsi1t, dsi2t, dsi0mt, dsi1mt, dsi2mt,
481 si0d, si1d, si2d, si0md, si1md, si2md);
484 double df_tt =
h5(fi, ddsi0t, ddsi1t, ddsi2t, ddsi0mt, ddsi1mt, ddsi2mt,
485 si0d, si1d, si2d, si0md, si1md, si2md);
487 LOG_DEBUG(logger,
"df_tt = {}", df_tt);
491 double df_dt =
h5(fi, dsi0t, dsi1t, dsi2t, dsi0mt, dsi1mt, dsi2mt,
492 dsi0d, dsi1d, dsi2d, dsi0md, dsi1md, dsi2md);
523 fi[0] = table.
dpdf[iat][jat];
524 fi[1] = table.
dpdf[iat+1][jat];
525 fi[2] = table.
dpdf[iat][jat+1];
526 fi[3] = table.
dpdf[iat+1][jat+1];
527 fi[4] = table.
dpdft[iat][jat];
528 fi[5] = table.
dpdft[iat+1][jat];
529 fi[6] = table.
dpdft[iat][jat+1];
530 fi[7] = table.
dpdft[iat+1][jat+1];
531 fi[8] = table.
dpdfd[iat][jat];
532 fi[9] = table.
dpdfd[iat+1][jat];
533 fi[10] = table.
dpdfd[iat][jat+1];
534 fi[11] = table.
dpdfd[iat+1][jat+1];
535 fi[12] = table.
dpdfdt[iat][jat];
536 fi[13] = table.
dpdfdt[iat+1][jat];
537 fi[14] = table.
dpdfdt[iat][jat+1];
538 fi[15] = table.
dpdfdt[iat+1][jat+1];
542 dpepdd =
h3(fi, si0t, si1t, si0mt, si1mt, si0d, si1d, si0md, si1md);
543 dpepdd = max(ye * dpepdd,1e-30);
547 fi[0] = table.
ef[iat][jat];
548 fi[1] = table.
ef[iat+1][jat];
549 fi[2] = table.
ef[iat][jat+1];
550 fi[3] = table.
ef[iat+1][jat+1];
551 fi[4] = table.
eft[iat][jat];
552 fi[5] = table.
eft[iat+1][jat];
553 fi[6] = table.
eft[iat][jat+1];
554 fi[7] = table.
eft[iat+1][jat+1];
555 fi[8] = table.
efd[iat][jat];
556 fi[9] = table.
efd[iat+1][jat];
557 fi[10] = table.
efd[iat][jat+1];
558 fi[11] = table.
efd[iat+1][jat+1];
559 fi[12] = table.
efdt[iat][jat];
560 fi[13] = table.
efdt[iat+1][jat];
561 fi[14] = table.
efdt[iat][jat+1];
562 fi[15] = table.
efdt[iat+1][jat+1];
565 double etaele =
h3(fi, si0t, si1t, si0mt, si1mt, si0d, si1d, si0md, si1md);
568 x =
h3(fi, si0t, si1t, si0mt, si1mt, dsi0d, dsi1d, dsi0md, dsi1md);
580 fi[0] = table.
xf[iat][jat];
581 fi[1] = table.
xf[iat+1][jat];
582 fi[2] = table.
xf[iat][jat+1];
583 fi[3] = table.
xf[iat+1][jat+1];
584 fi[4] = table.
xft[iat][jat];
585 fi[5] = table.
xft[iat+1][jat];
586 fi[6] = table.
xft[iat][jat+1];
587 fi[7] = table.
xft[iat+1][jat+1];
588 fi[8] = table.
xfd[iat][jat];
589 fi[9] = table.
xfd[iat+1][jat];
590 fi[10] = table.
xfd[iat][jat+1];
591 fi[11] = table.
xfd[iat+1][jat+1];
592 fi[12] = table.
xfdt[iat][jat];
593 fi[13] = table.
xfdt[iat+1][jat];
594 fi[14] = table.
xfdt[iat][jat+1];
595 fi[15] = table.
xfdt[iat+1][jat+1];
598 double xnefer =
h3(fi, si0t, si1t, si0mt, si1mt, si0d, si1d, si0md, si1md);
601 x =
h3(fi, si0t, si1t, si0mt, si1mt, dsi0d, dsi1d, dsi0md, dsi1md);
618 s = dpepdd/ye - 2 * din * df_d;
619 dpepda = -ytot1 * (2 * pele + s * din);
620 dpepdz = rho * ytot1 * (2 * din * df_d + s);
624 dsepdt = -df_tt * ye;
626 dsepda = ytot1 * (ye * df_dt * din - sele);
627 dsepdz = -ytot1 * (ye * df_dt * rho + df_t);
629 eele = ye*free + T * sele;
631 deepdd = x * df_d + T * dsepdd;
632 deepda = -ye * ytot1 * (free + df_d * din) + T * dsepda;
633 deepdz = ytot1 * (free + ye * df_d * rho) + T * dsepdz;
637 constexpr double a1 = -0.898004;
638 constexpr double b1 = 0.96786;
639 constexpr double c1 = 0.220703;
640 constexpr double d1 = -0.86097;
641 constexpr double e1 = 2.5269;
642 constexpr double a2 = 0.29561;
643 constexpr double b2 = 1.9885;
644 constexpr double c2 = 0.288675;
648 double dsdd = z * dxnidd;
649 double dsda = z * dxnida;
651 double lami = pow(s,-1./3.);
652 double inv_lami = 1.0/lami;
654 double lamidd = z * dsdd/s;
655 double lamida = z * dsda/s;
657 double plasg = zbar * zbar * esqu * kTinv * inv_lami;
658 z = -plasg * inv_lami;
659 double plasgdd = z * lamidd;
660 double plasgda = z * lamida;
661 double plasgdt = -plasg*kTinv * kerg;
662 double plasgdz = 2 * plasg/zbar;
667 y = avo * ytot1 * kerg;
668 ecoul = y * T * (a1*plasg + b1*x + c1/x + d1);
669 pcoul = third * rho * ecoul;
670 scoul = -y * (3*b1*x - 5*c1/x + d1 * (log(plasg) - 1) - e1);
672 y = avo * ytot1 * kT * (a1 + 0.25/plasg*(b1*x - c1/x));
673 decouldd = y * plasgdd;
674 decouldt = y * plasgdt + ecoul/T;
675 decoulda = y * plasgda - ecoul/abar;
676 decouldz = y * plasgdz;
679 dpcouldd = third * ecoul + y * decouldd;
680 dpcouldt = y * decouldt;
681 dpcoulda = y * decoulda;
682 dpcouldz = y * decouldz;
685 y = -avo * kerg / (abar*plasg) * (0.75*b1*x+1.25*c1/x+d1);
686 dscouldd = y * plasgdd;
687 dscouldt = y * plasgdt;
688 dscoulda = y * plasgda - scoul/abar;
689 dscouldz = y * plasgdz;
694 x = plasg*sqrt(plasg);
696 z = c2 * x - third * a2 * y;
698 ecoul = 3 * pcoul/rho;
699 scoul = -(avo/abar) * kerg * (c2*x -a2*(b2-1)/b2*y);
701 s = 1.5*c2*x/plasg - third*a2*b2*y/plasg;
702 dpcouldd = -dpiondd*z - pion*s*plasgdd;
703 dpcouldt = -dpiondt*z - pion*s*plasgdt;
704 dpcoulda = -dpionda*z - pion*s*plasgda;
705 dpcouldz = -dpiondz*z - pion*s*plasgdz;
708 decouldd = s * dpcouldd - ecoul/rho;
709 decouldt = s * dpcouldt;
710 decoulda = s * dpcoulda;
711 decouldz = s * dpcouldz;
713 s = -avo*kerg/(abar*plasg)*(1.5*c2*x - a2*(b2-1)*y);
714 dscouldd = s * plasgdd;
715 dscouldt = s * plasgdt;
716 dscoulda = s * plasgda - scoul/abar;
717 dscouldz = s * plasgdz;
721 x = prad + pion + pele + pcoul;
722 y = erad + eion + eele + ecoul;
723 z = srad + sion + sele + scoul;
725 if(x <= 0 || y <= 0) {
727 pcoul = 0; dpcouldd=0; dpcouldt=0; dpcoulda=0; dpcouldz=0;
728 ecoul = 0; decouldd=0; decouldt=0; decoulda=0; decouldz=0;
729 scoul = 0; dscouldd=0; dscouldt=0; dscoulda=0; dscouldz=0;
734 pgas = pion + pele + pcoul;
735 egas = eion + eele + ecoul;
736 sgas = sion + sele + scoul;
738 LOG_DEBUG(logger,
"pgas = {}", pgas);
739 LOG_DEBUG(logger,
"prad = {}", prad);
740 LOG_DEBUG(logger,
"pion = {}", pion);
741 LOG_DEBUG(logger,
"pele = {}", pele);
742 LOG_DEBUG(logger,
"pcoul = {}", pcoul);
744 dpgasdd = dpiondd + dpepdd + dpcouldd;
745 dpgasdt = dpiondt + dpepdt + dpcouldt;
746 dpgasda = dpionda + dpepda + dpcoulda;
747 dpgasdz = dpiondz + dpepdz + dpcouldz;
749 LOG_DEBUG(logger,
"dpgasdd = {}", dpgasdd);
750 LOG_DEBUG(logger,
"dpraddd = {}", dpraddd);
751 LOG_DEBUG(logger,
"dpiondd = {}", dpiondd);
752 LOG_DEBUG(logger,
"dpeledd = {}", dpepdd);
753 LOG_DEBUG(logger,
"dpcouldd = {}", dpcouldd);
755 degasdd = deiondd + deepdd + decouldd;
756 degasdt = deiondt + deepdt + decouldt;
757 degasda = deionda + deepda + decoulda;
758 degasdz = deiondz + deepdz + decouldz;
760 LOG_DEBUG(logger,
"degasdd = {}", degasdd);
761 LOG_DEBUG(logger,
"deraddd = {}", deraddd);
762 LOG_DEBUG(logger,
"deiondd = {}", deiondd);
763 LOG_DEBUG(logger,
"deeledd = {}", deepdd);
764 LOG_DEBUG(logger,
"decouldd = {}", decouldd);
766 LOG_DEBUG(logger,
"degasdt = {}", degasdt);
767 LOG_DEBUG(logger,
"deraddt = {}", deraddt);
768 LOG_DEBUG(logger,
"deiondt = {}", deiondt);
769 LOG_DEBUG(logger,
"deeledt = {}", deepdt);
770 LOG_DEBUG(logger,
"decouldt = {}", decouldt);
772 dsgasdd = dsiondd + dsepdd + dscouldd;
773 dsgasdt = dsiondt + dsepdt + dscouldt;
774 dsgasda = dsionda + dsepda + dscoulda;
775 dsgasdz = dsiondz + dsepdz + dscouldz;
778 LOG_DEBUG(logger,
"sgas = {}", sgas);
779 LOG_DEBUG(logger,
"srad = {}", srad);
780 LOG_DEBUG(logger,
"sion = {}", sion);
781 LOG_DEBUG(logger,
"sele = {}", sele);
782 LOG_DEBUG(logger,
"scoul = {}", scoul);
784 LOG_DEBUG(logger,
"dsgasdd = {}", dsgasdd);
785 LOG_DEBUG(logger,
"dsraddd = {}", dsraddd);
786 LOG_DEBUG(logger,
"dsiondd = {}", dsiondd);
787 LOG_DEBUG(logger,
"dseledd = {}", dsepdd);
788 LOG_DEBUG(logger,
"dscouldd = {}", dscouldd);
790 LOG_DEBUG(logger,
"dsgasdt = {}", dsgasdt);
791 LOG_DEBUG(logger,
"dsraddt = {}", dsraddt);
792 LOG_DEBUG(logger,
"dsiondt = {}", dsiondt);
793 LOG_DEBUG(logger,
"dseledt = {}", dsepdt);
794 LOG_DEBUG(logger,
"dscouldt = {}", dscouldt);
801 dpresdd = dpraddd + dpgasdd;
802 dpresdt = dpraddt + dpgasdt;
803 dpresda = dpradda + dpgasda;
804 dpresdz = dpraddz + dpgasdz;
806 denerdd = deraddd + degasdd;
807 denerdt = deraddt + degasdt;
808 denerda = deradda + degasda;
809 denerdz = deraddz + degasdz;
811 dentrdd = dsraddd + dsgasdd;
812 dentrdt = dsraddt + dsgasdt;
813 dentrda = dsradda + dsgasda;
814 dentrdz = dsraddz + dsgasdz;
817 double zz = ptot * rhoi;
818 double zzi = rho/ptot;
819 double chit = (T/ptot)*dpresdt;
820 double chirho = zzi*dpresdd;
822 x = zz * chit/(T*cv);
823 double gamma3 = x + 1.0;
824 double gamma1 = chit * x + chirho;
825 double grad_ad = x/gamma1;
826 double gamma2 = 1.0/(1.0 - grad_ad);
827 double cp = cv * gamma1/chirho;
828 z = 1.0 + (etot + clight2)*zzi;
829 double csound = clight * sqrt(gamma1/z);
833 eos.ptot = ptot;
eos.etot = etot;
eos.stot = stot;
834 eos.pgas = pgas;
eos.egas = egas;
eos.sgas = sgas;
835 eos.prad = prad;
eos.erad = erad;
eos.srad = srad;
836 eos.chiT = chit,
eos.chiRho = chirho,
eos.csound = csound;
837 eos.gamma1 = gamma1,
eos.gamma2 = gamma2;
eos.gamma3 = gamma3;
838 eos.cV = cv,
eos.cP = cp,
eos.grad_ad = grad_ad;
839 eos.etaele = etaele,
eos.xnefer = xnefer,
eos.ye = ye;
841 eos.dpresdd = dpresdd;
eos.dentrdd = dentrdd;
eos.denerdd = denerdd;
842 eos.dpresdt = dpresdt;
eos.dentrdt = dentrdt;
eos.denerdt = denerdt;
843 eos.dpresda = dpresda;
eos.dentrda = dentrda;
eos.denerda = denerda;
844 eos.dpresdz = dpresdz;
eos.dentrdz = dentrdz;
eos.denerdz = denerdz;
848 eos.dse = T * dentrdt/denerdt - 1.0;
849 eos.dpe = (denerdd*x + T*dpresdt)/ptot - 1.0;
850 eos.dsp = -dentrdd*x/dpresdt - 1.0;