程序员视角的计算力 学:一套好懂好用的认知框架
程序员视角的计算力 学:一套好懂好用的认知框架
- - - 做过多年工业仿真与三维图形软件开发,从极限平衡、关键块体、有限元前处理,到三维点云、网格处理、智能爆破软件CAD设计、Gis数字地球,踩过不少坑之后,慢慢攒出了这套跨工具的统一认知框架。
先唠3个底层共识,想通了后面都顺
- 所有力学现象,根子都是分子间的作用力和能量平衡,一层层放大,就成了我们看到的工程现象。但不用啥都从分子开始算,不同尺度有不同的玩法,够用就行。
- 世界本质上全是“散的”:岩石是矿物颗粒堆的,水是水分子凑的,空气是气体分子飘的。我们常说的“连续介质”,其实是个偷懒的宏观近似——当研究的东西,比组成它的粒子大得多的时候,忽略那些小缝隙,计算效率能翻好几个数量级,误差还在工程能接受的范围里。
- 站在写代码的角度,整个物理世界都能用「几何+能量+拓扑」搭出来:
几何搭出各种单元的样子,单元之间无非就是吸收能量、释放能量;能量一变,单元的XYZ位置就跟着动;大量单元一起位移,宏观上就成了变形、裂隙、断裂、滑移、旋转。
固液气三态全适用,最后落到计算机里,无非就是粒子、结构化网格、非结构化网格这几种表达形式。注:这是仿真视角的简化,牺牲了极致微观的准确性,但工程上特别好使。
三个核心支柱:几何 · 能量 · 拓扑
- 几何是载体:不管是原子、颗粒、网格节点还是岩块,都能抽象成带XYZ坐标的几何单元,只是粒度大小不一样。
- 能量是唯一驱动力:单元之间的相互作用,本质就是吸能、放能。能量差变成力,推着单元位移、旋转,最后都往能量最低的状态跑,就稳定了。
补充:实际还有摩擦、阻尼这些能量耗散,变成热量跑掉了,工程上一般做简化处理。
- 拓扑是连接规则:单元之间粘不粘、连不连,全看拓扑。
- 拓扑没断 → 只是变形(弹性、塑性)
- 拓扑断了 → 就是破坏(断裂、破碎、分开了)
从微观到宏观,四个尺度各玩各的
不用强行从最底层往上推,干啥活就用对应尺度的方法。
- 分子/原子级(埃~纳米)
研究化学键、分子作用力,用分子动力学、第一性原理。纯搞机理的,工程开发基本用不上,知道有这么回事就行。 - 细观级(微米~毫米)
研究矿物颗粒、微裂纹、胶结物,用颗粒DEM、细观损伤力学。相当于微观和宏观之间的桥,解释宏观参数是怎么来的。 - 岩块级(厘米~米)
就是实验室里做实验的那块完整石头/铁块,看成均质的,用FEM、FDM算。主要是给工程计算提供基础参数。 - 工程岩体级(米~公里)
真正干活的尺度,有节理、断层、破碎带这些结构面,两种玩法:- 连续等效法:把节理“抹平”,当成整体用FEM/FDM算,省事
- 块体离散元:顺着结构面切成一块块,算它们怎么滑、怎么撞
两大体系:连续 vs 非连续
先讲判断标准,遇到问题先套这个
- 看尺度:研究对象远大于组成单元 → 用连续;尺寸差不多 → 必须用非连续
- 看目标:想看整体应力、流速分布 → 用连续;想看破碎、滑移、碰撞过程 → 用非连续
补充:两者不是死的,过程中能互相转,比如完整岩石裂了,就从连续变成非连续了。
一、连续介质体系
就是把东西当成一整块无缝的,用“场”来描述,适合没大规模破碎分离的情况。
1. 固态分支(岩土/结构核心)
- 底层理论:固体力学三大方程(平衡、几何、本构),本构就是材料独有的应力应变规律,分弹性、弹塑性、流变、损伤这些。
- 主流方法:
- FEM有限元:最通用、精度最高,固体领域绝对主流
- FDM有限差分:显式求解,大变形、动力问题天然稳
- VEM虚拟单元:FEM升级版,前沿科研为主
- 开源工具:CalculiX、Code_Aster、OpenSees(岩土专属,本构特别全)
- 常用场景:算应力、边坡稳定、大坝受力、洞室围岩分析
我的实践:我自己做岩土三维可视化,核心用 VTK 做后处理渲染,配合 osgEarth 做大场景GIS地形展示;前后处理的几何建模、网格剖分,本质都是在给连续介质的FEM/FDM计算搭几何载体。
2. 液态分支(流体/渗流)
- 底层理论:普通流体用N-S方程,岩土渗流用达西定律简化。
- 主流方法:
- FVM有限体积法:CFD领域绝对主流,守恒性好
- LBM格子玻尔兹曼:介观粒子法,GPU跑特别快,复杂孔隙天生适配
我的实践:我自己写了个小工具用这个模拟爆炸,爆破孔按时许进行连续爆破后,能量之间的互相影响.
- FEM有限元:算慢流、渗流还行,强对流场景不稳
- 开源工具:OpenFOAM(CFD标杆)、FluidX3D、OpenGeoSys(地质多场专用)
- 常用场景:坝体渗流、降雨入渗、地下水运移
3. 气态分支
可压缩流体,用FVM算,工具OpenFOAM、SU2。岩土里基本用不上,顶多算爆炸冲击波、巷道通风。
二、非连续介质体系
拆成一个个独立单元,各自按牛顿定律运动,靠接触力互相影响,专门对付破碎、滑移、翻滚的场景。
1. 颗粒类非连续
- 一个个小颗粒,用DEM离散单元法,靠接触刚度、摩擦、可断裂粘结这些规则运行。
- 开源工具:Yade(岩土DEM标杆)、LIGGGHTS(工业颗粒流)
- 常用场景:岩石破碎机理、泥石流、颗粒流
2. 块体类非连续(岩土最有特色的方向)
- 顺着结构面切成大岩块,用块体DEM或者DDA(块体自身还能变形)。
- 落地方案:
- 开源求解器:Yade(刚性块体模块)
- 商业标杆:3DEC(闭源,行业标杆,用来做结果对标)
我的实践:我自己的 XPlote 系列软件里,危岩体滑落模拟就是按这个思路做的:先用几何切割算法沿结构面拆块,再用 Bullet 物理引擎算动力学和碰撞,最后用 osgEarth 做大场景实时渲染。
实测下来,工程级场景用刚性块体假设完全够用,性价比比 DDA 高太多,不需要硬上可变形块体。 - 常用场景:岩质边坡失稳、危岩体滑落分裂、地下洞室掉块
复杂问题:跨体系耦合
遇到多物理场、全过程的问题,就混着来:
- 流固耦合(FSI):流体用FVM + 固体用FEM/FDM,比如浪拍大坝、渗流驱动岩体变形
- 连续-离散耦合(FEM-DEM):先算连续体损伤开裂,裂了之后转成离散块体算运动,比如完整岩体从裂到塌的全过程
- 流体-离散耦合(CFD-DEM):流体带着颗粒/块体跑,比如水下滑坡、泥石流远程运动
遇到任何力学问题,五步定位法
- 定尺度:工程问题直接上宏观方法,搞机理再往下挖
- 判介质:选连续还是非连续体系
- 分物态:固、液、气对应不同的控制方程
- 选方法:按精度、效率、变形大小,挑数值方法
- 找工具:对应分支选开源求解器,或者自己搭引擎
放到代码里,本质是什么
- 分子尺度:几何对应分子的空间结构,拓扑对应化学键
- 颗粒尺度:一个个点/球就是粒子,没有固定连接,只有碰到了才相互作用,天生适合破碎、流动
- 变形与断裂的几何本质:
- 弹性/塑性变形:就是节点挪位置,网格的连接关系一点没变,所以FEM算起来特别快
- 断裂/破碎/分裂:连接关系断了,一个整体变成好几个独立对象,对应代码里就是三维网格拓扑重构,生成新的几何实体
我的实践:这也是我做三维切割、网格重建最深的感受:所谓的岩体分裂,代码里本质就是网格拓扑关系的断开,生成新的独立几何实体;很多仿真的难点,说到底不是力学难,是几何拓扑的处理难。
干活选型速查(岩土向)
- 常规应力、稳定计算:优先 OpenSees / Code_Aster / CalculiX
- 大变形、非线性、动力分析:对标 FLAC3D,开源选 OpenSees 显式
- 渗流、流固耦合:优先 OpenFOAM / OpenGeoSys
- 危岩体滑落分裂:首选 预切割块体 + Bullet 引擎自研
- 离散元结果对标:用 Yade
- 微观机理研究:分子动力学 / 颗粒DEM,工程开发不用钻太深
我的选型逻辑:我自己做岩土工具开发,也是严格按这个框架来的——通用计算就对接成熟开源求解器,不重复造轮子;危岩体崩滑这种特色功能,就自己用 Bullet 定制,更灵活,也更贴合工程实际需求。
最后收个尾
说白了,连续和非连续根本不是两套东西——连续介质方法,就是把拓扑关系焊死的非连续系统。
变形小的时候,焊死没问题,效率还高;一旦碎了、滑了,焊不住了,就得换成拓扑能动态变的粒子/块体方法。
工程仿真从来不是追求绝对真实,就是在对应的尺度里,花最少的计算成本,算出够用的结果。
