示例#1
0
def asphere_sag(test_vector):
    """
    Computation of asphere sag equals explicit calculation.
    """
    coordinate_system = LocalCoordinates.p(name="root")
    radius = 10.0
    conic_constant = -1.5
    curvature = 1./radius
    alpha2 = 1e-3
    alpha4 = -1e-6
    alpha6 = 1e-8
    maxradius = (math.sqrt(1./((1+conic_constant)*curvature**2))
                 if conic_constant > -1 else abs(radius))
    values = (2*test_vector-1.)*maxradius
    x_coordinate = values[0]
    y_coordinate = values[1]
    shape = Asphere.p(coordinate_system, curv=curvature, cc=conic_constant,
                    coefficients=[alpha2, alpha4, alpha6])
    sag = shape.getSag(x_coordinate, y_coordinate)
    # comparison with explicitly entered formula
    comparison = (curvature*(x_coordinate**2+y_coordinate**2)/
                  (1.+ np.sqrt(1.-(1.+conic_constant)
                               *curvature**2
                               *(x_coordinate**2+y_coordinate**2)))
                  +alpha2*(x_coordinate**2+y_coordinate**2)
                  +alpha4*(x_coordinate**2+y_coordinate**2)**2
                  +alpha6*(x_coordinate**2+y_coordinate**2)**3)
    assert np.allclose(sag, comparison)
示例#2
0
def asphere_grad(test_vector):
    """
    Computation of asphere gradient equals explicit calculation.
    Notice grad is calculated in 3 dimensions by grad F = grad(z - f(x, y))
    """
    coordinate_system = LocalCoordinates.p(name="root")
    radius = 10.0
    conic_constant = -1.5
    curvature = 1. / radius
    alpha2 = 1e-3
    alpha4 = -1e-6
    alpha6 = 1e-8
    maxradius = (math.sqrt(1. / ((1 + conic_constant) * curvature**2))
                 if conic_constant > -1 else abs(radius))
    values = (2 * test_vector - 1.) * maxradius
    x = values[0]
    y = values[1]
    shape = Asphere.p(coordinate_system,
                      curv=curvature,
                      cc=conic_constant,
                      coefficients=[alpha2, alpha4, alpha6])

    gradient = shape.getGrad(x, y)

    comparison = np.zeros_like(gradient)

    comparison[0] = (-2 * alpha2 * x - 4 * alpha4 * x * (x**2 + y**2) -
                     6 * alpha6 * x * (x**2 + y**2)**2 - curvature**3 * x *
                     (conic_constant + 1) * (x**2 + y**2) /
                     (np.sqrt(-curvature**2 * (conic_constant + 1) *
                              (x**2 + y**2) + 1) *
                      (np.sqrt(-curvature**2 * (conic_constant + 1) *
                               (x**2 + y**2) + 1) + 1)**2) -
                     2 * curvature * x / (np.sqrt(-curvature**2 *
                                                  (conic_constant + 1) *
                                                  (x**2 + y**2) + 1) + 1))
    comparison[1] = (-2 * alpha2 * y - 4 * alpha4 * y * (x**2 + y**2) -
                     6 * alpha6 * y * (x**2 + y**2)**2 - curvature**3 * y *
                     (conic_constant + 1) * (x**2 + y**2) /
                     (np.sqrt(-curvature**2 * (conic_constant + 1) *
                              (x**2 + y**2) + 1) *
                      (np.sqrt(-curvature**2 * (conic_constant + 1) *
                               (x**2 + y**2) + 1) + 1)**2) -
                     2 * curvature * y / (np.sqrt(-curvature**2 *
                                                  (conic_constant + 1) *
                                                  (x**2 + y**2) + 1) + 1))
    comparison[2, :] = 1.0

    assert np.allclose(gradient, comparison)
示例#3
0
    def initShAsphere(self, curv=0., cc=0., asphereparams=[], **kwargs):

        shapeclass = None
        if "surface" in kwargs:
            shapeclass = kwargs["surface"].shape
            curv = shapeclass.curvature.evaluate()
            cc = shapeclass.conic.evaluate()
        else:
            shapeclass = Asphere.p(curv=curv, cc=cc, acoeffs=asphereparams)
        self.__obj.addProperty("App::PropertyFloat", "curv", "Shape",
                               "central curvature").curv = curv
        self.__obj.addProperty("App::PropertyFloat", "cc", "Shape",
                               "conic constant").cc = cc
        self.__obj.addProperty(
            "App::PropertyFloatList", "asphereparams", "Shape",
            "aspherical corrections").asphereparams = asphereparams
        self.__obj.shapeclass = shapeclass
示例#4
0
                                                    decz=-dropletradius),
                                 refname=lccomprism.name)  # objectDist
lc2 = s.addLocalCoordinateSystem(
            LocalCoordinates.p(name="surf2", decz=dropletradius),
            refname=lccomprism.name)
lc3 = s.addLocalCoordinateSystem(
            LocalCoordinates.p(name="surf3", decz=0),
            refname=lccomprism.name)
lc4 = s.addLocalCoordinateSystem(
            LocalCoordinates.p(name="image", decz=-2.*dropletradius),
            refname=lccomprism.name)


stopsurf = Surface.p(lc0,
                     aperture=CircularAperture.p(lc0, maxradius=7*dropletradius))
frontsurf = Surface.p(lc1, shape=Asphere.p(lc1, curv=1./dropletradius),
                      aperture=CircularAperture.p(lc1, maxradius=dropletradius))
rearsurf = Surface.p(lc2, shape=Asphere.p(lc2, curv=-1./dropletradius),
                     aperture=CircularAperture.p(lc2, maxradius=dropletradius))
midsurf = Surface.p(lc3, shape=Asphere.p(lc3, curv=0),
                    aperture=CircularAperture.p(lc3, maxradius=dropletradius))

image = Surface.p(lc4,
                aperture=CircularAperture.p(lc4, maxradius=7.*dropletradius))


elem = OpticalElement.p(lc0, name="droplet")


database_basepath = "refractiveindex.info-database/database"
shelf = "3d"
示例#5
0
lc1 = s.addLocalCoordinateSystem(LocalCoordinates(name="surf1",
                                                  decz=-dropletradius),
                                 refname=lccomprism.name)  # objectDist
lc2 = s.addLocalCoordinateSystem(LocalCoordinates(name="surf2",
                                                  decz=dropletradius),
                                 refname=lccomprism.name)
lc3 = s.addLocalCoordinateSystem(LocalCoordinates(name="surf3", decz=0),
                                 refname=lccomprism.name)
lc4 = s.addLocalCoordinateSystem(LocalCoordinates(name="image",
                                                  decz=-2. * dropletradius),
                                 refname=lccomprism.name)

stopsurf = Surface(lc0,
                   aperture=CircularAperture(lc0, maxradius=7 * dropletradius))
frontsurf = Surface(lc1,
                    shape=Asphere(lc1, curv=1. / dropletradius),
                    aperture=CircularAperture(lc1, maxradius=dropletradius))
rearsurf = Surface(lc2,
                   shape=Asphere(lc2, curv=-1. / dropletradius),
                   aperture=CircularAperture(lc2, maxradius=dropletradius))
midsurf = Surface(lc3,
                  shape=Asphere(lc3, curv=0),
                  aperture=CircularAperture(lc3, maxradius=dropletradius))

image = Surface(lc4,
                aperture=CircularAperture(lc4, maxradius=7. * dropletradius))

elem = OpticalElement(lc0, name="droplet")

database_basepath = "refractiveindex.info-database/database"
shelf = "3d"
示例#6
0
 def create():
     from pyrateoptics.raytracer.surface_shape import Asphere
     lc = LocalCoordinates.p(name="global")
     a = Asphere.p(lc, curv=0.01, cc=-1.0, coefficients=[1., 2., 3.])
     return a