openFOAM中的tensor

是指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的特殊情况,这里指定了元素的类型

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

昵称

取消
昵称表情代码图片