4节点四边形单元的刚度矩阵计算

计算科学 有限元
2021-12-27 17:01:32

我正在为传热(标量场问题)编写有限元代码,并从简单的 4 节点四边形元素开始。我尝试在物理坐标系中计算电导(刚度)矩阵,并将答案与等参系统进行比较。

元素看起来像:

 |Y
 |
4 _____________3
 |             |
 |             |
 |             |
 |             |
 |             |
 |_____________|  ---->X
 1             2 

(边1-2不是直的。)节点的坐标1,2,3,4是:

1: (0,0)    
2: (2,0.5)    
3: (2,1)    
4: (0,1)

然后我对双单元进行等参数变换(e,n)

       |n
       |
4 _____________3
 |     |       |
 |     |       |
 |     |------ | ----->e
 |             |
 |             |
 |_____________|  
 1             2 

因此,节点的坐标1,2,3,4变为:

1: (-1,-1)    
2: (1,-1)    
3: (1,1)    
4: (-1,1)

我创建了一个 python simpy 脚本来计算刚度矩阵。

import sympy as sp
import numpy as np
from sympy import init_printing

n,e = sp.symbols('n e')
# shape functions in isoparametric
N1_iso = (1/4)*(e-1)*(n-1)
N2_iso = (1/4)*(e+1)*(-n+1)
N3_iso = (1/4)*(e+1)*(n+1)
N4_iso = (1/4)*(-e+1)*(n+1)

#gradient of shape function matrix in isoparametric
GN_mat = sp.Matrix([ [sp.diff(N1_iso,e),sp.diff(N2_iso,e), sp.diff(N3_iso,e), sp.diff(N4_iso,e)],
         [sp.diff(N1_iso,n),sp.diff(N2_iso,n), sp.diff(N3_iso,n), sp.diff(N4_iso,n)]])

#point matrix
P_mat = sp.Matrix([[0.0,0.0],[2.0,0.5],[2.0,1.0],[0.0,1.0]])
#Jacobian matrix
J_mat = (1.0/4.0)*(GN_mat*P_mat)

#Jacobian matrix determinant and inverse 
J_det=J_mat.det()
J_inv=J_mat.inv()

#"B" matrix, assuming unit conductivity matrix 
B_mat=J_inv*GN_mat

#conductance (stiffness) matrix
expr1 = B_mat.T*B_mat*J_det

#Double integrating conductance (stiffness) matrix
expr2 = sp.integrate(expr1,(n,-1,1))
#Stiffness (conductance) matrix using isoparametric transformation
K_mat=sp.integrate( (expr2),(e,-1,1))
print('K_mat = \n {}'.format(K_mat ))

#Now in physical coordinate system
x,y = sp.symbols('x y')
#Area of the element = 2
A=1.5

#shape function
N1 = (1/A)* (x-2)*(y-1)
N2 = (1/A)* (x-0)*(1-y)
N3 = (1/A)* (x-0)*(y-0.5)
N4 = (1/A)* (2-x)*(y-0)

B_mat2 = sp.Matrix([[sp.diff(N1,x), sp.diff(N2,x), sp.diff(N3,x), sp.diff(N4,x)],
                    [sp.diff(N1,y), sp.diff(N2,y), sp.diff(N3,y), sp.diff(N4,y)]])

expr10 = sp.integrate(B_mat2.T*B_mat2,(y,0,1))
#Stiffness (conductance) matrix using physical coordinates
K_mat2 = sp.integrate(expr10,(x,0,2))
print('     K_mat2 = \n {}'.format(K_mat2))

如果我提出第 2 点:(2,0.0),域变为矩形,我得到相同的答案。但是,如果不是这样,我会得到不同的答案K_matK_mat2有什么建议吗?

1个回答

我相信您已经知道,Galerkin 有限元方法根据有限基 希望您也知道的不同选择将给出不同的离散化,从而产生不同的矩阵问题。

T=iTiNi(x).
N

四边形的等参双线性元素 Q4您为参考四边形(您的)提供的形状函数以及从参考到物理空间的空间变换 这意味着对于给定的元素,我们可以简单地写成 给出明确的定义,我们必须颠倒上面的关系。Niso

x(e,n)=x1N1(e,n)+x2N2(e,n)+x3N3(e,n)+x4N4(e,n),
y(e,n)=y1N1(e,n)+y2N2(e,n)+y3N3(e,n)+y4N4(e,n).
Ni(x(e,n),y(e,n))=Ni(e,n),
xy

此时很明显,您选择了不同的物理基础,因为(1)您的物理形状函数不等于顶点 1 的单位,并且(2)您的形状函数不会全部消失在边缘不是由“他们的”顶点定义的。最后一点很重要,因为它保证了 Q4 表示在元素之间是连续的。更改顶点位置时代码起作用的原因是您有一个物理四边形,它是参考四边形的线性平移。在这种情况下,(微不足道的)反转确实会返回您所写的内容。N1