File: N:\mfix\model\drag_gs.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 SUBROUTINE DRAG_GS(M, IER)
22
23
24
25
26 USE compar
27 USE constant
28 USE discretelement
29 USE drag
30 USE fldvar
31 USE fun_avg
32 USE functions
33 USE funits
34 USE geometry
35 USE indices
36 USE machine, only: start_log, end_log
37 USE mms
38 USE parallel
39 USE param
40 USE param1
41 USE physprop
42 USE run, only: syam_obrien, gidaspow, gidaspow_pcf, gidaspow_blend, gidaspow_blend_pcf, wen_yu, wen_yu_pcf, koch_hill, koch_hill_pcf, bvk, user_drag, hys, drag_type, drag_type_enum, ghd_2007, igci, kt_type_enum, milioli, model_b, subgrid_type_enum, undefined_subgrid_type
43 USE sendrecv
44 USE ur_facs
45 IMPLICIT NONE
46
47
48
49
50 INTEGER, INTENT(IN) :: M
51
52 INTEGER, INTENT(INOUT) :: IER
53
54
55
56
57
58
59
60
61 INTEGER :: I, IJK, IMJK, IJMK, IJKM
62
63 DOUBLE PRECISION :: USCM, VSCM, WSCM
64
65 DOUBLE PRECISION :: USCM_HYS, VSCM_HYS, WSCM_HYS
66
67 DOUBLE PRECISION :: UGC, VGC, WGC
68
69 DOUBLE PRECISION :: VREL
70
71
72 DOUBLE PRECISION :: Mu
73
74 DOUBLE PRECISION :: DgA
75
76 DOUBLE PRECISION F_gstmp
77
78 INTEGER :: CM, DM, L
79
80
81 INTEGER :: MAXM
82
83
84 DOUBLE PRECISION :: DP_loc(DIM_M)
85
86
87 DOUBLE PRECISION :: EPs_loc(DIM_M)
88
89
90 DOUBLE PRECISION :: ROs_loc(DIM_M)
91
92
93 DOUBLE PRECISION :: F_cor, tmp_sum, tmp_fac
94
95 DOUBLE PRECISION :: DPA
96
97 DOUBLE PRECISION :: Y_i
98
99 DOUBLE PRECISION :: phis
100
101
102
103 DOUBLE PRECISION :: EPG, ROg, ROPg, EP_SM, DPM, ROs
104
105
106
107
108
109
110
111
112
113
114 DO IJK = ijkstart3, ijkend3
115
116 IF (FLUIDorP_FLOW_AT(IJK)) THEN
117
118 I = I_OF(IJK)
119 IMJK = IM_OF(IJK)
120 IJMK = JM_OF(IJK)
121 IJKM = KM_OF(IJK)
122
123 DO L = 1,DES_MMAX+MMAX
124 IF(KT_TYPE_ENUM == GHD_2007 .AND. M==MMAX) THEN
125
126 (L) = one
127 EPS_loc(L) = zero
128 ROs_loc(L) = zero
129 ENDIF
130 DP_loc(L) = D_p(IJK,L)
131 EPs_loc(L) = EP_S(IJK,L)
132 ROs_loc(L) = RO_S(IJK,L)
133 ENDDO
134
135
136 = AVG_X_E(U_G(IMJK),U_G(IJK),I)
137 VGC = AVG_Y_N(V_G(IJMK),V_G(IJK))
138 WGC = AVG_Z_T(W_G(IJKM),W_G(IJK))
139
140 USCM = AVG_X_E(U_S(IMJK,M),U_S(IJK,M),I)
141 VSCM = AVG_Y_N(V_S(IJMK,M),V_S(IJK,M))
142 WSCM = AVG_Z_T(W_S(IJKM,M),W_S(IJK,M))
143
144
145 = SQRT((UGC-USCM)**2 + (VGC-VSCM)**2 + (WGC-WSCM)**2)
146
147
148
149
150
151 IF (P_FLOW_AT(IJK)) THEN
152 IF( FLUID_AT(EAST_OF(IJK)) ) THEN
153 Mu = MU_G(EAST_OF(IJK))
154 ELSEIF ( FLUID_AT(WEST_OF(IJK)) ) THEN
155 Mu = MU_G(WEST_OF(IJK))
156 ELSEIF ( FLUID_AT(NORTH_OF(IJK)) ) THEN
157 Mu = MU_G(NORTH_OF(IJK))
158 ELSEIF ( FLUID_AT(SOUTH_OF(IJK)) ) THEN
159 Mu = MU_G(SOUTH_OF(IJK))
160 ELSEIF ( FLUID_AT(TOP_OF(IJK)) ) THEN
161 Mu = MU_G(TOP_OF(IJK))
162 ELSEIF ( FLUID_AT(BOTTOM_OF(IJK)) ) THEN
163 Mu = MU_G(BOTTOM_OF(IJK))
164 ENDIF
165 ELSE
166 Mu = MU_G(IJK)
167 ENDIF
168
169
170 = ZERO
171 DO L = 1, DES_MMAX+MMAX
172
173 = phis + EPs_loc(L)
174 ENDDO
175
176
177 = ZERO
178 tmp_sum = ZERO
179 tmp_fac = ZERO
180 DO L = 1, DES_MMAX+MMAX
181 IF (phis .GT. ZERO) THEN
182 tmp_fac = EPs_loc(L)/phis
183 tmp_sum = tmp_sum + tmp_fac/DP_loc(L)
184 ELSE
185 tmp_sum = tmp_sum + ONE/DP_loc(L)
186 ENDIF
187 ENDDO
188 DPA = ONE / tmp_sum
189 Y_i = DP_loc(M)/DPA
190
191
192 = EP_G(IJK)
193 ROg = RO_G(IJK)
194 ROPg = ROP_G(IJK)
195 EP_SM = EPs_loc(M)
196 DPM = DP_loc(M)
197 ROs = ROs_loc(M)
198
199
200
201 IF (EP_SM <= ZERO) THEN
202 DgA = ZERO
203 ELSEIF (EPg == ZERO) THEN
204
205
206
207 = ZERO
208
209 ELSEIF (USE_MMS) THEN
210 DgA = ZERO
211 ELSE
212 SELECT CASE(DRAG_TYPE_ENUM)
213
214 CASE (SYAM_OBRIEN)
215 CALL DRAG_SYAM_OBRIEN(DgA,EPG,Mu,ROg,VREL,DPM)
216
217 CASE (GIDASPOW)
218 CALL DRAG_GIDASPOW(DgA,EPg,Mu,ROg,ROPg,VREL,DPM)
219
220 CASE (GIDASPOW_PCF)
221 CALL DRAG_GIDASPOW(DgA,EPg,Mu,ROg,ROPg,VREL,DPA)
222
223 CASE (GIDASPOW_BLEND)
224 CALL DRAG_GIDASPOW_BLEND(DgA,EPg,Mu,ROg,ROPg,VREL,DPM)
225
226 CASE (GIDASPOW_BLEND_PCF)
227 CALL DRAG_GIDASPOW_BLEND(DgA,EPg,Mu,ROg,ROPg,VREL,DPA)
228
229 CASE (WEN_YU)
230 CALL DRAG_WEN_YU(DgA,EPg,Mu,ROPg,VREL,DPM)
231
232 CASE (WEN_YU_PCF)
233 CALL DRAG_WEN_YU(DgA,EPg,Mu,ROPg,VREL,DPA)
234
235 CASE (KOCH_HILL)
236 CALL DRAG_KOCH_HILL(DgA,EPg,Mu,ROPg,VREL,DPM,DPM,phis)
237
238 CASE (KOCH_HILL_PCF)
239 CALL DRAG_KOCH_HILL(DgA,EPg,Mu,ROPg,VREL,DPM,DPA,phis)
240
241 CASE (BVK)
242 CALL DRAG_BVK(DgA,EPg,Mu,ROPg,VREL,DPM,DPA,phis)
243
244 CASE (USER_DRAG)
245 CALL DRAG_USR(IJK, M, DgA, EPg, Mu, ROg, VREL, DPM, &
246 ROs, UGC, VGC, WGC)
247
248 CASE (HYS)
249
250 = SMAX
251
252 = ZERO
253 VSCM_HYS = ZERO
254 WSCM_HYS = ZERO
255 IF(phis > ZERO) THEN
256 DO L = 1, MAXM
257 USCM_HYS = USCM_HYS + EPs_loc(L)*(UGC - &
258 AVG_X_E(U_S(IMJK,L),U_S(IJK,L),I))
259 VSCM_HYS = VSCM_HYS + EPs_loc(L)*(VGC - &
260 AVG_Y_N(V_S(IJMK,L),V_S(IJK,L)))
261 WSCM_HYS = WSCM_HYS + EPs_loc(L)*(WGC - &
262 AVG_Z_T(W_S(IJKM,L),W_S(IJK,L)))
263 ENDDO
264 USCM_HYS = USCM_HYS/phis
265 VSCM_HYS = VSCM_HYS/phis
266 WSCM_HYS = WSCM_HYS/phis
267 ENDIF
268
269 = SQRT(USCM_HYS**2 +VSCM_HYS**2 +WSCM_HYS**2)
270
271 CALL DRAG_HYS(DgA,EPg,Mu,ROPg,VREL,&
272 DP_loc(:),DPA,Y_i,EPs_loc(:),phis,M,MAXM,IJK)
273
274 CASE DEFAULT
275 CALL START_LOG
276 IF(.NOT.DMP_LOG) call open_pe_log(ier)
277 IF(DMP_LOG) WRITE (*, '(A,A)') &
278 'Unknown DRAG_TYPE: ', DRAG_TYPE
279 WRITE (UNIT_LOG, '(A,A)') 'Unknown DRAG_TYPE: ', DRAG_TYPE
280 CALL END_LOG
281 CALL mfix_exit(myPE)
282 END SELECT
283 ENDIF
284
285
286 IF (SUBGRID_TYPE_ENUM .ne. UNDEFINED_SUBGRID_TYPE) THEN
287 IF (SUBGRID_TYPE_ENUM .EQ. IGCI) THEN
288 CALL SUBGRID_DRAG_IGCI(DgA,EPg,Mu,ROg,DPM,ROs,IJK)
289 ELSEIF (SUBGRID_TYPE_ENUM .EQ. MILIOLI) THEN
290 CALL SUBGRID_DRAG_MILIOLI(DgA,EPg,Mu,ROg,VREL,&
291 DPM,ROs,IJK)
292 ENDIF
293 ENDIF
294
295
296
297
298 IF(DRAG_TYPE_ENUM == HYS) THEN
299
300 IF(Model_B)THEN
301 F_gstmp = DgA/EPg
302 ELSE
303 F_gstmp = DgA
304 ENDIF
305 ELSE
306 IF(DRAG_TYPE_ENUM == GIDASPOW_PCF .OR. &
307 DRAG_TYPE_ENUM == GIDASPOW_BLEND_PCF .OR. &
308 DRAG_TYPE_ENUM == WEN_YU_PCF .OR. &
309 DRAG_TYPE_ENUM == KOCH_HILL_PCF .OR. &
310 DRAG_TYPE_ENUM == BVK) THEN
311
312
313
314
315 IF(Model_B) THEN
316 IF (M == 1) THEN
317 F_cor = (EPg*Y_i + phis*Y_i**2)
318 ELSE
319 F_cor = (EPg*Y_i + phis*Y_i**2 + &
320 0.064d0*EPg*Y_i**3)
321 ENDIF
322 ELSE
323 F_cor = Y_i
324 ENDIF
325 DgA = ONE/(Y_i*Y_i) * DgA * F_cor
326 ENDIF
327
328
329 IF(Model_B)THEN
330 F_gstmp = DgA * EP_SM/EPg
331 ELSE
332 F_gstmp = DgA * EP_SM
333 ENDIF
334 ENDIF
335
336
337 (IJK,M) = (ONE - UR_F_gs)*F_GS(IJK, M) + &
338 UR_F_gs*F_gstmp
339
340 IF(KT_TYPE_ENUM == GHD_2007) THEN
341 IF(M==1) THEN
342 F_gs(IJK,MMAX) = F_gs(IJK,M)
343 ELSE
344 F_gs(IJK,MMAX) = F_gs(IJK,MMAX) + F_gs(IJK,M)
345 ENDIF
346 ENDIF
347
348 ELSE
349
350 (IJK,M) = ZERO
351 IF(KT_TYPE_ENUM == GHD_2007) F_gs(IJK, MMAX) = ZERO
352
353 ENDIF
354
355 ENDDO
356
357 RETURN
358 END SUBROUTINE DRAG_GS
359
360
361
362
363
364 DOUBLE PRECISION FUNCTION C_DSXRE_TL(RE)
365 USE param
366 USE param1
367 IMPLICIT NONE
368 DOUBLE PRECISION, INTENT(IN) :: RE
369
370 = 24.D0*(1.D0 + 0.173D0*RE**0.657D0) + &
371 0.413D0*RE**2.09D0/(RE**1.09D0 + 16300.D0)
372 RETURN
373 END FUNCTION C_DSXRE_TL
374
375
376
377
378
379
380
381
382
383
384
385
386
387 SUBROUTINE DRAG_SYAM_OBRIEN(lDgA,EPg,Mug,ROg,VREL,&
388 DPM)
389
390
391
392
393 USE constant, only : drag_c1, drag_d1
394 USE drag
395 USE param
396 USE param1
397 IMPLICIT NONE
398
399
400
401
402 DOUBLE PRECISION, INTENT(OUT) :: ldGA
403
404 DOUBLE PRECISION, INTENT(IN) :: EPg
405
406 DOUBLE PRECISION, INTENT(IN) :: Mug
407
408 DOUBLE PRECISION, INTENT(IN) :: ROg
409
410 DOUBLE PRECISION, INTENT(IN) :: VREL
411
412 DOUBLE PRECISION, INTENT(IN) :: DPM
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429 DOUBLE PRECISION :: A, BB
430
431
432 DOUBLE PRECISION :: V_rm
433
434 DOUBLE PRECISION :: RE
435
436
437 IF(Mug > ZERO) THEN
438 RE = DPM*VREL*ROg/Mug
439 ELSE
440 RE = LARGE_NUMBER
441 ENDIF
442
443
444 = EPg**4.14D0
445 IF (EPg <= 0.85D0) THEN
446 BB = drag_c1*EPg**1.28D0
447 ELSE
448 BB = EPg**drag_d1
449 ENDIF
450
451 V_RM=HALF*(A-0.06D0*RE+&
452 SQRT((3.6D-3)*RE*RE+0.12D0*RE*(2.D0*BB-A)+A*A) )
453
454
455
456
457
458
459
460
461 = 0.75D0*Mug*EPg*C_DSXRE_DV(RE/V_RM)/(V_RM*DPM*DPM)
462
463 IF (RE == ZERO) lDgA = ZERO
464
465 RETURN
466
467 END SUBROUTINE DRAG_SYAM_OBRIEN
468
469
470
471
472
473
474
475
476
477
478
479 SUBROUTINE DRAG_GIDASPOW(lDgA,EPg,Mug,ROg,ROPg,VREL, DPM)
480
481
482
483
484 USE drag
485 USE param
486 USE param1
487 IMPLICIT NONE
488
489
490
491
492 DOUBLE PRECISION, INTENT(OUT) :: lDgA
493
494 DOUBLE PRECISION, INTENT(IN) :: EPg
495
496 DOUBLE PRECISION, INTENT(IN) :: Mug
497
498 DOUBLE PRECISION, INTENT(IN) :: ROg
499
500 DOUBLE PRECISION, INTENT(IN) :: ROPg
501
502 DOUBLE PRECISION, INTENT(IN) :: VREL
503
504
505 DOUBLE PRECISION, INTENT(IN) :: DPM
506
507
508
509
510
511 DOUBLE PRECISION :: RE
512
513 DOUBLE PRECISION :: C_d
514
515
516
517 = merge(DPM*VREL*ROPg/Mug, LARGE_NUMBER, MUg > ZERO)
518
519
520 IF(EPg <= 0.8D0) THEN
521 lDgA = 150D0*(ONE-EPg)*Mug / (EPg*DPM**2) + &
522 1.75D0*ROg*VREL/DPM
523 ELSE
524
525 IF(RE <= 1000D0)THEN
526
527 = C_DS_SN(RE)
528 ELSE
529 C_d = 0.44D0
530 ENDIF
531 lDgA = 0.75D0*C_d*VREL*ROPg*EPg**(-2.65D0) / DPM
532 ENDIF
533
534 IF (RE == ZERO) lDgA = ZERO
535
536 RETURN
537
538 END SUBROUTINE DRAG_GIDASPOW
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556 SUBROUTINE DRAG_GIDASPOW_BLEND(lDgA,EPg,Mug,ROg,ROPg,VREL,&
557 DPM)
558
559
560
561
562 USE param
563 USE param1
564 USE constant, only : PI
565 IMPLICIT NONE
566
567
568
569
570 DOUBLE PRECISION, INTENT(OUT) :: lDgA
571
572 DOUBLE PRECISION, INTENT(IN) :: EPg
573
574 DOUBLE PRECISION, INTENT(IN) :: Mug
575
576 DOUBLE PRECISION, INTENT(IN) :: ROg
577
578 DOUBLE PRECISION, INTENT(IN) :: ROPg
579
580 DOUBLE PRECISION, INTENT(IN) :: VREL
581
582
583 DOUBLE PRECISION, INTENT(IN) :: DPM
584
585
586
587
588 DOUBLE PRECISION :: RE
589
590 DOUBLE PRECISION :: C_d
591
592 DOUBLE PRECISION :: Ergun
593 DOUBLE PRECISION :: WenYu
594 DOUBLE PRECISION :: PHI_gs
595
596
597 IF(Mug > ZERO) THEN
598
599 = DPM*VREL*ROPg/Mug
600 ELSE
601 RE = LARGE_NUMBER
602 ENDIF
603
604
605 = 150D0*(ONE-EPg)*Mug / (EPg*DPM**2) + &
606 1.75D0*ROg*VREL/DPM
607
608 IF(RE <= 1000D0)THEN
609 C_d = (24.D0/(RE+SMALL_NUMBER)) * &
610 (ONE + 0.15D0 * RE**0.687D0)
611 ELSE
612 C_d = 0.44D0
613 ENDIF
614 WenYu = 0.75D0*C_d*VREL*ROPg*EPg**(-2.65D0) / DPM
615
616
617 = ATAN(150.D0*1.75D0*(EPg - 0.8D0))/PI + 0.5D0
618
619
620 = (1.D0-PHI_gs)*Ergun + PHI_gs*WenYu
621 IF (RE == ZERO) lDgA = ZERO
622
623 RETURN
624 END SUBROUTINE DRAG_GIDASPOW_BLEND
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639 SUBROUTINE DRAG_WEN_YU(lDgA,EPg,Mug,ROPg,VREL,DPM)
640
641
642
643
644 USE param
645 USE param1
646 IMPLICIT NONE
647
648
649
650
651 DOUBLE PRECISION, INTENT(OUT) :: lDgA
652
653 DOUBLE PRECISION, INTENT(IN) :: EPg
654
655 DOUBLE PRECISION, INTENT(IN) :: Mug
656
657 DOUBLE PRECISION, INTENT(IN) :: ROPg
658
659 DOUBLE PRECISION, INTENT(IN) :: VREL
660
661
662 DOUBLE PRECISION, INTENT(IN) :: DPM
663
664
665
666
667 DOUBLE PRECISION :: RE
668
669 DOUBLE PRECISION :: C_d
670
671
672 IF(Mug > ZERO) THEN
673
674 = DPM*VREL*ROPg/Mug
675 ELSE
676 RE = LARGE_NUMBER
677 ENDIF
678
679 IF(RE <= 1000.0D0)THEN
680 C_d = (24.D0/(RE+SMALL_NUMBER)) * (ONE + 0.15D0*RE**0.687D0)
681 ELSE
682 C_d = 0.44D0
683 ENDIF
684
685 lDgA = 0.75D0 * C_d * VREL * ROPg * EPg**(-2.65D0) / DPM
686 IF (RE == ZERO) lDgA = ZERO
687
688 RETURN
689 END SUBROUTINE DRAG_WEN_YU
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715 SUBROUTINE SUBGRID_DRAG_IGCI(lDgA,EPg,Mug,ROg,DPM,ROs,IJK)
716
717
718
719
720 USE param
721 USE param1
722 USE run, only : filter_size_ratio, SUBGRID_WALL
723 USE constant, only : GRAVITY
724 USE geometry, only : VOL,AXY,DO_K
725 IMPLICIT NONE
726
727
728
729
730 DOUBLE PRECISION, INTENT(INOUT) :: lDgA
731
732 DOUBLE PRECISION, INTENT(IN) :: EPg
733
734 DOUBLE PRECISION, INTENT(IN) :: Mug
735
736 DOUBLE PRECISION, INTENT(IN) :: ROg
737
738 DOUBLE PRECISION, INTENT(IN) :: DPM
739
740 DOUBLE PRECISION, INTENT(IN) :: ROs
741
742 INTEGER, INTENT(IN) :: IJK
743
744
745
746
747 DOUBLE PRECISION :: F_Subgrid
748
749
750 DOUBLE PRECISION :: F_SubGridWall
751
752 DOUBLE PRECISION :: vt
753
754 DOUBLE PRECISION :: filtersize
755
756 DOUBLE PRECISION :: Inv_Froude
757
758 DOUBLE PRECISION :: EPs
759
760 DOUBLE PRECISION :: GG_phip, h_phip, h_phip2, c_function,&
761 f_filter
762
763
764
765 = ONE
766 F_SubgridWall = ONE
767
768
769 = GRAVITY*DPM*DPM*(ROs - ROg) / (18.0d0*Mug)
770
771 IF(DO_K) THEN
772 filtersize = filter_size_ratio * (VOL(IJK)**(ONE/3.0d0))
773 ELSE
774 filtersize = filter_size_ratio * DSQRT(AXY(IJK))
775 ENDIF
776
777
778 IF(ABS(vt) > SMALL_NUMBER) THEN
779 Inv_Froude = filtersize * GRAVITY / vt**2
780 ELSE
781 Inv_Froude = LARGE_NUMBER
782 ENDIF
783
784
785 = ONE - EPg
786
787 IF (EPs .LT. 0.0012d0) THEN
788 h_phip = 2.7d0*(EPs**0.234)
789 ELSEIF (EPs .LT. 0.014d0) THEN
790 h_phip = -0.019d0/(EPs**0.455) + 0.963d0
791 ELSEIF (EPs .LT. 0.25d0) THEN
792 h_phip = 0.868d0*EXP((-0.38*EPs)) - &
793 0.176d0*EXP((-119.2*EPs))
794 ELSEIF (EPs .LT. 0.455d0) THEN
795 h_phip = -4.59d-5*EXP((19.75*EPs)) + &
796 0.852d0*EXP((-0.268*EPs))
797 ELSEIF (EPs .LE. 0.59d0) THEN
798 h_phip = (EPs - 0.59d0) * (-1501.d0*(EPs**3) + &
799 2203.d0*(EPs**2) - 1054.d0*EPs + 162.d0)
800 ELSE
801 h_phip=ZERO
802 ENDIF
803
804 IF (EPs .LT. 0.18d0) THEN
805 GG_phip = (EPs**0.24)*(1.48d0 + EXP(-18.0*EPs))
806 ELSE
807 GG_phip = ONE
808 ENDIF
809
810
811 = (Inv_Froude**1.6) / ((Inv_Froude**1.6)+0.4d0)
812 h_phip2=h_phip*GG_phip
813 c_function=-h_phip2*f_filter
814 F_Subgrid =(ONE + c_function)
815
816 IF (SUBGRID_WALL) THEN
817 CALL SUBGRID_DRAG_WALL(F_SubgridWall,vt,IJK)
818 ENDIF
819
820 lDgA = F_SubgridWall*F_Subgrid * lDgA
821
822 RETURN
823 END SUBROUTINE SUBGRID_DRAG_IGCI
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850 SUBROUTINE SUBGRID_DRAG_MILIOLI(lDgA,EPg,Mug,ROg,VREL,DPM,ROs,&
851 IJK)
852
853
854
855
856 USE param
857 USE param1
858 USE run, only : filter_size_ratio, SUBGRID_WALL
859 USE constant, only : GRAVITY
860 USE geometry, only : VOL,AXY,DO_K
861 IMPLICIT NONE
862
863
864
865
866 DOUBLE PRECISION, INTENT(INOUT) :: lDgA
867
868 DOUBLE PRECISION, INTENT(IN) :: EPg
869
870 DOUBLE PRECISION, INTENT(IN) :: Mug
871
872 DOUBLE PRECISION, INTENT(IN) :: ROg
873
874 DOUBLE PRECISION, INTENT(IN) :: VREL
875
876 DOUBLE PRECISION, INTENT(IN) :: DPM
877
878 DOUBLE PRECISION, INTENT(IN) :: ROs
879
880 INTEGER, INTENT(IN) :: IJK
881
882
883
884
885 DOUBLE PRECISION :: F_Subgrid
886
887
888 DOUBLE PRECISION :: F_SubGridWall
889
890 DOUBLE PRECISION :: vt
891
892 DOUBLE PRECISION :: filtersize
893
894 DOUBLE PRECISION :: Inv_Froude
895
896 DOUBLE PRECISION :: vslip
897
898 DOUBLE PRECISION :: EPs
899
900 DOUBLE PRECISION :: h1, henv, hlin
901
902
903
904 = ONE
905 F_SubgridWall = ONE
906
907
908 = GRAVITY*DPM*DPM*(ROs - ROg) / (18.0d0*Mug)
909
910 IF(DO_K) THEN
911 filtersize = filter_size_ratio * (VOL(IJK)**(ONE/3.0d0))
912 ELSE
913 filtersize = filter_size_ratio * DSQRT(AXY(IJK))
914 ENDIF
915
916 IF(ABS(vt) > SMALL_NUMBER) THEN
917 Inv_Froude = filtersize * GRAVITY / vt**2
918 ELSE
919 Inv_Froude = LARGE_NUMBER
920 ENDIF
921
922 = ONE - EPg
923
924 = VREL / vt
925
926 IF (Inv_Froude .LE. 1.028d0) THEN
927 h1 = (1.076d0 + 0.12d0*Vslip - (0.02d0/(Vslip+0.01d0)))*EPs + &
928 (0.084d0 + 0.09d0*Vslip - (0.01d0/(0.1d0*Vslip+0.01d0)))
929 IF (EPs .LE. 0.53d0) THEN
930 henv = (6.8d0*(ONE+EPs)*(EPs**0.3)) / &
931 (10.d0*(EPs**1.5) + 5.d0)
932 ELSEIF (EPs .GT. 0.53d0 .AND. EPs .LE. 0.65d0) THEN
933 henv = (2.23d0*((0.65d0-EPs)**(0.45))) / &
934 ((ONE/EPs)-ONE)
935 ELSEIF (EPs .GT. 0.65d0) THEN
936 henv=ZERO
937 ENDIF
938
939 ELSEIF (Inv_Froude .GT. 1.028d0 .AND. &
940 Inv_Froude .LE. 2.056d0) THEN
941 h1 = (1.268d0 - (0.2d0*Vslip) + (0.14d0/(Vslip+0.01d0)))*EPs + &
942 (0.385d0 + 0.09d0*Vslip - (0.05d0/(0.2d0*Vslip+0.01d0)))
943 IF (EPs .LE. 0.53d0) THEN
944 henv = (8.6d0*(ONE+EPs)*(EPs**0.2)) / (10.d0*EPs + 6.3d0)
945 ELSEIF (EPs .GT. 0.53d0 .AND. EPs .LE. 0.65d0) THEN
946 henv = (0.423d0*((0.65d0-EPs)**0.3)) / (ONE-(EPs**0.4))
947 ELSEIF (EPs .GT. 0.65d0) THEN
948 henv=ZERO
949 ENDIF
950
951 ELSEIF (Inv_Froude .GT. 2.056d0 .AND. &
952 Inv_Froude .LE. 4.112d0) THEN
953 h1 = ((0.018d0*Vslip + 0.1d0)/(0.14d0*Vslip + 0.01d0))*EPs + &
954 (0.9454d0 - (0.09d0/(0.2d0*Vslip + 0.01d0)))
955 IF (EPs .LE. 0.5d0) THEN
956 henv = (7.9d0*(ONE+EPs)*(EPs**0.2)) / &
957 (10.d0*(EPs**0.9) + 5.d0)
958 ELSEIF (EPs .GT. 0.5d0 .AND. EPs .LE. 0.63d0) THEN
959 henv = (0.705d0*((0.63d0-EPs)**0.3)) / (ONE-(EPs**0.7))
960 ELSEIF (EPs .GT. 0.63d0) THEN
961 henv=ZERO
962 ENDIF
963
964 ELSEIF (Inv_Froude .GT. 4.112d0 .AND. &
965 Inv_Froude .LE. 8.224d0) THEN
966 h1 = ((0.05d0*Vslip+0.3d0)/(0.4d0*Vslip+0.06d0))*EPs + &
967 (0.9466d0 - (0.05d0/(0.11d0*Vslip+0.01d0)))
968 IF (EPs .LE. 0.45d0) THEN
969 henv = (7.9d0*(ONE+EPs)*(EPs**0.2)) / &
970 ((10.d0*(EPs**0.6)) + 3.6d0)
971 ELSEIF (EPs .GT. 0.45d0 .AND. EPs .LE. 0.57d0) THEN
972 henv = (0.78d0*((0.57d0-EPs)**0.2)) / (ONE-(EPs**0.9))
973 ELSEIF (EPs .GT. 0.57d0) THEN
974 henv=ZERO
975 ENDIF
976
977 ELSEIF (Inv_Froude .GT. 8.224d0 .AND. &
978 Inv_Froude .LE. 12.336d0) THEN
979 h1 = ((1.3d0*Vslip+2.2d0)/(5.2d0*Vslip+0.07d0))*EPs + &
980 (0.9363d0-(0.11d0/(0.3d0*Vslip+0.01d0)))
981 IF (EPs .LE. 0.35d0) THEN
982 henv = (7.6d0*(ONE+EPs)*(EPs**0.2)) / &
983 ((10.d0*(EPs**0.6)) + 3.3d0)
984 ELSEIF (EPs .GT. 0.35d0 .AND. EPs .LE. 0.55d0) THEN
985 henv = (0.81d0*((0.55d0-EPs)**0.3)) / (ONE-(EPs**0.7))
986 ELSEIF (EPs .GT. 0.55d0) THEN
987 henv=ZERO
988 ENDIF
989
990 ELSEIF (Inv_Froude .GT. 12.336d0 .AND. &
991 Inv_Froude .LE. 16.448d0) THEN
992 h1 = ((2.6d0*Vslip+4.d0)/(10.d0*Vslip+0.08d0))*EPs + &
993 (0.926d0-(0.17d0/(0.5d0*Vslip+0.01d0)))
994 IF (EPs .LE. 0.25d0) THEN
995 henv = (8.4d0*(ONE+EPs)*(EPs**0.2)) / &
996 ((10.d0*(EPs**0.5)) + 3.3d0)
997 ELSEIF (EPs .GT. 0.25d0 .AND. EPs .LE. 0.52d0) THEN
998 henv = (1.01d0*((0.52d0-EPs)**0.03))/(ONE-(EPs**0.9))
999 ELSEIF (EPs .GT. 0.52d0) THEN
1000 henv=ZERO
1001 ENDIF
1002
1003 ELSEIF (Inv_Froude .GT. 16.448d0 .AND. &
1004 Inv_Froude .LE. 20.56d0) THEN
1005 h1 = ((2.5d0*Vslip+4.d0)/(10.d0*Vslip+0.08d0))*EPs + &
1006 (0.9261d0-(0.17d0/(0.5d0*Vslip+0.01d0)))
1007 IF (EPs .LE. 0.25d0) THEN
1008 henv = (8.4d0*(ONE+EPs)*(EPs**0.2)) / &
1009 ((10.d0*(EPs**0.5)) + 3.3d0)
1010 ELSEIF (EPs .GT. 0.25d0 .AND. EPs .LE. 0.52d0) THEN
1011 henv = (1.065d0*((0.52d0-EPs)**0.3))/(ONE-EPs)
1012 ELSEIF (EPs .GT.0.52d0) THEN
1013 henv=ZERO
1014 ENDIF
1015
1016 ELSEIF (Inv_Froude .GT. 20.56d0) THEN
1017 h1 = ((1.6d0*Vslip+4.d0)/(7.9d0*Vslip+0.08d0))*EPs + &
1018 (0.9394d0 - (0.22d0/(0.6d0*Vslip+0.01d0)))
1019 IF (EPs .LE. 0.25d0) THEN
1020 henv = (9.d0*(ONE+EPs)*(EPs**0.15)) / &
1021 (10.d0*(EPs**0.45) + 4.2d0)
1022 ELSEIF (EPs .GT. 0.25d0 .AND. EPs .LE. 0.52d0) THEN
1023 henv = (0.91d0*((0.52d0-EPs)**0.4))/(ONE-(EPs**0.6))
1024 ELSEIF (EPs .GT. 0.52d0) THEN
1025 henv=ZERO
1026 ENDIF
1027 ENDIF
1028
1029 IF (h1 .GT. ZERO) THEN
1030 hlin=h1
1031 ELSE
1032 hlin=ZERO
1033 ENDIF
1034
1035 IF (Inv_Froude .LT. 1.028d0) THEN
1036
1037
1038 = ONE
1039 ELSE
1040
1041 = ONE - MIN(henv,hlin)
1042 ENDIF
1043
1044
1045
1046
1047 IF (SUBGRID_WALL) THEN
1048 CALL SUBGRID_DRAG_WALL(F_SubgridWall,vt,IJK)
1049 ENDIF
1050
1051 lDgA = F_SubgridWall*F_Subgrid * lDgA
1052
1053
1054 RETURN
1055 END SUBROUTINE SUBGRID_DRAG_MILIOLI
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081 SUBROUTINE SUBGRID_DRAG_WALL(lSubgridWall,vt,IJK)
1082
1083
1084
1085
1086 USE param
1087 USE param1
1088 USE constant, only : GRAVITY
1089 USE cutcell, only : DWALL
1090 IMPLICIT NONE
1091
1092
1093
1094
1095
1096 DOUBLE PRECISION, INTENT(OUT) :: lSubGridWall
1097
1098 DOUBLE PRECISION, INTENT(IN) :: vt
1099
1100 INTEGER, INTENT(IN) :: IJK
1101
1102
1103
1104
1105 DOUBLE PRECISION, PARAMETER :: a22=6.0d0, b22=0.295d0
1106
1107
1108
1109
1110 DOUBLE PRECISION :: x_d
1111
1112
1113 = ONE
1114
1115
1116 = DWALL(IJK) * GRAVITY / vt**2
1117
1118
1119
1120 = ONE / ( ONE + a22 * (EXP(-b22*x_d)) )
1121
1122 RETURN
1123 END SUBROUTINE SUBGRID_DRAG_WALL
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147 SUBROUTINE DRAG_KOCH_HILL(lDgA,EPg,Mug,ROPg,VREL,&
1148 DPM,DPA,PHIS)
1149
1150
1151
1152
1153 USE param
1154 USE param1
1155 IMPLICIT NONE
1156
1157
1158
1159
1160 DOUBLE PRECISION, INTENT(OUT) :: lDgA
1161
1162 DOUBLE PRECISION, INTENT(IN) :: EPg
1163
1164 DOUBLE PRECISION, INTENT(IN) :: Mug
1165
1166 DOUBLE PRECISION, INTENT(IN) :: ROPg
1167
1168 DOUBLE PRECISION, INTENT(IN) :: VREL
1169
1170 DOUBLE PRECISION, INTENT(IN) :: DPM
1171
1172 DOUBLE PRECISION, INTENT(IN) :: DPA
1173
1174 DOUBLE PRECISION, INTENT(IN) :: PHIS
1175
1176
1177
1178
1179 DOUBLE PRECISION :: RE
1180
1181 DOUBLE PRECISION :: Re_Trans_1, Re_Trans_2
1182
1183 DOUBLE PRECISION :: F_STOKES
1184
1185 DOUBLE PRECISION :: F_0
1186
1187 DOUBLE PRECISION :: F_1
1188
1189 DOUBLE PRECISION :: F_2
1190
1191 DOUBLE PRECISION :: F_3
1192
1193 DOUBLE PRECISION :: F
1194
1195 DOUBLE PRECISION :: ww
1196
1197
1198
1199 IF(Mug > ZERO) THEN
1200
1201 = 0.5D0*DPA*VREL*ROPG/Mug
1202 ELSE
1203 RE = LARGE_NUMBER
1204 ENDIF
1205
1206 F_STOKES = 18.D0*Mug*EPg*EPg/DPM**2
1207 = EXP(-10.0D0*(0.4D0-phis)/phis)
1208
1209 IF(phis > 0.01D0 .AND. phis < 0.4D0) THEN
1210 F_0 = (1.0D0-ww) * (1.0D0 + 3.0D0*dsqrt(phis/2.0D0) + &
1211 135.0D0/64.0D0*phis*LOG(phis) + 17.14D0*phis) / &
1212 (1.0D0 + 0.681D0*phis - 8.48D0*phis*phis + &
1213 8.16D0*phis**3) + ww*10.0D0*phis/(1.0D0-phis)**3
1214 ELSEIF(phis >= 0.4D0) THEN
1215 F_0 = 10.0D0*phis/(1.0D0-phis)**3
1216 ENDIF
1217
1218 IF(phis > 0.01D0 .AND. phis <= 0.1D0) THEN
1219 F_1 = dsqrt(2.0D0/phis) / 40.0D0
1220 ELSE IF(phis > 0.1D0) THEN
1221 F_1 = 0.11D0 + 5.1D-04 * exp(11.6D0*phis)
1222 ENDIF
1223
1224 IF(phis < 0.4D0) THEN
1225 F_2 = (1.0D0-ww) * (1.0D0 + 3.0D0*dsqrt(phis/2.0D0) + &
1226 135.0D0/64.0D0*phis*LOG(phis) + 17.89D0*phis) / &
1227 (1.0D0 + 0.681D0*phis - 11.03D0*phis*phis + &
1228 15.41D0*phis**3)+ ww*10.0D0*phis/(1.0D0-phis)**3
1229 ELSE
1230 F_2 = 10.0D0*phis/(1.0D0-phis)**3
1231 ENDIF
1232
1233 IF(phis < 0.0953D0) THEN
1234 F_3 = 0.9351D0*phis + 0.03667D0
1235 ELSE
1236 F_3 = 0.0673D0 + 0.212D0*phis +0.0232D0/(1.0-phis)**5
1237 ENDIF
1238
1239 Re_Trans_1 = (F_2 - 1.0D0)/(3.0D0/8.0D0 - F_3)
1240 Re_Trans_2 = (F_3 + dsqrt(F_3*F_3 - 4.0D0*F_1 &
1241 *(F_0-F_2))) / (2.0D0*F_1)
1242
1243 IF(phis <= 0.01D0 .AND. RE <= Re_Trans_1) THEN
1244 F = 1.0D0 + 3.0D0/8.0D0*RE
1245 ELSEIF(phis > 0.01D0 .AND. RE <= Re_Trans_2) THEN
1246 F = F_0 + F_1*RE*RE
1247 ELSEIF(phis <= 0.01D0 .AND. RE > Re_Trans_1 .OR. &
1248 phis > 0.01D0 .AND. RE > Re_Trans_2) THEN
1249 F = F_2 + F_3*RE
1250 ELSE
1251 F = zero
1252 ENDIF
1253
1254 lDgA = F * F_STOKES
1255 IF (RE == ZERO) lDgA = ZERO
1256
1257 RETURN
1258 END SUBROUTINE DRAG_KOCH_HILL
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273 SUBROUTINE DRAG_BVK(lDgA,EPg,Mug,ROPg,VREL,&
1274 DPM,DPA,PHIS)
1275
1276
1277
1278
1279 USE param
1280 USE param1
1281 IMPLICIT NONE
1282
1283
1284
1285
1286 DOUBLE PRECISION, INTENT(OUT) :: lDgA
1287
1288 DOUBLE PRECISION, INTENT(IN) :: EPg
1289
1290 DOUBLE PRECISION, INTENT(IN) :: Mug
1291
1292 DOUBLE PRECISION, INTENT(IN) :: ROPg
1293
1294 DOUBLE PRECISION, INTENT(IN) :: VREL
1295
1296 DOUBLE PRECISION, INTENT(IN) :: DPM
1297
1298 DOUBLE PRECISION, INTENT(IN) :: DPA
1299
1300 DOUBLE PRECISION, INTENT(IN) :: PHIS
1301
1302
1303
1304
1305 DOUBLE PRECISION :: RE
1306
1307 DOUBLE PRECISION :: F_STOKES
1308
1309 DOUBLE PRECISION :: F
1310
1311
1312 IF(Mug > ZERO) THEN
1313
1314 = DPA*VREL*ROPg/Mug
1315 ELSE
1316 RE = LARGE_NUMBER
1317 ENDIF
1318
1319
1320
1321 = 18D0*Mug*EPg/DPM**2
1322
1323 = 10d0*phis/EPg**2 + EPg**2*(ONE+1.5d0*DSQRT(phis))
1324 F = F + 0.413d0*RE/(24.d0*EPg**2) * &
1325 (ONE/EPg + 3d0*EPg*phis + 8.4d0/RE**0.343) / &
1326 (ONE+10.d0**(3d0*phis)/RE**(0.5+2.d0*phis))
1327
1328 lDgA = F*F_STOKES
1329 IF (RE == ZERO) lDgA = ZERO
1330
1331 RETURN
1332 END SUBROUTINE DRAG_BVK
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347 SUBROUTINE DRAG_HYS(lDgA,EPg,Mug,ROPg,VREL,&
1348 DPM,DPA,Y_I,EP_sM,PHIS,M,MAXM,IJK)
1349
1350
1351
1352
1353 USE param
1354 USE param1
1355 USE drag, only : beta_ij
1356 USE run, only : LAM_HYS
1357 IMPLICIT NONE
1358
1359
1360
1361
1362 DOUBLE PRECISION, INTENT(OUT) :: lDgA
1363
1364 DOUBLE PRECISION, INTENT(IN) :: EPg
1365
1366 DOUBLE PRECISION, INTENT(IN) :: Mug
1367
1368 DOUBLE PRECISION, INTENT(IN) :: ROPg
1369
1370 DOUBLE PRECISION, INTENT(IN) :: VREL
1371
1372 DOUBLE PRECISION :: DPM(DIM_M)
1373
1374 DOUBLE PRECISION, INTENT(IN) :: DPA
1375
1376 DOUBLE PRECISION, INTENT(IN) :: Y_i
1377
1378 DOUBLE PRECISION :: EP_sM(DIM_M)
1379
1380 DOUBLE PRECISION, INTENT(IN) :: PHIS
1381
1382 INTEGER, INTENT(IN) :: M, IJK
1383
1384 INTEGER, INTENT(IN) :: MAXM
1385
1386
1387
1388
1389 DOUBLE PRECISION :: DPmin
1390
1391 INTEGER :: L
1392
1393 DOUBLE PRECISION :: RE
1394
1395 DOUBLE PRECISION :: F_STOKES
1396
1397 DOUBLE PRECISION :: F
1398
1399 DOUBLE PRECISION :: a_YS
1400
1401 DOUBLE PRECISION :: alpha_YS
1402
1403 DOUBLE PRECISION :: beta_i_HYS
1404
1405 DOUBLE PRECISION :: beta_j_HYS
1406
1407 DOUBLE PRECISION :: FSTOKES_j
1408
1409 DOUBLE PRECISION :: Y_i_J
1410
1411 DOUBLE PRECISION :: F_D_BVK
1412
1413 DOUBLE PRECISION :: F_YS
1414
1415
1416 IF (Mug > ZERO) THEN
1417
1418 = DPA*VREL*ROPg/Mug
1419 ELSE
1420 RE = LARGE_NUMBER
1421 ENDIF
1422
1423
1424
1425 = 18D0*Mug*EPg*EP_SM(M)/DPM(M)**2
1426
1427
1428 = DPM(1)
1429 IF (MAXM > 1) THEN
1430 DO L=2,MAXM
1431 Dpmin = MIN(Dpmin,DPM(L))
1432 ENDDO
1433 ENDIF
1434
1435 a_YS = 1d0 - 2.66d0*phis + 9.096d0*phis**2 - 11.338d0*phis**3
1436
1437
1438
1439 = 1.313d0*LOG10(DPmin/lam_HYS) - 1.249d0
1440
1441
1442
1443 = ZERO
1444 F = 10.d0*phis/EPg**2 + EPg**2*(ONE+1.5d0*DSQRT(phis))
1445
1446 IF(RE > ZERO) F_D_BVK = F + 0.413d0*RE/(24.d0*EPg**2)*&
1447 (ONE/EPg + 3.d0*EPg*phis + 8.4d0/RE**0.343d0) / &
1448 (ONE+10**(3.d0*phis)/RE**(0.5d0+2.d0*phis))
1449
1450
1451 = 1d0/EPg + (F_D_BVK - 1d0/EPg)*&
1452 (a_YS*Y_i+(1d0-a_YS)*Y_i**2)
1453 F_YS = F_YS*F_STOKES
1454 beta_i_HYS = F_YS
1455
1456 DO L= 1,MAXM
1457 IF (L /= M) THEN
1458 Y_i_J = DPM(L)/DPA
1459 beta_j_HYS = 1.d0/EPg + (F_D_BVK - 1.d0/EPg) * &
1460 (a_YS*Y_i_J + (1d0-a_YS)*Y_i_J**2)
1461 FSTOKES_j = 18.D0*Mug*EP_sM(L)*EPg/&
1462 DPM(L)**2
1463
1464 beta_j_HYS = beta_j_HYS*FSTOKES_j
1465
1466
1467 (IJK,M,L) = ZERO
1468
1469
1470 IF (EP_sM(M) > ZERO .AND. EP_SM(L) > ZERO) &
1471 beta_ij(IJK,M,L) = (2.d0*alpha_YS*EP_sM(M)*EP_sM(L))/ &
1472 (EP_sM(M)/beta_i_HYS + EP_sM(L)/beta_j_HYS)
1473 F_YS = F_YS + beta_ij(IJK,M,L)
1474
1475 ENDIF
1476 ENDDO
1477
1478
1479 = F_YS
1480
1481 RETURN
1482 END SUBROUTINE DRAG_HYS
1483