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]
Ejemplo n.º 2
0
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
    ]
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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
    ]
Ejemplo n.º 5
0
    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()
Ejemplo n.º 6
0
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]
Ejemplo n.º 7
0
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
    ]
Ejemplo n.º 8
0
 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