openFOAM中的forAll

这是用户二次开发代码中非常常用的一个语法,我们这里看一下它的底层实现。当然不同的class会各自实现一个forall,这里给出的是UList的实现,具体路径位于

src/OpenFOAM/container/Lists/UList/

文件夹中定义了UList类,使用一个连续存储,通过制定类型T的指针给定首地址

template<class T>
class UList 
{
    // Private Data

        //- Number of elements in UList
        label size_;

        //- Vector of values of type T
        T* __restrict__ v_;

        ....
 }

其中__restrict__ v_就是首地址。而其中的宏定义下面也给出

//- Loop across all elements in \\a list
// \\par Usage
// \\code
// forAll(anyList, i)
// {
//      statements;
// }
// \\endcode
// \\sa forAllReverse
#define forAll(list, i) \\
    for (Foam::label i=0; i<(list).size(); i++)

//- Reverse loop across all elements in \\a list
//  \\par Usage
//  \\code
//  forAllReverse(anyList, i)
//  {
//       statements;
//  }
//  \\endcode
//  \\sa forAll
#define forAllReverse(list, i) \\
    for (Foam::label i=(list).size()-1; i>=0; i--)

//- Iterate across all elements in the \\a container object of type
//  \\a Container.
//  \\par Usage
//  \\code
//  forAll(ContainerType, container, iter)
//  {
//      statements;
//  }
//  \\endcode
//  \\sa forAllConstIter
#define forAllIter(Container,container,iter)                                   \\
    for                                                                        \\
    (                                                                          \\
        Container::iterator iter = (container).begin();                        \\
        iter != (container).end();                                             \\
        ++iter                                                                 \\
    )

//- Iterate across all elements in the \\a container object of type
//  \\a Container with const access.
//  \\par Usage
//  \\code
//  forAllConstIter(ContainerType, container, iter)
//  {
//      statements;
//  }
//  \\endcode
//  \\sa forAllIter
#define forAllConstIter(Container,container,iter)                              \\
    for                                                                        \\
    (                                                                          \\
        Container::const_iterator iter = (container).begin();                  \\
        iter != (container).end();                                             \\
        ++iter                                                                 \\
    )

大体是类似的,我们这里解析一下第一个forAll,我们给定一个UList类的对象list和游标label i输入后,i会遍历list中的每一个元素。本质上是for的封装(其实我感觉这样降低了可读性)。比如说这里有一个UList list,我们希望给里面的所有元素都加一,就这样写

label i;
UList<int> list;
....

forAll(list, i)
{ list[i] = list[i]+1;
}

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片