SSブログ

光学薄膜設計ソフトの設計 その31 - 計算エンジン単独動作と入力形式 [考え中 - 光学薄膜設計]

前回おおまかに計算エンジンの中核クラスの設計をした。こういう数値計算のソフトは計算が合っているかどうかなかなかわからない。従ってデバグが終わってからも

  • トリビアルな条件や解析的に計算できる条件で計算する
  • 他の確認済みのソフトと結果が合うか確かめる
ということが非常に重要になる。例えば膜厚0の極限で膜がない場合と一致するかとか、屈折率が1とか、全反射の場合とか、などでのチェックと、実際の薄膜のデータやTFCalcなどの実績ある結果と比較するということをする。

ということで前回の設計をちゃんと実装して答え合わせできるようにしないといけない。今回はそのための入力形式をどうするか、を考える。

設定と計算

ソフト全体のGUIの設計は途中で挫けたままだけど、OTFOpticalCharacteristics以下のクラスを実装すれば、薄膜の光学特性を計算することができが、その手順は

  • OTFOpticalCharacteristicsを作る
  • 膜厚と屈折率の組を作ってOTFOpticalCharacteristicsに渡す
  • 必要な層数ぶんだけ繰り返す
  • 波長、偏光、入射角をOTFOpticalCharacteristicsに設定する
  • OTFOpticalCharacteristicsのvalueForDescriptor:メソッドで値を得る
とすることになる。

とりあえずここまでで答え合わせをしておかなければいけない。僕はTFCalcを持ってないので、何と比較するか、別の方法を考える必要があるけど答え合わせするためには入出力ができないといけない。単なる標準入力から設定を読み込んで標準出力に書き出す、というのでもいいんだけど、後々のことを考えて

  1. 入力はXML形式のファイルにする
  2. 出力は表にしたりグラフにするのに便利なように計算結果をソートする機能を持たせる
  3. いずれGUIをかぶせたときのためにどちらもNSTableViewのデータソースとしても機能するような専用のクラスにする
としよう。

入力手段について

入力をファイルからにするのは、unixの一般的な形式。最終的にGUIをかぶせたときに計算エンジンへの設定は専用のNSTableViewみたいなものを使うことになるだろうからツリー形式になじみのいい方が最終的には楽だろう。

屈折率のデータベースのファイルは勝手にテキスト形式を決めてしまったけど、あれは構造が簡単だったから。いろいろなレベルの設定をする必要がある薄膜の入力ファイルの形式を独自に決めるのは面倒だし、その構文解析も大変。yacc/lexに慣れた人は適当な形式を決めて読み込ませればいいけど、それは僕にとっては敷居が高い。yacc/lexは本当に簡単なフォーマットのために何回か使っただけで、自分で決めた文法がself-consistentかどうか不安になってしまう。

XML形式を使う利点

XMLに決めてしまえば

  • 単なるテキストファイルよりも構造の表現がしやすい
  • テキストエディタで書ける
  • 解析にはFoundationフレームワークのクラスが使えて自前で作る必要がない
  • 拡張や変更がシステマティックにやりやすい
  • DTD、XML Schemaなどを使った読み込み時に検証すれば後の手間が減る
という利点がある。

一方で

  • エディタで書くのは非常に面倒
  • サイズが大きくなる
  • DTDやSchemaを記述するのはかなり手間
という欠点もある。今回はFoundationフレームワークのXML関連のクラスの勉強の意味も含めて使ってみようと思う。いずれこれを拡張して最終的にはCore Dataを使って外部データの形式は任せてしまいたい。まあ、それはずいぶん後の話だろうけど。

出力は、出力用インスタンスが計算結果を溜め込んで、要求があれば、ソートして出力するようなものを作ろう。こっちはそれほど難しくない。

入力用XMLファイルの形式

入力ファイルの形式を決めよう。

XMLにしたからには、DTDを記述して整合性をある程度チェックできるようにしておいた方がいいので、構造がDTDを書き下ろせるように考えながら進めることにする。 ルートレベルのタグは何でもいいけど最終的なアプリの名前を使った方がいい。最終的な名前ってこれまで考えてなかったけど、なにか適当につけておく方がいい。とりあえずdotf(decafish Optical Thin Film optimization)とかにしておこう。ひどい名前。トップレベルのタグはdotfDataにする。

薄膜全体を表すタグをfilmCompositionとして、その中の層を表すタグをlayerとしよう。layerにはmediumとthicknessが子要素として含まれる。層とは別に基板の媒質baseMediumと入射側の媒質outerMediumも子要素として持つ。

これとは別に光学的な設定全体を表すタグとしてopticalConditionを作ろう。この中にはimplicitConditionとvariableConditionsを持つ。どちらも波長を表すlambda、入射角のincidentAngle、偏光polarizationを子要素として持っている。variableConditionsはパラメータを変化させながら計算するとき、どのパラメータをどのように変化させるか、を表す。implicitConditionの方はパラメータの値がvariableConditionsの中にないときに参照する。

variableConditionsの中にはlambda、incidentAngle、polarization以外の特定の層の膜厚や屈折率も指定できるようにする。

variableConditionsの変数として現れたものすべての組み合わせに対して計算する。

以上を木構造の絵にすると図-5.8となる。

0307fig508.png
ま、とりあえずこんなもんでいいでしょ。

もう少し詳細を詰める。


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

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

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