openfoam UPstream类探索(二)

前言

接上次的博文,本篇补全以下几个函数的介绍:
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也是相当有趣的一件事,非常欢迎私信讨论
指正的价值要比打赏更重要,下面是个人联系方式,希望能结交到志同道合的朋友
image

posted @ 2023-02-25 13:58  TJUHE  阅读(159)  评论(1编辑  收藏  举报