Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ########################################################################
- #
- # Python Grackle wrapper
- #
- #
- # Copyright (c) 2013, Enzo/Grackle Development Team.
- #
- # Distributed under the terms of the Enzo Public Licence.
- #
- # The full license is in the file LICENSE, distributed with this
- # software.
- ########################################################################
- from pygrackle.utilities.physical_constants import \
- boltzmann_constant_cgs, \
- mass_hydrogen_cgs
- from .grackle_defs cimport *
- import numpy as np
- cimport numpy as np
- cdef void _fetch_struct_ptrs(object chem_data, c_chemistry_data **chem_ptr,
- c_chemistry_data_storage **rates_ptr,
- c_code_units **units_ptr) except *:
- # annotating this with `except *` is essential for proper exception
- # handling if one of the implicit type checks fails
- cdef _wrapped_c_chemistry_data chemistry_wrapper = chem_data.data
- chem_ptr[0] = &chemistry_wrapper.data
- cdef _chemistry_storage_and_units other_wrapper = chem_data.other
- rates_ptr[0] = &other_wrapper.rates
- units_ptr[0] = &other_wrapper.units
- class chemistry_data:
- # this is not an extension type to simplify __setattr__
- def __init__(self):
- self.data = _wrapped_c_chemistry_data()
- self.other = _chemistry_storage_and_units()
- def __getattribute__(self, name):
- # This has been implemented to maintain backwards compatibility.
- # first check if the name is contained within self.data or self.other
- try:
- return self.data[name]
- except:
- pass
- try:
- return getattr(self.other, name)
- except:
- pass
- # fall back to the default implementation
- return super().__getattribute__(name)
- def __setattr__(self, name, value):
- # This has been implemented to maintain backwards compatibility.
- # first check if the name is contained within self.data or self.other
- try:
- self.data[name] = value
- return
- except KeyError: # raise other Exceptions
- pass
- try:
- setattr(self, name, value)
- except AttributeError: # raise other Exceptions
- pass
- # fall back to the default implementation
- return super().__setattr__(name,value)
- def initialize(self):
- cdef c_chemistry_data *chem_ptr = NULL
- cdef c_chemistry_data_storage *rates_ptr = NULL
- cdef c_code_units *units_ptr = NULL
- _fetch_struct_ptrs(self, &chem_ptr, &rates_ptr, &units_ptr)
- ret = _initialize_chemistry_data(chem_ptr, rates_ptr, units_ptr)
- if ret is None:
- raise RuntimeError("Error initializing chemistry")
- return ret
- def set_velocity_units(self):
- self.other.set_velocity_units()
- def get_velocity_units(self):
- return self.other.get_velocity_units()
- cdef class _chemistry_storage_and_units:
- cdef c_chemistry_data_storage rates
- cdef c_code_units units
- def set_velocity_units(self):
- set_velocity_units(&self.units)
- def get_velocity_units(self):
- return get_velocity_units(&self.units)
- property k1:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k1)
- return np.asarray(memview)
- property k2:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k2)
- return np.asarray(memview)
- property k3:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k3)
- return np.asarray(memview)
- property k4:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k4)
- return np.asarray(memview)
- property k5:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k5)
- return np.asarray(memview)
- property k6:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k6)
- return np.asarray(memview)
- property k7:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k7)
- return np.asarray(memview)
- property k8:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k8)
- return np.asarray(memview)
- property k9:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k9)
- return np.asarray(memview)
- property k10:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k10)
- return np.asarray(memview)
- property k11:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k11)
- return np.asarray(memview)
- property k12:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k12)
- return np.asarray(memview)
- property k13:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k13)
- return np.asarray(memview)
- property k14:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k14)
- return np.asarray(memview)
- property k15:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k15)
- return np.asarray(memview)
- property k16:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k16)
- return np.asarray(memview)
- property k17:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k17)
- return np.asarray(memview)
- property k18:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k18)
- return np.asarray(memview)
- property k19:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k19)
- return np.asarray(memview)
- property k20:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k20)
- return np.asarray(memview)
- property k21:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k21)
- return np.asarray(memview)
- property k22:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k22)
- return np.asarray(memview)
- property k23:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k23)
- return np.asarray(memview)
- property k13dd:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins*14]>(<double*> self.rates.k13dd)
- return np.asarray(memview)
- property k24:
- def __get__(self):
- return self.rates.k24
- def __set__(self, val):
- self.rates.k24 = val
- property k25:
- def __get__(self):
- return self.rates.k25
- def __set__(self, val):
- self.rates.k25 = val
- property k26:
- def __get__(self):
- return self.rates.k26
- def __set__(self, val):
- self.rates.k26 = val
- property k27:
- def __get__(self):
- return self.rates.k27
- def __set__(self, val):
- self.rates.k27 = val
- property k28:
- def __get__(self):
- return self.rates.k28
- def __set__(self, val):
- self.rates.k28 = val
- property k29:
- def __get__(self):
- return self.rates.k29
- def __set__(self, val):
- self.rates.k29 = val
- property k30:
- def __get__(self):
- return self.rates.k30
- def __set__(self, val):
- self.rates.k30 = val
- property k31:
- def __get__(self):
- return self.rates.k31
- def __set__(self, val):
- self.rates.k31 = val
- property k50:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k50)
- return np.asarray(memview)
- property k51:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k51)
- return np.asarray(memview)
- property k52:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k52)
- return np.asarray(memview)
- property k53:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k53)
- return np.asarray(memview)
- property k54:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k54)
- return np.asarray(memview)
- property k55:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k55)
- return np.asarray(memview)
- property k56:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k56)
- return np.asarray(memview)
- property k57:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k57)
- return np.asarray(memview)
- property k58:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.k58)
- return np.asarray(memview)
- property h2dust:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins*self.NumberOfDustTemperatureBins]>(<double*> self.rates.h2dust)
- return np.asarray(memview)
- property n_cr_n:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.n_cr_n)
- return np.asarray(memview)
- property n_cr_d1:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.n_cr_d1)
- return np.asarray(memview)
- property n_cr_d2:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.n_cr_d2)
- return np.asarray(memview)
- property ceHI:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.ceHI)
- return np.asarray(memview)
- property ceHeI:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.ceHeI)
- return np.asarray(memview)
- property ceHeII:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.ceHeII)
- return np.asarray(memview)
- property ciHI:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.ciHI)
- return np.asarray(memview)
- property ciHeI:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.ciHeI)
- return np.asarray(memview)
- property ciHeIS:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.ciHeIS)
- return np.asarray(memview)
- property ciHeII:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.ciHeII)
- return np.asarray(memview)
- property reHII:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.reHII)
- return np.asarray(memview)
- property reHeII1:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.reHeII1)
- return np.asarray(memview)
- property reHeII2:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.reHeII2)
- return np.asarray(memview)
- property reHeIII:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.reHeIII)
- return np.asarray(memview)
- property brem:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.brem)
- return np.asarray(memview)
- property comp:
- def __get__(self):
- return self.rates.comp
- def __set__(self, val):
- self.rates.comp = val
- property comp_xray:
- def __get__(self):
- return self.rates.comp_xray
- def __set__(self, val):
- self.rates.comp_xray = val
- property temp_xray:
- def __get__(self):
- return self.rates.temp_xray
- def __set__(self, val):
- self.rates.temp_xray = val
- property piHI:
- def __get__(self):
- return self.rates.piHI
- def __set__(self, val):
- self.rates.piHI = val
- property piHeI:
- def __get__(self):
- return self.rates.piHeI
- def __set__(self, val):
- self.rates.piHeI = val
- property piHeII:
- def __get__(self):
- return self.rates.piHeII
- def __set__(self, val):
- self.rates.piHeII = val
- property crsHI:
- def __get__(self):
- return self.rates.crsHI
- def __set__(self, val):
- self.rates.crsHI = val
- property crsHeI:
- def __get__(self):
- return self.rates.crsHeI
- def __set__(self, val):
- self.rates.crsHeI = val
- property crsHeII:
- def __get__(self):
- return self.rates.crsHeII
- def __set__(self, val):
- self.rates.crsHeII = val
- property hyd01k:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.hyd01k)
- return np.asarray(memview)
- property h2k01:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.h2k01)
- return np.asarray(memview)
- property vibh:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.vibh)
- return np.asarray(memview)
- property roth:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.roth)
- return np.asarray(memview)
- property rotl:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.rotl)
- return np.asarray(memview)
- property GP99LowDensityLimit:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.GP99LowDensityLimit)
- return np.asarray(memview)
- property GP99HighDensityLimit:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.GP99HighDensityLimit)
- return np.asarray(memview)
- property GAHI:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.GAHI)
- return np.asarray(memview)
- property GAH2:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.GAH2)
- return np.asarray(memview)
- property GAHe:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.GAHe)
- return np.asarray(memview)
- property GAHp:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.GAHp)
- return np.asarray(memview)
- property GAel:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.GAel)
- return np.asarray(memview)
- property H2LTE:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.H2LTE)
- return np.asarray(memview)
- property HDlte:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.HDlte)
- return np.asarray(memview)
- property HDlow:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.HDlow)
- return np.asarray(memview)
- property cieco:
- def __get__(self):
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.cieco)
- return np.asarray(memview)
- property gammah:
- def __get__(self):
- return self.rates.gammah
- def __set__(self, val):
- self.rates.gammah = val
- property regr:
- def __get__(self):
- if not self.dust_chemistry and not self.h2_on_dust:
- return 0
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.regr)
- return np.asarray(memview)
- property gamma_isrf:
- def __get__(self):
- return self.rates.gamma_isrf
- def __set__(self, val):
- self.rates.gamma_isrf = val
- property gas_grain:
- def __get__(self):
- if not self.dust_chemistry and not self.h2_on_dust:
- return 0
- cdef double[:] memview = <double[:self.NumberOfTemperatureBins]>(<double*> self.rates.gas_grain)
- return np.asarray(memview)
- property comoving_coordinates:
- def __get__(self):
- return self.units.comoving_coordinates
- def __set__(self, val):
- self.units.comoving_coordinates = val
- property density_units:
- def __get__(self):
- return self.units.density_units
- def __set__(self, val):
- self.units.density_units = val
- property length_units:
- def __get__(self):
- return self.units.length_units
- def __set__(self, val):
- self.units.length_units = val
- property time_units:
- def __get__(self):
- return self.units.time_units
- def __set__(self, val):
- self.units.time_units = val
- property velocity_units:
- def __get__(self):
- return self.units.velocity_units
- def __set__(self, val):
- self.units.velocity_units = val
- property a_units:
- def __get__(self):
- return self.units.a_units
- def __set__(self, val):
- self.units.a_units = val
- property a_value:
- def __get__(self):
- return self.units.a_value
- def __set__(self, val):
- self.units.a_value = val
- property temperature_units:
- def __get__(self):
- return get_temperature_units(&self.units)
- property cooling_units:
- def __get__(self):
- tbase1 = self.time_units
- if self.comoving_coordinates:
- xbase1 = self.length_units / \
- (self.a_value * self.a_units)
- dbase1 = self.density_units * \
- (self.a_value * self.a_units)**3
- else:
- xbase1 = self.length_units / \
- self.a_units
- dbase1 = self.density_units * \
- self.a_units**3
- coolunit = (self.a_units**5 * xbase1**2 *
- mass_hydrogen_cgs**2) / (tbase1**3 * dbase1)
- return coolunit
- property energy_units:
- def __get__(self):
- return self.velocity_units**2
- property pressure_units:
- def __get__(self):
- return self.density_units * self.energy_units
- cdef gr_float* get_field(fc, name):
- cdef np.ndarray rv = fc.get(name, None)
- if rv is None:
- return NULL
- else:
- return <gr_float *> rv.data
- def solve_chemistry(fc, my_dt):
- cdef double dt_value = <double> my_dt
- cdef c_chemistry_data *chem_ptr = NULL
- cdef c_chemistry_data_storage *rates_ptr = NULL
- cdef c_code_units *units_ptr = NULL
- _fetch_struct_ptrs(fc.chemistry_data, &chem_ptr, &rates_ptr, &units_ptr)
- cdef int grid_dimension
- grid_dimension = fc["density"].shape[0]
- cdef np.ndarray ref_gs, ref_ge
- ref_gs = np.zeros(3, dtype="int32")
- ref_ge = np.zeros(3, dtype="int32")
- ref_ge[0] = grid_dimension -1
- cdef c_field_data my_fields
- my_fields.grid_rank = 1
- my_fields.grid_dimension = &grid_dimension
- my_fields.grid_start = <int *> ref_gs.data
- my_fields.grid_end = <int *> ref_ge.data
- my_fields.density = get_field(fc, "density")
- my_fields.internal_energy = get_field(fc, "energy")
- my_fields.HI_density = get_field(fc, "HI")
- my_fields.HII_density = get_field(fc, "HII")
- my_fields.HM_density = get_field(fc, "HM")
- my_fields.HeI_density = get_field(fc, "HeI")
- my_fields.HeII_density = get_field(fc, "HeII")
- my_fields.HeIII_density = get_field(fc, "HeIII")
- my_fields.H2I_density = get_field(fc, "H2I")
- my_fields.H2II_density = get_field(fc, "H2II")
- my_fields.DI_density = get_field(fc, "DI")
- my_fields.DII_density = get_field(fc, "DII")
- my_fields.HDI_density = get_field(fc, "HDI")
- my_fields.e_density = get_field(fc, "de")
- my_fields.metal_density = get_field(fc, "metal")
- my_fields.dust_density = get_field(fc, "dust")
- my_fields.RT_heating_rate = get_field(fc, "RT_heating_rate")
- my_fields.volumetric_heating_rate = get_field(fc, "volumetric_heating_rate")
- my_fields.specific_heating_rate = get_field(fc, "specific_heating_rate")
- c_local_solve_chemistry(
- chem_ptr,
- rates_ptr,
- units_ptr,
- &my_fields,
- my_dt)
- def calculate_cooling_time(fc):
- cdef c_chemistry_data *chem_ptr = NULL
- cdef c_chemistry_data_storage *rates_ptr = NULL
- cdef c_code_units *units_ptr = NULL
- _fetch_struct_ptrs(fc.chemistry_data, &chem_ptr, &rates_ptr, &units_ptr)
- cdef int grid_dimension
- grid_dimension = fc["density"].shape[0]
- cdef np.ndarray ref_gs, ref_ge
- ref_gs = np.zeros(3, dtype="int32")
- ref_ge = np.zeros(3, dtype="int32")
- ref_ge[0] = grid_dimension -1
- cdef c_field_data my_fields
- my_fields.grid_rank = 1
- my_fields.grid_dimension = &grid_dimension
- my_fields.grid_start = <int *> ref_gs.data
- my_fields.grid_end = <int *> ref_ge.data
- my_fields.density = get_field(fc, "density")
- my_fields.internal_energy = get_field(fc, "energy")
- my_fields.x_velocity = get_field(fc, "x-velocity")
- my_fields.y_velocity = get_field(fc, "y-velocity")
- my_fields.z_velocity = get_field(fc, "z-velocity")
- my_fields.HI_density = get_field(fc, "HI")
- my_fields.HII_density = get_field(fc, "HII")
- my_fields.HM_density = get_field(fc, "HM")
- my_fields.HeI_density = get_field(fc, "HeI")
- my_fields.HeII_density = get_field(fc, "HeII")
- my_fields.HeIII_density = get_field(fc, "HeIII")
- my_fields.H2I_density = get_field(fc, "H2I")
- my_fields.H2II_density = get_field(fc, "H2II")
- my_fields.DI_density = get_field(fc, "DI")
- my_fields.DII_density = get_field(fc, "DII")
- my_fields.HDI_density = get_field(fc, "HDI")
- my_fields.e_density = get_field(fc, "de")
- my_fields.metal_density = get_field(fc, "metal")
- my_fields.dust_density = get_field(fc, "dust")
- my_fields.RT_heating_rate = get_field(fc, "RT_heating_rate")
- my_fields.volumetric_heating_rate = get_field(fc, "volumetric_heating_rate")
- my_fields.specific_heating_rate = get_field(fc, "specific_heating_rate")
- cdef gr_float *cooling_time = get_field(fc, "cooling_time")
- c_local_calculate_cooling_time(
- chem_ptr,
- rates_ptr,
- units_ptr,
- &my_fields,
- cooling_time)
- def calculate_gamma(fc):
- cdef c_chemistry_data *chem_ptr = NULL
- cdef c_chemistry_data_storage *rates_ptr = NULL
- cdef c_code_units *units_ptr = NULL
- _fetch_struct_ptrs(fc.chemistry_data, &chem_ptr, &rates_ptr, &units_ptr)
- cdef int grid_dimension
- grid_dimension = fc["density"].shape[0]
- cdef np.ndarray ref_gs, ref_ge
- ref_gs = np.zeros(3, dtype="int32")
- ref_ge = np.zeros(3, dtype="int32")
- ref_ge[0] = grid_dimension -1
- cdef c_field_data my_fields
- my_fields.grid_rank = 1
- my_fields.grid_dimension = &grid_dimension
- my_fields.grid_start = <int *> ref_gs.data
- my_fields.grid_end = <int *> ref_ge.data
- my_fields.density = get_field(fc, "density")
- my_fields.internal_energy = get_field(fc, "energy")
- my_fields.x_velocity = get_field(fc, "x-velocity")
- my_fields.y_velocity = get_field(fc, "y-velocity")
- my_fields.z_velocity = get_field(fc, "z-velocity")
- my_fields.HI_density = get_field(fc, "HI")
- my_fields.HII_density = get_field(fc, "HII")
- my_fields.HM_density = get_field(fc, "HM")
- my_fields.HeI_density = get_field(fc, "HeI")
- my_fields.HeII_density = get_field(fc, "HeII")
- my_fields.HeIII_density = get_field(fc, "HeIII")
- my_fields.H2I_density = get_field(fc, "H2I")
- my_fields.H2II_density = get_field(fc, "H2II")
- my_fields.DI_density = get_field(fc, "DI")
- my_fields.DII_density = get_field(fc, "DII")
- my_fields.HDI_density = get_field(fc, "HDI")
- my_fields.e_density = get_field(fc, "de")
- my_fields.metal_density = get_field(fc, "metal")
- my_fields.dust_density = get_field(fc, "dust")
- my_fields.RT_heating_rate = get_field(fc, "RT_heating_rate")
- my_fields.volumetric_heating_rate = get_field(fc, "volumetric_heating_rate")
- my_fields.specific_heating_rate = get_field(fc, "specific_heating_rate")
- cdef gr_float *gamma = get_field(fc, "gamma")
- c_local_calculate_gamma(
- chem_ptr,
- rates_ptr,
- units_ptr,
- &my_fields,
- gamma)
- def calculate_pressure(fc):
- cdef c_chemistry_data *chem_ptr = NULL
- cdef c_chemistry_data_storage *rates_ptr = NULL
- cdef c_code_units *units_ptr = NULL
- _fetch_struct_ptrs(fc.chemistry_data, &chem_ptr, &rates_ptr, &units_ptr)
- cdef int grid_dimension
- grid_dimension = fc["density"].shape[0]
- cdef np.ndarray ref_gs, ref_ge
- ref_gs = np.zeros(3, dtype="int32")
- ref_ge = np.zeros(3, dtype="int32")
- ref_ge[0] = grid_dimension -1
- cdef c_field_data my_fields
- my_fields.grid_rank = 1
- my_fields.grid_dimension = &grid_dimension
- my_fields.grid_start = <int *> ref_gs.data
- my_fields.grid_end = <int *> ref_ge.data
- my_fields.density = get_field(fc, "density")
- my_fields.internal_energy = get_field(fc, "energy")
- my_fields.x_velocity = get_field(fc, "x-velocity")
- my_fields.y_velocity = get_field(fc, "y-velocity")
- my_fields.z_velocity = get_field(fc, "z-velocity")
- my_fields.HI_density = get_field(fc, "HI")
- my_fields.HII_density = get_field(fc, "HII")
- my_fields.HM_density = get_field(fc, "HM")
- my_fields.HeI_density = get_field(fc, "HeI")
- my_fields.HeII_density = get_field(fc, "HeII")
- my_fields.HeIII_density = get_field(fc, "HeIII")
- my_fields.H2I_density = get_field(fc, "H2I")
- my_fields.H2II_density = get_field(fc, "H2II")
- my_fields.DI_density = get_field(fc, "DI")
- my_fields.DII_density = get_field(fc, "DII")
- my_fields.HDI_density = get_field(fc, "HDI")
- my_fields.e_density = get_field(fc, "de")
- my_fields.metal_density = get_field(fc, "metal")
- my_fields.dust_density = get_field(fc, "dust")
- my_fields.RT_heating_rate = get_field(fc, "RT_heating_rate")
- my_fields.volumetric_heating_rate = get_field(fc, "volumetric_heating_rate")
- my_fields.specific_heating_rate = get_field(fc, "specific_heating_rate")
- cdef gr_float *pressure = get_field(fc, "pressure")
- c_local_calculate_pressure(
- chem_ptr,
- rates_ptr,
- units_ptr,
- &my_fields,
- pressure)
- def calculate_temperature(fc):
- cdef c_chemistry_data *chem_ptr = NULL
- cdef c_chemistry_data_storage *rates_ptr = NULL
- cdef c_code_units *units_ptr = NULL
- _fetch_struct_ptrs(fc.chemistry_data, &chem_ptr, &rates_ptr, &units_ptr)
- cdef int grid_dimension
- grid_dimension = fc["density"].shape[0]
- cdef np.ndarray ref_gs, ref_ge
- ref_gs = np.zeros(3, dtype="int32")
- ref_ge = np.zeros(3, dtype="int32")
- ref_ge[0] = grid_dimension -1
- cdef c_field_data my_fields
- my_fields.grid_rank = 1
- my_fields.grid_dimension = &grid_dimension
- my_fields.grid_start = <int *> ref_gs.data
- my_fields.grid_end = <int *> ref_ge.data
- my_fields.density = get_field(fc, "density")
- my_fields.internal_energy = get_field(fc, "energy")
- my_fields.x_velocity = get_field(fc, "x-velocity")
- my_fields.y_velocity = get_field(fc, "y-velocity")
- my_fields.z_velocity = get_field(fc, "z-velocity")
- my_fields.HI_density = get_field(fc, "HI")
- my_fields.HII_density = get_field(fc, "HII")
- my_fields.HM_density = get_field(fc, "HM")
- my_fields.HeI_density = get_field(fc, "HeI")
- my_fields.HeII_density = get_field(fc, "HeII")
- my_fields.HeIII_density = get_field(fc, "HeIII")
- my_fields.H2I_density = get_field(fc, "H2I")
- my_fields.H2II_density = get_field(fc, "H2II")
- my_fields.DI_density = get_field(fc, "DI")
- my_fields.DII_density = get_field(fc, "DII")
- my_fields.HDI_density = get_field(fc, "HDI")
- my_fields.e_density = get_field(fc, "de")
- my_fields.metal_density = get_field(fc, "metal")
- my_fields.dust_density = get_field(fc, "dust")
- my_fields.RT_heating_rate = get_field(fc, "RT_heating_rate")
- my_fields.volumetric_heating_rate = get_field(fc, "volumetric_heating_rate")
- my_fields.specific_heating_rate = get_field(fc, "specific_heating_rate")
- cdef gr_float *temperature = get_field(fc, "temperature")
- c_local_calculate_temperature(
- chem_ptr,
- rates_ptr,
- units_ptr,
- &my_fields,
- temperature)
- def calculate_dust_temperature(fc):
- cdef c_chemistry_data *chem_ptr = NULL
- cdef c_chemistry_data_storage *rates_ptr = NULL
- cdef c_code_units *units_ptr = NULL
- _fetch_struct_ptrs(fc.chemistry_data, &chem_ptr, &rates_ptr, &units_ptr)
- cdef int grid_dimension
- grid_dimension = fc["density"].shape[0]
- cdef np.ndarray ref_gs, ref_ge
- ref_gs = np.zeros(3, dtype="int32")
- ref_ge = np.zeros(3, dtype="int32")
- ref_ge[0] = grid_dimension -1
- cdef c_field_data my_fields
- my_fields.grid_rank = 1
- my_fields.grid_dimension = &grid_dimension
- my_fields.grid_start = <int *> ref_gs.data
- my_fields.grid_end = <int *> ref_ge.data
- my_fields.density = get_field(fc, "density")
- my_fields.internal_energy = get_field(fc, "energy")
- my_fields.x_velocity = get_field(fc, "x-velocity")
- my_fields.y_velocity = get_field(fc, "y-velocity")
- my_fields.z_velocity = get_field(fc, "z-velocity")
- my_fields.HI_density = get_field(fc, "HI")
- my_fields.HII_density = get_field(fc, "HII")
- my_fields.HM_density = get_field(fc, "HM")
- my_fields.HeI_density = get_field(fc, "HeI")
- my_fields.HeII_density = get_field(fc, "HeII")
- my_fields.HeIII_density = get_field(fc, "HeIII")
- my_fields.H2I_density = get_field(fc, "H2I")
- my_fields.H2II_density = get_field(fc, "H2II")
- my_fields.DI_density = get_field(fc, "DI")
- my_fields.DII_density = get_field(fc, "DII")
- my_fields.HDI_density = get_field(fc, "HDI")
- my_fields.e_density = get_field(fc, "de")
- my_fields.metal_density = get_field(fc, "metal")
- my_fields.dust_density = get_field(fc, "dust")
- my_fields.RT_heating_rate = get_field(fc, "RT_heating_rate")
- my_fields.volumetric_heating_rate = get_field(fc, "volumetric_heating_rate")
- my_fields.specific_heating_rate = get_field(fc, "specific_heating_rate")
- cdef gr_float *dust_temperature = get_field(fc, "dust_temperature")
- c_local_calculate_dust_temperature(
- chem_ptr,
- rates_ptr,
- units_ptr,
- &my_fields,
- dust_temperature)
- def get_grackle_version():
- cdef c_grackle_version version_struct = c_get_grackle_version()
- # all members of version_struct are string literals (i.e. don't call free)
- return {"version" : version_struct.version.decode('UTF-8'),
- "branch" : version_struct.branch.decode('UTF-8'),
- "revision" : version_struct.revision.decode('UTF-8')}
- cdef list _get_parameter_name_list(const char*(*get_param)(size_t)):
- # the arg should be param_name_int, param_name_double, or param_name_string
- cdef list out = []
- cdef const char* tmp
- cdef size_t i = 0
- while True:
- tmp = get_param(i)
- if tmp is NULL:
- return out
- else:
- out.append(tmp.decode('UTF-8'))
- i+=1
- cdef class _wrapped_c_chemistry_data:
- cdef c_chemistry_data data
- cdef dict _string_buffers
- # Each field in data that holds a string value, may have a corresponding
- # entry in _string_buffers (the key matches the name of the field).
- #
- # - if _string_buffers DOESN'T have an entry for <field>, then data.<field>
- # must currently store a default value. Depending on the specifics of
- # <field>, data.<field> holds either a NULL pointer or a pointer to a
- # string literal (stored in the C library).
- #
- # - if _string_buffers DOES have an entry for <field>, then data.<field>
- # points to the buffer of the Python bytes object given by
- # _string_buffers["<field>"]. Note that the string is always terminated
- # by character (the Python interface just hides if from users)
- def __cinit__(self):
- self.data = _set_default_chemistry_parameters()
- self._string_buffers = {}
- def _access_struct_field(self, key, val = None):
- """
- Return a copy of the value of the field stored in the wrapped struct.
- When val is not None, this function updates the stored value first (the
- returned value is effectively a copy of val after some type coercion)
- """
- cdef c_chemistry_data* data_ptr = &self.data
- # determine whether the field needs to be updated
- update_field = (val is not None)
- # coerce key to a bytes object and then get the analogous null
- # terminated string to pass to the C functions
- coerced_key = key.encode('ascii') if isinstance(key, str) else key
- cdef char* _key = coerced_key # _key's lifetime is tied to coerced_key
- # handle the case where key is an integer
- cdef int* int_p = local_chemistry_data_access_int(data_ptr, _key)
- if int_p is not NULL:
- if update_field:
- coerced_val = int(<int?>val)
- if coerced_val != val: # prevent invalid assignment of a
- # non-integer floating point
- raise TypeError("must be convertable to an int without a "
- "loss of information.")
- int_p[0] = <int>coerced_val
- return int(int_p[0])
- # handle the case where key is a double
- cdef double* dbl_p = local_chemistry_data_access_double(data_ptr, _key)
- if dbl_p is not NULL:
- if update_field:
- dbl_p[0] = <double?>val # <double?> cast performs type checking
- return float(dbl_p[0])
- # handle the case where key is a string
- cdef char* tmp = NULL
- cdef char** str_p = local_chemistry_data_access_string(data_ptr, _key)
- if (str_p is not NULL): # this case requires additional care
- if update_field:
- # coerce val to a bytes object & store in self._string_buffers
- if isinstance(val, str):
- self._string_buffers[key] = bytes(val.encode('ascii'))
- elif isinstance(val, (bytes,bytearray)):
- self._string_buffers[key] = bytes(val)
- else:
- raise TypeError(type(val))
- assert b'\0' not in self._string_buffers[key] # sanity check
- tmp = <bytes>self._string_buffers[key]
- str_p[0] = tmp
- elif (str_p[0] is NULL):
- # handle the case where we are accessing a default field value
- # and it was initialized to a NULL pointer
- return None
- # for simplicity, just return a new copy of the contained string.
- # (this correctly handles the case where str_p[0] holds a pointer
- # to a string literal managed by the c library)
- return bytes(str_p[0])
- raise KeyError(key) # the key is not recognized
- def __getitem__(self, key):
- return self._access_struct_field(key, val = None)
- def __setitem__(self, key, value):
- if value is None:
- raise ValueError("Members of c_chemistry_data are not allowed to "
- "be assigned values of None")
- self._access_struct_field(key, val = value)
- @staticmethod
- def int_keys(): return _get_parameter_name_list(param_name_int)
- @staticmethod
- def double_keys(): return _get_parameter_name_list(param_name_double)
- @staticmethod
- def string_keys(): return _get_parameter_name_list(param_name_string)
- def __iter__(self):
- return iter(self.int_keys() + self.double_keys() + self.string_keys())
- def __len__(self):
- return (len(self.int_keys()) + len(self.double_keys()) +
- len(self.string_keys()))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement