3.8 データ作成ライブラリ

本プログラムにはデータ作成ライブラリが添付しています。
これはC言語のプログラムを作成して入力データを出力するためのライブラリです。
以下のような用途に使用します。

  1. データの数が多く規則的であるとき
  2. 座標値が互いに関連しており一か所を変えるとたくさんのデータが連動して変わるとき
  3. パラメーターを変えて繰り返し計算するとき

ファイル構成
datalibフォルダにデータ作成ライブラリのソースコード(ost_datalib.c) とヘッダーファイル(ost_datalib.h)があります。
ユーザーがプログラムを作成するときはost_datalib.hをincludeし、 コンパイル時にost_datalib.cを追加して下さい。

関数一覧
表3-8-1に関数一覧を示します。
関数については以下の規則があります。

  1. 関数名はすべて小文字で"ost_"で始まります。
  2. 引数のうち実数はすべてdoubleです。
  3. 関数の戻り値はすべて"void"です。
  4. 単位はすべてMKSA単位系です。
  5. 関数の呼び出し順は、最初がost_init、最後がost_outdatです。 関数2〜5はost_initとその他の関数の間に呼ぶ必要があります。 その他の関数の呼び出し順は任意ですが、表の順に呼ぶことを推奨します。
  6. 必須関数とオプション関数があります。必須関数は濃い色で表示しています。 オプション関数を呼び出さないときは既定値が設定されます。
  7. 複数回呼び出すことができる関数があります。そのときは複数個のデータが出力されます。
  8. 一度だけ呼び出せばよい関数を複数回呼び出したときは最後の呼び出しが有効になります。

表3-8-1 データ作成ライブラリ関数一覧
1 関数名ost_init
機能初期化します。必須です。
宣言void ost_init();
備考 他のすべての関数の前に一度呼び出すことが必要です。
2 関数名ost_section_size
機能区間の最大数を指定します。オプションです。
宣言void ost_section_size(int size);
引数 size : 区間の最大数(既定値:1000)
備考 2〜5の関数はost_initの直後に呼び出すことが必要です。
3 関数名ost_unit_size
機能ユニット(物体形状)の最大数を指定します。オプションです。
宣言void ost_geometry_size(int size);
引数 size : 幾何形状の最大数(既定値:100000)
備考 2〜5の関数はost_initの直後に呼び出すことが必要です。
4 関数名ost_1d_size
機能近傍界観測線の最大数を指定します。オプションです。
宣言void ost_near1d_size(int size);
引数 size : 近傍界観測線の最大数(既定値:1000)
備考 2-5の関数はost_initの直後に呼び出すことが必要です。
5 関数名ost_2d_size
機能近傍界観測面の最大数を指定します。オプションです。
宣言void ost_near2d_size(int size);
引数 size : 近傍界観測面の最大数(既定値:1000)
備考 2〜5の関数はost_initの直後に呼び出すことが必要です。
6 関数名ost_title
機能データにタイトルを付けます。オプションです。
宣言void ost_title(const char title[]);
引数 title : タイトル
備考 計算結果には関係ありませんが、データの管理に使用します。
7 関数名ost_xsection1
機能X方向の区間区切り位置を追加します。複数回呼び出し可。
宣言void ost_xsection1(double x);
引数 x : X方向の区間区切り位置
8 関数名ost_ysection1
機能Y方向の区間区切り位置を追加します。複数回呼び出し可。
宣言void ost_ysection1(double y);
引数 y : Y方向の区間区切り位置
9 関数名ost_zsection1
機能Z方向の区間区切り位置を追加します。複数回呼び出し可。
宣言void ost_zsection1(double z);
引数 z : Z方向の区間区切り位置
10 関数名ost_xdivision1
機能X方向の区間分割数を追加します。複数回呼び出し可。
宣言void ost_xdivision1(int n);
引数 n : X方向の区間分割数
11 関数名ost_ydivision1
機能Y方向の区間分割数を追加します。複数回呼び出し可。
宣言void ost_ydivision1(int n);
引数 n : Y方向の区間分割数
12 関数名ost_zdivision1
機能Z方向の区間分割数を追加します。複数回呼び出し可。
宣言void ost_zdivision1(int n);
引数 n : Z方向の区間分割数
13 関数名ost_xsection
機能X方向の区間区切り位置を指定します。
宣言void ost_xsection(int n, ...);
引数 n : X方向の区間区切り位置の数(=X方向の区間数+1)
... : X方向の区間区切り位置(n個のdouble型数値)
14 関数名ost_ysection
機能Y方向の区間区切り位置を指定します。
宣言void ost_ysection(int n, ...);
引数 n : Y方向の区間区切り位置の数(=Y方向の区間数+1)
... : Y方向の区間区切り位置(n個のdouble型数値)
15 関数名ost_zsection
機能Z方向の区間区切り位置を指定します。
宣言void ost_zsection(int n, ...);
引数 n : Z方向の区間区切り位置の数(=Z方向の区間数+1)
... : Z方向の区間区切り位置(n個のdouble型数値)
16 関数名ost_xdivision
機能X方向の区間分割数を指定します。
宣言void ost_xdivision(int n, ...);
引数 n : X方向の区間数
... : X方向の区間分割数(n個のint型整数)
17 関数名ost_ydivision
機能Y方向の区間分割数を指定します。
宣言void ost_ydivision(int n, ...);
引数 n : Y方向の区間数
... : Y方向の区間分割数(n個のint型整数)
18 関数名ost_zdivision
機能Z方向の区間分割数を指定します。
宣言void ost_zdivision(int n, ...);
引数 n : Z方向の区間数
... : Z方向の区間分割数(n個のint型整数)
19 関数名ost_volt
機能電極の電圧を追加します。2回以上の呼び出しが必要。
宣言void ost_volt(double volt);
引数 volt : 電極の電圧[V]
備考 入力した順に電極電圧番号1,2,...が与えられます。
20 関数名ost_volt_name
機能直前に入力した電極電圧データに名前を付けます。オプションです。
宣言void ost_volt_name(const char name[]);
引数 name : 名前
備考 本関数はデータの管理に使用するものであり、計算結果に影響を与えません。
21 関数名ost_epsr
機能誘電体の比誘電率を追加します。複数回呼び出し可。
宣言void ost_epsr(double epsr);
引数 epsr : 誘電体の比誘電率
備考 入力した順に比誘電率番号1,2,...が与えられます。
22 関数名ost_epsr_name
機能直前に入力した誘電率データに名前を付けます。オプションです。
宣言void ost_epsr_name(const char name[]);
引数 name : 名前
備考 本関数はデータの管理に使用するものであり、計算結果に影響を与えません。
23 関数名ost_unit
機能物体形状を追加します。複数回呼び出し可。
宣言void ost_unit(unsigned char type, unsigned char pid, unsigned char shape, const double pos[6]);
引数 type : 電極と誘電体の種別、1=電極、2=誘電体
pid : 属性番号(1以上、電極のときは電圧番号、誘電体のときは比誘電率番号)
shape : 物体形状番号
pos[0] : X座標下限
pos[1] : X座標上限
pos[2] : Y座標下限
pos[3] : Y座標上限
pos[4] : Z座標下限
pos[5] : Z座標上限
備考 物体形状番号の意味は以下の通りです。詳しくは3.3を参考にして下さい。
1:直方体
2:楕円球 (座標は外接直方体のもの)
11:X方向楕円柱 (座標は外接直方体のもの)
12:Y方向楕円柱 (座標は外接直方体のもの)
13:Z方向楕円柱 (座標は外接直方体のもの)
44:X方向四角錐 (座標は外接直方体のもの)
45:Y方向四角錐 (座標は外接直方体のもの)
46:Z方向四角錐 (座標は外接直方体のもの)
54:X方向四角錐 (座標は外接直方体のもの)
55:Y方向四角錐 (座標は外接直方体のもの)
56:Z方向四角錐 (座標は外接直方体のもの)
61:XY三角柱 (座標は外接直方体のもの)
62:XZ三角柱 (座標は外接直方体のもの)
63:YZ三角柱 (座標は外接直方体のもの)
64:YX三角柱 (座標は外接直方体のもの)
65:ZX三角柱 (座標は外接直方体のもの)
66:ZY三角柱 (座標は外接直方体のもの)
24 関数名ost_unit6
機能物体形状を追加します。複数回呼び出し可。
宣言void ost_unit6(unsigned char type, unsigned char pid, unsigned chart shape, double x1, double x2, double y1, double y2, double z1, double z2);
引数 type : 電極と誘電体の種別、1=電極、2=誘電体
pid : 属性番号(1以上、電極のときは電圧番号、誘電体のときは比誘電率番号)
shape : 物体形状番号
x1 : X座標下限
x2 : X座標上限
y1 : Y座標下限
y2 : Y座標上限
z1 : Z座標下限
z2 : Z座標上限
備考 物体形状番号は関数ost_unitを参考にして下さい。
25 関数名ost_unit_name
機能直前に入力した物体形状に名前を付けます。オプションです。
宣言void ost_unit_name(const char name[]);
引数 name : 名前
備考 本関数はデータの管理に使用するものであり、計算結果に影響を与えません。
26 関数名ost_solver
機能反復計算条件を指定します。オプションです。
宣言void ost_solver(double omega, int maxiter, int nout, double convergence);
引数 omega : 緩和係数ω
maxiter : 最大反復回数
nout : 収束経過の出力間隔
convergence : 収束判定条件(通常1e-5)
備考 本関数を呼び出さないときは適当な既定値が設定されますが、収束状況を見て適当に設定することが大切です。
27 関数名ost_plotiter
機能収束状況を図形出力します。オプションです。
宣言void ost_plotiter(int i);
引数 i : 0/1=しない/する。既定値は1です。
28 関数名ost_plot1d
機能線上分布図を図形出力します。複数回呼び出し可。
宣言void ost_plot1d(const char component[], const char direction[], double p1, double p2);
引数 component : 計算する成分("V", "E", "D", "Q"のいずれか)
direction : 線の向き("X", "Y", "Z"のいずれか)
p1, p2 : 線の座標、向きがXのときはY,Z座標、向きがYのときはZ,X座標、向きがZのときはX,Y座標
29 関数名ost_1ddb
機能線上分布図の単位を指定します。オプションです。
宣言void ost_1ddb(int i);
引数 i : 0=線形、1=dB
備考 本関数を呼び出さないときは単位は線形です。
30 関数名ost_1dscale
機能線上分布図のスケールを指定します。オプションです。
宣言void ost_1dscale(double min, double max, int div);
引数 min : 最小値
max : 最大値
div : 分割数
備考 本関数を呼び出さないときはスケールは自動設定されます。
31 関数名ost_1dlog
機能線上分布を1d.logに数値出力するか。オプションです。
宣言void ost_1dlog(int i1);
引数 i1 : 0=出力しない、1=出力する。
備考 本関数を呼び出さないときは数値出力します。
32 関数名ost_plot2d
機能面上分布図を図形出力します。複数回呼び出し可。
宣言void ost_plot2d(const char component[], const char direction[], double p);
引数 component : 計算する成分("V", "E", "Ex", "Ey", "Ez", "D", "Dx", "Dy", "Dz", "Q"のいずれか)
direction : 面の向き("X", "Y", "Z"のいずれか)
p : 面の座標、向きがXのときはX座標、向きがYのときはY座標、向きがZのときはZ座標
33 関数名ost_2dfigure
機能面上分布図を2Dまたは3Dで出力するか。オプションです。
宣言void ost_2dfigure(int i1, int i2);
引数 i1 : 0=2Dを出力しない、1=2Dを出力する。
i2 : 0=3Dを出力しない、1=3Dを出力する。
備考 本関数を呼び出さないときはすべて出力されます。
34 関数名ost_2ddb
機能面上分布図の単位を指定します。オプションです。
宣言void ost_2ddb(int i);
引数 i : 0=線形、1=dB
備考 本関数を呼び出さないときは単位は線形です。
35 関数名ost_2dscale
機能面上分布図のスケールを指定します。オプションです。
宣言void ost_2dscale(double min, double max, int div);
引数 min : 最小値
max : 最大値
div : 分割数
備考 本関数を呼び出さないときはスケールは自動設定されます。
36 関数名ost_2dobject
機能面上分布図に物体を描くか。オプションです。
宣言void ost_2dobject(int i1, int i2);
引数 i1 : 0=電極を描かない、1=電極を描く。
i2 : 0=誘電体を描かない、1=誘電体を描く。
備考 本関数を呼び出さないときはすべて出力されます。
37 関数名ost_2dzoom
機能面上分布図の一部を拡大表示します。オプションです。
宣言void ost_2dzoom(double x1, double x2, double y1, double y2);
引数 x1 : 横方向下限
x2 : 横方向上限
y1 : 縦方向下限
y2 : 縦方向上限
備考 本関数を呼び出さないときは全領域が表示されます。
38 関数名ost_2dlog
機能面上分布を2d.logに数値出力するか。オプションです。
宣言void ost_2dlog(int i1);
引数 i1 : 0=出力しない、1=出力する。
備考 本関数を呼び出さないときは数値出力します。
39 関数名ost_window2d
機能図形出力2Dウィンドウの大きさとフォントサイズを指定します。オプションです。
宣言void ost_window2d(int width, int height, int font);
引数 width : ウィンドウの幅(ピクセル)
height : ウィンドウの高さ(ピクセル)
font : フォントサイズ(ピクセル)
備考 本関数を呼び出さないときは既定値が設定されます。
40 関数名ost_window3d
機能図形出力3Dウィンドウの大きさと初期視点を指定します。オプションです。
宣言void ost_window3d(int width, int height, double theta, double phi);
引数 width : ウィンドウの幅(ピクセル)
height : ウィンドウの高さ(ピクセル)
theta : 初期視点のθ[度]
phi : 初期視点のφ[度]
備考 本関数を呼び出さないときは既定値が設定されます。
41 関数名ost_outdat
機能出力ファイル名を指定します。必須です。
宣言void ost_outdat(const char file[]);
引数 file : 出力ファイル名。拡張子は".ost"推奨。

メッシュデータについての注意事項
メッシュデータはX方向、Y方向、Z方向から成り、それぞれ1個以上の区間から成ります。
それらを入力するには例えばX方向については、 ost_xsection1とost_xdivision1を組み合わせるか、 ost_xsectionとost_xdivisionを使用するかの2通りがあります。 これらはどちらか一方が有効です。
前者では区間の数だけost_xsection1とost_xdivision1を呼び出し、 最後にost_xsection1で終わります。
後者ではost_xsectionとost_xdivisionを一回呼び出します。
なお、後者では引数の数が可変になります。 可変個の引数に数値を直接代入するときは整数(int)であるか実数(double)であるかわかるように入力する必要があります。 整数は例えば"1"となります。 実数は例えば"1.0", "1e-3", "1.0e-3"となります。

物体形状の入力順
物体形状が重複する点では後から入力した物体の属性が優先されます。
従って誘電体に厚さのない電極を貼るときは先に誘電体を入力する必要があります。 逆にすると電極が消えます。

サンプルプログラム
リスト3-8-1にデータ作成ライブラリを使用したサンプルプログラムを示します。


リスト3-8-1 データ作成ライブラリ用サンプルプログラム
/*
sample1.c

sample program of OpenSTF datalib
*/

#include "ost_datalib.h"

int main()
{
	// (1) initialize

	ost_init();

	// (2) title

	ost_title("sample1");

	// (3) mesh

	ost_xsection(2, -5.0, +5.0);
	ost_xdivision(1, 50);

	ost_ysection(2, -5.0, +5.0);
	ost_ydivision(1, 50);

	ost_zsection(2, -5.0, +5.0);
	ost_zdivision(1, 50);

	// (4) volt

	ost_volt(-1);
	ost_volt(+1);

	// (5) dielectric

	ost_epsr(2.0);

	// (6) geometry

	ost_unit6(2, 1, 1, -2.0, +2.0, -2.0, +2.0, -2.0, +2.0);		// dielectric
	ost_unit6(1, 1, 1, -2.0, +2.0, -2.0, +2.0, -2.0, -2.0);		// -electrode
	ost_unit6(1, 2, 1, -2.0, +2.0, -2.0, +2.0, +2.0, +2.0);		// +electrode

	// (7) solver

	ost_solver(1.97, 3000, 100, 1e-5);

	// (8) post

	ost_plotiter();

	ost_plot1d("E", "Z", 0, 0);
	//ost_1ddb(1);
	//ost_1dscale(-50, 10, 6);

	ost_plot2d("E", "X", 0);
	//ost_2dfigure(1, 1);
	//ost_2ddb(1);
	//ost_2dscale(-50, 10, 0);
	//ost_2dobject(1, 1);

	//ost_window2d(750, 500, 15);
	//ost_window3d(500, 500, 60, 30);

	// (9) output

	ost_outdat("sample1.ost");

	return 0;
}

コンパイル・実行方法
データ作成ライブラリを使用したソースコードをコンパイル・実行する方法は以下の通りです。

Windows+VC++の場合

> cl /Ox sample1.c ost_datalib.c
> sample1.exe
Linux+gccの場合
$ gcc -O sample1.c ost_datalib.c -o sample1
$ ./sample1
以上でファイル(ここではsample1.ost)が出力されます。
リスト3-8-2に出力されたファイルを示します。
このファイルがOpenSTFの入力データになります。


リスト3-8-2 データ作成ライブラリの出力サンプルデータ
OpenSTF 1 2
title = sample1
xmesh = -5 50 5
ymesh = -5 50 5
zmesh = -5 50 5
volt = -1 
volt = 1 
epsr = 2 
geometry = 2 1 1 -2 2 -2 2 -2 2 
geometry = 1 1 1 -2 2 -2 2 -2 -2 
geometry = 1 2 1 -2 2 -2 2 2 2 
solver = 1.97 3000 100 1e-05
plotiter = 1
plot1d = E Z 0 0
plot2d = E X 0
2dfigure = 1 1
2dobject = 1 1
window2d = 750 500 15
window3d = 500 50 60 30
end