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