PageRenderTime 33ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/src/enzo/po_solver.C

https://bitbucket.org/devinsilvia/enzo-dengo-devin
C | 4061 lines | 2455 code | 1027 blank | 579 comment | 239 complexity | 6ecdafb4c4c038fa6c6a3d50b6d6f2ca MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1, GPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. /* THIS FILE HAS BEEN AUTO-GENERATED. DO NOT EDIT. */
  2. /* This is C++ code to read HDF5 files for
  3. reaction rates, cooling rates, and initial
  4. conditions for the chemical network defined
  5. by the user. In addition, this contains
  6. code for calculating temperature from the
  7. gas energy and computing the RHS and the
  8. Jacobian of the system of equations which
  9. will be fed into the solver.
  10. */
  11. #include "po_solver.h"
  12. po_data *po_setup_data(void) {
  13. po_data *data = (po_data *) malloc(sizeof(po_data));
  14. /* Temperature-related pieces */
  15. data->bounds[0] = 1.0;
  16. data->bounds[1] = 1e+12;
  17. data->nbins = 1024 - 1;
  18. data->dbin = (log(data->bounds[1]) - log(data->bounds[0])) / data->nbins;
  19. data->idbin = 1.0L / data->dbin;
  20. /* Redshift-related pieces */
  21. data->z_bounds[0] = 0.0;
  22. data->z_bounds[1] = 15.0;
  23. data->n_zbins = 100 - 1;
  24. data->d_zbin = (log(data->z_bounds[1] + 1.0) - log(data->z_bounds[0] + 1.0)) / data->n_zbins;
  25. data->id_zbin = 1.0L / data->d_zbin;
  26. po_read_rate_tables(data);
  27. fprintf(stderr, "Successfully read in rate tables.\n");
  28. po_read_cooling_tables(data);
  29. fprintf(stderr, "Successfully read in cooling rate tables.\n");
  30. return data;
  31. }
  32. int po_main(int argc, char** argv)
  33. {
  34. po_data *data = po_setup_data();
  35. /* Initial conditions */
  36. hid_t file_id = H5Fopen("po_initial_conditions.h5", H5F_ACC_RDONLY, H5P_DEFAULT);
  37. if (file_id < 0) {fprintf(stderr, "Failed to open "
  38. "po_initial_conditions.h5 so dying.\n");
  39. return(1);}
  40. /* Allocate the correct number of cells */
  41. hsize_t dims; /* We have flat versus number of species */
  42. /* Check gas energy to get the number of cells */
  43. fprintf(stderr, "Getting dimensionality from ge:\n");
  44. herr_t status = H5LTget_dataset_info(file_id, "/ge", &dims, NULL, NULL);
  45. if(status == -1) {
  46. fprintf(stderr, "Error opening initial conditions file.\n");
  47. return 1;
  48. }
  49. fprintf(stderr, " ncells = % 3i\n", (int) dims);
  50. data->ncells = dims;
  51. int N = 16;
  52. double *atol, *rtol;
  53. atol = (double *) alloca(N * dims * sizeof(double));
  54. rtol = (double *) alloca(N * dims * sizeof(double));
  55. double *tics = (double *) alloca(dims * sizeof(double));
  56. double *ics = (double *) alloca(dims * N * sizeof(double));
  57. double *input = (double *) alloca(dims * N * sizeof(double));
  58. unsigned int i = 0, j;
  59. fprintf(stderr, "Reading I.C. for /HI\n");
  60. H5LTread_dataset_double(file_id, "/HI", tics);
  61. for (j = 0; j < dims; j++) {
  62. ics[j * N + i] = tics[j] / 1.00794; /* Convert to number density */
  63. atol[j * N + i] = tics[j] * 1e-09;
  64. rtol[j * N + i] = 1e-09;
  65. if(j==0) {
  66. fprintf(stderr, "HI[0] = %0.3g, atol => % 0.16g\n",
  67. tics[j], atol[j]);
  68. }
  69. }
  70. i++;
  71. fprintf(stderr, "Reading I.C. for /HII\n");
  72. H5LTread_dataset_double(file_id, "/HII", tics);
  73. for (j = 0; j < dims; j++) {
  74. ics[j * N + i] = tics[j] / 1.00794; /* Convert to number density */
  75. atol[j * N + i] = tics[j] * 1e-09;
  76. rtol[j * N + i] = 1e-09;
  77. if(j==0) {
  78. fprintf(stderr, "HII[0] = %0.3g, atol => % 0.16g\n",
  79. tics[j], atol[j]);
  80. }
  81. }
  82. i++;
  83. fprintf(stderr, "Reading I.C. for /HeI\n");
  84. H5LTread_dataset_double(file_id, "/HeI", tics);
  85. for (j = 0; j < dims; j++) {
  86. ics[j * N + i] = tics[j] / 4.002602; /* Convert to number density */
  87. atol[j * N + i] = tics[j] * 1e-09;
  88. rtol[j * N + i] = 1e-09;
  89. if(j==0) {
  90. fprintf(stderr, "HeI[0] = %0.3g, atol => % 0.16g\n",
  91. tics[j], atol[j]);
  92. }
  93. }
  94. i++;
  95. fprintf(stderr, "Reading I.C. for /HeII\n");
  96. H5LTread_dataset_double(file_id, "/HeII", tics);
  97. for (j = 0; j < dims; j++) {
  98. ics[j * N + i] = tics[j] / 4.002602; /* Convert to number density */
  99. atol[j * N + i] = tics[j] * 1e-09;
  100. rtol[j * N + i] = 1e-09;
  101. if(j==0) {
  102. fprintf(stderr, "HeII[0] = %0.3g, atol => % 0.16g\n",
  103. tics[j], atol[j]);
  104. }
  105. }
  106. i++;
  107. fprintf(stderr, "Reading I.C. for /HeIII\n");
  108. H5LTread_dataset_double(file_id, "/HeIII", tics);
  109. for (j = 0; j < dims; j++) {
  110. ics[j * N + i] = tics[j] / 4.002602; /* Convert to number density */
  111. atol[j * N + i] = tics[j] * 1e-09;
  112. rtol[j * N + i] = 1e-09;
  113. if(j==0) {
  114. fprintf(stderr, "HeIII[0] = %0.3g, atol => % 0.16g\n",
  115. tics[j], atol[j]);
  116. }
  117. }
  118. i++;
  119. fprintf(stderr, "Reading I.C. for /de\n");
  120. H5LTread_dataset_double(file_id, "/de", tics);
  121. for (j = 0; j < dims; j++) {
  122. ics[j * N + i] = tics[j] / 1.0; /* Convert to number density */
  123. atol[j * N + i] = tics[j] * 1e-09;
  124. rtol[j * N + i] = 1e-09;
  125. if(j==0) {
  126. fprintf(stderr, "de[0] = %0.3g, atol => % 0.16g\n",
  127. tics[j], atol[j]);
  128. }
  129. }
  130. i++;
  131. fprintf(stderr, "Reading I.C. for /ge\n");
  132. H5LTread_dataset_double(file_id, "/ge", tics);
  133. for (j = 0; j < dims; j++) {
  134. ics[j * N + i] = tics[j] / 1.0; /* Convert to number density */
  135. atol[j * N + i] = tics[j] * 1e-09;
  136. rtol[j * N + i] = 1e-09;
  137. if(j==0) {
  138. fprintf(stderr, "ge[0] = %0.3g, atol => % 0.16g\n",
  139. tics[j], atol[j]);
  140. }
  141. }
  142. i++;
  143. fprintf(stderr, "Reading I.C. for /OI\n");
  144. H5LTread_dataset_double(file_id, "/OI", tics);
  145. for (j = 0; j < dims; j++) {
  146. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  147. atol[j * N + i] = tics[j] * 1e-09;
  148. rtol[j * N + i] = 1e-09;
  149. if(j==0) {
  150. fprintf(stderr, "OI[0] = %0.3g, atol => % 0.16g\n",
  151. tics[j], atol[j]);
  152. }
  153. }
  154. i++;
  155. fprintf(stderr, "Reading I.C. for /OII\n");
  156. H5LTread_dataset_double(file_id, "/OII", tics);
  157. for (j = 0; j < dims; j++) {
  158. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  159. atol[j * N + i] = tics[j] * 1e-09;
  160. rtol[j * N + i] = 1e-09;
  161. if(j==0) {
  162. fprintf(stderr, "OII[0] = %0.3g, atol => % 0.16g\n",
  163. tics[j], atol[j]);
  164. }
  165. }
  166. i++;
  167. fprintf(stderr, "Reading I.C. for /OIII\n");
  168. H5LTread_dataset_double(file_id, "/OIII", tics);
  169. for (j = 0; j < dims; j++) {
  170. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  171. atol[j * N + i] = tics[j] * 1e-09;
  172. rtol[j * N + i] = 1e-09;
  173. if(j==0) {
  174. fprintf(stderr, "OIII[0] = %0.3g, atol => % 0.16g\n",
  175. tics[j], atol[j]);
  176. }
  177. }
  178. i++;
  179. fprintf(stderr, "Reading I.C. for /OIV\n");
  180. H5LTread_dataset_double(file_id, "/OIV", tics);
  181. for (j = 0; j < dims; j++) {
  182. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  183. atol[j * N + i] = tics[j] * 1e-09;
  184. rtol[j * N + i] = 1e-09;
  185. if(j==0) {
  186. fprintf(stderr, "OIV[0] = %0.3g, atol => % 0.16g\n",
  187. tics[j], atol[j]);
  188. }
  189. }
  190. i++;
  191. fprintf(stderr, "Reading I.C. for /OV\n");
  192. H5LTread_dataset_double(file_id, "/OV", tics);
  193. for (j = 0; j < dims; j++) {
  194. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  195. atol[j * N + i] = tics[j] * 1e-09;
  196. rtol[j * N + i] = 1e-09;
  197. if(j==0) {
  198. fprintf(stderr, "OV[0] = %0.3g, atol => % 0.16g\n",
  199. tics[j], atol[j]);
  200. }
  201. }
  202. i++;
  203. fprintf(stderr, "Reading I.C. for /OVI\n");
  204. H5LTread_dataset_double(file_id, "/OVI", tics);
  205. for (j = 0; j < dims; j++) {
  206. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  207. atol[j * N + i] = tics[j] * 1e-09;
  208. rtol[j * N + i] = 1e-09;
  209. if(j==0) {
  210. fprintf(stderr, "OVI[0] = %0.3g, atol => % 0.16g\n",
  211. tics[j], atol[j]);
  212. }
  213. }
  214. i++;
  215. fprintf(stderr, "Reading I.C. for /OVII\n");
  216. H5LTread_dataset_double(file_id, "/OVII", tics);
  217. for (j = 0; j < dims; j++) {
  218. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  219. atol[j * N + i] = tics[j] * 1e-09;
  220. rtol[j * N + i] = 1e-09;
  221. if(j==0) {
  222. fprintf(stderr, "OVII[0] = %0.3g, atol => % 0.16g\n",
  223. tics[j], atol[j]);
  224. }
  225. }
  226. i++;
  227. fprintf(stderr, "Reading I.C. for /OVIII\n");
  228. H5LTread_dataset_double(file_id, "/OVIII", tics);
  229. for (j = 0; j < dims; j++) {
  230. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  231. atol[j * N + i] = tics[j] * 1e-09;
  232. rtol[j * N + i] = 1e-09;
  233. if(j==0) {
  234. fprintf(stderr, "OVIII[0] = %0.3g, atol => % 0.16g\n",
  235. tics[j], atol[j]);
  236. }
  237. }
  238. i++;
  239. fprintf(stderr, "Reading I.C. for /OIX\n");
  240. H5LTread_dataset_double(file_id, "/OIX", tics);
  241. for (j = 0; j < dims; j++) {
  242. ics[j * N + i] = tics[j] / 15.9994; /* Convert to number density */
  243. atol[j * N + i] = tics[j] * 1e-09;
  244. rtol[j * N + i] = 1e-09;
  245. if(j==0) {
  246. fprintf(stderr, "OIX[0] = %0.3g, atol => % 0.16g\n",
  247. tics[j], atol[j]);
  248. }
  249. }
  250. i++;
  251. H5Fclose(file_id);
  252. double dtf = 3.1557e13;
  253. double dt = -1.0;
  254. double z = -1.0;
  255. for (i = 0; i < dims * N; i++) input[i] = ics[i];
  256. double ttot;
  257. ttot = dengo_evolve_po(dtf, dt, z, input, rtol, atol, dims, data);
  258. /* Write results to HDF5 file */
  259. file_id = H5Fcreate("po_solution.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
  260. hsize_t dimsarr[1];
  261. dimsarr[0] = dims;
  262. i = 0;
  263. double HI[dims];
  264. for (j = 0; j < dims; j++) {
  265. HI[j] = input[j * N + i] * 1.00794;
  266. }
  267. fprintf(stderr, "Writing solution for /HI\n");
  268. H5LTmake_dataset_double(file_id, "/HI", 1, dimsarr, HI);
  269. i++;
  270. double HII[dims];
  271. for (j = 0; j < dims; j++) {
  272. HII[j] = input[j * N + i] * 1.00794;
  273. }
  274. fprintf(stderr, "Writing solution for /HII\n");
  275. H5LTmake_dataset_double(file_id, "/HII", 1, dimsarr, HII);
  276. i++;
  277. double HeI[dims];
  278. for (j = 0; j < dims; j++) {
  279. HeI[j] = input[j * N + i] * 4.002602;
  280. }
  281. fprintf(stderr, "Writing solution for /HeI\n");
  282. H5LTmake_dataset_double(file_id, "/HeI", 1, dimsarr, HeI);
  283. i++;
  284. double HeII[dims];
  285. for (j = 0; j < dims; j++) {
  286. HeII[j] = input[j * N + i] * 4.002602;
  287. }
  288. fprintf(stderr, "Writing solution for /HeII\n");
  289. H5LTmake_dataset_double(file_id, "/HeII", 1, dimsarr, HeII);
  290. i++;
  291. double HeIII[dims];
  292. for (j = 0; j < dims; j++) {
  293. HeIII[j] = input[j * N + i] * 4.002602;
  294. }
  295. fprintf(stderr, "Writing solution for /HeIII\n");
  296. H5LTmake_dataset_double(file_id, "/HeIII", 1, dimsarr, HeIII);
  297. i++;
  298. double de[dims];
  299. for (j = 0; j < dims; j++) {
  300. de[j] = input[j * N + i] * 1.0;
  301. }
  302. fprintf(stderr, "Writing solution for /de\n");
  303. H5LTmake_dataset_double(file_id, "/de", 1, dimsarr, de);
  304. i++;
  305. double ge[dims];
  306. for (j = 0; j < dims; j++) {
  307. ge[j] = input[j * N + i] * 1.0;
  308. }
  309. fprintf(stderr, "Writing solution for /ge\n");
  310. H5LTmake_dataset_double(file_id, "/ge", 1, dimsarr, ge);
  311. i++;
  312. double OI[dims];
  313. for (j = 0; j < dims; j++) {
  314. OI[j] = input[j * N + i] * 15.9994;
  315. }
  316. fprintf(stderr, "Writing solution for /OI\n");
  317. H5LTmake_dataset_double(file_id, "/OI", 1, dimsarr, OI);
  318. i++;
  319. double OII[dims];
  320. for (j = 0; j < dims; j++) {
  321. OII[j] = input[j * N + i] * 15.9994;
  322. }
  323. fprintf(stderr, "Writing solution for /OII\n");
  324. H5LTmake_dataset_double(file_id, "/OII", 1, dimsarr, OII);
  325. i++;
  326. double OIII[dims];
  327. for (j = 0; j < dims; j++) {
  328. OIII[j] = input[j * N + i] * 15.9994;
  329. }
  330. fprintf(stderr, "Writing solution for /OIII\n");
  331. H5LTmake_dataset_double(file_id, "/OIII", 1, dimsarr, OIII);
  332. i++;
  333. double OIV[dims];
  334. for (j = 0; j < dims; j++) {
  335. OIV[j] = input[j * N + i] * 15.9994;
  336. }
  337. fprintf(stderr, "Writing solution for /OIV\n");
  338. H5LTmake_dataset_double(file_id, "/OIV", 1, dimsarr, OIV);
  339. i++;
  340. double OV[dims];
  341. for (j = 0; j < dims; j++) {
  342. OV[j] = input[j * N + i] * 15.9994;
  343. }
  344. fprintf(stderr, "Writing solution for /OV\n");
  345. H5LTmake_dataset_double(file_id, "/OV", 1, dimsarr, OV);
  346. i++;
  347. double OVI[dims];
  348. for (j = 0; j < dims; j++) {
  349. OVI[j] = input[j * N + i] * 15.9994;
  350. }
  351. fprintf(stderr, "Writing solution for /OVI\n");
  352. H5LTmake_dataset_double(file_id, "/OVI", 1, dimsarr, OVI);
  353. i++;
  354. double OVII[dims];
  355. for (j = 0; j < dims; j++) {
  356. OVII[j] = input[j * N + i] * 15.9994;
  357. }
  358. fprintf(stderr, "Writing solution for /OVII\n");
  359. H5LTmake_dataset_double(file_id, "/OVII", 1, dimsarr, OVII);
  360. i++;
  361. double OVIII[dims];
  362. for (j = 0; j < dims; j++) {
  363. OVIII[j] = input[j * N + i] * 15.9994;
  364. }
  365. fprintf(stderr, "Writing solution for /OVIII\n");
  366. H5LTmake_dataset_double(file_id, "/OVIII", 1, dimsarr, OVIII);
  367. i++;
  368. double OIX[dims];
  369. for (j = 0; j < dims; j++) {
  370. OIX[j] = input[j * N + i] * 15.9994;
  371. }
  372. fprintf(stderr, "Writing solution for /OIX\n");
  373. H5LTmake_dataset_double(file_id, "/OIX", 1, dimsarr, OIX);
  374. i++;
  375. double temperature[dims];
  376. for (j = 0; j < dims; j++) {
  377. temperature[j] = data->Ts[j];
  378. }
  379. H5LTmake_dataset_double(file_id, "/T", 1, dimsarr, temperature);
  380. double time[1];
  381. time[0] = ttot;
  382. double timestep[1];
  383. timestep[0] = dt;
  384. H5LTset_attribute_double(file_id, "/", "time", time, 1);
  385. H5LTset_attribute_double(file_id, "/", "timestep", timestep, 1);
  386. H5Fclose(file_id);
  387. return 0;
  388. }
  389. double dengo_evolve_po (double dtf, double &dt, double z, double *input,
  390. double *rtol, double *atol, long long dims, po_data *data) {
  391. int i, j;
  392. hid_t file_id;
  393. /* fprintf(stderr, " ncells = % 3i\n", (int) dims); */
  394. int N = 16;
  395. rhs_f f = calculate_rhs_po;
  396. jac_f jf = calculate_jacobian_po;
  397. if (dt < 0) dt = dtf; // / 1e3;
  398. data->current_z = z;
  399. int niter = 0;
  400. int siter = 0;
  401. double ttot = 0;
  402. double *scale = (double *) alloca(dims * N * sizeof(double));
  403. double *prev = (double *) alloca(dims * N * sizeof(double));
  404. for (i = 0; i < dims * N; i++) scale[i] = input[i];
  405. for (i = 0; i < dims * N; i++) prev[i] = input[i];
  406. double *u0 = (double *) alloca(N*dims*sizeof(double));
  407. double *s = (double *) alloca(N*sizeof(double));
  408. double *gu = (double *) alloca(N*dims*sizeof(double));
  409. double *Ju = (double *) alloca(N*N*dims*sizeof(double));
  410. double floor_value = 1e-25;
  411. while (ttot < dtf) {
  412. int rv = BE_chem_solve(f, jf, input, dt, rtol, atol, dims, N,
  413. scale, (void *) data, u0, s, gu, Ju);
  414. /*
  415. fprintf(stderr, "Return value [%d]: %i. %0.5g / %0.5g = %0.5g (%0.5g)\n",
  416. niter, rv, ttot, dtf, ttot/dtf, dt);
  417. fprintf(stderr, "Value[0] = %0.5g %0.5g\n",
  418. input[0], prev[0]);
  419. */
  420. for (i = 0; i < dims * N; i++) {
  421. if (input[i] < 0) {
  422. rv = 1;
  423. break;
  424. }
  425. }
  426. if (rv == 0) {
  427. if (siter == 500000) break;
  428. siter++;
  429. if (siter % 100000 == 0) {
  430. fprintf(stderr, "Successful Iteration[%d]: (%0.4g) %0.16g / %0.16g\n",
  431. siter, dt, ttot, dtf);
  432. }
  433. ttot += dt;
  434. dt = DMIN(dt * 1.1, dtf - ttot);
  435. for (i = 0; i < dims * N; i++) prev[i] = input[i];
  436. for (i = 0; i < dims * N; i++) {
  437. if (input[i] < floor_value) {
  438. input[i] = floor_value;
  439. }
  440. scale[i] = input[i];
  441. }
  442. } else {
  443. dt /= 2.0;
  444. for (i = 0; i < dims * N; i++) {
  445. input[i] = prev[i];
  446. scale[i] = input[i];
  447. }
  448. if (dt/dtf < 1e-15) {
  449. fprintf(stderr, "Dying! dt/dtf = %0.5g\n", dt/dtf);
  450. break;
  451. }
  452. }
  453. /* if ((dt/dtf < 1e-3) && ((dtf - ttot) != 0.0)) {
  454. fprintf(stderr, "Relative dt is small! (dt = %0.5g, dtf = %0.5g, dt/dtf = %0.5g)\n", dt, dtf, dt/dtf);
  455. } */
  456. niter++;
  457. }
  458. /* fprintf(stderr, "End: %0.5g / %0.5g (%0.5g)\n",
  459. ttot, dtf, dtf-ttot); */
  460. return ttot;
  461. }
  462. void po_read_rate_tables(po_data *data)
  463. {
  464. hid_t file_id = H5Fopen("po_tables.h5", H5F_ACC_RDONLY, H5P_DEFAULT);
  465. /* Allocate the correct number of rate tables */
  466. H5LTread_dataset_double(file_id, "/HeI_i", data->r_HeI_i);
  467. H5LTread_dataset_double(file_id, "/HeI_pi", data->r_HeI_pi);
  468. H5LTread_dataset_double(file_id, "/HeII_i", data->r_HeII_i);
  469. H5LTread_dataset_double(file_id, "/HeII_pi", data->r_HeII_pi);
  470. H5LTread_dataset_double(file_id, "/HeII_r", data->r_HeII_r);
  471. H5LTread_dataset_double(file_id, "/HeIII_r", data->r_HeIII_r);
  472. H5LTread_dataset_double(file_id, "/HI_i", data->r_HI_i);
  473. H5LTread_dataset_double(file_id, "/HI_pi", data->r_HI_pi);
  474. H5LTread_dataset_double(file_id, "/HII_r", data->r_HII_r);
  475. H5LTread_dataset_double(file_id, "/OI_i", data->r_OI_i);
  476. H5LTread_dataset_double(file_id, "/OI_pi", data->r_OI_pi);
  477. H5LTread_dataset_double(file_id, "/OII_i", data->r_OII_i);
  478. H5LTread_dataset_double(file_id, "/OII_pi", data->r_OII_pi);
  479. H5LTread_dataset_double(file_id, "/OII_r", data->r_OII_r);
  480. H5LTread_dataset_double(file_id, "/OIII_i", data->r_OIII_i);
  481. H5LTread_dataset_double(file_id, "/OIII_pi", data->r_OIII_pi);
  482. H5LTread_dataset_double(file_id, "/OIII_r", data->r_OIII_r);
  483. H5LTread_dataset_double(file_id, "/OIV_i", data->r_OIV_i);
  484. H5LTread_dataset_double(file_id, "/OIV_pi", data->r_OIV_pi);
  485. H5LTread_dataset_double(file_id, "/OIV_r", data->r_OIV_r);
  486. H5LTread_dataset_double(file_id, "/OIX_r", data->r_OIX_r);
  487. H5LTread_dataset_double(file_id, "/OV_i", data->r_OV_i);
  488. H5LTread_dataset_double(file_id, "/OV_pi", data->r_OV_pi);
  489. H5LTread_dataset_double(file_id, "/OV_r", data->r_OV_r);
  490. H5LTread_dataset_double(file_id, "/OVI_i", data->r_OVI_i);
  491. H5LTread_dataset_double(file_id, "/OVI_pi", data->r_OVI_pi);
  492. H5LTread_dataset_double(file_id, "/OVI_r", data->r_OVI_r);
  493. H5LTread_dataset_double(file_id, "/OVII_i", data->r_OVII_i);
  494. H5LTread_dataset_double(file_id, "/OVII_pi", data->r_OVII_pi);
  495. H5LTread_dataset_double(file_id, "/OVII_r", data->r_OVII_r);
  496. H5LTread_dataset_double(file_id, "/OVIII_i", data->r_OVIII_i);
  497. H5LTread_dataset_double(file_id, "/OVIII_pi", data->r_OVIII_pi);
  498. H5LTread_dataset_double(file_id, "/OVIII_r", data->r_OVIII_r);
  499. H5Fclose(file_id);
  500. }
  501. void po_read_cooling_tables(po_data *data)
  502. {
  503. hid_t file_id = H5Fopen("po_tables.h5", H5F_ACC_RDONLY, H5P_DEFAULT);
  504. /* Allocate the correct number of rate tables */
  505. H5LTread_dataset_double(file_id, "/compton_comp",
  506. data->c_compton_comp);
  507. H5LTread_dataset_double(file_id, "/HeI_c_HeI_c",
  508. data->c_HeI_c_HeI_c);
  509. H5LTread_dataset_double(file_id, "/HeI_ph_HeI_ph",
  510. data->c_HeI_ph_HeI_ph);
  511. H5LTread_dataset_double(file_id, "/HeII_c_HeII_c",
  512. data->c_HeII_c_HeII_c);
  513. H5LTread_dataset_double(file_id, "/HeII_ph_HeII_ph",
  514. data->c_HeII_ph_HeII_ph);
  515. H5LTread_dataset_double(file_id, "/HeIII_c_HeIII_c",
  516. data->c_HeIII_c_HeIII_c);
  517. H5LTread_dataset_double(file_id, "/HI_c_HI_c",
  518. data->c_HI_c_HI_c);
  519. H5LTread_dataset_double(file_id, "/HI_ph_HI_ph",
  520. data->c_HI_ph_HI_ph);
  521. H5LTread_dataset_double(file_id, "/HII_c_HII_c",
  522. data->c_HII_c_HII_c);
  523. H5LTread_dataset_double(file_id, "/OI_c_OI_c",
  524. data->c_OI_c_OI_c);
  525. H5LTread_dataset_double(file_id, "/OI_ph_OI_ph",
  526. data->c_OI_ph_OI_ph);
  527. H5LTread_dataset_double(file_id, "/OII_c_OII_c",
  528. data->c_OII_c_OII_c);
  529. H5LTread_dataset_double(file_id, "/OII_ph_OII_ph",
  530. data->c_OII_ph_OII_ph);
  531. H5LTread_dataset_double(file_id, "/OIII_c_OIII_c",
  532. data->c_OIII_c_OIII_c);
  533. H5LTread_dataset_double(file_id, "/OIII_ph_OIII_ph",
  534. data->c_OIII_ph_OIII_ph);
  535. H5LTread_dataset_double(file_id, "/OIV_c_OIV_c",
  536. data->c_OIV_c_OIV_c);
  537. H5LTread_dataset_double(file_id, "/OIV_ph_OIV_ph",
  538. data->c_OIV_ph_OIV_ph);
  539. H5LTread_dataset_double(file_id, "/OIX_c_OIX_c",
  540. data->c_OIX_c_OIX_c);
  541. H5LTread_dataset_double(file_id, "/OV_c_OV_c",
  542. data->c_OV_c_OV_c);
  543. H5LTread_dataset_double(file_id, "/OV_ph_OV_ph",
  544. data->c_OV_ph_OV_ph);
  545. H5LTread_dataset_double(file_id, "/OVI_c_OVI_c",
  546. data->c_OVI_c_OVI_c);
  547. H5LTread_dataset_double(file_id, "/OVI_ph_OVI_ph",
  548. data->c_OVI_ph_OVI_ph);
  549. H5LTread_dataset_double(file_id, "/OVII_c_OVII_c",
  550. data->c_OVII_c_OVII_c);
  551. H5LTread_dataset_double(file_id, "/OVII_ph_OVII_ph",
  552. data->c_OVII_ph_OVII_ph);
  553. H5LTread_dataset_double(file_id, "/OVIII_c_OVIII_c",
  554. data->c_OVIII_c_OVIII_c);
  555. H5LTread_dataset_double(file_id, "/OVIII_ph_OVIII_ph",
  556. data->c_OVIII_ph_OVIII_ph);
  557. H5Fclose(file_id);
  558. }
  559. void po_calculate_temperature(po_data *data,
  560. double *input, int nstrip, int nchem)
  561. {
  562. int i, j;
  563. double density;
  564. double kb = 1.3806504e-16; // Boltzmann constant [erg/K]
  565. double mh = 1.67e-24;
  566. double gamma = 5.e0/3.e0;
  567. /* Calculate total density */
  568. double HI;
  569. double HII;
  570. double HeI;
  571. double HeII;
  572. double HeIII;
  573. double de;
  574. double ge;
  575. double OI;
  576. double OII;
  577. double OIII;
  578. double OIV;
  579. double OV;
  580. double OVI;
  581. double OVII;
  582. double OVIII;
  583. double OIX;
  584. for (i = 0; i<nstrip; i++) {
  585. j = i * nchem;
  586. HI = input[j];
  587. /*fprintf(stderr, "HI[%d] = % 0.16g\n",
  588. i, HI);*/
  589. j++;
  590. HII = input[j];
  591. /*fprintf(stderr, "HII[%d] = % 0.16g\n",
  592. i, HII);*/
  593. j++;
  594. HeI = input[j];
  595. /*fprintf(stderr, "HeI[%d] = % 0.16g\n",
  596. i, HeI);*/
  597. j++;
  598. HeII = input[j];
  599. /*fprintf(stderr, "HeII[%d] = % 0.16g\n",
  600. i, HeII);*/
  601. j++;
  602. HeIII = input[j];
  603. /*fprintf(stderr, "HeIII[%d] = % 0.16g\n",
  604. i, HeIII);*/
  605. j++;
  606. de = input[j];
  607. /*fprintf(stderr, "de[%d] = % 0.16g\n",
  608. i, de);*/
  609. j++;
  610. ge = input[j];
  611. /*fprintf(stderr, "ge[%d] = % 0.16g\n",
  612. i, ge);*/
  613. j++;
  614. OI = input[j];
  615. /*fprintf(stderr, "OI[%d] = % 0.16g\n",
  616. i, OI);*/
  617. j++;
  618. OII = input[j];
  619. /*fprintf(stderr, "OII[%d] = % 0.16g\n",
  620. i, OII);*/
  621. j++;
  622. OIII = input[j];
  623. /*fprintf(stderr, "OIII[%d] = % 0.16g\n",
  624. i, OIII);*/
  625. j++;
  626. OIV = input[j];
  627. /*fprintf(stderr, "OIV[%d] = % 0.16g\n",
  628. i, OIV);*/
  629. j++;
  630. OV = input[j];
  631. /*fprintf(stderr, "OV[%d] = % 0.16g\n",
  632. i, OV);*/
  633. j++;
  634. OVI = input[j];
  635. /*fprintf(stderr, "OVI[%d] = % 0.16g\n",
  636. i, OVI);*/
  637. j++;
  638. OVII = input[j];
  639. /*fprintf(stderr, "OVII[%d] = % 0.16g\n",
  640. i, OVII);*/
  641. j++;
  642. OVIII = input[j];
  643. /*fprintf(stderr, "OVIII[%d] = % 0.16g\n",
  644. i, OVIII);*/
  645. j++;
  646. OIX = input[j];
  647. /*fprintf(stderr, "OIX[%d] = % 0.16g\n",
  648. i, OIX);*/
  649. j++;
  650. density = 1.00794*HI + 1.00794*HII + 4.002602*HeI + 4.002602*HeII + 4.002602*HeIII + 15.9994*OI + 15.9994*OII + 15.9994*OIII + 15.9994*OIV + 15.9994*OIX + 15.9994*OV + 15.9994*OVI + 15.9994*OVII + 15.9994*OVIII;
  651. data->Ts[i] = density*ge*mh/(kb*(HI/(gamma - 1.0) + HII/(gamma - 1.0) + HeI/(gamma - 1.0) + HeII/(gamma - 1.0) + HeIII/(gamma - 1.0) + OI/(gamma - 1.0) + OII/(gamma - 1.0) + OIII/(gamma - 1.0) + OIV/(gamma - 1.0) + OIX/(gamma - 1.0) + OV/(gamma - 1.0) + OVI/(gamma - 1.0) + OVII/(gamma - 1.0) + OVIII/(gamma - 1.0) + de/(gamma - 1.0)));
  652. if (data->Ts[i] < data->bounds[0]) {
  653. data->Ts[i] = data->bounds[0];
  654. } else if (data->Ts[i] > data->bounds[1]) {
  655. data->Ts[i] = data->bounds[1];
  656. }
  657. data->logTs[i] = log(data->Ts[i]);
  658. data->invTs[i] = 1.0 / data->Ts[i];
  659. data->dTs_ge[i] =
  660. density*mh/(kb*(HI/(gamma - 1.0) + HII/(gamma - 1.0) + HeI/(gamma - 1.0) + HeII/(gamma - 1.0) + HeIII/(gamma - 1.0) + OI/(gamma - 1.0) + OII/(gamma - 1.0) + OIII/(gamma - 1.0) + OIV/(gamma - 1.0) + OIX/(gamma - 1.0) + OV/(gamma - 1.0) + OVI/(gamma - 1.0) + OVII/(gamma - 1.0) + OVIII/(gamma - 1.0) + de/(gamma - 1.0)));
  661. /*fprintf(stderr, "T[%d] = % 0.16g, density = % 0.16g\n",
  662. i, data->Ts[i], density);*/
  663. }
  664. }
  665. /*
  666. This setup may be different than the user may anticipate, as a result
  667. of the lockstep timestep we use for a pencil beam through the grid.
  668. As such, it accepts the number of things to interpolate and makes
  669. assumptions about the sizes of the rates.
  670. */
  671. /* This also requires no templating other than for the solver name...*/
  672. void po_interpolate_rates(po_data *data,
  673. int nstrip)
  674. {
  675. int i, bin_id, zbin_id;
  676. double lb, t1, t2;
  677. double lbz, z1, z2;
  678. int no_photo = 0;
  679. lb = log(data->bounds[0]);
  680. lbz = log(data->z_bounds[0] + 1.0);
  681. /*fprintf(stderr, "lb = % 0.16g, ub = % 0.16g\n", lb, ub);*/
  682. for (i = 0; i < nstrip; i++) {
  683. data->bin_id[i] = bin_id = (int) (data->idbin * (data->logTs[i] - lb));
  684. if (data->bin_id[i] <= 0) {
  685. data->bin_id[i] = 0;
  686. } else if (data->bin_id[i] >= data->nbins) {
  687. data->bin_id[i] = data->nbins - 1;
  688. }
  689. t1 = (lb + (bin_id ) * data->dbin);
  690. t2 = (lb + (bin_id + 1) * data->dbin);
  691. data->Tdef[i] = (data->logTs[i] - t1)/(t2 - t1);
  692. data->dT[i] = (t2 - t1);
  693. /*fprintf(stderr, "INTERP: %d, bin_id = %d, dT = % 0.16g, T = % 0.16g, logT = % 0.16g\n",
  694. i, data->bin_id[i], data->dT[i], data->Ts[i],
  695. data->logTs[i]);*/
  696. }
  697. if ((data->current_z >= data->z_bounds[0]) && (data->current_z < data->z_bounds[1])) {
  698. zbin_id = (int) (data->id_zbin * (log(data->current_z + 1.0) - lbz));
  699. if (zbin_id <= 0) {
  700. zbin_id = 0;
  701. } else if (zbin_id >= data->n_zbins) {
  702. zbin_id = data->n_zbins - 1;
  703. }
  704. z1 = (lbz + (zbin_id ) * data->d_zbin);
  705. z2 = (lbz + (zbin_id + 1) * data->d_zbin);
  706. data->zdef = (log(data->current_z + 1.0) - z1)/(z2 - z1);
  707. data->dz = (exp(z2) - exp(z1)); //note: given this, we don't have to divide rate of change by z
  708. } else {
  709. no_photo = 1;
  710. }
  711. for (i = 0; i < nstrip; i++) {
  712. bin_id = data->bin_id[i];
  713. data->rs_HeI_i[i] = data->r_HeI_i[bin_id] +
  714. data->Tdef[i] * (data->r_HeI_i[bin_id+1] - data->r_HeI_i[bin_id]);
  715. data->drs_HeI_i[i] = (data->r_HeI_i[bin_id+1] - data->r_HeI_i[bin_id]);
  716. data->drs_HeI_i[i] /= data->dT[i];
  717. data->drs_HeI_i[i] *= data->invTs[i];
  718. }
  719. for (i = 0; i < nstrip; i++) {
  720. if (no_photo) {
  721. data->rs_HeI_pi[i] = 0.0;
  722. data->drs_HeI_pi[i] = 0.0;
  723. } else {
  724. data->rs_HeI_pi[i] = data->r_HeI_pi[zbin_id] +
  725. data->zdef * (data->r_HeI_pi[zbin_id+1] - data->r_HeI_pi[zbin_id]);
  726. data->drs_HeI_pi[i] = (data->r_HeI_pi[zbin_id+1] - data->r_HeI_pi[zbin_id]);
  727. data->drs_HeI_pi[i] /= data->dz;
  728. }
  729. }
  730. for (i = 0; i < nstrip; i++) {
  731. bin_id = data->bin_id[i];
  732. data->rs_HeII_i[i] = data->r_HeII_i[bin_id] +
  733. data->Tdef[i] * (data->r_HeII_i[bin_id+1] - data->r_HeII_i[bin_id]);
  734. data->drs_HeII_i[i] = (data->r_HeII_i[bin_id+1] - data->r_HeII_i[bin_id]);
  735. data->drs_HeII_i[i] /= data->dT[i];
  736. data->drs_HeII_i[i] *= data->invTs[i];
  737. }
  738. for (i = 0; i < nstrip; i++) {
  739. if (no_photo) {
  740. data->rs_HeII_pi[i] = 0.0;
  741. data->drs_HeII_pi[i] = 0.0;
  742. } else {
  743. data->rs_HeII_pi[i] = data->r_HeII_pi[zbin_id] +
  744. data->zdef * (data->r_HeII_pi[zbin_id+1] - data->r_HeII_pi[zbin_id]);
  745. data->drs_HeII_pi[i] = (data->r_HeII_pi[zbin_id+1] - data->r_HeII_pi[zbin_id]);
  746. data->drs_HeII_pi[i] /= data->dz;
  747. }
  748. }
  749. for (i = 0; i < nstrip; i++) {
  750. bin_id = data->bin_id[i];
  751. data->rs_HeII_r[i] = data->r_HeII_r[bin_id] +
  752. data->Tdef[i] * (data->r_HeII_r[bin_id+1] - data->r_HeII_r[bin_id]);
  753. data->drs_HeII_r[i] = (data->r_HeII_r[bin_id+1] - data->r_HeII_r[bin_id]);
  754. data->drs_HeII_r[i] /= data->dT[i];
  755. data->drs_HeII_r[i] *= data->invTs[i];
  756. }
  757. for (i = 0; i < nstrip; i++) {
  758. bin_id = data->bin_id[i];
  759. data->rs_HeIII_r[i] = data->r_HeIII_r[bin_id] +
  760. data->Tdef[i] * (data->r_HeIII_r[bin_id+1] - data->r_HeIII_r[bin_id]);
  761. data->drs_HeIII_r[i] = (data->r_HeIII_r[bin_id+1] - data->r_HeIII_r[bin_id]);
  762. data->drs_HeIII_r[i] /= data->dT[i];
  763. data->drs_HeIII_r[i] *= data->invTs[i];
  764. }
  765. for (i = 0; i < nstrip; i++) {
  766. bin_id = data->bin_id[i];
  767. data->rs_HI_i[i] = data->r_HI_i[bin_id] +
  768. data->Tdef[i] * (data->r_HI_i[bin_id+1] - data->r_HI_i[bin_id]);
  769. data->drs_HI_i[i] = (data->r_HI_i[bin_id+1] - data->r_HI_i[bin_id]);
  770. data->drs_HI_i[i] /= data->dT[i];
  771. data->drs_HI_i[i] *= data->invTs[i];
  772. }
  773. for (i = 0; i < nstrip; i++) {
  774. if (no_photo) {
  775. data->rs_HI_pi[i] = 0.0;
  776. data->drs_HI_pi[i] = 0.0;
  777. } else {
  778. data->rs_HI_pi[i] = data->r_HI_pi[zbin_id] +
  779. data->zdef * (data->r_HI_pi[zbin_id+1] - data->r_HI_pi[zbin_id]);
  780. data->drs_HI_pi[i] = (data->r_HI_pi[zbin_id+1] - data->r_HI_pi[zbin_id]);
  781. data->drs_HI_pi[i] /= data->dz;
  782. }
  783. }
  784. for (i = 0; i < nstrip; i++) {
  785. bin_id = data->bin_id[i];
  786. data->rs_HII_r[i] = data->r_HII_r[bin_id] +
  787. data->Tdef[i] * (data->r_HII_r[bin_id+1] - data->r_HII_r[bin_id]);
  788. data->drs_HII_r[i] = (data->r_HII_r[bin_id+1] - data->r_HII_r[bin_id]);
  789. data->drs_HII_r[i] /= data->dT[i];
  790. data->drs_HII_r[i] *= data->invTs[i];
  791. }
  792. for (i = 0; i < nstrip; i++) {
  793. bin_id = data->bin_id[i];
  794. data->rs_OI_i[i] = data->r_OI_i[bin_id] +
  795. data->Tdef[i] * (data->r_OI_i[bin_id+1] - data->r_OI_i[bin_id]);
  796. data->drs_OI_i[i] = (data->r_OI_i[bin_id+1] - data->r_OI_i[bin_id]);
  797. data->drs_OI_i[i] /= data->dT[i];
  798. data->drs_OI_i[i] *= data->invTs[i];
  799. }
  800. for (i = 0; i < nstrip; i++) {
  801. if (no_photo) {
  802. data->rs_OI_pi[i] = 0.0;
  803. data->drs_OI_pi[i] = 0.0;
  804. } else {
  805. data->rs_OI_pi[i] = data->r_OI_pi[zbin_id] +
  806. data->zdef * (data->r_OI_pi[zbin_id+1] - data->r_OI_pi[zbin_id]);
  807. data->drs_OI_pi[i] = (data->r_OI_pi[zbin_id+1] - data->r_OI_pi[zbin_id]);
  808. data->drs_OI_pi[i] /= data->dz;
  809. }
  810. }
  811. for (i = 0; i < nstrip; i++) {
  812. bin_id = data->bin_id[i];
  813. data->rs_OII_i[i] = data->r_OII_i[bin_id] +
  814. data->Tdef[i] * (data->r_OII_i[bin_id+1] - data->r_OII_i[bin_id]);
  815. data->drs_OII_i[i] = (data->r_OII_i[bin_id+1] - data->r_OII_i[bin_id]);
  816. data->drs_OII_i[i] /= data->dT[i];
  817. data->drs_OII_i[i] *= data->invTs[i];
  818. }
  819. for (i = 0; i < nstrip; i++) {
  820. if (no_photo) {
  821. data->rs_OII_pi[i] = 0.0;
  822. data->drs_OII_pi[i] = 0.0;
  823. } else {
  824. data->rs_OII_pi[i] = data->r_OII_pi[zbin_id] +
  825. data->zdef * (data->r_OII_pi[zbin_id+1] - data->r_OII_pi[zbin_id]);
  826. data->drs_OII_pi[i] = (data->r_OII_pi[zbin_id+1] - data->r_OII_pi[zbin_id]);
  827. data->drs_OII_pi[i] /= data->dz;
  828. }
  829. }
  830. for (i = 0; i < nstrip; i++) {
  831. bin_id = data->bin_id[i];
  832. data->rs_OII_r[i] = data->r_OII_r[bin_id] +
  833. data->Tdef[i] * (data->r_OII_r[bin_id+1] - data->r_OII_r[bin_id]);
  834. data->drs_OII_r[i] = (data->r_OII_r[bin_id+1] - data->r_OII_r[bin_id]);
  835. data->drs_OII_r[i] /= data->dT[i];
  836. data->drs_OII_r[i] *= data->invTs[i];
  837. }
  838. for (i = 0; i < nstrip; i++) {
  839. bin_id = data->bin_id[i];
  840. data->rs_OIII_i[i] = data->r_OIII_i[bin_id] +
  841. data->Tdef[i] * (data->r_OIII_i[bin_id+1] - data->r_OIII_i[bin_id]);
  842. data->drs_OIII_i[i] = (data->r_OIII_i[bin_id+1] - data->r_OIII_i[bin_id]);
  843. data->drs_OIII_i[i] /= data->dT[i];
  844. data->drs_OIII_i[i] *= data->invTs[i];
  845. }
  846. for (i = 0; i < nstrip; i++) {
  847. if (no_photo) {
  848. data->rs_OIII_pi[i] = 0.0;
  849. data->drs_OIII_pi[i] = 0.0;
  850. } else {
  851. data->rs_OIII_pi[i] = data->r_OIII_pi[zbin_id] +
  852. data->zdef * (data->r_OIII_pi[zbin_id+1] - data->r_OIII_pi[zbin_id]);
  853. data->drs_OIII_pi[i] = (data->r_OIII_pi[zbin_id+1] - data->r_OIII_pi[zbin_id]);
  854. data->drs_OIII_pi[i] /= data->dz;
  855. }
  856. }
  857. for (i = 0; i < nstrip; i++) {
  858. bin_id = data->bin_id[i];
  859. data->rs_OIII_r[i] = data->r_OIII_r[bin_id] +
  860. data->Tdef[i] * (data->r_OIII_r[bin_id+1] - data->r_OIII_r[bin_id]);
  861. data->drs_OIII_r[i] = (data->r_OIII_r[bin_id+1] - data->r_OIII_r[bin_id]);
  862. data->drs_OIII_r[i] /= data->dT[i];
  863. data->drs_OIII_r[i] *= data->invTs[i];
  864. }
  865. for (i = 0; i < nstrip; i++) {
  866. bin_id = data->bin_id[i];
  867. data->rs_OIV_i[i] = data->r_OIV_i[bin_id] +
  868. data->Tdef[i] * (data->r_OIV_i[bin_id+1] - data->r_OIV_i[bin_id]);
  869. data->drs_OIV_i[i] = (data->r_OIV_i[bin_id+1] - data->r_OIV_i[bin_id]);
  870. data->drs_OIV_i[i] /= data->dT[i];
  871. data->drs_OIV_i[i] *= data->invTs[i];
  872. }
  873. for (i = 0; i < nstrip; i++) {
  874. if (no_photo) {
  875. data->rs_OIV_pi[i] = 0.0;
  876. data->drs_OIV_pi[i] = 0.0;
  877. } else {
  878. data->rs_OIV_pi[i] = data->r_OIV_pi[zbin_id] +
  879. data->zdef * (data->r_OIV_pi[zbin_id+1] - data->r_OIV_pi[zbin_id]);
  880. data->drs_OIV_pi[i] = (data->r_OIV_pi[zbin_id+1] - data->r_OIV_pi[zbin_id]);
  881. data->drs_OIV_pi[i] /= data->dz;
  882. }
  883. }
  884. for (i = 0; i < nstrip; i++) {
  885. bin_id = data->bin_id[i];
  886. data->rs_OIV_r[i] = data->r_OIV_r[bin_id] +
  887. data->Tdef[i] * (data->r_OIV_r[bin_id+1] - data->r_OIV_r[bin_id]);
  888. data->drs_OIV_r[i] = (data->r_OIV_r[bin_id+1] - data->r_OIV_r[bin_id]);
  889. data->drs_OIV_r[i] /= data->dT[i];
  890. data->drs_OIV_r[i] *= data->invTs[i];
  891. }
  892. for (i = 0; i < nstrip; i++) {
  893. bin_id = data->bin_id[i];
  894. data->rs_OIX_r[i] = data->r_OIX_r[bin_id] +
  895. data->Tdef[i] * (data->r_OIX_r[bin_id+1] - data->r_OIX_r[bin_id]);
  896. data->drs_OIX_r[i] = (data->r_OIX_r[bin_id+1] - data->r_OIX_r[bin_id]);
  897. data->drs_OIX_r[i] /= data->dT[i];
  898. data->drs_OIX_r[i] *= data->invTs[i];
  899. }
  900. for (i = 0; i < nstrip; i++) {
  901. bin_id = data->bin_id[i];
  902. data->rs_OV_i[i] = data->r_OV_i[bin_id] +
  903. data->Tdef[i] * (data->r_OV_i[bin_id+1] - data->r_OV_i[bin_id]);
  904. data->drs_OV_i[i] = (data->r_OV_i[bin_id+1] - data->r_OV_i[bin_id]);
  905. data->drs_OV_i[i] /= data->dT[i];
  906. data->drs_OV_i[i] *= data->invTs[i];
  907. }
  908. for (i = 0; i < nstrip; i++) {
  909. if (no_photo) {
  910. data->rs_OV_pi[i] = 0.0;
  911. data->drs_OV_pi[i] = 0.0;
  912. } else {
  913. data->rs_OV_pi[i] = data->r_OV_pi[zbin_id] +
  914. data->zdef * (data->r_OV_pi[zbin_id+1] - data->r_OV_pi[zbin_id]);
  915. data->drs_OV_pi[i] = (data->r_OV_pi[zbin_id+1] - data->r_OV_pi[zbin_id]);
  916. data->drs_OV_pi[i] /= data->dz;
  917. }
  918. }
  919. for (i = 0; i < nstrip; i++) {
  920. bin_id = data->bin_id[i];
  921. data->rs_OV_r[i] = data->r_OV_r[bin_id] +
  922. data->Tdef[i] * (data->r_OV_r[bin_id+1] - data->r_OV_r[bin_id]);
  923. data->drs_OV_r[i] = (data->r_OV_r[bin_id+1] - data->r_OV_r[bin_id]);
  924. data->drs_OV_r[i] /= data->dT[i];
  925. data->drs_OV_r[i] *= data->invTs[i];
  926. }
  927. for (i = 0; i < nstrip; i++) {
  928. bin_id = data->bin_id[i];
  929. data->rs_OVI_i[i] = data->r_OVI_i[bin_id] +
  930. data->Tdef[i] * (data->r_OVI_i[bin_id+1] - data->r_OVI_i[bin_id]);
  931. data->drs_OVI_i[i] = (data->r_OVI_i[bin_id+1] - data->r_OVI_i[bin_id]);
  932. data->drs_OVI_i[i] /= data->dT[i];
  933. data->drs_OVI_i[i] *= data->invTs[i];
  934. }
  935. for (i = 0; i < nstrip; i++) {
  936. if (no_photo) {
  937. data->rs_OVI_pi[i] = 0.0;
  938. data->drs_OVI_pi[i] = 0.0;
  939. } else {
  940. data->rs_OVI_pi[i] = data->r_OVI_pi[zbin_id] +
  941. data->zdef * (data->r_OVI_pi[zbin_id+1] - data->r_OVI_pi[zbin_id]);
  942. data->drs_OVI_pi[i] = (data->r_OVI_pi[zbin_id+1] - data->r_OVI_pi[zbin_id]);
  943. data->drs_OVI_pi[i] /= data->dz;
  944. }
  945. }
  946. for (i = 0; i < nstrip; i++) {
  947. bin_id = data->bin_id[i];
  948. data->rs_OVI_r[i] = data->r_OVI_r[bin_id] +
  949. data->Tdef[i] * (data->r_OVI_r[bin_id+1] - data->r_OVI_r[bin_id]);
  950. data->drs_OVI_r[i] = (data->r_OVI_r[bin_id+1] - data->r_OVI_r[bin_id]);
  951. data->drs_OVI_r[i] /= data->dT[i];
  952. data->drs_OVI_r[i] *= data->invTs[i];
  953. }
  954. for (i = 0; i < nstrip; i++) {
  955. bin_id = data->bin_id[i];
  956. data->rs_OVII_i[i] = data->r_OVII_i[bin_id] +
  957. data->Tdef[i] * (data->r_OVII_i[bin_id+1] - data->r_OVII_i[bin_id]);
  958. data->drs_OVII_i[i] = (data->r_OVII_i[bin_id+1] - data->r_OVII_i[bin_id]);
  959. data->drs_OVII_i[i] /= data->dT[i];
  960. data->drs_OVII_i[i] *= data->invTs[i];
  961. }
  962. for (i = 0; i < nstrip; i++) {
  963. if (no_photo) {
  964. data->rs_OVII_pi[i] = 0.0;
  965. data->drs_OVII_pi[i] = 0.0;
  966. } else {
  967. data->rs_OVII_pi[i] = data->r_OVII_pi[zbin_id] +
  968. data->zdef * (data->r_OVII_pi[zbin_id+1] - data->r_OVII_pi[zbin_id]);
  969. data->drs_OVII_pi[i] = (data->r_OVII_pi[zbin_id+1] - data->r_OVII_pi[zbin_id]);
  970. data->drs_OVII_pi[i] /= data->dz;
  971. }
  972. }
  973. for (i = 0; i < nstrip; i++) {
  974. bin_id = data->bin_id[i];
  975. data->rs_OVII_r[i] = data->r_OVII_r[bin_id] +
  976. data->Tdef[i] * (data->r_OVII_r[bin_id+1] - data->r_OVII_r[bin_id]);
  977. data->drs_OVII_r[i] = (data->r_OVII_r[bin_id+1] - data->r_OVII_r[bin_id]);
  978. data->drs_OVII_r[i] /= data->dT[i];
  979. data->drs_OVII_r[i] *= data->invTs[i];
  980. }
  981. for (i = 0; i < nstrip; i++) {
  982. bin_id = data->bin_id[i];
  983. data->rs_OVIII_i[i] = data->r_OVIII_i[bin_id] +
  984. data->Tdef[i] * (data->r_OVIII_i[bin_id+1] - data->r_OVIII_i[bin_id]);
  985. data->drs_OVIII_i[i] = (data->r_OVIII_i[bin_id+1] - data->r_OVIII_i[bin_id]);
  986. data->drs_OVIII_i[i] /= data->dT[i];
  987. data->drs_OVIII_i[i] *= data->invTs[i];
  988. }
  989. for (i = 0; i < nstrip; i++) {
  990. if (no_photo) {
  991. data->rs_OVIII_pi[i] = 0.0;
  992. data->drs_OVIII_pi[i] = 0.0;
  993. } else {
  994. data->rs_OVIII_pi[i] = data->r_OVIII_pi[zbin_id] +
  995. data->zdef * (data->r_OVIII_pi[zbin_id+1] - data->r_OVIII_pi[zbin_id]);
  996. data->drs_OVIII_pi[i] = (data->r_OVIII_pi[zbin_id+1] - data->r_OVIII_pi[zbin_id]);
  997. data->drs_OVIII_pi[i] /= data->dz;
  998. }
  999. }
  1000. for (i = 0; i < nstrip; i++) {
  1001. bin_id = data->bin_id[i];
  1002. data->rs_OVIII_r[i] = data->r_OVIII_r[bin_id] +
  1003. data->Tdef[i] * (data->r_OVIII_r[bin_id+1] - data->r_OVIII_r[bin_id]);
  1004. data->drs_OVIII_r[i] = (data->r_OVIII_r[bin_id+1] - data->r_OVIII_r[bin_id]);
  1005. data->drs_OVIII_r[i] /= data->dT[i];
  1006. data->drs_OVIII_r[i] *= data->invTs[i];
  1007. }
  1008. for (i = 0; i < nstrip; i++) {
  1009. bin_id = data->bin_id[i];
  1010. data->cs_compton_comp[i] = data->c_compton_comp[bin_id] +
  1011. data->Tdef[i] * (data->c_compton_comp[bin_id+1] - data->c_compton_comp[bin_id]);
  1012. data->dcs_compton_comp[i] = (data->c_compton_comp[bin_id+1] - data->c_compton_comp[bin_id]);;
  1013. data->dcs_compton_comp[i] /= data->dT[i];
  1014. data->dcs_compton_comp[i] *= data->invTs[i];
  1015. }
  1016. for (i = 0; i < nstrip; i++) {
  1017. bin_id = data->bin_id[i];
  1018. data->cs_HeI_c_HeI_c[i] = data->c_HeI_c_HeI_c[bin_id] +
  1019. data->Tdef[i] * (data->c_HeI_c_HeI_c[bin_id+1] - data->c_HeI_c_HeI_c[bin_id]);
  1020. data->dcs_HeI_c_HeI_c[i] = (data->c_HeI_c_HeI_c[bin_id+1] - data->c_HeI_c_HeI_c[bin_id]);;
  1021. data->dcs_HeI_c_HeI_c[i] /= data->dT[i];
  1022. data->dcs_HeI_c_HeI_c[i] *= data->invTs[i];
  1023. }
  1024. for (i = 0; i < nstrip; i++) {
  1025. if (no_photo) {
  1026. data->cs_HeI_ph_HeI_ph[i] = 0.0;
  1027. data->dcs_HeI_ph_HeI_ph[i] = 0.0;
  1028. } else {
  1029. data->cs_HeI_ph_HeI_ph[i] = data->c_HeI_ph_HeI_ph[zbin_id] +
  1030. data->zdef * (data->c_HeI_ph_HeI_ph[zbin_id+1] - data->c_HeI_ph_HeI_ph[zbin_id]);
  1031. data->dcs_HeI_ph_HeI_ph[i] = (data->c_HeI_ph_HeI_ph[zbin_id+1] - data->c_HeI_ph_HeI_ph[zbin_id]);;
  1032. data->dcs_HeI_ph_HeI_ph[i] /= data->dz;
  1033. }
  1034. }
  1035. for (i = 0; i < nstrip; i++) {
  1036. bin_id = data->bin_id[i];
  1037. data->cs_HeII_c_HeII_c[i] = data->c_HeII_c_HeII_c[bin_id] +
  1038. data->Tdef[i] * (data->c_HeII_c_HeII_c[bin_id+1] - data->c_HeII_c_HeII_c[bin_id]);
  1039. data->dcs_HeII_c_HeII_c[i] = (data->c_HeII_c_HeII_c[bin_id+1] - data->c_HeII_c_HeII_c[bin_id]);;
  1040. data->dcs_HeII_c_HeII_c[i] /= data->dT[i];
  1041. data->dcs_HeII_c_HeII_c[i] *= data->invTs[i];
  1042. }
  1043. for (i = 0; i < nstrip; i++) {
  1044. if (no_photo) {
  1045. data->cs_HeII_ph_HeII_ph[i] = 0.0;
  1046. data->dcs_HeII_ph_HeII_ph[i] = 0.0;
  1047. } else {
  1048. data->cs_HeII_ph_HeII_ph[i] = data->c_HeII_ph_HeII_ph[zbin_id] +
  1049. data->zdef * (data->c_HeII_ph_HeII_ph[zbin_id+1] - data->c_HeII_ph_HeII_ph[zbin_id]);
  1050. data->dcs_HeII_ph_HeII_ph[i] = (data->c_HeII_ph_HeII_ph[zbin_id+1] - data->c_HeII_ph_HeII_ph[zbin_id]);;
  1051. data->dcs_HeII_ph_HeII_ph[i] /= data->dz;
  1052. }
  1053. }
  1054. for (i = 0; i < nstrip; i++) {
  1055. bin_id = data->bin_id[i];
  1056. data->cs_HeIII_c_HeIII_c[i] = data->c_HeIII_c_HeIII_c[bin_id] +
  1057. data->Tdef[i] * (data->c_HeIII_c_HeIII_c[bin_id+1] - data->c_HeIII_c_HeIII_c[bin_id]);
  1058. data->dcs_HeIII_c_HeIII_c[i] = (data->c_HeIII_c_HeIII_c[bin_id+1] - data->c_HeIII_c_HeIII_c[bin_id]);;
  1059. data->dcs_HeIII_c_HeIII_c[i] /= data->dT[i];
  1060. data->dcs_HeIII_c_HeIII_c[i] *= data->invTs[i];
  1061. }
  1062. for (i = 0; i < nstrip; i++) {
  1063. bin_id = data->bin_id[i];
  1064. data->cs_HI_c_HI_c[i] = data->c_HI_c_HI_c[bin_id] +
  1065. data->Tdef[i] * (data->c_HI_c_HI_c[bin_id+1] - data->c_HI_c_HI_c[bin_id]);
  1066. data->dcs_HI_c_HI_c[i] = (data->c_HI_c_HI_c[bin_id+1] - data->c_HI_c_HI_c[bin_id]);;
  1067. data->dcs_HI_c_HI_c[i] /= data->dT[i];
  1068. data->dcs_HI_c_HI_c[i] *= data->invTs[i];
  1069. }
  1070. for (i = 0; i < nstrip; i++) {
  1071. if (no_photo) {
  1072. data->cs_HI_ph_HI_ph[i] = 0.0;
  1073. data->dcs_HI_ph_HI_ph[i] = 0.0;
  1074. } else {
  1075. data->cs_HI_ph_HI_ph[i] = data->c_HI_ph_HI_ph[zbin_id] +
  1076. data->zdef * (data->c_HI_ph_HI_ph[zbin_id+1] - data->c_HI_ph_HI_ph[zbin_id]);
  1077. data->dcs_HI_ph_HI_ph[i] = (data->c_HI_ph_HI_ph[zbin_id+1] - data->c_HI_ph_HI_ph[zbin_id]);;
  1078. data->dcs_HI_ph_HI_ph[i] /= data->dz;
  1079. }
  1080. }
  1081. for (i = 0; i < nstrip; i++) {
  1082. bin_id = data->bin_id[i];
  1083. data->cs_HII_c_HII_c[i] = data->c_HII_c_HII_c[bin_id] +
  1084. data->Tdef[i] * (data->c_HII_c_HII_c[bin_id+1] - data->c_HII_c_HII_c[bin_id]);
  1085. data->dcs_HII_c_HII_c[i] = (data->c_HII_c_HII_c[bin_id+1] - data->c_HII_c_HII_c[bin_id]);;
  1086. data->dcs_HII_c_HII_c[i] /= data->dT[i];
  1087. data->dcs_HII_c_HII_c[i] *= data->invTs[i];
  1088. }
  1089. for (i = 0; i < nstrip; i++) {
  1090. bin_id = data->bin_id[i];
  1091. data->cs_OI_c_OI_c[i] = data->c_OI_c_OI_c[bin_id] +
  1092. data->Tdef[i] * (data->c_OI_c_OI_c[bin_id+1] - data->c_OI_c_OI_c[bin_id]);
  1093. data->dcs_OI_c_OI_c[i] = (data->c_OI_c_OI_c[bin_id+1] - data->c_OI_c_OI_c[bin_id]);;
  1094. data->dcs_OI_c_OI_c[i] /= data->dT[i];
  1095. data->dcs_OI_c_OI_c[i] *= data->invTs[i];
  1096. }
  1097. for (i = 0; i < nstrip; i++) {
  1098. if (no_photo) {
  1099. data->cs_OI_ph_OI_ph[i] = 0.0;
  1100. data->dcs_OI_ph_OI_ph[i] = 0.0;
  1101. } else {
  1102. data->cs_OI_ph_OI_ph[i] = data->c_OI_ph_OI_ph[zbin_id] +
  1103. data->zdef * (data->c_OI_ph_OI_ph[zbin_id+1] - data->c_OI_ph_OI_ph[zbin_id]);
  1104. data->dcs_OI_ph_OI_ph[i] = (data->c_OI_ph_OI_ph[zbin_id+1] - data->c_OI_ph_OI_ph[zbin_id]);;
  1105. data->dcs_OI_ph_OI_ph[i] /= data->dz;
  1106. }
  1107. }
  1108. for (i = 0; i < nstrip; i++) {
  1109. bin_id = data->bin_id[i];
  1110. data->cs_OII_c_OII_c[i] = data->c_OII_c_OII_c[bin_id] +
  1111. data->Tdef[i] * (data->c_OII_c_OII_c[bin_id+1] - data->c_OII_c_OII_c[bin_id]);
  1112. data->dcs_OII_c_OII_c[i] = (data->c_OII_c_OII_c[bin_id+1] - data->c_OII_c_OII_c[bin_id]);;
  1113. data->dcs_OII_c_OII_c[i] /= data->dT[i];
  1114. data->dcs_OII_c_OII_c[i] *= data->invTs[i];
  1115. }
  1116. for (i = 0; i < nstrip; i++) {
  1117. if (no_photo) {
  1118. data->cs_OII_ph_OII_ph[i] = 0.0;
  1119. data->dcs_OII_ph_OII_ph[i] = 0.0;
  1120. } else {
  1121. data->cs_OII_ph_OII_ph[i] = data->c_OII_ph_OII_ph[zbin_id] +
  1122. data->zdef * (data->c_OII_ph_OII_ph[zbin_id+1] - data->c_OII_ph_OII_ph[zbin_id]);
  1123. data->dcs_OII_ph_OII_ph[i] = (data->c_OII_ph_OII_ph[zbin_id+1] - data->c_OII_ph_OII_ph[zbin_id]);;
  1124. data->dcs_OII_ph_OII_ph[i] /= data->dz;
  1125. }
  1126. }
  1127. for (i = 0; i < nstrip; i++) {
  1128. bin_id = data->bin_id[i];
  1129. data->cs_OIII_c_OIII_c[i] = data->c_OIII_c_OIII_c[bin_id] +
  1130. data->Tdef[i] * (data->c_OIII_c_OIII_c[bin_id+1] - data->c_OIII_c_OIII_c[bin_id]);
  1131. data->dcs_OIII_c_OIII_c[i] = (data->c_OIII_c_OIII_c[bin_id+1] - data->c_OIII_c_OIII_c[bin_id]);;
  1132. data->dcs_OIII_c_OIII_c[i] /= data->dT[i];
  1133. data->dcs_OIII_c_OIII_c[i] *= data->invTs[i];
  1134. }
  1135. for (i = 0; i < nstrip; i++) {
  1136. if (no_photo) {
  1137. data->cs_OIII_ph_OIII_ph[i] = 0.0;
  1138. data->dcs_OIII_ph_OIII_ph[i] = 0.0;
  1139. } else {
  1140. data->cs_OIII_ph_OIII_ph[i] = data->c_OIII_ph_OIII_ph[zbin_id] +
  1141. data->zdef * (data->c_OIII_ph_OIII_ph[zbin_id+1] - data->c_OIII_ph_OIII_ph[zbin_id]);
  1142. data->dcs_OIII_ph_OIII_ph[i] = (data->c_OIII_ph_OIII_ph[zbin_id+1] - data->c_OIII_ph_OIII_ph[zbin_id]);;
  1143. data->dcs_OIII_ph_OIII_ph[i] /= data->dz;
  1144. }
  1145. }
  1146. for (i = 0; i < nstrip; i++) {
  1147. bin_id = data->bin_id[i];
  1148. data->cs_OIV_c_OIV_c[i] = data->c_OIV_c_OIV_c[bin_id] +
  1149. data->Tdef[i] * (data->c_OIV_c_OIV_c[bin_id+1] - data->c_OIV_c_OIV_c[bin_id]);
  1150. data->dcs_OIV_c_OIV_c[i] = (data->c_OIV_c_OIV_c[bin_id+1] - data->c_OIV_c_OIV_c[bin_id]);;
  1151. data->dcs_OIV_c_OIV_c[i] /= data->dT[i];
  1152. data->dcs_OIV_c_OIV_c[i] *= data->invTs[i];
  1153. }
  1154. for (i = 0; i < nstrip; i++) {
  1155. if (no_photo) {
  1156. data->cs_OIV_ph_OIV_ph[i] = 0.0;
  1157. data->dcs_OIV_ph_OIV_ph[i] = 0.0;
  1158. } else {
  1159. data->cs_OIV_ph_OIV_ph[i] = data->c_OIV_ph_OIV_ph[zbin_id] +
  1160. data->zdef * (data->c_OIV_ph_OIV_ph[zbin_id+1] - data->c_OIV_ph_OIV_ph[zbin_id]);
  1161. data->dcs_OIV_ph_OIV_ph[i] = (data->c_OIV_ph_OIV_ph[zbin_id+1] - data->c_OIV_ph_OIV_ph[zbin_id]);;
  1162. data->dcs_OIV_ph_OIV_ph[i] /= data->dz;
  1163. }
  1164. }
  1165. for (i = 0; i < nstrip; i++) {
  1166. bin_id = data->bin_id[i];
  1167. data->cs_OIX_c_OIX_c[i] = data->c_OIX_c_OIX_c[bin_id] +
  1168. data->Tdef[i] * (data->c_OIX_c_OIX_c[bin_id+1] - data->c_OIX_c_OIX_c[bin_id]);
  1169. data->dcs_OIX_c_OIX_c[i] = (data->c_OIX_c_OIX_c[bin_id+1] - data->c_OIX_c_OIX_c[bin_id]);;
  1170. data->dcs_OIX_c_OIX_c[i] /= data->dT[i];
  1171. data->dcs_OIX_c_OIX_c[i] *= data->invTs[i];
  1172. }
  1173. for (i = 0; i < nstrip; i++) {
  1174. bin_id = data->bin_id[i];
  1175. data->cs_OV_c_OV_c[i] = data->c_OV_c_OV_c[bin_id] +
  1176. data->Tdef[i] * (data->c_OV_c_OV_c[bin_id+1] - data->c_OV_c_OV_c[bin_id]);
  1177. data->dcs_OV_c_OV_c[i] = (data->c_OV_c_OV_c[bin_id+1] - data->c_OV_c_OV_c[bin_id]);;
  1178. data->dcs_OV_c_OV_c[i] /= data->dT[i];
  1179. data->dcs_OV_c_OV_c[i] *= data->invTs[i];
  1180. }
  1181. for (i = 0; i < nstrip; i++) {

Large files files are truncated, but you can click here to view the full file