コンテンツにスキップ

Holo

Holo は複数の焦点 (制御点) を同時に生成するための Pattern 計算群. 各振動子の位相・振幅を最適化し, 指定した複数点で目標音圧が得られるようにする.

提供するアルゴリズムは以下の通り.

  • Naive — 単一ステップの逆伝搬
  • GS — Gerchberg-Saxton 法
  • GS-PAT — GS-PAT 法
  • Greedy — 位相を貪欲に決定する組合せ最適化

焦点を表す構造体. 位置と目標振幅を持つ.

目標振幅 Amplitude は, f32 に振幅単位を掛けて構築する.

最適化で得られた振幅は, そのままでは振動子では出力できない強度の可能性がある. そこで, 最適化で得た振幅を, 出力する振動子強度へ変換するための制約を指定する.

Normalize 最大値で正規化する
Multiply(f32) 正規化後に係数を掛けてクランプする
Uniform(Intensity) 全振動子を一定強度にする
Clamp(Intensity, Intensity) 振幅を指定範囲にクランプする

各 Option の constraint フィールドで指定する. デフォルトはアルゴリズムにより異なる.

振動子の指向性モデル. 無指向性の Sphere (デフォルト) , または, 実機指向性の T4010A1 から選べる. 各 Option の directivity フィールドで指定する.

最適化に含める振動子を選択する. 各 Option の mask フィールドで指定する (デフォルトは AllEnabled).

  • TransducerMask::AllEnabled — 全振動子を使う (デフォルト).
  • TransducerMask::Masked(&[Vec<bool>]) — 各振動子ごとに有効/無効を指定する.

naive / gs / gspat は線形代数演算を LinAlgBackend トレイトに委譲する. 標準実装としてCPUで計算する NalgebraBackend を用いる. バックエンドは各関数の第 1 引数で渡す.

greedy は行列演算を使わないためバックエンドを取らない.

GPUで計算するバックエンドとして WgpuBackend を用意している.

naive / gs / gspat には, 独立した複数の問題をまとめて解く naive_batch / gs_batch / gspat_batch がある.

let problems = 64;
let foci: Vec<AmplitudeTarget> = (0..problems)
.map(|i| AmplitudeTarget {
point: center + offset(i as f32 * 0.5 * mm, 0.0 * mm, 0.0 * mm),
amplitude: 5e3 * Pa,
})
.collect();
let mut dst = vec![geometry.pattern_buffer(); problems];
gs_batch(
&NalgebraBackend,
&geometry,
&foci,
wavelength,
&option,
&mut dst,
)?;

問題数は dst の長さで決まる. 焦点は 問題数 × 各問題あたりの焦点数 の長さのスライスを渡す. 全問題は焦点数が揃っている必要があり, dst の長さで割り切れなければエラーになる.

バッチAPIで計算速度に利があるのはGPU バックエンドのみで, CPU バックエンドでは意味はない.