SSブログ

光学薄膜設計ソフトの設計 その13「整理」 [考え中 - 光学薄膜設計]

前回ごちゃごちゃ書いたのが一晩経つとわからなくなってしまったので、もう一回整理する。

例えば2層膜で二つの波長λaとλbでの反射率を最適化したいとする。2層膜を表すOTFLayerCompositionを作って、OTFOpticalCharacteristicsのインスタンスに保持し、二つの波長それぞれを条件として持ったOTFTargetを作る。OTFLayerCompositionの中の1層目に対応するOTFLayerの膜厚は外のOTFVariableの値を参照している。
ちょっと絵にしよう。
0423structure.png

gslからメリット関数の値を要求されたとき、OTFMeritFunctionは最適化変数である1層目の膜厚を設定して、OTFTargetに項の値を要求する。OTFTargetはさらにOTFOpticalCharacteristicsに計算を要求して反射率の値を得て、項の値を計算する。それをOTFMeritFunctionは足し算してgslに返す。

OTFOpticalCharacteristicsのインスタンスは1個でもいいけどOTFTargetそれぞれに同じものを作っておけば最適化変数に絡むところだけが再計算の対象になるだけで、同じ計算を繰り返さなくてすむ(例えば図の2層めは最適化変数を参照していないので最初に一度計算すればいい)。膜厚の値は一つのOTFVariableのインスタンスを参照しているので、gslの最適化の過程で膜厚が変更されても、膜構成としては同じものについて計算される。と、こんな感じでどうやろ。まわりくどいか?僕はこのくらいに分かれていた方がわかりやすい。

OTFOpticalCharacteristicsを別々のインスタンスにしたとき、それぞれがマルチコアに対応させるためのThreadに割り振る最小単位となる。区切りのよさを考えるとOTFTargetごとの方がわかりやすいかも。その辺は実装次第。変数はread onlyなので共通でかまわないが、変数の値を書き換えるときは、それ以前の計算は終わってないといけない。単純なNSThreadを使うと、この保証ができないのでNSLockを使って排他制御する必要がある。

これがめんどうならNSOperationを使え、となるようなんだけど、これは次回研究する。

最適化ではなしに、単に評価をする場合でも、反射率の波長依存性や入射角依存性なんかを計算したい、と言う場合が多い。つまり波長や入射角をちょっとずつ変えて計算する。そういうときのためにOTFTargetと同じようなOTFEvaluatorを作ろう。

OTFEvaluatorは一つの変数をループして計算結果を配列に入れて返すことにする。OTFOpticalCharacteristicsに対してやることはOTFTargetとあまり変わらない。OTFEvaluatorの違いは自分でループをまわして配列を作れること。結果の配列は例えば
@interface OTFColumn : NSObject {
    NSString	*description;
    NSArray	*numerics;
}
みたいなのに入れて同じような変数の配列とのペア(OTFColumnのNSArray)を返すことにする。

ついでにNSArrayのカテゴリを作って0番目の要素を変数の値、それ以降を計算結果の値として、ある計算結果を取り出したり二つの結果をマージしたりできるようにしておこう。具体的には
@interface NSArray (OTFEvaluatedArray) 
- (int)numberOfColumns;
- (NSString *)variableDescription;
- (NSArray *)columnDescriptions;
- (NSArray *)evaluatedArrayForDescription:(NSString *)computed;
- (NSArray *)mergeWith:(NSArray *)otherEvaluatedArray;
- (NSArray *)joinWith:(NSArray *)otherEvaluatedArray;
@end
みたいなの。-columnDescriptionsは計算結果が何なのか、反射率なのか、位相なのか、などを表す文字列の配列を返す。OTFOpticalCharacteristicsに持たせたdescriptionと同じもの。-evaluatedArrayForDescription:は複数行の結果から変数と指定された計算結果だけの配列にして返す。指定された結果が無ければnilを返す。-mergeWith:はその逆で計算結果の行を足す。変数のdescriptionが違ってるとnil。変数の範囲が違っていた場合、どうするかはまた考えよう。joinWith:は縦に継ぎ足す。これも同じ。

OTFTargetとOTFEvaluatorは、OTFOpticalCharacteristicsの扱いを共通の抽象クラスにまとめてしまうことにして、それから派生するほうがわかりやすいね。

NSLockを使いたくないので次回はNSOperationの研究をしよう。さて、OTFTargetとOTFEvaluatorはNSOperationと共存できるか?
nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

Cialis generico

沒有醫生的處方
we use it 50 mg cialis dose http://cialisyoues.com/ Tadalafil 10 mg
by Cialis generico (2018-04-14 05:59) 

コメントを書く

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

トラックバック 0

献立04/23献立04/24 ブログトップ

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