1 {-
    2         Functions for data input.  Some data have been put
    3         into arrays.
    4 
    5         XZ, 24/10/91
    6 -}
    7 
    8 {-
    9         Modified to adopt S_Arrays.
   10 
   11         XA, 19/2/92
   12 -}
   13 
   14 module Input_proc ( read_fs_cs, read_data ) where
   15 
   16 import Defs
   17 import S_Array  -- not needed w/ proper module handling
   18 import Norm     -- ditto
   19 (=:) a b = (a,b)
   20 
   21 -----------------------------------------------------------
   22 -- reading a Int                                         --
   23 -----------------------------------------------------------
   24 
   25 rd_int = \ i -> (head (reads i)) :: (Int,String)
   26 
   27 -----------------------------------------------------------
   28 -- reading a Floating                                    --
   29 -----------------------------------------------------------
   30 
   31 rd_flt = \ f -> (head (reads f)) :: (Frac_type,String)
   32 
   33 -----------------------------------------------------------
   34 -- Reading a pair of values ( could be structed and      --
   35 -- different values ); results are packed into a tuple.  --
   36 -----------------------------------------------------------
   37 
   38 rd_pair rf1 rf2 i = ((v1,v2),rest)
   39         where
   40         (v1,rest1) = (rf1 i)
   41         (v2,rest) = (rf2 rest1)
   42 
   43 -----------------------------------------------------------
   44 -- Reading a number of values ( could be structed ).     --
   45 -- Results are packed into a list.                       --
   46 -----------------------------------------------------------
   47 
   48 read_n_val rd_f n in_str =
   49         (takeval n in_str, dropval n in_str )
   50         where
   51         takeval n i
   52                 | n == 0      = []
   53                 | otherwise = x : (takeval (n-1) rest)
   54                 where (x,rest) = (rd_f i)
   55         dropval n i
   56                 | null i = []
   57                 | n == 0      = i
   58                 | otherwise = dropval (n-1) rest
   59                 where (x,rest) = (rd_f i)
   60  
   61 -----------------------------------------------------------
   62 -- reading a number of Int                               --
   63 -----------------------------------------------------------
   64 
   65 read_n_int = read_n_val rd_int
   66 
   67 -----------------------------------------------------------
   68 -- reading a number of Floating                          --
   69 -----------------------------------------------------------
   70 
   71 read_n_flt = read_n_val rd_flt
   72 
   73 -----------------------------------------------------------
   74 -- reading a pair of Int and Floating                    --
   75 -----------------------------------------------------------
   76 
   77 read_i_f_pair = rd_pair rd_int rd_flt
   78 
   79 -----------------------------------------------------------
   80 -- Skip over n lines                                     --
   81 -----------------------------------------------------------
   82 
   83 skip_lines 0 cs = cs
   84 skip_lines n cs =
   85         skip_lines (n-1) (drop 1 (dropWhile ((/=) '\n') cs))
   86         
   87 -----------------------------------------------------------
   88 -- Reading the data file of our local form.              --
   89 -- Called at the data setup stage.                       --
   90 -----------------------------------------------------------
   91 
   92 read_fs_cs f =
   93         (data_file,(mon,m_iter,m_toler,max_jcb_iter,jcb_toler,relax,dlt_t))
   94         where
   95         hed1 = skip_lines 1 f
   96         (i,hed2) = rd_int hed1
   97         start' = skip_lines (i+2) hed2
   98         mon = (head (head (drop 9 (words start'))))=='t'
   99         start = skip_lines (i+14) hed2
  100         ([m_iter,max_jcb_iter],rest1) = read_n_int 2 start
  101         ([m_toler,jcb_toler,relax],rest2) = read_n_flt 3 rest1
  102         rest3 = skip_lines 2 rest2
  103         (dlt_t,rest4) = rd_flt rest3
  104         rest5 = skip_lines 11 rest4
  105         data_file = head (drop 5 (words rest5))
  106 
  107 read_data f =
  108         (e_total,n_total,p_total,v_steer,p_steer,coord,
  109         (init_p,init_u),(all_bry,(x_fixed,y_fixed)),p_fixed)
  110         where
  111         hed1 = skip_lines 1 f
  112         (i,hed2) = rd_int hed1
  113         start = skip_lines (i+4) hed2
  114         ((e_total:n_total:bnd_total:_:_:p_total:_),rest1) =
  115                 read_n_int 6 start
  116         rest2 = skip_lines 2 rest1
  117         (v_vals,rest3) =
  118                 read_n_val (read_n_int (v_nodel+2) ) e_total rest2
  119         rest4 = skip_lines 2 rest3
  120         (c_vals,rest5) =
  121                 read_n_val (rd_pair rd_int (read_n_flt 2)) n_total rest4
  122         rest6 = skip_lines 2 rest5
  123         line_size :: Int
  124         line_size =
  125                 length (words (takeWhile ((/=) '\n') rest6)) - 1
  126         (init_vals,rest7) =
  127                 read_n_val (rd_pair rd_int (read_n_flt line_size)) n_total rest6
  128         rest8 = skip_lines 2 rest7
  129         (bry_vals,rest9) =
  130                 read_n_val (rd_pair rd_int (read_n_val
  131                 (rd_pair rd_int rd_flt) line_size)) bnd_total rest8
  132         -- velocity steering vector
  133         v_steer = 
  134                 s_array (1,e_total) (map (\(i:_:rest)->i=:rest) v_vals)
  135         -- pressure steering vector
  136         p_steer =
  137                 s_array (1,e_total) (map (\(i:_:rest)->i =: rest)
  138                 (map (take (p_nodel+2)) v_vals))
  139         -- node coordinates
  140         coord =
  141                 s_array (1,n_total) (map (\(i,(x:y:_))->i =: (x,y)) c_vals)
  142         v_init =
  143                 map (\(i,(x:y:_))->(i,(x,y))) init_vals
  144         -- velocity initial conditions
  145         init_u =
  146                 (
  147                         s_def_array (1,n_total) (0::Frac_type)
  148                         [ i =: 
  149                                 if x_fixed!^i
  150                                 then
  151                                         (fst.snd.head) (dropWhile (\t->(fst t)/=i) bry_xys)
  152                                 else fst v
  153                                 | (i,v) <- v_init
  154                         ],
  155                         s_def_array (1,n_total) (0::Frac_type)
  156                         [ i =:
  157                                 if y_fixed!^i
  158                                 then
  159                                         (snd.snd.head) (dropWhile (\t->(fst t)/=i) bry_xys)
  160                                 else snd v
  161                                 | (i,v) <- v_init
  162                         ]
  163                 )
  164         -- pressure initial conditions
  165         init_p =
  166                 s_def_array (1,p_total) (0::Frac_type)
  167                 [ i =:
  168                         (
  169                                 if i `elem` p_fixed
  170                                 then (snd.head) (dropWhile (\t->(fst t)/=i) p_cond)
  171                                 else
  172                                         if ( line_size == 5 )
  173                                         then head y
  174                                         else x
  175                         )
  176                         | (i,(_:_:x:y)) <- init_vals, i <= p_total
  177                 ]
  178         bry_xys =
  179                 [(i,(x,y)) | (i,((_,x):(_,y):_)) <- bry_vals]
  180         -- velocity nodes which are fixed in the x direction
  181         x_fixed =
  182                 s_def_array (1,n_total) False
  183                 [     i=:True | (i,((1,_):_)) <- bry_vals]
  184         -- velocity nodes which are fixed in the y direction
  185         y_fixed =
  186                 s_def_array (1,n_total) False
  187                 [ i=:True | (i,(_:(1,_):_)) <- bry_vals]
  188         -- all boundary nodes
  189         all_bry =
  190                 s_def_array (1,n_total) False
  191                 [ i=:True | (i,_) <- bry_vals ]
  192         -- fixed pressure nodes
  193         p_fixed = map fst p_cond
  194         p_cond =
  195                 if ( line_size == 5 )
  196                 then [(i,p) | (i,(_:_:_:(1,p):_)) <- bry_vals]
  197                 else [(i,p) | (i,(_:_:(1,p):_)) <- bry_vals]