File: RELATIVE:/../../../mfix.git/model/conv_dif_w_s.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 SUBROUTINE CONV_DIF_W_S(A_M, B_M)
16
17
18
19 USE param, only: dimension_3, dimension_m
20 USE run, only: kt_type_enum
21 USE run, only: ghd_2007
22 USE run, only: def_cor
23 USE run, only: momentum_z_eq
24 USE run, only: discretize
25 USE physprop, only: mmax
26 USE visc_s, only: mu_s
27 IMPLICIT NONE
28
29
30
31
32 DOUBLE PRECISION, INTENT(INOUT) :: A_m(DIMENSION_3, -3:3, 0:DIMENSION_M)
33
34 DOUBLE PRECISION, INTENT(INOUT) :: B_m(DIMENSION_3, 0:DIMENSION_M)
35
36
37
38
39 INTEGER :: M
40
41
42 DO M = 1, MMAX
43 IF(KT_TYPE_ENUM /= GHD_2007 .OR. &
44 (KT_TYPE_ENUM == GHD_2007 .AND. M==MMAX)) THEN
45
46 IF (MOMENTUM_Z_EQ(M)) THEN
47
48 IF (DEF_COR) THEN
49
50 CALL STORE_A_W_S0 (A_M(1,-3,M), M)
51 IF (DISCRETIZE(5) > 1)CALL STORE_A_W_SDC (M, B_M)
52
53 ELSE
54
55 IF (DISCRETIZE(5) == 0) THEN
56 CALL STORE_A_W_S0 (A_M(1,-3,M), M)
57 ELSE
58 CALL STORE_A_W_S1 (A_M(1,-3,M), M)
59 ENDIF
60 ENDIF
61
62 CALL DIF_W_IS (MU_S(1,M), A_M, M)
63 ENDIF
64 ENDIF
65 ENDDO
66
67 RETURN
68 END SUBROUTINE CONV_DIF_W_S
69
70
71
72
73
74
75
76 SUBROUTINE GET_WCELL_SVTERMS(U, V, WW, M)
77
78
79
80 USE compar, only: ijkstart3, ijkend3
81
82 USE cutcell, only: cut_w_treatment_at
83 USE cutcell, only: theta_wt, theta_wt_bar
84 USE cutcell, only: theta_w_be, theta_w_te
85 USE cutcell, only: theta_w_bn, theta_w_tn
86 USE cutcell, only: alpha_we_c, alpha_wn_c, alpha_wt_c
87
88 USE fldvar, only: u_s, v_s, w_s
89
90 USE fun_avg, only: avg_z_t, avg_z
91 USE functions, only: kp_of
92 USE indices, only: k_of
93
94 USE param, only: dimension_3
95 IMPLICIT NONE
96
97
98
99
100 INTEGER, INTENT(IN) :: M
101
102 DOUBLE PRECISION, INTENT(OUT) :: U(DIMENSION_3)
103 DOUBLE PRECISION, INTENT(OUT) :: V(DIMENSION_3)
104 DOUBLE PRECISION, INTENT(OUT) :: WW(DIMENSION_3)
105
106
107
108
109 INTEGER :: IJK, K, IJKP
110
111 DOUBLE PRECISION :: AW, HW, VELW
112
113
114
115
116 DO IJK = ijkstart3, ijkend3
117 K = K_OF(IJK)
118 IJKP = KP_OF(IJK)
119
120 IF(CUT_W_TREATMENT_AT(IJK)) THEN
121
122
123 (IJK) = (Theta_W_be(IJK) * U_S(IJK,M) + &
124 Theta_W_te(IJK) * U_S(IJKP,M))
125 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM', &
126 ALPHA_We_c(IJK), AW, HW, VELW)
127 U(IJK) = U(IJK) * AW
128
129
130 (IJK) = (Theta_W_bn(IJK) * V_S(IJK,M) + &
131 Theta_W_tn(IJK) * V_S(IJKP,M))
132 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM', &
133 ALPHA_Wn_c(IJK), AW, HW, VELW)
134 V(IJK) = V(IJK) * AW
135
136
137 (IJK) = (Theta_Wt_bar(IJK) * W_S(IJK,M) + &
138 Theta_Wt(IJK) * W_S(IJKP,M))
139 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM', &
140 alpha_Wt_c(IJK), AW, HW, VELW)
141 WW(IJK) = WW(IJK) * AW
142
143 ELSE
144 U(IJK) = AVG_Z(U_S(IJK,M),U_S(IJKP,M),K)
145 V(IJK) = AVG_Z(V_S(IJK,M),V_S(IJKP,M),K)
146 WW(IJK) = AVG_Z_T(W_S(IJK,M),W_S(IJKP,M))
147 ENDIF
148 ENDDO
149
150 RETURN
151 END SUBROUTINE GET_WCELL_SVTERMS
152
153
154
155
156
157
158
159
160
161
162 SUBROUTINE GET_WCELL_SCFLUX_TERMS(FLUX_E, FLUX_W, FLUX_N, &
163 FLUX_S, FLUX_T, FLUX_B, IJK, M)
164
165
166
167 USE cutcell, only: cut_w_treatment_at
168 USE cutcell, only: theta_wt, theta_wt_bar
169 USE cutcell, only: theta_w_be, theta_w_te
170 USE cutcell, only: theta_w_bn, theta_w_tn
171 USE cutcell, only: alpha_we_c, alpha_wn_c, alpha_wt_c
172
173 USE functions, only: kp_of, im_of, jm_of, km_of
174
175 USE mflux, only: flux_se, flux_sn, flux_st
176
177 USE param1, only: half
178 IMPLICIT NONE
179
180
181
182
183 INTEGER, INTENT(IN) :: M
184
185 DOUBLE PRECISION, INTENT(OUT) :: flux_e, flux_w
186 DOUBLE PRECISION, INTENT(OUT) :: flux_n, flux_s
187 DOUBLE PRECISION, INTENT(OUT) :: flux_t, flux_b
188
189 INTEGER, INTENT(IN) :: ijk
190
191
192
193
194 INTEGER :: imjk, ijmk, ijkm
195 INTEGER :: ijkp, imjkp, ijmkp
196
197
198 DOUBLE PRECISION :: AW, HW, VELW
199
200
201 = KP_OF(IJK)
202 IMJK = IM_OF(IJK)
203 IJMK = JM_OF(IJK)
204 IJKM = KM_OF(IJK)
205 IMJKP = KP_OF(IMJK)
206 IJMKP = KP_OF(IJMK)
207
208 IF(CUT_W_TREATMENT_AT(IJK)) THEN
209
210 = (Theta_W_be(IJK) * Flux_sE(IJK,M) + &
211 Theta_W_te(IJK) * Flux_sE(IJKP,M))
212 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM',&
213 ALPHA_We_c(IJK), AW, HW, VELW)
214 Flux_e = Flux_e * AW
215
216 = (Theta_W_be(IMJK) * Flux_sE(IMJK,M) + &
217 Theta_W_te(IMJK) * Flux_sE(IMJKP,M))
218 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM',&
219 ALPHA_We_c(IMJK), AW, HW, VELW)
220 Flux_w = Flux_w * AW
221
222
223
224 = (Theta_W_bn(IJK) * Flux_sN(IJK,M) + &
225 Theta_W_tn(IJK) * Flux_sN(IJKP,M))
226 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM',&
227 ALPHA_Wn_c(IJK), AW, HW, VELW)
228 Flux_n = Flux_n * AW
229
230 = (Theta_W_bn(IJMK) * Flux_sN(IJMK,M) + &
231 Theta_W_tn(IJMK) * Flux_sN(IJMKP,M))
232 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM',&
233 ALPHA_Wn_c(IJMK), AW, HW, VELW)
234 Flux_s = Flux_s * AW
235
236
237
238 = (Theta_Wt_bar(IJK) * Flux_sT(IJK,M) + &
239 Theta_Wt(IJK) * Flux_sT(IJKP,M))
240 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM',&
241 alpha_Wt_c(IJK),AW,HW,VELW)
242 Flux_t = Flux_t * AW
243
244 = (Theta_Wt_bar(IJKM) * Flux_sT(IJKM,M) + &
245 Theta_Wt(IJKM) * Flux_sT(IJK,M))
246 CALL GET_INTERPOLATION_TERMS_S(IJK, M, 'W_MOMENTUM',&
247 alpha_Wt_c(IJKM), AW, HW, VELW)
248 Flux_b = Flux_b * AW
249 ELSE
250 Flux_e = HALF * (Flux_sE(IJK,M) + Flux_sE(IJKP,M))
251 Flux_w = HALF * (Flux_sE(IMJK,M) + Flux_sE(IMJKP,M))
252 Flux_n = HALF * (Flux_sN(IJK,M) + Flux_sN(IJKP,M))
253 Flux_s = HALF * (Flux_sN(IJMK,M) + Flux_sN(IJMKP,M))
254 Flux_t = HALF * (Flux_sT(IJK,M) + Flux_sT(IJKP,M))
255 Flux_b = HALF * (Flux_sT(IJKM,M) + Flux_sT(IJK,M))
256 ENDIF
257
258 RETURN
259 END SUBROUTINE GET_WCELL_SCFLUX_TERMS
260
261
262
263
264
265
266
267
268
269
270 SUBROUTINE GET_WCELL_SDIFF_TERMS(D_FE, D_FW, D_FN, D_FS, &
271 D_FT, D_FB, IJK, M)
272
273
274
275 USE cutcell, only: cut_w_treatment_at
276 USE cutcell, only: oneodx_e_w, oneody_n_w, oneodz_t_w
277
278 USE functions, only: wall_at
279 USE functions, only: east_of, north_of, top_of
280 USE functions, only: west_of, south_of
281 USE functions, only: im_of, jm_of, km_of
282
283 USE fun_avg, only: avg_x_h, avg_y_h, avg_z_h
284
285 USE geometry, only: odx_e, ody_n, odz
286 USE geometry, only: ox
287 USE geometry, only: ayz_w, axz_w, axy_w
288
289 USE indices, only: i_of, j_of, k_of
290 USE indices, only: kp1, im1, jm1
291
292 USE visc_s, only: mu_s
293 IMPLICIT NONE
294
295
296
297
298 INTEGER, INTENT(IN) :: M
299
300 DOUBLE PRECISION, INTENT(OUT) :: d_fe, d_fw
301 DOUBLE PRECISION, INTENT(OUT) :: d_fn, d_fs
302 DOUBLE PRECISION, INTENT(OUT) :: d_ft, d_fb
303
304 INTEGER, INTENT(IN) :: ijk
305
306
307
308
309 INTEGER :: imjk, ijmk, ijkm
310 INTEGER :: i, j, k, kp, im, jm
311 INTEGER :: ijkc, ijkt, ijke, ijkte, ijkw, ijkwt
312 INTEGER :: ijkn, ijktn, ijks, ijkst
313
314
315 DOUBLE PRECISION :: C_AE, C_AW, C_AN, C_AS, C_AT, C_AB
316
317
318 = IM_OF(IJK)
319 IJMK = JM_OF(IJK)
320 IJKM = KM_OF(IJK)
321
322 I = I_OF(IJK)
323 J = J_OF(IJK)
324 K = K_OF(IJK)
325 KP = KP1(K)
326 IM = IM1(I)
327 JM = JM1(J)
328
329 IJKT = TOP_OF(IJK)
330 IF (WALL_AT(IJK)) THEN
331 IJKC = IJKT
332 ELSE
333 IJKC = IJK
334 ENDIF
335 IJKE = EAST_OF(IJK)
336 IJKTE = EAST_OF(IJKT)
337 IJKN = NORTH_OF(IJK)
338 IJKTN = NORTH_OF(IJKT)
339 IJKW = WEST_OF(IJK)
340 IJKWT = TOP_OF(IJKW)
341 IJKS = SOUTH_OF(IJK)
342 IJKST = TOP_OF(IJKS)
343
344 IF(CUT_W_TREATMENT_AT(IJK)) THEN
345 C_AE = ONEoDX_E_W(IJK)
346 C_AW = ONEoDX_E_W(IMJK)
347 C_AN = ONEoDY_N_W(IJK)
348 C_AS = ONEoDY_N_W(IJMK)
349 C_AT = ONEoDZ_T_W(IJK)
350 C_AB = ONEoDZ_T_W(IJKM)
351 ELSE
352 C_AE = ODX_E(I)
353 C_AW = ODX_E(IM)
354 C_AN = ODY_N(J)
355 C_AS = ODY_N(JM)
356 C_AT = ODZ(KP)
357 C_AB = ODZ(K)
358 ENDIF
359
360
361 = AVG_Z_H(AVG_X_H(MU_S(IJKC,M),MU_S(IJKE,M),I),&
362 AVG_X_H(MU_S(IJKT,M),MU_S(IJKTE,M),I),K)*&
363 C_AE*AYZ_W(IJK)
364
365 = AVG_Z_H(AVG_X_H(MU_S(IJKW,M),MU_S(IJKC,M),IM),&
366 AVG_X_H(MU_S(IJKWT,M),MU_S(IJKT,M),IM),K)*&
367 C_AW*AYZ_W(IMJK)
368
369
370 = AVG_Z_H(AVG_Y_H(MU_S(IJKC,M),MU_S(IJKN,M),J),&
371 AVG_Y_H(MU_S(IJKT,M),MU_S(IJKTN,M),J),K)*&
372 C_AN*AXZ_W(IJK)
373
374 = AVG_Z_H(AVG_Y_H(MU_S(IJKS,M),MU_S(IJKC,M),JM),&
375 AVG_Y_H(MU_S(IJKST,M),MU_S(IJKT,M),JM),K)*&
376 C_AS*AXZ_W(IJMK)
377
378
379
380 = MU_S(IJKT,M)*OX(I)*C_AT*AXY_W(IJK)
381
382 = MU_S(IJK,M)*OX(I)*C_AB*AXY_W(IJKM)
383
384 RETURN
385 END SUBROUTINE GET_WCELL_SDIFF_TERMS
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406 SUBROUTINE STORE_A_W_S0(A_W_S, M)
407
408
409
410 USE compar, only: ijkstart3, ijkend3
411
412 USE functions, only: flow_at_t
413 USE functions, only: ip_of, jp_of, kp_of
414 USE functions, only: im_of, jm_of, km_of
415
416 USE param, only: dimension_3
417 USE param1, only: zero
418 USE matrix, only: e, w, n, s, t, b
419
420 IMPLICIT NONE
421
422
423
424
425 INTEGER, INTENT(IN) :: M
426
427 DOUBLE PRECISION, INTENT(INOUT) :: A_W_s(DIMENSION_3, -3:3, M:M)
428
429
430
431
432 INTEGER :: IJK
433 INTEGER :: IMJK, IPJK, IJMK, IJPK, IJKM, IJKP
434
435 DOUBLE PRECISION :: flux_e, flux_w, flux_n, flux_s
436 DOUBLE PRECISION :: flux_t, flux_b
437
438 DOUBLE PRECISION :: D_fe, d_fw, d_fn, d_fs, d_ft, d_fb
439
440
441
442
443
444
445
446
447
448 DO IJK = ijkstart3, ijkend3
449
450 IF (FLOW_AT_T(IJK)) THEN
451
452
453 CALL GET_WCELL_SCFLUX_TERMS(flux_e, flux_w, flux_n, &
454 flux_s, flux_t, flux_b, ijk, M)
455
456 CALL GET_WCELL_SDIFF_TERMS(d_fe, d_fw, d_fn, d_fs, &
457 d_ft, d_fb, ijk, M)
458
459 IPJK = IP_OF(IJK)
460 IJPK = JP_OF(IJK)
461 IJKP = KP_OF(IJK)
462 IMJK = IM_OF(IJK)
463 IJMK = JM_OF(IJK)
464 IJKM = KM_OF(IJK)
465
466
467 IF (Flux_e >= ZERO) THEN
468 A_W_S(IJK,E,M) = D_Fe
469 A_W_S(IPJK,W,M) = D_Fe + Flux_e
470 ELSE
471 A_W_S(IJK,E,M) = D_Fe - Flux_e
472 A_W_S(IPJK,W,M) = D_Fe
473 ENDIF
474
475 IF (.NOT.FLOW_AT_T(IMJK)) THEN
476 IF (Flux_w >= ZERO) THEN
477 A_W_S(IJK,W,M) = D_Fw + Flux_w
478 ELSE
479 A_W_S(IJK,W,M) = D_Fw
480 ENDIF
481 ENDIF
482
483
484
485 IF (Flux_n >= ZERO) THEN
486 A_W_S(IJK,N,M) = D_Fn
487 A_W_S(IJPK,S,M) = D_Fn + Flux_n
488 ELSE
489 A_W_S(IJK,N,M) = D_Fn - Flux_n
490 A_W_S(IJPK,S,M) = D_Fn
491 ENDIF
492
493 IF (.NOT.FLOW_AT_T(IJMK)) THEN
494 IF (Flux_s >= ZERO) THEN
495 A_W_S(IJK,S,M) = D_Fs + Flux_s
496 ELSE
497 A_W_S(IJK,S,M) = D_Fs
498 ENDIF
499 ENDIF
500
501
502
503 IF (Flux_T >= ZERO) THEN
504 A_W_S(IJK,T,M) = D_Ft
505 A_W_S(IJKP,B,M) = D_Ft + Flux_t
506 ELSE
507 A_W_S(IJK,T,M) = D_Ft - Flux_t
508 A_W_S(IJKP,B,M) = D_Ft
509 ENDIF
510
511 IF (.NOT.FLOW_AT_T(IJKM)) THEN
512 IF (Flux_b >= ZERO) THEN
513 A_W_S(IJK,B,M) = D_Fb + Flux_b
514 ELSE
515 A_W_S(IJK,B,M) = D_Fb
516 ENDIF
517 ENDIF
518
519 ENDIF
520 ENDDO
521
522
523 RETURN
524 END SUBROUTINE STORE_A_W_S0
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543 SUBROUTINE STORE_A_W_SDC(M, B_M)
544
545
546
547 USE compar, only: ijkstart3, ijkend3
548
549 USE discretization, only: fpfoi_of
550
551 USE fldvar, only: w_s
552
553 USE function3, only: funijk3
554 USE functions, only: flow_at_t
555 USE functions, only: ip_of, jp_of, kp_of
556 USE functions, only: im_of, jm_of, km_of
557
558 USE indices, only: i_of, j_of, k_of
559
560 USE param, only: dimension_3, dimension_m
561 USE param1, only: zero
562
563 USE run, only: discretize, fpfoi
564 USE sendrecv3, only: send_recv3
565
566 USE tmp_array, only: U => Array1, V => Array2, WW => Array3
567 USE tmp_array, only: tmp4
568 USE tmp_array, only: lock_tmp_array, unlock_tmp_array
569 USE tmp_array, only: lock_tmp4_array, unlock_tmp4_array
570
571 USE xsi, only: calc_xsi
572 USE xsi_array, only: xsi_e, xsi_n, xsi_t
573 USE xsi_array, only: lock_xsi_array, unlock_xsi_array
574 IMPLICIT NONE
575
576
577
578
579 INTEGER, INTENT(IN) :: M
580
581 DOUBLE PRECISION, INTENT(INOUT) :: B_m(DIMENSION_3, 0:DIMENSION_M)
582
583
584
585
586 INTEGER :: I, J, K, IJK
587 INTEGER :: IPJK, IMJK, IJMK, IJPK, IJKM, IJKP
588 INTEGER :: IJK4, IPPP, IPPP4, JPPP, JPPP4, KPPP, KPPP4
589 INTEGER :: IMMM, IMMM4, JMMM, JMMM4, KMMM, KMMM4
590
591 INTEGER :: incr
592
593 DOUBLE PRECISION :: MOM_HO
594
595 DOUBLE PRECISION :: MOM_LO
596
597 DOUBLE PRECISION :: flux_e, flux_w, flux_n, flux_s
598 DOUBLE PRECISION :: flux_t, flux_b
599
600 DOUBLE PRECISION :: EAST_DC
601 DOUBLE PRECISION :: WEST_DC
602 DOUBLE PRECISION :: NORTH_DC
603 DOUBLE PRECISION :: SOUTH_DC
604 DOUBLE PRECISION :: TOP_DC
605 DOUBLE PRECISION :: BOTTOM_DC
606
607
608
609
610
611
612
613
614
615
616 call lock_tmp4_array
617 call lock_tmp_array
618 call lock_xsi_array
619
620 CALL GET_WCELL_SVTERMS(U, V, WW, M)
621
622
623 IF ( FPFOI ) THEN
624 Do IJK = ijkstart3, ijkend3
625 I = I_OF(IJK)
626 J = J_OF(IJK)
627 K = K_OF(IJK)
628 IJK4 = funijk3(I,J,K)
629 TMP4(IJK4) = W_S(IJK,M)
630 ENDDO
631 CALL send_recv3(tmp4)
632 ENDIF
633
634
635
636 =0
637 CALL CALC_XSI (DISCRETIZE(5), W_S(1,M), U, V, WW, XSI_E, XSI_N,&
638 XSI_T, incr)
639
640
641
642
643
644
645 DO IJK = ijkstart3, ijkend3
646
647 IF (FLOW_AT_T(IJK)) THEN
648
649
650 CALL GET_WCELL_SCFLUX_TERMS(flux_e, flux_w, flux_n, &
651 flux_s, flux_t, flux_b, ijk, M)
652
653 IPJK = IP_OF(IJK)
654 IMJK = IM_OF(IJK)
655 IJPK = JP_OF(IJK)
656 IJMK = JM_OF(IJK)
657 IJKP = KP_OF(IJK)
658 IJKM = KM_OF(IJK)
659
660
661 = IP_OF(IP_OF(IPJK))
662 IPPP4 = funijk3(I_OF(IPPP), J_OF(IPPP), K_OF(IPPP))
663 IMMM = IM_OF(IM_OF(IMJK))
664 IMMM4 = funijk3(I_OF(IMMM), J_OF(IMMM), K_OF(IMMM))
665 JPPP = JP_OF(JP_OF(IJPK))
666 JPPP4 = funijk3(I_OF(JPPP), J_OF(JPPP), K_OF(JPPP))
667 JMMM = JM_OF(JM_OF(IJMK))
668 JMMM4 = funijk3(I_OF(JMMM), J_OF(JMMM), K_OF(JMMM))
669 KPPP = KP_OF(KP_OF(IJKP))
670 KPPP4 = funijk3(I_OF(KPPP), J_OF(KPPP), K_OF(KPPP))
671 KMMM = KM_OF(KM_OF(IJKM))
672 KMMM4 = funijk3(I_OF(KMMM), J_OF(KMMM), K_OF(KMMM))
673
674
675
676 IF(U(IJK) >= ZERO)THEN
677 MOM_LO = W_S(IJK,M)
678 IF (FPFOI) MOM_HO = FPFOI_OF(W_S(IPJK,M), W_S(IJK,M), &
679 W_S(IMJK,M), W_S(IM_OF(IMJK),M))
680 ELSE
681 MOM_LO = W_S(IPJK,M)
682 IF (FPFOI) MOM_HO = FPFOI_OF(W_S(IJK,M), W_S(IPJK,M), &
683 W_S(IP_OF(IPJK),M), TMP4(IPPP4))
684 ENDIF
685 IF (.NOT. FPFOI) MOM_HO = XSI_E(IJK)*W_S(IPJK,M)+ &
686 (1.0-XSI_E(IJK))*W_S(IJK,M)
687 EAST_DC = Flux_e*(MOM_LO-MOM_HO)
688
689
690 IF(U(IMJK) >= ZERO)THEN
691 MOM_LO = W_S(IMJK,M)
692 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJK,M), W_S(IMJK,M), &
693 W_S(IM_OF(IMJK),M), TMP4(IMMM4))
694 ELSE
695 MOM_LO = W_S(IJK,M)
696 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IMJK,M), W_S(IJK,M), &
697 W_S(IPJK,M), W_S(IP_OF(IPJK),M))
698 ENDIF
699 IF (.NOT. FPFOI) MOM_HO = XSI_E(IMJK)*W_S(IJK,M)+ &
700 (1.0-XSI_E(IMJK))*W_S(IMJK,M)
701 WEST_DC = Flux_w*(MOM_LO-MOM_HO)
702
703
704
705 IF(V(IJK) >= ZERO)THEN
706 MOM_LO = W_S(IJK,M)
707 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJPK,M), W_S(IJK,M), &
708 W_S(IJMK,M), W_S(JM_OF(IJMK),M))
709 ELSE
710 MOM_LO = W_S(IJPK,M)
711 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJK,M), W_S(IJPK,M), &
712 W_S(JP_OF(IJPK),M), TMP4(JPPP4))
713 ENDIF
714 IF (.NOT. FPFOI) MOM_HO = XSI_N(IJK)*W_S(IJPK,M)+ &
715 (1.0-XSI_N(IJK))*W_S(IJK,M)
716 NORTH_DC = Flux_n*(MOM_LO-MOM_HO)
717
718
719 IF(V(IJMK) >= ZERO)THEN
720 MOM_LO = W_S(IJMK,M)
721 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJK,M), W_S(IJMK,M), &
722 W_S(JM_OF(IJMK),M), TMP4(JMMM4))
723 ELSE
724 MOM_LO = W_S(IJK,M)
725 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJMK,M), W_S(IJK,M), &
726 W_S(IJPK,M), W_S(JP_OF(IJPK),M))
727 ENDIF
728 IF (.NOT. FPFOI) MOM_HO = XSI_N(IJMK)*W_S(IJK,M)+ &
729 (1.0-XSI_N(IJMK))*W_S(IJMK,M)
730 SOUTH_DC = Flux_s*(MOM_LO-MOM_HO)
731
732
733
734 IF(WW(IJK) >= ZERO)THEN
735 MOM_LO = W_S(IJK,M)
736 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJKP,M), W_S(IJK,M), &
737 W_S(IJKM,M), W_S(KM_OF(IJKM),M))
738 ELSE
739 MOM_LO = W_S(IJKP,M)
740 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJK,M), W_S(IJKP,M), &
741 W_S(KP_OF(IJKP),M), TMP4(KPPP4))
742 ENDIF
743 IF (.NOT. FPFOI) MOM_HO = XSI_T(IJK)*W_S(IJKP,M)+ &
744 (1.0-XSI_T(IJK))*W_S(IJK,M)
745 TOP_DC = Flux_T*(MOM_LO-MOM_HO)
746
747
748 IF(WW(IJK) >= ZERO)THEN
749 MOM_LO = W_S(IJKM,M)
750 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJK,M), W_S(IJKM,M), &
751 W_S(KM_OF(IJKM),M), TMP4(KMMM4))
752 ELSE
753 MOM_LO = W_S(IJK,M)
754 IF(FPFOI) MOM_HO = FPFOI_OF(W_S(IJKM,M), W_S(IJK,M), &
755 W_S(IJKP,M), W_S(KP_OF(IJKP),M))
756 ENDIF
757 IF (.NOT. FPFOI) MOM_HO = XSI_T(IJKM)*W_S(IJK,M)+ &
758 (1.0-XSI_T(IJKM))*W_S(IJKM,M)
759 BOTTOM_DC = Flux_b*(MOM_LO-MOM_HO)
760
761
762
763 (IJK,M) = B_M(IJK,M)+WEST_DC-EAST_DC+SOUTH_DC-NORTH_DC+&
764 BOTTOM_DC-TOP_DC
765
766 ENDIF
767 ENDDO
768
769 call unlock_tmp4_array
770 call unlock_tmp_array
771 call unlock_xsi_array
772
773 RETURN
774 END SUBROUTINE STORE_A_W_SDC
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795 SUBROUTINE STORE_A_W_S1(A_W_S, M)
796
797
798
799 USE compar, only: ijkstart3, ijkend3
800 USE fldvar, only: w_s
801
802 USE functions, only: flow_at_t
803 USE functions, only: ip_of, jp_of, kp_of
804 USE functions, only: im_of, jm_of, km_of
805
806 USE param, only: dimension_3
807 USE param1, only: one
808
809 USE matrix, only: e, w, n, s, t, b
810
811 USE run, only: discretize
812
813 USE tmp_array, only: U => Array1, V => Array2, WW => Array3
814 USE tmp_array, only: lock_tmp_array, unlock_tmp_array
815
816 USE xsi, only: calc_xsi
817 USE xsi_array, only: xsi_e, xsi_n, xsi_t
818 USE xsi_array, only: lock_xsi_array, unlock_xsi_array
819
820 IMPLICIT NONE
821
822
823
824
825 INTEGER, INTENT(IN) :: M
826
827 DOUBLE PRECISION, INTENT(INOUT) :: A_W_s(DIMENSION_3, -3:3, M:M)
828
829
830
831
832 INTEGER :: IJK, IPJK, IMJK, IJPK, IJMK, IJKP, IJKM
833
834 INTEGER :: incr
835
836 DOUBLE PRECISION :: d_fe, d_fw, d_fn, d_fs, d_ft, d_fb
837
838 DOUBLE PRECISION :: Flux_e, flux_w, flux_n, flux_s
839 DOUBLE PRECISION :: flux_t, flux_b
840
841
842
843
844
845
846
847
848
849
850 call lock_tmp_array
851 call lock_xsi_array
852
853 CALL GET_WCELL_SVTERMS(U, V, WW, M)
854
855
856
857 =0
858 CALL CALC_XSI (DISCRETIZE(5), W_S(1,M), U, V, WW, XSI_E, XSI_N,&
859 XSI_T, incr)
860
861
862
863
864
865 DO IJK = ijkstart3, ijkend3
866
867 IF (FLOW_AT_T(IJK)) THEN
868
869
870 CALL GET_WCELL_SCFLUX_TERMS(flux_e, flux_w, flux_n, &
871 flux_s, flux_t, flux_b, ijk, M)
872 CALL GET_WCELL_SDIFF_TERMS(d_fe, d_fw, d_fn, d_fs, &
873 d_ft, d_fb, ijk, M)
874
875 IPJK = IP_OF(IJK)
876 IJPK = JP_OF(IJK)
877 IJKP = KP_OF(IJK)
878 IMJK = IM_OF(IJK)
879 IJMK = JM_OF(IJK)
880 IJKM = KM_OF(IJK)
881
882
883 (IJK,E,M) = D_Fe - XSI_E(IJK)*Flux_e
884 A_W_S(IPJK,W,M) = D_Fe + (ONE - XSI_E(IJK))*Flux_e
885
886 IF (.NOT.FLOW_AT_T(IMJK)) THEN
887 A_W_S(IJK,W,M) = D_Fw + (ONE - XSI_E(IMJK))*Flux_w
888 ENDIF
889
890
891
892 (IJK,N,M) = D_Fn - XSI_N(IJK)*Flux_n
893 A_W_S(IJPK,S,M) = D_Fn + (ONE - XSI_N(IJK))*Flux_n
894
895 IF (.NOT.FLOW_AT_T(IJMK)) THEN
896 A_W_S(IJK,S,M) = D_Fs + (ONE - XSI_N(IJMK))*Flux_s
897 ENDIF
898
899
900
901 (IJK,T,M) = D_Ft - XSI_T(IJK)*Flux_t
902 A_W_S(IJKP,B,M) = D_Ft + (ONE - XSI_T(IJK))*Flux_t
903
904 IF (.NOT.FLOW_AT_T(IJKM)) THEN
905 A_W_S(IJK,B,M) = D_Fb + (ONE - XSI_T(IJKM))*Flux_b
906 ENDIF
907
908 ENDIF
909 ENDDO
910
911
912 call unlock_tmp_array
913 call unlock_xsi_array
914
915 RETURN
916 END SUBROUTINE STORE_A_W_S1
917