@@ -54,6 +54,7 @@ MODULE CC_SCALARS
5454INTEGER, ALLOCATABLE, DIMENSION(:) :: JM_MAT_Z
5555
5656REAL(EB), ALLOCATABLE, DIMENSION(:) :: F_Z, RZ_Z, RZ_ZS, P_0_CV, TMP_0_CV, RHO_0_CV, ZCEN_CV
57+ REAL(EB), ALLOCATABLE, DIMENSION(:,:):: DELTA_UNKZ
5758REAL(EB), ALLOCATABLE, DIMENSION(:,:):: F_Z0, RZ_Z0
5859
5960REAL(EB), DIMENSION(0:3,0:3,0:3) :: U_TEMP,F_TEMP
@@ -587,9 +588,10 @@ SUBROUTINE CHECK_CFLVN_LINKED_CELLS(NM,DT,UVWMAX,R_DX2,MUTRM)
587588
588589! Local variables:
589590INTEGER :: I,J,K,ICC,JCC,IROW,IMAX,X1AXIS,ILH,IRC,IFC,IFACE,IFC2,IFACE2,ICFA,LOWHIGH
590- REAL(EB):: MU_TMP,MURDN,AF,VELN,CFLMAX_TMP,VNMAX_TMP,TWOD_FCT
591+ REAL(EB):: MU_TMP,MURDN,AF,VELN,CFLMAX_TMP,VNMAX_TMP,TWOD_FCT,MU_AVG
591592INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IJKT
592593REAL(EB), ALLOCATABLE, DIMENSION(:) :: UVWA, MUV, MURA, VOL, DIVG
594+ INTEGER, PARAMETER :: VN_DXN_METHOD = 2 ! 1: face-based sum, 2: face-based sum + dx/dy/dz in large CVs.
593595
594596IF(NUNKZ_LOC(NM)<1) RETURN
595597
@@ -776,9 +778,25 @@ SUBROUTINE CHECK_CFLVN_LINKED_CELLS(NM,DT,UVWMAX,R_DX2,MUTRM)
776778ENDIF
777779
778780IF (CHECK_VN) THEN
779- DO IROW=UNKZ_ILC(NM)+1,UNKZ_ILC(NM)+NUNKZ_LOC(NM)
780- MURA(IROW) = MURA(IROW)/VOL(IROW)
781- ENDDO
781+ IF (VN_DXN_METHOD==2) THEN
782+ DO IROW=UNKZ_ILC(NM)+1,UNKZ_ILC(NM)+NUNKZ_LOC(NM)
783+ I = IJKT(IAXIS,IROW); J = IJKT(JAXIS,IROW); K = IJKT(KAXIS,IROW)
784+ IF (VOL(IROW) >= DEFAULT_VOLFRAC_LINK*DX(I)*DY(J)*DZ(K)) THEN ! For large linked CVs relax VN criterion.
785+ MU_AVG = MUV(IROW)/VOL(IROW)
786+ IF (TWO_D) THEN
787+ MURA(IROW) = 2._EB*MU_AVG*(1._EB/DX(I)**2 + 1._EB/DZ(K)**2)
788+ ELSE
789+ MURA(IROW) = 2._EB*MU_AVG*(1._EB/DX(I)**2 + 1._EB/DY(J)**2 + 1._EB/DZ(K)**2)
790+ ENDIF
791+ ELSE
792+ MURA(IROW) = MURA(IROW)/VOL(IROW)
793+ ENDIF
794+ ENDDO
795+ ELSE
796+ DO IROW=UNKZ_ILC(NM)+1,UNKZ_ILC(NM)+NUNKZ_LOC(NM)
797+ MURA(IROW) = MURA(IROW)/VOL(IROW)
798+ ENDDO
799+ ENDIF
782800 IMAX = UNKZ_ILC(NM)+MAXLOC(MURA,DIM=1)
783801 VNMAX_TMP = DT * MURA(IMAX)
784802 IF(VNMAX_TMP > VN) THEN
@@ -7133,57 +7151,77 @@ SUBROUTINE SET_CFACES_P1_RDN
71337151INTEGER :: ICF, IFACE
71347152INTEGER :: ICC, JCC, I, J, K
71357153INTEGER :: IFACE_CELL, ICF_CELL, IROW
7154+ INTEGER :: IROW_DELTA
71367155REAL(EB):: AREAI
71377156REAL(EB), ALLOCATABLE, DIMENSION(:) :: DXN_UNKZ_LOC, AREA_UNKZ_LOC, VOL_UNKZ_LOC
7157+ INTEGER, PARAMETER :: RDN_METHOD = 2 ! 1: VOL/SOLIDAREA, 2: bbox projection
7158+ REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: XYZMIN_UNKZ, XYZMAX_UNKZ
7159+ REAL(EB) :: DELTA_X, DELTA_Y, DELTA_Z, DXN, NVEC_ABS(MAX_DIM)
7160+ TYPE(CFACE_TYPE), POINTER :: CFA
7161+ TYPE(BOUNDARY_COORD_TYPE), POINTER :: BC
71387162
71397163! ALLOCATE local arrays
71407164ALLOCATE(DXN_UNKZ_LOC(1:NUNKZ_LOCAL)); DXN_UNKZ_LOC(:) = 0._EB
71417165ALLOCATE(AREA_UNKZ_LOC(1:NUNKZ_LOCAL)); AREA_UNKZ_LOC(:) = 0._EB
71427166ALLOCATE(VOL_UNKZ_LOC(1:NUNKZ_LOCAL)); VOL_UNKZ_LOC(:) = 0._EB
7167+ IF (RDN_METHOD==1) THEN
7168+ ! Main Loop:
7169+ MESH_LOOP_01 : DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
71437170
7144- ! Main Loop:
7145- MESH_LOOP_01 : DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
7146-
7147- CALL POINT_TO_MESH(NM)
7171+ CALL POINT_TO_MESH(NM)
71487172
7149- ! Do a volume weighted average of distance to wall from linked cells, if one of them is a regular cell use 1/2 the
7150- ! distance of corner to corner sqrt(DX^2+DY^2+DZ^2).
7151- ! 1. Regular GASPHASE cells within the cc-region:
7152- DO K=1,KBAR
7153- DO J=1,JBAR
7154- DO I=1,IBAR
7155- IF (CCVAR(I,J,K,CC_UNKZ) <= 0 ) CYCLE ! Drop if regular gas cell has not been assigned unknown number.
7156- IROW = CCVAR(I,J,K,CC_UNKZ) - UNKZ_IND(NM_START) ! All row indexes must refer to ind_loc.
7157- VOL_UNKZ_LOC(IROW) = VOL_UNKZ_LOC(IROW) + (DX(I)*DY(J)*DZ(K))
7173+ ! Do a volume weighted average of distance to wall from linked cells, if one of them is a regular cell use 1/2 the
7174+ ! distance of corner to corner sqrt(DX^2+DY^2+DZ^2).
7175+ ! 1. Regular GASPHASE cells within the cc-region:
7176+ DO K=1,KBAR
7177+ DO J=1,JBAR
7178+ DO I=1,IBAR
7179+ IF (CCVAR(I,J,K,CC_UNKZ) <= 0 ) CYCLE ! Drop if regular gas cell has not been assigned unknown number.
7180+ IROW = CCVAR(I,J,K,CC_UNKZ) - UNKZ_IND(NM_START) ! All row indexes must refer to ind_loc.
7181+ VOL_UNKZ_LOC(IROW) = VOL_UNKZ_LOC(IROW) + (DX(I)*DY(J)*DZ(K))
7182+ ENDDO
71587183 ENDDO
71597184 ENDDO
7160- ENDDO
7161- ! 2. Cut-cells:
7162- DO ICC=1,MESHES(NM)%N_CUTCELL_MESH
7163- CC => CUT_CELL(ICC); I = CC%IJK(IAXIS); J = CC%IJK(JAXIS); K = CC%IJK(KAXIS)
7164- IF (CELL(CELL_INDEX(I,J,K))%SOLID) CYCLE
7165- DO JCC=1,CC%NCELL
7166- IROW = CC%UNKZ(JCC) - UNKZ_IND(NM_START)
7167- ! Mean INBOUNDARY cut-face distance to this cut-cell center, projected to cut-face normal:
7168- AREAI = 0._EB
7169- DO ICF_CELL=1,CC%CCELEM(1,JCC)
7170- IFACE_CELL = CC%CCELEM(ICF_CELL+1,JCC)
7171- IF (CC%FACE_LIST(1,IFACE_CELL) /= CC_FTYPE_CFINB) CYCLE
7172- ! Indexes of INBOUNDARY cutface on CUT_FACE:
7173- ICF = CC%FACE_LIST(4,IFACE_CELL)
7174- IFACE = CC%FACE_LIST(5,IFACE_CELL)
7175- ! Area sum:
7176- AREAI = AREAI + CUT_FACE(ICF)%AREA(IFACE)
7185+ ! 2. Cut-cells:
7186+ DO ICC=1,MESHES(NM)%N_CUTCELL_MESH
7187+ CC => CUT_CELL(ICC); I = CC%IJK(IAXIS); J = CC%IJK(JAXIS); K = CC%IJK(KAXIS)
7188+ IF (CELL(CELL_INDEX(I,J,K))%SOLID) CYCLE
7189+ DO JCC=1,CC%NCELL
7190+ IROW = CC%UNKZ(JCC) - UNKZ_IND(NM_START)
7191+ ! Mean INBOUNDARY cut-face distance to this cut-cell center, projected to cut-face normal:
7192+ AREAI = 0._EB
7193+ DO ICF_CELL=1,CC%CCELEM(1,JCC)
7194+ IFACE_CELL = CC%CCELEM(ICF_CELL+1,JCC)
7195+ IF (CC%FACE_LIST(1,IFACE_CELL) /= CC_FTYPE_CFINB) CYCLE
7196+ ! Indexes of INBOUNDARY cutface on CUT_FACE:
7197+ ICF = CC%FACE_LIST(4,IFACE_CELL)
7198+ IFACE = CC%FACE_LIST(5,IFACE_CELL)
7199+ ! Area sum:
7200+ AREAI = AREAI + CUT_FACE(ICF)%AREA(IFACE)
7201+ ENDDO
7202+ AREA_UNKZ_LOC(IROW) = AREA_UNKZ_LOC(IROW) + AREAI
7203+ VOL_UNKZ_LOC(IROW) = VOL_UNKZ_LOC(IROW) + CC%VOLUME(JCC)
71777204 ENDDO
7178- AREA_UNKZ_LOC(IROW) = AREA_UNKZ_LOC(IROW) + AREAI
7179- VOL_UNKZ_LOC(IROW) = VOL_UNKZ_LOC(IROW) + CC%VOLUME(JCC)
71807205 ENDDO
7181- ENDDO
71827206
7183- ENDDO MESH_LOOP_01
7207+ ENDDO MESH_LOOP_01
71847208
7185- ! Compute average DXN of all linked cells:
7186- DXN_UNKZ_LOC = VOL_UNKZ_LOC / (AREA_UNKZ_LOC + TWENTY_EPSILON_EB)
7209+ ! Compute average DXN of all linked cells:
7210+ DXN_UNKZ_LOC = VOL_UNKZ_LOC / (AREA_UNKZ_LOC + TWO_EPSILON_EB)
7211+ ELSE
7212+ ALLOCATE(XYZMIN_UNKZ(IAXIS:KAXIS,1:NUNKZ_LOCAL))
7213+ ALLOCATE(XYZMAX_UNKZ(IAXIS:KAXIS,1:NUNKZ_LOCAL))
7214+ CALL GET_LINKED_CELLS_BBOX(XYZMIN_UNKZ,XYZMAX_UNKZ)
7215+ IF (ALLOCATED(DELTA_UNKZ)) THEN
7216+ IF (SIZE(DELTA_UNKZ,DIM=2) /= NUNKZ_LOCAL) DEALLOCATE(DELTA_UNKZ)
7217+ ENDIF
7218+ IF (.NOT.ALLOCATED(DELTA_UNKZ)) ALLOCATE(DELTA_UNKZ(IAXIS:KAXIS,1:NUNKZ_LOCAL))
7219+ DO IROW_DELTA=1,NUNKZ_LOCAL
7220+ DELTA_UNKZ(IAXIS,IROW_DELTA) = MAX(0._EB,XYZMAX_UNKZ(IAXIS,IROW_DELTA)-XYZMIN_UNKZ(IAXIS,IROW_DELTA))
7221+ DELTA_UNKZ(JAXIS,IROW_DELTA) = MAX(0._EB,XYZMAX_UNKZ(JAXIS,IROW_DELTA)-XYZMIN_UNKZ(JAXIS,IROW_DELTA))
7222+ DELTA_UNKZ(KAXIS,IROW_DELTA) = MAX(0._EB,XYZMAX_UNKZ(KAXIS,IROW_DELTA)-XYZMIN_UNKZ(KAXIS,IROW_DELTA))
7223+ ENDDO
7224+ ENDIF
71877225
71887226! Finally Define B1%RDN:
71897227MESH_LOOP_02 : DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
@@ -7196,15 +7234,123 @@ SUBROUTINE SET_CFACES_P1_RDN
71967234 ICC = CF%CELL_LIST(2,LOW_IND,IFACE)
71977235 JCC = CF%CELL_LIST(3,LOW_IND,IFACE)
71987236 IROW = CUT_CELL(ICC)%UNKZ(JCC) - UNKZ_IND(NM_START)
7199- BOUNDARY_PROP1(CFACE(CF%CFACE_INDEX(IFACE))%B1_INDEX)%RDN = 1._EB/DXN_UNKZ_LOC(IROW)
7237+ SELECT CASE (RDN_METHOD)
7238+ CASE (1)
7239+ BOUNDARY_PROP1(CFACE(CF%CFACE_INDEX(IFACE))%B1_INDEX)%RDN = 1._EB/DXN_UNKZ_LOC(IROW)
7240+ CASE (2)
7241+ CFA => CFACE(CF%CFACE_INDEX(IFACE))
7242+ BC => BOUNDARY_COORD(CFA%BC_INDEX)
7243+ DELTA_X = XYZMAX_UNKZ(IAXIS,IROW) - XYZMIN_UNKZ(IAXIS,IROW)
7244+ DELTA_Y = XYZMAX_UNKZ(JAXIS,IROW) - XYZMIN_UNKZ(JAXIS,IROW)
7245+ DELTA_Z = XYZMAX_UNKZ(KAXIS,IROW) - XYZMIN_UNKZ(KAXIS,IROW)
7246+ NVEC_ABS(IAXIS:KAXIS) = ABS(BC%NVEC(IAXIS:KAXIS))
7247+ DXN = DELTA_X*NVEC_ABS(IAXIS) + DELTA_Y*NVEC_ABS(JAXIS) + DELTA_Z*NVEC_ABS(KAXIS)
7248+ BOUNDARY_PROP1(CFA%B1_INDEX)%RDN = 1._EB/(DXN + TWO_EPSILON_EB)
7249+ END SELECT
72007250 ENDDO
72017251 ENDDO
72027252ENDDO MESH_LOOP_02
7253+ IF (ALLOCATED(XYZMIN_UNKZ)) DEALLOCATE(XYZMIN_UNKZ, XYZMAX_UNKZ)
72037254DEALLOCATE(DXN_UNKZ_LOC, VOL_UNKZ_LOC, AREA_UNKZ_LOC)
72047255
72057256RETURN
72067257END SUBROUTINE SET_CFACES_P1_RDN
72077258
7259+ ! ---------------------- GET_LINKED_CELLS_BBOX --------------------------------
7260+
7261+ SUBROUTINE GET_LINKED_CELLS_BBOX(XYZMIN_UNKZ,XYZMAX_UNKZ)
7262+
7263+ ! Local Variables:
7264+ INTEGER :: I, J, K, ICC, JCC, IROW
7265+ INTEGER :: IFACE, IFC, FTYPE, X1AXIS, LOWHIGH, ILH, IFC2, IFACE2, NVFACE, IPT, IVERT
7266+ REAL(EB) :: XLO, XHI, YLO, YHI, ZLO, ZHI
7267+ REAL(EB), INTENT(OUT) :: XYZMIN_UNKZ(IAXIS:KAXIS,1:NUNKZ_LOCAL)
7268+ REAL(EB), INTENT(OUT) :: XYZMAX_UNKZ(IAXIS:KAXIS,1:NUNKZ_LOCAL)
7269+
7270+ XYZMIN_UNKZ = HUGE(1._EB); XYZMAX_UNKZ = -HUGE(1._EB)
7271+ MESH_LOOP_01 : DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
7272+ CALL POINT_TO_MESH(NM)
7273+ DO K=1,KBAR
7274+ DO J=1,JBAR
7275+ DO I=1,IBAR
7276+ IF (CCVAR(I,J,K,CC_UNKZ) <= 0 ) CYCLE
7277+ IROW = CCVAR(I,J,K,CC_UNKZ) - UNKZ_IND(NM_START)
7278+ XLO = X(I-1); XHI = X(I)
7279+ YLO = Y(J-1); YHI = Y(J)
7280+ ZLO = Z(K-1); ZHI = Z(K)
7281+ XYZMIN_UNKZ(IAXIS,IROW) = MIN(XYZMIN_UNKZ(IAXIS,IROW),XLO)
7282+ XYZMIN_UNKZ(JAXIS,IROW) = MIN(XYZMIN_UNKZ(JAXIS,IROW),YLO)
7283+ XYZMIN_UNKZ(KAXIS,IROW) = MIN(XYZMIN_UNKZ(KAXIS,IROW),ZLO)
7284+ XYZMAX_UNKZ(IAXIS,IROW) = MAX(XYZMAX_UNKZ(IAXIS,IROW),XHI)
7285+ XYZMAX_UNKZ(JAXIS,IROW) = MAX(XYZMAX_UNKZ(JAXIS,IROW),YHI)
7286+ XYZMAX_UNKZ(KAXIS,IROW) = MAX(XYZMAX_UNKZ(KAXIS,IROW),ZHI)
7287+ ENDDO
7288+ ENDDO
7289+ ENDDO
7290+
7291+ DO ICC=1,MESHES(NM)%N_CUTCELL_MESH
7292+ CC => CUT_CELL(ICC); I = CC%IJK(IAXIS); J = CC%IJK(JAXIS); K = CC%IJK(KAXIS)
7293+ IF (CELL(CELL_INDEX(I,J,K))%SOLID) CYCLE
7294+ DO JCC=1,CC%NCELL
7295+ IROW = CC%UNKZ(JCC) - UNKZ_IND(NM_START)
7296+ XLO = HUGE(1._EB); XHI = -HUGE(1._EB)
7297+ YLO = HUGE(1._EB); YHI = -HUGE(1._EB)
7298+ ZLO = HUGE(1._EB); ZHI = -HUGE(1._EB)
7299+ DO IFC=1,CC%CCELEM(1,JCC)
7300+ IFACE = CC%CCELEM(IFC+1,JCC)
7301+ FTYPE = CC%FACE_LIST(1,IFACE)
7302+ SELECT CASE (FTYPE)
7303+ CASE (CC_FTYPE_CFGAS,CC_FTYPE_CFINB)
7304+ IFC2 = CC%FACE_LIST(4,IFACE)
7305+ IFACE2 = CC%FACE_LIST(5,IFACE)
7306+ NVFACE = CUT_FACE(IFC2)%CFELEM(1,IFACE2)
7307+ DO IPT=1,NVFACE
7308+ IVERT = CUT_FACE(IFC2)%CFELEM(IPT+1,IFACE2)
7309+ XLO = MIN(XLO,CUT_FACE(IFC2)%XYZVERT(IAXIS,IVERT))
7310+ XHI = MAX(XHI,CUT_FACE(IFC2)%XYZVERT(IAXIS,IVERT))
7311+ YLO = MIN(YLO,CUT_FACE(IFC2)%XYZVERT(JAXIS,IVERT))
7312+ YHI = MAX(YHI,CUT_FACE(IFC2)%XYZVERT(JAXIS,IVERT))
7313+ ZLO = MIN(ZLO,CUT_FACE(IFC2)%XYZVERT(KAXIS,IVERT))
7314+ ZHI = MAX(ZHI,CUT_FACE(IFC2)%XYZVERT(KAXIS,IVERT))
7315+ ENDDO
7316+ CASE (CC_FTYPE_RCGAS)
7317+ LOWHIGH = CC%FACE_LIST(2,IFACE)
7318+ X1AXIS = CC%FACE_LIST(3,IFACE)
7319+ ILH = LOWHIGH - 1
7320+ SELECT CASE (X1AXIS)
7321+ CASE (IAXIS)
7322+ XLO = MIN(XLO,X(I-1+ILH)); XHI = MAX(XHI,X(I-1+ILH))
7323+ YLO = MIN(YLO,Y(J-1)); YHI = MAX(YHI,Y(J))
7324+ ZLO = MIN(ZLO,Z(K-1)); ZHI = MAX(ZHI,Z(K))
7325+ CASE (JAXIS)
7326+ XLO = MIN(XLO,X(I-1)); XHI = MAX(XHI,X(I))
7327+ YLO = MIN(YLO,Y(J-1+ILH)); YHI = MAX(YHI,Y(J-1+ILH))
7328+ ZLO = MIN(ZLO,Z(K-1)); ZHI = MAX(ZHI,Z(K))
7329+ CASE (KAXIS)
7330+ XLO = MIN(XLO,X(I-1)); XHI = MAX(XHI,X(I))
7331+ YLO = MIN(YLO,Y(J-1)); YHI = MAX(YHI,Y(J))
7332+ ZLO = MIN(ZLO,Z(K-1+ILH)); ZHI = MAX(ZHI,Z(K-1+ILH))
7333+ END SELECT
7334+ END SELECT
7335+ ENDDO
7336+ IF (XLO > XHI) THEN
7337+ XLO = X(I-1); XHI = X(I)
7338+ YLO = Y(J-1); YHI = Y(J)
7339+ ZLO = Z(K-1); ZHI = Z(K)
7340+ ENDIF
7341+ XYZMIN_UNKZ(IAXIS,IROW) = MIN(XYZMIN_UNKZ(IAXIS,IROW),XLO)
7342+ XYZMIN_UNKZ(JAXIS,IROW) = MIN(XYZMIN_UNKZ(JAXIS,IROW),YLO)
7343+ XYZMIN_UNKZ(KAXIS,IROW) = MIN(XYZMIN_UNKZ(KAXIS,IROW),ZLO)
7344+ XYZMAX_UNKZ(IAXIS,IROW) = MAX(XYZMAX_UNKZ(IAXIS,IROW),XHI)
7345+ XYZMAX_UNKZ(JAXIS,IROW) = MAX(XYZMAX_UNKZ(JAXIS,IROW),YHI)
7346+ XYZMAX_UNKZ(KAXIS,IROW) = MAX(XYZMAX_UNKZ(KAXIS,IROW),ZHI)
7347+ ENDDO
7348+ ENDDO
7349+ ENDDO MESH_LOOP_01
7350+
7351+ RETURN
7352+ END SUBROUTINE GET_LINKED_CELLS_BBOX
7353+
72087354END SUBROUTINE CC_SET_DATA
72097355
72107356! ------------------------------- CC_END_STEP --------------------------------
0 commit comments