Skip to content

Commit dcb47c0

Browse files
authored
Merge pull request #16230 from ericvmueller/master
FDS Source: improve logic for obtaining LP%PWT for particle INIT shapes
2 parents 73c0d1f + aff587c commit dcb47c0

2 files changed

Lines changed: 31 additions & 28 deletions

File tree

Source/part.f90

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -952,8 +952,8 @@ SUBROUTINE INSERT_VOLUMETRIC_PARTICLES
952952
INTEGER :: IIP,N_INSERT,I1,J1,K1,I2,J2,K2,N,N_PARTICLES_INSERT,ND,ICC,IFACE,INDCF,I_RAND,N_INSERT_CELLS
953953
REAL(EB) :: XC1,XC2,YC1,YC2,ZC1,ZC2,X0,Y0,Z0,RR,RRI,HH,INSERT_VOLUME,INPUT_VOLUME,VOLUME_SPLIT_FACTOR,LP_X,LP_Y,LP_Z,RAMP_FACTOR,&
954954
IN_X1,IN_X2,IN_Y1,IN_Y2,IN_Z1,IN_Z2,IN_X0,IN_Y0,IN_Z0,VCX,VCY,VCZ,MOIST_CONT,FILLED_VOLUME,DIST,DIST_MIN,&
955-
P_VECTOR(3),P_VECTOR_MIN(3),NVEC_MIN(3)
956-
LOGICAL :: CC_VALID
955+
INIT_CELL_VOLUME,SOLID_INIT_VOLUME,GAS_CELL_VOLUME,CELL_VOLUME,P_VECTOR(3),P_VECTOR_MIN(3),NVEC_MIN(3)
956+
LOGICAL :: CELL_VALID
957957
TYPE (CC_CUTFACE_TYPE), POINTER :: CF
958958

959959
IN => INITIALIZATION(INIT_INDEX)
@@ -1223,17 +1223,17 @@ SUBROUTINE INSERT_VOLUMETRIC_PARTICLES
12231223

12241224
IF (CELL(CELL_INDEX(II,JJ,KK))%SOLID .AND. IN%SHAPE=='LINE') CYCLE INSERT_PARTICLE_LOOP
12251225
! Check for solid inside GEOM
1226-
CC_VALID = .TRUE.
1226+
CELL_VALID = .TRUE.
12271227
IF (CC_IBM) THEN
12281228
IF (CCVAR(II,JJ,KK,CC_CGSC)==CC_SOLID) THEN
1229-
CC_VALID = .FALSE.
1229+
CELL_VALID = .FALSE.
12301230
ELSE
12311231
INDCF = CCVAR(II,JJ,KK,CC_IDCF)
12321232
! If closest CFACE has positive dot-product of normal and centroid-particle vector, location is assumed valid
12331233
IF (INDCF>0) THEN
12341234
DIST_MIN=HUGE_EB
12351235
CF => CUT_FACE(INDCF)
1236-
CC_VALID = .FALSE.
1236+
CELL_VALID = .FALSE.
12371237
CFA_LOOP1: DO IFACE=1,CF%NFACE
12381238
P_VECTOR = (/LP_X-CF%XYZCEN(IAXIS,IFACE), LP_Y-CF%XYZCEN(JAXIS,IFACE), LP_Z-CF%XYZCEN(KAXIS,IFACE)/)
12391239
DIST = NORM2(P_VECTOR)
@@ -1243,11 +1243,11 @@ SUBROUTINE INSERT_VOLUMETRIC_PARTICLES
12431243
NVEC_MIN = MESHES(NM)%BOUNDARY_COORD(CFACE(CF%CFACE_INDEX(IFACE))%BC_INDEX)%NVEC
12441244
ENDIF
12451245
ENDDO CFA_LOOP1
1246-
IF (DOT_PRODUCT(NVEC_MIN,P_VECTOR_MIN) > TWENTY_EPSILON_EB) CC_VALID=.TRUE.
1246+
IF (DOT_PRODUCT(NVEC_MIN,P_VECTOR_MIN) > TWENTY_EPSILON_EB) CELL_VALID=.TRUE.
12471247
ENDIF
12481248
ENDIF
12491249
ENDIF
1250-
IF (.NOT.CELL(CELL_INDEX(II,JJ,KK))%SOLID .AND. CC_VALID) EXIT CHOOSE_XYZ_LOOP
1250+
IF (.NOT.CELL(CELL_INDEX(II,JJ,KK))%SOLID .AND. CELL_VALID) EXIT CHOOSE_XYZ_LOOP
12511251

12521252
! If cannot find non-solid grid cell, stop searching
12531253

@@ -1295,8 +1295,8 @@ SUBROUTINE INSERT_VOLUMETRIC_PARTICLES
12951295
ELSEIF (IN%N_PARTICLES_PER_CELL > 0) THEN TOTAL_OR_PER_CELL
12961296

12971297
N_INSERT = 0
1298-
INSERT_VOLUME = 0._EB
12991298
FILLED_VOLUME = 0._EB
1299+
SOLID_INIT_VOLUME = 0._EB
13001300
CALL GET_IJK(MIN(X1+MICRON,X2),MIN(Y1+MICRON,Y2),MIN(Z1+MICRON,Z2),NM,XI,YJ,ZK,I1,J1,K1)
13011301
CALL GET_IJK(MAX(X2-MICRON,X1),MAX(Y2-MICRON,Y1),MAX(Z2-MICRON,Z1),NM,XI,YJ,ZK,I2,J2,K2)
13021302
I2 = MIN(I2,IBAR)
@@ -1310,11 +1310,6 @@ SUBROUTINE INSERT_VOLUMETRIC_PARTICLES
13101310
DO KK=K1,K2
13111311
DO JJ=J1,J2
13121312
II_LOOP: DO II=I1,I2
1313-
CC_VALID = .TRUE.
1314-
IF (CC_IBM) THEN
1315-
IF (CCVAR(II,JJ,KK,CC_CGSC)==CC_SOLID) CC_VALID = .FALSE.
1316-
ENDIF
1317-
IF (CELL(CELL_INDEX(II,JJ,KK))%SOLID .OR. .NOT.CC_VALID) CYCLE II_LOOP
13181313
IF (IN%SHAPE=='CONE') THEN
13191314
IF (((XC(II)-X0)**2+(YC(JJ)-Y0)**2<(RRI*(1._EB-(ZC(KK)-Z0)/HH))**2) .OR. &
13201315
((XC(II)-X0)**2+(YC(JJ)-Y0)**2>(RR*(1._EB-(ZC(KK)-Z0)/HH))**2)) CYCLE II_LOOP
@@ -1323,23 +1318,30 @@ SUBROUTINE INSERT_VOLUMETRIC_PARTICLES
13231318
IF (((XC(II)-X0)**2+(YC(JJ)-Y0)**2<RRI**2) .OR. &
13241319
((XC(II)-X0)**2+(YC(JJ)-Y0)**2>RR**2)) CYCLE II_LOOP
13251320
ENDIF
1326-
! If local XB intersects with cutcell, estimate this intersection volume
1327-
VCX = (MIN(X(II),IN_X2)-MAX(X(II-1),IN_X1))
1328-
VCY = (MIN(Y(JJ),IN_Y2)-MAX(Y(JJ-1),IN_Y1))
1329-
VCZ = (MIN(Z(KK),IN_Z2)-MAX(Z(KK-1),IN_Z1))
1321+
! Exclude overlap volume of INIT and solid regions when calculating PWT
1322+
ICC = 0
1323+
CELL_VOLUME = DX(II)*DY(JJ)*DZ(KK)
1324+
CELL_VALID = .NOT.CELL(CELL_INDEX(II,JJ,KK))%SOLID
13301325
IF (CC_IBM) THEN
1326+
IF (CCVAR(II,JJ,KK,CC_CGSC)==CC_SOLID) CELL_VALID = .FALSE.
13311327
ICC = CCVAR(II,JJ,KK,CC_IDCC)
1332-
! Approximate intersection as min of the two volumes
1333-
IF (ICC>0) THEN
1334-
INSERT_VOLUME = INSERT_VOLUME + MIN(VCX*VCY*VCZ,SUM(CUT_CELL(ICC)%VOLUME(:)))
1335-
FILLED_VOLUME = FILLED_VOLUME + SUM(CUT_CELL(ICC)%VOLUME(:))
1336-
ELSE
1337-
INSERT_VOLUME = INSERT_VOLUME + VCX*VCY*VCZ
1338-
FILLED_VOLUME = FILLED_VOLUME + DX(II)*DY(JJ)*DZ(KK)
1339-
ENDIF
1328+
ENDIF
1329+
IF (.NOT.CELL_VALID .OR. ICC>0) THEN
1330+
VCX = MIN(X(II),IN_X2)-MAX(X(II-1),IN_X1)
1331+
VCY = MIN(Y(JJ),IN_Y2)-MAX(Y(JJ-1),IN_Y1)
1332+
VCZ = MIN(Z(KK),IN_Z2)-MAX(Z(KK-1),IN_Z1)
1333+
INIT_CELL_VOLUME = VCX*VCY*VCZ
1334+
ENDIF
1335+
IF (.NOT.CELL_VALID) THEN
1336+
SOLID_INIT_VOLUME = SOLID_INIT_VOLUME + INIT_CELL_VOLUME
1337+
CYCLE II_LOOP
1338+
ENDIF
1339+
IF (ICC>0) THEN
1340+
GAS_CELL_VOLUME = SUM(CUT_CELL(ICC)%VOLUME(:))
1341+
SOLID_INIT_VOLUME = SOLID_INIT_VOLUME + INIT_CELL_VOLUME*MAX(0._EB,1._EB-GAS_CELL_VOLUME/CELL_VOLUME)
1342+
FILLED_VOLUME = FILLED_VOLUME + GAS_CELL_VOLUME
13401343
ELSE
1341-
INSERT_VOLUME = INSERT_VOLUME + VCX*VCY*VCZ
1342-
FILLED_VOLUME = FILLED_VOLUME + DX(II)*DY(JJ)*DZ(KK)
1344+
FILLED_VOLUME = FILLED_VOLUME + CELL_VOLUME
13431345
ENDIF
13441346
N_INSERT_CELLS = N_INSERT_CELLS + 1
13451347

@@ -1441,6 +1443,7 @@ SUBROUTINE INSERT_VOLUMETRIC_PARTICLES
14411443
ENDDO II_LOOP
14421444
ENDDO
14431445
ENDDO
1446+
INSERT_VOLUME = MAX(0._EB,INSERT_VOLUME-SOLID_INIT_VOLUME)
14441447

14451448
ENDIF TOTAL_OR_PER_CELL
14461449

Utilities/Python/scripts/tree_shapes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
fdsplotlib.plot_to_fig(
6767
x_data=input_vol,
6868
y_data=random_part_mass,
69-
marker_style='ro',
69+
marker_style='rs',
7070
data_label='1000 random particles',
7171
figure_handle=fig)
7272
fdsplotlib.plot_to_fig(

0 commit comments

Comments
 (0)