Plan 9 from Bell Labs’s /usr/web/sources/contrib/fernan/nhc98/tests/nofib/real/fluid/TG_iter.hs
{- Taylor-Galerkin/Pressure-correction algorithm. Solving four increamental matrix equations iteratively: const1*M(U'-U) = rh1(U,P) const2*M(U''-U) = rh1(U',P) const3*K(P'-P) = rh2(U') const4*M(U'''-U'') = rh3(P'-P) The 3rd equation is solved by using the Choleski decomposition menthod and the rest are solved by using the Jacobi iteration method. XZ, 24/10/91 -} {- Modified to adopt S_arrays. Evaluations are forced by using normalize_obj. (This is currently necessary for running the whole program on a 200 element problem). XZ, 19/2/92 -} {- Iteration along time-step implemented XZ, 25/2/92 -} module TG_iter ( tg_iter ) where import Defs import S_Array -- not needed w/ proper module handling import Norm -- ditto import Asb_routs import Rhs_Asb_routs import Jcb_method import Chl_method import Tol_cal ----------------------------------------------------------- -- Iterative TG algorithm. -- -- Functions called : -- -- for equation solving: "chl_method" and "jcb_method" -- -- for RHS assembling : "get_rh1", "get_rh2" and -- -- "get_rh3" -- ----------------------------------------------------------- tg_iter :: Bool -> Int -> Float -> Int -> Float -> Float -> Float -> (S_array (Float, ((Float, Float, Float), (Float, Float, Float)))) -> (S_array [(Int, Int)]) -> (S_array [(Int, Int)]) -> (S_array [Int]) -> (S_array [Int]) -> (S_array Bool, (S_array Bool, S_array Bool)) -> [Int] -> (S_array (S_array Float, S_array (Int, [Float])), S_array Int) -> (S_array Float, (S_array Float, S_array Float)) -> String tg_iter mon m_iter m_toler max_jcb_iter jcb_toler relax dlt_t el_det_fac v_asb_table p_asb_table v_steer p_steer bry_nodes p_fixed chl_fac (p,u) = do_tg_iter m_iter (pack_obj p,pack_obj u) [] where do_tg_iter n (old_p,old_u) res = if (n<=1) || (max_tol<m_toler) then new_res ++ show_final else if max_tol>large then error "main iteration: overflow!" else do_tg_iter (n-1) (new_p,new_u) new_res where new_res = res ++ "at time step " ++ (shows (m_iter-n+1) ":\n\n") ++ (if mon then "initial presure:\n" ++ (shows (retrieve_obj old_p) "\n") ++ "inititial velocities:\n" ++ (shows (retrieve_obj old_u) "\n") ++ "rh1a:\n" ++ (shows rh1a "\n") ++ "velocities after the 1st half of step 1:\n" ++ (shows (retrieve_obj u1a) "\n") ++ "rh1b:\n" ++ (shows rh1b "\n") ++ "velocities after the 2nd half of step 1:\n" ++ (shows (retrieve_obj u1b) "\n") ++ "rh2:\n" ++ (shows (retrieve_obj rh2) "\n") ++ "rh3:\n" ++ (shows rh3 "\n") else "") show_final = "presure:\n" ++ (shows (retrieve_obj new_p) "\n") ++ "velocities:\n" ++ (shows (retrieve_obj new_u) "\n") tmp_p | normalize_obj new_p = retrieve_obj new_p (tmp_u_x,tmp_u_y) | normalize_obj new_u = retrieve_obj new_u max_tol = max tol_u tol_p tol_u = tol_cal ((s_elems tmp_u_x)++(s_elems tmp_u_y)) ((subs tmp_u_x old_u_x) ++ (subs tmp_u_y old_u_y)) False where (old_u_x,old_u_y) | normalize_obj old_u = retrieve_obj old_u tol_p | normalize_obj old_p = tol_cal (s_elems tmp_p) (subs tmp_p (retrieve_obj old_p)) False -- step 1a rh1a | normalize_obj old_p && normalize_obj old_u = get_rh1 el_det_fac v_asb_table v_steer p_steer (retrieve_obj old_p,retrieve_obj old_u) del_u1a = jcb_method 1 el_det_fac v_asb_table v_steer bry_nodes rh1a (2/dlt_t) max_jcb_iter jcb_toler relax u1a = pack_obj (add_u (retrieve_obj old_u) del_u1a) -- step 1b rh1b | normalize_obj u1a = get_rh1 el_det_fac v_asb_table v_steer p_steer (retrieve_obj old_p,retrieve_obj u1a) del_u1b = jcb_method 1 el_det_fac v_asb_table v_steer bry_nodes rh1b (1/dlt_t) max_jcb_iter jcb_toler relax u1b = pack_obj (add_u (retrieve_obj old_u) del_u1b) -- step 2 rh2 | normalize_obj u1b = pack_obj (get_rh2 el_det_fac p_asb_table v_steer p_fixed (retrieve_obj u1b)) del_p | normalize_obj rh2 = pack_obj (chl_method chl_fac (retrieve_obj rh2) (2/dlt_t)) new_p = pack_obj (add_mat (retrieve_obj old_p) (retrieve_obj del_p)) -- step 3 rh3 | normalize_obj del_p = get_rh3 el_det_fac v_asb_table p_steer (retrieve_obj del_p) del_u3 = jcb_method 3 el_det_fac v_asb_table v_steer bry_nodes rh3 (2/dlt_t) max_jcb_iter jcb_toler relax new_u = pack_obj (add_u (retrieve_obj u1b) del_u3) subs = \x' x -> zipWith (-) (s_elems x') (s_elems x)