ファイル dlspa0.zip をダウンロードして、
適当なフォルダに展開してください。ファイル構成は以下の通りです。
図5-1にシステム構成図を示します。
ファイルMain.cを編集して計算条件を設定してください。単位はMKSAです。
リスト5-1 2次元版のデータ入力(Main.cの一部)
const int Itest = 0; // 0=学習, 1=テスト(通常0)
const int Ndata = 1000; // データ数
const int Nout = 4; // 外部領域セル数
const int Lant = 2; // アンテナ位置(対象領域境界からのセル数)
const int ABC = 4; // PML層数(0のときはMur一次)
const int Niter = 600; // タイムステップ数
const int Nant = 2; // アンテナ辺数(1/2)
const int Nsmot = 1; // 形状平滑化回数(0以上)
const int Mean[] = {2, 2}; // 形状平均個数(学習用:最小,最大,1/2/3/4)
const int Sdif = 1; // S行列差分(0/1)
const int Mx = 20; // Xセル数(内部)
const int My = 20; // Yセル数(内部)
const float Dx = 0.005f; // Xセルサイズ
const float Dy = 0.005f; // Yセルサイズ
const int Pant[] = {0, 1, 21}; // アンテナ位置(開始,間隔,個数)
const int Nobj[] = {1, 5}; // 誘電体数(学習用:最小,最大)
const int Lobj[][3] = {{1, 8, 0}, {1, 8, 0}}; // 誘電体XYセル数(学習用:最小,最大,余白)
const int NFreq = 1; // 周波数数
const float Freq0 = 3.0e9f; // 開始周波数
const float Freq1 = 3.0e9f; // 終了周波数
const float Eps0 = 1; // 背景媒質比誘電率
const float Sig0 = 0; // 背景媒質導電率[S/m]
const float Eps[] = {1.5f, 2.5f}; // 比誘電率(最小,最大)
const float Sig[] = {0.02f, 0.08f}; // 導電率[S/m](最小,最大)
リスト5-2 3次元版のデータ入力(Main.cの一部)
const int Itest = 0; // 0=学習, 1=テスト(通常0)
const int Ndata = 1000; // データ数
const int Nout = 4; // 外部領域セル数
const int Lant = 2; // アンテナ位置(対象領域境界からのセル数)
const int ABC = 4; // PML層数(0のときはMur一次)
const int Niter = 300; // タイムステップ数
const int Nsmot = 1; // 平滑化回数(0以上)
const int Mean[] = {2, 2}; // 形状平均個数(学習用:最小,最大,1/2/3/4)
const int Sdif = 1; // S行列差分(0/1)
const int Mx = 20; // Xセル数(内部)
const int My = 20; // Yセル数(内部)
const int Mz = 20; // Zセル数(内部)
const float Dx = 0.005f; // Xセルサイズ
const float Dy = 0.005f; // Yセルサイズ
const float Dz = 0.005f; // Zセルサイズ
const int Pant[][3] = {{2, 4, 5}, {2, 4, 5}, {2, 5, 4}}; // XYZアンテナ位置(開始,間隔,個数)
const int Nobj[] = {1, 6}; // 誘電体数(学習用:最小,最大)
const int Lobj[][3] = {{1, 10, 0}, {1, 10, 0}, {1, 10, 0}}; // 誘電体XYZセル数(学習用:最小,最大,余白)
const int NFreq = 1; // 周波数数
const float Freq0 = 3.0e9f; // 開始周波数
const float Freq1 = 3.0e9f; // 終了周波数
const float Eps0 = 1; // 背景媒質比誘電率
const float Sig0 = 0; // 背景媒質導電率[S/m]
const float Eps[] = {1.5f, 2.5f}; // 誘電率(最小,最大)
const float Sig[] = {0.02f, 0.08f}; // 導電率[S/m](最小,最大)
FDTDプログラムをビルドするには、
2次元モデルはfdtd2d/で3次元モデルはfdtd3d/で以下のコマンドを実行してください。
いくつかのファイルはfdtd2dとfdtd3dで共通なので、
先にfdtd2dを後にfdtd3dを同じ方法でビルドしてください。
| ビルドコマンド | OS | コンパイラー | 実行プログラム |
|---|---|---|---|
| $ nmake.exe -f Makefile_cl | Windows | cl.exe | fdtd2d.exe または fdtd3d.exe |
| $ nmake.exe -f Makefile_cl_mpi | Windows | cl.exe | fdtd2d.exe または fdtd3d.exe (MPI対応) |
| $ make -f Makefile_gcc | LinuxまたはWSL2 | gcc | fdtd2d または fdtd3d |
| $ make -f Makefile_gcc_mpi | LinuxまたはWSL2 | mpicc | fdtd2d または fdtd3d (MPI対応) |
FDTDプログラムはデータに関して独立した計算なので、
OpenMP(共有メモリー環境、スレッド並列)またはMPI(分散メモリー環境、プロセス並列)
で並列計算することができます。計算時間はスレッド数分の1、かつプロセス数分の1になります。
それぞれの環境で以下のコマンドを実行してください。
$ fdtd2d.exe 1スレッド, fdtd.bin出力 $ fdtd2d.exe 8 8スレッド, fdtd.bin出力 $ fdtd2d.exe 8 foo.bin 8スレッド, foo.bin出力 $ mpiexec.exe -n 2 fdtd2d.exe 4 foo.bin 2プロセス, 4スレッド, foo.bin出力(MPIでビルドしたとき)
$ fdtd3d.exe 1スレッド, fdtd.bin出力 $ fdtd3d.exe 8 8スレッド, fdtd.bin出力 $ fdtd3d.exe 8 foo.bin 8スレッド, foo.bin出力 $ mpiexec.exe -n 2 fdtd3d.exe 4 foo.bin 2プロセス, 4スレッド, foo.bin出力(MPIでビルドしたとき)
$ ./fdtd2d 1スレッド, fdtd.bin出力 $ ./fdtd2d 8 8スレッド, fdtd.bin出力 $ ./fdtd2d 8 foo.bin 8スレッド, foo.bin出力 $ mpiexec -n 2 fdtd2d 4 foo.bin 2プロセス, 4スレッド, foo.bin出力(MPIでビルドしたとき)
$ ./fdtd3d 1スレッド, fdtd.bin出力 $ ./fdtd3d 8 8スレッド, fdtd.bin出力 $ ./fdtd3d 8 foo.bin 8スレッド, foo.bin出力 $ mpiexec -n 2 fdtd3d 4 foo.bin 2プロセス, 4スレッド, foo.bin出力(MPIでビルドしたとき)
(注1)
MPI版は複数ノードで実行するときに使用し、その他の設定が必要ですが、ここでは説明は省略します。
通常は1ノードで非MPI版を使用してください。
(注2)
デバッグを行って図形出力するときは、
OpenFDTD等に付属している2次元図形表示プログラムev2d.exeを使用してください。
ファイルdlspa.pyを編集して計算条件を設定してください。
リスト5-3 深層学習プログラムのデータ入力(dlspa.pyの一部)
# 学習or推論
Imode = 1 # 1=学習, 2=推論
# 計算結果ファイル名(image=S行列, label=誘電率)
datafile = '../fdtd2d/fdtd.bin'
#datafile = '../fdtd3d/fdtd.bin'
# モデルファイル
modelfile = 'dlspa.pth'
# 計算パラメーター
if Imode == 1:
# 学習
load_model = 0 # 通常0, 前回保存したmodelfileからrestartするときは1
save_model = 1 # 通常1, 計算終了時にmodelfileを保存しないときは0
ndata = -1 # データ数, -1のときはすべてのデータ
batch_size = 60 # バッチサイズ(通常50-100程度)
num_epochs = 100 # エポック数
train_ratio = 0.8 # 訓練データの割合(通常0.8程度)
elif Imode == 2:
# 推論
load_model = 1 # 通常1:modelfileを読み込む
save_model = 0 # 通常0:modelfileは保存しない
ndata = -1 # データ数, -1のときはすべてのデータ
batch_size = 50 # バッチサイズ(=50:ダミー)
num_epochs = 0 # エポック数(=0)
train_ratio = 0 # 訓練データの割合(=0)
# 学習・推論共通
ecomp = 3 # label成分: 1=Re(Er), 2=Im(Er), 3=両方 (通常3)
scomp = 2 # image成分: 1=S, 2=Re(S),Im(S), 3=Re(S),Im(S),S (通常2)
深層学習プログラムはPythonで記述されているのでビルド作業は不要です。
実行する前に、numpy, matplotlib, torch, torchvision をインストールしてください。
深層学習を行うには下記のコマンドを実行してください。
$ python dlspa.py 学習 $ python dlspa.py 1 学習 $ python dlspa.py 2 推論
以下の書式により引数で制御することもできます。
$ python dlspa.py [1/2 [datafile [modelfile]]]
計算結果を図形出力するには下記のコマンドを実行してください。
必要なら実行前に post.py, plot.py を編集してください。
$ python post.py