dynobud-1.3.0.0: examples/Glider.hs
{-# OPTIONS_GHC -Wall #-}
{-# Language DataKinds #-}
module Main ( main ) where
import Data.Proxy ( Proxy(..) )
import Linear
import Data.Vector ( Vector )
import Dyno.Vectorize
import Dyno.View.View
import Dyno.Solvers
--import Dyno.Sqp.Sqp
--import Dyno.Sqp.LineSearch
import Dyno.Nlp
import Dyno.NlpUtils
import Dyno.Ocp
import Dyno.DirectCollocation
import Dyno.DirectCollocation.Dynamic ( toMeta )
import Dyno.DirectCollocation.Quadratures ( QuadratureRoots(..) )
import Glider.Aircraft
import Glider.AeroCoeffs
import Glider.Betty
import Dynoplot.Callback ( withCallback )
type NCollStages = 100
type CollDeg = 2
mayer :: Floating a => a -> AcX a -> AcX a -> None a -> None a -> a
mayer _ _ _ _ _ = 0
lagrange :: Floating a => AcX a -> None a -> AcU a -> None a -> None a -> a -> a -> a
lagrange (AcX _ _ _ _ (AcU surfs)) _ (AcU surfs') _ _ _ _ =
elev**2 + rudd**2 + ail**2 + flaps**2 +
100*(elev'**2 + rudd'**2 + ail'**2 + flaps'**2)
where
elev = csElev surfs
rudd = csElev surfs
ail = csElev surfs
flaps = csFlaps surfs
elev' = csElev surfs'
rudd' = csElev surfs'
ail' = csElev surfs'
flaps' = csFlaps surfs'
dae :: Floating a => AcX a -> AcX a -> None a -> AcU a -> None a -> a -> (AcX a, None a)
dae x' x _ u _ _ = (aircraftDae (mass, inertia) fcs mcs refs x' x u, None)
where
mass = bettyMass
inertia = bettyInertia
fcs = bettyFc
mcs = bettyMc
refs = bettyRefs
ocp :: OcpPhase AcX None AcU None AcX None AcX None None
ocp = OcpPhase { ocpMayer = mayer
, ocpLagrange = lagrange
, ocpQuadratures = \_ _ _ _ _ _ _ -> None
, ocpDae = dae
, ocpBc = bc
, ocpPathC = pathc
, ocpPathCBnds = None
, ocpBcBnds = fill (Just 0, Just 0)
, ocpXbnd = xbnd
, ocpUbnd = ubnd
, ocpZbnd = None
, ocpPbnd = None
, ocpTbnd = (Just 0.5, Just 0.5)
-- , ocpTbnd = (Just 4, Just 4)
, ocpObjScale = Nothing
, ocpTScale = Nothing
, ocpXScale = Nothing
, ocpZScale = Nothing
, ocpUScale = Nothing
, ocpPScale = Nothing
, ocpResidualScale = Nothing
, ocpBcScale = Nothing
, ocpPathCScale = Nothing
}
pathc :: x a -> z a -> u a -> p a -> None a -> a -> None a
pathc _ _ _ _ _ _ = None
xbnd :: AcX (Maybe Double, Maybe Double)
xbnd = AcX { ac_r_n2b_n = fill (Nothing, Nothing)
, ac_v_bn_b = fill (Nothing,Nothing)
, ac_R_n2b = fill $ fill (Just (-1.2), Just 1.2)
, ac_w_bn_b = fill (Just (-8*2*pi), Just (8*2*pi))
, ac_u = ubnd
}
d2r :: Floating a => a -> a
d2r d = d*pi/180
ubnd :: AcU (Maybe Double, Maybe Double)
ubnd =
AcU
ControlSurfaces { csElev = (Just (d2r (-10)), Just (d2r 10))
, csRudder = (Just (d2r (-10)), Just (d2r 10))
, csAil = (Just (d2r (-10)), Just (d2r 10))
, csFlaps = (Just (d2r (-0.01)), Just (d2r 0.01))
}
bc :: Floating a => AcX a -> AcX a -> None a -> None a -> a -> AcX a
bc (AcX x0 v0 dcm0 w0 cs) _ _ _ _ = AcX x0 (v0 - V3 30 0 0) (dcm0 - eye3) w0 cs
main :: IO ()
main = do
cp <- makeCollProblem Legendre ocp
let nlp = cpNlp cp
withCallback $ \cb -> do
let guess = jfill 1
cb' :: J (CollTraj AcX None AcU None NCollStages CollDeg) (Vector Double) -> IO Bool
cb' traj = do
plotPoints <- cpPlotPoints cp traj
let proxy :: Proxy (CollTraj AcX None AcU None NCollStages CollDeg)
proxy = Proxy
cb (plotPoints, toMeta (Proxy :: Proxy None) (Proxy :: Proxy None) proxy)
(msg,_) <- solveNlp ipoptSolver (nlp { nlpX0 = guess }) (Just cb')
case msg of Left msg' -> putStrLn $ "optimization failed, message: " ++ msg'
Right _ -> putStrLn "optimization succeeded"
-- let xopt = xOpt opt
-- lambda = lambdaOpt opt
--
-- snoptOpt' <- solveNlp snoptSolver (nlp {nlpX0 = xopt}) (Just cb) (Just lambda)
-- snoptOpt <- case snoptOpt' of Left msg -> error msg
-- Right opt'' -> return opt''
-- let xopt' = xOpt snoptOpt
-- lambda' = lambdaOpt opt
-- lambdax' = vectorize $ lambdaX lambda'
-- lambdag' = vectorize $ lambdaG lambda'
-- _ <- solveSqp (nlp {nlpX0 = xopt}) fullStep
-- _ <- solveSqp (nlp {nlpX0 = xopt}) armilloSearch
return ()