try:
from typing import Self # Python 3.11+
except ImportError:
from typing_extensions import Self # Python <3.11
import logging
from typing import Generic, Union
from solrat.atom_model.base_atom_model.object.atmosphere_parameters import AtmosphereParametersT
from solrat.atom_model.base_atom_model.object.config import ConfigT
from solrat.atom_model.base_atom_model.object.radiation_tensor import RadiationTensorT
from solrat.atom_model.base_atom_model.radiative_transfer_equations import RTET
from solrat.atom_model.base_atom_model.statistical_equilibrium_equations import SEET
from solrat.atom_model.multi_level_atom_model.object.atmosphere_parameters import (
AtmosphereParameters as MultiLevelAtmosphereParameters,
)
from solrat.atom_model.multi_level_atom_model.object.multi_level_atom_config import MultiLevelAtomConfig
from solrat.atom_model.multi_level_atom_model.object.radiation_tensor import (
RadiationTensor as MultiLevelRadiationTensor,
)
from solrat.atom_model.multi_level_atom_model.radiative_transfer_equations import MultiLevelAtomRTE
from solrat.atom_model.multi_level_atom_model.statistical_equilibrium_equations import MultiLevelAtomSEE
from solrat.atom_model.multi_term_atom_model.data.FeI import get_Fe_I_5434_config
from solrat.atom_model.multi_term_atom_model.data.HeI import get_He_I_D3_config
from solrat.atom_model.multi_term_atom_model.data.MnI import get_Mn_I_5432_config
from solrat.atom_model.multi_term_atom_model.data.mock import get_mock_atom_config
from solrat.atom_model.multi_term_atom_model.data.NiI import get_Ni_I_5435_config
from solrat.atom_model.multi_term_atom_model.object.atmosphere_parameters import AtmosphereParameters
from solrat.atom_model.multi_term_atom_model.object.multi_term_atom_config import MultiTermAtomConfig
from solrat.atom_model.multi_term_atom_model.object.radiation_tensor import RadiationTensor
from solrat.atom_model.multi_term_atom_model.radiative_transfer_equations import MultiTermAtomRTE
from solrat.atom_model.multi_term_atom_model.statistical_equilibrium_equations import MultiTermAtomSEE
from solrat.atom_model.multi_term_atom_model_legacy.radiative_transfer_equations_legacy import MultiTermAtomRTELegacy
from solrat.atom_model.multi_term_atom_model_legacy.statistical_equilibrium_equations_legacy import (
MultiTermAtomSEELegacy,
)
from solrat.atom_model.multi_term_atom_model_lte.object.radiation_tensor import RadiationTensorLTE
from solrat.atom_model.multi_term_atom_model_lte.statistical_equilibrium_equations import MultiTermAtomSEELTE
from solrat.engine.functions.decorators import log_method
[docs]
class Model(Generic[SEET, RTET, RadiationTensorT, AtmosphereParametersT, ConfigT]):
def __init__(
self,
StatisticalEquilibriumEquations: type[SEET],
RadiativeTransferEquations: type[RTET],
RadiationTensor: type[RadiationTensorT],
AtmosphereParameters: type[AtmosphereParametersT],
Config: type[ConfigT],
):
self.StatisticalEquilibriumEquations: type[SEET] = StatisticalEquilibriumEquations
self.RadiativeTransferEquations: type[RTET] = RadiativeTransferEquations
self.RadiationTensor: type[RadiationTensorT] = RadiationTensor
self.AtmosphereParameters: type[AtmosphereParametersT] = AtmosphereParameters
self.Config: type[ConfigT] = Config
self._config: Union[ConfigT, None] = None
@property
def config(self) -> ConfigT:
if self._config is None:
raise RuntimeError("config has not been initialized")
return self._config
[docs]
class Models:
[docs]
@staticmethod
def multi_term_atom():
logging.info("Creating Multi-Term Atom model")
return Model[
MultiTermAtomSEE,
MultiTermAtomRTE,
RadiationTensor,
AtmosphereParameters,
MultiTermAtomConfig,
](
StatisticalEquilibriumEquations=MultiTermAtomSEE,
RadiativeTransferEquations=MultiTermAtomRTE,
RadiationTensor=RadiationTensor,
AtmosphereParameters=AtmosphereParameters,
Config=MultiTermAtomConfig,
)
[docs]
@staticmethod
def multi_term_atom_legacy():
logging.info("Creating Multi-Term Atom Legacy model")
return Model[
MultiTermAtomSEELegacy,
MultiTermAtomRTELegacy,
RadiationTensor,
AtmosphereParameters,
MultiTermAtomConfig,
](
StatisticalEquilibriumEquations=MultiTermAtomSEELegacy,
RadiativeTransferEquations=MultiTermAtomRTELegacy,
RadiationTensor=RadiationTensor,
AtmosphereParameters=AtmosphereParameters,
Config=MultiTermAtomConfig,
)
[docs]
@staticmethod
def multi_level_atom():
logging.info("Creating Multi-Level Atom model")
return Model[
MultiLevelAtomSEE,
MultiLevelAtomRTE,
MultiLevelRadiationTensor,
MultiLevelAtmosphereParameters,
MultiLevelAtomConfig,
](
StatisticalEquilibriumEquations=MultiLevelAtomSEE,
RadiativeTransferEquations=MultiLevelAtomRTE,
RadiationTensor=MultiLevelRadiationTensor,
AtmosphereParameters=MultiLevelAtmosphereParameters,
Config=MultiLevelAtomConfig,
)
[docs]
@staticmethod
def multi_term_atom_lte():
logging.info("Creating Multi-Term Atom LTE model")
return Model[
MultiTermAtomSEELTE,
MultiTermAtomRTE,
RadiationTensorLTE,
AtmosphereParameters,
MultiTermAtomConfig,
](
StatisticalEquilibriumEquations=MultiTermAtomSEELTE,
RadiativeTransferEquations=MultiTermAtomRTE,
RadiationTensor=RadiationTensorLTE,
AtmosphereParameters=AtmosphereParameters,
Config=MultiTermAtomConfig,
)