Skip to content

Commit 5da739b

Browse files
authored
Merge pull request #14707 from drjfloyd/master
FDS Source: Fix terrain VENT error and SMV write error for GEOM
2 parents ffd1ea6 + 4c01878 commit 5da739b

File tree

6 files changed

+77
-14
lines changed

6 files changed

+77
-14
lines changed

Source/dump.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2349,6 +2349,10 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
23492349
ENDIF
23502350
ENDIF
23512351

2352+
! Render GEOM vents using SURF properties (that is, do not draw GEOM vents in Smokeview)
2353+
2354+
IF (VT%GEOM) VT%TYPE_INDICATOR = -2
2355+
23522356
ENDDO VENT_LOOP
23532357

23542358
! Look for interpolated mesh boundaries and ensure that Smokeview leaves these blank (VENT_INDICES=-1).

Source/geom.f90

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4121,11 +4121,13 @@ SUBROUTINE GET_EXT_INB_CUTFACES_TO_CFACE
41214121

41224122
! Local Variables:
41234123
INTEGER :: ICF, CFACE_INDEX_LOCAL, SURF_INDEX
4124+
INTEGER :: IVENT
41244125
REAL(EB):: ADDMAT(IAXIS:KAXIS,LOW_IND:HIGH_IND)
41254126

41264127
! GET_CUTCELLS_VERBOSE variables:
41274128
INTEGER, ALLOCATABLE, DIMENSION(:) :: NCFACE_BY_MESH
41284129

4130+
TYPE(VENTS_TYPE), POINTER :: VT
41294131
TYPE(CFACE_TYPE), POINTER :: CFA
41304132

41314133
IF(GET_CUTCELLS_VERBOSE) CALL CPU_TIME(CPUTIME_START)
@@ -4308,10 +4310,50 @@ SUBROUTINE GET_EXT_INB_CUTFACES_TO_CFACE
43084310
MESHES(NM)%N_INTERNAL_CFACE_CELLS = CFACE_INDEX_LOCAL - MESHES(NM)%INTERNAL_CFACE_CELLS_LB
43094311
ENDDO MESH_LOOP_1
43104312

4313+
! Second loop, apply VENTS to change SURF_ID associated with CFACEs:
4314+
MESH_LOOP_2 : DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
4315+
CALL POINT_TO_MESH(NM)
4316+
4317+
! ! Currently : Modify CFACE SURF_INDEX with VENT information: This needs more development.
4318+
4319+
VENT_LOOP : DO IVENT=1,MESHES(NM)%N_VENT
4320+
VT => VENTS(IVENT)
4321+
IF(.NOT.VT%GEOM) CYCLE VENT_LOOP ! Do not apply vent to Geometries.
4322+
4323+
! This test is a simplified test for VENTS changing the CFACE SURF_ID to VENT SURF_ID for all CFACEs whose
4324+
! centroid locations lay within the frame of the IOR grid aligned VENT:
4325+
ADDMAT = 0._EB;
4326+
SELECT CASE(ABS(VT%IOR))
4327+
CASE(IAXIS)
4328+
ADDMAT(IAXIS,LOW_IND) = -(XF_MAX-XS_MIN) ! -DX(VT%I1) Set normal size to 2 times domain size.
4329+
ADDMAT(IAXIS,HIGH_IND) = (XF_MAX-XS_MIN) ! DX(VT%I2) XF_MAX, etc. defined in cons.f90.
4330+
CASE(JAXIS)
4331+
ADDMAT(JAXIS,LOW_IND) = -(YF_MAX-YS_MIN) ! -DY(VT%J1)
4332+
ADDMAT(JAXIS,HIGH_IND) = (YF_MAX-YS_MIN) ! DY(VT%J2)
4333+
CASE(KAXIS)
4334+
ADDMAT(KAXIS,LOW_IND) = -(ZF_MAX-ZS_MIN) ! -DZ(VT%K1)
4335+
ADDMAT(KAXIS,HIGH_IND) = (ZF_MAX-ZS_MIN) ! DZ(VT%K2)
4336+
END SELECT
4337+
! CFACE Loop to modify SURF_INDEX in INTERNAL_CFACE_CELLS:
4338+
CFACE_LOOP_2 : DO CFACE_INDEX_LOCAL=INTERNAL_CFACE_CELLS_LB+1,INTERNAL_CFACE_CELLS_LB+N_INTERNAL_CFACE_CELLS
4339+
CFA => CFACE(CFACE_INDEX_LOCAL)
4340+
BC => BOUNDARY_COORD(CFA%BC_INDEX)
4341+
IF (BC%X < X(VT%I1)+ADDMAT(IAXIS,LOW_IND )) CYCLE CFACE_LOOP_2
4342+
IF (BC%X > X(VT%I2)+ADDMAT(IAXIS,HIGH_IND)) CYCLE CFACE_LOOP_2
4343+
IF (BC%Y < Y(VT%J1)+ADDMAT(JAXIS,LOW_IND )) CYCLE CFACE_LOOP_2
4344+
IF (BC%Y > Y(VT%J2)+ADDMAT(JAXIS,HIGH_IND)) CYCLE CFACE_LOOP_2
4345+
IF (BC%Z < Z(VT%K1)+ADDMAT(KAXIS,LOW_IND )) CYCLE CFACE_LOOP_2
4346+
IF (BC%Z > Z(VT%K2)+ADDMAT(KAXIS,HIGH_IND)) CYCLE CFACE_LOOP_2
4347+
CFA%VENT_INDEX = IVENT
4348+
CFA%SURF_INDEX = VT%SURF_INDEX
4349+
ENDDO CFACE_LOOP_2
4350+
ENDDO VENT_LOOP
4351+
ENDDO MESH_LOOP_2
43114352
! - At this pont all final values of SURF_INDEX have been given to CFACEs.
43124353

43134354
! Third loop, 1. Compute final FDS area integrals by SURF_ID and GEOM.
4314-
! 2. Compute input areas by SURF_ID and GEOM. First sum over GEOM FACES SURF_IDs.
4355+
! 2. Compute input areas by SURF_ID and GEOM. First sum over GEOM FACES SURF_IDs,
4356+
! then VENTS input surfaces are assigned to corresponding GEOMs and SURF_IDs if present (VENTs take precedence).
43154357
IF(N_GEOMETRY>0) THEN
43164358
ALLOCATE(FDS_AREA_GEOM(0:N_SURF,N_GEOMETRY)); FDS_AREA_GEOM = 0._EB
43174359
ENDIF
@@ -8835,16 +8877,15 @@ SUBROUTINE INIT_CFACE_CELL(NM,ICF,IFACE,CFACE_INDEX,SURF_INDEX,STAGE_FLG,IS_INB,
88358877
INS_INB_COND_1 : IF (IS_INB) THEN
88368878
B1%VEL_ERR_NEW=CF%VEL(IFACE) - 0._EB ! Assumes zero velocity of solid.
88378879

8838-
IBOD = CF%BODTRI(1,IFACE)
8839-
IWSEL = CF%BODTRI(2,IFACE)
8840-
88418880
! Normal to cut-face:
88428881
V2(IAXIS:KAXIS) = CF%XYZVERT(IAXIS:KAXIS,CF%CFELEM(2,IFACE))-CF%XYZCEN(IAXIS:KAXIS,IFACE)
88438882
V3(IAXIS:KAXIS) = CF%XYZVERT(IAXIS:KAXIS,CF%CFELEM(3,IFACE))-CF%XYZCEN(IAXIS:KAXIS,IFACE)
88448883
CALL CROSS_PRODUCT(BC%NVEC(IAXIS:KAXIS),V2,V3)
88458884
IF(NORM2(BC%NVEC)>TWO_EPSILON_EB .AND. CF%CFACE_ORIGIN(IFACE)==BLOCKED_SPLIT_CELL) THEN
88468885
BC%NVEC(IAXIS:KAXIS) = BC%NVEC(IAXIS:KAXIS)/NORM2(BC%NVEC)
88478886
ELSE
8887+
IBOD =CF%BODTRI(1,IFACE)
8888+
IWSEL=CF%BODTRI(2,IFACE)
88488889
BC%NVEC(IAXIS:KAXIS) = GEOMETRY(IBOD)%FACES_NORMAL(IAXIS:KAXIS,IWSEL)
88498890
ENDIF
88508891
X1AXIS = MAXLOC(ABS(BC%NVEC(IAXIS:KAXIS)),DIM=1)
@@ -8878,6 +8919,7 @@ SUBROUTINE INIT_CFACE_CELL(NM,ICF,IFACE,CFACE_INDEX,SURF_INDEX,STAGE_FLG,IS_INB,
88788919
! External mesh boundary CFACES inherit the underlaying WALL type.
88798920
CFA%BOUNDARY_TYPE = WC%BOUNDARY_TYPE
88808921
CFA%NODE_INDEX = SURFACE(WC%SURF_INDEX)%NODE_INDEX
8922+
CFA%VENT_INDEX = WC%VENT_INDEX
88818923

88828924
BC%II = WC_BC%II
88838925
BC%JJ = WC_BC%JJ
@@ -23714,10 +23756,10 @@ SUBROUTINE READ_GEOM
2371423756

2371523757
DEALLOCATE(GEOM_LINE)
2371623758

23717-
CC_IBM = .TRUE.
23718-
2371923759
IF( (T_END-T_BEGIN) < TWO_EPSILON_EB) RETURN
2372023760

23761+
CC_IBM = .TRUE.
23762+
2372123763
! If unstructured projection defined set Pressure solver on unstructured grid.
2372223764
IF (PRES_FLAG/=UGLMAT_FLAG) THEN
2372323765
PRES_METHOD = 'ULMAT'

Source/hvac.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1038,7 +1038,7 @@ SUBROUTINE PROC_HVAC
10381038

10391039
ENDDO NODE_LOOP
10401040

1041-
GEOM_IF: IF (CC_IBM .AND. ANY(SURFACE%NODE_INDEX>0)) THEN
1041+
GEOM_IF: IF (N_GEOMETRY > 0 .AND. ANY(SURFACE%NODE_INDEX>0)) THEN
10421042
CF_AREA = 0._EB
10431043
CF_X = 0._EB
10441044
CF_Y = 0._EB

Source/init.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2854,6 +2854,7 @@ SUBROUTINE INIT_WALL_CELL(NM,I,J,K,OBST_INDEX,IW,IOR,SURF_INDEX,IERR)
28542854
VENT_SEARCH_LOOP: DO N=1,M%N_VENT
28552855

28562856
VT => M%VENTS(N)
2857+
IF (VT%GEOM) CYCLE VENT_SEARCH_LOOP
28572858
IF (OBST_INDEX>0) THEN
28582859
IF (VT%BOUNDARY_TYPE==OPEN_BOUNDARY) CYCLE VENT_SEARCH_LOOP
28592860
IF (.NOT.M%OBSTRUCTION(OBST_INDEX)%ALLOW_VENT) CYCLE VENT_SEARCH_LOOP

Source/read.f90

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11844,14 +11844,14 @@ SUBROUTINE READ_VENT
1184411844
CHARACTER(LABEL_LENGTH) :: ID,DEVC_ID,CTRL_ID,SURF_ID,PRESSURE_RAMP,TMP_EXTERIOR_RAMP,MULT_ID,OBST_ID
1184511845
CHARACTER(25) :: COLOR
1184611846
TYPE(MULTIPLIER_TYPE), POINTER :: MR
11847-
LOGICAL :: REJECT_VENT,OUTLINE,SOLID_FOUND,AREA_ADJUST,BLOCKED
11847+
LOGICAL :: REJECT_VENT,OUTLINE,GEOM,SOLID_FOUND,AREA_ADJUST,BLOCKED
1184811848
TYPE IMPLICIT_VENT_TYPE
1184911849
REAL(EB) :: XB(6)
1185011850
INTEGER, DIMENSION(3) :: RGB=-1
1185111851
CHARACTER(LABEL_LENGTH) :: MB='null',SURF_ID='null',ID='null'
1185211852
END TYPE
1185311853
TYPE(IMPLICIT_VENT_TYPE), ALLOCATABLE, DIMENSION(:) :: IMPLICIT_VENT
11854-
NAMELIST /VENT/ AREA_ADJUST,COLOR,CTRL_ID,DB,DEVC_ID,DYNAMIC_PRESSURE,FYI,ID,IOR,L_EDDY,L_EDDY_IJ, &
11854+
NAMELIST /VENT/ AREA_ADJUST,COLOR,CTRL_ID,DB,DEVC_ID,DYNAMIC_PRESSURE,FYI,GEOM,ID,IOR,L_EDDY,L_EDDY_IJ, &
1185511855
MB,MULT_ID,N_EDDY,OBST_ID,OUTLINE,PBX,PBY,PBZ,PRESSURE_RAMP,RADIUS,REYNOLDS_STRESS, &
1185611856
RGB,SPREAD_RATE,SURF_ID,TEXTURE_ORIGIN,TMP_EXTERIOR,TMP_EXTERIOR_RAMP,TRANSPARENCY, &
1185711857
UVW,VEL_RMS,XB,XYZ
@@ -12134,6 +12134,10 @@ SUBROUTINE READ_VENT
1213412134
IF (BLOCKED) REJECT_VENT = .TRUE.
1213512135
ENDIF
1213612136

12137+
! If the VENT is on a GEOM do not reject (further setup in READ_GEOM)
12138+
12139+
IF (GEOM .AND. .NOT.(TERRAIN_CASE .AND. ALL(XB(1:6)>-1.01E6_EB))) REJECT_VENT = .FALSE.
12140+
1213712141
! If the VENT is rejected, cycle
1213812142

1213912143
IF (REJECT_VENT) THEN
@@ -12352,6 +12356,8 @@ SUBROUTINE READ_VENT
1235212356
VT%UVW = VT%UVW/SQRT(VT%UVW(1)**2+VT%UVW(2)**2+VT%UVW(3)**2)
1235312357
ENDIF
1235412358

12359+
VT%GEOM = GEOM
12360+
1235512361
ENDDO I_MULT_LOOP
1235612362
ENDDO J_MULT_LOOP
1235712363
ENDDO K_MULT_LOOP
@@ -12437,7 +12443,7 @@ SUBROUTINE READ_VENT
1243712443
ENDDO
1243812444
ENDIF
1243912445

12440-
IF (VT%IOR==0) THEN
12446+
IF (VT%IOR==0 .AND. .NOT. VT%GEOM) THEN
1244112447
WRITE(MESSAGE,'(3A)') 'ERROR(818): VENT ',TRIM(VT%ID),' requires an orientation index, IOR.'
1244212448
CALL SHUTDOWN(MESSAGE,PROCESS_0_ONLY=.FALSE.) ; RETURN
1244312449
ENDIF
@@ -12485,9 +12491,17 @@ SUBROUTINE READ_VENT
1248512491

1248612492
! Check UVW
1248712493

12488-
IF (ABS(VT%UVW(ABS(VT%IOR))) < TWO_EPSILON_EB) THEN
12489-
WRITE(MESSAGE,'(3A)') 'ERROR(821): VENT ',TRIM(VT%ID),' cannot have normal component of UVW equal to 0.'
12490-
CALL SHUTDOWN(MESSAGE,PROCESS_0_ONLY=.FALSE.) ; RETURN
12494+
IF (.NOT.VT%GEOM) THEN
12495+
IF (ABS(VT%UVW(ABS(VT%IOR))) < TWO_EPSILON_EB) THEN
12496+
WRITE(MESSAGE,'(3A)') 'ERROR(821): VENT ',TRIM(VT%ID),' cannot have normal component of UVW equal to 0.'
12497+
CALL SHUTDOWN(MESSAGE,PROCESS_0_ONLY=.FALSE.) ; RETURN
12498+
ENDIF
12499+
ENDIF
12500+
12501+
! Special treatment for coloring GEOM surface with HVAC_BOUNDARY
12502+
12503+
IF (VT%GEOM .AND. VT%BOUNDARY_TYPE==HVAC_BOUNDARY) THEN
12504+
SURFACE(VT%SURF_INDEX)%RGB = (/0,128,0/) ! green
1249112505
ENDIF
1249212506

1249312507
ENDDO VENT_LOOP_2
@@ -12560,6 +12574,7 @@ SUBROUTINE SET_VENT_DEFAULTS
1256012574
DB = 'null'
1256112575
DEVC_ID = 'null'
1256212576
DYNAMIC_PRESSURE = 0._EB
12577+
GEOM = .FALSE.
1256312578
ID = 'null'
1256412579
IOR = 0
1256512580
L_EDDY = 0._EB

Source/type.f90

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1339,6 +1339,7 @@ MODULE TYPES
13391339
INTEGER :: BR_INDEX=0 !< Derived type carrying angular-specific radiation intensities
13401340
INTEGER :: SURF_INDEX=0
13411341
INTEGER :: NODE_INDEX=0
1342+
INTEGER :: VENT_INDEX=0
13421343
INTEGER :: BOUNDARY_TYPE=0
13431344
INTEGER :: CUT_FACE_IND1=-11 !< First index pointing to CUT_FACE array for this CFACE.
13441345
INTEGER :: CUT_FACE_IND2=-11 !< Second index pointing to CUT_FACE array for this CFACE.
@@ -1496,7 +1497,7 @@ MODULE TYPES
14961497
X1_ORIG=0._EB,X2_ORIG=0._EB,Y1_ORIG=0._EB,Y2_ORIG=0._EB,Z1_ORIG=0._EB,Z2_ORIG=0._EB, &
14971498
X0=-9.E6_EB,Y0=-9.E6_EB,Z0=-9.E6_EB,FIRE_SPREAD_RATE,UNDIVIDED_INPUT_AREA=0._EB,INPUT_AREA=0._EB,&
14981499
TMP_EXTERIOR=-1000._EB,DYNAMIC_PRESSURE=0._EB,UVW(3)=-1.E12_EB,RADIUS=-1._EB
1499-
LOGICAL :: ACTIVATED=.TRUE.,AREA_ADJUST=.TRUE.,DRAW=.TRUE.
1500+
LOGICAL :: ACTIVATED=.TRUE.,GEOM=.FALSE.,AREA_ADJUST=.TRUE.,DRAW=.TRUE.
15001501
CHARACTER(LABEL_LENGTH) :: DEVC_ID='null',CTRL_ID='null',ID='null'
15011502
! turbulent inflow (experimental)
15021503
INTEGER :: N_EDDY=0

0 commit comments

Comments
 (0)