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