PhoSSiL, the Photonics Systems Simulator Library, is a library of C++ classes that can be used to simulate photonics systems including optical fiber communications systems and lasers. It was written by Dr. John Zweck, Dr. Curtis Menyuk and a team of graduate students and postdocs in the Optical Fiber Communications Laboratory at the University of Maryland Baltimore County (UMBC) and is currently maintained by John Zweck.
Work on PhoSSiL, which was originally called the Optical Communication Systems Simulator (OCS), was begun by Ivan Lima in 2000. Other contributors include Aurenice de Menezes Oliveira (formerly Aurenice Lima), Brian Marks, Oleg Sinkin, Ronald Holzloehner, Zhihang (Jonathon) Hu, Wenze Xi, Walter Pellegrini, Anshul Karla, Hai Xu, Hua Jiao, and Junping Wen.
The PhoSSiL bibliography lists Masters and PhD Theses and journal papers that describe the models and algorithms in PhoSSiL as well as the results of simulations produced using PhoSSiL. Taken together the results presented in these documents provide an extensive validation of PhoSSiL. Validations of the algorithms and code in PhoSSiL were performed by comparison with analytic formulae (where available), other codes, other algorithms, and laboratory experiments that were mostly performed by Professor Gary Carter and Professor Li Yan and their students at UMBC.
New users are advised to read the background material on the PhoSSiL web page before reading this documentation.
The following classes are used to simulate the basic components of an optical fiber communications system or laser. These classes, listed in the order users will probably find most helpful to read them in, are as follows
The Detailed Description of each class gives an overview of the class and provides links to sample input parameter files for the class and example applications that illustrate the use of the class.
The MachZehnder class can be used as a transmitter instead of using the functionality of the OptSignal class.
The classes
are used to calculate and output optical data during transmission or prior to the receiver.
There are two major classes used to model optical receivers. These are
The GaussianReceiver class allows for scalar or vector signals and can handle signals degraded by PMD and partially polarized noise.
The ChiSquareReceiver is presently only implemented for scalar signals. It can either take AWGN noise or an arbitrary noise covariance matrix as input. The AWGN noise can be automatically calculated by the OptAmplifier class. The NoiseCovariance class can be used to compute an noise covariance matrix due to nonlinear interactions between signal and noise.
The ReceiverSemiAnalytical class contains an early, out of date, version of the GaussianReceiver class as well as providing code that can be used to compute signal performance using standard Monte Carlo simulations.
The three receiver classes above rely on
Since the code in these classes is not always very accessible, users are advised to only use these classes indirectly via the code already provided in the three receiver classes.
PhoSSiL contains several classes specifically related to vector signals with two independent polarization states. These were written for applications to the polarization effects of PMD, PDG and PDL.
In addition to these "full model" classes, PhoSSiL includes an implementation of Wang and Menyuk's Reduced Stokes Model which follows the evolution of the power and polarization states in each channel, rather than computing the full time domain optical signal. These classes are
The GaussianReceiver provides an interface between the reduced and full models that allows for Q-factors to be correctly computed. This approach is explained in the papers and PhD theses of Ivan Lima and Hua Jiao.
There are two separate Multicanonical Monte Carlo code that have been linked to PhoSSiL, one for applications to nonlinearity and noise and the other to polarization mode dispersion.
To learn how to use the library to write application programs several example applications are provided, either linked from this documentation or from the main PhoSSiL web page.