目次

8. 最適設計ツール

OpenMOMを用いたアンテナの最適設計ツールです。
ソースコードはarm/フォルダにあります。

(1) コンパイル法

Microsoft Visual Studio と Microsoft MPI がインストールされているものとします。
コマンドプロンプトでarmフォルダに移動した後、下記のコマンドを実行します。

> nmake.exe clean
> nmake.exe
(注):
コマンドプロンプトで実行するには環境変数PATH,LIB,INCLUDEの設定が必要ですが、
スタート→Visual Studio 2022→x64 Native Tools Command Prompt for VS 2022
をクリックすると環境変数が設定されたコマンドプロンプトが起動されます。

(2) 実行法

コマンドプロンプトでarmフォルダに移動した後、下記のコマンドを実行します。

> ./arm.exe [nthread nrepeat nloop seed1 seed2] (1プロセスのとき)
> mpiexec.exe -n <nprocess> ./arm.exe [nthread nrepeat nloop seed1 seed2] (マルチプロセスのとき)

ここで引数の意味は以下の通りです。
nthread : OpenMPで並列計算するスレッド数
nrepeat : 試行回数
nloop : 反復回数
seed1, seed2 : 乱数の種 = seed1 + (試行番号 * seed2)
nprosess : MPIのプロセス数

例えば以下のようになります。

> ./arm.exe (1プロセス、ソースコードに記入された引数を使用するとき)
> ./arm.exe 8 32 3000 1000 500 (1プロセス、8コアのとき、8スレッド)
> mpiexec.exe -n 8 ./arm.exe (8プロセス、ソースコードに記入された引数を使用するとき)
> mpiexec.exe -n 8 ./arm.exe 1 32 3000 1000 500 (8プロセス、8コアのとき、各1スレッド)
> mpiexec.exe -hosts 2 localhost 8 PC2 8 ./arm.exe 1 32 3000 1000 500 (8コア(自PC)+8コア(ホスト名:PC2)の2ノードのとき)
・コア数が限られているときはMPIのプロセス数に配分したほうが計算時間が短くなります。
・MPIを用いるときはプロセス数は試行回数の約数であるとき効率よく計算することができます。
・スレッド数、プロセス数は何であっても正しく計算されますが計算時間に差が出ます。
・複数ノードを使用するときはOpenFDTDを参考にしてください。

(3) 計算例

最初に計算モデルに合わせてソースコードを下記の例のように編集します。
Main.c

	// frequency
	double freq0 = 3.0e9; 開始周波数
	double freq1 = 3.0e9; 終了周波数
	int freqdiv = 0; 周波数分割数
getvalue.c
	double f = 0; 目的関数値
	// gain
	f -= gain(ifreq, theta, phi, pol, db); 利得
	// input impedanece
	f += 0.03 * zindiff(ifeed, ifreq, z0); 入力インピーダンス
その後、(1)に従ってコンパイルし、(2)に従って実行します。
計算を実行するとコンソールに以下のような経過が表示され、 計算が終了すると最適形状のファイルarm.omm(OpenMOM用), arm.ofd(OpenFDTD用)が出力されます。
> mpiexec.exe -n 8 ./arm.exe 1 32 3000 1000 500
ARM Version 1.0.0
nprocess=8 nthread=1 (SSE) プロセス数とスレッド数 (使用したSIMD)
nrepeat=32 nloop=3000 seed(2)=1000,500 segment=220*2 nfrequency=1 試行回数、反復回数、乱数その他
  0   1* -11.810552 (2891, 105) プロセス番号、試行番号、目的関数値最小値(そのときの反復番号とON線分数)
  4   5* -11.806494 (1620, 108)
  2   3* -10.526569 (2394, 115)
  6   7* -13.021080 (2194, 124)
  7   8* -11.798318 (2665, 121)
  1   2* -12.006064 (1872, 118)
  5   6* -13.424585 (2782, 123)
  3   4* -12.411922 (2242, 126)
  0   9  -11.723332 (2559, 118)
  4  13* -12.456968 (2222, 120)
  1  10* -12.218752 (2972, 117)
  2  11* -12.315256 (2234, 120)
  3  12* -12.418524 (1928, 110)
  6  15  -10.712554 (1759, 119)
  7  16* -12.846009 (2958, 130)
  5  14  -11.574866 (1032, 126)
  0  17* -12.172508 (1307, 115)
  6  23  -11.268671 (1428, 97)
  4  21  -11.359669 (1024, 115)
  1  18  -11.571979 (2273, 123)
  7  24  -12.778628 (1961, 104)
  3  20  -12.372831 (1102, 116)
  2  19  -10.858554 (2590, 126)
  5  22  -13.007562 (1717, 117)
  4  29  -11.846949 (1658, 105)
  6  31  -12.672050 (2977, 115)
  0  25* -13.375415 (1907, 119)
  1  26  -11.937270 (2558, 115)
  7  32  -12.699960 (2945, 114)
  5  30  -12.918185 (2298, 111)
  3  28* -13.119262 (2599, 130)
  2  27  -11.548137 (1056, 122)
fmin = -13.424585 目的関数最小値
output : arm.omm, arm.ofd 出力されたファイル
cpu time = 134.377 [sec] 計算時間
試行番号に*がついているものはそのプロセスで目的関数が最小を更新したことを表します。
計算時間については以下のような関係があります。
計算時間 ∝ 試行回数 * 反復回数 * 周波数数 / (スレッド数 * プロセス数)

出力されたarm.ommをOpenMOMで開いて計算すると図8-1のような図形出力が得られます。


図8-1 放射パターン