Source code for tyssue.core.multisheet
import numpy as np
import pandas as pd
from scipy.interpolate import Rbf
from .sheet import Sheet
[docs]class MultiSheet:
def __init__(self, name, layer_datasets, specs):
self.coords = ["x", "y", "z"]
self.layers = [
Sheet("{}_{}".format(name, i), dsets, specs, coords=self.coords)
for i, dsets in enumerate(layer_datasets)
]
for i, layer in enumerate(self):
for dset in layer.datasets.values():
dset["layer"] = i
def __iter__(self):
for layer in self.layers:
yield layer
def __getitem__(self, n):
return self.layers[n]
def __len__(self):
return len(self.layers)
@property
def Nes(self):
return [layer.Ne for i, layer in self]
@property
def Nvs(self):
return [layer.Nv for i, layer in self]
@property
def Nfs(self):
return [layer.Nf for i, layer in self]
@property
def v_idxs(self):
return np.array([sheet.Nv for sheet in self]).cumsum()
@property
def f_idxs(self):
return np.array([sheet.Nf for sheet in self]).cumsum()
@property
def e_idxs(self):
return np.array([sheet.Ne for sheet in self]).cumsum()
[docs] def concat_datasets(self):
datasets = {}
v_dfs = [self[0].vert_df]
e_dfs = [self[0].edge_df]
f_dfs = [self[0].face_df]
v_shift = 0
f_shift = 0
e_shift = 0
for lower, upper in zip(self[:-1], self[1:]):
v_shift += lower.Nv
v_dfs.append(upper.vert_df.set_index(upper.vert_df.index + v_shift))
f_shift += lower.Nf
f_dfs.append(upper.face_df.set_index(upper.face_df.index + f_shift))
e_shift += lower.Ne
shifted_edge_df = upper.edge_df.set_index(upper.edge_df.index + e_shift)
shifted_edge_df[["srce", "trgt"]] += v_shift
shifted_edge_df["face"] += f_shift
e_dfs.append(shifted_edge_df)
for key, dfs in zip(["edge", "face", "vert"], [e_dfs, f_dfs, v_dfs]):
datasets[key] = pd.concat(dfs)
return datasets
[docs] def update_interpolants(self):
self.interpolants = [
Rbf(
sheet.vert_df["x"],
sheet.vert_df["y"],
sheet.vert_df["z"],
**sheet.specs["settings"]["interpolate"]
)
for sheet in self
]
# for interp in self.interpolants:
# interp.nodes = interp.nodes.clip(-1e2, 1e2)