ユーザからの声
-
PlanOpSim以外のメタサーフェス設計時に言えることですが、メタレンズ直径がφ数十mm以上の1設計データは数GBとなり、製造側で取り回しが悪い場合があります。
-
そこでメタレンズ設計データを、軽量なCSVフォーマット(メタ原子の座標と形状の2Dマップ)に変換するpythonをテスト作成したのでご紹介します。
-
製造側がメタ原子の周期条件だけ把握しておけば、GDSファイルと同様に機能します。
※本記事は筆者個人の見解であり、所属組織の公式見解を示すものではありません。
PlanOpSim 設計データ出力
PlanOpSimでメタ原子配列の最適化結果出力は以下のフォーマットをサポートします。(2025.4.14時点)
- GDS
- JSON
- OAS
- STL
- DXF
概要
- インプット:PlanOpSim から出力されたメタレンズ設計データ(JSON)
- アウトプット:各メタ原子(円柱ピラー)の曲率半径2Dマップ(CSV)
本スクリプトは、PlanOpSim で設計されたメタサーフェスについて、
マスク情報とメタ原子ライブラリを突き合わせて、
各セルの曲率半径を物理座標系に展開した 2 次元マップとして抽出・CSV 出力する補助スクリプトであり、主に製造側の他ツール連携に用いるためのものです。
※ご利用時は、お手元で十分な検証をした上でご活用下さい。
Config と Mask の読み込み
ここではメタレンズ(MetaComponent config)構造データからメタ原子周期データを読み出します。※ lengthではなくheightです。
- 'family' → cell_height (縦ピッチ※)
- 'family' → cell_width (横ピッチ)
GDS相当のマスクデータ(dictionary)を読み出します。
'map'には各セルに「どのメタ原子 ID が配置されているか」を示す 2D 配列
'member'は「メタ原子IDと物理パラメータ(半径・ズレ等)」を示す 2D 配列
component_config = json.load(open("export_spaticalphaseplate.json","r"))
cell_height = component_config['family']['cell_height']
cell_width = component_config['family']['cell_width']
dictionary = json.load(open("mask_spacialplhaseplate.json","r"))
map = np.array(dictionary['map'])
metacell_group_members = dictionary['members']
radius_map と 座標マップ作成
map と同じサイズの 曲率半径マップを初期化しておきます。
radius_map = np.zeros_like(map, dtype=float)
x_range = np.arange(0, cell_width * radius_map.shape[1], cell_width)
y_range = np.arange(0, cell_height * radius_map.shape[0], cell_height)
absolute_x_loc_map, absolute_y_loc_map = np.meshgrid(x_range, y_range)
メタ原子パラメータ → radius 2D map に反映
メタ原子の 物理形状パラメータ(今回は曲率半径、メタ原子の中心からの微小オフセット)を取得、曲率半径マップに書き込んでいきます。
for metacell_member in metacell_group_members:
member_name = metacell_member['alias']
member_id = metacell_member['id']
# radius & center_coord が入っているレイヤ
structure_info = metacell_member['layers'][1]['layer_parameters']
member_radius = structure_info['radius']['value']
member_center_coord = structure_info['center_coord']['value']
# radius map に書き込み
radius_map[map == member_id] = member_radius
# 座標の補正
absolute_x_loc_map[map == member_id] += member_center_coord[1]
absolute_y_loc_map[map == member_id] += member_center_coord[0]
radius_map を CSV 出力
後は、半径 2D マップを CSV として保存します。
output_csv = "radius_map_spaticalphaseplate.csv"
with open(output_csv, "w", newline="") as f:
writer = csv.writer(f)
for row in radius_map:
writer.writerow(row)
print(f"半径 2 次元 map を CSV に出力しました: {output_csv}")
変換結果
GDSファイル出力(直径表示)と、CSVへ変換結果(半径表示)の比較結果です。
回転対称系の為、座標が一致して変換されました。
注意点:非回転対称系の際は、GDSと表示を合わせる場合、CSVマップを90°反転してください。
お問い合わせ
- より詳細なAPI関数を学習するには、サンプル内のドキュメントをご覧頂くか、弊社サポートサイトをご活用下さい。
- 光学シミュレーションソフトの導入や技術相談、
設計解析委託をお考えの方はサイバネットにお問合せください。
