加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

柯朗数(Courant number)研究

(2017-07-11 15:50:08)
标签:

柯朗数

courantnumber

分类: CFD

在数值计算过程中,对于计算结果的准确性和效率有很高的要求,但是这两者之间往往互相矛盾;而使用柯朗数可用于平衡两者。

1、柯朗数的定义:

 C = sqrt(gh)*t/s

其中,t是时间步长,s是网格在水平方向的间距。

柯朗数的意义在于表示了在单位时间步长中,有多少个网格的信息发生了移动。经过正确的调整,可以更好地加速收敛和增强解的稳定性。

 

2、C语言实现柯朗数计算:

依据上述方程,在实际计算中采用C语言实现计算固液界面上的柯朗数,结果如下:

1 void localCourantNumber()
2 {
3
4
    double rhoe, rhon, rhot;
6
    for (i = 2; i <= nxm - 1; i++)    //Calculation of local Courant number only at internal faces
      {
        ieast = i + 1;
10         dxpe = xc[ieast] - xc[i];
11         fxe = (xf[i] - xc[i]) / dxpe;
12         fxp = 1.0 - fxe;
13
14             for (j = 2; j <= nym; j++)
15         {
16             jnorth = j + 1;
17             dypn = yc[jnorth] - yc[j];
18             fyn = (yf[j] - yc[j]) / dypn;
19                 fyp = 1.0 - fyn;
20
21               for (k = 2; k <= nzm; k++)
22             {
23                 ktop = k + 1;
24                 dzpt = zc[ktop] - zc[k];
25                 fzt = (zf[k] - zc[k]) / dzpt;
26                 fzp = 1.0 - fzt;
27
28
29
30                 //Calculating density at cell interface
31                 rhoe = fxp * rho[i][j][k] + fxe * rho[ieast][j][k];
32
33
34
35                 s = (yf[j] - yf[j - 1])*(zf[k] - zf[k - 1]);
36                       vole = dxpe * s;
37
38
39                  //Sum of courant numbers of outflow faces of donor cell
40                 Ce[i][j][k] = fabs(Fe[i][j][k] / (rhoe*vole))*dt;
41
42
43             }
44         }
45     }
46
47
48         for (i = 2; i <= nxm; i++)    //Calculation of local Courant number only at internal faces
49       {
50         ieast = i + 1;
51         dxpe = xc[ieast] - xc[i];
52         fxe = (xf[i] - xc[i]) / dxpe;
53         fxp = 1.0 - fxe;
54
55             for (j = 2; j <= nym - 1; j++)
56         {
57             jnorth = j + 1;
58             dypn = yc[jnorth] - yc[j];
59             fyn = (yf[j] - yc[j]) / dypn;
60                 fyp = 1.0 - fyn;
61
62               for (k = 2; k <= nzm; k++)
63             {
64                 ktop = k + 1;
65                 dzpt = zc[ktop] - zc[k];
66                 fzt = (zf[k] - zc[k]) / dzpt;
67                 fzp = 1.0 - fzt;
68
69
70
71                 //Calculating density at cell interface
72                 rhon = fyp * rho[i][j][k] + fyn * rho[i][jnorth][k];
73
74
75
76
77                 s = (xf[i] - xf[i - 1])*(zf[k] - zf[k - 1]);
78                 voln = s * dypn;
79
80
81                  //Sum of courant numbers of outflow faces of donor cell
82                 Cn[i][j][k] = fabs(Fn[i][j][k] / (rhon*voln))*dt;
83
84
85             }
86         }
87     }
88
89     for (i = 2; i <= nxm; i++)    //Calculation of local Courant number only at internal faces
90       {
91         ieast = i + 1;
92         dxpe = xc[ieast] - xc[i];
93         fxe = (xf[i] - xc[i]) / dxpe;
94         fxp = 1.0 - fxe;
95
96             for (j = 2; j <= nym; j++)
97         {
98             jnorth = j + 1;
99             dypn = yc[jnorth] - yc[j];
100             fyn = (yf[j] - yc[j]) / dypn;
101                 fyp = 1.0 - fyn;
102
103               for (k = 2; k <= nzm - 1; k++)
104             {
105                 ktop = k + 1;
106                 dzpt = zc[ktop] - zc[k];
107                 fzt = (zf[k] - zc[k]) / dzpt;
108                 fzp = 1.0 - fzt;
109
110
111
112                 //Calculating density at cell interface
113                 rhot = fzp * rho[i][j][k] + fzt * rho[i][j][ktop];
114
115
116
117
118                 s = (xf[i] - xf[i - 1])*(yf[j] - yf[j - 1]);
119                 volt = s * dzpt;
120
121
122                  //Sum of courant numbers of outflow faces of donor cell
123                 Ct[i][j][k] = fabs(Ft[i][j][k] / (rhot*volt))*dt;
124
125
126
127
128             }
129         }
130     }
131
132
133     for (i = 2; i <= nxm; i++)    //Calculation of local Courant number only at internal faces
134       {
135
136             for (j = 2; j <= nym; j++)
137         {
138
139               for (k = 2; k <= nzm; k++)
140             {
141
142                 COutD[i][j][k] = Ce[i][j][k] + Cn[i][j][k] + Ct[i][j][k];
143
144
145
146
147             }
148         }
149     }
150
151
152 }

3、柯朗数使用的注意事项:

在fluent中,用courant number 来调节计算的稳定性与收敛性。一般来说,随着courantnumber 的从小到大的变化,收敛速度逐渐加快,但是稳定性逐渐降低。所以具体的问题,在计算的过程中,最好是把Courant number 从小开始设置,看看迭代残差的收敛情况,如果收敛速度较慢而且比较稳定的话,可以适当的增加courant number 的大小,根据自己具体的问题,找出一个比较合适的courant number,让收敛速度能够足够的快,而且能够保持它的稳定性。

 

Generally, in the explicit schemes of differential method, Courant number is an important number which should be less than 1 in order to assure the stability. However, if the Courant number is too small, much computation time will be lost. So the Courant number could be one of those important parameters affecting computation cost and stability. we could use Courant number to control the time step in the transient simulation in CFD codes. Here is some configuration parameters which could be used in simulation with OpenFOAM。

0

阅读 收藏 喜欢 打印举报/Report
前一篇:步进电机细分
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有