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