面向对象有限元编程|优化框架

2021-03-25 16:09:05 浏览数 (1)

上一次提出的有限元程序框架面临一个问题:把单元都放在一个模块文件modelements,导致代码过多,不方便查找。并且也不能体现出这个框架的物理含义,即单元的多样性。同样,后处理模块是一种单元对应一种后处理方法,所以也会定义很多方法。现在把单元拆分,一种单元放在一个模块中。再把所有的单元定义为一个子包Elements,里面除了定义的单元外,还有一个文件__init__.py,这是包的标志。

Python中的包和模块有两种导入方式:精确导入和模糊导入:

  • 精确导入方式:
代码语言:javascript复制
from Elements import MdTruss

就是从子包Elements导入模块MdTruss, MdTruss.pre 就是调用里面的方法了。

  • 模糊导入方式:
代码语言:javascript复制
from Elements import *
代码语言:javascript复制
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()

0 人点赞