openFOAM學習筆記(四)—— openFOAM中的List

又是一個很底層的部分,但是也非常重要,我們在進行數據寫入的時候就會使用到List。這裏介紹他的基本結構,以及在openFOAM被如何使用

UList的基礎功能

位於路徑:

scr/OpenFOAM/containers/Lists/UList

定義了最基礎的類UList。他有兩個private的成員變量

//- Number of elements in UList
label size_;

//- Vector of values of type T,以T爲類型形成的List,這裏是初始的指針
T* __restrict__ v_;

這裏的T需要用戶指定類型,是在類上使用了template。第一個變量用來存儲UList的尺寸,第二個變量用來存儲首地址。這裏關於List有三種類,除了當前的還有ListSubList。主要區別在於List要指定長度,而SubList是在List中使用。

我們這裏介紹一下基礎的功能

  1. 通過內置的類lessgreater規定大小的判斷。
  2. 通過構造函數進行賦值
  3. 返回迭代器的收尾位置
  4. 通過檢索範圍檢查當前的List的正確性
  5. 深度和前度copy,區別在於只複製指針還是連帶整個數據一起復制
  6. 基本的索引[] =等的重定義
  7. 迭代器
  8. 返回當前List尺寸,判斷爲空,交換的成員函數
  9. 和IO相關的函數
  10. 類外定義的相關排序等功能。

List中的forAll等宏定義

這裏非常常用,另外寫在這裏
https://blog.csdn.net/qq_40583925/article/details/106989038

List中的文件讀取

前面大體的實現並不難理解,常常實現部分就一句話,基本上看到函數名就瞭解大概的功能。而其中比較需要關注的就是和IO相關的部分,真正用戶使用過程中,給定一系列文件,就要用到這個類進行讀取。但是List的讀取,在UList中並沒有給出,而是寫在了List中,它是從UList繼承來的子類。其他部分對UList進行了一些功能的補充,但是總體功能並沒有變化。主要是添加了如下的函數

template<class T>
Foam::List<T> Foam::readList(Istream& is)
{
   List<T> L;
   token firstToken(is);
   is.putBack(firstToken);

   if (firstToken.isPunctuation())
   {
       if (firstToken.pToken() != token::BEGIN_LIST)
       {
           FatalIOErrorInFunction(is)
               << "incorrect first token, expected '(', found "
               << firstToken.info()
               << exit(FatalIOError);
       }

       // Read via a singly-linked list
       L = SLList<T>(is);
   }
   else
   {
       // Create list with a single item
       L.setSize(1);

       is >> L[0];
   }

   return L;
}

首先創建了List L,然後判斷是否爲單個量,如果是就用

is >> L[0];

如果不是,就用

// Read via a singly-linked list
L = SLList<T>(is);

SLList我們後續會繼續給出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章