CFD计算过程发散诸多原因分析【转载】
转载自:
http://blog.sina.com.cn/s/blog_5fdfa7e601010rkx.html
今天探讨引起CFD计算过程中发散的一些原因。cfd计算是将描述物理问题的偏微分方程转化为代数方程组求解,从而得到离散空间上指定点上的值,而其他位置的值通过插值来完成。这本质是将非线性方程线性化并求解的过程,我是这样理解的,对于物理问题真解随时间的变化是一条曲线,而求解过程中不断的求解曲线的斜率,并实现时间的上的步进(可以理解为1阶导数)。如果在指定的时间步长内斜率变化很小,这种步进是可以满足方程要求的,并可以得到将来任意时刻的近似解。然而,如果变化比较大时,实际的变化过程将不能通过线性化方法来处理,这时候再使用这种方法就会出现问题。随着时间的推移,数值解越来越偏离真解,最终引起发散。对于我们求解的流动问题,有下面几种可能会引起计算过程的发散
1)时间步长过大
这点很容易理解,时间步长过长可能会造成时间段内,斜率变化较大,从而会造成数值解偏离真解。一般而言,对于显式方法要求在指定的时间步长内流体流动不能超过一个网格(库朗数限制)。
2)压力修正次数太少
对于NS方程SIMPLE系列算法而言,需要通过压力来显式修正表面流率和速度,如果修正次数过少,通常会造成修正后的速度和真实速度偏离较大,下一时间步求解速度的时候会得到一个不真实的表面流率,从而影响下一个时刻的速度求解,进而影响压力,长期计算会影响造成误差积累设置发散。因此,压力修正次数要有一定的限制。一般而言对于2d问题,2~3次能够满足要求,而对于3d问题3~4次应该可以,但也和具体问题有关系,同一个问题3d的比2d的要求修正次数多。
3)非正交修正
在网格正交性比较差的情况下,直接利用正交网格导出的扩散项离散过程通常会引起误差,通常将离散过程分为正交和非正交两部分,正交部分隐式处理,非正交部分显示处理。非正交中压力值采用了上一层迭代的值,因此会影响收敛性。当网格质量较差时,可以指定一定量的非正交循环,不需要太多3次以内即可。
4)负扩散系数
扩散过程描述的是从物理量从高浓度向低浓度的传输过程,负扩散系数会造成低浓度向高浓度的传输,这和实际物理现象不符的,长期模拟下去会造成局部浓度过度增加,从而造成发散。引起负扩散系数原因很多,比如湍流模型求出来的湍流粘性为负值,或者你误将扩散项前面的-写成了+。
5)不适当的边界条件
边界条件不合理也会引起方程的发散,比如开口系统只有进口没有出口。对于不可压缩流而言,边界条件的设置方法见前面博文。需要指出的时,湍流k-e模型中入口通常需要根据经验关系式指定,而并非随意给值,这常常是初学者常见的问题。
6)不合适的代数方程求解器
对于一些问题,离散后的代数方程需要采用一些性能优越的代数方程求解器。特别是对于3d问题,网格单元数越多对代数方程求解器要求越高,如果采用传统的pcg(pbicg)+传统预条件有时候在指定的迭代步内(openfoam默认1001)很难收敛到你指定的精度。这时,可以选用GAMG或者pcg+GAMG等代数求解器,以确保较少时间步收敛到指定解。
7)过大的源项
源项过大是引起方程发散的一个重要原因,当自己写程序或者做耦合计算的时候,不妨检查一下你的源项。
8)对流项离散
对流项的离散格式对收敛性的影响很多cfd的书上都有介绍。 一般而言低阶格式较稳定,高阶稳定性则较差。
9)不合适的初始场
对于cfd计算初始场往往设置具有较大的随意性,特别是对于稳态问题更是如此。如果设置的初值偏离真实物理量太远会造成一开始就发散。对于稳态问题,可以采用势流的求解结果作为初始场进行进一步迭代,这样会大大改善收敛性。
10)求解过程中物理量越界
有些求解的物理量通常是有界的,比如体积分率应该在[0 1]之间,而k 和 e 应当是大于0的数目,而在求解过程中由于离散方程植入不慎,会造成求解变量不在其物理范围之内,从而造成发散。因此对于有界量跟踪方程植入过程应特别注意。
上面仅仅是个人浅见,仅供参考。
CFD计算过程发散诸多原因分析【转载】的更多相关文章
- 一次接口压力测试qps极低原因分析及解决过程
一次接口压力测试qps极低原因分析及解决过程 9-2日在做内部的性能测试相关培训时,发现注册接口压力测试qps极低(20左右),这个性能指标远不能达到上线标准 ,经过一系列调试,最后定位 98%的时间 ...
- CFD计算
47 求解器为flunet5/6在设置边界条件时,specify boundary types下的types中有三项关于interior,interface,internal设置,在什么情况下设置相应 ...
- Nested Loops join时显示no join predicate原因分析以及解决办法
本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...
- Beforeunload打点丢失原因分析及解决方案
淘宝的鱼相在 2012 年 8 月份发表了一篇文章,里面讲述了他们通过一个月的数据采集试验,得到的结果是:如果在浏览器的本页面刷新之前发送打点请求,各浏览器都有不同程度的点击丢失情况,具体点击丢失率统 ...
- Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
原文:Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析 前段时间,公司同事开发了一个小工具,在工具执行过程中,UI界面一直处于卡死状态. 通过阅读代码发现,主要是 ...
- SQL查询速度慢的原因分析和解决方案
SQL查询速度慢的原因分析和解决方案 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建 ...
- 关于JVM内存溢出的原因分析及解决方案探讨
前言:JVM中除了程序计数器,其他的区域都有可能会发生内存溢出. 0.什么是内存溢出 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出. 1. ...
- QuantLib 金融计算——案例之普通欧式期权分析
目录 QuantLib 金融计算--案例之普通欧式期权分析 概述 普通欧式期权公式法定价 1. 配置期权合约条款 2. 构建期权对象 3. 配置定价引擎 4. 计算 题外话:天数计算规则 Quote ...
- HBase丢失数据的故障和原因分析
hbase的稳定性是近期社区的重要关注点,毕竟稳定的系统才能被推广开来,这里有几次稳定性故障和大家分享. 第一次生产故障的现象及原因 现象: 1 hbase发现无法写入 2 通过hbc ...
随机推荐
- 【cookie的使用】&【Session】
明确一点: cookie由服务器创建Cookie cookie=new Cookie("haha","xixi") 通过HtttpServletR ...
- iOS 简化冗余代码
正在给深圳某家智能家居开发iPad版本,在已经存在的iPhone版上修改,该app的界面采用的是xib.xib相比代码来写界面,快速高效,但是可维护性和可读性太差.言归正传,看到这些代码后,我的心情很 ...
- Air for ANE:打包注意的地方
来源:http://blog.csdn.net/hero82748274/article/details/8631982 今天遇到了一个打包ANE 文件的问题,导致花费了几个小时查找,最后师弟的一句话 ...
- 数据库操作语句类型(DQL、DML、DDL、DCL)
数据库操作语句类型(DQL.DML.DDL.DCL)简介 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语 ...
- Mongodb之简介
MongoDB是一个基于分布式存储的数据库,由C++语言编写,旨在为WEB应用提供的可扩展的高性能数据存储解决. MongoDB是介于关系型数据库与非关系型数据库之间的产品,也是非关系型数据库中功能最 ...
- zabbix 自动发现(LLD)
概述 自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法.例如,Zabbix可以在你的机器上自动开始监控文件系统或网络接口,而无需为每个文件系统或网络接口手动创建监控项 ...
- MySQL 5.7主从复制实战篇
MySQL 5.7主从复制实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装MySQL数据库并启动 1>.在MySQL官方下载相应的安装包(https://dev ...
- MongoDB导出与导入远程Linux服务器上的数据
场景 将远程服务器A上的MongoDB数据库test下的集合people导入到服务器B数据库test的集合people_test下. 简单方案 先将A服务器数据导出,然后再执行导入到B服务器. 下面的 ...
- CH6303 天天爱跑步
6303 天天爱跑步 0x60「图论」例题 描述 小C同学认为跑步非常有趣,于是决定制作一款叫作<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成 ...
- .net框架 - Enum枚举
概要 在C#或C++,java等一些计算机编程语言中,枚举类型是一种基本数据类型而不是构造数据类型. 在C语言等计算机编程语言中,它是一种构造数据类型. 它用于声明一组命名的常数,当一个变量有几种可能 ...