solrat.atom_model.multi_term_atom_model.radiative_transfer_equations module

class solrat.atom_model.multi_term_atom_model.radiative_transfer_equations.MultiTermAtomRTE(level_registry: LevelRegistry, transition_registry: TransitionRegistry, nu: ndarray, custom_delta_nu_cutoff=None, N: float = 1.0, j_constrained=False)[source]

Bases: BaseRTE

Radiative Transfer Coefficients within Multi-Term atom model.

Parameters:
  • level_registry – LevelRegistry instance for the multi-term atom under study.

  • transition_registry – TransitionRegistry instance for the multi-term atom under study.

  • nu – frequencies [Hz]

  • custom_delta_nu_cutoff – distance in frequency for cutting off irrelevant transitions. Leave None for a conservative default value.

  • N – atom numeric concentration for d/dz transfer modeling. Can be left equal to 1 for d/dtau modeling.

  • j_constrained – constrain J values to the ones specified in transition_registry. This parameter is useful for modeling lines like Fe5434 where fine structure components are scattered over a very broad spectral interval, while the user is interested only in a specific transition.

Reference: (LL04 7.47)

classmethod from_model_config(config: MultiTermAtomConfig, nu: ndarray) Self[source]

Constructor from the model config.

calculate_eta_rho_a(angles: Angles, rho: Rho, atmosphere_parameters: AtmosphereParameters) ndarray[source]

Calculate etaA and rhoA for all Stokes components simultaneously.

Parameters:
  • angles – Angles instance with LOS and magnetic field angles

  • rho – density tensor Rho

  • atmosphere_parameters – AtmosphereParameters instance

Returns:

complex array of \(\eta_A + i \rho_A\) vs frequency, shape [4, len(nu)] for I, Q, U, V

Reference: (LL04 7.47 ac)

calculate_eta_rho_s(angles: Angles, rho: Rho, atmosphere_parameters: AtmosphereParameters) ndarray[source]

Calculate etaS and rhoS for all Stokes components simultaneously.

Parameters:
  • angles – Angles instance with LOS and magnetic field angles

  • rho – density tensor Rho

  • atmosphere_parameters – AtmosphereParameters instance

Returns:

complex array of \(\eta_S + i \rho_S\) vs frequency, shape [4, len(nu)] for I, Q, U, V

Reference: (LL04 7.47 bd)

static calculate_epsilon(eta_s: ndarray, nu: ndarray) ndarray[source]

Compute \(\epsilon\) given \(\eta_S\)

Reference: (LL04 7.47e)

create_base_frame() DataFrame[source]

Generate a base frame, listing all transitions. This frame will be used as a starting point to determine the ranges for all other summation indexes.

Returns:

base frame

calculate_all_coefficients(atmosphere_parameters: AtmosphereParameters, angles: Angles, rho: Rho) RadiativeTransferCoefficients[source]

Compute all radiative transfer coefficients.

Parameters:
  • angles – Angles instance with LOS and magnetic field angles

  • rho – density tensor Rho

  • atmosphere_parameters – AtmosphereParameters instance

Returns:

RadiativeTransferCoefficients instance

Reference: (LL04 7.47)

phi(term_upper_id, ju, Mu, term_lower_id, jl, Ml, atmosphere_parameters)[source]
cutoff_condition(term_upper: Term, term_lower: Term, nu: ndarray)[source]

Check the cut-off condition. If a transition is way outside the spectral region of interest, it does not contribute to RTE (due to the phi profile).

class AFrameSumLimits[source]

Bases: SumLimits

Summation limits for the \(\eta_A\) and \(\rho_A\) calculation. See SumLimits for reference.

term_lower_id = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
term_upper_id = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
Ll = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
Lu = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
S = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
jl = <solrat.engine.generators.merge_loopers.Triangular object>
Jl = <solrat.engine.generators.merge_loopers.Triangular object>
Jʹl = <solrat.engine.generators.merge_loopers.Triangular object>
Jʹʹl = <solrat.engine.generators.merge_loopers.Triangular object>
ju = <solrat.engine.generators.merge_loopers.Triangular object>
Ju = <solrat.engine.generators.merge_loopers.Intersection object>
Jʹu = <solrat.engine.generators.merge_loopers.Intersection object>
Ml = <solrat.engine.generators.merge_loopers.Intersection object>
Mʹl = <solrat.engine.generators.merge_loopers.Projection object>
Mu = <solrat.engine.generators.merge_loopers.Intersection object>
K = <solrat.engine.generators.merge_loopers.FromTo object>
Kl = <solrat.engine.generators.merge_loopers.Triangular object>
Ql = <solrat.engine.generators.merge_loopers.Intersection object>
q = <solrat.engine.generators.merge_loopers.Difference object>
= <solrat.engine.generators.merge_loopers.Difference object>
Q = <solrat.engine.generators.merge_loopers.Intersection object>
class AFrameSumLimitsConstrained[source]

Bases: SumLimits

Summation limits for the \(\eta_A\) and \(\rho_A\) calculation, with constraint on \(J\). See SumLimits for reference.

term_lower_id = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
term_upper_id = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
Ll = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
Lu = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
S = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
lower_J_constraint = <solrat.engine.generators.merge_loopers.Constraint object>
upper_J_constraint = <solrat.engine.generators.merge_loopers.Constraint object>
jl = <solrat.engine.generators.merge_loopers.ApplyConstraint object>
Jl = <solrat.engine.generators.merge_loopers.Triangular object>
Jʹl = <solrat.engine.generators.merge_loopers.Triangular object>
Jʹʹl = <solrat.engine.generators.merge_loopers.Triangular object>
ju = <solrat.engine.generators.merge_loopers.ApplyConstraint object>
Ju = <solrat.engine.generators.merge_loopers.Intersection object>
Jʹu = <solrat.engine.generators.merge_loopers.Intersection object>
Ml = <solrat.engine.generators.merge_loopers.Intersection object>
Mʹl = <solrat.engine.generators.merge_loopers.Projection object>
Mu = <solrat.engine.generators.merge_loopers.Intersection object>
K = <solrat.engine.generators.merge_loopers.FromTo object>
Kl = <solrat.engine.generators.merge_loopers.Triangular object>
Ql = <solrat.engine.generators.merge_loopers.Intersection object>
q = <solrat.engine.generators.merge_loopers.Difference object>
= <solrat.engine.generators.merge_loopers.Difference object>
Q = <solrat.engine.generators.merge_loopers.Intersection object>
class SFrameSumLimits[source]

Bases: SumLimits

Summation limits for the \(\eta_S\) and \(\rho_S\) calculation. See SumLimits for reference.

term_lower_id = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
term_upper_id = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
Ll = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
Lu = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
S = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
ju = <solrat.engine.generators.merge_loopers.Triangular object>
Ju = <solrat.engine.generators.merge_loopers.Triangular object>
Jʹu = <solrat.engine.generators.merge_loopers.Triangular object>
Jʹʹu = <solrat.engine.generators.merge_loopers.Triangular object>
jl = <solrat.engine.generators.merge_loopers.Triangular object>
Jl = <solrat.engine.generators.merge_loopers.Intersection object>
Jʹl = <solrat.engine.generators.merge_loopers.Intersection object>
Mu = <solrat.engine.generators.merge_loopers.Intersection object>
Mʹu = <solrat.engine.generators.merge_loopers.Projection object>
Ml = <solrat.engine.generators.merge_loopers.Intersection object>
K = <solrat.engine.generators.merge_loopers.FromTo object>
Ku = <solrat.engine.generators.merge_loopers.Triangular object>
Qu = <solrat.engine.generators.merge_loopers.Intersection object>
q = <solrat.engine.generators.merge_loopers.Difference object>
= <solrat.engine.generators.merge_loopers.Difference object>
Q = <solrat.engine.generators.merge_loopers.Intersection object>
class SFrameSumLimitsConstrained[source]

Bases: SumLimits

Summation limits for the \(\eta_S\) and \(\rho_S\) calculation, with constraint on \(J\). See SumLimits for reference.

term_lower_id = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
term_upper_id = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
Ll = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
Lu = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
S = <solrat.engine.generators.merge_loopers.DummyOrAlreadyMerged object>
lower_J_constraint = <solrat.engine.generators.merge_loopers.Constraint object>
upper_J_constraint = <solrat.engine.generators.merge_loopers.Constraint object>
ju = <solrat.engine.generators.merge_loopers.ApplyConstraint object>
Ju = <solrat.engine.generators.merge_loopers.Triangular object>
Jʹu = <solrat.engine.generators.merge_loopers.Triangular object>
Jʹʹu = <solrat.engine.generators.merge_loopers.Triangular object>
jl = <solrat.engine.generators.merge_loopers.ApplyConstraint object>
Jl = <solrat.engine.generators.merge_loopers.Intersection object>
Jʹl = <solrat.engine.generators.merge_loopers.Intersection object>
Mu = <solrat.engine.generators.merge_loopers.Intersection object>
Mʹu = <solrat.engine.generators.merge_loopers.Projection object>
Ml = <solrat.engine.generators.merge_loopers.Intersection object>
K = <solrat.engine.generators.merge_loopers.FromTo object>
Ku = <solrat.engine.generators.merge_loopers.Triangular object>
Qu = <solrat.engine.generators.merge_loopers.Intersection object>
q = <solrat.engine.generators.merge_loopers.Difference object>
= <solrat.engine.generators.merge_loopers.Difference object>
Q = <solrat.engine.generators.merge_loopers.Intersection object>