@@ -177,6 +177,131 @@ SUBROUTINE MASS_FINITE_DIFFERENCES(NM)
177177
178178ENDDO SPECIES_LOOP
179179
180+ FACE_CORRECTION_IF: IF (TEST_FLUX_LIMITER_FACE_CORRECTION .AND. N_TRACKED_SPECIES> 2 ) THEN
181+
182+ ! Repeat the above for DENSITY
183+
184+ CALL GET_SCALAR_FACE_VALUE(UU,RHOP,FX(:,:,:,0 ),1 ,IBM1,1 ,JBAR,1 ,KBAR,1 ,I_FLUX_LIMITER)
185+ CALL GET_SCALAR_FACE_VALUE(VV,RHOP,FY(:,:,:,0 ),1 ,IBAR,1 ,JBM1,1 ,KBAR,2 ,I_FLUX_LIMITER)
186+ CALL GET_SCALAR_FACE_VALUE(WW,RHOP,FZ(:,:,:,0 ),1 ,IBAR,1 ,JBAR,1 ,KBM1,3 ,I_FLUX_LIMITER)
187+
188+ ! $OMP PARALLEL DO PRIVATE(IW,WC,BC,B1,II,JJ,KK,IIG,JJG,KKG,IOR,IC,U_TEMP,Z_TEMP,F_TEMP)
189+ WALL_LOOP_3: DO IW= 1 ,N_EXTERNAL_WALL_CELLS+ N_INTERNAL_WALL_CELLS
190+ WC= >WALL(IW)
191+ IF (WC% BOUNDARY_TYPE== NULL_BOUNDARY) CYCLE WALL_LOOP_3
192+ BC= >BOUNDARY_COORD(WC% BC_INDEX)
193+ B1= >BOUNDARY_PROP1(WC% B1_INDEX)
194+
195+ II = BC% II
196+ JJ = BC% JJ
197+ KK = BC% KK
198+ IIG = BC% IIG
199+ JJG = BC% JJG
200+ KKG = BC% KKG
201+ IOR = BC% IOR
202+ IC = CELL_INDEX(II,JJ,KK)
203+
204+ IF (WC% BOUNDARY_TYPE== SOLID_BOUNDARY .AND. .NOT. CELL(IC)% SOLID .AND. .NOT. CELL(IC)% EXTERIOR) THEN
205+ SELECT CASE (IOR)
206+ CASE ( 1 ); FX(IIG-1 ,JJG,KKG,0 ) = 0._EB
207+ CASE (- 1 ); FX(IIG,JJG,KKG,0 ) = 0._EB
208+ CASE ( 2 ); FY(IIG,JJG-1 ,KKG,0 ) = 0._EB
209+ CASE (- 2 ); FY(IIG,JJG,KKG,0 ) = 0._EB
210+ CASE ( 3 ); FZ(IIG,JJG,KKG-1 ,0 ) = 0._EB
211+ CASE (- 3 ); FZ(IIG,JJG,KKG,0 ) = 0._EB
212+ END SELECT
213+ ELSE
214+ SELECT CASE (IOR)
215+ CASE ( 1 ); FX(IIG-1 ,JJG,KKG,0 ) = B1% RHO_F
216+ CASE (- 1 ); FX(IIG,JJG,KKG,0 ) = B1% RHO_F
217+ CASE ( 2 ); FY(IIG,JJG-1 ,KKG,0 ) = B1% RHO_F
218+ CASE (- 2 ); FY(IIG,JJG,KKG,0 ) = B1% RHO_F
219+ CASE ( 3 ); FZ(IIG,JJG,KKG-1 ,0 ) = B1% RHO_F
220+ CASE (- 3 ); FZ(IIG,JJG,KKG,0 ) = B1% RHO_F
221+ END SELECT
222+ ENDIF
223+
224+ ! Overwrite first off-wall advective flux if flow is away from the wall and if the face is not also a wall cell
225+
226+ OFF_WALL_IF_3: IF (WC% BOUNDARY_TYPE/= INTERPOLATED_BOUNDARY .AND. WC% BOUNDARY_TYPE/= OPEN_BOUNDARY) THEN
227+
228+ OFF_WALL_SELECT_3: SELECT CASE (IOR)
229+ CASE ( 1 ) OFF_WALL_SELECT_3
230+ ! ghost FX/UU(II+1)
231+ ! /// II /// II+1 | II+2 | ...
232+ ! ^ WALL_INDEX(II+1,+1)
233+ IF ((UU(II+1 ,JJ,KK)>0._EB ) .AND. .NOT. (CELL(CELL_INDEX(II+1 ,JJ,KK))% WALL_INDEX(+ 1 )>0 )) THEN
234+ Z_TEMP(0 :3 ,1 ,1 ) = (/ RHOP(II+1 ,JJ,KK),RHOP(II+1 :II+2 ,JJ,KK),DUMMY/ )
235+ U_TEMP(1 ,1 ,1 ) = UU(II+1 ,JJ,KK)
236+ CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1 ,1 ,1 ,1 ,1 ,1 ,1 ,I_FLUX_LIMITER)
237+ FX(II+1 ,JJ,KK,0 ) = F_TEMP(1 ,1 ,1 )
238+ ENDIF
239+ CASE (- 1 ) OFF_WALL_SELECT_3
240+ ! FX/UU(II-2) ghost
241+ ! ... | II-2 | II-1 /// II ///
242+ ! ^ WALL_INDEX(II-1,-1)
243+ IF ((UU(II-2 ,JJ,KK)<0._EB ) .AND. .NOT. (CELL(CELL_INDEX(II-1 ,JJ,KK))% WALL_INDEX(- 1 )>0 )) THEN
244+ Z_TEMP(0 :3 ,1 ,1 ) = (/ DUMMY,RHOP(II-2 :II-1 ,JJ,KK),RHOP(II-1 ,JJ,KK)/ )
245+ U_TEMP(1 ,1 ,1 ) = UU(II-2 ,JJ,KK)
246+ CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1 ,1 ,1 ,1 ,1 ,1 ,1 ,I_FLUX_LIMITER)
247+ FX(II-2 ,JJ,KK,0 ) = F_TEMP(1 ,1 ,1 )
248+ ENDIF
249+ CASE ( 2 ) OFF_WALL_SELECT_3
250+ IF ((VV(II,JJ+1 ,KK)>0._EB ) .AND. .NOT. (CELL(CELL_INDEX(II,JJ+1 ,KK))% WALL_INDEX(+ 2 )>0 )) THEN
251+ Z_TEMP(1 ,0 :3 ,1 ) = (/ RHOP(II,JJ+1 ,KK),RHOP(II,JJ+1 :JJ+2 ,KK),DUMMY/ )
252+ U_TEMP(1 ,1 ,1 ) = VV(II,JJ+1 ,KK)
253+ CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1 ,1 ,1 ,1 ,1 ,1 ,2 ,I_FLUX_LIMITER)
254+ FY(II,JJ+1 ,KK,0 ) = F_TEMP(1 ,1 ,1 )
255+ ENDIF
256+ CASE (- 2 ) OFF_WALL_SELECT_3
257+ IF ((VV(II,JJ-2 ,KK)<0._EB ) .AND. .NOT. (CELL(CELL_INDEX(II,JJ-1 ,KK))% WALL_INDEX(- 2 )>0 )) THEN
258+ Z_TEMP(1 ,0 :3 ,1 ) = (/ DUMMY,RHOP(II,JJ-2 :JJ-1 ,KK),RHOP(II,JJ-1 ,KK)/ )
259+ U_TEMP(1 ,1 ,1 ) = VV(II,JJ-2 ,KK)
260+ CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1 ,1 ,1 ,1 ,1 ,1 ,2 ,I_FLUX_LIMITER)
261+ FY(II,JJ-2 ,KK,0 ) = F_TEMP(1 ,1 ,1 )
262+ ENDIF
263+ CASE ( 3 ) OFF_WALL_SELECT_3
264+ IF ((WW(II,JJ,KK+1 )>0._EB ) .AND. .NOT. (CELL(CELL_INDEX(II,JJ,KK+1 ))% WALL_INDEX(+ 3 )>0 )) THEN
265+ Z_TEMP(1 ,1 ,0 :3 ) = (/ RHOP(II,JJ,KK+1 ),RHOP(II,JJ,KK+1 :KK+2 ),DUMMY/ )
266+ U_TEMP(1 ,1 ,1 ) = WW(II,JJ,KK+1 )
267+ CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1 ,1 ,1 ,1 ,1 ,1 ,3 ,I_FLUX_LIMITER)
268+ FZ(II,JJ,KK+1 ,0 ) = F_TEMP(1 ,1 ,1 )
269+ ENDIF
270+ CASE (- 3 ) OFF_WALL_SELECT_3
271+ IF ((WW(II,JJ,KK-2 )<0._EB ) .AND. .NOT. (CELL(CELL_INDEX(II,JJ,KK-1 ))% WALL_INDEX(- 3 )>0 )) THEN
272+ Z_TEMP(1 ,1 ,0 :3 ) = (/ DUMMY,RHOP(II,JJ,KK-2 :KK-1 ),RHOP(II,JJ,KK-1 )/ )
273+ U_TEMP(1 ,1 ,1 ) = WW(II,JJ,KK-2 )
274+ CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1 ,1 ,1 ,1 ,1 ,1 ,3 ,I_FLUX_LIMITER)
275+ FZ(II,JJ,KK-2 ,0 ) = F_TEMP(1 ,1 ,1 )
276+ ENDIF
277+ END SELECT OFF_WALL_SELECT_3
278+
279+ ENDIF OFF_WALL_IF_3
280+
281+ ENDDO WALL_LOOP_3
282+ ! $OMP END PARALLEL DO
283+
284+ ! Now correct the face value of (RHO*ZZ) such that SUM(RHO*ZZ)_FACE = RHO_FACE
285+
286+ ! $OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
287+ DO K= 0 ,KBAR
288+ DO J= 0 ,JBAR
289+ DO I= 0 ,IBAR
290+ N= MAXLOC (FX(I,J,K,1 :N_TRACKED_SPECIES),1 )
291+ FX(I,J,K,N) = MAX ( 0._EB , FX(I,J,K,0 ) - SUM (FX(I,J,K,1 :(N-1 ))) - SUM (FX(I,J,K,(N+1 ):N_TRACKED_SPECIES)) )
292+
293+ N= MAXLOC (FY(I,J,K,1 :N_TRACKED_SPECIES),1 )
294+ FY(I,J,K,N) = MAX ( 0._EB , FY(I,J,K,0 ) - SUM (FY(I,J,K,1 :(N-1 ))) - SUM (FY(I,J,K,(N+1 ):N_TRACKED_SPECIES)) )
295+
296+ N= MAXLOC (FZ(I,J,K,1 :N_TRACKED_SPECIES),1 )
297+ FZ(I,J,K,N) = MAX ( 0._EB , FZ(I,J,K,0 ) - SUM (FZ(I,J,K,1 :(N-1 ))) - SUM (FZ(I,J,K,(N+1 ):N_TRACKED_SPECIES)) )
298+ ENDDO
299+ ENDDO
300+ ENDDO
301+ ! $OMP END PARALLEL DO
302+
303+ ENDIF FACE_CORRECTION_IF
304+
180305T_USED(3 )= T_USED(3 )+ CURRENT_TIME()- TNOW
181306END SUBROUTINE MASS_FINITE_DIFFERENCES
182307
0 commit comments