柯朗数(Courant number)研究

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

1、柯朗数的定义:

C = sqrt(gh)*t/s

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

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

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

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

  1 void localCourantNumber()
  2 {
  3
  4
  5     double rhoe,rhon,rhot;
  6
  7     for(i=2;i<=nxm-1;i++)    //Calculation of local Courant number only at internal faces
  8       {
  9         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 /*                rhoe = 2.0 * rho[i][j][k] * rho[ieast][j][k]/( rho[i][j][k] + rho[ieast][j][k]);*/
 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 /*                printf("Ce=%e\n",Ce[i][j][k]);*/
 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 /*                rhon = 2.0 * rho[i][j][k] * rho[i][jnorth][k]/( rho[i][j][k] + rho[i][jnorth][k]);*/
 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 /*                printf("Ce=%e\n",Ce[i][j][k]);*/
 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 /*                rhot = 2.0 * rho[i][j][k] * rho[i][j][ktop]/( rho[i][j][k] + rho[i][j][ktop]);*/
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 /*                printf("Ce=%e\n",Ce[i][j][k]);*/
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 /*                printf("COutD=%lf\n",COutD[i][j][k]);*/
144 /*                printf("Ce=%e\n",Ce[i][j][k]);*/
145 /*                printf("Cn=%e\n",Cn[i][j][k]);*/
146 /*                printf("Ct=%e\n",Ct[i][j][k]);*/
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。

时间: 2024-10-05 21:01:01

柯朗数(Courant number)研究的相关文章

Fluent经典问题答疑

原文链接1 原文链接28 什么叫边界条件?有何物理意义?它与初始条件有什么关系? 边界条件与初始条件是控制方程有确定解的前提. 边界条件是在求解区域的边界上所求解的变量或其导数随时间和地点的变化规律.对于任何问题,都需要给定边界条件. 初始条件是所研究对象在过程开始时刻各个求解变量的空间分布情况,对于瞬态问题,必须给定初始条件,稳态问题,则不用给定.对于边界条件与初始条件的处理,直接影响计算结果的精度. 在瞬态问题中,给定初始条件时要注意的是:要针对所有计算变量,给定整个计算域内各单元的初始条件

JavaScript Math和Number对象研究

1. Math 对象 1.1 介绍 Math 对象,是数学对象,提供对数据的数学计算,如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 1.2 构造函数 无 :Math 对象无构造函数,无法被初始化,只提供静态属性和方法. 1.3 静态属性 1.3.1 Math.E :常量e.返回自然对数的底数:2.718281828459045 1.3.2 Math.PI :常量π.返回圆周率的值 :3.141592653589793 1.4 静态方法 1.4.1 Math.sin

一些对数学领域及数学研究的个人看法(转载自博士论坛wcboy)

转自:http://www.math.org.cn/forum.php?mod=viewthread&tid=14819&extra=&page=1 原作者: wcboy 现在的论坛质量比以前差了,大部分都是来解题问答的,而且层次较低.以前论坛中,Qullien很令人印象深刻,但愿他能在国外闯出一片天空.现在 基础数学版代数&数论子版中那几个讨论代数几何的还不错.不期望目前论坛出现很多高层次高手,高层次高手应该站在好课题上高观点讨论数学,出 现这样的网友,看他们的言论非常过

今天研究了一下手机通信录管理系统(C语言)

题目:手机通信录管理系统 一.题目要求 二.需求分析 三.设计步骤/编写代码 四.上机/运行结果 五.总结 一.题目要求 模拟手机通信录管理系统,实现对手机中的通信录进行管理操作.功能要求: (1)查看功能:A:办公,B:个人,C:商务 (2)增加联系人:录入新数据(姓名,电话,分类,邮箱:weiyang,153********,个人,[email protected]) (3)修改功能:选中某人的姓名,可对其数据进行修改操作 (4)删除功能:选中某人姓名,可对此人的相应数据进行删除,并自动调整

Unity3d插件研究之Easytouch

但我们开发移动端的游戏时,发现使用Input.GetMouseButtonDown的方法不可用,怎么办? 虽然unity3d也有自带触屏的方法,但是使用起来代价太高,什么单击,双击这些功能都要自己封装. 下面我们来讲下EasyTouch这个插件,它将所有触屏的手势,都已经写好了. 而且Easytouch也支持NGUI,使用起来十分的方便. 接下来,我们详细地学习这个插件改如何运用到我们的项目中来. 首先,我们导入easytouch插件,这里我是用3.0版本的,可能有些老了,我都没更新,但是大致的

Chrome自带恐龙小游戏的源码研究(完)

在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每达到100分就会出现闪烁特效,游戏第一次gameover时显示历史最高分.分数记录器由DistanceMeter构造函数实现,以下是它的全部代码: 1 DistanceMeter.dimensions = { 2 WIDTH: 10, //每个字符的宽度 3 HEIGHT: 13, //每个字符的高 4 DE

JAVA深入研究——Method的Invoke方法。

在写代码的时候,发现从父类class通过getDeclaredMethod获取的Method可以调用子类的对象,而子类改写了这个方法,从子类class通过getDeclaredMethod也能获取到Method,这时去调用父类的对象也会报错.虽然这是很符合多态的现象,也符合java的动态绑定规范,但还是想弄懂java是如何实现的,就学习了下Method的源代码. Method的invoke方法 1.先检查 AccessibleObject的override属性是否为true. Accessibl

Chrome自带恐龙小游戏的源码研究(七)

在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较简单,缺点是对不规则物体的检测不够精确.如果不做更为精细的处理,结果会像下图: 如图所示,两个盒子虽然有重叠部分,但实际情况是恐龙和仙人掌之间并未发生碰撞.为了解决这个问题,需要建立多个碰撞盒子: 不过这样还是有问题,观察图片,恐龙和仙人掌都有四个碰撞盒子,如果每次Game Loop里都对这些盒子进行碰撞检测

windows 远程桌面研究

最近因为一个监控相关的项目,深入研究了一下 windows 的 远程桌面的相关知识. 1. 如何让关闭了远程桌面连接的用户,对应的 session 立即退出 windows server. 大家使用 mstsc.exe 远程桌面登录windows server时,退出时,99.99%的人会直接关闭 mstsc.exe 窗口,而不会点击开始--->退出.导致的问题是,登录用户已经提出了,但是 query user 和 query session 时,发现退出的用户,在 windows server