是指3*3的張量,其路徑為
src/OpenFOAM/primitives/Tensor
對應的檔案關系如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csETSU9kenRlT3FleYhnRzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcuUDO3ETMxIjMxADOwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
基本結構和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的特殊情況,這裡指定了元素的類型