24小时热门版块排行榜    

查看: 5696  |  回复: 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 的主题更新
信息提示
请填处理意见