1#ifndef COOLING_COSMO_HINCLUDED
2#define COOLING_COSMO_HINCLUDED
21#define CL_B_gm (6.022e23*(938.7830/931.494))
22#define CL_k_Boltzmann 1.38066e-16
23#define CL_eV_erg 1.60219e-12
24#define CL_eV_per_K (CL_k_Boltzmann/CL_eV_erg)
31#define CL_RT_FLOAT double
32#define CL_RT_MIN 1e-100
41#define CL_MAX_NEG_EXP_ARG -500.
43#define CL_NMAXBYTETABLE 56000
54 double dMassFracHelium;
61 double Y_HI,Y_HeI,Y_HeII;
68 double HI,HII,HeI,HeII,HeIII;
77 double Rate_Phot_HeII;
81 double Heat_Phot_HeII;
89 double Rate_Phot_HeII;
93 double Heat_Phot_HeII;
97 double Cool_Coll_HeII;
98 double Cool_Diel_HeII;
101 double Cool_LowTFactor;
107 CL_RT_FLOAT Rate_Coll_HI;
108 CL_RT_FLOAT Rate_Coll_HeI;
109 CL_RT_FLOAT Rate_Coll_HeII;
110 CL_RT_FLOAT Rate_Radr_HII;
111 CL_RT_FLOAT Rate_Radr_HeII;
112 CL_RT_FLOAT Rate_Radr_HeIII;
113 CL_RT_FLOAT Rate_Diel_HeII;
115 CL_RT_FLOAT Cool_Brem_1;
116 CL_RT_FLOAT Cool_Brem_2;
117 CL_RT_FLOAT Cool_Radr_HII;
118 CL_RT_FLOAT Cool_Radr_HeII;
119 CL_RT_FLOAT Cool_Radr_HeIII;
120 CL_RT_FLOAT Cool_Line_HI;
121 CL_RT_FLOAT Cool_Line_HeI;
122 CL_RT_FLOAT Cool_Line_HeII;
123 CL_RT_FLOAT Cool_LowT;
150 int bUVTableUsesTime;
156 double dComovingGmPerCcUnit;
157 double dErgPerGmUnit;
159 double dErgPerGmPerSecUnit;
160 double diErgPerGmUnit;
208 STIFF *IntegratorContext;
210 double rho,ExternalHeating,E,ZMetal;
213 double Y_Total0, Y_Total1;
219void CoolFinalize( COOL *cl );
220clDerivsData *CoolDerivsInit(COOL *cl);
221void CoolDerivsFinalize(clDerivsData *cld ) ;
223void clInitConstants( COOL *cl,
double dGMPerCcunit,
double dComovingGmPerCcUnit,
224 double dErgPerGmUnit,
double dSecUnit,
double dKpcUnit, COOLPARAM CoolParam);
225void clInitUV(COOL *cl,
int nTableColumns,
int nTableRows,
double *dTableData );
226void clInitRatesTable( COOL *cl,
double TMin,
double TMax,
int nTable );
227void CoolInitRatesTable( COOL *cl, COOLPARAM CoolParam);
229void clRatesTableError( COOL *cl );
230void clRatesRedshift( COOL *cl,
double z,
double dTime );
232void clRates( COOL *cl,
RATE *Rate,
double T,
double rho );
233double clCoolTotal( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho,
double ZMetal );
235void clPrintCool( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho );
236void clPrintCoolFile( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho, FILE *fp );
238void clAbunds( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho);
239double clThermalEnergy(
double Y_Total,
double T );
240double clTemperature(
double Y_Total,
double E );
241double clRateCollHI(
double T );
242double clRateCollHeI(
double T );
243double clRateCollHeII(
double T );
244double clRateRadrHII(
double T );
245double clRateRadrHeII(
double T );
246double clRateDielHeII(
double T );
247double clRateRadrHeIII(
double T );
248double clCoolBrem1(
double T );
249double clCoolBrem2(
double T );
250double clCoolRadrHII(
double T );
251double clCoolRadrHeII(
double T );
252double clCoolRadrHeIII(
double T );
253double clCoolLineHI(
double T );
254double clCoolLineHeI(
double T );
255double clCoolLineHeII(
double T );
256double clCoolLowT(
double T );
258double clEdotInstant ( COOL *cl,
PERBARYON *Y,
RATE *Rate,
double rho,
259 double ZMetal,
double *EdotHeat,
double *EdotCool );
260void clIntegrateEnergy(COOL *cl, clDerivsData *clData,
PERBARYON *Y,
double *E,
261 double ExternalHeating,
double rho,
double ZMetal,
double dt );
262void clIntegrateEnergyDEBUG(COOL *cl,
PERBARYON *Y,
double *E,
263 double ExternalHeating,
double rho,
double ZMetal,
double dt );
266void clDerivs(
double x,
const double *y,
double *dHeat,
double *dCool,
269int clJacobn(
double x,
const double y[],
double dfdx[],
double *dfdy,
void *Data) ;
271void CoolAddParams( COOLPARAM *CoolParam, PRM );
272void CoolLogParams( COOLPARAM *CoolParam, FILE *fp );
273void CoolOutputArray( COOLPARAM *CoolParam,
int,
int *,
char * );
275#define COOL_ARRAY0_EXT "HI"
276double COOL_ARRAY0(COOL *cl_, COOLPARTICLE *cp,
double aa);
277#define COOL_ARRAY0( cl_, cp, aa ) ((cp)->Y_HI)
278double COOL_SET_ARRAY0(COOL *cl_, COOLPARTICLE *cp,
double aa,
double bb_val);
279#define COOL_SET_ARRAY0( cl_, cp, aa, bb_val ) ((cp)->Y_HI = (bb_val))
281#define COOL_ARRAY1_EXT "HeI"
282double COOL_ARRAY1(COOL *cl_, COOLPARTICLE *cp,
double aa);
283#define COOL_ARRAY1( cl_, cp, aa ) ((cp)->Y_HeI)
284double COOL_SET_ARRAY1(COOL *cl_, COOLPARTICLE *cp,
double aa,
double bb_val);
285#define COOL_SET_ARRAY1( cl_, cp, aa, bb_val ) ((cp)->Y_HeI = (bb_val))
287#define COOL_ARRAY2_EXT "HeII"
288double COOL_ARRAY2(COOL *cl_, COOLPARTICLE *cp,
double aa);
289#define COOL_ARRAY2( cl_, cp, aa ) ((cp)->Y_HeII)
290double COOL_SET_ARRAY2(COOL *cl_, COOLPARTICLE *cp,
double aa,
double bb_val);
291#define COOL_SET_ARRAY2( cl_, cp, aa, bb_val ) ((cp)->Y_HeII = (bb_val))
293#define COOL_ARRAY3_EXT "H2"
294double COOL_ARRAY3(COOL *cl, COOLPARTICLE *cp,
double ZMetal);
295#define COOL_ARRAY3(cl_, cp, aa ) (0)
296double COOL_SET_ARRAY3(COOL *cl_, COOLPARTICLE *cp,
double aa,
double bb_val);
297#define COOL_SET_ARRAY3( cl_, cp, aa, bb_val ) (0)
299double COOL_EDOT( COOL *cl_, COOLPARTICLE *cp_,
double ECode_,
double rhoCode_,
double ZMetal_,
double *posCode_ );
300#define COOL_EDOT( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_) (CoolCodeWorkToErgPerGmPerSec( cl_, CoolEdotInstantCode( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_ )))
302double COOL_COOLING( COOL *cl_, COOLPARTICLE *cp_,
double ECode_,
double rhoCode_,
double ZMetal_,
double *posCode_ );
303#define COOL_COOLING( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_) (CoolCodeWorkToErgPerGmPerSec( cl_, CoolCoolingCode( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_ )))
305double COOL_HEATING( COOL *cl_, COOLPARTICLE *cp_,
double ECode_,
double rhoCode_,
double ZMetal_,
double *posCode_ );
306#define COOL_HEATING( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_) (CoolCodeWorkToErgPerGmPerSec( cl_, CoolHeatingCode( cl_, cp_, ECode_, rhoCode_, ZMetal_, posCode_ )))
308void CoolPARTICLEtoPERBARYON(COOL *cl_,
PERBARYON *Y, COOLPARTICLE *cp,
double HTotal,
double HeTotal);
310#define CoolPARTICLEtoPERBARYON(cl_, Y, cp) { \
311 (Y)->HI = (cp)->Y_HI; \
312 (Y)->HII = (cl_)->Y_H - (Y)->HI; \
313 (Y)->HeI = (cp)->Y_HeI; \
314 (Y)->HeII = (cp)->Y_HeII; \
315 (Y)->HeIII = (cl_)->Y_He - (Y)->HeI - (Y)->HeII; \
316 (Y)->e = (Y)->HII + (Y)->HeII + 2*(Y)->HeIII; \
317 (Y)->Total = (Y)->e + (cl_)->Y_H + (cl_)->Y_He; }
319void CoolPERBARYONtoPARTICLE(COOL *cl_,
PERBARYON *Y, COOLPARTICLE *cp);
321#define CoolPERBARYONtoPARTICLE(cl_, Y, cp) { \
322 (cp)->Y_HI = (Y)->HI; \
323 (cp)->Y_HeI = (Y)->HeI; \
324 (cp)->Y_HeII = (Y)->HeII; }
327double CoolEnergyToTemperature( COOL *Cool, COOLPARTICLE *cp,
double E,
double fMetal );
328double CoolCodeEnergyToTemperature( COOL *Cool, COOLPARTICLE *cp,
double E,
double fMetal );
331void CoolSetTime( COOL *Cool,
double dTime,
double z );
333double CoolCodeTimeToSeconds( COOL *Cool,
double dCodeTime );
335#define CoolCodeTimeToSeconds( Cool, dCodeTime ) ((Cool)->dSecUnit*(dCodeTime))
337double CoolSecondsToCodeTime( COOL *Cool,
double dTime );
339#define CoolSecondsToCodeTime( Cool, dTime ) ((dTime)/(Cool)->dSecUnit)
341double CoolCodeEnergyToErgPerGm( COOL *Cool,
double dCodeEnergy );
343#define CoolCodeEnergyToErgPerGm( Cool, dCodeEnergy ) ((Cool)->dErgPerGmUnit*(dCodeEnergy))
345double CoolErgPerGmToCodeEnergy( COOL *Cool,
double dEnergy );
347#define CoolErgPerGmToCodeEnergy( Cool, dEnergy ) ((Cool)->diErgPerGmUnit*(dEnergy))
349double CoolCodeWorkToErgPerGmPerSec( COOL *Cool,
double dCodeWork );
351#define CoolCodeWorkToErgPerGmPerSec( Cool, dCodeWork ) ((Cool)->dErgPerGmPerSecUnit*(dCodeWork))
353double CoolErgPerGmPerSecToCodeWork( COOL *Cool,
double dWork );
355#define CoolErgPerGmPerSecToCodeWork( Cool, dWork ) ((dWork)/(Cool)->dErgPerGmPerSecUnit)
357double CodeDensityToComovingGmPerCc( COOL *Cool,
double dCodeDensity );
359#define CodeDensityToComovingGmPerCc( Cool, dCodeDensity ) ((Cool)->dComovingGmPerCcUnit*(dCodeDensity))
361void CoolIntegrateEnergy(COOL *cl, clDerivsData *cData, COOLPARTICLE *cp,
double *E,
362 double ExternalHeating,
double rho,
double ZMetal,
double tStep );
364void CoolIntegrateEnergyCode(COOL *cl, clDerivsData *cData, COOLPARTICLE *cp,
double *E,
365 double ExternalHeating,
double rho,
double ZMetal,
double *r,
double tStep );
367void CoolDefaultParticleData( COOLPARTICLE *cp );
369void CoolInitEnergyAndParticleData( COOL *cl, COOLPARTICLE *cp,
double *E,
double dDensity,
double dTemp,
double fMetal );
372double CoolHeatingRate( COOL *cl, COOLPARTICLE *cp,
double E,
double dDensity,
double ZMetal );
374double CoolEdotInstantCode(COOL *cl, COOLPARTICLE *cp,
double ECode,
375 double rhoCode,
double ZMetal,
double *posCode );
376double CoolCoolingCode(COOL *cl, COOLPARTICLE *cp,
double ECode,
377 double rhoCode,
double ZMetal,
double *posCode );
378double CoolHeatingCode(COOL *cl, COOLPARTICLE *cp,
double ECode,
379 double rhoCode,
double ZMetal,
double *posCode );
381void CoolCodePressureOnDensitySoundSpeed( COOL *cl, COOLPARTICLE *cp,
double uPred,
double fDensity,
double gamma,
double gammam1,
double *PoverRho,
double *c );
384#define CoolCodePressureOnDensitySoundSpeed( cl__, cp__, uPred__, fDensity__, gamma__, gammam1__, PoverRho__, c__ ) { \
385 *(PoverRho__) = ((5./3.-1)*(uPred__)); \
386 *(c__) = sqrt((5./3.)*(*(PoverRho__))); }
394void CoolTableReadInfo( COOLPARAM *CoolParam,
int cntTable,
int *nTableColumns,
char *suffix );
396void 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