In the following, we describe the database format in which we store the individual meta-atom response depending on their geometry, and excitation. For now, we limit ourselves to nano-pillars of different radius, which are excited at a single wavelength. The incident angle of the excitation can either be normal or oblique. Moreover, we describe how we store meta-surface designs. The meta-atom database as well as the meta-surface design can be used in OpticsStudio to calculate the ray diffraction from a meta-surface (see the large-scale metalens example, here).
Meta-atom design
The meta-atoms are arranged on a 2D rectilinear grid, where each meta-atom center is located at a grid point. The grid is defined by the grid spacings dx, dy. The grid does not need to be square.
Meta-atom database
The following database file format is tagged as version “1.0”. Hence, the HDF5 database should contain an attribute in the root directory called “version” with the string value “1.0”. For details on the HDF5 database generation in Lumerical, check the generate_metalens_data.lsf script from metalense article, here.
Normal incidence
In the simplest case, the nano-pillars are excited under normal incidence at a single wavelength. In this case, the database should be compiled as follows:
Name |
Data type |
Format |
Dimension |
Units |
Description |
---|---|---|---|---|---|
phase |
double |
vector |
Kx1 or 1xK |
rad |
RCWA unit cell phase value of a given meta-atom. The number of phase values corresponds to the number of available meta-atoms types. The phase vector is thus ordered by the meta-atom types. |
amplitude |
double |
vector |
Kx1 or 1xK |
V/m |
RCWA unit cell amplitude of a given meta-atom. The number of amplitude values corresponds to the number of available meta-atoms types. The amplitude vector is thus ordered by the meta-atom types. It has the same ordering as the phase. |
phase_index_map or metalens_atom_map |
integer |
matrix |
NxM |
|
The phase index map or metalens atom map (both names can be used interchangeably) has the same dimension as the meta-lens grid. Each map element is an integer, which corresponds to an entry number. |
dx |
double |
scalar |
1 |
μm |
grid spacing in x direction. |
dy |
double |
scalar |
1 |
μm |
grid spacing in y direction. |
K: number of meta-atom types
M: number of grid points in y-direction
N: number of grid points in x-direction
Example
The following example illustrates the file format. The data does not depict an actual meta-lens.
h5read("test_h5read.h5","/phase") result: 2 3 5 7 11 h5read("test_h5read.h5","/amplitude") result: 20 30 50 70 110 h5read("test_h5read.h5","/phase_index_map") result: 1 2 3 4 5 6 7 8 9 h5read("test_h5read.h5","/dx") result: 7 h5read("test_h5read.h5","/dy") result: 11
Oblique incidence
For oblique incidence excitations, different incidence angles must be considered. Hence, the database becomes more extensive as the response of each nano-pillar now depends on each of the incident angles. To this end, the incidence angles are stored as vectors, and the resulting phase and amplitude are stored as tensors where their dimensions depend on the number of incident angles.
Name |
Data type |
Format |
Dimension |
Units |
Description |
---|---|---|---|---|---|
phi |
double |
vector |
Px1 or 1xP |
rad |
Incident angles phi. |
theta |
double |
vector |
Tx1 or 1xT |
rad |
Incident angles theta. |
phase |
double |
tensor |
KxTxP |
rad |
RCWA unit cell phase value for a given meta-atom type, incident angle phi, and incident angle theta. |
amplitude |
double |
tensor |
KxTxP |
V/m |
RCWA unit cell amplitude value for a given meta-atom type, incident angle phi, and incident angle theta. |
T: Number of incident angles theta
P: Number of incident angles phi
Example
For 2 types of meta-atoms, 3 incident angles phi, and 4 incident angles theta, the phase and amplitude containers are changed to (2x3x4)-tensors.
phi= h5read("test_h5read_multiangle.h5","/phi");
size(phi)
result:
1 3 theta= h5read("test_h5read_multiangle.h5","/theta");
size(theta)
result:
1 4 phase= h5read("test_h5read_multiangle.h5","/phase");
size(phase)
result:
2 3 4 amplitude= h5read("test_h5read_multiangle.h5","/amplitude");
size(amplitude)
result:
2 3 4
The phase index map and the grid spacings remain unchanged.
Note: only ASCII signs are supported as hdf5 file names.
See Also