首页/文章/ 详情

FreeCAD源码分析:FEM模块

2年前浏览7940

济南友泉软件有限公司

FreeCAD最初主要应用于建筑、机械等领域的参数化建模。随着FEM、Cfd、CfdOF等模块的发布与完善,FreeCAD应用范围才逐步拓展到了CAE领域。与此同时,FreeCAD也逐渐从一个CAD框架转逐渐转变成了一个CAx(CAD/CAE/CAM)框架。另外,从工艺流程上来看,CAE向前对接CAD系统,向后对接CAM系统。因此,非常有必要对FreeCAD中FEM等相关模块进行深入地分析。

编写本博文的另一个目的:通过对FEM模块的分析来阐述大型CAE软件的设计思路,希望对从事国产自主工业软件研发的朋友们有所帮助。

注1:文章内容会随着后续研究不断更新。

注2:限于篇幅,部分引用未标注出处,在此致歉。

注3:限于笔者认知水平与研究深度,难免表述不当,欢迎大家批评指正。

一、功能概述

FreeCAD不仅是一款开源免费的CAD软件,同时也是一套CAx(CAD/CAE/CAM)软件开发框架。在FreeCAD强大的三维全参数建模基础之上,FEM模块通过集成Gmsh、Netgen、Calculix、Z88、VTK第三方工具,实现了全流程的有限元仿真分析(前处理、网格划分、求解、后处理)。

image.png

具体来说,FEM模块实现的主要功能有

1、边界条件:定义了位移、力、温度、热流量等边界条件。

2、网格生成:在SALOME Mesh基础之上,设置网格划分相关参数,调用Gmsh、Netgen等第三方工具完成网格划分。

3、求解:配置算例,调用CalculiX、Z88、Elmer等第三方求解器进行求解。

4、后处理:使用VTK完成后处理数据生成。

二、SALOME Mesh

SALOME是一套开源、跨平台的通用CAD/CAE软件集成平台。

SALOME Mesh模块(简称SMESH)提供了网格生成、网格修改、网格数据交换等功能。基于Meshing Plug-in模块,可以将开源或商业网格生成程序嵌入到SMESH。

image.png

FreeCAD直接借用了SALOME Mesh模块代码,代码在src/3rdParty/salomesmesh中。FreeCAD将其拆分成了Driver、DriverDAT、DriverSTL、DriverUNV、MEFISTO2、SMDS、SMESHDS、SMESH、StdMeshers、NETGENPlugin等模块。

image.png

SMESH_Gen、SMESH_Mesh、SMDS_Mesh、SMESHDS_Mesh、SMESH_Hypothesis等类构成了整个SALOME Mesh的核心。

2.1 网格生成技术概述

网格是CAD与CAE之间的桥梁,是整个数值计算的基础和前提,也是影响数值计算精度、稳定性的关键因素,并且是一个技术瓶颈。

我国著名空气动力学家、计算流体力学家张涵信院士曾经把CFD的研究内容概括为五个"M"和一个"A"。五个"M"分别是Machine、Mesh、Method、Mechanism、Mapping;一个"A"指的是Application。由此可以看出网格生成技术的重要性。

网格生成方法难以准确分类,而且分类方法有很多。按照网格单元维度,可以分为0D、1D、2D、3D;按照网格拓扑结构,可以分为结构化网格、非结构化网格和混合网格。

image.png

网格生成技术涉及计算几何学、计算机图形学、计算力学等多个学科,目前国内很少有专业开设相关的课程,系统性地介绍网格生成技术的专著也比较少,这里仅罗列部分文献资料,供大家深入地研究。

  • Timothy, J, Baker. Mesh generation: Art or science?. Progress in Aerospace Sciences, 2005, 41(1):29-63.

  • Thompson J F , Warsi Z , Mastin C W . Numerical grid generation:foundations and applications, 1985.

  • Baker, T. J. .Mesh generation: Art or science? Progress in Aerospace Sciences, 2005, 41(1), 29–63.

张涵信院士认为:虽然网格生成技术经过几十年的发展已经取得巨大成功,但仍需围绕自适应、并行化、自动化、智能化、高精度等方面开展持续研究。

近年来,我国的网格生成技术取得了长足的进步,也研发了NNW-GridStar等网格生成软件,然而在数据前处理方面,却与国外存在着相当的差 距,主要制约因素是前处理的基础理论研究、应用水平较低 。国内市场基本上被Pointwise、ICEM-CFD等厂商垄断,因此亟需整合各方面的资源发展具有自主知识产权的网格生成软件。

2.2  hypotheses

在SALOME Mesh中,hypotheses是一个比较重要地概念,指的就是网格生成算法的约束条件,用于限制最终生成的网格满足特定的要求,比如网格单元最大边长、网格单元最大面积、网格单元最大体积、网格单元总数等。

Refs. from SALOME Mesh =====================================================

Hypotheses specify constraints to be taken into account by the chosen meshing algorithms.

Hypotheses represent boundary conditions which will be taken into account by meshing algorithms. The hypotheses allow you to manage the level of detail of the resulting mesh: when applying different hypotheses with different parameters you can preset the quantity or size of elements which will compose your mesh. 

=====================================================Refs. from SALOME Mesh

2.3 插件机制

待续。。。

三、Netgen

Netgen是一个开源、跨平台的三维自动网格剖分工具。Netgen最早为奥地利科学家Joachim Schoberl编写的网格剖分程序,是网格划分技术中极为先进与完善的,在3D网格划分领域更是具有极大的优势。

Refs. from Netgen ===========================================================

NETGEN is an automatic 3d tetrahedral mesh generator. It accepts input from constructive solid geometry (CSG) or boundary representation (BRep) from STL file format. The connection to a geometry kernel allows the handling of IGES and STEP files. NETGEN contains modules for mesh optimization and hierarchical mesh refinement. Netgen 6.x supports scripting via a Python interface. Netgen is open source based on the LGPL license. It is available for Unix/Linux, Windows, and OSX.

===========================================================Refs. from Netgen

四、VTK

笔者撰写的另一篇博文<VTK开发精要:数据与管线机制>已经就VTK基础数据结构、渲染流水线等相关内容进行了分析,故此处不再赘述。

五、核心组件

FreeCAD FEM借助于文档/视图架构,集成了边界条件、网格生成、求解设置、后处理等相关操作流程。

5.1 Constraint及其子类

Fem::Constraint通过几何体全局引用的方式,定义了约束施加的对象及其在FreeCAD的显示参数。

Fem::Constraint的子类(Fem::ConstraintDisplacement、Fem::ConstraintForce、Fem::ConstraintTemperature等)则定义了各种具体的边界条件类型。

5.2 FemMesh

FemMesh用于生成计算网格数据,不仅提供了与Nastran、Abaqus、Z88等软件网格地数据交换功能,而且实现了基于SMESH_Mesh的网格生成功能。

5.3 FemMeshObject及其子类

FemMeshObject通过封装将FemMesh嵌入到了FreeCAD 文档/视图架构。FemShapeObject实现了特定几何体的网格划分。FemMeshShapeNetgenObject通过SMESH插件机制实现了NetGen划分网格。

5.4 FemPostObject及其子类

FemPostObject用于存储经过VTK Filter流水线的最终数据。

//poly data is the only data we can visualize, hence every post processing object needs to expose it
class AppFemExport FemPostObject : public App::GeoFeature
{
    PROPERTY_HEADER(Fem::FemPostObject);
public:
    /// Constructor
    FemPostObject(void);
    virtual ~FemPostObject();
    Fem::PropertyPostDataObject Data;
    vtkBoundingBox getBoundingBox();
};

FemPostFilter用于存储VTK Filter流水线;

class AppFemExport FemPostFilter : public Fem::FemPostObject
{
PROPERTY_HEADER(Fem::FemPostFilter);
public:
 /// Constructor
FemPostFilter(void);
virtual ~FemPostFilter();
App::PropertyLink Input;
virtual App::DocumentObjectExecReturn* execute(void);
protected:
    vtkDataObject* getInputData();
    //pipeline handling for derived filter
    struct FilterPipeline {
       vtkSmartPointer<vtkAlgorithm>                    source, target;
       vtkSmartPointer<vtkProbeFilter>                  filterSource, filterTarget;
       std::vector<vtkSmartPointer<vtkAlgorithm> >      algorithmStorage;
    };
    void addFilterPipeline(const FilterPipeline& p, std::string name);
    void setActiveFilterPipeline(std::string name);
    FilterPipeline& getFilterPipeline(std::string name);
private:
    //handling of multiple pipelines which can be the filter
    std::map<std::string, FilterPipeline> m_pipelines;
    std::string m_activePipeline;
};

FemPostPipeline是一个FemPostFilter容器。作为FemPostFilter的容器,FemPostPipeline支持“Serial”、“Parallel”等两种工作模式。通常来说,大部分场景使用“Serial”模式即可,这也是FemPostPipeline的默认值。根据需要,可以创建多个FemPostPipeline对象,用于容纳不同的后处理流水线。

class AppFemExport FemPostPipeline : public Fem::FemPostFilter
{
    PROPERTY_HEADER(Fem::FemPostPipeline);
public:
    /// Constructor
    FemPostPipeline(void);
    virtual ~FemPostPipeline();
    App::PropertyLinkList       Filter;
    App::PropertyLink           Functions;
    App::PropertyEnumeration    Mode;
    short mustExecute(void) const;
    virtual App::DocumentObjectExecReturn* execute(void);
    PyObject* getPyObject();
    virtual const char* getViewProviderName(void) const {
        return "FemGui::ViewProviderFemPostPipeline";
    }
    //load data from files
    static bool canRead(Base::FileInfo file);
    void read(Base::FileInfo file);
    //load from results
    void load(FemResultObject* res);
    //Pipeline handling
    FemPostObject* getLastPostObject();
    bool           holdsPostObject(FemPostObject* obj);
protected:
    virtual void onChanged(const App::Property* prop);
private:
    static const char* ModeEnums[];
    template<class TReader> void readXMLFile(std::string file) {
        vtkSmartPointer<TReader> reader = vtkSmartPointer<TReader>::New();
        reader->SetFileName(file.c_str());
        reader->Update();
        Data.setValue(reader->GetOutput());
    }
};

在“Serial”模式下,FemPostPipeline内的FemPostFilter按照加入顺序排列成一个流水线,最后一个FemPostFilter N的输出作为整个后处理流水线的结果。

image.png

在“Parallel”模式下,FemPostPipeline内的所有FemPostFilter输出需要再通过vtkAppendFilter进行合并。

image.png

六、拓展:流体有限元

CBS(Characterictic-Based Split)算法是已故国际计算力学大师Zienkiewicz在上世纪90年代提出的一种求解计算流体力学问题的有限单元法。

待续。。。

七、讨论

子曰:“三人行,必有我师”。笔者抛出以下问题供大家研究与讨论,也非常期望大家予以指教。

Q1. 对于SMDS_Mesh,以下成员函数返回不同的迭代器,这些迭代器有何区别?

virtual SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator     (bool idInceasingOrder=false) const;
virtual SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator     (bool idInceasingOrder=false) const;
virtual SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator     (bool idInceasingOrder=false) const;
virtual SMDS_VolumeIteratorPtr SMDS_Mesh::volumesIterator   (bool idInceasingOrder=false) const;
virtual SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
virtual SMDS_ElemIteratorPtr SMDS_Mesh::elementGeomIterator(SMDSAbs_GeometryType type) const;
virtual SMDS_ElemIteratorPtr SMDS_Mesh::elementEntityIterator(SMDSAbs_EntityType type) const;

Q2. 在SMDS_Mesh中,myGrid、myNodes、myCells用于存储网格的几何拓扑信息,三者之间有着怎样的联系呢?

 //! actual nodes coordinates, cells definition and reverse connectivity are stored in a vtkUnstructuredGrid
  SMDS_UnstructuredGrid*      myGrid;
  //! SMDS_MeshNodes refer to vtk nodes (vtk id = index in myNodes),store reference to this mesh, and sub-shape
  SetOfNodes             myNodes;
  //! SMDS_MeshCells refer to vtk cells (vtk id != index in myCells),store reference to this mesh, and sub-shape
  SetOfCells             myCells;

Q3. 请阐述SMDS_Mesh、SMESH_Mesh、SMESHDS_Mesh的区别与联系?

Q4.  试就FEM模块中几何模型生成、添加边界条件、网格生成、求解器调用、后处理等关键流程进行代码分析。

Q5. 请整理FEM模块中嵌入第三方网格划分代码的操作步骤。

Q6. 请整理FEM模块中嵌入第三方求解器的操作步骤。

Q7. 在现有FEM框架下,如何增加残差、监测数据等曲线绘制?

Q8.  对于千万级网格数据,实测发现FreeCAD FEM后处理性能较差,有无可能就大数据集的可视化进行优化?

参考资料

————————————————

代码&命令网格处理几何处理R&D仿真体系知识工程创新方法智慧+科普理论通用ECADMCAD其他软件
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-12-20
最近编辑:2年前
YouQuan Soft
硕士 济南友泉软件有限公司
获赞 30粉丝 7文章 12课程 0
点赞
收藏
未登录
1条评论
无足鸟
签名征集中
8月前
漫漫技术路,找到一盏明灯不容易,我可以拜你为师么?
回复

课程
培训
服务
行家

VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈