import numpy as np from scipy.constants import c, epsilon_0, mu_0 import meep_utils, meep_materials, metamaterial_models from meep_utils import in_sphere, in_xcyl, in_ycyl, in_zcyl, in_xslab, in_yslab, in_zslab, in_ellipsoid import meep_mpi as meep #import meep # Model selection model_param = meep_utils.process_param(sys.argv[1:]) model = metamaterial_models.models[model_param.get('model', 'default')](**model_param) ## Initialize volume, structure and the fields according to the model vol = meep.vol3d(model.size_x, model.size_y, model.size_z, 1./model.resolution) vol.center_origin() s = meep_utils.init_structure(model=model, volume=vol, pml_axes=meep.Z) f = meep.fields(s) # Define the Bloch-periodic boundaries (any transversal component of k-vector is allowed) f.use_bloch(meep.X, getattr(model, 'Kx', 0) / (-2*np.pi)) f.use_bloch(meep.Y, getattr(model, 'Ky', 0) / (-2*np.pi)) # Add the field source (see meep_utils for an example of how an arbitrary source waveform is defined) if not getattr(model, 'frequency', None): ## (temporal source shape) #src_time_type = meep.band_src_time(model.src_freq/c, model.src_width/c, model.simtime*c/1.1) src_time_type = meep.gaussian_src_time(model.src_freq/c, model.src_width/c) else: src_time_type = meep.continuous_src_time(getattr(model, 'frequency', None)/c) srcvolume = meep.volume( ## (spatial source shape) meep.vec(-model.size_x/2, -model.size_y/2, -model.size_z/2+model.pml_thickness), meep.vec( model.size_x/2, model.size_y/2, -model.size_z/2+model.pml_thickness))
return 0 def where_diel(self, r): if r.z() < 0: return self.return_value # (do not change this line) return 0 #}}} # Model selection sim_param, model_param = meep_utils.process_param(sys.argv[1:]) model = PlasmonFilm_model(**model_param) if sim_param['frequency_domain']: model.simulation_name += ("_frequency=%.4e" % sim_param['frequency']) ## Initialize volume, structure and the fields according to the model vol = meep.vol3d(model.size_x, model.size_y, model.size_z, 1./model.resolution) vol.center_origin() s = meep_utils.init_structure(model=model, volume=vol, sim_param=sim_param, pml_axes="All") ## Create fields with Bloch-periodic boundaries f = meep.fields(s) # Add the field source (see meep_utils for an example of how an arbitrary source waveform is defined) src_time_type = meep.continuous_src_time(model.src_freq/c) srcvolume = meep.volume( meep.vec(-model.size_x/2, -model.size_y/2, -model.size_z/2+model.pml_thickness), meep.vec(+model.size_x/2, +model.size_y/2, -model.size_z/2+model.pml_thickness)) f.add_volume_source(meep.Ex, src_time_type, srcvolume) ## Define visualisation output slices = [meep_utils.Slice(model=model, field=f, components=(meep.Dielectric), at_t=0, name='EPS')] slices += [meep_utils.Slice(model=model, field=f, components=meep.Ez, at_y=0, min_timestep=.3e-15, outputgif=True, name='ParallelCut')]
#}}} # Model selection model = spdc_model(**model_param) if sim_param['frequency_domain']: model.simulation_name += ("_frequency=%.4e" % sim_param['frequency']) ## Initialize volume and structure according to the model #XXX vol = meep.vol2d(model.size_x, model.size_y, 1./model.resolution) vol = meep.vol2d(model.size_x, model.size_y, 1. / model.resolution) vol.center_origin() #s = meep_utils.init_structure(model=model, volume=vol, sim_param=sim_param, pml_axes=meep.Z) s = meep_utils.init_structure(model=model, volume=vol, sim_param=sim_param, pml_axes="All") ## Create fields with Bloch-periodic boundaries (any transversal component of k-vector is allowed, but may not radiate) f = meep.fields(s) ## Add a source of the plane wave (see meep_utils for definition of arbitrary source shape) if not sim_param['frequency_domain']: ## Select the source dependence on time src_time_type = meep.band_src_time(model.srcFreq / c / 2, model.srcWidth / c, model.simtime * c / 1.1) #src_time_type = meep.gaussian_src_time(model.srcFreq/c, model.srcWidth/c) else: src_time_type = meep.continuous_src_time(sim_param['frequency'] / c) # XXX srcvolume = meep.volume(
#if in_zslab(r, cz=0, d=self.radius): return self.return_value # (do not change this line) return 0 #}}} # Model selection model_param = meep_utils.process_param(sys.argv[1:]) model = HollowCyl_model(**model_param) ## Initialize volume, structure and the fields according to the model vol = meep.vol3d(model.size_x, model.size_y, model.size_z, 1. / model.resolution) vol.center_origin() s = meep_utils.init_structure(model=model, volume=vol, pml_axes="All") ## XXX meep.XY f = meep.fields(s) # Define the Bloch-periodic boundaries (any transversal component of k-vector is allowed) #f.use_bloch(meep.Z, 1) ## periodic along the cylinder XXX # (removing cylinder caps -> making an infinite waveguide with periodic boundary condition, change pml_axes=meep.XY) # Add the field source (see meep_utils for an example of how an arbitrary source waveform is defined) if not getattr(model, 'frequency', None): ## Select the source dependence on time #src_time_type = meep.band_src_time(-model.src_freq/c, model.src_width/c, model.simtime*c/1.1) src_time_type = meep.gaussian_src_time( -model.src_freq / c, model.src_width / c) ## negative frequency supplied -> e^(+i omega t) convention else: src_time_type = meep.continuous_src_time( -getattr(model, 'frequency', None) / c
def where_metal(self, r): if not (in_zcyl(r, cx=0, cy=0, rad=self.radius) and in_zslab(r, cz=0, d=self.height)): # #if in_zslab(r, cz=0, d=self.radius): return self.return_value # (do not change this line) return 0 #}}} # Model selection model_param = meep_utils.process_param(sys.argv[1:]) model = HollowCyl_model(**model_param) ## Initialize volume, structure and the fields according to the model vol = meep.vol3d(model.size_x, model.size_y, model.size_z, 1./model.resolution) vol.center_origin() s = meep_utils.init_structure(model=model, volume=vol, pml_axes="All") ## XXX meep.XY f = meep.fields(s) # Define the Bloch-periodic boundaries (any transversal component of k-vector is allowed) #f.use_bloch(meep.Z, 1) ## periodic along the cylinder XXX # (removing cylinder caps -> making an infinite waveguide with periodic boundary condition, change pml_axes=meep.XY) # Add the field source (see meep_utils for an example of how an arbitrary source waveform is defined) if not getattr(model, 'frequency', None): ## Select the source dependence on time #src_time_type = meep.band_src_time(-model.src_freq/c, model.src_width/c, model.simtime*c/1.1) src_time_type = meep.gaussian_src_time(-model.src_freq/c, model.src_width/c) ## negative frequency supplied -> e^(+i omega t) convention else: src_time_type = meep.continuous_src_time(-getattr(model, 'frequency', None)/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)) f.add_volume_source(meep.Ez, src_time_type, srcvolume) ## source of oblique polarization - excites both TE and TM modes