Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. Fluent
  3. UDF求计算域中某网格到壁面的最近距离(C_WALL_DIST宏)

UDF求计算域中某网格到壁面的最近距离(C_WALL_DIST宏)

已定时 已固定 已锁定 已移动 Fluent
10 帖子 7 发布者 8.6k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 深蓝深 离线
    深蓝深 离线
    深蓝
    写于 最后由 编辑
    #1

    大家好我有一个小问题想请教各位大神。

    问题简单描述:

    我想求计算域中每个网格的中心到最近壁面的距离。

    问题详细描述:

    我使用的是C_WALL_DIST宏,但是发现在初始化的时候会报错。在二维的算例中能编译通过并进行计算,但是在三维的算例中可以编译通过但初始化错误(试过几台电脑,也试过串行并行)。
    错误提示为:f1 process could not be started fluent.

    我的问题

    请问要求计算域中每个网格的中心到最近壁面的距离,有什么办法可以实现?这个C_WALL_DIST宏在帮助手册里没有说明,不知道可否满足我的需求。另外,我网上查找的时候,有人说(链接地址)可以先定义一个标量,把距离存在标量中,再拿到udf中计算用,他的代码完全看不懂啊(心累),请问这样可以吗?
    谢谢大家:xinxin2:
    我的UDF代码如下:

    /*用于修改湍流模型中的湍流粘度*/
    #include "udf.h"
    DEFINE_TURBULENT_VISCOSITY(chen_mu_t,cell,thread)
    {
    
        real chen_mu_t;
        real rho = C_R(cell,thread);
        real u,v,w;
    	u=C_U(cell,thread);
    	v=C_V(cell,thread);
    	w=C_W(cell,thread);
        real local_velocity = sqrt(pow(u,2.0)+pow(v,2.0)+pow(w,2.0));
        real distance =C_WALL_DIST(cell,thread);
        chen_mu_t = 0.03874*rho*local_velocity*distance;
    
        return chen_mu_t;
    
    }
    
    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #2

    不太清楚Fluent那面,不过求网格的壁面距离从算法上比较麻烦,如果是规则网格还好,如果不规则网格,你想象一下,还是挺难弄的。一些边边角角很难确定到那一块是最近的距离。

    :tishizi:

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 深蓝深 离线
    深蓝深 离线
    深蓝
    写于 最后由 编辑
    #3

    谢谢李老师的回复。
    我想求的不是网格中心到网格边上的距离,是网格中心到最近的壁面边界的距离(比如说在一个房间内,房间内部的某个网格到最近墙壁的距离)。
    谢谢李老师的提醒,我突然想到一个办法,就是对每个网格中心点的x,y,z坐标进行大小判断,找出最小的那个,感觉可以,我先试试。
    :xiabanle:

    L 1 条回复 最后回复
  • L 离线
    L 离线
    l.j刘侃
    在 中回复了 深蓝 最后由 编辑
    #4

    @深蓝 你的链接发的并没有写关键代码 这只是部分的 这部分只是排错 计算距离代码并没列出 实际上这部分的实现如果你对UDF有一定的了解并不是很困难 关键是执行效率的问题 如果不是每步执行的 是一步执行的话 是比较简单的 你的方法就可以满足 如果是每步执行的 先排除哪个也就是哪个if写在头 是执行效率的关键 你需要把最大概率不满足的条件写在判断的最开始 其他的都是解析几何的问题 可以找node 也可以找F_centroid

    1 条回复 最后回复
  • 我 离线
    我 离线
    我是河滩
    写于 最后由 编辑
    #5

    你的问题解决了吗?你是用什么方法求得壁面距离?

    动边界

    1 条回复 最后回复
  • benqingB 离线
    benqingB 离线
    benqing
    写于 最后由 编辑
    #6

    你们的问题解决了吗,我遇到了同样的问题:134:

    benqingB 1 条回复 最后回复
  • benqingB 离线
    benqingB 离线
    benqing
    在 中回复了 benqing 最后由 编辑
    #7

    这个问题我解决了,宏C_WALL_DIST在高版本里面确实不能用了,从CFDonline上找到了一个可以用的代码,代码如下:

    #include "udf.h"
    #include "prox.h"
    
    static cxboolean wall_dist_set = FALSE;//cxboolean布尔运算,与或非,对错
    
    DEFINE_ON_DEMAND(set_wall_dist_udm0)
    {
    	#if !RP_HOST//表示非host节点的话,执行后面的代码,fluent并行的话,会启动一个 host节点和指定个数的node节点,host节点主要处理GUI和结果收集之类的任务node节点负责分区计算任务
    
    	Domain *domain;
    	Thread *t;
    	cell_t c;
    
    	if (! wall_dist_set)
    	{
    		domain = Get_Domain(1);//ROOT_DOMAIN_ID?
    
    		Alloc_Storage_Vars(domain, SV_RTMP_0, SV_NULL);//Alloc_Storage_Vars 用于更改分配
    
    		Calc_Cell_Wall_Distance_New(domain, SV_RTMP_0);
    
    		thread_loop_c(t,domain)
    		{
    		begin_c_loop(c,t)
    			{
    				C_UDMI(c,t,0) = C_TMP0(c,t);
    			}
    		end_c_loop(c,t)
    		}
    		wall_dist_set = TRUE;
    	}
    	#endif /* !RP_HOST */
    }
    
    DEFINE_ON_DEMAND(reset_udm0)
    {
    	#if !RP_HOST
    
    	Domain *domain;
    	Thread *t;
    	cell_t c;
    
    	domain = Get_Domain(1);
    
    	thread_loop_c(t,domain)
    	{
    	begin_c_loop(c,t)
    		{
    			C_UDMI(c,t,0) = 0.0;
    		}
    	end_c_loop(c,t)
    	}
    
    	#endif /* !RP_HOST */
    
    	wall_dist_set = FALSE;
    }
    

    说实话这个代码我不能完全看懂,但是主要思想就是用DEFINE_ON_DEMAND定义两个命令reset_udm0和set_wall_dist_udm0,前者将壁面到最近壁面的距离reset为0,后者可以求出想要的结果,经过测试两个命令应该都是必须的,另外我放的代码和CFDonline上有一点不同,domain = Get_Domain(1);这一行在原代码里面是domain = Get_Domain(ROOT_DOMAIN_ID);注意修改,下图是我测试的一个水翼网格的结果,结果是对的,
    8d4c8b84-afb1-4937-ba4d-d10e1a38612d-image.png
    再啰嗦几句代码使用方法,这个代码直接复制到一个.c文件中,在fluent中添加memory的数量为2,编译.c文件并load,在calculate之前,点Execute on Demand,并先后运行reset_udm0和set_wall_dist_udm0,然后就可以calculate了
    993e14e8-bcd5-4fbf-a316-ac6b28281a67-image.png
    690cec32-daaa-42de-a0c1-3075b41464e5-image.png

    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 benqing 最后由 编辑
    #8

    @benqing 感谢分享 厉害厉害!!

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 沉 离线
    沉 离线
    沉剑
    写于 最后由 编辑
    #9

    062cb6a6-3028-4ae6-854e-2c36313d3288-image.png
    https://www.cfd-online.com/Forums/fluent-udf/63211-calculate-distance-wall-neighbourig-cell-centroid-2.html

    1 条回复 最后回复
  • evensunE 离线
    evensunE 离线
    evensun
    写于 最后由 编辑
    #10

    我补充一句,最近也在写湍流模型UDF,需要用到壁面距离,发现C_WALL_DIST不能用之后不信邪,测试了很多(一个多小时测了十几二十个case),终于测试出来发现:
    C_WALL_DIST只有在选择了fluent已有湍流模型(我选了k-omega)的时候才能用,而当选择了laminar模式,用自己的湍流模型UDF的时候,如果涉及到C_WALL_DIST,就会报错。我的fluent版本为2022R2

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]