Example #1
0
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)
Example #2
0
## 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'])