{- Functions for data input. Some data have been put into arrays. XZ, 24/10/91 -} {- Modified to adopt S_Arrays. XA, 19/2/92 -} module Input_proc ( read_fs_cs, read_data ) where import Defs import S_Array -- not needed w/ proper module handling import Norm -- ditto (=:) a b = (a,b) ----------------------------------------------------------- -- reading a Int -- ----------------------------------------------------------- rd_int = \ i -> (head (reads i)) :: (Int,String) ----------------------------------------------------------- -- reading a Floating -- ----------------------------------------------------------- rd_flt = \ f -> (head (reads f)) :: (Frac_type,String) ----------------------------------------------------------- -- Reading a pair of values ( could be structed and -- -- different values ); results are packed into a tuple. -- ----------------------------------------------------------- rd_pair rf1 rf2 i = ((v1,v2),rest) where (v1,rest1) = (rf1 i) (v2,rest) = (rf2 rest1) ----------------------------------------------------------- -- Reading a number of values ( could be structed ). -- -- Results are packed into a list. -- ----------------------------------------------------------- read_n_val rd_f n in_str = (takeval n in_str, dropval n in_str ) where takeval n i | n == 0 = [] | otherwise = x : (takeval (n-1) rest) where (x,rest) = (rd_f i) dropval n i | null i = [] | n == 0 = i | otherwise = dropval (n-1) rest where (x,rest) = (rd_f i) ----------------------------------------------------------- -- reading a number of Int -- ----------------------------------------------------------- read_n_int = read_n_val rd_int ----------------------------------------------------------- -- reading a number of Floating -- ----------------------------------------------------------- read_n_flt = read_n_val rd_flt ----------------------------------------------------------- -- reading a pair of Int and Floating -- ----------------------------------------------------------- read_i_f_pair = rd_pair rd_int rd_flt ----------------------------------------------------------- -- Skip over n lines -- ----------------------------------------------------------- skip_lines 0 cs = cs skip_lines n cs = skip_lines (n-1) (drop 1 (dropWhile ((/=) '\n') cs)) ----------------------------------------------------------- -- Reading the data file of our local form. -- -- Called at the data setup stage. -- ----------------------------------------------------------- read_fs_cs f = (data_file,(mon,m_iter,m_toler,max_jcb_iter,jcb_toler,relax,dlt_t)) where hed1 = skip_lines 1 f (i,hed2) = rd_int hed1 start' = skip_lines (i+2) hed2 mon = (head (head (drop 9 (words start'))))=='t' start = skip_lines (i+14) hed2 tmp1 = read_n_int 2 start ([m_iter,max_jcb_iter],rest1) = tmp1 tmp2 = read_n_flt 3 rest1 ([m_toler,jcb_toler,relax],rest2) = tmp2 rest3 = skip_lines 2 rest2 (dlt_t,rest4) = rd_flt rest3 rest5 = skip_lines 11 rest4 data_file = head (drop 5 (words rest5)) read_data f = (e_total,n_total,p_total,v_steer,p_steer,coord, (init_p,init_u),(all_bry,(x_fixed,y_fixed)),p_fixed) where hed1 = skip_lines 1 f (i,hed2) = rd_int hed1 start = skip_lines (i+4) hed2 tmp1 = read_n_int 6 start ((e_total:n_total:bnd_total:_:_:p_total:_),rest1) = tmp1 rest2 = skip_lines 2 rest1 (v_vals,rest3) = read_n_val (read_n_int (v_nodel+2) ) e_total rest2 rest4 = skip_lines 2 rest3 tmp2 = read_n_val (rd_pair rd_int (read_n_flt 2)) n_total rest4 (c_vals,rest5) = tmp2 rest6 = skip_lines 2 rest5 line_size :: Int line_size = length (words (takeWhile ((/=) '\n') rest6)) - 1 (init_vals,rest7) = read_n_val (rd_pair rd_int (read_n_flt line_size)) n_total rest6 rest8 = skip_lines 2 rest7 (bry_vals,rest9) = read_n_val (rd_pair rd_int (read_n_val (rd_pair rd_int rd_flt) line_size)) bnd_total rest8 -- velocity steering vector v_steer = s_array (1,e_total) (map (\(i:_:rest)->i=:rest) v_vals) -- pressure steering vector p_steer = s_array (1,e_total) (map (\(i:_:rest)->i =: rest) (map (take (p_nodel+2)) v_vals)) -- node coordinates coord = s_array (1,n_total) (map (\(i,(x:y:_))->i =: (x,y)) c_vals) v_init = map (\(i,(x:y:_))->(i,(x,y))) init_vals -- velocity initial conditions init_u = ( s_def_array (1,n_total) (0::Frac_type) [ i =: if x_fixed!^i then (fst.snd.head) (dropWhile (\t->(fst t)/=i) bry_xys) else fst v | (i,v) <- v_init ], s_def_array (1,n_total) (0::Frac_type) [ i =: if y_fixed!^i then (snd.snd.head) (dropWhile (\t->(fst t)/=i) bry_xys) else snd v | (i,v) <- v_init ] ) -- pressure initial conditions init_p = s_def_array (1,p_total) (0::Frac_type) [ i =: ( if i `elem` p_fixed then (snd.head) (dropWhile (\t->(fst t)/=i) p_cond) else if ( line_size == 5 ) then head y else x ) | (i,(_:_:x:y)) <- init_vals, i <= p_total ] bry_xys = [(i,(x,y)) | (i,((_,x):(_,y):_)) <- bry_vals] -- velocity nodes which are fixed in the x direction x_fixed = s_def_array (1,n_total) False [ i=:True | (i,((1,_):_)) <- bry_vals] -- velocity nodes which are fixed in the y direction y_fixed = s_def_array (1,n_total) False [ i=:True | (i,(_:(1,_):_)) <- bry_vals] -- all boundary nodes all_bry = s_def_array (1,n_total) False [ i=:True | (i,_) <- bry_vals ] -- fixed pressure nodes p_fixed = map fst p_cond p_cond = if ( line_size == 5 ) then [(i,p) | (i,(_:_:_:(1,p):_)) <- bry_vals] else [(i,p) | (i,(_:_:(1,p):_)) <- bry_vals]