rayopt icon indicating copy to clipboard operation
rayopt copied to clipboard

paraxial matrix for arbitrary tilts

Open MaximilianHoffmann opened this issue 9 years ago • 2 comments

def paraxial_matrix(self, n0, l):
        # Reflection and Refraction of Gaussian Light Beams at
        # Tilted Ellipsoidal Surfaces
        # G. A. Massey and A. E. Siegman
        # Applied Optics IP, vol. 8, Issue 5, p.975
        #
        # [y', u'] = M * [y, u]
        n, md = super(Spheroid, self).paraxial_matrix(n0, l)
        c = self.curvature
        if self.aspherics is not None:
            c = c + 2*self.aspherics[0]
        theta = self.angles[0] if self.angles is not None else 0.
        costheta = np.cos(theta)
        m = np.eye(4)
        if self.material is not None:
            if self.material.mirror:
                m[2, 0] = 2*c*costheta
                m[3, 1] = 2*c/costheta
            else:
                mu = n/n0
                p = np.sqrt(mu**2 + costheta**2 - 1)
                m[1, 1] = p/(mu*costheta)
                m[2, 0] = n0*c*(costheta - p)
                m[3, 1] = mu*m[2, 0]/(costheta*p)
                m[3, 3] = 1/m[1, 1]
        m = np.dot(m, md)

        if self.angles is not None:
            # FIXME angles is incomplete:
            # rotate to meridional/sagittal then compute total incidence
            # angle, matrix, then rotate back
            phi = self.angles[2]
            cphi, sphi = np.cos(phi), np.sin(phi)
            r1 = np.array([[cphi, -sphi], [sphi, -cphi]])
            r = np.eye(4)
            r[:2, :2] = r[2:, 2:] = r1
            m = np.dot(r, np.dot(m, r.T))

Maybe you could give me hint. It is unclear to me why the angle[0] would be in anyway special. Why is angle[1] not taken into account, or is this indeed what is meant by the FIXME comment: that we rotate the system until only one angle is nonzero? But: Why is theta in the above function equal angle[0] and not something like u[0] +angle[0]

Thx Max

MaximilianHoffmann avatar Jun 08 '16 11:06 MaximilianHoffmann

The treatment of arbitrarily tilted spheroids is incomplete (that's why there is the FIXME).

In a simple (planar) tilted system, angles[0] is the x-tilt ("in plane", a.k.a. theta) and the only rotation there is. angles is an rxyz-style set of euler angles. In an element with only a an x and a z tilt, theta = angles[0] and phi = angles[2]. u is the angle of the ray and doesn't matter for the matrix.

For "general" tilts, it is more complicated and needs to be calculated as sketched out in the FIXME.

jordens avatar Jun 08 '16 12:06 jordens

Also note that the phi code segment doesn't matter yet anyway since there are no cylindrical elements implemented.

jordens avatar Jun 08 '16 12:06 jordens