C++ 基礎
首都大学東京 田川研究室
戻る

tecplotのバイナリ形式

C++とはまったく関係が無い。tecplotのバイナリデータ出力関数の説明
目次の方に、当研究室で作成した簡易版があります。旧バージョンのテクプロットに64bitコードで出力することもできます。まあ、ソースコードをコンパイルしていただくだけですが。

数値流体に100万格子の壁があると思われ、個人用pcでできる限界の解析負荷です。tecplotもまた100万格子を超えたあたりからテキストベースのデータを読み込むのにものすごい時間がかかります。

よってバイナリ出力をする関数が提供されています。マニアルがお世辞にもわかり易いとはいえません。英語オンリーですし。よってここに記します。以下、2次元の等温度勾配を出力する例。理解する必要はありません。コピーして使えばいいと思います。
#include <math.h>
#include <stdio.h>
#include <TECIO.h>//これ重要

int main()
{
    float dx;
    float dy;
    float *pbuff;
    
    dx = 0.05;
    dy = 0.05;
    int Debug = 0;      //デバッグ出力の有効化
    int VIsDouble = 0;  //倍精度での出力の有効化
    int FileType = 0;   //なぞ。0を指定。たぶんバイナリ形式となる。
    int I;

    I = TECINI112(  "Test DATASET",
                    "X Y T", 
                    "test.plt",
                    ".", 
                    &FileType,
                    &Debug,
                    &VIsDouble );
	
	
    int ZoneType = 0; //構造格子のゾーンを出力

    int IMax = 20;
    int JMax = 40;
    int KMax = 1;//2D出力の場合、1とする。

    double SolTime = 0; //0でいいんじゃないでしょうか。
    int StrandID = 0; 
    int ParentZn = 0; 
    int ICellMax = 0; 
    int JCellMax = 0; 
    int KCellMax = 0; 
    int IsBlock = 1;  //Block、1にしておけば良い。
    int NFConns = 0;  

    int FNMode = 0;
    int TotalNumFaceNodes = 0; 
    int TotalNumBndryFaces = 0;
    int TotalNumBndryConn = 0;
    int ShrConn = 0;


    I = TECZNE112(  "Zone Main Volume",
                    &ZoneType,
                    &IMax,
                    &JMax,
                    &KMax,
                    &ICellMax,
                    &JCellMax,
                    &KCellMax,
                    &SolTime,
                    &StrandID,
                    &ParentZn,
                    &IsBlock,
                    &NFConns,
                    &FNMode,
                    &TotalNumFaceNodes, 
                    &TotalNumBndryFaces, 
                    &TotalNumBndryConn,
                    0,
                    0,
                    0,
                    &ShrConn);
	

    int DIsDouble = 0; //倍精度出力の有効化。無意味なので0にしましょう。
    int III = IMax*JMax; //データ数

    //出力用のバッファを確保します。
    //メモリの開放。vectorクラスの利用を推奨
    pbuff = new float[III];
    //--------座標軸の出力---------------

    int m0 = 0;
    for(int jt=0;jt<JMax;jt++)
    {
        for(int it=0;it<IMax;it++)
        {
            //ループはこのようにIMaxから回します。
            //アドレスアクセスで不利になる場合、何か考えてください。
            pbuff[m0] = it*dx;
            m0++;
        }
    }
    I = TECDAT112(&III , pbuff , &DIsDouble);

    m0 = 0;
    for(int jt=0;jt<JMax;jt++)
    {
        for(int it=0;it<IMax;it++)
        {
            pbuff[m0] = jt*dy;
            m0++;
        }
    }
    I = TECDAT112(&III , pbuff , &DIsDouble);
    

    m0 = 0;
    //等温度勾配となるように出力してみます。
    for(int jt=0;jt<JMax;jt++)
    {
        for(int it=0;it<IMax;it++)
        {
            pbuff[m0] = 0.5 - it*dx;
            m0++;
        }
    }
    I = TECDAT112(&III , pbuff , &DIsDouble);
    
    TECEND112();

    delete [] pbuff;//メモリの開放。vectorクラスの利用を推奨
    return 0;
}
上記コードを実行すれば、以下の図がテクプロットに描けます。
一応説明。
TECINI112
出力ファイルの設定を初期化します。変数の数など。"X Y T" のようにスペース区切りで変数を指定します。これで3変数の出力ができます。
"test.plt"がファイル名指定の部分です。他の引数についてはコード上の説明をみてください。説明のないものは私もよくわかりませんのでそのまま記述すればしばらくは問題ないかと。
TECZNE112
ゾーンを作成します。ゾーンとは?私もよくわかっていないのですが、変数のグループだと思います。矩形容器内の流れと、円筒容器内の流れを同時に表示することができる機能です。有限要素出力とも併せられます。
引数は要素数とゾーン名が重要です。倍精度出力は私は無駄だと思っているので切りましょう。

指定する変数はほとんど0ばかりです。しかもすべてアドレス参照渡しをしなくてはいけないので面倒な関数となっています。クラスか、せめて構造体を渡せる関数にしてほしいですね。
TECDAT112
ゾーンのデータを出力します。TECINI112に渡した変数の数だけ呼び出し、データ配列の大きさはTECZNE112に指定した数と同じである必要があります。
TECEND112
出力を終了します。この関数を起動して初めて、出力完了となりますので最後まで油断せず行きましょう。
このバイナリ出力はtecplotの最新版(2012)でないと使えません。お持ちでない場合は体験版で試してみてください。
リンカーの設定が必要です。ライブラリファイル、tecio.libをリンクする必要があります。
ライブラリファイルはtecplotのインストールフォルダに入っていると思います。ヘッダーファイルも同様です。デフォルトでインストールし、Windows7 ,8の場合、

C:\Program Files\Tecplot\Tec360 2013R1\bin
C:\Program Files\Tecplot\Tec360 2013R1\include

に入っています。binがライブラリが入っているフォルダ、includeがTECIO.hなどヘッダファイルが入っているフォルダになります。これをVisual Studioに設定します。

プロジェクト->プロパティ->構成プロパティ->VC++ディレクトリ にライブラリ、ヘッダの場所を指定。
プロジェクト->プロパティ->構成プロパティ->リンカー->入力->追加の依存ファイル の欄に文字通りリンクしたいライブラリを追加記述します。tecio.libをリンクしましょう。
ライブラリがある場所は上記VC++ディレクトリに指定してあるので、こちらはファイル名だけ指定すればよいです。

一度ライブラリのある場所をエクスプローラーで見てみるとよいかもしれません。tecio.lib以外にもいろいろ入っています。