MFIX  2016-1
leq_sor.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Subroutine: LEQ_SOR C
4 ! Purpose: Solve system of linear system using SOR method C
5 ! Successive over-relaxation C
6 ! C
7 ! Author: M. Syamlal Date: 19-AUG-96 C
8 ! Reviewer: Date: C
9 ! C
10 ! Literature/Document References: C
11 ! Variables referenced: C
12 ! Variables modified: C
13 ! Local variables: C
14 ! C
15 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
16 
17  SUBROUTINE leq_sor(VNAME, VNO, VAR, A_M, B_M, ITMAX, IER)
18 
19 !-----------------------------------------------
20 ! Modules
21 !-----------------------------------------------
22  USE param
23  USE param1
24  USE geometry
25  USE indices
26  USE compar
27  USE sendrecv
28  USE leqsol
29  USE functions
30  IMPLICIT NONE
31 !-----------------------------------------------
32 ! Dummy arguments
33 !-----------------------------------------------
34 ! variable name
35  CHARACTER(LEN=*), INTENT(IN) :: Vname
36 ! variable number (not really used here; see calling subroutine)
37  INTEGER, INTENT(IN) :: VNO
38 ! variable
39 ! e.g., pp_g, epp, rop_g, rop_s, u_g, u_s, v_g, v_s, w_g,
40 ! w_s, T_g, T_s, x_g, x_s, Theta_m, scalar, K_Turb_G,
41 ! e_Turb_G
42  DOUBLE PRECISION, INTENT(INOUT) :: Var(dimension_3)
43 ! Septadiagonal matrix A_m
44  DOUBLE PRECISION, INTENT(INOUT) :: &
45  A_m(dimension_3, -3:3)
46 ! Vector b_m
47  DOUBLE PRECISION, INTENT(INOUT) :: &
48  B_m(dimension_3)
49 ! maximum number of iterations (generally leq_it)
50  INTEGER, INTENT(IN) :: ITMAX
51 ! error indicator
52  INTEGER, INTENT(INOUT) :: IER
53 !-----------------------------------------------
54 ! Local parameters
55 !-----------------------------------------------
56 ! OVERRELAXATION FACTOR
57  DOUBLE PRECISION, PARAMETER :: OMEGA = 1.0 !1.2
58  integer :: iidebug
59  parameter( iidebug = 0 )
60 !-----------------------------------------------
61 ! Local Variables
62 !-----------------------------------------------
63 ! Variable
64  DOUBLE PRECISION :: Var_tmp(dimension_3)
65 ! Indices
66  INTEGER :: IJK
67  INTEGER :: ITER
68 
69  DOUBLE PRECISION oAm
70 !-----------------------------------------------
71 
72 !!$omp parallel do private(IJK,OAM)
73  DO ijk = ijkstart3, ijkend3
74  IF(.NOT.is_on_mype_owns(i_of(ijk),j_of(ijk), k_of(ijk))) cycle
75 
76  oam = one/a_m(ijk,0)
77  a_m(ijk,0) = one
78  a_m(ijk,-2) = a_m(ijk,-2)*oam
79  a_m(ijk,-1) = a_m(ijk,-1)*oam
80  a_m(ijk,1) = a_m(ijk,1)*oam
81  a_m(ijk,2) = a_m(ijk,2)*oam
82  a_m(ijk,-3) = a_m(ijk,-3)*oam
83  a_m(ijk,3) = a_m(ijk,3)*oam
84  b_m(ijk) = b_m(ijk)*oam
85  ENDDO
86 
87  DO iter = 1, itmax
88  IF (do_k) THEN
89 
90 !!$omp parallel do private(IJK)
91  DO ijk = ijkstart3, ijkend3
92  IF(.NOT.is_on_mype_owns(i_of(ijk),j_of(ijk), k_of(ijk))) cycle
93  var_tmp(ijk) = var(ijk) + omega*(b_m(ijk)-&
94  a_m(ijk,-1)*var(im_of(ijk))-a_m(ijk,1)*var(ip_of(ijk))-&
95  a_m(ijk,-2)*var(jm_of(ijk))-a_m(ijk,2)*var(jp_of(ijk))-&
96  a_m(ijk,-3)*var(km_of(ijk))-a_m(ijk,3)*var(kp_of(ijk))-&
97  var(ijk))
98  ENDDO
99  ELSE
100 
101 !!$omp parallel do private(IJK)
102  DO ijk = ijkstart3, ijkend3
103  IF(.NOT.is_on_mype_owns(i_of(ijk),j_of(ijk), k_of(ijk))) cycle
104  var_tmp(ijk) = var(ijk) + omega*(b_m(ijk)-&
105  a_m(ijk,-2)*var(jm_of(ijk))-a_m(ijk,2)*var(jp_of(ijk))-&
106  a_m(ijk,-1)*var(im_of(ijk))-a_m(ijk,1)*var(ip_of(ijk))-&
107  var(ijk))
108  ENDDO
109  ENDIF
110 
111  call send_recv(var,2)
112  ENDDO
113 
114 !!$omp parallel do private(IJK)
115  DO ijk = ijkstart3, ijkend3
116  var(ijk) = var_tmp(ijk)
117  ENDDO
118 
119  iter_tot(vno) = iter
120 
121 
122  RETURN
123  END SUBROUTINE leq_sor
integer, dimension(:), allocatable i_of
Definition: indices_mod.f:45
integer ijkend3
Definition: compar_mod.f:80
double precision, parameter one
Definition: param1_mod.f:29
integer dimension_3
Definition: param_mod.f:11
integer, dimension(dim_eqs) iter_tot
Definition: leqsol_mod.f:17
integer, dimension(:), allocatable k_of
Definition: indices_mod.f:47
integer, dimension(:), allocatable j_of
Definition: indices_mod.f:46
Definition: param_mod.f:2
logical do_k
Definition: geometry_mod.f:30
integer ijkstart3
Definition: compar_mod.f:80
subroutine leq_sor(VNAME, VNO, VAR, A_M, B_M, ITMAX, IER)
Definition: leq_sor.f:18