File: RELATIVE:/../../../mfix.git/model/des/diffuse_mean_fields.f
1
2
3
4
5
6
7
8
9
10
11 SUBROUTINE DIFFUSE_MEAN_FIELD(PHI, VNAME)
12
13
14
15
16 use geometry, only: IJKMAX2
17
18 use ambm, only: A_M, B_M
19
20 use leqsol, only: LEQ_METHOD, LEQ_IT
21
22 use leqsol, only: LEQ_PC, LEQ_SWEEP, LEQ_TOL
23
24 use tmp_array, only: DIF => ARRAY1
25
26 use param, only: DIMENSION_3
27
28
29
30
31 use tmp_array, only: LOCK_TMP_ARRAY
32 use tmp_array, only: UNLOCK_TMP_ARRAY
33
34 use error_manager
35 use machine, only: wall_time
36
37 IMPLICIT NONE
38
39
40
41
42 DOUBLE PRECISION, INTENT(INOUT) :: PHI(DIMENSION_3)
43
44 CHARACTER(LEN=*), INTENT(IN) :: VNAME
45
46
47
48
49 INTEGER :: IER
50
51 INTEGER :: LEQM, LEQI
52
53 DOUBLE PRECISION :: DIF_TIME, DIF_STOP, DIF_DT
54
55 DOUBLE PRECISION :: WALL_START
56
57 LOGICAL, PARAMETER :: setDBG = .TRUE.
58
59
60 IF(setDBG) THEN
61 WRITE(ERR_MSG, "(/3x,'Diffusing Variable: ',A)") VNAME
62 CALL FLUSH_ERR_MSG(HEADER=.FALSE., FOOTER=.FALSE.)
63 WALL_START = WALL_TIME()
64 ENDIF
65
66
67 CALL LOCK_TMP_ARRAY
68
69
70 CALL CALC_DIF_DES(DIF, setDBG, IER)
71
72
73 DIF_STOP = 1.0d0
74 DIF_TIME = 0.0d0
75 DIF_DT = DIF_STOP/5.0
76
77
78 DO WHILE(DIF_TIME < DIF_STOP)
79
80 CALL INIT_AB_M (A_M, B_M, IJKMAX2, 0)
81
82 CALL DIF_PHI_DES(0, DIF, A_M, B_M)
83
84 CALL DIF_PHI_BC_DES(PHI, 0, A_M, B_M)
85
86 CALL DIF_PHI_SOURCE_DES(PHI, 0, A_M, B_M, DIF_DT)
87
88 CALL ADJUST_LEQ(0.0d0, LEQ_IT(10), LEQ_METHOD(10), LEQI, LEQM)
89
90 CALL SOLVE_LIN_EQ (VNAME, 10, PHI, A_M, B_M, 0, LEQI, LEQM, &
91 LEQ_SWEEP(10), LEQ_TOL(10), LEQ_PC(10), IER)
92
93 = DIF_TIME + DIF_DT
94 ENDDO
95
96
97 IF(setDBG) THEN
98 WRITE(ERR_MSG, 9001) WALL_TIME() - WALL_START
99 CALL FLUSH_ERR_MSG(HEADER=.FALSE., FOOTER=.FALSE.)
100 ENDIF
101
102 9001 FORMAT(5x,'Wall Time: ',g11.4)
103
104
105 CALL UNLOCK_TMP_ARRAY
106
107
108 RETURN
109 END SUBROUTINE DIFFUSE_MEAN_FIELD
110
111
112
113
114
115
116
117
118
119
120
121 SUBROUTINE CALC_DIF_DES(DIF, lDBG, IER)
122
123 use param
124 use param1
125
126 use compar, only: IJKStart3, IJKEnd3
127 use particle_filter, only: DES_DIFFUSE_WIDTH
128 use functions, only: FLUID_AT
129
130 use error_manager
131
132 IMPLICIT NONE
133
134 DOUBLE PRECISION, INTENT(INOUT) :: DIF(DIMENSION_3)
135 LOGICAL, INTENT(IN) :: lDBG
136 INTEGER, INTENT(INOUT) :: IER
137
138
139 INTEGER :: IJK
140
141 DOUBLE PRECISION :: lDIF
142
143 IER = 0
144
145
146
147
148 = ((0.5*DES_DIFFUSE_WIDTH)**2) / &
149 (2.0*sqrt(2.0*log(2.0)))
150
151
152 DO IJK = IJKStart3, IJKEnd3
153 DIF(IJK) = ZERO
154 IF(FLUID_AT(IJK)) DIF(IJK) = lDIF
155 ENDDO
156
157
158 IF(lDBG) THEN
159 WRITE(ERR_MSG, 9100) iVal(lDIF)
160 CALL FLUSH_ERR_MSG(HEADER=.FALSE., FOOTER=.FALSE.)
161 ENDIF
162
163 9100 FORMAT(/3x,'Diffusion Coefficient: ',A)
164
165 RETURN
166 END SUBROUTINE CALC_DIF_DES
167