日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2024/3/24 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 持续不定期更新:CFDC++之拟一维喷管流动的数值解(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

學習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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。