Sets up the adjoint optimization of a multilayer stack. Returns: A `meep.adjoint.Optimization` callable object.
()
| 144 | |
| 145 | |
| 146 | def multilayer_stack() -> mpa.OptimizationProblem: |
| 147 | """Sets up the adjoint optimization of a multilayer stack. |
| 148 | |
| 149 | Returns: |
| 150 | A `meep.adjoint.Optimization` callable object. |
| 151 | """ |
| 152 | pml_layers = [mp.PML(thickness=PML_UM)] |
| 153 | |
| 154 | size_z_um = PML_UM + AIR_UM + DESIGN_REGION_UM.z + AIR_UM + PML_UM |
| 155 | cell_size = mp.Vector3(0, 0, size_z_um) |
| 156 | |
| 157 | frequency_center = np.mean(frequencies) |
| 158 | |
| 159 | # Set source bandwidth to be larger than the range of design wavelengths. |
| 160 | frequency_width = 1.2 * (np.max(frequencies) - np.min(frequencies)) |
| 161 | |
| 162 | src_cmpt = mp.Ex |
| 163 | src_pt = mp.Vector3(0, 0, -0.5 * size_z_um + PML_UM) |
| 164 | sources = [ |
| 165 | mp.Source( |
| 166 | mp.GaussianSource(frequency_center, fwidth=frequency_width), |
| 167 | component=src_cmpt, |
| 168 | center=src_pt, |
| 169 | ) |
| 170 | ] |
| 171 | |
| 172 | mat_1 = mp.Medium(index=N_LAYER[0]) |
| 173 | mat_2 = mp.Medium(index=N_LAYER[1]) |
| 174 | |
| 175 | matgrid = mp.MaterialGrid( |
| 176 | mp.Vector3(0, 0, NZ_SIM_GRID), |
| 177 | mat_1, |
| 178 | mat_2, |
| 179 | weights=np.ones(NZ_SIM_GRID), |
| 180 | do_averaging=False, |
| 181 | ) |
| 182 | |
| 183 | matgrid_region = mpa.DesignRegion( |
| 184 | matgrid, |
| 185 | volume=mp.Volume(center=mp.Vector3(), size=DESIGN_REGION_UM), |
| 186 | ) |
| 187 | |
| 188 | geometry = [ |
| 189 | mp.Block( |
| 190 | material=matgrid, size=matgrid_region.size, center=matgrid_region.center |
| 191 | ) |
| 192 | ] |
| 193 | |
| 194 | sim = mp.Simulation( |
| 195 | resolution=RESOLUTION_UM, |
| 196 | cell_size=cell_size, |
| 197 | dimensions=1, |
| 198 | boundary_layers=pml_layers, |
| 199 | sources=sources, |
| 200 | geometry=geometry, |
| 201 | ) |
| 202 | |
| 203 | obj_args = [ |