CLASS MANUAL
|
#include "thermodynamics.h"
#include "history.h"
#include "hyrectools.h"
#include "helium.h"
#include "wrap_hyrec.h"
Functions | |
int | thermodynamics_at_z (struct background *pba, struct thermodynamics *pth, double z, enum interpolation_method inter_mode, int *last_index, double *pvecback, double *pvecthermo) |
int | thermodynamics_init (struct precision *ppr, struct background *pba, struct thermodynamics *pth) |
int | thermodynamics_free (struct thermodynamics *pth) |
int | thermodynamics_helium_from_bbn (struct precision *ppr, struct background *pba, struct thermodynamics *pth) |
int | thermodynamics_checks (struct precision *ppr, struct background *pba, struct thermodynamics *pth) |
int | thermodynamics_workspace_init (struct precision *ppr, struct background *pba, struct thermodynamics *pth, struct thermo_workspace *ptw) |
int | thermodynamics_indices (struct background *pba, struct thermodynamics *pth, struct thermo_workspace *ptw) |
int | thermodynamics_lists (struct precision *ppr, struct background *pba, struct thermodynamics *pth, struct thermo_workspace *ptw) |
int | thermodynamics_set_parameters_reionization (struct precision *ppr, struct background *pba, struct thermodynamics *pth, struct thermo_reionization_parameters *preio) |
int | thermodynamics_solve (struct precision *ppr, struct background *pba, struct thermodynamics *pth, struct thermo_workspace *ptw, double *pvecback) |
int | thermodynamics_calculate_remaining_quantities (struct precision *ppr, struct background *pba, struct thermodynamics *pth, double *pvecback) |
int | thermodynamics_output_summary (struct background *pba, struct thermodynamics *pth) |
int | thermodynamics_workspace_free (struct thermodynamics *pth, struct thermo_workspace *ptw) |
int | thermodynamics_vector_init (struct precision *ppr, struct background *pba, struct thermodynamics *pth, double mz, struct thermo_workspace *ptw) |
int | thermodynamics_reionization_evolve_with_tau (struct thermodynamics_parameters_and_workspace *ptpaw, double mz_ini, double mz_end, double *mz_output, int mz_size) |
int | thermodynamics_derivs (double mz, double *y, double *dy, void *parameters_and_workspace, ErrorMsg error_message) |
int | thermodynamics_timescale (double mz, void *thermo_parameters_and_workspace, double *timescale, ErrorMsg error_message) |
int | thermodynamics_sources (double mz, double *y, double *dy, int index_z, void *thermo_parameters_and_workspace, ErrorMsg error_message) |
int | thermodynamics_reionization_get_tau (struct precision *ppr, struct background *pba, struct thermodynamics *pth, struct thermo_workspace *ptw) |
int | thermodynamics_vector_free (struct thermo_vector *tv) |
int | thermodynamics_calculate_conformal_drag_time (struct background *pba, struct thermodynamics *pth, double *pvecback) |
int | thermodynamics_calculate_damping_scale (struct background *pba, struct thermodynamics *pth, double *pvecback) |
int | thermodynamics_calculate_opticals (struct precision *ppr, struct thermodynamics *pth) |
int | thermodynamics_calculate_idm_and_idr_quantities (struct precision *ppr, struct background *pba, struct thermodynamics *pth, double *pvecback) |
int | thermodynamics_calculate_recombination_quantities (struct precision *ppr, struct background *pba, struct thermodynamics *pth, double *pvecback) |
int | thermodynamics_calculate_drag_quantities (struct precision *ppr, struct background *pba, struct thermodynamics *pth, double *pvecback) |
int | thermodynamics_ionization_fractions (double z, double *y, struct background *pba, struct thermodynamics *pth, struct thermo_workspace *ptw, int current_ap) |
int | thermodynamics_reionization_function (double z, struct thermodynamics *pth, struct thermo_reionization_parameters *preio, double *x) |
int | thermodynamics_output_titles (struct background *pba, struct thermodynamics *pth, char titles[_MAXTITLESTRINGLENGTH_]) |
int | thermodynamics_output_data (struct background *pba, struct thermodynamics *pth, int number_of_titles, double *data) |
int | thermodynamics_idm_quantities (struct background *pba, double z, double *y, double *dy, struct thermodynamics *pth, struct thermo_workspace *ptw, double *pvecback) |
int | thermodynamics_obtain_z_ini (struct precision *ppr, struct background *pba, struct thermodynamics *pth, struct thermo_workspace *ptw) |
int | thermodynamics_idm_initial_temperature (struct background *pba, struct thermodynamics *pth, double z_ini, struct thermo_diffeq_workspace *ptdw) |
Documented thermodynamics module
Deals with the thermodynamical evolution. This module has two purposes:
The most important differential equations to compute the free electron fraction x at each step are provided either by the HyRec 2020 or RecFastCLASS code, located in the external/ directory. The thermodynamics module integrates these equations using the generic integrator (which can be set to ndf15, rkck4, etc.) The HyRec and RecFastCLASS algorithms are used and called in the same way by this module.
In summary, the following functions can be called from other modules:
int thermodynamics_at_z | ( | struct background * | pba, |
struct thermodynamics * | pth, | ||
double | z, | ||
enum interpolation_method | inter_mode, | ||
int * | last_index, | ||
double * | pvecback, | ||
double * | pvecthermo | ||
) |
Thermodynamics quantities at given redshift z. Evaluates all thermodynamics quantities at a given value of the redshift by reading the pre-computed table and interpolating.
pba | Input: pointer to background structure |
pth | Input: pointer to the thermodynamics structure (containing pre-computed table) |
z | Input: redshift |
inter_mode | Input: interpolation mode (normal or growing_closeby) |
last_index | Input/Output: index of the previous/current point in the interpolation array (input only for closeby mode, output for both) |
pvecback | Input: vector of background quantities (used only in case z>z_initial for getting ddkappa and dddkappa; in that case, should be already allocated (!) and filled (!), with format short_info or larger; in other cases, will be ignored) |
pvecthermo | Output: vector of thermodynamics quantities (assumed to be already allocated) |
Summary:
int thermodynamics_init | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth | ||
) |
Initialize the thermodynamics structure, and in particular the thermodynamics interpolation table.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermodynamics structure |
Summary:
int thermodynamics_free | ( | struct thermodynamics * | pth | ) |
Free all memory space allocated by thermodynamics_init.
pth | Input/Output: pointer to thermodynamics structure (to be freed) |
int thermodynamics_helium_from_bbn | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth | ||
) |
Infer the primordial helium mass fraction from standard BBN calculations, as a function of the baryon density and expansion rate during BBN.
This module is simpler then the one used in arXiv:0712.2826 because it neglects the impact of a possible significant chemical potentials for electron neutrinos. The full code with xi_nu_e could be introduced here later.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermodynamics structure |
Summary:
Define local variables
int thermodynamics_checks | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth | ||
) |
Check the thermodynamics structure parameters for bounds and critical values.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input: pointer to initialized thermodynamics structure |
Summary:
int thermodynamics_workspace_init | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
struct thermo_workspace * | ptw | ||
) |
Initialize the thermodynamics workspace.
The workspace contains the arrays used for solving differential equations (dubbed thermo_diffeq_workspace), and storing all approximations, reionization parameters, heating parameters.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input: pointer to the thermodynamics structure |
ptw | Input/Output: pointer to thermodynamics workspace |
Summary:
Define local variables
int thermodynamics_indices | ( | struct background * | pba, |
struct thermodynamics * | pth, | ||
struct thermo_workspace * | ptw | ||
) |
Assign value to each relevant index in vectors of thermodynamical quantities, and the reionization parameters
pba | Input: pointer to background structure |
pth | Input/Output: pointer to thermodynamics structure |
ptw | Input/Output: pointer to thermo workspace |
Summary:
int thermodynamics_lists | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
struct thermo_workspace * | ptw | ||
) |
Initialize the lists (of redshift, tau, etc.) of the thermodynamics struct
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input/Output: pointer to thermodynamics structure |
ptw | Input: pointer to thermo workspace |
Summary:
Define local variables
int thermodynamics_set_parameters_reionization | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
struct thermo_reionization_parameters * | preio | ||
) |
This routine initializes reionization_parameters for the chosen scheme of reionization function.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input: pointer to the thermodynamics structure |
preio | Input/Output: pointer to the reionization parameters structure |
Summary:
Define local variables
int thermodynamics_solve | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
struct thermo_workspace * | ptw, | ||
double * | pvecback | ||
) |
Integrate thermodynamics with your favorite recombination code. The default options are HyRec and RecFastCLASS.
Integrate thermodynamics with HyRec or Recfast, allocate and fill part of the thermodynamics interpolation table (the rest is filled in thermodynamics_calculate_remaining_quantitie).
Version modified by Daniel Meinert and Nils Schoeneberg to use the ndf15 evolver or any other evolver inherent to CLASS, modified again by Nils Schoeneberg to use wrappers.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input/Output: pointer to thermodynamics structure where results are stored |
ptw | Input: pointer to thermo_workspace structure used to communicate with generic evolver |
pvecback | Input: pointer to an allocated (but empty) vector of background variables |
Integrate thermodynamics with your favorite recombination code. The default options are HyRec and Recfast.
Summary:
--> (c2) otherwise, just integrate quantities over the current interval.
int thermodynamics_calculate_remaining_quantities | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
double * | pvecback | ||
) |
Calculate those thermodynamics quantities which are not inside of the thermodynamics table already.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermodynamics structure |
pvecback | Input: pointer to some allocated pvecback |
Summary:
int thermodynamics_output_summary | ( | struct background * | pba, |
struct thermodynamics * | pth | ||
) |
In verbose mode, print basic information on the thermal history
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermodynamics structure |
Summary:
Define local variables
int thermodynamics_workspace_free | ( | struct thermodynamics * | pth, |
struct thermo_workspace * | ptw | ||
) |
Free the thermo_workspace structure (with the exception of the thermo_vector '->ptv' field, which is freed separately in thermo_vector_free).
pth | Input: pointer to initialized thermodynamics structure |
ptw | Input: pointer to perturbations_workspace structure to be freed |
int thermodynamics_vector_init | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
double | mz, | ||
struct thermo_workspace * | ptw | ||
) |
Initialize the field '->ptv' of a thermo_diffeq_workspace structure, which is a thermo_vector structure. This structure contains indices and values of all quantities which need to be integrated with respect to time (and only them: quantities fixed analytically or obeying constraint equations are NOT included in this vector).
The routine sets and allocates the vector y, dy and used_in_output with the right size depending on the current approximation scheme stored in the workspace. Moreover the initial conditions for each approximation scheme are calculated and set correctly.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input: pointer to the thermodynamics structure |
mz | Input: negative redshift |
ptw | Input/Output: pointer to thermodynamics workspace |
Summary:
Define local variables
int thermodynamics_reionization_evolve_with_tau | ( | struct thermodynamics_parameters_and_workspace * | ptpaw, |
double | mz_ini, | ||
double | mz_end, | ||
double * | mz_output, | ||
int | mz_size | ||
) |
If the input for reionization is tau_reio, thermodynamics_solve() calls this function instead of the evolver for dealing with the last era (the reionization era).
Instead of computing the evolution of quantities during reionization for a fixed z_reio, as the evolver would do, this function finds z_reio by bisection. First we make an initial guess for z_reio with reionization_z_start_max and then find a z_reio which leads to the given tau_reio (in the range of tolerance reionization_optical_depth_tol).
ptpaw | Input: pointer to parameters and workspace |
mz_ini | Input: initial redshift |
mz_end | Input: ending redshift |
mz_output | Input: pointer to redshift array at which output should be written |
mz_size | Input: number of redshift values in this array |
Summary:
Define local variables
int thermodynamics_derivs | ( | double | mz, |
double * | y, | ||
double * | dy, | ||
void * | parameters_and_workspace, | ||
ErrorMsg | error_message | ||
) |
Subroutine evaluating the derivative of thermodynamical quantities with respect to negative redshift mz=-z.
Automatically recognizes the current approximation interval and computes the derivatives for this interval of the vector y, which contains (Tmat, x_H, x_He) + others for exotic models.
Derivatives are obtained either by calling either HyRec 2020 (Lee and Ali-Haimoud 2020, 2007.14114) or RecFastCLASS (that is, RecFast version 1.5, modified by Daniel Meinert and Nils Schoeneberg for better precision and smoothness at early times). See credits and licences in the wrappers (in external/...)
This is one of the few functions in the code which are passed to the generic_evolver routine. Since generic_evolver should work with functions passed from various modules, the format of the arguments is a bit special:
mz | Input: negative redshift mz = -z |
y | Input: vector of variable to integrate |
dy | Output: its derivative (already allocated) |
parameters_and_workspace | Input: pointer to fixed parameters (e.g. indices) and workspace (already allocated) |
error_message | Output: error message |
Summary:
Define local variables
Set Tmat from the evolver (it is always evolved) and store it in the workspace.
--> use Recfast or HyRec to get the derivatives d(x_H)/dz and d(x_He)/dz, and store the result directly in the vector dy. This gives the derivative of the ionization fractions from recombination only (not from reionization). Of course, the full treatment would involve the actual evolution equations for x_H and x_He during reionization, but these are not yet fully implemented.
< Pass value of fsR = relative alpha (fine-structure)
< Pass value of meR = relative m_e (effective eletron mass)
int thermodynamics_timescale | ( | double | mz, |
void * | thermo_parameters_and_workspace, | ||
double * | timescale, | ||
ErrorMsg | error_message | ||
) |
This function is relevant for the rk evolver, not ndf15. It estimates a timescale 'delta z' over which quantitites vary. The rk evolver divides large intervals in steps given by this timescale multiplied by ppr->thermo_integration_stepsize.
This is one of the few functions in the code which is passed to the generic_evolver routine. Since generic_evolver should work with functions passed from various modules, the format of the arguments is a bit special:
mz | Input: minus the redshift |
thermo_parameters_and_workspace | Input: pointer to parameters and workspace |
timescale | Output: pointer to the timescale |
error_message | Output: possible errors are written here |
int thermodynamics_sources | ( | double | mz, |
double * | y, | ||
double * | dy, | ||
int | index_z, | ||
void * | thermo_parameters_and_workspace, | ||
ErrorMsg | error_message | ||
) |
This function is passed to the generic evolver and is called whenever we want to store values for a given mz.
The ionization fraction is either computed within a call to thermodynamics_derivs(). Moreover there is an automatic smoothing enabled which smoothes out the the ionization_fraction after each approximation switch. This is also the place where HyRec is asked to evolve x(z) using its internal system of differential equations over the next range [z_i, z_i+1], and to store the result in a temporary table.
This is one of the few functions in the code which is passed to the generic_evolver routine. Since generic_evolver should work with functions passed from various modules, the format of the arguments is a bit special:
All quantities are computed by a simple call to thermodynamics_derivs, which computes all necessary quantities and stores them in the ptdw thermo_diffeq_workspace structure
mz | Input: negative redshift, belonging to array mz_output |
y | Input: vector of evolved thermodynamical quantities |
dy | Input: derivatives of this vector w.r.t redshift |
index_z | Input: index in the array mz_output |
thermo_parameters_and_workspace | Input/Output: in input, all parameters needed by thermodynamics_derivs; in output, recombination table |
error_message | Output: error message |
Summary:
Define local variables
int thermodynamics_reionization_get_tau | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
struct thermo_workspace * | ptw | ||
) |
Get the optical depth of reionization tau_reio for a given thermodynamical history.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input: pointer to the thermodynamics structure |
ptw | Input: pointer to thermodynamics workspace |
Summary:
Define local variables
We are searching now for the start of reionization. This will be the time at which the optical depth tau_reio will be computed.
Note that the value reionization_parameters[index_reio_start] is only the start of the reionization function added manually, but not necessarily the total start of reionization. Reionization could be longer/shifted by energy injection.
The actual the definition of tau_reio is not unique and unambiguous. We defined it here to be the optical depth up to the time at which there is a global minimum in the free electron fraction. We search for this time by iterating over the thermodynamics table, in order to find the corresponding index_reio_start.
int thermodynamics_vector_free | ( | struct thermo_vector * | tv | ) |
Free the thermo_vector structure, which is the '->ptv' field of the thermodynamics_differential_workspace ptdw structure
tv | Input: pointer to thermo_vector structure to be freed |
int thermodynamics_calculate_conformal_drag_time | ( | struct background * | pba, |
struct thermodynamics * | pth, | ||
double * | pvecback | ||
) |
Compute the baryon drag conformal time tau_d = [int_{tau_today}^{tau} dtau -dkappa_d/dtau]
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermodynamics structure |
pvecback | Input: Initialized vector of background quantities |
Summary:
Define local variables
int thermodynamics_calculate_damping_scale | ( | struct background * | pba, |
struct thermodynamics * | pth, | ||
double * | pvecback | ||
) |
Compute the damping scale r_d = 2pi/k_d = 2pi * [int_{tau_ini}^{tau} dtau (1/kappa') 1/6 (R^2+16/15(1+R))/(1+R)^2]^1/2 = 2pi * [int_{tau_ini}^{tau} dtau (1/kappa') 1/6 (R^2/(1+R)+16/15)/(1+R)]^1/2
which is like in CosmoTherm (CT), but slightly different from Wayne Hu (WH)'s thesis eq. (5.59): The factor 16/15 in CT is 4/5 in WH, but 16/15 is taking more effects into account
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermodynamics structure |
pvecback | Input: Initialized vector of background quantities |
Summary:
Define local variables
int thermodynamics_calculate_opticals | ( | struct precision * | ppr, |
struct thermodynamics * | pth | ||
) |
Calculate quantities relating to optical phenomena like kappa' and exp(-kappa) and the visibility function, optical depth (including dark matter photon interactions if necessary)
ppr | Input: pointer to precision structure |
pth | Input/Output: pointer to thermodynamics structure |
Summary:
Define local quantities
if there is idm_g, calculate its optical contributions
int thermodynamics_calculate_idm_and_idr_quantities | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
double * | pvecback | ||
) |
Calculate dark optical depths, idm_b interation rate, and other quantities relevant for idm and idr.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermo structure |
pvecback | Input: Initialized vector of background quantities |
Summary:
int thermodynamics_calculate_recombination_quantities | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
double * | pvecback | ||
) |
Calculate various quantities at the time of recombination, as well as the time tau_cut at which visibility gets negligible and one can assume pure free-streaming.
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermodynamics structure |
pvecback | Input: pointer to some allocated pvecback |
Summary:
Define local variables
int thermodynamics_calculate_drag_quantities | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
double * | pvecback | ||
) |
Calculate various quantities at the time of ending of baryon drag (It is precisely where tau_d crosses one)
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input/Output: pointer to initialized thermodynamics structure |
pvecback | Input: pointer to some allocated pvecback |
Summary:
Define local variables
int thermodynamics_ionization_fractions | ( | double | z, |
double * | y, | ||
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
struct thermo_workspace * | ptw, | ||
int | current_ap | ||
) |
Compute ionization fractions with the RecFast of HyRec algorithm.
Compute ionization fractions using either the vector y or, in some approximation schemes, some analytic approximations. The output of this function is located in the ptw->ptdw workspace. We need to assign:
z | Input: redshift |
y | Input: vector of quantities to integrate with evolver |
pth | Input: pointer to thermodynamics structure |
pba | Input: pointer to background structure |
ptw | Input/Output: pointer to thermo workspace. Contains output for x, ... |
current_ap | Input: index of current approximation scheme |
Summary:
Define local variables
int thermodynamics_reionization_function | ( | double | z, |
struct thermodynamics * | pth, | ||
struct thermo_reionization_parameters * | preio, | ||
double * | x | ||
) |
This subroutine contains the reionization function (one for each scheme) and gives x for a given z.
z | Input: redshift |
pth | Input: pointer to thermodynamics structure, to know which scheme is used |
preio | Input: pointer to reionization parameters of the function |
x | Output: |
Summary:
int thermodynamics_output_titles | ( | struct background * | pba, |
struct thermodynamics * | pth, | ||
char | titles[_MAXTITLESTRINGLENGTH_] | ||
) |
Function for formatting the titles to be output
pba | Input: pointer to background structure |
pth | Input: pointer to the thermodynamics structure |
titles | Input: titles string containing all titles |
int thermodynamics_output_data | ( | struct background * | pba, |
struct thermodynamics * | pth, | ||
int | number_of_titles, | ||
double * | data | ||
) |
Output the data for the output into files
pba | Input: pointer to background structure |
pth | Input: pointer to the thermodynamics structure |
number_of_titles | Input: number of titles |
data | Input: pointer to data file |
int thermodynamics_idm_quantities | ( | struct background * | pba, |
double | z, | ||
double * | y, | ||
double * | dy, | ||
struct thermodynamics * | pth, | ||
struct thermo_workspace * | ptw, | ||
double * | pvecback | ||
) |
This routine computes the quantities connected to interacting dark matter with photons, baryons & dark radiation (idm), and interacting dark radiation (idr)
pba | Input: pointer to background structure |
z | Input: redshift |
y | Input: vector of evolver quantities |
dy | Input: derivative of this vector |
pth | Input: pointer to thermodynamics structure |
ptw | Input/Output: pointer to thermo workspace |
pvecback | Input: vector of background quantities |
Summary:
Define local variables
int thermodynamics_obtain_z_ini | ( | struct precision * | ppr, |
struct background * | pba, | ||
struct thermodynamics * | pth, | ||
struct thermo_workspace * | ptw | ||
) |
Check if the initial integration time and spacing needs adjusting, for example for interacting dark matter
ppr | Input: pointer to precision structure |
pba | Input: pointer to background structure |
pth | Input: pointer to thermo structure |
ptw | Input/Output: pointer to thermo workspace |
int thermodynamics_idm_initial_temperature | ( | struct background * | pba, |
struct thermodynamics * | pth, | ||
double | z_ini, | ||
struct thermo_diffeq_workspace * | ptdw | ||
) |
Set the correct initial temperature for the idm species
pba | Input: pointer to background structure |
pth | Input: pointer to thermo structure |
z_ini | Input: z_ini |
ptdw | Input/Output: pointer to thermo differential equation workspace |