Guest User

Untitled

a guest
Apr 18th, 2023
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env cabal
  2. {- cabal:
  3. ghc-options:
  4.   -O2
  5.   -threaded
  6.   -with-rtsopts=-N
  7. build-depends:
  8.   base,
  9.   parallel
  10. -}
  11. {- project:
  12. index-state: 2023-04-17T00:00:00Z
  13. -}
  14.  
  15. {-# LANGUAGE BangPatterns #-}
  16.  
  17. import           Control.Parallel.Strategies
  18. import           Data.List                   (foldl')
  19. import           Numeric                     (showFFloat)
  20.  
  21. getX (x, _, _) = x; getY (_, y, _) = y; getZ (_, _, z) = z
  22.  
  23. lorenz :: Num c => (c, c, c) -> c -> (c, c, c) -> (c, c, c)
  24. lorenz (sigma, rho, beta) dt (x, y, z) =
  25.  ( x + sigma * (y - x) * dt
  26.  , y + (x * (rho - z) - y) * dt
  27.  , z + (x * y - beta * z) * dt
  28.  )
  29.  
  30. countFlips :: (Foldable t, Eq a1, Num a2, Num a1) => (a3 -> a1) -> t a3 -> a2
  31. countFlips f ps = fst $
  32.  foldl' (\(n, s) -> \p ->
  33.              let s' = signum (f p)
  34.             in (if s' == s then n else n + 1, s'))
  35.  (0, 0) ps
  36.  
  37. average :: (Fractional a, Foldable t) => t a -> a
  38. average xs = (sum xs) / fromIntegral(length xs)
  39.  
  40. showFullFloat :: Double -> ShowS
  41. showFullFloat = Numeric.showFFloat Nothing
  42.  
  43. main = do
  44.  let params = (10.0, 28, 8.0 / 3.0)
  45.  let dt = 0.001
  46.  let n = 10000000
  47.  let is = [0..100]
  48.  let ps = map -- parMap rseq
  49.        (\i -> let p0 = ((i / 1000.0), 1.0, 1.0)
  50.               in (p0, take n $ iterate (lorenz params dt) p0)) is
  51.  let rs = map -- parMap (rpar `dot` rdeepseq)
  52.        (\(p0, ps) -> (getX p0, countFlips getY ps)) ps
  53.  -- let rs = (map (\(p0, ps) -> let f = getY in (f p0, average (map f ps))) ps)
  54.  mapM (\(p,v) -> putStrLn (showFullFloat p . ("\t" ++) . showFullFloat v $ ""))
  55.    (rs `using` parBuffer 100 rseq)
  56.  
Advertisement
Add Comment
Please, Sign In to add comment