def conic_grad(test_vector): """ Computation of conic grad equals explicit calculation. """ coordinate_system = LocalCoordinates.p(name="root") radius = 10.0 conic_constant = -1.5 curvature = 1./radius 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 = Conic.p(coordinate_system, curv=curvature, cc=conic_constant) gradient = shape.getGrad(x, y) comparison = np.zeros_like(gradient) comparison[2, :] = 1. comparison[0] = (-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] = (-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 = comparison*gradient[2] # comparison and gradient are calculated differently assert np.allclose(gradient, comparison)
def create_surfaces(self, cs): #cs=coordinate Systems surface_objects = [] for i in range(self.surfaces.shape[0]): if (self.get_sufval("shape", i) == "Conic"): #hier noch cc einfuegen shape_ = Conic.p(cs[i], cc=float(self.get_sufval("conic", i)), curv=float(self.get_sufval("curvature", i))) #print(self.get_sufval("curvature",i)) else: shape_ = None if (self.get_sufval("aperture", i) == "Circular"): aperture_ = CircularAperture( cs[i], minradius=float(self.get_sufval("minrad", i)), maxradius=float(self.get_sufval("maxrad", i))) #print(float(self.get_sufval("maxrad",i)).__class__.__name__) else: aperture_ = None self.SurfNameList.append(self.get_sufval("name", i)) surface_objects.append( Surface.p(cs[i], shape=shape_, aperture=aperture_)) return surface_objects
def initShConic(self, curv=0., cc=0., **kwargs): shapeclass = None if "surface" in kwargs: shapeclass = kwargs["surface"].shape curv = shapeclass.curvature.evaluate() cc = shapeclass.conic.evaluate() else: shapeclass = Conic.p(self.__obj.LocalCoordinatesLink.getLC(), curv=curv, cc=cc) self.__obj.addProperty("App::PropertyFloat", "curv", "Shape", "central curvature").curv = curv self.__obj.addProperty("App::PropertyFloat", "cc", "Shape", "conic constant").cc = cc self.__obj.shapeclass = shapeclass
def create(): from pyrateoptics.raytracer.surface_shape import Conic from pyrateoptics.raytracer.surface import Surface from pyrateoptics.raytracer.aperture import CircularAperture lc = LocalCoordinates.p(name="----LCglobal----") lc2 = LocalCoordinates.p(name="----LCap----", tiltx=0.1, decx=0.2) lc3 = LocalCoordinates.p(name="----LCsh----", tiltx=-0.1, decx=-0.2) lc.addChild(lc2) lc.addChild(lc3) ap = CircularAperture.p(lc2) sh = Conic.p(lc3, curv=0.01, cc=-1) su = Surface.p(lc, sh, ap, name="mysurface") return su
def conic_sag(test_vector): """ Computation of conic sag equals explicit calculation. """ coordinate_system = LocalCoordinates.p(name="root") radius = 10.0 conic_constant = -1.5 curvature = 1. / radius 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 = Conic.p(coordinate_system, curv=curvature, cc=conic_constant) sag = shape.getSag(x_coordinate, y_coordinate) # comparison with explicitly entered formula assert np.allclose( sag, (curvature * (x_coordinate**2 + y_coordinate**2) / (1. + np.sqrt(1. - (1. + conic_constant) * curvature**2 * (x_coordinate**2 + y_coordinate**2)))))
def create(): from pyrateoptics.raytracer.surface_shape import Conic lc = LocalCoordinates.p(name="global") c = Conic.p(lc, curv=0.01, cc=-0.1) return c
lc1 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf1", decz=10.0), refname=lc0.name) lc2 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf2", decz=5.0, tiltx=10 * math.pi / 180.0), refname=lc1.name) lc3 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="image", decz=-5.0, tiltx=-10 * math.pi / 180.0), refname=lc2.name) stopsurf = Surface.p(lc0) frontsurf = Surface.p(lc1, shape=Conic.p(lc1, curv=0), aperture=CircularAperture.p(lc1, maxradius=10.0)) rearsurf = Surface.p(lc2, shape=Conic.p(lc2, curv=0), aperture=CircularAperture.p(lc3, maxradius=10.0)) image = Surface.p(lc3) elem = OpticalElement.p(lc0, name="crystalelem") no = 1.5 neo = 1.8 myeps = np.array([[no, 0, 0], [0, no, 0], [0, 0, neo]]) crystal = AnisotropicMaterial.p(lc1, myeps)
decz=5.0, tiltx=2.5 * degree), refname=lc2.name) lc4 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf4", decz=3.0), refname=lc3.name) lc5 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf5", decz=3.0), refname=lc4.name) lc6 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf6", decz=2.0), refname=lc5.name) lc7 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf7", decz=3.0), refname=lc6.name) lc8 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="image", decz=19.0), refname=lc7.name) objectsurf = Surface.p(lc0) surf1 = Surface.p(lc1, shape=Conic.p(lc1, curv=1 / -5.922)) surf2 = Surface.p(lc2, shape=Conic.p(lc2, curv=1 / -3.160)) surf3 = Surface.p(lc3, shape=Conic.p(lc3, curv=1 / 15.884)) surf4 = Surface.p(lc4, shape=Conic.p(lc4, curv=1 / -12.756)) stopsurf = Surface.p(lc5) surf6 = Surface.p(lc6, shape=Conic.p(lc6, curv=1 / 3.125)) surf7 = Surface.p(lc7, shape=Conic.p(lc7, curv=0.1 * 1 / 1.479)) image = Surface.p(lc8) elem = OpticalElement.p(lc0, name="lenssystem") glass = ConstantIndexGlass.p(lc0, n=1.7) glass2 = ConstantIndexGlass.p(lc0, n=1.5) elem.addMaterial("glass", glass) elem.addMaterial("glass2", glass2)
def initShExplicit(self, **kwargs): # this function offers the flexibility to use function objects # with tunable parameters # TODO: implement self.__obj.shapeclass = Conic.p(curv=0, cc=0)
lc0 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="stop", decz=0.0), refname=s.rootcoordinatesystem.name) lc1 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="surf1", decz=-1.048), refname=lc0.name) # objectDist lc2 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="surf2", decz=4.0), refname=lc1.name) lc3 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="surf3", decz=2.5), refname=lc2.name) lc4 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="image", decz=97.2), refname=lc3.name) stopsurf = Surface.p(lc0) frontsurf = Surface.p(lc1, shape=Conic.p(lc1, curv=1./62.8), aperture=CircularAperture.p(lc1, maxradius=12.7)) cementsurf = Surface.p(lc2, shape=Conic.p(lc2, curv=-1./45.7), aperture=CircularAperture.p(lc2, maxradius=12.7)) rearsurf = Surface.p(lc3, shape=Conic.p(lc3, curv=-1./128.2), aperture=CircularAperture.p(lc3, maxradius=12.7)) image = Surface.p(lc4) elem = OpticalElement.p(lc0, name="thorlabs_AC_254-100-A") bk7 = ConstantIndexGlass.p(lc1, n=1.5168) sf5 = ConstantIndexGlass.p(lc2, n=1.6727) elem.addMaterial("BK7", bk7) elem.addMaterial("SF5", sf5)
lc0 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="stop", decz=0.0), refname=s.rootcoordinatesystem.name) lc1 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf1", decz=-1.048), refname=lc0.name) # objectDist lc2 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf2", decz=4.0), refname=lc1.name) lc3 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf3", decz=2.5), refname=lc2.name) lc4 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="image", decz=97.2), refname=lc3.name) stopsurf = Surface.p(lc0) frontsurf = Surface.p(lc1, shape=Conic.p(lc1, curv=1. / 62.8), aperture=CircularAperture.p(lc1, maxradius=12.7)) cementsurf = Surface.p(lc2, shape=Conic.p(lc2, curv=-1. / 45.7), aperture=CircularAperture.p(lc2, maxradius=12.7)) rearsurf = Surface.p(lc3, shape=Conic.p(lc3, curv=-1. / 128.2), aperture=CircularAperture.p(lc3, maxradius=12.7)) image = Surface.p(lc4) elem = OpticalElement.p(lc0, name="thorlabs_AC_254-100-A") bk7 = ConstantIndexGlass.p(lc1, n=1.5168) sf5 = ConstantIndexGlass.p(lc2, n=1.6727) elem.addMaterial("BK7", bk7)
LocalCoordinates.p(name="image1", decz=-50, decy=-15, tiltx=-math.pi/16), refname=lc3.name) lc5 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="oapara", decz=-100, decy=-35), refname=lc4.name) lc5ap = s.addLocalCoordinateSystem( LocalCoordinates.p(name="oaparaap", decz=0, decy=35), refname=lc5.name) lc6 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="image2", decz=52.8, tiltx=1*math.pi/32), refname=lc5.name) lc7 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="image3", decz=5), refname=lc6.name) objectsurf = Surface.p(lc0) m1surf = Surface.p(lc1, shape=Conic.p(lc1, curv=-0.01)) m2surf = Surface.p(lc2, shape=Conic.p(lc2, curv=0.01)) m3surf = Surface.p(lc3, shape=Conic.p(lc3, curv=-0.006)) image1 = Surface.p(lc4) oapara = Surface.p(lc3, shape=Conic.p(lc5, curv=0.01, cc=-1.)) image2 = Surface.p(lc6, aperture=CircularAperture.p(lc6, maxradius=20.0)) image3 = Surface.p(lc7, aperture=CircularAperture.p(lc7, maxradius=20.0)) elem = OpticalElement.p(lc0, name="TMA") elem.addMaterial("air", air) elem.addSurface("object", objectsurf, (None, None)) elem.addSurface("m1", m1surf, (None, None)) elem.addSurface("m2", m2surf, (None, None))
lc5 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="oapara", decz=-100, decy=-35), refname=lc4.name) lc5ap = s.addLocalCoordinateSystem(LocalCoordinates.p(name="oaparaap", decz=0, decy=35), refname=lc5.name) lc6 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="image2", decz=55, tiltx=1 * math.pi / 32), refname=lc5.name) objectsurf = Surface.p(lc0) m1surf = Surface.p(lc1, shape=Conic.p(lc1, curv=-0.01), aperture=CircularAperture.p(lc1, maxradius=20.)) m2surf = Surface.p(lc2, shape=Conic.p(lc2, curv=0.01), aperture=CircularAperture.p(lc2, maxradius=12.7)) m3surf = Surface.p(lc3, shape=Conic.p(lc3, curv=-0.006), aperture=CircularAperture.p(lc3, maxradius=20.7)) image1 = Surface.p(lc4) oapara = Surface.p(lc3, shape=Conic.p(lc5, curv=0.01, cc=-1.), aperture=CircularAperture.p(lc5ap, maxradius=30.0)) image2 = Surface.p(lc6, aperture=CircularAperture.p(lc6, maxradius=20.0)) elem = OpticalElement.p(lc0, name="TMA")
(si * 4.529e-12, -2.085)]), aperture=CircularAperture.p(lcS2, maxradius=40.0)) D2Psurf = Surface.p(lcD2prime) D3surf = Surface.p(lcD3) S3surf = Surface.p(lcS3, shape=Biconic.p(lcS3, curvy=si * 1. / 108.187, curvx=si * 1. / 73.105, coefficients=[(0., 0.), (-si * 5.542e-7, -0.08), (-si * 8.176e-11, -1.379)]), aperture=CircularAperture.p(lcS3, maxradius=40.0)) D3Psurf = Surface.p(lcD3prime) D4surf = Surface.p(lcD4) S4surf = Surface.p(lcS4, shape=Conic.p(lcS4, curv=1. / 77.772), aperture=CircularAperture.p(lcS4, maxradius=40.0)) D4Psurf = Surface.p(lcD4prime) imgsurf = Surface.p(lcimage) elem = OpticalElement.p(lc0, name="HUD") elem.addMaterial("air", air) elem.addMaterial("glass", glass) elem.addSurface("object", objsurf, (None, None)) elem.addSurface("d1", D1surf, (None, None)) elem.addSurface("s1", S1surf, (None, "glass")) elem.addSurface("d1p", D1Psurf, ("glass", "glass")) elem.addSurface("d2", D2surf, ("glass", "glass")) elem.addSurface("s2", S2surf, ("glass", "glass"))
def initDemoSystem(self): s = OpticalSystem.p() lc0 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="object", decz=0.0), refname=s.rootcoordinatesystem.name) lc1 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf1", decz=2.0), refname=lc0.name) # objectDist lc2 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf2", decz=3.0), refname=lc1.name) lc3 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf3", decz=5.0, tiltx=0.0 * math.pi / 180.0), refname=lc2.name) lc4 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf4", decz=3.0), refname=lc3.name) lc5 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf5", decz=3.0), refname=lc4.name) lc6 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf6", decz=2.0), refname=lc5.name) lc7 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf7", decz=3.0), refname=lc6.name) lc8 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="image", decz=19.0), refname=lc7.name) objectsurf = Surface.p(lc0) surf1 = Surface.p(lc1, shape=Conic.p(lc1, curv=1 / -5.922), aperture=CircularAperture.p(lc1, maxradius=10.0)) surf2 = Surface.p(lc2, shape=Conic.p(lc2, curv=1 / -3.160), aperture=CircularAperture.p(lc2, maxradius=10.0)) surf3 = Surface.p(lc3, shape=Conic.p(lc3, curv=1 / 15.884), aperture=CircularAperture.p(lc3, maxradius=10.0)) surf4 = Surface.p(lc4, shape=Conic.p(lc4, curv=1 / -12.756), aperture=CircularAperture.p(lc4, maxradius=10.0)) stopsurf = Surface.p(lc5, aperture=CircularAperture.p(lc5, maxradius=10.0)) surf6 = Surface.p(lc6, shape=Conic.p(lc6, curv=1 / 3.125), aperture=CircularAperture.p(lc6, maxradius=10.0)) surf7 = Surface.p(lc7, shape=Conic.p(lc7, curv=1 / 1.479), aperture=CircularAperture.p(lc7, maxradius=10.0)) image = Surface.p(lc8) elem = OpticalElement.p(lc0, name="lenssystem") glass = material_isotropic.ConstantIndexGlass.p(lc0, n=1.7) glass2 = material_isotropic.ConstantIndexGlass.p(lc0, n=1.5) elem.addMaterial("glass", glass) elem.addMaterial("glass2", glass2) elem.addSurface("object", objectsurf, (None, None)) elem.addSurface("surf1", surf1, (None, "glass")) elem.addSurface("surf2", surf2, ("glass", None)) elem.addSurface("surf3", surf3, (None, "glass")) elem.addSurface("surf4", surf4, ("glass", None)) elem.addSurface("stop", stopsurf, (None, None)) elem.addSurface("surf6", surf6, (None, "glass2")) elem.addSurface("surf7", surf7, ("glass2", None)) elem.addSurface("image", image, (None, None)) for mysurf in elem.surfaces.values(): print(mysurf.aperture.annotations) s.addElement("lenssys", elem) return s
LocalCoordinates.p(name="prismcenter", decz=50.0), refname=lc0.name) lc1 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="surf1", decz=-10.0, tiltx=30.*degree), refname=lccomprism.name) # objectDist lc2 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="surf2", decz=10.0, tiltx=-30.*degree), refname=lccomprism.name) lc3 = s.addLocalCoordinateSystem( LocalCoordinates.p(name="image", decz=50.0), refname=lccomprism.name) stopsurf = Surface.p(lc0) frontsurf = Surface.p(lc1, shape=Conic.p(lc1, curv=0), aperture=CircularAperture.p(lc1, maxradius=20.0)) rearsurf = Surface.p(lc2, shape=Conic.p(lc2, curv=0), aperture=CircularAperture.p(lc2, maxradius=20.0)) image = Surface.p(lc3) elem = OpticalElement.p(lc0, name="prism") glass = ModelGlass.p(lc1) elem.addMaterial("glass", glass)
s = OpticalSystem.p(name='os') lc0 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="stop", decz=0.0), refname=s.rootcoordinatesystem.name) lc1 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf1", decz=-1.048), refname=lc0.name) # objectDist lc2 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf2", decz=4.0), refname=lc1.name) lc3 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf3", decz=2.5), refname=lc2.name) lc4 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="image", decz=97.2), refname=lc3.name) stopsurf = Surface.p(lc0, name="stopsurf") frontsurf = Surface.p(lc1, name="frontsurf", shape=Conic.p(lc1, curv=1./62.8, name='conic1'), aperture=CircularAperture.p(lc1, maxradius=12.7)) cementsurf = Surface.p(lc2, name="cementsurf", shape=Conic.p(lc2, curv=-1./45.7, name='conic2'), aperture=CircularAperture.p(lc2, maxradius=12.7)) rearsurf = Surface.p(lc3, name="rearsurf", shape=Conic.p(lc3, curv=-1./128.2, name='conic3'), aperture=CircularAperture.p(lc3, maxradius=12.7)) image = Surface.p(lc4, name="imagesurf") elem = OpticalElement.p(lc0, name="thorlabs_AC_254-100-A") rnd_data1 = np.random.random((3, 3)) # np.eye(3) rnd_data2 = np.random.random((3, 3)) # np.zeros((3, 3))# rnd_data3 = np.random.random((3, 3)) # np.eye(3) rnd_data4 = np.random.random((3, 3)) # np.zeros((3, 3))#
lc1 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf1", decz=10.0, tiltx=5. * math.pi / 180.0), refname=lc0.name) # objectDist lc2 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="surf2", decz=20.0, tiltx=10. * math.pi / 180.0), refname=lc1.name) lc3 = s.addLocalCoordinateSystem(LocalCoordinates.p(name="image", decz=10.0), refname=lc2.name) stopsurf = Surface.p(lc0) surf1 = Surface.p(lc1, shape=Conic.p(lc1, curv=1. / 24.0), aperture=CircularAperture.p(lc1, maxradius=5.0)) surf2 = Surface.p(lc2, shape=Conic.p(lc2, curv=-1. / 24.0), aperture=CircularAperture.p(lc2, maxradius=5.0)) image = Surface.p(lc3) elem = OpticalElement.p(lc0, name="grinelement") mysource =\ r""" import numpy as np grin_strength = 0.5