面向对象有限元编程|整体结构类(上)
Python是一个动态语言,在list等容器类里,我们可以放入任何类型的数据(字符串,浮点数等):a = [1, 2.3, 'n'] 这个方便也会带来问题。说的高大上点,就是这样的代码不安全。比如这段:scores = [11, 22, 33, 44] #列表元素都是int类型#list可以添加任何类型,不小心加进去一个字符串scores.append('88')#求和:下面这行会报错,因为字符串'88'不能和其他数字相加。sum(scores)#Python3.9可直接将scores定义成为只能存放整数的列表,这和C++的泛型容器很像了。scores = list[int]()#这就意味着scores里面的东西一定是数字,我们后面对它的操作可以放心大胆的去做。也就意味着更安全的程序。#添加字符串进去是不允许的,在写代码的时候就会提示出错了。scores.append('88') 对于下面的结构,有铰接点,也有刚接点,有杆单元,也有梁单元。在创建结构对象时,要把所有的结点对象和单元对象放入列表nodeList和elementList中,从前面对Python语法的讨论可知,这是可行的,也很简便。假定nd1,nd2,nd3,nd4,nd5是5个节点对象,elem1,elem2,elem3,elem4是4个单元对象,那么nodeList = [nd1,nd2,nd3,nd4,nd5]elementList = [elem1,elem2,elem3,elem4] C++要实现类似的功能,就要从抽象的节点(单元)类着手了。#include <iostream>#include <vector>using namespace std;//抽象的单元类class AbstractElement{public: virtual ~AbstractElement() = default; virtual size_t getID() const = 0; // 纯虚函数 };//杆单元类class Truss : public AbstractElement{protected: size_t id{ 0 };public: Truss() = default; Truss(size_t id_) : id{ id_ } {} size_t getID() const override { return id; }};//梁单元类class Beam : public AbstractElement{protected: size_t id{ 0 };public: Beam() = default; Beam(size_t id_) : id{ id_ } {} size_t getID() const override { return id; }};int main(){ Truss t1{ 1 }; //杆单元对象 Beam b1{ 2 }; //梁单元对象 //泛型容器的存储类型为抽象单元类型指针 std::vector<AbstractElement*> elems{ &t1, &b1 }; return 0;} 同样,如果一个结构对象包含多种材料,也可以定义一个matrialList列表。如何定义节点类和单元类可参考话题#面向对象有限元编程#前3篇。来源:数值分析与有限元编程