diff --git a/Source/dump.f90 b/Source/dump.f90 index 6da3385495c..29fc93f83fd 100644 --- a/Source/dump.f90 +++ b/Source/dump.f90 @@ -2288,11 +2288,13 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE VT%BOUNDARY_TYPE==PERIODIC_BOUNDARY .OR. & VT%TYPE_INDICATOR==2) THEN ! Render this vent invisible in Smokeview WHERE (VENT_INDICES(HI1:HI2,VI1:VI2,FACE_INDEX)==0) VENT_INDICES(HI1:HI2,VI1:VI2,FACE_INDEX) = -1 - ELSE ! Make solid color vents invisible (they will be replaced by dummy vents) + ELSE ! Tag user-specified vents WHERE (VENT_INDICES(HI1:HI2,VI1:VI2,FACE_INDEX)==0) VENT_INDICES(HI1:HI2,VI1:VI2,FACE_INDEX) = N - VT%COLOR_INDICATOR = 8 - VT%TYPE_INDICATOR = -2 - VT%TRANSPARENCY = 0._EB + IF (VT%OBST_INDEX==0) THEN ! a dummy vent will be created and drawn rather than the actual vent. + VT%COLOR_INDICATOR = 8 + VT%TYPE_INDICATOR = -2 + VT%TRANSPARENCY = 0._EB + ENDIF ENDIF ENDDO VENT_LOOP @@ -2306,9 +2308,11 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE XX = M%X(0) - 0.001_EB*M%DX(0) CALL SEARCH_OTHER_MESHES(XX,YY,ZZ,NOM,IIO,JJO,KKO) IF (NOM>0 .AND. VENT_INDICES(J,K,1)<1) VENT_INDICES(J,K,1)=-1 + IF (M%WALL(M%CELL(M%CELL_INDEX(1,J,K))%WALL_INDEX(-1))%OBST_INDEX>0) VENT_INDICES(J,K,1)=-1 XX = M%X(M%IBAR) + 0.001_EB*M%DX(M%IBAR) CALL SEARCH_OTHER_MESHES(XX,YY,ZZ,NOM,IIO,JJO,KKO) IF (NOM>0 .AND. VENT_INDICES(J,K,2)<1) VENT_INDICES(J,K,2)=-1 + IF (M%WALL(M%CELL(M%CELL_INDEX(M%IBAR,J,K))%WALL_INDEX(1))%OBST_INDEX>0) VENT_INDICES(J,K,2)=-1 ENDDO ENDDO @@ -2319,9 +2323,11 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE YY = M%Y(0) - 0.001_EB*M%DY(0) CALL SEARCH_OTHER_MESHES(XX,YY,ZZ,NOM,IIO,JJO,KKO) IF (NOM>0 .AND. VENT_INDICES(I,K,3)<1) VENT_INDICES(I,K,3)=-1 + IF (M%WALL(M%CELL(M%CELL_INDEX(I,1,K))%WALL_INDEX(-2))%OBST_INDEX>0) VENT_INDICES(I,K,3)=-1 YY = M%Y(M%JBAR) + 0.001_EB*M%DY(M%JBAR) CALL SEARCH_OTHER_MESHES(XX,YY,ZZ,NOM,IIO,JJO,KKO) IF (NOM>0 .AND. VENT_INDICES(I,K,4)<1) VENT_INDICES(I,K,4)=-1 + IF (M%WALL(M%CELL(M%CELL_INDEX(I,M%JBAR,K))%WALL_INDEX(2))%OBST_INDEX>0) VENT_INDICES(I,K,4)=-1 ENDDO ENDDO @@ -2332,9 +2338,11 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE ZZ = M%Z(0) - 0.001_EB*M%DZ(0) CALL SEARCH_OTHER_MESHES(XX,YY,ZZ,NOM,IIO,JJO,KKO) IF (NOM>0 .AND. VENT_INDICES(I,J,5)<1) VENT_INDICES(I,J,5)=-1 + IF (M%WALL(M%CELL(M%CELL_INDEX(I,J,1))%WALL_INDEX(-3))%OBST_INDEX>0) VENT_INDICES(I,J,5)=-1 ZZ = M%Z(M%KBAR) + 0.001_EB*M%DZ(M%KBAR) CALL SEARCH_OTHER_MESHES(XX,YY,ZZ,NOM,IIO,JJO,KKO) IF (NOM>0 .AND. VENT_INDICES(I,J,6)<1) VENT_INDICES(I,J,6)=-1 + IF (M%WALL(M%CELL(M%CELL_INDEX(I,J,M%KBAR))%WALL_INDEX(3))%OBST_INDEX>0) VENT_INDICES(I,J,6)=-1 ENDDO ENDDO diff --git a/Source/init.f90 b/Source/init.f90 index 657f1a2668d..05fb0a828c7 100644 --- a/Source/init.f90 +++ b/Source/init.f90 @@ -2956,6 +2956,7 @@ SUBROUTINE INIT_WALL_CELL(NM,I,J,K,OBST_INDEX,IW,IOR,SURF_INDEX,IERR,TT) VENT_INDEX_FOUND = N VENT_INDEX = N SURF_INDEX_NEW = VT%SURF_INDEX + VT%OBST_INDEX = OBST_INDEX ENDDO VENT_SEARCH_LOOP diff --git a/Source/read.f90 b/Source/read.f90 index 54b5b70f1ea..afab2f6bede 100644 --- a/Source/read.f90 +++ b/Source/read.f90 @@ -11704,13 +11704,13 @@ SUBROUTINE READ_VENT USE MISC_FUNCTIONS, ONLY: PROCESS_MESH_NEIGHBORHOOD INTEGER :: N,N_TOTAL,NM,NNN,IOR,I1,I2,J1,J2,K1,K2,RGB(3),N_EDDY,II,JJ,KK,OBST_INDEX,N_EXPLICIT,N_IMPLICIT_VENTS,I_MODE,& - N_ORIGINAL_VENTS,IC0,IC1 + N_ORIGINAL_VENTS,IC0,IC1,IC REAL(EB) :: SPREAD_RATE,TRANSPARENCY,XYZ(3),TMP_EXTERIOR,DYNAMIC_PRESSURE,XB_USER(6),XB_MESH(6), & REYNOLDS_STRESS(3,3),L_EDDY,VEL,VEL_RMS,L_EDDY_IJ(3,3),UVW(3),RADIUS CHARACTER(LABEL_LENGTH) :: ID,DEVC_ID,CTRL_ID,SURF_ID,PRESSURE_RAMP,TMP_EXTERIOR_RAMP,MULT_ID,OBST_ID CHARACTER(25) :: COLOR TYPE(MULTIPLIER_TYPE), POINTER :: MR -LOGICAL :: REJECT_VENT,OUTLINE,GEOM,SOLID_FOUND,AREA_ADJUST +LOGICAL :: REJECT_VENT,OUTLINE,GEOM,SOLID_FOUND,AREA_ADJUST,BLOCKED TYPE IMPLICIT_VENT_TYPE REAL(EB) :: XB(6) INTEGER, DIMENSION(3) :: RGB=-1 @@ -11961,6 +11961,45 @@ SUBROUTINE READ_VENT IF (K1>KBAR .OR. K2<0) REJECT_VENT=.TRUE. ENDIF + ! Look for vents that are completely blocked by non-removable obstructions + + IF (I1==I2 .AND. (I1==0 .OR. I2==IBAR)) THEN + BLOCKED = .TRUE. + DO K=K1+1,K2 + DO J=J1+1,J2 + IC = CELL_INDEX(I1+1,J,K) + IF (I1==0 .AND. (.NOT.CELL(IC)%SOLID.OR.OBSTRUCTION(CELL(IC)%OBST_INDEX)%REMOVABLE)) BLOCKED = .FALSE. + IC = CELL_INDEX(I2,J,K) + IF (I2==IBAR .AND. (.NOT.CELL(IC)%SOLID.OR.OBSTRUCTION(CELL(IC)%OBST_INDEX)%REMOVABLE)) BLOCKED = .FALSE. + ENDDO + ENDDO + IF (BLOCKED) REJECT_VENT = .TRUE. + ENDIF + IF (J1==J2 .AND. (J1==0 .OR. J2==JBAR)) THEN + BLOCKED = .TRUE. + DO K=K1+1,K2 + DO I=I1+1,I2 + IC = CELL_INDEX(I,J1+1,K) + IF (J1==0 .AND. (.NOT.CELL(IC)%SOLID.OR.OBSTRUCTION(CELL(IC)%OBST_INDEX)%REMOVABLE)) BLOCKED = .FALSE. + IC = CELL_INDEX(I,J2,K) + IF (J2==JBAR .AND. (.NOT.CELL(IC)%SOLID.OR.OBSTRUCTION(CELL(IC)%OBST_INDEX)%REMOVABLE)) BLOCKED = .FALSE. + ENDDO + ENDDO + IF (BLOCKED) REJECT_VENT = .TRUE. + ENDIF + IF (K1==K2 .AND. (K1==0 .OR. K2==KBAR)) THEN + BLOCKED = .TRUE. + DO J=J1+1,J2 + DO I=I1+1,I2 + IC = CELL_INDEX(I,J,K1+1) + IF (K1==0 .AND. (.NOT.CELL(IC)%SOLID.OR.OBSTRUCTION(CELL(IC)%OBST_INDEX)%REMOVABLE)) BLOCKED = .FALSE. + IC = CELL_INDEX(I,J,K2) + IF (K2==KBAR .AND. (.NOT.CELL(IC)%SOLID.OR.OBSTRUCTION(CELL(IC)%OBST_INDEX)%REMOVABLE)) BLOCKED = .FALSE. + ENDDO + ENDDO + IF (BLOCKED) REJECT_VENT = .TRUE. + ENDIF + ! If the VENT is rejected, cycle IF (REJECT_VENT) THEN