Source code for pumapy.physicsmodels.boundary_conditions

from pumapy.utilities.workspace import Workspace
import numpy as np


[docs]class ConductivityBC: def __init__(self, workspace): """ Conductivity prescribed boundary conditions class. This contains two arrays: :param workspace: domain :type workspace: Workspace :var dirichlet: of size (X, Y, Z), it describes voxels to keep fixed to a certain temperature :vartype dirichlet: np.ndarray """ self.dirichlet = np.full((workspace.len_x(), workspace.len_y(), workspace.len_z()), np.Inf, dtype=float)
[docs] def show_dirichlet(self): Workspace.show_matrix(self.dirichlet)
[docs]class Isotropic_symmetricBC: def __init__(self, len_x, len_y, len_z): self.len_x = len_x self.len_y = len_y self.len_z = len_z self.len_xy = self.len_x * self.len_y
[docs] def indexAt_3D(self, i, j, k): if i == -1: i = 0 if i == self.len_x: i = self.len_x - 1 if j == -1: j = 0 if j == self.len_y: j = self.len_y - 1 if k == -1: k = 0 if k == self.len_z: k = self.len_z - 1 return self.len_xy * k + self.len_x * j + i
[docs]class Isotropic_periodicBC: def __init__(self, len_x, len_y, len_z): self.len_x = len_x self.len_y = len_y self.len_z = len_z self.len_xy = self.len_x * self.len_y
[docs] def indexAt_3D(self, i, j, k): if i == -1: i = self.len_x - 1 if i == self.len_x: i = 0 if j == -1: j = self.len_y - 1 if j == self.len_y: j = 0 if k == -1: k = self.len_z - 1 if k == self.len_z: k = 0 return self.len_xy * k + self.len_x * j + i
[docs]class ElasticityBC: def __init__(self, workspace): """ Elasticity prescribed boundary conditions class. N.B. links attribute takes precedence over dirichlet if a voxel prescribed for both attributes :param workspace: domain :type workspace: Workspace Attributes: dirichlet np.ndarray of size (X, Y, Z, 3), it describes voxels and DOFs to keep fixed to a certain displacement. If unset, value is np.Inf, otherwise a float links: np.ndarray of size (X, Y, Z, 3, 4), it describes voxels to link to each other, provided as coordinates to link e.g. bc.links[2, 4, 5, 2] = [0, 0, 0, 0] links the z-component of voxel in position (2, 4, 5) to the x-component of voxel in position (0, 0, 0) indices np.ndarray of size (X, Y, Z, 3, 4) containing the indices of the domain """ self.dirichlet = np.full((workspace.len_x(), workspace.len_y(), workspace.len_z(), 3), np.Inf, dtype=float) self.links = np.full((workspace.len_x(), workspace.len_y(), workspace.len_z(), 3, 4), -1, dtype=int) self.indices = np.indices((workspace.len_x(), workspace.len_y(), workspace.len_z(), 3)).transpose((1, 2, 3, 4, 0))
[docs] def show_dirichlet(self): Workspace.show_orientation(self.dirichlet)