def testGMRES(self): # Parameter input ---------------------------- vacuum_wavelength = 550 beam_polar_angle = np.pi * 7 / 8 beam_azimuthal_angle = np.pi * 1 / 3 beam_polarization = 0 beam_amplitude = 1 beam_neff_array = np.linspace(0, 2, 501, endpoint=False) beam_waist = 1000 beam_focal_point = [200, 200, 200] #neff_waypoints = [0, 0.5, 0.8 - 0.01j, 2 - 0.01j, 2.5, 5] #neff_discr = 1e-2 # -------------------------------------------- #coord.set_default_k_parallel(vacuum_wavelength, neff_waypoints, neff_discr) # initialize particle object sphere1 = part.Sphere(position=[100, 100, 150], refractive_index=2.4 + 0.0j, radius=110, l_max=4, m_max=4) sphere2 = part.Sphere(position=[-100, -100, 250], refractive_index=1.9 + 0.0j, radius=120, l_max=3, m_max=3) sphere3 = part.Sphere(position=[-200, 100, 300], refractive_index=1.7 + 0.0j, radius=90, l_max=3, m_max=3) particle_list = [sphere1, sphere2, sphere3] # initialize layer system object lay_sys = lay.LayerSystem([0, 400, 0], [2, 1.4, 2]) # initialize initial field object init_fld = init.GaussianBeam(vacuum_wavelength=vacuum_wavelength, polar_angle=beam_polar_angle, azimuthal_angle=beam_azimuthal_angle, polarization=beam_polarization, amplitude=beam_amplitude, reference_point=beam_focal_point, beam_waist=beam_waist, k_parallel_array=beam_neff_array * flds.angular_frequency(vacuum_wavelength)) # initialize simulation object simulation_lu = simul.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, solver_type='LU', log_to_terminal='nose2' not in sys.modules.keys()) # suppress output if called by nose simulation_lu.run() coefficients_lu = particle_list[0].scattered_field.coefficients simulation_gmres = simul.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, solver_type='gmres', solver_tolerance=1e-5, log_to_terminal=( not sys.argv[0].endswith('nose2'))) # suppress output if called by nose simulation_gmres.run() coefficients_gmres = particle_list[0].scattered_field.coefficients np.testing.assert_allclose(np.linalg.norm(coefficients_lu), np.linalg.norm(coefficients_gmres), rtol=1e-5)
# initialize particle object part1 = part.Sphere(position=[100,100,150], refractive_index=2.4+0.0j, radius=120, l_max=lmax) part2 = part.Sphere(position=[-100,-100,250], refractive_index=1.9+0.1j, radius=120, l_max=lmax) # initialize layer system object lay_sys1 = lay.LayerSystem([0, 400, 0], [1.5, 1.7, 1]) lay_sys2 = lay.LayerSystem([0, 200, 200, 0], [1.5, 1.7, 1.7, 1]) # initialize initial field object plane_wave = init.PlaneWave(vacuum_wavelength=vacuum_wavelength, polar_angle=plane_wave_polar_angle, azimuthal_angle=plane_wave_azimuthal_angle, polarization=plane_wave_polarization, amplitude=plane_wave_amplitude, reference_point=[0, 0, 400]) # initialize simulation object simulation1 = simul.Simulation(layer_system=lay_sys1, particle_list=[part1,part2], initial_field=plane_wave, log_to_terminal=(not sys.argv[0].endswith('nose2'))) # suppress output if called by nose simulation1.run() simulation2 = simul.Simulation(layer_system=lay_sys2, particle_list=[part1,part2], initial_field=plane_wave, log_to_terminal=(not sys.argv[0].endswith('nose2'))) # suppress output if called by nose simulation2.run() ff = farf.scattered_far_field(vacuum_wavelength=vacuum_wavelength, particle_list=simulation1.particle_list, layer_system=simulation1.layer_system) def test_equivalent_layer_systems(): relerr = (np.linalg.norm(simulation1.linear_system.coupling_matrix.linear_operator.A - simulation2.linear_system.coupling_matrix.linear_operator.A) / np.linalg.norm(simulation1.linear_system.coupling_matrix.linear_operator.A)) print(relerr)
particle_list = [sphere1, sphere2, sphere3] # initialize layer system object lay_sys = lay.LayerSystem([0, 400, 0], [2, 1.3, 2]) # initialize initial field object init_fld = init.PlaneWave(vacuum_wavelength=vacuum_wavelength, polar_angle=plane_wave_polar_angle, azimuthal_angle=plane_wave_azimuthal_angle, polarization=plane_wave_polarization, amplitude=plane_wave_amplitude, reference_point=[0, 0, 400]) # initialize simulation object simulation = simul.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, log_to_terminal=False) simulation.run() scs = sf.scattering_cross_section(initial_field=simulation.initial_field, particle_list=simulation.particle_list, layer_system=simulation.layer_system) ecs = sf.extinction_cross_section(initial_field=simulation.initial_field, particle_list=simulation.particle_list, layer_system=simulation.layer_system) def test_optical_theorem(): relerr = abs((sum(scs.integral()) - ecs['top'] - ecs['bottom']) / sum(scs.integral()))
l_max=lmax) four_particles = [sphere, cylinder, prolate, oblate] # layer system three_layers = lay.LayerSystem(thicknesses=[0, 500, 0], refractive_indices=[1 + 6j, 2, 1.5]) # dipole source dipole = init.DipoleSource(vacuum_wavelength=vacuum_wavelength, dipole_moment=[1, 0, 0], position=[0, 0, 250]) # run simulation simulation = simul.Simulation(layer_system=three_layers, particle_list=four_particles, initial_field=dipole) simulation.run() # near field scat_fld_exp = sf.scattered_field_piecewise_expansion(vacuum_wavelength, four_particles, three_layers) # field along probing line ---------------------------------------------------- x_line = np.arange(-1500, 1501, 10) y_line = x_line - x_line z_line = y_line + 750 e_scat = scat_fld_exp.electric_field(x=x_line, y=y_line, z=z_line) e_init = simulation.initial_field.electric_field(x=x_line,
polar_angle=0, azimuthal_angle=0, polarization=0, amplitude=1, reference_point=rD) planewave2 = init.PlaneWave(vacuum_wavelength=ld, polar_angle=polar_angle, azimuthal_angle=azimuthal_angle, polarization=0, amplitude=1, reference_point=rD2) # run simulation simulation = simul.Simulation( layer_system=lay_sys, particle_list=part_list, initial_field=planewave, log_to_terminal=(not sys.argv[0].endswith('nose2') )) # suppress output if called by nose simulation2 = simul.Simulation( layer_system=lay_sys, particle_list=part_list2, initial_field=planewave2, log_to_terminal=(not sys.argv[0].endswith('nose2') )) # suppress output if called by nose simulation.run() simulation2.run() scattered_ff = scf.scattered_far_field(ld, simulation.particle_list, simulation.layer_system) scattered_ff_2 = scf.scattered_far_field(ld, simulation2.particle_list, simulation2.layer_system)
# initialize layer system objects lay_sys_air = lay.LayerSystem([0, 0], [n_air, n_air]) lay_sys_water = lay.LayerSystem([0, 0], [n_water, n_water]) # initialize initial field object init_fld = init.PlaneWave(vacuum_wavelength=vacuum_wavelength, polar_angle=0, azimuthal_angle=0, polarization=0, amplitude=1, reference_point=[0, 0, 0]) # simulation of dielectric sphere simulation_diel = sim.Simulation( layer_system=lay_sys_air, particle_list=[diel_sphere], initial_field=init_fld, log_to_terminal=(not sys.argv[0].endswith('nose2'))) simulation_diel.run() intfld_diel = ifld.internal_field_piecewise_expansion( vacuum_wavelength=vacuum_wavelength, particle_list=[diel_sphere], layer_system=lay_sys_air) E_diel = np.array(intfld_diel.electric_field(x, y, z)) # simulation of metallic sphere simulation_metal = sim.Simulation( layer_system=lay_sys_water, particle_list=[metal_sphere],
w12 = direct_coupling_block(vacuum_wavelength, sphere1, sphere2, lay_sys) phi13 = np.arctan2(sphere1.position[1] - sphere3.position[1], sphere1.position[0] - sphere3.position[0]) rho13 = np.sqrt(sum([(sphere1.position[i]-sphere3.position[i])**2 for i in range(3)])) sz13 = sphere1.position[2] + sphere3.position[2] dz13 = sphere1.position[2] - sphere3.position[2] wr13 = layer_mediated_coupling_block(vacuum_wavelength, sphere1, sphere3, lay_sys) w13 = direct_coupling_block(vacuum_wavelength, sphere1, sphere3, lay_sys) # initialize initial field object init_fld = init.PlaneWave(vacuum_wavelength=vacuum_wavelength, polar_angle=polar_angle,azimuthal_angle=azimuthal_angle, polarization=polarization, amplitude=amplitude) # initialize simulation object simulation_direct = simul.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, solver_type='LU', store_coupling_matrix=True, log_to_terminal=(not sys.argv[0].endswith('nose2'))) # suppress output if called by nose simulation_direct.run() coefficients_direct = particle_list[0].scattered_field.coefficients cu.enable_gpu() simulation_lookup_linear_gpu = simul.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, solver_type='gmres', store_coupling_matrix=False, coupling_matrix_lookup_resolution=lookup_resol, coupling_matrix_interpolator_kind='linear', log_to_terminal=(not sys.argv[0].endswith('nose2'))) # suppress output if called by nose simulation_lookup_linear_gpu.run() coefficients_lookup_linear_gpu = particle_list[0].scattered_field.coefficients simulation_lookup_cubic_gpu = simul.Simulation(layer_system=lay_sys, particle_list=particle_list,
# initialize layer system object lay_sys = lay.LayerSystem( [0, 0], [substrate_refractive_index, surrounding_medium_refractive_index]) # initialize initial field object init_fld = init.PlaneWave(vacuum_wavelength=vacuum_wavelength, polar_angle=plane_wave_polar_angle, azimuthal_angle=plane_wave_azimuthal_angle, polarization=plane_wave_polarization, amplitude=plane_wave_amplitude, reference_point=[0, 0, 0]) # simulation simulation = sim.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld) simulation.run() def test_versus_prototype(): b0 = -0.2586209 + 0.8111274j assert abs( (particle_list[0].scattered_field.coefficients[0] - b0) / b0) < 1e-4 b10 = -1.5103858e-04 - 4.1782795e-04j assert abs( (particle_list[0].scattered_field.coefficients[10] - b10) / b10) < 1e-4 b21 = -0.0795316 + 0.0194518j assert abs( (particle_list[0].scattered_field.coefficients[21] - b21) / b21) < 1e-4
planewave = init.PlaneWave(vacuum_wavelength=ld, polar_angle=0, azimuthal_angle=0, polarization=0, amplitude=1, reference_point=rD) planewave2 = init.PlaneWave(vacuum_wavelength=ld, polar_angle=polar_angle, azimuthal_angle=azimuthal_angle, polarization=0, amplitude=1, reference_point=rD2) # run simulation simulation = simul.Simulation(layer_system=lay_sys, particle_list=part_list, initial_field=planewave) simulation2 = simul.Simulation(layer_system=lay_sys, particle_list=part_list2, initial_field=planewave2) simulation.run() simulation2.run() scattered_ff = scf.scattered_far_field(ld, simulation.particle_list, simulation.layer_system) scattered_ff_2 = scf.scattered_far_field(ld, simulation2.particle_list, simulation2.layer_system) def test_t_matrix_rotation(): err = (sum(scattered_ff.integral()) - sum(scattered_ff_2.integral())) / sum(scattered_ff.integral())
# initialize layer system object lay_sys = lay.LayerSystem([0, 400, 0], [2, 1.3, 2]) # initialize dipole object dipole = init.DipoleSource(vacuum_wavelength=ld, dipole_moment=D, position=rD, k_parallel_array=k_parallel_array) # run simulation simulation = simul.Simulation( layer_system=lay_sys, particle_list=part_list, initial_field=dipole, log_to_terminal=(not sys.argv[0].endswith('nose2') ), # suppress output if called by nose neff_waypoints=waypoints, neff_resolution=neff_discr, k_parallel=k_parallel_array) simulation.set_default_contours() simulation.run() power_hom = dipole.dissipated_power_homogeneous_background( layer_system=simulation.layer_system) power = dipole.dissipated_power(particle_list=simulation.particle_list, layer_system=simulation.layer_system) power2 = dipole.dissipated_power_alternative( particle_list=simulation.particle_list,
def testElectricField(self): try: import pycuda.autoinit except ImportError: self.skipTest('PyCUDA is not available') ld = 550 rD = [100, -100, 100] D = [1e7, 2e7, 3e7] #waypoints = [0, 0.8, 0.8 - 0.1j, 2.1 - 0.1j, 2.1, 4] #neff_discr = 2e-2 #coord.set_default_k_parallel(vacuum_wavelength=ld, neff_waypoints=waypoints, neff_resolution=neff_discr) # initialize particle object sphere1 = part.Sphere(position=[200, 200, 300], refractive_index=2.4 + 0.0j, radius=110, l_max=3, m_max=3) sphere2 = part.Sphere(position=[-200, -200, 300], refractive_index=2.4 + 0.0j, radius=120, l_max=3, m_max=3) sphere3 = part.Sphere(position=[-200, 200, 300], refractive_index=2.5 + 0.0j, radius=90, l_max=3, m_max=3) part_list = [sphere1, sphere2, sphere3] # initialize layer system object lay_sys = lay.LayerSystem([0, 400, 0], [1 + 6j, 2.3, 1.5]) # initialize dipole object dipole = init.DipoleSource(vacuum_wavelength=ld, dipole_moment=D, position=rD) # run simulation simulation = simul.Simulation( layer_system=lay_sys, particle_list=part_list, initial_field=dipole, log_to_terminal='nose2' not in sys.modules.keys()) # suppress output if called by nose simulation.run() xarr = np.array([-300, 400, -100, 200]) yarr = np.array([200, -100, 400, 300]) zarr = np.array([-50, 200, 600, 700]) scat_fld_exp = sf.scattered_field_piecewise_expansion( ld, part_list, lay_sys) e_x_scat_cpu, e_y_scat_cpu, e_z_scat_cpu = scat_fld_exp.electric_field( xarr, yarr, zarr) e_x_init_cpu, e_y_init_cpu, e_z_init_cpu = simulation.initial_field.electric_field( xarr, yarr, zarr, lay_sys) cu.enable_gpu() scat_fld_exp = sf.scattered_field_piecewise_expansion( ld, part_list, lay_sys) e_x_scat_gpu, e_y_scat_gpu, e_z_scat_gpu = scat_fld_exp.electric_field( xarr, yarr, zarr) e_x_init_gpu, e_y_init_gpu, e_z_init_gpu = simulation.initial_field.electric_field( xarr, yarr, zarr, lay_sys) np.testing.assert_allclose(np.linalg.norm(e_x_scat_cpu), np.linalg.norm(e_x_scat_gpu), rtol=1e-5) np.testing.assert_allclose(np.linalg.norm(e_y_scat_cpu), np.linalg.norm(e_y_scat_gpu), rtol=1e-5) np.testing.assert_allclose(np.linalg.norm(e_z_scat_cpu), np.linalg.norm(e_z_scat_gpu), rtol=1e-5) np.testing.assert_allclose(np.linalg.norm(e_x_init_cpu), np.linalg.norm(e_x_init_gpu), rtol=1e-5) np.testing.assert_allclose(np.linalg.norm(e_y_init_cpu), np.linalg.norm(e_y_init_gpu), rtol=1e-5) np.testing.assert_allclose(np.linalg.norm(e_z_init_cpu), np.linalg.norm(e_z_init_gpu), rtol=1e-5)
dipole3 = init.DipoleSource(vacuum_wavelength=ld, dipole_moment=D3, position=rD3) dipole_collection = init.DipoleCollection( vacuum_wavelength=ld, compute_swe_by_pwe=False, compute_dissipated_power_by_pwe=False) dipole_collection.append(dipole1) dipole_collection.append(dipole2) dipole_collection.append(dipole3) # run simulation simulation = simul.Simulation(layer_system=lay_sys, particle_list=part_list, initial_field=dipole_collection, log_to_terminal=False) simulation.run() # evaluate power power_list = simulation.initial_field.dissipated_power( particle_list=simulation.particle_list, layer_system=simulation.layer_system) power = sum(power_list) ff_tup = sf.total_far_field(simulation.initial_field, simulation.particle_list, simulation.layer_system) def test_energy_conservation():
sphere1 = part.Sphere(position=[100, 100, 150], refractive_index=2.4 + 0.0j, radius=110, l_max=4, m_max=4) sphere2 = part.Sphere(position=[-100, -100, 250], refractive_index=1.9 + 0.0j, radius=120, l_max=3, m_max=3) sphere3 = part.Sphere(position=[-200, 100, 300], refractive_index=1.7 + 0.0j, radius=90, l_max=3, m_max=3) particle_list = [sphere1, sphere2, sphere3] # initialize layer system object lay_sys = lay.LayerSystem([0, 400, 0], [2, 1.4, 2]) # initialize initial field object init_fld = init.GaussianBeam(vacuum_wavelength=vacuum_wavelength, polar_angle=beam_polar_angle, azimuthal_angle=beam_azimuthal_angle, polarization=beam_polarization, amplitude=beam_amplitude, reference_point=beam_focal_point, beam_waist=beam_waist, k_parallel_array=beam_neff_array*coord.angular_frequency(vacuum_wavelength)) # initialize simulation object simulation_lu = simul.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, solver_type='LU') simulation_lu.run() coefficients_lu = particle_list[0].scattered_field.coefficients simulation_gmres = simul.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, solver_type='gmres', solver_tolerance=1e-5) simulation_gmres.run() coefficients_gmres = particle_list[0].scattered_field.coefficients def test_result(): relerr = np.linalg.norm(coefficients_lu - coefficients_gmres) / np.linalg.norm(coefficients_lu) print('relative error: ', relerr) assert relerr < 1e-5 if __name__ == '__main__': test_result()
spheroid2 = part.Spheroid(position=[0, 0, 200], polar_angle=polar_angle, azimuthal_angle=azimuthal_angle, refractive_index=2.4, semi_axis_c=100, semi_axis_a=50, l_max=8, m_max=8) part_list = [spheroid1] part_list2 = [spheroid2] # initialize layer system object lay_sys = lay.LayerSystem([0, 800, 0], [1, 1, 1]) # initialize plane wave objects planewave = init.PlaneWave(vacuum_wavelength=ld, polar_angle=0, azimuthal_angle=0, polarization=0, amplitude=1, reference_point=rD) planewave2 = init.PlaneWave(vacuum_wavelength=ld, polar_angle=polar_angle, azimuthal_angle=azimuthal_angle, polarization=0, amplitude=1, reference_point=rD2) # run simulation simulation = simul.Simulation(layer_system=lay_sys, particle_list=part_list, initial_field=planewave, log_to_terminal=False) simulation2 = simul.Simulation(layer_system=lay_sys, particle_list=part_list2, initial_field=planewave2, log_to_terminal=False) simulation.run() simulation2.run() scattered_ff = scf.scattered_far_field(ld, simulation.particle_list, simulation.layer_system) scattered_ff_2 = scf.scattered_far_field(ld, simulation2.particle_list, simulation2.layer_system) def test_t_matrix_rotation(): err = (sum(scattered_ff.integral()) - sum(scattered_ff_2.integral())) / sum(scattered_ff.integral()) print('error t_matrix_rotation', err) assert err < 1e-4 if __name__ == '__main__': test_rotation()
# initialize initial field object init_fld = init.GaussianBeam(vacuum_wavelength=vacuum_wavelength, polar_angle=beam_polar_angle, azimuthal_angle=beam_azimuthal_angle, polarization=beam_polarization, amplitude=beam_amplitude, reference_point=beam_focal_point, beam_waist=beam_waist, k_parallel_array=beam_neff_array * coord.angular_frequency(vacuum_wavelength)) # initialize simulation object simulation_direct = simul.Simulation(layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, solver_type='LU', store_coupling_matrix=True, log_to_terminal=False) simulation_direct.run() coefficients_direct = particle_list[0].scattered_field.coefficients cu.enable_gpu() simulation_lookup_linear_gpu = simul.Simulation( layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, solver_type='gmres', store_coupling_matrix=False, coupling_matrix_lookup_resolution=lookup_resol, coupling_matrix_interpolator_kind='linear', log_to_terminal=False)
dipole3 = init.DipoleSource(vacuum_wavelength=ld, dipole_moment=D3, position=rD3) dipole_collection = init.DipoleCollection( vacuum_wavelength=ld, compute_swe_by_pwe=False, compute_dissipated_power_by_pwe=False) dipole_collection.append(dipole1) dipole_collection.append(dipole2) dipole_collection.append(dipole3) # run simulation simulation = simul.Simulation( layer_system=lay_sys, particle_list=part_list, initial_field=dipole_collection, log_to_terminal=(not sys.argv[0].endswith('nose2') )) # suppress output if called by nose simulation.run() # evaluate power power_list = simulation.initial_field.dissipated_power( particle_list=simulation.particle_list, layer_system=simulation.layer_system) power = sum(power_list) ff_tup = farf.total_far_field(simulation.initial_field, simulation.particle_list, simulation.layer_system)
lay_sys = lay.LayerSystem( [0, 0], [substrate_refractive_index, surrounding_medium_refractive_index]) # initialize initial field object init_fld = init.PlaneWave(vacuum_wavelength=vacuum_wavelength, polar_angle=plane_wave_polar_angle, azimuthal_angle=plane_wave_azimuthal_angle, polarization=plane_wave_polarization, amplitude=plane_wave_amplitude, reference_point=[0, 0, 0]) # simulation simulation = sim.Simulation( layer_system=lay_sys, particle_list=particle_list, initial_field=init_fld, log_to_terminal=(not sys.argv[0].endswith('nose2') ), # suppress output if called by nose neff_waypoints=neff_waypoints, neff_resolution=neff_discr) simulation.run() def test_versus_prototype(): b0 = -0.2586209 + 0.8111274j assert abs( (particle_list[0].scattered_field.coefficients[0] - b0) / b0) < 1e-4 b10 = -1.5103858e-04 - 4.1782795e-04j assert abs( (particle_list[0].scattered_field.coefficients[10] - b10) / b10) < 1e-4 b21 = -0.0795316 + 0.0194518j
nS = 1.5 RS = 100 # -------------------------------------------- coord.set_default_k_parallel(vacuum_wavelength=ld, neff_waypoints=waypoints, neff_resolution=neff_discr) dipole = init.DipoleSource(vacuum_wavelength=ld, dipole_moment=D, position=rD) laysys = lay.LayerSystem(thicknesses=thick, refractive_indices=n) particle = smuthi.particles.Sphere(position=rS, l_max=3, m_max=3, refractive_index=nS, radius=RS) simulation = simul.Simulation(layer_system=laysys, particle_list=[particle], initial_field=dipole, log_to_terminal=False) aI = dipole.spherical_wave_expansion(particle, laysys) def test_SWE_coefficients_against_prototype(): aI0 = -0.042563330382109 - 1.073039889335632j err0 = abs((aI.coefficients[0] - aI0) / aI0) aI10 = 0.496704638004303 + 0.908744692802429j err10 = abs((aI.coefficients[10] - aI10) / aI10) aI20 = 1.209331750869751 - 2.165398836135864j err20 = abs((aI.coefficients[20] - aI20) / aI20)
# initialize layer system object lay_sys1 = lay.LayerSystem([0, 400, 0], [1.5, 1.7, 1]) lay_sys2 = lay.LayerSystem([0, 200, 200, 0], [1.5, 1.7, 1.7, 1]) # initialize initial field object plane_wave = init.PlaneWave(vacuum_wavelength=vacuum_wavelength, polar_angle=plane_wave_polar_angle, azimuthal_angle=plane_wave_azimuthal_angle, polarization=plane_wave_polarization, amplitude=plane_wave_amplitude, reference_point=[0, 0, 400]) # initialize simulation object simulation1 = simul.Simulation(layer_system=lay_sys1, particle_list=[part1, part2], initial_field=plane_wave) simulation1.run() simulation2 = simul.Simulation(layer_system=lay_sys2, particle_list=[part1, part2], initial_field=plane_wave) simulation2.run() ff = sf.scattered_far_field(vacuum_wavelength=vacuum_wavelength, particle_list=simulation1.particle_list, layer_system=simulation1.layer_system) def test_equivalent_layer_systems(): relerr = (np.linalg.norm(
nS = 1.5 RS = 100 # -------------------------------------------- coord.set_default_k_parallel(vacuum_wavelength=ld, neff_waypoints=waypoints, neff_resolution=neff_discr) dipole = init.DipoleSource(vacuum_wavelength=ld, dipole_moment=D, position=rD) laysys = lay.LayerSystem(thicknesses=thick, refractive_indices=n) particle = smuthi.particles.Sphere(position=rS, l_max=3, m_max=3, refractive_index=nS, radius=RS) simulation = simul.Simulation(layer_system=laysys, particle_list=[particle], initial_field=dipole) aI = dipole.spherical_wave_expansion(particle, laysys) def test_SWE_coefficients_against_prototype(): aI0 = -0.042563330382109 - 1.073039889335632j err0 = abs((aI.coefficients[0] - aI0) / aI0) aI10 = 0.496704638004303 + 0.908744692802429j err10 = abs((aI.coefficients[10] - aI10) / aI10) aI20 = 1.209331750869751 - 2.165398836135864j err20 = abs((aI.coefficients[20] - aI20) / aI20)
# initialize particle object part1 = part.Sphere(position=[100,100,150], refractive_index=2.4+0.0j, radius=120, l_max=lmax) part2 = part.Sphere(position=[-100,-100,250], refractive_index=1.9+0.1j, radius=120, l_max=lmax) # initialize layer system object lay_sys1 = lay.LayerSystem([0, 400, 0], [1.5, 1.7, 1]) lay_sys2 = lay.LayerSystem([0, 200, 200, 0], [1.5, 1.7, 1.7, 1]) # initialize initial field object plane_wave = init.PlaneWave(vacuum_wavelength=vacuum_wavelength, polar_angle=plane_wave_polar_angle, azimuthal_angle=plane_wave_azimuthal_angle, polarization=plane_wave_polarization, amplitude=plane_wave_amplitude, reference_point=[0, 0, 400]) # initialize simulation object simulation1 = simul.Simulation(layer_system=lay_sys1, particle_list=[part1,part2], initial_field=plane_wave, log_to_terminal=False) simulation1.run() simulation2 = simul.Simulation(layer_system=lay_sys2, particle_list=[part1,part2], initial_field=plane_wave, log_to_terminal=False) simulation2.run() ff = sf.scattered_far_field(vacuum_wavelength=vacuum_wavelength, particle_list=simulation1.particle_list, layer_system=simulation1.layer_system) def test_equivalent_layer_systems(): relerr = (np.linalg.norm(simulation1.linear_system.coupling_matrix.linear_operator.A - simulation2.linear_system.coupling_matrix.linear_operator.A) / np.linalg.norm(simulation1.linear_system.coupling_matrix.linear_operator.A)) print(relerr) assert relerr < 1e-3