История изменений
Исправление 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