/* * PrismCoupler Class * * Methods for: * determining the refractive index of a waveguiding thin film * in an asymmetric slab waveguide from the prism coupling angle and the core layer thickness * * obtaining the normalised propagation vector versus guiding layer thickness * dispersion curve for an asymmetric slab waveguide * * This is a subclass of the superclasses PlanarWaveguideCoupler * * Author: Dr Michael Thomas Flanagan. * * Created: April 2006 * * DOCUMENTATION: * See Michael Thomas Flanagan's Java library on-line web page: * http://www.ee.ucl.ac.uk/~mflanaga/java/PrismCoupler.html * http://www.ee.ucl.ac.uk/~mflanaga/java/ * * Copyright (c) April 2006 Michael Thomas Flanagan * * PERMISSION TO COPY: * Permission to use, copy and modify this software and its documentation for * NON-COMMERCIAL purposes is granted, without fee, provided that an acknowledgement * to the author, Michael Thomas Flanagan at www.ee.ucl.ac.uk/~mflanaga, appears in all copies. * * Dr Michael Thomas Flanagan makes no representations about the suitability * or fitness of the software for any or for a particular purpose. * Michael Thomas Flanagan shall not be liable for any damages suffered * as a result of using, modifying or distributing this software or its derivatives. * ***************************************************************************************/ package flanagan.optics; import flanagan.math.Fmath; import flanagan.analysis.ErrorProp; import flanagan.plot.*; import flanagan.optics.*; public class PrismCoupler extends PlanarWaveguide{ // CLASS VARIABLES private double[] thicknessesTE = null; // thicknesses for experimental TE mode thimeasurements private double[] anglesDegTE = null; // coupling angles, in degrees, for experimental TE mode measurements private double[] anglesRadTE = null; // coupling angles, in radians, for experimental TE mode measurements private double[] errorsDegTE = null; // errors in coupling angles, in degrees, for experimental TE mode measurements private double[] errorsRadTE = null; // errors in coupling angles, in radians, for experimental TE mode measurements private double[] modeNumbersTE = null; // mode numbers for experimental TE mode measurements private double[] effectiveRefractiveIndicesTE = null; // effective refractive indices for TE mode measurements private double[] effectiveErrorsTE = null; // propagated errors for effective refractive indices for TE mode measurements private int numberOfTEmeasurementsPrism = 0; // number of TE mode thickness measurement private boolean setMeasurementsTEprism = false; // = true when TE mode measurements entered private boolean setTEerrors = false; // = true if TE mode errors are set private double[] thicknessesTM = null; // thicknesses for experimental TM mode thimeasurements private double[] anglesDegTM = null; // coupling angles, in degrees, for experimental TM mode measurements private double[] anglesRadTM = null; // coupling angles, in radians, for experimental TM mode measurements private double[] errorsDegTM = null; // errors in coupling angles, in degrees, for experimental TM mode measurements private double[] errorsRadTM = null; // errors in coupling angles, in radians, for experimental TM mode measurements private double[] modeNumbersTM = null; // mode numbers for experimental TM mode measurements private double[] effectiveRefractiveIndicesTM = null; // effective refractive indices for TM mode measurements private double[] effectiveErrorsTM = null; // propagated errors for effective refractive indices for TM mode measurements private int numberOfTMmeasurementsPrism = 0; // number of TM mode thickness measurement private boolean setMeasurementsTMprism = false; // = true when TM mode measurements entered private boolean setTMerrors = false; // = true if TM mode errors are set private int numberOfMeasurementsPrism = 0; // total number of thickness measurements entered private boolean setMeasurementsPrism = false; // = true when TE and/or TM mode measurements entered private boolean setPrismRI = false; // = true when prism refractive index entered private double prismAngleAlphaDeg = 0.0D; // Coupling prism angle alpha (in degrees) private double prismAngleAlphaRad = 0.0D; // Coupling prism angle alpha (in radians) private boolean setPrismAlpha = false; // = true when prism angle, alpha, entered // CONSTRUCTOR public PrismCoupler(){ } // COUPLING PRISM // Enter refractive index public void setPrismRefractiveIndex(double refInd){ super.prismRefractiveIndex = refInd; super.prismRefractiveIndex2 = refInd*refInd; this.setPrismRI = true; if(this.setMeasurementsPrism && this.setPrismAlpha)this.calcEffectiveRefractiveIndices(); } // Enter coupling prism angle, alpha, in degrees public void setPrismAngleAlpha(double angle){ this.prismAngleAlphaDeg = angle; this.prismAngleAlphaRad = Math.toRadians(angle); this.setPrismAlpha = true; if(this.setMeasurementsPrism && this.setPrismRI)this.calcEffectiveRefractiveIndices(); } // Enter coupling prism to waveguide gap distance in metres public void setPrismToWaveguideGap(double gap){ super.prismToWaveguideGap = gap; super.setPrismToWaveguideGap = true; } // THICKNESS (metres), COUPLING ANGLE (degrees) AND MODE NUMBER DATA // Enter TE mode data for a single measurement without error public void enterTEmodeData(double thickness, double angle, double modeNumber){ if(this.setMeasurementsTEprism){ if(setErrorsTE)throw new IllegalArgumentException("All Entered data must either all have associated errors entered or all have no associated errors entered"); int nNew = this.numberOfTEmeasurementsPrism + 1; double[] hold = new double[nNew]; for(int i=0; i