Holo
Holo は複数の焦点 (制御点) を同時に生成するための Pattern 計算群. 各振動子の位相・振幅を最適化し, 指定した複数点で目標音圧が得られるようにする.
提供するアルゴリズムは以下の通り.
AmplitudeTarget
Section titled “AmplitudeTarget”焦点を表す構造体. 位置と目標振幅を持つ.
振幅単位 Pa / kPa / dB
Section titled “振幅単位 Pa / kPa / dB”目標振幅 Amplitude は, f32 に振幅単位を掛けて構築する.
EmissionConstraint
Section titled “EmissionConstraint”最適化で得られた振幅は, そのままでは振動子では出力できない強度の可能性がある. そこで, 最適化で得た振幅を, 出力する振動子強度へ変換するための制約を指定する.
Normalize |
最大値で正規化する |
Multiply(f32) |
正規化後に係数を掛けてクランプする |
Uniform(Intensity) |
全振動子を一定強度にする |
Clamp(Intensity, Intensity) |
振幅を指定範囲にクランプする |
各 Option の constraint フィールドで指定する. デフォルトはアルゴリズムにより異なる.
Directivity
Section titled “Directivity”振動子の指向性モデル.
無指向性の Sphere (デフォルト) , または, 実機指向性の T4010A1 から選べる.
各 Option の directivity フィールドで指定する.
TransducerMask
Section titled “TransducerMask”最適化に含める振動子を選択する.
各 Option の mask フィールドで指定する (デフォルトは AllEnabled).
TransducerMask::AllEnabled— 全振動子を使う (デフォルト).TransducerMask::Masked(&[Vec<bool>])— 各振動子ごとに有効/無効を指定する.
LinAlgBackend (NalgebraBackend)
Section titled “LinAlgBackend (NalgebraBackend)”naive / gs / gspat は線形代数演算を LinAlgBackend トレイトに委譲する.
標準実装としてCPUで計算する NalgebraBackend を用いる.
バックエンドは各関数の第 1 引数で渡す.
greedy は行列演算を使わないためバックエンドを取らない.
GPU Backend (WgpuBackend)
Section titled “GPU Backend (WgpuBackend)”GPUで計算するバックエンドとして WgpuBackend を用意している.
バッチ API
Section titled “バッチ API”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 バックエンドでは意味はない.