"""
Interface to an isothermal loop model
"""
import astropy.units as u
import numpy as np
from synthesizAR.models import Isothermal, RTVScalingLaws
from synthesizAR.models.heating import b_over_l_scaling
__all__ = ['IsothermalInterface', 'IsothermalRTVInterface']
[docs]
class IsothermalInterface:
"""
Interface to isothermal loop model
"""
name = 'isothermal'
def __init__(self,
temperature: u.Unit('K') = None,
base_pressure: u.Unit('dyne cm-2') = None):
self._temperature = temperature
self._base_pressure = base_pressure
[docs]
def load_results(self, loop):
T_0 = self.get_temperature(loop)
p_0 = self.get_base_pressure(loop)
iso = Isothermal(loop.field_aligned_coordinate_center,
loop.coordinate_center.spherical.distance,
T_0,
p_0)
time = u.Quantity([0, ], 's')
ones = np.ones(time.shape + iso.pressure.shape)
temperature = T_0 * ones
velocity = np.nan * ones * (u.cm / u.s)
density = iso.density.reshape(ones.shape)
return time, temperature, temperature, density, velocity
[docs]
def get_temperature(self, loop):
return self._temperature
[docs]
def get_base_pressure(self, loop):
return self._base_pressure
[docs]
class IsothermalRTVInterface(IsothermalInterface):
"""
This is the same as `~synthesizAR.interfaces.IsothermalInterface`
except that the temperature for each loop is computed using the
RTV scaling laws, with the heating rate calculated using
`~synthesizAR.models.heating.b_over_l_scaling`.
"""
name = 'isothermal_rtv'
def __init__(self, heating_params=None, rtv_params=None):
self.heating_params = {} if heating_params is None else heating_params
self.rtv_params = {} if rtv_params is None else rtv_params
[docs]
def get_temperature(self, loop):
heating_rate = self.get_heating_rate(loop)
rtv = RTVScalingLaws(loop.length/2, heating_rate=heating_rate, **self.rtv_params)
return rtv.max_temperature
[docs]
def get_heating_rate(self, loop):
return b_over_l_scaling(loop, **self.heating_params)