diff --git a/src/Makefile.am b/src/Makefile.am index 8287ecc320b405fd63bed8b322a4c56dc00e866a..df1ed0a670892ecd2a41b229a8707ffb993a7cc3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -117,7 +117,6 @@ nobase_noinst_HEADERS = align.h approx_math.h atomic.h barrier.h cycle.h error.h cooling/const_du/cooling.h cooling/const_du/cooling_struct.h \ cooling/const_lambda/cooling.h cooling/const_lambda/cooling_struct.h \ cooling/grackle/cooling.h cooling/grackle/cooling_struct.h \ - cooling/grackle/grackle_wrapper.h \ memswap.h dump.h logger.h diff --git a/src/cooling/grackle/cooling.h b/src/cooling/grackle/cooling.h index 9147aad6d5189741d747a4ee4d4feb9cfb06b5b3..5e3d3b23939465f47e864d00b3098c5468174fc9 100644 --- a/src/cooling/grackle/cooling.h +++ b/src/cooling/grackle/cooling.h @@ -39,7 +39,7 @@ /* need to rework (and check) code if changed */ #define GRACKLE_NPART 1 - +#define GRACKLE_RANK 3 /** * @brief Sets the cooling properties of the (x-)particles to a valid start @@ -75,6 +75,11 @@ __attribute__((always_inline))INLINE static void cooling_print_backend( const struct cooling_function_data* cooling) { message("Cooling function is 'Grackle'."); + message("Using Grackle = %i", grackle_data->use_grackle); + message("Chemical network = %i", grackle_data->primordial_chemistry); + message("Radiative cooling = %i", grackle_data->with_radiative_cooling); + message("Metal cooling = %i", grackle_data->metal_cooling); + message("CloudyTable = %s", cooling->cloudy_table); message("UVbackground = %d", cooling->uv_background); @@ -83,12 +88,14 @@ __attribute__((always_inline))INLINE static void cooling_print_backend( cooling->density_self_shielding); message("Units:"); message("\tComoving = %i", cooling->units.comoving_coordinates); - message("\tLength = %g", cooling->units.length_units); - message("\tDensity = %g", cooling->units.density_units); + message("\tLength = %g", cooling->units.length_units); + message("\tDensity = %g", cooling->units.density_units); message("\tTime = %g", cooling->units.time_units); - message("\tScale Factor = %g", cooling->units.a_units); + message("\tScale Factor = %g", cooling->units.a_units); + } + /** * @brief Compute the cooling rate * @@ -106,48 +113,77 @@ __attribute__((always_inline)) INLINE static double cooling_rate( const struct cooling_function_data* restrict cooling, struct part* restrict p, float dt) { + cooling_print_backend(cooling); + /* set current time */ - float scale_factor = 1.; + code_units units = cooling->units; if (cooling->redshift == -1) error("TODO time dependant redshift"); else - scale_factor = 1. / (1. + cooling->redshift); + units.a_value = 1. / (1. + cooling->redshift); - /* Get current internal energy (dt=0) */ - const double energy_before = hydro_get_internal_energy(p); - - /* Get current density */ - const float rho = hydro_get_density(p); - - /* 0.02041 (= 1 Zsun in Grackle v2.0, but = 1.5761 Zsun in - Grackle v2.1) */ - const double Z = 0.02041; + /* initialize data */ + grackle_field_data data; - /* create grackle struct */ - /* velocities */ - gr_float x_velocity[GRACKLE_NPART] = {0.0}; - gr_float y_velocity[GRACKLE_NPART] = {0.0}; - gr_float z_velocity[GRACKLE_NPART] = {0.0}; + /* set values */ + /* grid */ + int grid_dimension[GRACKLE_RANK] = {GRACKLE_NPART, 1, 1}; + int grid_start[GRACKLE_RANK] = {0, 0, 0}; + int grid_end[GRACKLE_RANK] = {GRACKLE_NPART - 1, 0, 0}; + + data.grid_rank = GRACKLE_RANK; + data.grid_dimension = grid_dimension; + data.grid_start = grid_start; + data.grid_end = grid_end; - /* particle data */ - gr_float density[GRACKLE_NPART] = {rho}; - gr_float metal_density[GRACKLE_NPART] = {Z * density[0]}; - gr_float energy[GRACKLE_NPART] = {energy_before}; + /* general particle data */ + gr_float density = hydro_get_density(p); + const double energy_before = hydro_get_internal_energy(p); + gr_float energy = energy_before; + gr_float vx = 0; + gr_float vy = 0; + gr_float vz = 0; + + data.density = &density; + data.internal_energy = &energy; + data.x_velocity = &vx; + data.y_velocity = &vy; + data.z_velocity = &vz; + + /* primordial chemistry >= 1 */ + data.HI_density = NULL; + data.HII_density = NULL; + data.HeI_density = NULL; + data.HeII_density = NULL; + data.HeIII_density = NULL; + data.e_density = NULL; + /* primordial chemistry >= 2 */ + data.HM_density = NULL; + data.H2I_density = NULL; + data.H2II_density = NULL; + /* primordial chemistry >= 3 */ + data.DI_density = NULL; + data.DII_density = NULL; + data.HDI_density = NULL; + /* metal cooling = 1 */ + const double Z = 0.02041; + gr_float metal_density = Z * density; - /* dimensions */ - int grid_dimension[3] = {GRACKLE_NPART, 0, 0}; - int grid_start[3] = {0, 0, 0}; - int grid_end[3] = {0, 0, 0}; + data.metal_density = &metal_density; + /* volumetric heating rate */ + data.volumetric_heating_rate = NULL; + /* specific heating rate */ + data.specific_heating_rate = NULL; + /* solve chemistry with table */ - code_units units = cooling->units; - if (solve_chemistry_table(&units, scale_factor, dt, GRACKLE_NPART, grid_dimension, - grid_start, grid_end, density, energy, x_velocity, - y_velocity, z_velocity, metal_density) == 0) { + if (solve_chemistry(&units, &data, dt) == 0) { error("Error in solve_chemistry."); } + message("Energy: %g, %g, %g", energy, energy_before, dt); - return (energy[0] - energy_before) / dt; + exit(1); + return (energy - energy_before) / dt; } /** @@ -244,28 +280,26 @@ __attribute__((always_inline))INLINE static void cooling_init_backend( cooling->units.time_units = us->UnitTime_in_cgs; cooling->units.velocity_units = cooling->units.a_units * cooling->units.length_units / cooling->units.time_units; - + + chemistry_data *chemistry = &cooling->chemistry; + /* Create a chemistry object for parameters and rate data. */ - if (set_default_chemistry_parameters() == 0) { + if (set_default_chemistry_parameters(chemistry) == 0) { error("Error in set_default_chemistry_parameters."); } // Set parameter values for chemistry. - grackle_data.use_grackle = 1; - grackle_data.with_radiative_cooling = 1; + chemistry->use_grackle = 1; + chemistry->with_radiative_cooling = 1; /* molecular network with H, He, D From Cloudy table */ - grackle_data.primordial_chemistry = 0; - grackle_data.metal_cooling = 1; // metal cooling on - grackle_data.UVbackground = cooling->uv_background; - grackle_data.grackle_data_file = cooling->cloudy_table; + chemistry->primordial_chemistry = 0; + chemistry->metal_cooling = 1; // metal cooling on + chemistry->UVbackground = cooling->uv_background; + chemistry->grackle_data_file = cooling->cloudy_table; - /* Initialize the chemistry object. - a_value is not the true initial a - This should get set before any computation */ - double a_value = 1.; - - if (initialize_chemistry_data(&cooling->units, a_value) == 0) { + /* Initialize the chemistry object. */ + if (initialize_chemistry_data(&cooling->units) == 0) { error("Error in initialize_chemistry_data."); } @@ -290,76 +324,4 @@ __attribute__((always_inline))INLINE static void cooling_init_backend( #endif } -/** - * @brief print data in cloudy struct - * - * Should only be used for debugging - */ -__attribute__((always_inline))INLINE static void cloudy_print_data(const cloudy_data c, const int print_mmw) { - long long N = c.data_size; - message("\t Data size: %lli", N); - message("\t Grid rank: %lli", c.grid_rank); - - char msg[200] = "\t Dimension: ("; - for (long long i = 0; i < c.grid_rank; i++) { - char tmp[200] = "%lli%s"; - if (i == c.grid_rank - 1) - sprintf(tmp, tmp, c.grid_dimension[i], ")"); - else - sprintf(tmp, tmp, c.grid_dimension[i], ", "); - - strcat(msg, tmp); - } - message("%s", msg); - - if (c.heating_data) - message("\t Heating: (%g, ..., %g)", c.heating_data[0], - c.heating_data[N - 1]); - if (c.cooling_data) - message("\t Cooling: (%g, ..., %g)", c.cooling_data[0], - c.cooling_data[N - 1]); - if (c.mmw_data && print_mmw) - message("\t Mean molecular weigth: (%g, ..., %g)", c.mmw_data[0], - c.mmw_data[N - 1]); -} - -/** - * @brief print data in grackle struct - * - * Should only be used for debugging - */ -__attribute__((always_inline))INLINE static void grackle_print_data() { - message("Grackle Data:"); - message("\t Data file: %s", grackle_data.grackle_data_file); - message("\t With grackle: %i", grackle_data.use_grackle); - message("\t With radiative cooling: %i", grackle_data.with_radiative_cooling); - message("\t With UV background: %i", grackle_data.UVbackground); - message("\t With primordial chemistry: %i", - grackle_data.primordial_chemistry); - message("\t Number temperature bins: %i", - grackle_data.NumberOfTemperatureBins); - message("\t T = (%g, ..., %g)", grackle_data.TemperatureStart, - grackle_data.TemperatureEnd); - - message("Primordial Cloudy"); - cloudy_print_data(grackle_data.cloudy_primordial, 1); - if (grackle_data.metal_cooling) { - message("Metal Cooling"); - cloudy_print_data(grackle_data.cloudy_metal, 0); - } - - message("\t Gamma: %g", grackle_data.Gamma); - - /* UVB */ - if (grackle_data.UVbackground && grackle_data.primordial_chemistry != 0) { - struct UVBtable uvb = grackle_data.UVbackground_table; - long long N = uvb.Nz; - message("\t UV Background"); - message("\t\t Redshift from %g to %g with %lli steps", uvb.zmin, uvb.zmax, - N); - message("\t\t z = (%g, ..., %g)", uvb.z[0], uvb.z[N - 1]); - } -} - - #endif /* SWIFT_COOLING_GRACKLE_H */ diff --git a/src/cooling/grackle/cooling_struct.h b/src/cooling/grackle/cooling_struct.h index 4dcb7c415c8bbf04faffeb130d981f98547c62ec..ddc07ed70e36e175b3535e1a48be3ff8349d363c 100644 --- a/src/cooling/grackle/cooling_struct.h +++ b/src/cooling/grackle/cooling_struct.h @@ -47,6 +47,8 @@ struct cooling_function_data { /* unit system */ code_units units; + /* grackle chemistry data */ + chemistry_data chemistry; }; /**