首页/文章/ 详情

一文说清楚Fluent自适应时间步长

11天前浏览1455

1. 自适应时间步长概念

本文摘要:(由ai生成)

自适应时间步长是瞬态计算中的关键技术,Fluent提供三种调节方法。Adaptive界面自适应基于CFL数或误差自动调整时间步长,并设置相关参数。表达式调节适用于简单需求,通过编写表达式调整时间步长。UDF调节则通过DEFINE_DELTAT宏实现复杂逻辑,以满足更高级需求。这些方法旨在确保计算精度的同时,优化计算效率,提高瞬态计算的效率和收敛性。

对于瞬态计算来说,时间步长的选择一直是个难点。时间步长较大可以加快计算速度,但可能会降低收敛性,甚至发散。时间步长较小,虽然收敛性会变好,但计算速度会变化。(有时,时间步长较小反而会发散)。

关于时间步长的选取,可参考文章:二十九、Fluent瞬态时间步长与迭代步数的讨论

能不能自动调整时间步长呢?使求解比较精细时选用较小的时间步长,而计算接近稳态时选用较大的时间步长。这样既能保证计算的收敛性,还能提高计算速度。因此出现了自适应时间步长。

2. 自适应时间步长的方法

Fluent提供了三种自适应时间步长的方法:

a. Adaptive界面自适应时间步长

b. 表达式调节

c. UDF调节

其中第一种方法是Fluent内置的,也是最简单的,只需要在Run calculation界面设置即可。

第二种和第三种方法需要写代码来调节,有一定的入门要求。这个我们会在下篇文章介绍

3. Adaptive界面自适应时间步长

Fluent提供了自适应时间步长的设置,对于瞬态计算,在Type处选择Adaptive即可设置自适应时间步长。

3.1 Method

Method:选择设置时间步长的依据。对于Adaptive自适应时间步长有三种选择。

a. CFL-Based:根据库朗数来调节时间步长,CFL-Based在基于密度显示格式时不适用,也不适用于多相流模型。

选择CFL-Based需要设置库朗数,Fluent将根据设置的库朗数自动调整时间步长,使计算出的库朗数小于设置值。默认Courant Number为1。

b. Error-Based:根据计算截断误差来调节时间步长,不适用基于密度的显式格式,也不适用显式格式的欧拉模型

选择Error-Based需要设置误差,如果截断误差小于设置的误差,则时间步长的增大;如果截断误差大于设置的误差,则时间步长的减小。对于一般问题,Error-Based默认值为0.01是比较适合的。

c. Multiphase-Specific:对于多相流模型,自适应时间步长可以选择Multiphase-Specific,此时需要设置全局库朗数。这里不多介绍

注:对于CFL-Based和Error-Based两种方法,下面的设置都相同

3.2 Duration Specification Method

Duration Specification Method:设置计算总时间。对于Adaptive和User-Defined Function方式设置时间步长,此时无法直接确定总的计算时间,因此需要通过Duration Specification Method来设置。

共有四种设置方法:

a. Total Time:设置计算的总时间,包括之前的计算时间。比如目前保存的工况在之前已经计算了3s,设置的Total Time为4s,那么只会再计算1s就会停止计算。

b. Total Time Steps:置计算的总时间步,这里和Total Time类似,包括了之前计算的时间步。

由于时间步长不确定,因此Total Time Steps无法确定计算的时间,只能通过Fluent控制台查看,或者输入文本控制命令查看。

也可通过Report Simulation Status查看

单击Report Simulation Status,会弹出下框,包含当前的计算状态。

c. Incremental Time:增量时间,以此时作为计时起点计算的时间,无论当前的dat已经计算了多少时间,都会在此基础上再计算Incremental Time时间。

d. Incremental Time Steps:增量时间步,和Incremental Time类似,以当前的dat作为时间步起点,在此基础上再进行计算更多的时间步。

3.3 Parameters参数设置

a. Number of Fixed Time Steps:固定的时间步,在初始时间步长改变之前必须要执行的时间步数。比如,Number of Fixed Time Steps=100,初始时间步长为0.001s,则必须先使用初始时间步长0.001s计算100步后,时间步长才会改变。

b. Initial Time Step Size:初始时间步长,即第一个时间步长,必须以这个时间步长执行Number of Fixed Time Steps步后时间步长才会改变。

Initial Time Step Size必须介于最小和最大时间步长大小之间。一般应选择使库朗数=1的时间步长作为初始时间步长。

c. Max Iterations/Time Step:每个时间步最大的迭代次数。如果在此值之前就已经收敛,则进入下个时间步的计算,如果没有收敛,则达到最大迭代次数后也会进入下个时间步。

d. Reporting Interval:报告时间间隔,如设置为2,则表示每隔2个时间步在控制台输出一次文本,绘制一次图形。当计算速度比较慢时,可将此值设置为较大值,来减少文本输出频率,增加计算速度。

e. Profile Update Interval:DEFIEN_PROFILE函数的更新频率,设置为1,表示每个时间步,DEFIEN_PROFILE函数都会更新。

f. Time Step Size Update Interval:时间步长的更新间隔,如设置为2,表示每两个时间步才会自动计算并更新时间步长。

3.4 详细设置

点击Setting,会弹出Adaptive Time Stepping

a. Minimum/Maximum Time Step Size:限制的最小和最大时间步长,设置和计算过程中的时间步长必须在此范围内。

b. Minimum/Maximum Step Change Factor:限制时间步长的变化程度。这种限制可以使时间步长不会产生较大的突变,从而造成计算收敛性问题。

比如前一个时间步长为0.01s,但是计算出的当前时间步长为1s,两者差了100倍,这种时间步长的突然增大可能会造成计算问题,因此对其进行限制。

对于CFL-Based和 Multiphase-Specific方法,此处的值表示当前时间步长与前一个时间步长的比值。如上图的值,表示当前的时间步长被限制在前一个时间步长的0.5-2倍之间。

对于Error-Based的方法,此值为设置的error tolerance与计算出的截断误差之间的比值。

4. 表达式调节时间步长

4.1 介绍

Fluent提供了自适应时间步长的界面,通过Adaptive界面,Fluent能够根据一些准则来自动调节时间步长。参考文章:

除了这种方式,还可以使用表达式expression和UDF来调节时间步长,表达式相对UDF更加容易入门,表达式的使用可参考文章:七十一、Fluent表达式进阶实例七十、Fluent表达式基础实例

 

某些情况下表达式对于时间步长的调节要比UDF更加方便。(因为expression对于物理量的求和、平均等处理非常方便)

比如利用expression实现调节时间步长的功能。当流动时间t小于0.5s,时间步长等于0.1s,流动时间t大于0.5s,时间步长等于0.2s

 

写成表达式为:IF(t<0.5[s],0.1[s],0.2[s])

 

4.2 设置方法

表达式更改时间步长,Type不能选择Adaptive,而应该选择Fixed。然后在Time Step Size下拉框选择New Expression,输入上面的表达式即可。表达式的具体用法可以参考文章:七十一、Fluent表达式进阶实例七十、Fluent表达式基础实例

 

4.3 具体案例:根据残差改变时间步长

正常情况下后处理界面Residuals只有mass Imbalance,只能显示质量流量的净值(Flux中的mass flow rate净值)。

使用文本命令/solve/set/advanced>retain-cell-residuals,输入yes,可激活其他的残差值,如下图。

 

但expression中Residuals还是只有mass Imbalance。因此我们使用mass Imbalance当成更改时间步长的标准,当净流量小于5e-5时,时间步长为0.1s,大于5e-5时,时间步长0.2s。

表达式Expression:IF(AreaAve(lassImbalance,['out’])<5e-5 [kg/s]0.1[s],0.2[s])

 
 

5. UDF调节时间步长

5.1 介绍

DEFINE_DELTAT可以用来调整时间步长,根据需要自适应时间步长。此宏只能用于调节时间步长。当编译此宏之后,在Run calculation界面的Type栏会出现UDF,选中此项,时间步长就会自动切换为自己UDF定义的时间步长。

 

5.2 DEFINE_DELTAT(name,d)宏的用法

 

此宏有两个参数name和d,name为UDF的名称,可以为任意名称;d返回计算域domain,对于多相流d返回混合域。整个宏的返回值为时间步长。

对于DEFINE_DELTAT这个宏,由于只返回domain,想要获取网格物理量,涉及到UDF循环语句,比较麻烦

5.3 DEFINE_DELTAT应用举例

根据流动时间调节时间步长,流动时间小于0.5s时,时间步长为0.1;流动时间大于等于0.5s时,时间步长为0.2s。本案例和上面的表达式案例相同,非常简单。

#include "udf.h"

DEFINE_DELTAT(mydeltat, d)

{

    real time_step;

    real flow_time = CURRENT_TIME;

    if (flow_time < 0.5)

        time_step = 0.1;

    else

        time_step = 0.2;

    return time_step;

}

来源:Fluent学习笔记
ACTFluentFluxSTEPS多相流UDFUM控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-05-12
最近编辑:11天前
Fluent学习笔记
博士 签名征集中
获赞 96粉丝 216文章 110课程 2
点赞
收藏

作者推荐

未登录
还没有评论

课程
培训
服务
行家

VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈