前言
接上次的博文,本篇補全以下幾個函式的介紹:
Pstream::nProcs()
Pstream::parRun()
UPstream::exit()
簡述幾個常用的函式如下:
Pstream::nProcs()
openfoam對其的介紹是:
Number of processes in parallel run.
//- Number of processes in parallel run
static label nProcs(const label communicator = 0)
{
return procIDs_[communicator].size();
}
Foam::DynamicList<int> Foam::UPstream::myProcNo_(10);
//- List of process IDs
static DynamicList<List<int>> procIDs_;
Pstream::nProcs()與上篇我們介紹的函式Pstream::myProcNo()非常相似,
Pstream::nProcs()的介紹是Number of processes in parallel run
Pstream::myProcNo()的介紹是Number of this process (starting from masterNo() = 0)
按照這個程式釋義來說,Pstream::nProcs()返回的是平行計算中程式的數量,而Pstream::myProcNo()返回的是從主節點開始該程式的數量
我這英語水平不大行,沒看懂其中區別,繼續從原始碼中尋找答案
看看兩個靜態成員函式的返回值
Pstream::nProcs()的返回值是procIDs_[communicator].size(),Pstream::myProcNo()的返回值是myProcNo_[communicator]
procIDs_與myProcNo_的定義分別是
//- List of process IDs
static DynamicList<List<int>> procIDs_;
//- My processor number
static DynamicList<int> myProcNo_;
單單從成份上看,procIDs_裝載的是List< int >,而myProcNo_裝載的只是int
從這個角度也更能解釋他們的程式註釋,Pstream::nProcs()返回的是包含列表的動態列表,Pstream::myProcNo()返回的僅僅是一個int型別的動態列表
後續遇到再結合程式案例進行分析
Pstream::parRun()
openfoam對其的介紹非常明確了
//- Is this a parallel run?
static bool& parRun()
{
return parRun_;
}
返回的是布林型判斷,預設值是false
而且返回值是引用型別,說明可以在程式執行時隨時更改
bool Foam::UPstream::parRun_(false);
所以這句話也經常在判斷語句中使用,如:
if (nProcs == 0)
{
parRun_ = false;
statement();
}
這段語句說明如果是在主節點執行,我這個識別符號就置為false
當然也這樣使用
if (doPstream && parRun())//並行處理前的判定
{
statement();
}
Pstream::exit()
這個可以參考該連結
之所以用exit()函式,因為他是強制關閉,類似正在開機的電腦長摁電源鍵幾秒
結語
平行計算是很大的一個研究範圍,這裡只是簡略的說了其中較為常用的幾個函式和使用詳情
本文得到的結論或發現也未必正確,因而以探索為名
所以後續研究如果碰到不了解的部分是非常正常的,不要灰心
授之以魚不如授之以漁,我更提倡的是本篇文章中研究of的方法,
我們講實話,這麼弄確實進度很慢的
但好事多磨,看你打算理解到什麼程度,如果只是為了應付畢業那完全沒必要看原始碼
of本身的價值遠非如此是吧,不知道有沒有道友也會這麼想
學習曲線就是開始很緩慢後續很陡峭,
沒辦法,該花的時間要花的
修行在個人,修行在個人
一起探索openfoam也是相當有趣的一件事,非常歡迎私信討論
指正的價值要比打賞更重要,下面是個人聯絡方式,希望能結交到志同道合的朋友