def run_FDTD(contraDC, simulation_setup, close = True): c = 299792458 #[m/s] frequency_start = c/simulation_setup.lambda_end frequency_end = c/simulation_setup.lambda_start fdtd = lumapi.open('fdtd')#,hide=True) filename = 'contraDC_bandstructure' lumapi.evalScript(fdtd,"load('%s'); setnamed('::model','gap',%s); setnamed('::model','ax',%s); setnamed('::model','sinusoidal',%s)" % (filename, contraDC.gap, contraDC.period, contraDC.sinusoidal)) if contraDC.slab == True: lumapi.evalScript(fdtd,"setnamed('::model','slab',1); setnamed('::model','slab_thickness',%s);" % (contraDC.thick_slab)) if contraDC.sinusoidal == True: lumapi.evalScript(fdtd,"setnamed('::mode','sinusoidal',1);") lumapi.evalScript(fdtd,"setnamed('::model','bus1_width',%s); setnamed('::model','bus1_delta',%s); setnamed('::model','bus2_width',%s); setnamed('::model','bus2_delta',%s);setnamed('::model','si_thickness',%s);" % (contraDC.w1, contraDC.dW1, contraDC.w2, contraDC.dW2, contraDC.thick_si)) lumapi.evalScript(fdtd,"setnamed('::model','f1',%s); setnamed('::model','f2',%s);" % (frequency_start, frequency_end)) lumapi.evalScript(fdtd,"cd('%s');"%dir_path) lumapi.evalScript(fdtd,'kappa_bandstructure;') delta_lambda_contra = lumapi.getVar(fdtd,"delta_lambda") lambda_contra = lumapi.getVar(fdtd,"lambda0") delta_lambda_self1 = lumapi.getVar(fdtd,"delta_lambda_self1") delta_lambda_self2 = lumapi.getVar(fdtd,"delta_lambda_self2") if close == True: lumapi.close(fdtd) return [delta_lambda_contra, delta_lambda_self1, delta_lambda_self2, lambda_contra]
def run_EME(contraDC, simulation_setup, close=False): global mode if not (mode): mode = lumapi.open('mode') projectname = 'ContraDC_EME' filename = 'ContraDC_EMEscript' command = 'cd("%s");' % dir_path command += 'min_wavelength=%s;' % simulation_setup.lambda_start command += 'max_wavelength=%s;' % simulation_setup.lambda_end command += 'ACCURATE=%s;' % int(simulation_setup.accuracy) command += 'grating_period=%s;' % contraDC.period command += 'Wa=%s;' % contraDC.w1 command += 'Wb=%s;' % contraDC.w2 command += 'dWa=%s;' % contraDC.dW1 command += 'dWb=%s;' % contraDC.dW2 command += 'gap=%s;' % contraDC.gap command += 'number_of_periods=%s;' % contraDC.N command += 'wl_ref = %s;' % simulation_setup.central_lambda if contraDC.pol == 'TE': command += "pol='TE';" else: command += "pol='TM';" command += "load('%s');" % projectname command += '%s;' % filename print(command) lumapi.evalScript(mode, command) delta_lambda_contra = lumapi.getVar(mode, "delta_lambda") lambda_contra = lumapi.getVar(mode, "lambda0") delta_lambda_self1 = lumapi.getVar(mode, "delta_lambda_self1") delta_lambda_self2 = lumapi.getVar(mode, "delta_lambda_self2") # return the MODE project file to its small size command = 'switchtolayout; save;' # select('EME::Ports::port_1'); cleardataset; select('EME::Ports::port_2'); cleardataset; lumapi.evalScript(mode, command) if close == True: lumapi.close(mode) return [ delta_lambda_contra, delta_lambda_self1, delta_lambda_self2, lambda_contra ]
def get_fields(fdtd, monitor_name, field_result_name, get_eps, get_D, get_H, nointerpolation, unfold_symmetry = True, on_cad_only = False): get_fields_on_cad(fdtd, monitor_name, field_result_name, get_eps, get_D, get_H, nointerpolation, unfold_symmetry) ## If required, we now transfer the field data to Python and package it up if not on_cad_only: fields_dict = lumapi.getVar(fdtd.handle, field_result_name) if get_eps: if fdtd.getnamednumber('varFDTD') == 1: if 'index_x' in fields_dict['index'] and 'index_y' in fields_dict['index'] and not 'index_z' in fields_dict['index']: # varFDTD TE simulation fields_dict['index']['index_z'] = fields_dict['index']['index_x']*0.0 + 1.0 elif not 'index_x' in fields_dict['index'] and not 'index_y' in fields_dict['index'] and 'index_z' in fields_dict['index']: # varFDTD TM simulation fields_dict['index']['index_x'] = fields_dict['index']['index_z']*0.0 + 1.0 fields_dict['index']['index_y'] = fields_dict['index']['index_x'] assert 'index_x' in fields_dict['index'] and 'index_y' in fields_dict['index'] and 'index_z' in fields_dict['index'] fields_eps = np.stack((np.power(fields_dict['index']['index_x'], 2), np.power(fields_dict['index']['index_y'], 2), np.power(fields_dict['index']['index_z'], 2)), axis = -1) else: fields_eps = None fields_D = fields_dict['E']['E'] * fields_eps * sp.constants.epsilon_0 if get_D else None fields_H = fields_dict['H']['H'] if get_H else None if nointerpolation: deltas = [fields_dict['delta']['x'], fields_dict['delta']['y'], fields_dict['delta']['z']] return FieldsNoInterp(fields_dict['E']['x'], fields_dict['E']['y'], fields_dict['E']['z'], fields_dict['E']['lambda'], deltas, fields_dict['E']['E'], fields_D, fields_eps, fields_H) else: return Fields(fields_dict['E']['x'], fields_dict['E']['y'], fields_dict['E']['z'], fields_dict['E']['lambda'], fields_dict['E']['E'], fields_D, fields_eps, fields_H)
def run_EME(contraDC, simulation_setup, close=True): mode = lumapi.open('mode') projectname = 'ContraDC_EME' filename = 'ContraDC_EMEscript' command = 'cd("%s");' % dir_path command += 'min_wavelength=%s;' % simulation_setup.lambda_start command += 'max_wavelength=%s;' % simulation_setup.lambda_end command += 'grating_period=%s;' % contraDC.period command += 'Wa=%s;' % contraDC.w1 command += 'Wb=%s;' % contraDC.w2 command += 'dWa=%s;' % contraDC.dW1 command += 'dWb=%s;' % contraDC.dW2 command += 'gap=%s;' % contraDC.gap command += 'number_of_periods=%s;' % contraDC.N command += 'wl_ref = %s;' % simulation_setup.central_lambda if contraDC.pol == 'TE': command += "pol='TE';" else: command += "pol='TM';" command += "load('%s');" % projectname command += '%s;' % filename lumapi.evalScript(mode, command) delta_lambda_contra = lumapi.getVar(mode, "delta_lambda") lambda_contra = lumapi.getVar(mode, "lambda0") delta_lambda_self1 = lumapi.getVar(mode, "delta_lambda_self1") delta_lambda_self2 = lumapi.getVar(mode, "delta_lambda_self2") if close == True: lumapi.close(mode) return [ delta_lambda_contra, delta_lambda_self1, delta_lambda_self2, lambda_contra ]
def get_lumerical_permitivities(self,wavelengths=[1550e-9]): '''Fetches the index from Lumerical if a string was given as the input for the object, and squares it to get the permittivity''' handle=lumapi.open('fdtd') lumapi.putMatrix(handle,'wavelengths',np.array(wavelengths)) lumapi.evalScript(handle,'permittivities=getindex("{}",c/wavelengths);'.format(self.material)) indexes= lumapi.getVar(handle,'permittivities') lumapi.close(handle) permittivities=np.array(indexes)**2 return permittivities.squeeze()
def run_mode(contraDC, simulation_setup, close=False): global mode if not (mode): mode = lumapi.open("mode") # feed parameters into model command = "gap = %s; width_1 = %s; width_2 = %s; thick_Si = %s; period = %s;" lumapi.evalScript( mode, command % (contraDC.gap, contraDC.w1, contraDC.w2, contraDC.thick_si, contraDC.period), ) command = "wavelength = %s; wavelength_stop = %s;" lumapi.evalScript( mode, "wavelength = %s; wavelength_stop = %s;" % (simulation_setup.lambda_start, simulation_setup.lambda_end), ) if contraDC.pol == "TE": lumapi.evalScript(mode, "pol = 'TE';") elif contraDC.pol == "TM": lumapi.evalScript(mode, "pol = 'TM';") if contraDC.slab: lumapi.evalScript(mode, "slab = 1;") lumapi.evalScript(mode, "thick_Slab = %s;" % (contraDC.thick_slab)) else: lumapi.evalScript(mode, "slab = 0;") lumapi.evalScript(mode, "thick_Slab = 0;") # run dispersion analysis script lumapi.evalScript(mode, "cd('%s');" % dir_path) lumapi.evalScript(mode, "dispersion_2WG;") # contra-directional coupling neff_data = lumapi.getVar(mode, "n_eff_data") lambda_fit = lumapi.getVar(mode, "lambda_fit") ng_contra = lumapi.getVar(mode, "ng0") # self-coupling ng1 = lumapi.getVar(mode, "ng0_self1") ng2 = lumapi.getVar(mode, "ng0_self2") lambda_self1 = lumapi.getVar(mode, "self1_lambda") lambda_self2 = lumapi.getVar(mode, "self2_lambda") if close: lumapi.close(mode) return [neff_data, lambda_fit, ng_contra, ng1, ng2, lambda_self1, lambda_self2]
def run_mode(contraDC, simulation_setup, close=True): mode = lumapi.open('mode') # feed parameters into model command = "gap = %s; width_1 = %s; width_2 = %s; thick_Si = %s; period = %s;" lumapi.evalScript( mode, command % (contraDC.gap, contraDC.w1, contraDC.w2, contraDC.thick_si, contraDC.period)) command = "wavelength = %s; wavelength_stop = %s;" lumapi.evalScript( mode, "wavelength = %s; wavelength_stop = %s;" % (simulation_setup.lambda_start, simulation_setup.lambda_end)) if contraDC.pol == 'TE': lumapi.evalScript(mode, "pol = 1;") elif contraDC.pol == 'TM': lumapi.evalScript(mode, "pol = 2;") if contraDC.slab == True: lumapi.evalScript(mode, "slab = 1;") lumapi.evalScript(mode, "thick_Slab = %s;" % (contraDC.thick_slab)) else: lumapi.evalScript(mode, "slab = 0;") lumapi.evalScript(mode, "thick_Slab = 0;") # run dispersion analysis script lumapi.evalScript(mode, "cd('%s');" % dir_path) lumapi.evalScript(mode, 'dispersion_2WG;') # contra-directional coupling neff_data = lumapi.getVar(mode, 'n_eff_data') lambda_fit = lumapi.getVar(mode, 'lambda_fit') ng_contra = lumapi.getVar(mode, 'ng0') # self-coupling ng1 = lumapi.getVar(mode, 'ng0_self1') ng2 = lumapi.getVar(mode, 'ng0_self2') lambda_self1 = lumapi.getVar(mode, 'self1_lambda') lambda_self2 = lumapi.getVar(mode, 'self2_lambda') if close == True: lumapi.close(mode) return [ neff_data, lambda_fit, ng_contra, ng1, ng2, lambda_self1, lambda_self2 ]
def spatial_gradient_integral_on_cad(sim, forward_fields, adjoint_fields, wl_scaling_factor): lumapi.putMatrix(sim.fdtd.handle, "wl_scaling_factor", wl_scaling_factor) sim.fdtd.eval( "gradient_fields = 2.0 * eps0 * {0}.E.E * {1}.E.E;".format( forward_fields, adjoint_fields) + "num_opt_params = length(d_epses);" + "num_wl_pts = length({0}.E.lambda);".format(forward_fields) + "partial_fom_derivs_vs_lambda = matrix(num_wl_pts, num_opt_params);" + "for(param_idx = [1:num_opt_params]){" + " for(wl_idx = [1:num_wl_pts]){" + " spatial_integrand = pinch(sum(gradient_fields(:,:,:,wl_idx,:) * wl_scaling_factor(wl_idx) * d_epses{param_idx}, 5), 4);" + " partial_fom_derivs_vs_lambda(wl_idx, param_idx) = integrate2(spatial_integrand, [1,2,3], {0}.E.x, {0}.E.y, {0}.E.z);" .format(forward_fields) + " }" + "}") partial_fom_derivs_vs_lambda = lumapi.getVar( sim.fdtd.handle, 'partial_fom_derivs_vs_lambda') sim.fdtd.eval( "clear(param_idx, wl_idx, num_opt_params, num_wl_pts, spatial_integrand, gradient_fields, wl_scaling_factor, partial_fom_derivs_vs_lambda, d_epses, {0}, {1});" .format(forward_fields, adjoint_fields)) return partial_fom_derivs_vs_lambda