PageRenderTime 66ms CodeModel.GetById 18ms 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
  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++) {
  1182. if (no_photo) {
  1183. data->cs_OV_ph_OV_ph[i] = 0.0;
  1184. data->dcs_OV_ph_OV_ph[i] = 0.0;
  1185. } else {
  1186. data->cs_OV_ph_OV_ph[i] = data->c_OV_ph_OV_ph[zbin_id] +
  1187. data->zdef * (data->c_OV_ph_OV_ph[zbin_id+1] - data->c_OV_ph_OV_ph[zbin_id]);
  1188. data->dcs_OV_ph_OV_ph[i] = (data->c_OV_ph_OV_ph[zbin_id+1] - data->c_OV_ph_OV_ph[zbin_id]);;
  1189. data->dcs_OV_ph_OV_ph[i] /= data->dz;
  1190. }
  1191. }
  1192. for (i = 0; i < nstrip; i++) {
  1193. bin_id = data->bin_id[i];
  1194. data->cs_OVI_c_OVI_c[i] = data->c_OVI_c_OVI_c[bin_id] +
  1195. data->Tdef[i] * (data->c_OVI_c_OVI_c[bin_id+1] - data->c_OVI_c_OVI_c[bin_id]);
  1196. data->dcs_OVI_c_OVI_c[i] = (data->c_OVI_c_OVI_c[bin_id+1] - data->c_OVI_c_OVI_c[bin_id]);;
  1197. data->dcs_OVI_c_OVI_c[i] /= data->dT[i];
  1198. data->dcs_OVI_c_OVI_c[i] *= data->invTs[i];
  1199. }
  1200. for (i = 0; i < nstrip; i++) {
  1201. if (no_photo) {
  1202. data->cs_OVI_ph_OVI_ph[i] = 0.0;
  1203. data->dcs_OVI_ph_OVI_ph[i] = 0.0;
  1204. } else {
  1205. data->cs_OVI_ph_OVI_ph[i] = data->c_OVI_ph_OVI_ph[zbin_id] +
  1206. data->zdef * (data->c_OVI_ph_OVI_ph[zbin_id+1] - data->c_OVI_ph_OVI_ph[zbin_id]);
  1207. data->dcs_OVI_ph_OVI_ph[i] = (data->c_OVI_ph_OVI_ph[zbin_id+1] - data->c_OVI_ph_OVI_ph[zbin_id]);;
  1208. data->dcs_OVI_ph_OVI_ph[i] /= data->dz;
  1209. }
  1210. }
  1211. for (i = 0; i < nstrip; i++) {
  1212. bin_id = data->bin_id[i];
  1213. data->cs_OVII_c_OVII_c[i] = data->c_OVII_c_OVII_c[bin_id] +
  1214. data->Tdef[i] * (data->c_OVII_c_OVII_c[bin_id+1] - data->c_OVII_c_OVII_c[bin_id]);
  1215. data->dcs_OVII_c_OVII_c[i] = (data->c_OVII_c_OVII_c[bin_id+1] - data->c_OVII_c_OVII_c[bin_id]);;
  1216. data->dcs_OVII_c_OVII_c[i] /= data->dT[i];
  1217. data->dcs_OVII_c_OVII_c[i] *= data->invTs[i];
  1218. }
  1219. for (i = 0; i < nstrip; i++) {
  1220. if (no_photo) {
  1221. data->cs_OVII_ph_OVII_ph[i] = 0.0;
  1222. data->dcs_OVII_ph_OVII_ph[i] = 0.0;
  1223. } else {
  1224. data->cs_OVII_ph_OVII_ph[i] = data->c_OVII_ph_OVII_ph[zbin_id] +
  1225. data->zdef * (data->c_OVII_ph_OVII_ph[zbin_id+1] - data->c_OVII_ph_OVII_ph[zbin_id]);
  1226. data->dcs_OVII_ph_OVII_ph[i] = (data->c_OVII_ph_OVII_ph[zbin_id+1] - data->c_OVII_ph_OVII_ph[zbin_id]);;
  1227. data->dcs_OVII_ph_OVII_ph[i] /= data->dz;
  1228. }
  1229. }
  1230. for (i = 0; i < nstrip; i++) {
  1231. bin_id = data->bin_id[i];
  1232. data->cs_OVIII_c_OVIII_c[i] = data->c_OVIII_c_OVIII_c[bin_id] +
  1233. data->Tdef[i] * (data->c_OVIII_c_OVIII_c[bin_id+1] - data->c_OVIII_c_OVIII_c[bin_id]);
  1234. data->dcs_OVIII_c_OVIII_c[i] = (data->c_OVIII_c_OVIII_c[bin_id+1] - data->c_OVIII_c_OVIII_c[bin_id]);;
  1235. data->dcs_OVIII_c_OVIII_c[i] /= data->dT[i];
  1236. data->dcs_OVIII_c_OVIII_c[i] *= data->invTs[i];
  1237. }
  1238. for (i = 0; i < nstrip; i++) {
  1239. if (no_photo) {
  1240. data->cs_OVIII_ph_OVIII_ph[i] = 0.0;
  1241. data->dcs_OVIII_ph_OVIII_ph[i] = 0.0;
  1242. } else {
  1243. data->cs_OVIII_ph_OVIII_ph[i] = data->c_OVIII_ph_OVIII_ph[zbin_id] +
  1244. data->zdef * (data->c_OVIII_ph_OVIII_ph[zbin_id+1] - data->c_OVIII_ph_OVIII_ph[zbin_id]);
  1245. data->dcs_OVIII_ph_OVIII_ph[i] = (data->c_OVIII_ph_OVIII_ph[zbin_id+1] - data->c_OVIII_ph_OVIII_ph[zbin_id]);;
  1246. data->dcs_OVIII_ph_OVIII_ph[i] /= data->dz;
  1247. }
  1248. }
  1249. }
  1250. int calculate_rhs_po(double *input, double *rhs, int nstrip,
  1251. int nchem, void *sdata)
  1252. {
  1253. /* We iterate over all of the rates */
  1254. /* Calculate temperature first */
  1255. po_data *data = (po_data*)sdata;
  1256. int i, j;
  1257. po_calculate_temperature(data, input, nstrip, nchem);
  1258. po_interpolate_rates(data, nstrip);
  1259. /* Now we set up some temporaries */
  1260. double *HeI_i = data->rs_HeI_i;
  1261. double *HeI_pi = data->rs_HeI_pi;
  1262. double *HeII_i = data->rs_HeII_i;
  1263. double *HeII_pi = data->rs_HeII_pi;
  1264. double *HeII_r = data->rs_HeII_r;
  1265. double *HeIII_r = data->rs_HeIII_r;
  1266. double *HI_i = data->rs_HI_i;
  1267. double *HI_pi = data->rs_HI_pi;
  1268. double *HII_r = data->rs_HII_r;
  1269. double *OI_i = data->rs_OI_i;
  1270. double *OI_pi = data->rs_OI_pi;
  1271. double *OII_i = data->rs_OII_i;
  1272. double *OII_pi = data->rs_OII_pi;
  1273. double *OII_r = data->rs_OII_r;
  1274. double *OIII_i = data->rs_OIII_i;
  1275. double *OIII_pi = data->rs_OIII_pi;
  1276. double *OIII_r = data->rs_OIII_r;
  1277. double *OIV_i = data->rs_OIV_i;
  1278. double *OIV_pi = data->rs_OIV_pi;
  1279. double *OIV_r = data->rs_OIV_r;
  1280. double *OIX_r = data->rs_OIX_r;
  1281. double *OV_i = data->rs_OV_i;
  1282. double *OV_pi = data->rs_OV_pi;
  1283. double *OV_r = data->rs_OV_r;
  1284. double *OVI_i = data->rs_OVI_i;
  1285. double *OVI_pi = data->rs_OVI_pi;
  1286. double *OVI_r = data->rs_OVI_r;
  1287. double *OVII_i = data->rs_OVII_i;
  1288. double *OVII_pi = data->rs_OVII_pi;
  1289. double *OVII_r = data->rs_OVII_r;
  1290. double *OVIII_i = data->rs_OVIII_i;
  1291. double *OVIII_pi = data->rs_OVIII_pi;
  1292. double *OVIII_r = data->rs_OVIII_r;
  1293. double *compton_comp = data->cs_compton_comp;
  1294. double *HeI_c_HeI_c = data->cs_HeI_c_HeI_c;
  1295. double *HeI_ph_HeI_ph = data->cs_HeI_ph_HeI_ph;
  1296. double *HeII_c_HeII_c = data->cs_HeII_c_HeII_c;
  1297. double *HeII_ph_HeII_ph = data->cs_HeII_ph_HeII_ph;
  1298. double *HeIII_c_HeIII_c = data->cs_HeIII_c_HeIII_c;
  1299. double *HI_c_HI_c = data->cs_HI_c_HI_c;
  1300. double *HI_ph_HI_ph = data->cs_HI_ph_HI_ph;
  1301. double *HII_c_HII_c = data->cs_HII_c_HII_c;
  1302. double *OI_c_OI_c = data->cs_OI_c_OI_c;
  1303. double *OI_ph_OI_ph = data->cs_OI_ph_OI_ph;
  1304. double *OII_c_OII_c = data->cs_OII_c_OII_c;
  1305. double *OII_ph_OII_ph = data->cs_OII_ph_OII_ph;
  1306. double *OIII_c_OIII_c = data->cs_OIII_c_OIII_c;
  1307. double *OIII_ph_OIII_ph = data->cs_OIII_ph_OIII_ph;
  1308. double *OIV_c_OIV_c = data->cs_OIV_c_OIV_c;
  1309. double *OIV_ph_OIV_ph = data->cs_OIV_ph_OIV_ph;
  1310. double *OIX_c_OIX_c = data->cs_OIX_c_OIX_c;
  1311. double *OV_c_OV_c = data->cs_OV_c_OV_c;
  1312. double *OV_ph_OV_ph = data->cs_OV_ph_OV_ph;
  1313. double *OVI_c_OVI_c = data->cs_OVI_c_OVI_c;
  1314. double *OVI_ph_OVI_ph = data->cs_OVI_ph_OVI_ph;
  1315. double *OVII_c_OVII_c = data->cs_OVII_c_OVII_c;
  1316. double *OVII_ph_OVII_ph = data->cs_OVII_ph_OVII_ph;
  1317. double *OVIII_c_OVIII_c = data->cs_OVIII_c_OVIII_c;
  1318. double *OVIII_ph_OVIII_ph = data->cs_OVIII_ph_OVIII_ph;
  1319. double HI;
  1320. double HII;
  1321. double HeI;
  1322. double HeII;
  1323. double HeIII;
  1324. double de;
  1325. double ge;
  1326. double OI;
  1327. double OII;
  1328. double OIII;
  1329. double OIV;
  1330. double OV;
  1331. double OVI;
  1332. double OVII;
  1333. double OVIII;
  1334. double OIX;
  1335. double z;
  1336. double T;
  1337. double mh = 1.67e-24;
  1338. double total, total_e, total_de, mdensity;
  1339. for (i = 0; i<nstrip; i++) {
  1340. j = i * nchem;
  1341. total = total_e = total_de = mdensity = 0.0;
  1342. T = data->Ts[i];
  1343. z = data->current_z;
  1344. HI = input[j];
  1345. if (HI < 0.0) {
  1346. /* fprintf(stderr, "RNegative[%d][HI] = % 0.16g [%d]\n",
  1347. i, HI, j); */
  1348. return 1;
  1349. //HI = 1e-20;
  1350. }
  1351. total+=HI * 1.00794;
  1352. j++;
  1353. HII = input[j];
  1354. if (HII < 0.0) {
  1355. /* fprintf(stderr, "RNegative[%d][HII] = % 0.16g [%d]\n",
  1356. i, HII, j); */
  1357. return 1;
  1358. //HII = 1e-20;
  1359. }
  1360. total+=HII * 1.00794;
  1361. j++;
  1362. HeI = input[j];
  1363. if (HeI < 0.0) {
  1364. /* fprintf(stderr, "RNegative[%d][HeI] = % 0.16g [%d]\n",
  1365. i, HeI, j); */
  1366. return 1;
  1367. //HeI = 1e-20;
  1368. }
  1369. total+=HeI * 4.002602;
  1370. j++;
  1371. HeII = input[j];
  1372. if (HeII < 0.0) {
  1373. /* fprintf(stderr, "RNegative[%d][HeII] = % 0.16g [%d]\n",
  1374. i, HeII, j); */
  1375. return 1;
  1376. //HeII = 1e-20;
  1377. }
  1378. total+=HeII * 4.002602;
  1379. j++;
  1380. HeIII = input[j];
  1381. if (HeIII < 0.0) {
  1382. /* fprintf(stderr, "RNegative[%d][HeIII] = % 0.16g [%d]\n",
  1383. i, HeIII, j); */
  1384. return 1;
  1385. //HeIII = 1e-20;
  1386. }
  1387. total+=HeIII * 4.002602;
  1388. j++;
  1389. de = input[j];
  1390. if (de < 0.0) {
  1391. /* fprintf(stderr, "RNegative[%d][de] = % 0.16g [%d]\n",
  1392. i, de, j); */
  1393. return 1;
  1394. //de = 1e-20;
  1395. }
  1396. j++;
  1397. ge = input[j];
  1398. if (ge < 0.0) {
  1399. /* fprintf(stderr, "RNegative[%d][ge] = % 0.16g [%d]\n",
  1400. i, ge, j); */
  1401. return 1;
  1402. //ge = 1e-20;
  1403. }
  1404. j++;
  1405. OI = input[j];
  1406. if (OI < 0.0) {
  1407. /* fprintf(stderr, "RNegative[%d][OI] = % 0.16g [%d]\n",
  1408. i, OI, j); */
  1409. return 1;
  1410. //OI = 1e-20;
  1411. }
  1412. total+=OI * 15.9994;
  1413. j++;
  1414. OII = input[j];
  1415. if (OII < 0.0) {
  1416. /* fprintf(stderr, "RNegative[%d][OII] = % 0.16g [%d]\n",
  1417. i, OII, j); */
  1418. return 1;
  1419. //OII = 1e-20;
  1420. }
  1421. total+=OII * 15.9994;
  1422. j++;
  1423. OIII = input[j];
  1424. if (OIII < 0.0) {
  1425. /* fprintf(stderr, "RNegative[%d][OIII] = % 0.16g [%d]\n",
  1426. i, OIII, j); */
  1427. return 1;
  1428. //OIII = 1e-20;
  1429. }
  1430. total+=OIII * 15.9994;
  1431. j++;
  1432. OIV = input[j];
  1433. if (OIV < 0.0) {
  1434. /* fprintf(stderr, "RNegative[%d][OIV] = % 0.16g [%d]\n",
  1435. i, OIV, j); */
  1436. return 1;
  1437. //OIV = 1e-20;
  1438. }
  1439. total+=OIV * 15.9994;
  1440. j++;
  1441. OV = input[j];
  1442. if (OV < 0.0) {
  1443. /* fprintf(stderr, "RNegative[%d][OV] = % 0.16g [%d]\n",
  1444. i, OV, j); */
  1445. return 1;
  1446. //OV = 1e-20;
  1447. }
  1448. total+=OV * 15.9994;
  1449. j++;
  1450. OVI = input[j];
  1451. if (OVI < 0.0) {
  1452. /* fprintf(stderr, "RNegative[%d][OVI] = % 0.16g [%d]\n",
  1453. i, OVI, j); */
  1454. return 1;
  1455. //OVI = 1e-20;
  1456. }
  1457. total+=OVI * 15.9994;
  1458. j++;
  1459. OVII = input[j];
  1460. if (OVII < 0.0) {
  1461. /* fprintf(stderr, "RNegative[%d][OVII] = % 0.16g [%d]\n",
  1462. i, OVII, j); */
  1463. return 1;
  1464. //OVII = 1e-20;
  1465. }
  1466. total+=OVII * 15.9994;
  1467. j++;
  1468. OVIII = input[j];
  1469. if (OVIII < 0.0) {
  1470. /* fprintf(stderr, "RNegative[%d][OVIII] = % 0.16g [%d]\n",
  1471. i, OVIII, j); */
  1472. return 1;
  1473. //OVIII = 1e-20;
  1474. }
  1475. total+=OVIII * 15.9994;
  1476. j++;
  1477. OIX = input[j];
  1478. if (OIX < 0.0) {
  1479. /* fprintf(stderr, "RNegative[%d][OIX] = % 0.16g [%d]\n",
  1480. i, OIX, j); */
  1481. return 1;
  1482. //OIX = 1e-20;
  1483. }
  1484. total+=OIX * 15.9994;
  1485. j++;
  1486. mdensity = total * mh;
  1487. total = 0.0;
  1488. j = i * nchem;
  1489. //
  1490. // Species: HI
  1491. //
  1492. rhs[j] = HII_r[i]*HII*de - HI_i[i]*HI*de - HI_pi[i]*HI;
  1493. /* Already in number density, not mass density */
  1494. total += rhs[j] * 1.00794;
  1495. total_e += HI * 0.0;
  1496. total_de += rhs[j] * 0.0;
  1497. j++;
  1498. //
  1499. // Species: HII
  1500. //
  1501. rhs[j] = -HII_r[i]*HII*de + HI_i[i]*HI*de + HI_pi[i]*HI;
  1502. /* Already in number density, not mass density */
  1503. total += rhs[j] * 1.00794;
  1504. total_e += HII * 1.0;
  1505. total_de += rhs[j] * 1.0;
  1506. j++;
  1507. //
  1508. // Species: HeI
  1509. //
  1510. rhs[j] = HeII_r[i]*HeII*de - HeI_i[i]*HeI*de - HeI_pi[i]*HeI;
  1511. /* Already in number density, not mass density */
  1512. total += rhs[j] * 4.002602;
  1513. total_e += HeI * 0.0;
  1514. total_de += rhs[j] * 0.0;
  1515. j++;
  1516. //
  1517. // Species: HeII
  1518. //
  1519. rhs[j] = HeIII_r[i]*HeIII*de - HeII_i[i]*HeII*de - HeII_pi[i]*HeII - HeII_r[i]*HeII*de + HeI_i[i]*HeI*de + HeI_pi[i]*HeI;
  1520. /* Already in number density, not mass density */
  1521. total += rhs[j] * 4.002602;
  1522. total_e += HeII * 1.0;
  1523. total_de += rhs[j] * 1.0;
  1524. j++;
  1525. //
  1526. // Species: HeIII
  1527. //
  1528. rhs[j] = -HeIII_r[i]*HeIII*de + HeII_i[i]*HeII*de + HeII_pi[i]*HeII;
  1529. /* Already in number density, not mass density */
  1530. total += rhs[j] * 4.002602;
  1531. total_e += HeIII * 2.0;
  1532. total_de += rhs[j] * 2.0;
  1533. j++;
  1534. //
  1535. // Species: de
  1536. //
  1537. rhs[j] = -HII_r[i]*HII*de + HI_i[i]*HI*de + HI_pi[i]*HI - HeIII_r[i]*HeIII*de + HeII_i[i]*HeII*de + HeII_pi[i]*HeII - HeII_r[i]*HeII*de + HeI_i[i]*HeI*de + HeI_pi[i]*HeI + OIII_i[i]*OIII*de + OIII_pi[i]*OIII - OIII_r[i]*OIII*de + OII_i[i]*OII*de + OII_pi[i]*OII - OII_r[i]*OII*de + OIV_i[i]*OIV*de + OIV_pi[i]*OIV - OIV_r[i]*OIV*de - OIX_r[i]*OIX*de + OI_i[i]*OI*de + OI_pi[i]*OI + OVIII_i[i]*OVIII*de + OVIII_pi[i]*OVIII - OVIII_r[i]*OVIII*de + OVII_i[i]*OVII*de + OVII_pi[i]*OVII - OVII_r[i]*OVII*de + OVI_i[i]*OVI*de + OVI_pi[i]*OVI - OVI_r[i]*OVI*de + OV_i[i]*OV*de + OV_pi[i]*OV - OV_r[i]*OV*de;
  1538. total_de += -rhs[j];
  1539. j++;
  1540. //
  1541. // Species: ge
  1542. //
  1543. rhs[j] = -HI*HI_c_HI_c[i]*de + HI*HI_ph_HI_ph[i] - HII*HII_c_HII_c[i]*de - HeI*HeI_c_HeI_c[i]*de + HeI*HeI_ph_HeI_ph[i] - HeII*HeII_c_HeII_c[i]*de + HeII*HeII_ph_HeII_ph[i] - HeIII*HeIII_c_HeIII_c[i]*de - OI*OI_c_OI_c[i]*de + OI*OI_ph_OI_ph[i] - OII*OII_c_OII_c[i]*de + OII*OII_ph_OII_ph[i] - OIII*OIII_c_OIII_c[i]*de + OIII*OIII_ph_OIII_ph[i] - OIV*OIV_c_OIV_c[i]*de + OIV*OIV_ph_OIV_ph[i] - OIX*OIX_c_OIX_c[i]*de - OV*OV_c_OV_c[i]*de + OV*OV_ph_OV_ph[i] - OVI*OVI_c_OVI_c[i]*de + OVI*OVI_ph_OVI_ph[i] - OVII*OVII_c_OVII_c[i]*de + OVII*OVII_ph_OVII_ph[i] - OVIII*OVIII_c_OVIII_c[i]*de + OVIII*OVIII_ph_OVIII_ph[i] - compton_comp[i]*de*pow(z + 1.0, 4)*(T - 2.73*z - 2.73);
  1544. rhs[j] /= mdensity;
  1545. j++;
  1546. //
  1547. // Species: OI
  1548. //
  1549. rhs[j] = OII_r[i]*OII*de - OI_i[i]*OI*de - OI_pi[i]*OI;
  1550. /* Already in number density, not mass density */
  1551. total += rhs[j] * 15.9994;
  1552. total_e += OI * 0;
  1553. total_de += rhs[j] * 0;
  1554. j++;
  1555. //
  1556. // Species: OII
  1557. //
  1558. rhs[j] = OIII_r[i]*OIII*de - OII_i[i]*OII*de - OII_pi[i]*OII - OII_r[i]*OII*de + OI_i[i]*OI*de + OI_pi[i]*OI;
  1559. /* Already in number density, not mass density */
  1560. total += rhs[j] * 15.9994;
  1561. total_e += OII * 1;
  1562. total_de += rhs[j] * 1;
  1563. j++;
  1564. //
  1565. // Species: OIII
  1566. //
  1567. rhs[j] = -OIII_i[i]*OIII*de - OIII_pi[i]*OIII - OIII_r[i]*OIII*de + OII_i[i]*OII*de + OII_pi[i]*OII + OIV_r[i]*OIV*de;
  1568. /* Already in number density, not mass density */
  1569. total += rhs[j] * 15.9994;
  1570. total_e += OIII * 2;
  1571. total_de += rhs[j] * 2;
  1572. j++;
  1573. //
  1574. // Species: OIV
  1575. //
  1576. rhs[j] = OIII_i[i]*OIII*de + OIII_pi[i]*OIII - OIV_i[i]*OIV*de - OIV_pi[i]*OIV - OIV_r[i]*OIV*de + OV_r[i]*OV*de;
  1577. /* Already in number density, not mass density */
  1578. total += rhs[j] * 15.9994;
  1579. total_e += OIV * 3;
  1580. total_de += rhs[j] * 3;
  1581. j++;
  1582. //
  1583. // Species: OV
  1584. //
  1585. rhs[j] = OIV_i[i]*OIV*de + OIV_pi[i]*OIV + OVI_r[i]*OVI*de - OV_i[i]*OV*de - OV_pi[i]*OV - OV_r[i]*OV*de;
  1586. /* Already in number density, not mass density */
  1587. total += rhs[j] * 15.9994;
  1588. total_e += OV * 4;
  1589. total_de += rhs[j] * 4;
  1590. j++;
  1591. //
  1592. // Species: OVI
  1593. //
  1594. rhs[j] = OVII_r[i]*OVII*de - OVI_i[i]*OVI*de - OVI_pi[i]*OVI - OVI_r[i]*OVI*de + OV_i[i]*OV*de + OV_pi[i]*OV;
  1595. /* Already in number density, not mass density */
  1596. total += rhs[j] * 15.9994;
  1597. total_e += OVI * 5;
  1598. total_de += rhs[j] * 5;
  1599. j++;
  1600. //
  1601. // Species: OVII
  1602. //
  1603. rhs[j] = OVIII_r[i]*OVIII*de - OVII_i[i]*OVII*de - OVII_pi[i]*OVII - OVII_r[i]*OVII*de + OVI_i[i]*OVI*de + OVI_pi[i]*OVI;
  1604. /* Already in number density, not mass density */
  1605. total += rhs[j] * 15.9994;
  1606. total_e += OVII * 6;
  1607. total_de += rhs[j] * 6;
  1608. j++;
  1609. //
  1610. // Species: OVIII
  1611. //
  1612. rhs[j] = OIX_r[i]*OIX*de - OVIII_i[i]*OVIII*de - OVIII_pi[i]*OVIII - OVIII_r[i]*OVIII*de + OVII_i[i]*OVII*de + OVII_pi[i]*OVII;
  1613. /* Already in number density, not mass density */
  1614. total += rhs[j] * 15.9994;
  1615. total_e += OVIII * 7;
  1616. total_de += rhs[j] * 7;
  1617. j++;
  1618. //
  1619. // Species: OIX
  1620. //
  1621. rhs[j] = -OIX_r[i]*OIX*de + OVIII_i[i]*OVIII*de + OVIII_pi[i]*OVIII;
  1622. /* Already in number density, not mass density */
  1623. total += rhs[j] * 15.9994;
  1624. total_e += OIX * 8;
  1625. total_de += rhs[j] * 8;
  1626. j++;
  1627. }
  1628. return 0;
  1629. }
  1630. int calculate_jacobian_po(double *input, double *Joutput,
  1631. int nstrip, int nchem, void *sdata)
  1632. {
  1633. /* We iterate over all of the rates */
  1634. /* Calculate temperature first */
  1635. po_data *data = (po_data*)sdata;
  1636. int i, j;
  1637. //po_calculate_temperature(data, input, nstrip, nchem);
  1638. //po_interpolate_rates(data, nstrip);
  1639. /* Now we set up some temporaries */
  1640. double *Tge = data->dTs_ge;
  1641. double *HeI_i = data->rs_HeI_i;
  1642. double *rHeI_i = data->drs_HeI_i;
  1643. double *HeI_pi = data->rs_HeI_pi;
  1644. double *rHeI_pi = data->drs_HeI_pi;
  1645. double *HeII_i = data->rs_HeII_i;
  1646. double *rHeII_i = data->drs_HeII_i;
  1647. double *HeII_pi = data->rs_HeII_pi;
  1648. double *rHeII_pi = data->drs_HeII_pi;
  1649. double *HeII_r = data->rs_HeII_r;
  1650. double *rHeII_r = data->drs_HeII_r;
  1651. double *HeIII_r = data->rs_HeIII_r;
  1652. double *rHeIII_r = data->drs_HeIII_r;
  1653. double *HI_i = data->rs_HI_i;
  1654. double *rHI_i = data->drs_HI_i;
  1655. double *HI_pi = data->rs_HI_pi;
  1656. double *rHI_pi = data->drs_HI_pi;
  1657. double *HII_r = data->rs_HII_r;
  1658. double *rHII_r = data->drs_HII_r;
  1659. double *OI_i = data->rs_OI_i;
  1660. double *rOI_i = data->drs_OI_i;
  1661. double *OI_pi = data->rs_OI_pi;
  1662. double *rOI_pi = data->drs_OI_pi;
  1663. double *OII_i = data->rs_OII_i;
  1664. double *rOII_i = data->drs_OII_i;
  1665. double *OII_pi = data->rs_OII_pi;
  1666. double *rOII_pi = data->drs_OII_pi;
  1667. double *OII_r = data->rs_OII_r;
  1668. double *rOII_r = data->drs_OII_r;
  1669. double *OIII_i = data->rs_OIII_i;
  1670. double *rOIII_i = data->drs_OIII_i;
  1671. double *OIII_pi = data->rs_OIII_pi;
  1672. double *rOIII_pi = data->drs_OIII_pi;
  1673. double *OIII_r = data->rs_OIII_r;
  1674. double *rOIII_r = data->drs_OIII_r;
  1675. double *OIV_i = data->rs_OIV_i;
  1676. double *rOIV_i = data->drs_OIV_i;
  1677. double *OIV_pi = data->rs_OIV_pi;
  1678. double *rOIV_pi = data->drs_OIV_pi;
  1679. double *OIV_r = data->rs_OIV_r;
  1680. double *rOIV_r = data->drs_OIV_r;
  1681. double *OIX_r = data->rs_OIX_r;
  1682. double *rOIX_r = data->drs_OIX_r;
  1683. double *OV_i = data->rs_OV_i;
  1684. double *rOV_i = data->drs_OV_i;
  1685. double *OV_pi = data->rs_OV_pi;
  1686. double *rOV_pi = data->drs_OV_pi;
  1687. double *OV_r = data->rs_OV_r;
  1688. double *rOV_r = data->drs_OV_r;
  1689. double *OVI_i = data->rs_OVI_i;
  1690. double *rOVI_i = data->drs_OVI_i;
  1691. double *OVI_pi = data->rs_OVI_pi;
  1692. double *rOVI_pi = data->drs_OVI_pi;
  1693. double *OVI_r = data->rs_OVI_r;
  1694. double *rOVI_r = data->drs_OVI_r;
  1695. double *OVII_i = data->rs_OVII_i;
  1696. double *rOVII_i = data->drs_OVII_i;
  1697. double *OVII_pi = data->rs_OVII_pi;
  1698. double *rOVII_pi = data->drs_OVII_pi;
  1699. double *OVII_r = data->rs_OVII_r;
  1700. double *rOVII_r = data->drs_OVII_r;
  1701. double *OVIII_i = data->rs_OVIII_i;
  1702. double *rOVIII_i = data->drs_OVIII_i;
  1703. double *OVIII_pi = data->rs_OVIII_pi;
  1704. double *rOVIII_pi = data->drs_OVIII_pi;
  1705. double *OVIII_r = data->rs_OVIII_r;
  1706. double *rOVIII_r = data->drs_OVIII_r;
  1707. double *compton_comp = data->cs_compton_comp;
  1708. double *rcompton_comp = data->dcs_compton_comp;
  1709. double *HeI_c_HeI_c = data->cs_HeI_c_HeI_c;
  1710. double *rHeI_c_HeI_c = data->dcs_HeI_c_HeI_c;
  1711. double *HeI_ph_HeI_ph = data->cs_HeI_ph_HeI_ph;
  1712. double *rHeI_ph_HeI_ph = data->dcs_HeI_ph_HeI_ph;
  1713. double *HeII_c_HeII_c = data->cs_HeII_c_HeII_c;
  1714. double *rHeII_c_HeII_c = data->dcs_HeII_c_HeII_c;
  1715. double *HeII_ph_HeII_ph = data->cs_HeII_ph_HeII_ph;
  1716. double *rHeII_ph_HeII_ph = data->dcs_HeII_ph_HeII_ph;
  1717. double *HeIII_c_HeIII_c = data->cs_HeIII_c_HeIII_c;
  1718. double *rHeIII_c_HeIII_c = data->dcs_HeIII_c_HeIII_c;
  1719. double *HI_c_HI_c = data->cs_HI_c_HI_c;
  1720. double *rHI_c_HI_c = data->dcs_HI_c_HI_c;
  1721. double *HI_ph_HI_ph = data->cs_HI_ph_HI_ph;
  1722. double *rHI_ph_HI_ph = data->dcs_HI_ph_HI_ph;
  1723. double *HII_c_HII_c = data->cs_HII_c_HII_c;
  1724. double *rHII_c_HII_c = data->dcs_HII_c_HII_c;
  1725. double *OI_c_OI_c = data->cs_OI_c_OI_c;
  1726. double *rOI_c_OI_c = data->dcs_OI_c_OI_c;
  1727. double *OI_ph_OI_ph = data->cs_OI_ph_OI_ph;
  1728. double *rOI_ph_OI_ph = data->dcs_OI_ph_OI_ph;
  1729. double *OII_c_OII_c = data->cs_OII_c_OII_c;
  1730. double *rOII_c_OII_c = data->dcs_OII_c_OII_c;
  1731. double *OII_ph_OII_ph = data->cs_OII_ph_OII_ph;
  1732. double *rOII_ph_OII_ph = data->dcs_OII_ph_OII_ph;
  1733. double *OIII_c_OIII_c = data->cs_OIII_c_OIII_c;
  1734. double *rOIII_c_OIII_c = data->dcs_OIII_c_OIII_c;
  1735. double *OIII_ph_OIII_ph = data->cs_OIII_ph_OIII_ph;
  1736. double *rOIII_ph_OIII_ph = data->dcs_OIII_ph_OIII_ph;
  1737. double *OIV_c_OIV_c = data->cs_OIV_c_OIV_c;
  1738. double *rOIV_c_OIV_c = data->dcs_OIV_c_OIV_c;
  1739. double *OIV_ph_OIV_ph = data->cs_OIV_ph_OIV_ph;
  1740. double *rOIV_ph_OIV_ph = data->dcs_OIV_ph_OIV_ph;
  1741. double *OIX_c_OIX_c = data->cs_OIX_c_OIX_c;
  1742. double *rOIX_c_OIX_c = data->dcs_OIX_c_OIX_c;
  1743. double *OV_c_OV_c = data->cs_OV_c_OV_c;
  1744. double *rOV_c_OV_c = data->dcs_OV_c_OV_c;
  1745. double *OV_ph_OV_ph = data->cs_OV_ph_OV_ph;
  1746. double *rOV_ph_OV_ph = data->dcs_OV_ph_OV_ph;
  1747. double *OVI_c_OVI_c = data->cs_OVI_c_OVI_c;
  1748. double *rOVI_c_OVI_c = data->dcs_OVI_c_OVI_c;
  1749. double *OVI_ph_OVI_ph = data->cs_OVI_ph_OVI_ph;
  1750. double *rOVI_ph_OVI_ph = data->dcs_OVI_ph_OVI_ph;
  1751. double *OVII_c_OVII_c = data->cs_OVII_c_OVII_c;
  1752. double *rOVII_c_OVII_c = data->dcs_OVII_c_OVII_c;
  1753. double *OVII_ph_OVII_ph = data->cs_OVII_ph_OVII_ph;
  1754. double *rOVII_ph_OVII_ph = data->dcs_OVII_ph_OVII_ph;
  1755. double *OVIII_c_OVIII_c = data->cs_OVIII_c_OVIII_c;
  1756. double *rOVIII_c_OVIII_c = data->dcs_OVIII_c_OVIII_c;
  1757. double *OVIII_ph_OVIII_ph = data->cs_OVIII_ph_OVIII_ph;
  1758. double *rOVIII_ph_OVIII_ph = data->dcs_OVIII_ph_OVIII_ph;
  1759. double HI;
  1760. double HII;
  1761. double HeI;
  1762. double HeII;
  1763. double HeIII;
  1764. double de;
  1765. double ge;
  1766. double OI;
  1767. double OII;
  1768. double OIII;
  1769. double OIV;
  1770. double OV;
  1771. double OVI;
  1772. double OVII;
  1773. double OVIII;
  1774. double OIX;
  1775. double z;
  1776. double T;
  1777. double mh = 1.67e-24;
  1778. double total, mdensity;
  1779. for (i = 0; i<nstrip; i++) {
  1780. j = i * nchem;
  1781. total = mdensity = 0.0;
  1782. T = data->Ts[i];
  1783. z = data->current_z;
  1784. HI = input[j];
  1785. if (HI < 0.0) {
  1786. fprintf(stderr, "JNegative[%d][HI] = % 0.16g [%d]\n",
  1787. i, HI, j);
  1788. /*HI = 0.0;*/
  1789. //HI = 1e-20;
  1790. return 1;
  1791. }
  1792. total+=HI * 1.00794;
  1793. j++;
  1794. HII = input[j];
  1795. if (HII < 0.0) {
  1796. fprintf(stderr, "JNegative[%d][HII] = % 0.16g [%d]\n",
  1797. i, HII, j);
  1798. /*HII = 0.0;*/
  1799. //HII = 1e-20;
  1800. return 1;
  1801. }
  1802. total+=HII * 1.00794;
  1803. j++;
  1804. HeI = input[j];
  1805. if (HeI < 0.0) {
  1806. fprintf(stderr, "JNegative[%d][HeI] = % 0.16g [%d]\n",
  1807. i, HeI, j);
  1808. /*HeI = 0.0;*/
  1809. //HeI = 1e-20;
  1810. return 1;
  1811. }
  1812. total+=HeI * 4.002602;
  1813. j++;
  1814. HeII = input[j];
  1815. if (HeII < 0.0) {
  1816. fprintf(stderr, "JNegative[%d][HeII] = % 0.16g [%d]\n",
  1817. i, HeII, j);
  1818. /*HeII = 0.0;*/
  1819. //HeII = 1e-20;
  1820. return 1;
  1821. }
  1822. total+=HeII * 4.002602;
  1823. j++;
  1824. HeIII = input[j];
  1825. if (HeIII < 0.0) {
  1826. fprintf(stderr, "JNegative[%d][HeIII] = % 0.16g [%d]\n",
  1827. i, HeIII, j);
  1828. /*HeIII = 0.0;*/
  1829. //HeIII = 1e-20;
  1830. return 1;
  1831. }
  1832. total+=HeIII * 4.002602;
  1833. j++;
  1834. de = input[j];
  1835. if (de < 0.0) {
  1836. fprintf(stderr, "JNegative[%d][de] = % 0.16g [%d]\n",
  1837. i, de, j);
  1838. /*de = 0.0;*/
  1839. //de = 1e-20;
  1840. return 1;
  1841. }
  1842. j++;
  1843. ge = input[j];
  1844. if (ge < 0.0) {
  1845. fprintf(stderr, "JNegative[%d][ge] = % 0.16g [%d]\n",
  1846. i, ge, j);
  1847. /*ge = 0.0;*/
  1848. //ge = 1e-20;
  1849. return 1;
  1850. }
  1851. j++;
  1852. OI = input[j];
  1853. if (OI < 0.0) {
  1854. fprintf(stderr, "JNegative[%d][OI] = % 0.16g [%d]\n",
  1855. i, OI, j);
  1856. /*OI = 0.0;*/
  1857. //OI = 1e-20;
  1858. return 1;
  1859. }
  1860. total+=OI * 15.9994;
  1861. j++;
  1862. OII = input[j];
  1863. if (OII < 0.0) {
  1864. fprintf(stderr, "JNegative[%d][OII] = % 0.16g [%d]\n",
  1865. i, OII, j);
  1866. /*OII = 0.0;*/
  1867. //OII = 1e-20;
  1868. return 1;
  1869. }
  1870. total+=OII * 15.9994;
  1871. j++;
  1872. OIII = input[j];
  1873. if (OIII < 0.0) {
  1874. fprintf(stderr, "JNegative[%d][OIII] = % 0.16g [%d]\n",
  1875. i, OIII, j);
  1876. /*OIII = 0.0;*/
  1877. //OIII = 1e-20;
  1878. return 1;
  1879. }
  1880. total+=OIII * 15.9994;
  1881. j++;
  1882. OIV = input[j];
  1883. if (OIV < 0.0) {
  1884. fprintf(stderr, "JNegative[%d][OIV] = % 0.16g [%d]\n",
  1885. i, OIV, j);
  1886. /*OIV = 0.0;*/
  1887. //OIV = 1e-20;
  1888. return 1;
  1889. }
  1890. total+=OIV * 15.9994;
  1891. j++;
  1892. OV = input[j];
  1893. if (OV < 0.0) {
  1894. fprintf(stderr, "JNegative[%d][OV] = % 0.16g [%d]\n",
  1895. i, OV, j);
  1896. /*OV = 0.0;*/
  1897. //OV = 1e-20;
  1898. return 1;
  1899. }
  1900. total+=OV * 15.9994;
  1901. j++;
  1902. OVI = input[j];
  1903. if (OVI < 0.0) {
  1904. fprintf(stderr, "JNegative[%d][OVI] = % 0.16g [%d]\n",
  1905. i, OVI, j);
  1906. /*OVI = 0.0;*/
  1907. //OVI = 1e-20;
  1908. return 1;
  1909. }
  1910. total+=OVI * 15.9994;
  1911. j++;
  1912. OVII = input[j];
  1913. if (OVII < 0.0) {
  1914. fprintf(stderr, "JNegative[%d][OVII] = % 0.16g [%d]\n",
  1915. i, OVII, j);
  1916. /*OVII = 0.0;*/
  1917. //OVII = 1e-20;
  1918. return 1;
  1919. }
  1920. total+=OVII * 15.9994;
  1921. j++;
  1922. OVIII = input[j];
  1923. if (OVIII < 0.0) {
  1924. fprintf(stderr, "JNegative[%d][OVIII] = % 0.16g [%d]\n",
  1925. i, OVIII, j);
  1926. /*OVIII = 0.0;*/
  1927. //OVIII = 1e-20;
  1928. return 1;
  1929. }
  1930. total+=OVIII * 15.9994;
  1931. j++;
  1932. OIX = input[j];
  1933. if (OIX < 0.0) {
  1934. fprintf(stderr, "JNegative[%d][OIX] = % 0.16g [%d]\n",
  1935. i, OIX, j);
  1936. /*OIX = 0.0;*/
  1937. //OIX = 1e-20;
  1938. return 1;
  1939. }
  1940. total+=OIX * 15.9994;
  1941. j++;
  1942. mdensity = total * mh;
  1943. j = i * nchem * nchem;
  1944. //
  1945. // Species: HI
  1946. //
  1947. // HI by HI
  1948. Joutput[j] = -HI_i[i]*de - HI_pi[i];
  1949. j++;
  1950. // HII by HI
  1951. Joutput[j] = HI_i[i]*de + HI_pi[i];
  1952. j++;
  1953. // HeI by HI
  1954. Joutput[j] = 0;
  1955. j++;
  1956. // HeII by HI
  1957. Joutput[j] = 0;
  1958. j++;
  1959. // HeIII by HI
  1960. Joutput[j] = 0;
  1961. j++;
  1962. // de by HI
  1963. Joutput[j] = HI_i[i]*de + HI_pi[i];
  1964. j++;
  1965. // ge by HI
  1966. Joutput[j] = -HI_c_HI_c[i]*de + HI_ph_HI_ph[i];
  1967. Joutput[j] /= mdensity;
  1968. j++;
  1969. // OI by HI
  1970. Joutput[j] = 0;
  1971. j++;
  1972. // OII by HI
  1973. Joutput[j] = 0;
  1974. j++;
  1975. // OIII by HI
  1976. Joutput[j] = 0;
  1977. j++;
  1978. // OIV by HI
  1979. Joutput[j] = 0;
  1980. j++;
  1981. // OV by HI
  1982. Joutput[j] = 0;
  1983. j++;
  1984. // OVI by HI
  1985. Joutput[j] = 0;
  1986. j++;
  1987. // OVII by HI
  1988. Joutput[j] = 0;
  1989. j++;
  1990. // OVIII by HI
  1991. Joutput[j] = 0;
  1992. j++;
  1993. // OIX by HI
  1994. Joutput[j] = 0;
  1995. j++;
  1996. //
  1997. // Species: HII
  1998. //
  1999. // HI by HII
  2000. Joutput[j] = HII_r[i]*de;
  2001. j++;
  2002. // HII by HII
  2003. Joutput[j] = -HII_r[i]*de;
  2004. j++;
  2005. // HeI by HII
  2006. Joutput[j] = 0;
  2007. j++;
  2008. // HeII by HII
  2009. Joutput[j] = 0;
  2010. j++;
  2011. // HeIII by HII
  2012. Joutput[j] = 0;
  2013. j++;
  2014. // de by HII
  2015. Joutput[j] = -HII_r[i]*de;
  2016. j++;
  2017. // ge by HII
  2018. Joutput[j] = -HII_c_HII_c[i]*de;
  2019. Joutput[j] /= mdensity;
  2020. j++;
  2021. // OI by HII
  2022. Joutput[j] = 0;
  2023. j++;
  2024. // OII by HII
  2025. Joutput[j] = 0;
  2026. j++;
  2027. // OIII by HII
  2028. Joutput[j] = 0;
  2029. j++;
  2030. // OIV by HII
  2031. Joutput[j] = 0;
  2032. j++;
  2033. // OV by HII
  2034. Joutput[j] = 0;
  2035. j++;
  2036. // OVI by HII
  2037. Joutput[j] = 0;
  2038. j++;
  2039. // OVII by HII
  2040. Joutput[j] = 0;
  2041. j++;
  2042. // OVIII by HII
  2043. Joutput[j] = 0;
  2044. j++;
  2045. // OIX by HII
  2046. Joutput[j] = 0;
  2047. j++;
  2048. //
  2049. // Species: HeI
  2050. //
  2051. // HI by HeI
  2052. Joutput[j] = 0;
  2053. j++;
  2054. // HII by HeI
  2055. Joutput[j] = 0;
  2056. j++;
  2057. // HeI by HeI
  2058. Joutput[j] = -HeI_i[i]*de - HeI_pi[i];
  2059. j++;
  2060. // HeII by HeI
  2061. Joutput[j] = HeI_i[i]*de + HeI_pi[i];
  2062. j++;
  2063. // HeIII by HeI
  2064. Joutput[j] = 0;
  2065. j++;
  2066. // de by HeI
  2067. Joutput[j] = HeI_i[i]*de + HeI_pi[i];
  2068. j++;
  2069. // ge by HeI
  2070. Joutput[j] = -HeI_c_HeI_c[i]*de + HeI_ph_HeI_ph[i];
  2071. Joutput[j] /= mdensity;
  2072. j++;
  2073. // OI by HeI
  2074. Joutput[j] = 0;
  2075. j++;
  2076. // OII by HeI
  2077. Joutput[j] = 0;
  2078. j++;
  2079. // OIII by HeI
  2080. Joutput[j] = 0;
  2081. j++;
  2082. // OIV by HeI
  2083. Joutput[j] = 0;
  2084. j++;
  2085. // OV by HeI
  2086. Joutput[j] = 0;
  2087. j++;
  2088. // OVI by HeI
  2089. Joutput[j] = 0;
  2090. j++;
  2091. // OVII by HeI
  2092. Joutput[j] = 0;
  2093. j++;
  2094. // OVIII by HeI
  2095. Joutput[j] = 0;
  2096. j++;
  2097. // OIX by HeI
  2098. Joutput[j] = 0;
  2099. j++;
  2100. //
  2101. // Species: HeII
  2102. //
  2103. // HI by HeII
  2104. Joutput[j] = 0;
  2105. j++;
  2106. // HII by HeII
  2107. Joutput[j] = 0;
  2108. j++;
  2109. // HeI by HeII
  2110. Joutput[j] = HeII_r[i]*de;
  2111. j++;
  2112. // HeII by HeII
  2113. Joutput[j] = -HeII_i[i]*de - HeII_pi[i] - HeII_r[i]*de;
  2114. j++;
  2115. // HeIII by HeII
  2116. Joutput[j] = HeII_i[i]*de + HeII_pi[i];
  2117. j++;
  2118. // de by HeII
  2119. Joutput[j] = HeII_i[i]*de + HeII_pi[i] - HeII_r[i]*de;
  2120. j++;
  2121. // ge by HeII
  2122. Joutput[j] = -HeII_c_HeII_c[i]*de + HeII_ph_HeII_ph[i];
  2123. Joutput[j] /= mdensity;
  2124. j++;
  2125. // OI by HeII
  2126. Joutput[j] = 0;
  2127. j++;
  2128. // OII by HeII
  2129. Joutput[j] = 0;
  2130. j++;
  2131. // OIII by HeII
  2132. Joutput[j] = 0;
  2133. j++;
  2134. // OIV by HeII
  2135. Joutput[j] = 0;
  2136. j++;
  2137. // OV by HeII
  2138. Joutput[j] = 0;
  2139. j++;
  2140. // OVI by HeII
  2141. Joutput[j] = 0;
  2142. j++;
  2143. // OVII by HeII
  2144. Joutput[j] = 0;
  2145. j++;
  2146. // OVIII by HeII
  2147. Joutput[j] = 0;
  2148. j++;
  2149. // OIX by HeII
  2150. Joutput[j] = 0;
  2151. j++;
  2152. //
  2153. // Species: HeIII
  2154. //
  2155. // HI by HeIII
  2156. Joutput[j] = 0;
  2157. j++;
  2158. // HII by HeIII
  2159. Joutput[j] = 0;
  2160. j++;
  2161. // HeI by HeIII
  2162. Joutput[j] = 0;
  2163. j++;
  2164. // HeII by HeIII
  2165. Joutput[j] = HeIII_r[i]*de;
  2166. j++;
  2167. // HeIII by HeIII
  2168. Joutput[j] = -HeIII_r[i]*de;
  2169. j++;
  2170. // de by HeIII
  2171. Joutput[j] = -HeIII_r[i]*de;
  2172. j++;
  2173. // ge by HeIII
  2174. Joutput[j] = -HeIII_c_HeIII_c[i]*de;
  2175. Joutput[j] /= mdensity;
  2176. j++;
  2177. // OI by HeIII
  2178. Joutput[j] = 0;
  2179. j++;
  2180. // OII by HeIII
  2181. Joutput[j] = 0;
  2182. j++;
  2183. // OIII by HeIII
  2184. Joutput[j] = 0;
  2185. j++;
  2186. // OIV by HeIII
  2187. Joutput[j] = 0;
  2188. j++;
  2189. // OV by HeIII
  2190. Joutput[j] = 0;
  2191. j++;
  2192. // OVI by HeIII
  2193. Joutput[j] = 0;
  2194. j++;
  2195. // OVII by HeIII
  2196. Joutput[j] = 0;
  2197. j++;
  2198. // OVIII by HeIII
  2199. Joutput[j] = 0;
  2200. j++;
  2201. // OIX by HeIII
  2202. Joutput[j] = 0;
  2203. j++;
  2204. //
  2205. // Species: de
  2206. //
  2207. // HI by de
  2208. Joutput[j] = HII_r[i]*HII - HI_i[i]*HI;
  2209. j++;
  2210. // HII by de
  2211. Joutput[j] = -HII_r[i]*HII + HI_i[i]*HI;
  2212. j++;
  2213. // HeI by de
  2214. Joutput[j] = HeII_r[i]*HeII - HeI_i[i]*HeI;
  2215. j++;
  2216. // HeII by de
  2217. Joutput[j] = HeIII_r[i]*HeIII - HeII_i[i]*HeII - HeII_r[i]*HeII + HeI_i[i]*HeI;
  2218. j++;
  2219. // HeIII by de
  2220. Joutput[j] = -HeIII_r[i]*HeIII + HeII_i[i]*HeII;
  2221. j++;
  2222. // de by de
  2223. Joutput[j] = -HII_r[i]*HII + HI_i[i]*HI - HeIII_r[i]*HeIII + HeII_i[i]*HeII - HeII_r[i]*HeII + HeI_i[i]*HeI + OIII_i[i]*OIII - OIII_r[i]*OIII + OII_i[i]*OII - OII_r[i]*OII + OIV_i[i]*OIV - OIV_r[i]*OIV - OIX_r[i]*OIX + OI_i[i]*OI + OVIII_i[i]*OVIII - OVIII_r[i]*OVIII + OVII_i[i]*OVII - OVII_r[i]*OVII + OVI_i[i]*OVI - OVI_r[i]*OVI + OV_i[i]*OV - OV_r[i]*OV;
  2224. j++;
  2225. // ge by de
  2226. Joutput[j] = -HI*HI_c_HI_c[i] - HII*HII_c_HII_c[i] - HeI*HeI_c_HeI_c[i] - HeII*HeII_c_HeII_c[i] - HeIII*HeIII_c_HeIII_c[i] - OI*OI_c_OI_c[i] - OII*OII_c_OII_c[i] - OIII*OIII_c_OIII_c[i] - OIV*OIV_c_OIV_c[i] - OIX*OIX_c_OIX_c[i] - OV*OV_c_OV_c[i] - OVI*OVI_c_OVI_c[i] - OVII*OVII_c_OVII_c[i] - OVIII*OVIII_c_OVIII_c[i] - compton_comp[i]*pow(z + 1.0, 4)*(T - 2.73*z - 2.73);
  2227. Joutput[j] /= mdensity;
  2228. j++;
  2229. // OI by de
  2230. Joutput[j] = OII_r[i]*OII - OI_i[i]*OI;
  2231. j++;
  2232. // OII by de
  2233. Joutput[j] = OIII_r[i]*OIII - OII_i[i]*OII - OII_r[i]*OII + OI_i[i]*OI;
  2234. j++;
  2235. // OIII by de
  2236. Joutput[j] = -OIII_i[i]*OIII - OIII_r[i]*OIII + OII_i[i]*OII + OIV_r[i]*OIV;
  2237. j++;
  2238. // OIV by de
  2239. Joutput[j] = OIII_i[i]*OIII - OIV_i[i]*OIV - OIV_r[i]*OIV + OV_r[i]*OV;
  2240. j++;
  2241. // OV by de
  2242. Joutput[j] = OIV_i[i]*OIV + OVI_r[i]*OVI - OV_i[i]*OV - OV_r[i]*OV;
  2243. j++;
  2244. // OVI by de
  2245. Joutput[j] = OVII_r[i]*OVII - OVI_i[i]*OVI - OVI_r[i]*OVI + OV_i[i]*OV;
  2246. j++;
  2247. // OVII by de
  2248. Joutput[j] = OVIII_r[i]*OVIII - OVII_i[i]*OVII - OVII_r[i]*OVII + OVI_i[i]*OVI;
  2249. j++;
  2250. // OVIII by de
  2251. Joutput[j] = OIX_r[i]*OIX - OVIII_i[i]*OVIII - OVIII_r[i]*OVIII + OVII_i[i]*OVII;
  2252. j++;
  2253. // OIX by de
  2254. Joutput[j] = -OIX_r[i]*OIX + OVIII_i[i]*OVIII;
  2255. j++;
  2256. //
  2257. // Species: ge
  2258. //
  2259. // HI by ge
  2260. Joutput[j] = -HI*de*rHI_i[i] - HI*rHI_pi[i] + HII*de*rHII_r[i];
  2261. Joutput[j] *= Tge[i];
  2262. j++;
  2263. // HII by ge
  2264. Joutput[j] = HI*de*rHI_i[i] + HI*rHI_pi[i] - HII*de*rHII_r[i];
  2265. Joutput[j] *= Tge[i];
  2266. j++;
  2267. // HeI by ge
  2268. Joutput[j] = -HeI*de*rHeI_i[i] - HeI*rHeI_pi[i] + HeII*de*rHeII_r[i];
  2269. Joutput[j] *= Tge[i];
  2270. j++;
  2271. // HeII by ge
  2272. Joutput[j] = HeI*de*rHeI_i[i] + HeI*rHeI_pi[i] - HeII*de*rHeII_i[i] - HeII*de*rHeII_r[i] - HeII*rHeII_pi[i] + HeIII*de*rHeIII_r[i];
  2273. Joutput[j] *= Tge[i];
  2274. j++;
  2275. // HeIII by ge
  2276. Joutput[j] = HeII*de*rHeII_i[i] + HeII*rHeII_pi[i] - HeIII*de*rHeIII_r[i];
  2277. Joutput[j] *= Tge[i];
  2278. j++;
  2279. // de by ge
  2280. Joutput[j] = HI*de*rHI_i[i] + HI*rHI_pi[i] - HII*de*rHII_r[i] + HeI*de*rHeI_i[i] + HeI*rHeI_pi[i] + HeII*de*rHeII_i[i] - HeII*de*rHeII_r[i] + HeII*rHeII_pi[i] - HeIII*de*rHeIII_r[i] + OI*de*rOI_i[i] + OI*rOI_pi[i] + OII*de*rOII_i[i] - OII*de*rOII_r[i] + OII*rOII_pi[i] + OIII*de*rOIII_i[i] - OIII*de*rOIII_r[i] + OIII*rOIII_pi[i] + OIV*de*rOIV_i[i] - OIV*de*rOIV_r[i] + OIV*rOIV_pi[i] - OIX*de*rOIX_r[i] + OV*de*rOV_i[i] - OV*de*rOV_r[i] + OV*rOV_pi[i] + OVI*de*rOVI_i[i] - OVI*de*rOVI_r[i] + OVI*rOVI_pi[i] + OVII*de*rOVII_i[i] - OVII*de*rOVII_r[i] + OVII*rOVII_pi[i] + OVIII*de*rOVIII_i[i] - OVIII*de*rOVIII_r[i] + OVIII*rOVIII_pi[i];
  2281. Joutput[j] *= Tge[i];
  2282. j++;
  2283. // ge by ge
  2284. Joutput[j] = 0;
  2285. Joutput[j] /= mdensity;
  2286. Joutput[j] *= Tge[i];
  2287. j++;
  2288. // OI by ge
  2289. Joutput[j] = -OI*de*rOI_i[i] - OI*rOI_pi[i] + OII*de*rOII_r[i];
  2290. Joutput[j] *= Tge[i];
  2291. j++;
  2292. // OII by ge
  2293. Joutput[j] = OI*de*rOI_i[i] + OI*rOI_pi[i] - OII*de*rOII_i[i] - OII*de*rOII_r[i] - OII*rOII_pi[i] + OIII*de*rOIII_r[i];
  2294. Joutput[j] *= Tge[i];
  2295. j++;
  2296. // OIII by ge
  2297. Joutput[j] = OII*de*rOII_i[i] + OII*rOII_pi[i] - OIII*de*rOIII_i[i] - OIII*de*rOIII_r[i] - OIII*rOIII_pi[i] + OIV*de*rOIV_r[i];
  2298. Joutput[j] *= Tge[i];
  2299. j++;
  2300. // OIV by ge
  2301. Joutput[j] = OIII*de*rOIII_i[i] + OIII*rOIII_pi[i] - OIV*de*rOIV_i[i] - OIV*de*rOIV_r[i] - OIV*rOIV_pi[i] + OV*de*rOV_r[i];
  2302. Joutput[j] *= Tge[i];
  2303. j++;
  2304. // OV by ge
  2305. Joutput[j] = OIV*de*rOIV_i[i] + OIV*rOIV_pi[i] - OV*de*rOV_i[i] - OV*de*rOV_r[i] - OV*rOV_pi[i] + OVI*de*rOVI_r[i];
  2306. Joutput[j] *= Tge[i];
  2307. j++;
  2308. // OVI by ge
  2309. Joutput[j] = OV*de*rOV_i[i] + OV*rOV_pi[i] - OVI*de*rOVI_i[i] - OVI*de*rOVI_r[i] - OVI*rOVI_pi[i] + OVII*de*rOVII_r[i];
  2310. Joutput[j] *= Tge[i];
  2311. j++;
  2312. // OVII by ge
  2313. Joutput[j] = OVI*de*rOVI_i[i] + OVI*rOVI_pi[i] - OVII*de*rOVII_i[i] - OVII*de*rOVII_r[i] - OVII*rOVII_pi[i] + OVIII*de*rOVIII_r[i];
  2314. Joutput[j] *= Tge[i];
  2315. j++;
  2316. // OVIII by ge
  2317. Joutput[j] = OIX*de*rOIX_r[i] + OVII*de*rOVII_i[i] + OVII*rOVII_pi[i] - OVIII*de*rOVIII_i[i] - OVIII*de*rOVIII_r[i] - OVIII*rOVIII_pi[i];
  2318. Joutput[j] *= Tge[i];
  2319. j++;
  2320. // OIX by ge
  2321. Joutput[j] = -OIX*de*rOIX_r[i] + OVIII*de*rOVIII_i[i] + OVIII*rOVIII_pi[i];
  2322. Joutput[j] *= Tge[i];
  2323. j++;
  2324. //
  2325. // Species: OI
  2326. //
  2327. // HI by OI
  2328. Joutput[j] = 0;
  2329. j++;
  2330. // HII by OI
  2331. Joutput[j] = 0;
  2332. j++;
  2333. // HeI by OI
  2334. Joutput[j] = 0;
  2335. j++;
  2336. // HeII by OI
  2337. Joutput[j] = 0;
  2338. j++;
  2339. // HeIII by OI
  2340. Joutput[j] = 0;
  2341. j++;
  2342. // de by OI
  2343. Joutput[j] = OI_i[i]*de + OI_pi[i];
  2344. j++;
  2345. // ge by OI
  2346. Joutput[j] = -OI_c_OI_c[i]*de + OI_ph_OI_ph[i];
  2347. Joutput[j] /= mdensity;
  2348. j++;
  2349. // OI by OI
  2350. Joutput[j] = -OI_i[i]*de - OI_pi[i];
  2351. j++;
  2352. // OII by OI
  2353. Joutput[j] = OI_i[i]*de + OI_pi[i];
  2354. j++;
  2355. // OIII by OI
  2356. Joutput[j] = 0;
  2357. j++;
  2358. // OIV by OI
  2359. Joutput[j] = 0;
  2360. j++;
  2361. // OV by OI
  2362. Joutput[j] = 0;
  2363. j++;
  2364. // OVI by OI
  2365. Joutput[j] = 0;
  2366. j++;
  2367. // OVII by OI
  2368. Joutput[j] = 0;
  2369. j++;
  2370. // OVIII by OI
  2371. Joutput[j] = 0;
  2372. j++;
  2373. // OIX by OI
  2374. Joutput[j] = 0;
  2375. j++;
  2376. //
  2377. // Species: OII
  2378. //
  2379. // HI by OII
  2380. Joutput[j] = 0;
  2381. j++;
  2382. // HII by OII
  2383. Joutput[j] = 0;
  2384. j++;
  2385. // HeI by OII
  2386. Joutput[j] = 0;
  2387. j++;
  2388. // HeII by OII
  2389. Joutput[j] = 0;
  2390. j++;
  2391. // HeIII by OII
  2392. Joutput[j] = 0;
  2393. j++;
  2394. // de by OII
  2395. Joutput[j] = OII_i[i]*de + OII_pi[i] - OII_r[i]*de;
  2396. j++;
  2397. // ge by OII
  2398. Joutput[j] = -OII_c_OII_c[i]*de + OII_ph_OII_ph[i];
  2399. Joutput[j] /= mdensity;
  2400. j++;
  2401. // OI by OII
  2402. Joutput[j] = OII_r[i]*de;
  2403. j++;
  2404. // OII by OII
  2405. Joutput[j] = -OII_i[i]*de - OII_pi[i] - OII_r[i]*de;
  2406. j++;
  2407. // OIII by OII
  2408. Joutput[j] = OII_i[i]*de + OII_pi[i];
  2409. j++;
  2410. // OIV by OII
  2411. Joutput[j] = 0;
  2412. j++;
  2413. // OV by OII
  2414. Joutput[j] = 0;
  2415. j++;
  2416. // OVI by OII
  2417. Joutput[j] = 0;
  2418. j++;
  2419. // OVII by OII
  2420. Joutput[j] = 0;
  2421. j++;
  2422. // OVIII by OII
  2423. Joutput[j] = 0;
  2424. j++;
  2425. // OIX by OII
  2426. Joutput[j] = 0;
  2427. j++;
  2428. //
  2429. // Species: OIII
  2430. //
  2431. // HI by OIII
  2432. Joutput[j] = 0;
  2433. j++;
  2434. // HII by OIII
  2435. Joutput[j] = 0;
  2436. j++;
  2437. // HeI by OIII
  2438. Joutput[j] = 0;
  2439. j++;
  2440. // HeII by OIII
  2441. Joutput[j] = 0;
  2442. j++;
  2443. // HeIII by OIII
  2444. Joutput[j] = 0;
  2445. j++;
  2446. // de by OIII
  2447. Joutput[j] = OIII_i[i]*de + OIII_pi[i] - OIII_r[i]*de;
  2448. j++;
  2449. // ge by OIII
  2450. Joutput[j] = -OIII_c_OIII_c[i]*de + OIII_ph_OIII_ph[i];
  2451. Joutput[j] /= mdensity;
  2452. j++;
  2453. // OI by OIII
  2454. Joutput[j] = 0;
  2455. j++;
  2456. // OII by OIII
  2457. Joutput[j] = OIII_r[i]*de;
  2458. j++;
  2459. // OIII by OIII
  2460. Joutput[j] = -OIII_i[i]*de - OIII_pi[i] - OIII_r[i]*de;
  2461. j++;
  2462. // OIV by OIII
  2463. Joutput[j] = OIII_i[i]*de + OIII_pi[i];
  2464. j++;
  2465. // OV by OIII
  2466. Joutput[j] = 0;
  2467. j++;
  2468. // OVI by OIII
  2469. Joutput[j] = 0;
  2470. j++;
  2471. // OVII by OIII
  2472. Joutput[j] = 0;
  2473. j++;
  2474. // OVIII by OIII
  2475. Joutput[j] = 0;
  2476. j++;
  2477. // OIX by OIII
  2478. Joutput[j] = 0;
  2479. j++;
  2480. //
  2481. // Species: OIV
  2482. //
  2483. // HI by OIV
  2484. Joutput[j] = 0;
  2485. j++;
  2486. // HII by OIV
  2487. Joutput[j] = 0;
  2488. j++;
  2489. // HeI by OIV
  2490. Joutput[j] = 0;
  2491. j++;
  2492. // HeII by OIV
  2493. Joutput[j] = 0;
  2494. j++;
  2495. // HeIII by OIV
  2496. Joutput[j] = 0;
  2497. j++;
  2498. // de by OIV
  2499. Joutput[j] = OIV_i[i]*de + OIV_pi[i] - OIV_r[i]*de;
  2500. j++;
  2501. // ge by OIV
  2502. Joutput[j] = -OIV_c_OIV_c[i]*de + OIV_ph_OIV_ph[i];
  2503. Joutput[j] /= mdensity;
  2504. j++;
  2505. // OI by OIV
  2506. Joutput[j] = 0;
  2507. j++;
  2508. // OII by OIV
  2509. Joutput[j] = 0;
  2510. j++;
  2511. // OIII by OIV
  2512. Joutput[j] = OIV_r[i]*de;
  2513. j++;
  2514. // OIV by OIV
  2515. Joutput[j] = -OIV_i[i]*de - OIV_pi[i] - OIV_r[i]*de;
  2516. j++;
  2517. // OV by OIV
  2518. Joutput[j] = OIV_i[i]*de + OIV_pi[i];
  2519. j++;
  2520. // OVI by OIV
  2521. Joutput[j] = 0;
  2522. j++;
  2523. // OVII by OIV
  2524. Joutput[j] = 0;
  2525. j++;
  2526. // OVIII by OIV
  2527. Joutput[j] = 0;
  2528. j++;
  2529. // OIX by OIV
  2530. Joutput[j] = 0;
  2531. j++;
  2532. //
  2533. // Species: OV
  2534. //
  2535. // HI by OV
  2536. Joutput[j] = 0;
  2537. j++;
  2538. // HII by OV
  2539. Joutput[j] = 0;
  2540. j++;
  2541. // HeI by OV
  2542. Joutput[j] = 0;
  2543. j++;
  2544. // HeII by OV
  2545. Joutput[j] = 0;
  2546. j++;
  2547. // HeIII by OV
  2548. Joutput[j] = 0;
  2549. j++;
  2550. // de by OV
  2551. Joutput[j] = OV_i[i]*de + OV_pi[i] - OV_r[i]*de;
  2552. j++;
  2553. // ge by OV
  2554. Joutput[j] = -OV_c_OV_c[i]*de + OV_ph_OV_ph[i];
  2555. Joutput[j] /= mdensity;
  2556. j++;
  2557. // OI by OV
  2558. Joutput[j] = 0;
  2559. j++;
  2560. // OII by OV
  2561. Joutput[j] = 0;
  2562. j++;
  2563. // OIII by OV
  2564. Joutput[j] = 0;
  2565. j++;
  2566. // OIV by OV
  2567. Joutput[j] = OV_r[i]*de;
  2568. j++;
  2569. // OV by OV
  2570. Joutput[j] = -OV_i[i]*de - OV_pi[i] - OV_r[i]*de;
  2571. j++;
  2572. // OVI by OV
  2573. Joutput[j] = OV_i[i]*de + OV_pi[i];
  2574. j++;
  2575. // OVII by OV
  2576. Joutput[j] = 0;
  2577. j++;
  2578. // OVIII by OV
  2579. Joutput[j] = 0;
  2580. j++;
  2581. // OIX by OV
  2582. Joutput[j] = 0;
  2583. j++;
  2584. //
  2585. // Species: OVI
  2586. //
  2587. // HI by OVI
  2588. Joutput[j] = 0;
  2589. j++;
  2590. // HII by OVI
  2591. Joutput[j] = 0;
  2592. j++;
  2593. // HeI by OVI
  2594. Joutput[j] = 0;
  2595. j++;
  2596. // HeII by OVI
  2597. Joutput[j] = 0;
  2598. j++;
  2599. // HeIII by OVI
  2600. Joutput[j] = 0;
  2601. j++;
  2602. // de by OVI
  2603. Joutput[j] = OVI_i[i]*de + OVI_pi[i] - OVI_r[i]*de;
  2604. j++;
  2605. // ge by OVI
  2606. Joutput[j] = -OVI_c_OVI_c[i]*de + OVI_ph_OVI_ph[i];
  2607. Joutput[j] /= mdensity;
  2608. j++;
  2609. // OI by OVI
  2610. Joutput[j] = 0;
  2611. j++;
  2612. // OII by OVI
  2613. Joutput[j] = 0;
  2614. j++;
  2615. // OIII by OVI
  2616. Joutput[j] = 0;
  2617. j++;
  2618. // OIV by OVI
  2619. Joutput[j] = 0;
  2620. j++;
  2621. // OV by OVI
  2622. Joutput[j] = OVI_r[i]*de;
  2623. j++;
  2624. // OVI by OVI
  2625. Joutput[j] = -OVI_i[i]*de - OVI_pi[i] - OVI_r[i]*de;
  2626. j++;
  2627. // OVII by OVI
  2628. Joutput[j] = OVI_i[i]*de + OVI_pi[i];
  2629. j++;
  2630. // OVIII by OVI
  2631. Joutput[j] = 0;
  2632. j++;
  2633. // OIX by OVI
  2634. Joutput[j] = 0;
  2635. j++;
  2636. //
  2637. // Species: OVII
  2638. //
  2639. // HI by OVII
  2640. Joutput[j] = 0;
  2641. j++;
  2642. // HII by OVII
  2643. Joutput[j] = 0;
  2644. j++;
  2645. // HeI by OVII
  2646. Joutput[j] = 0;
  2647. j++;
  2648. // HeII by OVII
  2649. Joutput[j] = 0;
  2650. j++;
  2651. // HeIII by OVII
  2652. Joutput[j] = 0;
  2653. j++;
  2654. // de by OVII
  2655. Joutput[j] = OVII_i[i]*de + OVII_pi[i] - OVII_r[i]*de;
  2656. j++;
  2657. // ge by OVII
  2658. Joutput[j] = -OVII_c_OVII_c[i]*de + OVII_ph_OVII_ph[i];
  2659. Joutput[j] /= mdensity;
  2660. j++;
  2661. // OI by OVII
  2662. Joutput[j] = 0;
  2663. j++;
  2664. // OII by OVII
  2665. Joutput[j] = 0;
  2666. j++;
  2667. // OIII by OVII
  2668. Joutput[j] = 0;
  2669. j++;
  2670. // OIV by OVII
  2671. Joutput[j] = 0;
  2672. j++;
  2673. // OV by OVII
  2674. Joutput[j] = 0;
  2675. j++;
  2676. // OVI by OVII
  2677. Joutput[j] = OVII_r[i]*de;
  2678. j++;
  2679. // OVII by OVII
  2680. Joutput[j] = -OVII_i[i]*de - OVII_pi[i] - OVII_r[i]*de;
  2681. j++;
  2682. // OVIII by OVII
  2683. Joutput[j] = OVII_i[i]*de + OVII_pi[i];
  2684. j++;
  2685. // OIX by OVII
  2686. Joutput[j] = 0;
  2687. j++;
  2688. //
  2689. // Species: OVIII
  2690. //
  2691. // HI by OVIII
  2692. Joutput[j] = 0;
  2693. j++;
  2694. // HII by OVIII
  2695. Joutput[j] = 0;
  2696. j++;
  2697. // HeI by OVIII
  2698. Joutput[j] = 0;
  2699. j++;
  2700. // HeII by OVIII
  2701. Joutput[j] = 0;
  2702. j++;
  2703. // HeIII by OVIII
  2704. Joutput[j] = 0;
  2705. j++;
  2706. // de by OVIII
  2707. Joutput[j] = OVIII_i[i]*de + OVIII_pi[i] - OVIII_r[i]*de;
  2708. j++;
  2709. // ge by OVIII
  2710. Joutput[j] = -OVIII_c_OVIII_c[i]*de + OVIII_ph_OVIII_ph[i];
  2711. Joutput[j] /= mdensity;
  2712. j++;
  2713. // OI by OVIII
  2714. Joutput[j] = 0;
  2715. j++;
  2716. // OII by OVIII
  2717. Joutput[j] = 0;
  2718. j++;
  2719. // OIII by OVIII
  2720. Joutput[j] = 0;
  2721. j++;
  2722. // OIV by OVIII
  2723. Joutput[j] = 0;
  2724. j++;
  2725. // OV by OVIII
  2726. Joutput[j] = 0;
  2727. j++;
  2728. // OVI by OVIII
  2729. Joutput[j] = 0;
  2730. j++;
  2731. // OVII by OVIII
  2732. Joutput[j] = OVIII_r[i]*de;
  2733. j++;
  2734. // OVIII by OVIII
  2735. Joutput[j] = -OVIII_i[i]*de - OVIII_pi[i] - OVIII_r[i]*de;
  2736. j++;
  2737. // OIX by OVIII
  2738. Joutput[j] = OVIII_i[i]*de + OVIII_pi[i];
  2739. j++;
  2740. //
  2741. // Species: OIX
  2742. //
  2743. // HI by OIX
  2744. Joutput[j] = 0;
  2745. j++;
  2746. // HII by OIX
  2747. Joutput[j] = 0;
  2748. j++;
  2749. // HeI by OIX
  2750. Joutput[j] = 0;
  2751. j++;
  2752. // HeII by OIX
  2753. Joutput[j] = 0;
  2754. j++;
  2755. // HeIII by OIX
  2756. Joutput[j] = 0;
  2757. j++;
  2758. // de by OIX
  2759. Joutput[j] = -OIX_r[i]*de;
  2760. j++;
  2761. // ge by OIX
  2762. Joutput[j] = -OIX_c_OIX_c[i]*de;
  2763. Joutput[j] /= mdensity;
  2764. j++;
  2765. // OI by OIX
  2766. Joutput[j] = 0;
  2767. j++;
  2768. // OII by OIX
  2769. Joutput[j] = 0;
  2770. j++;
  2771. // OIII by OIX
  2772. Joutput[j] = 0;
  2773. j++;
  2774. // OIV by OIX
  2775. Joutput[j] = 0;
  2776. j++;
  2777. // OV by OIX
  2778. Joutput[j] = 0;
  2779. j++;
  2780. // OVI by OIX
  2781. Joutput[j] = 0;
  2782. j++;
  2783. // OVII by OIX
  2784. Joutput[j] = 0;
  2785. j++;
  2786. // OVIII by OIX
  2787. Joutput[j] = OIX_r[i]*de;
  2788. j++;
  2789. // OIX by OIX
  2790. Joutput[j] = -OIX_r[i]*de;
  2791. j++;
  2792. }
  2793. return 0;
  2794. }
  2795. int calculate_cooling_rate_po(double *input, int nstrip, int nchem,
  2796. double z_current, double *strip_edot, po_data *data)
  2797. {
  2798. int i, j;
  2799. data->current_z = z_current;
  2800. po_calculate_temperature(data, input, nstrip, nchem);
  2801. po_interpolate_rates(data, nstrip);
  2802. /* Now we set up some temporaries */
  2803. double *HeI_i = data->rs_HeI_i;
  2804. double *HeI_pi = data->rs_HeI_pi;
  2805. double *HeII_i = data->rs_HeII_i;
  2806. double *HeII_pi = data->rs_HeII_pi;
  2807. double *HeII_r = data->rs_HeII_r;
  2808. double *HeIII_r = data->rs_HeIII_r;
  2809. double *HI_i = data->rs_HI_i;
  2810. double *HI_pi = data->rs_HI_pi;
  2811. double *HII_r = data->rs_HII_r;
  2812. double *OI_i = data->rs_OI_i;
  2813. double *OI_pi = data->rs_OI_pi;
  2814. double *OII_i = data->rs_OII_i;
  2815. double *OII_pi = data->rs_OII_pi;
  2816. double *OII_r = data->rs_OII_r;
  2817. double *OIII_i = data->rs_OIII_i;
  2818. double *OIII_pi = data->rs_OIII_pi;
  2819. double *OIII_r = data->rs_OIII_r;
  2820. double *OIV_i = data->rs_OIV_i;
  2821. double *OIV_pi = data->rs_OIV_pi;
  2822. double *OIV_r = data->rs_OIV_r;
  2823. double *OIX_r = data->rs_OIX_r;
  2824. double *OV_i = data->rs_OV_i;
  2825. double *OV_pi = data->rs_OV_pi;
  2826. double *OV_r = data->rs_OV_r;
  2827. double *OVI_i = data->rs_OVI_i;
  2828. double *OVI_pi = data->rs_OVI_pi;
  2829. double *OVI_r = data->rs_OVI_r;
  2830. double *OVII_i = data->rs_OVII_i;
  2831. double *OVII_pi = data->rs_OVII_pi;
  2832. double *OVII_r = data->rs_OVII_r;
  2833. double *OVIII_i = data->rs_OVIII_i;
  2834. double *OVIII_pi = data->rs_OVIII_pi;
  2835. double *OVIII_r = data->rs_OVIII_r;
  2836. double *compton_comp = data->cs_compton_comp;
  2837. double *HeI_c_HeI_c = data->cs_HeI_c_HeI_c;
  2838. double *HeI_ph_HeI_ph = data->cs_HeI_ph_HeI_ph;
  2839. double *HeII_c_HeII_c = data->cs_HeII_c_HeII_c;
  2840. double *HeII_ph_HeII_ph = data->cs_HeII_ph_HeII_ph;
  2841. double *HeIII_c_HeIII_c = data->cs_HeIII_c_HeIII_c;
  2842. double *HI_c_HI_c = data->cs_HI_c_HI_c;
  2843. double *HI_ph_HI_ph = data->cs_HI_ph_HI_ph;
  2844. double *HII_c_HII_c = data->cs_HII_c_HII_c;
  2845. double *OI_c_OI_c = data->cs_OI_c_OI_c;
  2846. double *OI_ph_OI_ph = data->cs_OI_ph_OI_ph;
  2847. double *OII_c_OII_c = data->cs_OII_c_OII_c;
  2848. double *OII_ph_OII_ph = data->cs_OII_ph_OII_ph;
  2849. double *OIII_c_OIII_c = data->cs_OIII_c_OIII_c;
  2850. double *OIII_ph_OIII_ph = data->cs_OIII_ph_OIII_ph;
  2851. double *OIV_c_OIV_c = data->cs_OIV_c_OIV_c;
  2852. double *OIV_ph_OIV_ph = data->cs_OIV_ph_OIV_ph;
  2853. double *OIX_c_OIX_c = data->cs_OIX_c_OIX_c;
  2854. double *OV_c_OV_c = data->cs_OV_c_OV_c;
  2855. double *OV_ph_OV_ph = data->cs_OV_ph_OV_ph;
  2856. double *OVI_c_OVI_c = data->cs_OVI_c_OVI_c;
  2857. double *OVI_ph_OVI_ph = data->cs_OVI_ph_OVI_ph;
  2858. double *OVII_c_OVII_c = data->cs_OVII_c_OVII_c;
  2859. double *OVII_ph_OVII_ph = data->cs_OVII_ph_OVII_ph;
  2860. double *OVIII_c_OVIII_c = data->cs_OVIII_c_OVIII_c;
  2861. double *OVIII_ph_OVIII_ph = data->cs_OVIII_ph_OVIII_ph;
  2862. double HI;
  2863. double HII;
  2864. double HeI;
  2865. double HeII;
  2866. double HeIII;
  2867. double de;
  2868. double ge;
  2869. double OI;
  2870. double OII;
  2871. double OIII;
  2872. double OIV;
  2873. double OV;
  2874. double OVI;
  2875. double OVII;
  2876. double OVIII;
  2877. double OIX;
  2878. double z;
  2879. double T;
  2880. double mh = 1.67e-24;
  2881. double total, total_e, total_de, mdensity;
  2882. for (i = 0; i<nstrip; i++) {
  2883. j = i * nchem;
  2884. total = total_e = total_de = mdensity = 0.0;
  2885. T = data->Ts[i];
  2886. z = data->current_z;
  2887. HI = input[j];
  2888. if (HI < 0.0) {
  2889. /* fprintf(stderr, "RNegative[%d][HI] = % 0.16g [%d]\n",
  2890. i, HI, j); */
  2891. return 1;
  2892. //HI = 1e-20;
  2893. }
  2894. total+=HI * 1.00794;
  2895. j++;
  2896. HII = input[j];
  2897. if (HII < 0.0) {
  2898. /* fprintf(stderr, "RNegative[%d][HII] = % 0.16g [%d]\n",
  2899. i, HII, j); */
  2900. return 1;
  2901. //HII = 1e-20;
  2902. }
  2903. total+=HII * 1.00794;
  2904. j++;
  2905. HeI = input[j];
  2906. if (HeI < 0.0) {
  2907. /* fprintf(stderr, "RNegative[%d][HeI] = % 0.16g [%d]\n",
  2908. i, HeI, j); */
  2909. return 1;
  2910. //HeI = 1e-20;
  2911. }
  2912. total+=HeI * 4.002602;
  2913. j++;
  2914. HeII = input[j];
  2915. if (HeII < 0.0) {
  2916. /* fprintf(stderr, "RNegative[%d][HeII] = % 0.16g [%d]\n",
  2917. i, HeII, j); */
  2918. return 1;
  2919. //HeII = 1e-20;
  2920. }
  2921. total+=HeII * 4.002602;
  2922. j++;
  2923. HeIII = input[j];
  2924. if (HeIII < 0.0) {
  2925. /* fprintf(stderr, "RNegative[%d][HeIII] = % 0.16g [%d]\n",
  2926. i, HeIII, j); */
  2927. return 1;
  2928. //HeIII = 1e-20;
  2929. }
  2930. total+=HeIII * 4.002602;
  2931. j++;
  2932. de = input[j];
  2933. if (de < 0.0) {
  2934. /* fprintf(stderr, "RNegative[%d][de] = % 0.16g [%d]\n",
  2935. i, de, j); */
  2936. return 1;
  2937. //de = 1e-20;
  2938. }
  2939. j++;
  2940. ge = input[j];
  2941. if (ge < 0.0) {
  2942. /* fprintf(stderr, "RNegative[%d][ge] = % 0.16g [%d]\n",
  2943. i, ge, j); */
  2944. return 1;
  2945. //ge = 1e-20;
  2946. }
  2947. j++;
  2948. OI = input[j];
  2949. if (OI < 0.0) {
  2950. /* fprintf(stderr, "RNegative[%d][OI] = % 0.16g [%d]\n",
  2951. i, OI, j); */
  2952. return 1;
  2953. //OI = 1e-20;
  2954. }
  2955. total+=OI * 15.9994;
  2956. j++;
  2957. OII = input[j];
  2958. if (OII < 0.0) {
  2959. /* fprintf(stderr, "RNegative[%d][OII] = % 0.16g [%d]\n",
  2960. i, OII, j); */
  2961. return 1;
  2962. //OII = 1e-20;
  2963. }
  2964. total+=OII * 15.9994;
  2965. j++;
  2966. OIII = input[j];
  2967. if (OIII < 0.0) {
  2968. /* fprintf(stderr, "RNegative[%d][OIII] = % 0.16g [%d]\n",
  2969. i, OIII, j); */
  2970. return 1;
  2971. //OIII = 1e-20;
  2972. }
  2973. total+=OIII * 15.9994;
  2974. j++;
  2975. OIV = input[j];
  2976. if (OIV < 0.0) {
  2977. /* fprintf(stderr, "RNegative[%d][OIV] = % 0.16g [%d]\n",
  2978. i, OIV, j); */
  2979. return 1;
  2980. //OIV = 1e-20;
  2981. }
  2982. total+=OIV * 15.9994;
  2983. j++;
  2984. OV = input[j];
  2985. if (OV < 0.0) {
  2986. /* fprintf(stderr, "RNegative[%d][OV] = % 0.16g [%d]\n",
  2987. i, OV, j); */
  2988. return 1;
  2989. //OV = 1e-20;
  2990. }
  2991. total+=OV * 15.9994;
  2992. j++;
  2993. OVI = input[j];
  2994. if (OVI < 0.0) {
  2995. /* fprintf(stderr, "RNegative[%d][OVI] = % 0.16g [%d]\n",
  2996. i, OVI, j); */
  2997. return 1;
  2998. //OVI = 1e-20;
  2999. }
  3000. total+=OVI * 15.9994;
  3001. j++;
  3002. OVII = input[j];
  3003. if (OVII < 0.0) {
  3004. /* fprintf(stderr, "RNegative[%d][OVII] = % 0.16g [%d]\n",
  3005. i, OVII, j); */
  3006. return 1;
  3007. //OVII = 1e-20;
  3008. }
  3009. total+=OVII * 15.9994;
  3010. j++;
  3011. OVIII = input[j];
  3012. if (OVIII < 0.0) {
  3013. /* fprintf(stderr, "RNegative[%d][OVIII] = % 0.16g [%d]\n",
  3014. i, OVIII, j); */
  3015. return 1;
  3016. //OVIII = 1e-20;
  3017. }
  3018. total+=OVIII * 15.9994;
  3019. j++;
  3020. OIX = input[j];
  3021. if (OIX < 0.0) {
  3022. /* fprintf(stderr, "RNegative[%d][OIX] = % 0.16g [%d]\n",
  3023. i, OIX, j); */
  3024. return 1;
  3025. //OIX = 1e-20;
  3026. }
  3027. total+=OIX * 15.9994;
  3028. j++;
  3029. mdensity = total * mh;
  3030. strip_edot[i] = -HI*HI_c_HI_c[i]*de + HI*HI_ph_HI_ph[i] - HII*HII_c_HII_c[i]*de - HeI*HeI_c_HeI_c[i]*de + HeI*HeI_ph_HeI_ph[i] - HeII*HeII_c_HeII_c[i]*de + HeII*HeII_ph_HeII_ph[i] - HeIII*HeIII_c_HeIII_c[i]*de - OI*OI_c_OI_c[i]*de + OI*OI_ph_OI_ph[i] - OII*OII_c_OII_c[i]*de + OII*OII_ph_OII_ph[i] - OIII*OIII_c_OIII_c[i]*de + OIII*OIII_ph_OIII_ph[i] - OIV*OIV_c_OIV_c[i]*de + OIV*OIV_ph_OIV_ph[i] - OIX*OIX_c_OIX_c[i]*de - OV*OV_c_OV_c[i]*de + OV*OV_ph_OV_ph[i] - OVI*OVI_c_OVI_c[i]*de + OVI*OVI_ph_OVI_ph[i] - OVII*OVII_c_OVII_c[i]*de + OVII*OVII_ph_OVII_ph[i] - OVIII*OVIII_c_OVIII_c[i]*de + OVIII*OVIII_ph_OVIII_ph[i] - compton_comp[i]*de*pow(z + 1.0, 4)*(T - 2.73*z - 2.73);
  3031. strip_edot[i] /= mdensity;
  3032. }
  3033. return 0;
  3034. }