Files
petzval/app/Main.hs

116 lines
4.4 KiB
Haskell

module Main where
import Control.Lens
import Control.Lens.Unsound (adjoin)
import Control.Monad.Writer
-- import Criterion.Main
import Data.Default
import Data.Either
import Petzval.Optics
import Petzval.Optics.RTM
import Petzval.System
import Petzval.Merit
import Petzval.Trace
import Petzval.Calculations
import Petzval.Optimization
import Petzval.Types
import System.Environment (getArgs)
import System.IO (hPrint, hPutStrLn, stderr)
import Linear
import Numeric.AD.Mode (Scalar, Mode)
import qualified Numeric.LinearAlgebra as L
import qualified Data.List as DL
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, _curvature = 1/100, _outsideRadius=10}
, Surface{_material = air, _thickness = 95, _curvature = -1/100, _outsideRadius=10}
]
system2 =
[
Surface{_material = s_sk16, _outsideRadius=11.5, _curvature=1/42.98790, _thickness = 4}
, Surface{_material = air, _outsideRadius = 11.5, _curvature = -1/248.07740, _thickness = 10.51018}
, Surface{_material = s_f4, _outsideRadius = 9.852, _curvature = -1/38.21035, _thickness = 2.5}
, Surface{_material = air, _outsideRadius = 8.885, _curvature = 1/43.95894, _thickness = 0}
, Stop{_outsideRadius = 8.6762522794, _thickness = 9.86946}
, Surface{_material=s_sk16, _outsideRadius = 11, _curvature=1/656.66349, _thickness = 4.5}
, Surface{_material = air, _outsideRadius = 11, _curvature = -1/33.50754, _thickness = 86.48643}
]
where s_sk16 = constMat 1.620408 :: SellemeierMat
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.5875618 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
doOptimize steps = runWriterT $ optimizeDLS cfg vars merit system1
where merit = mkMerit [ DynMerit $ TW 100 100 $ BFL Nothing
, DynMerit $ TW 0 1 $ SpotSize Nothing
, DynMerit $ TW 0 1 $ SpotSize (Just $ TraceConditions 7 0.587618)
, DynMerit $ TW 0 1 $ SpotSize (Just $ TraceConditions 15 0.587618)
, DynMerit $ TW 1 100 $ Vign (TraceConditions 15 wl)
]
wl = 0.5875618
vars :: VariableSet
vars = (ix 1 . curvature) `adjoin` (ix 2 . curvature) `adjoin` (ix 2.thickness)
cfg = def{maxSteps = steps,eps1=0,eps2=0}
main :: IO ()
main =
let baked = bake 0.587618 system2 :: [Element BakedIOR Double]
ep = (entrancePupil baked){position=20.4747094540}
fa = 20
in do
[arg] <- getArgs
let steps = read arg
hPrint stderr system1
print $ L.norm_2 (L.fromList [3.0 , 4.0] :: L.Vector Double)
(result, tr) <- doOptimize steps
hPutStrLn stderr $ "Result BFL: " ++ (show . rearFocalLength . lensRTM . bake 0.5875618) result
hPrint stderr result
putStrLn "---"
mapM_ (putStrLn . DL.intercalate "," . map show) tr
-- 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
]
]
-}