-- Glasow Haskell 0.403 : FINITE ELEMENT PROGRAM V2
-- **********************************************************************
-- *                                                                    *
-- * FILE NAME : assemble_stiffness.hs        DATE : 13-3-1991          *
-- *                                                                    *
-- * CONTENTS : Assemble the global stiffness matrix, stored in         *
-- *            variable bandwidth matrix .                             *
-- *                                                                    *
-- **********************************************************************

module Assemble_stiffness( kdd ) where

import Basics
import Vector
import Matrix
import VBmatrix
import DB_interface
import Degrees
import Pre_assemble
import Elemstif

kdd :: (Array Int Int, Array Int Float) -> Vbm Float

kdd s =
	incrvbmat initial_value index_value_assoc_s
	where
	initial_value = makevbmat (ndgrs s) (diagadr s) (\ i -> 0.0)
	index_value_assoc_s = index_value_assoc s

index_value_assoc s =
	foldl assemble_s [] [ 1 .. (nelem s)]
	where
	assemble_s = assemble s

assemble s till_now_dd element =
	(till_now_dd++dd_this')
	where
	dd_this' = [ ( 	(f i, f j) ,  x i j)
                     | i <- [0..n-1], j <- [0..i], f i > 0 , f j > 0 ]
	dgrs_list = (dgrs_list_node nodel) ++ (dgrs_list_node noder)
	(nodel,noder) = getenlr s element
	dgrs_list_node node = getndgr s node
	eindex_dgrs_list = zip [1..6] dgrs_list
	aindex_dgrs_list = filter valid_index eindex_dgrs_list
	valid_index (i,dgr) = (dgr /= 0)
	n = length aindex_dgrs_list
	x i j = matsub (beam2d s element)
		(fst (aindex_dgrs_list !! i), fst (aindex_dgrs_list !! j))
	f i   = (snd (aindex_dgrs_list !!  i))

