{-
Some subroutines
XZ, 24/10/91
-}
{-
Modified to employ S_array.
XZ, 7/2/92
-}
module Asb_routs
( get_asb_table, get_val, list_inner_prod, list_match_prod, add_mat, add_u, mult )
where
import Defs
import S_Array -- not needed w/ proper module handling
import Norm -- ditto
import Ix--1.3
-----------------------------------------------------------
-- Generating a lookup table for assembling a system --
-- matrix using a corresponging steering vector. --
-- The result is an array of tuple list. --
-- The ith entry of the array contains all elements --
-- which have node i on their edges. --
-- The 1st item of the tuples is the element identity --
-- and the 2nd is the node local number. --
-- Called at the data setup stage. --
-----------------------------------------------------------
get_asb_table :: Int -> Int -> Int -> (My_Array Int [Int]) ->
(My_Array Int [(Int,Int)])
get_asb_table total e_total nodel steer =
s_accumArray (++) [] (1,total)
(
concat
[ zipWith f1 (steer!^e) (map (\z->[(e,z)]) range_nodel)
| e <- range (1,e_total)
]
)
where
range_nodel = range (1,nodel)
f1 = \x y->(x,y)
-----------------------------------------------------------
-- syntaxes for generating velocity and pressure --
-- assembling table: --
-- v_asb_table = --
-- get_asb_table n_total e_total v_nodel v_steer --
-- p_asb_table = --
-- get_asb_table p_total e_total p_nodel p_steer --
-- Selecting some values from an array and putting them --
-- into a list. Used mainly for assembling RHS and --
-- Jacobi iteration. --
-----------------------------------------------------------
get_val :: (My_Array Int Frac_type) -> [Int] -> [Frac_type]
get_val arr steer = [arr!^n|n<-steer]
-----------------------------------------------------------
-- Inner-production of 2 list vectors. Used mainly for --
-- assembling RHS, Choleski decomposition and Jacobi --
-- iteration. --
-- Two versions: 1: lazy; --
-- 2: 2nd arg forced, possibly save --
-- some calculation. --
-----------------------------------------------------------
list_inner_prod :: [Frac_type] -> [Frac_type] -> Frac_type
list_inner_prod = \x y -> sum (zipWith (*) x y)
list_match_prod :: [Frac_type] -> [Frac_type] -> Frac_type
list_match_prod =
\x y -> sum (zipWith mult x y)
-----------------------------------------------------------
-- modified (*): check first if the 2nd arg is 0 --
-----------------------------------------------------------
mult _ 0 = 0
mult x y = x * y
-----------------------------------------------------------
-- adding 2 vectors. Used mainly in the TG iteration. --
-----------------------------------------------------------
add_mat
:: (My_Array Int Frac_type) -> (My_Array Int Frac_type)
-> (My_Array Int Frac_type)
add_mat a b =
s_listArray (s_bounds a) (zipWith (+) (s_elems a) (s_elems b))
-----------------------------------------------------------
-- Adding 2 vector pairs. Used in TG iteration and --
-- Jacobi iteration. --
-----------------------------------------------------------
add_u
:: (My_Array Int Frac_type,My_Array Int Frac_type)
-> (My_Array Int Frac_type,My_Array Int Frac_type)
-> (My_Array Int Frac_type,My_Array Int Frac_type)
add_u = \ a b ->
(
add_mat (fst a) (fst b),
add_mat (snd a) (snd b)
)