def initialize_plasmas(self, plasma_class): self.plasmas = [] self.tau_sobolevs = np.zeros((self.no_of_shells, len(self.atom_data.lines))) self.line_list_nu = self.atom_data.lines['nu'] if self.line_interaction_id in (1, 2): if self.line_interaction_id == 1: logger.info('Downbranch selected - creating transition probabilities') else: logger.info('Macroatom selected - creating transition probabilties') self.transition_probabilities = [] else: logger.info('Scattering selected - no transition probabilities created') for i, ((tmp_index, number_density), current_t_rad, current_w) in \ enumerate(zip(self.number_densities.iterrows(), self.t_rads, self.ws)): logger.debug('Initializing Shell %d Plasma with T=%.3f W=%.4f' % (i, current_t_rad, current_w)) if self.radiative_rates_type in ('lte',): j_blues = plasma.intensity_black_body(self.atom_data.lines.nu.values, current_t_rad) elif self.radiative_rates_type in ('nebular', 'detailed'): j_blues = current_w * plasma.intensity_black_body(self.atom_data.lines.nu.values, current_t_rad) else: raise ValueError('For the current plasma_type (%s) the radiative_rates_type can only' ' be "lte" or "detailed" or "nebular"' % (self.plasma_type)) current_plasma = plasma_class(t_rad=current_t_rad, w=current_w, number_density=number_density, atom_data=self.atom_data, time_explosion=self.time_explosion, nlte_species=self.tardis_config.nlte_species, nlte_options=self.tardis_config.nlte_options, zone_id=i, j_blues=j_blues) self.tau_sobolevs[i] = current_plasma.tau_sobolevs self.plasmas.append(current_plasma) self.tau_sobolevs = np.array(self.tau_sobolevs, dtype=float) self.j_blues = np.zeros_like(self.tau_sobolevs) if self.line_interaction_id in (1, 2): self.calculate_transition_probabilities()
def update_plasmas(self): for i, (current_plasma, new_trad, new_ws) in enumerate(zip(self.plasmas, self.t_rads, self.ws)): logger.debug('Updating Shell %d Plasma with T=%.3f W=%.4f' % (i, new_trad, new_ws)) if self.radiative_rates_type == 'lte': j_blues = plasma.intensity_black_body(self.atom_data.lines.nu.values, new_trad) elif self.radiative_rates_type == 'nebular': j_blues = new_ws * plasma.intensity_black_body(self.atom_data.lines.nu.values, new_trad) elif self.radiative_rates_type == 'detailed': j_blues = self.j_blues[i] else: raise ValueError('For the current plasma_type (%s) the radiative_rates_type can only' ' be "lte" or "detailed" or "nebular"' % (self.plasma_type)) current_plasma.set_j_blues(j_blues) if self.plasma_type == 'lte': new_ws = 1.0 current_plasma.update_radiationfield(new_trad, w=new_ws) self.tau_sobolevs[i] = current_plasma.tau_sobolevs if self.line_interaction_id in (1, 2): self.calculate_transition_probabilities()
def random_blackbody_nu(self, T, number_of_packets): """ Creating the random nus for the energy packets Parameters ---------- T : `float` temperature of the blackbody number_of_packets : `int` the number of packets """ nu = np.linspace(self.nu_start, self.nu_end, num=self.blackbody_sampling) intensity = plasma.intensity_black_body(nu, T) cum_blackbody = np.cumsum(intensity) norm_cum_blackbody = cum_blackbody / cum_blackbody.max() return nu[norm_cum_blackbody.searchsorted(np.random.random(number_of_packets))] + \ np.random.random(size=number_of_packets) * (nu[1] - nu[0])