1 -- Glasow Haskell 0.403 : FINITE ELEMENT PROGRAM V2
    2 -- **********************************************************************
    3 -- *                                                                    *
    4 -- * FILE NAME : pre_assemble.hs        DATE : 13-3-1991                *
    5 -- *                                                                    *
    6 -- * CONTENTS : Computes the diagonal element address vector of global  *
    7 -- *       stiffness matrix.                           *
    8 -- *                                                                    *
    9 -- * CHANGES  :                              *
   10 -- *    1. Mon Mar 11 10:38:35 GMT 1991                     *
   11 -- *       Add function "diagadrrlt" for debug use.   *
   12 -- **********************************************************************
   13 
   14 module Pre_assemble( diagadr , diagadrrlt) where
   15 
   16 import Basics
   17 import Vector
   18 import DB_interface
   19 import Degrees
   20 
   21 diagadr :: (Array Int Int, Array Int Float) -> Vec Int
   22 
   23 diagadr s =
   24         v
   25         where
   26         v = makevec bound f
   27         bound = boundvec (bandvec_s)
   28         f i   = 
   29                 if ( i == 1) then 1 
   30                 else vecsub v (i-1) + vecsub bandvec_s i
   31         bandvec_s = bandvec s
   32 
   33 bandvec s =
   34         maxupdvec initial_value 
   35                 ( concat (map pre_assemble_s [1..(nelem s)]))
   36         where
   37         initial_value = makevec (ndgrs s) (\ i -> 0) 
   38         pre_assemble_s = pre_assemble s
   39 
   40 pre_assemble s element =
   41         azip dgrs_list (map f dgrs_list)
   42         where
   43         f x = x - (head dgrs_list) + 1
   44         dgrs_list = (dgrs_list_node nodel) ++ (dgrs_list_node noder)
   45         (nodel,noder) = getenlr s element
   46         dgrs_list_node node = filter (\x -> x /= 0) ( getndgr s node )
   47 
   48 
   49 diagadrrlt :: (Array Int Int, Array Int Float) -> [Char]
   50 
   51 diagadrrlt s =
   52         "DIAGONAL ADDRESS VECTOR=\n" ++ 
   53         displayvec (diagadr s)