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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...