Source code for tyssue.dynamics.sheet_gradients

"""
Base gradients for sheet like geometries
"""

import numpy as np
import pandas as pd

from ..utils.utils import to_nd  # _to_3d, _to_2d


[docs]def height_grad(sheet): w = sheet.settings.get("height_axis", "z") u, v = (c for c in sheet.coords if c != w) coords = [u, v, w] if sheet.settings.get("geometry", "cylindrical") == "cylindrical": r_to_rho = sheet.vert_df[coords] / to_nd(sheet.vert_df["rho"], 3) r_to_rho[w] = 0.0 elif sheet.settings.get("geometry") == "flat": r_to_rho = sheet.vert_df[coords].copy() r_to_rho[[u, v]] = 0.0 r_to_rho[[w]] = 1.0 elif sheet.settings.get("geometry") == "spherical": r_to_rho = sheet.vert_df[coords] / to_nd(sheet.vert_df["rho"], 3) return r_to_rho
[docs]def area_grad(sheet): coords = sheet.coords ncoords = sheet.ncoords inv_area = sheet.edge_df.eval("1 / (4 * sub_area)") # Some segmentations create null areas inv_area.replace(np.inf, 0, inplace=True) inv_area.replace(-np.inf, 0, inplace=True) face_pos = sheet.edge_df[["f" + c for c in coords]].values srce_pos = sheet.edge_df[["s" + c for c in coords]].values trgt_pos = sheet.edge_df[["t" + c for c in coords]].values r_ak = srce_pos - face_pos r_aj = trgt_pos - face_pos inv_area = to_nd(inv_area, 3) grad_a_srce = inv_area * np.cross(r_aj, sheet.edge_df[ncoords]) grad_a_trgt = inv_area * np.cross(sheet.edge_df[ncoords], r_ak) return ( pd.DataFrame(grad_a_srce, index=sheet.edge_df.index, columns=sheet.coords), pd.DataFrame(grad_a_trgt, index=sheet.edge_df.index, columns=sheet.coords), )