24小时热门版块排行榜    

查看: 9069  |  回复: 36

转石千仞

金虫 (正式写手)

击破长空

【答案】应助回帖

楼主,我觉得,你这种情况,你要去想,你求解的标量是有范围的对不对?
如果标量只存在于一个区域内,而你的程序,要对所有区域都求标量的梯度,必然是要出错的。
我也出现过此种情况。
你加上线ID去识别你的标量求解域,再做梯度运算。
故善战人之势,如转圆石于千仞之山者,势也
21楼2013-12-17 18:31:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mopsite

木虫 (著名写手)

引用回帖:
21楼: Originally posted by 转石千仞 at 2013-12-17 18:31:56
楼主,我觉得,你这种情况,你要去想,你求解的标量是有范围的对不对?
如果标量只存在于一个区域内,而你的程序,要对所有区域都求标量的梯度,必然是要出错的。
我也出现过此种情况。
你加上线ID去识别你的标量 ...

大侠 帮我看看,我这个也是线id问题不,谢谢!
http://muchong.com/bbs/viewthread.php?tid=6764310&fpage=1
22楼2013-12-17 18:47:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

759599290

银虫 (小有名气)

【答案】应助回帖

最近我也测试了使用DEFINE_ADJUST宏来获得某一变量的二阶导数。心得如下:
1、梯度变量在FLUENT计算过程中是暂存变量,计算完成后将自动释放。如果要获取,需使用如下方法强制求解器保存梯度变量已供后用:
在FLUENT主窗中输入:solve--set--expert,出现的是否保存梯度变量询问语句回答为yes
2、梯度变量在首次计算中是不存在的。即使在计算之前,UDS已经使用一定方法进行过初始化,UDS_G仍将是空值,在第一步计算时内存中不存在这一变量,因此无论如何设置,第一步计算都不能调用C_UDSI_G宏。计算进行了一步或更多步之后才可以。
3、C_UDSI_G调出的变量并不一定是内部计算使用的梯度值。在某些复杂边界处,Fluent内部有其他未公开的处理函数,C_UDSI_G只在计算区域中的绝大部分里非常接近内部计算使用的梯度值。
仅个人看法,未必正确,盼有所助。
中国热管理协会特约专家,中国热设计网高级顾问,东莞鸿艺电子技术总监
23楼2014-01-13 08:50:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ajene

银虫 (小有名气)

【答案】应助回帖

可能是在读取UDS梯度的时候,模型中某些节点的值不存在造成的。这种读取错误时很常见的,建议参考一下fluent help 中T^4 梯度的例子。应该是可以解决的;
24楼2014-01-13 10:22:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tommyan

新虫 (初入文坛)

这个代码貌似是非法访问。
C_UDSI_G(c,t,0) 返回的是一个矢量,不能直接用在乘法表达式。
可以尝试:
求矢量模:NV_MAG(C_UDSI_G(c,t,0))再乘,
或者
real g[ND_ND];
g=C_UDSI_G(c,t,0);
使用g[0],g[1] g[2]
25楼2014-01-30 18:25:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

奔跑鱼

新虫 (小有名气)

引用回帖:
23楼: Originally posted by 759599290 at 2014-01-13 08:50:45
最近我也测试了使用DEFINE_ADJUST宏来获得某一变量的二阶导数。心得如下:
1、梯度变量在FLUENT计算过程中是暂存变量,计算完成后将自动释放。如果要获取,需使用如下方法强制求解器保存梯度变量已供后用:
在FLU ...

也就是说,在ADJUST宏中如果出现UDS_G的时候,必须先让程序执行一步才能开始调用ADJUST?
具体应该怎么实现呢?
26楼2014-03-04 10:18:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

759599290

银虫 (小有名气)

引用回帖:
26楼: Originally posted by 奔跑鱼 at 2014-03-04 10:18:25
也就是说,在ADJUST宏中如果出现UDS_G的时候,必须先让程序执行一步才能开始调用ADJUST?
具体应该怎么实现呢?...

可以先不hook相应的adjust宏,先让Fluent计算收敛。如果是非稳态问题,第一步必须设置相当小的时间步长。第一步收敛后再hook如ajust函数就行了。
中国热管理协会特约专家,中国热设计网高级顾问,东莞鸿艺电子技术总监
27楼2014-03-04 14:31:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

奔跑鱼

新虫 (小有名气)

引用回帖:
27楼: Originally posted by 759599290 at 2014-03-04 14:31:32
可以先不hook相应的adjust宏,先让Fluent计算收敛。如果是非稳态问题,第一步必须设置相当小的时间步长。第一步收敛后再hook如ajust函数就行了。...

我这种情况可能还比较复杂 有UDS,ADJUST中有一些变量需要更新,然后代入UDS方程才能迭代,这种情况应该怎么办呢?
28楼2014-03-04 15:16:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

759599290

银虫 (小有名气)

引用回帖:
28楼: Originally posted by 奔跑鱼 at 2014-03-04 15:16:11
我这种情况可能还比较复杂 有UDS,ADJUST中有一些变量需要更新,然后代入UDS方程才能迭代,这种情况应该怎么办呢?...

猜想可以采用折中的办法:
1、Fluent中uds的梯度值在刚开始计算的第一步的确是不存在的,所以任何需要调用uds_g的宏只能在第二步开始,这会造成误差,这也是为什么第一个时间步必须设置的非常小的原因。当然,如果是稳态问题,误差是可通过后来hook上ajust宏后自动迭代减小的。
2、如果宏中的确有些变量很重要且它们并未使用到uds_g变量,可以分开写,将调用了梯度变量的放到一个函数体里,没调用的放到另一个函数体里。
仅个人见解。
中国热管理协会特约专家,中国热设计网高级顾问,东莞鸿艺电子技术总监
29楼2014-03-04 15:25:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

奔跑鱼

新虫 (小有名气)

引用回帖:
29楼: Originally posted by 759599290 at 2014-03-04 15:25:33
猜想可以采用折中的办法:
1、Fluent中uds的梯度值在刚开始计算的第一步的确是不存在的,所以任何需要调用uds_g的宏只能在第二步开始,这会造成误差,这也是为什么第一个时间步必须设置的非常小的原因。当然,如果 ...

谢谢,我也是初学,今天刚开始意识到这个问题。
那这样的话,我每部都需要更新变量,是不是说,可以吧没有梯度变量的保留在ADJUST中,第一步之前直接调用,而有梯度的,可以调用EXECUTE_AT_END宏,在每一次迭代结束后更新呢?
30楼2014-03-04 17:38:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 duandiancqu 的主题更新
信息提示
请填处理意见