Exemple #1
0
def main(args):

    n = 3.4  # index of waveguide
    w = 1.0  # width of waveguide
    r = 1.0  # inner radius of ring

    pad = 4  # padding between waveguide and edge of PML
    dpml = 2  # thickness of PML

    sxy = 2.0 * (r + w + pad + dpml)  # cell size
    resolution = 10.0

    gv = mp.voltwo(sxy, sxy, resolution)
    gv.center_origin()

    sym = mp.mirror(mp.Y, gv)

    # exploit the mirror symmetry in structure+source:
    the_structure = mp.structure(gv, dummy_eps, mp.pml(dpml), sym)

    # Create a ring waveguide by two overlapping cylinders - later objects
    # take precedence over earlier objects, so we put the outer cylinder first.
    # and the inner (air) cylinder second.

    objects = []
    n2 = n * n
    dielectric = gm.Medium(epsilon_diag=gm.Vector3(n2, n2, n2))
    objects.append(gm.Cylinder(r + w, material=dielectric))
    objects.append(gm.Cylinder(r))

    mp.set_materials_from_geometry(the_structure, objects)
    f = mp.fields(the_structure)

    # If we don't want to excite a specific mode symmetry, we can just
    # put a single point source at some arbitrary place, pointing in some
    # arbitrary direction.  We will only look for TM modes (E out of the plane).
    fcen = 0.15  # pulse center frequency
    df = 0.1
    src = GaussianSource(fcen, df)
    v = mp.volume(mp.vec(r + 0.1, 0.0), mp.vec(0.0, 0.0))
    f.add_volume_source(mp.Ez, src, v)

    T = 300.0
    stop_time = f.last_source_time() + T
    while f.round_time() < stop_time:
        f.step()

    # TODO: translate call to harminv
    # int bands = do_harminv (... Ez, vec3(r+0.1), fcen, df)

    # Output fields for one period at the end.  (If we output
    # at a single time, we might accidentally catch the Ez field
    # when it is almost zero and get a distorted view.)
    DeltaT = 1.0 / (20 * fcen)
    NextOutputTime = f.round_time() + DeltaT
    while f.round_time() < 1.0 / fcen:
        f.step()
        if f.round_time() >= NextOutputTime:
            f.output_hdf5(mp.Ez, f.total_volume())
            NextOutputTime += DeltaT
Exemple #2
0
    def _init_structure(self, k=False):
        print('-' * 11)
        print('Initializing structure...')

        dims = self._infer_dimensions(k)

        if dims == 0 or dims == 1:
            gv = mp.vol1d(self.cell_size.z, self.resolution)
        elif dims == 2:
            self.dimensions = 2
            gv = mp.vol2d(self.cell_size.x, self.cell_size.y, self.resolution)
        elif dims == 3:
            gv = mp.vol3d(self.cell_size.x, self.cell_size.y, self.cell_size.z, self.resolution)
        elif dims == mp.CYLINDRICAL:
            gv = mp.volcyl(self.cell_size.x, self.cell_size.z, self.resolution)
            self.dimensions = 2
            self.is_cylindrical = True
        else:
            raise ValueError("Unsupported dimentionality: {}".format(dims))

        gv.center_origin()
        sym = mp.symmetry()

        # Initialize swig objects for each symmetry and combine them into one
        for s in self.symmetries:
            if isinstance(s, Identity):
                s.swigobj = mp.identity()
            elif isinstance(s, Rotate2):
                s.swigobj = mp.rotate2(s.direction, gv)
                sym += s.swigobj * complex(s.phase.real, s.phase.imag)
            elif isinstance(s, Rotate4):
                s.swigobj = mp.rotate4(s.direction, gv)
                sym += s.swigobj * complex(s.phase.real, s.phase.imag)
            elif isinstance(s, Mirror):
                s.swigobj = mp.mirror(s.direction, gv)
                sym += s.swigobj * complex(s.phase.real, s.phase.imag)
            else:
                s.swigobj = mp.symmetry()

        br = _create_boundary_region_from_boundary_layers(self.boundary_layers, gv)

        if self.boundary_layers and type(self.boundary_layers[0]) is Absorber:
            absorbers = self.boundary_layers
        else:
            absorbers = None

        self.structure = mp.structure(gv, None, br, sym, self.num_chunks, self.courant,
                                      self.eps_averaging, self.subpixel_tol, self.subpixel_maxeval)
        if self.material_function:
            self.material_function.eps = False
            self.default_material = self.material_function
        elif self.epsilon_func:
            self.epsilon_func.eps = True
            self.default_material = self.epsilon_func
        elif self.epsilon_input_file:
            self.default_material = self.epsilon_input_file

        mp.set_materials_from_geometry(self.structure, self.geometry, self.eps_averaging, self.subpixel_tol,
                                       self.subpixel_maxeval, self.ensure_periodicity, False, self.default_material,
                                       absorbers, self.extra_materials)
 def make_fields(self):
     if self.gridSizeZ == None:
         self.meep_space = voltwo(self.gridSizeX,self.gridSizeY,self.res)
     else:
         self.meep_space = vol3d(self.gridSizeX,self.gridSizeY,self.gridSizeZ,self.res)
     material = epsilon(self.my_structure)
     set_EPS_Callback(material.__disown__())
     
     
     if self.symmetry_direction == None:
         sym = identity()
     else:
         sym = mirror(self.symmetry_direction,self.meep_space)*self.symmetry_val
         
     self.meep_structure = structure(self.meep_space, EPS, self.boundary_conditions,sym)
     
     
     the_fields = fields(self.meep_structure)
     
     for direc in self.periodic_directions:
         the_fields.set_boundary(Low,direc,Periodic)
         the_fields.set_boundary(High,direc,Periodic)
     
     
     the_fields.use_bloch(self.bloch)
     
     if self.my_source is not None:
         self.my_source.add_to_fields(the_fields)
  
     for f in self.fluxes:
         f.add_to_fields(the_fields)
     
     self.meep_fields = the_fields
     return the_fields
Exemple #4
0
    def setUp(self):
        def dummy_eps(v):
            return 1.0

        gv = mp.voltwo(16, 16, 10)
        gv.center_origin()
        sym = mp.mirror(mp.Y, gv)
        the_structure = mp.structure(gv, dummy_eps, mp.pml(2), sym)
        objects = []
        objects.append(Cylinder(1))
        mp.set_materials_from_geometry(the_structure, objects)
        self.f = mp.fields(the_structure)
        self.v = mp.volume(mp.vec(1.1, 0.0), mp.vec(0.0, 0.0))
Exemple #5
0
    def setUp(self):

        def dummy_eps(v):
            return 1.0

        gv = mp.voltwo(16, 16, 10)
        gv.center_origin()
        sym = mp.mirror(mp.Y, gv)
        the_structure = mp.structure(gv, dummy_eps, mp.pml(2), sym)
        objects = []
        objects.append(Cylinder(1))
        mp.set_materials_from_geometry(the_structure, objects)
        self.f = mp.fields(the_structure)
        self.v = mp.volume(mp.vec(1.1, 0.0), mp.vec(0.0, 0.0))
Exemple #6
0
                LOG.error(
                    "MeepMaterial2DPolygons gives errors -> using MeepMaterial2DMatrix instead..."
                )
                self.material = MeepMaterial2DMatrix(
                    landscape.simulation_volume, self.meepVol)
        else:  #dim == 3
            self.material = MeepMaterial3DPolygons(landscape.simulation_volume,
                                                   self.meepVol)

        Meep.set_EPS_Callback(self.material.__disown__())
        LOG.debug("Meep node %i -Defining structure..." % (self.node_nr))

        symmetry_object = Meep.identity()
        if (self.symmY):
            LOG.debug("Meep node %i -Using y symmetry!" % (self.node_nr))
            symmetry_object = Meep.mirror(Meep.Y, self.meepVol)
            symmetry_object = symmetry_object * complex(1.0, 0.0)

        # When there is a certain PML direction, use that one.
        if isinstance(landscape.pml_direction, str):
            dirint = 'XYZ'.rfind(str.upper(landscape.pml_direction))
            assert dirint <= 0, 'PML direction should be either X, Y or Z'
            if dirint == 0: direction = Meep.X
            if dirint == 1: direction = Meep.Y
            if dirint == 2: direction = Meep.Z
            pml = Meep.pml(landscape.pml_thickness, direction)
        else:
            pml = Meep.pml(landscape.pml_thickness)

        self.structure = Meep.structure(self.meepVol,
                                        Meep.EPS,