File: N:\mfix\model\des\des_thermo_cond_mod.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 MODULE DES_THERMO_COND
32
33
34 IMPLICIT NONE
35 DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: DES_Qw_cond
36 LOGICAL :: DO_AREA_CORRECTION
37 CONTAINS
38
39
40
41 FUNCTION DES_CONDUCTION(I, J, CENTER_DIST, iM, iIJK)
42
43 use constant
44 use des_thermo
45 use discretelement
46 use funits
47 use param1, only: zero, UNDEFINED
48 use physprop
49 use run, only: UNITS
50 IMPLICIT NONE
51
52
53
54
55 INTEGER, INTENT(IN) :: I,J
56
57 INTEGER, INTENT(IN) :: iIJK
58
59 INTEGER, INTENT(IN) :: iM
60
61 DOUBLE PRECISION, INTENT(IN) :: CENTER_DIST
62 DOUBLE PRECISION :: DES_CONDUCTION
63
64
65
66
67 INTEGER jM
68
69 DOUBLE PRECISION MIN_RAD
70
71 DOUBLE PRECISION MAX_RAD
72
73 DOUBLE PRECISION Q_pp
74
75 DOUBLE PRECISION Q_pfp
76
77 DOUBLE PRECISION RD_OUT
78
79 DOUBLE PRECISION RD_IN
80
81 DOUBLE PRECISION LENS_RAD
82
83 DOUBLE PRECISION DeltaTp
84
85 DOUBLE PRECISION lK_eff
86
87 DOUBLE PRECISION lRadius
88
89 DOUBLE PRECISION OLAP_Sim, OLAP_actual
90
91 DOUBLE PRECISION CENTER_DIST_CORR
92
93 DOUBLE PRECISION :: K_gas
94
95 DOUBLE PRECISION :: OLAP_1, OLAP_2
96
97 DOUBLE PRECISION :: RLENS_1, RLENS_2
98
99 DOUBLE PRECISION :: S_1, S_2
100
101 DOUBLE PRECISION :: H_1, H_2
102
103 DOUBLE PRECISION :: H
104
105 DOUBLE PRECISION :: RATIO
106
107
108
109
110
111 = PIJK(J,5)
112
113
114 = MIN(DES_RADIUS(I), DES_RADIUS(J))
115 MAX_RAD = MAX(DES_RADIUS(I), DES_RADIUS(J))
116
117 DeltaTp = DES_T_s(J) - DES_T_s(I)
118
119
120
121
122 = 0.0
123
124
125 = CENTER_DIST
126 IF(CENTER_DIST < (MAX_RAD + MIN_RAD)) THEN
127
128 = MAX_RAD + MIN_RAD - CENTER_DIST
129 IF(DO_AREA_CORRECTION)THEN
130 IF(Im.ge.Jm)THEN
131 OLAP_Actual = CORRECT_OLAP(OLAP_Sim,Jm,Im)
132 ELSE
133 OLAP_Actual = CORRECT_OLAP(OLAP_Sim,Im,Jm)
134 ENDIF
135 CENTER_DIST_CORR = MAX_RAD + MIN_RAD - OLAP_Actual
136 ENDIF
137
138 = K_eff(K_s0(iM),K_s0(jM))
139
140 = RADIUS(MAX_RAD, MIN_RAD)
141
142
143
144 = 2.0d0 * lK_eff * lRadius * DeltaTp
145
146
147 ENDIF
148
149
150
151
152
153
154 = MAX_RAD * (1.0D0 + FLPC)
155 OLAP_Actual = MAX_RAD + MIN_RAD - CENTER_DIST_CORR
156
157
158 IF(OLAP_actual > (-MAX_RAD*FLPC))THEN
159 RD_OUT = RADIUS(LENS_RAD, MIN_RAD)
160
161 = OLAP_actual / MAX_RAD
162 OLAP_1 = MAX_RAD*MAX_RAD*(RATIO-0.5D0*RATIO*RATIO)/CENTER_DIST_CORR
163 OLAP_2 = OLAP_actual - OLAP_1
164
165 = (OLAP_actual + DES_MIN_COND_DIST) / MAX_RAD
166 S_1 = (MAX_RAD*MAX_RAD*(RATIO-0.5D0*RATIO*RATIO)/&
167 &(CENTER_DIST_CORR-DES_MIN_COND_DIST)) - OLAP_1
168 S_2 = DES_MIN_COND_DIST - S_1
169
170 = sqrt(RD_OUT*RD_OUT+(MIN_RAD-OLAP_1)**2.0)
171 RLENS_2 = sqrt(RD_OUT*RD_OUT+(MAX_RAD-OLAP_2)**2.0)
172
173
174
175 if(k_g0.eq.UNDEFINED)then
176
177
178 = 6.02D-5*SQRT(0.5d0*(DES_T_S(I)+DES_T_S(J))/300.D0)
179
180 IF (UNITS == 'SI') K_Gas = 418.3925D0*K_Gas
181 else
182 K_Gas=k_g0
183 endif
184
185 H_1 = EVAL_H_PFP(RLENS_1, S_1, OLAP_1,MIN_RAD)*MIN_RAD*k_gas
186 H_2 = EVAL_H_PFP(RLENS_2, S_2, OLAP_2,MAX_RAD)*MAX_RAD*k_gas
187 IF(H_1.eq.ZERO.OR.H_2.eq.ZERO)THEN
188 H = ZERO
189 ELSE
190 H = H_1*H_2/(H_1+H_2)
191 ENDIF
192
193 Q_pfp = H *DeltaTp
194
195
196
197
198 ELSE
199 Q_pfp = ZERO
200 ENDIF
201 DES_CONDUCTION = Q_pp + Q_pfp
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247 RETURN
248
249 CONTAINS
250
251
252
253
254
255
256
257
258
259 DOUBLE PRECISION FUNCTION RADIUS(R1, R2)
260
261 IMPLICIT NONE
262
263
264 DOUBLE PRECISION, INTENT(IN) :: R1, R2
265
266 DOUBLE PRECISION BETA
267
268 DOUBLE PRECISION VALUE
269
270
271 = (R1**2 - R2**2 + CENTER_DIST_CORR**2)/(2.0d0 * R1 * CENTER_DIST_CORR)
272
273
274
275
276
277 IF( VALUE .GT. 1.0d0) THEN
278 RADIUS = -1.0d0
279 ELSE
280
281 = ACOS( VALUE )
282
283 = R1 * SIN(BETA)
284 ENDIF
285
286 RETURN
287 END FUNCTION RADIUS
288
289
290
291
292
293
294
295 DOUBLE PRECISION FUNCTION K_eff(K1, K2)
296
297 IMPLICIT NONE
298
299
300 DOUBLE PRECISION, INTENT(IN) :: K1, K2
301
302 K_eff = 2.0d0 * (K1*K2)/(K1 + K2)
303
304 RETURN
305 END FUNCTION K_eff
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324 DOUBLE PRECISION FUNCTION F(R)
325 USE utilities
326 USE des_thermo
327 IMPLICIT NONE
328
329 DOUBLE PRECISION, INTENT(IN) :: R
330
331 F = (2.0d0*Pi*R)/MAX((CENTER_DIST_CORR - SQRT(MAX_RAD**2-R**2) - &
332 SQRT(MIN_RAD**2-R**2)), DES_MIN_COND_DIST)
333
334 IF( mfix_isnan(F))PRINT*,'F IS NAN'
335
336 END FUNCTION F
337
338
339
340
341
342
343
344
345
346
347
348 DOUBLE PRECISION FUNCTION ADPT_SIMPSON(A, B)
349
350 IMPLICIT NONE
351
352
353 DOUBLE PRECISION, INTENT(IN) :: A, B
354
355 INTEGER, PARAMETER :: Kmax = 25
356
357 INTEGER :: K
358
359 DOUBLE PRECISION :: V(Kmax,6)
360
361 DOUBLE PRECISION :: H
362
363 DOUBLE PRECISION :: lS, rS
364
365
366 DOUBLE PRECISION :: rF, lF
367
368 DOUBLE PRECISION :: Err_BND
369
370 DOUBLE PRECISION :: EPS = 10.0**(-2)
371
372
373 LOGICAL, SAVE :: ADPT_SIMPSON_ERR = .FALSE.
374
375
376 (:,:) = 0.0d0
377 = 0.0d0
378 = (B-A)/2.0d0
379
380 = (F(A) + 4.0d0*F((A+B)/2.0d0) + F(B))*(H/3.0d0)
381
382 (1,:) = (/ A, H, F(A), F((A+B)/2.0d0), F(B), lS/)
383 K = 1
384
385 DO
386
387 = V(K,2)/2.0d0
388
389 = F(V(K,1) + H)
390
391 = (V(K,3) + 4.0d0*lF + V(K,4))*(H/3.0d0)
392
393 = F(V(K,1) + 3.0d0*H)
394
395 = (V(K,4) + 4.0d0*rF + V(K,5))*(H/3.0d0)
396
397 = (30.0d0*EPS*H)/(B-A)
398
399 IF( ABS(lS + rS - V(K,6)) .LT. Err_BND)THEN
400
401 = ADPT_SIMPSON + lS + rS + &
402 (1.0d0/15.0d0)*(lS + rS - V(K,6))
403
404 = K - 1
405
406
407 IF( K == 0) RETURN
408 ELSEIF( (K .GE. Kmax) .OR. &
409 (H == (B-A)*(1.0d0/2.0d0)**(Kmax+3))) THEN
410
411 IF(.NOT.ADPT_SIMPSON_ERR)THEN
412 WRITE(*,1000)
413 WRITE(UNIT_LOG,1000)
414 ADPT_SIMPSON_ERR = .TRUE.
415 ENDIF
416
417 = ADPT_SIMPSON + lS + rS + &
418 (1.0d0/15.0d0)*(lS + rS - V(K,6))
419
420 = K - 1
421 ELSE
422
423 (K+1,:) = (/V(K,1) + 2.0d0*H, H, V(K,4), rF, V(K,5), rS/)
424 V(K,:) = (/V(K,1), H, V(K,3), lF, V(K,4), lS/)
425
426 = K+1
427 ENDIF
428 ENDDO
429
430 1000 FORMAT(/1X,70('*'),/' From: DES_COND_EQ',/, ' Message: ', &
431 'Integration of the particle-fluid-particle equation did ', &
432 'not',/' converge! No definite bound can be placed on the ', &
433 'error.',/' Future convergence messages will be suppressed!', &
434 /1X,70('*'))
435
436 END FUNCTION ADPT_SIMPSON
437
438 DOUBLE PRECISION FUNCTION EVAL_H_PFP(RLENS_dim,S,OLAP_dim,RP)
439 USE CONSTANT
440 USE PARAM1
441
442 IMPLICIT NONE
443
444 DOUBLE PRECISION, intent(in) :: RLENS_dim, S, OLAP_dim, RP
445
446 DOUBLE PRECISION :: RLENS, OLAP, KN
447 DOUBLE PRECISION :: TERM1,TERM2,TERM3
448 DOUBLE PRECISION :: Rout,Rkn
449 DOUBLE PRECISION, PARAMETER :: TWO = 2.0D0
450
451 RLENS = RLENS_dim/RP
452 KN = S/RP
453 OLAP = OLAP_dim/RP
454
455 IF(-OLAP.ge.(RLENS-ONE))THEN
456 Rout = ZERO
457 ELSEIF(OLAP.le.TWO)THEN
458 Rout = sqrt(RLENS**2-(ONE-OLAP)**2)
459 ELSE
460 WRITE(*,*)'ERROR: Extremeley excessive overlap (Olap > Diam)'
461 WRITE(*,*)'OLAP = ',OLAP_dim,OLAP, RP
462 WRITE(*,*)'RLENS_dim',RLENS_dim, RLENS
463 write(*,*)'S, Kn', S,KN
464 STOP
465 ENDIF
466 Rout=MIN(Rout,ONE)
467
468 IF(OLAP.ge.ZERO)THEN
469
470 = PI*((ONE-OLAP)**2-(ONE-OLAP-KN)**2)/KN
471 TERM2 = TWO*PI*(sqrt(ONE-Rout**2)-(ONE-OLAP-KN))
472 TERM3 = TWO*PI*(ONE-OLAP)*log((ONE-OLAP-sqrt(ONE-Rout**2))/Kn)
473 EVAL_H_PFP = TERM1+TERM2+TERM3
474 ELSE
475 IF(-OLAP.ge.KN)THEN
476 Rkn = ZERO
477 ELSE
478 Rkn=sqrt(ONE-(ONE-OLAP-Kn)**2)
479 ENDIF
480
481 TERM1 = (Rkn**2/(TWO*KN))+sqrt(ONE-Rout**2)-sqrt(ONE-Rkn**2)
482 TERM2 = (ONE-OLAP)*log((ONE-OLAP-sqrt(ONE-Rout**2))/(ONE-OLAP-sqrt(ONE-Rkn**2)))
483 EVAL_H_PFP = TWO*PI*(TERM1+TERM2)
484
485 ENDIF
486 RETURN
487 END FUNCTION EVAL_H_PFP
488
489 END FUNCTION DES_CONDUCTION
490
491
492
493
494
495
496
497
498
499
500 FUNCTION DES_CONDUCTION_WALL(OLAP, K_sol, K_wall, K_gas, TWall, &
501 TPart, Rpart, RLens, M)
502 USE param1, only: zero
503 USE DES_THERMO, only: des_min_cond_dist
504
505 DOUBLE PRECISION :: DES_CONDUCTION_WALL
506 DOUBLE PRECISION, intent(in) :: OLAP, K_sol, K_wall, K_gas, TWall&
507 & ,TPart,RPart, RLens
508 DOUBLE PRECISION :: Rin, Rout
509 DOUBLE PRECISION :: OLAP_ACTUAL, TAUC_CORRECTION
510 DOUBLE PRECISION :: KEff
511 DOUBLE PRECISION :: Q_pw, Q_pfw
512 INTEGER :: M
513
514
515 = ZERO
516 Q_pfw= ZERO
517 OLAP_ACTUAL = OLAP
518
519
520 IF(OLAP.gt.ZERO)THEN
521
522 = 2.0D0*K_sol*K_wall/(K_sol+K_wall)
523
524 IF(DO_AREA_CORRECTION)THEN
525 OLAP_ACTUAL = CORRECT_OLAP(OLAP,M,-1)
526 ENDIF
527
528 = sqrt(2.0D0*OLAP_ACTUAL*Rpart-OLAP_ACTUAL*OLAP_ACTUAL)
529
530
531
532 = 2.0D0*Rin*Keff*(TWall-TPart)
533 ENDIF
534
535 =EVAL_H_PFW(RLens,DES_MIN_COND_DIST, OLAP_ACTUAL, RPart) * &
536 & K_gas*RPart*(TWall-TPart)
537
538 DES_CONDUCTION_WALL=Q_pw+Q_pfw
539
540 RETURN
541 END FUNCTION DES_CONDUCTION_WALL
542
543
544
545
546 FUNCTION CORRECT_OLAP(OLAP,M,L)
547 use discretelement
548 IMPLICIT NONE
549 DOUBLE PRECISION :: CORRECT_OLAP
550 DOUBLE PRECISION, INTENT (IN) :: OLAP
551 INTEGER, INTENT (IN) :: M, L
552 DOUBLE PRECISION :: KN_ACTUAL, KN_SIM
553
554 IF(L.eq.-1)THEN
555
556 IF(DES_COLL_MODEL_ENUM .EQ. HERTZIAN)THEN
557 CORRECT_OLAP = (HERT_KWN(M)/HERT_KWN_ACTUAL(M))**(2.0D0/3.0D0)*OLAP
558 ELSE
559 CORRECT_OLAP = (KN_W*OLAP/HERT_KWN_ACTUAL(M))**(2.0D0/3.0D0)
560 ENDIF
561 ELSE
562
563 IF(DES_COLL_MODEL_ENUM .EQ. HERTZIAN)THEN
564 CORRECT_OLAP = (HERT_KN(M,L)/HERT_KN_ACTUAL(M,L))**(2.0D0/3.0D0)*OLAP
565 ELSE
566 CORRECT_OLAP = (KN*OLAP/HERT_KN_ACTUAL(M,L))**(2.0D0/3.0D0)
567 ENDIF
568 ENDIF
569 RETURN
570 END FUNCTION CORRECT_OLAP
571
572
573 DOUBLE PRECISION FUNCTION EVAL_H_PFW(RLENS_dim,S,OLAP_dim,RP)
574 USE CONSTANT
575 USE PARAM1
576
577 IMPLICIT NONE
578
579 DOUBLE PRECISION, intent(in) :: RLENS_dim, S, OLAP_dim, RP
580
581 DOUBLE PRECISION :: RLENS, OLAP, KN
582 DOUBLE PRECISION :: TERM1,TERM2,TERM3
583 DOUBLE PRECISION :: Rout,Rkn
584 DOUBLE PRECISION, PARAMETER :: TWO = 2.0D0
585
586 RLENS = RLENS_dim/RP
587 KN = S/RP
588 OLAP = OLAP_dim/RP
589
590 IF(-OLAP.ge.(RLENS-ONE))THEN
591 Rout = ZERO
592 ELSEIF(OLAP.le.TWO)THEN
593 Rout = sqrt(RLENS**2-(ONE-OLAP)**2)
594 ELSE
595 WRITE(*,*)'ERROR: Extremeley excessive overlap (Olap > Diam)'
596 WRITE(*,*)'OLAP = ',OLAP_dim,OLAP, RP
597 WRITE(*,*)'RLENS_dim',RLENS_dim, RLENS
598 write(*,*)'S, Kn', S,KN
599 STOP
600 ENDIF
601 Rout=MIN(Rout,ONE)
602
603 IF(OLAP.ge.ZERO)THEN
604
605 = PI*((ONE-OLAP)**2-(ONE-OLAP-KN)**2)/KN
606 TERM2 = TWO*PI*(sqrt(ONE-Rout**2)-(ONE-OLAP-KN))
607 TERM3 = TWO*PI*(ONE-OLAP)*log((ONE-OLAP-sqrt(ONE-Rout**2))/Kn)
608 EVAL_H_PFW = TERM1+TERM2+TERM3
609 ELSE
610 IF(-OLAP.ge.KN)THEN
611 Rkn = ZERO
612 ELSE
613 Rkn=sqrt(ONE-(ONE-OLAP-Kn)**2)
614 ENDIF
615
616 TERM1 = (Rkn**2/(TWO*KN))+sqrt(ONE-Rout**2)-sqrt(ONE-Rkn**2)
617 TERM2 = (ONE-OLAP)*log((ONE-OLAP-sqrt(ONE-Rout**2))/(ONE-OLAP-sqrt(ONE-Rkn**2)))
618 EVAL_H_PFW = TWO*PI*(TERM1+TERM2)
619
620 ENDIF
621 RETURN
622 END FUNCTION EVAL_H_PFW
623
624
625 SUBROUTINE CALC_TIME_CORRECTION(time_corr, phaseI, phaseJ)
626 use discretelement, only: tau_c_base_actual, tauw_c_base_actual
627 use discretelement, only: tau_c_base_sim, tauw_c_base_sim
628 use discretelement, only: des_coll_model_enum, HERTZIAN
629 IMPLICIT NONE
630 INTEGER, intent (in) :: phaseI, phaseJ
631 DOUBLE PRECISION :: time_corr, tau_actual, tau_sim
632 DOUBLE PRECISION :: vimp
633 INTEGER :: M, N
634 vimp = 1.0D0
635 time_corr = 1.0D0
636 if (phaseJ == -1) then
637
638 = phaseI
639 IF (DES_COLL_MODEL_ENUM .EQ. HERTZIAN) THEN
640 time_corr = tauw_c_base_actual(M) / tauw_c_base_sim(M)
641 ELSE
642 vimp = 1.0D0
643 if (vimp .le. 0.0D0)then
644 time_corr = 1.0D0
645 else
646 time_corr = tauw_c_base_actual(M)*vimp**(-0.2D0) / tauw_c_base_sim(M)
647 endif
648 ENDIF
649
650 ELSE
651
652 if (phaseI .le. phaseJ)then
653 M = phaseI
654 N = phaseJ
655 else
656 M = phaseJ
657 N = phaseI
658 endif
659
660 IF (DES_COLL_MODEL_ENUM .EQ. HERTZIAN) THEN
661 time_corr = tau_c_base_actual(M,N) / tau_c_base_sim(M,N)
662 ELSE
663 vimp = 1.0D0
664 if (vimp .le. 0.0D0)then
665 time_corr = 1.0D0
666 else
667 time_corr = tau_c_base_actual(M,N)*vimp**(-0.2D0) / tau_c_base_sim(M,N)
668 endif
669 ENDIF
670 ENDIF
671 time_corr = time_corr **(2.0D0/3.0D0)
672
673 = 1.0D0
674 RETURN
675 END SUBROUTINE CALC_TIME_CORRECTION
676
677
678
679 END MODULE DES_THERMO_COND
680