File: RELATIVE:/../../../mfix.git/model/qmomk/qmomk_time_march.f
1
2
3
4
5
6
7
8
9
10
11 SUBROUTINE QMOMK_TIME_MARCH
12
13 USE param
14 USE param1
15 USE constant
16 USE run
17 USE output
18 USE physprop
19 USE fldvar
20 USE geometry
21 USE cont
22 USE tau_g
23 USE tau_s
24 USE visc_g
25 USE visc_s
26 USE funits
27 USE vshear
28 USE scalars
29 USE drag
30 USE rxns
31 USE compar
32 USE time_cpu
33 USE is
34 USE indices
35 USE matrix
36 USE sendrecv
37 USE qmom_kinetic_equation
38 USE qmomk_fluxes
39 USE qmomk_quadrature
40 USE qmomk_collision
41 USE qmomk_parameters
42 USE drag
43 USE ur_facs
44 USE fun_avg
45 USE functions
46
47 IMPLICIT NONE
48
49 INTEGER :: I,J,K,M,M2,IN
50 INTEGER :: IJK, IPJK, IJPK, IJKP, IMJK, IJMK, IJKM
51 DOUBLE PRECISION :: Vmax, min_space_delta
52 DOUBLE PRECISION :: vrel, Rep, CD, beta_drag, min_tau_drag
53 DOUBLE PRECISION :: UGC, VGC, WGC, mom0, QMOMK_TCOL, drag_exp, QMOMK_OMEGA
54 DOUBLE PRECISION QMOMK_TIME, QMOMK_DT_TMP, TMP_DTS
55 INTEGER :: TIME_FACTOR, TIME_I
56 LOGICAL, SAVE :: FIRST_PASS = .TRUE.
57
58 DOUBLE PRECISION, DIMENSION(QMOMK_NN) :: Nlminus, Nlplus, Nrminus, Nrplus
59 DOUBLE PRECISION, DIMENSION(QMOMK_NN) :: Ulminus, Ulplus, Urminus, Urplus
60 DOUBLE PRECISION, DIMENSION(QMOMK_NN) :: Vlminus, Vlplus, Vrminus, Vrplus
61 DOUBLE PRECISION, DIMENSION(QMOMK_NN) :: Wlminus, Wlplus, Wrminus, Wrplus
62 DOUBLE PRECISION, DIMENSION(QMOMK_NMOM) :: F_x_left, F_x_right, F_y_left
63 DOUBLE PRECISION, DIMENSION(QMOMK_NMOM) :: F_y_right, F_z_left, F_z_right
64
65 IF (FIRST_PASS) THEN
66 FIRST_PASS = .FALSE.
67
68 = 0.D0
69 QMOMK_TAU_DRAG = 1.0D-5
70
71
72 IF (RUN_TYPE == 'NEW') THEN
73 CALL QMOMK_INITIAL_CONDITIONS
74 CALL QMOMK_INIT_BC
75 ELSE
76 CALL QMOMK_INIT_BC
77 ENDIF
78
79 QMOMK_M1 = QMOMK_M0
80 QMOMK_N1 = QMOMK_N0
81 QMOMK_U1 = QMOMK_U0
82 QMOMK_V1 = QMOMK_V0
83 QMOMK_W1 = QMOMK_W0
84 END IF
85
86
87
88 = 0.d0
89 DO M = 1, MMAX
90 DO IJK = ijkstart3, ijkend3
91 DO I = 1, QMOMK_NN
92 IF (Vmax < MAX(ABS(QMOMK_U0(I,IJK,M)), ABS(QMOMK_V0(I,IJK,M)), ABS(QMOMK_W0(I,IJK,M)))) THEN
93 Vmax = MAX(ABS(QMOMK_U0(I,IJK,M)), ABS(QMOMK_V0(I,IJK,M)), ABS(QMOMK_W0(I,IJK,M)))
94 END IF
95 END DO
96 CALL COMPUTE_COLLISION_TIME(QMOMK_M0(:,IJK,M), D_p0(M), THETA_M(IJK,M), QMOMK_COLLISION_TIME(IJK,M), DT)
97 END DO
98 END DO
99
100 min_space_delta = MIN (MINVAL(DX), MINVAL(DY), MINVAL(DZ))
101
102 QMOMK_DT = QMOMK_CFL*min_space_delta/Vmax
103
104
105 = 1.D0
106 QMOMK_TCOL = 1.D10
107 DO IJK = ijkstart3, ijkend3
108 IF (FLUID_AT(IJK)) THEN
109 IF (min_tau_drag > MINVAL(QMOMK_TAU_DRAG(:,IJK,:))) THEN
110 min_tau_drag = MINVAL(QMOMK_TAU_DRAG(:,IJK,:))
111 END IF
112 IF (QMOMK_TCOL > MINVAL(QMOMK_COLLISION_TIME(IJK,:))) THEN
113 QMOMK_TCOL = MINVAL(QMOMK_COLLISION_TIME(IJK,:))
114 END IF
115 END IF
116 END DO
117
118 IF ( QMOMK_COLLISIONS /= 'NONE') THEN
119 QMOMK_DT = MIN(QMOMK_TCOL,QMOMK_DT)
120 END IF
121
122 QMOMK_DT = MIN(QMOMK_DT,min_tau_drag/10.D0)
123
124
125 = TIME
126 IF (DT >= QMOMK_DT) THEN
127 TIME_FACTOR = CEILING(real(DT/QMOMK_DT)) + 1
128 ELSE
129 TIME_FACTOR = 1
130 QMOMK_DT_TMP = QMOMK_DT
131 QMOMK_DT = DT
132 END IF
133
134 DO TIME_I = 1, TIME_FACTOR
135
136
137 IF (QMOMK_TIME .GE. (TIME + DT)) EXIT
138
139 IF ((QMOMK_TIME + QMOMK_DT) .GT. (TIME + DT)) THEN
140 TMP_DTS = QMOMK_DT
141 QMOMK_DT = TIME + DT - QMOMK_TIME
142 END IF
143
144 PRINT *,'Flow time step: ',DT
145 PRINT *,'QMOM DT = ',QMOMK_DT
146 PRINT *,'QMOMK internal time step: ',TIME_I
147 PRINT *,'Time factor', TIME_FACTOR
148
149 QMOMK_OMEGA = (1.D0 + C_e)/2.D0
150
151
152
153
154
155 DO M = 1, MMAX
156 DO IJK = ijkstart3, ijkend3
157 IF (FLUID_AT(IJK)) THEN
158 I = I_OF(IJK)
159 J = J_OF(IJK)
160 K = K_OF(IJK)
161
162 IMJK = IM_OF(IJK)
163 IJMK = JM_OF(IJK)
164 IJKM = KM_OF(IJK)
165
166 IPJK = IP_OF(IJK)
167 IJPK = JP_OF(IJK)
168 IJKP = KP_OF(IJK)
169
170
171 IF (NO_K) THEN
172
173 = QMOMK_N0(:,IMJK,M)
174 Ulminus = QMOMK_U0(:,IMJK,M)
175 Vlminus = QMOMK_V0(:,IMJK,M)
176 Wlminus = QMOMK_W0(:,IMJK,M)
177
178 Nlplus = QMOMK_N0(:,IJK,M)
179 Ulplus = QMOMK_U0(:,IJK,M)
180 Vlplus = QMOMK_V0(:,IJK,M)
181 Wlplus = QMOMK_W0(:,IJK,M)
182
183 Nrminus = QMOMK_N0(:,IJK,M)
184 Urminus = QMOMK_U0(:,IJK,M)
185 Vrminus = QMOMK_V0(:,IJK,M)
186 Wrminus = QMOMK_W0(:,IJK,M)
187
188 Nrplus = QMOMK_N0(:,IPJK,M)
189 Urplus = QMOMK_U0(:,IPJK,M)
190 Vrplus = QMOMK_V0(:,IPJK,M)
191 Wrplus = QMOMK_W0(:,IPJK,M)
192
193 CALL KINETIC_FLUX_X_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
194 Nlplus, Ulplus, Vlplus, Wlplus, F_x_left)
195 CALL KINETIC_FLUX_X_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
196 Nrplus, Urplus, Vrplus, Wrplus, F_x_right)
197
198
199 = QMOMK_N0(:,IJMK,M)
200 Ulminus = QMOMK_U0(:,IJMK,M)
201 Vlminus = QMOMK_V0(:,IJMK,M)
202 Wlminus = QMOMK_W0(:,IJMK,M)
203
204 Nlplus = QMOMK_N0(:,IJK,M)
205 Ulplus = QMOMK_U0(:,IJK,M)
206 Vlplus = QMOMK_V0(:,IJK,M)
207 Wlplus = QMOMK_W0(:,IJK,M)
208
209 Nrminus = QMOMK_N0(:,IJK,M)
210 Urminus = QMOMK_U0(:,IJK,M)
211 Vrminus = QMOMK_V0(:,IJK,M)
212 Wrminus = QMOMK_W0(:,IJK,M)
213
214 Nrplus = QMOMK_N0(:,IJPK,M)
215 Urplus = QMOMK_U0(:,IJPK,M)
216 Vrplus = QMOMK_V0(:,IJPK,M)
217 Wrplus = QMOMK_W0(:,IJPK,M)
218
219 CALL KINETIC_FLUX_Y_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
220 Nlplus, Ulplus, Vlplus, Wlplus, F_y_left)
221 CALL KINETIC_FLUX_Y_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
222 Nrplus, Urplus, Vrplus, Wrplus, F_y_right)
223
224 QMOMK_M1(:,IJK,M) = QMOMK_M0(:,IJK,M) &
225 - 0.5*(QMOMK_DT/MINVAL(DX))*(F_x_right - F_x_left) - 0.5*(QMOMK_DT/MINVAL(DY))*(F_y_right - F_y_left)
226
227
228 ELSE
229
230 = QMOMK_N0(:,IMJK,M)
231 Ulminus = QMOMK_U0(:,IMJK,M)
232 Vlminus = QMOMK_V0(:,IMJK,M)
233 Wlminus = QMOMK_W0(:,IMJK,M)
234
235 Nlplus = QMOMK_N0(:,IJK,M)
236 Ulplus = QMOMK_U0(:,IJK,M)
237 Vlplus = QMOMK_V0(:,IJK,M)
238 Wlplus = QMOMK_W0(:,IJK,M)
239
240 Nrminus = QMOMK_N0(:,IJK,M)
241 Urminus = QMOMK_U0(:,IJK,M)
242 Vrminus = QMOMK_V0(:,IJK,M)
243 Wrminus = QMOMK_W0(:,IJK,M)
244
245 Nrplus = QMOMK_N0(:,IPJK,M)
246 Urplus = QMOMK_U0(:,IPJK,M)
247 Vrplus = QMOMK_V0(:,IPJK,M)
248 Wrplus = QMOMK_W0(:,IPJK,M)
249
250 CALL KINETIC_FLUX_X_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
251 Nlplus, Ulplus, Vlplus, Wlplus, F_x_left)
252 CALL KINETIC_FLUX_X_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
253 Nrplus, Urplus, Vrplus, Wrplus, F_x_right)
254
255
256 = QMOMK_N0(:,IJMK,M)
257 Ulminus = QMOMK_U0(:,IJMK,M)
258 Vlminus = QMOMK_V0(:,IJMK,M)
259 Wlminus = QMOMK_W0(:,IJMK,M)
260
261 Nlplus = QMOMK_N0(:,IJK,M)
262 Ulplus = QMOMK_U0(:,IJK,M)
263 Vlplus = QMOMK_V0(:,IJK,M)
264 Wlplus = QMOMK_W0(:,IJK,M)
265
266 Nrminus = QMOMK_N0(:,IJK,M)
267 Urminus = QMOMK_U0(:,IJK,M)
268 Vrminus = QMOMK_V0(:,IJK,M)
269 Wrminus = QMOMK_W0(:,IJK,M)
270
271 Nrplus = QMOMK_N0(:,IJPK,M)
272 Urplus = QMOMK_U0(:,IJPK,M)
273 Vrplus = QMOMK_V0(:,IJPK,M)
274 Wrplus = QMOMK_W0(:,IJPK,M)
275
276 CALL KINETIC_FLUX_Y_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
277 Nlplus, Ulplus, Vlplus, Wlplus, F_y_left)
278 CALL KINETIC_FLUX_Y_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
279 Nrplus, Urplus, Vrplus, Wrplus, F_y_right)
280
281
282 = QMOMK_N0(:,IJKM,M)
283 Ulminus = QMOMK_U0(:,IJKM,M)
284 Vlminus = QMOMK_V0(:,IJKM,M)
285 Wlminus = QMOMK_W0(:,IJKM,M)
286
287 Nlplus = QMOMK_N0(:,IJK,M)
288 Ulplus = QMOMK_U0(:,IJK,M)
289 Vlplus = QMOMK_V0(:,IJK,M)
290 Wlplus = QMOMK_W0(:,IJK,M)
291
292 Nrminus = QMOMK_N0(:,IJK,M)
293 Urminus = QMOMK_U0(:,IJK,M)
294 Vrminus = QMOMK_V0(:,IJK,M)
295 Wrminus = QMOMK_W0(:,IJK,M)
296
297 Nrplus = QMOMK_N0(:,IJKP,M)
298 Urplus = QMOMK_U0(:,IJKP,M)
299 Vrplus = QMOMK_V0(:,IJKP,M)
300 Wrplus = QMOMK_W0(:,IJKP,M)
301
302 CALL KINETIC_FLUX_Z_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
303 Nlplus, Ulplus, Vlplus, Wlplus, F_z_left)
304 CALL KINETIC_FLUX_Z_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
305 Nrplus, Urplus, Vrplus, Wrplus, F_z_right)
306
307 QMOMK_M1(:,IJK,M) = QMOMK_M0(:,IJK,M) - 0.5*(QMOMK_DT/MINVAL(DX))*(F_x_right - F_x_left) - &
308 0.5*(QMOMK_DT/MINVAL(DY))*(F_y_right - F_y_left) - 0.5*(QMOMK_DT/MINVAL(DZ))*(F_z_right - F_z_left)
309 END IF
310 END IF
311 END DO
312 END DO
313
314
315
316 DO M = 1, MMAX
317 DO IJK = ijkstart3, ijkend3
318 IF (FLUID_AT(IJK)) THEN
319 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), &
320 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
321 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
322 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
323 END IF
324 END DO
325 END DO
326
327
328
329 DO M = 1, MMAX
330 DO IJK = ijkstart3, ijkend3
331 IF (FLUID_AT(IJK)) THEN
332 I = I_OF(IJK)
333 J = J_OF(IJK)
334 K = K_OF(IJK)
335 IMJK = IM_OF(IJK)
336 IJMK = JM_OF(IJK)
337 IJKM = KM_OF(IJK)
338
339 UGC = AVG_X_E(U_G(IMJK),U_G(IJK),I)
340 VGC = AVG_Y_N(V_G(IJMK),V_G(IJK))
341 WGC = AVG_Z_T(W_G(IJKM),W_G(IJK))
342
343 DO IN = 1, QMOMK_NN
344 vrel = SQRT(((QMOMK_U1(IN,IJK,M) - UGC)**2) + ((QMOMK_V1(IN,IJK,M) - VGC)**2) + ((QMOMK_W1(IN,IJK,M) - WGC)**2))
345
346
347 = RO_g0*D_p0(M)*vrel/MU_g0
348 Cd = 24.D0*(EP_G(IJK)**(-2.65))*(1.D0 + 0.15D0*((EP_G(IJK)*Rep)**0.687))/(Rep + SMALL_NUMBER)
349 beta_drag = 3.D0*RO_g0*Cd*vrel/(4.D0*D_p0(M)*RO_s(IJK,M))
350
351 drag_exp = EXP(-0.5*QMOMK_DT*beta_drag)
352
353 IF (beta_drag > SMALL_NUMBER) THEN
354 (IN,IJK,M) = 1.D0/beta_drag
355 ELSE
356 QMOMK_TAU_DRAG(IN,IJK,M) = LARGE_NUMBER
357 END IF
358
359
360 (IN,IJK,M) = drag_exp*QMOMK_U1 (IN,IJK,M) + (1.D0 - drag_exp)*UGC
361 QMOMK_V1 (IN,IJK,M) = drag_exp*QMOMK_V1 (IN,IJK,M) + (1.D0 - drag_exp)*(VGC - GRAVITY*QMOMK_TAU_DRAG(IN,IJK,M))
362 QMOMK_W1 (IN,IJK,M) = drag_exp*QMOMK_W1 (IN,IJK,M) + (1.D0 - drag_exp)*WGC
363 END DO
364 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
365 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
366 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), &
367 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
368 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
369 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
370 END IF
371 END DO
372 END DO
373
374 DO M = 1, MMAX
375 DO IJK = ijkstart3, ijkend3
376 IF (FLUID_AT(IJK)) THEN
377 CALL BIND_THETA(QMOMK_M1(:,IJK,M), MINVAL(QMOMK_TAU_DRAG(:,IJK,M)))
378 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), &
379 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
380 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
381 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
382 END IF
383 END DO
384 END DO
385
386
387
388 PRINT *,'Before collisions'
389
390
391 IF (QMOMK_COLLISIONS == 'BGK' .AND. MMAX == 1) THEN
392 DO M = 1, MMAX
393 DO IJK = ijkstart3, ijkend3
394 IF (FLUID_AT(IJK)) THEN
395 mom0 = QMOMK_M1(1,IJK,M)
396 IF (mom0 > epsn) THEN
397 CALL COLLISIONS_BGK(QMOMK_M1(:,IJK,M), 0.5*QMOMK_DT, QMOMK_TCOL, D_p0 (M), C_e)
398 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), &
399 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
400 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
401 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
402 END IF
403 END IF
404 END DO
405 END DO
406 ELSE IF (QMOMK_COLLISIONS == 'BOLTZMANN' .AND. MMAX == 1) THEN
407 DO IJK = ijkstart3, ijkend3
408 IF (FLUID_AT(IJK)) THEN
409 CALL SOLVE_BOLTZMANN_COLLISIONS_ONE_SPECIE(QMOMK_M1(:,IJK,1), QMOMK_N1(:,IJK,1), &
410 QMOMK_U1(:,IJK,1), QMOMK_V1(:,IJK,1), QMOMK_W1(:,IJK,1), &
411 0.5*QMOMK_DT, C_e, D_p0 (1), QMOMK_COLLISIONS_ORDER)
412 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,1), QMOMK_N1(:,IJK,1), QMOMK_U1(:,IJK,1), QMOMK_V1(:,IJK,1), QMOMK_W1(:,IJK,1))
413 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,1), &
414 QMOMK_U1(:,IJK,1), QMOMK_V1(:,IJK,1), QMOMK_W1(:,IJK,1), QMOMK_M1(:,IJK,1))
415 END IF
416 END DO
417 ELSE
418 DO M = 1, MMAX
419 DO IJK = ijkstart3, ijkend3
420 IF (FLUID_AT(IJK)) THEN
421 DO M2 = 1, MMAX
422 CALL SOLVE_BOLTZMANN_COLLISIONS_TWO_SPECIES(QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), &
423 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), &
424 QMOMK_M1(:,IJK,M2), QMOMK_N1(:,IJK,M2), QMOMK_U1(:,IJK,M2), QMOMK_V1(:,IJK,M2), QMOMK_W1(:,IJK,M2), &
425 0.5*QMOMK_DT, 1.D0/6.D0*Pi*(D_p0(M)**3)*RO_s(IJK,M), 1.D0/6.D0*Pi*(D_p0(M2)**3)*RO_s(IJK,M2), &
426 D_p0(M), D_p0(M2), C_e, C_e, QMOMK_COLLISIONS_ORDER)
427 END DO
428 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
429 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
430 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
431 END IF
432 END DO
433 END DO
434 END IF
435
436 PRINT *,'After collisions'
437
438
439
440
441 CALL QMOMK_SET_BC
442
443
444
445
446
447
448
449
450
451 DO M = 1, MMAX
452 DO IJK = ijkstart3, ijkend3
453 IF (FLUID_AT(IJK)) THEN
454 I = I_OF(IJK)
455 J = J_OF(IJK)
456 K = K_OF(IJK)
457
458 IMJK = IM_OF(IJK)
459 IJMK = JM_OF(IJK)
460 IJKM = KM_OF(IJK)
461
462 IPJK = IP_OF(IJK)
463 IJPK = JP_OF(IJK)
464 IJKP = KP_OF(IJK)
465
466
467
468 IF (NO_K) THEN
469
470 = QMOMK_N1(:,IMJK,M)
471 Ulminus = QMOMK_U1(:,IMJK,M)
472 Vlminus = QMOMK_V1(:,IMJK,M)
473 Wlminus = QMOMK_W1(:,IMJK,M)
474
475 Nlplus = QMOMK_N1(:,IJK,M)
476 Ulplus = QMOMK_U1(:,IJK,M)
477 Vlplus = QMOMK_V1(:,IJK,M)
478 Wlplus = QMOMK_W1(:,IJK,M)
479
480 Nrminus = QMOMK_N1(:,IJK,M)
481 Urminus = QMOMK_U1(:,IJK,M)
482 Vrminus = QMOMK_V1(:,IJK,M)
483 Wrminus = QMOMK_W1(:,IJK,M)
484
485 Nrplus = QMOMK_N1(:,IPJK,M)
486 Urplus = QMOMK_U1(:,IPJK,M)
487 Vrplus = QMOMK_V1(:,IPJK,M)
488 Wrplus = QMOMK_W1(:,IPJK,M)
489
490 CALL KINETIC_FLUX_X_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
491 Nlplus, Ulplus, Vlplus, Wlplus, F_x_left)
492 CALL KINETIC_FLUX_X_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
493 Nrplus, Urplus, Vrplus, Wrplus, F_x_right)
494
495
496 = QMOMK_N1(:,IJMK,M)
497 Ulminus = QMOMK_U1(:,IJMK,M)
498 Vlminus = QMOMK_V1(:,IJMK,M)
499 Wlminus = QMOMK_W1(:,IJMK,M)
500
501 Nlplus = QMOMK_N1(:,IJK,M)
502 Ulplus = QMOMK_U1(:,IJK,M)
503 Vlplus = QMOMK_V1(:,IJK,M)
504 Wlplus = QMOMK_W1(:,IJK,M)
505
506 Nrminus = QMOMK_N1(:,IJK,M)
507 Urminus = QMOMK_U1(:,IJK,M)
508 Vrminus = QMOMK_V1(:,IJK,M)
509 Wrminus = QMOMK_W1(:,IJK,M)
510
511 Nrplus = QMOMK_N1(:,IJPK,M)
512 Urplus = QMOMK_U1(:,IJPK,M)
513 Vrplus = QMOMK_V1(:,IJPK,M)
514 Wrplus = QMOMK_W1(:,IJPK,M)
515
516 CALL KINETIC_FLUX_Y_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
517 Nlplus, Ulplus, Vlplus, Wlplus, F_y_left)
518 CALL KINETIC_FLUX_Y_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
519 Nrplus, Urplus, Vrplus, Wrplus, F_y_right)
520
521 QMOMK_M1(:,IJK,M) = QMOMK_M0(:,IJK,M) - (QMOMK_DT/MINVAL(DX))*(F_x_right - F_x_left) &
522 - (QMOMK_DT/MINVAL(DY))*(F_y_right - F_y_left)
523
524
525 ELSE
526
527 = QMOMK_N1(:,IMJK,M)
528 Ulminus = QMOMK_U1(:,IMJK,M)
529 Vlminus = QMOMK_V1(:,IMJK,M)
530 Wlminus = QMOMK_W1(:,IMJK,M)
531
532 Nlplus = QMOMK_N1(:,IJK,M)
533 Ulplus = QMOMK_U1(:,IJK,M)
534 Vlplus = QMOMK_V1(:,IJK,M)
535 Wlplus = QMOMK_W1(:,IJK,M)
536
537 Nrminus = QMOMK_N1(:,IJK,M)
538 Urminus = QMOMK_U1(:,IJK,M)
539 Vrminus = QMOMK_V1(:,IJK,M)
540 Wrminus = QMOMK_W1(:,IJK,M)
541
542 Nrplus = QMOMK_N1(:,IPJK,M)
543 Urplus = QMOMK_U1(:,IPJK,M)
544 Vrplus = QMOMK_V1(:,IPJK,M)
545 Wrplus = QMOMK_W1(:,IPJK,M)
546
547 CALL KINETIC_FLUX_X_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
548 Nlplus, Ulplus, Vlplus, Wlplus, F_x_left)
549 CALL KINETIC_FLUX_X_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
550 Nrplus, Urplus, Vrplus, Wrplus, F_x_right)
551
552
553 = QMOMK_N1(:,IJMK,M)
554 Ulminus = QMOMK_U1(:,IJMK,M)
555 Vlminus = QMOMK_V1(:,IJMK,M)
556 Wlminus = QMOMK_W1(:,IJMK,M)
557
558 Nlplus = QMOMK_N1(:,IJK,M)
559 Ulplus = QMOMK_U1(:,IJK,M)
560 Vlplus = QMOMK_V1(:,IJK,M)
561 Wlplus = QMOMK_W1(:,IJK,M)
562
563 Nrminus = QMOMK_N1(:,IJK,M)
564 Urminus = QMOMK_U1(:,IJK,M)
565 Vrminus = QMOMK_V1(:,IJK,M)
566 Wrminus = QMOMK_W1(:,IJK,M)
567
568 Nrplus = QMOMK_N1(:,IJPK,M)
569 Urplus = QMOMK_U1(:,IJPK,M)
570 Vrplus = QMOMK_V1(:,IJPK,M)
571 Wrplus = QMOMK_W1(:,IJPK,M)
572
573 CALL KINETIC_FLUX_Y_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
574 Nlplus, Ulplus, Vlplus, Wlplus, F_y_left)
575 CALL KINETIC_FLUX_Y_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
576 Nrplus, Urplus, Vrplus, Wrplus, F_y_right)
577
578
579 = QMOMK_N1(:,IJKM,M)
580 Ulminus = QMOMK_U1(:,IJKM,M)
581 Vlminus = QMOMK_V1(:,IJKM,M)
582 Wlminus = QMOMK_W1(:,IJKM,M)
583
584 Nlplus = QMOMK_N1(:,IJK,M)
585 Ulplus = QMOMK_U1(:,IJK,M)
586 Vlplus = QMOMK_V1(:,IJK,M)
587 Wlplus = QMOMK_W1(:,IJK,M)
588
589 Nrminus = QMOMK_N1(:,IJK,M)
590 Urminus = QMOMK_U1(:,IJK,M)
591 Vrminus = QMOMK_V1(:,IJK,M)
592 Wrminus = QMOMK_W1(:,IJK,M)
593
594 Nrplus = QMOMK_N1(:,IJKP,M)
595 Urplus = QMOMK_U1(:,IJKP,M)
596 Vrplus = QMOMK_V1(:,IJKP,M)
597 Wrplus = QMOMK_W1(:,IJKP,M)
598
599 CALL KINETIC_FLUX_Z_TWENTY_EIGHT_NODES (Nlminus, Ulminus, Vlminus, Wlminus, &
600 Nlplus, Ulplus, Vlplus, Wlplus, F_z_left)
601 CALL KINETIC_FLUX_Z_TWENTY_EIGHT_NODES (Nrminus, Urminus, Vrminus, Wrminus, &
602 Nrplus, Urplus, Vrplus, Wrplus, F_z_right)
603
604 QMOMK_M1(:,IJK,M) = QMOMK_M0(:,IJK,M) - (QMOMK_DT/MINVAL(DX))*(F_x_right - F_x_left) - &
605 (QMOMK_DT/MINVAL(DY))*(F_y_right - F_y_left) - (QMOMK_DT/MINVAL(DZ))*(F_z_right - F_z_left)
606 END IF
607 END IF
608 END DO
609 END DO
610
611
612 DO M = 1, MMAX
613 DO IJK = ijkstart3, ijkend3
614 IF (FLUID_AT(IJK)) THEN
615 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
616 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
617 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
618 END IF
619 END DO
620 END DO
621
622
623
624 IF (QMOMK_COLLISIONS == 'BGK' .AND. MMAX == 1) THEN
625 DO M = 1, MMAX
626 DO IJK = ijkstart3, ijkend3
627 IF (FLUID_AT(IJK)) THEN
628 mom0 = QMOMK_M1(1,IJK,M)
629 IF (mom0 > epsn) THEN
630 CALL COLLISIONS_BGK(QMOMK_M1(:,IJK,M), QMOMK_DT, QMOMK_TCOL, D_p0 (M), C_e)
631 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), &
632 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
633 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
634 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
635 END IF
636 END IF
637 END DO
638 END DO
639 ELSE IF (QMOMK_COLLISIONS == 'BOLTZMANN' .AND. MMAX == 1) THEN
640 DO IJK = ijkstart3, ijkend3
641 IF (FLUID_AT(IJK)) THEN
642 CALL SOLVE_BOLTZMANN_COLLISIONS_ONE_SPECIE(QMOMK_M1(:,IJK,1), QMOMK_N1(:,IJK,1), &
643 QMOMK_U1(:,IJK,1), QMOMK_V1(:,IJK,1), QMOMK_W1(:,IJK,1), &
644 QMOMK_DT, C_e, D_p0 (1), QMOMK_COLLISIONS_ORDER)
645 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,1), QMOMK_N1(:,IJK,1), QMOMK_U1(:,IJK,1), QMOMK_V1(:,IJK,1), QMOMK_W1(:,IJK,1))
646 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,1), &
647 QMOMK_U1(:,IJK,1), QMOMK_V1(:,IJK,1), QMOMK_W1(:,IJK,1), QMOMK_M1(:,IJK,1))
648 END IF
649 END DO
650 ELSE
651 DO M = 1, MMAX
652 DO IJK = ijkstart3, ijkend3
653 IF (FLUID_AT(IJK)) THEN
654 DO M2 = 1, MMAX
655 CALL SOLVE_BOLTZMANN_COLLISIONS_TWO_SPECIES(QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), &
656 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), &
657 QMOMK_M1(:,IJK,M2), QMOMK_N1(:,IJK,M2), &
658 QMOMK_U1(:,IJK,M2), QMOMK_V1(:,IJK,M2), QMOMK_W1(:,IJK,M2), &
659 QMOMK_DT, 1.D0/6.D0*Pi*(D_p0(M)**3)*RO_s(IJK,M), &
660 1.D0/6.D0*Pi*(D_p0(M2)**3)*RO_s(IJK,M2), D_p0(M), D_p0(M2), &
661 C_e, C_e, QMOMK_COLLISIONS_ORDER)
662 END DO
663 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
664 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
665 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
666 END IF
667 END DO
668 END DO
669 END IF
670
671
672
673 DO M = 1, MMAX
674 DO IJK = ijkstart3, ijkend3
675 IF (FLUID_AT(IJK)) THEN
676 I = I_OF(IJK)
677
678 IMJK = IM_OF(IJK)
679 IJMK = JM_OF(IJK)
680 IJKM = KM_OF(IJK)
681
682 UGC = AVG_X_E(U_G(IMJK),U_G(IJK),I)
683 VGC = AVG_Y_N(V_G(IJMK),V_G(IJK))
684 WGC = AVG_Z_T(W_G(IJKM),W_G(IJK))
685
686 DO IN = 1, QMOMK_NN
687 vrel = SQRT(((QMOMK_U1(IN,IJK,M) - UGC)**2) + ((QMOMK_V1(IN,IJK,M) - VGC)**2) + ((QMOMK_W1(IN,IJK,M) - WGC)**2))
688
689
690 = RO_g0*D_p0(M)*vrel/MU_g0
691 Cd = 24.D0*(EP_G(IJK)**(-2.65))*(1.D0 + 0.15*((EP_G(IJK)*Rep)**0.687))/(Rep+SMALL_NUMBER)
692 beta_drag = 3.D0*RO_g0*Cd*vrel/(4.D0*D_p0(M)*RO_s(IJK,M))
693
694 IF (beta_drag > SMALL_NUMBER) THEN
695 (IN,IJK,M) = 1.D0/beta_drag
696 ELSE
697 QMOMK_TAU_DRAG(IN,IJK,M) = LARGE_NUMBER
698 END IF
699
700 drag_exp = EXP(-QMOMK_DT*beta_drag)
701
702
703 (IN,IJK,M) = drag_exp*QMOMK_U1 (IN,IJK,M) + (1.D0 - drag_exp)*UGC
704 QMOMK_V1 (IN,IJK,M) = drag_exp*QMOMK_V1 (IN,IJK,M) + (1.D0 - drag_exp)*(VGC - GRAVITY*QMOMK_TAU_DRAG(IN,IJK,M))
705 QMOMK_W1 (IN,IJK,M) = drag_exp*QMOMK_W1 (IN,IJK,M) + (1.D0 - drag_exp)*WGC
706 END DO
707 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
708 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
709 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
710 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
711 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
712 END IF
713 END DO
714 END DO
715
716
717 DO M = 1, MMAX
718 DO IJK = ijkstart3, ijkend3
719 IF (FLUID_AT(IJK)) THEN
720 CALL BIND_THETA(QMOMK_M1(:,IJK,M), MINVAL(QMOMK_TAU_DRAG(:,IJK,M)))
721 CALL EIGHT_NODE_3D (QMOMK_M1(:,IJK,M), QMOMK_N1(:,IJK,M), QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M))
722 CALL MOMENTS_TWENTY_EIGHT_NODES (QMOMK_N1(:,IJK,M), &
723 QMOMK_U1(:,IJK,M), QMOMK_V1(:,IJK,M), QMOMK_W1(:,IJK,M), QMOMK_M1(:,IJK,M))
724 END IF
725 END DO
726 END DO
727
728
729 CALL QMOMK_SET_BC
730
731
732 = QMOMK_M1
733 QMOMK_N0 = QMOMK_N1
734 QMOMK_U0 = QMOMK_U1
735 QMOMK_V0 = QMOMK_V1
736 QMOMK_W0 = QMOMK_W1
737
738 PRINT *,'QMOM DT 5 = ',QMOMK_DT
739
740 QMOMK_TIME = QMOMK_TIME + QMOMK_DT
741
742 PRINT *,'QMOM DT 6 = ',QMOMK_DT
743 END DO
744
745 IF (DT .LT. QMOMK_DT_TMP) THEN
746 QMOMK_DT = QMOMK_DT_TMP
747 ENDIF
748
749 IF (TMP_DTS .NE. ZERO) THEN
750 QMOMK_DT = TMP_DTS
751 TMP_DTS = ZERO
752 ENDIF
753
754 PRINT *,'Time = ',TIME
755 PRINT *,'Time QMOMK = ',QMOMK_TIME
756
757
758 DO IJK = ijkstart3, ijkend3
759 IF (FLUID_AT(IJK)) THEN
760 EP_G(IJK) = ONE
761 END IF
762 END DO
763
764
765 DO M = 1, MMAX
766 DO IJK = ijkstart3, ijkend3
767 IF (FLUID_AT(IJK)) THEN
768
769 (IJK, M) = QMOMK_M1(2,IJK,M)/QMOMK_M1(1,IJK,M)
770 V_S(IJK, M) = QMOMK_M1(3,IJK,M)/QMOMK_M1(1,IJK,M)
771 W_S(IJK, M) = QMOMK_M1(4,IJK,M)/QMOMK_M1(1,IJK,M)
772
773
774 (IJK) = EP_G(IJK) - QMOMK_M1(1,IJK,M)
775
776
777 (IJK, M) = QMOMK_M1(1,IJK,M)*RO_s(IJK,M)
778
779
780 (IJK,M) = ((QMOMK_M1(5,IJK,M)/QMOMK_M1(1,IJK,M) - &
781 (QMOMK_M1(2,IJK,M)/QMOMK_M1(1,IJK,M))*(QMOMK_M1(2,IJK,M)/QMOMK_M1(1,IJK,M))) + &
782 (QMOMK_M1(8,IJK,M)/QMOMK_M1(1,IJK,M) - &
783 (QMOMK_M1(3,IJK,M)/QMOMK_M1(1,IJK,M))*(QMOMK_M1(3,IJK,M)/QMOMK_M1(1,IJK,M))) + &
784 (QMOMK_M1(10,IJK,M)/QMOMK_M1(1,IJK,M) - &
785 (QMOMK_M1(4,IJK,M)/QMOMK_M1(1,IJK,M))*(QMOMK_M1(4,IJK,M)/QMOMK_M1(1,IJK,M))))/3.D0
786
787 END IF
788 END DO
789 END DO
790
791
792 IF (QMOMK_COUPLED) THEN
793 DO M = 1, MMAX
794 DO IJK = ijkstart3, ijkend3
795 IF (FLUID_AT(IJK)) THEN
796 I = I_OF(IJK)
797
798 IMJK = IM_OF(IJK)
799 IJMK = JM_OF(IJK)
800 IJKM = KM_OF(IJK)
801
802 UGC = AVG_X_E(U_G(IMJK),U_G(IJK),I)
803 VGC = AVG_Y_N(V_G(IJMK),V_G(IJK))
804 WGC = AVG_Z_T(W_G(IJKM),W_G(IJK))
805
806 DO IN = 1, QMOMK_NN
807 vrel = SQRT(((QMOMK_U1(IN,IJK,M) - UGC)**2) + ((QMOMK_V1(IN,IJK,M) - VGC)**2) + ((QMOMK_W1(IN,IJK,M) - WGC)**2))
808
809 Rep = RO_g0*D_p0(M)*vrel/MU_g0
810 Cd = 24.D0*(EP_G(IJK)**(-2.65))*(1.D0 + 0.15*((EP_G(IJK)*Rep)**0.687))/(Rep+SMALL_NUMBER)
811 beta_drag = 3.D0*QMOMK_N1(IN,IJK,M)*RO_g0*Cd*vrel/(4.D0*D_p0(M))
812
813 QMOMK_F_GS(IN,IJK,M) = beta_drag
814 END DO
815 END IF
816 END DO
817 END DO
818 END IF
819 END SUBROUTINE QMOMK_TIME_MARCH
820