All the geometry types are derived from the abstract class `Geometry` and provide the following methods:

(`addLayer``layer(width)`)-
Add a new layer to the geometry setting its width. The
`layer`(`widht`) is the recommended way of specyfing the parameters as is the most clear and flexible. You may hovever call the method the following way`geometry.addLayer(`

.`layer`,`width`)It is recommenced to add the same layer several times when they repeat in the structure. This can reduce the computation time significantly. Note that this must be exactly the same object. Even if you create two different objects even with the same parameters, all the necessary calculation will be repeated for them separatelly.

(`clear``)`- Clear the stack. That layers are deleted if no other variable references them.

(`generateStack``)`- Generate the list of unique layers, list of indices of layers in the stack and their heights. You usually don't need to call this method individually. This is used when providing the data for the program.

(`setInterface``[``where`]`)`-
Set the matching interface after the last layer or at the position denoted by
`where`.

`interface`- The position of the matching interface.

`smooth`- The smoothing parameter for the goemetry. In order to improve the convergence of the solution the
material permittivity and permeability profile is covoluted with Gaussian function. The
`smooth`is the half-width of the Gaussian function. It's value have to be chosen experimentically -- the larger it is the more convergent plane-wave expansion you get but at the same time, the less sharp edges of the objects become.

The following classes can be instantiated:

**class**(`Geometry2D``L`)-
The simple Cartesian 2D geometry. When you use this class you assume that the electromagnetic field has
analytical form along -axis which is

being any of the field components. The computational domain of each layer has one dimension of the length given by`L`.The only possible object in this geometry is the

`Rectangle`.

**class**(`Geometry3D``A1, A2`[`, symmetry`]`)`-
The most general three-dimensional Cartesian geometry.
`A1`and`A2`are the 2D vectors defining the computational domain. They should be tuples of two numbers, usually of the form`(`

and`a1`,0)`(0,`

. Alternatively you can specify both`a2`)`A1`and`A2`as single numbers in which case the computational domain is assumed to be rectangle of the size .You can define

`Cylinder`and`Cuboid`for this geometry.The optional argument

`symmetry`defines whether the structure and electromagnetic field has inversion symmetry in the plane perpendicular to one or both lattice vectors. In the former case set`symmetry`to the simple symmetry definition (see below) and in the latter to the tuple`(`

, where`symmetry1`,`symmetry2`)`symmetry1`and`symmetry2`are symmetry definitions along and axes respectively.In each case symmetry definition is either

**'HE'**or**'EH'**. The former means that the and componenst are symmetric and and antisymmetric and the latter is just an opposite.