Skip to content

Commit 0f2ccf2

Browse files
committed
FDS Source: add missing case to rectangle-circle intersection (Issue #14139)
1 parent 34fb1da commit 0f2ccf2

File tree

1 file changed

+46
-3
lines changed

1 file changed

+46
-3
lines changed

Source/func.f90

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9279,7 +9279,7 @@ REAL(EB) FUNCTION CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RAD,X1,X2,Y1,Y2)
92799279

92809280
! No overlap
92819281

9282-
IF ((X2 < X0-RAD) .OR. (X1 > X0+RAD) .OR. (Y2 < Y0-RAD) .OR. (Y1 > Y0+RAD)) THEN
9282+
IF ((X2 <= X0-RAD) .OR. (X1 >= X0+RAD) .OR. (Y2 <= Y0-RAD) .OR. (Y1 >= Y0+RAD)) THEN
92839283
CIRCLE_CELL_INTERSECTION_AREA = 0._EB
92849284
RETURN
92859285
ENDIF
@@ -9295,9 +9295,52 @@ REAL(EB) FUNCTION CIRCLE_CELL_INTERSECTION_AREA(X0,Y0,RAD,X1,X2,Y1,Y2)
92959295
IF (RC <= R2) FC=IBSET(FC,3)
92969296

92979297
SELECT CASE(FC)
9298-
! Grid cell surrounds the circle: area of circle
9299-
CASE (0)
9298+
! No corners either full area or circle minus one or more chords
9299+
CASE (0)
9300+
! First four cases are more than half the cirlce outside the rectangle.
9301+
! Can only have one edge where this is the case without having a corner inside. This edge makes a chord.
9302+
! Intersection area is the circle area minus the area of the chord.
9303+
IF (X2 <= X0 .AND. X2 > X0-RAD) THEN
9304+
THETA = 2._EB*ACOS((X0-X2)/RAD)
9305+
CIRCLE_CELL_INTERSECTION_AREA = R2*(PI - 0.5_EB*(THETA-SIN(THETA)))
9306+
RETURN
9307+
ENDIF
9308+
IF (Y2 <= Y0 .AND. Y2 > Y0-RAD) THEN
9309+
THETA = 2._EB*ACOS((Y0-Y2)/RAD)
9310+
CIRCLE_CELL_INTERSECTION_AREA = R2*(PI - 0.5_EB*(THETA-SIN(THETA)))
9311+
RETURN
9312+
ENDIF
9313+
IF (X1 >= X0 .AND. X1 < X0+RAD) THEN
9314+
THETA = 2._EB*ACOS((X1-X0)/RAD)
9315+
CIRCLE_CELL_INTERSECTION_AREA = R2*(PI - 0.5_EB*(THETA-SIN(THETA)))
9316+
RETURN
9317+
ENDIF
9318+
IF (Y1 >= Y0 .AND. Y1 < Y0+RAD) THEN
9319+
THETA = 2._EB*ACOS((X1-X0)/RAD)
9320+
CIRCLE_CELL_INTERSECTION_AREA = R2*(PI - 0.5_EB*(THETA-SIN(THETA)))
9321+
RETURN
9322+
ENDIF
9323+
! Remaining cases is where one or more rectangle edges are inside but the corners are outside
9324+
! With no corner inside each internal edge is a chord
9325+
! Intersection area is the circe area minus the area of each chord
93009326
CIRCLE_CELL_INTERSECTION_AREA = PI*R2
9327+
IF (X1 > X0 - RAD) THEN
9328+
THETA = 2._EB*ACOS((X0-X1)/RAD)
9329+
CIRCLE_CELL_INTERSECTION_AREA = CIRCLE_CELL_INTERSECTION_AREA - 0.5_EB*R2*(THETA-SIN(THETA))
9330+
ENDIF
9331+
IF (Y1 > Y0 - RAD) THEN
9332+
THETA = 2._EB*ACOS((Y0-Y1)/RAD)
9333+
CIRCLE_CELL_INTERSECTION_AREA = CIRCLE_CELL_INTERSECTION_AREA - 0.5_EB*R2*(THETA-SIN(THETA))
9334+
ENDIF
9335+
IF (X2 < X0 + RAD) THEN
9336+
THETA = 2._EB*ACOS((X2-X0)/RAD)
9337+
CIRCLE_CELL_INTERSECTION_AREA = CIRCLE_CELL_INTERSECTION_AREA - 0.5_EB*R2*(THETA-SIN(THETA))
9338+
ENDIF
9339+
IF (Y2 < Y0 + RAD) THEN
9340+
THETA = 2._EB*ACOS((Y2-Y0)/RAD)
9341+
CIRCLE_CELL_INTERSECTION_AREA = CIRCLE_CELL_INTERSECTION_AREA - 0.5_EB*R2*(THETA-SIN(THETA))
9342+
ENDIF
9343+
RETURN
93019344
! One corner in the circle: chord + area of triangle
93029345
CASE(1,2,4,8)
93039346
SELECT CASE(FC)

0 commit comments

Comments
 (0)