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)
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)
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
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"
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"
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