Module taurunner.body.sun

Expand source code
import numpy as np
from scipy.interpolate import splev, splrep
from importlib.resources import path

from .body import Body
from taurunner.utils import Callable, units
from taurunner.resources import solar_models

def mass_density_from_model(solar_model_file):
    model   = np.genfromtxt(solar_model_file)
    xx      = model[:,0]
    density = model[:,1]
    tck = splrep(xx, np.log(density))
    return lambda x: np.exp(splev(x, tck))

def e_density_from_model(solar_model_file):
    model    = np.genfromtxt(solar_model_file)
    xx       = model[:,0]
    density  = model[:,2]
    tck      = splrep(xx, np.log(density))
    return lambda x: np.exp(splev(x, tck))

class Sun(Body):

    def __init__(self, density, radius, edensity, name='Sun'):

        Body.__init__(self, density, radius, name=name)
        if hasattr(density, '__iter__'):# pragma: no cover
            self._edensity = [1./units.cm**3*Callable(obj) for obj in edensity]
        else:
            self._edensity = [1./units.cm**3*Callable(edensity)]

    def get_edensity(self, r):
        if r==1:
            layer_index = -1
        else:
            layer_index = np.digitize(r, self.layer_boundaries)-1
        current_edensity = self._edensity[layer_index]
        return current_edensity(r)

def make_sun(model_file):
    density  = mass_density_from_model(model_file)
    edensity = e_density_from_model(model_file)
    return Sun(density, 6.963e5, edensity)

def construct_sun(sun_name=None):
    if sun_name=='HZ_Sun' or sun_name is None:
        with path(solar_models, 'Hybrid_model_DM_SUN_HZ.txt') as p:
            sun_path = str(p)
    elif sun_name=='LZ_Sun':
        with path(solar_models, 'Hybrid_model_DM_SUN_LZ.txt') as p:
            sun_path = str(p)
    else:
        sun_path = sun_name
    sun = make_sun(sun_path)
    return sun
        
        

#with path(solar_models, 'Hybrid_model_DM_SUN_HZ.txt') as p:
#    HZ_path = str(p)
#with path(solar_models, 'Hybrid_model_DM_SUN_LZ.txt') as p:
#    LZ_path = str(p)
#
#HZ_Sun = make_sun(HZ_path)  
#LZ_Sun = make_sun(LZ_path)  

Functions

def construct_sun(sun_name=None)
Expand source code
def construct_sun(sun_name=None):
    if sun_name=='HZ_Sun' or sun_name is None:
        with path(solar_models, 'Hybrid_model_DM_SUN_HZ.txt') as p:
            sun_path = str(p)
    elif sun_name=='LZ_Sun':
        with path(solar_models, 'Hybrid_model_DM_SUN_LZ.txt') as p:
            sun_path = str(p)
    else:
        sun_path = sun_name
    sun = make_sun(sun_path)
    return sun
def e_density_from_model(solar_model_file)
Expand source code
def e_density_from_model(solar_model_file):
    model    = np.genfromtxt(solar_model_file)
    xx       = model[:,0]
    density  = model[:,2]
    tck      = splrep(xx, np.log(density))
    return lambda x: np.exp(splev(x, tck))
def make_sun(model_file)
Expand source code
def make_sun(model_file):
    density  = mass_density_from_model(model_file)
    edensity = e_density_from_model(model_file)
    return Sun(density, 6.963e5, edensity)
def mass_density_from_model(solar_model_file)
Expand source code
def mass_density_from_model(solar_model_file):
    model   = np.genfromtxt(solar_model_file)
    xx      = model[:,0]
    density = model[:,1]
    tck = splrep(xx, np.log(density))
    return lambda x: np.exp(splev(x, tck))

Classes

class Sun (density, radius, edensity, name='Sun')

Object which defines the physical properties of the propagation medium

Params


density : Object which defines the density of the object. Either float or function that takes a radius (0<=r<=1) and returns a float, or a list of such objects. [gr/cm^3] radius : Radius of the body [meters] name : Name to give your object

Expand source code
class Sun(Body):

    def __init__(self, density, radius, edensity, name='Sun'):

        Body.__init__(self, density, radius, name=name)
        if hasattr(density, '__iter__'):# pragma: no cover
            self._edensity = [1./units.cm**3*Callable(obj) for obj in edensity]
        else:
            self._edensity = [1./units.cm**3*Callable(edensity)]

    def get_edensity(self, r):
        if r==1:
            layer_index = -1
        else:
            layer_index = np.digitize(r, self.layer_boundaries)-1
        current_edensity = self._edensity[layer_index]
        return current_edensity(r)

Ancestors

Methods

def get_edensity(self, r)
Expand source code
def get_edensity(self, r):
    if r==1:
        layer_index = -1
    else:
        layer_index = np.digitize(r, self.layer_boundaries)-1
    current_edensity = self._edensity[layer_index]
    return current_edensity(r)

Inherited members