9 const double elem_ab[] = { 0.93, 0.074, 3.0e-4, 5.e-5, 4.0e-4, 7.0e-5, 1.5e-5, 2.69e-5 };
10 double elem_ab_est[] = { 0.93, 0.074, 3.0e-4, 5.e-5, 4.0e-4, 7.0e-5, 1.5e-5 };
11 double elem_ab_lod[] = { 0.92, 0.08, 2.3e-4, 6.2e-5, 4.4e-4, 7.0e-5, 1.25e-5 };
12 double elem_ab_sol[] = { 0.93, 0.074, 3.0e-4, 9.e-5, 7.e-4, 7.e-5, 1.e-5 };
13 double elem_ab_uni[] = { 0.93, 0.072, 5.0e-4, 9.e-5, 8.e-4, 8.e-5, 2.e-5 };
14 const double elem_mass[] = { 1.007, 4.002, 12.01, 14.01, 15.99, 20.18, 32.07, 55.845 };
32 C_EXPAND(11.3, 24.4, 47.9, 64.5, 392.1)
33 N_EXPAND(14.5, 29.6, 47.5, 77.5, 97.9)
34 O_EXPAND(13.6, 35.1, 54.9, 77.4, 113.9)
36 S_EXPAND(10.4, 23.3, 34.8, 47.3, 72.6)
52 int nv,
j,
k, cooling_nT, cooling_nNe, jj;
53 int ti1, ti2, ne1, ne2, nrt;
54 double mu, sT,
scrh, tmpT, tmpNe, tt1, tt2, nn1, nn2, tf1, tf2, nf1, nf2;
55 double N, n_el, rlosst, em, cf1, cf2;
59 static double E_cost, Unit_Time;
78 for (nv = 0; nv <
NIONS; nv++) CoolCoeffs.
dLIR_dX[nv] = 0.0;
95 tab =
ARRAY_3D(NIONS, ne1, ne2,
double);
105 v[nv] =
MIN(v[nv], 1.0);
106 v[nv] =
MAX(v[nv], 0.0);
119 print (
"! Radiat: negative mu\n");
139 n_el = N*(1.0 - v[
X_HI])*elem_ab[
el_H];
141 for (nv = 1; nv <
NIONS; nv++) {
143 n_el += X[nv]*CoolCoeffs.
dnel_dX[nv];
146 if (n_el/N < 1.e-4) n_el = N*1.e-4;
148 CoolCoeffs.
Ne = n_el;
163 for (nv = 1; nv <= NIONS - 2; nv++) {
164 RS[nv] = X[nv - 1]*CoolCoeffs.
Lrate[nv]
165 - X[nv] *CoolCoeffs.
Crate[nv]
166 + X[nv + 1]*CoolCoeffs.
Rrate[nv];
168 RS[0] = (1.0 - X[0])*CoolCoeffs.
Rrate[0] - X[0]*CoolCoeffs.
Crate[0];
171 RS[nv] = X[nv - 1]*CoolCoeffs.
Lrate[nv] - X[nv]*CoolCoeffs.
Crate[nv];
173 for (nv = 0; nv <
NIONS; nv++) RS[nv] *= Unit_Time;
262 tt2 =
C_TMIN*exp(ti2*C_TSTEP);
265 nn2 =
C_NeMIN*exp(ne2*C_NeSTEP);
267 tf1 = (tt2 - tmpT)/(tt2 - tt1);
268 tf2 = (tmpT - tt1)/(tt2 - tt1);
269 nf1 = (nn2 - tmpNe)/(nn2 - nn1);
270 nf2 = (tmpNe - nn1)/(nn2 - nn1);
276 for (nv = 0; nv <
NIONS; nv++) {
277 cf1 = tf1*tab[nv][ne1][ti1] + tf2*tab[nv][ne1][ti2];
278 cf2 = tf1*tab[nv][ne2][ti1] + tf2*tab[nv][ne2][ti2];
279 CoolCoeffs.
de[nv] = nf1*cf1 + nf2*cf2;
284 scrh = 0.5/(nn2 - nn1);
285 for (nv = 0; nv <
NIONS; nv++) {
286 CoolCoeffs.
de_dne[nv] = ( tab[nv][ne2][ti1] + tab[nv][ne2][ti2]
287 - tab[nv][ne1][ti1] - tab[nv][ne1][ti2])*scrh;
296 scrh = exp(-(T - 9.e+4)/4.e+4);
304 for (nv = 0; nv <
NIONS; nv++) {
305 em += X[nv]*CoolCoeffs.
de[nv]*elem_ab[
elem_part[nv]];
308 if (em < 0.0)
print(
"> 2 negative em => possitive losses???? em = %12.6e\n",em);
344 scrh = 2.6e-11/sT*elem_ab[
el_H]*T/11590.0*0.67*
CONST_eV;
345 em += scrh*(1.0 - v[
X_HI]);
363 scrh = 1.42e-27*sT*elem_ab[
el_H];
365 em += scrh*(1.0 - v[
X_HI]) + CoolCoeffs.
dLIR_dX[2]*v[X_HeII];
376 em += 1.6e-12*8.63e-6*0.3*0.0495*exp(-575.0/T)/sT * 580.0*sT/(n_el + 580.0*sT) *0.00004;
377 em += 1.6e-12*8.63e-6*0.39*0.775*exp(-8980.0/T)/sT * 1130.0*sT/(n_el + 1130.0*sT) *0.00004;
379 em += 1.6e-12*8.63e-6*8.0*4.43*exp(-5.13e4/T)/sT*1.e10*sT/(n_el + 1.e10*sT)*0.00002*0.7;
380 em += 1.6e-12*8.63e-6*2.85*0.0354*exp(-410.0/T)/sT*16.8*sT/(n_el + 16.8*sT)*0.000033*0.7;
403 rhs[RHOE] = -E_cost*rlosst;
406 if (rhs[RHOE] > 0.0) {
407 print (
"! Error: positive radiative losses! %12.6e %12.6e %12.6e \n", em, n_el, N);
428 double dn, lam, t4, tmprec, ft1, ft2, tmpT,
scrh;
429 int ti1, ti2, cindex,
i, ions, nv, tindex,
j,
k;
430 static double ***ion_data, **intData;
432 if (ion_data == NULL) {
438 for (nv = 0; nv <
NIONS; nv++ ) {
439 CoolCoeffs.
Rrate[nv] = 0.0;
440 CoolCoeffs.
Lrate[nv] = 0.0;
441 CoolCoeffs.
Crate[nv] = 0.0;
442 CoolCoeffs.
Ra[nv] = 0.0;
443 CoolCoeffs.
La[nv] = 0.0;
444 CoolCoeffs.
Ca[nv] = 0.0;
445 CoolCoeffs.
Rb[nv] = 0.0;
446 CoolCoeffs.
Lb[nv] = 0.0;
447 CoolCoeffs.
Cb[nv] = 0.0;
448 CoolCoeffs.
Rc[nv] = 0.0;
449 CoolCoeffs.
Lc[nv] = 0.0;
450 CoolCoeffs.
Cc[nv] = 0.0;
462 for (k = 0; k < 7; k++) {
463 for (ions = 0; ions <
NIONS; ions++) {
464 intData[
k][ions] = ion_data[tindex][
k][ions]*ft1 + ion_data[tindex + 1][
k][ions]*ft2;
472 CoolCoeffs.
Crate[0] += Ne*intData[0][
el_H];
473 CoolCoeffs.
Rrate[0] += Ne*intData[1][
el_H];
475 CoolCoeffs.
fCH = intData[0][
el_H];
476 CoolCoeffs.
fRH = intData[1][
el_H];
495 for (ions = 2; ions < NIONS - 1; ions++) {
501 tmprec = Ne*intData[0][ions];
502 CoolCoeffs.
Crate[ions] += tmprec;
503 CoolCoeffs.
Lrate[ions+1] += tmprec;
504 CoolCoeffs.
Ca[ions] += intData[0][ions];
505 CoolCoeffs.
La[ions+1] += intData[0][ions];
511 tmprec = Ne*intData[1][ions-1];
512 CoolCoeffs.
Crate[ions] += tmprec;
513 CoolCoeffs.
Rrate[ions-1] += tmprec;
514 CoolCoeffs.
Ca[ions] += intData[1][ions-1];
515 CoolCoeffs.
Ra[ions-1] += intData[1][ions-1];
521 tmprec = Ne*intData[2][ions-1];
522 CoolCoeffs.
Crate[ions] += tmprec;
523 CoolCoeffs.
Rrate[ions-1] += tmprec;
524 CoolCoeffs.
Ca[ions] += intData[2][ions-1];
525 CoolCoeffs.
Ra[ions-1] += intData[2][ions-1];
532 tmprec = (1.0 - v[
X_HI])*scrh;
533 CoolCoeffs.
Crate[ions] += tmprec;
534 CoolCoeffs.
Lrate[ions+1] += tmprec;
535 CoolCoeffs.
Cb[ions] -=
scrh;
536 CoolCoeffs.
Lb[ions+1] -=
scrh;
544 CoolCoeffs.
Crate[ions] += tmprec;
545 CoolCoeffs.
Rrate[ions-1] += tmprec;
546 CoolCoeffs.
Cb[ions] +=
scrh;
547 CoolCoeffs.
Rb[ions-1] +=
scrh;
552 tmprec = Ne*intData[1][ions-1];
553 CoolCoeffs.
Crate[ions] += tmprec;
554 CoolCoeffs.
Rrate[ions-1] += tmprec;
555 CoolCoeffs.
Ca[ions] += intData[1][ions-1];
556 CoolCoeffs.
Ra[ions-1] += intData[1][ions-1];
558 tmprec = Ne*intData[2][ions-1];
559 CoolCoeffs.
Crate[ions] += tmprec;
560 CoolCoeffs.
Rrate[ions-1] += tmprec;
561 CoolCoeffs.
Ca[ions] += intData[2][ions-1];
562 CoolCoeffs.
Ra[ions-1] += intData[2][ions-1];
566 CoolCoeffs.
Crate[ions] += tmprec;
567 CoolCoeffs.
Rrate[ions-1] += tmprec;
568 CoolCoeffs.
Cb[ions] +=
scrh;
569 CoolCoeffs.
Rb[ions-1] +=
scrh;
574 tmprec = Ne*intData[0][ions];
575 CoolCoeffs.
Crate[ions] += tmprec;
576 CoolCoeffs.
Lrate[ions+1] += tmprec;
577 CoolCoeffs.
Ca[ions] += intData[0][ions];
578 CoolCoeffs.
La[ions+1] += intData[0][ions];
581 tmprec = (1.0 - v[
X_HI])*scrh;
582 CoolCoeffs.
Crate[ions] += tmprec;
583 CoolCoeffs.
Lrate[ions+1] += tmprec;
584 CoolCoeffs.
Cb[ions] -=
scrh;
585 CoolCoeffs.
Lb[ions+1] -=
scrh;
593 for (ions = 4; ions <
NIONS; ions++) {
596 CoolCoeffs.
Crate[ions] += tmprec;
597 CoolCoeffs.
Rrate[ions-1] += tmprec;
599 CoolCoeffs.
Cc[ions] +=
scrh;
600 CoolCoeffs.
Rc[ions-1] +=
scrh;
609 for (ions = 2; ions <
NIONS; ions++) {
610 tmprec = Ne*intData[6][ions-1];
611 CoolCoeffs.
Crate[ions] += tmprec;
612 CoolCoeffs.
Rrate[ions-1] += tmprec;
619 CoolCoeffs.
Ca[ions] += intData[6][ions-1];
620 CoolCoeffs.
Ra[ions-1] += intData[6][ions-1];
712 for (i = 0; i < 7; i++) {
751 for (i = 0; i < (
Fe_IONS==0?7:8); i++) {
788 for (nv =
X_HeI; nv <= X_HeII; nv++) phi += u[nv];
789 for (nv =
X_HeI; nv <= X_HeII; nv++) u[nv] *= u[
RHO]/phi;
792 for (nv = X_SI; nv < X_SI+
S_IONS; nv++) phi += u[nv];
793 for (nv = X_SI; nv < X_SI+
S_IONS; nv++) u[nv] *= u[
RHO]/phi;
796 for (nv = X_OI; nv < X_OI+
O_IONS; nv++) phi += u[nv];
797 for (nv = X_OI; nv < X_OI+
O_IONS; nv++) u[nv] *= u[
RHO]/phi;
800 for (nv = X_NI; nv < X_NI+
N_IONS; nv++) phi += u[nv];
801 for (nv = X_NI; nv < X_NI+
N_IONS; nv++) u[nv] *= u[
RHO]/phi;
804 for (nv = X_CI; nv < X_CI+
C_IONS; nv++) phi += u[nv];
805 for (nv = X_CI; nv < X_CI+
C_IONS; nv++) u[nv] *= u[
RHO]/phi;
808 for (nv = X_NeI; nv < X_NeI+
Ne_IONS; nv++) phi += u[nv];
809 for (nv = X_NeI; nv < X_NeI+
Ne_IONS; nv++) u[nv] *= u[
RHO]/phi;
#define UNIT_DENSITY
Unit density in gr/cm^3.
#define CONST_eV
Electron Volt in erg.
void NormalizeIons(double *)
void Radiat(double *v, double *rhs)
double g_smallPressure
Small value for pressure fix.
#define ARRAY_3D(nx, ny, nz, type)
#define S_EXPAND(a, b, c, d, e)
#define N_EXPAND(a, b, c, d, e)
#define UNIT_VELOCITY
Unit velocity in cm/sec.
#define CONST_NA
Avogadro Contant.
#define UNIT_LENGTH
Unit Length in cm.
#define C_EXPAND(a, b, c, d, e)
void print(const char *fmt,...)
const double coll_ion_dE[]
double g_minCoolingTemp
The minimum temperature (in K) below which cooling is suppressed.
double MeanMolecularWeight(double *V)
void Find_Rates(double T, double Ne, double N, double *v)
#define O_EXPAND(a, b, c, d, e)
#define ARRAY_2D(nx, ny, type)
int Create_Losses_Tables(double ***, int *, int *)
int Create_Ion_Coeff_Tables(double ***)
#define QUIT_PLUTO(e_code)
#define Fe_EXPAND(a, b, c)