fvm与fvc及说开来的离散化数学基础
来自:闻久(孩儿立志出乡关,学不成名誓不还)
随着求解器构建的深入,许多不够扎实的代码和数学基础逐渐暴露出来,需要时常地回顾一下。本着“用到什么学什么”的原则,就不再系统性地回顾了。
OF代码
以连续性方程为例

1.fvc: finite volume calculus
fvc本应是一个class,但是在openfoam里被声明成了一个命名空间namespace,因为fvc不需要有自己的数据成员,都是成员函数。这些函数显式地对volScalarField, volVectorField, volTensorField进行操作,映射结果返回仍是场量。
2. fvm: finit volume method
fvm则是返回一个矩阵fvMatrix,需要将场离散化为线性代数方程组。而fvMatrixScalar和fvMatrixVector两种数据类型,都挂着矩阵的名义,却分成了标量和矢量。
经过查问,我得到了这么一个解释
在OF中,耦合方程组地处理都是采用“分离算法”,即便建立方程的时候,我们可以采用矢量表达,但是真正求解的时候,OF却将矢量分为各个分量方程,再线性处理,逐个求解。而我们以数学思维来处理的时候,一般都是写成矢量方程。
3. ddt
时间项,对时间求偏导
4. div
对流项,分别对xyz求偏导
路径case/system/fvSchemes有格式选择

可以定义控制方程中的离散格式
数学基础
更深一些,要说到离散化和差分方程,以及显式/隐式等数学概念
1. 离散化
有许多角度来解释什么是离散化:

(1)把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率(有限差分/有限体积/有限元)
(2)离散化实质是用另外一个类似的表达式来近似(动词)连续封闭的数学表达式(如微分方程),连续特征和离散特征
离散化可分为有限差分、有限体积、有限元三种,而我们计算流体力学则用的是有限体积法,可以理为积分形式方程的离散化,一般是体积积分
从知乎@兔子牙齐不齐 专栏文章获得启发,总结地很接地气,但应该主要是面向deep learning来说的,仅摘抄cfd用得到的留存。本人在将来应该也会适度参与cfd solver的deep learning吧,很期待
在实现某些算法时,只看到结论说有的连续特征需要离散化,离散化后效果会更好,但是为什么要离散化还一直是云里雾里,今天特意研究了一下,记录如下:
a.离散特征的增加和减少都很容易,易于模型的快速迭代;
b.稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
c. 离散化后的特征对异常数据有很强的鲁棒性;
模型是使用离散特征还是连续特征,其实是一个“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡。既可以离散化用线性模型,也可以用连续特征加深度学习。
2. 差分
原函数 f(x) 映射到 f(x+a)-f(x+b)上
分类:一阶差分/二阶差分
近似:泰勒展开法/多项式逼近法
格式精度:常数/线性/乘法定则/除法定则/级数
迎风(差分)格式:尽可能多利用上游信息构造差分格式(上游是依赖区)
3. 显/隐式
CFD的差分方法可以分为两种:
显式格式
显式格式中每一个差分方程只包含一个未知数。方程和代码简单,如果超过某个值(即超出稳定性条件的限制),计算就会发散。
隐式格式
隐式格式的方程并非彼此独立,相互耦合。但是方程和代码较为复杂,瞬态追踪不如显式精确。
4. 时空离散
以我的理解,将基本分为 xyzt 四维,xyz为空间,t为时间
独立离散:即时空导数独立离散,分两步方程
耦合离散:即时空耦合,一步偏导方程,cfd一般都用这个
例如连续性方程的 LHS fvm::ddt(rho) + fvc::div(phi) 即为耦合离散
你的回复
回复请先 登录 , 或 注册相关内容推荐
最新讨论 ( 更多 )
- 必须恢复工作效率 (闻久)
- 召集组员!一起助力开启小组中秋家宴! (小组活动官)
- 想请教一下关于煤粉颗粒燃烧反应的问题 (翛)
- 从Ubuntu到OpenSUSE (闻久)
- 概率统计解湍流(一)概率统计概念的引入-概率密度方程PDF (闻久)