目次

6. プログラムの使用法

6.1 プログラムのインストール

ファイル dlfwd.zip をダウンロードして、 適当なフォルダに展開してください。ファイル構成は以下の通りです。

  1. dl/ : 深層学習(Python)
  2. mom/ : モーメント法、学習データ作成と最適設計(Python)
  3. mom_c/ : モーメント法、学習データ作成(C)
  4. fdtd/ : FDTD法、学習データ作成と最適設計(Python)
  5. fdtd_c/ : FDTD法、学習データ作成(C)

作業はIDE(統合開発環境)かコマンドラインで行います。 ここではコマンドラインで説明しますが、 IDEを使用すると効率よく作業をすることができます。

6.2 モーメント法の使用法

図6-1にモーメント法のシステム構成図を示します。


図6-1 モーメント法のシステム構成図

6.2.1 学習データの作成(C)

● パラメーター入力
フォルダmom_cにあるMain.cを表6-1のように編集します。

表6-1 学習データ作成プログラムのパラメーターの編集(C)

	// 計算パラメーター(read only, 計算の途中で変わらない)
	Ndata   = 10000;   // データ数
	Ly      = 100e-3;  // Y方向全長
	Lz      = Ly;      // Z方向全長
	Ny      = 10;      // Y方向セル数
	Nz      = Ny;      // Z方向セル数
	My      = 1;       // Y方向要素分割数
	Mz      = My;      // Z方向要素分割数
	iGND    = 1;       // 1=X面グラウンド板
	Hgt     = 20e-3;   // グラウンド板からの高さ
	NFreq   = 1;       // 周波数数
	Freq[0] = 3.0e9;   // 開始周波数
	Freq[1] = 3.0e9;   // 終了周波数
	Rad     = 0.2 * Ly / Ny / My;  // 導線半径
	gRatio  = 0.5;     // アンテナ占有比
	Nff[0]  = 40;      // 遠方界φ分割数
	Nff[1]  = 40;      // 遠方界θ分割数
	Lff[0]  = 180;     // 遠方界φ範囲
	Lff[1]  = 180;     // 遠方界θ範囲
	Nnf[0]  = 26;      // 近傍界Y方向分割数
	Nnf[1]  = Nnf[0];  // 近傍界Z方向分割数
	Pnf[0]  = 60e-3;   // 近傍界X座標
	Pnf[1]  = -130e-3; // 近傍界Y座標始点
	Pnf[2]  = -Pnf[1]; // 近傍界Y座標終点
	Pnf[3]  = Pnf[1];  // 近傍界Z座標始点
	Pnf[4]  = Pnf[2];  // 近傍界Z座標終点
	Lsize   = 1;       // 出力ファイルラベルバイト数(1/2/4. 通常2)
	iRand   = 4;       // 乱数の種類(1/2/3/4)

● 学習データ作成プログラムのビルド
プログラムをビルドするコマンドは以下の通りです。

$ nmake.exe -f Makefile_cl   (Windows)
$ make -f Makefile_gcc  (LinuxまたはWSL2)

● 学習データ作成プログラムの実行
プログラムを実行するコマンドは以下の通りです。
第1行はソースコード中のデータ数、スレッド数、出力ファイルを使用するときです。 第2行はこれらを引数で指定する方法、第3行はその一例です。
なお、Cでは出力ファイルの拡張子を".bin"としてください。
計算時間はデータ数に比例し、スレッド数に反比例します。

$ mom
$ mom -d データ数 -n スレッド数 -o 出力ファイル
$ mom -d 10000 -n 8 -o 10000.bin

● 学習データ作成プログラムの標準出力
学習データ作成プログラムのを実行すると以下のような標準出力が行われます。

MOM data=1000 Ny=10 Nz=10 My=1 Mz=1 GND=1 F=1 far=40x40 near=26x26
thread=8 memory=55MB output=mom.bin(13MB)
0
average of far field =   0.359676
average of near E, Z0*H [V/m] =   1.459778   1.397290
average of input impedance [ohm] =   219.599    83.313j
CPU time = 4.353 sec

● 学習データ作成プログラムの図形出力
ソースコードMain.cのfig1,fig2,fig3を1とするとデバッグ用の図形が出力されます。 以下のコマンドにより図3-2~図3-4の図形が表示されます。 2次元ビューワーev2d.exeはOpenMOMに付属するファイルをコピーしてください。

$ ev2d.exe fig1.ev2
$ ev2d.exe fig2.ev2
$ ev2d.exe fig3.ev2

6.2.2 学習データの作成(Python)

● パラメーター入力
フォルダmomにあるmom.pyを表6-2のように編集します。

表6-2 学習データ作成プログラムのパラメーターの編集(Python)

    # パラメーター(read only, 計算の途中で変わらない)
    # 学習と最適設計で同じにする
    Param = {
        # 計算
        'Ly':     100e-3,   # Y方向全長
        'Lz':     100e-3,   # Z方向全長
        'Ny':     10,       # Y方向セル数
        'Nz':     10,       # Z方向セル数
        'My':     1,        # Y方向要素分割数
        'Mz':     1,        # Z方向要素分割数
        'iGND':   1,        # 1=X面グラウンド板
        'Hgt':    20e-3,    # グラウンド板からの高さ
        'Freq':   [3.0e9, 3.0e9, 1],  # 周波数(開始,終了,数)
        'Rad':    2.0e-3,   # 導線半径
        'gRatio': 0.5,      # 初期アンテナ占有率
        'Lsize':  1,        # 出力ファイルラベルバイト数(2/4. 通常2)
        # 遠方界
        'Nff':    [40, 40],        # φ/θ分割数
        'Lff':    [180.0, 180.0],  # φ/θ範囲
        # 近傍界
        'Nnf':    [26, 26],        # Y/Z分割数
        'Pnf':    [60e-3, -130e-3, 130e-3, -130e-3, 130e-3],  # X,Y0,Y1,Z0,Z1
    }

● 学習データ作成プログラムの実行
学習データ作成プログラムを実行するにはIDEで実行するか、 以下のコマンドのどちらかを実行してください。 データ数はNdata、スレッド数はNthread、出力ファイルはbinFileで指定してください。 なお、Pythonでは出力ファイルの拡張子を".npz"としてください。
計算時間はデータ数に比例し、スレッド数に反比例します。

$ python mom.py  (mom.pyでMODE=1としたとき)
$ python mom.py 1

● 学習データ作成プログラムの標準出力
学習データ作成プログラムのを実行すると以下のような標準出力が行われます。

MOM data=1000 Ny=10 Nz=10 My=1 Mz=1 GND=1 F=1 far=40x40 near=26x26
thread=8 memory=55MB output=mom.npz(13MB)
0
average of far field =   0.359366
average of near E, Z0*H [V/m] =   1.431761   1.370430
average of input impedance [ohm] =   227.946   106.901j
CPU time = 17.213 sec

● 学習データ作成プログラムの図形出力
ソースコードdata.pyのfig1,fig2,fig3を1とすると,、 デバッグ用に図3-2~図3-4の図形が出力されます。

6.2.3 学習

● 学習パラメーターの編集
フォルダdlにあるdl.pyを表6-3のように編集します。

表6-3 学習パラメーターの編集

    # 入力: 計算結果ファイル名(image=アンテナ形状, label=遠方界+近傍界+入力インピーダンス)
    datafile = '../mom_c/mom.bin'
    #datafile = '../mom/mom.npz'
    #datafile = '../fdtd_c/fdtd.bin'
    #datafile = '../fdtd/fdtd.npz'

    # 引数処理 $ python dl.py [1/2/3 [datafile]]
    Ltype = 1  # 学習対象: 1=遠方界, 2=近傍界, 3=入力インピーダンス
    if len(argv) > 1:
        Ltype = int(argv[1])
    if len(argv) > 2:
        datafile = argv[2]
    assert (Ltype ≥ 1) and (Ltype ≤ 3)

    # モデル設定
    if   Ltype == 1:
        # 遠方界
        model = models.resnet34(weights=None)
        resize = 112        # image resize
        criterion = nn.MSELoss()
        modelfile = 'far.pth'
    elif Ltype == 2:
        # 近傍界
        model = models.resnet34(weights=None)
        resize = 112        # image resize
        criterion = nn.MSELoss()
        modelfile = 'near.pth'
    elif Ltype == 3:
        # 入力インピーダンス
        model = models.resnet34(weights=None)
        resize = 112        # image resize
        criterion = nn.MSELoss()
        modelfile = 'zin.pth'

    # 学習パラメーター
    load_model = 0     # 通常0, 前回保存したmodelfileからrestartするときは1
    save_model = 1     # 通常1, 計算終了時にmodelfileを保存しないときは0
    ndata = -1         # データ数, -1のときはすべてのデータ
    batch_size = 60    # バッチサイズ(通常50-100程度)
    num_epochs = 20    # エポック数

● 学習プログラムの実行
学習プログラムを実行するにはIDEで実行するか、以下のコマンドを実行してください。
第1行はソースコードで指定した学習対象と学習データファイルを使用するときです。
第2行以下は学習対象を引数で指定するときです。 このとき学習データファイルも引数で指定することができます。

$ python dl.py
$ python dl.py 1 [学習データファイル]   遠方界を学習するとき
$ python dl.py 2 [学習データファイル]   近傍界を学習するとき
$ python dl.py 3 [学習データファイル]   入力インピーダンスを学習するとき

● 学習プログラムの標準出力
学習プログラムを実行すると以下のような標準出力が行われます。
プログラムが終了するとモデルファイル(拡張子.pth)と、 結果確認用の図形データ(label.npz)が出力されます。

Load ../mom_c/mom.bin (2026-03-26 09:31:51, 139MB)
data=7947+2053=10000 1 1x10x10->1x112x112 label=6400 batch=60 epochs=20
   0 10.62057      1.4(  1.4)[sec]
   1 0.35970      7.4(  5.9)[sec]
(略)
  19 0.25851    111.4(  5.8)[sec]
  20 0.25797    117.2(  5.7)[sec]
min  0.25797
Save far.pth (93MB)
Save label.npz (1000, 48MB)

● 学習プログラムの図形出力
学習プログラムが終了した後、以下のコマンドを実行すると、 label.npzファイルを読み込んで図4-2または図4-3の図形出力が行われます。 ここで学習結果を確認することができます。

$ python post.py

6.2.4 アンテナの最適設計

● 最適設計パラメーターの編集
フォルダmomにあるmom.pyを表6-4のように編集します。

表6-4 最適設計パラメーターの編集

        # モデルファイル
        modelFile1 = '../dl/far.pth'    # 遠方界
        modelFile2 = '../dl/near.pth'   # 近傍界
        modelFile3 = '../dl/zin.pth'    # 入力インピーダンス
        # (1) 遠方界, 目的関数パラメーター
        # 重み, θ[度], φ[度], 成分=0...6:E,Eθ,Eφ,major,minor,RHCP,LHCP, dB=0/1
        opt1 = (1,                         # 遠方界を評価するか(0/1)
            ((-1.0,  90.0,  0.0, 0, 1),    # 第1周波数, 第1項
        #     (-1.0,  90.0,  0.0, 0, 1),    # 第1周波数, 第2項 (不要なら削除, 必要なら追加)
            ),
        #    ((-1.0,  90.0,  0.0, 0, 1),    # 第2周波数, 第1項 (不要なら削除, 必要なら追加)
        #     (-1.0,  90.0,  0.0, 0, 1),    # 第2周波数, 第2項 (不要なら削除, 必要なら追加)
        #    ),
        )
        # (2) 近傍界, 目的関数パラメーター
        # 重み, Y座標, Z座標, 成分=0..7:E/Ex/Ey/Ez/H/Hx/Hy/Hz, dB=0/1  (X座標は学習時に指定されているので不要)
        opt2 = (0,                            # 近傍界を評価するか(0/1)
            ((-1.0, -60e-3,   0e-3, 0, 0),    # 第1周波数, 第1項
        #     (-1.0,  60e-3,   0e-3, 0, 0),    # 第1周波数, 第2項 (不要なら削除, 必要なら追加)
            ),
        #    ((-1.0,   0e-3, +60e-3, 0, 0),    # 第2周波数, 第1項 (不要なら削除, 必要なら追加)
        #     (-1.0,   0e-3, -60e-3, 0, 0),    # 第2周波数, 第2項 (不要なら削除, 必要なら追加)
        #    ),
        )
        # (3) 入力インピーダンス, 目的関数パラメーター
        # 重み, Rin, Xin
        opt3 = (0,                 # 入力インピーダンスを評価するか(0/1)
            (0.03, 100.0, 0.0),    # 第1周波数
        #    (0.03, 100.0, 0.0),    # 第2周波数(不要なら削除, 必要なら追加)
        )
        Nrepeat = 50   # 繰り返し数
        Nloop1  = 500  # 推論反復回数
        Nloop2  = 1    # 計算反復回数

opt1,opt2,opt3の最初のデータが1であるものを最適化します。 目的関数の1項目が1行になります。 各行は複数のパラメーターから成ります。 重みを0にしてその項を無効にすることもできます。
複数の周波数を学習したときは、複数の周波数で最適化するために、 周波数の数だけのブロックを並べます。

反復回数については以下の3通りの設定が考えられます。

表6-5 推論反復回数と計算反復回数の決め方
No.推論反復回数計算反復回数用途出力ファイル
1十分大きい0推論のみで最適化する、モデルの精度が十分よいときoptim1.omm
2十分大きい1推論で最適化した後、計算で正確な目的関数値を決めるoptim1.omm, optim2.omm
30十分大きい計算のみで最適化する、モデル不要、計算時間大optim2.omm

● 最適設計プログラムの実行
最適設計プログラムを実行するにはIDEで実行するか、 以下のコマンドのどちらかを実行してください。

$ python mom.py  (mom.pyでMODE=2としたとき)
$ python mom.py 2

● 最適設計プログラムの標準出力
最適設計プログラムを実行すると以下のような標準出力が行われます。
各行の内容は「繰り返し回数、最適値の得られた推論反復回数、推論最適値、最適値の得られた計算反復回数、計算最適値、推論最適値-計算最適値」です。
最適値が更新されたとき*が表示されます。 最後に推論(min-1)と計算(min-2)の最適値とその内訳が表示されます。
推論は推論反復回数が正のとき、計算は計算反復回数が正のとき出力されます。

optimization, 1,0,1, 50, 500+1
Load ../dl/far.pth (2026-04-04 17:10:58 93MB)
Load ../dl/zin.pth (2026-04-04 18:23:41 81MB)
   0  277   -2.292*    0   -2.112*   -0.180
   1  480   -2.644*    0   -2.197*   -0.447
(略)
  48  320   -2.420     0   -1.671    -0.748
  49  411   -1.968     0   -2.011     0.043
min-1:    -3.015
  0     3.049    99.773    -1.106
min-2:    -2.555
  0     2.822   106.062    -6.559
Save: optim1.omm
Save: optim2.omm
CPU time = 209.214 sec

● 最適設計プログラムの図形出力
optimize.pyファイルのmain関数の_outfig1,_outfig2行のコメントを削除して最適設計プログラムを実行すると、 プログラム終了時に図5-2、図5-3の図形が出力されます。

● 最適設計アンテナの出力
最適設計プログラムが終了すると最適形状アンテナのファイル optim1.omm, optim2.omm が出力されます。 (前者は推論反復回数が正のとき、後者は計算反復回数が正のとき)
これらをOpenMOMで開いて詳しい特性を見ることができます。

6.3 FDTD法の使用法

FDTD法についても、プログラムの構成と使い方はモーメント法と同じです。 momはfdtdに置き換えてください。
ここではモーメント法と異なる部分のみを説明します。

● 学習データ作成用パラメーターの編集(C)
フォルダfdtd_cにあるMain.cを表6-6のように編集します。

表6-6 学習データ作成用パラメーターの編集(C)

	// 計算パラメーター(read only, 計算の途中で変わらない)
	Ndata   = 100;     // データ数
	Dx      = 10e-3;   // X方向セルサイズ
	Dy      = Dx;      // Y方向セルサイズ
	Dz      = Dx;      // Z方向セルサイズ
	NAy     = 10;      // Y方向アンテナ要素数
	NAz     = NAy;     // Z方向アンテナ要素数
	MAy     = 1;       // Y方向要素分割数
	MAz     = MAy;     // Z方向要素分割数
	NSx     = 2;       // 基板厚さ(セル数)
	NGy     = 2;       // Y方向グラウンド板延長(セル数)
	NGz     = NGy;     // Z方向グラウンド板延長(セル数)
	NCx     = 5;       // +X方向スペース(セル数)
	NBx     = 6;       // X方向余白(セル数)
	NBy     = NBx;     // Y方向余白(セル数)
	NBz     = NBx;     // Z方向余白(セル数)
	Epsr    = 1.0;     // 基板比誘電率
	Esig    = 0.0;     // 基板導電率
	Amur    = 1.0;     // 基板比透磁率
	Msig    = 0.0;     // 基板導磁率
	NFreq   = 1;       // 周波数数
	Freq0   = 3.0e9;   // 開始周波数
	Freq1   = 3.0e9;   // 終了周波数
	gRatio  = 0.5;     // アンテナ占有率
	ABC     = 0;       // PML層数(0のときはMur一次)
	PML_m   = 2.0;     // PML次数
	PML_r0  = 1e-8;    // PML反射係数
	Niter   = 1000;    // タイムステップ数
	rFeed   = 10;      // 内部抵抗
	Nff[0]  = 40;      // 遠方界φ分割数
	Nff[1]  = 40;      // 遠方界θ分割数
	Lff[0]  = 180;     // 遠方界φ範囲
	Lff[1]  = 180;     // 遠方界θ範囲
	Pnf     = 60e-3;   // 近傍界X座標
	Lsize   = 1;       // 出力ファイルラベルバイト数(1/2/4. 通常2)
	iRand   = 4;       // 乱数の種類(1/2/3/4)

● 学習データ作成用パラメーターの編集(Python)
フォルダfdtdにあるfdtd.pyを表6-7のように編集します。

表6-7 学習データ作成用パラメーターの編集(Python)

    # パラメーター(read only, 計算の途中で変わらない)
    # 学習と最適設計で同じにする
    Param = {
        # 計算
        'Dx':     10e-3,      # X方向セルサイズ
        'Dy':     10e-3,      # Y方向セルサイズ
        'Dz':     10e-3,      # Z方向セルサイズ
        'NAy':    10,         # Y方向セル数
        'NAz':    10,         # Z方向セル数
        'MAy':    1,          # Y方向要素分割数
        'MAz':    1,          # Z方向要素分割数
        'NSx':    2,          # 基板厚さ(セル数)
        'NGy':    2,          # Y方向グラウンド板延長(セル数)
        'NGz':    2,          # Z方向グラウンド板延長(セル数)
        'NCx':    5,          # +X方向スペース(セル数)
        'NBx':    6,          # X方向空気余白(セル数)
        'NBy':    6,          # Y方向空気余白(セル数)
        'NBz':    6,          # Z方向空気余白(セル数)
        'Epsr':   1.0,        # 基板比誘電率
        'Esig':   0.0,        # 基板導電率
        'Amur':   1.0,        # 基板比透磁率
        'Msig':   0.0,        # 基板導磁率
        'Freq':   [3.0e9, 3.0e9, 1],  # 周波数(開始,終了,数)
        'rFeed':  10,         # 内部抵抗
        'ABC':    0,          # 0=Mur一次, L=PML層数>0
        'PML':    [2, 1e-8],  # PML: M,R0
        'Niter':  1000,       # 反復回数
        'gRatio': 0.5,        # 初期アンテナ占有率
        'Lsize':  1,          # 出力ラベルバイト数(1/2/4. 通常2)
        # 遠方界
        'Nff':    [40, 40],        # φ/θ分割数
        'Lff':    [180.0, 180.0],  # φ/θ範囲
        # 近傍界
        'Pnf':    [60e-3, 0, 0, 0, 0],  # X座標,Y始点終点,Z始点終点

● 学習データ作成プログラムのビルド
学習データ作成プログラムをビルドするコマンドは以下の通りです。 MPIに対応しており複数のコンピューターで並列計算することができます。

$ nmake.exe -f Makefile_cl   (Windows)
$ nmake.exe -f Makefile_cl_mpi   (Windows, MPI)
$ make -f Makefile_gcc  (LinuxまたはWSL2)
$ make -f Makefile_gcc_mpi  (LinuxまたはWSL2, MPI)

● 学習データ作成プログラムの実行
学習データ作成プログラムを実行するコマンドは以下の通りです。 下2行はMPIを使用するときです。

$ fdtd
$ fdtd -d データ数 -n スレッド数 -o 出力ファイル
$ fdtd -d 10000 -n 8 -o 10000.bin
$ mpiexec -n プロセス数 fdtd_mpi -d データ数 -n スレッド数 -o 出力ファイル
$ mpiexec -n 4 fdtd_mpi -d 10000 -n 8 -o 10000.bin