module Main where import Control.Lens import Criterion.Main import Data.Either import Petzval.Optics import Petzval.Optics.RTM import Petzval.System import Petzval.Trace import Petzval.Calculations import Petzval.Optimization import Petzval.Types import Linear import Numeric.AD.Mode (Scalar, Mode) import qualified Numeric.LinearAlgebra as L bk7 = SellemeierMat [ (1.03961212, 6.00069867e-3 ) , (0.231792344, 2.00179144e-2 ) , (1.01046945, 103.560653 )] n_sk16 = SellemeierMat [ (1.343177740, 0.007046873) , (0.241144399, 0.0229005000) , (0.994317969, 92.75085260)] n_ssk8 = SellemeierMat [ (1.44857867, 1.17965926e-01) , (1.06937528, 8.69310149E-03) , (4.21566593E-02, 1.11300666E+02) ] system1 = [ Stop{_thickness = 0, _outsideRadius=5} , Surface{_material = bk7, _thickness = 10, _roc = 100, _outsideRadius=10} , Surface{_material = air, _thickness = 95, _roc = -100, _outsideRadius=10} ] system2 = [ Surface{_material = s_sk16, _outsideRadius=11.5, _roc=42.98790, _thickness = 4} , Surface{_material = air, _outsideRadius = 11.5, _roc = -248.07740, _thickness = 10.51018} , Surface{_material = s_f4, _outsideRadius = 9.852, _roc = -38.21035, _thickness = 2.5} , Surface{_material = air, _outsideRadius = 8.885, _roc = 43.95894, _thickness = 0} , Stop{_outsideRadius = 8.6762522794, _thickness = 9.86946} , Surface{_material=s_sk16, _outsideRadius = 11, _roc=656.66349, _thickness = 4.5} , Surface{_material = air, _outsideRadius = 11, _roc = -33.50754, _thickness = 86.48643} ] where s_sk16 = ConstMat 1.620408 s_f4 = ConstMat 1.616589 merit :: (Material mat, Calcuable a) => [Element mat a] -> a -- merit :: (Material mat) => [Element mat Double] -> Double merit system = result where baked = bake 0.587618 system ep = entrancePupil baked result = sum . map (^2) . map (\ angle -> rmsSize . toListOf (each._pos._xy) -- . (\x -> x :: [Ray a]) . rights . map fst . map (raytrace baked . createRay Nothing ep angle) $ hexapolarPattern 6) $ [0, 7.07, 15] type Id a = a -> a main :: IO () main = let baked = bake 0.587618 system2 ep = (entrancePupil baked){position=20.4747094540} fa = 20 in do print $ L.norm_2 (L.fromList [3.0 , 4.0] :: L.Vector Double) putStrLn $ show ep putStrLn $ show $ rearFocalLength $ lensRTM baked putStrLn $ show $ mconcat (seidel ep fa baked :: [Seidel Double]) {- defaultMain [ bgroup "merit" [ bench "system1" $ nf merit (system1 :: [Element SellemeierMat Double]) , bench "system2" $ nf merit (system2 :: [Element ConstMat Double]) ] , bgroup "ad" [ bench "system1" $ nf (gradientAt (ix 1.thickness) merit) system1, bench "system2" $ nf (gradientAt (ix 1.thickness) merit) system2 ] ] -}