File: N:\mfix\model\source_u_g.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 SUBROUTINE SOURCE_U_G(A_M, B_M)
24
25
26
27 USE bodyforce, only: bfx_g
28 USE bc, only: delp_x
29
30 USE compar, only: ijkstart3, ijkend3, imap
31
32 USE drag, only: f_gs, beta_ij
33 USE fldvar, only: p_g, ro_g, rop_g, rop_go, rop_s
34 USE fldvar, only: ep_g, ep_s, epg_jfac
35 USE fldvar, only: u_g, w_g, u_go, u_s, v_s, w_s, u_so
36
37 USE fun_avg, only: avg_x, avg_z, avg_y
38 USE fun_avg, only: avg_x_e, avg_y_n, avg_z_t
39 USE functions, only: ip_at_e, sip_at_e, is_id_at_e
40 USE functions, only: ip_of, jp_of, kp_of, im_of, jm_of, km_of
41 USE functions, only: east_of, west_of
42 USE functions, only: zmax
43 USE geometry, only: imax1, cyclic_x_pd, cylindrical, do_k
44 USE geometry, only: vol, vol_u
45 USE geometry, only: axy, ayz, axz, ox_e
46
47 USE ghdtheory, only: joix
48
49 USE indices, only: i_of, j_of, k_of
50 USE indices, only: ip1, jm1, km1
51 USE is, only: is_pc
52
53 USE mms, only: use_mms, mms_u_g_src
54 USE param
55 USE param1, only: zero, one, half
56 USE physprop, only: mmax, smax
57 USE physprop, only: mu_g, cv
58 USE run, only: momentum_x_eq
59 USE run, only: model_b, added_mass, m_am
60 USE run, only: kt_type_enum, drag_type_enum
61 USE run, only: ghd_2007, hys
62 USE run, only: odt
63 USE rxns, only: sum_r_g
64 USE scales, only: p_scale
65 USE tau_g, only: tau_u_g
66 USE toleranc, only: dil_ep_s
67 USE visc_g, only: epmu_gt
68 USE cutcell, only: cartesian_grid, cut_u_treatment_at
69 USE cutcell, only: blocked_u_cell_at
70 USE cutcell, only: a_upg_e, a_upg_w
71 IMPLICIT NONE
72
73
74
75
76 DOUBLE PRECISION, INTENT(INOUT) :: A_m(DIMENSION_3, -3:3, 0:DIMENSION_M)
77
78 DOUBLE PRECISION, INTENT(INOUT) :: B_m(DIMENSION_3, 0:DIMENSION_M)
79
80
81
82
83 INTEGER :: I, J, K, IJK, IJKE, IPJK, IJKM, &
84 IPJKM, IMJK, IJMK, IPJMK, IJPK, IJKP
85
86 INTEGER :: M, L, MM
87
88 INTEGER :: ISV
89
90 DOUBLE PRECISION :: PgE
91
92 DOUBLE PRECISION :: EPGA, EPGAJ
93
94 DOUBLE PRECISION :: ROPGA, ROGA
95
96 DOUBLE PRECISION :: MUGA, MUGTA
97
98 DOUBLE PRECISION :: Wge
99
100 DOUBLE PRECISION :: Sdp
101
102 DOUBLE PRECISION :: V0, Vpm, Vmt, Vbf, Vcf, Vtza
103
104 DOUBLE PRECISION :: Ghd_drag, avgRop
105
106 DOUBLE PRECISION :: HYS_drag, avgDrag
107
108 DOUBLE PRECISION :: ROP_MA, U_se, Usw, Vsw, Vse, Usn,&
109 Uss, Wsb, Wst, Wse, Usb, Ust
110 DOUBLE PRECISION :: F_vir
111
112 DOUBLE PRECISION :: ltau_u_g
113
114
115
116 = 0
117
118 IF (.NOT.MOMENTUM_X_EQ(0)) RETURN
119
120
121
122
123
124
125
126
127
128
129 DO IJK = ijkstart3, ijkend3
130 I = I_OF(IJK)
131 J = J_OF(IJK)
132 K = K_OF(IJK)
133 IJKE = EAST_OF(IJK)
134 IJKM = KM_OF(IJK)
135 IPJK = IP_OF(IJK)
136 IMJK = IM_OF(IJK)
137 IPJKM = IP_OF(IJKM)
138 IJMK = JM_OF(IJK)
139 IPJMK = IP_OF(IJMK)
140 IJPK = JP_OF(IJK)
141 IJKP = KP_OF(IJK)
142
143 EPGA = AVG_X(EP_G(IJK),EP_G(IJKE),I)
144
145 = AVG_X(EPG_jfac(IJK),EPG_jfac(IJKE),I)
146
147
148 IF (IP_AT_E(IJK)) THEN
149 A_M(IJK,east,M) = ZERO
150 A_M(IJK,west,M) = ZERO
151 A_M(IJK,north,M) = ZERO
152 A_M(IJK,south,M) = ZERO
153 A_M(IJK,top,M) = ZERO
154 A_M(IJK,bottom,M) = ZERO
155 A_M(IJK,0,M) = -ONE
156 B_M(IJK,M) = ZERO
157
158
159 ELSEIF (EPGA <= DIL_EP_S) THEN
160 A_M(IJK,east,M) = ZERO
161 A_M(IJK,west,M) = ZERO
162 A_M(IJK,north,M) = ZERO
163 A_M(IJK,south,M) = ZERO
164 A_M(IJK,top,M) = ZERO
165 A_M(IJK,bottom,M) = ZERO
166 A_M(IJK,0,M) = -ONE
167 B_M(IJK,M) = ZERO
168
169
170 IF (EP_G(WEST_OF(IJK)) > DIL_EP_S) THEN
171 A_M(IJK,west,M) = ONE
172 ELSE IF (EP_G(EAST_OF(IJK)) > DIL_EP_S) THEN
173 A_M(IJK,east,M) = ONE
174 ELSE
175 B_M(IJK,M) = -U_G(IJK)
176 ENDIF
177
178
179 ELSEIF (BLOCKED_U_CELL_AT(IJK)) THEN
180 A_M(IJK,east,M) = ZERO
181 A_M(IJK,west,M) = ZERO
182 A_M(IJK,north,M) = ZERO
183 A_M(IJK,south,M) = ZERO
184 A_M(IJK,top,M) = ZERO
185 A_M(IJK,bottom,M) = ZERO
186 A_M(IJK,0,M) = -ONE
187 B_M(IJK,M) = ZERO
188
189
190 ELSE
191
192
193
194 = P_G(IJKE)
195 IF (CYCLIC_X_PD) THEN
196 IF (IMAP(I_OF(IJK)).EQ.IMAX1) PGE = P_G(IJKE) - DELP_X
197 ENDIF
198 IF (MODEL_B) THEN
199 IF(.NOT.CUT_U_TREATMENT_AT(IJK)) THEN
200 SDP = -P_SCALE*(PGE - P_G(IJK))*AYZ(IJK)
201 ELSE
202 SDP = -P_SCALE*(PGE * A_UPG_E(IJK) - P_G(IJK) * A_UPG_W(IJK) )
203 ENDIF
204 ELSE
205 IF(.NOT.CUT_U_TREATMENT_AT(IJK)) THEN
206 SDP = -P_SCALE*EPGA*(PGE - P_G(IJK))*AYZ(IJK)
207 ELSE
208 SDP = -P_SCALE*EPGA*(PGE * A_UPG_E(IJK) - P_G(IJK) * A_UPG_W(IJK) )
209 ENDIF
210 ENDIF
211
212 IF(.NOT.CUT_U_TREATMENT_AT(IJK)) THEN
213
214 = HALF * (VOL(IJK)*ROP_G(IJK) + &
215 VOL(IPJK)*ROP_G(IJKE))/VOL_U(IJK)
216 ROGA = HALF * (VOL(IJK)*RO_G(IJK) + &
217 VOL(IPJK)*RO_G(IJKE))/VOL_U(IJK)
218
219 = HALF * (VOL(IJK)*ROP_GO(IJK) + &
220 VOL(IPJK)*ROP_GO(IJKE))*ODT/VOL_U(IJK)
221
222 IF(Added_Mass) THEN
223 ROP_MA = AVG_X(ROP_g(IJK)*EP_s(IJK,M_AM),&
224 ROP_g(IJKE)*EP_s(IJKE,M_AM),I)
225 V0 = V0 + Cv * ROP_MA * ODT
226 ENDIF
227 ELSE
228
229 = (VOL(IJK)*ROP_G(IJK) + &
230 VOL(IPJK)*ROP_G(IJKE))/(VOL(IJK) + VOL(IPJK))
231 ROGA = (VOL(IJK)*RO_G(IJK) + &
232 VOL(IPJK)*RO_G(IJKE) )/(VOL(IJK) + VOL(IPJK))
233
234 = (VOL(IJK)*ROP_GO(IJK) + VOL(IPJK)*ROP_GO(IJKE))*&
235 ODT/(VOL(IJK) + VOL(IPJK))
236
237 IF(Added_Mass) THEN
238 ROP_MA = (VOL(IJK)*ROP_g(IJK)*EP_s(IJK,M_AM) + &
239 VOL(IPJK)*ROP_g(IJKE)*EP_s(IJKE,M_AM) )/&
240 (VOL(IJK) + VOL(IPJK))
241 V0 = V0 + Cv * ROP_MA * ODT
242 ENDIF
243 ENDIF
244
245
246
247 = ZERO
248 IF(Added_Mass.AND.(.NOT.CUT_U_TREATMENT_AT(IJK))) THEN
249 F_vir = ( (U_s(IJK,M_AM) - U_sO(IJK,M_AM)) )*ODT*VOL_U(IJK)
250
251
252 = AVG_X_E(U_S(IMJK,M_AM),U_s(IJK,M_AM),I)
253 U_se = AVG_X_E(U_s(IJK,M_AM),U_s(IPJK,M_AM),IP1(I))
254 Vsw = AVG_Y_N(V_s(IJMK,M_AM),V_s(IJK,M_AM))
255 Vse = AVG_Y_N(V_s(IPJMK,M_AM),V_s(IPJK,M_AM))
256 Uss = AVG_Y(U_s(IJMK,M_AM),U_s(IJK,M_AM),JM1(J))
257 Usn = AVG_Y(U_s(IJK,M_AM),U_s(IJPK,M_AM),J)
258 IF(DO_K) THEN
259 Wsb = AVG_Z_T(W_s(IJKM,M_AM),W_s(IJK,M_AM))
260 Wst = AVG_Z_T(W_s(IPJKM,M_AM),W_s(IPJK,M_AM))
261 Wse = AVG_X(Wsb,Wst,I)
262 Usb = AVG_Z(U_s(IJKM,M_AM),U_s(IJK,M_AM),KM1(K))
263 Ust = AVG_Z(U_s(IJK,M_AM),U_s(IJKP,M_AM),K)
264 F_vir = F_vir + Wse*OX_E(I) * (Ust - Usb) *AXY(IJK)
265
266 IF (CYLINDRICAL) F_vir = F_vir - Wse**2*OX_E(I)
267 ENDIF
268
269 = F_vir + U_s(IJK,M_AM)*(U_se - Usw)*AYZ(IJK) + &
270 AVG_X(Vsw,Vse,I) * (Usn - Uss)*AXZ(IJK)
271 F_vir = F_vir * Cv * ROP_MA
272 ENDIF
273
274
275 IF (SIP_AT_E(IJK)) THEN
276 ISV = IS_ID_AT_E(IJK)
277 MUGA = AVG_X(MU_G(IJK),MU_G(IJKE),I)
278 VPM = MUGA/IS_PC(ISV,1)
279 IF (IS_PC(ISV,2) /= ZERO) VPM = VPM + &
280 HALF*IS_PC(ISV,2)*ROPGA*ABS(U_G(IJK))
281 ELSE
282 VPM = ZERO
283 ENDIF
284
285
286 IF(.NOT.CUT_U_TREATMENT_AT(IJK)) THEN
287 VMT = HALF * (VOL(IJK)*SUM_R_G(IJK) + &
288 VOL(IPJK)*SUM_R_G(IJKE))/VOL_U(IJK)
289 ELSE
290 VMT = (VOL(IJK)*SUM_R_G(IJK) + VOL(IPJK)*SUM_R_G(IJKE))/&
291 (VOL(IJK) + VOL(IPJK))
292 ENDIF
293
294
295 IF (MODEL_B) THEN
296 VBF = ROGA*BFX_G(IJK)
297 ELSE
298 = ROPGA*BFX_G(IJK)
299 ENDIF
300
301
302 = ZERO
303 IF (KT_TYPE_ENUM .EQ. GHD_2007) THEN
304 DO L = 1,SMAX
305 avgRop = AVG_X(ROP_S(IJK,L),ROP_S(IJKE,L),I)
306 if(avgRop > ZERO) Ghd_drag = Ghd_drag +&
307 AVG_X(F_GS(IJK,L),F_GS(IJKE,L),I) * JoiX(IJK,L) / avgRop
308 ENDDO
309 ENDIF
310
311
312 = ZERO
313 HYS_drag = ZERO
314 IF (DRAG_TYPE_ENUM .EQ. HYS .AND. KT_TYPE_ENUM .NE. GHD_2007) THEN
315 DO MM=1,MMAX
316 DO L = 1,MMAX
317 IF (L /= MM) THEN
318 avgDrag = AVG_X(beta_ij(IJK,MM,L),beta_ij(IJKE,MM,L),I)
319 HYS_drag = HYS_drag + avgDrag * (U_g(ijk) - U_s(IJK,L))
320 ENDIF
321 ENDDO
322 ENDDO
323 ENDIF
324
325
326 = ZERO
327 VTZA = ZERO
328 IF (CYLINDRICAL) THEN
329
330 = AVG_X(HALF*(W_G(IJK)+W_G(IJKM)),&
331 HALF*(W_G(IPJK)+W_G(IPJKM)),I)
332 VCF = ROPGA*WGE**2*OX_E(I)
333
334 IF(Added_Mass) VCF = VCF + Cv*ROP_MA*WGE**2*OX_E(I)
335
336
337
338
339
340 = AVG_X(EPMU_GT(IJK),EPMU_GT(IJKE),I)
341 VTZA = 2.d0*EPGAJ*MUGTA*OX_E(I)*OX_E(I)
342 ENDIF
343
344
345
346 = epgaJ*tau_u_g(ijk)
347
348
349 (IJK,0,M) = -(A_M(IJK,east,M)+A_M(IJK,west,M)+&
350 A_M(IJK,north,M)+A_M(IJK,south,M)+A_M(IJK,top,M)+A_M(IJK,bottom,M)+&
351 (V0+VPM+ZMAX(VMT)+VTZA)*VOL_U(IJK))
352
353 B_M(IJK,M) = B_M(IJK,M) -(SDP + lTAU_U_G + F_VIR + &
354 ( (V0+ZMAX((-VMT)))*U_GO(IJK) + VBF + &
355 VCF + Ghd_drag + HYS_drag)*VOL_U(IJK) )
356
357
358 IF(USE_MMS) B_M(IJK,M) = &
359 B_M(IJK,M) - MMS_U_G_SRC(IJK)*VOL_U(IJK)
360
361 ENDIF
362 ENDDO
363
364
365
366 IF(CARTESIAN_GRID) CALL CG_SOURCE_U_G(A_M, B_M)
367
368 CALL SOURCE_U_G_BC (A_M, B_M)
369
370 IF(CARTESIAN_GRID) CALL CG_SOURCE_U_G_BC(A_M, B_M)
371
372 RETURN
373 END SUBROUTINE SOURCE_U_G
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394 SUBROUTINE SOURCE_U_G_BC(A_M, B_M)
395
396
397
398
399 USE param
400 USE param1
401 USE parallel
402 USE scales
403 USE constant
404 USE physprop
405 USE fldvar
406 USE visc_g
407 USE rxns
408 USE run
409 USE toleranc
410 USE geometry
411 USE indices
412 USE is
413 USE tau_g
414 USE bc
415 USE output
416 USE compar
417 USE fun_avg
418 USE functions
419 IMPLICIT NONE
420
421
422
423
424 DOUBLE PRECISION, INTENT(INOUT) :: A_m(DIMENSION_3, -3:3, 0:DIMENSION_M)
425
426 DOUBLE PRECISION, INTENT(INOUT) :: B_m(DIMENSION_3, 0:DIMENSION_M)
427
428
429
430
431 INTEGER :: L
432
433 INTEGER :: I, J, K, IM, I1, I2, J1, J2, K1, K2, IJK,&
434 JM, KM, IJKW, IMJK, IP, IPJK
435
436 INTEGER :: M
437
438 DOUBLE PRECISION :: W_F_Slip
439
440
441
442 = 0
443
444
445
446
447
448
449
450
451
452
453
454 IF (DO_K) THEN
455
456 = 1
457 DO J1 = jmin3,jmax3
458 DO I1 = imin3, imax3
459 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
460 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE
461 = FUNIJK(I1,J1,K1)
462 IF (NS_WALL_AT(IJK)) THEN
463
464
465 (IJK,east,M) = ZERO
466 A_M(IJK,west,M) = ZERO
467 A_M(IJK,north,M) = ZERO
468 A_M(IJK,south,M) = ZERO
469 A_M(IJK,top,M) = -ONE
470 A_M(IJK,bottom,M) = ZERO
471 A_M(IJK,0,M) = -ONE
472 B_M(IJK,M) = ZERO
473 ELSEIF (FS_WALL_AT(IJK)) THEN
474
475
476 (IJK,east,M) = ZERO
477 A_M(IJK,west,M) = ZERO
478 A_M(IJK,north,M) = ZERO
479 A_M(IJK,south,M) = ZERO
480 A_M(IJK,top,M) = ONE
481 A_M(IJK,bottom,M) = ZERO
482 A_M(IJK,0,M) = -ONE
483 B_M(IJK,M) = ZERO
484 ENDIF
485 ENDDO
486 ENDDO
487
488
489 = KMAX2
490 DO J1 = jmin3,jmax3
491 DO I1 = imin3, imax3
492 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
493 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE
494 = FUNIJK(I1,J1,K1)
495 IF (NS_WALL_AT(IJK)) THEN
496 A_M(IJK,east,M) = ZERO
497 A_M(IJK,west,M) = ZERO
498 A_M(IJK,north,M) = ZERO
499 A_M(IJK,south,M) = ZERO
500 A_M(IJK,top,M) = ZERO
501 A_M(IJK,bottom,M) = -ONE
502 A_M(IJK,0,M) = -ONE
503 B_M(IJK,M) = ZERO
504 ELSEIF (FS_WALL_AT(IJK)) THEN
505 A_M(IJK,east,M) = ZERO
506 A_M(IJK,west,M) = ZERO
507 A_M(IJK,north,M) = ZERO
508 A_M(IJK,south,M) = ZERO
509 A_M(IJK,top,M) = ZERO
510 A_M(IJK,bottom,M) = ONE
511 A_M(IJK,0,M) = -ONE
512 B_M(IJK,M) = ZERO
513 ENDIF
514 ENDDO
515 ENDDO
516 ENDIF
517
518
519 = 1
520 DO K1 = kmin3, kmax3
521 DO I1 = imin3, imax3
522 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
523 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE
524 = FUNIJK(I1,J1,K1)
525 IF (NS_WALL_AT(IJK)) THEN
526 A_M(IJK,east,M) = ZERO
527 A_M(IJK,west,M) = ZERO
528 A_M(IJK,north,M) = -ONE
529 A_M(IJK,south,M) = ZERO
530 A_M(IJK,top,M) = ZERO
531 A_M(IJK,bottom,M) = ZERO
532 A_M(IJK,0,M) = -ONE
533 B_M(IJK,M) = ZERO
534 ELSEIF (FS_WALL_AT(IJK)) THEN
535 A_M(IJK,east,M) = ZERO
536 A_M(IJK,west,M) = ZERO
537 A_M(IJK,north,M) = ONE
538 A_M(IJK,south,M) = ZERO
539 A_M(IJK,top,M) = ZERO
540 A_M(IJK,bottom,M) = ZERO
541 A_M(IJK,0,M) = -ONE
542 B_M(IJK,M) = ZERO
543 ENDIF
544 ENDDO
545 ENDDO
546
547
548 = JMAX2
549 DO K1 = kmin3, kmax3
550 DO I1 = imin3, imax3
551 IF (.NOT.IS_ON_myPE_plus2layers(I1,J1,K1)) CYCLE
552 IF (DEAD_CELL_AT(I1,J1,K1)) CYCLE
553 = FUNIJK(I1,J1,K1)
554 IF (NS_WALL_AT(IJK)) THEN
555 A_M(IJK,east,M) = ZERO
556 A_M(IJK,west,M) = ZERO
557 A_M(IJK,north,M) = ZERO
558 A_M(IJK,south,M) = -ONE
559 A_M(IJK,top,M) = ZERO
560 A_M(IJK,bottom,M) = ZERO
561 A_M(IJK,0,M) = -ONE
562 B_M(IJK,M) = ZERO
563 ELSEIF (FS_WALL_AT(IJK)) THEN
564 A_M(IJK,east,M) = ZERO
565 A_M(IJK,west,M) = ZERO
566 A_M(IJK,north,M) = ZERO
567 A_M(IJK,south,M) = ONE
568 A_M(IJK,top,M) = ZERO
569 A_M(IJK,bottom,M) = ZERO
570 A_M(IJK,0,M) = -ONE
571 B_M(IJK,M) = ZERO
572 ENDIF
573 ENDDO
574 ENDDO
575
576
577
578
579
580 DO L = 1, DIMENSION_BC
581 IF (BC_DEFINED(L)) THEN
582
583
584
585 IF (BC_TYPE_ENUM(L) == NO_SLIP_WALL .AND. .NOT. K_Epsilon) THEN
586 I1 = BC_I_W(L)
587 I2 = BC_I_E(L)
588 J1 = BC_J_S(L)
589 J2 = BC_J_N(L)
590 K1 = BC_K_B(L)
591 K2 = BC_K_T(L)
592 DO K = K1, K2
593 DO J = J1, J2
594 DO I = I1, I2
595 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
596 IF (DEAD_CELL_AT(I,J,K)) CYCLE
597 = FUNIJK(I,J,K)
598 IF (.NOT.WALL_AT(IJK)) CYCLE
599 (IJK,east,M) = ZERO
600 A_M(IJK,west,M) = ZERO
601 A_M(IJK,north,M) = ZERO
602 A_M(IJK,south,M) = ZERO
603 A_M(IJK,top,M) = ZERO
604 A_M(IJK,bottom,M) = ZERO
605 A_M(IJK,0,M) = -ONE
606 B_M(IJK,M) = ZERO
607 IF (FLUID_AT(NORTH_OF(IJK))) THEN
608 A_M(IJK,north,M) = -ONE
609 ELSEIF (FLUID_AT(SOUTH_OF(IJK))) THEN
610 A_M(IJK,south,M) = -ONE
611 ELSEIF (FLUID_AT(TOP_OF(IJK))) THEN
612 A_M(IJK,top,M) = -ONE
613 ELSEIF (FLUID_AT(BOTTOM_OF(IJK))) THEN
614 A_M(IJK,bottom,M) = -ONE
615 ENDIF
616 ENDDO
617 ENDDO
618 ENDDO
619
620 ELSEIF (BC_TYPE_ENUM(L) == FREE_SLIP_WALL .AND. .NOT. K_Epsilon) THEN
621 I1 = BC_I_W(L)
622 I2 = BC_I_E(L)
623 J1 = BC_J_S(L)
624 J2 = BC_J_N(L)
625 K1 = BC_K_B(L)
626 K2 = BC_K_T(L)
627 DO K = K1, K2
628 DO J = J1, J2
629 DO I = I1, I2
630 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
631 IF (DEAD_CELL_AT(I,J,K)) CYCLE
632 = FUNIJK(I,J,K)
633 IF (.NOT.WALL_AT(IJK)) CYCLE
634 (IJK,east,M) = ZERO
635 A_M(IJK,west,M) = ZERO
636 A_M(IJK,north,M) = ZERO
637 A_M(IJK,south,M) = ZERO
638 A_M(IJK,top,M) = ZERO
639 A_M(IJK,bottom,M) = ZERO
640 A_M(IJK,0,M) = -ONE
641 B_M(IJK,M) = ZERO
642 IF (FLUID_AT(NORTH_OF(IJK))) THEN
643 A_M(IJK,north,M) = ONE
644 ELSEIF (FLUID_AT(SOUTH_OF(IJK))) THEN
645 A_M(IJK,south,M) = ONE
646 ELSEIF (FLUID_AT(TOP_OF(IJK))) THEN
647 A_M(IJK,top,M) = ONE
648 ELSEIF (FLUID_AT(BOTTOM_OF(IJK))) THEN
649 A_M(IJK,bottom,M) = ONE
650 ENDIF
651 ENDDO
652 ENDDO
653 ENDDO
654
655 ELSEIF (BC_TYPE_ENUM(L) == PAR_SLIP_WALL .AND. .NOT. K_Epsilon) THEN
656 I1 = BC_I_W(L)
657 I2 = BC_I_E(L)
658 J1 = BC_J_S(L)
659 J2 = BC_J_N(L)
660 K1 = BC_K_B(L)
661 K2 = BC_K_T(L)
662 DO K = K1, K2
663 DO J = J1, J2
664 DO I = I1, I2
665 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
666 IF (DEAD_CELL_AT(I,J,K)) CYCLE
667 = FUNIJK(I,J,K)
668 IF (.NOT.WALL_AT(IJK)) CYCLE
669 = JM1(J)
670 KM = KM1(K)
671 A_M(IJK,east,M) = ZERO
672 A_M(IJK,west,M) = ZERO
673 A_M(IJK,north,M) = ZERO
674 A_M(IJK,south,M) = ZERO
675 A_M(IJK,top,M) = ZERO
676 A_M(IJK,bottom,M) = ZERO
677 A_M(IJK,0,M) = -ONE
678 B_M(IJK,M) = ZERO
679 IF (FLUID_AT(NORTH_OF(IJK))) THEN
680 IF (BC_HW_G(L) == UNDEFINED) THEN
681 A_M(IJK,north,M) = -HALF
682 A_M(IJK,0,M) = -HALF
683 B_M(IJK,M) = -BC_UW_G(L)
684 ELSE
685 A_M(IJK,0,M) = -(HALF*BC_HW_G(L)+ODY_N(J))
686 A_M(IJK,north,M) = -(HALF*BC_HW_G(L)-ODY_N(J))
687 B_M(IJK,M) = -BC_HW_G(L)*BC_UW_G(L)
688 ENDIF
689 ELSEIF (FLUID_AT(SOUTH_OF(IJK))) THEN
690 IF (BC_HW_G(L) == UNDEFINED) THEN
691 A_M(IJK,south,M) = -HALF
692 A_M(IJK,0,M) = -HALF
693 B_M(IJK,M) = -BC_UW_G(L)
694 ELSE
695 A_M(IJK,south,M) = -(HALF*BC_HW_G(L)-ODY_N(JM))
696 A_M(IJK,0,M) = -(HALF*BC_HW_G(L)+ODY_N(JM))
697 B_M(IJK,M) = -BC_HW_G(L)*BC_UW_G(L)
698 ENDIF
699 ELSEIF (FLUID_AT(TOP_OF(IJK))) THEN
700 IF (BC_HW_G(L) == UNDEFINED) THEN
701 A_M(IJK,top,M) = -HALF
702 A_M(IJK,0,M) = -HALF
703 B_M(IJK,M) = -BC_UW_G(L)
704 ELSE
705 A_M(IJK,0,M)=-(HALF*BC_HW_G(L)+ODZ_T(K)*OX_E(I))
706 A_M(IJK,top,M)=-(HALF*BC_HW_G(L)-ODZ_T(K)*OX_E(I))
707 B_M(IJK,M) = -BC_HW_G(L)*BC_UW_G(L)
708 ENDIF
709 ELSEIF (FLUID_AT(BOTTOM_OF(IJK))) THEN
710 IF (BC_HW_G(L) == UNDEFINED) THEN
711 A_M(IJK,bottom,M) = -HALF
712 A_M(IJK,0,M) = -HALF
713 B_M(IJK,M) = -BC_UW_G(L)
714 ELSE
715 A_M(IJK,bottom,M) = -(HALF*BC_HW_G(L)-ODZ_T(KM)*OX_E(I&
716 ))
717 A_M(IJK,0,M) = -(HALF*BC_HW_G(L)+ODZ_T(KM)*OX_E(I&
718 ))
719 B_M(IJK,M) = -BC_HW_G(L)*BC_UW_G(L)
720 ENDIF
721 ENDIF
722 ENDDO
723 ENDDO
724 ENDDO
725
726
727 ELSEIF (BC_TYPE_ENUM(L) == PAR_SLIP_WALL .OR. &
728 BC_TYPE_ENUM(L) == NO_SLIP_WALL .OR. &
729 BC_TYPE_ENUM(L) == FREE_SLIP_WALL .AND. &
730 K_Epsilon )THEN
731 I1 = BC_I_W(L)
732 I2 = BC_I_E(L)
733 J1 = BC_J_S(L)
734 J2 = BC_J_N(L)
735 K1 = BC_K_B(L)
736 K2 = BC_K_T(L)
737 DO K = K1, K2
738 DO J = J1, J2
739 DO I = I1, I2
740 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
741 IF (DEAD_CELL_AT(I,J,K)) CYCLE
742 = FUNIJK(I,J,K)
743 IF (.NOT.WALL_AT(IJK)) CYCLE
744 = JM1(J)
745 KM = KM1(K)
746 A_M(IJK,east,M) = ZERO
747 A_M(IJK,west,M) = ZERO
748 A_M(IJK,north,M) = ZERO
749 A_M(IJK,south,M) = ZERO
750 A_M(IJK,top,M) = ZERO
751 A_M(IJK,bottom,M) = ZERO
752 A_M(IJK,0,M) = -ONE
753 B_M(IJK,M) = ZERO
754 IF (FLUID_AT(NORTH_OF(IJK))) THEN
755 CALL Wall_Function(IJK,NORTH_OF(IJK),ODY_N(J),W_F_Slip)
756 A_M(IJK,north,M) = W_F_Slip
757 A_M(IJK,0,M) = -ONE
758 IF (BC_TYPE_ENUM(L) == PAR_SLIP_WALL) B_M(IJK,M) = -BC_UW_G(L)
759 ELSEIF (FLUID_AT(SOUTH_OF(IJK))) THEN
760 CALL Wall_Function(IJK,SOUTH_OF(IJK),ODY_N(JM),W_F_Slip)
761 A_M(IJK,south,M) = W_F_Slip
762 A_M(IJK,0,M) = -ONE
763 IF (BC_TYPE_ENUM(L) == PAR_SLIP_WALL) B_M(IJK,M) = -BC_UW_G(L)
764 ELSEIF (FLUID_AT(TOP_OF(IJK))) THEN
765 CALL Wall_Function(IJK,TOP_OF(IJK),ODZ_T(K)*OX_E(I),W_F_Slip)
766 A_M(IJK,top,M) = W_F_Slip
767 A_M(IJK,0,M) = -ONE
768 IF (BC_TYPE_ENUM(L) == PAR_SLIP_WALL) B_M(IJK,M) = -BC_UW_G(L)
769 ELSEIF (FLUID_AT(BOTTOM_OF(IJK))) THEN
770 CALL Wall_Function(IJK,BOTTOM_OF(IJK),ODZ_T(KM)*OX_E(I),W_F_Slip)
771 A_M(IJK,bottom,M) = W_F_Slip
772 A_M(IJK,0,M) = -ONE
773 IF (BC_TYPE_ENUM(L) == PAR_SLIP_WALL) B_M(IJK,M) = -BC_UW_G(L)
774 ENDIF
775 ENDDO
776 ENDDO
777 ENDDO
778
779
780
781
782
783 ELSEIF (BC_TYPE_ENUM(L)==P_INFLOW .OR. BC_TYPE_ENUM(L)==P_OUTFLOW) THEN
784 IF (BC_PLANE(L) == 'W') THEN
785
786
787
788 = BC_I_W(L)
789 I2 = BC_I_E(L)
790 J1 = BC_J_S(L)
791 J2 = BC_J_N(L)
792 K1 = BC_K_B(L)
793 K2 = BC_K_T(L)
794 DO K = K1, K2
795 DO J = J1, J2
796 DO I = I1, I2
797 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
798 IF (DEAD_CELL_AT(I,J,K)) CYCLE
799 = FUNIJK(I,J,K)
800 A_M(IJK,east,M) = ZERO
801 A_M(IJK,west,M) = ONE
802 A_M(IJK,north,M) = ZERO
803 A_M(IJK,south,M) = ZERO
804 A_M(IJK,top,M) = ZERO
805 A_M(IJK,bottom,M) = ZERO
806 A_M(IJK,0,M) = -ONE
807 B_M(IJK,M) = ZERO
808 ENDDO
809 ENDDO
810 ENDDO
811 ENDIF
812
813
814
815
816
817 ELSEIF (BC_TYPE_ENUM(L) == OUTFLOW) THEN
818 IF (BC_PLANE(L) == 'W') THEN
819 I1 = BC_I_W(L)
820 I2 = BC_I_E(L)
821 J1 = BC_J_S(L)
822 J2 = BC_J_N(L)
823 K1 = BC_K_B(L)
824 K2 = BC_K_T(L)
825 DO K = K1, K2
826 DO J = J1, J2
827 DO I = I1, I2
828 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
829 IF (DEAD_CELL_AT(I,J,K)) CYCLE
830 = FUNIJK(I,J,K)
831 A_M(IJK,east,M) = ZERO
832 A_M(IJK,west,M) = ONE
833 A_M(IJK,north,M) = ZERO
834 A_M(IJK,south,M) = ZERO
835 A_M(IJK,top,M) = ZERO
836 A_M(IJK,bottom,M) = ZERO
837 A_M(IJK,0,M) = -ONE
838 B_M(IJK,M) = ZERO
839 IM = IM1(I)
840 IMJK = IM_OF(IJK)
841 A_M(IMJK,east,M) = ZERO
842 A_M(IMJK,west,M) = X_E(IM)/X_E(IM1(IM))
843 A_M(IMJK,north,M) = ZERO
844 A_M(IMJK,south,M) = ZERO
845 A_M(IMJK,top,M) = ZERO
846 A_M(IMJK,bottom,M) = ZERO
847 A_M(IMJK,0,M) = -ONE
848 B_M(IMJK,M) = ZERO
849 ENDDO
850 ENDDO
851 ENDDO
852 ELSEIF (BC_PLANE(L) == 'E') THEN
853 I1 = BC_I_W(L)
854 I2 = BC_I_E(L)
855 J1 = BC_J_S(L)
856 J2 = BC_J_N(L)
857 K1 = BC_K_B(L)
858 K2 = BC_K_T(L)
859 DO K = K1, K2
860 DO J = J1, J2
861 DO I = I1, I2
862 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
863 IF (DEAD_CELL_AT(I,J,K)) CYCLE
864 = FUNIJK(I,J,K)
865 IP = IP1(I)
866 IPJK = IP_OF(IJK)
867 A_M(IPJK,east,M) = X_E(IP)/X_E(I)
868 A_M(IPJK,west,M) = ZERO
869 A_M(IPJK,north,M) = ZERO
870 A_M(IPJK,south,M) = ZERO
871 A_M(IPJK,top,M) = ZERO
872 A_M(IPJK,bottom,M) = ZERO
873 A_M(IPJK,0,M) = -ONE
874 B_M(IPJK,M) = ZERO
875 ENDDO
876 ENDDO
877 ENDDO
878 ENDIF
879
880
881
882
883
884
885
886 ELSE
887 I1 = BC_I_W(L)
888 I2 = BC_I_E(L)
889 J1 = BC_J_S(L)
890 J2 = BC_J_N(L)
891 K1 = BC_K_B(L)
892 K2 = BC_K_T(L)
893 DO K = K1, K2
894 DO J = J1, J2
895 DO I = I1, I2
896 IF (.NOT.IS_ON_myPE_plus2layers(I,J,K)) CYCLE
897 IF (DEAD_CELL_AT(I,J,K)) CYCLE
898 = FUNIJK(I,J,K)
899
900 (IJK,east,M) = ZERO
901 A_M(IJK,west,M) = ZERO
902 A_M(IJK,north,M) = ZERO
903 A_M(IJK,south,M) = ZERO
904 A_M(IJK,top,M) = ZERO
905 A_M(IJK,bottom,M) = ZERO
906 A_M(IJK,0,M) = -ONE
907 B_M(IJK,M) = -U_G(IJK)
908 IF (BC_PLANE(L) == 'W') THEN
909
910
911
912 = WEST_OF(IJK)
913 A_M(IJKW,east,M) = ZERO
914 A_M(IJKW,west,M) = ZERO
915 A_M(IJKW,north,M) = ZERO
916 A_M(IJKW,south,M) = ZERO
917 A_M(IJKW,top,M) = ZERO
918 A_M(IJKW,bottom,M) = ZERO
919 A_M(IJKW,0,M) = -ONE
920 B_M(IJKW,M) = -U_G(IJKW)
921 ENDIF
922 ENDDO
923 ENDDO
924 ENDDO
925 ENDIF
926
927
928
929
930
931
932 ENDIF
933 ENDDO
934
935 RETURN
936 END SUBROUTINE SOURCE_U_G_BC
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957 SUBROUTINE Wall_Function(IJK1, IJK2, ODX_WF, W_F_Slip)
958
959
960
961
962 USE param
963 USE param1
964 USE physprop
965 USE fldvar
966 USE visc_g
967 USE geometry
968 USE indices
969 USE bc
970 USE compar
971 USE turb
972 USE mpi_utility
973 IMPLICIT NONE
974
975
976
977
978 INTEGER :: IJK1, IJK2
979
980 DOUBLE PRECISION ODX_WF, W_F_Slip
981
982
983
984
985 DOUBLE PRECISION, PARAMETER :: C_mu = 0.09D0
986
987 DOUBLE PRECISION, PARAMETER :: Kappa = 0.42D0
988
989
990
991
992
993
994 IF(DABS(ODX_WF)>1.0D-5) THEN
995
996
997
998 = (ONE - ONE/ODX_WF* RO_g(IJK2)*C_mu**0.25 * &
999 SQRT(K_Turb_G(IJK2))/MU_gT(IJK2) * &
1000 Kappa/LOG(9.81D+0/(ODX_WF*2.D+0)*RO_g(IJK2)*C_mu**0.25*&
1001 SQRT(K_Turb_G(IJK2))/MU_g(IJK2)))
1002 ELSE
1003
1004 = ONE
1005 ENDIF
1006
1007
1008 RETURN
1009 END SUBROUTINE Wall_Function
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022 SUBROUTINE POINT_SOURCE_U_G(A_M, B_M)
1023
1024 use compar
1025 use constant
1026 use geometry
1027 use indices
1028 use param
1029 use param1, only: small_number
1030 use physprop
1031 use ps
1032 use run
1033 use functions
1034
1035 IMPLICIT NONE
1036
1037
1038
1039
1040 DOUBLE PRECISION, INTENT(INOUT) :: A_m(DIMENSION_3, -3:3, 0:DIMENSION_M)
1041
1042 DOUBLE PRECISION, INTENT(INOUT) :: B_m(DIMENSION_3, 0:DIMENSION_M)
1043
1044
1045
1046
1047 INTEGER :: IJK, I, J, K
1048 INTEGER :: PSV, M
1049 INTEGER :: lIE, lIW
1050
1051 DOUBLE PRECISION :: pSource
1052
1053
1054
1055 = 0
1056
1057
1058
1059 PS_LP: do PSV = 1, DIMENSION_PS
1060 if(.NOT.PS_DEFINED(PSV)) cycle PS_LP
1061 if(abs(PS_U_g(PSV)) < small_number) cycle PS_LP
1062
1063 if(PS_U_g(PSV) < 0.0d0) then
1064 lIW = PS_I_W(PSV) - 1
1065 lIE = PS_I_E(PSV) - 1
1066 else
1067 lIW = PS_I_W(PSV)
1068 lIE = PS_I_E(PSV)
1069 endif
1070
1071 do k = PS_K_B(PSV), PS_K_T(PSV)
1072 do j = PS_J_S(PSV), PS_J_N(PSV)
1073 do i = lIW, lIE
1074
1075 if(.NOT.IS_ON_myPE_plus2layers(I,J,K)) cycle
1076 IF (DEAD_CELL_AT(I,J,K)) CYCLE
1077
1078 = funijk(i,j,k)
1079 if(.NOT. fluid_at(ijk)) cycle
1080
1081 pSource = PS_MASSFLOW_G(PSV) * (VOL(IJK)/PS_VOLUME(PSV))
1082
1083 B_M(IJK,M) = B_M(IJK,M) - pSource * &
1084 PS_U_g(PSV) * PS_VEL_MAG_g(PSV)
1085
1086 enddo
1087 enddo
1088 enddo
1089 enddo PS_LP
1090
1091 RETURN
1092 END SUBROUTINE POINT_SOURCE_U_G
1093