File: N:\mfix\model\set_outflow.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
35 SUBROUTINE SET_OUTFLOW(BCV)
36
37
38
39 use bc
40 use bc, only: bc_k_b, bc_k_t
41 use bc, only: bc_j_s, bc_j_n
42 use bc, only: bc_i_w, bc_i_e
43
44 use fldvar, only: rop_g, rop_s
45 use fldvar, only: u_g, v_g, w_g
46 use fldvar, only: u_s, v_s, w_s
47 use physprop, only: mmax
48
49 use functions, only: im_of, ip_of, jm_of, jp_of, km_of, kp_of
50 use functions, only: fluid_at
51 use functions, only: is_on_mype_plus2layers
52 use functions, only: funijk
53 use compar, only: dead_cell_at
54
55 use param, only: dimension_m
56 use param1, only: undefined, zero
57 IMPLICIT NONE
58
59
60
61
62 INTEGER, INTENT(IN) :: BCV
63
64
65
66
67 INTEGER :: I, J, K, M
68
69 INTEGER :: IJK
70
71 INTEGER :: FIJK
72
73
74 DOUBLE PRECISION :: RVEL_G, RVEL_S(DIMENSION_M)
75
76
77
78 DO K = BC_K_B(BCV), BC_K_T(BCV)
79 DO J = BC_J_S(BCV), BC_J_N(BCV)
80 DO I = BC_I_W(BCV), BC_I_E(BCV)
81
82 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
83 IF(DEAD_CELL_AT(I,J,K)) CYCLE
84 IJK = FUNIJK(I,J,K)
85
86
87
88 IF (FLUID_AT(IM_OF(IJK))) THEN
89 FIJK = IM_OF(IJK)
90 RVEL_G = U_G(FIJK)
91 IF (MMAX>0) RVEL_S(:MMAX) = U_S(FIJK,:MMAX)
92
93 CALL SET_OUTFLOW_MISC(BCV, IJK, FIJK)
94 CALL SET_OUTFLOW_EP(BCV, IJK, FIJK, RVEL_G, RVEL_S)
95 IF (BC_TYPE_ENUM(BCV)==P_INFLOW) &
96 CALL SET_PINOUTFLOW(BCV, IJK, FIJK, RVEL_G, RVEL_S)
97
98
99
100
101
102
103
104
105
106
107
108 IF (ROP_G(IJK) > ZERO) THEN
109 U_G(IJK) = ROP_G(FIJK)*U_G(FIJK)/ROP_G(IJK)
110 ELSE
111 U_G(IJK) = ZERO
112 ENDIF
113
114
115
116 (IJK) = V_G(FIJK)
117 W_G(IJK) = W_G(FIJK)
118
119 IF (MMAX > 0) THEN
120 WHERE (ROP_S(IJK,:MMAX) > ZERO)
121 U_S(IJK,:MMAX) = ROP_S(FIJK,:MMAX)*&
122 U_S(FIJK,:MMAX)/ROP_S(IJK,:MMAX)
123 ELSEWHERE
124 U_S(IJK,:MMAX) = ZERO
125 END WHERE
126 V_S(IJK,:MMAX) = V_S(FIJK,:MMAX)
127 W_S(IJK,:MMAX) = W_S(FIJK,:MMAX)
128 ENDIF
129
130 CALL SET_OUTFLOW_FLUXES(IJK, FIJK)
131 ENDIF
132
133
134
135
136 IF (FLUID_AT(IP_OF(IJK))) THEN
137 FIJK = IP_OF(IJK)
138
139
140 = -U_G(IJK)
141 IF (MMAX >0) RVEL_S(:MMAX) = -U_S(IJK,:MMAX)
142
143 CALL SET_OUTFLOW_MISC(BCV, IJK, FIJK)
144 CALL SET_OUTFLOW_EP(BCV, IJK, FIJK, RVEL_G, RVEL_S)
145 IF (BC_TYPE_ENUM(BCV)==P_INFLOW) &
146 CALL SET_PINOUTFLOW(BCV, IJK, FIJK, RVEL_G, RVEL_S)
147
148
149
150
151
152
153 IF (U_G(IJK) == UNDEFINED) THEN
154 IF (ROP_G(IJK) > ZERO) THEN
155 U_G(IJK) = ROP_G(FIJK)*U_G(FIJK)/ROP_G(IJK)
156 ELSE
157 U_G(IJK) = ZERO
158 ENDIF
159 ENDIF
160 V_G(IJK) = V_G(FIJK)
161 W_G(IJK) = W_G(FIJK)
162
163 DO M = 1, MMAX
164 IF (U_S(IJK,M) == UNDEFINED) THEN
165 IF (ROP_S(IJK,M) > ZERO) THEN
166 U_S(IJK,M) = ROP_S(FIJK,M)*&
167 U_S(FIJK,M)/ROP_S(IJK,M)
168 ELSE
169 U_S(IJK,M) = ZERO
170 ENDIF
171 ENDIF
172 V_S(IJK,M) = V_S(FIJK,M)
173 W_S(IJK,M) = W_S(FIJK,M)
174 ENDDO
175
176 CALL SET_OUTFLOW_FLUXES(IJK, FIJK)
177 ENDIF
178
179
180
181
182 IF (FLUID_AT(JM_OF(IJK))) THEN
183 FIJK = JM_OF(IJK)
184 RVEL_G = V_G(FIJK)
185 IF(MMAX>0) RVEL_S(:MMAX) = V_S(FIJK,:MMAX)
186
187 CALL SET_OUTFLOW_MISC(BCV, IJK, FIJK)
188 CALL SET_OUTFLOW_EP(BCV, IJK, FIJK, RVEL_G, RVEL_S)
189 IF (BC_TYPE_ENUM(BCV)==P_INFLOW) &
190 CALL SET_PINOUTFLOW(BCV, IJK, FIJK, RVEL_G, RVEL_S)
191
192 IF (ROP_G(IJK) > ZERO) THEN
193 V_G(IJK) = ROP_G(FIJK)*V_G(FIJK)/ROP_G(IJK)
194 ELSE
195 V_G(IJK) = ZERO
196 ENDIF
197 U_G(IJK) = U_G(FIJK)
198 W_G(IJK) = W_G(FIJK)
199
200 IF (MMAX > 0) THEN
201 WHERE (ROP_S(IJK,:MMAX) > ZERO)
202 V_S(IJK,:MMAX) = ROP_S(FIJK,:MMAX)*&
203 V_S(FIJK,:MMAX)/ROP_S(IJK,:MMAX)
204 ELSEWHERE
205 V_S(IJK,:MMAX) = ZERO
206 END WHERE
207 U_S(IJK,:MMAX) = U_S(FIJK,:MMAX)
208 W_S(IJK,:MMAX) = W_S(FIJK,:MMAX)
209 ENDIF
210
211 CALL SET_OUTFLOW_FLUXES(IJK, FIJK)
212 ENDIF
213
214
215
216
217 IF (FLUID_AT(JP_OF(IJK))) THEN
218 FIJK = JP_OF(IJK)
219 RVEL_G = -V_G(IJK)
220 IF (MMAX>0) RVEL_S(:MMAX) = -V_S(IJK,:MMAX)
221
222 CALL SET_OUTFLOW_MISC(BCV, IJK, FIJK)
223 CALL SET_OUTFLOW_EP(BCV, IJK, FIJK, RVEL_G, RVEL_S)
224 IF (BC_TYPE_ENUM(BCV)==P_INFLOW) &
225 CALL SET_PINOUTFLOW(BCV, IJK, FIJK, RVEL_G, RVEL_S)
226
227 IF (V_G(IJK) == UNDEFINED) THEN
228 IF (ROP_G(IJK) > ZERO) THEN
229 V_G(IJK) = ROP_G(FIJK)*V_G(FIJK)/ROP_G(IJK)
230 ELSE
231 V_G(IJK) = ZERO
232 ENDIF
233 ENDIF
234 U_G(IJK) = U_G(FIJK)
235 W_G(IJK) = W_G(FIJK)
236
237 DO M = 1, MMAX
238 IF (V_S(IJK,M) == UNDEFINED) THEN
239 IF (ROP_S(IJK,M) > ZERO) THEN
240 V_S(IJK,M) = ROP_S(FIJK,M)*&
241 V_S(FIJK,M)/ROP_S(IJK,M)
242 ELSE
243 V_S(IJK,M) = ZERO
244 ENDIF
245 ENDIF
246 U_S(IJK,M) = U_S(FIJK,M)
247 W_S(IJK,M) = W_S(FIJK,M)
248 ENDDO
249
250 CALL SET_OUTFLOW_FLUXES(IJK, FIJK)
251 ENDIF
252
253
254
255
256 IF (FLUID_AT(KM_OF(IJK))) THEN
257 FIJK = KM_OF(IJK)
258 RVEL_G = W_G(FIJK)
259 IF (MMAX>0) RVEL_S(:MMAX) = W_S(FIJK,:MMAX)
260
261 CALL SET_OUTFLOW_MISC(BCV, IJK, FIJK)
262 CALL SET_OUTFLOW_EP(BCV, IJK, FIJK, RVEL_G, RVEL_S)
263 IF (BC_TYPE_ENUM(BCV)==P_INFLOW) &
264 CALL SET_PINOUTFLOW(BCV, IJK, FIJK, RVEL_G, RVEL_S)
265
266 IF (ROP_G(IJK) > ZERO) THEN
267 W_G(IJK) = ROP_G(FIJK)*W_G(FIJK)/ROP_G(IJK)
268 ELSE
269 W_G(IJK) = ZERO
270 ENDIF
271 U_G(IJK) = U_G(FIJK)
272 V_G(IJK) = V_G(FIJK)
273
274 IF (MMAX > 0) THEN
275 WHERE (ROP_S(IJK,:MMAX) > ZERO)
276 W_S(IJK,:MMAX) = ROP_S(FIJK,:MMAX)*&
277 W_S(FIJK,:MMAX)/ROP_S(IJK,:MMAX)
278 ELSEWHERE
279 W_S(IJK,:MMAX) = ZERO
280 END WHERE
281 U_S(IJK,:MMAX) = U_S(FIJK,:MMAX)
282 V_S(IJK,:MMAX) = V_S(FIJK,:MMAX)
283 ENDIF
284
285 CALL SET_OUTFLOW_FLUXES(IJK, FIJK)
286 ENDIF
287
288
289
290
291 IF (FLUID_AT(KP_OF(IJK))) THEN
292 FIJK = KP_OF(IJK)
293 RVEL_G = -W_G(IJK)
294 IF (MMAX>0) RVEL_S(:MMAX) = -W_S(IJK,:MMAX)
295
296 CALL SET_OUTFLOW_MISC(BCV, IJK, FIJK)
297 CALL SET_OUTFLOW_EP(BCV, IJK, FIJK, RVEL_G, RVEL_S)
298 IF (BC_TYPE_ENUM(BCV)==P_INFLOW) &
299 CALL SET_PINOUTFLOW(BCV, IJK, FIJK, RVEL_G, RVEL_S)
300
301 IF (W_G(IJK) == UNDEFINED) THEN
302 IF (ROP_G(IJK) > ZERO) THEN
303 W_G(IJK) = ROP_G(FIJK)*W_G(FIJK)/ROP_G(IJK)
304 ELSE
305 W_G(IJK) = ZERO
306 ENDIF
307 ENDIF
308 U_G(IJK) = U_G(FIJK)
309 V_G(IJK) = V_G(FIJK)
310
311 DO M = 1, MMAX
312 IF (W_S(IJK,M) == UNDEFINED) THEN
313 IF (ROP_S(IJK,M) > ZERO) THEN
314 W_S(IJK,M) = ROP_S(FIJK,M)*&
315 W_S(FIJK,M)/ROP_S(IJK,M)
316 ELSE
317 W_S(IJK,M) = ZERO
318 ENDIF
319 ENDIF
320 U_S(IJK,M) = U_S(FIJK,M)
321 V_S(IJK,M) = V_S(FIJK,M)
322 ENDDO
323
324 CALL SET_OUTFLOW_FLUXES(IJK, FIJK)
325 ENDIF
326
327 ENDDO
328 ENDDO
329 ENDDO
330
331 RETURN
332 END SUBROUTINE SET_OUTFLOW
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355 SUBROUTINE SET_OUTFLOW_MISC(BCV, IJK, FIJK)
356
357
358
359 use bc
360 use run, only: kt_type_enum, ghd_2007
361 use fldvar, only: p_g, ro_g, T_g
362 use fldvar, only: p_s, p_star
363 use physprop, only: smax, mmax
364 use physprop, only: ro_g0, mw_mix_g
365 use eos, only: EOSG
366
367
368
369 use param1, only: undefined
370 IMPLICIT NONE
371
372
373
374
375 INTEGER, INTENT(IN) :: BCV
376
377 INTEGER, INTENT(IN) :: IJK
378
379 INTEGER, INTENT(IN) :: FIJK
380
381
382 IF (BC_TYPE_ENUM(BCV) /= P_OUTFLOW .AND. &
383 BC_TYPE_ENUM(BCV) /= P_INFLOW) P_G(IJK) = P_G(FIJK)
384
385 MW_MIX_G(IJK) = MW_MIX_G(FIJK)
386
387
388
389 IF (RO_G0 == UNDEFINED) RO_G(IJK) = &
390 EOSG(MW_MIX_G(IJK),P_G(IJK),T_G(IJK))
391
392 IF (SMAX >0) THEN
393 P_STAR(IJK) = P_STAR(FIJK)
394 P_S(IJK,:SMAX) = P_S(FIJK,:SMAX)
395 ENDIF
396
397 IF (KT_TYPE_ENUM == GHD_2007 .AND. MMAX>0) &
398 P_S(IJK,MMAX) = P_S(FIJK,MMAX)
399
400 RETURN
401 END SUBROUTINE SET_OUTFLOW_MISC
402
403
404
405
406
407
408
409
410
411
412
413 SUBROUTINE SET_OUTFLOW_EP(BCV, IJK, FIJK, RVEL_G, RVEL_S)
414
415
416
417 use bc
418 use run, only: kt_type_enum, ghd_2007
419 use physprop, only: smax, mmax
420 use fldvar, only: rop_g, ro_g, ep_g
421 use fldvar, only: rop_s, ep_s
422 use discretelement, only: discrete_element, des_mmax
423
424
425 use param, only: dimension_m
426 use param1, only: undefined, zero, one
427 IMPLICIT NONE
428
429
430
431
432 INTEGER, INTENT(IN) :: BCV
433
434 INTEGER, INTENT(IN) :: IJK
435
436 INTEGER, INTENT(IN) :: FIJK
437
438
439
440
441
442
443
444 DOUBLE PRECISION, INTENT(IN) :: RVEL_G
445 DOUBLE PRECISION, INTENT(IN), DIMENSION(DIMENSION_M) :: RVEL_S
446
447
448
449
450 INTEGER :: M
451
452 DOUBLE PRECISION :: SUM_EPs
453
454 DOUBLE PRECISION :: SUM_ROPS
455 LOGICAL, SAVE :: FIRST_PASS = .TRUE.
456
457
458
459 = ZERO
460 SUM_EPS = ZERO
461
462 DO M = 1, SMAX
463
464 IF(BC_TYPE_ENUM(BCV) == P_INFLOW) THEN
465 ROP_S(IJK,M) = ROP_S(FIJK,M)
466 ELSE
467
468
469 IF (RVEL_S(M) >= ZERO) THEN
470
471 (IJK,M) = ROP_S(FIJK,M)
472 ELSE
473
474 (IJK,M) = ZERO
475 ENDIF
476 ENDIF
477
478
479
480 IF(BC_ROP_S(BCV,M)/=UNDEFINED) ROP_S(IJK,M)=BC_ROP_S(BCV,M)
481
482
483 = SUM_ROPS + ROP_S(IJK,M)
484 SUM_EPS = SUM_EPS + EP_S(IJK,M)
485 ENDDO
486
487 IF (KT_TYPE_ENUM == GHD_2007) ROP_S(IJK,MMAX) = SUM_ROPS
488
489
490
491
492 IF (DISCRETE_ELEMENT .AND. .NOT.FIRST_PASS) THEN
493 FIRST_PASS = .FALSE.
494 DO M = MMAX+1, DES_MMAX+MMAX
495
496
497
498
499 (IJK,M) = ROP_S(FIJK,M)
500 SUM_ROPS = SUM_ROPS + ROP_S(IJK,M)
501 SUM_EPS = SUM_EPS + EP_S(IJK,M)
502 ENDDO
503 ENDIF
504
505
506
507
508 IF (BC_EP_G(BCV) == UNDEFINED) EP_G(IJK) = ONE - SUM_EPS
509
510
511
512 (IJK) = RO_G(IJK)*EP_G(IJK)
513
514 RETURN
515 END SUBROUTINE SET_OUTFLOW_EP
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533 SUBROUTINE SET_OUTFLOW_FLUXES(IJK,FIJK)
534
535
536
537 use physprop, only: mmax
538 use run, only: kt_type_enum, ghd_2007
539 use run, only: added_mass
540 use mflux, only: flux_ge, flux_gn, flux_gt
541 use mflux, only: flux_se, flux_sn, flux_st
542 use mflux, only: flux_ne, flux_nn, flux_nt
543 use mflux, only: flux_gse, flux_gsn, flux_gst
544 use mflux, only: flux_sse, flux_ssn, flux_sst
545
546
547
548
549 INTEGER, INTENT(IN) :: IJK
550
551 INTEGER, INTENT(IN) :: FIJK
552
553
554 (IJK) = Flux_gE(FIJK)
555 Flux_gN(IJK) = Flux_gN(FIJK)
556 Flux_gT(IJK) = Flux_gT(FIJK)
557 IF (MMAX >0) THEN
558 Flux_sE(IJK,:MMAX) = Flux_sE(FIJK,:MMAX)
559 Flux_sN(IJK,:MMAX) = Flux_sN(FIJK,:MMAX)
560 Flux_sT(IJK,:MMAX) = Flux_sT(FIJK,:MMAX)
561 ENDIF
562
563 IF(ADDED_MASS) THEN
564 Flux_gSE(IJK) = Flux_gSE(FIJK)
565 Flux_gSN(IJK) = Flux_gSN(FIJK)
566 Flux_gST(IJK) = Flux_gST(FIJK)
567 IF (MMAX >0) THEN
568 Flux_sSE(IJK) = Flux_sSE(FIJK)
569 Flux_sSN(IJK) = Flux_sSN(FIJK)
570 Flux_sST(IJK) = Flux_sST(FIJK)
571 ENDIF
572 ENDIF
573
574 IF (KT_TYPE_ENUM == GHD_2007) THEN
575 Flux_nE(IJK) = Flux_nE(FIJK)
576 Flux_nN(IJK) = Flux_nN(FIJK)
577 Flux_nT(IJK) = Flux_nT(FIJK)
578 ENDIF
579
580 RETURN
581 END SUBROUTINE SET_OUTFLOW_FLUXES
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598 SUBROUTINE SET_PINOUTFLOW(BCV,IJK,FIJK,RVEL_G,RVEL_S)
599
600
601
602 use bc, only: bc_t_g, bc_x_g
603 use bc, only: bc_scalar, bc_k_turb_g, bc_e_turb_g
604 use bc, only: bc_t_s, bc_x_s, bc_theta_m
605 use fldvar, only: t_g, t_s, theta_m
606 use fldvar, only: x_g, x_s, scalar
607 use fldvar, only: k_turb_g, e_turb_g
608
609 use fldvar, only: rop_s, ro_s, d_p
610 use run, only: kt_type_enum, ghd_2007
611 use run, only: k_epsilon
612 use physprop, only: nmax, smax, mmax
613 use scalars, only: nscalar, phase4scalar
614
615
616
617 use param, only: dimension_m
618 use param1, only: zero
619 use constant, only: pi
620 IMPLICIT NONE
621
622
623
624
625 INTEGER, INTENT(IN) :: BCV
626
627 INTEGER, INTENT(IN) :: IJK
628
629 INTEGER, INTENT(IN) :: FIJK
630
631
632 DOUBLE PRECISION, INTENT(IN) :: RVEL_G, RVEL_S(DIMENSION_M)
633
634
635
636
637 DOUBLE PRECISION :: Nm, NTot
638
639 INTEGER :: M, N, Ms
640
641
642
643 IF (RVEL_G < 0) THEN
644 (IJK) = BC_T_G(BCV)
645 IF (NMAX(0) > 0) &
646 X_G(IJK,:NMAX(0)) = BC_X_G(BCV,:NMAX(0))
647 IF (K_Epsilon) THEN
648 K_Turb_G(IJK) = BC_K_Turb_G(BCV)
649 E_Turb_G(IJK) = BC_E_Turb_G(BCV)
650 ENDIF
651 IF (NScalar > 0) THEN
652 DO N = 1,NScalar
653 Ms = Phase4Scalar(N)
654 IF (Ms == 0) &
655 Scalar(IJK, N) = BC_Scalar(BCV,N)
656 ENDDO
657 ENDIF
658 ELSE
659 (IJK) = T_G(FIJK)
660 IF (NMAX(0) > 0) &
661 X_G(IJK,:NMAX(0)) = X_G(FIJK,:NMAX(0))
662 IF(K_Epsilon) THEN
663 K_Turb_G(IJK) = K_Turb_G(FIJK)
664 E_Turb_G(IJK) = E_Turb_G(FIJK)
665 ENDIF
666 IF (NScalar >0) THEN
667 DO N = 1, NScalar
668 Ms = Phase4Scalar(N)
669 IF (Ms == 0) &
670 Scalar(IJK, N) = Scalar(FIJK, N)
671 ENDDO
672 ENDIF
673 ENDIF
674
675
676 DO M = 1, SMAX
677 IF (RVEL_S(M) < 0) THEN
678 (IJK,M) = BC_T_S(BCV,M)
679 THETA_M(IJK,M) = BC_THETA_M(BCV,M)
680 IF (NMAX(M) > 0) &
681 X_S(IJK,M,:NMAX(M)) = BC_X_S(BCV,M,:NMAX(M))
682 IF (NScalar > 0) THEN
683 DO N = 1,NScalar
684 Ms = Phase4Scalar(N)
685 IF (Ms == M) &
686 Scalar(IJK, N) = BC_Scalar(BCV,N)
687 ENDDO
688 ENDIF
689 ELSE
690 (IJK,M) = T_S(FIJK,M)
691 THETA_M(IJK,M) = THETA_M(FIJK,M)
692 IF (NMAX(M) > 0) &
693 X_S(IJK,M,:NMAX(M)) = X_S(FIJK,M,:NMAX(M))
694 IF (NScalar > 0) THEN
695 DO N = 1,NScalar
696 Ms = Phase4Scalar(N)
697 IF (Ms == M) &
698 Scalar(IJK, N) = Scalar(FIJK,N)
699 ENDDO
700 ENDIF
701 ENDIF
702 ENDDO
703
704
705
706 IF(KT_TYPE_ENUM == GHD_2007) THEN
707 nTOT = zero
708 DO M = 1, SMAX
709 nM = ROP_S(IJK,M)*6d0/ &
710 (PI*D_p(IJK,M)**3*RO_S(IJK,M))
711 nTOT = nTOT + nM
712 THETA_M(IJK,MMAX) = THETA_M(IJK,MMAX) + &
713 nM*THETA_M(IJK,M)
714 ENDDO
715 IF (NTOT > zero) &
716 THETA_M(IJK,MMAX) = THETA_M(IJK,MMAX) / nTOT
717 ENDIF
718
719 RETURN
720 END SUBROUTINE SET_PINOUTFLOW
721