2#ifndef COOLING_METAL_HINCLUDED
3#define COOLING_METAL_HINCLUDED
25#define CL_B_gm (6.022e23*(938.7830/931.494))
26#define CL_k_Boltzmann 1.38066e-16
27#define CL_eV_erg 1.60219e-12
28#define CL_eV_per_K (CL_k_Boltzmann/CL_eV_erg)
35#define CL_RT_FLOAT double
36#define CL_RT_MIN 1e-100
45#define CL_MAX_NEG_EXP_ARG -500.
47#define CL_NMAXBYTETABLE 56000
48#define MU_METAL 17.6003
49#define ZSOLAR 0.0130215
62 double dMassFracHelium;
66 double dLymanWernerFrac;
73 double f_HI,f_HeI,f_HeII;
80 double HI,HII,HeI,HeII,HeIII;
89 double Rate_Phot_HeII;
90 double Rate_Phot_H2_cosmo;
94 double Heat_Phot_HeII;
100 double Rate_Phot_HeI;
101 double Rate_Phot_HeII;
102 double Rate_Phot_H2_cosmo;
105 double Heat_Phot_HeI;
106 double Heat_Phot_HeII;
110 double Cool_Coll_HeI;
111 double Cool_Coll_HeII;
112 double Cool_Diel_HeII;
117 double Cool_LowTFactor;
122 CL_RT_FLOAT Rate_Coll_HI;
123 CL_RT_FLOAT Rate_Coll_HeI;
124 CL_RT_FLOAT Rate_Coll_HeII;
125 CL_RT_FLOAT Rate_Coll_e_H2;
126 CL_RT_FLOAT Rate_Coll_HI_H2;
127 CL_RT_FLOAT Rate_Coll_H2_H2;
128 CL_RT_FLOAT Rate_Coll_Hm_e;
129 CL_RT_FLOAT Rate_Coll_HI_e;
130 CL_RT_FLOAT Rate_Coll_HII_H2;
131 CL_RT_FLOAT Rate_Coll_Hm_HII;
132 CL_RT_FLOAT Rate_HI_e;
133 CL_RT_FLOAT Rate_HI_Hm;
134 CL_RT_FLOAT Rate_Radr_HII;
135 CL_RT_FLOAT Rate_Radr_HeII;
136 CL_RT_FLOAT Rate_Radr_HeIII;
137 CL_RT_FLOAT Rate_Diel_HeII;
138 CL_RT_FLOAT Rate_Chtr_HeII;
140 CL_RT_FLOAT Cool_Brem_1;
141 CL_RT_FLOAT Cool_Brem_2;
142 CL_RT_FLOAT Cool_Radr_HII;
143 CL_RT_FLOAT Cool_Radr_HeII;
144 CL_RT_FLOAT Cool_Radr_HeIII;
145 CL_RT_FLOAT Cool_Line_HI;
146 CL_RT_FLOAT Cool_Line_HeI;
147 CL_RT_FLOAT Cool_Line_HeII;
148 CL_RT_FLOAT Cool_Line_H2_H;
149 CL_RT_FLOAT Cool_Line_H2_H2;
150 CL_RT_FLOAT Cool_Line_H2_He;
151 CL_RT_FLOAT Cool_Line_H2_e;
152 CL_RT_FLOAT Cool_Line_H2_HII;
153 CL_RT_FLOAT Cool_LowT;
185 double MetalnHlogMin;
186 double MetalnHlogMax;
191 float ***MetalCoolln;
192 float ***MetalHeatln;
193 double *Rate_DustForm_H2;
200 int bUVTableUsesTime;
207 double dLymanWernerFrac;
209 double dComovingGmPerCcUnit;
211 double dErgPerGmUnit;
213 double dErgPerGmPerSecUnit;
214 double diErgPerGmUnit;
220 double dMassFracHelium;
224#if defined(COOLDEBUG)
260 double LymanWernerCode;
276 double collion_H2_H2;
277 double collion_HII_H2;
289 STIFF *IntegratorContext;
291 double rho,ExternalHeating,E,ZMetal,dLymanWerner, columnL;
295 double Y_H, Y_He, Y_eMax;
296 double Y_Total0, Y_Total1;
303void CoolFinalize( COOL *cl );
304clDerivsData *CoolDerivsInit(COOL *cl);
305void CoolDerivsFinalize(clDerivsData *cld ) ;
307void clInitConstants( COOL *cl,
double dGMPerCcunit,
double dComovingGmPerCcUnit,
308 double dErgPerGmUnit,
double dSecUnit,
double dKpcUnit, COOLPARAM CoolParam);
309void clInitUV(COOL *cl,
int nTableColumns,
int nTableRows,
double *dTableData );
310void clInitRatesTable( COOL *cl,
double TMin,
double TMax,
int nTable );
311void clReadMetalTable(COOL *cl, COOLPARAM clParam);
312void clRateMetalTable(COOL *cl,
RATE *Rate,
double T,
double rho,
double Y_H,
double ZMetal);
313void clHHeTotal(COOL *cl,
double ZMetal);
314void CoolInitRatesTable( COOL *cl, COOLPARAM CoolParam);
316void clRatesTableError( COOL *cl );
317void clRatesRedshift( COOL *cl,
double z,
double dTime );
318double clHeatTotal ( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho,
double ZMetal );
319void clRates( COOL *cl,
RATE *Rate,
double T,
double rho,
double ZMetal,
double columnL,
double Rate_Phot_H2_stellar);
320double clCoolTotal( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho,
double ZMetal );
322void clPrintCool( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho );
323void clPrintCoolFile( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho,
double ZMetal, FILE *fp );
325void clAbunds( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho,
double ZMetal);
326double clThermalEnergy(
double Y_Total,
double T );
327double clTemperature(
double Y_Total,
double E );
328double clSelfShield (
double yH2,
double h);
329double clDustShield (
double yHI,
double yH2,
double z,
double h);
330double clRateCollHI(
double T );
331double clRateCollHeI(
double T );
332double clRateCollHeII(
double T );
333double clRateColl_e_H2(
double T );
334double clRateColl_HI_H2(
double T );
335double clRateColl_H2_H2(
double T );
336double clRateColl_HII_H2(
double T);
337double clRateColl_Hm_e(
double T);
338double clRateColl_HI_e(
double T);
339double clRateColl_Hm_HII(
double T);
340double clRateHI_e(
double T);
341double clRateHI_Hm(
double T);
342double clRateRadrHII(
double T );
343double clRateRadrHeII(
double T );
344double clRateDielHeII(
double T );
345double clRateChtrHeII(
double T);
346double clRateRadrHeIII(
double T );
347double clCoolBrem1(
double T );
348double clCoolBrem2(
double T );
349double clCoolRadrHII(
double T );
350double clCoolRadrHeII(
double T );
351double clCoolRadrHeIII(
double T );
352double clCoolLineHI(
double T );
353double clCoolLineHeI(
double T );
354double clCoolLineHeII(
double T );
355double clCoolLineH2_table(
double T );
356double clCoolLineH2_HI(
double T );
357double clCoolLineH2_H2(
double T );
358double clCoolLineH2_He(
double T );
359double clCoolLineH2_e(
double T );
360double clCoolLineH2_HII(
double T );
361double clCoolLowT(
double T );
362double clRateDustFormH2(
double z,
double clump);
363double clEdotInstant ( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho,
364 double ZMetal,
double *dEdotHeat,
double *dEdotCool );
365 void clIntegrateEnergy(COOL *cl, clDerivsData *clData,
PERBARYON *Y,
double *E,
366 double ExternalHeating,
double rho,
double ZMetal,
double dt,
double columnL,
double dLymanWerner );
367 void clIntegrateEnergyDEBUG(COOL *cl, clDerivsData *clData,
PERBARYON *Y,
double *E,
368 double ExternalHeating,
double rho,
double ZMetal,
double dt );
371void clDerivs(
double x,
const double *y,
double *yheat,
372 double *ycool,
void *Data) ;
374void CoolAddParams( COOLPARAM *CoolParam, PRM );
375void CoolLogParams( COOLPARAM *CoolParam, FILE *fp );
376void CoolOutputArray( COOLPARAM *CoolParam,
int,
int *,
char * );
378#define COOL_ARRAY0_EXT "HI"
379double COOL_ARRAY0(COOL *cl, COOLPARTICLE *cp,
double ZMetal);
380double COOL_SET_ARRAY0(COOL *cl, COOLPARTICLE *cp,
double ZMetal,
double val);
382#define COOL_ARRAY1_EXT "HeI"
383double COOL_ARRAY1(COOL *cl, COOLPARTICLE *cp,
double ZMetal);
384double COOL_SET_ARRAY1(COOL *cl, COOLPARTICLE *cp,
double ZMetal,
double val);
386#define COOL_ARRAY2_EXT "HeII"
387double COOL_ARRAY2(COOL *cl, COOLPARTICLE *cp,
double ZMetal);
388double COOL_SET_ARRAY2(COOL *cl, COOLPARTICLE *cp,
double ZMetal,
double val);
390#define COOL_ARRAY3_EXT "H2"
391double COOL_ARRAY3(COOL *cl, COOLPARTICLE *cp,
double ZMetal);
392double COOL_SET_ARRAY3(COOL *cl, COOLPARTICLE *cp,
double ZMetal,
double val);
394double COOL_EDOT( COOL *cl_, COOLPARTICLE *cp_,
double ECode_,
double rhoCode_,
double ZMetal_,
double *posCode_,
double columnL_ );
395#define COOL_EDOT( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_, columnL_) (CoolCodeWorkToErgPerGmPerSec( cl_, CoolEdotInstantCode( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_ , columnL_)))
397double COOL_COOLING( COOL *cl_, COOLPARTICLE *cp_,
double ECode_,
double rhoCode_,
double ZMetal_,
double *posCode_ ,
double columnL_);
398#define COOL_COOLING( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_, columnL_) (CoolCodeWorkToErgPerGmPerSec( cl_, CoolCoolingCode( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_ , columnL_)))
400double COOL_HEATING( COOL *cl_, COOLPARTICLE *cp_,
double ECode_,
double rhoCode_,
double ZMetal_,
double *posCode_,
double columnL_ );
401#define COOL_HEATING( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_, columnL_) (CoolCodeWorkToErgPerGmPerSec( cl_, CoolHeatingCode( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_ , columnL_)))
403void clSetAbundanceTotals(COOL *cl,
double ZMetal,
double *Y_H,
double *Y_He,
double *Y_eMAX);
404void CoolPARTICLEtoPERBARYON(COOL *cl_,
PERBARYON *Y, COOLPARTICLE *cp,
double ZMetal);
405void CoolPERBARYONtoPARTICLE(COOL *cl_,
PERBARYON *Y, COOLPARTICLE *cp,
double ZMetal);
407double CoolLymanWerner(
double dAge);
409double CoolEnergyToTemperature( COOL *Cool, COOLPARTICLE *cp,
double E,
double ZMetal);
410double CoolCodeEnergyToTemperature( COOL *Cool, COOLPARTICLE *cp,
double E,
double ZMetal);
413void CoolSetTime( COOL *Cool,
double dTime,
double z );
415double CoolCodeTimeToSeconds( COOL *Cool,
double dCodeTime );
417#define CoolCodeTimeToSeconds( Cool, dCodeTime ) ((Cool)->dSecUnit*(dCodeTime))
419double CoolSecondsToCodeTime( COOL *Cool,
double dTime );
421#define CoolSecondsToCodeTime( Cool, dTime ) ((dTime)/(Cool)->dSecUnit)
423double CoolCodeEnergyToErgPerGm( COOL *Cool,
double dCodeEnergy );
425#define CoolCodeEnergyToErgPerGm( Cool, dCodeEnergy ) ((Cool)->dErgPerGmUnit*(dCodeEnergy))
427double CoolErgPerGmToCodeEnergy( COOL *Cool,
double dEnergy );
429#define CoolErgPerGmToCodeEnergy( Cool, dEnergy ) ((Cool)->diErgPerGmUnit*(dEnergy))
431double CoolCodeWorkToErgPerGmPerSec( COOL *Cool,
double dCodeWork );
433#define CoolCodeWorkToErgPerGmPerSec( Cool, dCodeWork ) ((Cool)->dErgPerGmPerSecUnit*(dCodeWork))
435double CoolErgPerGmPerSecToCodeWork( COOL *Cool,
double dWork );
437#define CoolErgPerGmPerSecToCodeWork( Cool, dWork ) ((dWork)/(Cool)->dErgPerGmPerSecUnit)
439double CodeDensityToComovingGmPerCc( COOL *Cool,
double dCodeDensity );
441#define CodeDensityToComovingGmPerCc( Cool, dCodeDensity ) ((Cool)->dComovingGmPerCcUnit*(dCodeDensity))
443void CoolIntegrateEnergy(COOL *cl, clDerivsData *cData, COOLPARTICLE *cp,
double *E,
444 double ExternalHeating,
double rho,
double ZMetal,
double tStep,
double columnL );
446void CoolIntegrateEnergyCode(COOL *cl, clDerivsData *cData, COOLPARTICLE *cp,
double *E,
447 double ExternalHeating,
double rho,
double ZMetal,
double *r,
double tStep,
double columnL );
449void CoolDefaultParticleData( COOLPARTICLE *cp );
451void CoolInitEnergyAndParticleData( COOL *cl, COOLPARTICLE *cp,
double *E,
double dDensity,
double dTemp,
double ZMetal);
454double CoolHeatingRate( COOL *cl, COOLPARTICLE *cp,
double E,
double dDensity,
double ZMetal,
double columnL);
456double CoolEdotInstantCode(COOL *cl, COOLPARTICLE *cp,
double ECode,
457 double rhoCode,
double ZMetal,
double *posCode,
double columnL );
458double CoolCoolingCode(COOL *cl, COOLPARTICLE *cp,
double ECode,
459 double rhoCode,
double ZMetal,
double *posCode,
double columnL );
460double CoolHeatingCode(COOL *cl, COOLPARTICLE *cp,
double ECode,
461 double rhoCode,
double ZMetal,
double *posCode,
double columnL );
463void CoolCodePressureOnDensitySoundSpeed( COOL *cl, COOLPARTICLE *cp,
double uPred,
double fDensity,
double gamma,
double gammam1,
double *PoverRho,
double *c );
466#define CoolCodePressureOnDensitySoundSpeed( cl__, cp__, uPred__, fDensity__, gamma__, gammam1__, PoverRho__, c__ ) { \
467 *(PoverRho__) = ((5./3.-1)*(uPred__)); \
468 *(c__) = sqrt((5./3.)*(*(PoverRho__))); }
476void CoolTableReadInfo( COOLPARAM *CoolParam,
int cntTable,
int *nTableColumns,
char *suffix );
478void CoolTableRead( COOL *Cool,
int nData,
void *vData);
return structure for clTestCool()
Definition cooling_cosmo.h:187
Heating/Cooling context: parameters and tables.
Definition cooling_boley.h:83
per-particle cooling data
Definition cooling_boley.h:68
abundance of various species in particles/baryon
Definition cooling_boley.h:75
structure to hold Temperature independent cooling and heating rates
Definition cooling_cosmo.h:86
structure to hold Temperature dependent cooling rates
Definition cooling_cosmo.h:106
Rate information for a given particle.
Definition cooling_cosmo.h:170
photoionization and heating rates from a uniform UV background
Definition cooling_cosmo.h:72
context for calculating cooling derivatives
Definition cooling_boley.h:108
COOL * cl
pointer to cooling context
Definition cooling_boley.h:110