Skip to content

Commit e8cb7b0

Browse files
committed
FDS Source: use trapezoidal integration for cone cut by vertical mesh face in CONE_MESH_INTERSECTION_VOLUME
1 parent 61de44a commit e8cb7b0

File tree

1 file changed

+22
-26
lines changed

1 file changed

+22
-26
lines changed

Source/func.f90

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5490,7 +5490,7 @@ REAL(EB) FUNCTION CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RAD,X1,X2,Y1,Y2)
54905490

54915491
! No overlap
54925492

5493-
IF ((X2 <= X0-RAD) .OR. (X1 >= X0+RAD) .OR. (Y2 <= Y0-RAD) .OR. (Y1 >= Y0+RAD)) THEN
5493+
IF ((X2 <= X0-RAD) .OR. (X1 >= X0+RAD) .OR. (Y2 <= Y0-RAD) .OR. (Y1 >= Y0+RAD) .OR. RAD<TWO_EPSILON_EB) THEN
54945494
CIRCLE_CELL_INTERSECTION_AREA = 0._EB
54955495
RETURN
54965496
ENDIF
@@ -5527,7 +5527,7 @@ REAL(EB) FUNCTION CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RAD,X1,X2,Y1,Y2)
55275527
RETURN
55285528
ENDIF
55295529
IF (Y1 >= Y0 .AND. Y1 < Y0+RAD) THEN
5530-
THETA = 2._EB*ACOS((X1-X0)/RAD)
5530+
THETA = 2._EB*ACOS((Y1-Y0)/RAD)
55315531
CIRCLE_CELL_INTERSECTION_AREA = 0.5_EB*R2*(THETA-SIN(THETA))
55325532
RETURN
55335533
ENDIF
@@ -5646,9 +5646,10 @@ REAL(EB) FUNCTION CONE_MESH_INTERSECTION_VOLUME(NM,X0,Y0,Z0,RR0,RRI,HH0,G_FACTOR
56465646

56475647
INTEGER, INTENT(IN) :: NM,G_FACTOR
56485648
REAL(EB), INTENT(IN) :: X0,Y0,Z0,RR0,RRI,HH0
5649-
INTEGER :: I,J,K,NX,NY,NZ
5650-
REAL(EB) :: XX,YY,ZZ,R2,X_MIN,X_MAX,Y_MIN,Y_MAX,Z_MIN,Z_MAX,DX,DY,DZ,SHORT_DIMENSION,&
5651-
OUTER_BASE_AREA,INNER_BASE_AREA,HH_IN,RR0_BASE,RRI_BASE,RR0_TOP,RRI_TOP
5649+
INTEGER :: K,NZ
5650+
REAL(EB) :: X_MIN,X_MAX,Y_MIN,Y_MAX,Z_MIN,Z_MAX,DZ,Z1,Z2,&
5651+
OUTER_BASE_AREA,INNER_BASE_AREA,OUTER_TOP_AREA,INNER_TOP_AREA,HH_IN,&
5652+
RR0_BASE,RRI_BASE,RR0_TOP,RRI_TOP
56525653
TYPE (MESH_TYPE), POINTER :: M
56535654

56545655
CONE_MESH_INTERSECTION_VOLUME = 0._EB
@@ -5691,29 +5692,24 @@ REAL(EB) FUNCTION CONE_MESH_INTERSECTION_VOLUME(NM,X0,Y0,Z0,RR0,RRI,HH0,G_FACTOR
56915692
RETURN
56925693
ENDIF
56935694

5694-
! Case 4: partial hollow cone intersection volume (numerical integration)
5695-
SHORT_DIMENSION = MIN(X_MAX-X_MIN,Y_MAX-Y_MIN,Z_MAX-Z_MIN)
5696-
! Limit resolution length scale
5697-
SHORT_DIMENSION = MAX(SHORT_DIMENSION, 0.1_EB*MIN(M%DXMIN,M%DYMIN,M%DZMIN))
5698-
NX = CEILING(50*(X_MAX-X_MIN)/SHORT_DIMENSION)
5699-
NY = CEILING(50*(Y_MAX-Y_MIN)/SHORT_DIMENSION)
5700-
NZ = CEILING(50*(Z_MAX-Z_MIN)/SHORT_DIMENSION)
5701-
DX = (X_MAX-X_MIN)/REAL(NX,EB)
5702-
DY = (Y_MAX-Y_MIN)/REAL(NY,EB)
5703-
DZ = (Z_MAX-Z_MIN)/REAL(NZ,EB)
5695+
! Case 4: partial hollow cone intersection volume (trapezoidal integration)
5696+
NZ = 100
5697+
DZ = HH_IN/REAL(NZ,EB)
57045698

57055699
DO K=1,NZ
5706-
ZZ = Z_MIN + (K-0.5_EB)*DZ
5707-
IF (ZZ<Z0 .OR. ZZ>Z0+HH0) CYCLE
5708-
DO J=1,NY
5709-
YY = Y_MIN + (J-0.5_EB)*DY
5710-
DO I=1,NX
5711-
XX = X_MIN + (I-0.5_EB)*DX
5712-
R2 = (XX-X0)**2+(YY-Y0)**2
5713-
IF ((R2<(RR0*(1._EB-G_FACTOR*(ZZ-Z0)/HH0))**2) .AND. (R2>(RRI*(1._EB-G_FACTOR*(ZZ-Z0)/HH0))**2)) &
5714-
CONE_MESH_INTERSECTION_VOLUME = CONE_MESH_INTERSECTION_VOLUME + DX*DY*DZ
5715-
ENDDO
5716-
ENDDO
5700+
Z1 = Z_MIN + (K-1)*DZ
5701+
Z2 = Z1 + DZ
5702+
RR0_BASE = RR0*(1-(Z1-Z0)/HH0)
5703+
RRI_BASE = RRI*(1-(Z1-Z0)/HH0)
5704+
RR0_TOP = RR0*(1-(Z2-Z0)/HH0)
5705+
RRI_TOP = RRI*(1-(Z2-Z0)/HH0)
5706+
OUTER_BASE_AREA = CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RR0_BASE,M%XS,M%XF,M%YS,M%YF)
5707+
INNER_BASE_AREA = CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RRI_BASE,M%XS,M%XF,M%YS,M%YF)
5708+
OUTER_TOP_AREA = CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RR0_TOP,M%XS,M%XF,M%YS,M%YF)
5709+
INNER_TOP_AREA = CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RRI_TOP,M%XS,M%XF,M%YS,M%YF)
5710+
5711+
CONE_MESH_INTERSECTION_VOLUME = CONE_MESH_INTERSECTION_VOLUME + &
5712+
DZ*0.5_EB*(OUTER_BASE_AREA+OUTER_TOP_AREA-INNER_BASE_AREA-INNER_TOP_AREA)
57175713
ENDDO
57185714

57195715
END FUNCTION CONE_MESH_INTERSECTION_VOLUME

0 commit comments

Comments
 (0)