前言

上篇文章我们大体捋顺了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. 学习ASP.NET Core Blazor编程系列十五——查询

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  2. 【离线数仓】Day01-用户行为数据采集:数仓概念、需求及架构、数据生成及采集、linux命令及其他组件常见知识

    一.数据仓库概念 二.项目需求及架构设计 1.需求分析 2.项目框架 3.框架版本选型 服务器选型:云主机 服务器规划 三.数据生成模块 1.数据基本格式 公共字段:所有手机都包含 业务字段:埋点上报 ...

  3. 教你几个 Java 编程中的奇技淫巧

    枯燥的编程中总得有些乐趣,今天我们不谈论那些高深的技能,教你几个在编程中的奇技淫巧,说不定在某些时候还能炫耀一番呢. 1.找到最大值和最小值 不使用 if else switch 和三元运算符,在给定 ...

  4. 解决Win10更新后远程桌面提示CredSSP加密Oracle修正的问题

    1.以管理员身份打开cmd,运行命令提示符:2.执行REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Cre ...

  5. 分支路径图调度框架在 vivo 效果广告业务的落地实践

    作者:vivo 互联网AI团队- Liu Zuocheng.Zhou Baojian 本文根据周保建老师在"2022 vivo开发者大会"现场演讲内容整理而成.公众号回复[2022 ...

  6. SQL语句查询优化方法

    建立索引并命中索引,在查询的时候,要尽量让数据库引擎使用索引.加入explain执行计划 1.尽量避免使用select * 2.尽量避免使用!= 3.尽量避免使用or 优化方式:可以用union代替o ...

  7. JavaScript:变量:如何声明变量?

    声明变量可以用下面几种方式: 但是这几种声明方式肯定是有区别的,主要是上面三种方式的区别,这需要结合window对象和作用域来说明,这里不赘述. 声明变量的时候,推荐使用let,这是ES6新推出的更好 ...

  8. Flutter异常监控 - 壹 | 从Zone说起

    开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情 如果你正需要处理Flutter异常捕获,那么恭喜你,找对地了,这里从根源上给你准备了Flutter异常捕获 ...

  9. 记录Typescript的学习调试笔记(比 javascript更具面向对象,强类型检查,静态字段,适合现代的大团队分工与管理风格).

    1.)先来一段Typescript的环境安装. 安装nodejs ,下载地址:https://nodejs.org/en/download/                 //(node-v12.1 ...

  10. [深度学习]DEEP LEARNING(深度学习)学习笔记整理

    转载于博客http://blog.csdn.net/zouxy09 一.概述 Artificial Intelligence,也就是人工智能,就像长生不老和星际漫游一样,是人类最美好的梦想之中的一个. ...