116 lines
4.4 KiB
Haskell
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
|
|
|
|
]
|
|
]
|
|
-}
|