@@ -2852,6 +2852,9 @@ SUBROUTINE INIT_RADIATION
28522852CALL ChkMemErr(' RADI' ,' DLANG_OLD' ,IZERO)
28532853ALLOCATE (DLANG_LOCAL(3 ,1 :NRA),STAT= IZERO)
28542854CALL ChkMemErr(' RADI' ,' DLANG_LOCAL' ,IZERO)
2855+ ALLOCATE (DLO_ORIENTATION(1 :N_ORIENTATION_VECTOR,1 :NRA),STAT= IZERO)
2856+ CALL ChkMemErr(' RADI' ,' DLO_ORIENTATION' ,IZERO)
2857+
28552858
28562859! Set for ray rotation
28572860ALLOW_RANDOM_RADIATION_ROTATION = RANDOMIZE_RADIATION_DIRECTIONS .AND. .NOT. CYLINDRICAL .AND. .NOT. TWO_D
@@ -3404,7 +3407,6 @@ SUBROUTINE CALCULATE_DIRECTION_COEFFICIENTS()
34043407USE COMP_FUNCTIONS, ONLY : CURRENT_TIME
34053408
34063409INTEGER :: NRA,N,IO,I,IERR
3407- REAL (EB), ALLOCATABLE , DIMENSION (:) :: COSINE_ARRAY
34083410REAL (EB) :: TNOW,AXIS(3 ),MERIDIAN(3 ), AZIMUTH(3 ),E1(3 ),E2(3 ),REF(3 ),PSI,DLO,MAGTMP,RNDNUM(3 )
34093411
34103412TNOW= CURRENT_TIME()
@@ -3507,20 +3509,19 @@ SUBROUTINE CALCULATE_DIRECTION_COEFFICIENTS()
35073509! DLO is the integral of the orientation vector dotted with the directional solid angle of the radiation directions.
35083510! VIEW_ANGLE_FACTOR is the reduction of the radiation due to a view angle less than 180, like a narrow field of view radiometer.
35093511IF (SOLID_PARTICLES) THEN
3510- IF (.NOT. ALLOCATED (COSINE_ARRAY)) ALLOCATE (COSINE_ARRAY(1 :NRA))
35113512 IF (.NOT. ALLOCATED (NEAREST_RADIATION_ANGLE)) ALLOCATE (NEAREST_RADIATION_ANGLE(N_ORIENTATION_VECTOR))
35123513 IF (.NOT. ALLOCATED (VIEW_ANGLE_FACTOR)) ALLOCATE (VIEW_ANGLE_FACTOR(N_ORIENTATION_VECTOR))
35133514 VIEW_ANGLE_FACTOR = 0._EB
35143515 DO IO= 1 ,N_ORIENTATION_VECTOR
35153516 DLO = 0._EB
35163517 DO N= 1 ,NRA
3517- COSINE_ARRAY( N) = ORIENTATION_VECTOR(1 ,IO)* DLANG(1 ,N) + &
3518+ DLO_ORIENTATION(IO, N) = ORIENTATION_VECTOR(1 ,IO)* DLANG(1 ,N) + &
35183519 ORIENTATION_VECTOR(2 ,IO)* DLANG(2 ,N) + &
35193520 ORIENTATION_VECTOR(3 ,IO)* DLANG(3 ,N)
3520- IF (- COSINE_ARRAY( N) > COS_HALF_VIEW_ANGLE(IO)) &
3521+ IF (- DLO_ORIENTATION(IO, N) > COS_HALF_VIEW_ANGLE(IO)) &
35213522 DLO = DLO - (ORIENTATION_VECTOR(1 ,IO)* DLX(N) + ORIENTATION_VECTOR(2 ,IO)* DLY(N) + ORIENTATION_VECTOR(3 ,IO)* DLZ(N))
35223523 ENDDO
3523- NEAREST_RADIATION_ANGLE(IO) = MINLOC (COSINE_ARRAY ,DIM= 1 )
3524+ NEAREST_RADIATION_ANGLE(IO) = MINLOC (DLO_ORIENTATION(IO, 1 :NRA) ,DIM= 1 )
35243525 VIEW_ANGLE_FACTOR(IO) = PI/ DLO
35253526 ENDDO
35263527ENDIF
@@ -3536,7 +3537,7 @@ SUBROUTINE INTERPOLATE_IL()
35363537
35373538INTEGER :: NRA,NM,NNN,LL,I_INTP
35383539REAL (EB) :: TNOW,COSANG(NUMBER_RADIATION_ANGLES), DUMMY(NUMBER_RADIATION_ANGLES)
3539- INTEGER :: NNEW,NOLD,IBND,IW,NOM,ICF
3540+ INTEGER :: NNEW,NOLD,IBND,IW,NOM,ICF,IP
35403541INTEGER :: IDX(NUMBER_RADIATION_ANGLES,N_INTP)
35413542
35423543REAL (EB) :: W(NUMBER_RADIATION_ANGLES,N_INTP)
@@ -3546,6 +3547,8 @@ SUBROUTINE INTERPOLATE_IL()
35463547REAL (EB) :: ILW_OLD(NUMBER_RADIATION_ANGLES)
35473548TYPE (OMESH_TYPE), POINTER :: M2
35483549TYPE (CFACE_TYPE), POINTER :: CFA
3550+ TYPE (LAGRANGIAN_PARTICLE_CLASS_TYPE), POINTER :: LPC
3551+ TYPE (LAGRANGIAN_PARTICLE_TYPE), POINTER :: LP
35493552
35503553TNOW= CURRENT_TIME()
35513554
@@ -3592,6 +3595,7 @@ SUBROUTINE INTERPOLATE_IL()
35923595 ENDDO
35933596 ENDDO
35943597
3598+ ! Cut-cells
35953599 DO ICF = INTERNAL_CFACE_CELLS_LB+1 ,INTERNAL_CFACE_CELLS_LB+ N_INTERNAL_CFACE_CELLS
35963600 CFA = > CFACE(ICF)
35973601 BR = > BOUNDARY_RADIA(CFA% BR_INDEX)
@@ -3605,6 +3609,25 @@ SUBROUTINE INTERPOLATE_IL()
36053609 ENDDO
36063610 ENDDO
36073611
3612+ ! Particles
3613+ DO IP= 1 ,NLP
3614+ LP = > LAGRANGIAN_PARTICLE(IP)
3615+ LPC = > LAGRANGIAN_PARTICLE_CLASS(LP% CLASS_INDEX)
3616+ IF (LPC% SOLID_PARTICLE .OR. LPC% MASSLESS_TARGET) THEN
3617+ IF (LP% ORIENTATION_INDEX> 0 ) THEN
3618+ BR = > BOUNDARY_RADIA(LP% BR_INDEX)
3619+ DO IBND= 1 ,NUMBER_SPECTRAL_BANDS
3620+ ILW_OLD = BR% BAND(IBND)% ILW(:)
3621+ BR% BAND(IBND)% ILW(:) = 0._EB
3622+ DO I_INTP= 1 ,N_INTP
3623+ BR% BAND(IBND)% ILW(:) = BR% BAND(IBND)% ILW(:) + W(:,I_INTP)* ILW_OLD(IDX(:,I_INTP))* RSA(IDX(:,I_INTP))
3624+ ENDDO
3625+ BR% BAND(IBND)% ILW(:) = BR% BAND(IBND)% ILW(:)/ RSA(:)
3626+ ENDDO
3627+ ENDIF
3628+ ENDIF
3629+ ENDDO
3630+
36083631 ! Interpolate neighbouring mesh cell intensities
36093632 DO NNN= 1 ,N_NEIGHBORING_MESHES
36103633 NOM = NEIGHBORING_MESH(NNN)
@@ -3691,19 +3714,20 @@ SUBROUTINE RADIATION_FVM
36913714REAL (EB) :: RAP, AX, AXU, AXD, AY, AYU, AYD, AZ, AZU, AZD, VC, RU, RD, RP, AFD, &
36923715 ILXU, ILYU, ILZU, QVAL, BBF, BBFA, NCSDROP, RSA_RAT,EFLUX,SOOT_MASS_FRACTION, &
36933716 AIU_SUM,A_SUM,VOL,VC1,AY1,AZ1,DLO,COS_DLO,AILFU, &
3694- RAD_Q_SUM_PARTIAL,KFST4_SUM_PARTIAL,ALPHA_CC
3717+ RAD_Q_SUM_PARTIAL,KFST4_SUM_PARTIAL,ALPHA_CC,SUMILW
36953718
36963719INTEGER :: N,NN,IIG,JJG,KKG,I,J,K,IW,ICF,II,JJ,KK,IOR,IC,IWUP,IWDOWN, &
36973720 ISTART, IEND, ISTEP, JSTART, JEND, JSTEP, &
36983721 KSTART, KEND, KSTEP, NSTART, NEND, NSTEP, &
36993722 I_UIID, N_UPDATES, IBND, NOM, ARRAY_INDEX,NRA, &
3700- IMIN, JMIN, KMIN, IMAX, JMAX, KMAX, N_SLICE, M_IJK, IJK, LL
3723+ IMIN, JMIN, KMIN, IMAX, JMAX, KMAX, N_SLICE, M_IJK, IJK, LL,IO
37013724INTEGER :: IADD,IFACE,INDCF
37023725INTEGER , ALLOCATABLE :: IJK_SLICE(:,:)
3703- REAL (EB) :: XID,YJD,ZKD,KAPPA_PART_SINGLE,DLF,DLA(3 ),TSI,TMP_EXTERIOR,TEMP_ORIENTATION(3 )
3726+ REAL (EB) :: XID,YJD,ZKD,KAPPA_PART_SINGLE,DLF,DLA(3 ),TSI,TMP_EXTERIOR,TEMP_ORIENTATION(3 ),&
3727+ COS_DLO_ARR(NUMBER_RADIATION_ANGLES)
37043728REAL (EB), ALLOCATABLE , DIMENSION (:) :: ZZ_GET
37053729INTEGER :: IID,JJD,KKD,IP
3706- LOGICAL :: UPDATE_INTENSITY
3730+ LOGICAL :: UPDATE_INTENSITY, IS_PARTICLE_ORIENTATION_RAMP
37073731REAL (EB), POINTER , DIMENSION (:,:,:) :: IL,UIIOLD,KAPPA_PART,KFST4_PART,EXTCOE,SCAEFF,SCAEFF_G,IL_UP
37083732REAL (EB), POINTER , DIMENSION (:) :: OUTRAD_W,INRAD_W,OUTRAD_F,INRAD_F,IL_F
37093733TYPE (OMESH_TYPE), POINTER :: M2
@@ -4620,18 +4644,21 @@ SUBROUTINE RADIATION_FVM
46204644 IF (LPC% N_ORIENTATION== 0 ) CYCLE PARTICLE_RADIATION_LOOP
46214645 BC = > BOUNDARY_COORD(LP% BC_INDEX)
46224646 TEMP_ORIENTATION(1 :3 ) = ORIENTATION_VECTOR(1 :3 ,LP% ORIENTATION_INDEX)
4647+ IS_PARTICLE_ORIENTATION_RAMP = .FALSE.
46234648 IF (LP% INIT_INDEX > 0 ) THEN
46244649 IN = > INITIALIZATION(LP% INIT_INDEX)
46254650 IF (ANY (IN % ORIENTATION_RAMP_INDEX > 0 )) THEN
4626- TEMP_ORIENTATION(1 ) = EVALUATE_RAMP(T,IN % ORIENTATION_RAMP_INDEX(1 ))
4627- TEMP_ORIENTATION(2 ) = EVALUATE_RAMP(T,IN % ORIENTATION_RAMP_INDEX(2 ))
4628- TEMP_ORIENTATION(3 ) = EVALUATE_RAMP(T,IN % ORIENTATION_RAMP_INDEX(3 ))
4629- TEMP_ORIENTATION = TEMP_ORIENTATION / &
4630- (SQRT (TEMP_ORIENTATION(1 )** 2 + TEMP_ORIENTATION(2 )** 2 + TEMP_ORIENTATION(3 )** 2 ) &
4631- + TWENTY_EPSILON_EB)
4651+ CALL CALC_PARTICLE_TEMP_ORIENTATION(T,IN % ORIENTATION_RAMP_INDEX(1 :3 ),TEMP_ORIENTATION)
4652+ IS_PARTICLE_ORIENTATION_RAMP = .TRUE.
46324653 ENDIF
46334654 ENDIF
4634- COS_DLO = - DOT_PRODUCT (TEMP_ORIENTATION(1 :3 ),DLANG(1 :3 ,N))
4655+
4656+ IF (IS_PARTICLE_ORIENTATION_RAMP) THEN
4657+ COS_DLO = - DOT_PRODUCT (TEMP_ORIENTATION(1 :3 ),DLANG(1 :3 ,N))
4658+ ELSE
4659+ COS_DLO = - DLO_ORIENTATION(LP% ORIENTATION_INDEX,N)
4660+ ENDIF
4661+
46354662 IF (COS_DLO > COS_HALF_VIEW_ANGLE(LP% ORIENTATION_INDEX)) THEN
46364663 DLO = - (TEMP_ORIENTATION(1 )* DLX(N) + TEMP_ORIENTATION(2 )* DLY(N) + TEMP_ORIENTATION(3 )* DLZ(N))
46374664 BR = > BOUNDARY_RADIA(LP% BR_INDEX)
@@ -4774,8 +4801,25 @@ SUBROUTINE RADIATION_FVM
47744801 IF (LP% ORIENTATION_INDEX> 0 ) THEN
47754802 BR = > BOUNDARY_RADIA(LP% BR_INDEX)
47764803 B1% Q_RAD_IN = 0._EB
4804+ IO = LP% ORIENTATION_INDEX
4805+ IS_PARTICLE_ORIENTATION_RAMP = .FALSE.
4806+ IF (LP% INIT_INDEX > 0 ) THEN
4807+ IN = > INITIALIZATION(LP% INIT_INDEX)
4808+ IF (ANY (IN % ORIENTATION_RAMP_INDEX > 0 )) THEN
4809+ IS_PARTICLE_ORIENTATION_RAMP = .TRUE.
4810+ DO N= 1 ,NRA
4811+ CALL CALC_PARTICLE_TEMP_ORIENTATION(T,IN % ORIENTATION_RAMP_INDEX(1 :3 ),TEMP_ORIENTATION)
4812+ COS_DLO_ARR(N) = DOT_PRODUCT (TEMP_ORIENTATION(1 :3 ),DLANG(1 :3 ,N))
4813+ ENDDO
4814+ ENDIF
4815+ ENDIF
47774816 DO IBND= 1 ,NUMBER_SPECTRAL_BANDS
4778- B1% Q_RAD_IN = B1% Q_RAD_IN + B1% EMISSIVITY * (WEIGH_CYL* SUM (BR% BAND(IBND)% ILW(1 :NUMBER_RADIATION_ANGLES)) + EFLUX)
4817+ IF (IS_PARTICLE_ORIENTATION_RAMP) THEN
4818+ SUMILW = SUM (BR% BAND(IBND)% ILW,MASK = - COS_DLO_ARR(:) > COS_HALF_VIEW_ANGLE(IO))
4819+ ELSE
4820+ SUMILW = SUM (BR% BAND(IBND)% ILW,MASK = - DLO_ORIENTATION(IO,:) > COS_HALF_VIEW_ANGLE(IO))
4821+ ENDIF
4822+ B1% Q_RAD_IN = B1% Q_RAD_IN + B1% EMISSIVITY* (WEIGH_CYL* SUMILW + EFLUX)
47794823 ENDDO
47804824 ELSE
47814825 BC = > BOUNDARY_COORD(LP% BC_INDEX)
@@ -4814,6 +4858,26 @@ SUBROUTINE RADIATION_FVM
48144858
48154859END SUBROUTINE RADIATION_FVM
48164860
4861+ ! > \brief Provide the temporary orientation of a particle, given a ramp.
4862+ SUBROUTINE CALC_PARTICLE_TEMP_ORIENTATION (T , ORIENTATION_RAMP_INDEX , TEMP_ORIENTATION )
4863+
4864+ REAL (EB), INTENT (IN ) :: T
4865+ INTEGER , INTENT (IN ) :: ORIENTATION_RAMP_INDEX(3 )
4866+ REAL (EB), INTENT (OUT ) :: TEMP_ORIENTATION(3 )
4867+
4868+ REAL (EB) :: NORM
4869+
4870+ TEMP_ORIENTATION(1 ) = EVALUATE_RAMP(T, ORIENTATION_RAMP_INDEX(1 ))
4871+ TEMP_ORIENTATION(2 ) = EVALUATE_RAMP(T, ORIENTATION_RAMP_INDEX(2 ))
4872+ TEMP_ORIENTATION(3 ) = EVALUATE_RAMP(T, ORIENTATION_RAMP_INDEX(3 ))
4873+
4874+ NORM = SQRT (SUM (TEMP_ORIENTATION** 2 )) + TWENTY_EPSILON_EB
4875+
4876+ TEMP_ORIENTATION = TEMP_ORIENTATION / NORM
4877+
4878+ END SUBROUTINE CALC_PARTICLE_TEMP_ORIENTATION
4879+
4880+
48174881
48184882! > \brief Add user-specified HRRPUV to the heat release rate term, Q
48194883! > \param MODE Indicator of whether volumetric heat release rate, HRRPUV, is to be added to or subtracted from Q
0 commit comments