monitor_options = { 'size_x': model.size_x, 'size_y': model.size_y, 'size_z': model.size_z, 'Kx': getattr(model, 'Kx', .0), 'Ky': getattr(model, 'Ky', .0), 'Kz': getattr(model, 'Kz', .0) } monitor1_Ex = AmplitudeMonitorVolume( comp=meep.Ex, **monitor_options ) ## TODO try out how it differs with comp=meep.Dx - this should work, too if not getattr(model, 'frequency_domain', None): ## time-domain computation f.step() dt = (f.time() / c) meep_utils.lorentzian_unstable_check_new(model, dt) timer = meep_utils.Timer(simtime=model.simtime) meep.quiet(True) # use custom progress messages while (f.time() / c < model.simtime): # timestepping cycle f.step() timer.print_progress(f.time() / c) for monitor in (monitor1_Ex, ): monitor.record(field=f) meep_utils.notify(model.simulation_name, run_time=timer.get_time()) else: ## frequency-domain computation f.solve_cw(getattr(model, 'MaxTol', 0.001), getattr(model, 'MaxIter', 5000), getattr(model, 'BiCGStab', 8)) for monitor in (monitor1_Ex, ): monitor.record(field=f) meep_utils.notify(model.simulation_name)
## Define monitors planes and visualisation output #monitor_options = {'size_x':model.size_x, 'size_y':model.size_y, 'Kx':model.Kx, 'Ky':model.Ky} #monitor1_Ex = meep_utils.AmplitudeMonitorPlane(comp=meep.Ex, z_position=model.monitor_z1, **monitor_options) #monitor1_Hy = meep_utils.AmplitudeMonitorPlane(comp=meep.Hy, z_position=model.monitor_z1, **monitor_options) #monitor2_Ex = meep_utils.AmplitudeMonitorPlane(comp=meep.Ex, z_position=model.monitor_z2, **monitor_options) #monitor2_Hy = meep_utils.AmplitudeMonitorPlane(comp=meep.Hy, z_position=model.monitor_z2, **monitor_options) #XXX TODO slice_makers = [meep_utils.Slice(model=model, field=f, components=(meep.Dielectric), at_t=0, name='EPS')] slice_makers += [meep_utils.Slice(model=model, field=f, components=meep.Ez, at_t=[0e-12, 100e-12], min_timestep=.025e-12, outputgif=True)] slice_makers += [meep_utils.Slice(model=model, field=f, components=meep.Ez, at_t=2.5e-12)] if not sim_param['frequency_domain']: ## time-domain computation f.step() dt = (f.time()/c) meep_utils.lorentzian_unstable_check_new(model, dt) timer = meep_utils.Timer(simtime=model.simtime); meep.quiet(True) # use custom progress messages while (f.time()/c < model.simtime): # timestepping cycle f.step() timer.print_progress(f.time()/c) #for monitor in (monitor1_Ex, monitor1_Hy, monitor2_Ex, monitor2_Hy): monitor.record(field=f) for slice_maker in slice_makers: slice_maker.poll(f.time()/c) for slice_maker in slice_makers: slice_maker.finalize() meep_utils.notify(model.simulation_name, run_time=timer.get_time()) else: ## frequency-domain computation f.step() f.solve_cw(sim_param['MaxTol'], sim_param['MaxIter'], sim_param['BiCGStab']) #for monitor in (monitor1_Ex, monitor1_Hy, monitor2_Ex, monitor2_Hy): monitor.record(field=f) for slice_maker in slice_makers: slice_maker.finalize() meep_utils.notify(model.simulation_name)
meep.vec(model.radius * .15, -model.radius * .25, -model.height * .15), meep.vec(model.radius * .15, -model.radius * .25, -model.height * .15)) field.add_volume_source( meep.Ez, src_time_type, srcvolume ) ## source of oblique polarization - excites both TE and TM modes field.add_volume_source(meep.Ex, src_time_type, srcvolume) slice_makers = [] #slice_makers += [meep_utils.Slice(model=model, field=field, components=(meep.Ex, meep.Ey, meep.Ez), at_t=3, name="ElectricAtEnd")] #slice_makers += [meep_utils.Slice(model=model, field=field, components=(meep.Hx, meep.Hy, meep.Hz), at_t=3, name="MagneticAtEnd")] #slice_makers = [meep_utils.Slice(model=model, field=field, components=(meep.Dielectric), at_t=0, name='EPS')] if not sim_param['frequency_domain']: ## time-domain computation field.step() dt = (field.time() / c) meep_utils.lorentzian_unstable_check_new(model, dt, quit_on_warning=False) timer = meep_utils.Timer(simtime=model.simtime) meep.quiet(True) # use custom progress messages monitor_point = meep.vec(-model.radius * .5, model.radius * .3, model.height * .3) x, y = [], [] while (field.time() / c < model.simtime): # timestepping cycle field.step() timer.print_progress(field.time() / c) if field.time() / c > 30 / model.src_width: x.append(field.time() / c) y.append( field.get_field(meep.Ex, monitor_point) + field.get_field(meep.Ey, monitor_point) + field.get_field(meep.Ez, monitor_point)) for slice_maker in slice_makers:
src_time_type = meep.continuous_src_time(-sim_param['frequency']/c) ## TODO check in freq domain that negative frequency is OK, and is it needed? srcvolume = meep.volume( meep.vec(model.radius*.15, -model.radius*.25, -model.height*.15), meep.vec(model.radius*.15, -model.radius*.25, -model.height*.15)) field.add_volume_source(meep.Ez, src_time_type, srcvolume) ## source of oblique polarization - excites both TE and TM modes field.add_volume_source(meep.Ex, src_time_type, srcvolume) slice_makers = [] #slice_makers += [meep_utils.Slice(model=model, field=field, components=(meep.Ex, meep.Ey, meep.Ez), at_t=3, name="ElectricAtEnd")] #slice_makers += [meep_utils.Slice(model=model, field=field, components=(meep.Hx, meep.Hy, meep.Hz), at_t=3, name="MagneticAtEnd")] #slice_makers = [meep_utils.Slice(model=model, field=field, components=(meep.Dielectric), at_t=0, name='EPS')] if not sim_param['frequency_domain']: ## time-domain computation field.step() dt = (field.time()/c) meep_utils.lorentzian_unstable_check_new(model, dt, quit_on_warning=False) timer = meep_utils.Timer(simtime=model.simtime); meep.quiet(True) # use custom progress messages monitor_point = meep.vec(-model.radius*.5, model.radius*.3, model.height*.3) x,y = [], [] while (field.time()/c < model.simtime): # timestepping cycle field.step() timer.print_progress(field.time()/c) if field.time()/c > 30/model.src_width: x.append(field.time()/c); y.append(field.get_field(meep.Ex, monitor_point)+field.get_field(meep.Ey, monitor_point)+field.get_field(meep.Ez, monitor_point)) for slice_maker in slice_makers: slice_maker.poll(field.time()/c) for slice_maker in slice_makers: slice_maker.finalize() meep_utils.notify(model.simulation_name, run_time=timer.get_time()) else: ## frequency-domain computation field.step() field.solve_cw(sim_param['MaxTol'], sim_param['MaxIter'], sim_param['BiCGStab'])