File: RELATIVE:/../../../mfix.git/model/calc_d_e.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SUBROUTINE CALC_D_E(A_M, VXF_GS, VXF_SS, D_E, IER)
16
17
18
19
20 use physprop, only: MMAX
21
22 use run, only: MOMENTUM_X_EQ
23
24 use discretelement, only: DES_CONTINUUM_COUPLED
25
26 use discretelement, only: DES_CONTINUUM_HYBRID
27
28 use discretelement, only: VXF_GDS, VXF_SDS
29
30 use physprop, only: MMAX
31
32
33
34
35 use param, only: DIMENSION_3, DIMENSION_M
36
37 use param1, only: DIMENSION_LM
38
39 IMPLICIT NONE
40
41
42
43
44 INTEGER, INTENT(INOUT) :: IER
45
46 DOUBLE PRECISION, INTENT(IN):: A_m(DIMENSION_3,-3:3,0:DIMENSION_M)
47
48 DOUBLE PRECISION, INTENT(IN) :: VxF_gs(DIMENSION_3, DIMENSION_M)
49
50 DOUBLE PRECISION, INTENT(IN) :: VxF_ss(DIMENSION_3, DIMENSION_LM)
51
52
53 DOUBLE PRECISION, INTENT(INOUT) :: d_e(DIMENSION_3, 0:DIMENSION_M)
54
55
56
57
58
59
60
61 DOUBLE PRECISION, dimension(:,:), allocatable :: AM0
62
63 LOGICAL :: ANY_SOLIDS_X_MOMENTUM
64
65
66
67 allocate(AM0(DIMENSION_3, 0:DIMENSION_M))
68
69
70 = 0
71
72
73 (:,:) = A_M(:,0,:)
74
75
76 IF(DES_CONTINUUM_COUPLED) THEN
77 AM0(:,0) = AM0(:,0) - VXF_GDS(:)
78 IF (DES_CONTINUUM_HYBRID) &
79 AM0(:,1:MMAX) = AM0(:,1:MMAX) - VXF_SDS(:,1:MMAX)
80 ENDIF
81
82 ANY_SOLIDS_X_MOMENTUM = any(MOMENTUM_X_EQ(1:MMAX))
83
84 IF(MOMENTUM_X_EQ(0)) THEN
85 IF(ANY_SOLIDS_X_MOMENTUM) THEN
86 CALL CALC_D_E_GAS_AND_SOLIDS(AM0, VXF_GS, VXF_SS, D_E)
87 ELSE
88 CALL CALC_D_E_GAS_ONLY(AM0, VXF_GS, D_E)
89 ENDIF
90
91 ELSEIF(ANY_SOLIDS_X_MOMENTUM) THEN
92 CALL CALC_D_E_SOLIDS_ONLY(AM0, VXF_GS, VXF_SS, D_E)
93 ENDIF
94
95 deallocate(AM0)
96
97 RETURN
98 END SUBROUTINE CALC_D_E
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 SUBROUTINE CALC_D_E_GAS_AND_SOLIDS(AM0, VXF_GS, VXF_SS, D_E)
115
116
117
118
119 use fldvar, only: EP_G, EP_s
120
121 use physprop, only: MMAX
122
123 use run, only: MOMENTUM_X_EQ
124
125 use run, only: MODEL_B
126
127 use scales, only: P_SCALE
128
129 use cutcell, only: CARTESIAN_GRID
130
131 use geometry, only: AYZ
132
133 use fun_avg, only: AVG_X
134
135 use compar, only: IJKStart3, IJKEnd3
136
137 use functions, only: FUNLM, EAST_OF
138
139 use functions, only: IP_AT_E, MFLOW_AT_E
140
141 use indices, only: I_OF
142
143
144
145
146 use param, only: DIMENSION_3, DIMENSION_M
147
148 use param1, only: DIMENSION_LM
149
150 use param1, only: ZERO, SMALL_NUMBER, ONE
151
152 IMPLICIT NONE
153
154
155
156
157 DOUBLE PRECISION, INTENT(IN) :: AM0(DIMENSION_3, 0:DIMENSION_M)
158
159 DOUBLE PRECISION, INTENT(IN) :: VxF_gs(DIMENSION_3, DIMENSION_M)
160
161 DOUBLE PRECISION, INTENT(IN) :: VxF_ss(DIMENSION_3, DIMENSION_LM)
162
163
164 DOUBLE PRECISION, INTENT(INOUT) :: D_E(DIMENSION_3, 0:DIMENSION_M)
165
166
167
168
169 INTEGER :: LM, M, L, LPL, LP
170 INTEGER :: I, IJK, IJKE
171
172 DOUBLE PRECISION :: EPSA(DIMENSION_M)
173
174 DOUBLE PRECISION :: EPGA
175
176 DOUBLE PRECISION :: AREA_FACE
177
178 DOUBLE PRECISION :: SUM_VXF_GS
179
180 DOUBLE PRECISION :: SUM_VXF_SS(DIMENSION_M)
181
182 DOUBLE PRECISION :: SUM_VXF_SS_wt_M
183
184
185 DOUBLE PRECISION :: DEN_MGas, NUM_MGas
186
187
188
189 DOUBLE PRECISION :: NUM_MSol_LSol(DIMENSION_M)
190
191
192
193 DOUBLE PRECISION :: DEN_MSol_LSol(DIMENSION_M)
194
195
196
197 DOUBLE PRECISION :: NUM_MSol_LGas
198
199
200
201 DOUBLE PRECISION :: DEN_MSol_LGas
202
203 DOUBLE PRECISION :: TMPdp
204
205
206
207
208
209
210
211
212 DO IJK = ijkstart3, ijkend3
213
214 IF (IP_AT_E(IJK) .OR. MFLOW_AT_E(IJK)) THEN
215 DO M= 0, MMAX
216 D_E(IJK,M) = ZERO
217 ENDDO
218 CYCLE
219 ENDIF
220
221 AREA_FACE = merge(ONE, AYZ(IJK), CARTESIAN_GRID)
222 I = I_OF(IJK)
223 IJKE = EAST_OF(IJK)
224 EPGA = AVG_X(EP_G(IJK),EP_G(IJKE),I)
225
226 SUM_VXF_GS = ZERO
227 DO M= 1, MMAX
228 EPSA(M) = AVG_X(EP_S(IJK,M),EP_S(IJKE,M),I)
229
230 = SUM_VXF_GS + VXF_GS(IJK,M)
231 SUM_VXF_SS(M) = ZERO
232 DO L = 1, MMAX
233 IF (L .NE. M) THEN
234 LM = FUNLM(L,M)
235
236 (M) = SUM_VXF_SS(M) + VXF_SS(IJK,LM)
237 ENDIF
238 ENDDO
239 ENDDO
240
241
242 = ZERO
243 NUM_MGas = ZERO
244 DO M= 1, MMAX
245 IF (MOMENTUM_X_EQ(M)) THEN
246 NUM_MGas = NUM_MGas + (EPSA(M)*VXF_GS(IJK,M)/ &
247 ((-AM0(IJK,M)) + VXF_GS(IJK,M) + SUM_VXF_SS(M) + &
248 SMALL_NUMBER))
249 DEN_MGas = DEN_MGas + (VXF_GS(IJK,M)* &
250 ((-AM0(IJK,M))+SUM_VXF_SS(M))/ &
251 ((-AM0(IJK,M))+VXF_GS(IJK,M)+SUM_VXF_SS(M)+ &
252 SMALL_NUMBER))
253 ELSE
254 DEN_MGas = DEN_MGas + VXF_GS(IJK,M)
255 ENDIF
256 ENDDO
257
258
259
260 IF (MODEL_B) THEN
261
262 = -AM0(IJK,0) + DEN_MGas
263 IF(abs(TMPdp) > SMALL_NUMBER) THEN
264 D_E(IJK,0) = P_SCALE*AREA_FACE/TMPdp
265 ELSE
266 D_E(IJK,0) = ZERO
267 ENDIF
268
269 DO M = 1, MMAX
270 IF(MOMENTUM_X_EQ(M)) THEN
271 TMPdp = -AM0(IJK,M) + VXF_GS(IJK,M)
272 IF(abs(TMPdp) > SMALL_NUMBER) THEN
273 D_E(IJK,M) = D_E(IJK,0)*VXF_GS(IJK,M)/TMPdp
274 ELSE
275 D_E(IJK,M) = ZERO
276 ENDIF
277 ELSE
278 D_E(IJK,M) = ZERO
279 ENDIF
280 ENDDO
281
282
283
284 ELSE
285
286
287 = -AM0(IJK,0) + DEN_MGas
288 IF(abs(TMPdp) >SMALL_NUMBER) THEN
289 D_E(IJK,0) = P_SCALE*AREA_FACE*(EPGA+NUM_MGas)/TMPdp
290 ELSE
291 D_E(IJK,0) = ZERO
292 ENDIF
293
294 DO M= 1, MMAX
295
296 = VXF_GS(IJK,M)*EPGA/ &
297 ((-AM0(IJK,0))+SUM_VXF_GS+SMALL_NUMBER)
298 DEN_MSol_LGas = VXF_GS(IJK,M)*( &
299 ((-AM0(IJK,0)) + (SUM_VXF_GS - VXF_GS(IJK,M)))/ &
300 ((-AM0(IJK,0)) + SUM_VXF_GS + SMALL_NUMBER) )
301
302
303 (M) = ZERO
304 DEN_MSol_LSol(M) = ZERO
305 DO L = 1, MMAX
306 IF (L /= M) THEN
307 LM = FUNLM(L,M)
308 SUM_VXF_SS_wt_M = ZERO
309 DO Lp = 1, MMAX
310 IF((Lp /= L) .AND. (Lp /= M) ) THEN
311 LpL = FUNLM(Lp,L)
312
313 = &
314 SUM_VXF_SS_wt_M + VXF_SS(IJK,LpL)
315 ENDIF
316 ENDDO
317
318 IF(MOMENTUM_X_EQ(L)) THEN
319 NUM_MSol_LSol(M) = NUM_MSol_LSol(M) + &
320 ( VXF_SS(IJK,LM)*EPSA(L)/ &
321 ((-AM0(IJK,L))+VXF_GS(IJK,L)+SUM_VXF_SS(L)+ &
322 SMALL_NUMBER) )
323
324 DEN_MSol_LSol(M) = DEN_MSol_LSol(M) + &
325 VXF_SS(IJK,LM)*(((-AM0(IJK,L))+ &
326 VXF_GS(IJK,L)+SUM_VXF_SS_wt_M)/ &
327 ((-AM0(IJK,L))+VXF_GS(IJK,L)+SUM_VXF_SS(L)+ &
328 SMALL_NUMBER) )
329 ELSE
330 DEN_MSol_LSol(M) = &
331 DEN_MSol_LSol(M) + VXF_SS(IJK,LM)
332 ENDIF
333 ENDIF
334 ENDDO
335
336
337 IF(MOMENTUM_X_EQ(M)) THEN
338 TMPdp = -AM0(IJK,M) + DEN_MSol_LGas + DEN_MSol_LSol(M)
339 IF(abs(TMPdp) > SMALL_NUMBER) THEN
340 D_E(IJK,M) = P_SCALE*AREA_FACE * (EPSA(M) + &
341 NUM_MSol_LSol(M) + NUM_MSol_LGas)/TMPdp
342 ELSE
343 D_E(IJK,M) = ZERO
344 ENDIF
345 ELSE
346 D_E(IJK,M) = ZERO
347 ENDIF
348 ENDDO
349
350 ENDIF
351
352 ENDDO
353
354
355 RETURN
356 END SUBROUTINE CALC_D_E_GAS_AND_SOLIDS
357
358
359
360
361
362
363
364
365
366
367
368
369
370 SUBROUTINE CALC_D_E_GAS_ONLY(AM0, VXF_GS, D_E)
371
372
373
374
375 use fldvar, only: EP_G
376
377 use physprop, only: MMAX
378
379 use run, only: MODEL_B
380
381 use scales, only: P_SCALE
382
383 use cutcell, only: CARTESIAN_GRID
384
385 use geometry, only: AYZ
386
387 use geometry, only: VOL_U
388
389 use fun_avg, only: AVG_X
390
391 use compar, only: IJKStart3, IJKEnd3
392
393 use functions, only: IP_AT_E, MFLOW_AT_E, EAST_OF
394
395 use indices, only: I_OF
396
397 USE qmom_kinetic_equation, only: QMOMK, QMOMK_NN
398 USE qmom_kinetic_equation, only: QMOMK_F_GS, QMOMK_F_GS
399
400
401
402
403 use param, only: DIMENSION_3, DIMENSION_M
404
405 use param1, only: ZERO, SMALL_NUMBER, ONE
406
407 IMPLICIT NONE
408
409
410
411
412 DOUBLE PRECISION, INTENT(IN) :: AM0(DIMENSION_3, 0:DIMENSION_M)
413
414 DOUBLE PRECISION, INTENT(IN) :: VxF_gs(DIMENSION_3, DIMENSION_M)
415
416
417 DOUBLE PRECISION, INTENT(INOUT) :: D_E(DIMENSION_3, 0:DIMENSION_M)
418
419
420
421
422 INTEGER :: M
423 INTEGER :: INN
424 INTEGER :: I, IJK, IJKE
425
426
427
428 DOUBLE PRECISION :: EPGA
429
430 DOUBLE PRECISION :: AREA_FACE
431
432 DOUBLE PRECISION :: SUM_VXF_GS
433
434 DOUBLE PRECISION :: TMPdp
435
436
437
438
439
440
441
442 DO IJK = IJKSTART3, IJKEND3
443
444 IF (IP_AT_E(IJK) .OR. MFLOW_AT_E(IJK)) THEN
445 (IJK,0) = ZERO
446 CYCLE
447 ENDIF
448
449 AREA_FACE = merge(ONE, AYZ(IJK), CARTESIAN_GRID)
450
451 I = I_OF(IJK)
452 IJKE = EAST_OF(IJK)
453 EPGA = AVG_X(EP_G(IJK),EP_G(IJKE),I)
454
455 SUM_VXF_GS = ZERO
456 IF (.NOT. QMOMK) THEN
457 DO M= 1, MMAX
458
459 = SUM_VXF_GS + VXF_GS(IJK,M)
460 ENDDO
461 ELSE
462 DO INN = 1, QMOMK_NN
463 DO M = 1, MMAX
464 SUM_VXF_GS = SUM_VXF_GS + VOL_U(IJK)* &
465 AVG_X(QMOMK_F_GS(INN,IJK,M),QMOMK_F_GS(INN,IJKE,M),I)
466 ENDDO
467 ENDDO
468 ENDIF
469
470 TMPdp = -AM0(IJK,0) + SUM_VXF_GS
471 IF(abs(TMPdp) > SMALL_NUMBER) THEN
472 IF (MODEL_B) THEN
473 D_E(IJK,0) = P_SCALE*AREA_FACE/TMPdp
474 ELSE
475 D_E(IJK,0) = P_SCALE*AREA_FACE*EPGA/TMPdp
476 ENDIF
477 ELSE
478 D_E(IJK,0) = ZERO
479 ENDIF
480
481 ENDDO
482
483
484 RETURN
485 END SUBROUTINE CALC_D_E_GAS_ONLY
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500 SUBROUTINE CALC_D_E_SOLIDS_ONLY(AM0, VXF_GS, VXF_SS, D_E)
501
502
503
504
505 use fldvar, only: EP_s
506
507 use physprop, only: MMAX
508
509 use run, only: MOMENTUM_X_EQ
510
511 use run, only: MODEL_B
512
513 use scales, only: P_SCALE
514
515 use cutcell, only: CARTESIAN_GRID
516
517 use geometry, only: AYZ
518
519 use fun_avg, only: AVG_X
520
521 use compar, only: IJKStart3, IJKEnd3
522
523 use functions, only: FUNLM, EAST_OF
524
525 use functions, only: IP_AT_E, MFLOW_AT_E
526
527 use indices, only: I_OF
528
529
530
531
532 use param, only: DIMENSION_3, DIMENSION_M
533
534 use param1, only: DIMENSION_LM
535
536 use param1, only: ZERO, SMALL_NUMBER, ONE
537
538 IMPLICIT NONE
539
540
541
542
543
544
545 DOUBLE PRECISION, INTENT(IN) :: AM0(DIMENSION_3, 0:DIMENSION_M)
546
547 DOUBLE PRECISION, INTENT(IN) :: VxF_gs(DIMENSION_3, DIMENSION_M)
548
549 DOUBLE PRECISION, INTENT(IN) :: VxF_ss(DIMENSION_3, DIMENSION_LM)
550
551
552 DOUBLE PRECISION, INTENT(INOUT) :: D_E(DIMENSION_3, 0:DIMENSION_M)
553
554
555
556
557
558 INTEGER :: LM, M, L, LPL, LP
559 INTEGER :: I, IJK, IJKE
560
561 DOUBLE PRECISION :: EPSA(DIMENSION_M)
562
563 DOUBLE PRECISION :: AREA_FACE
564
565 DOUBLE PRECISION :: SUM_VXF_SS(DIMENSION_M)
566
567 DOUBLE PRECISION :: SUM_VXF_SS_wt_M
568
569
570
571 DOUBLE PRECISION :: NUM_MSol_LSol(DIMENSION_M)
572
573
574
575 DOUBLE PRECISION :: DEN_MSol_LSol(DIMENSION_M)
576
577 DOUBLE PRECISION :: TMPdp
578
579
580
581
582
583
584
585 DO IJK = IJKSTART3, IJKEND3
586 IF (IP_AT_E(IJK) .OR. MFLOW_AT_E(IJK) .OR. MODEL_B) THEN
587 DO M= 1, MMAX
588 D_E(IJK,M) = ZERO
589 ENDDO
590 CYCLE
591 ENDIF
592
593 AREA_FACE = merge(ONE, AYZ(IJK), CARTESIAN_GRID)
594 I = I_OF(IJK)
595 IJKE = EAST_OF(IJK)
596
597 DO M= 1, MMAX
598 EPSA(M) = AVG_X(EP_S(IJK,M),EP_S(IJKE,M),I)
599 SUM_VXF_SS(M) = ZERO
600 DO L = 1, MMAX
601 IF (L .NE. M) THEN
602 LM = FUNLM(L,M)
603
604 (M) = SUM_VXF_SS(M) + VXF_SS(IJK,LM)
605 ENDIF
606 ENDDO
607 ENDDO
608
609 DO M= 1, MMAX
610
611 (M) = ZERO
612 DEN_MSol_LSol(M) = ZERO
613 DO L = 1, MMAX
614 IF (L .NE. M) THEN
615 LM = FUNLM(L,M)
616 SUM_VXF_SS_wt_M = ZERO
617 DO Lp = 1, MMAX
618 IF ( (Lp .NE. L) .AND. (Lp .NE. M) ) THEN
619 LpL = FUNLM(Lp,L)
620
621 = &
622 SUM_VXF_SS_wt_M + VXF_SS(IJK,LpL)
623 ENDIF
624 ENDDO
625 IF (MOMENTUM_X_EQ(L)) THEN
626 NUM_MSol_LSol(M) = NUM_MSol_LSol(M) + &
627 (VXF_SS(IJK,LM)*EPSA(L) / &
628 ((-AM0(IJK,L))+VXF_GS(IJK,L)+SUM_VXF_SS(L)+ &
629 SMALL_NUMBER))
630
631 DEN_MSol_LSol(M) = DEN_MSol_LSol(M) + &
632 VXF_SS(IJK,LM)*(((-AM0(IJK,L))+VXF_GS(IJK,L) + &
633 SUM_VXF_SS_wt_M)/((-AM0(IJK,L))+VXF_GS(IJK,L)+ &
634 SUM_VXF_SS(L)+ SMALL_NUMBER ))
635 ELSE
636 DEN_MSol_LSol(M) = DEN_MSol_LSol(M)+VXF_SS(IJK,LM)
637 ENDIF
638 ENDIF
639 ENDDO
640
641
642 IF (MOMENTUM_X_EQ(M)) THEN
643 TMPdp = -AM0(IJK,M)+VXF_GS(IJK,M)+DEN_MSol_LSol(M)
644 IF(abs(TMPdp) > SMALL_NUMBER) THEN
645 D_E(IJK,M) = P_SCALE*AREA_FACE* &
646 (EPSA(M) + NUM_MSol_LSol(M))/TMPdp
647 ELSE
648 D_E(IJK,M) = ZERO
649 ENDIF
650 ELSE
651 D_E(IJK,M) = ZERO
652 ENDIF
653 ENDDO
654 ENDDO
655
656
657 RETURN
658 END SUBROUTINE CALC_D_E_SOLIDS_ONLY
659