Source code for sigmaepsilon.solid.fourier.proc

# -*- coding: utf-8 -*-
import numpy as np
from numpy import ndarray
from numba import njit, prange

from neumann import squeeze
from neumann.linalg.solve import npsolve
from neumann.linalg import inv2x2, inv3x3


@squeeze(True)
def linsolve(LHS: ndarray, RHS: ndarray, *args, **kwarg):
    if len(LHS.shape) > 2:
        return linsolve2d(LHS, RHS)
    else:
        pass


[docs]@njit(nogil=True, parallel=True, cache=True) def linsolve_Bernoulli(A: ndarray, B: ndarray): """ Calculates unknowns for Bernoulli Beams. """ nLHS, N = A.shape nRHS = B.shape[0] res = np.zeros((nRHS, nLHS, N)) for i in prange(nRHS): for j in prange(nLHS): for n in prange(N): res[i, j, n] = B[i, n] / A[j, n] return res
[docs]@njit(nogil=True, parallel=True, cache=True) def linsolve_Timoshenko(A: ndarray, B: ndarray): """ Calculates unknowns for Bernoulli Beams. """ nLHS, nMN = A.shape[:2] nRHS = B.shape[0] res = np.zeros((nRHS, nLHS, nMN, 2)) for i in prange(nRHS): for j in prange(nLHS): for k in prange(nMN): res[i, j, k] = inv2x2(A[j, k]) @ B[i, k] return res
@njit(nogil=True, parallel=True, cache=True) def linsolve2d(A: ndarray, B: ndarray): nLHS, nMN = A.shape[:2] nV = A.shape[-1] nRHS = B.shape[0] res = np.zeros((nRHS, nLHS, nMN, nV)) if nV == 3: for i in prange(nRHS): for j in prange(nLHS): for k in prange(nMN): res[i, j, k] = npsolve(A[j, k], B[i, k]) #res[i, j, k] = inv3x3(A[j, k]) @ B[i, k] else: for i in prange(nRHS): for j in prange(nLHS): for k in prange(nMN): res[i, j, k] = npsolve(A[j, k], B[i, k]) #res[i, j, k] = inv2x2(A[j, k]) @ B[i, k] return res