Python 我在雅可比矩阵上得到了不同的符号;在一个20节点的正方形六边形单元中,不同高斯积分点的s行列式,这是正确的吗?MWE

Python 我在雅可比矩阵上得到了不同的符号;在一个20节点的正方形六边形单元中,不同高斯积分点的s行列式,这是正确的吗?MWE,python,finite-element-analysis,Python,Finite Element Analysis,我正在尝试使用20节点六面体元素计算三维情况下的刚度和质量矩阵贡献 但我得到了非常奇怪的结果。对于不同的高斯点,雅可比矩阵无处不在(我使用3×3×3积分,所以是27点)。它可以是正的,超过1e3,负的低于1.5e3或其他,有时是0。我对雅可比矩阵的解释是,它将元素转换为参考元素以便于积分,行列式是一种查看原始元素偏离“最佳”参考形状的方式。有时行列式与元素的体积一致,但我不认为这总是正确的,或者 如果雅可比矩阵为负或非常接近零,则表示元素扭曲或节点编号错误。但对我来说,元素和节点顺序都没有错。我

我正在尝试使用20节点六面体元素计算三维情况下的刚度和质量矩阵贡献

但我得到了非常奇怪的结果。对于不同的高斯点,雅可比矩阵无处不在(我使用3×3×3积分,所以是27点)。它可以是正的,超过1e3,负的低于1.5e3或其他,有时是0。我对雅可比矩阵的解释是,它将元素转换为参考元素以便于积分,行列式是一种查看原始元素偏离“最佳”参考形状的方式。有时行列式与元素的体积一致,但我不认为这总是正确的,或者

如果雅可比矩阵为负或非常接近零,则表示元素扭曲或节点编号错误。但对我来说,元素和节点顺序都没有错。我已经对节点编号进行了两次和三次检查,但我的逻辑中仍然可能存在一些小错误或错误

我的测试用例是一个20乘20乘20的立方体。形状函数来自Carlos Felippa的书“高级有限元方法”。我遵循Abaqus中的节点顺序

对于下面的参考元素,形状函数如下所示。我使用Python中的符号工具箱集成了形状函数,请参见下面的MWE

下图只是我的参考元素和元素在全局坐标系中的一个小图。它显示了元素的轮廓,蓝色的点表示20个节点,黑色的点表示27个积分点

下面的代码是一个最小的工作示例,它为27个高斯点中的每一个打印雅可比行列式。有人能发现错误吗?虽然阅读其他人的代码总是很困难,但如果你知道FEM,我认为这种情况非常简单

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