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* cooltime_data_, int* imetal, double* utem, double* uxyz,
- double* urho, chemistry_data* my_chemistry, chemistry_data_storage* my_rates,
- code_units* my_units, grackle_field_data* my_fields,
- photo_rate_storage* my_uvb_rates
- )
- {
- // 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_, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]);
- // -- 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(my_fields->grid_dimension[0]);
- std::vector<double> tFeM(my_fields->grid_dimension[0]);
- std::vector<double> tMg2SiO4(my_fields->grid_dimension[0]);
- std::vector<double> tMgSiO3(my_fields->grid_dimension[0]);
- std::vector<double> tFe3O4(my_fields->grid_dimension[0]);
- std::vector<double> tAC(my_fields->grid_dimension[0]);
- std::vector<double> tSiO2D(my_fields->grid_dimension[0]);
- std::vector<double> tMgO(my_fields->grid_dimension[0]);
- std::vector<double> tFeS(my_fields->grid_dimension[0]);
- std::vector<double> tAl2O3(my_fields->grid_dimension[0]);
- std::vector<double> treforg(my_fields->grid_dimension[0]);
- std::vector<double> tvolorg(my_fields->grid_dimension[0]);
- std::vector<double> tH2Oice(my_fields->grid_dimension[0]);
- // -- 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(my_fields->grid_dimension[0]);
- std::vector<double> t1(my_fields->grid_dimension[0]);
- std::vector<double> t2(my_fields->grid_dimension[0]);
- std::vector<double> logtem(my_fields->grid_dimension[0]);
- std::vector<double> tdef(my_fields->grid_dimension[0]);
- std::vector<double> p2d(my_fields->grid_dimension[0]);
- std::vector<double> tgas(my_fields->grid_dimension[0]);
- std::vector<double> tgasold(my_fields->grid_dimension[0]);
- std::vector<double> mmw(my_fields->grid_dimension[0]);
- std::vector<double> tdust(my_fields->grid_dimension[0]);
- std::vector<double> metallicity(my_fields->grid_dimension[0]);
- std::vector<double> dust2gas(my_fields->grid_dimension[0]);
- std::vector<double> rhoH(my_fields->grid_dimension[0]);
- std::vector<double> mynh(my_fields->grid_dimension[0]);
- std::vector<double> myde(my_fields->grid_dimension[0]);
- std::vector<double> gammaha_eff(my_fields->grid_dimension[0]);
- std::vector<double> gasgr_tdust(my_fields->grid_dimension[0]);
- std::vector<double> regr(my_fields->grid_dimension[0]);
- std::vector<double> edot(my_fields->grid_dimension[0]);
- // Cooling/heating slice locals
- std::vector<double> ceHI(my_fields->grid_dimension[0]);
- std::vector<double> ceHeI(my_fields->grid_dimension[0]);
- std::vector<double> ceHeII(my_fields->grid_dimension[0]);
- std::vector<double> ciHI(my_fields->grid_dimension[0]);
- std::vector<double> ciHeI(my_fields->grid_dimension[0]);
- std::vector<double> ciHeIS(my_fields->grid_dimension[0]);
- std::vector<double> ciHeII(my_fields->grid_dimension[0]);
- std::vector<double> reHII(my_fields->grid_dimension[0]);
- std::vector<double> reHeII1(my_fields->grid_dimension[0]);
- std::vector<double> reHeII2(my_fields->grid_dimension[0]);
- std::vector<double> reHeIII(my_fields->grid_dimension[0]);
- std::vector<double> brem(my_fields->grid_dimension[0]);
- std::vector<double> cieco(my_fields->grid_dimension[0]);
- std::vector<double> hyd01k(my_fields->grid_dimension[0]);
- std::vector<double> h2k01(my_fields->grid_dimension[0]);
- std::vector<double> vibh(my_fields->grid_dimension[0]);
- std::vector<double> roth(my_fields->grid_dimension[0]);
- std::vector<double> rotl(my_fields->grid_dimension[0]);
- std::vector<double> gpldl(my_fields->grid_dimension[0]);
- std::vector<double> gphdl(my_fields->grid_dimension[0]);
- std::vector<double> hdlte(my_fields->grid_dimension[0]);
- std::vector<double> hdlow(my_fields->grid_dimension[0]);
- int dummy_iter_arg;
- // Iteration mask for multi_cool
- std::vector<gr_mask_type> itmask(my_fields->grid_dimension[0]);
- std::vector<gr_mask_type> itmask_metal(my_fields->grid_dimension[0]);
- // \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////////////////
- // =======================================================================
- dk = my_fields->grid_end[2] - my_fields->grid_start[2] + 1;
- dj = my_fields->grid_end[1] - my_fields->grid_start[1] + 1;
- // Convert densities from comoving to 'proper'
- if (my_units->comoving_coordinates == 1) {
- factor = (gr_float)(std::pow(my_units->a_value,(-3)) );
- FORTRAN_NAME(scale_fields_g)(
- &my_chemistry->primordial_chemistry, imetal, &my_chemistry->use_dust_density_field, &my_chemistry->metal_chemistry,
- &my_chemistry->metal_abundances, &my_chemistry->dust_species, &my_chemistry->multi_metals, &my_chemistry->grain_growth, &my_chemistry->dust_sublimation, &factor,
- &my_fields->grid_start[0], &my_fields->grid_end[0], &my_fields->grid_start[1], &my_fields->grid_end[1], &my_fields->grid_start[2], &my_fields->grid_end[2], &my_fields->grid_dimension[0], &my_fields->grid_dimension[1], &my_fields->grid_dimension[2],
- my_fields->density, my_fields->e_density, my_fields->HI_density, my_fields->HII_density, my_fields->HeI_density, my_fields->HeII_density, my_fields->HeIII_density,
- my_fields->HM_density, my_fields->H2I_density, my_fields->H2II_density, my_fields->DI_density, my_fields->DII_density, my_fields->HDI_density, my_fields->DM_density, my_fields->HDII_density, my_fields->HeHII_density,
- my_fields->metal_density, my_fields->dust_density,
- my_fields->CI_density, my_fields->CII_density, my_fields->CO_density, my_fields->CO2_density,
- my_fields->OI_density, my_fields->OH_density, my_fields->H2O_density, my_fields->O2_density,
- my_fields->SiI_density, my_fields->SiOI_density, my_fields->SiO2I_density,
- my_fields->CH_density, my_fields->CH2_density, my_fields->COII_density, my_fields->OII_density,
- my_fields->OHII_density, my_fields->H2OII_density, my_fields->H3OII_density, my_fields->O2II_density,
- my_fields->Mg_density, my_fields->Al_density, my_fields->S_density, my_fields->Fe_density,
- my_fields->SiM_dust_density, my_fields->FeM_dust_density, my_fields->Mg2SiO4_dust_density, my_fields->MgSiO3_dust_density, my_fields->Fe3O4_dust_density,
- my_fields->AC_dust_density, my_fields->SiO2_dust_density, my_fields->MgO_dust_density, my_fields->FeS_dust_density, my_fields->Al2O3_dust_density,
- my_fields->ref_org_dust_density, my_fields->vol_org_dust_density, my_fields->H2O_ice_dust_density,
- my_fields->local_ISM_metal_density, my_fields->ccsn13_metal_density, my_fields->ccsn20_metal_density, my_fields->ccsn25_metal_density, my_fields->ccsn30_metal_density,
- my_fields->fsn13_metal_density, my_fields->fsn15_metal_density, my_fields->fsn50_metal_density, my_fields->fsn80_metal_density,
- my_fields->pisn170_metal_density, my_fields->pisn200_metal_density, my_fields->y19_metal_density);
- }
- // 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 + my_fields->grid_start[2]+1;
- j = grackle::impl::mod(t,dj) + my_fields->grid_start[1]+1;
- for (i = my_fields->grid_start[0] + 1; i<=(my_fields->grid_end[0] + 1); i++) {
- itmask[i-1] = MASK_TRUE;
- }
- // Compute the cooling rate// 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 = my_fields->grid_start[0] + 1; i<=(my_fields->grid_end[0] + 1); i++) {
- energy = std::fmax(p2d[i-1]/(my_chemistry->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 (my_units->comoving_coordinates == 1) {
- factor = (gr_float)(std::pow(my_units->a_value,3) );
- FORTRAN_NAME(scale_fields_g)(
- &my_chemistry->primordial_chemistry, imetal, &my_chemistry->use_dust_density_field, &my_chemistry->metal_chemistry,
- &my_chemistry->metal_abundances, &my_chemistry->dust_species, &my_chemistry->multi_metals, &my_chemistry->grain_growth, &my_chemistry->dust_sublimation, &factor,
- &my_fields->grid_start[0], &my_fields->grid_end[0], &my_fields->grid_start[1], &my_fields->grid_end[1], &my_fields->grid_start[2], &my_fields->grid_end[2], &my_fields->grid_dimension[0], &my_fields->grid_dimension[1], &my_fields->grid_dimension[2],
- my_fields->density, my_fields->e_density, my_fields->HI_density, my_fields->HII_density, my_fields->HeI_density, my_fields->HeII_density, my_fields->HeIII_density,
- my_fields->HM_density, my_fields->H2I_density, my_fields->H2II_density, my_fields->DI_density, my_fields->DII_density, my_fields->HDI_density, my_fields->DM_density, my_fields->HDII_density, my_fields->HeHII_density,
- my_fields->metal_density, my_fields->dust_density,
- my_fields->CI_density, my_fields->CII_density, my_fields->CO_density, my_fields->CO2_density,
- my_fields->OI_density, my_fields->OH_density, my_fields->H2O_density, my_fields->O2_density,
- my_fields->SiI_density, my_fields->SiOI_density, my_fields->SiO2I_density,
- my_fields->CH_density, my_fields->CH2_density, my_fields->COII_density, my_fields->OII_density,
- my_fields->OHII_density, my_fields->H2OII_density, my_fields->H3OII_density, my_fields->O2II_density,
- my_fields->Mg_density, my_fields->Al_density, my_fields->S_density, my_fields->Fe_density,
- my_fields->SiM_dust_density, my_fields->FeM_dust_density, my_fields->Mg2SiO4_dust_density, my_fields->MgSiO3_dust_density, my_fields->Fe3O4_dust_density,
- my_fields->AC_dust_density, my_fields->SiO2_dust_density, my_fields->MgO_dust_density, my_fields->FeS_dust_density, my_fields->Al2O3_dust_density,
- my_fields->ref_org_dust_density, my_fields->vol_org_dust_density, my_fields->H2O_ice_dust_density,
- my_fields->local_ISM_metal_density, my_fields->ccsn13_metal_density, my_fields->ccsn20_metal_density, my_fields->ccsn25_metal_density, my_fields->ccsn30_metal_density,
- my_fields->fsn13_metal_density, my_fields->fsn15_metal_density, my_fields->fsn50_metal_density, my_fields->fsn80_metal_density,
- my_fields->pisn170_metal_density, my_fields->pisn200_metal_density, my_fields->y19_metal_density);
- }
- return;
- }
- } // extern "C"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement