1 FLUENT变量梯度宏

C_R_G
C_P_G C_U_G C_V_G C_W_G C_T_G C_H_G C_YI_G

C_R_RG
C_P_RG C_U_RG C_V_RG C_W_RG C_T_RG C_H_RG C_YI_RG

FLUENT计算中单元变量有两种梯度:非限制梯度(后缀_G)和重建梯度(后缀_RG),帮助文档建议如果需要通过单元变量重建计算单元面上的变量则使用重建梯度计算更精确。

说明:

  1. 只有当求解器正在求解某一变量时才能读取该变量的梯度。例如,定义一个能量源项时,可以读取温度梯度(C_T_G),但是不能读取速度梯度(如C_U_G)。这是因为求解器不断释放它不需要的变量存储。如果你要保留这些变量梯度,可以使用TUI命令:
    solve/set/expert 设置"Keep temporary solver memory from being freed?"
    [Yes]。当然这样做,计算需要更多内存。
  2. C_R_G
    只有density-based solver中才能使用; C_P_G只有pressure-based
    solver中才能使用。
  3. C_YI_G 只有density-based solver中可用,如果pressure-based
    solver要使用C_YI_G,则需要设置 species/save-gradients? #t.
  4. 变量的梯度是否存在与求解器、模型、离散方式以及是否设置保留这些变量梯度有关。
  5. C_VOF_G是否存在?质量源项中是否可以读取?设置保留对其无效?上述问题未知
  6. UDS变量的梯度可以通过C_UDSI_G(C,0)访问,求解中始终存储,即使设置"Keep
    temporary solver memory from being freed?"
    [No],UDS的梯度仍存在;而且在方程求解控制中设置不求解UDS,仍可以读取UDS梯度。

2 FLUENT不计算和保存VOF的梯度

一般情况下,FLUENT计算过程中会计算VOF及其梯度(因为表面张力的计算需要用到VOF梯度),会保存VOF值,但是不保存VOF梯度。因此,如果UDF中利用宏C_VOF_G读取VOF梯度则会报读取错误,如下例:

UDF定义一个与VOF梯度成正比的动量源项:

DEFINE_SOURCE(xmomentum,c,t,dS,eqn)

{

Thread
*w;

real
vof_gx, source;

w=THREAD_SUB_THREAD(t,1);

vof_gx=C_VOF_G(c,w)[0];

source=-200*C_R(c,t)*vof_gx;

dS[eqn]=0;

return source;

}

运行后报错:

Error: 

FLUENT received fatal signal
(ACCESS_VIOLATION)

1. Note exact events leading
to error.

2. Save case/data under new
name.

3. Exit program and restart to
continue.

4. Report error to your
distributor.

有些人修改读取VOF梯度的语句后,运行成功,但是实际上未读取到梯度值。

if(NNULLP(THREAD_STORAGE(t, SV_VOF_G)))
vof_gx=C_VOF_G(c,w)[0];

else vof_gx=0;

由于FLUENT未存储VOF梯度,THREAD_STORAGE(t, SV_VOF_G)返回的都是NULL。

还有些人利用TUI打开中间量的保存:

Solve->set->expert

keep temporary solver memory from being freed?
[yes]

保存求解临时存储而不释放?[yes]

这一设置对C_T_G,C_P_G等梯度是有效的,但是对VOF的梯度似乎无效。

3 读取VOF梯度方法1

#include "udf.h"

#include "sg.h"

#include "sg_mphase.h"

#include "flow.h"

#include "mem.h"

#include "metric.h"

DEFINE_ADJUST(store_VOF_gradient, domain)

{

Thread *t;

Thread *ppt;

Thread **pt;

cell_t c;

int phase_domain_index=1;

Domain *pDomain =
DOMAIN_SUB_DOMAIN(domain,phase_domain_index);

Alloc_Storage_Vars(pDomain,SV_VOF_RG,SV_VOF_G,SV_NULL);

Scalar_Reconstruction(pDomain, SV_VOF,-1,SV_VOF_RG,NULL);

Scalar_Derivatives(pDomain,SV_VOF,-1,SV_VOF_G,SV_VOF_RG,
Vof_Deriv_Accumulate);

mp_thread_loop_c (t,domain,pt)

{

if (FLUID_THREAD_P(t))

{

ppt = pt[phase_domain_index];

begin_c_loop (c,t)

{

C_UDMI(c,t,0) = C_VOF_G(c,ppt)[0];

C_UDMI(c,t,1) = C_VOF_G(c,ppt)[1];

C_UDMI(c,t,2) = C_VOF_G(c,ppt)[2];

}

end_c_loop (c,t)

}

}

Free_Storage_Vars(pDomain,SV_VOF_RG,SV_VOF_G,SV_NULL);

}

上例利用了一些帮助上无法查到的FLUENT函数手动设置VOF梯度计算,Alloc_Storage_Vars,

Scalar_Reconstruction,Scalar_Derivatives这些函数的大概功能可以猜到,但是没有详细说明。

4 读取VOF梯度方法2

将VOF赋值给UDS变量,然后通过C_UDSI_G间接求得梯度。

下例是FLUENT帮助文档中给出的一个例子:

将VOF赋值给UDS;进行一次迭代计算,但不计算UDS方程;尽管未计算UDS方程,仍可以得到梯度值,并将其赋值给UDM用于显示。

# include "udf.h"

# define domain_ID 2

DEFINE_ADJUST(adjust_gradient, domain)

{

Thread *t;

cell_t c;

face_t f;

domain = Get_Domain(domain_ID);

thread_loop_c (t,domain)

{

begin_c_loop (c,t)

{

C_UDSI(c,t,0) = C_VOF(c,t);

}

end_c_loop (c,t)

}

thread_loop_f (t,domain)

{

if (THREAD_STORAGE(t,SV_UDS_I(0))!=NULL)

begin_f_loop (f,t)

{

F_UDSI(f,t,0) = F_VOF(f,t);

}

end_f_loop (f,t)

}

}

DEFINE_ON_DEMAND(store_gradient)

{ Domain *domain;

cell_t c;

Thread *t;

domain=Get_Domain(1);

thread_loop_c (t,domain)

{

begin_c_loop (c,t)

{

C_UDMI(c,t,0) = NV_MAG(C_UDSI_G(c,t,0));

}

end_c_loop (c,t)

}

}

5 在质量源项上读取

VOF模型计算中,在某一相的质量源中读取C_VOF_G(C,ts)并将其传递给UDMI,方法未验证。

最新文章

  1. Android View.setId(int id) 用法
  2. 【原创】JMeter学习(三十七)Jmeter录制手机app脚本
  3. ubuntu上搭建review board代码评审站点
  4. gvim设置成不备份文件
  5. Python学习总结16:时间模块datetime & time & calendar (三)
  6. “psp”软件需求规约
  7. C# 操作mongodb 分组
  8. 基础知识(3)- Java的基本程序设计结构
  9. Java IO 导入导出TXT文件
  10. 常见的排序算法(直接插入&选择排序&二分查找排序)
  11. Android : 移植curl-7.61.1 及 openssl-1.1.0i
  12. EF CodeFirst(四) 关系
  13. PAT甲题题解-1003. Emergency (25)-最短路径+路径数目
  14. PHP读写INI文件
  15. CSOM中如何取到managed metadata类型字段的类型信息
  16. CentOS6.5安装wine
  17. dpr 与 dproj 有什么区别
  18. Java从零开始学二十四(集合工具类Collections)
  19. Decorator - 装饰模式
  20. [JLOI2011]飞行路线 最短路

热门文章

  1. linux下安装dotnet core
  2. 跨服务器查询sql语句样例(转)
  3. SQL SERVER-Exclusive access could not be obtained because the database is in use. (Microsoft.SqlServer.SmoExtended)
  4. 02- web-mini框架添加路由、MySQL(二)
  5. amazeui datepicker日历控件 设置默认当日
  6. 51nod 1396 还是01串
  7. test20190725 夏令营测试11
  8. 行为型模式(十) 备忘录模式(Memento)
  9. 自定义异步IO框架
  10. 使用SAXReader对XML进行操作