File: RELATIVE:/../../../mfix.git/model/solve_vel_star.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 SUBROUTINE SOLVE_VEL_STAR(IER)
35
36
37
38
39 USE param
40 USE param1
41 USE toleranc
42 USE run
43 USE physprop
44 USE geometry
45 USE fldvar
46 USE ghdtheory
47 USE output
48 USE indices
49 USE drag
50 USE residual
51 USE ur_facs
52 USE pgcor
53 USE pscor
54 USE leqsol
55 Use ambm
56 Use tmp_array1, VxF_gs => Arraym1
57 Use tmp_array, VxF_ss => ArrayLM
58 USE compar
59 USE discretelement
60 USE qmom_kinetic_equation
61 use ps
62
63 IMPLICIT NONE
64
65
66
67
68 INTEGER, INTENT(INOUT) :: IER
69
70
71
72
73 INTEGER :: M
74
75 INTEGER :: IJK
76
77 DOUBLE PRECISION, DIMENSION(:), allocatable :: U_gtmp, V_gtmp, W_gtmp
78 DOUBLE PRECISION, DIMENSION(:,:), allocatable :: U_stmp, V_stmp, W_stmp
79
80 INTEGER :: LEQM, LEQI
81
82 LOGICAL :: DO_SOLIDS
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 allocate(U_gtmp(DIMENSION_3))
98 allocate(V_gtmp(DIMENSION_3))
99 allocate(W_gtmp(DIMENSION_3))
100 allocate(U_stmp(DIMENSION_3,DIMENSION_M))
101 allocate(V_stmp(DIMENSION_3,DIMENSION_M))
102 allocate(W_stmp(DIMENSION_3,DIMENSION_M))
103
104 call lock_ambm
105 call lock_tmp_array1
106 call lock_tmp_array2
107
108
109
110 DO IJK = ijkstart3, ijkend3
111 U_gtmp(IJK) = U_g(IJK)
112 V_gtmp(IJK) = V_g(IJK)
113 W_gtmp(IJK) = W_g(IJK)
114 ENDDO
115 DO M = 1, MMAX
116 IF(TRIM(KT_TYPE) /= 'GHD' .OR. &
117 (TRIM(KT_TYPE) == 'GHD' .AND. M==MMAX)) THEN
118 DO IJK = ijkstart3, ijkend3
119 U_stmp(IJK, M) = U_s(IJK, M)
120 V_stmp(IJK, M) = V_s(IJK, M)
121 W_stmp(IJK, M) = W_s(IJK, M)
122 ENDDO
123 ENDIF
124 ENDDO
125
126 DO_SOLIDS = .NOT.(DISCRETE_ELEMENT .OR. QMOMK) .OR. &
127 DES_CONTINUUM_HYBRID
128
129
130
131
132 DO M = 0, MMAX
133 CALL INIT_AB_M (A_M, B_M, IJKMAX2, M)
134 IF (M >= 1) VXF_GS(:,M) = ZERO
135 ENDDO
136
137
138
139 CALL CONV_DIF_U_G (A_M, B_M)
140 IF(DO_SOLIDS) CALL CONV_DIF_U_S (A_M, B_M)
141
142
143
144 CALL SOURCE_U_G (A_M, B_M)
145 IF(POINT_SOURCE) CALL POINT_SOURCE_U_G (A_M, B_M)
146 IF(DO_SOLIDS) THEN
147 CALL SOURCE_U_S (A_M, B_M)
148 IF(POINT_SOURCE) CALL POINT_SOURCE_U_S (A_M, B_M)
149 ENDIF
150
151
152
153
154
155 CALL VF_GS_X (VXF_GS)
156 IF(DO_SOLIDS .AND. (TRIM(KT_TYPE) /= 'GHD')) THEN
157 IF (MMAX > 0) CALL VF_SS_X (VXF_SS)
158 ENDIF
159
160
161 IF(TRIM(KT_TYPE) == 'GHD') THEN
162 CALL CALC_D_GHD_E (A_M, VXF_GS, D_E)
163 ELSE
164 CALL CALC_D_E (A_M, VXF_GS, VXF_SS, D_E, IER)
165 ENDIF
166
167 IF(DO_SOLIDS) THEN
168
169 IF (MMAX > 0) CALL CALC_E_E (A_M, MCP, E_E)
170
171
172
173 IF(TRIM(KT_TYPE) == 'GHD') THEN
174 IF (MMAX > 0) CALL PARTIAL_ELIM_GHD_U (U_G,U_S,VXF_GS,A_M,B_M)
175 ELSE
176 IF (MMAX > 0) CALL PARTIAL_ELIM_U (U_G,U_S,VXF_GS,A_M,B_M)
177 ENDIF
178 ENDIF
179
180
181 CALL ADJUST_A_U_G (A_M, B_M)
182 IF(DO_SOLIDS) CALL ADJUST_A_U_S (A_M, B_M)
183
184
185
186 IF(DES_CONTINUUM_COUPLED) THEN
187 CALL GAS_DRAG_U(A_M, B_M, IER)
188 IF (DES_CONTINUUM_HYBRID) &
189 CALL SOLID_DRAG_U(A_M, B_M)
190 ENDIF
191
192 IF(QMOMK .AND. QMOMK_COUPLED) THEN
193 CALL QMOMK_GAS_DRAG(A_M, B_M, IER, 1, 0, 0)
194 ENDIF
195
196 IF (MOMENTUM_X_EQ(0)) THEN
197 CALL CALC_RESID_U (U_G, V_G, W_G, A_M, B_M, 0, &
198 NUM_RESID(RESID_U,0), DEN_RESID(RESID_U,0), &
199 RESID(RESID_U,0), MAX_RESID(RESID_U,0), &
200 IJK_RESID(RESID_U,0))
201 CALL UNDER_RELAX_U (U_G, A_M, B_M, 0, UR_FAC(3))
202
203
204
205
206
207 ENDIF
208
209 IF(DO_SOLIDS) THEN
210 DO M = 1, MMAX
211 IF(TRIM(KT_TYPE) /= 'GHD' .OR. &
212 (TRIM(KT_TYPE) == 'GHD' .AND. M==MMAX)) THEN
213 IF (MOMENTUM_X_EQ(M)) THEN
214 CALL CALC_RESID_U (U_S(1,M), V_S(1,M), W_S(1,M), A_M,&
215 B_M, M, NUM_RESID(RESID_U,M), &
216 DEN_RESID(RESID_U,M), RESID(RESID_U,M), &
217 MAX_RESID(RESID_U,M), IJK_RESID(RESID_U,M))
218 CALL UNDER_RELAX_U (U_S(1,M), A_M, B_M, M, &
219 UR_FAC(3))
220
221
222
223
224
225 ENDIF
226 ENDIF
227 ENDDO
228 ENDIF
229
230 IF (MOMENTUM_X_EQ(0)) THEN
231
232
233 CALL ADJUST_LEQ (RESID(RESID_U,0), LEQ_IT(3), LEQ_METHOD(3), &
234 LEQI, LEQM)
235 CALL SOLVE_LIN_EQ ('U_g', 3, U_Gtmp, A_M, B_M, 0, LEQI, LEQM, &
236 LEQ_SWEEP(3), LEQ_TOL(3), LEQ_PC(3), IER)
237
238 ENDIF
239
240 IF(DO_SOLIDS) THEN
241 DO M = 1, MMAX
242 IF(TRIM(KT_TYPE) /= 'GHD' .OR. &
243 (TRIM(KT_TYPE) == 'GHD' .AND. M==MMAX)) THEN
244 IF (MOMENTUM_X_EQ(M)) THEN
245
246
247 CALL ADJUST_LEQ (RESID(RESID_U,M), LEQ_IT(3),&
248 LEQ_METHOD(3), LEQI, LEQM)
249 CALL SOLVE_LIN_EQ ('U_s', 3, U_Stmp(1,M), A_M, &
250 B_M, M, LEQI, LEQM, LEQ_SWEEP(3), LEQ_TOL(3),&
251 LEQ_PC(3), IER)
252
253 ENDIF
254 ENDIF
255 ENDDO
256 ENDIF
257
258
259
260
261
262 DO M = 0, MMAX
263 CALL INIT_AB_M (A_M, B_M, IJKMAX2, M)
264 IF (M >= 1) VXF_GS(:,M) = ZERO
265 ENDDO
266
267 CALL CONV_DIF_V_G (A_M, B_M, IER)
268
269 IF(DO_SOLIDS) CALL CONV_DIF_V_S (A_M, B_M, IER)
270
271 CALL SOURCE_V_G (A_M, B_M)
272 IF(POINT_SOURCE) CALL POINT_SOURCE_V_G (A_M, B_M)
273
274
275 IF(DO_SOLIDS) THEN
276 CALL SOURCE_V_S (A_M, B_M)
277 IF(POINT_SOURCE) CALL POINT_SOURCE_V_S (A_M, B_M)
278 END IF
279
280 CALL VF_GS_Y (VXF_GS)
281 IF(DO_SOLIDS .AND. (TRIM(KT_TYPE) /= 'GHD')) THEN
282 IF (MMAX > 0) CALL VF_SS_Y (VXF_SS)
283 ENDIF
284
285
286 IF(TRIM(KT_TYPE) == 'GHD') THEN
287 CALL CALC_D_GHD_N (A_M, VXF_GS, D_N)
288 ELSE
289 CALL CALC_D_N (A_M, VXF_GS, VXF_SS, D_N, IER)
290 ENDIF
291
292 IF(DO_SOLIDS) THEN
293
294 IF (MMAX > 0) CALL CALC_E_N (A_M, MCP, E_N)
295
296
297
298 IF(TRIM(KT_TYPE) == 'GHD') THEN
299 IF (MMAX > 0) CALL PARTIAL_ELIM_GHD_V (V_G,V_S,VXF_GS,A_M,B_M)
300 ELSE
301 IF (MMAX > 0) CALL PARTIAL_ELIM_V (V_G,V_S,VXF_GS,A_M,B_M)
302 ENDIF
303 ENDIF
304
305
306 CALL ADJUST_A_V_G (A_M, B_M)
307
308 IF(.NOT.(DISCRETE_ELEMENT .OR. QMOMK) .OR. &
309 DES_CONTINUUM_HYBRID) THEN
310 CALL ADJUST_A_V_S (A_M, B_M)
311 ENDIF
312
313 IF(DES_CONTINUUM_COUPLED) THEN
314 CALL GAS_DRAG_V(A_M, B_M, IER)
315 IF (DES_CONTINUUM_HYBRID) &
316 CALL SOLID_DRAG_V(A_M, B_M)
317 ENDIF
318
319 IF(QMOMK .AND. QMOMK_COUPLED) THEN
320 CALL QMOMK_GAS_DRAG(A_M, B_M, IER, 0, 1, 0)
321 ENDIF
322
323
324 IF (MOMENTUM_Y_EQ(0)) THEN
325 CALL CALC_RESID_V (U_G, V_G, W_G, A_M, B_M, 0, &
326 NUM_RESID(RESID_V,0), DEN_RESID(RESID_V,0), &
327 RESID(RESID_V,0), MAX_RESID(RESID_V,0), &
328 IJK_RESID(RESID_V,0))
329 CALL UNDER_RELAX_V (V_G, A_M, B_M, 0, UR_FAC(4))
330
331
332
333
334
335 ENDIF
336
337 IF(DO_SOLIDS) THEN
338 DO M = 1, MMAX
339 IF(TRIM(KT_TYPE) /= 'GHD' .OR. &
340 (TRIM(KT_TYPE) == 'GHD' .AND. M==MMAX)) THEN
341 IF (MOMENTUM_Y_EQ(M)) THEN
342 CALL CALC_RESID_V (U_S(1,M), V_S(1,M), W_S(1,M), A_M,&
343 B_M, M, NUM_RESID(RESID_V,M), &
344 DEN_RESID(RESID_V,M),RESID(RESID_V,M), &
345 MAX_RESID(RESID_V,M), IJK_RESID(RESID_V,M))
346 CALL UNDER_RELAX_V (V_S(1,M),A_M,B_M,M,UR_FAC(4))
347
348
349
350
351
352 ENDIF
353 ENDIF
354 ENDDO
355 ENDIF
356
357 IF (MOMENTUM_Y_EQ(0)) THEN
358
359
360 CALL ADJUST_LEQ (RESID(RESID_V,0), LEQ_IT(4), LEQ_METHOD(4), &
361 LEQI, LEQM)
362 CALL SOLVE_LIN_EQ ('V_g', 4, V_Gtmp, A_M, B_M, 0, LEQI, LEQM, &
363 LEQ_SWEEP(4), LEQ_TOL(4), LEQ_PC(4), IER)
364
365 ENDIF
366
367 IF(DO_SOLIDS) THEN
368 DO M = 1, MMAX
369 IF(TRIM(KT_TYPE) /= 'GHD' .OR. &
370 (TRIM(KT_TYPE) == 'GHD' .AND. M==MMAX)) THEN
371 IF (MOMENTUM_Y_EQ(M)) THEN
372
373
374 CALL ADJUST_LEQ (RESID(RESID_V,M), LEQ_IT(4), &
375 LEQ_METHOD(4), LEQI, LEQM)
376 CALL SOLVE_LIN_EQ ('V_s', 4, V_Stmp(1,M), A_M, &
377 B_M, M, LEQI, LEQM, LEQ_SWEEP(4), LEQ_TOL(4), &
378 LEQ_PC(4), IER)
379
380 ENDIF
381 ENDIF
382 ENDDO
383 ENDIF
384
385
386
387
388
389
390 IF (DO_K)THEN
391 DO M = 0, MMAX
392 CALL INIT_AB_M (A_M, B_M, IJKMAX2, M)
393 IF (M >= 1) VXF_GS(:,M) = ZERO
394 ENDDO
395
396 CALL CONV_DIF_W_G (A_M, B_M)
397 IF(DO_SOLIDS) CALL CONV_DIF_W_S (A_M, B_M)
398
399 CALL SOURCE_W_G (A_M, B_M)
400 IF(POINT_SOURCE) CALL POINT_SOURCE_W_G (A_M, B_M)
401
402 IF(DO_SOLIDS) THEN
403 CALL SOURCE_W_S (A_M, B_M)
404 IF(POINT_SOURCE) CALL POINT_SOURCE_W_S (A_M, B_M)
405 ENDIF
406
407
408 CALL VF_GS_Z (VXF_GS)
409 IF(DO_SOLIDS .AND. (TRIM(KT_TYPE) /= 'GHD')) THEN
410 IF (MMAX > 0) CALL VF_SS_Z (VXF_SS)
411 ENDIF
412
413
414 IF(TRIM(KT_TYPE) == 'GHD') THEN
415 CALL CALC_D_GHD_T (A_M, VXF_GS, D_T)
416 ELSE
417 CALL CALC_D_T (A_M, VXF_GS, VXF_SS, D_T, IER)
418 ENDIF
419
420 IF(DO_SOLIDS) THEN
421
422 IF (MMAX > 0) CALL CALC_E_T (A_M, MCP, E_T)
423
424
425
426 IF(TRIM(KT_TYPE) == 'GHD') THEN
427 IF (MMAX > 0) CALL PARTIAL_ELIM_GHD_W (W_G, W_S, VXF_GS, A_M, B_M)
428 ELSE
429 IF (MMAX > 0) CALL PARTIAL_ELIM_W (W_G, W_S, VXF_GS, A_M, B_M)
430 ENDIF
431 ENDIF
432
433 CALL ADJUST_A_W_G (A_M, B_M)
434 IF(.NOT.(DISCRETE_ELEMENT .OR. QMOMK) .OR. &
435 DES_CONTINUUM_HYBRID) THEN
436 CALL ADJUST_A_W_S (A_M, B_M)
437 ENDIF
438
439 IF(DES_CONTINUUM_COUPLED) THEN
440 CALL GAS_DRAG_W(A_M, B_M, IER)
441 IF (DISCRETE_ELEMENT .AND. DES_CONTINUUM_HYBRID) &
442 CALL SOLID_DRAG_W(A_M, B_M)
443 ENDIF
444
445 IF(QMOMK .AND. QMOMK_COUPLED) THEN
446 CALL QMOMK_GAS_DRAG(A_M, B_M, IER, 0, 0, 1)
447 ENDIF
448
449 IF (MOMENTUM_Z_EQ(0)) THEN
450 CALL CALC_RESID_W (U_G, V_G, W_G, A_M, B_M, 0, &
451 NUM_RESID(RESID_W,0), DEN_RESID(RESID_W,0), &
452 RESID(RESID_W,0), MAX_RESID(RESID_W,0), &
453 IJK_RESID(RESID_W,0))
454 CALL UNDER_RELAX_W (W_G, A_M, B_M, 0, UR_FAC(5))
455
456
457
458
459 ENDIF
460
461 IF(DO_SOLIDS) THEN
462 DO M = 1, MMAX
463 IF(TRIM(KT_TYPE) /= 'GHD' .OR. &
464 (TRIM(KT_TYPE) == 'GHD' .AND. M==MMAX)) THEN
465 IF (MOMENTUM_Z_EQ(M)) THEN
466 CALL CALC_RESID_W (U_S(1,M), V_S(1,M), W_S(1,M),&
467 A_M, B_M, M, NUM_RESID(RESID_W,M), &
468 DEN_RESID(RESID_W,M), RESID(RESID_W,M), &
469 MAX_RESID(RESID_W,M), IJK_RESID(RESID_W,M))
470 CALL UNDER_RELAX_W (W_S(1,M), A_M, B_M, M, &
471 UR_FAC(5))
472
473
474
475
476
477 ENDIF
478 ENDIF
479 ENDDO
480 ENDIF
481
482 IF (MOMENTUM_Z_EQ(0)) THEN
483
484
485 CALL ADJUST_LEQ (RESID(RESID_W,0), LEQ_IT(5), &
486 LEQ_METHOD(5), LEQI, LEQM)
487 CALL SOLVE_LIN_EQ ('W_g', 5, W_Gtmp, A_M, B_M, 0, LEQI,&
488 LEQM, LEQ_SWEEP(5), LEQ_TOL(5), LEQ_PC(5), IER)
489
490 ENDIF
491
492 IF(DO_SOLIDS) THEN
493 DO M = 1, MMAX
494 IF(TRIM(KT_TYPE) /= 'GHD' .OR. &
495 (TRIM(KT_TYPE) == 'GHD' .AND. M==MMAX)) THEN
496 IF (MOMENTUM_Z_EQ(M)) THEN
497
498
499 CALL ADJUST_LEQ (RESID(RESID_W,M), LEQ_IT(5), &
500 LEQ_METHOD(5), LEQI, LEQM)
501 CALL SOLVE_LIN_EQ ('W_s', 5, W_Stmp(1,M), &
502 A_M, B_M, M, LEQI, LEQM, LEQ_SWEEP(5), &
503 LEQ_TOL(5), LEQ_PC(5), IER)
504
505 ENDIF
506 ENDIF
507 ENDDO
508 ENDIF
509 ENDIF
510
511
512
513
514 DO IJK = ijkstart3, ijkend3
515 U_g(IJK) = U_gtmp(IJK)
516 V_g(IJK) = V_gtmp(IJK)
517 W_g(IJK) = W_gtmp(IJK)
518 ENDDO
519 DO M = 1, MMAX
520 IF(TRIM(KT_TYPE) /= 'GHD' .OR. &
521 (TRIM(KT_TYPE) == 'GHD' .AND. M==MMAX)) THEN
522 DO IJK = ijkstart3, ijkend3
523 U_s(IJK, M) = U_stmp(IJK, M)
524 V_s(IJK, M) = V_stmp(IJK, M)
525 W_s(IJK, M) = W_stmp(IJK, M)
526 ENDDO
527 ENDIF
528 ENDDO
529
530
531 IF(TRIM(KT_TYPE) == 'GHD') THEN
532 CALL calc_external_forces()
533 CALL GHDMassFlux()
534 CALL UpdateSpeciesVelocities()
535 ENDIF
536
537 call unlock_ambm
538 call unlock_tmp_array1
539 call unlock_tmp_array2
540
541 deallocate(U_gtmp)
542 deallocate(V_gtmp)
543 deallocate(W_gtmp)
544 deallocate(U_stmp)
545 deallocate(V_stmp)
546 deallocate(W_stmp)
547
548 RETURN
549 END SUBROUTINE SOLVE_VEL_STAR
550