from simframe import Frame
import numpy as np
from scipy.interpolate import interp1d
from simframe.io.writers import hdf5writer
from types import SimpleNamespace
import warnings
[docs]
def read_data(data, filename="data", extension="hdf5", Na=50):
"""
Function returns a SimpleNamespace with the most useful
data that can be used for plotting or other purposes.
This avoids reading the entirety of data files.
Parameters
----------
data : str | dustpy.Simulation
Either a path to the data directory or a TriPoD
simulation frame
filename : str, optional, default: "data"
Stem of the data files in the data directory
extension : str, optional, default: "hdf5"
File extension of the data file in the data directory
Returns
-------
data : SimpleNamespace
SimpleNamespace with the extracted data fields
"""
# Loading data
if isinstance(data, Frame):
# Loading from Simulation object and expanding dimension
# Simulation
t = data.t[None, ...]
# Dust
deltaTurb = data.dust.delta.turb[None, ...]
eps = data.dust.eps[None, ...]
SigmaDust = data.dust.Sigma[None, ...]
St = data.dust.St[None, ...]
vFrag = data.dust.v.frag[None, ...]
# Gas
cs = data.gas.cs[None, ...]
SigmaGas = data.gas.Sigma[None, ...]
# Grid
OmegaK = data.grid.OmegaK[None, ...]
m = data.grid.m[None, ...]
r = data.grid.r[None, ...]
ri = data.grid.ri[None, ...]
else:
# Loading from data directory
wrtr = hdf5writer(datadir=data, filename=filename, extension=extension)
# Simulation
t = wrtr.read.sequence("t")
# Dust
deltaTurb = wrtr.read.sequence("dust.delta.turb")
eps = wrtr.read.sequence("dust.eps")
SigmaDust = wrtr.read.sequence("dust.Sigma")
St = wrtr.read.sequence("dust.St")
vFrag = wrtr.read.sequence("dust.v.frag")
# Gas
cs = wrtr.read.sequence("gas.cs")
SigmaGas = wrtr.read.sequence("gas.Sigma")
# Grid
OmegaK = wrtr.read.sequence("grid.OmegaK")
m = wrtr.read.sequence("grid.m")
r = wrtr.read.sequence("grid.r")
ri = wrtr.read.sequence("grid.ri")
# Computations
# Helper variables
Nt, Nr, Nm = SigmaDust.shape
vK = r*OmegaK
# Masses
Mdust = np.pi * ((ri[:, 1:]**2-ri[:, :-1]**2) * SigmaDust.sum(-1)).sum(-1)
Mgas = np.pi * ((ri[:, 1:]**2-ri[:, :-1]**2) * SigmaGas).sum(-1)
# Transformation of the density distribution
a = np.array(np.mean(m[..., 1:] / m[..., :-1], axis=-1))
dm = np.array(2. * (a - 1.) / (a + 1.))
sigmaDust = SigmaDust[...] / dm[..., None, None]
# Size limits
# Fragmentation limited Stokes number
b = vFrag**2 / (deltaTurb * cs**2)
with warnings.catch_warnings():
warnings.filterwarnings(
'ignore',
r'invalid value encountered in sqrt')
StFr = 1 / (2 * b) * (3 - np.sqrt(9 - 4 * b**2))
# Drift limited Stokes number
p = SigmaGas * OmegaK * cs / np.sqrt(2.*np.pi)
StDr = np.zeros_like(StFr)
for i in range(int(Nt)):
_f = interp1d(np.log10(r[i, ...]), np.log10(
p[i, ...]), fill_value='extrapolate')
pi = 10.**_f(np.log10(ri[i, ...]))
gamma = np.abs(r[i, ...] / p[i, ...] *
np.diff(pi) / np.diff(ri[i, ...]))
StDr[i, ...] = eps[i, ...] / gamma * (vK[i, ...] / cs[i, ...])**2
# Assemble return object
ret = {}
# Simulation
ret["t"] = t
ret["Nt"] = Nt
# Grid
ret_grid = {}
ret_grid["m"] = m
ret_grid["Nm"] = Nm
ret_grid["r"] = r
ret_grid["ri"] = ri
ret_grid["Nr"] = Nr
ret_grid["OmegaK"] = OmegaK
ret["grid"] = SimpleNamespace(**ret_grid)
# Gas
ret_gas = {}
ret_gas["cs"] = cs
ret_gas["M"] = Mgas
ret_gas["Sigma"] = SigmaGas
ret["gas"] = SimpleNamespace(**ret_gas)
# Dust
ret_dust = {}
ret_dust["eps"] = eps
ret_dust["delta"] = SimpleNamespace(**{"turb": deltaTurb})
ret_dust["M"] = Mdust
ret_dust["sigma"] = sigmaDust
ret_dust["Sigma"] = SigmaDust
ret_dust["St"] = St
ret_dust["St_limits"] = SimpleNamespace(**{"drift": StDr, "frag": StFr})
ret_dust["v"] = SimpleNamespace(**{"frag": vFrag})
ret["dust"] = SimpleNamespace(**ret_dust)
return SimpleNamespace(**ret)