@@ -9436,7 +9436,8 @@ REAL(EB) FUNCTION CONE_MESH_INTERSECTION_VOLUME(NM,X0,Y0,Z0,RR0,RRI,HH0,G_FACTOR
94369436INTEGER, INTENT(IN) :: NM,G_FACTOR
94379437REAL(EB), INTENT(IN) :: X0,Y0,Z0,RR0,RRI,HH0
94389438INTEGER :: 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
94409441TYPE (MESH_TYPE), POINTER :: M
94419442
94429443CONE_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
94489449Y_MAX = MIN(M%YF,Y0+RR0)
94499450Z_MIN = MAX(M%ZS,Z0)
94509451Z_MAX = MIN(M%ZF,Z0+HH0)
9452+ HH_IN = Z_MAX-Z_MIN
9453+
9454+ ! Case 1: volume fully outside the mesh
94519455IF (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
94529458IF ((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
94619473ENDIF
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)
94639484SHORT_DIMENSION = MIN(X_MAX-X_MIN,Y_MAX-Y_MIN,Z_MAX-Z_MIN)
94649485! Limit resolution length scale
94659486SHORT_DIMENSION = MAX(SHORT_DIMENSION, 0.1_EB*MIN(M%DXMIN,M%DYMIN,M%DZMIN))
0 commit comments