1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ユーザからの声

  • 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°反転してください。

画像2.png

お問い合わせ

  • より詳細なAPI関数を学習するには、サンプル内のドキュメントをご覧頂くか、弊社サポートサイトをご活用下さい。
  • 光学シミュレーションソフトの導入や技術相談、
    設計解析委託をお考えの方はサイバネットにお問合せください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?