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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章