前言

上篇文章我们大体捋顺了Pstream类,但上篇没有讲到的是Pstream类很多东西是从UPstream类继承来的

这次我们大体看一下UPstream类,以避免Pstream类内很多继承来的东西不会用


简述几个常用的函数如下:

Pstream::myProcNo()

//- Number of this process (starting from masterNo() = 0)
static int myProcNo(const label communicator = 0)
{
return myProcNo_[communicator];
}

就像我们提到的,静态成员变量一般有两种初始化方式,一种是全局区直接定义,另一种是利用静态成员函数进行值的返回,Pstream::myProcNo()是后者

输入参数默认从零开始计算进程数量,返回值类型为static DynamicList < int >,容器初始大小是10

//- My processor number
static DynamicList<int> myProcNo_;
Foam::DynamicList<int> Foam::UPstream::myProcNo_(10);

这里我觉得有必要扩展解释下Foam::DynamicList,Foam内非常常见的一种数据类型


Foam::DynamicList,公有继承于Foam::List的vector容器



openfoam对其的描述为:

A 1D vector of objects of type < T > that resizes itself as necessary to accept the new objects.

Internal storage is a compact array and the list can be shrunk to compact storage. The increase of list size is controlled by three template parameters, which allows the list storage to either increase by the given increment or by the given multiplier and divider (allowing non-integer multiples).

Foam::DynamicList的介绍里说是一个可以根据需要调整自身大小以接受新对象的一维容器,内部存储是一个紧凑的数组

讲实话看解释并没有怎么理解,直接阅读相关实现程序

#include "DynamicList.H"

 // * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //

 template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::DynamicList<T, SizeInc, SizeMult, SizeDiv>::DynamicList(Istream& is)
:
List<T>(is),
capacity_(List<T>::size())
{} template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::Ostream& Foam::operator<<
(
Ostream& os,
const DynamicList<T, SizeInc, SizeMult, SizeDiv>& lst
)
{
os << static_cast<const List<T>&>(lst);
return os;
} template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
Foam::Istream& Foam::operator>>
(
Istream& is,
DynamicList<T, SizeInc, SizeMult, SizeDiv>& lst
)
{
is >> static_cast<List<T>&>(lst);
lst.capacity_ = lst.List<T>::size(); return is;
}

首先看Foam::DynamicList的构造函数,利用初始化列表创建了大小为输入参数的List< T >,随后又把这个大小给了相关的成员变量,后续是两个重载,其他构造大同小异

那这就很清晰了,Foam::DynamicList本质上还是List,

但又有新的问题了,那为什么在openfoam释义中提及vector或者array呢

能看到Foam::DynamicList并没有重载[],写到这里我原以为只是一个类似数组一样可以拓展内存的List时,无法像vector一样随机存储,但无意间发现Foam::DynamicList重载了(),我把重载那部分给大家看一下哈

template<class T, unsigned SizeInc, unsigned SizeMult, unsigned SizeDiv>
inline T& Foam::DynamicList<T, SizeInc, SizeMult, SizeDiv>::operator()
(
const label elemI
)
{
if (elemI >= List<T>::size())
{
setSize(elemI + 1);
} return this->operator[](elemI);
}

能看到是可以随机存储的,并且调用的this指针,说明内部是List< T > ,但是外壳是数组

此刻我们就明白了Foam::DynamicList为什么说自己是一维容器,有两种情况:

  1. 如果不超过数组大小,在插入和读取时,使用的List进行插入,复杂度仅是O(1)
  2. 但是超过数组大小,进行插入操作,需要类似vector一样重新分配空间,但又好在是List,重新分配空间无需复制粘贴折腾,只需要传地址即可

并且在以上基础上可以类似vector进行随机访问元素,兼顾了两者优点

写到这里不由得感慨,openfoam作为数值计算程序,在数据类型选择上还是有自己独到之处的,不仅要考虑安全性还要考虑效率

如果我需要插入或弹出一个数据,传list地址即可,但是我还有随机存储需求,那就外边套一层数组的壳吧,扩容也方便

讲到这里多提一嘴

类似的还有Foam::DLList,

 namespace Foam
{
template<class T>
using DLList = LList<DLListBase, T>;
}

大概是包着List外壳的List容器,如果是这样,插入复杂度是O(1),读取复杂度是O(n)

那我们再回到问题的开始,为什么的类型是Foam::DynamicList

因为myProcNo_需要动态变化,如果出现进程的增加和删减,可以类似数组进行扩容,

所以在并行计算中,Foam::DynamicList使用的非常频繁,后续会发现经常出现在其他并行函数的返回值中


后续还有

Pstream::nProcs()

Pstream::myProcNo()

Pstream::parRun()

UPstream::exit(0)

这些函数需要去说下,今天有点累了,下期再聊

后续探索一定会有更多惊喜等待着我们


结语

一起探索openfoam也是相当有趣的一件事,非常欢迎私信讨论

指正的价值要比打赏更重要,下面是个人联系方式,能结交到志同道合的朋友是我的荣幸

Openfoam UPstream类探索的更多相关文章

  1. java enum类探索

    参考网址1, 参考网址2 一直对枚举有点迷惑,现在试着理解枚举. 1.首先,普通类与枚举 的区别.拿两个例子比较吧 普通类: /** * 一个普通类 * @author Administrator * ...

  2. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  3. Phonebook 导出联系人到SD卡(.vcf)

    2014-01-13 16:53:55 1. 在Phonebook中导出联系人到内部存储,SD卡或者通过蓝牙.彩信.邮件等分享联系人时,通常会先将选择的联系人打包生成.vcf文件,然后将.vcf文件分 ...

  4. 浅析Linux中的进程调度

    2016-11-22 前面在看软中断的时候,牵扯到不少进程调度的知识,这方面自己确实一直不怎么了解,就趁这个机会好好学习下. 现代的操作系统都是多任务的操作系统,尽管随着科技的发展,硬件的处理器核心越 ...

  5. 创业之前 ——Paul Graham 最新博文

    原文:Paul Graham 译者:李智维 /LeanCloudproject师 2014年10月 (这篇文章是我在斯坦福大学举办的Sam Altman创业课堂上的嘉宾演讲稿.本意是写给大学生的,但当 ...

  6. Java核心知识体系4:AOP原理和切面应用

    1 概述 我们所说的Aop(即面向切面编程),即面向接口,也面向方法,在基于IOC的基础上实现. Aop最大的特点是对指定的方法进行拦截并增强,这种增强的方式不需要业务代码进行调整,无需侵入到业务代码 ...

  7. 探索Win32系统之窗口类(转载)

    Window Classes in Win32 摘要 本文主要介绍win32系统里窗口类的运做和使用机制,探索一些细节问题,使win32窗口类的信息更加明朗化. 在本文中,"类", ...

  8. 24小时学通Linux内核--内核探索工具类

    寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续 ...

  9. 关于虚拟继承类的大小问题探索,VC++ 和 G++ 结果是有区别的

    昨天笔试遇到个 关于类占用的空间大小的问题,以前没怎么重视,回来做个试验,还真发现了问题,以后各位笔试考官门,出题时请注明是用什么编译器. vc6/vc8 cl 和 Dev-C 的g++ 来做的测试: ...

  10. 十天学Linux内核之第一天---内核探索工具类

    原文:十天学Linux内核之第一天---内核探索工具类 寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间 ...

随机推荐

  1. Datawhale组队学习_Task03:详读西瓜书+南瓜书第4章

    第4章 决策树 4.1 基本流程 #输入:训练集D={${(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}$}; #属性集A=${{a_1,a_2,...,a_d}}$. #过程: ...

  2. Linux相关命令及软件安装教程

    @font-face { font-family: "Times New Roman" } @font-face { font-family: "宋体" } @ ...

  3. JavaEE Day11 BootStrap

    之前:前端知识 HTML+CSS+JavaScript           不好写 今日内容:前端的开发框架,内部定义了丰富的CSS样式和JS代码,只需要拿来用就行 会用即可 一.BootStrap ...

  4. 贪心算法Dijkstra

    Dijkstra 最短路径问题 : 给定一个带权有向图 G = (V, E, W),同时给定一个源点 u (u ∈ V),我们要找出从源点 u 出发到其它各点的最短路径距离,并得出这些最短路径的具体路 ...

  5. [机器学习] sklearn聚类

    聚类(Clustering)简单来说就是一种分组方法,将一类事物中具有相似性的个体分为一类,将另一部分比较相近的个体分为另一类.例如人和猿都是灵长目动物,但是根据染色体数目不同可以将人和猿分类不同的两 ...

  6. [生命科学] 生物基础实验之PCR验证

    生物基础实验之PCR验证 文章目录 生物基础实验之PCR验证 实验步骤一 实验步骤二 实验步骤三 配胶 实验步骤四 电泳 实验步骤五 跑胶 实验步骤一 在离心管加入7.5μL Master Mix 溶 ...

  7. kafka详解(02) - kafka_2.11-2.4.1安装部署

    kafka详解(02) - kafka_2.11-2.4.1安装部署 环境准备 下载安装包 官网下载地址:https://kafka.apache.org/downloads.html 2.4.1版本 ...

  8. AIR32F103(八) 集成Helix MP3解码库播放MP3

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  9. 让Apache Beam在GCP Cloud Dataflow上跑起来

    简介 在文章<Apache Beam入门及Java SDK开发初体验>中大概讲了Apapche Beam的简单概念和本地运行,本文将讲解如何把代码运行在GCP Cloud Dataflow ...

  10. 结构型模式 - 桥接模式Bridge

    学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 桥接模式的定义与特点 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化.它是用组合关系代替继承关系来实现 ...