-
关于OpenFOAM模板类"List"的翻译:
虽然在STL中list对应的数据结构是链表,但是OpemFOAM中List对应的数据结构是数组容器,在OF List的基类UList的定义中有:
//- Number of elements in UList label size_; //- Vector of values of type T T* __restrict__ v_; // Private Member Functions //- Disallow default shallow-copy assignment //
List中对v_的内存分配操作为:
template<class T> inline void Foam::List<T>::alloc() { if (this->size_ > 0) { this->v_ = new T[this->size_]; } }
实际在堆上为v_分配了大小为(this->size)*(size_of(T))的连续空间,因此能够根据下标访问元素,插入时先重新分配size+1的空间之后拷贝,复杂度O(n)
实际OpenFOAM中链表容器的基类为DLListBase(双向链表)和SLListBase(单向链表),位于src\OpenFOAM\containers\LinkedLists目录下
以单向链表为例
void Foam::SLListBase::insert(SLListBase::link* a) { nElmts_++; if (last_) { a->next_ = last_->next_; } else { last_ = a; } last_->next_ = a; }
插入时将链表尾部指针指向新元素,复杂度为常数。访问使用内部迭代器遍历,复杂度O(n),
在《OpenFOAM用户指南-5.0》中东岳老师将继承自List模板的类翻译成链表,个人建议将其翻译成数组或者列表更合理,这样能够减少使用者定义底层数据时的困惑。
-
- 51页2.2.1.5,“可以即用稳态又用瞬态来进行计算”, 应为 “可以既用稳态又用瞬态来进行计算”。
- 109页 4.3,“这个controlDict文件彩玉\$FOAM_ETC文件目录下”,“这个controlDict文件在于$FOAM_ETC文件目录下”。
- 109页4.3.1,“但最好还是在单独的算例文件中的controlDict设置更好”,语义重复,任意删除一个即可。
*136页表5.1,“表5.1 不同网格形状的点、面、边的数量”,应当是“不同形状网格的点、面、边的编号顺序”。英文版是numbering,应当翻译成编号。 - 146页5.3.1.1,“表5.4中的block顶点这样定“,这里表5.4应当是表5.3。同样5.3.1.2“图5.4中的block我们指”图5.4应当是图5.3。
- 148页5.3.1.4,“剩下 60% 网格单元分配给2区间”,应当是“40%“。
- 155页5.4.1,“snappyHexMesh生成网格的步骤可以用图5.8这个简图来表示”,应当是“图5.7”。
- 157页5.4.3,“网格切分控制通过snappyHexMesh中的”,应当是“snappyHexMeshDict”。
后面“surfaceFeatureExtractDict字典文件范例可以”应当是“surfaceFeaturesDict”。“surfaceFeature”应为“surfaceFeatures”,接着的“参见图5.11中指定的面”应为“图5.10”。 - 159页5.4.4中的“参见图5.12”应为”图5.12“。