module Main where import qualified Data.Number.ER.Real as AERN import qualified Data.Number.ER.RnToRm as AERNFunc import qualified Data.Number.ER.RnToRm.Plot.FnView as FNV import Control.Concurrent as Concurrent import Control.Concurrent.STM as STM import qualified Graphics.UI.Gtk as Gtk import Graphics.UI.Gtk (AttrOp((:=))) import qualified Graphics.UI.Gtk.Glade as Glade import qualified Graphics.UI.Gtk.OpenGL as GtkGL import qualified Graphics.UI.GLUT as GLUT type B = AERN.BM --type B = AERN.BMPFR type RA = AERN.RA B type IRA = AERN.IRA B type FA = AERNFunc.FAPWP B type Box a = AERNFunc.Box a type VarID = AERNFunc.VarID main = do AERN.initialiseBaseArithmetic (0 :: RA) initGtkGL fadataTV <- newTVarIO faData fndataTV <- newTVarIO FNV.defaultFnData fnviewWindow <- FNV.new (fadataTV, fndataTV) Nothing forkIO $ signalData fndataTV Gtk.mainGUI faData = FNV.defaultFaData { FNV.dataFAs = [f1,f2] } f1 = AERNFunc.tuple [f11,f12,f13] f2 = AERNFunc.tuple [f21,f22,f23] ix1 = 6 ix2 = 12 ix3 = 18 g = AERNFunc.scale 10 x f11 = AERN.cos ix1 $ g -- cos(10x) f12 = AERN.cos ix2 $ g -- cos(10x) f13 = AERN.cos ix3 $ g -- cos(10x) f21 = AERNFunc.integrateUnary 3 f11 dom 0 [-1] -- integ(cos(10x)) - 1 f22 = AERNFunc.integrateUnary 3 f12 dom 0 [-1] -- integ(cos(10x)) - 1 f23 = AERNFunc.integrateUnary 3 f13 dom 0 [-1] -- integ(cos(10x)) - 1 x :: FA x = AERNFunc.bisectUnbisectDepth 5 $ AERNFunc.setMaxDegree 3 $ AERNFunc.proj xdom 0 xdom = AERNFunc.fromAscList [(0, dom)] const01 :: FA const01 = AERNFunc.const xdom [0 AERN.\/ 1] dom = domL AERN.\/ domR (domL, domR) = (-1, 1) (valLO, valHI) = (-2,2) fnData = setExtents domL domR valLO valHI $ FNV.defaultFnData { FNV.dataFAsUpdated = True, FNV.dataDomName = "x", FNV.dataFnNames = ["f1","f2"], FNV.dataResultNames = [["f11", "f12", "f13"],["f21", "f22", "f23"]], FNV.dataDefaultEvalPoint = 0 } setExtents left right bot top fnData = fnData { FNV.dataDomL = td left, FNV.dataDomR = td right, FNV.dataValLO = td bot, FNV.dataValHI = td top, FNV.dataDefaultPlotParams = FNV.defaultPlotParams { FNV.pltprmCoordSystem = FNV.CoordSystemLinear $ FNV.Rectangle (tr $ top + 0.1) (tr $ bot - 0.1) (tr $ left - 0.1) (tr $ right + 0.1) } } where tr = toRational . td td = fst . AERN.doubleBounds initGtkGL = do Gtk.initGUI -- enable multithreaded GUI: Gtk.timeoutAddFull (Concurrent.yield >> Concurrent.yield >> Concurrent.yield >> return True) Gtk.priorityDefaultIdle 20 -- see http://haskell.org/gtk2hs/archives/2005/07/24/writing-multi-threaded-guis/ GtkGL.initGL GLUT.initialize "AERN Function View" [] -- needed for text in GL canvas signalData fndataTV = do threadDelay 200000 -- 0.2s atomically $ do writeTVar fndataTV fnData