在查看interFoam求解器时,会发现其中引入了LTS

if (LTS){#include "setRDeltaT.H"}

那么它的含义和功能是什么呢?

  • LTS(locall time-step)是一种局部时间步求解器。该求解器建立于局部时间步下,它会提取pimple算法控制字典t里面的maxComaxAlphaCo,并以此为依据,根据本地计算条件,计算当前网格的时间步长deltaT
  • 由于每个网格有不同的 deltaT,这会使质量失衡(瞬态问题每个时间步的质量守恒),因此需要迭代求解。在最终稳态的情况下,时间项的导数为 0 ,这时输出的结果和最终瞬态达到稳定状况下的结果相同。

LTS与库朗数是息息相关的,为此,我们先分析interFoam 中的 CourantNo.H ,了解其中库朗数的定义:

scalar CoNum = 0.0;    //定义标量 CoNum 并赋初值
scalar meanCoNum = 0.0;//定义标量 meanCoNum 并赋初值if (mesh.nInternalFaces())
{scalarField sumPhi(fvc::surfaceSum(mag(phi))().primitiveField());CoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue();meanCoNum =0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue();
}Info<< "Courant Number mean: " << meanCoNum << " max: " << CoNum << endl;

sumPhi=∑∣U⃗f⋅S⃗f∣(1)sumPhi=\sum|\vec{U}_f\cdot\vec{ S}_f| \tag{1} sumPhi=∑∣Uf​⋅Sf​∣(1)
CoNum=12max(∣U⃗f⋅S⃗f∣VΔT)(2)CoNum=\frac 12 max(\frac{|\vec{U}_f\cdot\vec{ S}_f| }{V}\Delta T )\tag 2CoNum=21​max(V∣Uf​⋅Sf​∣​ΔT)(2)
meanCoNum=12sum(∣U⃗f⋅S⃗f∣VΔT)(3)meanCoNum=\frac 12 sum(\frac{|\vec{U}_f\cdot\vec{ S}_f| }{V}\Delta T )\tag 3meanCoNum=21​sum(V∣Uf​⋅Sf​∣​ΔT)(3)
注:在 OpenFOAM 中,若为六面体网格,则其对应的面通量值ϕ\phiϕ加和加了两次,因此公式 (2) 和(3) 需要除 2。

库朗数一般定义如下:
Co=∣U⃗f⋅ΔT∣Δx(4)Co=\frac {|\vec U_f \cdot \Delta T| } {\Delta x}\tag 4Co=Δx∣Uf​⋅ΔT∣​(4)
获得了库朗数后,进一步求取alpha 库郎数,参见 alphaCourantNo.H

scalar maxAlphaCo
(//查找controlDict字典文件中的maxAlphaCo并进行读取readScalar(runTime.controlDict().lookup("maxAlphaCo"))
);
//声明变量赋初值
scalar alphaCoNum = 0.0;
scalar meanAlphaCoNum = 0.0;
//求解公式
if (mesh.nInternalFaces())
{scalarField sumPhi(mixture.nearInterface()().primitiveField()*fvc::surfaceSum(mag(phi))().primitiveField());alphaCoNum = 0.5*gMax(sumPhi/mesh.V().field())*runTime.deltaTValue();meanAlphaCoNum =0.5*(gSum(sumPhi)/gSum(mesh.V().field()))*runTime.deltaTValue();
}Info<< "Interface Courant Number mean: " << meanAlphaCoNum<< " max: " << alphaCoNum << endl;

上述代码用数学公式可表述为:
sumPhi=(ϕ1−0.01)(0.99−ϕ1)∑∣U⃗f⋅S⃗f∣,0.01<ϕ1<0.99(5)sumPhi=(\phi_1-0.01)(0.99-\phi_1)\sum|\vec{U}_f\cdot\vec{ S}_f|,0.01<\phi_1<0.99 \tag5 sumPhi=(ϕ1​−0.01)(0.99−ϕ1​)∑∣Uf​⋅Sf​∣,0.01<ϕ1​<0.99(5)
则两相库朗数计算结果为:
sumPhi≈ϕ1phi2∑∣U⃗f⋅S⃗f∣,0.01<ϕ1<0.99(6)sumPhi\approx \phi_1phi_2\sum|\vec{U}_f\cdot\vec{ S}_f|,0.01<\phi_1<0.99 \tag6 sumPhi≈ϕ1​phi2​∑∣Uf​⋅Sf​∣,0.01<ϕ1​<0.99(6)
同理可求得alphaCoNummeanAlphaCoNum

在了解了库朗数和两相库朗数后,我们进入setDeltaT.H文件


if (adjustTimeStep)//如果调节时间步
{scalar maxDeltaTFact =min(maxCo/(CoNum + SMALL), maxAlphaCo/(alphaCoNum + SMALL));//在没有达到设定的库朗数值的时候,deltaTFact每次扩大1.2倍scalar deltaTFact = min(min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);//与controlDict字典中的 maxDeltaT比较,将DeltaT设置成较小的那个runTime.setDeltaT(min(deltaTFact*runTime.deltaTValue(),maxDeltaT));Info<< "deltaT = " <<  runTime.deltaTValue() << endl;
}

下面是setRDeltaT.H,这里面声明了计算所需要的场量,以及如何计算局部时间步.由于该文件较长,这里只将其中的计算局部时间步的代码提取出来,

   rDeltaT.ref() = max(1/dimensionedScalar("maxDeltaT", dimTime, maxDeltaT),fvc::surfaceSum(mag(rhoPhi))()()/((2*maxCo)*mesh.V()*rho()));

若第二项的值相对较大,则其数学公式表述如下:
ΔT=∑∣ρfU⃗f⋅S⃗f∣2∗Comax⋅V⋅ρ(7)\Delta T =\frac {\sum|\rho_f \vec{U}_f \cdot \vec{S}_f|} {2*Co_{max} \cdot V \cdot \rho} \tag 7ΔT=2∗Comax​⋅V⋅ρ∑∣ρf​Uf​⋅Sf​∣​(7)

 if (maxAlphaCo < maxCo){// Further limit the reciprocal time-step// in the vicinity of the interfacevolScalarField alpha1Bar(fvc::average(alpha1));rDeltaT.ref() = max(rDeltaT(),pos(alpha1Bar() - alphaSpreadMin)*pos(alphaSpreadMax - alpha1Bar())*fvc::surfaceSum(mag(phi))()()/((2*maxAlphaCo)*mesh.V()));}

这里,我们有
ΔT=(ϕ1−0.01)(0.99−ϕ1)∑∣U⃗f⋅S⃗f∣2∗Coαmax⋅V,0.01<ϕ1<0.99(8)\Delta T =(\phi_1-0.01)(0.99-\phi_1) \frac {\sum|\vec{U}_f\cdot\vec{ S}_f|}{2*Co_{\alpha _{max}}\cdot V},0.01<\phi_1<0.99 \tag8 ΔT=(ϕ1​−0.01)(0.99−ϕ1​)2∗Coαmax​​⋅V∑∣Uf​⋅Sf​∣​,0.01<ϕ1​<0.99(8)

以下,通过fvc::smoothfvc::spreadfvc::sweep继续光顺局部时间步。

alpha方程求解:

fvScalarMatrix alpha1Eqn((LTS? fv::localEulerDdtScheme<scalar>(mesh).fvmDdt(alpha1): fv::EulerDdtScheme<scalar>(mesh).fvmDdt(alpha1))+ fv::gaussConvectionScheme<scalar>(mesh,phiCN,upwind<scalar>(mesh, phiCN)).fvmDiv(phiCN, alpha1));
alpha1Eqn.solve();

从这段代码我们可以看出,interFoam采用的是欧拉法进行时间离散,而LTS,则对时间项采用局部欧拉法进行离散。

注:

  • LTS是一种可用可不用的自动调节步长方式,它是一种单纯的计算加速技术,能够加快收敛进程,但准确性还有待考究。
  • LTS主要解决稳态问题

本文内容参考了东岳流体,关于求解器的相关知识可以查阅该网站。

LTS-局部时间步,自动调节步长技术相关推荐

  1. 非稳态计算时间步和最大迭代数的设定(分享)

    fluent中max iteration pertime step.time step size.number of time steps的设定 来源于:https://zhuanlan.zhihu. ...

  2. 降低百倍时间步,精度媲美传统神经网络:上交等机构提出ANN-SNN转换框架

    ©作者 | 刘方鑫,赵文博,蒋力 来源 | 机器之心 脉冲神经网络(Spiking Neural Network, SNN)被誉为第三代的神经网络,以其丰富的时空领域的神经动力学特性.多样的编码机制. ...

  3. 我业余时间如何学习多门技术以及开发业余项目的一些心得

    我的学习方法 在开始介绍我开发业余项目的经验前,先和大家分享一下我的学习方法吧,不过我认为学习这件事情因人而异,每个人都有适合自己的学习方式,所以这是作为一个参考,希望大家也都能先找到适合自己的学习方 ...

  4. [MATLAB粒子模拟笔记]初始化半个时间步的位置

    function particle = position(particle,prm) % Update the position in one stepslx = prm.slx p = partic ...

  5. NLP:自然语言处理技术领域的代表性算法概述(技术迭代路线图/发展时间路线)、四大技术范式变迁概述(统计时代→大模型时代)、四个时代的技术方法论探究(少数公司可承担的训练成本原因)之详细攻略

    NLP:自然语言处理技术领域的代表性算法概述(技术迭代路线图/发展时间路线).四大技术范式变迁概述(统计时代→大模型时代).四个时代的技术方法论探究(少数公司可承担的训练成本原因)之详细攻略 目录 一 ...

  6. 源码学习之LAMMPS的一个时间步是如何工作的

    从本推文开始将开始学习LAMMPS的源码.这部分我也不太了解,所以一边学一边分享.学习源码的最好方法当然后阅读手册的PROGRAMMER GUIDE.为了督促自己学习,我首先将PROGRAMMER G ...

  7. matlab找到非定常涡流的每个时间步的涡的涡核位置和这个涡环量(以及重叠网格扑翼流场的涡动力学参数求解的解决方案)

    如果提前已经算好fluent每个时间步的cas和dat文件,那么可以用jou文件导出每个节点的u,v,dudy,dvdx,overset-cell-type.fluent中只能直接导出涡量幅值,想要计 ...

  8. 【Fluent】导出瞬态计算过程每一秒或每一个时间步的各个坐标/节点的物理量-温度场-压力场,TUI命令/file/export和/file/transient-export

    一.功能需求 如果你进行的是稳态计算,你需要将物理场中的每一个节点上的物理量数据(例如温度.压力)导出成类似txt或Excel表格的文件. 文件里的内容形式是:每一行中有节点ID.节点的XYZ坐标.物 ...

  9. 怀旧服服务器维护后断牙刷新吗,魔兽世界怀旧服:猎人抓断牙方法介绍,时间和位面技术缺一不可...

    原标题:魔兽世界怀旧服:猎人抓断牙方法介绍,时间和位面技术缺一不可 如果问魔兽世界怀旧服猎人最想获得的宠物是什么,相信很多猎人玩家都会脱口而出"断牙".断牙作为猫科宠物,虽然不是唯 ...

最新文章

  1. c#加粗代码_RichTextBox,怎么用c#代码根据Index和Length指定的范围的内容进行变色或加粗处理?...
  2. #164 (Div. 2)
  3. tcpip详解--端口号
  4. Face Recognition 人脸识别
  5. 汇编语言——输入两位数比较大小
  6. 求点被多少个矩形覆盖
  7. Qt Creator分析代码
  8. C语言SIX/NINE问题
  9. “启动Word时提示出错,只能用安全模式才能打开”的解决方法
  10. matplotlib给坐标轴特定的位置加上文字
  11. 速查 Git 常用命令
  12. 商业流程中的traversedpath
  13. 笔记本cpu降压 XTU
  14. 格志AK890打印驱动安装
  15. 鱼塘钓鱼题解(堆解决)
  16. 一文教你玩转Mybatis,超详细代码讲解与实战
  17. wordpress最佳架构_如何在2019年选择WordPress主题:最佳选择
  18. 815计算机考研科目,2019年“815-计算机专业基础综合”考试大纲
  19. 分析非结构化数据的10个步骤
  20. 【微信小程序】日历弹窗选择器

热门文章

  1. 如何在阿里云申请和注册域名(域名绑定解析)?
  2. 艺龙(elong),一个令人伤心的网站
  3. 哔哩哔哩视频信息爬虫(实时爬取)
  4. oracle function exception,ORACLE-Function错误处理(EXCEPTION)
  5. python制作《鹿鼎记》的词云
  6. 网络信息安全软考笔记(1)
  7. 迷信中台是一种病,得治
  8. MySql主从复制(Master-Slave)
  9. 知识付费的下一个风口究竟在哪里?
  10. Greenplum的日志管理