FreeCAD源码分析:FEM模块_freecad fem-程序员宅基地

技术标签: FreeCAD  其他  

济南友泉软件有限公司

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

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

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

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

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

一、功能概述

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

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

  • 边界条件

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

  • 网格生成

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

  • 求解

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

  • 后处理

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

二、SALOME Mesh

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

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

开源 Netgen、Gmsh
商业 MeshGems

FreeCAD直接借用了SALOME Mesh模块代码,代码在src/3rdParty/salomesmesh中。FreeCAD将其拆分成了DriverDriverDATDriverSTLDriverUNVMEFISTO2SMDSSMESHDSSMESHStdMeshersNETGENPlugin等模块。

SMESH_GenSMESH_MeshSMDS_MeshSMESHDS_MeshSMESH_Hypothesis等类构成了整个SALOME Mesh的核心。

2.1 网格生成技术概述

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

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

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

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

结构化网格 代数方法、保角变换法、偏微分方程法
非结构化网格 阵面推进法、Delaunay法、四叉树/八叉树法
混合网格 层推进法

代数网格生成方法:首先,通过一系列代数变换,将物理空间不规则区域变换到计算空间内的规则区域(二维矩形、三维长方体等),然后计算空间内划分网格,最后再反变换到物理空间代数变换是代数网格生成方法的核心,超限值插值(transfinite interpolation,TFI)是使用得最广泛的方法。

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.

Gordon W J , Thiel L C . Transfinite mappings and their application to grid generation[J]. Applied Mathematics & Computation, 1982, 10(none):171-233.

Godunov S K , Prokopov G P . On the computation of conformal transformations and the construction of difference meshes[J]. Ussr Computational Mathematics & Mathematical Physics, 1967, 7(5):89-124.

Eiseman P R , Erlebacher G . Grid generation for the solution of partial differential equations[J]. 1989.

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

近年来,我国的网格生成技术取得了长足的进步,也研发了NNW-GridStar等网格生成软件,然而在数据前处理方面,却与国外存在着相当的差 距,主要制约因素是前处理的基础理论研究、应用水平较低 。国内市场基本上被PointwiseICEM-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的输出作为整个后处理流水线的结果。

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

六、求解器调用流程

七、拓展:流体有限元

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_MeshSMESH_MeshSMESHDS_Mesh的区别与联系?

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

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

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

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

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

参考资料

  1. FreeCAD FEM
  2. FreeCAD Addons
  3. O. C. Zienkiewicz. The Finite Element Method for Solid and Structural Mechanics (6th Edition).  Butterworth-Heinemann, 2005.
  4. O. C. Zienkiewicz. The Finite Element Method for Fluid Dynamics(6th Edition). Butterworth-Heinemann, 2005.
  5. 王勖成. 有限单元法. 清华大学出版社, 2003.
  6. 张来平. 计算流体力学网格生成技术. 科学出版社,2017.
  7. 张正科. 计算流体力学网格生成方法. 科学出版社, 2020.
  8. SALOME
  9. Gmsh
  10. Netgen
  11. 3D Precise Mesh
  12. NNW-GridStar
  13. CalculiX
  14. Code_Aster
  15. Z88OS 
  16. Elmer
  17. FEniCS
  18. OOFEM
  19. VTK开发精要:数据与管线机制
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_26221775/article/details/121722267

智能推荐

matlab iir 高通滤波器的设计,基于MATLAB的IIR滤波器的设计.doc-程序员宅基地

文章浏览阅读598次。MACROBUTTON MTEditEquationSection2 SEQ MTEqn \r \h \* MERGEFORMAT SEQ MTSec \r 1 \h \* MERGEFORMAT SEQ MTChap \r 1 \h \* MERGEFORMAT 毕业设计 课程设计 毕业论文 详细资料 联系QQ号;1620812008本科毕业设计(论文)基于MATLAB的IIR滤波..._matlab设计iir滤波器为高通滤波器,截至频率为0.5π

pycharm代码上传到github_git commit为什么需要邮箱和名字、-程序员宅基地

文章浏览阅读6.5k次,点赞11次,收藏26次。一.准备工作Ⅰ.git下载和安装要连接GitHub,首先git是必不可少的,git的安装的基本使用很简单,这里并不是讲git使用的教程,所以只是提一下就略过了.Ⅱ.GitHub设置添加SSH Key这一步算是连接GitHub的最基本的一步了,git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以得先配好SSH key.1.创建一个SSH Key打开终端,windows下面可能叫做git ..._git commit为什么需要邮箱和名字、

B+Tree 在线模拟_在线体验b+tree-程序员宅基地

文章浏览阅读2.4k次,点赞8次,收藏9次。链接地址:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html_在线体验b+tree

缺失值的查找与替换_ggto05.net-程序员宅基地

文章浏览阅读5.6k次。X<-c(1,2,3,NA,5) y<-c(236,90,56,NA,7) z<-c(54,6558,5,21,5) x1<-data.frame(X,y,z) r<-c(NA,1,2,NA,NA)ee> ee X y z r1 1 236 54 NA2 2 90 6558 13 3 56 5 24 NA NA 21 NA5 5_ggto05.net

R判别分析_判别分析的应用案例r语言-程序员宅基地

文章浏览阅读377次。常用的判别分析方法是距离判别、贝叶斯判别和Fisher判别等。_判别分析的应用案例r语言

Maven基础(三)—— 依赖管理与生命周期_项目依赖管理生命周期-程序员宅基地

文章浏览阅读124次。1、依赖管理1、依赖配置依赖指当前项目运行所需的jar,一个项目可以设置多个依赖2、依赖传递将project03的坐标复制到project02的依赖中直接依赖:在当前项目中通过依赖配置建立的依赖关系间接依赖∶被资源的资源如果依赖其他资源,当前项目间接依赖其他资源路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的特殊优先:当同级配置了相同资源的不同_项目依赖管理生命周期

随便推点

current_thread_info在ARM32和ARM64平台的不同点解析_arm64 thread_info-程序员宅基地

文章浏览阅读2.5k次。首先对current_thread_info不熟悉的同学可以先百度一下这是个什么东西?我们这里仅仅简单的提一下,current_thread_info用于获取当前进程的信息。ARM32平台相关定义#define THREAD_SIZE_ORDER 1#define THREAD_SIZE (PAGE_SIZE &lt;&lt; THREAD_SIZE_ORDER)union thr..._arm64 thread_info

阿里P8用这份402页多线程与架构设计笔记,征服你 吊打你_阿里线程框架-程序员宅基地

文章浏览阅读121次。前言随着计算机硬件的不断发展,CPU进入多核时代,并发运算因此也上升到了并行运算的高度,作为Java程序员,如何最大化地“压榨”CPU的资源,利用CPU超高的计算速度编写高效快速运行的程序,如何解决CPU与RAM之间速度不匹配的问题呢?今天分享一份《Java高并发编程详解多线程与架构设计》就会帮你解决这些问题,本书结合作者的实践经验,不仅介绍了高速缓存Cache、Cache Line、Java内存模型,以及现代CPU基本架构等相关知识,还深入讲解了Java跨平台的高并发解决方案。本书实._阿里线程框架

宝塔php伪静态规则,使用宝塔管理nginx伪静态规则配置方法技巧-程序员宅基地

文章浏览阅读1.8k次。我们网站使用的服务器环境一般有IIS、Apache、Tomcat、Nginx 等,他们各有优劣。一般虚拟空间使用IIS 和 Apache居多,这两个的配置都比较简单,IIS一般都安装了ISAPI_Rewrite 模块,可以直接使用和Apache一样的.htaccess文件来配置,直接将.htaccess文件上传到网站根目录即可。.htaccess 文件代码RewriteEngine OnRewri..._宝塔怎么添加htaccess规则

2023 Zblog对接微信小程序源码 附教程_博客小程序源码-程序员宅基地

文章浏览阅读189次。在HbuilderX中打开前端项目,依次点击 运行 =》 运行到小程序模拟器 =》微信开发者工具。必要工具:HbuilderX,微信开发者工具。_博客小程序源码

mysql组合索引与单列索引_假设有一张名为orders的订单表-程序员宅基地

文章浏览阅读1.1k次。1、组合索引能够避免回表查询:假设有一张订单表(orders),包含order_id和product_id二个字段。一共有31条数据。符合下面语句的数据有5条。执行下面的sql语句:select product_id from orderswhere order_id in (123, 312, 223, 132, 224);这条语句要mysql去根据order_id进行搜索,然后返回_假设有一张名为orders的订单表

python+jenkins持续集成输出html测试报告_jenkins + python + publish html reports-程序员宅基地

文章浏览阅读7k次。前言在jenkins上展示html的报告,需要添加一个HTML Publisher plugin插件,把生成的html报告放到指定文件夹,这样就能用jenkins去读出指定文件夹的报告了。一、构建后操作1.前面执行完测试用例后,可以用“添加构建后操作步骤”,读出html报告文件2.如果你的展开后有Publish THML reports这_jenkins + python + publish html reports

推荐文章

热门文章

相关标签