是指3*3的张量,其路径为src/OpenFOAM/primitives/Tensor
对应的文件关系如下:
基本结构和vector非常相似
MatrixSpace
他用VectorSpace创建,头文件如下:
template<class Form, class Cmpt, direction Mrows, direction Ncols>
class MatrixSpace
: public VectorSpace<Form, Cmpt, Mrows*Ncols>
{
public:
//- MatrixSpace type
typedef MatrixSpace<Form, Cmpt, Mrows, Ncols> msType;
// Member constants
static const direction mRows = Mrows;
static const direction nCols = Ncols;
//构造函数和析构函数
//返回其中的某个元素,或者整体size的函数
//等号的操作符重定义
};
首先VectorSpace
为一个一维数组,模板的第三个输入值即为数组的长度,在逻辑上为一个行向量。而当前用它创建矩阵,相当于在内存上,矩阵的元素为连续存储的,在逻辑上才是矩阵。在运算过程中,需要根据下标计算从首地址向后的位移。
而这里没有.C
文件,*I.H
文件将头文件中给出的inline函数进行了具体的实现
Tensor
头文件内容如下:
template<class Cmpt>
class Tensor
:
public MatrixSpace<Tensor<Cmpt>, Cmpt, 3, 3>
{
public:
//- Equivalent type of labels used for valid component indexing
typedef Tensor<label> labelType;
// Member constants
//- Rank of Tensor is 2
static const direction rank = 2;
// Static Data Members
static const Tensor I;
//- Component labeling enumeration
enum components { XX, XY, XZ, YX, YY, YZ, ZX, ZY, ZZ };
构造函数和析构函数
返回其中的某个元素,以及等于的重定义
};
相当于是MatrixSpace
的一个3*3的特殊情况,不过元素类型还需要指定,此时的各个元素可以单独编号为XX, XY, XZ, YX, YY, YZ, ZX, ZY, ZZ
。因为VectorSpace
中已经实现了大多数功能,这里需要写的东西比较少了。并且也同样只有源码*I.H
没有.C
,它实现了其中的inline函数
tensor
相当于前面Tensor
的指定元素为scalar
类型。因为是浮点数操作,添加了一些特征值相关的函数,头文件如下
namespace Foam
{
typedef Tensor<scalar> tensor;
vector eigenValues();
vector eigenVector();
tensor eigenVectors();
//几个函数均为多态,有多重可输入的形式
} // End namespace Foam
其.C
文件提供了具体的实现,因为是3*3的矩阵,求特征值并不会很困难。另外,.C
文件中还对部分成员变量重新赋值:
template<> const char* const Foam::tensor::vsType::typeName = "tensor";
template<> const char* const Foam::tensor::vsType::componentNames[] =
{
"xx", "xy", "xz",
"yx", "yy", "yz",
"zx", "zy", "zz"
};
template<> const Foam::tensor Foam::tensor::vsType::zero(tensor::uniform(0));
template<> const Foam::tensor Foam::tensor::vsType::one(tensor::uniform(1));
template<> const Foam::tensor Foam::tensor::vsType::max(tensor::uniform(vGreat));
template<> const Foam::tensor Foam::tensor::vsType::min(tensor::uniform(-vGreat));
template<> const Foam::tensor Foam::tensor::vsType::rootMax(tensor::uniform(rootVGreat));
template<> const Foam::tensor Foam::tensor::vsType::rootMin(tensor::uniform(-rootVGreat));
template<> const Foam::tensor Foam::tensor::I
(
1, 0, 0,
0, 1, 0,
0, 0, 1
);
floatTensor
它是Tensor
中,元素类型为float
的特殊情况
typedef Tensor<float> floatTensor;
而他的.C
文件中,类似的对部分成员变量进行了修改。
好的总结一下:
MatrixSpace为可以指定长度的矩阵,它是用VectorSpace添加了坐标计算实现的
Tensor则是MatrixSpace的特护情况,指定了3*3,但是并未指定元素的类型
而tensor和floatTensor和labelTensor为Tensor的特殊情况,这里指定了元素的类型
暂无评论内容