LINUX.ORG.RU

История изменений

Исправление Zodd, (текущая версия) :

Прошу сильно не пинать, т.к. этот кусок кода был написан давно, а также питона пока еще плохо знаю.

class Solid8():
    def __init__(self):
        self.nDef = 6
        self.nFree = 3
        self.eNode = 8
        self.eInt = 3
        self.Xi0 = [-1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0]
        self.Eta0 = [-1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0]
        self.Zeta0 = [-1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0]
        self.Jcb = np.empty((self.nFree, self.nFree))
        self.JcbInv = np.empty((self.nFree, self.nFree))
        self.B = np.zeros((self.nDef, self.nFree * self.eNode))

    def fNi(self, Xi, Eta, Zeta, i):
        return (1.0 + Xi * self.Xi0[i]) * (1.0 + Eta * self.Eta0[i])\
            * (1.0 + Zeta * self.Zeta0[i]) / 8.0

    def DNXi(self, Eta, Zeta, i):
        return self.Xi0[i] * (1.0 + Eta * self.Eta0[i])\
            * (1.0 + Zeta * self.Zeta0[i]) / 8.0

    def DNEta(self, Xi, Zeta, i):
        return self.Eta0[i] * (1.0 + Xi * self.Xi0[i])\
            * (1.0 + Zeta * self.Zeta0[i]) / 8.0

    def DNZeta(self, Xi, Eta, i):
        return self.Zeta0[i] * (1.0 + Xi * self.Xi0[i])\
            * (1.0 + Eta * self.Eta0[i]) / 8.0

    def Jacobian(self, Xi, Eta, Zeta, x0, y0, z0):
        self.Jcb = np.zeros((self.nFree, self.nFree))

        # Вычисление Jcb
        for i in xrange(self.eNode):
            self.Jcb[0, 0] += x0[i] * self.DNXi(Eta, Zeta, i)
            self.Jcb[0, 1] += y0[i] * self.DNXi(Eta, Zeta, i)
            self.Jcb[0, 2] += z0[i] * self.DNXi(Eta, Zeta, i)
            self.Jcb[1, 0] += x0[i] * self.DNEta(Xi, Zeta, i)
            self.Jcb[1, 1] += y0[i] * self.DNEta(Xi, Zeta, i)
            self.Jcb[1, 2] += z0[i] * self.DNEta(Xi, Zeta, i)
            self.Jcb[2, 0] += x0[i] * self.DNZeta(Xi, Eta, i)
            self.Jcb[2, 1] += y0[i] * self.DNZeta(Xi, Eta, i)
            self.Jcb[2, 2] += z0[i] * self.DNZeta(Xi, Eta, i)

        # Вычисление определителя
        det = np.linalg.det(self.Jcb)

        # Вычисление обратной матрицы JcbInv
        self.JcbInv = np.linalg.inv(self.Jcb)
        return det

    def DNx(self, Xi, Eta, Zeta, i):
        return self.JcbInv[0, 0] * self.DNXi(Eta, Zeta, i)\
            + self.JcbInv[0, 1] * self.DNEta(Xi, Zeta, i)\
            + self.JcbInv[0, 2] * self.DNZeta(Xi, Eta, i)

    def DNy(self, Xi, Eta, Zeta, i):
        return self.JcbInv[1, 0] * self.DNXi(Eta, Zeta, i)\
            + self.JcbInv[1, 1] * self.DNEta(Xi, Zeta, i)\
            + self.JcbInv[1, 2] * self.DNZeta(Xi, Eta, i)

    def DNz(self, Xi, Eta, Zeta, i):
        return self.JcbInv[2, 0] * self.DNXi(Eta, Zeta, i)\
            + self.JcbInv[2, 1] * self.DNEta(Xi, Zeta, i)\
            + self.JcbInv[2, 2] * self.DNZeta(Xi, Eta, i)

    def BMat(self, Xi, Eta, Zeta):
        nFree = self.nFree
        self.B.fill(0)
        for i in xrange(self.eNode):
            dnx = self.DNx(Xi, Eta, Zeta, i)
            dny = self.DNy(Xi, Eta, Zeta, i)
            dnz = self.DNz(Xi, Eta, Zeta, i)
            self.B[0, nFree * i] = dnx
            self.B[1, nFree * i + 1] = dny
            self.B[2, nFree * i + 2] = dnz
            self.B[3, nFree * i] = dny
            self.B[3, nFree * i + 1] = dnx
            self.B[4, nFree * i + 1] = dnz
            self.B[4, nFree * i + 2] = dny
            self.B[5, nFree * i] = dnz
            self.B[5, nFree * i + 2] = dnx

elem = Solid8()
x0 = [0, 1, 1, 0, 0, 1, 1, 0]
y0 = [0, 0, 1, 1, 0, 0, 1, 1]
z0 = [0, 0, 0, 0, 1, 1, 1, 1]
det = elem.Jacobian(0, 0, 0, x0, y0, z0)
elem.BMat(1, 2, 3)
print(det)
print(elem.B)

Исходная версия Zodd, :

Прошу сильно не пинать, т.к. этот кусок кода был написан давно, а также питона пока еще плохо знаю.

class Solid8():
    def __init__(self):
        self.nDef = 6
        self.nFree = 3
        self.eNode = 8
        self.eInt = 3
        self.Xi0 = [-1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0]
        self.Eta0 = [-1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0]
        self.Zeta0 = [-1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0]
        self.Jcb = np.empty((self.nFree, self.nFree))
        self.JcbInv = np.empty((self.nFree, self.nFree))
        self.B = np.zeros((self.nDef, self.nFree * self.eNode))

    def fNi(self, Xi, Eta, Zeta, i):
        return (1.0 + Xi * self.Xi0[i]) * (1.0 + Eta * self.Eta0[i])\
            * (1.0 + Zeta * self.Zeta0[i]) / 8.0

    def DNXi(self, Eta, Zeta, i):
        return self.Xi0[i] * (1.0 + Eta * self.Eta0[i])\
            * (1.0 + Zeta * self.Zeta0[i]) / 8.0

    def DNEta(self, Xi, Zeta, i):
        return self.Eta0[i] * (1.0 + Xi * self.Xi0[i])\
            * (1.0 + Zeta * self.Zeta0[i]) / 8.0

    def DNZeta(self, Xi, Eta, i):
        return self.Zeta0[i] * (1.0 + Xi * self.Xi0[i])\
            * (1.0 + Eta * self.Eta0[i]) / 8.0

    def Jacobian(self, Xi, Eta, Zeta, x0, y0, z0):
        self.Jcb = np.zeros((self.nFree, self.nFree))

        # Вычисление Jcb
        for i in xrange(self.eNode):
            self.Jcb[0, 0] += x0[i] * self.DNXi(Eta, Zeta, i)
            self.Jcb[0, 1] += y0[i] * self.DNXi(Eta, Zeta, i)
            self.Jcb[0, 2] += z0[i] * self.DNXi(Eta, Zeta, i)
            self.Jcb[1, 0] += x0[i] * self.DNEta(Xi, Zeta, i)
            self.Jcb[1, 1] += y0[i] * self.DNEta(Xi, Zeta, i)
            self.Jcb[1, 2] += z0[i] * self.DNEta(Xi, Zeta, i)
            self.Jcb[2, 0] += x0[i] * self.DNZeta(Xi, Eta, i)
            self.Jcb[2, 1] += y0[i] * self.DNZeta(Xi, Eta, i)
            self.Jcb[2, 2] += z0[i] * self.DNZeta(Xi, Eta, i)

        # Вычисление определителя
        det = np.linalg.det(self.Jcb)

        # Вычисление обратной матрицы JcbInv
        self.JcbInv = np.linalg.inv(self.Jcb)
        return det

    def DNx(self, Xi, Eta, Zeta, i):
        return self.JcbInv[0, 0] * self.DNXi(Eta, Zeta, i)\
            + self.JcbInv[0, 1] * self.DNEta(Xi, Zeta, i)\
            + self.JcbInv[0, 2] * self.DNZeta(Xi, Eta, i)

    def DNy(self, Xi, Eta, Zeta, i):
        return self.JcbInv[1, 0] * self.DNXi(Eta, Zeta, i)\
            + self.JcbInv[1, 1] * self.DNEta(Xi, Zeta, i)\
            + self.JcbInv[1, 2] * self.DNZeta(Xi, Eta, i)

    def DNz(self, Xi, Eta, Zeta, i):
        return self.JcbInv[2, 0] * self.DNXi(Eta, Zeta, i)\
            + self.JcbInv[2, 1] * self.DNEta(Xi, Zeta, i)\
            + self.JcbInv[2, 2] * self.DNZeta(Xi, Eta, i)

    def BMat(self, Xi, Eta, Zeta):
        nFree = self.nFree
        self.B.fill(0)
        for i in xrange(self.eNode):
            dnx = self.DNx(Xi, Eta, Zeta, i)
            dny = self.DNy(Xi, Eta, Zeta, i)
            dnz = self.DNz(Xi, Eta, Zeta, i)
            self.B[0, nFree * i] = dnx
            self.B[1, nFree * i + 1] = dny
            self.B[2, nFree * i + 2] = dnz
            self.B[3, nFree * i] = dny
            self.B[3, nFree * i + 1] = dnx
            self.B[4, nFree * i + 1] = dnz
            self.B[4, nFree * i + 2] = dny
            self.B[5, nFree * i] = dnz
            self.B[5, nFree * i + 2] = dnx