Source code for pysme.atmosphere.krzfile
# -*- coding: utf-8 -*-
import re
from os.path import basename
import numpy as np
from ..abund import Abund
from .atmosphere import Atmosphere
[docs]class KrzFile(Atmosphere):
"""Read .krz atmosphere files"""
def __init__(self, filename, source=None):
super().__init__()
if source is None:
self.source = basename(filename)
else:
self.source = source
self.method = "embedded"
self.citation_info = r"""
@MISC{2017ascl.soft10017K,
author = {{Kurucz}, Robert L.},
title = "{ATLAS9: Model atmosphere program with opacity distribution functions}",
keywords = {Software},
year = "2017",
month = "Oct",
eid = {ascl:1710.017},
pages = {ascl:1710.017},
archivePrefix = {ascl},
eprint = {1710.017},
adsurl = {https://ui.adsabs.harvard.edu/abs/2017ascl.soft10017K},
adsnote = {Provided by the SAO/NASA Astrophysics Data System}}
"""
self.load(filename)
[docs] def load(self, filename):
"""
Load data from disk
Parameters
----------
filename : str
name of the file to load
"""
# TODO: this only works for some krz files
# 1..2 lines header
# 3 line opacity
# 4..13 elemntal abundances
# 14.. Table data for each layer
# Rhox Temp XNE XNA RHO
with open(filename, "r") as file:
header1 = file.readline()
header2 = file.readline()
opacity = file.readline()
abund = [file.readline() for _ in range(10)]
table = file.readlines()
# Combine the first two lines
header = header1 + header2
# Parse header
# vturb
try:
self.vturb = float(re.findall(r"VTURB=?\s*(\d)", header, flags=re.I)[0])
except IndexError:
self.vturb = 0
try:
self.lonh = float(re.findall(r"L/H=?\s*(\d+.?\d*)", header, flags=re.I)[0])
except IndexError:
self.lonh = 0
self.teff = float(re.findall(r"T ?EFF=?\s*(\d+.?\d*)", header, flags=re.I)[0])
self.logg = float(
re.findall(r"GRAV(ITY)?=?\s*(\d+.?\d*)", header, flags=re.I)[0][1]
)
model_type = re.findall(r"MODEL TYPE=?\s*(\d)", header, flags=re.I)[0]
self.model_type = int(model_type)
model_type_key = {0: "rhox", 1: "tau", 3: "sph"}
self.depth = model_type_key[self.model_type]
self.geom = "pp"
self.wlstd = float(re.findall(r"WLSTD=?\s*(\d+.?\d*)", header, flags=re.I)[0])
# parse opacity
i = opacity.find("-")
opacity = opacity[:i].split()
self.opflag = np.array([int(k) for k in opacity])
# parse abundance
pattern = np.genfromtxt(abund).flatten()[:-1]
pattern[1] = 10 ** pattern[1]
self.abund = Abund(monh=0, pattern=pattern, type="sme")
# parse table
self.table = np.genfromtxt(table, delimiter=",", usecols=(0, 1, 2, 3, 4))
self.rhox = self.table[:, 0]
self.temp = self.table[:, 1]
self.xne = self.table[:, 2]
self.xna = self.table[:, 3]
self.rho = self.table[:, 4]