Skip to content

Commit a4a459b

Browse files
committed
FDS Source: add analytical solutions for certain cases of CONE_MESH_INTERSECTION_VOLUME. Issue #14139
1 parent 65710aa commit a4a459b

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

Source/func.f90

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9436,7 +9436,8 @@ REAL(EB) FUNCTION CONE_MESH_INTERSECTION_VOLUME(NM,X0,Y0,Z0,RR0,RRI,HH0,G_FACTOR
94369436
INTEGER, INTENT(IN) :: NM,G_FACTOR
94379437
REAL(EB), INTENT(IN) :: X0,Y0,Z0,RR0,RRI,HH0
94389438
INTEGER :: I,J,K,NX,NY,NZ
9439-
REAL(EB) :: XX,YY,ZZ,R2,X_MIN,X_MAX,Y_MIN,Y_MAX,Z_MIN,Z_MAX,DX,DY,DZ,SHORT_DIMENSION
9439+
REAL(EB) :: XX,YY,ZZ,R2,X_MIN,X_MAX,Y_MIN,Y_MAX,Z_MIN,Z_MAX,DX,DY,DZ,SHORT_DIMENSION,&
9440+
OUTER_BASE_AREA,INNER_BASE_AREA,HH_IN,RR0_BASE,RRI_BASE,RR0_TOP,RRI_TOP
94409441
TYPE (MESH_TYPE), POINTER :: M
94419442

94429443
CONE_MESH_INTERSECTION_VOLUME = 0._EB
@@ -9448,18 +9449,38 @@ REAL(EB) FUNCTION CONE_MESH_INTERSECTION_VOLUME(NM,X0,Y0,Z0,RR0,RRI,HH0,G_FACTOR
94489449
Y_MAX = MIN(M%YF,Y0+RR0)
94499450
Z_MIN = MAX(M%ZS,Z0)
94509451
Z_MAX = MIN(M%ZF,Z0+HH0)
9452+
HH_IN = Z_MAX-Z_MIN
9453+
9454+
! Case 1: volume fully outside the mesh
94519455
IF (X_MAX<=X_MIN .OR. Y_MAX<=Y_MIN .OR. Z_MAX<=Z_MIN) RETURN
9456+
9457+
! Case 2: base area fully inside the mesh
94529458
IF ((X_MIN-M%XS)>TWO_EPSILON_EB .AND. (M%XF-X_MAX)>TWO_EPSILON_EB &
9453-
.AND. (Y_MIN-M%YS)>TWO_EPSILON_EB .AND. (M%YF-Y_MAX)>TWO_EPSILON_EB &
9454-
.AND. (Z_MIN-M%ZS)>TWO_EPSILON_EB .AND. (M%ZF-Z_MAX)>TWO_EPSILON_EB) THEN
9459+
.AND. (Y_MIN-M%YS)>TWO_EPSILON_EB .AND. (M%YF-Y_MAX)>TWO_EPSILON_EB) THEN
94559460
IF (G_FACTOR==0) THEN
9456-
CONE_MESH_INTERSECTION_VOLUME = PI*(RR0**2._EB-RRI**2._EB)*HH0
9461+
! Subtract inner from outer cylinder volume
9462+
CONE_MESH_INTERSECTION_VOLUME = PI*(RR0**2._EB-RRI**2._EB)*HH_IN
94579463
ELSEIF (G_FACTOR==1) THEN
9458-
CONE_MESH_INTERSECTION_VOLUME = PI*(RR0**2._EB-RRI**2._EB)*HH0/3._EB
9464+
RR0_BASE = RR0*(1-(Z_MIN-Z0)/HH0)
9465+
RRI_BASE = RRI*(1-(Z_MIN-Z0)/HH0)
9466+
RR0_TOP = RR0*(1-(Z_MAX-Z0)/HH0)
9467+
RRI_TOP = RRI*(1-(Z_MAX-Z0)/HH0)
9468+
! Subtract inner from outer truncated cone volume
9469+
CONE_MESH_INTERSECTION_VOLUME = PI*HH_IN/3._EB*&
9470+
(RR0_BASE**2._EB+RR0_BASE*RR0_TOP+RR0_TOP**2._EB-RRI_BASE**2._EB-RRI_BASE*RRI_TOP-RRI_TOP**2._EB)
94599471
ENDIF
94609472
RETURN
94619473
ENDIF
94629474

9475+
! Case 3: partial hollow cylinder intersection volume
9476+
IF (G_FACTOR==0) THEN
9477+
OUTER_BASE_AREA = CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RR0,M%XS,M%XF,M%YS,M%YF)
9478+
INNER_BASE_AREA = CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RRI,M%XS,M%XF,M%YS,M%YF)
9479+
CONE_MESH_INTERSECTION_VOLUME = (OUTER_BASE_AREA-INNER_BASE_AREA)*HH_IN
9480+
RETURN
9481+
ENDIF
9482+
9483+
! Case 4: partial hollow cone intersection volume (numerical integration)
94639484
SHORT_DIMENSION = MIN(X_MAX-X_MIN,Y_MAX-Y_MIN,Z_MAX-Z_MIN)
94649485
! Limit resolution length scale
94659486
SHORT_DIMENSION = MAX(SHORT_DIMENSION, 0.1_EB*MIN(M%DXMIN,M%DYMIN,M%DZMIN))

0 commit comments

Comments
 (0)