找回密码
 注册
查看: 1237|回复: 4

请教:可以麻烦大家帮我看一下我的这个UDF吗?

[复制链接]
发表于 2015-4-2 07:50:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
定义了一个10*10*10的正方体网格,正方体的中心是坐标原点。
顶面定温273.2K, 底面定温343.7K, 其他四个面分度分别从343.7K渐变到273.2K, 也就是说从上到下有一个-7.05K/m的温度梯度, 下面是我写的UDF:

#include "udf.h"
DEFINE_PROFILE(temperature_profile,thread,position)
{
  real r[ND_ND];
  real z;
  face_t f;
  begin_f_loop(f,thread)
  {
   F_CENTROID(r,f,thread);
   z=r[0];
   F_PROFILE(f,thread,position)=308.45-7.05*z;
   }
   end_f_loop(f,thread)
}

为什么结果是: 左面和右面方向错误,前面和后面变成了定值?
本人新手 还望大侠们伸手相助 不胜感激
Capture.PNG
 楼主| 发表于 2015-4-2 07:54:54 | 显示全部楼层
补充一下: 我试过把UDF里面的z换成x和y, 还是一样的
发表于 2015-4-2 09:07:17 | 显示全部楼层
本帖最后由 xzd251 于 2015-4-2 09:10 编辑

首先声明一下,我没写过UDF,倒是用Fortran写过(全是无量纲计算)计算程序。
有点疑问,你定义了z和r,z=r[0],下面的计算之体现了你第i=0层的计算结果,z和r本身的递增特性在哪,也就是第i+1层z和r的值如何求得?
如果没有定义i+1和i的关系,那你这个只是软件自身初始化算出的结果,你改x,y,z理应无任何区别。


 楼主| 发表于 2015-4-2 23:33:25 | 显示全部楼层
xzd251 发表于 2015-4-2 09:07
首先声明一下,我没写过UDF,倒是用Fortran写过(全是无量纲计算)计算程序。
有点疑问,你定义了z和r,z= ...

非常感谢您的帮助 确实如您所说 改变X Y Z无任何区别
我把z=r[0]改成了z=r[2] 然后前后左右四个面有了梯度 因为我找到了一个例子说r[0] r[1] r[2]分别对应着x, y, z的值
发表于 2015-4-8 10:10:37 | 显示全部楼层
本帖最后由 xzd251 于 2015-4-8 10:24 编辑
xuboyue110 发表于 2015-4-2 23:33
非常感谢您的帮助 确实如您所说 改变X Y Z无任何区别
我把z=r[0]改成了z=r[2] 然后前后左右四个面有了梯 ...


别这么客气,我也就是个初学者。毕业研究的时候天天啃,现在放下两年多没弄了。你这种情况的话,需要加一个do loop,定义整数i(看你贴出的代码是想展现7.05的梯度,那就别把i定义为real了,增加计算量不说,还不好定义递增特性),递增特性定义为i=i+1(也就是说,你给i赋一个值,你必须得定义与之相邻的i值与你赋值的这个之间的关系,要不这就不是loop,就是一次性计,算到底就结束),初始值i=0,然后z=r(i)(此处i本应该用[]的,但是那样写之后就被自动识别为文字斜体命令,所以用()代替)。因为你这个算例的起点和终点已明确,所以可以直接令i=10时结束运算(当然你完全可以细分,比如一个梯度变成0.705,这样你的i就要算到100,此情况下正方体网格数也得变成100*100*100吧?)。另外,还是如上次所说,UDF我不是很了解,想问一下,你这个计算初始化是自动实现吗?
还有,你说“r[0] r[1] r[2]分别对应着x, y, z的值”这个应该是不对的,你的代码体现的信息,r只与z有关系,难道说你这个称为z的函数与x,y,z都关联?这个倒是可以轻易实现(通过判断i被3除的余数来定义所得z值分别对应x,y,z),但是你的代码中没体现,而且你也不需要。




您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表