packages feed

AERN-RnToRm-Plot-0.1.2: tests/Demo.hs

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