source: palm/trunk/SOURCE/wang_kernel.f90 @ 790

Last change on this file since 790 was 790, checked in by raasch, 13 years ago

Bugfix for output of mean particle radius + preliminary works for implementing the Wang collision kernel

  • Property svn:keywords set to Id
File size: 22.4 KB
Line 
1MODULE wang_kernel_mod
2
3!------------------------------------------------------------------------------!
4! Current revisions:
5! -----------------
6!
7!
8! Former revisions:
9! -----------------
10! $Id: wang_kernel.f90 790 2011-11-29 03:11:20Z raasch $
11!
12!
13! Description:
14! ------------
15! This routine calculates the effect of (SGS) turbulence on the collision
16! efficiency of droplets.
17! It is based on the original kernel developed by Wang (...)
18!------------------------------------------------------------------------------!
19
20    USE arrays_3d
21    USE cloud_parameters
22    USE constants
23    USE particle_attributes
24
25    IMPLICIT NONE
26
27    PRIVATE
28
29    PUBLIC TurbSD, turb_enhance_eff, effic, fallg, PHI, ZHI, colker
30
31    INTEGER, SAVE :: ip, jp, kp, pstart, pend, psum
32    REAL, SAVE :: epsilon, urms
33    REAL, DIMENSION(:,:), ALLOCATABLE, SAVE :: gck, ec, ecf
34    REAL, DIMENSION(:),   ALLOCATABLE, SAVE :: winf
35    REAL, SAVE :: eps2, urms2
36
37!
38!-- Public interfaces
39    INTERFACE TurbSD
40       MODULE PROCEDURE TurbSD
41    END INTERFACE TurbSD
42
43    INTERFACE PHI
44       MODULE PROCEDURE PHI
45    END INTERFACE PHI
46
47    INTERFACE ZHI
48       MODULE PROCEDURE ZHI
49    END INTERFACE ZHI
50
51    INTERFACE turb_enhance_eff
52       MODULE PROCEDURE turb_enhance_eff
53    END INTERFACE turb_enhance_eff
54
55    INTERFACE effic
56       MODULE PROCEDURE effic
57    END INTERFACE effic
58
59    INTERFACE fallg
60       MODULE PROCEDURE fallg
61    END INTERFACE fallg
62
63    INTERFACE colker
64       MODULE PROCEDURE colker
65    END INTERFACE colker
66
67    CONTAINS
68
69!------------------------------------------------------------------------------!
70! SUBROUTINE for calculation of collision kernel
71!------------------------------------------------------------------------------!
72    SUBROUTINE colker(i1,j1,k1,kernel)
73
74       USE arrays_3d
75       USE cloud_parameters
76       USE constants
77       USE indices
78       USE particle_attributes
79
80       IMPLICIT NONE
81
82       INTEGER :: i,i1,j,j1,k1
83
84       REAL, DIMENSION(prt_start_index(k1,j1,i1):prt_start_index(k1,j1,i1)+prt_count(k1,j1,i1)-1,prt_start_index(k1,j1,i1):prt_start_index(k1,j1,i1)+prt_count(k1,j1,i1)-1) :: kernel
85
86       ip = i1
87       jp = j1
88       kp = k1
89
90       pstart = prt_start_index(kp,jp,ip)
91       pend   = prt_start_index(kp,jp,ip) + prt_count(kp,jp,ip) - 1
92       psum   = prt_count(kp,jp,ip)
93
94       ALLOCATE(winf(pstart:pend), ec(pstart:pend,pstart:pend))
95
96       IF ( turbulence_effects_on_collision ) THEN
97
98          ALLOCATE(gck(pstart:pend,pstart:pend), ecf(pstart:pend,pstart:pend))
99
100          epsilon = diss(kp,jp,ip) * 10000.0  !dissipation rate in cm**2/s**-3
101          urms     = 202.0 * (epsilon/400.0)**(1.0/3.0)
102
103          IF (epsilon <= 0.001) THEN
104
105             CALL fallg
106             CALL effic
107
108             DO j = pstart, pend, 1
109                DO i =  pstart, pend, 1
110                   kernel(i,j) = pi * (particles(j)%radius*100.0 + particles(i)%radius*100.0)**2.0 * ec(i,j) * abs(winf(j)-winf(i))
111                ENDDO
112             ENDDO
113
114          ELSE
115
116             CALL TurbSD
117             CALL turb_enhance_eff
118             CALL effic
119
120             DO j = pstart, pend, 1
121                DO i =  pstart, pend, 1
122                   kernel(i,j) = ec(i,j) * gck(i,j) * ecf(i,j)
123                ENDDO
124             ENDDO
125          ENDIF
126
127          DEALLOCATE(gck, ecf)
128
129       ELSE
130
131          CALL fallg
132          CALL effic
133
134          DO j = pstart, pend, 1
135             DO i =  pstart, pend, 1
136                kernel(i,j) = pi * (particles(j)%radius*100.0 + particles(i)%radius*100.0)**2.0 * ec(i,j) * abs(winf(j)-winf(i))
137             ENDDO
138          ENDDO
139
140       ENDIF
141
142       DEALLOCATE(winf, ec)
143
144       RETURN
145
146    END SUBROUTINE colker
147
148!------------------------------------------------------------------------------!
149! SUBROUTINE for calculation of w, g and gck
150!------------------------------------------------------------------------------!
151    SUBROUTINE TurbSD
152!from Aayala 2008b, page 37ff, necessary input parameter water density, radii of droplets, air density, air viscosity, turbulent dissipation rate, taylor microscale reynolds number, gravitational acceleration
153       USE constants
154       USE cloud_parameters
155       USE particle_attributes
156       USE arrays_3d
157
158       IMPLICIT NONE
159
160       REAL :: airvisc, airdens, waterdens, gravity, anu, Relamda, &
161               Tl, Lf, tauk, eta, vk, ao, lambda, tt, z, be,       &
162               bbb, d1, e1, d2, e2, ccc, b1, c1, b2, c2, v1xysq,  &
163               vrms1xy, v2xysq, vrms2xy, v1v2xy, fR, wrtur2xy, wrgrav2, &
164               wrFIN, SSt, XX, YY, c1_gr, ao_gr, fao_gr, rc, grFIN, v1, t1, v2, t2, rrp
165
166       REAL, DIMENSION(pstart:pend) :: vST, tau, St
167
168       INTEGER :: i, j
169
170       airvisc   = 0.1818   !dynamic viscosity in mg/cm*s
171       airdens   = 1.2250   !air density in mg/cm**3
172       waterdens = 1000.0   !water density in mg/cm**3
173       gravity   = 980.6650 !in cm/s**2
174
175       anu = airvisc/airdens  ! kinetic viscosity in cm**2/s
176
177       Relamda = urms**2.0*sqrt(15.0/epsilon/anu)
178
179       Tl = urms**2.0/epsilon       !in s
180       Lf = 0.5 * (urms**3.0)/epsilon !in cm
181
182       tauk = (anu/epsilon)**0.5       !in s
183       eta  = (anu**3.0/epsilon)**0.25  !in cm
184       vk   = eta/tauk                   !in cm/s
185
186       ao = (11.+7.*Relamda)/(205.+Relamda)
187
188       lambda = urms * sqrt(15.*anu/epsilon)     !in cm
189
190       tt = sqrt(2.*Relamda/(15.**0.5)/ao) * tauk !in s
191
192       CALL fallg !gives winf in cm/s
193
194       DO i = pstart, pend
195          vST(i) = winf(i)           !in cm/s
196          tau(i) = vST(i)/gravity    !in s
197          St(i)  = tau(i)/tauk
198       ENDDO
199
200!***** TO CALCULATE wr ********************************
201!from Aayala 2008b, page 38f
202
203       z  = tt/Tl
204       be = sqrt(2.0)*lambda/Lf
205
206       bbb = sqrt(1.0-2.0*be**2.0)
207       d1 = (1.+bbb)/2.0/bbb
208       e1 = Lf*(1.0+bbb)/2.0   !in cm
209       d2 = (1.0-bbb)/2.0/bbb
210       e2 = Lf*(1.0-bbb)/2.0   !in cm
211
212       ccc = sqrt(1.0-2.0*z**2.0)
213       b1 = (1.+ccc)/2./ccc
214       c1 = Tl*(1.+ccc)/2.   !in s
215       b2 = (1.-ccc)/2./ccc
216       c2 = Tl*(1.-ccc)/2.   !in s
217
218       DO i = pstart, pend
219          v1 = vST(i)         !in cm/s
220          t1 = tau(i)         !in s
221
222          DO j = pstart,i
223             rrp = (particles(i)%radius + particles(j)%radius) * 100.0 !radius in cm
224             v2  = vST(j)         !in cm/s
225             t2  = tau(j)         !in s
226
227             v1xysq =  b1*d1*PHI(c1,e1,v1,t1) &
228                     - b1*d2*PHI(c1,e2,v1,t1) &
229                     - b2*d1*PHI(c2,e1,v1,t1) &
230                     + b2*d2*PHI(c2,e2,v1,t1)
231             v1xysq = v1xysq * urms**2.0/t1    !in cm**2/s**2
232
233             vrms1xy= sqrt(v1xysq)             !in cm/s
234
235             v2xysq =  b1*d1*PHI(c1,e1,v2,t2) &
236                     - b1*d2*PHI(c1,e2,v2,t2) &
237                     - b2*d1*PHI(c2,e1,v2,t2) &
238                     + b2*d2*PHI(c2,e2,v2,t2)
239             v2xysq = v2xysq * urms**2.0/t2    !in cm**2/s**2
240
241              vrms2xy= sqrt(v2xysq)             !in cm/s
242
243             IF(vST(i).ge.vST(j)) THEN
244                v1 = vST(i)
245                t1 = tau(i)
246                v2 = vST(j)
247                t2 = tau(j)
248             ELSE
249                v1 = vST(j)
250                t1 = tau(j)
251                v2 = vST(i)
252                t2 = tau(i)
253             ENDIF
254
255             v1v2xy =  b1*d1*ZHI(c1,e1,v1,t1,v2,t2) &
256                     - b1*d2*ZHI(c1,e2,v1,t1,v2,t2) &
257                     - b2*d1*ZHI(c2,e1,v1,t1,v2,t2) &
258                     + b2*d2*ZHI(c2,e2,v1,t1,v2,t2)
259             fR = d1 * exp(-rrp/e1) - d2 * exp(-rrp/e2)
260             v1v2xy = v1v2xy * fR * urms**2.0/tau(i)/tau(j)    !in cm**2/s**2
261
262             wrtur2xy=vrms1xy**2.0 + vrms2xy**2.0 - 2.*v1v2xy  !in cm**2/s**2
263
264              IF (wrtur2xy.le.0.0) wrtur2xy=0.0
265
266              wrgrav2=pi/8.*(vST(j)-vST(i))**2.0
267
268              wrFIN = sqrt((2.0/pi)*(wrtur2xy+wrgrav2))    !in cm/s
269
270
271!***** TO CALCULATE gr ********************************
272
273             IF(St(j).gt.St(i)) THEN
274                SSt = St(j)
275             ELSE
276                SSt = St(i)
277             ENDIF
278
279             XX = -0.1988*SSt**4.0 + 1.5275*SSt**3.0 &
280                  -4.2942*SSt**2.0 + 5.3406*SSt
281
282             IF(XX.le.0.0) XX = 0.0
283
284             YY = 0.1886*exp(20.306/Relamda)
285
286             c1_gr = XX/(gravity/(vk/tauk))**YY
287
288             ao_gr  = ao + (pi/8.)*(gravity/(vk/tauk))**2.0
289             fao_gr = 20.115 * (ao_gr/Relamda)**0.5
290             rc     = sqrt( fao_gr * abs(St(j)-St(i)) ) * eta   !in cm
291
292             grFIN = ((eta**2.0+rc**2.0)/(rrp**2.0+rc**2.0))**(c1_gr/2.)
293             IF (grFIN.lt.1.0) grFIN = 1.0
294
295             gck(i,j) = 2. * pi * rrp**2.0 * wrFIN * grFIN       ! in cm**3/s
296             gck(j,i) = gck(i,j)
297
298          ENDDO
299       ENDDO
300
301
302       RETURN
303    END SUBROUTINE TurbSD
304
305!------------------------------------------------------------------------------!
306! PHI as a function
307!------------------------------------------------------------------------------!
308  REAL FUNCTION PHI(a,b,vsett,tau0)
309
310       IMPLICIT NONE
311
312       REAL :: a, aa1, b, vsett, tau0
313
314       aa1 = 1./tau0 + 1./a + vsett/b
315
316       PHI = 1./aa1 - vsett/2.0/b/aa1**2.0  !in s
317       RETURN
318    END FUNCTION PHI
319
320!------------------------------------------------------------------------------!
321! ZETA as a function
322!------------------------------------------------------------------------------!
323  REAL FUNCTION ZHI(a,b,vsett1,tau1,vsett2,tau2)
324
325       IMPLICIT NONE
326
327       REAL :: a, aa1, aa2, aa3, aa4, aa5, aa6, b, vsett1, tau1, vsett2, tau2
328
329        aa1 = vsett2/b - 1./tau2 - 1./a
330        aa2 = vsett1/b + 1./tau1 + 1./a
331        aa3 = (vsett1-vsett2)/b + 1./tau1 + 1./tau2
332        aa4 = (vsett2/b)**2.0 - (1./tau2 + 1./a)**2.0
333        aa5 = vsett2/b + 1./tau2 + 1./a
334        aa6 = 1./tau1 - 1./a + (1./tau2 + 1./a) * vsett1/vsett2
335        ZHI =  (1./aa1 - 1./aa2) * (vsett1-vsett2)/2./b/aa3**2.0          &
336             + (4./aa4 - 1./aa5**2.0 - 1./aa1**2.0) * vsett2/2./b/aa6      &
337             + (2.*b/aa2 - 2.*b/aa1 - vsett1/aa2**2.0 + vsett2/aa1**2.0)   &
338                                                           * 1./2./b/aa3             ! in s**2
339        RETURN
340    END FUNCTION ZHI
341
342
343!------------------------------------------------------------------------------!
344! SUBROUTINE for calculation of terminal velocity winf
345!------------------------------------------------------------------------------!
346
347   SUBROUTINE fallg
348
349       USE constants
350       USE cloud_parameters
351       USE particle_attributes
352       USE arrays_3d
353
354      IMPLICIT NONE
355
356      INTEGER :: i, j
357
358      REAL :: eta, xlamb, rhoa, rhow, grav, cunh, t0, sigma, stok, stb, phy, py,  &
359              x, y, xrey, bond
360
361      REAL, DIMENSION(1:7)  :: b
362      REAL, DIMENSION(1:6)  :: c
363      REAL, DIMENSION(1:20) :: rat
364      REAL, DIMENSION(1:15) :: r0
365      REAL, DIMENSION(1:15,1:20) :: ecoll
366
367      b = (/-0.318657e1,0.992696e0,-0.153193e-2,-0.987059e-3, &
368             -0.578878e-3,0.855176e-4,-0.327815e-5/)
369      c = (/-0.500015e1,0.523778e1,-0.204914e1,0.475294e0,    &
370             -0.542819e-1, 0.238449e-2/)
371
372      eta   = 1.818e-4     !in poise = g/(cm s)
373      xlamb = 6.62e-6    !in cm
374
375      rhow = 1.0       !in g/cm**3
376      rhoa = 1.225e-3    !in g/cm**3
377
378      grav = 980.665     !in cm/s**2
379      cunh = 1.257 * xlamb !in cm
380      t0   = 273.15        !in K
381      sigma= 76.1 - 0.155 * (293.15 - t0) !in N/m = g/s**2
382      stok = 2.0 * grav * (rhow - rhoa)/(9.0 * eta) ! in 1/(cm s)
383      stb  = 32.0 * rhoa * (rhow-rhoa) * grav/(3.0 * eta * eta) ! in 1/cm**3
384      phy  = (sigma**3.0) * (rhoa**2.0)/((eta**4.0) * grav * (rhow-rhoa))
385      py   = phy**(1.0/6.0)
386
387!particle radius has to be in cm
388      DO j = pstart, pend
389
390         IF (particles(j)%radius*100.0 .le. 1.e-3) THEN
391
392            winf(j)=stok*((particles(j)%radius*100.0)**2.+cunh* particles(j)%radius*100.0) !in cm/s
393
394         ELSEIF (particles(j)%radius*100.0.gt.1.e-3.and.particles(j)%radius*100.0.le.5.35e-2) THEN
395
396            x = log(stb*(particles(j)%radius*100.0)**3.0)
397            y = 0.0
398
399            DO i = 1, 7
400               y = y + b(i) * (x**(i-1))
401            ENDDO
402
403            xrey = (1.0 + cunh/(particles(j)%radius*100.0)) * exp(y)
404            winf(j) = xrey*eta/(2.0*rhoa*particles(j)%radius*100.0)  !in cm/s
405
406         ELSEIF (particles(j)%radius*100.0.gt.5.35e-2) THEN
407
408            bond = grav*(rhow-rhoa)*(particles(j)%radius*100.0)**2.0/sigma
409
410            IF (particles(j)%radius*100.0.gt.0.35)  THEN
411               bond = grav*(rhow-rhoa) * 0.35 * 0.35/sigma
412            ENDIF
413
414            x = log(16.0*bond*py/3.0)
415            y = 0.0
416
417            DO i = 1, 6
418               y = y + c(i) * (x**(i-1))
419            ENDDO
420
421            xrey = py*exp(y)
422            winf(j) = xrey*eta/(2.0*rhoa*particles(j)%radius*100.0)  !in cm/s
423
424            IF (particles(j)%radius*100.0 .gt.0.35)  THEN
425              winf(j) = xrey * eta/(2.0 * rhoa * 0.35) !in cm/s
426            ENDIF
427
428         ENDIF
429      ENDDO
430      RETURN
431   END SUBROUTINE fallg
432
433!------------------------------------------------------------------------------!
434! SUBROUTINE for calculation of collision efficencies
435!------------------------------------------------------------------------------!
436
437   SUBROUTINE effic
438
439       USE constants
440       USE cloud_parameters
441       USE particle_attributes
442       USE arrays_3d
443
444!collision efficiencies of hall kernel
445      IMPLICIT NONE
446
447      INTEGER :: i, ir, iq, j, k, kk
448      REAL    :: ek, rq, pp, qq
449
450      REAL, DIMENSION(1:21) :: rat
451      REAL, DIMENSION(1:15) :: r0
452      REAL, DIMENSION(1:15,1:21) :: ecoll
453
454      r0 = (/6.,8.,10.,15.,20.,25.,30.,40.,50., &
455              60.,70.,100.,150.,200.,300./)
456      rat = (/0.,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5, &
457               0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0/)
458
459      ecoll(:,1) = (/0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001/)
460      ecoll(:,2) = (/0.003,0.003,0.003,0.004,0.005,0.005,0.005,0.010,0.100,0.050,0.200,0.500,0.770,0.870,0.970/)
461      ecoll(:,3) = (/0.007,0.007,0.007,0.008,0.009,0.010,0.010,0.070,0.400,0.430,0.580,0.790,0.930,0.960,1.000/)
462      ecoll(:,4) = (/0.009,0.009,0.009,0.012,0.015,0.010,0.020,0.280,0.600,0.640,0.750,0.910,0.970,0.980,1.000/)
463      ecoll(:,5) = (/0.014,0.014,0.014,0.015,0.016,0.030,0.060,0.500,0.700,0.770,0.840,0.950,0.970,1.000,1.000/)
464      ecoll(:,6) = (/0.017,0.017,0.017,0.020,0.022,0.060,0.100,0.620,0.780,0.840,0.880,0.950,1.000,1.000,1.000/)
465      ecoll(:,7) = (/0.030,0.030,0.024,0.022,0.032,0.062,0.200,0.680,0.830,0.870,0.900,0.950,1.000,1.000,1.000/)
466      ecoll(:,8) = (/0.025,0.025,0.025,0.036,0.043,0.130,0.270,0.740,0.860,0.890,0.920,1.000,1.000,1.000,1.000/)
467      ecoll(:,9) = (/0.027,0.027,0.027,0.040,0.052,0.200,0.400,0.780,0.880,0.900,0.940,1.000,1.000,1.000,1.000/)
468      ecoll(:,10)= (/0.030,0.030,0.030,0.047,0.064,0.250,0.500,0.800,0.900,0.910,0.950,1.000,1.000,1.000,1.000/)
469      ecoll(:,11)= (/0.040,0.040,0.033,0.037,0.068,0.240,0.550,0.800,0.900,0.910,0.950,1.000,1.000,1.000,1.000/)
470      ecoll(:,12)= (/0.035,0.035,0.035,0.055,0.079,0.290,0.580,0.800,0.900,0.910,0.950,1.000,1.000,1.000,1.000/)
471      ecoll(:,13)= (/0.037,0.037,0.037,0.062,0.082,0.290,0.590,0.780,0.900,0.910,0.950,1.000,1.000,1.000,1.000/)
472      ecoll(:,14)= (/0.037,0.037,0.037,0.060,0.080,0.290,0.580,0.770,0.890,0.910,0.950,1.000,1.000,1.000,1.000/)
473      ecoll(:,15)= (/0.037,0.037,0.037,0.041,0.075,0.250,0.540,0.760,0.880,0.920,0.950,1.000,1.000,1.000,1.000/)
474      ecoll(:,16)= (/0.037,0.037,0.037,0.052,0.067,0.250,0.510,0.770,0.880,0.930,0.970,1.000,1.000,1.000,1.000/)
475      ecoll(:,17)= (/0.037,0.037,0.037,0.047,0.057,0.250,0.490,0.770,0.890,0.950,1.000,1.000,1.000,1.000,1.000/)
476      ecoll(:,18)= (/0.036,0.036,0.036,0.042,0.048,0.230,0.470,0.780,0.920,1.000,1.020,1.020,1.020,1.020,1.020/)
477      ecoll(:,19)= (/0.040,0.040,0.035,0.033,0.040,0.112,0.450,0.790,1.010,1.030,1.040,1.040,1.040,1.040,1.040/)
478      ecoll(:,20)= (/0.033,0.033,0.033,0.033,0.033,0.119,0.470,0.950,1.300,1.700,2.300,2.300,2.300,2.300,2.300/)
479      ecoll(:,21)= (/0.027,0.027,0.027,0.027,0.027,0.125,0.520,1.400,2.300,3.000,4.000,4.000,4.000,4.000,4.000/)
480
481! two-dimensional linear interpolation of the collision efficiency
482! radius has to be in µm
483
484      DO j = pstart, pend
485         DO i = pstart, j
486
487            DO k = 2, 15
488               IF ((particles(j)%radius*1.0E06).le.r0(k).and.(particles(j)%radius*1.0E06).ge.r0(k-1)) THEN
489                  ir = k
490               ELSEIF ((particles(j)%radius*1.0E06).gt.r0(15)) THEN
491                  ir = 16
492               ELSEIF ((particles(j)%radius*1.0E06).lt.r0(1)) THEN
493                  ir = 1
494               ENDIF
495            ENDDO
496
497            rq = particles(i)%radius*1.0E06/(particles(j)%radius*1.0E06)
498
499            DO kk = 2, 21
500               IF (rq.le.rat(kk).and.rq.gt.rat(kk-1)) iq = kk
501            ENDDO
502
503            IF (ir.lt.16) THEN
504               IF (ir.ge.2) THEN
505                  pp =((particles(j)%radius * 1.0E06) - r0(ir-1)) / (r0(ir)-r0(ir-1))
506                  qq =(rq-rat(iq-1))/(rat(iq)-rat(iq-1))
507                  ec(j,i) = (1.-pp) * (1.-qq) * ecoll(ir-1,iq-1) +  &
508                          pp * (1.-qq) * ecoll(ir,iq-1) +         &
509                          qq * (1.-pp) * ecoll(ir-1,iq) +         &
510                          pp * qq * ecoll(ir,iq)
511               ELSE
512                  qq = (rq-rat(iq-1))/(rat(iq)-rat(iq-1))
513                  ec(j,i) = (1.-qq) * ecoll(1,iq-1) + qq * ecoll(1,iq)
514               ENDIF
515            ELSE
516               qq = (rq - rat(iq-1))/(rat(iq)-rat(iq-1))
517               ek = (1.-qq)* ecoll(15,iq-1) + qq * ecoll(15,iq)
518               ec(j,i) = min(ek,1.0)
519            ENDIF
520            ec(i,j) = ec(j,i)
521            IF (ec(i,j).lt.1.e-20) stop 99
522         ENDDO
523      ENDDO
524      RETURN
525   END SUBROUTINE effic
526
527!------------------------------------------------------------------------------!
528! SUBROUTINE for calculation of enhancement factor collision efficencies
529!------------------------------------------------------------------------------!
530
531   SUBROUTINE turb_enhance_eff
532
533       USE constants
534       USE cloud_parameters
535       USE particle_attributes
536       USE arrays_3d
537
538!collision efficiencies of hall kernel
539      IMPLICIT NONE
540
541      INTEGER :: i, ik, ir, iq, j, k, kk
542      REAL    :: rq, y1, pp, qq, y2, y3, x1, x2, x3
543
544      REAL, DIMENSION(1:11) :: rat
545      REAL, DIMENSION(1:7)  :: r0
546      REAL, DIMENSION(1:7,1:11) :: ecoll_100, ecoll_400
547
548      r0  = (/10., 20., 30.,40., 50., 60.,100./)
549      rat = (/0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0/)
550
551! 100 cm^2/s^3
552      ecoll_100(:,1) = (/1.74,  1.74,  1.773, 1.49,  1.207,  1.207,  1.0 /)
553      ecoll_100(:,2) = (/1.46,  1.46,  1.421, 1.245, 1.069,  1.069,  1.0 /)
554      ecoll_100(:,3) = (/1.32,  1.32,  1.245, 1.123, 1.000,  1.000,  1.0 /)
555      ecoll_100(:,4) = (/1.250, 1.250, 1.148, 1.087, 1.025,  1.025,  1.0 /)
556      ecoll_100(:,5) = (/1.186, 1.186, 1.066, 1.060, 1.056,  1.056,  1.0 /)
557      ecoll_100(:,6) = (/1.045, 1.045, 1.000, 1.014, 1.028,  1.028,  1.0 /)
558      ecoll_100(:,7) = (/1.070, 1.070, 1.030, 1.038, 1.046,  1.046,  1.0 /)
559      ecoll_100(:,8) = (/1.000, 1.000, 1.054, 1.042, 1.029,  1.029,  1.0 /)
560      ecoll_100(:,9) = (/1.223, 1.223, 1.117, 1.069, 1.021,  1.021,  1.0 /)
561      ecoll_100(:,10)= (/1.570, 1.570, 1.244, 1.166, 1.088,  1.088,  1.0 /)
562      ecoll_100(:,11)= (/20.3,  20.3,  14.6 , 8.61,  2.60,   2.60 ,  1.0 /)
563
564! 400 cm^2/s^3
565      ecoll_400(:,1) = (/4.976, 4.976,  3.593, 2.519, 1.445,  1.445,  1.0 /)
566      ecoll_400(:,2) = (/2.984, 2.984,  2.181, 1.691, 1.201,  1.201,  1.0 /)
567      ecoll_400(:,3) = (/1.988, 1.988,  1.475, 1.313, 1.150,  1.150,  1.0 /)
568      ecoll_400(:,4) = (/1.490, 1.490,  1.187, 1.156, 1.126,  1.126,  1.0 /)
569      ecoll_400(:,5) = (/1.249, 1.249,  1.088, 1.090, 1.092,  1.092,  1.0 /)
570      ecoll_400(:,6) = (/1.139, 1.139,  1.130, 1.091, 1.051,  1.051,  1.0 /)
571      ecoll_400(:,7) = (/1.220, 1.220,  1.190, 1.138, 1.086,  1.086,  1.0 /)
572      ecoll_400(:,8) = (/1.325, 1.325,  1.267, 1.165, 1.063,  1.063,  1.0 /)
573      ecoll_400(:,9) = (/1.716, 1.716,  1.345, 1.223, 1.100,  1.100,  1.0 /)
574      ecoll_400(:,10)= (/3.788, 3.788,  1.501, 1.311, 1.120,  1.120,  1.0 /)
575      ecoll_400(:,11)= (/36.52, 36.52,  19.16, 22.80,  26.0,   26.0,  1.0 /)
576
577! two-dimensional linear interpolation of the collision efficiency
578      DO j =  pstart, pend
579         DO i = pstart, j
580
581            DO k = 2, 7
582               IF ((particles(j)%radius*1.0E06).le.r0(k).and.(particles(j)%radius*1.0E06).ge.r0(k-1)) THEN
583                  ir = k
584               ELSEIF ((particles(j)%radius*1.0E06).gt.r0(7)) THEN
585                  ir = 8
586               ELSEIF ((particles(j)%radius*1.0E06).lt.r0(1)) THEN
587                  ir = 1
588               ENDIF
589            ENDDO
590
591            rq = particles(i)%radius*1.0E06/(particles(j)%radius*1.0E06)
592
593            DO kk = 2, 11
594               IF (rq.le.rat(kk).and.rq.gt.rat(kk-1)) iq = kk
595            ENDDO
596
597! 0  cm2/s3
598            y1 = 1.0
599! 100 cm2/s3, 400 cm2/s3
600            IF (ir.lt.8) THEN
601               IF (ir.ge.2) THEN
602                  pp = ((particles(j)%radius*1.0E06)-r0(ir-1))/(r0(ir)-r0(ir-1))
603                  qq = (rq-rat(iq-1))/(rat(iq)-rat(iq-1))
604                  y2= (1.-pp)*(1.-qq)*ecoll_100(ir-1,iq-1)+  &
605                            pp*(1.-qq)*ecoll_100(ir,iq-1)+    &
606                            qq*(1.-pp)*ecoll_100(ir-1,iq)+    &
607                            pp*qq*ecoll_100(ir,iq)
608                  y3= (1.-pp)*(1.-qq)*ecoll_400(ir-1,iq-1)+  &
609                            pp*(1.-qq)*ecoll_400(ir,iq-1)+    &
610                            qq*(1.-pp)*ecoll_400(ir-1,iq)+    &
611                            pp*qq*ecoll_400(ir,iq)
612               ELSE
613                  qq = (rq-rat(iq-1))/(rat(iq)-rat(iq-1))
614                  y2= (1.-qq)*ecoll_100(1,iq-1)+qq*ecoll_100(1,iq)
615                  y3= (1.-qq)*ecoll_400(1,iq-1)+qq*ecoll_400(1,iq)
616               ENDIF
617            ELSE
618            qq = (rq-rat(iq-1))/(rat(iq)-rat(iq-1))
619            y2 = (1.-qq) * ecoll_100(7,iq-1) + qq * ecoll_100(7,iq)
620            y3 = (1.-qq) * ecoll_400(7,iq-1) + qq * ecoll_400(7,iq)
621         ENDIF
622! linear interpolation
623! dissipation rate in cm2/s3
624         x1 = 0.0
625         x2 = 100.0
626         x3 = 400.0
627
628         IF (epsilon.le.100.) THEN
629            ecf(j,i) = (epsilon-100.)/(0.-100.) * y1 &
630                    +  (epsilon-0.)/(100.-0.) * y2
631         ELSE IF(epsilon.le.600.)THEN
632            ecf(j,i) = (epsilon-400.)/(100.-400.) * y2 &
633                    +  (epsilon-100.)/(400.-100.) * y3
634
635         ELSE
636            ecf(j,i) = (600.-400.)/(100.-400.) * y2 &
637                    +  (600.-100.)/(400.-100.) * y3
638         ENDIF
639
640         IF (ecf(j,i).lt.1.0) ecf(j,i) = 1.0
641
642         ecf(i,j)=ecf(j,i)
643      ENDDO
644   ENDDO
645
646   RETURN
647   END SUBROUTINE turb_enhance_eff
648
649 END MODULE wang_kernel_mod
Note: See TracBrowser for help on using the repository browser.