Пример #1
0
    def _grids_w_slab(self):
        position_src = self.start_media - 1
        position_obs = self.Nx - 3
        end_mur = self.Nx - 1
        for ind in self.indices:
            # Step 1: init grid
            w_grid = 'slab' + str(ind)
            w_grid = f.Grid(nx=self.Nx, dx=self.dx)

            # Step 2: init media
            w_grid[self.start_media:ind] = f.NonDispersiveMedia(name='media', permeability=1, permittivity=self.eps, conductivity=0)

            # Step 3: init source
            w_grid[position_src] = f.ActivatedSinus(name='SinsquaredActivated', wavelength=self.lamb, carrier_wavelength=10000.e-09, phase_shift=0, amplitude=self.ampl, tfsf=True)

            # Step 4: add observer
            w_grid[position_obs] = f.QuasiHarmonicObserver(name='firstobserver', first_timestep=self.timesteps-200)

            # Step 5: add boundaries
            w_grid[0] = f.LeftSideMur()
            w_grid[end_mur] = f.RightSideMur()

            # Step 6: run simulation
            w_grid.run_timesteps(timesteps=self.timesteps, vis=False)

            # Step 7: misc
            self.exp_amplitude.append(w_grid.local_observers[0].amplitude)
            self.exp_phase.append(w_grid.local_observers[0].phase)
            self.theo_amplitude.append(theory_dielectric_slab_complex(w_grid)[0])
            self.theo_phasenunterschied.append(theory_dielectric_slab_complex(w_grid)[1])
Пример #2
0
    def _grid_wo_slab(self):
        position_src = self.start_media - 1
        for grid in range(len(self.dx)):
            position_obs = self.Nx[grid] - 3
            end_mur = self.Nx[grid] - 1
            wo_grid = f.Grid(self.Nx[grid], dx=self.dx[grid], courant=self.courant)
            if wo_grid.courant == 1:
                wo_grid[position_src] = f.ActivatedSinus(name='SinsquaredActivated', wavelength=self.lamb,
                                                         carrier_wavelength=(self.lamb * 30), phase_shift=0,
                                                         amplitude=self.ampl, tfsf=True)
            else:
                wo_grid[position_src] = f.ActivatedSinus(name='SinsquaredActivated', wavelength=self.lamb,
                                                         carrier_wavelength=(self.lamb * 30), phase_shift=0,
                                                         amplitude=self.ampl, tfsf=False)
            wo_grid[position_obs] = f.QuasiHarmonicObserver(name='firstobserver', first_timestep=self.timesteps[grid]-200)

            if wo_grid.courant == 0.5:
                wo_grid[0] = f.LeftSideGridBoundary()
                wo_grid[end_mur] = f.RightSideGridBoundary()
            else:
                wo_grid[0] = f.LeftSideMur()
                wo_grid[end_mur] = f.RightSideMur()

            wo_grid.run_timesteps(self.timesteps[grid], vis=False)
            self.wo_phase_merged[grid] = wo_grid.local_observers[0].phase
Пример #3
0
 def _grid_wo_slab(self):
     position_src = self.start_media - 1
     position_obs = self.Nx - 3
     end_mur = self.Nx - 1
     wo_grid = f.Grid(self.Nx, dx=self.dx)
     wo_grid[position_src] = f.ActivatedSinus(name='SinsquaredActivated', wavelength=self.lamb, carrier_wavelength=10000.e-09, phase_shift=0, amplitude=self.ampl, tfsf=True)
     wo_grid[position_obs] = f.QuasiHarmonicObserver(name='firstobserver', first_timestep=self.timesteps-200)
     wo_grid[0] = f.LeftSideMur()
     wo_grid[end_mur] = f.RightSideMur()
     wo_grid.run_timesteps(self.timesteps, vis=False)
     self.wo_phase.append(wo_grid.local_observers[0].phase)
Пример #4
0
    def _grids_w_slab(self):
        position_src = self.start_media - 1
        for grid in range(len(self.dx)):
            position_obs = self.Nx[grid] - 3
            end_mur = self.Nx[grid] - 1
            for ind_media, ind_array in zip(self.indices[grid], range(self.length_media[grid])):
                # Step 1: init grid
                w_grid = 'slab' + str(ind_media)
                w_grid = f.Grid(nx=self.Nx[grid], dx=self.dx[grid], courant=self.courant)

                # Step 2: init media
                w_grid[self.start_media:ind_media] = f.LorentzMedium(name='media', permeability=1, eps_inf=self.eps_inf, conductivity=self.conductivity, gamma=self.gamma, chi_1=self.chi_1, chi_2=self.chi_2, chi_3=self.chi_3, w0=self.w0)

                # Step 3: init source
                if w_grid.courant == 1:
                    w_grid[position_src] = f.ActivatedSinus(name='SinsquaredActivated', wavelength=self.lamb,
                                                             carrier_wavelength=(self.lamb * 30), phase_shift=0,
                                                             amplitude=self.ampl, tfsf=True)
                else:
                    w_grid[position_src] = f.ActivatedSinus(name='SinsquaredActivated', wavelength=self.lamb,
                                                             carrier_wavelength=(self.lamb * 30), phase_shift=0,
                                                             amplitude=self.ampl, tfsf=False)

                # Step 4: add observer
                w_grid[position_obs] = f.QuasiHarmonicObserver(name='firstobserver', first_timestep=self.timesteps[grid]-200)

                # Step 5: add boundaries
                if w_grid.courant == 0.5:
                    w_grid[0] = f.LeftSideGridBoundary()
                    w_grid[end_mur] = f.RightSideGridBoundary()
                else:
                    w_grid[0] = f.LeftSideMur()
                    w_grid[end_mur] = f.RightSideMur()

                # Step 6: run simulation
                w_grid.run_timesteps(timesteps=self.timesteps[grid], vis=False)

                # Step 7: misc
                self.exp_amplitude_merged[grid][ind_array] = w_grid.local_observers[0].amplitude
                self.exp_phase_merged[grid][ind_array] = w_grid.local_observers[0].phase
                self.theo_amplitude_merged[grid][ind_array] = theory_dielectric_slab_complex(w_grid)[0]
                self.theo_phasenunterschied_merged[grid][ind_array] = theory_dielectric_slab_complex(w_grid)[1]

                # if list self.eps_real is empty:
                if self.eps_real is None:
                    self.eps_real = w_grid.materials[0].epsilon_real(w_grid.sources[0].omega)
                    self.eps_imag = w_grid.materials[0].epsilon_imag(w_grid.sources[0].omega)
                    self.eps_complex = w_grid.materials[0].epsilon_complex(w_grid.sources[0].omega)
                    self.n_real = np.sqrt((np.abs(self.eps_complex) + self.eps_real)/2)
Пример #5
0
    def _construct_non_vary_grid(self):
        end_mur = self.Nx - 1
        grid_non_vary = f.Grid(dx=self.dx, nx=self.Nx)
        grid_non_vary[0] = f.LeftSideMur()
        grid_non_vary[end_mur] = f.RightSideMur()
        grid_non_vary[self.position_src] = f.ActivatedSinus(name='Laser', wavelength=self.lamb, carrier_wavelength=6000e-09, tfsf=True, amplitude=self.ampl, phase_shift=0)
        grid_non_vary[self.position_obs] = f.QuasiHarmonicObserver(name='Observer', first_timestep=self.timesteps - 200)

        for layer_pair in self.layer_number:
            ti_start = self.starting_locations_ti[layer_pair]
            si_start = self.starting_locations_si[layer_pair]
            grid_non_vary[ti_start:si_start] = f.NonDispersiveMedia('TiO2', permittivity=self.ti_n**2, permeability=1, conductivity=0)
            grid_non_vary[si_start:(si_start+self.d_si)] = f.NonDispersiveMedia('SiO2', permittivity=self.si_n**2, permeability=1, conductivity=0)

        grid_non_vary.run_timesteps(self.timesteps)
        self.refl_ampl.append(grid_non_vary.local_observers[0].amplitude)
Пример #6
0
    def _construct_vary_grid(self):
        for layer in self.layer_number:
            Nx = (layer + 1) * (self.d_si + self.d_ti) + 12
            end_mur = Nx - 1
            grid_vary = f.Grid(dx=self.dx, nx=Nx)
            grid_vary[end_mur] = f.RightSideMur()
            grid_vary[0] = f.LeftSideMur()
            grid_vary[self.position_obs] = f.QuasiHarmonicObserver(name='Observer', first_timestep=self.timesteps - 300)
            grid_vary[self.position_src] = f.ActivatedSinus(name='Laser', wavelength=self.lamb, carrier_wavelength=6000e-09, tfsf=True, amplitude=self.ampl, phase_shift=0)

            for layers in range(0, layer + 1):
                ti_start = self.starting_locations_ti[layers]
                si_start = self.starting_locations_si[layers]
                grid_vary[ti_start:si_start] = f.NonDispersiveMedia('TiO2', permittivity=self.ti_n**2, permeability=1, conductivity=0)
                grid_vary[si_start:(si_start + self.d_si)] = f.NonDispersiveMedia('SiO2', permittivity=self.si_n**2, permeability=1, conductivity=0)

            grid_vary.run_timesteps(self.timesteps, vis=False)
            self.refl_ampl.append(grid_vary.local_observers[0].amplitude)
            self.theory_R.append(((self.si_n**(2*(layer+1))-self.ti_n**(2*(layer+1)))/(self.si_n**(2*(layer+1))+self.ti_n**(2*(layer+1))))**2)