Getfemで領域ごとに質量行列を設定できたため、方法を共有する。
In [1]:
import getfem as gf
import numpy as np
今回は簡単のため、1次元2要素のモデルで作成を行う。
In [2]:
m = gf.Mesh('cartesian', np.arange(3))
print m
In [3]:
mfu = gf.MeshFem(m, 1)
mfu.set_fem(gf.Fem('FEM_PK(1,1)'))
mfd = gf.MeshFem(m, 1)
mfd.set_fem(gf.Fem('FEM_PK(1,1)'))
print mfu
print mfd
In [4]:
mim = gf.MeshIm(m, gf.Integ('IM_GAUSS1D(1)'))
print mim
ここからが、本題。メッシュに領域を設定する。今回CONVEXは2個なので、2個定義する。
In [5]:
m.set_region(1, 0)
m.set_region(2, 1)
print m
"CONVESX 0"と"CONVEX 1"に対してそれぞれの要素行列のみ作成できれば、異なる物性値を定義してそれを後から重ね合わせられる。まずは全領域(-1)で作成してみる。
In [6]:
gf.asm_mass_matrix(mim, mfu, mfu, -1).full()
Out[6]:
次に、領域1に対して作成する。
In [7]:
gf.asm_mass_matrix(mim, mfu, mfu, 1).full()
Out[7]:
領域2も同様に作成できる。
In [8]:
gf.asm_mass_matrix(mim, mfu, mfu, 2).full()
Out[8]:
以上のように各領域に対して行列を作成できた。後は異なる質量密度を掛け重ね合わせれば良い。
ついでなので、剛性行列もやってみる。
In [9]:
clambda = np.repeat(1.0, m.nbpts())
mu = np.repeat(1.0, m.nbpts())
gf.asm_linear_elasticity(mim, mfu, mfu, clambda, mu, -1).full()
Out[9]:
In [10]:
gf.asm_linear_elasticity(mim, mfu, mfd, clambda, mu, 1).full()
Out[10]:
In [11]:
gf.asm_linear_elasticity(mim, mfu, mfd, clambda, mu, 2).full()
Out[11]:
In [ ]: