File: RELATIVE:/../../../mfix.git/model/des/mass_outflow_dem.f

1     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
2     !                                                                      !
3     !  Subroutine: MASS_OUTFLOW_DEM                                        !
4     !  Author: J.Musser                                   Date: 13-Jul-09  !
5     !                                                                      !
6     !  Purpose:  This routine fills in the necessary information for new   !
7     !  particles entereing the system.                                     !
8     !                                                                      !
9     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
10           SUBROUTINE MASS_OUTFLOW_DEM(FORCE_NSEARCH)
11     
12           use discretelement
13           use des_bc
14           use bc
15           use functions
16     
17           use mpi_utility, only: GLOBAL_ALL_OR
18     
19           implicit none
20     
21           LOGICAL, INTENT(INOUT) :: FORCE_NSEARCH
22     
23           INTEGER :: IJK
24           INTEGER :: LC, LP, NP, M
25           INTEGER :: BCV, BCV_I, IDX
26     
27           DOUBLE PRECISION :: SGN
28           DOUBLE PRECISION :: DIST
29     
30           LOGICAL :: FREEZE_VEL
31           DOUBLE PRECISION :: FREEZE(3)
32     
33           DO BCV_I = 1, DEM_BCMO
34     
35              BCV = DEM_BCMO_MAP(BCV_I)
36     
37              FREEZE_VEL = (BC_TYPE(BCV) /= 'MASS_OUTFLOW')
38     
39              SELECT CASE (BC_PLANE(BCV))
40              CASE('N'); FREEZE = (/0.0d0, 1.0d0, 0.0d0/); IDX=2; SGN=-1.0d0
41              CASE('S'); FREEZE = (/0.0d0, 1.0d0, 0.0d0/); IDX=2; SGN= 1.0d0
42              CASE('E'); FREEZE = (/1.0d0, 0.0d0, 0.0d0/); IDX=1; SGN=-1.0d0
43              CASE('W'); FREEZE = (/1.0d0, 0.0d0, 0.0d0/); IDX=1; SGN= 1.0d0
44              CASE('T'); FREEZE = (/0.0d0, 0.0d0, 1.0d0/); IDX=3; SGN=-1.0d0
45              CASE('B'); FREEZE = (/0.0d0, 0.0d0, 1.0d0/); IDX=3; SGN= 1.0d0
46              END SELECT
47     
48              DO LC=DEM_BCMO_IJKSTART(BCV_I), DEM_BCMO_IJKEND(BCV_I)
49                 IJK = DEM_BCMO_IJK(LC)
50                 DO LP= 1,DG_PIC(IJK)%ISIZE
51     
52                    NP = DG_PIC(IJK)%P(LP)
53     
54                    IF(IS_NONEXISTENT(NP)) CYCLE
55                    IF(IS_ANY_GHOST(NP)) CYCLE
56                    IF(IS_ENTERING(NP)) CYCLE
57     
58                    SELECT CASE (BC_PLANE(BCV))
59                    CASE('S'); DIST = YN(BC_J_s(BCV)-1) - DES_POS_NEW(2,NP)
60                    CASE('N'); DIST = DES_POS_NEW(2,NP) - YN(BC_J_s(BCV))
61                    CASE('W'); DIST = XE(BC_I_w(BCV)-1) - DES_POS_NEW(1,NP)
62                    CASE('E'); DIST = DES_POS_NEW(1,NP) - XE(BC_I_w(BCV))
63                    CASE('B'); DIST = ZT(BC_K_b(BCV)-1) - DES_POS_NEW(3,NP)
64                    CASE('T'); DIST = DES_POS_NEW(3,NP) - ZT(BC_K_b(BCV))
65                    END SELECT
66     
67     ! The particle is still inside the domain
68                    IF(DIST > DES_RADIUS(NP)) THEN
69                       CALL SET_NORMAL(NP)
70     
71     ! Check if the particle is crossing over the outlet plane.
72                    ELSEIF(DIST > ZERO) THEN
73     
74     ! The velocity is 'frozen' normal to the outflow plane. This approach
75     ! is strict because complex BCs (via STLs) can let particles pop through
76     ! the wall along the outlet.
77                       IF(FREEZE_VEL) THEN
78     ! Only 'freeze' a particle's velocy if it has it moving out of the
79     ! domain. Otherwise, particles flagged as exiting but moving away from
80     ! the BC appear to moon-walk through the domain until it crashes.
81                          IF(DES_VEL_NEW(IDX,NP)*SGN > 0.0d0) THEN
82                             DES_VEL_NEW(:,NP) = DES_VEL_NEW(:,NP)*FREEZE(:)
83     ! Set the flags for an exiting particle.
84                             IF (IS_GHOST(NP)) THEN
85                                CALL SET_EXITING_GHOST(NP)
86                             ELSE
87                                CALL SET_EXITING(NP)
88                             ENDIF
89                          ENDIF
90     
91     ! The user specified velocity is applied to the exiting particle. This
92     ! only applies to mass outflows where the speed at which particles
93     ! exit needs to be controled.
94                       ELSE
95                          M = PIJK(NP,5)
96                          DES_VEL_NEW(1,NP) = BC_U_s(BCV,M)
97                          DES_VEL_NEW(2,NP) = BC_V_s(BCV,M)
98                          DES_VEL_NEW(3,NP) = BC_W_s(BCV,M)
99     ! Set the flags for an exiting particle.
100                          IF (IS_GHOST(NP)) THEN
101                             CALL SET_EXITING_GHOST(NP)
102                          ELSE
103                             CALL SET_EXITING(NP)
104                          ENDIF
105                       ENDIF
106     
107     ! Ladies and gentlemen, the particle has left the building.
108                    ELSE
109                       CALL DELETE_PARTICLE(NP)
110                       FORCE_NSEARCH = .TRUE.
111                    ENDIF
112     
113                 ENDDO
114              ENDDO
115           ENDDO
116     
117     ! Sync the search flag across all processes.
118     !      CALL GLOBAL_ALL_OR(FORCE_NSEARCH)
119     
120           RETURN
121           END SUBROUTINE MASS_OUTFLOW_DEM
122     
123     !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv!
124     !                                                                      !
125     !  Subroutine: DELETE_PARTICLE                                         !
126     !  Author: J.Musser                                   Date: 13-Jul-09  !
127     !                                                                      !
128     !  Purpose:  This routine is used to check if a new particle has fully !
129     !  entered the domain.  If so, the flag classifying the particle as new!
130     !  is removed, allowing the particle to respond to contact forces from !
131     !  walls and other particles.                                          !
132     !                                                                      !
133     !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!
134           SUBROUTINE DELETE_PARTICLE(NP)
135     
136           USE compar
137           USE constant
138           USE des_bc
139           USE discretelement
140           USE funits
141           USE geometry
142           USE indices
143           USE param1
144           USE physprop
145           USE functions
146     
147           IMPLICIT NONE
148     
149           INTEGER, INTENT(IN) :: NP
150     
151     !-----------------------------------------------
152     ! Local variables
153     !-----------------------------------------------
154     
155           iGLOBAL_ID(NP) = -1
156           CALL SET_NONEXISTENT(NP)
157     
158           DES_POS_NEW(:,NP) = ZERO
159           DES_VEL_NEW(:,NP) = ZERO
160           OMEGA_NEW(:,NP) = ZERO
161     
162           IF(PARTICLE_ORIENTATION) ORIENTATION(1:3,NP) = INIT_ORIENTATION
163     
164           IF (DO_OLD) THEN
165              DES_POS_OLD(:,NP) = ZERO
166              DES_VEL_OLD(:,NP) = ZERO
167              OMEGA_OLD(:,NP) = ZERO
168           ENDIF
169     
170           DES_RADIUS(NP) = ZERO
171           PMASS(NP) = ZERO
172           PVOL(NP) = ZERO
173           RO_Sol(NP) = ZERO
174           OMOI(NP) = ZERO
175     
176           FC(:,NP) = ZERO
177           TOW(:,NP) = ZERO
178     
179           PPOS(:,NP) = ZERO
180     
181           WALL_COLLISION_FACET_ID(:,NP) = -1
182     
183           PIP = PIP - 1
184     
185           RETURN
186           END SUBROUTINE DELETE_PARTICLE
187