天天看點

openFOAM中的tensor

是指3*3的張量,其路徑為

src/OpenFOAM/primitives/Tensor

對應的檔案關系如下:

openFOAM中的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的特殊情況,這裡指定了元素的類型