等参单元与坐标变化
矩形单元比三角形单元有更高的精度,但它不适应不规则形状。而任意直线四边形单元可以适应不规则形状。但问题是,如果有一边的边界方程为 y = b x + c y=bx+c y=bx+c,代入位移插值函数 u = α 1 + α 2 x + α 3 y + α 4 x y = α 1 + α 2 x + α 3 ( b x + c ) + α 4 x ( b x + c ) = β 1 + β 2 x + β 3 x 2 u=α_{1}+α_{2}x+α_{3}y+α_{4}xy=α_{1}+α_{2}x+α_{3}(bx+c)+α_{4}x(bx+c)=β_{1}+β_{2}x+β_{3}x^{2} u=α1+α2x+α3y+α4xy=α1+α2x+α3(bx+c)+α4x(bx+c)=β1+β2x+β3x2,显然,在边界上位移不再是线性分布,因而不能由节点位移惟一确定,即:即使相邻两单元节点位移相同,也不能保证边界位移连续。这就限制了四边形单元的应用范围。因此,为了实际应用,寻找适当方式,将规则单元转化为曲线单元,是非常必要的。普遍采用的方法是 等参变换,即单元 几何形状和单元内的 位移函数采用相同的数目的结点参数和插值函数进行变换。采用等参变换后,关键问题是将整体坐标系里的单元刚度、荷载等单元特性变换为局部坐标系中计算。
等参单元的概念
如图所示的两套坐标系,一套是 Oxy ,用于实际单元,称为子单元;一套是Oξη ,它是标准后化的正方形单元,称为母单元。从母单元项子单元变换,实际上就是建立两个坐标系之间的变换关系,即:
A
′
(
x
,
y
)
=
f
(
A
(
ξ
,
η
)
)
A^{'}(x,y)=f(A(ξ,η))
A′(x,y)=f(A(ξ,η))
将整体坐标用插值形式表示,即:
x
=
∑
i
=
1
N
i
(
ξ
,
η
)
x
i
,
y
=
∑
i
=
1
N
i
(
ξ
,
η
)
y
i
x=\sum_{i=1}N_{i}(ξ,η)x_{i},y=\sum_{i=1}N_{i}(ξ,η)y_{i}
x=i=1∑Ni(ξ,η)xi,y=i=1∑Ni(ξ,η)yi
(
x
i
,
y
i
)
(x_{i},y_{i})
(xi,yi)为整体坐标系下各顶点的坐标;其中,Ni称为插值函数(形函数)。通过这一变换,对母单元上每一点(ξ,η)可以在实际单元中找到一对应点(x,y),这样就在两个单元间建立了一一对应关系。
在实际单元中建立位移函数的插值形式:
(1)
u
=
∑
i
=
1
N
i
(
ξ
,
η
)
u
i
,
v
=
∑
i
=
1
N
i
(
ξ
,
η
)
v
i
u=\sum_{i=1}N_{i}(ξ,η)u_{i},v=\sum_{i=1}N_{i}(ξ,η)v_{i}\tag{1}
u=i=1∑Ni(ξ,η)ui,v=i=1∑Ni(ξ,η)vi(1)
因为坐标变换和位移变换都用同样个数的相应的节点值做参数,并且具有完全相同的形函数作为变换系数,所以称这种单元为等参数单元。
坐标变换
(2) x = ∑ i = n N i ( ξ , η ) x i ( n = i , j , k , m . . . ) , y = ∑ i = n N i ( ξ , η ) y i ( n = i , j , k , m . . . ) x=\sum_{i=n}N_{i}(ξ,η)x_{i}(n=i,j,k,m...), y=\sum_{i=n}N_{i}(ξ,η)y_{i}(n=i,j,k,m...) \tag{2} x=i=n∑Ni(ξ,η)xi(n=i,j,k,m...),y=i=n∑Ni(ξ,η)yi(n=i,j,k,m...)(2)
几何方程及雅可比矩阵
(3)
{
ε
}
=
{
ε
x
ε
y
γ
x
y
}
=
{
∂
u
∂
x
∂
v
∂
y
∂
v
∂
x
+
∂
u
∂
y
}
\left\{\begin{matrix} ε \end{matrix} \right\}= \left\{\begin{matrix} ε_{x}\\ ε_{y}\\ γ_{xy}\\ \end{matrix} \right\}= \left\{\begin{matrix} \frac{\partial u}{\partial x}\\ \frac{\partial v}{\partial y}\\ \frac{\partial v}{\partial x}+\frac{\partial u}{\partial y}\\ \end{matrix} \right\}\tag{3}
{ε}=⎩⎨⎧εxεyγxy⎭⎬⎫=⎩⎨⎧∂x∂u∂y∂v∂x∂v+∂y∂u⎭⎬⎫(3)
将(1)式带入(3)式可得:
{
ε
}
=
[
∂
∂
x
0
0
∂
∂
y
∂
∂
y
∂
∂
x
]
∗
[
N
1
N
2
N
3
N
4
.
.
.
]
∗
[
u
1
v
1
u
2
v
2
u
3
v
3
u
4
v
4
.
.
.
.
.
.
]
\left\{\begin{matrix} ε \end{matrix} \right\}= \left[ \begin{matrix} \frac{\partial }{\partial x}&0\\ 0&\frac{\partial }{\partial y}\\ \frac{\partial }{\partial y}&\frac{\partial }{\partial x} \end{matrix} \right]* \left[\begin{matrix} N_{1}&N_{2}&N_{3}&N_{4}&... \end{matrix} \right]* \left[\begin{matrix} u_{1}&v_{1}\\ u_{2}&v_{2}\\ u_{3}&v_{3}\\ u_{4}&v_{4}\\ ...&...\\ \end{matrix} \right]
{ε}=⎣⎡∂x∂0∂y∂0∂y∂∂x∂⎦⎤∗[N1N2N3N4...]∗⎣⎢⎢⎢⎢⎡u1u2u3u4...v1v2v3v4...⎦⎥⎥⎥⎥⎤
求上式
∂
N
i
∂
x
,
∂
N
i
∂
y
\frac{\partial N_{i}}{\partial x},\frac{\partial N_{i}}{\partial y}
∂x∂Ni,∂y∂Ni,由复合函数求导可得:
(4)
∂
N
i
∂
ξ
=
∂
N
i
∂
x
∂
x
∂
ξ
+
∂
N
i
∂
y
∂
y
∂
ξ
∂
N
i
∂
η
=
∂
N
i
∂
x
∂
x
∂
η
+
∂
N
i
∂
y
∂
y
∂
η
\frac{\partial N_{i}}{\partial ξ}=\frac{\partial N_{i}}{\partial x}\frac{\partial x}{\partial ξ}+\frac{\partial N_{i}}{\partial y}\frac{\partial y}{\partial ξ}\newline \newline\frac{\partial N_{i}}{\partial η}=\frac{\partial N_{i}}{\partial x}\frac{\partial x}{\partial η}+\frac{\partial N_{i}}{\partial y}\frac{\partial y}{\partial η}\tag{4}
∂ξ∂Ni=∂x∂Ni∂ξ∂x+∂y∂Ni∂ξ∂y∂η∂Ni=∂x∂Ni∂η∂x+∂y∂Ni∂η∂y(4)
即:
{
∂
N
i
∂
ξ
∂
N
i
∂
η
}
=
[
J
]
{
∂
N
i
∂
x
∂
N
i
∂
y
}
\left\{\begin{matrix} \frac{\partial N_{i}}{\partial ξ}\\ \frac{\partial N_{i}}{\partial η} \end{matrix} \right\}=[J] \left\{\begin{matrix} \frac{\partial N_{i}}{\partial x}\\ \frac{\partial N_{i}}{\partial y} \end{matrix} \right\}
{∂ξ∂Ni∂η∂Ni}=[J]{∂x∂Ni∂y∂Ni}
其中矩阵[J]为雅可比矩阵
[
J
]
=
[
∂
x
∂
ξ
∂
y
∂
ξ
∂
x
∂
η
∂
y
∂
η
]
=
[
∑
∂
N
i
∂
ξ
x
i
∑
∂
N
i
∂
ξ
y
i
∑
∂
N
i
∂
η
x
i
∑
∂
N
i
∂
η
y
i
]
=
{
∂
N
1
∂
ξ
∂
N
2
∂
ξ
∂
N
3
∂
ξ
∂
N
4
∂
ξ
∂
N
1
∂
η
∂
N
2
∂
η
∂
N
3
∂
η
∂
N
4
∂
η
}
∗
{
x
1
y
1
x
2
y
2
x
3
y
3
x
4
y
4
}
\left[\begin{matrix} J \end{matrix} \right]= \left[\begin{matrix} \frac{\partial x}{\partial ξ}&\frac{\partial y}{\partial ξ}\\ \frac{\partial x}{\partial η}&\frac{\partial y}{\partial η}\\ \end{matrix} \right]=\left[\begin{matrix} \sum\frac{\partial N_{i}}{\partial ξ}x_{i}&\sum\frac{\partial N_{i}}{\partial ξ}y_{i}\\ \sum\frac{\partial N_{i}}{\partial η}x_{i}&\sum\frac{\partial N_{i}}{\partial η}y_{i}\\ \end{matrix} \right]= \left\{\begin{matrix} \frac{\partial N_{1}}{\partial ξ}&\frac{\partial N_{2}}{\partial ξ}&\frac{\partial N_{3}}{\partial ξ}&\frac{\partial N_{4}}{\partial ξ}\\ \frac{\partial N_{1}}{\partial η}&\frac{\partial N_{2}}{\partial η}&\frac{\partial N_{3}}{\partial η}&\frac{\partial N_{4}}{\partial η}\\ \end{matrix} \right\}*\left\{\begin{matrix} x_{1}&y_{1}\\ x_{2}&y_{2}\\ x_{3}&y_{3}\\ x_{4}&y_{4}\\ \end{matrix} \right\}
[J]=[∂ξ∂x∂η∂x∂ξ∂y∂η∂y]=[∑∂ξ∂Nixi∑∂η∂Nixi∑∂ξ∂Niyi∑∂η∂Niyi]={∂ξ∂N1∂η∂N1∂ξ∂N2∂η∂N2∂ξ∂N3∂η∂N3∂ξ∂N4∂η∂N4}∗⎩⎪⎪⎨⎪⎪⎧x1x2x3x4y1y2y3y4⎭⎪⎪⎬⎪⎪⎫
因此:
{
∂
N
i
∂
x
∂
N
i
∂
y
}
=
[
J
]
−
1
∗
{
∂
N
i
∂
ξ
∂
N
i
∂
η
}
\left\{\begin{matrix} \frac{\partial N_{i}}{\partial x}\\ \frac{\partial N_{i}}{\partial y} \end{matrix} \right\}=[J]^{-1}*\left\{\begin{matrix} \frac{\partial N_{i}}{\partial ξ}\\ \frac{\partial N_{i}}{\partial η} \end{matrix} \right\}
{∂x∂Ni∂y∂Ni}=[J]−1∗{∂ξ∂Ni∂η∂Ni}
雅可比矩阵实现(JuliaFEM)
在JuliaFEM的FEMBasis包中math.jl中实现了雅可比矩阵的计算,函数需要三个参数分别为:
- 单元类型
- 整体坐标系下节点的坐标值,即上述 ( x i , y i ) (x_{i},y_{i}) (xi,yi)
- 待求点的局部坐标系下的坐标值
首先需要计算 ∂ N i ∂ ξ , ∂ N i ∂ η \frac{\partial N_{i}}{\partial ξ},\frac{\partial N_{i}}{\partial η} ∂ξ∂Ni,∂η∂Ni,需要用到eval_dbasis(B, xi)函数,B为单元类型,xi为待求点的局部坐标系下的坐标值。详见有限元形函数及JuliaFEM中的实现方式。
'''
jacobian(B, X, xi)
Given basis B, calculate jacobian at xi.
# Example
#单元类型
B = Quad4()
#整体坐标系下的节点坐标
X = ([0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0])
#(0.0, 0.0)为待求点的局部坐标系下的坐标
jacobian(B, X, (0.0, 0.0))
# output
2×2 Array{Float64,2}:
0.5 0.0
0.0 0.5
'''
function jacobian(B, X, xi)
#dB求dN/dξ,dN/dη
dB = eval_dbasis(B, xi)
dim1, nbasis = size(B)
dim2 = length(first(X))
J = zeros(dim1, dim2)
for i=1:dim1
for j=1:dim2
for k=1:nbasis
#分项相乘后累加
J[i,j] += dB[i,k]*X[k][j]
end
end
end
return J
end
grad函数是对 { ∂ N i ∂ x ∂ N i ∂ y } \left\{\begin{matrix} \frac{\partial N_{i}}{\partial x}\\ \frac{\partial N_{i}}{\partial y} \end{matrix} \right\} {∂x∂Ni∂y∂Ni}的求解,
'''
grad(B, X, xi)
Given basis B, calculate gradient dN/dX at xi.
# Example
B = Quad4()
X = ([0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0])
grad(B, X, (0.0, 0.0))
# output
2×4 Array{Float64,2}:
-0.5 0.5 0.5 -0.5
-0.5 -0.5 0.5 0.5
'''
function grad(B, X, xi)
J = jacobian(B, X, xi)
dB = eval_dbasis(B, xi)
G = inv(J) * dB
return G
end
由(4)式可知, { ε } = { ∂ u ∂ x ∂ v ∂ y ∂ v ∂ x + ∂ u ∂ y } \left\{\begin{matrix} ε \end{matrix} \right\}=\left\{\begin{matrix} \frac{\partial u}{\partial x}\\ \frac{\partial v}{\partial y}\\ \frac{\partial v}{\partial x}+\frac{\partial u}{\partial y}\\ \end{matrix} \right\} {ε}=⎩⎨⎧∂x∂u∂y∂v∂x∂v+∂y∂u⎭⎬⎫ u,v为各节点的整体坐标系的位移,在math.jl中另一个grad(B, T, X, xi)函数即用于求解上式的应变,此处的T为单元各节点的整体坐标系下的位移向量。求得的结果为: [ ∑ ∂ N i ∂ x u i ∑ ∂ N i ∂ x v i ∑ ∂ N i ∂ y u i ∑ ∂ N i ∂ y v i ] = [ ∂ u ∂ x ∂ v ∂ x ∂ u ∂ y ∂ v ∂ y ] \left[ \begin{matrix} \sum\frac{\partial N_{i}}{\partial x}u_{i}&\sum\frac{\partial N_{i}}{\partial x}v_{i}\\ \sum\frac{\partial N_{i}}{\partial y}u_{i}&\sum\frac{\partial N_{i}}{\partial y}v_{i}\\ \end{matrix} \right]= \left[ \begin{matrix} \frac{\partial u}{\partial x}&\frac{\partial v}{\partial x}\\ \frac{\partial u}{\partial y}&\frac{\partial v}{\partial y}\\ \end{matrix} \right] [∑∂x∂Niui∑∂y∂Niui∑∂x∂Nivi∑∂y∂Nivi]=[∂x∂u∂y∂u∂x∂v∂y∂v]
grad(B, T, X, xi)
Calculate gradient of `T` with respect to `X` in point `xi` using basis `B`.
# Example
B = Quad4()
X = ([0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0])
u = ([0.0, 0.0], [1.0, -1.0], [2.0, 3.0], [0.0, 0.0])
grad(B, u, X, (0.0, 0.0))
# output
2×2 Array{Float64,2}:
1.5 0.5
1.0 2.0
"""
function grad(B, T, X, xi)
#B的行函数的梯度
G = grad(B, X, xi)
nbasis = length(B)
#与[T]的内积
dTdX = sum(kron(G[:,i], T[i]') for i=1:nbasis)
return dTdX'
end