5.8 データ作成ライブラリ

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

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

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

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

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

表5-8-1 データ作成ライブラリ関数一覧
1 関数名ofd_init
機能初期化します。必須です。
宣言void ofd_init();
備考 他のすべての関数の前に一度呼び出すことが必要です。
2 関数名ofd_section_size
機能区間の最大数を指定します。オプションです。
宣言void ofd_section_size(int size);
引数 size : 区間の最大数(既定値:1000)
備考 2-8の関数はofd_initの直後に呼び出すことが必要です。
3 関数名ofd_geometry_size
機能幾何形状の最大数を指定します。オプションです。
宣言void ofd_geometry_size(int size);
引数 size : 幾何形状の最大数(既定値:100000)
備考 2-8の関数はofd_initの直後に呼び出すことが必要です。
4 関数名ofd_feed_size
機能給電点の最大数を指定します。オプションです。
宣言void ofd_feed_size(int size);
引数 size : 給電点の最大数(既定値:1000)
備考 2-8の関数はofd_initの直後に呼び出すことが必要です。
5 関数名ofd_point_size
機能観測点の最大数を指定します。オプションです。
宣言void ofd_point_size(int size);
引数 size : 観測点の最大数(既定値:1000)
備考 2-8の関数はofd_initの直後に呼び出すことが必要です。
6 関数名ofd_near1d_size
機能近傍界観測線の最大数を指定します。オプションです。
宣言void ofd_near1d_size(int size);
引数 size : 近傍界観測線の最大数(既定値:1000)
備考 2-8の関数はofd_initの直後に呼び出すことが必要です。
7 関数名ofd_near2d_size
機能近傍界観測面の最大数を指定します。オプションです。
宣言void ofd_near2d_size(int size);
引数 size : 近傍界観測面の最大数(既定値:1000)
備考 2-8の関数はofd_initの直後に呼び出すことが必要です。
8 関数名ofd_far_size
機能遠方界計算面の最大数を指定します。オプションです。
宣言void ofd_far_size(int size);
引数 size : 遠方界計算面の最大数(既定値:1000)
備考 2-8の関数はofd_initの直後に呼び出すことが必要です。
9 関数名ofd_title
機能データにタイトルを付けます。オプションです。
宣言void ofd_title(const char title[]);
引数 title : タイトル
備考 計算結果には関係ありませんが、データの管理に使用します。
10 関数名ofd_xsection1
機能X方向の区間区切り位置を追加します。複数回呼び出し可。
宣言void ofd_xsection1(double x);
引数 x : X方向の区間区切り位置
11 関数名ofd_ysection1
機能Y方向の区間区切り位置を追加します。複数回呼び出し可。
宣言void ofd_ysection1(double y);
引数 y : Y方向の区間区切り位置
12 関数名ofd_zsection1
機能Z方向の区間区切り位置を追加します。複数回呼び出し可。
宣言void ofd_zsection1(double z);
引数 z : Z方向の区間区切り位置
13 関数名ofd_xdivision1
機能X方向の区間分割数を追加します。複数回呼び出し可。
宣言void ofd_xdivision1(int n);
引数 n : X方向の区間分割数
14 関数名ofd_ydivision1
機能Y方向の区間分割数を追加します。複数回呼び出し可。
宣言void ofd_ydivision1(int n);
引数 n : Y方向の区間分割数
15 関数名ofd_zdivision1
機能Z方向の区間分割数を追加します。複数回呼び出し可。
宣言void ofd_zdivision1(int n);
引数 n : Z方向の区間分割数
16 関数名ofd_xsection
機能X方向の区間区切り位置を指定します。
宣言void ofd_xsection(int n, ...);
引数 n : X方向の区間区切り位置の数(=X方向の区間数+1)
... : X方向の区間区切り位置(n個のdouble型数値)
17 関数名ofd_ysection
機能Y方向の区間区切り位置を指定します。
宣言void ofd_ysection(int n, ...);
引数 n : Y方向の区間区切り位置の数(=Y方向の区間数+1)
... : Y方向の区間区切り位置(n個のdouble型数値)
18 関数名ofd_zsection
機能Z方向の区間区切り位置を指定します。
宣言void ofd_zsection(int n, ...);
引数 n : Z方向の区間区切り位置の数(=Z方向の区間数+1)
... : Z方向の区間区切り位置(n個のdouble型数値)
19 関数名ofd_xdivision
機能X方向の区間分割数を指定します。
宣言void ofd_xdivision(int n, ...);
引数 n : X方向の区間数
... : X方向の区間分割数(n個のint型整数)
20 関数名ofd_ydivision
機能Y方向の区間分割数を指定します。
宣言void ofd_ydivision(int n, ...);
引数 n : Y方向の区間数
... : Y方向の区間分割数(n個のint型整数)
21 関数名ofd_zdivision
機能Z方向の区間分割数を指定します。
宣言void ofd_zdivision(int n, ...);
引数 n : Z方向の区間数
... : Z方向の区間分割数(n個のint型整数)
22 関数名ofd_material
機能物性値を追加します。複数回呼び出し可。
宣言void ofd_material(double epsr, double esgm, double amur, double msgm, const char comment[]);
引数 epsr : 比誘電率
esgm : 導電率[S/m]
amur : 比透磁率
msgm : 導磁率[1/Sm]
comment : コメント(不要なときは"")
備考 入力した順に物性値番号2,3,...が与えられます。 真空(=0)と完全導体(PEC)(=1)は予め登録されていますので不要です。
23 関数名ofd_geometry
機能幾何形状を追加します。複数回呼び出し可。
宣言void ofd_geometry(int m, int g, double x1, double x2, double y1, double y2, double z1, double z2);
引数 m : 物性値番号(0以上、ofd_material関数で指定されたもの)
g : 幾何形状番号
x1 : X座標下限
x2 : X座標上限
y1 : Y座標下限
y2 : Y座標上限
z1 : Z座標下限
z2 : Z座標上限
備考 幾何形状番号の意味は以下の通りです。詳しくは5.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 関数名ofd_name
機能直前に呼び出した幾何形状に名前を与えます。オプションです。
宣言void ofd_name(const char name[]);
引数 name : 名前
備考 本関数はデータの管理に使用するものであり、計算結果に影響を与えません。
25 関数名ofd_feed
機能給電点を設定します。必須です。複数回呼び出し可。
宣言void ofd_feed(char dir, double x, double y, double z, double volt, double delay, double z0);
引数 dir : 給電の向き('X', 'Y', 'Z'のいずれか)
x : 給電点のX座標
y : 給電点のY座標
z : 給電点のZ座標
volt : 給電電圧[V]
delay : 時間遅れ[sec]
z0 : 給電線の特性インピーダンス[Ω]
備考 実際に計算に使用される給電点の位置は、 指定した位置に最も近い向きの一致するYee格子電界点です。
26 関数名ofd_point
機能Sパラメーター計算用の観測点を追加します。複数回呼び出し可。
宣言void ofd_point(char dir, double x, double y, double z, const char prop[]);
引数 dir : 電界の向き('X', 'Y', 'Z'のいずれか)
x : 観測点のX座標
y : 観測点のY座標
z : 観測点のZ座標
prop : 第1観測点での伝搬方向("+X", "-X", "+Y", "-Y", "+Z", "-Z"のいずれか)
備考 実際に計算に使用される給電点の位置は、 指定した位置に最も近い向きの一致するYee格子電界点です。
27 関数名ofd_rfeed
機能給電点に内部抵抗を設定します。オプションです。
宣言void ofd_rfeed(double r);
引数 r : 内部抵抗[Ω]
備考 反復計算の加速に使用します。
複数の給電点があるときはすべての給電点に適用されます。
28 関数名ofd_pulsewidth
機能パルス幅を指定します。オプションです。
宣言void ofd_pulsewidth(double tw);
引数 tw : バルス幅[sec]
備考 通常、既定値で十分です。
29 関数名ofd_timestep
機能タイムステップを指定します。オプションです。
宣言void ofd_timestep(double dt);
引数 dt : タイムステップ幅[sec]
備考 通常、既定値で十分です。
30 関数名ofd_frequency1
機能給電点・観測点の周波数を指定します。必須です。
宣言void ofd_frequency1(double fstart, double fend, int div);
引数 fstart : 開始周波数[Hz]
fend : 終了周波数[Hz]
div : 周波数分割数
備考 単一周波数のときはfstart=fend, div=0として下さい。
31 関数名ofd_frequency2
機能遠方界・近傍界の周波数を指定します。必須です。
宣言void ofd_frequency2(double fstart, double fend, int div);
引数 fstart : 開始周波数[Hz]
fend : 終了周波数[Hz]
div : 周波数分割数
備考 単一周波数のときはfstart=fend, div=0として下さい。
32 関数名ofd_solver
機能反復計算条件を指定します。オプションです。
宣言void ofd_solver(int maxiter, int nout, double converg);
引数 maxiter : 最大反復回数
nout : 収束判定間隔=出力間隔
converg : 収束判定条件(通常1e-3)
備考 本関数を呼び出さないときは適当な既定値が設定されますが、収束状況を見て適当に設定することが大切です。
33 関数名ofd_pml
機能吸収境界条件にPMLを指定します。オプションです。
宣言void ofd_pml(int l, double m, double r0);
引数 l : PML層数L
m : PML次数M
r0 : PML反射係数R0
備考 推奨値はl=5, m=2, r0=1e-5です。
本関数を呼び出さないときは吸収境界条件はMur一次になります。
34 関数名ofd_plotiter
機能収束状況を図形出力します。オプションです。
宣言void ofd_plotiter(int i);
引数 i : 0/1=しない/する。既定値は1です。
35 関数名ofd_plotfreq
機能周波数特性の図形出力の項目を選択します。オプションです。
宣言void ofd_plotfreq(int i0, int i1, int i2, int i3, int i4);
引数 i0 : スミスチャートを図形出力します。
i1 : 入力インピーダンスを図形出力します。
i2 : 入力アドミッタンスを図形出力します。
i3 : 反射損失を図形出力します。
i4 : Sパラメーターを図形出力します。
36 関数名ofd_plotfar1d
機能遠方界面上パターンを図形出力します。複数回呼び出し可。
宣言void ofd_plotfar1d(char dir, int div, double angle);
引数 dir : 遠方界面の向き('X', 'Y', 'Z', 'V', 'H'のいずれか)
div : 360度の分割数
angle : dir='V'のときの一定角φ[度]、dir='H'のとき一定角θ[度]、それ以外はダミー
備考 dir='X' : X面すなわちYZ面
dir='Y' : Y面すなわちZX面
dir='Z' : Z面すなわちXY面
dir='V' : φ一定の垂直断面(θ=0-360度)
dir='H' : θ一定の水平断面(φ=0-360度)
37 関数名ofd_far1dstyle
機能遠方界面上パターンの図形出力の表示法を指定します。オプションです。
宣言void ofd_far1dstyle(int i0);
引数 i0 : 0=円プロット、1=XYプロット。既定値は0です。
38 関数名ofd_far1dcomponent
機能遠方界面上パターンの図形出力の成分を選択します。オプションです。
宣言void ofd_far1dcomponent(int i0, int i1, int i2);
引数 i0=1 : θ成分とφ成分を図形出力します。
i1=1 : 楕円偏波の主軸と副軸を図形出力します。
i2=1 : 左右円偏波成分を図形出力します。
備考 本関数を呼び出さないときはi0=1, i1=0, i2=0になります。
39 関数名ofd_far1ddb
機能遠方界面上パターンの図形出力の単位を指定します。オプションです。
宣言void ofd_far1ddb(int i0);
引数 i0 : 0=線形、1=dB
備考 本関数を呼び出さないときは単位はdBです。
40 関数名ofd_far1dscale
機能遠方界面上パターンの図形出力のスケールを指定します。オプションです。
宣言void ofd_far1dscale(double min, double max, int div);
引数 min : 最小値
max : 最大値
div : 分割数
備考 本関数を呼び出さないときはスケールは自動設定されます。
41 関数名ofd_plotfar2d
機能遠方界全方向パターンを図形出力します。
宣言void ofd_plotfar2d(int divtheta, int divphi);
引数 divtheta : θ方向(0-180度)の分割数
divphi : φ方向(0-360度)の分割数
備考 本関数は1回だけ有効です。
42 関数名ofd_far2dcomponent
機能遠方界全方向パターンの図形出力の成分を選択します。オプションです。
宣言void ofd_far2dcomponent(int i0, int i1, int i2, int i3, int i4, inti5, int i6);
引数 i0=1 : 絶対値を図形出力します。
i1=1 : θ成分を図形出力します。
i2=1 : φ成分を図形出力します。
i3=1 : 楕円偏波の主軸を図形出力します。
i4=1 : 楕円偏波の副軸を図形出力します。
i5=1 : 右旋円偏波成分を図形出力します。
i6=1 : 左旋円偏波成分を図形出力します。
備考 本関数を呼び出さないときは i0=1, i1=0, i2=0, i3=0, i4=0, i5=0, i6=0 になります。
43 関数名ofd_far2ddb
機能遠方界全方向パターンの図形出力の単位を指定します。オプションです。
宣言void ofd_far2ddb(int i0);
引数 i0 : 0=線形、1=dB
備考 本関数を呼び出さないときは単位はdBです。
44 関数名ofd_far2dscale
機能遠方界全方向パターンの図形出力のスケールを指定します。オプションです。
宣言void ofd_far2dscale(double min, double max);
引数 min : 最小値
max : 最大値
備考 本関数を呼び出さないときはスケールは自動設定されます。
45 関数名ofd_plotnear1d
機能近傍界観測線を追加します。複数回呼び出し可。
宣言void ofd_plotnear1d(char component, char dir, double p1, double p2);
引数 component : 計算する成分('E', 'H'のどちらか)
dir : 観測線の向き('X', 'Y', 'Z'のいずれか)
p1, p2 : 観測線の座標、向きがXのときはY,Z座標、向きがYのときはZ,X座標、向きがZのときはX,Y座標
46 関数名ofd_near1ddb
機能近傍界線上分布図の単位を指定します。オプションです。
宣言void ofd_near1ddb(int i0);
引数 i0 : 0=線形、1=dB
備考 本関数を呼び出さないときは単位は線形です。
47 関数名ofd_near1dscale
機能近傍界線上分布図のスケールを指定します。オプションです。
宣言void ofd_near1dscale(double min, double max, int div);
引数 min : 最小値
max : 最大値
div : 分割数
備考 本関数を呼び出さないときはスケールは自動設定されます。
48 関数名ofd_plotnear2d
機能近傍界観測面を追加します。複数回呼び出し可。
宣言void ofd_plotnear2d(const char component[], char dir, double p);
引数 component : 計算する成分("E", "Ex", "Ey", "Ez", "H", "Hx", "Hy", "Hz"のいずれか)
dir : 観測面の向き('X', 'Y', 'Z'のいずれか)
p : 観測面の座標
49 関数名ofd_near2ddb
機能近傍界面上分布図の単位を指定します。オプションです。
宣言void ofd_near2ddb(int i0);
引数 i0 : 0=線形、1=dB
備考 本関数を呼び出さないときは単位は線形です。
50 関数名ofd_near2dscale
機能近傍界面上分布図のスケールを指定します。オプションです。
宣言void ofd_near2dscale(double min, double max, int div);
引数 min : 最小値
max : 最大値
div : 分割数
備考 本関数を呼び出さないときはスケールは自動設定されます。
51 関数名ofd_near2dobj
機能近傍界面上分布図に物体を描くか。オプションです。
宣言void ofd_near2dobj(int i0);
引数 i0 : 0=描かない、1=描く。既定値は1です。
52 関数名ofd_window2d
機能図形出力のウィンドウサイズとフォントサイズを指定します。オプションです。
宣言void ofd_window2d(int w, int h, int font);
引数 w : ウィンドウの幅(ピクセル)
h : ウィンドウの高さ(ピクセル)
font : フォントサイズ(ピクセル)
備考 既定値はw=750, h=500, font=15です。
53 関数名ofd_window3d
機能図形出力3Dウィンドウの大きさと初期視点を指定します。オプションです。
宣言void ofd_window3d(int w, int h, double theta, double phi);
引数 w : ウィンドウの幅(ピクセル)
h : ウィンドウの高さ(ピクセル)
theta : 初期視点のθ[度]
phi : 初期視点のφ[度]
備考 既定値は w=500, h=500, theta=60, phi=30 です。
54 関数名ofd_outdat
機能出力ファイル名を指定します。必須です。
宣言void ofd_outdat(const char file[]);
引数 file : 出力ファイル名。拡張子は".ofd"推奨。

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

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


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

OpenFDTDデータ作成ライブラリ、サンプルプログラム1

コンパイル+実行:
Windows + VC++:
> cl /Ox sample1.c ofd_datalib.c
> sample1.exe
Linux + gcc
$ gcc -O sample1.c ofd_datalib.c -o sample1
$ ./sample1
*/

#include "ofd_datalib.h"

int main()
{
	// initialize

	ofd_init();

	// title

	ofd_title("sample1");

	// mesh

	ofd_xsection(2, -50e-3, +50e-3);
	ofd_xdivision(1, 20);

	ofd_ysection(2, -50e-3, +50e-3);
	ofd_ydivision(1, 20);

	ofd_zsection(4, -75e-3, -25e-3, +25e-3, +75e-3);
	ofd_zdivision(3, 10, 11, 10);

	// material

	ofd_material(2.0, 0.0, 1.0, 0.0, "");   // not used

	// geometry

	ofd_geometry(1, 1, 0e-3, 0e-3, 0e-3, 0e-3, -25e-3, +25e-3);
	ofd_name("dipole");

	// feed

	ofd_feed('Z', 0e-3, 0e-3, 0e-3, 1, 0, 50);
	//ofd_rfeed(10);

	// ABC

	ofd_pml(5, 2, 1e-5);

	// frequency

	ofd_frequency1(2e9, 3e9, 10);
	ofd_frequency2(3e9, 3e9, 0);

	// solver

	ofd_solver(1000, 100, 1e-3);

	// iteration

	ofd_plotiter(1);

	// frequency

	ofd_plotfreq(1, 1, 1, 1, 1);

	// far1d field

	ofd_plotfar1d('X', 36, 0);

	// far2d field

	ofd_plotfar2d(18, 36);

	// near1d field

	ofd_plotnear1d('E', 'Z', 30e-3, 0e-3);

	// near2d field

	ofd_plotnear2d("E", 'X', 30e-3);

	// output options

	//ofd_far1dstyle(1);
	//ofd_far1dcomponent(1, 0, 0);
	//ofd_far1ddb(1);
	//ofd_far1dscale(-30, +10, 4);
	//ofd_far2dcomponent(1, 0, 0, 0, 0, 0,0);
	//ofd_far2ddb(1);
	//ofd_far2dscale(-30, +10);
	//ofd_near1ddb(1);
	//ofd_near1dscale(-30, +10, 4);
	//ofd_near2ddb(1);
	//ofd_near2dscale(-30, +10, 0);
	//ofd_near2dobj(1);
	//ofd_window2d(600, 400, 12);
	//ofd_window3d(500, 500, 60, 30);

	// output

	ofd_outdat("sample1.ofd");

	return 0;
}

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

Windows+VC++の場合

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


リスト5-8-2 データ作成ライブラリのサンプルデータ
OpenFDTD 2 1
title = sample1
xmesh = -5.000000e-02 20 5.000000e-02
ymesh = -5.000000e-02 20 5.000000e-02
zmesh = -7.500000e-02 10 -2.500000e-02 11 2.500000e-02 10 7.500000e-02
material = 2 0 1 0
geometry = 1 1 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -2.500000e-02 2.500000e-02
name = dipole
feed = Z 0.000000e+00 0.000000e+00 0.000000e+00 1 0 50
abc = 1 5 2.00 1.00e-05
frequency1 = 2.000e+09 3.000e+09 10
frequency2 = 3.000e+09 3.000e+09 0
solver = 1000 100 1.00e-03
plotiter = 1
plotfreq = 1 1 1 1 1
plotfar1d = X 36
far1dstyle = 0
far1dcomponent = 1 0 0
far1ddb = 1
plotfar2d = 18 36
far2dcomponent = 1 0 0 0 0 0 0
far2ddb = 1
plotnear1d = E Z 3.000000e-02 0.000000e+00
near1ddb = 0
plotnear2d = E X 3.000000e-02
near2ddb = 0
near2dobj = 1
end

バッチ処理
データ作成ライブラリを使用すると、パラメーターを変えて複数回の計算を行うことができます。
リスト5-8-2にサンプルプログラムを示します。
ダイポールアンテナと反射板の距離を変えながら繰り返し計算を行っています。
計算を実行するにはシステム関数"system"を使用して下さい。 また、ここでは図形出力ファイル"ev2d.htm"の名前を変え、 ログファイル"ofd.log"を一つのファイルに結合しています。
実行プログラムのオプションと出力ファイルの処理は適当に変更して下さい。


リスト5-8-2 バッチ処理用サンプルプログラム
/*
sample2.c

OpenFDTDデータ作成ライブラリ、サンプルプログラム No.2

コンパイル+実行:
Windows + VC++:
> cl /Ox sample2.c ofd_datalib.c
> sample2.exe
Linux + gcc
$ gcc -O sample2.c ofd_datalib.c -o sample2
$ ./sample2
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "ofd_datalib.h"

// nearest integer
#define nint(s, d) ((int)((s) / (d) + 0.5))

int main()
{
	double x1, x2;
	double y1, y2, y3;
	double z0, z1, z2, z3, z4, z5;
	char   str[BUFSIZ], cmd[BUFSIZ];
	const double d = 5e-3;		// cell size
	const int    oc = 5;		// outer cells
	const char name[] = "sample2";

	// delete output file

	sprintf(str, "%s.log", name);
	remove(str);

	// loop

	for (int loop = 0; loop < 5; loop++) {

		// initialize

		ofd_init();

		// title

		sprintf(str, "%s_%03d", name, loop);
		ofd_title(str);

		// mesh

		x1 = -(3 + loop) * d;
		x2 = 0e-3;
		ofd_xsection(4, x1 - (oc * d), x1, x2, x2 + (oc * d));
		ofd_xdivision(3, oc, nint(x2 - x1, d), oc);

		y1 = -50e-3;
		y2 = 0e-3;
		y3 = +50e-3;
		ofd_ysection(5, y1 - (oc * d), y1, y2, y3, y3 + (oc * d));
		ofd_ydivision(4, oc, nint(y2 - y1, d), nint(y3 - y2, d), oc);

		z0 = -75e-3;
		z1 = -50e-3;
		z2 = -25e-3;
		z3 = +25e-3;
		z4 = +50e-3;
		z5 = +75e-3;
		ofd_zsection(6, z0, z1, z2, z3, z4, z5);
		ofd_zdivision(5, 5, 5, 11, 5, 5);

		// geometry

		ofd_geometry(1, 1, x2, x2, y2, y2, z2, z3);
		ofd_name("dipole");

		ofd_geometry(1, 1, x1, x1, y1, y3, z1, z4);
		ofd_name("reflector");

		// feed

		ofd_feed('Z', x2, y2, 0e-3, 1, 0, 50);

		// frequency

		ofd_frequency1(2e9, 3e9, 10);
		ofd_frequency2(3e9, 3e9, 0);

		// solver

		ofd_solver(1000, 100, 1e-3);

		// far1d field

		ofd_plotfar1d('Z', 72, 0);

		// output

		sprintf(str, "%s_%03d.ofd", name, loop);
		ofd_outdat(str);

		// run

#ifdef _WIN32
		sprintf(cmd, "ofd.exe -n 4 %s", str);
#else
		sprintf(cmd, "./ofd -n 4 %s", str);
#endif
		system(cmd);

		// rename ev2d.htm

		sprintf(str, "%s_%03d.htm", name, loop);
		remove(str);
		rename("ev2d.htm", str);

		// append ofd.log

#ifdef _WIN32
		sprintf(cmd, "type ofd.log >> %s.log", name);
#else
		sprintf(cmd, "cat ofd.log >> %s.log", name);
#endif
		system(cmd);
	}

	return 0;
}