Openfoam UPstream類探索

来源:https://www.cnblogs.com/heloveHe/archive/2023/02/24/17149611.html
-Advertisement-
Play Games

前言 上篇文章我們大體捋順了Pstream類,但上篇沒有講到的是Pstream類很多東西是從UPstream類繼承來的 這次我們大體看一下UPstream類,以避免Pstream類內很多繼承來的東西不會用 簡述幾個常用的函數如下: Pstream::myProcNo() //- Number of ...


前言

上篇文章我們大體捋順了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容器

image
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也是相當有趣的一件事,非常歡迎私信討論
指正的價值要比打賞更重要,下麵是個人聯繫方式,能結交到志同道合的朋友是我的榮幸
image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 好家伙,本篇為《JS高級程式設計》第十章“函數”學習筆記 1.函數的三種定義方式:函數表達式、函數聲明及箭頭函數 函數聲明: function sum(a) { return a + 1; } 函數表達式: let sum= function(a){ return a + 1; } 箭頭函數: le ...
  • 概述 前端三要素 HTML(結構) :超文本標記語言(Hyper Text Markup Language) ,決定網頁的結構和內容 CSS(表現) :層疊樣式表(Cascading Style sheets) ,設定網頁的表現樣式 JavaScript (行為) :是一種弱類型腳本語言,其源代碼不 ...
  • React Native 的基礎是React, 是在 web 端非常流行的開源 UI 框架。要想掌握 React Native,先瞭解 React 框架本身是非常有幫助的。 一、什麼是React Native 1.1 React Native帶來的驚喜 React Native 是一個使用JavaS ...
  • 前言 在 JavaScript 中,apply、bind 和 call 是三個重要的函數,它們都是 Function.prototype 的方法。這些函數可以讓我們動態地改變函數的 this 值,或者傳遞參數來執行函數。本篇博客將詳細介紹 apply、bind 和 call 的使用方法以及它們之間的 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一.佈置全局組件 在我們開發的過程中,會碰到一個現象,就是在頁面裡面引入組件,總算要寫import,components才能引用,這裡給大家分享我們的一個解決方案 1.首先要建立一個components文件夾,用來放我們的所有組件 2.然 ...
  • 面向對象高級第一天 static關鍵字 是靜態的意思,可以修飾成員變數,也可以修飾成員方法 成員變數的分類 靜態成員變數 有static修飾,屬於類,與類一起載入,記憶體中只有一份,可以被共用訪問。 什麼時候用呢?如果信息要被共用,只需要一份就用靜態成員變數,比如:系統線上人數。 訪問規則: 建議用類 ...
  • 今天我們來學習下模板方法設計模式。 模板方法(Template Method Pattern):抽象的父類中定義一個操作中演算法的骨架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構,即可重新定義該演算法的某些特定步驟。簡單地講,就是“父類的模板方法定義不變的流程,子類重寫流程中的方法”。 ...
  • 對記憶體里float4位元組的好奇 初學電腦都要學那個什麼二進位十進位什麼補碼 反碼那些玩意兒哈,由於最近要做一個單片機往另外一個單片機發數據的需求,直接c語言指針 然後float4位元組傳過去不就得了嗎,麻煩就麻煩在這裡 另一端編程機是個啥鳥lua 麻煩的一逼,integer這種我們就不說了哈因為實在 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...