From e4360a48435cc762855d356b208b5544e6f40c4b Mon Sep 17 00:00:00 2001 From: Eugeniy Mikhailov Date: Thu, 28 Feb 2013 14:59:55 -0500 Subject: Added python version of mode-matching code by Bain Bronner --- beam_tracing/python/exampleBeamTrace.py | 122 ++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 beam_tracing/python/exampleBeamTrace.py (limited to 'beam_tracing/python/exampleBeamTrace.py') diff --git a/beam_tracing/python/exampleBeamTrace.py b/beam_tracing/python/exampleBeamTrace.py new file mode 100644 index 0000000..1e35118 --- /dev/null +++ b/beam_tracing/python/exampleBeamTrace.py @@ -0,0 +1,122 @@ +from beamTrace import * +from classes import * +from colorGradient import * +from drawPrismDisk import * +from faceBeamInteraction import * +from fresnelReflection import * +import pylab +import numpy as np + +#prismAngle = 45 # rutile prism +prismAngle = 60 # diamond prism + +nDisk = np.array([2.256, 2.176]) # LiNbO3 +#nDisk = np.array([1.375, 1.387]) #MgF2 +#nDisk = np.array([1.430, 1.430]) #CaF2 + +nPrism = np.array([2.400, 2.400]) # diamond +#nPrism = np.array([2.521, 2.793]) # rutile + +nAir = np.array([1.0, 1.0]) + +coupDesc = 'LiNbO3 disk\nDiamond (C) Prism' + +# keep in mind the bottom of prism always goes from -1 to 1, regardless of +# prismAngle +diskX = -0.85 + + +# the following calls prismDiskCoupling from drawPrismDisk +# it is the same as prismDiskCoupling function, with unnecessary parts removed +# calling this function allows for different ideal beam start locations to be +# easily put into beamTrace and its helpers + +[xBeamOrigin, yBeamOrigin, yFace2, yFace3,\ + thetaPrism, thetaPrism2, thetaAirRth] =\ + drawPrismDisk(prismAngle, nDisk[0], nPrism[0], diskX, coupDesc) + + + +# ------------------------------------------------------------ +# Should not have to alter below to acquire different outputs +# ------------------------------------------------------------ + + +# prism faces +face1 = face() +face1.vertex1 = np.array([-1, 0]) +face1.vertex2 = np.array([1, 0]) +# left (right) side is left (right) of line from vertex 1 to 2 +face1.nLeft = nPrism +face1.nRight = nDisk + +face2 = face() +face2.vertex1 = np.array([1, 0]) +face2.vertex2 = np.array([0, yFace2]) +face2.nLeft = nPrism +face2.nRight = nAir + +face3 = face() +face3.vertex1 = np.array([-1, 0]) +face3.vertex2 = np.array([0, yFace3]) +face3.nLeft = nAir +face3.nRight = nPrism + +faces = np.array([face1, face2, face3]) + +#beams +beamInitialTravelAngle = thetaAirRth + +beam1 = beam() +beam1.k = np.array([-np.cos(beamInitialTravelAngle), \ + -np.sin(beamInitialTravelAngle)]) +beam1.origin = np.array([xBeamOrigin, yBeamOrigin]) +beam1.face = float('NaN') +beam1.intensity = 1 +beam1.polarization = 1 # 0 for s and 1 for p +beam1.status = 'incoming' # could be reflected, refracted, incoming + +beam2 = beam() +beam2.k = np.array([-np.cos(beamInitialTravelAngle), \ + -np.sin(beamInitialTravelAngle)]) +beam2.origin = np.array([xBeamOrigin, yBeamOrigin]) +beam2.face = float('NaN') +beam2.intensity = 1 +beam2.polarization = 0 # 0 for s and 1 for p +beam2.status = 'incoming' + +beams = np.array([beam1, beam2]) + + +# image borders, we don't want a beam traced to infinity +border1 = border() +border1.vertex1 = np.array([-1.5, -0.5]) +border1.vertex2 = np.array([1.5, -0.5]) +border1.nRight = nAir +border1.nLeft = nAir + +border2 = border() +border2.vertex1 = np.array([1.5, -0.5]) +border2.vertex2 = np.array([1.5, 2.0]) +border2.nRight = nAir +border2.nLeft = nAir + +border3 = border() +border3.vertex1 = np.array([1.5, 2.0]) +border3.vertex2 = np.array([-1.5, 2.0]) +border3.nRight = nAir +border3.nLeft = nAir + +border4 = border() +border4.vertex1 = np.array([-1.5, 2.0]) +border4.vertex2 = np.array([-1.5, -0.5]) +border4.nRight = nAir +border4.nLeft = nAir + +borders = np.array([border1, border2, border3, border4]) +borderLimits = np.array([-1.5, -0.5, 1.5, 2.0]) +# end parameters + + +processedBeams = beamTrace(beams, faces, borders, borderLimits) +pylab.show() -- cgit v1.2.3