24小时热门版块排行榜    

CyRhmU.jpeg
查看: 7332  |  回复: 14

曾经的学渣

新虫 (初入文坛)

[求助] fluent udf 和udm 的使用问题,这个问题有点绕。已有1人参与

fluent udf中的一些问题:
   
     本人需要用到源项   DEFINE_SOURCE(en_source, cell, t, dS, eqn)  这个函数,但是源项里面有数据需要通过龙格库塔方法来解微分方程组来计算,我就在udf中写了龙格库塔算法。用龙格库塔解微分方程组时候需要上一个时间步长计算出来的结果作为初值。 现在的问题是如何将上一个时间步长的udf中龙格库塔计算出的值带入到下一个时间步长的udf中去。 矛盾点是udf 只有一套,每次迭代都跑一遍,,,,,,,,,,,,,,,,,,,,,,,,,  我想过用udm   将上一个时间步长计算结果保存到udm中,然后在下一个时间步长的udf中再调用,可是我始终无法实现这个想法。

    我不知道我这个想法靠不靠谱,或者说udm能不能实现这个功能。如果能实现的话,请大神给予指导。





总共就这一点金币全给上了,多谢了。   不知道我描述的清不清楚,有问题请留言给我我再细说。
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

gyctju

金虫 (正式写手)

给你个思路,用uds加c_udsi_m1, 当然也有其他方法,自己慢慢试

发自小木虫Android客户端
2楼2017-10-11 22:51:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

keeep0394

新虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
曾经的学渣: 金币+5, ★★★很有帮助 2017-10-16 15:12:59
要实现调用上一时间步的计算结果,仅仅靠DEFINE_SOUCE宏不行,还得用到DEFINE_EXECUTE_AT_END宏,每个时间步计算结束后这个宏会运行一次。定义两个UDM,第一个UDM存储上个时间步的结果,第二个UDF存储当前时间步的计算结果,在DEFINE_EXECUTE_AT_END中进行计算,将值赋予UDM,再在DEFINE_SOUCE中将UDM作为源项。建议查查UDF MANUAL。
5楼2017-10-13 18:35:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

曾经的学渣

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by gyctju at 2017-10-11 22:51:53
给你个思路,用uds加c_udsi_m1, 当然也有其他方法,自己慢慢试

能不能说的稍微详细点?
3楼2017-10-12 14:36:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

曾经的学渣

新虫 (初入文坛)

人工顶
4楼2017-10-13 15:54:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

曾经的学渣

新虫 (初入文坛)

引用回帖:
5楼: Originally posted by keeep0394 at 2017-10-13 18:35:30
要实现调用上一时间步的计算结果,仅仅靠DEFINE_SOUCE宏不行,还得用到DEFINE_EXECUTE_AT_END宏,每个时间步计算结束后这个宏会运行一次。定义两个UDM,第一个UDM存储上个时间步的结果,第二个UDF存储当前时间步的计 ...

多谢回复,根据你的提示,我是这么想的,udm定义和初始化需要一个只运行一次的宏用 DEFINE_ON_DEMAND 或者 DEFINE _INIT 给udm1 和udm2 赋初值,然后第一个时间步长用初始值计算源项,源项用到DEFINE_SOUCE    时间步长计算结束用DEFINE_EXECUTE_AT_END 计算下一个步长所用的数据存在 udm2 同时再把udm2的值用一个中间变量传递给udm1 。 昨天试了下,写完的代码总是在C_UDMI 这个地方报错,编译不能通过。
6楼2017-10-15 12:31:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

曾经的学渣

新虫 (初入文坛)

引用回帖:
5楼: Originally posted by keeep0394 at 2017-10-13 18:35:30
要实现调用上一时间步的计算结果,仅仅靠DEFINE_SOUCE宏不行,还得用到DEFINE_EXECUTE_AT_END宏,每个时间步计算结束后这个宏会运行一次。定义两个UDM,第一个UDM存储上个时间步的结果,第二个UDF存储当前时间步的计 ...

我的想法是  DEFINE_INIT  在开始时候执行一遍用来给udm初值,然后 define source   然后时间步结束,更新udm ,然后循环下去。这是我的代码,请帮我看下哪里有问题,我也在fluent 里打开了12个udm 。还是报错

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : execute_at_end_.c
  • 2017-10-15 14:39:30, 5.02 K
7楼2017-10-15 14:41:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

keeep0394

新虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
曾经的学渣: 金币+10, ★★★很有帮助 2017-10-16 15:12:43
首先在申请内存分配空间,有几个UDMI就申请几个,不然即使编译通过也会因为没有空间存储报错。
程序中d = Get_Domain(21);  如果仅仅是单相流动,正确的应该是d = Get_Domain(1)。
8楼2017-10-15 18:58:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

曾经的学渣

新虫 (初入文坛)

引用回帖:
8楼: Originally posted by keeep0394 at 2017-10-15 18:58:01
首先在申请内存分配空间,有几个UDMI就申请几个,不然即使编译通过也会因为没有空间存储报错。
程序中d = Get_Domain(21);  如果仅仅是单相流动,正确的应该是d = Get_Domain(1)。

我又改了下,不用udf初始化udm了,在初始化的patch里可以定义udm初值,我就只用了 DEFINE_EXECUTE_AT_END  和  DEFINE_SOUCE  两个宏来, udm的计算和修改放在  DEFINE_EXECUTE_AT_END 里 ,  DEFINE_SOUCE 仅仅用来调用udm 计算源项,现在udf 可以通过compiled 放进fluent   但是运行时候报错Error:  received a fatal signal (Segmentation fault).   请你帮我看看我的代码哪里出问题了。  多谢了。

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : execute_at_end.c
  • 2017-10-16 15:12:18, 3.3 K
  • 附件 2 : source.c
  • 2017-10-16 15:12:18, 970 bytes
9楼2017-10-16 15:12:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

曾经的学渣

新虫 (初入文坛)

引用回帖:
8楼: Originally posted by keeep0394 at 2017-10-15 18:58:01
首先在申请内存分配空间,有几个UDMI就申请几个,不然即使编译通过也会因为没有空间存储报错。
程序中d = Get_Domain(21);  如果仅仅是单相流动,正确的应该是d = Get_Domain(1)。

我的计算模型是一个简单的固体传热模型,考虑到固体融化问题,其中有一层固体有自热反应,反应速率和温度相关,其实并不涉及流域,但是因为要模拟融化,我把融化那一层设置为液体才能定义相变温度和相变热。
10楼2017-10-16 15:30:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 曾经的学渣 的主题更新
信息提示
请填处理意见