又是一個很底層的部分,但是也非常重要,我們在進行數據寫入的時候就會使用到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
有三種類,除了當前的還有List
和SubList
。主要區別在於List
要指定長度,而SubList
是在List
中使用。
我們這裏介紹一下基礎的功能
- 通過內置的類
less
和greater
規定大小的判斷。 - 通過構造函數進行賦值
- 返回迭代器的收尾位置
- 通過檢索範圍檢查當前的
List
的正確性 - 深度和前度copy,區別在於只複製指針還是連帶整個數據一起復制
- 基本的索引
[] =
等的重定義 - 迭代器
- 返回當前
List
尺寸,判斷爲空,交換的成員函數 - 和IO相關的函數
- 類外定義的相關排序等功能。
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
我們後續會繼續給出。