SSブログ

光学薄膜設計ソフトの設計 その40 - 新しい答え合わせの準備 [考え中 - 光学薄膜設計]

Mac用の光学薄膜設計ソフトを始めた。計算エンジンの答え合わせをしたいけど、僕はTFCalcなんかの汎用のソフトを持っていない。そうするとどうするか。

前回、とりあえずMacleodさんの本やTFCalcのサイトには設計例と比較したところ、単純な例ではあうけど層数が増えるとあわない。特にTFCalcのサイトの設計例とは、波長依存性なんかの大まかな形は似てるけど値は全然違う。なんでそんな中途半端な違いが出るのかよくわからないし、どこが間違っているのかわからない。

ということで、面倒でも他のアルゴリズムや計算方式のソフトを書いてみて結果が一致するかどうかを見ることにした。しかしそれではまたゼロから計算エンジンを作ることになって、さすがにそれはやっとれんわ、と言う感じになる。

ということでMathematicaで書くことにした。ずっと以前に書いたものがあるのでそれに手を入れる。

比較のためのMathematica Package

Mathematicaだと

  1. 入出力に手をかける必要はない
  2. 代数式をそのまま書けば計算できるのでコーディングが楽
  3. パラメータを振った計算や最適化などは組み込み関数がそのまま使える
なのでずっと手間は省ける。さらに以前から必要になるたびにちょこちょこ書いていたコードが既に手元にあるのでそれを手直ししてもう少し使い勝手よくすればいい。

答え合わせのためには

  1. Objective-Cで書いた計算エンジンができることは全部カバーする
  2. 構造はなるべく似せる(結果が違っていた場合、どこで違っているかを比較しやすくする)
  3. 具体的な計算方法は異なるものも採用できるようにする
としておきたい。

とくに計算方法は、結局数学的には同じなんだけどなるべく違ったアルゴリズムとかを使って結果が同じになることも確かめたい。Objective-Cで書いた計算エンジンは特性マトリクスを使ったのでMathematicaでは同じ特性マトリクスを使った計算と、それとは違った境界面間の多重反射に基づく式を使って計算することにする。

まず、また例によって先に数学を整理しておく。

多重干渉による多層膜の計算

単層膜の場合の反射係数

薄膜に入射した光は図-6.1のように薄膜内部で多重反射を起こす。

0405fig601.png
この絵では単層膜だけど、この場合でも多重干渉が起こって反射率や透過率はこれらすべてを考慮する必要がある。

図の上から光が入射するとして、入射電場振幅をE0、その波長をλ、入射角をθ0、薄膜の上側の境界面での電場振幅に対する反射率をr01、下側の境界面での反射率をr12、上側の境界面での透過率をt01などとする。

以前特性マトリクスでやったときと層の番号付けの順番が逆になっている。これは説明の都合のせいで、本質的ではない。多分、最後に番号をつけ直すことになる。

つまりrpq、tpqはその境界でのいわゆるFresnel係数

0405eq601.png
である。ここでEiは層の番号が増える方向を向いた媒質iでの電場、Aiは層の番号が減る方向、つまり反射光の方向を向いた媒質iでの電場である。

まず、上の境界で反射された光線の電場振幅A0,0

0405eq603.png
である。簡単。次は上の境界を透過し、下の境界で反射してまた上を透過する光A1
0405eq604.png
となる。d1は層の厚さ、t01は上の境界の下から見た透過率でθ1は層の内部での光の進行方向で
0405eq606.png
である。ここでn0は層の上の媒質の屈折率、n1は層の内部の媒質の屈折率である。

式-6.5のδ1がなんでこんな式になるか、を次回まとめることにする。


nice!(0)  コメント(6)  トラックバック(0) 

nice! 0

コメント 6

xxxg01d2

http://www.esrf.eu/computing/scientific/xop2.1/
のimd
というソフトがフリーの膜設計ソフトとしてありますよ.
by xxxg01d2 (2009-05-12 11:41) 

decafish

コメントありがとうございます。xopのことは分野違いで全然知りませんでした。計算対象はまったく違いますが計算原理は同一ということはわかりました。
xop2.1を落としてとりあえず起動してみようと思いましたが、本体であるシェルスクリプトのxopが(XOP_HOME変数などは設定し直した上で)idl_6.0/bin/idlのbus errorでexitします。
xop2.3もあってそれはX windowを前提として立ち上がるようなのですが.cshrcで設定していた$DISPLAY変数を.loginで設定するようにしても
% MAIN: DEVICE: Unable to open X Windows display.
Is your DISPLAY environment variable set correctly?
というメッセージを繰り返します。X windowはxop2.3をダブルクリックすると起動するのですがxop側が$DISPLAYを読んでくれないようです。
動かすのにどうすればいいかお教えいただけるとありがたいのですが...
by decafish (2009-05-12 22:24) 

xxxg02d1

返信遅れました.

私も,windows xpで試したところ,
動くもとの動かないものがありました.

サーバー2003では動きますw

vistaでも動くようです.

Linux板が試せるならどうでしょうか?


by xxxg02d1 (2009-05-25 00:40) 

decafish

コメントありがとうございます。あの後、Mac用X11版xop2.3はDISPLAY変数の設定が./xop2.3beta1.app/Contents/Resources/scriptに決め打ちで書いてあり、それを修正すると起動しました。他にもworking directoryなどそれぞれの環境に合わせて書き換えることが前提になっているようで、なかなか敷居の高いソフトです。
しかしそれ以上にX線領域の知識がなく、何をどうすればいいのかわかりません。うう、エネルギーが5桁もちがう...
by decafish (2009-05-26 08:05) 

xxxg01d2

私も本体のXOPは使っていません.
extensionのimdのみを使っています.
以下にマニュアルがあります.


http://www.rxollc.com/idl/imd/index.html
by xxxg01d2 (2009-05-26 08:23) 

decafish

コメントありがとうございます。imdのマニュアルは初めて見ました。xopをプラットフォームとして使っているだけでかなり独立したソフトのようでかなりおもしろそうです。じっくり見てみます。結果はまたここに上げたいと思います。
とりあえずご報告まで。ありがとうございました。
by decafish (2009-05-27 22:33) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。