Source code for tardis.plasma.equilibrium.rates.photoionization_rates

from tardis.plasma.equilibrium.rates.photoionization_strengths import (
    AnalyticPhotoionizationCoeffSolver,
    EstimatedPhotoionizationCoeffSolver,
    SpontaneousRecombinationCoeffSolver,
)


[docs] class AnalyticPhotoionizationRateSolver: """Solve the photoionization and spontaneous recombination rates in the case where the radiation field is computed analytically. """ def __init__(self, photoionization_cross_sections): self.photoionization_cross_sections = photoionization_cross_sections self.spontaneous_recombination_rate_coeff_solver = ( SpontaneousRecombinationCoeffSolver( self.photoionization_cross_sections ) )
[docs] def compute_rates( self, photoionization_rate_coeff, stimulated_recombination_rate_coeff, spontaneous_recombination_rate_coeff, level_number_density, ion_number_density, electron_number_density, saha_factor, ): """Compute the photoionization and spontaneous recombination rates Parameters ---------- photoionization_rate_coeff : pd.DataFrame The photoionization rate coefficients for each transition. Columns are cells. stimulated_recombination_rate_coeff : pd.DataFrame The stimulated recombination rate coefficients for each transition. Columns are cells. spontaneous_recombination_rate_coeff : pd.DataFrame The spontaneous recombination rate coefficients for each transition. Columns are cells. level_number_density : pd.DataFrame The electron energy level number density. Columns are cells. ion_number_density : pd.DataFrame The ion number density. Columns are cells. electron_number_density : u.Quantity The free electron number density per cell. saha_factor : pd.DataFrame The LTE population factor. Columns are cells. Returns ------- pd.DataFrame Photoionization rate for each electron energy level. Columns are cells pd.DataFrame Spontaneous recombination rate for each electron energy level. Columns are cells """ photoionization_rate = ( photoionization_rate_coeff * level_number_density - saha_factor * stimulated_recombination_rate_coeff * ion_number_density * electron_number_density ) spontaneous_recombination_rate = ( saha_factor * spontaneous_recombination_rate_coeff * ion_number_density * electron_number_density ) return photoionization_rate, spontaneous_recombination_rate
[docs] def solve( self, dilute_blackbody_radiationfield_state, electron_energy_distribution, level_number_density, ion_number_density, saha_factor, ): """Solve the photoionization and spontaneous recombination rates in the case where the radiation field is not estimated. Parameters ---------- dilute_blackbody_radiationfield_state : DiluteBlackBodyRadiationFieldState A dilute black body radiation field state. electron_energy_distribution : ThermalElectronEnergyDistribution Electron properties. level_number_density : pd.DataFrame Electron energy level number density. Columns are cells. ion_number_density : pd.DataFrame Ion number density. Columns are cells. saha_factor : pd.DataFrame Saha factor: the LTE level number density divided by the LTE ion number density and the electron number density. Returns ------- pd.DataFrame Photoionization rate. Columns are cells. pd.DataFrame Spontaneous recombination rate. Columns are cells. """ photoionization_rate_coeff_solver = AnalyticPhotoionizationCoeffSolver( self.photoionization_cross_sections ) photoionization_rate_coeff, stimulated_recombination_rate_coeff = ( photoionization_rate_coeff_solver.solve( dilute_blackbody_radiationfield_state, electron_energy_distribution.temperature, ) ) spontaneous_recombination_rate_coeff = ( self.spontaneous_recombination_rate_coeff_solver.solve( electron_energy_distribution.temperature ) ) return self.compute_rates( photoionization_rate_coeff, stimulated_recombination_rate_coeff, spontaneous_recombination_rate_coeff, level_number_density, ion_number_density, electron_energy_distribution.number_density, saha_factor, )
[docs] class EstimatedPhotoionizationRateSolver(AnalyticPhotoionizationRateSolver): """Solve the photoionization and spontaneous recombination rates in the case where the radiation field is estimated by Monte Carlo processes. """ def __init__( self, photoionization_cross_sections, level2continuum_edge_idx ): super().__init__( photoionization_cross_sections, ) self.level2continuum_edge_idx = level2continuum_edge_idx
[docs] def solve( self, electron_energy_distribution, radfield_mc_estimators, time_simulation, volume, level_number_density, ion_number_density, saha_factor, ): """Solve the photoionization and spontaneous recombination rates in the case where the radiation field is estimated by Monte Carlo processes. Parameters ---------- electron_energy_distribution : ThermalElectronEnergyDistribution Electron properties. radfield_mc_estimators : RadiationFieldMCEstimators Estimators of the radiation field properties. time_simulation : u.Quantity Time of simulation. volume : u.Quantity Volume per cell. level_number_density : pd.DataFrame Electron energy level number density. Columns are cells. ion_number_density : pd.DataFrame Ion number density. Columns are cells. saha_factor : pd.DataFrame Saha factor: the LTE level number density divided by the LTE ion number density and the electron number density. Returns ------- pd.DataFrame Photoionization rate. Columns are cells. pd.DataFrame Spontaneous recombination rate. Columns are cells. """ photoionization_rate_coeff_solver = EstimatedPhotoionizationCoeffSolver( self.level2continuum_edge_idx ) photoionization_rate_coeff, stimulated_recombination_rate_coeff = ( photoionization_rate_coeff_solver.solve( radfield_mc_estimators, time_simulation, volume, ) ) spontaneous_recombination_rate_coeff = ( self.spontaneous_recombination_rate_coeff_solver.solve( electron_energy_distribution.temperature ) ) return self.compute_rates( photoionization_rate_coeff, stimulated_recombination_rate_coeff, spontaneous_recombination_rate_coeff, level_number_density, ion_number_density, electron_energy_distribution.number_density, saha_factor, )