Python 我在雅可比矩阵上得到了不同的符号;在一个20节点的正方形六边形单元中,不同高斯积分点的s行列式,这是正确的吗?MWE
我正在尝试使用20节点六面体元素计算三维情况下的刚度和质量矩阵贡献 但我得到了非常奇怪的结果。对于不同的高斯点,雅可比矩阵无处不在(我使用3×3×3积分,所以是27点)。它可以是正的,超过1e3,负的低于1.5e3或其他,有时是0。我对雅可比矩阵的解释是,它将元素转换为参考元素以便于积分,行列式是一种查看原始元素偏离“最佳”参考形状的方式。有时行列式与元素的体积一致,但我不认为这总是正确的,或者 如果雅可比矩阵为负或非常接近零,则表示元素扭曲或节点编号错误。但对我来说,元素和节点顺序都没有错。我已经对节点编号进行了两次和三次检查,但我的逻辑中仍然可能存在一些小错误或错误 我的测试用例是一个20乘20乘20的立方体。形状函数来自Carlos Felippa的书“高级有限元方法”。我遵循Abaqus中的节点顺序 对于下面的参考元素,形状函数如下所示。我使用Python中的符号工具箱集成了形状函数,请参见下面的MWE 下图只是我的参考元素和元素在全局坐标系中的一个小图。它显示了元素的轮廓,蓝色的点表示20个节点,黑色的点表示27个积分点 下面的代码是一个最小的工作示例,它为27个高斯点中的每一个打印雅可比行列式。有人能发现错误吗?虽然阅读其他人的代码总是很困难,但如果你知道FEM,我认为这种情况非常简单Python 我在雅可比矩阵上得到了不同的符号;在一个20节点的正方形六边形单元中,不同高斯积分点的s行列式,这是正确的吗?MWE,python,finite-element-analysis,Python,Finite Element Analysis,我正在尝试使用20节点六面体元素计算三维情况下的刚度和质量矩阵贡献 但我得到了非常奇怪的结果。对于不同的高斯点,雅可比矩阵无处不在(我使用3×3×3积分,所以是27点)。它可以是正的,超过1e3,负的低于1.5e3或其他,有时是0。我对雅可比矩阵的解释是,它将元素转换为参考元素以便于积分,行列式是一种查看原始元素偏离“最佳”参考形状的方式。有时行列式与元素的体积一致,但我不认为这总是正确的,或者 如果雅可比矩阵为负或非常接近零,则表示元素扭曲或节点编号错误。但对我来说,元素和节点顺序都没有错。我
import sympy as s
import numpy as np
xhi = s.Symbol('xhi')
eta = s.Symbol('eta')
my = s.Symbol('my')
# node 1-20 isoparametric values
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
xhi_i = np.array((-1, 1, 1, -1, -1, 1, 1, -1, 0, 1, 0, -1, 0, 1, 0, -1, -1, 1, 1, -1))
eta_i = np.array((-1, -1, 1, 1, -1, -1, 1, 1, -1, 0, 1, 0, -1, 0, 1, 0 , -1, -1, 1, 1))
my_i = np.array((-1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1 , 0, 0, 0, 0))
# Coordinates of my element in the global xyz coordinate system
coord = np.array(((20*xhi_i),(20*eta_i),(20*my_i))).transpose()
v = 0.3
E = 210e3
D = np.array(((1-v, v, v, 0, 0, 0),
( v, 1-v, v, 0, 0, 0),
( v, v, 1-v, 0, 0, 0),
( 0, 0, 0, (1-2*v)/2, 0, 0),
( 0, 0, 0, 0, (1-2*v)/2, 0),
( 0, 0, 0, 0, 0, (1-2*v)/2)))
D *= E/((1+v)*(1-2*v))
# Define and derive shape functions, and save a list
N = []
# list with shape function derivates in each direction:
dNdXhi, dNdEta, dNdMy = [],[],[]
for i in range(0,20):
if i+1 in [1,2,3,4,5,6,7,8]:
N_i = (1/8)*(1+xhi*xhi_i[i])*(1+eta*eta_i[i])*(1+my*my_i[i])*((my*my_i[i]) + (eta*eta_i[i]) + (my*my_i[i]) - 2)
if i+1 in [9,11,13,15]:
N_i = (1/4)*(1-(xhi*xhi))*(1+(eta*eta_i[i]))*(1+(my*my_i[i]))
if i+1 in [10,12,14,16]:
N_i = (1/4)*(1-(eta*eta))*(1+(xhi*xhi_i[i])*(1+(my*my_i[i])))
if i+1 in [17,18,19,20]:
N_i = (1/4)*(1-(my*my))*(1+(xhi*xhi_i[i])*(1+(eta*eta_i[i])))
# derive using symbolic toolbox
dNdXhi.append(s.diff(N_i,xhi))
dNdEta.append(s.diff(N_i,eta))
dNdMy.append(s.diff(N_i,my))
shape_functions_derivates = [dNdXhi,dNdEta,dNdMy]
# loop over 27 Gauss points:
# i, j & k are the points where we evaluate the stiffness contribution
for i in [-0.774596669241483, 0.0, 0.774596669241483]:
for j in [-0.774596669241483, 0.0, 0.774596669241483]:
for k in [-0.774596669241483, 0.0, 0.774596669241483]:
if i==0.0 or j==0.0 or k==0.0:
w = 0.888888888888889
else:
w= 0.555555555555556
# evaluate shape function derivates
dNdXhidEtadmy = np.zeros((3,20))
for node in range(0,19):
dNdXhidEtadmy[0,node] = dNdXhi[node].evalf(subs={xhi:i,eta:j,my:k})
dNdXhidEtadmy[1,node] = dNdEta[node].evalf(subs={xhi:i,eta:j,my:k})
dNdXhidEtadmy[2,node] = dNdMy[node].evalf(subs={xhi:i,eta:j,my:k})
# @ means matrix multiplication
Jacobian = dNdXhidEtadmy@coord
detJ = np.linalg.det(Jacobian)
print('detJ='+str(detJ)+', for xhi='+str(i)+', eta='+str(j)+', my='+str(k))
# Find stiffness- and mass matrix later by forming B matrix and some multiplications...
结果如下:
detJ=-17855.99999999991, for xhi=-0.77459, eta=-0.77459, my=-0.77459
detJ=-3.197442310920449e-13, for xhi=-0.77459, eta=-0.77459, my=0.0
detJ=-17855.99999999994, for xhi=-0.77459, eta=-0.77459, my=0.77459
detJ=8063.999999999968, for xhi=-0.77459, eta=0.0, my=-0.77459
detJ=8.758115402030098e-47, for xhi=-0.77459, eta=0.0, my=0.0
detJ=8063.999999999968, for xhi=-0.77459, eta=0.0, my=0.77459
detJ=-17855.99999999994, for xhi=-0.77459, eta=0.77459, my=-0.77459
detJ=3.197442310920437e-13, for xhi=-0.77459, eta=0.77459, my=0.0
detJ=-17855.99999999994, for xhi=-0.77459, eta=0.77459, my=0.77459
detJ=-4607.999999999974, for xhi=0.0, eta=-0.77459, my=-0.77459
detJ=1.2621774483536082e-29, for xhi=0.0, eta=-0.77459, my=0.0
detJ=-4607.999999999974, for xhi=0.0, eta=-0.77459, my=0.77459
detJ=5759.999999999983, for xhi=0.0, eta=0.0, my=-0.77459
detJ=0.0, for xhi=0.0, eta=0.0, my=0.0
detJ=5759.999999999983, for xhi=0.0, eta=0.0, my=0.77459
detJ=-4607.999999999974, for xhi=0.0, eta=0.77459, my=-0.77459
detJ=1.2621774483536262e-29, for xhi=0.0, eta=0.77459, my=0.0
detJ=-4607.999999999974, for xhi=0.0, eta=0.77459, my=0.77459
detJ=-17855.99999999994, for xhi=0.77459, eta=-0.77459, my=-0.77459
detJ=1.385558334732187e-12, for xhi=0.77459, eta=-0.77459, my=0.0
detJ=-17855.99999999994, for xhi=0.77459, eta=-0.77459, my=0.77459
detJ=8063.999999999968, for xhi=0.77459, eta=0.0, my=-0.77459
detJ=0.0, for xhi=0.77459, eta=0.0, my=0.0
detJ=8063.999999999968, for xhi=0.77459, eta=0.0, my=0.77459
detJ=-17855.99999999994, for xhi=0.77459, eta=0.77459, my=-0.77459
detJ=3.197442310920437e-13, for xhi=0.77459, eta=0.77459, my=0.0
detJ=-17855.99999999994, for xhi=0.77459, eta=0.77459, my=0.77459