24小时热门版块排行榜    

查看: 4323  |  回复: 17
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

mopsite

木虫 (著名写手)

[求助] 用uds求解如下的问题为什么不收敛啊。谢谢! 已有1人参与

用uds求解如下的问题为什么不收敛啊。谢谢!
比较简单的问题,2个方程,求解两个uds,两外2个uds储存数据和得出梯度。算例见附件。
当不加uds1的源项时,可以运算,但是一加uds1的源项,就发散。不知道问题出在哪,怀疑是在用uds求解梯度时不太对,查看可以发现梯度局部边界的值较大。
用uds求解如下的问题为什么不收敛啊。谢谢!
3.jpg#include "udf.h"
#define B_ION 1.5e-4 /* Ion mobility - positive ion estimate */
#define EPS_0 8.85418717e-12


DEFINE_ADJUST(Calc_E_xy,d)
{
Thread *t;
cell_t c;
face_t f;
Thread *t0;
cell_t c0;
real dr0[ND_ND],dr1[ND_ND], xf[ND_ND], dy;

/* Do nothing if gradient isn't allocated yet. */
if (!Data_Valid_P()) return;
thread_loop_c(t,d)
{
if (NULL != THREAD_STORAGE(t,SV_UDS_I(0)) && NULL != T_STORAGE_R_NV(t,SV_UDSI_G(0)))
{
begin_c_loop(c,t)
{
C_UDSI(c,t,2) = -1.*C_UDSI_G(c,t,0)[0];
C_UDSI(c,t,3) = -1.*C_UDSI_G(c,t,0)[1];
}
end_c_loop(c,t)
}
}
thread_loop_f(t,d)
{
if (NULL != THREAD_STORAGE(t,SV_UDS_I(3)) && NULL != T_STORAGE_R_NV(t->t0,SV_UDSI_G(3)))
{
if (BOUNDARY_FACE_THREAD_P(t))
{
begin_f_loop(f,t)
{
c0 = F_C0(f,t);
t0 = THREAD_T0(t);
F_CENTROID(xf,f,t);
C_CENTROID(dr0,c0,t0);
NV_VV(dr1,=,xf,-,dr0);
F_UDSI(f,t,2) = C_UDSI(c0,t0,2) + (C_UDSI_G(c0,t0,2)[0]*dr1[0]);
F_UDSI(f,t,3) = C_UDSI(c0,t0,3) + (C_UDSI_G(c0,t0,3)[1]*dr1[1]);
}
end_f_loop(f,t)
}
}
}
}


/*******************************************************************/
/* UDF_source_phi_rho_11.c for specifying the phi and rho source terms for uds-0 */
/*******************************************************************/
DEFINE_SOURCE(phi_source_temp,c,t,dS,eqn)
{
real phi_source;
dS[eqn] = 0.0;
phi_source = C_UDSI(c,t,1)/EPS_0;
return phi_source;
}
DEFINE_SOURCE(rho_source_temp,c,t,dS,eqn)
{
real rho_source;
real xc[ND_ND];
real dens;
dS[eqn] = 0;
C_CENTROID(xc,c,t);
dens=C_R(c,t);
rho_source = C_UDSI(c,t,1)*B_ION*(C_UDSI_G(c,t,2)[0] + C_UDSI_G(c,t,3)[1]);
rho_source = -rho_source;
return rho_source;
}


DEFINE_UDS_FLUX(rho_ion_flux,f,t,i)
{
cell_t c0, c1 = -1;
Thread *t0, *t1 = NULL;
real NV_VEC(psi_vec), NV_VEC(A), flux = 0.0;
c0 = F_C0(f,t);
t0 = F_C0_THREAD(f,t);
F_AREA(A, f, t);

if (BOUNDARY_FACE_THREAD_P(t))
{

NV_DS(psi_vec, =, F_U(f,t), F_V(f,t), F_W(f,t), *, 1);
flux = NV_DOT(psi_vec, A); /* flux through Face */
}
else
{
c1 = F_C1(f,t); /* Get cell on other side of face */
t1 = F_C1_THREAD(f,t);
NV_DS(psi_vec, =, C_U(c0,t0),C_V(c0,t0),C_W(c0,t0),*,1.0);
NV_DS(psi_vec, +=, C_U(c1,t1),C_V(c1,t1),C_W(c1,t1),*,1.0);  
flux = NV_DOT(psi_vec, A)/2.0; /* Average flux through face */
}
  return flux;
}

[ Last edited by mopsite on 2013-12-17 at 18:38 ]
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : new.zip
  • 2013-12-17 17:47:22, 227.24 K

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mopsite

木虫 (著名写手)

引用回帖:
14楼: Originally posted by longma135 at 2013-12-20 13:18:26
http://muchong.com/bbs/viewthread.php?tid=6775519&pid=3#pid3
帮我看下我这篇帖子,是这样么?

我的UDF从上到下写的顺序是组分方程,动量方程,连续性方程,能量方程,我这样写的原因是连续性方程和能量方 ...

写的顺序与求解顺序没有关系吧,在udf内你写在最后也可以先运行啊。还是看你链接的位置计算的优先顺序吧
15楼2013-12-20 15:57:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 18 个回答

gearboy78

禁虫 (小有名气)

本帖内容被屏蔽

3楼2013-12-19 08:01:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mopsite

木虫 (著名写手)

引用回帖:
3楼: Originally posted by gearboy78 at 2013-12-19 08:01:17
不收敛的可能性太多,例如控制方程本身不对,松弛因子太大,编程不对等等。

谢谢 回复,您说的控制方程不对,是指哪个地方啊。 如果这个地方不对的话,就是根上不对了。
还请高手点拨点拨啊,叩谢了。。。
4楼2013-12-19 08:19:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mopsite

木虫 (著名写手)

引用回帖:
3楼: Originally posted by gearboy78 at 2013-12-19 08:01:17
不收敛的可能性太多,例如控制方程本身不对,松弛因子太大,编程不对等等。

感谢您的提醒,控制方程可能是这样的,我修改下程序试下,谢谢。
用uds求解如下的问题为什么不收敛啊。谢谢!-1
eq.jpg

5楼2013-12-19 09:46:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见