File: RELATIVE:/../../../mfix.git/model/des/calc_force_dem.f
1
2
3
4
5
6
7
8
9
10
11
12 SUBROUTINE CALC_FORCE_DEM
13
14
15 USE calc_collision_wall
16 USE constant, ONLY: Pi
17 USE des_thermo
18 USE des_thermo_cond
19 USE discretelement
20 USE run
21
22 IMPLICIT NONE
23
24
25
26
27 DOUBLE PRECISION, PARAMETER :: flag_overlap = 0.20d0
28
29 INTEGER :: I, LL, cc, CC_START, CC_END
30
31
32 DOUBLE PRECISION :: OVERLAP_N, OVERLAP_T(3)
33
34 DOUBLE PRECISION :: SQRT_OVERLAP
35
36
37
38 DOUBLE PRECISION :: R_LM,DIST_CI,DIST_CL
39
40
41 DOUBLE PRECISION :: V_REL_TRANS_NORM, rad
42
43
44 DOUBLE PRECISION :: DIST(3), NORMAL(3), DIST_MAG, POS(3)
45
46 DOUBLE PRECISION :: VREL_T(3)
47
48 DOUBLE PRECISION :: FN(3), FT(3)
49
50 DOUBLE PRECISION :: FC_TMP(3)
51
52 DOUBLE PRECISION :: TOW_FORCE(3)
53
54 DOUBLE PRECISION :: TOW_TMP(3,2)
55
56 DOUBLE PRECISION :: QQ_TMP
57
58
59 INTEGER :: PHASEI, PHASELL
60
61 DOUBLE PRECISION :: ETAN_DES, ETAT_DES
62 DOUBLE PRECISION :: KN_DES, KT_DES
63
64 DOUBLE PRECISION :: FORCE_COH, EQ_RADIUS, DistApart
65
66 LOGICAL, PARAMETER :: report_excess_overlap = .FALSE.
67
68 DOUBLE PRECISION :: FNMD, FTMD, MAG_OVERLAP_T, TANGENT(3)
69
70
71
72
73 IF(USE_COHESION) PostCohesive(:) = ZERO
74
75 CALL CALC_DEM_FORCE_WITH_WALL_STL
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 DO LL = 1, MAX_PIP
96 IF(IS_NONEXISTENT(LL)) CYCLE
97 pos = DES_POS_NEW(:,LL)
98 rad = DES_RADIUS(LL)
99
100 CC_START = 1
101 IF (LL.gt.1) CC_START = NEIGHBOR_INDEX(LL-1)
102 CC_END = NEIGHBOR_INDEX(LL)
103
104 DO CC = CC_START, CC_END-1
105 I = NEIGHBORS(CC)
106 IF(IS_NONEXISTENT(I)) CYCLE
107
108 R_LM = rad + DES_RADIUS(I)
109 DIST(:) = DES_POS_NEW(:,I) - POS(:)
110 DIST_MAG = dot_product(DIST,DIST)
111
112 FC_TMP(:) = ZERO
113
114
115 IF(USE_COHESION .AND. VAN_DER_WAALS) THEN
116 IF(DIST_MAG < (R_LM+VDW_OUTER_CUTOFF)**2) THEN
117 EQ_RADIUS = 2d0 * DES_RADIUS(LL)*DES_RADIUS(I) / &
118 (DES_RADIUS(LL)+DES_RADIUS(I))
119 IF(DIST_MAG > (VDW_INNER_CUTOFF+R_LM)**2) THEN
120 DistApart = (SQRT(DIST_MAG)-R_LM)
121 FORCE_COH = HAMAKER_CONSTANT * EQ_RADIUS / &
122 (12d0*DistApart**2) * (Asperities/(Asperities+ &
123 EQ_RADIUS) + ONE/(ONE+Asperities/DistApart)**2 )
124 ELSE
125 FORCE_COH = 2d0 * PI * SURFACE_ENERGY * EQ_RADIUS * &
126 (Asperities/(Asperities+EQ_RADIUS) + ONE/ &
127 (ONE+Asperities/VDW_INNER_CUTOFF)**2 )
128 ENDIF
129 FC_TMP(:) = DIST(:)*FORCE_COH/SQRT(DIST_MAG)
130 TOW_TMP(:,:) = ZERO
131
132
133 (LL) = PostCohesive(LL) + FORCE_COH / PMASS(LL)
134 ENDIF
135 ENDIF
136
137 IF (ENERGY_EQ) THEN
138
139 IF(CALC_COND_DES(PIJK(LL,5))) THEN
140 QQ_TMP = DES_CONDUCTION(LL, I, sqrt(DIST_MAG), PIJK(LL,5), PIJK(LL,4))
141
142
143 (LL) = Q_Source(LL) + QQ_TMP
144
145
146 (I) = Q_Source(I) - QQ_TMP
147 ENDIF
148 ENDIF
149
150 IF(DIST_MAG > (R_LM + SMALL_NUMBER)**2) THEN
151 PFT_NEIGHBOR(:,CC) = 0.0
152 CYCLE
153 ENDIF
154
155 IF(DIST_MAG == 0) THEN
156 WRITE(*,8550) LL, I
157 STOP "division by zero"
158 8550 FORMAT('distance between particles is zero:',2(2x,I10))
159 ENDIF
160
161 DIST_MAG = SQRT(DIST_MAG)
162 NORMAL(:)= DIST(:)/DIST_MAG
163
164
165 = R_LM-DIST_MAG
166 IF(REPORT_EXCESS_OVERLAP) CALL PRINT_EXCESS_OVERLAP
167
168
169
170 CALL CFRELVEL(LL, I, V_REL_TRANS_NORM, VREL_T, &
171 NORMAL(:), DIST_MAG)
172
173 phaseLL = PIJK(LL,5)
174 phaseI = PIJK(I,5)
175
176
177 IF (DES_COLL_MODEL_ENUM .EQ. HERTZIAN) THEN
178 sqrt_overlap = SQRT(OVERLAP_N)
179 KN_DES = hert_kn(phaseLL,phaseI)*sqrt_overlap
180 KT_DES = hert_kt(phaseLL,phaseI)*sqrt_overlap
181 sqrt_overlap = SQRT(sqrt_overlap)
182 ETAN_DES = DES_ETAN(phaseLL,phaseI)*sqrt_overlap
183 ETAT_DES = DES_ETAT(phaseLL,phaseI)*sqrt_overlap
184
185
186 ELSE
187 KN_DES = KN
188 KT_DES = KT
189 ETAN_DES = DES_ETAN(phaseLL,phaseI)
190 ETAT_DES = DES_ETAT(phaseLL,phaseI)
191 ENDIF
192
193
194 (:) = -(KN_DES * OVERLAP_N * NORMAL(:) + &
195 ETAN_DES * V_REL_TRANS_NORM * NORMAL(:))
196
197
198 (:) = DTSOLID*VREL_T(:) + PFT_NEIGHBOR(:,CC)
199 MAG_OVERLAP_T = sqrt(dot_product(OVERLAP_T,OVERLAP_T))
200
201
202 IF(MAG_OVERLAP_T > 0.0) THEN
203
204 = KT_DES*MAG_OVERLAP_T
205
206 = MEW*sqrt(dot_product(FN,FN))
207
208 = OVERLAP_T/MAG_OVERLAP_T
209
210 IF(FTMD > FNMD) THEN
211 FT = -FNMD * TANGENT
212 OVERLAP_T = (FNMD/KT_DES) * TANGENT
213 ELSE
214 FT = -FTMD * TANGENT
215 ENDIF
216 ELSE
217 FT = 0.0
218 ENDIF
219
220
221 = FT - ETAT_DES * VREL_T(:)
222
223
224 (:,CC) = OVERLAP_T(:)
225
226
227
228
229 = DIST_MAG/2.d0 + (DES_RADIUS(LL)**2 - &
230 DES_RADIUS(I)**2)/(2.d0*DIST_MAG)
231
232 DIST_CI = DIST_MAG - DIST_CL
233
234 TOW_force(:) = DES_CROSSPRDCT(NORMAL(:), FT(:))
235 TOW_TMP(:,1) = DIST_CL*TOW_force(:)
236 TOW_TMP(:,2) = DIST_CI*TOW_force(:)
237
238
239
240 (:) = FC_TMP(:) + FN(:) + FT(:)
241
242 FC(:,LL) = FC(:,LL) + FC_TMP(:)
243
244
245 (1,I) = FC(1,I) - FC_TMP(1)
246
247 (2,I) = FC(2,I) - FC_TMP(2)
248
249 (3,I) = FC(3,I) - FC_TMP(3)
250
251
252 (:,LL) = TOW(:,LL) + TOW_TMP(:,1)
253
254
255 (1,I) = TOW(1,I) + TOW_TMP(1,2)
256
257 (2,I) = TOW(2,I) + TOW_TMP(2,2)
258
259 (3,I) = TOW(3,I) + TOW_TMP(3,2)
260
261 ENDDO
262 ENDDO
263
264
265
266
267
268 IF(USE_COHESION .AND. VAN_DER_WAALS .AND. GRAV_MAG > ZERO) THEN
269 PostCohesive(:) = PostCohesive(:)/GRAV_MAG
270 ENDIF
271
272 RETURN
273
274 contains
275
276 include 'functions.inc'
277
278
279
280
281
282
283
284
285 SUBROUTINE PRINT_EXCESS_OVERLAP
286
287 use error_manager
288
289 IF(OVERLAP_N > flag_overlap*DES_RADIUS(LL) .OR. &
290 OVERLAP_N > flag_overlap*DES_RADIUS(I)) THEN
291
292 WRITE(ERR_MSG,1000) trim(iVAL(LL)), trim(iVAL(I)), S_TIME, &
293 DES_RADIUS(LL), DES_RADIUS(I), OVERLAP_N
294
295 CALL FLUSH_ERR_MSG(HEADER=.FALSE., FOOTER=.FALSE.)
296 ENDIF
297
298 1000 FORMAT('WARNING: Excessive overplay detected between ', &
299 'particles ',A,' and ',/A,' at time ',g11.4,'.',/ &
300 'RADII: ',g11.4,' and ',g11.4,4x,'OVERLAP: ',g11.4)
301
302 END SUBROUTINE PRINT_EXCESS_OVERLAP
303
304 END SUBROUTINE CALC_FORCE_DEM
305