File: RELATIVE:/../../../mfix.git/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, only: bc_type
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(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(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(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(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(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(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, only: bc_type
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(BCV) /= 'P_OUTFLOW' .AND. &
383 BC_TYPE(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, only: bc_type, bc_ep_g, bc_rop_s
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 use discretelement, only: des_rop_s, des_ro_s
424
425
426 use param, only: dimension_m
427 use param1, only: undefined, zero, one
428 IMPLICIT NONE
429
430
431
432
433 INTEGER, INTENT(IN) :: BCV
434
435 INTEGER, INTENT(IN) :: IJK
436
437 INTEGER, INTENT(IN) :: FIJK
438
439
440
441
442
443
444
445 DOUBLE PRECISION, INTENT(IN) :: RVEL_G
446 DOUBLE PRECISION, INTENT(IN), DIMENSION(DIMENSION_M) :: RVEL_S
447
448
449
450
451 INTEGER :: M
452
453 DOUBLE PRECISION :: EPs
454
455 DOUBLE PRECISION :: SUM_EPs
456
457 DOUBLE PRECISION :: SUM_ROPS
458
459
460
461 = ZERO
462 SUM_EPS = ZERO
463
464 DO M = 1, SMAX
465
466 IF(BC_TYPE(BCV) == 'P_INFLOW') THEN
467 ROP_S(IJK,M) = ROP_S(FIJK,M)
468 ELSE
469
470
471 IF (RVEL_S(M) >= ZERO) THEN
472
473 (IJK,M) = ROP_S(FIJK,M)
474 ELSE
475
476 (IJK,M) = ZERO
477 ENDIF
478 ENDIF
479
480
481
482 IF(BC_ROP_S(BCV,M)/=UNDEFINED) ROP_S(IJK,M)=BC_ROP_S(BCV,M)
483
484
485 = SUM_ROPS + ROP_S(IJK,M)
486 SUM_EPS = SUM_EPS + EP_S(IJK,M)
487 ENDDO
488
489 IF (KT_TYPE_ENUM == GHD_2007) ROP_S(IJK,MMAX) = SUM_ROPS
490
491
492
493
494 IF (DISCRETE_ELEMENT .AND. ALLOCATED(DES_ROP_S)) THEN
495 DO M = 1, DES_MMAX
496
497
498
499
500 (IJK,M) = DES_ROP_S(FIJK,M)
501 SUM_ROPS = SUM_ROPS + DES_ROP_S(IJK,M)
502 EPS = DES_ROP_S(IJK,M)/DES_RO_S(M)
503 SUM_EPS = SUM_EPS + EPS
504 ENDDO
505 ENDIF
506
507
508
509
510 IF (BC_EP_G(BCV) == UNDEFINED) EP_G(IJK) = ONE - SUM_EPS
511
512
513
514 (IJK) = RO_G(IJK)*EP_G(IJK)
515
516 RETURN
517 END SUBROUTINE SET_OUTFLOW_EP
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535 SUBROUTINE SET_OUTFLOW_FLUXES(IJK,FIJK)
536
537
538
539 use physprop, only: mmax
540 use run, only: kt_type_enum, ghd_2007
541 use run, only: added_mass
542 use mflux, only: flux_ge, flux_gn, flux_gt
543 use mflux, only: flux_se, flux_sn, flux_st
544 use mflux, only: flux_ne, flux_nn, flux_nt
545 use mflux, only: flux_gse, flux_gsn, flux_gst
546 use mflux, only: flux_sse, flux_ssn, flux_sst
547
548
549
550
551 INTEGER, INTENT(IN) :: IJK
552
553 INTEGER, INTENT(IN) :: FIJK
554
555
556 (IJK) = Flux_gE(FIJK)
557 Flux_gN(IJK) = Flux_gN(FIJK)
558 Flux_gT(IJK) = Flux_gT(FIJK)
559 IF (MMAX >0) THEN
560 Flux_sE(IJK,:MMAX) = Flux_sE(FIJK,:MMAX)
561 Flux_sN(IJK,:MMAX) = Flux_sN(FIJK,:MMAX)
562 Flux_sT(IJK,:MMAX) = Flux_sT(FIJK,:MMAX)
563 ENDIF
564
565 IF(ADDED_MASS) THEN
566 Flux_gSE(IJK) = Flux_gSE(FIJK)
567 Flux_gSN(IJK) = Flux_gSN(FIJK)
568 Flux_gST(IJK) = Flux_gST(FIJK)
569 IF (MMAX >0) THEN
570 Flux_sSE(IJK) = Flux_sSE(FIJK)
571 Flux_sSN(IJK) = Flux_sSN(FIJK)
572 Flux_sST(IJK) = Flux_sST(FIJK)
573 ENDIF
574 ENDIF
575
576 IF (KT_TYPE_ENUM == GHD_2007) THEN
577 Flux_nE(IJK) = Flux_nE(FIJK)
578 Flux_nN(IJK) = Flux_nN(FIJK)
579 Flux_nT(IJK) = Flux_nT(FIJK)
580 ENDIF
581
582 RETURN
583 END SUBROUTINE SET_OUTFLOW_FLUXES
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600 SUBROUTINE SET_PINOUTFLOW(BCV,IJK,FIJK,RVEL_G,RVEL_S)
601
602
603
604 use bc, only: bc_t_g, bc_x_g
605 use bc, only: bc_scalar, bc_k_turb_g, bc_e_turb_g
606 use bc, only: bc_t_s, bc_x_s, bc_theta_m
607 use fldvar, only: t_g, t_s, theta_m
608 use fldvar, only: x_g, x_s, scalar
609 use fldvar, only: k_turb_g, e_turb_g
610
611 use fldvar, only: rop_s, ro_s, d_p
612 use run, only: kt_type_enum, ghd_2007
613 use run, only: k_epsilon
614 use physprop, only: nmax, smax, mmax
615 use scalars, only: nscalar, phase4scalar
616
617
618
619 use param, only: dimension_m
620 use param1, only: zero
621 use constant, only: pi
622 IMPLICIT NONE
623
624
625
626
627 INTEGER, INTENT(IN) :: BCV
628
629 INTEGER, INTENT(IN) :: IJK
630
631 INTEGER, INTENT(IN) :: FIJK
632
633
634 DOUBLE PRECISION, INTENT(IN) :: RVEL_G, RVEL_S(DIMENSION_M)
635
636
637
638
639 DOUBLE PRECISION :: Nm, NTot
640
641 INTEGER :: M, N, Ms
642
643
644
645 IF (RVEL_G < 0) THEN
646 (IJK) = BC_T_G(BCV)
647 IF (NMAX(0) > 0) &
648 X_G(IJK,:NMAX(0)) = BC_X_G(BCV,:NMAX(0))
649 IF (K_Epsilon) THEN
650 K_Turb_G(IJK) = BC_K_Turb_G(BCV)
651 E_Turb_G(IJK) = BC_E_Turb_G(BCV)
652 ENDIF
653 IF (NScalar > 0) THEN
654 DO N = 1,NScalar
655 Ms = Phase4Scalar(N)
656 IF (Ms == 0) &
657 Scalar(IJK, N) = BC_Scalar(BCV,N)
658 ENDDO
659 ENDIF
660 ELSE
661 (IJK) = T_G(FIJK)
662 IF (NMAX(0) > 0) &
663 X_G(IJK,:NMAX(0)) = X_G(FIJK,:NMAX(0))
664 IF(K_Epsilon) THEN
665 K_Turb_G(IJK) = K_Turb_G(FIJK)
666 E_Turb_G(IJK) = E_Turb_G(FIJK)
667 ENDIF
668 IF (NScalar >0) THEN
669 DO N = 1, NScalar
670 Ms = Phase4Scalar(N)
671 IF (Ms == 0) &
672 Scalar(IJK, N) = Scalar(FIJK, N)
673 ENDDO
674 ENDIF
675 ENDIF
676
677
678 DO M = 1, SMAX
679 IF (RVEL_S(M) < 0) THEN
680 (IJK,M) = BC_T_S(BCV,M)
681 THETA_M(IJK,M) = BC_THETA_M(BCV,M)
682 IF (NMAX(M) > 0) &
683 X_S(IJK,M,:NMAX(M)) = BC_X_S(BCV,M,:NMAX(M))
684 IF (NScalar > 0) THEN
685 DO N = 1,NScalar
686 Ms = Phase4Scalar(N)
687 IF (Ms == M) &
688 Scalar(IJK, N) = BC_Scalar(BCV,N)
689 ENDDO
690 ENDIF
691 ELSE
692 (IJK,M) = T_S(FIJK,M)
693 THETA_M(IJK,M) = THETA_M(FIJK,M)
694 IF (NMAX(M) > 0) &
695 X_S(IJK,M,:NMAX(M)) = X_S(FIJK,M,:NMAX(M))
696 IF (NScalar > 0) THEN
697 DO N = 1,NScalar
698 Ms = Phase4Scalar(N)
699 IF (Ms == M) &
700 Scalar(IJK, N) = Scalar(FIJK,N)
701 ENDDO
702 ENDIF
703 ENDIF
704 ENDDO
705
706
707
708 IF(KT_TYPE_ENUM == GHD_2007) THEN
709 nTOT = zero
710 DO M = 1, SMAX
711 nM = ROP_S(IJK,M)*6d0/ &
712 (PI*D_p(IJK,M)**3*RO_S(IJK,M))
713 nTOT = nTOT + nM
714 THETA_M(IJK,MMAX) = THETA_M(IJK,MMAX) + &
715 nM*THETA_M(IJK,M)
716 ENDDO
717 IF (NTOT > zero) &
718 THETA_M(IJK,MMAX) = THETA_M(IJK,MMAX) / nTOT
719 ENDIF
720
721 RETURN
722 END SUBROUTINE SET_PINOUTFLOW
723