首先需要声明这里的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
暂无评论内容