🧩 概要
本記事では、Ansys Lumerical FDTDを用いて、側壁にランダムなラフネスを持つSi導波路の光伝搬損失を評価する方法をご紹介します。
ランダムラフネスの設定には、LumericalのObject Libraryにあるrough surfaceをSi導波路の両側の側壁に貼り付けてFDTDシミュレーションを実施します。
このrough surfaceオブジェクトは、ガウス分布に従って高さがばらつく「でこぼこ面」を自動生成してくれる機能です。
ランダムネスの自己相関関数がガウシアンに従うとしたときのラフネスの分散σとx,y方向の相関長を指定してラフネスを生成できます。
本来であれば非常に長い導波路を設定してその両側にラフネスオブジェクトを張り付けて計算することになりますが、FDTDシミュレーションの計算負荷が大きすぎるため、今回は以下の計算フローを導入して検討しました。
🎯 計算フロー
-
ベース構造の準備
- Lumerical FDTDのGUI上でSi導波路モデル(
rough_waveguide_cal1.fsp)を用意。 - 導波路の幅・高さなどのパラメータを設定。
- Lumerical FDTDのGUI上でSi導波路モデル(
-
ラフネス生成
- Object Libraryの
random surface機能を使用。 - 両側の側壁にラフネスを貼り付け。
- 相関長(
Lcx,Lcy)と分散(σ)を指定してランダム形状を生成。
- Object Libraryの
-
第1回目のFDTD計算実行
- FDTDを実行し、透過率
T₁を出力。
- FDTDを実行し、透過率
-
ラフネス再生成
- 側壁ラフネスを一度削除。
- 新しい乱数シードで新しいラフネスを再生成。
-
第2回目以降のFDTD計算
- 新しいラフネス付き導波路に対して再度計算。
- 各試行ごとに透過率
T₂, T₃, …, Tₙを取得。
-
透過率の統合
-
各回の透過率を掛け合わせて累積透過率を算出:
$$
T_{\text{total}} = T_1 \times T_2 \times \dots \times T_n
$$ -
または、各試行の平均値をとる方法も可。
(ただしこの場合、1回の試行で計算した導波路損失の評価となる)
$$
T = \frac{T_1 + T_2 + \dots + T_N}{N}
$$
-
今回の計算はPython APIを用いてSpyder環境で自動ループ実行できるようにしています。
最終的な透過率は各試行での伝搬損失を独立とみなし、統計的に光損失を評価した解析結果となります。
この方法により、比較的小さな計算リソースでも長距離伝搬後のラフネスによる光損失を解析可能です。
⚙️ シミュレーションで設定するパラメータ
| 項目 | 内容 |
|---|---|
| 対象構造 | Si導波路の幅と高さ(両側にランダムラフネス付与) |
| 基板・上部媒質 | 任意設定可 |
| 平均高さ | 0 |
| 相関長 | Lcx, Lcy(X/Y方向) |
| 分散(σ) | 高さのばらつき |
自己相関関数については以下の公式サイトを参照:
👉 Tips for adding surface roughness to structures (Ansys Lumerical)
🧠 準備ファイル構成(例)
| ファイル名 | 内容 |
|---|---|
rough_waveguide_cal1.fsp |
導波路のサイズや構造設定 |
rough_waveguide_cal1.lsf |
ラフネスの相関係数・σ・位置を設定して貼り付け |
set_seed.lsf |
乱数シード設定(変更不要) |
roughnessWG3.py |
Python経由でFDTDシミュレーションを自動実行するメインスクリプト |
🔄 実行の様子
ラフネスを貼り付けたSi導波路のGUI画面
Lumerical上でSi導波路にラフネスを貼り付けると以下のようになります。
導波路高さ方向の相関長を大きくすると、高さ方向に筋の入ったようなラフネスになります。

ラフネスの相関長と分散σが同じでも、異なるseedで生成しているため、
両側の側壁のラフネス形状は異なることが確認できます。
実行結果
こちらがspyder上での実行画面になります。スクリプトをrunすると、Lumericalのgui画面が起動しシミュレーションが開始します(作成したfspとlsfファイルはpython上で呼び出すので、lumericalのGUI上で実行する必要はありません)
今回はwith lumapi.FDTD(hide=False) as fdtd:としていますが、hide=TrueとすればGUIを立ち上げることなくバックグラウンドで処理が始まります。計算の試行回数が多い場合にはGUIを立ち上げずに処理した方が良いでしょう。
このようにpython apiを用いて処理を実行すると、最終的な累積透過率の計算結果が出力されます。今回は試行回数を3回として計算した場合です。最終的な透過率はT_means±stdで0.982となりました。
今回設定したラフネスパラメータは、仮の値ですが、実際のデバイスの試作結果に合わせたパラメータを入力することで、現実的な光損失の値をシミュレーションできるようになります。
✨ まとめ
• Lumericalのobject libraryのrandom surfaceを用いて、ラフネスを統計的に扱うことで、実際のデバイス損失をより現実的に評価できる
• Python APIを使うと、FDTDの繰り返し試行を自動化できる
• GUIを立ち上げないhide=Trueモードは、大規模計算の省リソース化に有効
※本記事は筆者個人の見解であり、所属組織の公式見解を示すものではありません。
問い合わせ
光学シミュレーションソフトの導入や技術相談、
設計解析委託をお考えの方はサイバネットシステムにお問合せください。
光学ソリューションサイトについては以下の公式サイトを参照:
👉 光学ソリューションサイト(サイバネット)
光学分野のエンジニアリングサービスについては以下の公式サイトを参照:
👉 光学エンジニアリングサービス(サイバネット)


