LINUX.ORG.RU

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

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

Вот для примера не оптимизированный код, еще написанный несколько лет назад.
Очень много раз вызывается и занимает существенное время в расчете.

def DNx(self, Xi, Eta, Zeta, i):
        '''DNx - производная от функция формы fNi по x в лок. коорд.'''
        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):
        '''DNy - производная от функция формы fNi по y в лок. коорд.'''
        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):
        '''DNz - производная от функция формы fNi по z в лок. коорд.'''
        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):
        '''Подпрограмма для вычисления матрицы связи (B) между перемещениями и
        деформациями (eps=B*u).'''
        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

Есть варианты как ускорить, или на си переносить?

Исправление Zodd, :

Вот для примера не оптимизированный код, еще написанный несколько лет назад. Очень много раз вызывается и занимает существенное время в расчете.

def DNx(self, Xi, Eta, Zeta, i):
        '''DNx - производная от функция формы fNi по x в лок. коорд.'''
        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):
        '''DNy - производная от функция формы fNi по y в лок. коорд.'''
        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):
        '''DNz - производная от функция формы fNi по z в лок. коорд.'''
        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):
        '''Подпрограмма для вычисления матрицы связи (B) между перемещениями и
        деформациями (eps=B*u).'''
        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

Есть варианты как ускорить, или на си переносить?

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

Вот для примера не оптимизированный код, еще написанный несколько лет назад. Очень много раз вызывается и занимает существенное время в расчете.

def DNx(self, Xi, Eta, Zeta, i):
        '''DNx - производная от функция формы fNi по x в лок. коорд.'''
        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):
        '''DNy - производная от функция формы fNi по y в лок. коорд.'''
        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):
        '''DNz - производная от функция формы fNi по z в лок. коорд.'''
        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):
        '''Подпрограмма для вычисления матрицы связи (B) между перемещениями и
        деформациями (eps=B*u).'''
        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