Skip to content

Commit 025dd05

Browse files
committed
FDS Source: Second-order accuracy for LS at interpolated boundaries
1 parent 2cde361 commit 025dd05

File tree

2 files changed

+61
-36
lines changed

2 files changed

+61
-36
lines changed

Source/main.f90

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3239,14 +3239,21 @@ SUBROUTINE MESH_EXCHANGE(CODE)
32393239
PHI_LS_P => M%PHI_LS
32403240
ENDIF
32413241
IF (RNODE/=SNODE) THEN
3242-
NQT2 = 4
3242+
NQT2 = 5
32433243
PACK_REAL_SEND_PKG14: DO LL=1,M3%NIC_S
3244-
II1 = M3%IIO_S(LL)
3245-
JJ1 = M3%JJO_S(LL)
3244+
II1 = M3%IIO_S(LL) ; II2 = II1
3245+
JJ1 = M3%JJO_S(LL) ; JJ2 = JJ1
3246+
SELECT CASE(M3%IOR_S(LL))
3247+
CASE(-1) ; II2=II1+1
3248+
CASE( 1) ; II2=II1-1
3249+
CASE(-2) ; JJ2=JJ1+1
3250+
CASE( 2) ; JJ2=JJ1-1
3251+
END SELECT
32463252
M3%REAL_SEND_PKG14(NQT2*(LL-1)+1) = PHI_LS_P(II1,JJ1)
3247-
M3%REAL_SEND_PKG14(NQT2*(LL-1)+2) = M%U_LS(II1,JJ1)
3248-
M3%REAL_SEND_PKG14(NQT2*(LL-1)+3) = M%V_LS(II1,JJ1)
3249-
M3%REAL_SEND_PKG14(NQT2*(LL-1)+4) = M%Z_LS(II1,JJ1)
3253+
M3%REAL_SEND_PKG14(NQT2*(LL-1)+2) = PHI_LS_P(II2,JJ2)
3254+
M3%REAL_SEND_PKG14(NQT2*(LL-1)+3) = M%U_LS(II1,JJ1)
3255+
M3%REAL_SEND_PKG14(NQT2*(LL-1)+4) = M%V_LS(II1,JJ1)
3256+
M3%REAL_SEND_PKG14(NQT2*(LL-1)+5) = M%Z_LS(II1,JJ1)
32503257
ENDDO PACK_REAL_SEND_PKG14
32513258
ELSE
32523259
M2=>MESHES(NOM)%OMESH(NM)
@@ -3540,19 +3547,26 @@ SUBROUTINE MESH_EXCHANGE(CODE)
35403547
ENDIF IF_RECEIVE_PARTICLES
35413548

35423549
IF (CODE==14 .AND. M2%NIC_R>0 .AND. RNODE/=SNODE) THEN
3543-
NQT2 = 4
3550+
NQT2 = 5
35443551
IF (PREDICTOR) THEN
35453552
PHI_LS_P => M2%PHI1_LS
35463553
ELSE
35473554
PHI_LS_P => M2%PHI_LS
35483555
ENDIF
35493556
UNPACK_REAL_RECV_PKG14: DO LL=1,M2%NIC_R
3550-
II1 = M2%IIO_R(LL)
3551-
JJ1 = M2%JJO_R(LL)
3557+
II1 = M2%IIO_R(LL) ; II2 = II1
3558+
JJ1 = M2%JJO_R(LL) ; JJ2 = JJ1
3559+
SELECT CASE(M2%IOR_R(LL))
3560+
CASE(-1) ; II2=II1+1
3561+
CASE( 1) ; II2=II1-1
3562+
CASE(-2) ; JJ2=JJ1+1
3563+
CASE( 2) ; JJ2=JJ1-1
3564+
END SELECT
35523565
PHI_LS_P(II1,JJ1) = M2%REAL_RECV_PKG14(NQT2*(LL-1)+1)
3553-
M2%U_LS(II1,JJ1) = M2%REAL_RECV_PKG14(NQT2*(LL-1)+2)
3554-
M2%V_LS(II1,JJ1) = M2%REAL_RECV_PKG14(NQT2*(LL-1)+3)
3555-
M2%Z_LS(II1,JJ1) = M2%REAL_RECV_PKG14(NQT2*(LL-1)+4)
3566+
PHI_LS_P(II2,JJ2) = M2%REAL_RECV_PKG14(NQT2*(LL-1)+2)
3567+
M2%U_LS(II1,JJ1) = M2%REAL_RECV_PKG14(NQT2*(LL-1)+3)
3568+
M2%V_LS(II1,JJ1) = M2%REAL_RECV_PKG14(NQT2*(LL-1)+4)
3569+
M2%Z_LS(II1,JJ1) = M2%REAL_RECV_PKG14(NQT2*(LL-1)+5)
35563570
ENDDO UNPACK_REAL_RECV_PKG14
35573571
ENDIF
35583572

Source/vege.f90

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,10 @@ SUBROUTINE INITIALIZE_LEVEL_SET_FIRESPREAD_1(NM)
6262

6363
! Level set values (Phi). PHI1_LS is the first-order accurate estimate at the next time step.
6464

65-
ALLOCATE(M%PHI_LS(0:IBP1,0:JBP1)) ; CALL ChkMemErr('VEGE:LEVEL SET','PHI_LS',IZERO) ; PHI_LS => M%PHI_LS ; PHI_LS = PHI_LS_MIN
66-
ALLOCATE(M%PHI1_LS(0:IBP1,0:JBP1)); CALL ChkMemErr('VEGE:LEVEL SET','PHI1_LS',IZERO) ; PHI1_LS => M%PHI1_LS ; PHI1_LS = PHI_LS_MIN
65+
ALLOCATE(M%PHI_LS(-1:IBAR+2,-1:JBAR+2)) ; CALL ChkMemErr('VEGE:LEVEL SET','PHI_LS',IZERO) ; PHI_LS => M%PHI_LS
66+
PHI_LS = PHI_LS_MIN
67+
ALLOCATE(M%PHI1_LS(-1:IBAR+2,-1:JBAR+2)); CALL ChkMemErr('VEGE:LEVEL SET','PHI1_LS',IZERO) ; PHI1_LS => M%PHI1_LS
68+
PHI1_LS = PHI_LS_MIN
6769

6870
! Wind speed components in the center of the first gas phsae cell above the ground.
6971

@@ -682,8 +684,8 @@ SUBROUTINE GET_BOUNDARY_VALUES
682684
SUBROUTINE FILL_BOUNDARY_VALUES
683685

684686
USE COMPLEX_GEOMETRY, ONLY : CC_CGSC,CC_SOLID,CC_CUTCFE
685-
INTEGER :: IW,IIO,JJO,N_INT_CELLS,NOM,IC
686-
REAL(EB) :: PHI_LS_OTHER,U_LS_OTHER,V_LS_OTHER,Z_LS_OTHER
687+
INTEGER :: IW,IIO,JJO,IIO_2,JJO_2,N_INT_CELLS,NOM,IC
688+
REAL(EB) :: PHI_LS_OTHER,PHI_LS_OTHER_2,U_LS_OTHER,V_LS_OTHER,Z_LS_OTHER
687689
TYPE (EXTERNAL_WALL_TYPE), POINTER :: EWC
688690
LOGICAL :: SOLID_CELL
689691

@@ -707,16 +709,27 @@ SUBROUTINE FILL_BOUNDARY_VALUES
707709
RETURN
708710
ENDIF
709711

710-
PHI_LS_OTHER = 0._EB
712+
PHI_LS_OTHER = 0._EB
713+
PHI_LS_OTHER_2 = 0._EB
711714
U_LS_OTHER = 0._EB
712715
V_LS_OTHER = 0._EB
713716
Z_LS_OTHER = 0._EB
714717
DO JJO=EWC%JJO_MIN,EWC%JJO_MAX
715718
DO IIO=EWC%IIO_MIN,EWC%IIO_MAX
719+
IIO_2 = IIO
720+
JJO_2 = JJO
721+
SELECT CASE(IOR)
722+
CASE( 1) ; IIO_2 = IIO - 1
723+
CASE(-1) ; IIO_2 = IIO + 1
724+
CASE( 2) ; JJO_2 = JJO - 1
725+
CASE(-2) ; JJO_2 = JJO + 1
726+
END SELECT
716727
IF (PREDICTOR) THEN
717-
PHI_LS_OTHER = PHI_LS_OTHER + OMESH(NOM)%PHI_LS(IIO,JJO)
728+
PHI_LS_OTHER = PHI_LS_OTHER + OMESH(NOM)%PHI_LS(IIO ,JJO )
729+
PHI_LS_OTHER_2 = PHI_LS_OTHER_2 + OMESH(NOM)%PHI_LS(IIO_2,JJO_2)
718730
ELSE
719-
PHI_LS_OTHER = PHI_LS_OTHER + OMESH(NOM)%PHI1_LS(IIO,JJO)
731+
PHI_LS_OTHER = PHI_LS_OTHER + OMESH(NOM)%PHI1_LS(IIO ,JJO )
732+
PHI_LS_OTHER_2 = PHI_LS_OTHER_2 + OMESH(NOM)%PHI1_LS(IIO_2,JJO_2)
720733
ENDIF
721734
U_LS_OTHER = U_LS_OTHER + OMESH(NOM)%U_LS(IIO,JJO)
722735
V_LS_OTHER = V_LS_OTHER + OMESH(NOM)%V_LS(IIO,JJO)
@@ -728,6 +741,10 @@ SUBROUTINE FILL_BOUNDARY_VALUES
728741
SELECT CASE(IOR)
729742
CASE(-2:2)
730743
PHI_LS_P(II,JJ) = PHI_LS_OTHER/REAL(N_INT_CELLS,EB)
744+
IF (IOR==-2) PHI_LS_P(II,JJ-1) = PHI_LS_OTHER_2/REAL(N_INT_CELLS,EB)
745+
IF (IOR== 2) PHI_LS_P(II,JJ+1) = PHI_LS_OTHER_2/REAL(N_INT_CELLS,EB)
746+
IF (IOR==-1) PHI_LS_P(II-1,JJ) = PHI_LS_OTHER_2/REAL(N_INT_CELLS,EB)
747+
IF (IOR== 1) PHI_LS_P(II+1,JJ) = PHI_LS_OTHER_2/REAL(N_INT_CELLS,EB)
731748
U_LS(II,JJ) = U_LS_OTHER/REAL(N_INT_CELLS,EB)
732749
V_LS(II,JJ) = V_LS_OTHER/REAL(N_INT_CELLS,EB)
733750
Z_LS(II,JJ) = Z_LS_OTHER/REAL(N_INT_CELLS,EB)
@@ -997,7 +1014,7 @@ END SUBROUTINE LEVEL_SET_SPREAD_RATE
9971014

9981015
SUBROUTINE LEVEL_SET_ADVECT_FLUX
9991016

1000-
INTEGER :: I,IM1,IP1,IP2,J,JM1,JP1,JP2
1017+
INTEGER :: I,J
10011018
REAL(EB), DIMENSION(:) :: Z(4)
10021019
REAL(EB), POINTER, DIMENSION(:,:) :: FLUX_LS_P,F_X,F_Y
10031020
REAL(EB) :: DPHIDX,DPHIDY,SR_X_AVG,SR_Y_AVG
@@ -1015,28 +1032,22 @@ SUBROUTINE LEVEL_SET_ADVECT_FLUX
10151032

10161033
DO J=1,JBAR
10171034
DO I=0,IBAR
1018-
IM1 = I-1 ; IF (IM1<0) IM1 = I
1019-
IP1 = I+1
1020-
IP2 = I+2 ; IF (IP2>IBP1) IP2 = IP1
1021-
Z(1) = PHI_LS_P(IM1,J)
1022-
Z(2) = PHI_LS_P(I,J)
1023-
Z(3) = PHI_LS_P(IP1,J)
1024-
Z(4) = PHI_LS_P(IP2,J)
1025-
SR_X_AVG = 0.5_EB*(SR_X_LS(MIN(IP1,IBAR),J)+SR_X_LS(MAX(1,I),J))
1035+
Z(1) = PHI_LS_P(I-1,J)
1036+
Z(2) = PHI_LS_P(I ,J)
1037+
Z(3) = PHI_LS_P(I+1,J)
1038+
Z(4) = PHI_LS_P(I+2,J)
1039+
SR_X_AVG = 0.5_EB*(SR_X_LS(MIN(I+1,IBAR),J)+SR_X_LS(MAX(1,I),J))
10261040
F_X(I,J) = SCALAR_FACE_VALUE_LS(SR_X_AVG,Z,LIMITER_LS)
10271041
ENDDO
10281042
ENDDO
10291043

10301044
DO J=0,JBAR
10311045
DO I=1,IBAR
1032-
JM1 = J-1 ; IF (JM1<0) JM1 = J
1033-
JP1 = J+1
1034-
JP2 = J+2 ; IF (JP2>JBP1) JP2 = JP1
1035-
Z(1) = PHI_LS_P(I,JM1)
1036-
Z(2) = PHI_LS_P(I,J)
1037-
Z(3) = PHI_LS_P(I,JP1)
1038-
Z(4) = PHI_LS_P(I,JP2)
1039-
SR_Y_AVG = 0.5_EB*(SR_Y_LS(I,MIN(JP1,JBAR))+SR_Y_LS(I,MAX(1,J)))
1046+
Z(1) = PHI_LS_P(I,J-1)
1047+
Z(2) = PHI_LS_P(I,J )
1048+
Z(3) = PHI_LS_P(I,J+1)
1049+
Z(4) = PHI_LS_P(I,J+2)
1050+
SR_Y_AVG = 0.5_EB*(SR_Y_LS(I,MIN(J+1,JBAR))+SR_Y_LS(I,MAX(1,J)))
10401051
F_Y(I,J) = SCALAR_FACE_VALUE_LS(SR_Y_AVG,Z,LIMITER_LS)
10411052
ENDDO
10421053
ENDDO

0 commit comments

Comments
 (0)