scikit-FEM-例2-用Morley元在方形区域上解板弯曲问题

Posted wangshixi12

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scikit-FEM-例2-用Morley元在方形区域上解板弯曲问题相关的知识,希望对你有一定的参考价值。

"""
Author: kinnala

Solve the Kirchhoff plate bending problem in a unit square
with clamped boundary conditions using the nonconforming
Morley element. Demonstrates also the visualization of
higher order solutions using ‘GlobalBasis.refinterp‘.
"""

 

from skfem import *
import numpy as np

调入 skfem 模块

调入数值运算 numpy 模块

 

m = MeshTri()
m.refine(3)

三角形剖分网格,加密 3 次

 

e = ElementTriMorley()
map = MappingAffine(m)
ib = InteriorBasis(m, e, map, 4)

ElementTriMorley:  非协调有限元 Morley 元

MappingAffine: 仿射变换

InteriorBasis:内部节点基函数

 

 1 @bilinear_form
 2 def bilinf(u, du, ddu, v, dv, ddv, w):
 3     # plate thickness
 4     d = 1.0
 5     E = 1.0
 6     nu = 0.3
 7 
 8     def C(T):
 9         trT = T[0,0] + T[1,1]
10         return np.array([[E/(1.0+nu)*(T[0, 0]+nu/(1.0-nu)*trT), E/(1.0+nu)*T[0, 1]],
11                          [E/(1.0+nu)*T[1, 0], E/(1.0+nu)*(T[1, 1]+nu/(1.0-nu)*trT)]])
12 
13     def Eps(ddU):
14         return np.array([[ddU[0][0], ddU[0][1]],
15                          [ddU[1][0], ddU[1][1]]])
16 
17     def ddot(T1, T2):
18         return T1[0, 0]*T2[0, 0] +19                T1[0, 1]*T2[0, 1] +20                T1[1, 0]*T2[1, 0] +21                T1[1, 1]*T2[1, 1]
22 
23     return d**3/12.0*ddot(C(Eps(ddu)), Eps(ddv))

调入双线性形式模块@bilinear_form

定义 双线性函数 bilinf:{

                                             定义函数C(T)

                                              定义函数Eps(ddU)

                                             定义函数 ddot(T1,T2)         }

 

@linear_form
def linf(v, dv, ddv, w):
    return 1.0*v

调入线性形式模块@linear_form

定义 线性函数 linf

 

K = asm(bilinf, ib)
f = asm(linf, ib)

组装刚度矩阵 K

组装质量向量 f

 

x, D = ib.find_dofs()
I = ib.dofnum.complement_dofs(D)

自由度

 

x[I] = solve(*condense(K, f, I=I))

求解方程 Kx=f

 

if __name__ == "__main__":
    M, X = ib.refinterp(x, 3)
    ax = m.draw()
    M.plot(X, smooth=True, edgecolors=‘‘, ax=ax)
    M.show()

ib.refinterp(x,3):3 次插值

技术分享图片

 

以上是关于scikit-FEM-例2-用Morley元在方形区域上解板弯曲问题的主要内容,如果未能解决你的问题,请参考以下文章

scikit-FEM

hdu 1859 最小长方形

UVA - 11178-Morley’s Theorem

在ORACLE中获得某个字元在一个字串中位置是哪个函式

DTOJ1001:长方形周长和面积

nyoj1099 四点坐标判断正方形