24小时热门版块排行榜    

查看: 5999  |  回复: 13

歪歪_crazy

银虫 (初入文坛)

[求助] Fluent 中 UDF 计算结果输出到窗口问题 已有1人参与

求助!已经将输出显示在窗口的语句   printf("P_out: %g\n", p);   放在循环外了,为什么计算的时候还是每次都要输出计算结果?

Fluent 中 UDF 计算结果输出到窗口问题
1111.PNG


Fluent 中 UDF 计算结果输出到窗口问题-1
22222.PNG
回复此楼

» 本帖已获得的红花(最新10朵)

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

sfbook

银虫 (小有名气)

【答案】应助回帖

感谢参与,应助指数 +1
循环结构倒是没什么问题,但是可以看看libudf里面的C文件是不是没改过?
按理说,DEFINE_SOURCE是定义语句,不会在收敛计算过程中每次计算都重新调用吧,但是你这种输出规律像是这样,如果是每次都会调用的话请告知我一下,谢谢。
而且一直输出0就证明你的udf编的有问题,返回值都是0(难道每个cell都没有x方向的温度梯度?),你可以试着输出一下计算所用的三个数据看看,也可以看看domain的编号有没有问题(壁面有时就会有很大问题),如果是多核并行计算可能还要考虑host的问题。
你这点线索求问题还是少,你想要定义什么,思路如何说出来可能就会清楚很多。
7楼2016-11-28 13:32:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

歪歪_crazy

银虫 (初入文坛)

引用回帖:
11楼: Originally posted by sfbook at 2016-12-01 15:33:16
同学,我感觉你需要系统的学习一下C语言和UDF的编程了。。。。。
默认单相流domain只有1,多相流才需要用到更多的domain,如果你的Phases选项没开就不用考虑Get_Domain了,有问题可以仔细看看udf帮助里的Special  ...

首先,十分感谢你的回复,给了我很大帮助。因为是刚接触UDF,并且C语言也只是会点皮毛,所以错误百出,让您见笑了。
其次我想分享一下我这几天编这个udf的一些心得,算是班门弄斧,并且给以后看到这个帖子的人一些帮助吧。
1.关于C_T_G(c,t)  这个宏的运用,需要在fluent的控制台中打开一些设置  solve/set>expert Keep temporary solver memory from being free? [yes]
通过打开这个在设置来保证 Fluent 不会在计算结束就清除数据而导致的不能计算梯度。 同时根据我的试验,发现在使用到这个语句时,如果在最初读入,Fluent没有储存值的情况下,也会报错,不能计算。这时就需要先不加载含有这个语句的udf,运行几步之后,在加载udf就能计算了。
2.在使用 Lookup_Thread 语句之后,不能使用 thread_loop_c,thread_loop_f 因为这两者都是针对 domain 全局进行的循环,跟在 Lookup_Thread 这个指定区域语句后应该是因为产生矛盾而报错。
3.还是关于  Lookup_Thread(domain,Zone_ID) 的,如果在本语句之后进行的循环是关于 cell 的 thread_loop_c,那么查找的 ID 应为 Cell Zone Conditions 中你想要计算区域的 ID,不行选择 Boundary Conditions之中的,不然也会报错。
4.上传一张关于各个函数调用位置的彩图,感觉挺有用的,有兴趣的可以看看。

最后,再次感谢 @sfbook ,谢谢你的耐心指导!如果以上我说的有么不对,还请指出。以后如果有机会,希望还能向你请教!
Fluent 中 UDF 计算结果输出到窗口问题-2
3333.PNG


Fluent 中 UDF 计算结果输出到窗口问题-3
1111.PNG


Fluent 中 UDF 计算结果输出到窗口问题-4
222.PNG

13楼2016-12-01 18:52:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

jie_ge

新虫 (小有名气)

因为循环外还有一个循环,

发自小木虫Android客户端
走好自己的路,下一步就很精彩!
2楼2016-11-27 22:43:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

歪歪_crazy

银虫 (初入文坛)

引用回帖:
2楼: Originally posted by jie_ge at 2016-11-27 22:43:14
因为循环外还有一个循环,

什么意思呢?不太明白…… 还有能否给出个解决方案?
3楼2016-11-27 23:10:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jie_ge

新虫 (小有名气)

引用回帖:
3楼: Originally posted by 歪歪_crazy at 2016-11-27 17:10:46
什么意思呢?不太明白…… 还有能否给出个解决方案?...

thread_loop_c没有结束语吧,在输出之前加结束语!

发自小木虫Android客户端
走好自己的路,下一步就很精彩!
4楼2016-11-27 23:30:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

歪歪_crazy

银虫 (初入文坛)

引用回帖:
4楼: Originally posted by jie_ge at 2016-11-27 23:30:24
thread_loop_c没有结束语吧,在输出之前加结束语!
...

thread_loop_c 这个没有结束语,就是按照帮助文件里面这么写的……
5楼2016-11-28 09:21:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
祝福
6楼2016-11-28 12:12:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

歪歪_crazy

银虫 (初入文坛)

引用回帖:
7楼: Originally posted by sfbook at 2016-11-28 13:32:28
循环结构倒是没什么问题,但是可以看看libudf里面的C文件是不是没改过?
按理说,DEFINE_SOURCE是定义语句,不会在收敛计算过程中每次计算都重新调用吧,但是你这种输出规律像是这样,如果是每次都会调用的话请告知 ...

几个点我都说一下吧:
1,是单核运算的。
2,输出值为0时因为这是计算的第一步,初始化的时候没有温度梯度的,多算两步的话就会有输出值了。
3,我在循环外放了一个 i++, 用来验证循环外是否还有循环。i值没有增加,也就是说循环外是没有再循环的。
4,关于计算模型的思路:目标是计算热电模块的输出功率,通过计算每个cell所产生的电压和电阻,最后输出一个总和的P_out。计算区域为固体。
5,还有在计算中发现一个问题,如果使用 thread_loop_c(t,d) 的话,因为d 的定义可能会出错,所以我就直接把这个语句拿掉了,因为我是直接在计算区域使用的UDF,所以也就不用在寻找这个计算区域了。不过对这个语句我还是不太理解,看了帮助也没弄懂这个 d 如何定义到自己想要的计算区域(固体,域,不是面)。如果能给解答的话,麻烦解释一下。
6,现在我的解决办法是不在窗口输出,直接输出到一个“.dat”文件中,不过还是会出现等同cell个数的相同结果,所以导致计算时间很长。
8楼2016-11-28 14:28:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sfbook

银虫 (小有名气)

【答案】应助回帖

引用回帖:
8楼: Originally posted by 歪歪_crazy at 2016-11-28 14:28:55
几个点我都说一下吧:
1,是单核运算的。
2,输出值为0时因为这是计算的第一步,初始化的时候没有温度梯度的,多算两步的话就会有输出值了。
3,我在循环外放了一个 i++, 用来验证循环外是否还有循环。i值没有增 ...

d也就是domain,是thread的组合,它的数值可以在Boundary Conditions的ID栏里看到(Cell Zone Conditions里面的ID我基本没有用过,貌似是有些区别的?),如果你是在这里面直接设置的话完全可以避开所有的loop选项,因为你的定义中的c和t就已经给你的区域进行了限制,这样函数的调用次数就是(Σdomain内cell数),也就怪不得会有这么多次输出了,而且你根本得不到P_out的多cell内值之和,你得到的P_out只是单一的cell值,原文解释(Note that like property UDFs, source term UDFs (defined using DEFINE_SOURCE) are called by ANSYS Fluent from within a loop on cell threads. The solver passes to the DEFINE_SOURCE term UDF all the necessary variables it must define a custom source term, since source terms are solved on a cell basis. Consequently, your UDF will not need to loop over cells in the thread since ANSYS Fluent is already doing it.)。
这个函数是定义用函数,也就是初始化时使用的,但是你的返回值里面根本没有定义任何数,相当于一直在返回0,没有意义。如果你已经做好了电压和电阻的初始化,只是想输出一个总和的P_out,可以试试EXECUTE_AT_END这个函数,只在计算完成后执行。
如果你还没有做电压电阻的初始化,而且不知道怎么加入计算公式的话,我就帮不了你了,因为我是做传热的。。。。。。
9楼2016-11-29 15:35:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

歪歪_crazy

银虫 (初入文坛)

引用回帖:
9楼: Originally posted by sfbook at 2016-11-29 15:35:37
d也就是domain,是thread的组合,它的数值可以在Boundary Conditions的ID栏里看到(Cell Zone Conditions里面的ID我基本没有用过,貌似是有些区别的?),如果你是在这里面直接设置的话完全可以避开所有的loop选项 ...

首先,我试验了一下,确实如你所说的,DEFINE_SOURCE 是自带循环的,但是它的循环应该是针对每一个 cell ,也就是说没有一个 cell ,它会循环一次,而嵌在其中的 Loop 循环也会循环一次,并且每次循环得到的也是我先要的 cell 加和值(因为Loop循环是针对整个域进行的),结果就导致了我现在比较简单的一个计算就非常的慢。
所以我现在打算使用 DEFINE_ADJUST 进行计算,但是在计算过程中我发现我不能 定位到我想要的计算区域,下面程序是可以在整个计算域里面计算并返回计算值的。然后我使用Get_Domain 和 Lookup_Thread 进行定位都失败了,不知道你有什么经验或者建议吗?谢谢了!

#include "udf.h"
#define zone_ID 0
double P_out=0.;




DEFINE_ADJUST(TEG_adjust,domain)
{
        Thread *t;
        cell_t c;
        Thread *teg;
        Domain *all;
        int  Zone_ID;
       
        face_t f;
    real temp=0.,grad=0.,source=0.;
        real a=0.,b=0.;
        real u=0.,u_sum=0.,vol=0.,vol_sum=4.752*0.00001;
        real r=0.,r_sum=0.,s=1.76*0.001;
        real p=0.;

       

thread_loop_c (t,domain)
{
       


                begin_c_loop (c,t)
                {
                  temp=C_T(c,t);
                  vol=C_VOLUME(c,t);
                  grad=-0.0003*C_T_G(c,t)[0];/*0 for x,1 for y, 2 for z*/
                  
                  a=-6.035*0.0001+6.270*0.000001*temp-1.571*0.00000001*temp*temp+1.260*0.00000000001*temp*temp*temp;
                  u=a*grad*vol/vol_sum;
                  u_sum+=u;

                  b=-7.188*0.0000001+6.926*0.000000001*temp-3.573*0.000000000001*temp*temp;
                  r=b*vol/s/s;
                  r_sum+=r;
                }
                end_c_loop (c,teg)
}
p=u_sum*u_sum/(2*r_sum);
         
         P_out=p;

Message("%g, %g %g\n", u_sum,r_sum,P_out );


}
10楼2016-12-01 10:27:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 学员fIJLZY 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 2026国自然函评费到账 +20 羊腰板 2026-08-21 23/1150 2026-08-25 16:34 by zsna
[基金申请] 在坚冰还盖着北海的时候,我看到了怒放的梅花。 +6 ziyangfang 2026-08-25 8/400 2026-08-25 16:28 by 宝贝的猪
[基金申请] 今日不放榜?网传国自然预计 8 月 27 日可查结果 +17 医学老男孩 2026-08-20 22/1100 2026-08-25 15:36 by 医学老男孩
[基金申请] 什么时候开奖? +12 CrisMessi 2026-08-18 13/650 2026-08-25 14:40 by ZJTJZ
[基金申请] 如果此刻你正在为国基感到焦虑,不妨来听听这首《基金之外》 +8 scalable 2026-08-24 8/400 2026-08-25 12:52 by jnhyjjm
[基金申请] 没有任何消息-是不是就凉了 +9 图啦图啦 2026-08-24 10/500 2026-08-25 11:59 by 南海小哥
[基金申请] 人气不行了 +11 fansofjerry 2026-08-21 11/550 2026-08-25 11:04 by 孤独的英雄6
[教师之家] 导师吐槽:我怎么摊上了这么个极品研究生! +3 苏东坡二世 2026-08-23 3/150 2026-08-25 10:35 by shisan1313
[基金申请] 2026年的国家社科基金项目通讯评审的新规则与新动向、新挑战 +5 process2012 2026-08-23 7/350 2026-08-25 09:42 by huixian257
[基金申请] 我面上完蛋了 +13 且听虎啸 2026-08-20 14/700 2026-08-25 09:10 by mrkang
[基金申请] 范进中举一文的中心思想 +7 炎黄贵胄 2026-08-22 8/400 2026-08-25 08:48 by ZJTJZ
[基金申请] 明天应该可查了!? +5 chengyan1220 2026-08-23 5/250 2026-08-24 23:28 by 我4大白菜
[基金申请] 建议基金发布提前给出明确的时间点 +13 kulium 2026-08-21 16/800 2026-08-24 16:27 by superceng
[基金申请] 让我中一个面上吧! +13 大萍1987 2026-08-20 16/800 2026-08-24 10:23 by 太傻了
[教师之家] 跳槽后在研项目怎么办? +5 简单化xn 2026-08-22 10/500 2026-08-23 12:38 by 简单化xn
[基金申请] 今天放榜吗? +15 布布和一二 2026-08-19 16/800 2026-08-23 09:55 by 张春生
[基金申请] 时间戳今天,20号变了 +5 archvillain 2026-08-20 5/250 2026-08-22 06:12 by hui_daxiao
[基金申请] 看来今天不会放榜了? +8 chengyan1220 2026-08-21 11/550 2026-08-21 17:52 by dcqxinyang
[基金申请] 时间戳又变了 +13 wuchongjun 2026-08-20 19/950 2026-08-21 17:21 by 紫杉醇
[基金申请] 今天放榜没戏了吧 +9 yuleib84 2026-08-19 11/550 2026-08-21 10:06 by gltch
信息提示
请填处理意见