| 查看: 6058 | 回复: 13 | ||
[求助]
Fluent 中 UDF 计算结果输出到窗口问题 已有1人参与
|
||
» 本主题相关价值贴推荐,对您同样有帮助:
在fluent中初始化的时候出错,请高手看看我的编程哪里有错
已经有8人回复
关于Fluent中利用UDF编译动网格的问题
已经有10人回复
fluent中 updating solution 很慢,如下图位置
已经有2人回复
FLUENT中VOF+凝固熔化模型,未到熔点即有速度。
已经有2人回复
workbench中fluent最简单的U形管 流固耦合传热问题 case求助
已经有2人回复
FLUENT后处理
已经有4人回复
Fluent结果显示中XYPlot怎样采用极坐标
已经有4人回复
求教怎么在Fluent中画曲线
已经有2人回复
fluent中UDF编写的问题
已经有7人回复
Fluent中编写UDF之后无法初始化。。。
已经有5人回复
fluent中利用udf添加曳力模型求助
已经有1人回复
Fluent中DPM模型的UDF中使用P_POS()指针,然后给我提示undeclared variable 怎么办?
已经有6人回复
fluent 对流项
已经有2人回复
fluent中udf的问题
已经有1人回复
FLUENT中编写UDF时指针变量是否要初始化
已经有4人回复
关于fluent中壁面耦合传热的问题
已经有10人回复
Fluent中UDF自定义了一个热流密度
已经有12人回复
求助:Fluent中沿程阻力系数的确定【急求】
已经有13人回复
Fluent船舶流体力学仿真计算工程应用基础
已经有255人回复
fluent难收敛求教
已经有11人回复
fluent中的体热源加载问题(实际上是热流密度,不是热生成率)
已经有19人回复
【应求】fluent帮助中C程序&fluent 13 udf教程
已经有11人回复
分享:流体力学基础和FLUENT的资料,共60本
已经有51人回复
【答案】应助回帖
感谢参与,应助指数 +1
|
循环结构倒是没什么问题,但是可以看看libudf里面的C文件是不是没改过? 按理说,DEFINE_SOURCE是定义语句,不会在收敛计算过程中每次计算都重新调用吧,但是你这种输出规律像是这样,如果是每次都会调用的话请告知我一下,谢谢。 而且一直输出0就证明你的udf编的有问题,返回值都是0(难道每个cell都没有x方向的温度梯度?),你可以试着输出一下计算所用的三个数据看看,也可以看看domain的编号有没有问题(壁面有时就会有很大问题),如果是多核并行计算可能还要考虑host的问题。 你这点线索求问题还是少,你想要定义什么,思路如何说出来可能就会清楚很多。 |
7楼2016-11-28 13:32:28
|
首先,十分感谢你的回复,给了我很大帮助。因为是刚接触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 ,谢谢你的耐心指导!如果以上我说的有么不对,还请指出。以后如果有机会,希望还能向你请教! 3333.PNG 1111.PNG 222.PNG |
13楼2016-12-01 18:52:14

2楼2016-11-27 22:43:14
3楼2016-11-27 23:10:46

4楼2016-11-27 23:30:24
5楼2016-11-28 09:21:42
| 祝福 |
6楼2016-11-28 12:12:50
|
几个点我都说一下吧: 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
【答案】应助回帖
|
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
|
首先,我试验了一下,确实如你所说的,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










回复此楼
欧式发酵乳
里面这么写的……