-- Glasow Haskell 0.403 : FINITE ELEMENT PROGRAM V2
-- **********************************************************************
-- *                                                                    *
-- * FILE NAME : pre_assemble.hs        DATE : 13-3-1991                *
-- *                                                                    *
-- * CONTENTS : Computes the diagonal element address vector of global  *
-- *		stiffness matrix.					*
-- *                                                                    *
-- * CHANGES  :  							*
-- * 	1. Mon Mar 11 10:38:35 GMT 1991					*
-- *		Add function "diagadrrlt" for debug use.		*
-- **********************************************************************

module Pre_assemble( diagadr , diagadrrlt) where

import Basics
import Vector
import DB_interface
import Degrees

diagadr :: (Array Int Int, Array Int Float) -> Vec Int

diagadr s =
	v
	where
 	v = makevec bound f
	bound = boundvec (bandvec_s)
	f i   =
		if ( i == 1) then 1
		else vecsub v (i-1) + vecsub bandvec_s i
	bandvec_s = bandvec s

bandvec s =
	maxupdvec initial_value
		( concat (map pre_assemble_s [1..(nelem s)]))
	where
	initial_value = makevec (ndgrs s) (\ i -> 0)
	pre_assemble_s = pre_assemble s

pre_assemble s element =
	azip dgrs_list (map f dgrs_list)
	where
	f x = x - (head dgrs_list) + 1
	dgrs_list = (dgrs_list_node nodel) ++ (dgrs_list_node noder)
	(nodel,noder) = getenlr s element
	dgrs_list_node node = filter (\x -> x /= 0) ( getndgr s node )


diagadrrlt :: (Array Int Int, Array Int Float) -> [Char]

diagadrrlt s =
	"DIAGONAL ADDRESS VECTOR=\n" ++
	displayvec (diagadr s)
