openFOAM中的vector

首先需要声明这里的vector和我们平时C++中说的数组,或者STL中的vector不是一个。它是openFOAM从九十年代改动至今留下来的一个习惯,这里的vector特质(x,y,z)这样的三维向量,用来表示坐标速度等等。

他位于路径OpenFOAM/primitives/Vector/complexVector

我们首先来看一下文件的依赖关系
在这里插入图片描述

VectorSpace

头文件内容如下:

template<class Form, class Cmpt, direction Ncmpts>
class VectorSpace
{
public; 
    Cmpt v_[Ncmpts];    //- The components of this vector space
    typedef VectorSpace<Form, Cmpt, Ncmpts> vsType;   //- VectorSpace type
    typedef Cmpt cmptType;   //- Component type
    
    // Static constants
    static const direction dim = 3;   //- Dimensionality of space
    static const direction nComponents = Ncmpts;   //- Number of components in this vector space

    // VectorSpace currently defaults to a column-vector
    // This will be removed when column-vector is introduced
    // as a specialization
    static const direction mRows = Ncmpts;
    static const direction nCols = 1;

    //若干支持性的变量和函数
    //可以使用[]()去取向量中的值,返回数据尺寸,以及加减乘除等基本操作
    //>>   <<的运算符重定义
};

首先我们这个向量空间使用的是类型Cmpt作为元素类型,Ncmpts代表着元素的个数。注意这里的长度并没有固定为3个,而是用户自己在初始化的时候指定。在数学逻辑上,这里相当于一个行向量

// VectorSpace currently defaults to a column-vector
// This will be removed when column-vector is introduced
// as a specialization
static const direction mRows = Ncmpts;
static const direction nCols = 1;

.C文件是对这个向量空间的函数的具体实现

Vector

注意是大写的,这里的源文件只有*.H*I.H,并没有.C文件。首先给出.H文件的源码

template<class Cmpt>
class Vector
:
    public VectorSpace<Vector<Cmpt>, Cmpt, 3>
{
public:
    //- Equivalent type of labels used for valid component indexing
    typedef Vector<label> labelType;
    // Member constants
    static const direction rank = 1;
    //- Component labeling enumeration
    enum components { X, Y, Z };

    构造和析构函数

    // Member Functions
    用来返回x.y.z三个方向的元素,以及进行加减乘除操作
};

这里的*I.H文件对其中的inline函数进行了具体的实现

vector

头文件的源码如下:

namespace Foam
{
typedef Vector<scalar> vector;

//- Data associated with vector type are contiguous
template<>
inline bool contiguous<vector>() {return true;}


template<class Type>
class flux
:
    public innerProduct<vector, Type>
{};


template<>
class flux<scalar>
{
public:

    typedef scalar type;
};

前面的Vector.H中需要指定元素的类型,这里为把元素类型指定为scalar的特例(注意平时用的时候都是小写的scalar)。而对应的.C文件则是对原来的VectorSpace中的成员变量进行了修改:

template<>  const char* const Foam::vector::vsType::typeName = "vector";
template<>  const char* const Foam::vector::vsType::componentNames[] = {"x", "y", "z"};
template<>  const Foam::vector Foam::vector::vsType::vsType::zero(vector::uniform(0));
template<>  const Foam::vector Foam::vector::vsType::one(vector::uniform(1));
template<>  const Foam::vector Foam::vector::vsType::max(vector::uniform(vGreat));
template<>  const Foam::vector Foam::vector::vsType::min(vector::uniform(-vGreat));
template<>  const Foam::vector Foam::vector::vsType::rootMax(vector::uniform(rootVGreat));
template<>  const Foam::vector Foam::vector::vsType::rootMin(vector::uniform(-rootVGreat));

floatVector

类似地,这里我们也只给出其中一个文件的具体内容,其他类似。头文件的源码如下:

namespace Foam
{
typedef Vector<float> floatVector;

//- Data associated with floatVector type are contiguous
#if !defined(WM_SP)
template<>
inline bool contiguous<floatVector>() {return true;}
#endif

} // End namespace Foam

就是说创建了Vector的一个float版本,和前面vector的内容其实相似。类似地.C文件中,也对VectorSpace中的成员变量进行了修改。

总结一下:
VectorSpace是可以指定长度和元素类型的数组,数学上代表行向量
Vector是VectorSpace指定长度为3的数组,而元素的类型扔需要指定
接下来的几个类型,则为将Vector的元素类型指定的特例。

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

昵称

取消
昵称表情代码图片