Beispiel #1
0
 def from_config(nlte_conf):
     if nlte_conf.classical_nebular and not nlte_conf.coronal_approximation:
         return LevelBoltzmannFactorNLTEClassic
     elif (nlte_conf.coronal_approximation
           and not nlte_conf.classical_nebular):
         return LevelBoltzmannFactorNLTECoronal
     elif nlte_conf.coronal_approximation and nlte_conf.classical_nebular:
         raise PlasmaConfigError('Both coronal approximation and '
                                 'classical nebular specified in the '
                                 'config.')
     else:
         return LevelBoltzmannFactorNLTEGeneral
 def __init__(self,
              plasma_parent,
              classical_nebular=False,
              coronal_approximation=False):
     """
     Selects appropriate 'calculate' function based on NLTE config
     options selected.
     """
     super(LevelBoltzmannFactorNLTE, self).__init__(plasma_parent)
     if classical_nebular == True and coronal_approximation == False:
         self.calculate = self._calculate_classical_nebular
     elif coronal_approximation == True and classical_nebular == False:
         self.calculate = self._calculate_coronal_approximation
     elif coronal_approximation == True and classical_nebular == True:
         raise PlasmaConfigError('Both coronal approximation and classical'
                                 'nebular specified in the config.')
     else:
         self.calculate = self._calculate_general
     self._update_inputs()
Beispiel #3
0
def assemble_plasma(config, model, atom_data=None):
    """
    Create a BasePlasma instance from a Configuration object
    and a Radial1DModel.

    Parameters
    ----------
    config : io.config_reader.Configuration
    model : model.Radial1DModel
    atom_data : atomic.AtomData
        If None, an attempt will be made to read the atomic data
        from config.

    Returns
    -------
    : plasma.BasePlasma

    """
    # Convert the nlte species list to a proper format.
    nlte_species = [
        species_string_to_tuple(s) for s in config.plasma.nlte.species
    ]

    # Convert the continuum interaction species list to a proper format.
    continuum_interaction_species = [
        species_string_to_tuple(s)
        for s in config.plasma.continuum_interaction.species
    ]
    continuum_interaction_species = pd.MultiIndex.from_tuples(
        continuum_interaction_species, names=["atomic_number", "ion_number"])

    if atom_data is None:
        if "atom_data" in config:
            if os.path.isabs(config.atom_data):
                atom_data_fname = config.atom_data
            else:
                atom_data_fname = os.path.join(config.config_dirname,
                                               config.atom_data)
        else:
            raise ValueError("No atom_data option found in the configuration.")

        logger.info("Reading Atomic Data from %s", atom_data_fname)

        try:
            atom_data = AtomData.from_hdf(atom_data_fname)
        except TypeError as e:
            print(
                e,
                "Error might be from the use of an old-format of the atomic database, \n"
                "please see https://github.com/tardis-sn/tardis-refdata/tree/master/atom_data"
                " for the most recent version.",
            )
            raise

    atom_data.prepare_atom_data(
        model.abundance.index,
        line_interaction_type=config.plasma.line_interaction_type,
        nlte_species=nlte_species,
    )

    # Check if continuum interaction species are in selected_atoms
    continuum_atoms = continuum_interaction_species.get_level_values(
        "atomic_number")
    continuum_atoms_in_selected_atoms = np.all(
        continuum_atoms.isin(atom_data.selected_atomic_numbers))
    if not continuum_atoms_in_selected_atoms:
        raise PlasmaConfigError("Not all continuum interaction species "
                                "belong to atoms that have been specified "
                                "in the configuration.")

    kwargs = dict(
        t_rad=model.t_radiative,
        abundance=model.abundance,
        density=model.density,
        atomic_data=atom_data,
        time_explosion=model.time_explosion,
        w=model.dilution_factor,
        link_t_rad_t_electron=0.9,
        continuum_interaction_species=continuum_interaction_species,
    )

    plasma_modules = basic_inputs + basic_properties
    property_kwargs = {}
    if config.plasma.continuum_interaction.species:
        line_interaction_type = config.plasma.line_interaction_type
        if line_interaction_type != "macroatom":
            raise PlasmaConfigError(
                "Continuum interactions require line_interaction_type "
                "macroatom (instead of {}).".format(line_interaction_type))

        plasma_modules += continuum_interaction_properties
        plasma_modules += continuum_interaction_inputs

        if config.plasma.continuum_interaction.enable_adiabatic_cooling:
            plasma_modules += adiabatic_cooling_properties

        if config.plasma.continuum_interaction.enable_two_photon_decay:
            plasma_modules += two_photon_properties

        transition_probabilities_outputs = [
            plasma_property.transition_probabilities_outputs
            for plasma_property in plasma_modules
            if issubclass(plasma_property, TransitionProbabilitiesProperty)
        ]
        transition_probabilities_outputs = [
            item for sublist in transition_probabilities_outputs
            for item in sublist
        ]

        property_kwargs[MarkovChainTransProbsCollector] = {
            "inputs": transition_probabilities_outputs
        }

        kwargs.update(
            gamma_estimator=None,
            bf_heating_coeff_estimator=None,
            alpha_stim_estimator=None,
            volume=model.volume,
            r_inner=model.r_inner,
            t_inner=model.t_inner,
        )
    if config.plasma.radiative_rates_type == "blackbody":
        plasma_modules.append(JBluesBlackBody)
    elif config.plasma.radiative_rates_type == "dilute-blackbody":
        plasma_modules.append(JBluesDiluteBlackBody)
    elif config.plasma.radiative_rates_type == "detailed":
        plasma_modules += detailed_j_blues_properties + detailed_j_blues_inputs
        kwargs.update(
            r_inner=model.r_inner,
            t_inner=model.t_inner,
            volume=model.volume,
            j_blue_estimator=None,
        )
        property_kwargs[JBluesDetailed] = {
            "w_epsilon": config.plasma.w_epsilon
        }
    else:
        raise ValueError(
            f"radiative_rates_type type unknown - {config.plasma.radiative_rates_type}"
        )

    if config.plasma.excitation == "lte":
        plasma_modules += lte_excitation_properties
    elif config.plasma.excitation == "dilute-lte":
        plasma_modules += dilute_lte_excitation_properties

    if config.plasma.ionization == "lte":
        plasma_modules += lte_ionization_properties
    elif config.plasma.ionization == "nebular":
        plasma_modules += nebular_ionization_properties

    if nlte_species:
        plasma_modules += nlte_properties
        nlte_conf = config.plasma.nlte
        plasma_modules.append(LevelBoltzmannFactorNLTE.from_config(nlte_conf))
        property_kwargs[StimulatedEmissionFactor] = dict(
            nlte_species=nlte_species)
    else:
        plasma_modules += non_nlte_properties

    if config.plasma.line_interaction_type in ("downbranch", "macroatom"):
        plasma_modules += macro_atom_properties

    if "delta_treatment" in config.plasma:
        property_kwargs[RadiationFieldCorrection] = dict(
            delta_treatment=config.plasma.delta_treatment)

    if config.plasma.helium_treatment == "recomb-nlte":
        plasma_modules += helium_nlte_properties
    elif config.plasma.helium_treatment == "numerical-nlte":
        plasma_modules += helium_numerical_nlte_properties
        # TODO: See issue #633
        if config.plasma.heating_rate_data_file in ["none", None]:
            raise PlasmaConfigError("Heating rate data file not specified")
        else:
            property_kwargs[HeliumNumericalNLTE] = dict(
                heating_rate_data_file=config.plasma.heating_rate_data_file)
    else:
        plasma_modules += helium_lte_properties

    if model._electron_densities:
        electron_densities = pd.Series(model._electron_densities.cgs.value)
        if config.plasma.helium_treatment == "numerical-nlte":
            property_kwargs[IonNumberDensityHeNLTE] = dict(
                electron_densities=electron_densities)
        else:
            property_kwargs[IonNumberDensity] = dict(
                electron_densities=electron_densities)

    kwargs["helium_treatment"] = config.plasma.helium_treatment

    plasma = BasePlasma(
        plasma_properties=plasma_modules,
        property_kwargs=property_kwargs,
        **kwargs,
    )

    return plasma
Beispiel #4
0
    def __init__(self, number_densities, atomic_data, time_explosion,
        t_rad=None, delta_treatment=None, nlte_config=None,
        ionization_mode='lte', excitation_mode='lte',
        line_interaction_type='scatter', link_t_rad_t_electron=0.9,
        helium_treatment='none', heating_rate_data_file=None,
        v_inner=None, v_outer=None):

        plasma_modules = basic_inputs + basic_properties

        if excitation_mode == 'lte':
            plasma_modules += lte_excitation_properties
        elif excitation_mode == 'dilute-lte':
            plasma_modules += dilute_lte_excitation_properties
        else:
            raise NotImplementedError('Sorry {0} not implemented yet.'.format(
            excitation_mode))

        if ionization_mode == 'lte':
            plasma_modules += lte_ionization_properties
        elif ionization_mode == 'nebular':
            plasma_modules += nebular_ionization_properties
        else:
            raise NotImplementedError('Sorry ' + ionization_mode +
                ' not implemented yet.')

        if nlte_config is not None and nlte_config.species:
            plasma_modules += nlte_properties
            if nlte_config.classical_nebular==True and \
                nlte_config.coronal_approximation==False:
                LevelBoltzmannFactorNLTE(self, classical_nebular=True)
            elif nlte_config.coronal_approximation==True and \
                nlte_config.classical_nebular==False:
                LevelBoltzmannFactorNLTE(self, coronal_approximation=True)
            elif nlte_config.coronal_approximation==True and \
                nlte_config.classical_nebular==True:
                raise PlasmaConfigError('Both coronal approximation and '
                                        'classical nebular specified in the '
                                        'config.')
        else:
            plasma_modules += non_nlte_properties

        if line_interaction_type in ('downbranch', 'macroatom'):
            plasma_modules += macro_atom_properties

        if t_rad is None:
            t_rad = self.initial_t_rad(number_densities)

        w = self.initial_w(number_densities)

        abundance, density = self.from_number_densities(number_densities,
            atomic_data)

        if nlte_config is not None and nlte_config.species:
            self.nlte_species = nlte_config.species
        else:
            self.nlte_species = None

        if helium_treatment=='recomb-nlte':
            plasma_modules += helium_nlte_properties

        if helium_treatment=='numerical-nlte':
            plasma_modules += helium_numerical_nlte_properties
            if heating_rate_data_file is None:
                raise PlasmaConfigError('Heating rate data file not specified')
            else:
                self.heating_rate_data_file = heating_rate_data_file
                self.v_inner = v_inner
                self.v_outer = v_outer

        self.delta_treatment = delta_treatment

        super(LegacyPlasmaArray, self).__init__(
            plasma_properties=plasma_modules, t_rad=t_rad,
            abundance=abundance, density=density,
            atomic_data=atomic_data, time_explosion=time_explosion,
            j_blues=None, w=w, link_t_rad_t_electron=link_t_rad_t_electron)
Beispiel #5
0
def assemble_plasma(config, model, atom_data=None):
    """
    Create a BasePlasma instance from a Configuration object
    and a Radial1DModel.

    Parameters
    ----------
    config: ~io.config_reader.Configuration
    model: ~model.Radial1DModel
    atom_data: ~atomic.AtomData
        If None, an attempt will be made to read the atomic data
        from config.

    Returns
    -------
    : ~plasma.BasePlasma

    """
    # Convert the nlte species list to a proper format.
    nlte_species = [
        species_string_to_tuple(s) for s in config.plasma.nlte.species
    ]

    if atom_data is None:
        if 'atom_data' in config:
            if os.path.isabs(config.atom_data):
                atom_data_fname = config.atom_data
            else:
                atom_data_fname = os.path.join(config.config_dirname,
                                               config.atom_data)
        else:
            raise ValueError('No atom_data option found in the configuration.')

        logger.info('Reading Atomic Data from %s', atom_data_fname)

        try:
            atom_data = atomic.AtomData.from_hdf(atom_data_fname)
        except TypeError as e:
            print(
                e,
                'Error might be from the use of an old-format of the atomic database, \n'
                'please see https://github.com/tardis-sn/tardis-refdata/tree/master/atom_data'
                ',for the most recent version.')
            raise

    atom_data.prepare_atom_data(
        model.abundance.index,
        line_interaction_type=config.plasma.line_interaction_type,
        nlte_species=nlte_species)

    kwargs = dict(t_rad=model.t_radiative,
                  abundance=model.abundance,
                  density=model.density,
                  atomic_data=atom_data,
                  time_explosion=model.time_explosion,
                  w=model.dilution_factor,
                  link_t_rad_t_electron=0.9)

    plasma_modules = basic_inputs + basic_properties
    property_kwargs = {}
    if config.plasma.radiative_rates_type == 'blackbody':
        plasma_modules.append(JBluesBlackBody)
    elif config.plasma.radiative_rates_type == 'dilute-blackbody':
        plasma_modules.append(JBluesDiluteBlackBody)
    elif config.plasma.radiative_rates_type == 'detailed':
        plasma_modules += detailed_j_blues_properties + detailed_j_blues_inputs
        kwargs.update(r_inner=model.r_inner,
                      t_inner=model.t_inner,
                      volume=model.volume,
                      j_blue_estimator=None)
        property_kwargs[JBluesDetailed] = {
            'w_epsilon': config.plasma.w_epsilon
        }
    else:
        raise ValueError('radiative_rates_type type unknown - %s',
                         config.plasma.radiative_rates_type)

    if config.plasma.excitation == 'lte':
        plasma_modules += lte_excitation_properties
    elif config.plasma.excitation == 'dilute-lte':
        plasma_modules += dilute_lte_excitation_properties

    if config.plasma.ionization == 'lte':
        plasma_modules += lte_ionization_properties
    elif config.plasma.ionization == 'nebular':
        plasma_modules += nebular_ionization_properties

    if nlte_species:
        plasma_modules += nlte_properties
        nlte_conf = config.plasma.nlte
        plasma_modules.append(LevelBoltzmannFactorNLTE.from_config(nlte_conf))
        property_kwargs[StimulatedEmissionFactor] = dict(
            nlte_species=nlte_species)
    else:
        plasma_modules += non_nlte_properties

    if config.plasma.line_interaction_type in ('downbranch', 'macroatom'):
        plasma_modules += macro_atom_properties

    if config.plasma.helium_treatment == 'recomb-nlte':
        plasma_modules += helium_nlte_properties
        if 'delta_treatment' in config.plasma:
            property_kwargs[RadiationFieldCorrection] = dict(
                delta_treatment=config.plasma.delta_treatment)
    elif config.plasma.helium_treatment == 'numerical-nlte':
        plasma_modules += helium_numerical_nlte_properties
        # TODO: See issue #633
        if config.plasma.heating_rate_data_file in ['none', None]:
            raise PlasmaConfigError('Heating rate data file not specified')
        else:
            property_kwargs[HeliumNumericalNLTE] = dict(
                heating_rate_data_file=config.plasma.heating_rate_data_file)
    else:
        plasma_modules += helium_lte_properties
    kwargs['helium_treatment'] = config.plasma.helium_treatment

    plasma = BasePlasma(plasma_properties=plasma_modules,
                        property_kwargs=property_kwargs,
                        **kwargs)

    return plasma