上一次提出的有限元程序框架面临一个问题:把单元都放在一个模块文件modelements,导致代码过多,不方便查找。并且也不能体现出这个框架的物理含义,即单元的多样性。同样,后处理模块是一种单元对应一种后处理方法,所以也会定义很多方法。现在把单元拆分,一种单元放在一个模块中。再把所有的单元定义为一个子包Elements,里面除了定义的单元外,还有一个文件__init__.py,这是包的标志。
Python中的包和模块有两种导入方式:精确导入和模糊导入:
from Elements import MdTruss
就是从子包Elements导入模块MdTruss,MdTruss.pre 就是调用里面的方法了。
from Elements import *
import numpy as np
from Materials import MdMaterial
from Elements import MdBeam2D
from FiniteModel import MdFEModel
from Numerics import MdLinerSolver
from Posts import MdPost
mat1 = MdMaterial.Material( 1 )
#节点对象
nd1 = MdBeam2D.NodeBeam2D( 1, 0, 0, 1, 0, 0)
nd2 = MdBeam2D.NodeBeam2D( 2, 4, 0, 1, 0, 0)
nd3 = MdBeam2D.NodeBeam2D( 3, 9, 0, 1, 0, 0)
#单元对象
elem1 = MdBeam2D.ElemBeam2D( 1, 1, mat1, nd1, nd2, 1, -4.5, -4.5 )
elem2 = MdBeam2D.ElemBeam2D( 2, 1, mat1, nd2, nd3, 1, -3.2, -3.2 )
listNode = [nd1, nd2, nd3]
listElem = [elem1, elem2]
fm = MdFEModel.FEModel(listNode, listElem) #有限元模型实例
ff = fm.getForceVector()
KK = fm.getStructStiffnessMatrix()
cls = MdLinerSolver.LinerSolver(KK, ff, 1e-4, 500) #创建一个求解器的实例cls
delta = cls.CGsolver() #调用共轭梯度法求解
post = MdPost.Post(fm, delta) #后处理实例
post.outputResult()
post.Visualize()