前言:

学习openfoam,或者准确来说,CFD,断断续续也有5个多月。3月底在本科学校写下的第一篇openfoam学习的博文,到现在在研一的学校里,尝试自己写代码计算cfd问题,慢慢一点一点地构建自己的自信心。其实说实话,学CFD很难,尤其是前期要战胜纯理论带来的「空虚」感,找到学习的落脚点。我不敢说现在的自己又足够的自信,但坚信「即使没有希望也要坚持下来」,终有一天会在学习中找到自我。

学习C++是因为之前学openfoam时理解代码所需,后来渐渐敲起了代码。在暑假时看了john D. Anderson教授的计算流体力学基础及其应用这本书,这对初学的我来说无疑是雪中送炭。不仅绘声绘色地回答我「什么是CFD」、「为什么要有CFD」等等问题,而且还很系统地讲解了一些很基础很基础的流体、计算流体的概念。公式推导之详尽,为我扫清了学习CFD的第一道障碍。在此书的第七章之后,便是一些「应用」。说是应用,其实离真正的工程应用还远着呢。作者只是将前面6章讲到的知识、方法,应用到一些比价理论化的模型上罢了。这篇博文便是写此书的第一个应用的模型「拉伐尔喷管」

暑假看此书时便已有自己写代码摸索的打算,但彼时正在看openfoam的代码和其他的书,觉得需要“做好准备”。此时准备得也差不多,便想着一边写代码一边写博文。不求进展神速,但求每天进步。

正文:

一、摘要

本文首先简要地介绍了此次CFD问题中的「拉伐尔喷管」的物理模型,并在拟一维定常等熵流动的假设条件之下,得出了解析解用于检验计算结果。然后通过编程实现流场的初始化,以及算出最小时间间隔,与书本所给的数据基本吻合。

二、物理问题简介

在这里偷个懒,直接截书本的图(侵删):

得出解析解所需方程(继续偷懒!):

这是可以得出解析解的,解和图像如下:

后面计算时上面的解会用来检验计算结果的准确性。

三、编程思路

为了与书本所给的数据对比,喷管横截面积、初始流场照搬书本:

横截面积公式:

效果:

密度、流速、温度:

 for (i = 0; i <= cellNumber; i++){X[i] = i * deltaX;A[i] = 1.0 + 2.2 * (X[i] - 1.5)* (X[i] - 1.5);//公式7-73,p219rho[i] = 1.0 - 0.314 * X[i];//公式7-74a,p220T[i] = 1.0 - 0.2314 * X[i];//公式7-74b,p220V[i] = (0.1 + 1.09 * X[i]) * sqrt(T[i]);//公式7-74c,p220a[i] = sqrt(T[i]);//公式7-75,p222}

这是t=0时刻拟定的流场。密度、问题和流速随x轴线性变化,这当然是假设的啦!合理的假设能提高收敛的成功率,加快收敛速度。

为了编程效率,我在一开始定义了一些不变的常量、经常出现可能要改的变量:

constexpr auto gamma = 1.4;//气体比热比
constexpr auto R = 287.0;//空气常数
constexpr auto cfl = 0.5;//库朗数
constexpr auto timeStep = 1000;//时间步
constexpr auto deltaX = 0.1;//x方向间距

接着,我定义了流场的

constexpr auto cellNumber = 30;class cellField
{
private:double a[cellNumber + 1];
public:cellField(){for (int i = 0; i <= cellNumber; i++){a[i] = 0;}}double& operator[](int i){return a[i];}cellField(double initial){for (int i = 0; i <= cellNumber; i++){a[i] = initial;}}cellField operator+(cellField& b){cellField c;for (int i = 0; i <= cellNumber; i++){c[i] = a[i] + b[i];}return c;}cellField operator-(cellField& b){cellField c;for (int i = 0; i <= cellNumber; i++){c[i] = a[i] - b[i];}return c;}cellField operator*(cellField& b){cellField c;for (int i = 0; i <= cellNumber; i++){c[i] = a[i] * b[i];}return c;}cellField operator/(cellField& b){cellField c;for (int i = 0; i <= cellNumber; i++){c[i] = a[i] / b[i];}return c;}cellField operator+(double b){cellField c;for (int i = 0; i <= cellNumber; i++){c[i] = a[i] + b;}return c;}cellField operator-(double b){cellField c;for (int i = 0; i <= cellNumber; i++){c[i] = a[i] - b;}return c;}cellField operator*(double b){cellField c;for (int i = 0; i <= cellNumber; i++){c[i] = a[i] * b;}return c;}cellField operator/(double b){cellField c;for (int i = 0; i <= cellNumber; i++){c[i] = a[i] / b;}return c;}void inverse(cellField& b ,double e){for (int i = 0; i <= cellNumber; i++){a[i] = e / b[i];}}
};//cellield类可相互加减乘除,并可与数加减乘除。

以上是用于整个计算过程的流场的类。定义重载函数使得类和类之间、类和数之间能直接进行加减乘除运算。

变量定义都是用英文,程序比较简单,很好理解,就不一一去解释啦。

最后放上这一阶段的结果,以及和书本数据的对比:

结果基本吻合。

四、小结

这一阶段还没有涉及到真正的计算。真正的挑战还在最后。可以发现在流场类那边有很多还未定义的函数,包括预估步和校正步等等步骤,但我想也不会很难,只是需要比较细心。

一步步建立自信。

参考文献:

《C++ Primer Plus 第六版》

约翰D. 安德森. 计算流体力学基础及其应用[M]. 北京: 机械工业出版社, 2007.

持续不定期更新:CFDC++之拟一维喷管流动的数值解(1)相关推荐

  1. 持续不定期更新:CFDC++之拟一维喷管流动的数值解(2)

    这篇博文将剩下的问题解决完.第一篇在: https://mp.csdn.net/postedit/101038218 在初始化步骤之后,就到了计算下一时间步的步骤了.计算之前先讲一讲这里用到的计算方法 ...

  2. 拟一维喷管流动的数值解——全亚声速等熵喷管流动的非守恒型CFD解法(MacCormack方法)

    一.Matlab代码片 %全亚声速等熵喷管流动 非守恒型麦考马克方法数值求解 clear; %清理内存变量 clc; %清理工作窗中的所有显示内容 r=1.4; %比热比 L=3; %喷管长度 i=3 ...

  3. 拟一维喷管流动的数值解——亚声速-超声速等熵喷管流动的非守恒型CFD解法(MacCormack方法)

    一.Matlab代码片 %亚声速-超声速等熵喷管流动 非守恒型麦考马克方法数值求解 clear; %清理内存变量 clc; %清理工作窗中的所有显示内容 r=1.4; %比热比 L=3; %喷管长度 ...

  4. 拟一维喷管流动的数值解——亚声速-超声速等熵喷管流动的守恒型CFD解法(MacCormack方法)

    一.Matlab代码片 %亚声速-超声速等熵喷管流动守恒形CFD解法 MacCormack方法 clear; %清理内存变量 clc; %清理工作窗中的所有显示内容 r=1.4; %比热比 L=3; ...

  5. 用Python实现拟一维喷管流动的数值解

    import math import decimal import numpy as np from decimal import * wnx=31#最后一个网格记数31 dx=3/(wnx-1)#网 ...

  6. 【ArcGIS学习系列】高级编辑功能介绍——持续不定期更新

    写在前面   随着研究生阶段学习的深入,逐渐地用到了ArcGIS中一些以前从未想过会使用的功能,以下是对我用到的关于编辑器功能的介绍. 合并(Merge)   以线要素为例,该功能可以在编辑状态下将多 ...

  7. 亚声速-超声速等熵喷管拟一维流动的CFD解法(附完整代码)

    入门CFD,主要参考书目<计算流体力学基础及其应用>(John D.Anderson 著,吴颂平等 译) 实现了 第 7.3 节 亚声速-超声速等熵喷管流动的CFD解法 的代码,采用的是  ...

  8. Oracle OCP 11g 常见单词(不定期更新)

    Oracle OCP 11g 常见单词(不定期更新) 数据库常见单词,不定期更新至考完ocp证(初步想法),现已收集807个单词: 最后一次更新时间为20180301. 1, ACCUMULATED  ...

  9. 图论模板,随缘不定期更新

    图论算法模板,随缘不定期更新 搜索(更新于2021/1/11) DFS BFS 并查集(更新于2021/3/20---10:54) 概念及作用 原理及实现 完整代码 启发式合并 网络流 最大流 din ...

最新文章

  1. 实现费用管理 mysql_移动电费房租管理系统的设计与实现(IDEA,MySQL)
  2. 【Android】Anroid5.0+新控件---酷炫标题栏的简单学习
  3. VTK:可视化算法之CutWithScalars
  4. mysql 创建用户权限_10.创建 MySQL 用户及赋予用户权限
  5. js.domReady
  6. 使用Spring Boot和MongoDB创建REST API
  7. php sql语句过滤,php如何做sql过滤
  8. vba 检查一个文件夹中的文件在另一个文件夹中是否存在(不含扩展名)
  9. 基于Spring框架的Controller中进行事务管理
  10. 构建之法阅读笔记之三
  11. 你必须知道:localStorage、sessionStorage 和 Cookie 区别在什么地方
  12. python 快速排名发包_SEO怎么快速排名?SEO快排发包技术原理是怎么实现的呀?(悬赏5元) - 搜外问答...
  13. 易语言 html 替换全角 半角,易语言全角与半角转换的使用讲解
  14. JAVA创建内部类对象
  15. 迈瑞医疗前三季归母净利81亿:同比增21.6% 营收233亿
  16. 人生只求少点烦恼多点快乐
  17. 分析亚马逊竞争对手Listing的技巧与操作步骤
  18. app 与服务端通讯方式概览
  19. 利用 MySQLi 将PHP连接到mysql数据库,并采用MySQLi以面向对象的方式对mysql进行增删查改(CRUD)
  20. 刚刚开通,感受一下此地气氛

热门文章

  1. 单片机4x4矩阵键盘c语言,求一个单片机4X4矩阵键盘扫描程序,C语言的。
  2. 双层球Mie散射Python程序
  3. word2vec三种保存模型方式
  4. c++初学 顺序容器 关联容器
  5. “快乐童年合唱团”开展群力小学集体活动
  6. 仿wordpress管理后台设计的后台管理框架
  7. python控制风扇_gpio控制风扇转速 pwm方案
  8. 我只想吐槽一下平安夜群发祝福
  9. brafteditor防抖_braft-editor
  10. java 实现视频网站视频地址解析