Rate Functions¶
Grackle supports the calculation of individual rate coefficients at specific temperatures. When running Grackle’s chemistry solving schemes, these coefficients are computed internally, at the temperatures required by the solver. However, there may be cases where obtaining a specific rate coefficient at a given temperature is desirable – with Grackle’s initialisation routines ported from Fortran to C, this is now possible. Documented here is an overview of how to use these functions, alongside relevant examples.
All rate coefficients are designated an individual function for their calculation; their definitions
are located within rate_coefficients.c
and their prototypes in rate_coefficients.h
, both found
within the grackle/src/clib/
directory. The vast majority of the rate coefficient’s functions are
of the same general form, however there are exceptions which will be discussed individually.
The General Rate Function¶
Structure¶
As mentioned previously, most rate functions have the same structure and can therefore be called identically as below, where RATE_NAME is the name of the coefficient you wish to calculate.
-
double RATE_NAME_rate(double T, double units, chemistry_data *my_chemistry);¶
This returns the value of the rate at a given temperature. The calculated rate will be divided through by the value given in the units argument. If set to 1, the rate will be returned in CGS units.
- Parameters:
T (double) – gas temperature
units (double) – units
*my_chemistry (chemistry_data) – pointer to chemistry_data struct containing parameters.
- Return type:
double
- Returns:
value of rate coefficient
Examples¶
Example 1¶
Suppose we wish to print the value of the k1
rate coefficient at a
temperature of 1000 K. Given we have already configured our chemistry
parameters within a chemistry_data
struct named
my_chemistry
, we can obtain the result by simply calling the
function as follows:
#include "grackle_rate_functions.h"
double result = k1_rate(1e3, 1., &my_chemistry);
printf("k1 %e", result);
where our result is in cgs units.
Example 2¶
The rate coefficient reHII
can be calculated via two different
methods depending on the status of the CaseBRecombination
parameter within the chemistry_data
struct (named
my_chemistry
in this example), which can take values of either 0
or 1. Suppose we wish to compare the results of each calculation
method over an arbitrary temperature range, we can achieve this by the
following:
#include "grackle_rate_functions.h"
// Define temperature range to calculate coefficients over
double tempStart = 1e1;
double tempEnd = 1e8;
double numTemps = 1e3;
double tempSpacing = (tempEnd - tempStart) / numTemps;
// Create arrays for results storage
double caseAResults[(int) numTemps];
double caseBResults[(int) numTemps];
// Set value of my_chemistry.CaseBRecombination
for (int caseB = 0; caseB < 2; caseB++) {
my_chemistry.CaseBRecombination = caseB;
// Iterate over temperature range
for (int i = 0; i < numTemps; i++) {
double temp = tempStart + i*tempSpacing;
// Store results in appropriate array
if (caseB == 0) {
caseAResults[i] = reHII_rate(temp, 1., &my_chemistry);
} else {
caseBResults[i] = reHII_rate(temp, 1., &my_chemistry);
}
}
}
where we have created an array of reHII
coefficients for both
settings of chemistry_data.CaseBRecombination
over the same
temperature range.
The k13dd Rate Function¶
Structure¶
The k13dd
rate function, which describes the density-dependent
dissociation of molecular hydrogen, is similar in form to the general
rate functions, the only difference being its additional input
parameter. This is a pointer to an array of length 14 *
sizeof(double)
, which will hold the outputs of the function. The
function always calculates fourteen rate parameters, the first seven
of which correspond to direct collisional dissociation, whilst the
latter seven correspond to dissociative tunneling – please see
Martin, Schwarz & Mandy, 1996 for further
details on how these are calculated. The structure of the function is
then:
-
void k13dd_rate(double T, double units, double *results_array, chemistry_data *my_chemistry);¶
Calculates the density-dependent molecular hydrogen dissociation rate. The calculated rate will be divided through by the value given in the units argument. If set to 1, the units will be CGS.
- Parameters:
T (double) – gas temperature
units (double) – units
*results_array (double) – pointer to array of length
14 * sizeof(double)
in which the calculated rate coefficients will be stored.*my_chemistry (chemistry_data) – pointer to chemistry_data struct containing parameters.
- Return type:
void
- Returns:
Nothing is returned, but values are set for the array pointed to by the
results_array
pointer.
Examples¶
Suppose we would like to print the rate coefficients for the
dissociation of molecular hydrogen via the tunneling process at a
temperature of 1e5 K. Given we have already configured our chemistry
parameters within a chemistry_data
struct named
my_chemistry
, we can obtain the coefficients by the following:
#include "grackle_rate_functions.h"
// Create an array of the correct size for result storage.
double results[14];
// Call the function at the desired temperature, getting results in cgs units.
k13dd_rate(1e5, 1., &results, &my_chemistry);
// Print the results corresponding to dissociative tunneling.
for (int i = 7; i < 14; i++) {
printf("k13dd %e", results[i]);
}
The h2dust Rate Function¶
Structure¶
The h2dust
rate function, which describes the formation of
molecular hydrogen on dust grains, is similar in form to the general
rate functions, the only difference being its additional input
parameter; a double
which represents the dust temperature. The
function returns a double
just as the general rate function, its
structure is then:
-
double h2dust_rate(double T, double T_dust, double units, chemistry_data *my_chemistry);¶
- Parameters:
T (double) – gas temperature
T_gas (double) – dust temperature
units (double) – units
*my_chemistry (chemistry_data) – pointer to chemistry_data struct containing parameters.
- Return type:
double
- Returns:
value of rate coefficient
Examples¶
Suppose we would like to calculate the h2dust
rate coefficients
for a gas temperature of 1e4 K, with a varying dust temperature. Given
we have already configured our chemistry parameters within a
:c:data`chemistry_data` struct named my_chemistry
, we can obtain
the coefficients by the following:
#include "grackle_rate_functions.h"
// Define dust temperature range to calculate coefficients over.
double tempStart_dust = 1e1;
double tempEnd_dust = 1e6;
double numTemps_dust = 1e3;
double tempSpacing_dust = (tempEnd_dust - tempStart_dust) / numTemps_dust;
// Create array for results storage.
double h2dust_results[(int) numTemps_dust];
// Loop over dust temperatures.
for (int i=0; i < numTemps_dust; i++){
double temp_dust = tempStart_dust + i*tempSpacing_dust;
h2dust_results[i] = h2dust_rate(1e4, temp_dust, 1., &my_chemistry);
}
The Scalar Rate Functions¶
Structure¶
The scalar rate functions (comp
, gammah
, gamma_isrf
) are
simpler than the general rate functions due to their temperature
independence. They require only two inputs and return a single
double
, their structure is as below, where SCALAR_NAME is the name
of the scalar rate coefficient you wish to calculate. These are called
in the same way as the general rate functions, ignoring the
temperature dependancy – please see their documentation for basic
examples.
-
double SCALAR_NAME_rate(double units, chemistry_data *my_chemistry);¶
This returns the value of the rate. The calculated rate will be divided through by the value given in the units argument. If set to 1, the rate will be returned in CGS units.
- Parameters:
units (double) – units
*my_chemistry (chemistry_data) – pointer to chemistry_data struct containing parameters.
- Return type:
double
- Returns:
value of rate coefficient