-- Glasow Haskell 0.403 : FINITE ELEMENT PROGRAM V2
-- **********************************************************************
-- * *
-- * FILE NAME : degrees.hs DATE : 13-3-1991 *
-- * *
-- * CONTENTS : Computes the degree numbers of each node. *
-- * *
-- * CHANGES : *
-- * 1. Mon Mar 11 10:28:10 GMT 1991 *
-- * Add new function degreesrlt for debug use. *
-- **********************************************************************
module Degrees( ndgrs, getndgr, degreesrlt ) where
import Array
import Basics
import Vector
import DB_interface
ndgrs :: (Array Int Int, Array Int Float) -> Int
-- Return the total number of degrees
getndgr :: (Array Int Int, Array Int Float) -> Int -> [Int]
-- Return the degree numbers of a node (U, V and THETA)
ndgrs s =
fst (ndgrs_and_dgrsn s)
getndgr s node =
[u,v,theta]
where
u = dgrsn_s ! index
v = dgrsn_s ! (index + 1)
theta = dgrsn_s ! (index + 2)
dgrsn_s = dgrsn s
index = (node-1) * 3 + 1
dgrsn :: (Array Int Int, Array Int Float) -> Array Int Int
dgrsn s = listArray (1, (nnode s)*3) (snd (ndgrs_and_dgrsn s))
ndgrs_and_dgrsn :: (Array Int Int, Array Int Float) -> (Int,[Int])
ndgrs_and_dgrsn s =
foldl counting_one_node_s (0,[]) [1..(nnode s)]
where
counting_one_node_s = counting_one_node s
counting_one_node s (ndgrs_till_now,dgrsn_till_now) i =
(ndgrs_till_now + ndgrs_this_node, dgrsn_till_now ++ dgrsn_this_node)
where
dof = [ fod j | j <- [2,1,0]]
fod j = if (mod (div bc (e_10 j)) 10 == 1) then
1
else 0
e_10 j = if (j == 0) then (1::Int) else 10 * (e_10 (j-1))
ndgrs_this_node = sum dof
dgrsn_this_node = [g j | j <- [0,1,2]]
g j = if ( (dof!!j) == 0 ) then
0
else
sum (take (j+1) dof) + ndgrs_till_now
bc = getnbc s i
degreesrlt :: (Array Int Int, Array Int Float) -> [Char]
degreesrlt s =
"DEGREE INFORMATION :\n\n" ++
"\t Total degree numbers = " ++ showlj 4 (ndgrs s) ++ "\n\n" ++
(concat ( map a_node_s [1..(nnode s)] )) ++ "\n\n"
where
a_node_s = a_node s
a_node s node =
" Node.no = " ++ (showrj 2 node) ++
" u = " ++ (showrj 8 u) ++ " v = " ++ (showrj 8 v) ++
" theta=" ++ (showrj 8 theta) ++
" bc = " ++ ( showrj 3 bc) ++ "\n"
where
bc = getnbc s node
[u,v,theta] = getndgr s node
|