Advertisement
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 "cool_multi_time_g-cpp.h"
- //_// TODO: ADD ANY OTHER INCLUDE DIRECTIVES
- extern "C" {
- void cool_multi_time_g(
- gr_float* d, gr_float* e, gr_float* u, gr_float* v, gr_float* w, gr_float* de,
- gr_float* HI, gr_float* HII, gr_float* HeI, gr_float* HeII, gr_float* HeIII,
- gr_float* cooltime_data_, int* in, int* jn, int* kn, int* nratec,
- int* iexpand, int* ispecies, int* imetal, int* imcool, int* idust,
- int* idustall, int* idustfield, int* idustrec, int* idim, int* is, int* js,
- int* ks, int* ie, int* je, int* ke, int* ih2co, int* ipiht, int* igammah,
- double* aye, double* temstart, double* temend, double* utem, double* uxyz,
- double* uaye, double* urho, double* utim, double* gamma, double* fh,
- double* z_solar, double* fgr, 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, gr_float* H2I, gr_float* H2II,
- gr_float* DI, gr_float* DII, gr_float* HDI, gr_float* metal, gr_float* dust,
- 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* iradshield, double* avgsighi, double* avgsighei,
- double* avgsigheii, double* k24, double* k26, int* iradtrans,
- double* photogamma, int* ih2optical, int* iciecool, 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,
- gr_float* Mheat, int* iTfloor, double* Tfloor_scalar, gr_float* Tfloor,
- int* imchem, int* igrgr, int* ipcont, double* tmcool, gr_float* DM,
- gr_float* HDII, gr_float* HeHII, gr_float* CI, gr_float* CII, gr_float* CO,
- gr_float* CO2, gr_float* OI, gr_float* OH, gr_float* H2O, gr_float* O2,
- gr_float* SiI, gr_float* SiOI, gr_float* SiO2I, gr_float* CH, gr_float* CH2,
- gr_float* COII, gr_float* OII, gr_float* OHII, gr_float* H2OII,
- gr_float* H3OII, gr_float* O2II, gr_float* Mg, gr_float* Al, gr_float* S,
- gr_float* Fe, gr_float* SiM, gr_float* FeM, gr_float* Mg2SiO4,
- gr_float* MgSiO3, gr_float* Fe3O4, gr_float* AC, gr_float* SiO2D,
- gr_float* MgO, gr_float* FeS, gr_float* Al2O3, gr_float* reforg,
- gr_float* volorg, gr_float* H2Oice, 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,
- gr_float* metal_C13, gr_float* metal_C20, gr_float* metal_C25,
- gr_float* metal_C30, gr_float* metal_F13, gr_float* metal_F15,
- gr_float* metal_F50, gr_float* metal_F80, gr_float* metal_P170,
- gr_float* metal_P200, gr_float* metal_Y19, int* SN0_N, 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* gasgr2a, double* gamma_isrf2a, int* iisrffield,
- gr_float* isrf_habing
- )
- {
- // SOLVE RADIATIVE COOLING/HEATING EQUATIONS
- // written by: Yu Zhang, Peter Anninos and Tom Abel
- // date:
- // modified1: January, 1996 by Greg Bryan; adapted to KRONOS
- // modified2: October, 1996 by GB; moved to AMR
- // modified3: February, 2003 by Robert Harkness; iteration mask
- // PURPOSE:
- // Solve the energy cooling equations.
- // INPUTS:
- // is,ie - start and end indicies of active region (zero-based!)
- // PARAMETERS:
- // -----------------------------------------------------------------------
- // Arguments
- // -- removed line (previously just declared arg types) --
- // -- removed line (previously just declared arg types) --
- grackle::impl::View<gr_float***> cooltime(cooltime_data_, (*in), (*jn), (*kn));
- // -- 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) --
- // 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));
- // -- 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
- // Locals
- int i, j, k;
- int t, dj, dk;
- double comp1, comp2, energy;
- gr_float factor;
- // Slice locals
- std::vector<long long> indixe((*in));
- std::vector<double> t1((*in));
- std::vector<double> t2((*in));
- std::vector<double> logtem((*in));
- std::vector<double> tdef((*in));
- std::vector<double> p2d((*in));
- std::vector<double> tgas((*in));
- std::vector<double> tgasold((*in));
- std::vector<double> mmw((*in));
- std::vector<double> tdust((*in));
- std::vector<double> metallicity((*in));
- std::vector<double> dust2gas((*in));
- std::vector<double> rhoH((*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> edot((*in));
- // Cooling/heating slice 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> cieco((*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));
- int dummy_iter_arg;
- // Iteration mask for multi_cool
- std::vector<gr_mask_type> itmask((*in));
- std::vector<gr_mask_type> itmask_metal((*in));
- // \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////////////////
- // =======================================================================
- dk = (*ke) - (*ks) + 1;
- dj = (*je) - (*js) + 1;
- // 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, de, HI, HII, HeI, HeII, HeIII,
- HM, H2I, H2II, DI, DII, HDI, DM, HDII, HeHII,
- metal, dust,
- CI, CII, CO, CO2,
- OI, OH, H2O, O2,
- SiI, SiOI, SiO2I,
- CH, CH2, COII, OII,
- OHII, H2OII, H3OII, O2II,
- Mg, Al, S, Fe,
- SiM, FeM, Mg2SiO4, MgSiO3, Fe3O4,
- AC, SiO2D, MgO, FeS, Al2O3,
- reforg, volorg, H2Oice,
- metal_loc, metal_C13, metal_C20, metal_C25, metal_C30,
- metal_F13, metal_F15, metal_F50, metal_F80,
- metal_P170, metal_P200, metal_Y19);
- }
- // Loop over slices (in the k-direction)
- // parallelize the k and j loops with OpenMP
- // flat j and k loops for better parallelism
- //_// PORT: #ifdef _OPENMP
- //_// PORT: !$omp parallel do schedule(runtime) private(
- //_// PORT: !$omp& i, j, k,
- //_// PORT: !$omp& comp1, comp2, energy,
- //_// PORT: !$omp& indixe,
- //_// PORT: !$omp& t1, t2, logtem, tdef, p2d,
- //_// PORT: !$omp& tgas, tgasold,
- //_// PORT: !$omp& tdust, metallicity, dust2gas, rhoH, mmw,
- //_// PORT: !$omp& mynh, myde, gammaha_eff, gasgr_tdust, regr, edot,
- //_// PORT: !$omp& ceHI, ceHeI, ceHeII,
- //_// PORT: !$omp& ciHI, ciHeI, ciHeIS, ciHeII,
- //_// PORT: !$omp& reHII, reHeII1, reHeII2, reHeIII,
- //_// PORT: !$omp& brem, cieco,
- //_// PORT: !$omp& hyd01k, h2k01, vibh, roth, rotl,
- //_// PORT: !$omp& gpldl, gphdl, hdlte, hdlow,
- //_// PORT: !$omp& itmask )
- //_// PORT: #endif
- for (t = 0; t<=(dk * dj - 1); t++) {
- k = t/dj + (*ks)+1;
- j = grackle::impl::mod(t,dj) + (*js)+1;
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- itmask[i-1] = MASK_TRUE;
- }
- // Compute the cooling rate
- dummy_iter_arg=1;
- FORTRAN_NAME(cool1d_multi_g)(
- d, e, u, v, w, de, HI, HII, HeI, HeII, HeIII,
- in, jn, kn, nratec,
- iexpand, ispecies, imetal, imcool,
- idust, idustall, idustfield, idustrec,
- idim, is, ie, &j, &k, ih2co, ipiht,
- &dummy_iter_arg, 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, H2I, H2II, DI, DII, HDI, metal, dust,
- 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,
- 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, Mheat,
- iTfloor, Tfloor_scalar, Tfloor,
- iisrffield, isrf_habing, itmask.data(), itmask_metal.data(),
- imchem, igrgr, ipcont, tmcool,
- DM, HDII, HeHII,
- CI, CII, CO, CO2,
- OI, OH, H2O, O2,
- SiI, SiOI, SiO2I,
- CH, CH2, COII, OII,
- OHII, H2OII, H3OII, O2II,
- Mg, Al, S, Fe,
- SiM, FeM, Mg2SiO4, MgSiO3, Fe3O4,
- AC, SiO2D, MgO, FeS, Al2O3,
- reforg, volorg, H2Oice,
- 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,
- metal_C13, metal_C20, metal_C25, metal_C30,
- metal_F13, metal_F15, metal_F50, metal_F80,
- metal_P170, metal_P200, metal_Y19,
- 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
- );
- // Compute the cooling time on the slice
- // (the gamma used here is the same as used to calculate the pressure
- // in cool1d_multi_g)
- for (i = (*is) + 1; i<=((*ie) + 1); i++) {
- energy = std::fmax(p2d[i-1]/((*gamma)-1.), tiny);
- cooltime(i-1,j-1,k-1) = (gr_float)(energy/edot[i-1] );
- }
- }
- //_// PORT: #ifdef _OPENMP
- //_// PORT: !$omp end parallel do
- //_// PORT: #endif
- // 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, de, HI, HII, HeI, HeII, HeIII,
- HM, H2I, H2II, DI, DII, HDI, DM, HDII, HeHII,
- metal, dust,
- CI, CII, CO, CO2,
- OI, OH, H2O, O2,
- SiI, SiOI, SiO2I,
- CH, CH2, COII, OII,
- OHII, H2OII, H3OII, O2II,
- Mg, Al, S, Fe,
- SiM, FeM, Mg2SiO4, MgSiO3, Fe3O4,
- AC, SiO2D, MgO, FeS, Al2O3,
- reforg, volorg, H2Oice,
- metal_loc, metal_C13, metal_C20, metal_C25, metal_C30,
- metal_F13, metal_F15, metal_F50, metal_F80,
- metal_P170, metal_P200, metal_Y19);
- }
- return;
- }
- } // extern "C"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement