MFIX  2016-1
solve_continuity.f
Go to the documentation of this file.
1 ! -*- f90 -*-
2 MODULE cont
3 
4 ! Indicates whether the continuity equation needs to be
5 ! solved
6 
7  LOGICAL, DIMENSION(:), ALLOCATABLE :: do_cont
8 
9 CONTAINS
10 
11 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
12 ! C
13 ! Subroutine: SOLVE_CONTINUITY C
14 ! Purpose: Solve for solids bulk density (i.e., material density C
15 ! multiplied by volume fraction). C
16 ! C
17 ! Author: M. Syamlal Date: 2-JUL-96 C
18 ! C
19 ! C
20 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
21  SUBROUTINE solve_continuity(M,IER)
22 
23 ! Modules
24 !---------------------------------------------------------------------//
25  use ambm, only: a_m, b_m, lock_ambm, unlock_ambm
26  use fldvar, only: rop_g, rop_s
27  use geometry, only: ijkmax2
29  use param, only: dimension_3, dimension_m
30  use param1, only: undefined_i, zero, one
31  use ps, only: point_source
32  use residual, only: resid, max_resid, ijk_resid
33  use residual, only: num_resid, den_resid
34  use residual, only: resid_ro
36  use usr_src, only: gas_continuity, solids_continuity
37  IMPLICIT NONE
38 
39 ! Dummy arguments
40 !---------------------------------------------------------------------//
41 ! phase index
42  INTEGER, INTENT(IN) :: M
43 ! error index
44  INTEGER, INTENT(INOUT) :: IER
45 
46 ! Local variables
47 !---------------------------------------------------------------------//
48 ! solids volume fraction residual
49  DOUBLE PRECISION :: RESs
50 ! linear equation solver method and iterations
51  INTEGER :: LEQM, LEQI
52 
53 ! temporary use of global arrays:
54 ! Septadiagonal matrix A_m, vector B_m
55 ! DOUBLE PRECISION A_m(DIMENSION_3, -3:3, 0:DIMENSION_M)
56 ! DOUBLE PRECISION B_m(DIMENSION_3, 0:DIMENSION_M)
57 !---------------------------------------------------------------------//
58 
59  call lock_ambm
60 
61  IF (m==0) THEN
62 ! solve gas phase continuity equation. note that this branch will never
63 ! be entered given that the calling subroutine (iterate) only calls
64 ! solve_continuity when M>1
65 
66 ! initializing
67  CALL init_ab_m (a_m, b_m, ijkmax2, 0)
68 
69 ! forming the matrix equation
70  CALL conv_rop_g (a_m, b_m)
71  CALL source_rop_g (a_m, b_m)
72  IF(call_usr_source(2)) CALL calc_usr_source (gas_continuity,&
73  a_m, b_m, lm=0)
74 
75 ! calculating the residual
76  CALL calc_resid_c (rop_g, a_m, b_m, 0, num_resid(resid_ro,0), &
77  den_resid(resid_ro,0), resid(resid_ro,0), max_resid(&
78  resid_ro,0), ijk_resid(resid_ro,0))
79 
80 ! call check_ab_m(a_m, b_m, 0, .true., ier)
81 ! call write_ab_m(a_m, b_m, ijkmax2, 0, ier)
82 ! write(*,*) resid(resid_ro, 0), max_resid(resid_ro, 0), &
83 ! ijk_resid(resid_ro, 0)
84 ! call test_lin_eq(ijkmax2, ijmax2, imax2, a_m(1, -3, 0),&
85 ! 1, DO_K, ier)
86 
87 ! solving gas continuity
88  CALL adjust_leq (resid(resid_ro,0), leq_it(2), leq_method(2),&
89  leqi, leqm)
90  CALL solve_lin_eq ('ROP_g', 2, rop_g, a_m, b_m, 0, leqi, &
91  leqm, leq_sweep(2), leq_tol(2), leq_pc(2), ier)
92  CALL adjust_rop (rop_g)
93 ! call out_array(ROP_g, 'rop_g')
94 
95  ELSE
96 ! solve solids phase M continuity equation.
97 
98 ! initializing
99  CALL init_ab_m (a_m, b_m, ijkmax2, m)
100 
101 ! forming the matrix equation
102  CALL conv_rop_s (a_m, b_m, m)
103  CALL source_rop_s (a_m, b_m, m)
104  IF(point_source) CALL point_source_rop_s (b_m, m)
105  IF(call_usr_source(2)) CALL calc_usr_source (solids_continuity, &
106  a_m, b_m, lm=m)
107 
108  CALL calc_resid_c (rop_s(1,m), a_m, b_m, m, &
109  num_resid(resid_ro,m), den_resid(resid_ro,m), &
110  resid(resid_ro,m), max_resid(resid_ro,m), &
111  ijk_resid(resid_ro,m))
112  ress = resid(resid_ro,m)
113 
114 ! call check_ab_m(a_m, b_m, m, .true., ier)
115 ! write(*,*) 'solve_cont= ', resid(resid_ro, m),&
116 ! max_resid(resid_ro, m), ijk_resid(resid_ro, m), m
117 ! call write_ab_m(a_m, b_m, ijkmax2, m, ier)
118 ! call test_lin_eq(ijkmax2, ijmax2, imax2, a_m(1, -3, M), 1, &
119 ! DO_K, ier)
120 !
121  CALL adjust_leq (resid(resid_ro,m), leq_it(2), leq_method(2),&
122  leqi, leqm)
123  CALL solve_lin_eq ('ROP_s', 2, rop_s(1,m), a_m, b_m, m, leqi,&
124  leqm,leq_sweep(2), leq_tol(2), leq_pc(2), ier)
125  CALL adjust_rop (rop_s(1,m))
126 ! call out_array(rop_s(1,m), 'rop_s')
127 
128  ENDIF
129 
130  call unlock_ambm
131  RETURN
132 
133  CONTAINS
134 
135 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
136 ! C
137 ! Subroutine: ADJUST_ROP C
138 ! Purpose: Remove small negative values of density. C
139 ! C
140 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
141  SUBROUTINE adjust_rop(ROP)
143 ! Modules
144 !---------------------------------------------------------------------//
145  use compar, only: ijkstart3, ijkend3
146  USE functions, only: fluid_at
147  USE param1, only: zero
148  IMPLICIT NONE
149 
150 ! Dummy arguments
151 !---------------------------------------------------------------------//
152 ! density
153  DOUBLE PRECISION, INTENT(INOUT) :: ROP(dimension_3)
154 
155 ! Local variables
156 !---------------------------------------------------------------------//
157 ! Indices
158  INTEGER :: IJK
159 !---------------------------------------------------------------------//
160 
161  DO ijk = ijkstart3, ijkend3
162  IF (fluid_at(ijk)) rop(ijk) = dmax1(zero,rop(ijk))
163  ENDDO
164 
165  RETURN
166  END SUBROUTINE adjust_rop
167 
168  END SUBROUTINE solve_continuity
169 
170  END MODULE cont
double precision, dimension(:,:,:), allocatable a_m
Definition: ambm_mod.f:27
subroutine conv_rop_s(A_M, B_M, M)
Definition: conv_rop_s.f:18
integer, parameter resid_ro
Definition: residual_mod.f:11
integer ijkend3
Definition: compar_mod.f:80
subroutine conv_rop_g(A_M, B_M)
Definition: conv_rop_g.f:18
subroutine calc_usr_source(lEQ_NO, A_M, B_M, lB_MMAX, lM, lN)
Definition: usr_src_mod.f:32
double precision, parameter one
Definition: param1_mod.f:29
integer dimension_3
Definition: param_mod.f:11
integer ijkmax2
Definition: geometry_mod.f:80
subroutine init_ab_m(A_M, B_M, IJKMAX2A, M)
Definition: init_ab_m.f:21
double precision, dimension(:,:), allocatable den_resid
Definition: residual_mod.f:52
double precision, dimension(:,:), allocatable num_resid
Definition: residual_mod.f:49
Definition: ambm_mod.f:16
character(len=4), dimension(dim_eqs) leq_sweep
Definition: leqsol_mod.f:20
logical, dimension(:), allocatable do_cont
subroutine source_rop_s(A_M, B_M, M)
Definition: source_rop_s.f:21
double precision, dimension(:,:), allocatable max_resid
Definition: residual_mod.f:40
subroutine point_source_rop_s(B_M, M)
Definition: source_rop_s.f:131
subroutine source_rop_g(A_M, B_M)
Definition: source_rop_g.f:21
integer, dimension(dim_eqs) leq_it
Definition: leqsol_mod.f:11
subroutine lock_ambm
Definition: ambm_mod.f:38
subroutine adjust_leq(RESID, LEQ_ITL, LEQ_METHODL, LEQI, LEQM)
Definition: adjust_leq.f:21
double precision, dimension(dim_eqs) leq_tol
Definition: leqsol_mod.f:23
Definition: param_mod.f:2
subroutine adjust_rop(ROP)
integer, dimension(:,:), allocatable ijk_resid
Definition: residual_mod.f:46
subroutine calc_resid_c(VAR, A_M, B_M, M, NUM, DEN, RESID, MAX_RESID, IJK_RESID)
Definition: calc_resid.f:18
integer ijkstart3
Definition: compar_mod.f:80
integer, parameter undefined_i
Definition: param1_mod.f:19
Definition: ps_mod.f:22
integer, dimension(dim_eqs) leq_method
Definition: leqsol_mod.f:14
double precision, dimension(:,:), allocatable rop_s
Definition: fldvar_mod.f:51
logical, dimension(dim_eqs) call_usr_source
Definition: usr_src_mod.f:7
double precision, dimension(:,:), allocatable resid
Definition: residual_mod.f:37
subroutine solve_continuity(M, IER)
double precision, dimension(:,:), allocatable b_m
Definition: ambm_mod.f:28
logical point_source
Definition: ps_mod.f:27
integer dimension_m
Definition: param_mod.f:18
double precision, dimension(:), allocatable rop_g
Definition: fldvar_mod.f:38
double precision, parameter zero
Definition: param1_mod.f:27
subroutine unlock_ambm
Definition: ambm_mod.f:52
subroutine solve_lin_eq(VNAME, Vno, VAR, A_M, B_M, M, ITMAX, METHOD, SWEEP, TOL1, PC, IER)
Definition: solve_lin_eq.f:19
character(len=4), dimension(dim_eqs) leq_pc
Definition: leqsol_mod.f:26