Exploiting Symmetry#


Meep allows you to take advantage of mirror and rotational symmetries in your problem to reduce the amount of computation and storage required for simulation. The use of symmetry is designed to be transparent: once you specify the symmetry, Meep exploits it as an internal optimization, while everything else about the simulation appears the same as if you didn't specify the symmetry. That is, when you output the structure/geometry or currents/fields it still outputs the entire non-symmetrized cell; you can still call get_field_point to obtain the fields at any point, etcetera — internally, Meep transforms everything as necessary according to the symmetries to get whatever data is needed.

An important point to understand is that, when you specify a symmetry, it must be obeyed by both the structure/geometry and by the current sources and thus the fields. In particular, the symmetry of the currents/fields will typically require you to specify phase factors associated with the symmetry operations — for example, a mirror plane can either be used for even sources/fields (phase +1) or for odd sources/fields (phase −1).

Meep does not check whether the symmetry is obeyed. If you specify a symmetry that does not preserve your structure/sources, then the results are undefined.

Assuming your structure is symmetric, you might still have discretization effects that slightly break the symmetry. For example, if the width of the computational cell in the direction of a mirror symmetry is not an integer number of pixels, Meep will round the cell width to the nearest pixel, which may slightly break the mirror symmetry. (In such cases, Meep prints: Warning: grid volume is not an integer number of pixels; cell size will be rounded to nearest pixel.) The results will still converge to the correct results as you increase resolution, but at finite resolutions you may observe discretization errors, such as even-symmetry sources coupling slightly to odd-symmetry modes.

For the Python syntax to specify a symmetry, see Python Interface. There are also examples in Tutorial/Basics. For a description of how symmetries are implemented, see Chunks and Symmetry.

Kinds of Symmetries#

Meep supports exploiting several kinds of symmetries:

Rotations and Reflections#

  • Mirror planes through the origin, and normal to the // axes.
  • 180° rotational symmetry about the origin, around the // axes. This is also known as a symmetry, in group theory. This is different from a mirror plane: e.g. as shown in the figure below, the letter "S" has but not mirror symmetry.
  • 90° (fourfold) rotational symmetry about the origin, around the // axes. This is also known as a symmetry.

The first two kinds of symmetry each reduce the computational cell (internally) by a factor of two, and the third by a factor of four. If your structure has multiple symmetries, you can combine them arbitrarily. For example, your cell may have two orthogonal mirror planes (e.g. one even and one odd), or it may have four-fold rotational symmetry about the axis and a mirror plane through . Thus, in 3d you might be able to reduce your cell by at most a factor of eight, or a factor of four in 2d. This is why the interface lets you specify a list symmetries of symmetry objects.

There are also two other kinds of symmetry you can exploit.

Polarizations in 2d#

When you have a two-dimensional simulation with a wavevector (if any) lying in the plane, then the plane is itself a mirror plane. The consequence of this is that the fields can be chosen purely polarized: either polarized (electric field in the plane and magnetic field in the direction) or polarized (magnetic field in the plane and electric field in the direction). Meep can exploit this to save a factor of two in storage and time.

To exploit or symmetry, you don't have to do anything special: if your sources are only polarized, then Meep will only propagate the fields , and similarly for the polarization with fields .

Cylindrical Symmetry#

If your structure has cylindrical symmetry (also known as the group), i.e. continuous rotational symmetry around the axis, then Meep can exploit this by running the simulation in cylindrical/polar coordinates.

To do this, you must set dimensions = mp.CYLINDRICAL in the Python script, and then the vectors are interpreted as triplets instead of . The 2d cell consists of the plane (). The component of the vectors is ignored.

In a cylindrical simulation, the fields can be written in the form of a function of multiplied by a function for the dependence, where is a user-specified parameter (related to the angular momentum of the field). For reference, Maxwell's equations in cylindrical coordinates and a schematic of the Yee grid are shown below.

The (, , ) fields at must obey certain symmetries determined by the value of :

  • : fields are rotation-invariant. At , this means that can be nonzero, but and must be zero since they are otherwise not rotation-invariant.
  • : fields flip sign when rotated by radians. At , this means that and can be nonzero but must be zero.
  • : all fields go to zero at .

Note that for , the fields separate into two distinct polarizations: (1) (, , ) and (2) (, , ).

Integrals in cylindrical coordinates involve a factor, which is automatically included by Meep when computing integrated quantities (Poynting flux, energy, etcetera).

A zero-thickness source in the direction is treated by Meep as a Dirac function. In some contexts you might prefer or so that the radial integral is 1; these additional factors can be included by scaling the source amplitude or by scaling the resulting fields/powers in postprocessing.

The perfectly matched layer (PML) in the direction is a quasi PML rather than a true PML. At the same thickness, reflections from the quasi PML will generally tend to be larger than a true PML. The thickness of the quasi PML may therefore need to be increased to compensate for these larger reflections. The quasi PML approaches a true PML as the outer radius of the computational cell increases. (This is because the implicit curvature of the PML region decreases with radius and approaches the Cartesian case of the quasi PML.) For additional information, see Section 4.2 of Computer Physics Communications, Vol. 181, pp. 687-702 (2010).

For examples, see Tutorial/Cylindrical Coordinates.

Translational Symmetry#

If the structure has discrete or continuous translational symmetry in some direction, then this is handled in Meep by specifying periodic boundary conditions in that direction. Here, the currents/fields take the form of multiplied by a periodic envelope, so one specifies Bloch-periodic boundary conditions with a given Bloch wavevector .

For example, to simulate the modes of a uniform waveguide (continuous translational symmetry) in the direction, one would specify a structure with 0 cell-size (Python) or no-size (Scheme) in the direction and a given corresponding to the wavenumber of the desired mode. For discrete periodicity, see Tutorial/Resonant Modes and Transmission in a Waveguide Cavity/Band Diagram.

Symmetry Phase Factors#

In general, it is not sufficient to simply specify the symmetry operations that preserve the structure. When applied to the fields and sources, the symmetry operations in general transform the source/field into itself multiplied by some phase factor.

For example, if you have a mirror plane, then the phase factor is +1 for even fields and −1 for odd fields. For a 90° rotation, values of +1, −1, +i, and −i are typical (where the latter two correspond to "circularly polarized" fields).

As a specific example, suppose the structure is even in . In this case, an (dipole) point source at is odd. Imagine an arrow pointing in the direction. If you mirror flip to , then the arrow flips direction, which means that E points in the opposite direction (because E is a vector). That is, the mirror flip of the source (and field) is the original source (and field) multiplied by -1, and hence it is odd.

The phase factors are ignored when applying the symmetry to the structure (e.g. to .)

Technically, the symmetry operations that preserve the structure form the symmetry group. In particular, this is a point group or, if you include translations, the space group of the structure. The phase factors specify the representation of the group that the fields/sources transform as. See also any book on group theory in physics, e.g. Group Theory and Its Applications in Physics by Inui, Tanabe, and Onodera.

Vectors and Pseudovectors#

One subtlety that arises in specifying the symmetry of the system is that you have to transform the fields appropriately according to their vector nature. In particular, the electric fields and currents transform as vectors, while the magnetic fields and currents transforms as pseudovectors. If you don't keep these things straight, you will be endlessly confused because otherwise it will seem that every field component has a different symmetry.

For example, suppose we have an even (phase=+1) mirror plane through . Then, if we look at components of the electric field individually, and are even while is odd. Overall, the whole field considered as a vector is still even although one of its components is not.

The magnetic field is less intuitive because pseudovectors are multiplied by an additional factor of −1 under mirror flips or any improper rotation. Thus, for our even mirror plane, if we look at the components of the magnetic field individually, then and are odd while is even. That is, the magnetic field as a whole looks odd when the electric field is even, but the two really have the same symmetry if one realizes that they are different sorts of object (pseudovectors vs. vectors).