Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include "grackle.h"
- #include "fortran_func_decls.h"
- #include "utils-cpp.hpp"
- #include "solve_rate_cool_g-cpp.h"
- //_// TODO: ADD ANY OTHER INCLUDE DIRECTIVES
- extern "C" {
- void solve_rate_cool_g(
- int* icool, gr_float* d_data_, gr_float* e_data_, gr_float* u_data_,
- gr_float* v_data_, gr_float* w_data_, gr_float* de_data_, gr_float* HI_data_,
- gr_float* HII_data_, gr_float* HeI_data_, gr_float* HeII_data_,
- gr_float* HeIII_data_, int* in, int* jn, int* kn, int* nratec, int* iexpand,
- int* ispecies, int* imetal, int* imcool, int* idust, int* idustall,
- int* idustfield, int* idim, int* is, int* js, int* ks, int* ie, int* je,
- int* ke, int* ih2co, int* ipiht, int* idustrec, int* igammah, double* dx,
- double* dt, double* aye, double* temstart, double* temend, double* utem,
- double* uxyz, double* uaye, double* urho, double* utim, double* gamma,
- double* fh, double* dtoh, double* z_solar, double* fgr, double* k1a,
- double* k2a, double* k3a, double* k4a, double* k5a, double* k6a, double* k7a,
- double* k8a, double* k9a, double* k10a, double* k11a, double* k12a,
- double* k13a, double* k13dda, double* k14a, double* k15a, double* k16a,
- double* k17a, double* k18a, double* k19a, double* k22a, double* k24,
- double* k25, double* k26, double* k27, double* k28, double* k29, double* k30,
- double* k31, double* k50a, double* k51a, double* k52a, double* k53a,
- double* k54a, double* k55a, double* k56a, double* k57a, double* k58a,
- int* ndratec, double* dtemstart, double* dtemend, double* h2dusta,
- double* ncrna, double* ncrd1a, double* ncrd2a, double* ceHIa, double* ceHeIa,
- double* ceHeIIa, double* ciHIa, double* ciHeIa, double* ciHeISa,
- double* ciHeIIa, double* reHIIa, double* reHeII1a, double* reHeII2a,
- double* reHeIIIa, double* brema, double* compa, double* gammaha, double* isrf,
- double* regra, double* gamma_isrfa, double* comp_xraya, double* comp_temp,
- double* piHI, double* piHeI, double* piHeII, gr_float* HM_data_,
- gr_float* H2I_data_, gr_float* H2II_data_, gr_float* DI_data_,
- gr_float* DII_data_, gr_float* HDI_data_, gr_float* metal_data_,
- gr_float* dust_data_, double* hyd01ka, double* h2k01a, double* vibha,
- double* rotha, double* rotla, double* gpldla, double* gphdla, double* hdltea,
- double* hdlowa, double* gaHIa, double* gaH2a, double* gaHea, double* gaHpa,
- double* gaela, double* h2ltea, double* gasgra, int* iH2shield,
- int* iradshield, double* avgsighi, double* avgsighei, double* avgsigheii,
- int* iradtrans, int* iradcoupled, int* iradstep, int* irt_honly,
- gr_float* kphHI_data_, gr_float* kphHeI_data_, gr_float* kphHeII_data_,
- gr_float* kdissH2I_data_, gr_float* photogamma_data_,
- gr_float* xH2shield_data_, int* ierr, int* ih2optical, int* iciecool,
- int* ithreebody, int* ih2cr, int* ihdcr, double* ciecoa, int* icmbTfloor,
- int* iClHeat, double* clEleFra, long long* priGridRank, long long* priGridDim,
- double* priPar1, double* priPar2, double* priPar3, double* priPar4,
- double* priPar5, long long* priDataSize, double* priCooling,
- double* priHeating, double* priMMW, long long* metGridRank,
- long long* metGridDim, double* metPar1, double* metPar2, double* metPar3,
- double* metPar4, double* metPar5, long long* metDataSize, double* metCooling,
- double* metHeating, int* clnew, int* iVheat, int* iMheat,
- gr_float* Vheat_data_, gr_float* Mheat_data_, int* iTfloor,
- double* Tfloor_scalar, gr_float* Tfloor_data_, int* imchem, int* igrgr,
- int* ipcont, double* tmcool, gr_float* DM_data_, gr_float* HDII_data_,
- gr_float* HeHII_data_, gr_float* CI_data_, gr_float* CII_data_,
- gr_float* CO_data_, gr_float* CO2_data_, gr_float* OI_data_,
- gr_float* OH_data_, gr_float* H2O_data_, gr_float* O2_data_,
- gr_float* SiI_data_, gr_float* SiOI_data_, gr_float* SiO2I_data_,
- gr_float* CH_data_, gr_float* CH2_data_, gr_float* COII_data_,
- gr_float* OII_data_, gr_float* OHII_data_, gr_float* H2OII_data_,
- gr_float* H3OII_data_, gr_float* O2II_data_, gr_float* Mg_data_,
- gr_float* Al_data_, gr_float* S_data_, gr_float* Fe_data_,
- gr_float* SiM_data_, gr_float* FeM_data_, gr_float* Mg2SiO4_data_,
- gr_float* MgSiO3_data_, gr_float* Fe3O4_data_, gr_float* AC_data_,
- gr_float* SiO2D_data_, gr_float* MgO_data_, gr_float* FeS_data_,
- gr_float* Al2O3_data_, gr_float* reforg_data_, gr_float* volorg_data_,
- gr_float* H2Oice_data_, double* k125a, double* k129a, double* k130a,
- double* k131a, double* k132a, double* k133a, double* k134a, double* k135a,
- double* k136a, double* k137a, double* k148a, double* k149a, double* k150a,
- double* k151a, double* k152a, double* k153a, double* kz15a, double* kz16a,
- double* kz17a, double* kz18a, double* kz19a, double* kz20a, double* kz21a,
- double* kz22a, double* kz23a, double* kz24a, double* kz25a, double* kz26a,
- double* kz27a, double* kz28a, double* kz29a, double* kz30a, double* kz31a,
- double* kz32a, double* kz33a, double* kz34a, double* kz35a, double* kz36a,
- double* kz37a, double* kz38a, double* kz39a, double* kz40a, double* kz41a,
- double* kz42a, double* kz43a, double* kz44a, double* kz45a, double* kz46a,
- double* kz47a, double* kz48a, double* kz49a, double* kz50a, double* kz51a,
- double* kz52a, double* kz53a, double* kz54a, double* cieY06a, int* LH2_N,
- int* LH2_Size, double* LH2_D, double* LH2_T, double* LH2_H, double* LH2_dD,
- double* LH2_dT, double* LH2_dH, double* LH2_L, int* LHD_N, int* LHD_Size,
- double* LHD_D, double* LHD_T, double* LHD_H, double* LHD_dD, double* LHD_dT,
- double* LHD_dH, double* LHD_L, int* LCI_N, int* LCI_Size, double* LCI_D,
- double* LCI_T, double* LCI_H, double* LCI_dD, double* LCI_dT, double* LCI_dH,
- double* LCI_L, int* LCII_N, int* LCII_Size, double* LCII_D, double* LCII_T,
- double* LCII_H, double* LCII_dD, double* LCII_dT, double* LCII_dH,
- double* LCII_L, int* LOI_N, int* LOI_Size, double* LOI_D, double* LOI_T,
- double* LOI_H, double* LOI_dD, double* LOI_dT, double* LOI_dH, double* LOI_L,
- int* LCO_N, int* LCO_Size, double* LCO_D, double* LCO_T, double* LCO_H,
- double* LCO_dD, double* LCO_dT, double* LCO_dH, double* LCO_L, int* LOH_N,
- int* LOH_Size, double* LOH_D, double* LOH_T, double* LOH_H, double* LOH_dD,
- double* LOH_dT, double* LOH_dH, double* LOH_L, int* LH2O_N, int* LH2O_Size,
- double* LH2O_D, double* LH2O_T, double* LH2O_H, double* LH2O_dD,
- double* LH2O_dT, double* LH2O_dH, double* LH2O_L, int* alphap_N,
- int* alphap_Size, double* alphap_D, double* alphap_T, double* alphap_dD,
- double* alphap_dT, double* alphap_Data, int* immulti, int* imabund,
- int* idspecies, int* itdmulti, int* idsub, gr_float* metal_loc_data_,
- gr_float* metal_C13_data_, gr_float* metal_C20_data_,
- gr_float* metal_C25_data_, gr_float* metal_C30_data_,
- gr_float* metal_F13_data_, gr_float* metal_F15_data_,
- gr_float* metal_F50_data_, gr_float* metal_F80_data_,
- gr_float* metal_P170_data_, gr_float* metal_P200_data_,
- gr_float* metal_Y19_data_, int* SN0_N, double* SN0_XC, double* SN0_XO,
- double* SN0_XMg, double* SN0_XAl, double* SN0_XSi, double* SN0_XS,
- double* SN0_XFe, double* SN0_fC, double* SN0_fO, double* SN0_fMg,
- double* SN0_fAl, double* SN0_fSi, double* SN0_fS, double* SN0_fFe,
- double* SN0_fSiM, double* SN0_fFeM, double* SN0_fMg2SiO4, double* SN0_fMgSiO3,
- double* SN0_fFe3O4, double* SN0_fAC, double* SN0_fSiO2D, double* SN0_fMgO,
- double* SN0_fFeS, double* SN0_fAl2O3, double* SN0_freforg,
- double* SN0_fvolorg, double* SN0_fH2Oice, double* SN0_r0SiM,
- double* SN0_r0FeM, double* SN0_r0Mg2SiO4, double* SN0_r0MgSiO3,
- double* SN0_r0Fe3O4, double* SN0_r0AC, double* SN0_r0SiO2D, double* SN0_r0MgO,
- double* SN0_r0FeS, double* SN0_r0Al2O3, double* SN0_r0reforg,
- double* SN0_r0volorg, double* SN0_r0H2Oice, int* gr_N, int* gr_Size,
- double* gr_dT, double* gr_Td, double* SN0_kpSiM, double* SN0_kpFeM,
- double* SN0_kpMg2SiO4, double* SN0_kpMgSiO3, double* SN0_kpFe3O4,
- double* SN0_kpAC, double* SN0_kpSiO2D, double* SN0_kpMgO, double* SN0_kpFeS,
- double* SN0_kpAl2O3, double* SN0_kpreforg, double* SN0_kpvolorg,
- double* SN0_kpH2Oice, double* h2dustSa, double* h2dustCa, double* gasgr2a,
- double* gamma_isrf2a, double* grogra, int* idissHDI, gr_float* kdissHDI_data_,
- int* iionZ, gr_float* kphCI_data_, gr_float* kphOI_data_, int* idissZ,
- gr_float* kdissCO_data_, gr_float* kdissOH_data_, gr_float* kdissH2O_data_,
- int* iuseH2shield, int* iisrffield, gr_float* isrf_habing,
- int* iH2shieldcustom, gr_float* f_shield_custom, int* itmax, int* exititmax
- )
- {
- // SOLVE MULTI-SPECIES RATE EQUATIONS AND RADIATIVE COOLING
- // written by: Yu Zhang, Peter Anninos and Tom Abel
- // date:
- // modified1: January, 1996 by Greg Bryan; converted to KRONOS
- // modified2: October, 1996 by GB; adapted to AMR
- // modified3: May, 1999 by GB and Tom Abel, 3bodyH2, solver, HD
- // modified4: June, 2005 by GB to solve rate & cool at same time
- // modified5: April, 2009 by JHW to include radiative transfer
- // modified6: September, 2009 by BDS to include cloudy cooling
- // PURPOSE:
- // Solve the multi-species rate and cool equations.
- // INPUTS:
- // icool - flag to update energy from radiative cooling
- // in,jn,kn - dimensions of 3D fields
- // d - total density field
- // de - electron density field
- // HI,HII - H density fields (neutral & ionized)
- // HeI/II/III - He density fields
- // DI/II - D density fields (neutral & ionized)
- // HDI - neutral HD molecule density field
- // HM - H- density field
- // H2I - H_2 (molecular H) density field
- // H2II - H_2+ density field
- // metal - metal density field
- // dust - dust density field
- // kph* - photoionization fields
- // gamma* - photoheating fields
- // f_shield_custom - custom H2 shielding factor
- // is,ie - start and end indices of active region (zero based)
- // iexpand - comoving coordinates flag (0 = off, 1 = on)
- // idim - dimensionality (rank) of problem
- // ispecies - chemistry module (1 - H/He only, 2 - molecular H, 3 - D)
- // imetal - flag if metal field is active (0 = no, 1 = yes)
- // imcool - flag if there is metal cooling
- // idust - flag for H2 formation on dust grains
- // idustall - flag for dust (0 - none, 1 - heating/cooling + H2 form.)
- // idustfield - flag if a dust density field is present
- // iisrffield - flag if a field for the interstellar radiation field is present
- // ih2co - flag to include H2 cooling (1 = on, 0 = off)
- // ipiht - flag to include photoionization heating (1 = on, 0 = off)
- // idustrec - flag to include dust recombination cooling (1 = on, -1 = off)
- // iH2shield - flag for approximate self-shielding of H2 (Wolcott-Green+ 2011)
- // iradshield - flag for approximate self-shielding of UV background
- // avgsighi - spectrum averaged ionization crs for HI for use with shielding
- // avgsighei - spectrum averaged ionization crs for HeI for use with shielding
- // avgsigheii - spectrum averaged ionization crs for HeII for use with shielding
- // iradtrans - flag to include radiative transfer (1 = on, 0 = off)
- // iradcoupled - flag to indicate coupled radiative transfer
- // iradstep - flag to indicate intermediate coupled radiative transfer timestep
- // irt_honly - flag to indicate applying RT ionization and heating to HI only
- // iH2shieldcustom - flag to indicate a custom H2 shielding factor is provided
- // fh - Hydrogen mass fraction (typically 0.76)
- // dtoh - Deuterium to H mass ratio
- // z_solar - Solar metal mass fraction
- // fgr - the local dust to gas ratio (by mass)
- // dt - timestep to integrate over
- // aye - expansion factor (in code units)
- // utim - time units (i.e. code units to CGS conversion factor)
- // uaye - expansion factor conversion factor (uaye = 1/(1+zinit))
- // urho - density units
- // uxyz - length units
- // utem - temperature(-like) units
- // temstart, temend - start and end of temperature range for rate table
- // nratec - dimensions of chemical rate arrays (functions of temperature)
- // dtemstart, dtemend - start and end of dust temperature range
- // ndratec - extra dimension for H2 formation on dust rate (dust temperature)
- // icmbTfloor - flag to include temperature floor from cmb
- // iClHeat - flag to include cloudy heating
- // priGridRank - rank of cloudy primordial cooling data grid
- // priGridDim - array containing dimensions of cloudy primordial data
- // priPar1, priPar2, priPar3 - arrays containing primordial grid parameter values
- // priDataSize - total size of flattened 1D primordial cooling data array
- // priCooling - primordial cooling data
- // priHeating - primordial heating data
- // priMMW - primordial mmw data
- // metGridRank - rank of cloudy metal cooling data grid
- // metGridDim - array containing dimensions of cloudy metal data
- // metPar1, metPar2, metPar3 - arrays containing metal grid parameter values
- // metDataSize - total size of flattened 1D metal cooling data array
- // metCooling - metal cooling data
- // metHeating - metal heating data
- // iVheat - flag for using volumetric heating rate
- // iMheat - flag for using specific heating rate
- // Vheat - array of volumetric heating rates
- // Mheat - array of specific heating rates
- // iTfloor - flag for using temperature floor field
- // Tfloor_scalar - scalar temperature floor value
- // Tfloor - array of temperature floor values
- // itmax - maximum allowed sub-cycle iterations
- // exititmax - flag to exit if max iterations exceeded
- // OUTPUTS:
- // update chemical rate densities (HI, HII, etc)
- // PARAMETERS:
- // mh - H mass in cgs units
- // -----------------------------------------------------------------------
- // General Arguments
- int ierror;
- // -- removed line (previously just declared arg types) --
- // Density, energy and velocity fields fields
- grackle::impl::View<gr_float***> de(de_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HI(HI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HII(HII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HeI(HeI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HeII(HeII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HeIII(HeIII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HM(HM_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> H2I(H2I_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> H2II(H2II_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> DI(DI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> DII(DII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HDI(HDI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> d(d_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> e(e_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> u(u_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> v(v_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> w(w_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal(metal_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> dust(dust_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Vheat(Vheat_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Mheat(Mheat_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Tfloor(Tfloor_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> DM(DM_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HDII(HDII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> HeHII(HeHII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> CI(CI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> CII(CII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> CO(CO_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> CO2(CO2_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> OI(OI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> OH(OH_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> H2O(H2O_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> O2(O2_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> SiI(SiI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> SiOI(SiOI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> SiO2I(SiO2I_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> CH(CH_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> CH2(CH2_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> COII(COII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> OII(OII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> OHII(OHII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> H2OII(H2OII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> H3OII(H3OII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> O2II(O2II_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Mg(Mg_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Al(Al_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> S(S_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Fe(Fe_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> SiM(SiM_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> FeM(FeM_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Mg2SiO4(Mg2SiO4_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> MgSiO3(MgSiO3_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Fe3O4(Fe3O4_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> AC(AC_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> SiO2D(SiO2D_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> MgO(MgO_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> FeS(FeS_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> Al2O3(Al2O3_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> reforg(reforg_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> volorg(volorg_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> H2Oice(H2Oice_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_loc(metal_loc_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_C13(metal_C13_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_C20(metal_C20_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_C25(metal_C25_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_C30(metal_C30_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_F13(metal_F13_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_F15(metal_F15_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_F50(metal_F50_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_F80(metal_F80_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_P170(metal_P170_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_P200(metal_P200_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> metal_Y19(metal_Y19_data_, (*in), (*jn), (*kn));
- // Radiative transfer fields
- grackle::impl::View<gr_float***> kphHI(kphHI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> kphHeI(kphHeI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> kphHeII(kphHeII_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> kdissH2I(kdissH2I_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> photogamma(photogamma_data_, (*in), (*jn), (*kn));
- // -- removed line (previously just declared arg types) --
- grackle::impl::View<gr_float***> kdissHDI(kdissHDI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> kphCI(kphCI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> kphOI(kphOI_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> kdissCO(kdissCO_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> kdissOH(kdissOH_data_, (*in), (*jn), (*kn));
- grackle::impl::View<gr_float***> kdissH2O(kdissH2O_data_, (*in), (*jn), (*kn));
- // -- removed line (previously just declared arg types) --
- // H2 self-shielding length-scale field
- grackle::impl::View<gr_float***> xH2shield(xH2shield_data_, (*in), (*jn), (*kn));
- // Interstellar radiation field for dust heating
- // Custom H2 shielding factor
- // Cooling tables (coolings rates as a function of temperature)
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // opacity table
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // Chemistry tables (rates as a function of temperature)
- // -- removed line (previously just declared arg types) --
- // Cloudy cooling data
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- // Parameters
- #ifdef GRACKLE_FLOAT_4
- const gr_float tolerance = (gr_float)(1.0e-05);
- #else
- const gr_float tolerance = (gr_float)(1.0e-10);
- #endif
- const double mh = mass_h;
- const double pi = pi_val;
- // Locals
- int i, j, k, iter;
- int t, dj, dk;
- double ttmin, dom, energy, comp1, comp2;
- double coolunit, dbase1, tbase1, xbase1, chunit, uvel;
- double heq1, heq2, eqk221, eqk222, eqk131, eqk132, eqt1, eqt2, eqtdef, dheq, heq, dlogtem, dx_cgs, c_ljeans, min_metallicity;
- gr_float factor;
- // row temporaries
- std::vector<long long> indixe((*in));
- double olddtit;
- std::vector<double> t1((*in));
- std::vector<double> t2((*in));
- std::vector<double> logtem((*in));
- std::vector<double> tdef((*in));
- std::vector<double> dtit((*in));
- std::vector<double> ttot((*in));
- std::vector<double> p2d((*in));
- std::vector<double> tgas((*in));
- std::vector<double> tgasold((*in));
- std::vector<double> tdust((*in));
- std::vector<double> metallicity((*in));
- std::vector<double> dust2gas((*in));
- std::vector<double> rhoH((*in));
- std::vector<double> mmw((*in));
- std::vector<double> mynh((*in));
- std::vector<double> myde((*in));
- std::vector<double> gammaha_eff((*in));
- std::vector<double> gasgr_tdust((*in));
- std::vector<double> regr((*in));
- std::vector<double> ddom((*in));
- // Rate equation row temporaries
- std::vector<double> HIp((*in));
- std::vector<double> HIIp((*in));
- std::vector<double> HeIp((*in));
- std::vector<double> HeIIp((*in));
- std::vector<double> HeIIIp((*in));
- std::vector<double> HMp((*in));
- std::vector<double> H2Ip((*in));
- std::vector<double> H2IIp((*in));
- std::vector<double> dep((*in));
- std::vector<double> dedot((*in));
- std::vector<double> HIdot((*in));
- std::vector<double> dedot_prev((*in));
- std::vector<double> DIp((*in));
- std::vector<double> DIIp((*in));
- std::vector<double> HDIp((*in));
- std::vector<double> HIdot_prev((*in));
- std::vector<double> k24shield((*in));
- std::vector<double> k25shield((*in));
- std::vector<double> k26shield((*in));
- std::vector<double> k28shield((*in));
- std::vector<double> k29shield((*in));
- std::vector<double> k30shield((*in));
- std::vector<double> k31shield((*in));
- std::vector<double> k1((*in));
- std::vector<double> k2((*in));
- std::vector<double> k3((*in));
- std::vector<double> k4((*in));
- std::vector<double> k5((*in));
- std::vector<double> k6((*in));
- std::vector<double> k7((*in));
- std::vector<double> k8((*in));
- std::vector<double> k9((*in));
- std::vector<double> k10((*in));
- std::vector<double> k11((*in));
- std::vector<double> k12((*in));
- std::vector<double> k13((*in));
- std::vector<double> k14((*in));
- std::vector<double> k15((*in));
- std::vector<double> k16((*in));
- std::vector<double> k17((*in));
- std::vector<double> k18((*in));
- std::vector<double> k19((*in));
- std::vector<double> k22((*in));
- std::vector<double> k50((*in));
- std::vector<double> k51((*in));
- std::vector<double> k52((*in));
- std::vector<double> k53((*in));
- std::vector<double> k54((*in));
- std::vector<double> k55((*in));
- std::vector<double> k56((*in));
- std::vector<double> k57((*in));
- std::vector<double> k58((*in));
- std::vector<double> k13dd((*in) * 14);
- std::vector<double> h2dust((*in));
- std::vector<double> ncrn((*in));
- std::vector<double> ncrd1((*in));
- std::vector<double> ncrd2((*in));
- std::vector<double> DMp((*in));
- std::vector<double> HDIIp((*in));
- std::vector<double> HeHIIp((*in));
- std::vector<double> CIp((*in));
- std::vector<double> CIIp((*in));
- std::vector<double> COp((*in));
- std::vector<double> CO2p((*in));
- std::vector<double> OIp((*in));
- std::vector<double> OHp((*in));
- std::vector<double> H2Op((*in));
- std::vector<double> O2p((*in));
- std::vector<double> SiIp((*in));
- std::vector<double> SiOIp((*in));
- std::vector<double> SiO2Ip((*in));
- std::vector<double> CHp((*in));
- std::vector<double> CH2p((*in));
- std::vector<double> COIIp((*in));
- std::vector<double> OIIp((*in));
- std::vector<double> OHIIp((*in));
- std::vector<double> H2OIIp((*in));
- std::vector<double> H3OIIp((*in));
- std::vector<double> O2IIp((*in));
- std::vector<double> Mgp((*in));
- std::vector<double> Alp((*in));
- std::vector<double> Sp((*in));
- std::vector<double> Fep((*in));
- std::vector<gr_float> SiMp((*in));
- std::vector<gr_float> FeMp((*in));
- std::vector<gr_float> Mg2SiO4p((*in));
- std::vector<gr_float> MgSiO3p((*in));
- std::vector<gr_float> Fe3O4p((*in));
- std::vector<gr_float> ACp((*in));
- std::vector<gr_float> SiO2Dp((*in));
- std::vector<gr_float> MgOp((*in));
- std::vector<gr_float> FeSp((*in));
- std::vector<gr_float> Al2O3p((*in));
- std::vector<gr_float> reforgp((*in));
- std::vector<gr_float> volorgp((*in));
- std::vector<gr_float> H2Oicep((*in));
- std::vector<double> k125((*in));
- std::vector<double> k129((*in));
- std::vector<double> k130((*in));
- std::vector<double> k131((*in));
- std::vector<double> k132((*in));
- std::vector<double> k133((*in));
- std::vector<double> k134((*in));
- std::vector<double> k135((*in));
- std::vector<double> k136((*in));
- std::vector<double> k137((*in));
- std::vector<double> k148((*in));
- std::vector<double> k149((*in));
- std::vector<double> k150((*in));
- std::vector<double> k151((*in));
- std::vector<double> k152((*in));
- std::vector<double> k153((*in));
- std::vector<double> kz15((*in));
- std::vector<double> kz16((*in));
- std::vector<double> kz17((*in));
- std::vector<double> kz18((*in));
- std::vector<double> kz19((*in));
- std::vector<double> kz20((*in));
- std::vector<double> kz21((*in));
- std::vector<double> kz22((*in));
- std::vector<double> kz23((*in));
- std::vector<double> kz24((*in));
- std::vector<double> kz25((*in));
- std::vector<double> kz26((*in));
- std::vector<double> kz27((*in));
- std::vector<double> kz28((*in));
- std::vector<double> kz29((*in));
- std::vector<double> kz30((*in));
- std::vector<double> kz31((*in));
- std::vector<double> kz32((*in));
- std::vector<double> kz33((*in));
- std::vector<double> kz34((*in));
- std::vector<double> kz35((*in));
- std::vector<double> kz36((*in));
- std::vector<double> kz37((*in));
- std::vector<double> kz38((*in));
- std::vector<double> kz39((*in));
- std::vector<double> kz40((*in));
- std::vector<double> kz41((*in));
- std::vector<double> kz42((*in));
- std::vector<double> kz43((*in));
- std::vector<double> kz44((*in));
- std::vector<double> kz45((*in));
- std::vector<double> kz46((*in));
- std::vector<double> kz47((*in));
- std::vector<double> kz48((*in));
- std::vector<double> kz49((*in));
- std::vector<double> kz50((*in));
- std::vector<double> kz51((*in));
- std::vector<double> kz52((*in));
- std::vector<double> kz53((*in));
- std::vector<double> kz54((*in));
- // -- removed line (previously just declared arg types) --
- std::vector<double> kdSiM((*in));
- std::vector<double> kdFeM((*in));
- std::vector<double> kdMg2SiO4((*in));
- std::vector<double> kdMgSiO3((*in));
- std::vector<double> kdFe3O4((*in));
- std::vector<double> kdAC((*in));
- std::vector<double> kdSiO2D((*in));
- std::vector<double> kdMgO((*in));
- std::vector<double> kdFeS((*in));
- std::vector<double> kdAl2O3((*in));
- std::vector<double> kdreforg((*in));
- std::vector<double> kdvolorg((*in));
- std::vector<double> kdH2Oice((*in));
- // grain temperature
- std::vector<double> tSiM((*in));
- std::vector<double> tFeM((*in));
- std::vector<double> tMg2SiO4((*in));
- std::vector<double> tMgSiO3((*in));
- std::vector<double> tFe3O4((*in));
- std::vector<double> tAC((*in));
- std::vector<double> tSiO2D((*in));
- std::vector<double> tMgO((*in));
- std::vector<double> tFeS((*in));
- std::vector<double> tAl2O3((*in));
- std::vector<double> treforg((*in));
- std::vector<double> tvolorg((*in));
- std::vector<double> tH2Oice((*in));
- // Cooling/heating row locals
- std::vector<double> ceHI((*in));
- std::vector<double> ceHeI((*in));
- std::vector<double> ceHeII((*in));
- std::vector<double> ciHI((*in));
- std::vector<double> ciHeI((*in));
- std::vector<double> ciHeIS((*in));
- std::vector<double> ciHeII((*in));
- std::vector<double> reHII((*in));
- std::vector<double> reHeII1((*in));
- std::vector<double> reHeII2((*in));
- std::vector<double> reHeIII((*in));
- std::vector<double> brem((*in));
- std::vector<double> edot((*in));
- std::vector<double> hyd01k((*in));
- std::vector<double> h2k01((*in));
- std::vector<double> vibh((*in));
- std::vector<double> roth((*in));
- std::vector<double> rotl((*in));
- std::vector<double> gpldl((*in));
- std::vector<double> gphdl((*in));
- std::vector<double> hdlte((*in));
- std::vector<double> hdlow((*in));
- std::vector<double> cieco((*in));
- // Iteration mask
- gr_mask_type anydust;
- std::vector<gr_mask_type> itmask((*in));
- std::vector<gr_mask_type> itmask_tmp((*in));
- std::vector<gr_mask_type> itmask_nr((*in));
- std::vector<gr_mask_type> itmask_metal((*in));
- int itr, itr_time;
- std::vector<int> imp_eng((*in));
- int nsp, isp, jsp, id;
- double dspj, err, err_max;
- const int i_eng = 52;
- std::vector<double> dsp(i_eng);
- std::vector<double> dsp0(i_eng);
- std::vector<double> dsp1(i_eng);
- std::vector<double> dspdot(i_eng);
- std::vector<double> dspdot1(i_eng);
- std::vector<double> ddsp(i_eng);
- std::vector<double> der_data_(i_eng * i_eng);
- grackle::impl::View<double**> der(der_data_.data(), i_eng, i_eng);
- std::vector<int> idsp;
- std::vector<double> mtrx_data_;
- grackle::impl::View<double**> mtrx;
- std::vector<double> vec;
- const double eps = 1.e-4;
- // \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////////////////
- // =======================================================================
- // Set error indicator
- (*ierr) = 1;
- // Set flag for dust-related options
- if (((*idust) > 0) || ((*idustall) > 0)) {
- anydust = MASK_TRUE;
- } else {
- anydust = MASK_FALSE;
- }
- // ignore metal chemistry/cooling below this metallicity
- min_metallicity = 1.e-9 / (*z_solar);
- // Set units
- dom = (*urho)*(std::pow((*aye),3))/mh;
- tbase1 = (*utim);
- xbase1 = (*uxyz)/((*aye)*(*uaye)); // uxyz is [x]*a = [x]*[a]*a' '
- dbase1 = (*urho)*std::pow(((*aye)*(*uaye)),3); // urho is [dens]/a^3 = [dens]/([a]*a')^3 '
- coolunit = (std::pow((*uaye),5) * std::pow(xbase1,2) * std::pow(mh,2)) / (std::pow(tbase1,3) * dbase1);
- uvel = ((*uxyz)/(*aye)) / (*utim);
- // chunit = (1.60218e-12_DKIND)/(2._DKIND*uvel*uvel*mh) ! 1 eV per H2 formed
- chunit = (1.60218e-12)/(uvel*uvel*mh); // 1 eV per REACTION (Feb 2020, Gen Chiaki)
- dx_cgs = (*dx) * xbase1;
- c_ljeans = std::sqrt(((*gamma) * pi * kboltz) /
- (GravConst * mh * dbase1));
- dlogtem = (std::log((*temend)) - std::log((*temstart)))/(double)((*nratec)-1 );
- // We better make consistent at first GC202002
- if ((*ispecies) > 0) {
- #define ABUNDANCE_CORRECTION
- #ifdef ABUNDANCE_CORRECTION
- FORTRAN_NAME(make_consistent_g)(de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(),
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(), metal.data(), dust.data(),
- d.data(), is, ie, js, je, ks, ke,
- in, jn, kn, ispecies, imetal, fh, dtoh,
- idustfield, imchem, igrgr, &dom,
- DM.data(), HDII.data(), HeHII.data(),
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- immulti, imabund, idspecies, itdmulti, idsub,
- metal_loc.data(),
- metal_C13.data(), metal_C20.data(), metal_C25.data(), metal_C30.data(),
- metal_F13.data(), metal_F15.data(), metal_F50.data(), metal_F80.data(),
- metal_P170.data(), metal_P200.data(), metal_Y19.data(),
- SN0_N,
- SN0_XC, SN0_XO, SN0_XMg, SN0_XAl, SN0_XSi,
- SN0_XS, SN0_XFe,
- SN0_fC, SN0_fO, SN0_fMg, SN0_fAl, SN0_fSi,
- SN0_fS, SN0_fFe
- );
- #endif
- }
- // Convert densities from comoving to proper
- if ((*iexpand) == 1) {
- factor = (gr_float)(std::pow((*aye),(-3)) );
- FORTRAN_NAME(scale_fields_g)(
- ispecies, imetal, idustfield, imchem,
- imabund, idspecies, immulti, igrgr, idsub, &factor,
- is, ie, js, je, ks, ke, in, jn, kn,
- d.data(), de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(),
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(), DM.data(), HDII.data(), HeHII.data(),
- metal.data(), dust.data(),
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- metal_loc.data(), metal_C13.data(), metal_C20.data(), metal_C25.data(), metal_C30.data(),
- metal_F13.data(), metal_F15.data(), metal_F50.data(), metal_F80.data(),
- metal_P170.data(), metal_P200.data(), metal_Y19.data());
- }
- #ifdef ABUNDANCE_CORRECTION
- FORTRAN_NAME(ceiling_species_g)(d.data(), de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(),
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(), metal.data(), dust.data(),
- is, ie, js, je, ks, ke,
- in, jn, kn, ispecies, imetal, idustfield,
- DM.data(), HDII.data(), HeHII.data(),
- imabund, imchem, idspecies, immulti,
- igrgr, idsub,
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- metal_loc.data(),
- metal_C13.data(), metal_C20.data(), metal_C25.data(), metal_C30.data(),
- metal_F13.data(), metal_F15.data(), metal_F50.data(), metal_F80.data(),
- metal_P170.data(), metal_P200.data(), metal_Y19.data());
- #endif
- // Loop over zones, and do an entire i-column in one go
- dk = (*ke) - (*ks) + 1;
- dj = (*je) - (*js) + 1;
- // parallelize the k and j loops with OpenMP
- // flat j and k loops for better parallelism
- //_// PORT: #ifdef _OPENMP
- //_// PORT: ! ierr is declared as shared and should be modified with atomic operation
- //_// PORT: !$omp parallel do schedule(runtime) private(
- //_// PORT: !$omp& i, j, k, iter,
- //_// PORT: !$omp& ttmin, energy, comp1, comp2,
- //_// PORT: !$omp& heq1, heq2, eqk221, eqk222, eqk131, eqk132,
- //_// PORT: !$omp& eqt1, eqt2, eqtdef, dheq, heq,
- //_// PORT: !$omp& indixe,
- //_// PORT: !$omp& t1, t2, logtem, tdef,
- //_// PORT: !$omp& dtit, ttot, p2d, tgas, tgasold,
- //_// PORT: !$omp& tdust, metallicity, dust2gas, rhoH, mmw,
- //_// PORT: !$omp& mynh, myde, gammaha_eff, gasgr_tdust, regr, ddom,
- //_// PORT: !$omp& olddtit,
- //_// PORT: !$omp& HIp, HIIp, HeIp, HeIIp, HeIIIp,
- //_// PORT: !$omp& HMp, H2Ip, H2IIp,
- //_// PORT: !$omp& dep, dedot,HIdot, dedot_prev,
- //_// PORT: !$omp& DIp, DIIp, HDIp, HIdot_prev,
- //_// PORT: !$omp& k24shield, k25shield, k26shield,
- //_// PORT: !$omp& k28shield, k29shield, k30shield,
- //_// PORT: !$omp& k31shield,
- //_// PORT: !$omp& k1 , k2 , k3 , k4 , k5,
- //_// PORT: !$omp& k6 , k7 , k8 , k9 , k10,
- //_// PORT: !$omp& k11, k12, k13, k14, k15,
- //_// PORT: !$omp& k16, k17, k18, k19, k22,
- //_// PORT: !$omp& k50, k51, k52, k53, k54,
- //_// PORT: !$omp& k55, k56, k57, k58, k13dd, h2dust,
- //_// PORT: !$omp& ncrn, ncrd1, ncrd2,
- //_// PORT: !$omp& ceHI, ceHeI, ceHeII,
- //_// PORT: !$omp& ciHI, ciHeI, ciHeIS, ciHeII,
- //_// PORT: !$omp& reHII, reHeII1, reHeII2, reHeIII,
- //_// PORT: !$omp& brem, edot,
- //_// PORT: !$omp& hyd01k, h2k01, vibh, roth, rotl,
- //_// PORT: !$omp& gpldl, gphdl, hdlte, hdlow, cieco,
- //_// PORT: !$omp& itmask, itmask_metal )
- //_// PORT: #endif
- for (t = 0; t<=(dk * dj - 1); t++) {
- k = t/dj + (*ks)+1;
- j = grackle::impl::mod(t,dj) + (*js)+1;
- // tolerance = 1.0e-06_DKIND * dt
- // Initialize iteration mask to true for all cells.
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- itmask[i-1] = MASK_TRUE;
- }
- // If we are using coupled radiation with intermediate stepping,
- // set iteration mask to include only cells with radiation in the
- // intermediate coupled chemistry / energy step
- if ((*iradtrans) == 1) {
- if ((*iradcoupled) == 1 && (*iradstep) == 1) {
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if (kphHI(i-1,j-1,k-1) > 0) {
- itmask[i-1] = MASK_TRUE;
- } else {
- itmask[i-1] = MASK_FALSE;
- }
- }
- }
- // Normal rate solver, but don't double count cells with radiation
- if ((*iradcoupled) == 1 && (*iradstep) == 0) {
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if (kphHI(i-1,j-1,k-1) > 0) {
- itmask[i-1] = MASK_FALSE;
- } else {
- itmask[i-1] = MASK_TRUE;
- }
- }
- }
- }
- // Set time elapsed to zero for each cell in 1D section
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- ttot[i-1] = 0.;
- }
- // A useful slice variable since we do this a lot
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- ddom[i-1] = d(i-1,j-1,k-1) * dom;
- }
- // ------------------ Loop over subcycles ----------------
- for (iter = 1; iter<=((*itmax)); iter++) {
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if (itmask[i-1] != MASK_FALSE) {
- dtit[i-1] = huge8;
- }
- }
- // Compute the cooling rate, tgas, tdust, and metallicity for this row
- FORTRAN_NAME(cool1d_multi_g)(
- d.data(), e.data(), u.data(), v.data(), w.data(), de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(),
- in, jn, kn, nratec,
- iexpand, ispecies, imetal, imcool,
- idust, idustall, idustfield, idustrec,
- idim, is, ie, &j, &k, ih2co, ipiht, &iter, igammah,
- aye, temstart, temend, z_solar, fgr,
- utem, uxyz, uaye, urho, utim,
- gamma, fh,
- ceHIa, ceHeIa, ceHeIIa, ciHIa, ciHeIa,
- ciHeISa, ciHeIIa, reHIIa, reHeII1a,
- reHeII2a, reHeIIIa, brema, compa, gammaha,
- isrf, regra, gamma_isrfa, comp_xraya, comp_temp,
- piHI, piHeI, piHeII, &comp1, &comp2,
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(), metal.data(), dust.data(),
- hyd01ka, h2k01a, vibha, rotha, rotla,
- hyd01k.data(), h2k01.data(), vibh.data(), roth.data(), rotl.data(),
- gpldla, gphdla, gpldl.data(), gphdl.data(),
- hdltea, hdlowa, hdlte.data(), hdlow.data(),
- gaHIa, gaH2a, gaHea, gaHpa, gaela,
- h2ltea, gasgra,
- ceHI.data(), ceHeI.data(), ceHeII.data(), ciHI.data(), ciHeI.data(), ciHeIS.data(), ciHeII.data(),
- reHII.data(), reHeII1.data(), reHeII2.data(), reHeIII.data(), brem.data(),
- indixe.data(), t1.data(), t2.data(), logtem.data(), tdef.data(), edot.data(),
- tgas.data(), tgasold.data(), mmw.data(), p2d.data(), tdust.data(), metallicity.data(),
- dust2gas.data(), rhoH.data(), mynh.data(), myde.data(),
- gammaha_eff.data(), gasgr_tdust.data(), regr.data(),
- iradshield, avgsighi, avgsighei, avgsigheii,
- k24, k26,
- iradtrans, photogamma.data(),
- ih2optical, iciecool, ih2cr, ihdcr, ciecoa, cieco.data(),
- icmbTfloor, iClHeat, clEleFra,
- priGridRank, priGridDim,
- priPar1, priPar2, priPar3, priPar4, priPar5,
- priDataSize, priCooling, priHeating, priMMW,
- metGridRank, metGridDim,
- metPar1, metPar2, metPar3, metPar4, metPar5,
- metDataSize, metCooling, metHeating, clnew,
- iVheat, iMheat, Vheat.data(), Mheat.data(),
- iTfloor, Tfloor_scalar, Tfloor.data(),
- iisrffield, isrf_habing, itmask.data(), itmask_metal.data(),
- imchem, igrgr, ipcont, tmcool,
- DM.data(), HDII.data(), HeHII.data(),
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- cieY06a,
- LH2_N, LH2_Size,
- LH2_D, LH2_T, LH2_H,
- LH2_dD, LH2_dT, LH2_dH, LH2_L,
- LHD_N, LHD_Size,
- LHD_D, LHD_T, LHD_H,
- LHD_dD, LHD_dT, LHD_dH, LHD_L,
- LCI_N, LCI_Size,
- LCI_D, LCI_T, LCI_H,
- LCI_dD, LCI_dT, LCI_dH, LCI_L,
- LCII_N, LCII_Size,
- LCII_D, LCII_T, LCII_H,
- LCII_dD, LCII_dT, LCII_dH, LCII_L,
- LOI_N, LOI_Size,
- LOI_D, LOI_T, LOI_H,
- LOI_dD, LOI_dT, LOI_dH, LOI_L,
- LCO_N, LCO_Size,
- LCO_D, LCO_T, LCO_H,
- LCO_dD, LCO_dT, LCO_dH, LCO_L,
- LOH_N, LOH_Size,
- LOH_D, LOH_T, LOH_H,
- LOH_dD, LOH_dT, LOH_dH, LOH_L,
- LH2O_N, LH2O_Size,
- LH2O_D, LH2O_T, LH2O_H,
- LH2O_dD, LH2O_dT, LH2O_dH, LH2O_L,
- alphap_N, alphap_Size,
- alphap_D, alphap_T, alphap_dD, alphap_dT,
- alphap_Data,
- immulti, imabund, idspecies, itdmulti, idsub,
- metal_loc.data(),
- metal_C13.data(), metal_C20.data(), metal_C25.data(), metal_C30.data(),
- metal_F13.data(), metal_F15.data(), metal_F50.data(), metal_F80.data(),
- metal_P170.data(), metal_P200.data(), metal_Y19.data(),
- SN0_N,
- SN0_fSiM, SN0_fFeM, SN0_fMg2SiO4, SN0_fMgSiO3,
- SN0_fFe3O4, SN0_fAC, SN0_fSiO2D, SN0_fMgO,
- SN0_fFeS, SN0_fAl2O3,
- SN0_freforg, SN0_fvolorg, SN0_fH2Oice,
- SN0_r0SiM, SN0_r0FeM, SN0_r0Mg2SiO4, SN0_r0MgSiO3,
- SN0_r0Fe3O4, SN0_r0AC, SN0_r0SiO2D, SN0_r0MgO,
- SN0_r0FeS, SN0_r0Al2O3,
- SN0_r0reforg, SN0_r0volorg, SN0_r0H2Oice,
- gr_N, gr_Size, gr_dT, gr_Td,
- SN0_kpSiM, SN0_kpFeM, SN0_kpMg2SiO4, SN0_kpMgSiO3,
- SN0_kpFe3O4, SN0_kpAC, SN0_kpSiO2D, SN0_kpMgO,
- SN0_kpFeS, SN0_kpAl2O3,
- SN0_kpreforg, SN0_kpvolorg, SN0_kpH2Oice,
- tSiM.data(), tFeM.data(), tMg2SiO4.data(), tMgSiO3.data(), tFe3O4.data(),
- tAC.data(), tSiO2D.data(), tMgO.data(), tFeS.data(), tAl2O3.data(),
- treforg.data(), tvolorg.data(), tH2Oice.data(),
- gasgr2a, gamma_isrf2a
- );
- if ((*ispecies) > 0) {
- // Look-up rates as a function of temperature for 1D set of zones
- // (maybe should add itmask to this call)
- FORTRAN_NAME(lookup_cool_rates1d_g)(temstart, temend, nratec, &j, &k,
- is, ie, ithreebody,
- in, jn, kn, ispecies, &anydust,
- iH2shield, iradshield,
- tgas.data(), mmw.data(), d.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(),
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(),
- tdust.data(), dust2gas.data(),
- k1a, k2a, k3a, k4a, k5a, k6a, k7a, k8a, k9a, k10a,
- k11a, k12a, k13a, k13dda, k14a, k15a, k16a,
- k17a, k18a, k19a, k22a,
- k50a, k51a, k52a, k53a, k54a, k55a, k56a,
- k57a, k58a, ndratec, dtemstart, dtemend, h2dusta,
- ncrna, ncrd1a, ncrd2a,
- avgsighi, avgsighei, avgsigheii, piHI, piHeI,
- k1.data(), k2.data(), k3.data(), k4.data(), k5.data(), k6.data(), k7.data(), k8.data(), k9.data(), k10.data(),
- k11.data(), k12.data(), k13.data(), k14.data(), k15.data(), k16.data(), k17.data(), k18.data(),
- k19.data(), k22.data(), k24, k25, k26, k28, k29, k30, k31,
- k50.data(), k51.data(), k52.data(), k53.data(), k54.data(), k55.data(), k56.data(), k57.data(),
- k58.data(), k13dd.data(), k24shield.data(), k25shield.data(), k26shield.data(),
- k28shield.data(), k29shield.data(), k30shield.data(),
- k31shield.data(), h2dust.data(), ncrn.data(), ncrd1.data(), ncrd2.data(),
- t1.data(), t2.data(), tdef.data(), logtem.data(), indixe.data(),
- &dom, &coolunit, &tbase1, &xbase1, &dx_cgs, &c_ljeans,
- iradtrans, kdissH2I.data(), xH2shield.data(), itmask.data(),
- itmask_metal.data(),
- fh, metal.data(),
- DM.data(), HDII.data(), HeHII.data(), imetal, imchem, igrgr,
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- k125a, k129a, k130a, k131a, k132a,
- k133a, k134a, k135a, k136a, k137a,
- k148a, k149a, k150a, k151a, k152a,
- k153a,
- kz15a, kz16a, kz17a, kz18a, kz19a,
- kz20a, kz21a, kz22a, kz23a, kz24a,
- kz25a, kz26a, kz27a, kz28a, kz29a,
- kz30a, kz31a, kz32a, kz33a, kz34a,
- kz35a, kz36a, kz37a, kz38a, kz39a,
- kz40a, kz41a, kz42a, kz43a, kz44a,
- kz45a, kz46a, kz47a, kz48a, kz49a,
- kz50a, kz51a, kz52a, kz53a, kz54a,
- k125.data(), k129.data(), k130.data(), k131.data(), k132.data(),
- k133.data(), k134.data(), k135.data(), k136.data(), k137.data(),
- k148.data(), k149.data(), k150.data(), k151.data(), k152.data(),
- k153.data(),
- kz15.data(), kz16.data(), kz17.data(), kz18.data(), kz19.data(),
- kz20.data(), kz21.data(), kz22.data(), kz23.data(), kz24.data(),
- kz25.data(), kz26.data(), kz27.data(), kz28.data(), kz29.data(),
- kz30.data(), kz31.data(), kz32.data(), kz33.data(), kz34.data(),
- kz35.data(), kz36.data(), kz37.data(), kz38.data(), kz39.data(),
- kz40.data(), kz41.data(), kz42.data(), kz43.data(), kz44.data(),
- kz45.data(), kz46.data(), kz47.data(), kz48.data(), kz49.data(),
- kz50.data(), kz51.data(), kz52.data(), kz53.data(), kz54.data(),
- immulti, imabund, idspecies, itdmulti, idsub,
- metal_loc.data(),
- metal_C13.data(), metal_C20.data(), metal_C25.data(), metal_C30.data(),
- metal_F13.data(), metal_F15.data(), metal_F50.data(), metal_F80.data(),
- metal_P170.data(), metal_P200.data(), metal_Y19.data(),
- SN0_N,
- SN0_fSiM, SN0_fFeM, SN0_fMg2SiO4, SN0_fMgSiO3,
- SN0_fFe3O4, SN0_fAC, SN0_fSiO2D, SN0_fMgO,
- SN0_fFeS, SN0_fAl2O3,
- SN0_freforg, SN0_fvolorg, SN0_fH2Oice,
- SN0_r0SiM, SN0_r0FeM, SN0_r0Mg2SiO4, SN0_r0MgSiO3,
- SN0_r0Fe3O4, SN0_r0AC, SN0_r0SiO2D, SN0_r0MgO,
- SN0_r0FeS, SN0_r0Al2O3,
- SN0_r0reforg, SN0_r0volorg, SN0_r0H2Oice,
- gr_N, gr_Size, gr_dT, gr_Td,
- SN0_kpSiM, SN0_kpFeM, SN0_kpMg2SiO4, SN0_kpMgSiO3,
- SN0_kpFe3O4, SN0_kpAC, SN0_kpSiO2D, SN0_kpMgO,
- SN0_kpFeS, SN0_kpAl2O3,
- SN0_kpreforg, SN0_kpvolorg, SN0_kpH2Oice,
- h2dustSa, h2dustCa, rhoH.data(), grogra, dt,
- kdSiM.data(), kdFeM.data(), kdMg2SiO4.data(),
- kdMgSiO3.data(), kdFe3O4.data(), kdAC.data(), kdSiO2D.data(), kdMgO.data(), kdFeS.data(),
- kdAl2O3.data(), kdreforg.data(), kdvolorg.data(), kdH2Oice.data(),
- tSiM.data(), tFeM.data(), tMg2SiO4.data(), tMgSiO3.data(), tFe3O4.data(),
- tAC.data(), tSiO2D.data(), tMgO.data(), tFeS.data(), tAl2O3.data(),
- treforg.data(), tvolorg.data(), tH2Oice.data(), iuseH2shield
- );
- // Compute dedot and HIdot, the rates of change of de and HI
- // (should add itmask to this call)
- FORTRAN_NAME(rate_timestep_g)(
- dedot.data(), HIdot.data(), ispecies, &anydust,
- de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(), d.data(),
- HM.data(), H2I.data(), H2II.data(),
- in, jn, kn, is, ie, &j, &k,
- k1.data(), k2.data(), k3.data(), k4.data(), k5.data(), k6.data(), k7.data(), k8.data(), k9.data(), k10.data(), k11.data(),
- k12.data(), k13.data(), k14.data(), k15.data(), k16.data(), k17.data(), k18.data(), k19.data(), k22.data(),
- k24, k25, k26, k27, k28, k29, k30,
- k50.data(), k51.data(), k52.data(), k53.data(), k54.data(), k55.data(), k56.data(), k57.data(), k58.data(),
- h2dust.data(), ncrn.data(), ncrd1.data(), ncrd2.data(), rhoH.data(),
- k24shield.data(), k25shield.data(), k26shield.data(),
- k28shield.data(), k29shield.data(), k30shield.data(), k31shield.data(),
- iradtrans, irt_honly,
- kphHI.data(), kphHeI.data(), kphHeII.data(),
- itmask.data(), edot.data(), &chunit, &dom, metal.data(),
- HDI.data(), imchem, CI.data(), OI.data(), OH.data(), CO.data(), H2O.data(),
- idissHDI, kdissHDI.data(), iionZ, kphCI.data(), kphOI.data(),
- idissZ, kdissCO.data(), kdissOH.data(), kdissH2O.data()
- );
- // move itmask temporary array
- // then split cells with low densities
- // => Gauss-Seidel scheme
- // and with high densities
- // => Newton-Raphson scheme
- std::memcpy(itmask_tmp.data(), itmask.data(), sizeof(gr_mask_type)*(*in));
- std::memcpy(itmask_nr.data(), itmask.data(), sizeof(gr_mask_type)*(*in));
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if ( itmask_tmp[i-1] != MASK_FALSE ) {
- if ( ( ((*imetal) == 0)
- && (ddom[i-1] < 1.e8) )
- || ( ((*imetal) == 1)
- && ( ( (metallicity[i-1] <= min_metallicity)
- && (ddom[i-1] < 1.e8) )
- || ( (metallicity[i-1] > min_metallicity)
- && (ddom[i-1] < 1.e6) ) ) ) ) {
- itmask_nr[i-1] = MASK_FALSE;
- } else {
- itmask[i-1] = MASK_FALSE;
- }
- }
- }
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if (itmask_nr[i-1] != MASK_FALSE) {
- if ( ((*icool) == 1) && ((*ispecies) > 1) &&
- ((ddom[i-1] > 1.e7)
- && (tgas[i-1] > 1650.e0)) ) {
- imp_eng[i-1] = 1;
- } else {
- imp_eng[i-1] = 0;
- }
- }
- }
- // Find timestep that keeps relative chemical changes below 10%
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if (itmask[i-1] != MASK_FALSE) {
- // Bound from below to prevent numerical errors
- if (std::fabs(dedot[i-1]) < tiny8)
- { dedot[i-1] = std::fmin(tiny,de(i-1,j-1,k-1)); }
- if (std::fabs(HIdot[i-1]) < tiny8)
- { HIdot[i-1] = std::fmin(tiny,HI(i-1,j-1,k-1)); }
- // If the net rate is almost perfectly balanced then set
- // it to zero (since it is zero to available precision)
- if (std::fmin(std::fabs(k1[i-1]* de(i-1,j-1,k-1)*HI(i-1,j-1,k-1)),
- std::fabs(k2[i-1]*HII(i-1,j-1,k-1)*de(i-1,j-1,k-1)))/
- std::fmax(std::fabs(dedot[i-1]),std::fabs(HIdot[i-1])) >
- 1.0e6) {
- dedot[i-1] = tiny8;
- HIdot[i-1] = tiny8;
- }
- // If the iteration count is high then take the smaller of
- // the calculated dedot and last time step's actual dedot.
- // This is intended to get around the problem of a low
- // electron or HI fraction which is in equilibrium with high
- // individual terms (which all nearly cancel).
- if (iter > 50) {
- dedot[i-1] = std::fmin(std::fabs(dedot[i-1]), std::fabs(dedot_prev[i-1]));
- HIdot[i-1] = std::fmin(std::fabs(HIdot[i-1]), std::fabs(HIdot_prev[i-1]));
- }
- // compute minimum rate timestep
- olddtit = dtit[i-1];
- dtit[i-1] = grackle::impl::fmin(std::fabs(0.1*de(i-1,j-1,k-1)/dedot[i-1]),
- std::fabs(0.1*HI(i-1,j-1,k-1)/HIdot[i-1]),
- (*dt)-ttot[i-1], 0.5*(*dt));
- if (ddom[i-1] > 1.e8 &&
- edot[i-1] > 0. &&
- (*ispecies) > 1) {
- // Equilibrium value for H is:
- // H = (-1._DKIND / (4*k22)) * (k13 - sqrt(8 k13 k22 rho + k13^2))
- // We now want this to change by 10% or less, but we're only
- // differentiating by dT. We have de/dt. We need dT/de.
- // T = (g-1)*p2d*utem/N; tgas == (g-1)(p2d*utem/N)
- // dH_eq / dt = (dH_eq/dT) * (dT/de) * (de/dt)
- // dH_eq / dT (see above; we can calculate the derivative here)
- // dT / de = utem * (gamma - 1._DKIND) / N == tgas / p2d
- // de / dt = edot
- // Now we use our estimate of dT/de to get the estimated
- // difference in the equilibrium
- eqt2 = std::fmin(std::log(tgas[i-1]) + 0.1*dlogtem, t2[i-1]);
- eqtdef = (eqt2 - t1[i-1])/(t2[i-1] - t1[i-1]);
- eqk222 = k22a[indixe[i-1]-1] +
- (k22a[indixe[i-1]+1-1] -k22a[indixe[i-1]-1])*eqtdef;
- eqk132 = k13a[indixe[i-1]-1] +
- (k13a[indixe[i-1]+1-1] -k13a[indixe[i-1]-1])*eqtdef;
- heq2 = (-1. / (4.*eqk222)) * (eqk132-
- std::sqrt(8.*eqk132*eqk222*
- (*fh)*d(i-1,j-1,k-1)+std::pow(eqk132,2.)));
- eqt1 = std::fmax(std::log(tgas[i-1]) - 0.1*dlogtem, t1[i-1]);
- eqtdef = (eqt1 - t1[i-1])/(t2[i-1] - t1[i-1]);
- eqk221 = k22a[indixe[i-1]-1] +
- (k22a[indixe[i-1]+1-1] -k22a[indixe[i-1]-1])*eqtdef;
- eqk131 = k13a[indixe[i-1]-1] +
- (k13a[indixe[i-1]+1-1] -k13a[indixe[i-1]-1])*eqtdef;
- heq1 = (-1. / (4.*eqk221)) * (eqk131-
- std::sqrt(8.*eqk131*eqk221*
- (*fh)*d(i-1,j-1,k-1)+std::pow(eqk131,2.)));
- dheq = (std::fabs(heq2-heq1)/(std::exp(eqt2) - std::exp(eqt1)))
- * (tgas[i-1]/p2d[i-1]) * edot[i-1];
- heq = (-1. / (4.*k22[i-1])) * (k13[i-1]-
- std::sqrt(8.*k13[i-1]*k22[i-1]*
- (*fh)*d(i-1,j-1,k-1)+std::pow(k13[i-1],2.)));
- dtit[i-1] = std::fmin(dtit[i-1], 0.1*heq/dheq);
- }
- if (iter>10LL) {
- dtit[i-1] = std::fmin(olddtit*1.5, dtit[i-1]);
- }
- } else if ((itmask_nr[i-1]!=MASK_FALSE) &&
- (imp_eng[i-1]==0)) {
- dtit[i-1] = grackle::impl::fmin(std::fabs(0.1*e(i-1,j-1,k-1)/edot[i-1]*d(i-1,j-1,k-1)),
- (*dt)-ttot[i-1], 0.5*(*dt));
- } else if ((itmask_nr[i-1]!=MASK_FALSE) &&
- (imp_eng[i-1]==1)) {
- dtit[i-1] = (*dt) - ttot[i-1];
- } else {
- dtit[i-1] = (*dt);
- }
- }
- }
- // Compute maximum timestep for cooling/heating
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if (itmask[i-1] != MASK_FALSE) {
- // Set energy per unit volume of this cell based in the pressure
- // (the gamma used here is the right one even for H2 since p2d
- // is calculated with this gamma).
- energy = std::fmax(p2d[i-1]/((*gamma)-1.), tiny8);
- // If the temperature is at the bottom of the temperature look-up
- // table and edot < 0, then shut off the cooling.
- if (tgas[i-1] <= 1.01*(*temstart) &&
- edot[i-1] < 0.)
- { edot[i-1] = tiny8; }
- if (std::fabs(edot[i-1]) < tiny8) { edot[i-1] = tiny8; }
- // Compute timestep for 10% change
- dtit[i-1] = grackle::impl::fmin((double)(std::fabs(0.1*
- energy/edot[i-1]) ),
- (*dt)-ttot[i-1], dtit[i-1]);
- if (dtit[i-1] != dtit[i-1]) {
- OMP_PRAGMA_CRITICAL
- {
- eprintf("HUGE dtit :: %g %g %g %g %g %g %g\n",
- energy,
- edot [ i-1 ],
- dtit [ i-1 ],
- (*dt),
- ttot [ i-1 ],
- std::fabs ( 0.1 * energy / edot [ i-1 ] ),
- (double) ( std::fabs ( 0.1 * energy / edot [ i-1 ] ) ));
- }
- }
- }
- }
- // Update total and gas energy
- if ((*icool) == 1) {
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if (itmask[i-1] != MASK_FALSE) {
- e(i-1,j-1,k-1) = e(i-1,j-1,k-1) +
- (gr_float)(edot[i-1]/d(i-1,j-1,k-1)*dtit[i-1] );
- }
- }
- }
- if ((*ispecies) > 0) {
- // Solve rate equations with one linearly implicit Gauss-Seidel
- // sweep of a backward Euler method ---
- FORTRAN_NAME(step_rate_g)(de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(), d.data(),
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(), dtit.data(),
- in, jn, kn, is, ie, &j, &k,
- ispecies, &anydust,
- k1.data(), k2.data(), k3.data(), k4.data(), k5.data(), k6.data(), k7.data(), k8.data(), k9.data(), k10.data(), k11.data(),
- k12.data(), k13.data(), k14.data(), k15.data(), k16.data(), k17.data(), k18.data(), k19.data(), k22.data(),
- k24, k25, k26, k27, k28, k29, k30,
- k50.data(), k51.data(), k52.data(), k53.data(), k54.data(), k55.data(), k56.data(), k57.data(), k58.data(),
- h2dust.data(), rhoH.data(),
- k24shield.data(), k25shield.data(), k26shield.data(),
- k28shield.data(), k29shield.data(), k30shield.data(), k31shield.data(),
- HIp.data(), HIIp.data(), HeIp.data(), HeIIp.data(), HeIIIp.data(), dep.data(),
- HMp.data(), H2Ip.data(), H2IIp.data(), DIp.data(), DIIp.data(), HDIp.data(),
- dedot_prev.data(), HIdot_prev.data(),
- iradtrans, irt_honly,
- kphHI.data(), kphHeI.data(), kphHeII.data(),
- itmask.data(), itmask_metal.data(),
- DM.data(), HDII.data(), HeHII.data(), imetal, metal.data(),
- imchem, idspecies, igrgr, idsub,
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- k125.data(), k129.data(), k130.data(), k131.data(), k132.data(),
- k133.data(), k134.data(), k135.data(), k136.data(), k137.data(),
- k148.data(), k149.data(), k150.data(), k151.data(), k152.data(),
- k153.data(),
- kz15.data(), kz16.data(), kz17.data(), kz18.data(), kz19.data(),
- kz20.data(), kz21.data(), kz22.data(), kz23.data(), kz24.data(),
- kz25.data(), kz26.data(), kz27.data(), kz28.data(), kz29.data(),
- kz30.data(), kz31.data(), kz32.data(), kz33.data(), kz34.data(),
- kz35.data(), kz36.data(), kz37.data(), kz38.data(), kz39.data(),
- kz40.data(), kz41.data(), kz42.data(), kz43.data(), kz44.data(),
- kz45.data(), kz46.data(), kz47.data(), kz48.data(), kz49.data(),
- kz50.data(), kz51.data(), kz52.data(), kz53.data(), kz54.data(),
- DMp.data(), HDIIp.data(), HeHIIp.data(),
- CIp.data(), CIIp.data(), COp.data(), CO2p.data(),
- OIp.data(), OHp.data(), H2Op.data(), O2p.data(),
- SiIp.data(), SiOIp.data(), SiO2Ip.data(),
- CHp.data(), CH2p.data(), COIIp.data(), OIIp.data(),
- OHIIp.data(), H2OIIp.data(), H3OIIp.data(), O2IIp.data(),
- Mgp.data(), Alp.data(), Sp.data(), Fep.data(),
- SiMp.data(), FeMp.data(), Mg2SiO4p.data(), MgSiO3p.data(), Fe3O4p.data(),
- ACp.data(), SiO2Dp.data(), MgOp.data(), FeSp.data(), Al2O3p.data(),
- reforgp.data(), volorgp.data(), H2Oicep.data(),
- kdSiM.data(), kdFeM.data(), kdMg2SiO4.data(), kdMgSiO3.data(), kdFe3O4.data(),
- kdAC.data(), kdSiO2D.data(), kdMgO.data(), kdFeS.data(), kdAl2O3.data(),
- kdreforg.data(), kdvolorg.data(), kdH2Oice.data(),
- idissHDI, kdissHDI.data(), iionZ, kphCI.data(), kphOI.data(),
- idissZ, kdissCO.data(), kdissOH.data(), kdissH2O.data()
- );
- // Note 10/18/2024: the code from here to the comment "end Newton-Raphson scheme"
- // should be put into its own function.
- // Start Newton-Raphson scheme
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- if (itmask_nr[i-1] != MASK_FALSE) {
- // If density and temperature are low, update gas energy explicitly
- if ((*icool) == 1) {
- if (imp_eng[i-1] == 0) {
- e(i-1,j-1,k-1) = e(i-1,j-1,k-1) +
- (gr_float)(edot[i-1]/d(i-1,j-1,k-1)*dtit[i-1] );
- }
- }
- // initialize arrays
- if ((*ispecies) > 0) { nsp = 6; }
- if ((*ispecies) > 1) { nsp = nsp + 3; }
- if ((*ispecies) > 2) { nsp = nsp + 3; }
- if ((*ispecies) > 3) { nsp = nsp + 3; }
- if (itmask_metal[i-1] != MASK_FALSE) {
- if ((*imchem) == 1) {
- nsp = nsp + 19;
- if ( ( (*igrgr) == 1 ) || ( (*idsub) == 1) ) {
- if ((*idspecies) > 0) { nsp = nsp + 1; }
- if ((*idspecies) > 1) { nsp = nsp + 3; }
- }
- }
- if ( ( (*igrgr) == 1 ) || ( (*idsub) == 1) ) {
- if ((*idspecies) > 0) { nsp = nsp + 2; }
- if ((*idspecies) > 1) { nsp = nsp + 8; }
- if ((*idspecies) > 2) { nsp = nsp + 3; }
- }
- }
- nsp = nsp + imp_eng[i-1];
- idsp.reserve(nsp);
- mtrx_data_.reserve(nsp * nsp);
- mtrx = grackle::impl::View<double**>(mtrx_data_.data(), nsp, nsp);
- vec.reserve(nsp);
- if ( (*ispecies) > 0 ) {
- dsp[ 1-1] = de(i-1,j-1,k-1);
- dsp[ 2-1] = HI(i-1,j-1,k-1);
- dsp[ 3-1] = HII(i-1,j-1,k-1);
- dsp[ 4-1] = HeI(i-1,j-1,k-1);
- dsp[ 5-1] = HeII(i-1,j-1,k-1);
- dsp[ 6-1] = HeIII(i-1,j-1,k-1);
- }
- if ( (*ispecies) > 1 ) {
- dsp[ 7-1] = HM(i-1,j-1,k-1);
- dsp[ 8-1] = H2I(i-1,j-1,k-1);
- dsp[ 9-1] = H2II(i-1,j-1,k-1);
- }
- if ( (*ispecies) > 2 ) {
- dsp[10-1] = DI(i-1,j-1,k-1);
- dsp[11-1] = DII(i-1,j-1,k-1);
- dsp[12-1] = HDI(i-1,j-1,k-1);
- }
- if ( (*ispecies) > 3 ) {
- dsp[13-1] = DM(i-1,j-1,k-1);
- dsp[14-1] = HDII(i-1,j-1,k-1);
- dsp[15-1] = HeHII(i-1,j-1,k-1);
- }
- if ( itmask_metal[i-1] != MASK_FALSE ) {
- if ( (*imchem) == 1 ) {
- dsp[16-1] = CI(i-1,j-1,k-1);
- dsp[17-1] = CII(i-1,j-1,k-1);
- dsp[18-1] = CO(i-1,j-1,k-1);
- dsp[19-1] = CO2(i-1,j-1,k-1);
- dsp[20-1] = OI(i-1,j-1,k-1);
- dsp[21-1] = OH(i-1,j-1,k-1);
- dsp[22-1] = H2O(i-1,j-1,k-1);
- dsp[23-1] = O2(i-1,j-1,k-1);
- dsp[24-1] = SiI(i-1,j-1,k-1);
- dsp[25-1] = SiOI(i-1,j-1,k-1);
- dsp[26-1] = SiO2I(i-1,j-1,k-1);
- dsp[27-1] = CH(i-1,j-1,k-1);
- dsp[28-1] = CH2(i-1,j-1,k-1);
- dsp[29-1] = COII(i-1,j-1,k-1);
- dsp[30-1] = OII(i-1,j-1,k-1);
- dsp[31-1] = OHII(i-1,j-1,k-1);
- dsp[32-1] = H2OII(i-1,j-1,k-1);
- dsp[33-1] = H3OII(i-1,j-1,k-1);
- dsp[34-1] = O2II(i-1,j-1,k-1);
- if ( ( (*igrgr) == 1 ) || ( (*idsub) == 1) ) {
- if ((*idspecies) > 0) {
- dsp[35-1] = Mg(i-1,j-1,k-1);
- }
- if ((*idspecies) > 1) {
- dsp[36-1] = Al(i-1,j-1,k-1);
- dsp[37-1] = S(i-1,j-1,k-1);
- dsp[38-1] = Fe(i-1,j-1,k-1);
- }
- }
- }
- if ( ( (*igrgr) == 1 ) || ( (*idsub) == 1) ) {
- if ((*idspecies) > 0) {
- dsp[39-1] = MgSiO3(i-1,j-1,k-1);
- dsp[40-1] = AC(i-1,j-1,k-1);
- }
- if ((*idspecies) > 1) {
- dsp[41-1] = SiM(i-1,j-1,k-1);
- dsp[42-1] = FeM(i-1,j-1,k-1);
- dsp[43-1] = Mg2SiO4(i-1,j-1,k-1);
- dsp[44-1] = Fe3O4(i-1,j-1,k-1);
- dsp[45-1] = SiO2D(i-1,j-1,k-1);
- dsp[46-1] = MgO(i-1,j-1,k-1);
- dsp[47-1] = FeS(i-1,j-1,k-1);
- dsp[48-1] = Al2O3(i-1,j-1,k-1);
- }
- if ((*idspecies) > 2) {
- dsp[49-1] = reforg(i-1,j-1,k-1);
- dsp[50-1] = volorg(i-1,j-1,k-1);
- dsp[51-1] = H2Oice(i-1,j-1,k-1);
- }
- }
- }
- dsp[i_eng-1] = e(i-1,j-1,k-1);
- id = 0;
- if ((*ispecies) > 0) {
- for (isp = 1; isp<=(6); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- if ((*ispecies) > 1) {
- for (isp = 7; isp<=(9); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- if ((*ispecies) > 2) {
- for (isp = 10; isp<=(12); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- if ((*ispecies) > 3) {
- for (isp = 13; isp<=(15); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- if (itmask_metal[i-1] != MASK_FALSE) {
- if ((*imchem) == 1) {
- for (isp = 16; isp<=(34); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- if ( ( (*igrgr) == 1 ) || ( (*idsub) == 1) ) {
- if ((*idspecies) > 0) {
- for (isp = 35; isp<=(35); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- if ((*idspecies) > 1) {
- for (isp = 36; isp<=(38); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- }
- }
- if ( ( (*igrgr) == 1 ) || ( (*idsub) == 1) ) {
- if ((*idspecies) > 0) {
- for (isp = 39; isp<=(40); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- if ((*idspecies) > 1) {
- for (isp = 41; isp<=(48); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- if ((*idspecies) > 2) {
- for (isp = 49; isp<=(51); isp++) {
- id = id + 1;
- idsp[id-1] = isp;
- }
- }
- }
- }
- if ( imp_eng[i-1] ==1 ) {
- id = id + 1;
- idsp[id-1] = i_eng;
- }
- // Save arrays at ttot(i)
- std::memcpy(dsp0.data(), dsp.data(), sizeof(double)*i_eng);
- std::memset(ddsp.data(), 0, sizeof(double)*i_eng);
- // Search for the timestep for which chemistry converges
- ierror=1;
- itr_time=0;
- while ((ierror==1)) {
- // If not converge, restore arrays at ttot(i)
- std::memcpy(dsp.data(), dsp0.data(), sizeof(double)*i_eng);
- std::memset(ddsp.data(), 0, sizeof(double)*i_eng);
- // Iteration to solve ODEs
- err_max=1.e2;
- itr=0;
- while (err_max>1.e-8) {
- if(itr>=20) {
- ierror = 1;
- goto label_9996;
- }
- FORTRAN_NAME(lookup_cool_rates0d)(&dtit[i-1],
- &d(i-1,j-1,k-1), &u(i-1,j-1,k-1), &v(i-1,j-1,k-1), &w(i-1,j-1,k-1),
- &nsp, dsp.data(), dspdot.data(), nratec,
- iexpand, ispecies, imetal, imcool,
- idust, idustall, idustfield, idustrec,
- ih2co, ipiht, &iter, igammah,
- aye, temstart, temend, z_solar, fgr,
- utem, uxyz, uaye, urho, utim,
- gamma, fh,
- ceHIa, ceHeIa, ceHeIIa, ciHIa, ciHeIa,
- ciHeISa, ciHeIIa, reHIIa, reHeII1a,
- reHeII2a, reHeIIIa, brema, compa, gammaha,
- isrf, regra, gamma_isrfa, comp_xraya, comp_temp,
- piHI, piHeI, piHeII, &comp1, &comp2,
- &metal(i-1,j-1,k-1), &dust(i-1,j-1,k-1),
- hyd01ka, h2k01a, vibha, rotha, rotla,
- &hyd01k[i-1], &h2k01[i-1], &vibh[i-1], &roth[i-1], &rotl[i-1],
- gpldla, gphdla, &gpldl[i-1], &gphdl[i-1],
- hdltea, hdlowa, &hdlte[i-1], &hdlow[i-1],
- gaHIa, gaH2a, gaHea,
- gaHpa, gaela,
- h2ltea, gasgra,
- &ceHI[i-1], &ceHeI[i-1], &ceHeII[i-1], &ciHI[i-1], &ciHeI[i-1],
- &ciHeIS[i-1], &ciHeII[i-1],
- &reHII[i-1], &reHeII1[i-1], &reHeII2[i-1], &reHeIII[i-1], &brem[i-1],
- &indixe[i-1], &t1[i-1], &t2[i-1], &logtem[i-1], &tdef[i-1], &edot[i-1],
- &tgas[i-1], &tgasold[i-1], &mmw[i-1], &p2d[i-1], &tdust[i-1], &metallicity[i-1],
- &dust2gas[i-1], &rhoH[i-1], &mynh[i-1], &myde[i-1],
- &gammaha_eff[i-1], &gasgr_tdust[i-1], ®r[i-1],
- iradshield, avgsighi, avgsighei, avgsigheii,
- iradtrans, irt_honly,
- ih2optical, iciecool, ih2cr, ihdcr, ciecoa, &cieco[i-1],
- icmbTfloor, iClHeat, clEleFra,
- priGridRank, priGridDim,
- priPar1, priPar2, priPar3, priPar4, priPar5,
- priDataSize, priCooling, priHeating, priMMW,
- metGridRank, metGridDim,
- metPar1, metPar2, metPar3, metPar4, metPar5,
- metDataSize, metCooling, metHeating, clnew,
- iVheat, iMheat, &Vheat(i-1,j-1,k-1), &Mheat(i-1,j-1,k-1),
- iTfloor, Tfloor_scalar, &Tfloor(i-1,j-1,k-1),
- iisrffield, isrf_habing,
- ithreebody, &anydust, iH2shield,
- k1a, k2a, k3a, k4a, k5a, k6a, k7a, k8a, k9a, k10a,
- k11a, k12a, k13a, k13dda, k14a, k15a, k16a,
- k17a, k18a, k19a, k22a,
- k24, k25, k26, k27, k28, k29, k30, k31,
- k50a, k51a, k52a, k53a, k54a, k55a, k56a,
- k57a, k58a, ndratec, dtemstart, dtemend, h2dusta,
- ncrna, ncrd1a, ncrd2a,
- &h2dust[i-1], &ncrn[i-1], &ncrd1[i-1], &ncrd2[i-1],
- &dom, &coolunit, &tbase1, &xbase1, &dx_cgs, &c_ljeans,
- &kphHI(i-1,j-1,k-1), &kphHeI(i-1,j-1,k-1), &kphHeII(i-1,j-1,k-1), &kdissH2I(i-1,j-1,k-1),
- &photogamma(i-1,j-1,k-1), &xH2shield(i-1,j-1,k-1), &chunit, &itmask_nr[i-1],
- &itmask_metal[i-1],
- imchem, igrgr, ipcont, tmcool,
- k125a, k129a, k130a, k131a, k132a,
- k133a, k134a, k135a, k136a, k137a,
- k148a, k149a, k150a, k151a, k152a,
- k153a,
- kz15a, kz16a, kz17a, kz18a, kz19a,
- kz20a, kz21a, kz22a, kz23a, kz24a,
- kz25a, kz26a, kz27a, kz28a, kz29a,
- kz30a, kz31a, kz32a, kz33a, kz34a,
- kz35a, kz36a, kz37a, kz38a, kz39a,
- kz40a, kz41a, kz42a, kz43a, kz44a,
- kz45a, kz46a, kz47a, kz48a, kz49a,
- kz50a, kz51a, kz52a, kz53a, kz54a,
- cieY06a,
- LH2_N, LH2_Size,
- LH2_D, LH2_T, LH2_H,
- LH2_dD, LH2_dT, LH2_dH, LH2_L,
- LHD_N, LHD_Size,
- LHD_D, LHD_T, LHD_H,
- LHD_dD, LHD_dT, LHD_dH, LHD_L,
- LCI_N, LCI_Size,
- LCI_D, LCI_T, LCI_H,
- LCI_dD, LCI_dT, LCI_dH, LCI_L,
- LCII_N, LCII_Size,
- LCII_D, LCII_T, LCII_H,
- LCII_dD, LCII_dT, LCII_dH, LCII_L,
- LOI_N, LOI_Size,
- LOI_D, LOI_T, LOI_H,
- LOI_dD, LOI_dT, LOI_dH, LOI_L,
- LCO_N, LCO_Size,
- LCO_D, LCO_T, LCO_H,
- LCO_dD, LCO_dT, LCO_dH, LCO_L,
- LOH_N, LOH_Size,
- LOH_D, LOH_T, LOH_H,
- LOH_dD, LOH_dT, LOH_dH, LOH_L,
- LH2O_N, LH2O_Size,
- LH2O_D, LH2O_T, LH2O_H,
- LH2O_dD, LH2O_dT, LH2O_dH, LH2O_L,
- alphap_N, alphap_Size,
- alphap_D, alphap_T, alphap_dD, alphap_dT,
- alphap_Data,
- immulti, imabund, idspecies, itdmulti, idsub,
- &metal_loc(i-1,j-1,k-1), &metal_C13(i-1,j-1,k-1), &metal_C20(i-1,j-1,k-1),
- &metal_C25(i-1,j-1,k-1), &metal_C30(i-1,j-1,k-1), &metal_F13(i-1,j-1,k-1),
- &metal_F15(i-1,j-1,k-1), &metal_F50(i-1,j-1,k-1), &metal_F80(i-1,j-1,k-1),
- &metal_P170(i-1,j-1,k-1), &metal_P200(i-1,j-1,k-1), &metal_Y19(i-1,j-1,k-1),
- SN0_N,
- SN0_fSiM, SN0_fFeM, SN0_fMg2SiO4, SN0_fMgSiO3,
- SN0_fFe3O4, SN0_fAC, SN0_fSiO2D, SN0_fMgO,
- SN0_fFeS, SN0_fAl2O3,
- SN0_freforg, SN0_fvolorg, SN0_fH2Oice,
- SN0_r0SiM, SN0_r0FeM, SN0_r0Mg2SiO4, SN0_r0MgSiO3,
- SN0_r0Fe3O4, SN0_r0AC, SN0_r0SiO2D, SN0_r0MgO,
- SN0_r0FeS, SN0_r0Al2O3,
- SN0_r0reforg, SN0_r0volorg, SN0_r0H2Oice,
- gr_N, gr_Size, gr_dT, gr_Td,
- SN0_kpSiM, SN0_kpFeM, SN0_kpMg2SiO4, SN0_kpMgSiO3,
- SN0_kpFe3O4, SN0_kpAC, SN0_kpSiO2D, SN0_kpMgO,
- SN0_kpFeS, SN0_kpAl2O3,
- SN0_kpreforg, SN0_kpvolorg, SN0_kpH2Oice,
- h2dustSa, h2dustCa, grogra,
- &tSiM[i-1], &tFeM[i-1], &tMg2SiO4[i-1], &tMgSiO3[i-1], &tFe3O4[i-1],
- &tAC[i-1], &tSiO2D[i-1], &tMgO[i-1], &tFeS[i-1], &tAl2O3[i-1],
- &treforg[i-1], &tvolorg[i-1], &tH2Oice[i-1],
- gasgr2a, gamma_isrf2a,
- &imp_eng[i-1],
- idissHDI, &kdissHDI(i-1,j-1,k-1), iionZ, &kphCI(i-1,j-1,k-1), &kphOI(i-1,j-1,k-1),
- idissZ, &kdissCO(i-1,j-1,k-1), &kdissOH(i-1,j-1,k-1), &kdissH2O(i-1,j-1,k-1),
- iuseH2shield
- );
- for (jsp = 1; jsp<=(nsp); jsp++) {
- dspj = eps * dsp[idsp[jsp-1]-1];
- for (isp = 1; isp<=(nsp); isp++) {
- if(isp == jsp) {
- dsp1[idsp[isp-1]-1] = dsp[idsp[isp-1]-1] + dspj;
- } else {
- dsp1[idsp[isp-1]-1] = dsp[idsp[isp-1]-1];
- }
- }
- FORTRAN_NAME(lookup_cool_rates0d)(&dtit[i-1],
- &d(i-1,j-1,k-1), &u(i-1,j-1,k-1), &v(i-1,j-1,k-1), &w(i-1,j-1,k-1),
- &nsp, dsp1.data(), dspdot1.data(), nratec,
- iexpand, ispecies, imetal, imcool,
- idust, idustall, idustfield, idustrec,
- ih2co, ipiht, &iter, igammah,
- aye, temstart, temend, z_solar, fgr,
- utem, uxyz, uaye, urho, utim,
- gamma, fh,
- ceHIa, ceHeIa, ceHeIIa, ciHIa, ciHeIa,
- ciHeISa, ciHeIIa, reHIIa, reHeII1a,
- reHeII2a, reHeIIIa, brema, compa, gammaha,
- isrf, regra, gamma_isrfa, comp_xraya, comp_temp,
- piHI, piHeI, piHeII, &comp1, &comp2,
- &metal(i-1,j-1,k-1), &dust(i-1,j-1,k-1),
- hyd01ka, h2k01a, vibha, rotha, rotla,
- &hyd01k[i-1], &h2k01[i-1], &vibh[i-1], &roth[i-1], &rotl[i-1],
- gpldla, gphdla, &gpldl[i-1], &gphdl[i-1],
- hdltea, hdlowa, &hdlte[i-1], &hdlow[i-1],
- gaHIa, gaH2a, gaHea,
- gaHpa, gaela,
- h2ltea, gasgra,
- &ceHI[i-1], &ceHeI[i-1], &ceHeII[i-1], &ciHI[i-1], &ciHeI[i-1],
- &ciHeIS[i-1], &ciHeII[i-1],
- &reHII[i-1], &reHeII1[i-1], &reHeII2[i-1], &reHeIII[i-1], &brem[i-1],
- &indixe[i-1], &t1[i-1], &t2[i-1], &logtem[i-1], &tdef[i-1], &edot[i-1],
- &tgas[i-1], &tgasold[i-1], &mmw[i-1], &p2d[i-1], &tdust[i-1], &metallicity[i-1],
- &dust2gas[i-1], &rhoH[i-1], &mynh[i-1], &myde[i-1],
- &gammaha_eff[i-1], &gasgr_tdust[i-1], ®r[i-1],
- iradshield, avgsighi, avgsighei, avgsigheii,
- iradtrans, irt_honly,
- ih2optical, iciecool, ih2cr, ihdcr, ciecoa, &cieco[i-1],
- icmbTfloor, iClHeat, clEleFra,
- priGridRank, priGridDim,
- priPar1, priPar2, priPar3, priPar4, priPar5,
- priDataSize, priCooling, priHeating, priMMW,
- metGridRank, metGridDim,
- metPar1, metPar2, metPar3, metPar4, metPar5,
- metDataSize, metCooling, metHeating, clnew,
- iVheat, iMheat, &Vheat(i-1,j-1,k-1), &Mheat(i-1,j-1,k-1),
- iTfloor, Tfloor_scalar, &Tfloor(i-1,j-1,k-1),
- iisrffield, isrf_habing,
- ithreebody, &anydust, iH2shield,
- k1a, k2a, k3a, k4a, k5a, k6a, k7a, k8a, k9a, k10a,
- k11a, k12a, k13a, k13dda, k14a, k15a, k16a,
- k17a, k18a, k19a, k22a,
- k24, k25, k26, k27, k28, k29, k30, k31,
- k50a, k51a, k52a, k53a, k54a, k55a, k56a,
- k57a, k58a, ndratec, dtemstart, dtemend, h2dusta,
- ncrna, ncrd1a, ncrd2a,
- &h2dust[i-1], &ncrn[i-1], &ncrd1[i-1], &ncrd2[i-1],
- &dom, &coolunit, &tbase1, &xbase1, &dx_cgs, &c_ljeans,
- &kphHI(i-1,j-1,k-1), &kphHeI(i-1,j-1,k-1), &kphHeII(i-1,j-1,k-1), &kdissH2I(i-1,j-1,k-1),
- &photogamma(i-1,j-1,k-1), &xH2shield(i-1,j-1,k-1), &chunit, &itmask_nr[i-1],
- &itmask_metal[i-1],
- imchem, igrgr, ipcont, tmcool,
- k125a, k129a, k130a, k131a, k132a,
- k133a, k134a, k135a, k136a, k137a,
- k148a, k149a, k150a, k151a, k152a,
- k153a,
- kz15a, kz16a, kz17a, kz18a, kz19a,
- kz20a, kz21a, kz22a, kz23a, kz24a,
- kz25a, kz26a, kz27a, kz28a, kz29a,
- kz30a, kz31a, kz32a, kz33a, kz34a,
- kz35a, kz36a, kz37a, kz38a, kz39a,
- kz40a, kz41a, kz42a, kz43a, kz44a,
- kz45a, kz46a, kz47a, kz48a, kz49a,
- kz50a, kz51a, kz52a, kz53a, kz54a,
- cieY06a,
- LH2_N, LH2_Size,
- LH2_D, LH2_T, LH2_H,
- LH2_dD, LH2_dT, LH2_dH, LH2_L,
- LHD_N, LHD_Size,
- LHD_D, LHD_T, LHD_H,
- LHD_dD, LHD_dT, LHD_dH, LHD_L,
- LCI_N, LCI_Size,
- LCI_D, LCI_T, LCI_H,
- LCI_dD, LCI_dT, LCI_dH, LCI_L,
- LCII_N, LCII_Size,
- LCII_D, LCII_T, LCII_H,
- LCII_dD, LCII_dT, LCII_dH, LCII_L,
- LOI_N, LOI_Size,
- LOI_D, LOI_T, LOI_H,
- LOI_dD, LOI_dT, LOI_dH, LOI_L,
- LCO_N, LCO_Size,
- LCO_D, LCO_T, LCO_H,
- LCO_dD, LCO_dT, LCO_dH, LCO_L,
- LOH_N, LOH_Size,
- LOH_D, LOH_T, LOH_H,
- LOH_dD, LOH_dT, LOH_dH, LOH_L,
- LH2O_N, LH2O_Size,
- LH2O_D, LH2O_T, LH2O_H,
- LH2O_dD, LH2O_dT, LH2O_dH, LH2O_L,
- alphap_N, alphap_Size,
- alphap_D, alphap_T, alphap_dD, alphap_dT,
- alphap_Data,
- immulti, imabund, idspecies, itdmulti, idsub,
- &metal_loc(i-1,j-1,k-1), &metal_C13(i-1,j-1,k-1), &metal_C20(i-1,j-1,k-1),
- &metal_C25(i-1,j-1,k-1), &metal_C30(i-1,j-1,k-1), &metal_F13(i-1,j-1,k-1),
- &metal_F15(i-1,j-1,k-1), &metal_F50(i-1,j-1,k-1), &metal_F80(i-1,j-1,k-1),
- &metal_P170(i-1,j-1,k-1), &metal_P200(i-1,j-1,k-1), &metal_Y19(i-1,j-1,k-1),
- SN0_N,
- SN0_fSiM, SN0_fFeM, SN0_fMg2SiO4, SN0_fMgSiO3,
- SN0_fFe3O4, SN0_fAC, SN0_fSiO2D, SN0_fMgO,
- SN0_fFeS, SN0_fAl2O3,
- SN0_freforg, SN0_fvolorg, SN0_fH2Oice,
- SN0_r0SiM, SN0_r0FeM, SN0_r0Mg2SiO4, SN0_r0MgSiO3,
- SN0_r0Fe3O4, SN0_r0AC, SN0_r0SiO2D, SN0_r0MgO,
- SN0_r0FeS, SN0_r0Al2O3,
- SN0_r0reforg, SN0_r0volorg, SN0_r0H2Oice,
- gr_N, gr_Size, gr_dT, gr_Td,
- SN0_kpSiM, SN0_kpFeM, SN0_kpMg2SiO4, SN0_kpMgSiO3,
- SN0_kpFe3O4, SN0_kpAC, SN0_kpSiO2D, SN0_kpMgO,
- SN0_kpFeS, SN0_kpAl2O3,
- SN0_kpreforg, SN0_kpvolorg, SN0_kpH2Oice,
- h2dustSa, h2dustCa, grogra,
- &tSiM[i-1], &tFeM[i-1], &tMg2SiO4[i-1], &tMgSiO3[i-1], &tFe3O4[i-1],
- &tAC[i-1], &tSiO2D[i-1], &tMgO[i-1], &tFeS[i-1], &tAl2O3[i-1],
- &treforg[i-1], &tvolorg[i-1], &tH2Oice[i-1],
- gasgr2a, gamma_isrf2a,
- &imp_eng[i-1],
- idissHDI, &kdissHDI(i-1,j-1,k-1), iionZ, &kphCI(i-1,j-1,k-1), &kphOI(i-1,j-1,k-1),
- idissZ, &kdissCO(i-1,j-1,k-1), &kdissOH(i-1,j-1,k-1), &kdissH2O(i-1,j-1,k-1),
- iuseH2shield
- );
- for (isp = 1; isp<=(nsp); isp++) {
- if ( (dsp[idsp[isp-1]-1]==0.e0)
- && (dspdot1[idsp[isp-1]-1]
- == dspdot[idsp[isp-1]-1]) ) {
- der(idsp[isp-1]-1,idsp[jsp-1]-1) = 0.e0;
- } else {
- der(idsp[isp-1]-1,idsp[jsp-1]-1) =
- (dspdot1[idsp[isp-1]-1]
- - dspdot[idsp[isp-1]-1]) / dspj;
- }
- }
- }
- for (isp = 1; isp<=(nsp); isp++) {
- for (jsp = 1; jsp<=(nsp); jsp++) {
- if(isp == jsp) {
- mtrx(isp-1,jsp-1) = 1.e0 - dtit[i-1]
- * der(idsp[isp-1]-1,idsp[jsp-1]-1);
- } else {
- mtrx(isp-1,jsp-1) = - dtit[i-1]
- * der(idsp[isp-1]-1,idsp[jsp-1]-1);
- }
- }
- }
- for (isp = 1; isp<=(nsp); isp++) {
- vec[isp-1] = dspdot[idsp[isp-1]-1] * dtit[i-1]
- - ddsp[idsp[isp-1]-1];
- }
- // to get more accuracy
- for (isp = 1; isp<=(nsp); isp++) {
- vec[isp-1] = vec[isp-1]/d(i-1,j-1,k-1);
- }
- FORTRAN_NAME(gaussj_g)(&nsp, mtrx.data(), vec.data(), &ierror);
- if(ierror == 1) {
- goto label_9998;
- }
- // multiply with density again
- for (isp = 1; isp<=(nsp); isp++) {
- vec[isp-1] = vec[isp-1]*d(i-1,j-1,k-1);
- }
- for (isp = 1; isp<=(nsp); isp++) {
- ddsp[idsp[isp-1]-1] = ddsp[idsp[isp-1]-1] + vec[isp-1];
- dsp[idsp[isp-1]-1] = dsp[idsp[isp-1]-1] + vec[isp-1];
- }
- if (imp_eng[i-1] == 1) {
- if( ((*ispecies) > 0) && ((*icool) == 1) ) {
- for (isp = 1; isp<=(nsp); isp++) {
- if ( (dsp[idsp[isp-1]-1] != dsp[idsp[isp-1]-1])
- || (dsp[idsp[isp-1]-1] <= 0.) ) {
- ierror = 1;
- goto label_9997;
- }
- }
- }
- }
- err_max = 0.e0;
- for (isp = 1; isp<=(nsp); isp++) {
- if(dsp[idsp[isp-1]-1] > tiny8) {
- err = grackle::impl::dabs(vec[isp-1] / dsp[idsp[isp-1]-1]);
- } else {
- err = 0.e0;
- }
- if(err > err_max) {
- err_max = err;
- }
- }
- itr=itr+1;
- }
- label_9998:
- label_9997:
- label_9996:
- // Check if the fractions are valid after an iteration
- if( ((*ispecies) > 0) && ((*icool) == 1) ) {
- for (isp = 1; isp<=(nsp); isp++) {
- if ( (dsp[idsp[isp-1]-1] != dsp[idsp[isp-1]-1])
- || (dsp[idsp[isp-1]-1] <= 0.) ) {
- ierror = 1;
- }
- }
- }
- if(ierror == 1) {
- dtit[i-1] = 0.5e0*dtit[i-1];
- }
- itr_time=itr_time+1;
- }
- if ( (*ispecies) > 0 ) {
- de(i-1,j-1,k-1) = dsp[ 1-1];
- HI(i-1,j-1,k-1) = dsp[ 2-1];
- HII(i-1,j-1,k-1) = dsp[ 3-1];
- HeI(i-1,j-1,k-1) = dsp[ 4-1];
- HeII(i-1,j-1,k-1) = dsp[ 5-1];
- HeIII(i-1,j-1,k-1) = dsp[ 6-1];
- }
- if ( (*ispecies) > 1 ) {
- HM(i-1,j-1,k-1) = dsp[ 7-1];
- H2I(i-1,j-1,k-1) = dsp[ 8-1];
- H2II(i-1,j-1,k-1) = dsp[ 9-1];
- }
- if ( (*ispecies) > 2 ) {
- DI(i-1,j-1,k-1) = dsp[10-1];
- DII(i-1,j-1,k-1) = dsp[11-1];
- HDI(i-1,j-1,k-1) = dsp[12-1];
- }
- if ( (*ispecies) > 3 ) {
- DM(i-1,j-1,k-1) = dsp[13-1];
- HDII(i-1,j-1,k-1) = dsp[14-1];
- HeHII(i-1,j-1,k-1) = dsp[15-1];
- }
- if ( itmask_metal[i-1] != MASK_FALSE ) {
- if ( (*imchem) == 1 ) {
- CI(i-1,j-1,k-1) = dsp[16-1];
- CII(i-1,j-1,k-1) = dsp[17-1];
- CO(i-1,j-1,k-1) = dsp[18-1];
- CO2(i-1,j-1,k-1) = dsp[19-1];
- OI(i-1,j-1,k-1) = dsp[20-1];
- OH(i-1,j-1,k-1) = dsp[21-1];
- H2O(i-1,j-1,k-1) = dsp[22-1];
- O2(i-1,j-1,k-1) = dsp[23-1];
- SiI(i-1,j-1,k-1) = dsp[24-1];
- SiOI(i-1,j-1,k-1) = dsp[25-1];
- SiO2I(i-1,j-1,k-1) = dsp[26-1];
- CH(i-1,j-1,k-1) = dsp[27-1];
- CH2(i-1,j-1,k-1) = dsp[28-1];
- COII(i-1,j-1,k-1) = dsp[29-1];
- OII(i-1,j-1,k-1) = dsp[30-1];
- OHII(i-1,j-1,k-1) = dsp[31-1];
- H2OII(i-1,j-1,k-1) = dsp[32-1];
- H3OII(i-1,j-1,k-1) = dsp[33-1];
- O2II(i-1,j-1,k-1) = dsp[34-1];
- if ( ( (*igrgr) == 1 ) || ( (*idsub) == 1 ) ) {
- if ((*idspecies) > 0) {
- Mg(i-1,j-1,k-1) = dsp[35-1];
- }
- if ((*idspecies) > 1) {
- Al(i-1,j-1,k-1) = dsp[36-1];
- S(i-1,j-1,k-1) = dsp[37-1];
- Fe(i-1,j-1,k-1) = dsp[38-1];
- }
- }
- }
- if ( ( (*igrgr) == 1 ) || ( (*idsub) == 1 ) ) {
- if ((*idspecies) > 0) {
- MgSiO3(i-1,j-1,k-1) = dsp[39-1];
- AC(i-1,j-1,k-1) = dsp[40-1];
- }
- if ((*idspecies) > 1) {
- SiM(i-1,j-1,k-1) = dsp[41-1];
- FeM(i-1,j-1,k-1) = dsp[42-1];
- Mg2SiO4(i-1,j-1,k-1) = dsp[43-1];
- Fe3O4(i-1,j-1,k-1) = dsp[44-1];
- SiO2D(i-1,j-1,k-1) = dsp[45-1];
- MgO(i-1,j-1,k-1) = dsp[46-1];
- FeS(i-1,j-1,k-1) = dsp[47-1];
- Al2O3(i-1,j-1,k-1) = dsp[48-1];
- }
- if ((*idspecies) > 2) {
- reforg(i-1,j-1,k-1) = dsp[49-1];
- volorg(i-1,j-1,k-1) = dsp[50-1];
- H2Oice(i-1,j-1,k-1) = dsp[51-1];
- }
- }
- }
- e(i-1,j-1,k-1) = dsp[i_eng-1];
- idsp.clear();
- vec.clear();
- mtrx = grackle::impl::View<double**>();
- mtrx_data_.clear();
- }
- }
- }
- // return itmask
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- itmask[i-1] = itmask_tmp[i-1];
- }
- // Add the timestep to the elapsed time for each cell and find
- // minimum elapsed time step in this row
- ttmin = huge8;
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- ttot[i-1] = std::fmin(ttot[i-1] + dtit[i-1], (*dt));
- if (std::fabs((*dt)-ttot[i-1]) <
- tolerance*(*dt)) { itmask[i-1] = MASK_FALSE; }
- if (ttot[i-1]<ttmin) { ttmin = ttot[i-1]; }
- }
- // If all cells are done (on this slice), then exit
- if (std::fabs((*dt)-ttmin) < tolerance*(*dt)) { goto label_9999; }
- // Next subcycle iteration
- }
- label_9999:
- // Abort if iteration count exceeds maximum
- if (iter > (*itmax)) {
- OMP_PRAGMA_CRITICAL
- {
- printf("inside if statement solve rate cool: %d %d\n", (*is), (*ie));
- eprintf("MULTI_COOL iter > %d at j,k = %d %d\n", (*itmax), j, k);
- printf("FATAL error (2) in MULTI_COOL\n");
- //_// PORT: write(0,'(" dt = ",1pe10.3," ttmin = ",1pe10.3)') dt, ttmin
- //_// PORT: write(0,'((16(1pe8.1)))') (dtit(i),i=is+1,ie+1)
- //_// PORT: write(0,'((16(1pe8.1)))') (ttot(i),i=is+1,ie+1)
- //_// PORT: write(0,'((16(1pe8.1)))') (edot(i),i=is+1,ie+1)
- //_// PORT: write(0,'((16(I3)))') (itmask(i),i=is+1,ie+1)
- if ((*exititmax) == 1) {
- (*ierr) = 0;
- }
- }
- // WARNING_MESSAGE
- }
- if (iter > (*itmax)/2) {
- OMP_PRAGMA_CRITICAL
- {
- eprintf("MULTI_COOL iter,j,k = %d %d %d\n", iter, j, k);
- }
- }
- // Next j,k
- }
- //_// PORT: #ifdef _OPENMP
- //_// PORT: !$omp end parallel do
- //_// PORT: #endif
- // If an error has been produced, return now.
- if ((*ierr) == 0) {
- return;
- }
- // Convert densities back to comoving from proper
- if ((*iexpand) == 1) {
- factor = (gr_float)(std::pow((*aye),3) );
- FORTRAN_NAME(scale_fields_g)(
- ispecies, imetal, idustfield, imchem,
- imabund, idspecies, immulti, igrgr, idsub, &factor,
- is, ie, js, je, ks, ke, in, jn, kn,
- d.data(), de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(),
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(), DM.data(), HDII.data(), HeHII.data(),
- metal.data(), dust.data(),
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- metal_loc.data(), metal_C13.data(), metal_C20.data(), metal_C25.data(), metal_C30.data(),
- metal_F13.data(), metal_F15.data(), metal_F50.data(), metal_F80.data(),
- metal_P170.data(), metal_P200.data(), metal_Y19.data());
- }
- if ((*ispecies) > 0) {
- // Correct the species to ensure consistency (i.e. type conservation)
- #ifdef ABUNDANCE_CORRECTION
- FORTRAN_NAME(make_consistent_g)(de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(),
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(), metal.data(), dust.data(),
- d.data(), is, ie, js, je, ks, ke,
- in, jn, kn, ispecies, imetal, fh, dtoh,
- idustfield, imchem, igrgr, &dom,
- DM.data(), HDII.data(), HeHII.data(),
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- immulti, imabund, idspecies, itdmulti, idsub,
- metal_loc.data(),
- metal_C13.data(), metal_C20.data(), metal_C25.data(), metal_C30.data(),
- metal_F13.data(), metal_F15.data(), metal_F50.data(), metal_F80.data(),
- metal_P170.data(), metal_P200.data(), metal_Y19.data(),
- SN0_N,
- SN0_XC, SN0_XO, SN0_XMg, SN0_XAl, SN0_XSi,
- SN0_XS, SN0_XFe,
- SN0_fC, SN0_fO, SN0_fMg, SN0_fAl, SN0_fSi,
- SN0_fS, SN0_fFe
- );
- FORTRAN_NAME(ceiling_species_g)(d.data(), de.data(), HI.data(), HII.data(), HeI.data(), HeII.data(), HeIII.data(),
- HM.data(), H2I.data(), H2II.data(), DI.data(), DII.data(), HDI.data(), metal.data(), dust.data(),
- is, ie, js, je, ks, ke,
- in, jn, kn, ispecies, imetal, idustfield,
- DM.data(), HDII.data(), HeHII.data(),
- imabund, imchem, idspecies, immulti,
- igrgr, idsub,
- CI.data(), CII.data(), CO.data(), CO2.data(),
- OI.data(), OH.data(), H2O.data(), O2.data(),
- SiI.data(), SiOI.data(), SiO2I.data(),
- CH.data(), CH2.data(), COII.data(), OII.data(),
- OHII.data(), H2OII.data(), H3OII.data(), O2II.data(),
- Mg.data(), Al.data(), S.data(), Fe.data(),
- SiM.data(), FeM.data(), Mg2SiO4.data(), MgSiO3.data(), Fe3O4.data(),
- AC.data(), SiO2D.data(), MgO.data(), FeS.data(), Al2O3.data(),
- reforg.data(), volorg.data(), H2Oice.data(),
- metal_loc.data(),
- metal_C13.data(), metal_C20.data(), metal_C25.data(), metal_C30.data(),
- metal_F13.data(), metal_F15.data(), metal_F50.data(), metal_F80.data(),
- metal_P170.data(), metal_P200.data(), metal_Y19.data());
- #endif
- }
- return;
- }
- } // extern "C"
Add Comment
Please, Sign In to add comment