webgl逐渐成熟,普通计算机甚至移动设备的浏览器足够渲染十几万的三角形。所以完全可以利用支持WEBGL的浏览器构建一个有限元分析的前后处理器。这两天思考了一下技术路线。后续将会简单的实现一个包含有限元建模、计算、模型管理等功能的Web系统。
下图是一个几何模型的网格,没有显示网格线。面数大约2万多,旋转几乎无延迟。采用babylonjs库。
目前已经有许多在线CAD软件解决方案,比如onshape,CAD系统可以将所有几何数据信息存储在WEB浏览器客户端,但CAE不能像CAD那样,将所有的有限元数据都放在客户端,主要原因是数据太多,特别是三维有限元模型。
首先网格数据的存储和传输肯定是用二进制,目的是减少数据大小,目前32位整数和32位浮点数足够用于常用的有限元网格存储,整数通常用于存储节点编号或者单元编号,32位无符号整数可以表达的范围是0~2^32-1 大约40亿,通常一个有限元网格肯定不会有这么多节点。而数值计算中的浮点数通常也是32位浮点数。
所以先约定整数应当按照int32存储,浮点数按照float32存储。
假设一个有限元模型节点数50万,二阶四面体单元,单元数大概25万。
一个节点最少要存节点号和坐标的信息,节点号为一个int32,坐标为3个float32,那么一个节点所需要的存储空间最少是 4+4*3=20 byte, 50万节点需要 500000*20 byte 大概需要 9M 的数据。
每个单元至少要存储一个单元号和10个节点号,11个均为int32,则一个单元为4*11=44 byte,25万个单元需要 250000*44 byte 大概需要 10M 的数据。
即最少要从服务端传递20M的数据给浏览器,传输一个最基本有限元模型网格信息,这还没要包括节点数据的值,单元类型,材料等信息。
所以服务端直接将用于计算有限元网格传输到客户端是不现实的。从而引入了一个需要解决的技术问题,有限元网格用于现实的轻量化,即如何从一个有限元网格模型中提取用于渲染的最少数据。
当然,三维数据轻量化目前已经有一些工业实现,比如西门子UG的JT格式,最早用于三维几何模型的轻量化现实,后来发展到有限元模型数据中,https://en.wikipedia.org/wiki/JT_(visualization_format)
还有基于vtk推出的vtp格式,vtk是一个开源的数据可视化格式,更是提供了一个用于现实vtp格式的javascript库https://www.vtk.org/
不论采用那种轻量化格式,都要解决如何将数据从服务端传递到客户端。这个问题的将单独写一篇讨论起技术方案。
第二个需要展开讨论的是服务端如何保存一个有限元模型数据,即数据持久化,好在有许多有限元商业软件可以用作参考,虽然无法获知其内部如何存储一个有限元模型,但可以从其输入输出格式,来推断如何保存一个有限元模型。具体技术方案实现也将单独展开。
第三个是一个有限元模型需要提供哪些用于数据可视化的操作,比如查询某个节点的数值,要有clip操作,甚至可以有比较的功能,当然这都是在有限元网格数据的基础上拓展,同时服务端需要将有限元模型转换为一个用于轻量化显示的模型。这会是整个系统的最主要模块,即有限元数据的操作。
第四个是需要实现解析现有的有限元输入格式,有限元格式通常包含两种,一种是待计算的输入模型,会包含网格数据、载荷、边界等,通常会是一个文本格式,比如abaqus的inp,ansys的cdb,nastran的bdf。一种是计算结果数据,会包含网格数据、节点解、单元解,通常会是一个二进制格式,比如abaqus的odb,ansys的rst,nastran的op2。如果想作为一个有限元项目的管理平台,应当支持商业有限元软件的模型的导入导出。
第五个是要实现几何模型的网格划分,提交求解,几何模型的网格划分可以采用gmsh,有限元求解可以采用一些开源求解器,比如getdb,Code_Aster,CalculiX等等。这里有一个有限元软件的列表https://en.wikipedia.org/wiki/List_of_finite_element_software_packages
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删