--------------- Getting Started --------------- lpmodes can be imported using:: import lpmodes If you have not installed lpmodes using pip, you must make sure that the ``lpmodes\src`` folder is in your python path. ^^^^^^^^^^^^^^^^^^^^^ Finding Allowed Modes ^^^^^^^^^^^^^^^^^^^^^ The first step is to define the parameters of the fibre you wish to model, specifically the core radius and refractive index and the cladding refractive index, and the wavelength of light you will simulate, for example:: core_n = 1.4 cladding_n = 1.38 core_radius = 10 wavelength = 0.5 Note that the ``core_radius`` and ``wavelength`` are specified in units of microns. The modes are then solved using lpmodes.find_modes:: modes = lpmodes.find_modes(core_radius, core_n, cladding_n, wavelength) ``modes`` is a python list. Each element in the list is an instance of the ``Mode`` class. To determine how many modes were found, look at the length of the list:: num_modes = len(modes) Modes with l > 0 have two orientations (the sin and cos components). The total number of modes including these orientations can be determined by passing the list of modes to ``num_rotated_modes``:: total_num_modes = lpmodes.num_rotated_modes(modes) You can extract an individual mode from the list using indexing, for example the third mode is found using:: mode = modes[2] The parameters of the mode are stored as fields of the instances, for example:: print(mode.l) displays the l value. The other fields are ``m``, ``u``, ``beta``, ``n_eff``, ``core_radius``, ``wavelength``. The modes are ordered by l and then m. To extract the mode with a specified l or m value from the list, use ``find_mode_idx()`` to determine the index of that mode, for example from of list of modes in ``modes``, for l = 1, m = 3:: idx = lpmodes.find_mode_idx(modes, 1, 3) or use ``find_mode`` to get a referene to the mode directly:: mode = lpmodes.find_mode(modes, 1,3) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Plotting Modes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Amplitude or intensity plots of a mode can be created as numpy arrays using the ``plot_amplitude`` and ``plot_intensity`` methods of the mode class. We first need to define the size of the square grid, in pixels, and also in physical units:: grid_size = 150 # pixels max_plot_radius = 15 # microns The ``max_plot_radius`` is half of the width or height of the plot. For a core radius of 10 microns, a max_plot_radius of 15 microns will ensure all the core plus a reasonable extent of the cladding is plotted. If we have a single mode stored in ``mode``, then we can then call:: mode_plot = mode.plot_amplitude(grid_size, max_plot_radius) which returns the plot as a numpy array. We can then display this, for example, using a matplotlib figure. The package has a function ``ampcol()`` to generate a convenient colormap for displaying amplitude plots, with blue for negative values, red for positive values and white for zero:: plt.figure(dpi=150) max_val = np.max(np.abs(mode_plot)) plt.imshow(mode_plot, cmap = lpmodes.ampcol(), vmin = -max_val, vmax = max_val) The intensity plot can be obtained as follows:: mode_plot = mode.plot_intensity() plt.figure(dpi=150) plt.imshow(mode_plot) In this case the ``ampcol()`` colormap is less useful as all values are positive, and so any standard colormap may be used. These functions return the cosine orientation of the modes. The sine orientations are obtained using ``plot_amplitude_rotated()`` and ``plot_intensity_rotated()``. For l = 0 modes, the two orientations are identical. If you would like to plot all the modes, rather than calling the plot functions on each mode in the list, you can use the ``Solution`` class. This also allows more advanced operations such as coupling in beams and propagating along the fibre.