Skip to content

Commit 501a73d

Browse files
authored
Merge pull request #14704 from drjfloyd/master
FDS Source: Allow HVAC for GEOM
2 parents 20f3990 + 5b558ff commit 501a73d

File tree

8 files changed

+182
-217
lines changed

8 files changed

+182
-217
lines changed

Source/dump.f90

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2349,10 +2349,6 @@ 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-
23562352
ENDDO VENT_LOOP
23572353

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

Source/func.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3910,7 +3910,7 @@ SUBROUTINE PACK_CFACE(NM,OS,CFA,SURF_INDEX,RC,IC,LC,UNPACK_IT,COUNT_ONLY,CHECK_B
39103910
! Assign integer pointers and values
39113911

39123912
IC=IC+1 ; IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%INTEGERS(IC),CFA%SURF_INDEX,UNPACK_IT)
3913-
IC=IC+1 ; IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%INTEGERS(IC),CFA%VENT_INDEX,UNPACK_IT)
3913+
IC=IC+1 ; IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%INTEGERS(IC),CFA%NODE_INDEX,UNPACK_IT)
39143914
IC=IC+1 ; IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%INTEGERS(IC),CFA%BOUNDARY_TYPE,UNPACK_IT)
39153915
IC=IC+1 ; IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%INTEGERS(IC),CFA%CUT_FACE_IND1,UNPACK_IT)
39163916
IC=IC+1 ; IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%INTEGERS(IC),CFA%CUT_FACE_IND2,UNPACK_IT)

Source/geom.f90

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

41224122
! Local Variables:
41234123
INTEGER :: ICF, CFACE_INDEX_LOCAL, SURF_INDEX
4124-
INTEGER :: IVENT
41254124
REAL(EB):: ADDMAT(IAXIS:KAXIS,LOW_IND:HIGH_IND)
41264125

41274126
! GET_CUTCELLS_VERBOSE variables:
41284127
INTEGER, ALLOCATABLE, DIMENSION(:) :: NCFACE_BY_MESH
41294128

4130-
TYPE(VENTS_TYPE), POINTER :: VT
41314129
TYPE(CFACE_TYPE), POINTER :: CFA
41324130

41334131
IF(GET_CUTCELLS_VERBOSE) CALL CPU_TIME(CPUTIME_START)
@@ -4310,53 +4308,10 @@ SUBROUTINE GET_EXT_INB_CUTFACES_TO_CFACE
43104308
MESHES(NM)%N_INTERNAL_CFACE_CELLS = CFACE_INDEX_LOCAL - MESHES(NM)%INTERNAL_CFACE_CELLS_LB
43114309
ENDDO MESH_LOOP_1
43124310

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-
IF(TERRAIN_CASE) THEN
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-
CASE DEFAULT
4337-
CYCLE VENT_LOOP
4338-
END SELECT
4339-
! CFACE Loop to modify SURF_INDEX in INTERNAL_CFACE_CELLS:
4340-
CFACE_LOOP_2 : DO CFACE_INDEX_LOCAL=INTERNAL_CFACE_CELLS_LB+1,INTERNAL_CFACE_CELLS_LB+N_INTERNAL_CFACE_CELLS
4341-
CFA => CFACE(CFACE_INDEX_LOCAL)
4342-
BC => BOUNDARY_COORD(CFA%BC_INDEX)
4343-
IF (BC%X < X(VT%I1)+ADDMAT(IAXIS,LOW_IND )) CYCLE CFACE_LOOP_2
4344-
IF (BC%X > X(VT%I2)+ADDMAT(IAXIS,HIGH_IND)) CYCLE CFACE_LOOP_2
4345-
IF (BC%Y < Y(VT%J1)+ADDMAT(JAXIS,LOW_IND )) CYCLE CFACE_LOOP_2
4346-
IF (BC%Y > Y(VT%J2)+ADDMAT(JAXIS,HIGH_IND)) CYCLE CFACE_LOOP_2
4347-
IF (BC%Z < Z(VT%K1)+ADDMAT(KAXIS,LOW_IND )) CYCLE CFACE_LOOP_2
4348-
IF (BC%Z > Z(VT%K2)+ADDMAT(KAXIS,HIGH_IND)) CYCLE CFACE_LOOP_2
4349-
CFA%VENT_INDEX = IVENT
4350-
CFA%SURF_INDEX = VT%SURF_INDEX
4351-
ENDDO CFACE_LOOP_2
4352-
ENDDO VENT_LOOP
4353-
ENDIF
4354-
ENDDO MESH_LOOP_2
43554311
! - At this pont all final values of SURF_INDEX have been given to CFACEs.
43564312

43574313
! Third loop, 1. Compute final FDS area integrals by SURF_ID and GEOM.
4358-
! 2. Compute input areas by SURF_ID and GEOM. First sum over GEOM FACES SURF_IDs,
4359-
! then VENTS input surfaces are assigned to corresponding GEOMs and SURF_IDs if present (VENTs take precedence).
4314+
! 2. Compute input areas by SURF_ID and GEOM. First sum over GEOM FACES SURF_IDs.
43604315
IF(N_GEOMETRY>0) THEN
43614316
ALLOCATE(FDS_AREA_GEOM(0:N_SURF,N_GEOMETRY)); FDS_AREA_GEOM = 0._EB
43624317
ENDIF
@@ -8855,7 +8810,7 @@ SUBROUTINE INIT_CFACE_CELL(NM,ICF,IFACE,CFACE_INDEX,SURF_INDEX,STAGE_FLG,IS_INB,
88558810
CF=> CUT_FACE(ICF)
88568811

88578812
STAGE_FLG_BRANCH : SELECT CASE(STAGE_FLG)
8858-
8813+
88598814
CASE(INTEGER_ONE) ! Geometry information for CFACE.
88608815

88618816
CALL ALLOCATE_STORAGE(NM,SURF_INDEX=SURF_INDEX,CFACE_INDEX=CFACE_INDEX)
@@ -8865,6 +8820,8 @@ SUBROUTINE INIT_CFACE_CELL(NM,ICF,IFACE,CFACE_INDEX,SURF_INDEX,STAGE_FLG,IS_INB,
88658820
B1 => M%BOUNDARY_PROP1(CFA%B1_INDEX)
88668821

88678822
CFA%SURF_INDEX = SURF_INDEX
8823+
CFA%NODE_INDEX = SURFACE(SURF_INDEX)%NODE_INDEX
8824+
B1%NODE_INDEX = CFA%NODE_INDEX
88688825

88698826
BC%X = CF%XYZCEN(IAXIS,IFACE)
88708827
BC%Y = CF%XYZCEN(JAXIS,IFACE)
@@ -8880,7 +8837,6 @@ SUBROUTINE INIT_CFACE_CELL(NM,ICF,IFACE,CFACE_INDEX,SURF_INDEX,STAGE_FLG,IS_INB,
88808837

88818838
IBOD = CF%BODTRI(1,IFACE)
88828839
IWSEL = CF%BODTRI(2,IFACE)
8883-
CFA%VENT_INDEX = GEOMETRY(IBOD)%VENTS(IWSEL)
88848840

88858841
! Normal to cut-face:
88868842
V2(IAXIS:KAXIS) = CF%XYZVERT(IAXIS:KAXIS,CF%CFELEM(2,IFACE))-CF%XYZCEN(IAXIS:KAXIS,IFACE)
@@ -8921,7 +8877,7 @@ SUBROUTINE INIT_CFACE_CELL(NM,ICF,IFACE,CFACE_INDEX,SURF_INDEX,STAGE_FLG,IS_INB,
89218877

89228878
! External mesh boundary CFACES inherit the underlaying WALL type.
89238879
CFA%BOUNDARY_TYPE = WC%BOUNDARY_TYPE
8924-
CFA%VENT_INDEX = WC%VENT_INDEX
8880+
CFA%NODE_INDEX = BOUNDARY_PROP1(WC%B1_INDEX)%NODE_INDEX
89258881

89268882
BC%II = WC_BC%II
89278883
BC%JJ = WC_BC%JJ
@@ -22174,10 +22130,10 @@ SUBROUTINE READ_GEOM
2217422130
CHARACTER(LABEL_LENGTH) :: ID,MATL_ID,TEXTURE_MAPPING, &
2217522131
DEVC_ID,CTRL_ID,SURF_IDS(3),SURF_ID6(6),MOVE_ID
2217622132
CHARACTER(MESSAGE_LENGTH) :: BUFFER,FN_BINGEOM,BINARY_FILE
22177-
CHARACTER(LABEL_LENGTH), ALLOCATABLE, DIMENSION(:) :: SURF_ID,VENT_ID
22133+
CHARACTER(LABEL_LENGTH), ALLOCATABLE, DIMENSION(:) :: SURF_ID
2217822134
REAL(EB), ALLOCATABLE, DIMENSION(:) :: ZVALS,TFACES
2217922135
REAL(EB), ALLOCATABLE, TARGET, DIMENSION(:) :: VERTS,VERTS_AUX
22180-
INTEGER, ALLOCATABLE, DIMENSION(:) :: SURF_ID_IND,VENT_ID_IND,POLY
22136+
INTEGER, ALLOCATABLE, DIMENSION(:) :: SURF_ID_IND,POLY
2218122137
INTEGER, ALLOCATABLE, TARGET, DIMENSION(:) :: FACES,FACES_AUX,VOLUS,OFACES,SURFS,SURFS2
2218222138
LOGICAL, ALLOCATABLE, DIMENSION(:) :: IS_EXTERNAL
2218322139

@@ -22192,7 +22148,7 @@ SUBROUTINE READ_GEOM
2219222148
GEOM_TYPE,NXB,IJK(3),N_LEVELS,N_LAT,N_LONG,SPHERE_TYPE,BOXVERTLIST(8),NI,NIJ,IVOL,SORT_FACES,II,II1,II2,II3,&
2219322149
X1AXIS,NNN,CYLINDER_NSEG_THETA,CYLINDER_NSEG_AXIS,CYL_FIND(LOW_IND:HIGH_IND,1:3),CELL_BLOCK_IOR
2219422150

22195-
LOGICAL :: HAVE_SURF,HAVE_VENT,HAVE_MATL,IN_LIST,SURF_INDEX_PER_FACE,BNDF_GEOM,LOGTEST
22151+
LOGICAL :: HAVE_SURF,HAVE_MATL,IN_LIST,SURF_INDEX_PER_FACE,BNDF_GEOM,LOGTEST
2219622152
REAL(EB), POINTER, DIMENSION(:) :: V1,V2,V3,V4
2219722153
INTEGER, POINTER, DIMENSION(:) :: FACEI,FACEJ,FACE_FROM,FACE_TO,VOL
2219822154
TYPE(MESH_TYPE), POINTER :: M
@@ -22235,7 +22191,7 @@ SUBROUTINE READ_GEOM
2223522191
CYLINDER_RADIUS,CYLINDER_LENGTH,CYLINDER_NSEG_THETA,CYLINDER_NSEG_AXIS,&
2223622192
EXTRUDE,EXTEND_TERRAIN,FACES,ID,IJK,IS_TERRAIN,MOVE_ID,N_LAT,N_LEVELS,N_LONG,POLY,&
2223722193
RGB,SPHERE_ORIGIN,SPHERE_RADIUS,SPHERE_TYPE,SURF_ID,SURF_IDS,SURF_ID6,&
22238-
TEXTURE_MAPPING,TEXTURE_ORIGIN,TEXTURE_SCALE,TRANSPARENCY,VENT_ID,&
22194+
TEXTURE_MAPPING,TEXTURE_ORIGIN,TEXTURE_SCALE,TRANSPARENCY,&
2223922195
VERTS,XB,ZMIN,ZVALS,ZVAL_HORIZON
2224022196

2224122197
! first pass - count number of &GEOM lines.
@@ -23326,9 +23282,7 @@ SUBROUTINE READ_GEOM
2332623282
ENDDO
2332723283
ALLOCATE(G%SURF_ID(1:N_SURF_ID))
2332823284
G%SURF_ID(1:N_SURF_ID) = SURF_ID(1:N_SURF_ID)
23329-
ALLOCATE(G%VENT_ID(1:N_SURF_ID))
23330-
G%VENT_ID(1:N_SURF_ID) = VENT_ID(1:N_SURF_ID)
23331-
23285+
2333223286
! Now find correspondence with SURFACE(N)%ID:
2333323287
IF (ALLOCATED(SURF_ID_IND)) DEALLOCATE(SURF_ID_IND)
2333423288
ALLOCATE(SURF_ID_IND(N_SURF_ID))
@@ -23350,35 +23304,6 @@ SUBROUTINE READ_GEOM
2335023304
ENDIF
2335123305
G%HAVE_SURF = HAVE_SURF
2335223306

23353-
! Look for non-'null' VENTS:
23354-
HAVE_VENT=.FALSE.
23355-
DO I = 1, MAX_SURF_IDS
23356-
IF (TRIM(VENT_ID(I))=='null') CYCLE
23357-
HAVE_VENT=.TRUE.
23358-
ENDDO
23359-
G%HAVE_VENT = HAVE_VENT
23360-
23361-
IF(HAVE_VENT) THEN
23362-
! Build single VENT_ID index list:
23363-
IF (ALLOCATED(VENT_ID_IND)) DEALLOCATE(VENT_ID_IND); ALLOCATE(VENT_ID_IND(0:MAX_SURF_IDS)); VENT_ID_IND = 0
23364-
DO I = 1, MAX_SURF_IDS ! Here we run over the GEOM local vent array max range.
23365-
IF (TRIM(VENT_ID(I))=='null') CYCLE ! Cycle if undefined vent, its VENT_ID_IND(I)=0.
23366-
! Get VENT Index:
23367-
IN_LIST = .FALSE.
23368-
DO J = 1, N_VENT
23369-
IF (TRIM(VENT_ID(I))/=TRIM(VENTS(J)%ID)) CYCLE
23370-
VENT_ID_IND(I)=J
23371-
IN_LIST = .TRUE.
23372-
EXIT
23373-
ENDDO
23374-
IF(.NOT.IN_LIST) THEN
23375-
WRITE(MESSAGE,'(A,I4,3A)') 'ERROR(735): problem with GEOM, the vent ID(',I,') =',&
23376-
TRIM(VENT_ID(I)),' is not defined.'
23377-
CALL SHUTDOWN(MESSAGE)
23378-
ENDIF
23379-
ENDDO
23380-
ENDIF
23381-
2338223307
IF (MATL_ID=='null') THEN
2338323308
HAVE_MATL = .FALSE.
2338423309
ENDIF
@@ -23671,21 +23596,13 @@ SUBROUTINE READ_GEOM
2367123596
ALLOCATE(G%SURFS(N_FACES),STAT=IZERO)
2367223597
CALL ChkMemErr('READ_GEOM','G%SURFS',IZERO)
2367323598

23674-
ALLOCATE(G%VENTS(N_FACES),STAT=IZERO)
23675-
CALL ChkMemErr('READ_GEOM','G%VENTS',IZERO)
23676-
G%VENTS = 0
23677-
2367823599
PER_FACE_IF: IF (SURF_INDEX_PER_FACE) THEN
2367923600
DO I=1,N_FACES
2368023601
IF ( SURFS(I) <= 0 ) THEN
2368123602
G%SURFS(I) = DEFAULT_SURF_INDEX ! If local SURF ID index <= 0, use default surf ID.
2368223603
ELSE
2368323604
G%SURFS(I) = SURF_ID_IND(SURFS(I))
2368423605
ENDIF
23685-
IF (HAVE_VENT) THEN
23686-
G%VENTS(I) = VENT_ID_IND(SURFS(I)) ! Uses SURF index in local numeration from FACES input.
23687-
IF(G%VENTS(I)>0) G%SURFS(I) = VENTS(G%VENTS(I))%SURF_INDEX ! Change SURF to apply to the vent surface.
23688-
ENDIF
2368923606
ENDDO
2369023607
DEALLOCATE(SURF_ID_IND)
2369123608
ELSE
@@ -23712,26 +23629,10 @@ SUBROUTINE READ_GEOM
2371223629
IF (SURF_ID6(4)==SURFACE(NNN)%ID .AND. NVECI(2)> TWO_EPSILON_EB) G%SURFS(I) = NNN ! Y2
2371323630
IF (SURF_ID6(5)==SURFACE(NNN)%ID .AND. NVECI(3)<-TWO_EPSILON_EB) G%SURFS(I) = NNN ! Z1
2371423631
IF (SURF_ID6(6)==SURFACE(NNN)%ID .AND. NVECI(3)> TWO_EPSILON_EB) G%SURFS(I) = NNN ! Z2
23715-
IF (HAVE_VENT) THEN
23716-
IF (SURF_ID(1)==SURFACE(NNN)%ID .AND. ANY(ABS(NVECI(:))>TWO_EPSILON_EB)) G%VENTS(I)=VENT_ID_IND(1) !all sides
23717-
IF (SURF_IDS(2)==SURFACE(NNN)%ID .AND. (ABS(NVECI(1))>TWO_EPSILON_EB .OR. ABS(NVECI(2))>TWO_EPSILON_EB) ) &
23718-
G%VENTS(I) = VENT_ID_IND(2) ! sides
23719-
IF (SURF_IDS(1)==SURFACE(NNN)%ID .AND. NVECI(3)> TWO_EPSILON_EB) G%VENTS(I) = VENT_ID_IND(1) ! top
23720-
IF (SURF_IDS(3)==SURFACE(NNN)%ID .AND. NVECI(3)<-TWO_EPSILON_EB) G%VENTS(I) = VENT_ID_IND(3) ! bottom
23721-
IF (SURF_ID6(1)==SURFACE(NNN)%ID .AND. NVECI(1)<-TWO_EPSILON_EB) G%VENTS(I) = VENT_ID_IND(1) ! X1
23722-
IF (SURF_ID6(2)==SURFACE(NNN)%ID .AND. NVECI(1)> TWO_EPSILON_EB) G%VENTS(I) = VENT_ID_IND(2) ! X2
23723-
IF (SURF_ID6(3)==SURFACE(NNN)%ID .AND. NVECI(2)<-TWO_EPSILON_EB) G%VENTS(I) = VENT_ID_IND(3) ! Y1
23724-
IF (SURF_ID6(4)==SURFACE(NNN)%ID .AND. NVECI(2)> TWO_EPSILON_EB) G%VENTS(I) = VENT_ID_IND(4) ! Y2
23725-
IF (SURF_ID6(5)==SURFACE(NNN)%ID .AND. NVECI(3)<-TWO_EPSILON_EB) G%VENTS(I) = VENT_ID_IND(5) ! Z1
23726-
IF (SURF_ID6(6)==SURFACE(NNN)%ID .AND. NVECI(3)> TWO_EPSILON_EB) G%VENTS(I) = VENT_ID_IND(6) ! Z2
23727-
23728-
IF(G%VENTS(I)>0) G%SURFS(I) = VENTS(G%VENTS(I))%SURF_INDEX ! Change SURF to apply to the vent surface.
23729-
ENDIF
2373023632
ENDDO SURF_LOOP
2373123633
ENDDO FACE_LOOP
2373223634
ENDIF BOX_TYPE_IF
2373323635
ENDIF PER_FACE_IF
23734-
IF(HAVE_VENT) DEALLOCATE(VENT_ID_IND)
2373523636

2373623637
! Test for Unsupported surfaces:
2373723638
DO I=1,N_FACES
@@ -23813,9 +23714,10 @@ SUBROUTINE READ_GEOM
2381323714

2381423715
DEALLOCATE(GEOM_LINE)
2381523716

23717+
CC_IBM = .TRUE.
23718+
2381623719
IF( (T_END-T_BEGIN) < TWO_EPSILON_EB) RETURN
2381723720

23818-
CC_IBM = .TRUE.
2381923721
! If unstructured projection defined set Pressure solver on unstructured grid.
2382023722
IF (PRES_FLAG/=UGLMAT_FLAG) THEN
2382123723
PRES_METHOD = 'ULMAT'
@@ -24313,10 +24215,6 @@ SUBROUTINE ALLOCATE_BUFFERS
2431324215
ALLOCATE(SURF_ID(MAX_SURF_IDS+1),STAT=IZERO)
2431424216
CALL ChkMemErr('ALLOCATE_BUFFERS','SURF_ID',IZERO)
2431524217

24316-
IF(ALLOCATED(VENT_ID)) DEALLOCATE(VENT_ID)
24317-
ALLOCATE(VENT_ID(MAX_SURF_IDS+1),STAT=IZERO)
24318-
CALL ChkMemErr('ALLOCATE_BUFFERS','VENT_ID',IZERO)
24319-
2432024218
IF(ALLOCATED(ZVALS)) DEALLOCATE(ZVALS)
2432124219
ALLOCATE(ZVALS(MAX_ZVALS+1),STAT=IZERO)
2432224220
CALL ChkMemErr('ALLOCATE_BUFFERS','ZVALS',IZERO)
@@ -24351,7 +24249,6 @@ SUBROUTINE SET_GEOM_DEFAULTS
2435124249
ZMIN=ZS_MIN
2435224250
WRITE(ID,'(A,I0)') 'geom_',N
2435324251
SURF_ID(:)='null'
24354-
VENT_ID(:)='null'
2435524252
SURF_IDS = 'null'
2435624253
SURF_ID6 = 'null'
2435724254
MATL_ID = 'null'

0 commit comments

Comments
 (0)