20 REAL*8,
ALLOCATABLE,
DIMENSION(:) :: solid_partial_mass_fraction
23 REAL*8,
ALLOCATABLE,
DIMENSION(:) :: solid_partial_volume_fraction
26 REAL*8,
ALLOCATABLE,
DIMENSION(:) :: solid_mass_fraction
29 REAL*8,
ALLOCATABLE,
DIMENSION(:) :: solid_volume_fraction
32 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: mom
35 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: set_mom
38 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: rhop_mom
41 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: set_rhop_mom
44 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: cp_rhop_mom
47 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: set_cp_rhop_mom
50 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: set_cp_mom
53 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: birth_term
56 REAL*8,
ALLOCATABLE,
DIMENSION(:,:) :: death_term
59 REAL*8 :: shape_factor
62 REAL*8,
ALLOCATABLE :: diam1(:)
65 REAL*8,
ALLOCATABLE :: rho1(:)
68 REAL*8,
ALLOCATABLE :: diam2(:)
71 REAL*8,
ALLOCATABLE :: rho2(:)
73 REAL*8,
ALLOCATABLE :: cp_part(:)
76 REAL*8,
DIMENSION(1:50,0:100) :: mom0
82 CHARACTER*10 :: settling_model
89 CHARACTER(LEN=20) :: distribution
91 CHARACTER(LEN=20) :: distribution_variable
96 LOGICAL :: aggregation
117 ALLOCATE ( solid_partial_mass_fraction(1:n_part) )
118 ALLOCATE ( solid_partial_volume_fraction(1:n_part) )
119 ALLOCATE ( solid_mass_fraction(1:n_part) )
120 ALLOCATE ( solid_volume_fraction(1:n_part) )
123 ALLOCATE ( mom(1:n_part,0:n_mom-1) )
124 ALLOCATE ( set_mom(1:n_part,0:n_mom-1) )
125 ALLOCATE ( rhop_mom(1:n_part,0:n_mom-1) )
126 ALLOCATE ( set_rhop_mom(1:n_part,0:n_mom-1) )
127 ALLOCATE ( set_cp_rhop_mom(1:n_part,0:n_mom-1) )
128 ALLOCATE ( set_cp_mom(1:n_part,0:n_mom-1) )
129 ALLOCATE ( cp_rhop_mom(1:n_part,0:n_mom-1) )
130 ALLOCATE ( birth_term(1:n_part,0:n_mom-1) )
131 ALLOCATE ( death_term(1:n_part,0:n_mom-1) )
134 ALLOCATE ( diam1(n_part) )
135 ALLOCATE ( rho1(n_part) )
136 ALLOCATE ( diam2(n_part) )
137 ALLOCATE ( rho2(n_part) )
139 ALLOCATE ( cp_part(n_part) )
161 REAL*8,
DIMENSION(n_part,n_nodes) :: xi
162 REAL*8,
DIMENSION(n_part,n_nodes) :: w
170 mom(i_part,:) = mom0(i_part,0:n_mom-1)
174 IF ( distribution .EQ.
'constant' )
THEN
185 IF ( verbose_level .GE. 1 )
THEN
187 WRITE(*,*)
'part ',i_part
188 WRITE(*,*)
'mom',mom(i_part,:)
189 WRITE(*,*)
'abscissas',xi(i_part,:)
190 WRITE(*,*)
'weights',w(i_part,:)
222 USE variables, ONLY : gi , pi_g , verbose_level
228 INTEGER,
INTENT(IN) :: i_part
229 REAL*8,
INTENT(IN) :: diam_in
235 REAL*8 :: k1 , k2 , k3
242 REAL*8 :: cd_100 , cd_1000
248 REAL*8 :: us_100 , us_1000
254 REAL*8 :: us , us_1 ,us_2
257 REAL*8 :: rey1 , rey2
260 REAL*8 :: c0 , c1 , c2
265 IF ( distribution_variable .EQ.
'mass_fraction' )
THEN
267 diam = 1.d-3 * 2.d0 ** ( - diam_in )
277 IF ( settling_model .EQ.
'textor' )
THEN
281 IF ( diam .LE. 1.d-4 )
THEN
288 ELSEIF ( diam .LE. 1.d-3 )
THEN
301 / rho_atm ) * sqrt( 0.5d0 * diam )
305 ELSEIF ( settling_model .EQ.
'pfeiffer' )
THEN
307 k1 = shape_factor**(-0.828)
308 k2 = 2.d0 * dsqrt( 1.07 - shape_factor )
310 mass = rhop * 4.d0/3.d0 * pi_g * ( 0.5*diam )**3
312 a_cs = pi_g * ( 0.5*diam )**2
314 c0 = -2.d0 * diam * mass * gi
315 c1 = 24.d0 * visc_atm * k1 * a_cs
316 c2 = rho_atm * diam * k2 * a_cs
318 sqrt_delta = sqrt( c1**2 - 4 * c0*c2 )
320 us_1 = ( - c1 + sqrt_delta ) / ( 2 * c2 )
321 us_2 = ( - c1 - sqrt_delta ) / ( 2 * c2 )
324 cd_100 = 24.d0/100.d0 * k1 + k2
325 us_100 = sqrt( 2 * mass * gi / ( cd_100*rho_atm * a_cs ) )
328 us_1000 = sqrt( 2 * mass * gi / ( cd_1000*rho_atm * a_cs ) )
330 rey1 = rho_atm * diam * us_1 / visc_atm
331 rey2 = rho_atm * diam * us_2 / visc_atm
333 IF ( verbose_level .GE. 4 )
THEN
335 WRITE(*,*)
'rho_atm , diam , Us_1 , visc_atm',rho_atm , diam , us_1 , &
337 WRITE(*,*)
'Rey1,Rey2',rey1,rey2
342 IF ( ( rey1 .GT. 0.d0 ) .AND. ( rey1 .LE. 100.d0 ) )
THEN
349 ELSEIF ( ( rey1 .GT. 100.d0 ) .AND. ( rey1 .LE. 1000.d0 ) )
THEN
354 cd_interp = cd_100 + ( rey1 - 100 ) / ( 1000 - 100 ) * &
356 us = sqrt( 2 * mass * gi / ( cd_interp * rho_atm * a_cs ) )
358 ELSEIF ( rey1 .GT. 1000.d0 )
THEN
367 IF ( ( rey2 .GT. 0.d0 ) .AND. ( rey2 .LE. 100.d0 ) )
THEN
371 ELSEIF ( ( rey2 .GT. 100.d0 ) .AND. ( rey2 .LE. 1000.d0 ) )
THEN
373 cd_interp = cd_100 + ( rey2 - 100 ) / ( 1000 - 100 ) * ( cd_1000 - cd_100)
374 us = sqrt( 2 * mass * gi / ( cd_interp * rho_atm * a_cs ) )
376 ELSEIF ( rey2 .GT. 1000.d0 )
THEN
386 WRITE(*,*)
'wrong settling model'
410 INTEGER,
INTENT(IN) :: i_part
411 REAL*8,
INTENT(IN) :: diam_in
414 IF ( distribution_variable .EQ.
'mass_fraction' )
THEN
416 diam = 1.d-3 * 2.d0 ** ( - diam_in )
446 INTEGER,
INTENT(IN) :: i_part
447 REAL*8,
INTENT(IN) :: diam_in
451 REAL*8 :: diam_phi , diam1_phi , diam2_phi
454 IF ( distribution_variable .EQ.
'mass_fraction' )
THEN
456 diam = 1.d-3 * 2.d0 ** ( - diam_in )
464 IF ( diam .LE. diam1(i_part) )
THEN
468 ELSEIF ( diam .LE. diam2(i_part) )
THEN
470 diam_phi = -log(diam*1000)/log(2.d0)
471 diam1_phi = -log(diam1(i_part)*1000)/log(2.d0)
472 diam2_phi = -log(diam2(i_part)*1000)/log(2.d0)
475 ( diam2_phi - diam1_phi ) * ( rho2(i_part) - rho1(i_part) )
506 INTEGER,
INTENT(IN) :: i_part
507 REAL*8,
INTENT(IN) :: diam_i
508 REAL*8,
INTENT(IN) :: diam_j
511 REAL*8 :: diam_im , diam_jm
514 IF ( distribution_variable .EQ.
'mass_fraction' )
THEN
516 diam_im = 1.d-3 * 2.d0 ** ( - diam_i )
517 diam_jm = 1.d-3 * 2.d0 ** ( - diam_j )
526 particles_beta = ( diam_im + diam_jm ) ** 2 / ( diam_im + diam_jm )
552 INTEGER,
INTENT(IN) :: i_part
553 REAL*8,
INTENT(IN) :: diam1
554 REAL*8,
INTENT(IN) :: diam2
588 INTEGER,
INTENT(IN) :: i_part
589 REAL*8,
INTENT(IN) :: diam1
590 REAL*8,
INTENT(IN) :: diam2
605 REAL*8 :: vs_1 , vs_2
617 REAL*8 :: air_kin_viscosity
623 beta_b = 2.d0 / 3.d0 * k_b * tp / visc_atm * ( diam1 + diam2 )**2 / ( diam1*diam2 )
625 gamma_s = dsqrt( 1.3d0 * epsilon * air_kin_viscosity )
629 beta_s = 1.d0 / 6.d0 * gamma_s * ( diam1 + diam2 )**3
635 beta_ds = pi_g / 4.d0 * ( diam1 + diam2 )**2 * abs( vs_2 - vs_1 )
660 INTEGER,
INTENT(IN) :: i_part
661 REAL*8,
INTENT(IN) :: diam1
662 REAL*8,
INTENT(IN) :: diam2
670 REAL*8 :: kin_visc_air
673 REAL*8 :: vs_1 , vs_2
679 IF ( diam1 .GT. diam2 )
THEN
681 re = diam1 * vs_1 / kin_visc_air
683 stokes = 2.d0 * vs_2 * abs( vs_1 - vs_2 ) / diam1 * gi
687 re = diam2 * vs_2 / kin_visc_air
689 stokes = 2.d0 * vs_1 * abs( vs_2 - vs_1 ) / diam2 * gi
695 IF ( stokes > 1.214 )
THEN
697 e_v = ( 1.d0 + ( 0.75 * log( 2.d0 * stokes ) / ( stokes - 1.214 ) ) )** &
733 REAL*8,
INTENT(IN) :: diam1
734 REAL*8,
INTENT(IN) :: diam2
746 REAL*8 :: vs_1 , vs_2
750 IF ( tp .LE. 273 )
THEN
760 IF ( diam1 .GT. diam2 )
THEN
762 stokes = 2.d0 * vs_2 * abs( vs_1 - vs_2 ) / diam1 * gi
766 stokes = 2.d0 * vs_1 * abs( vs_2 - vs_1 ) / diam2 * gi
804 REAL*8,
DIMENSION(n_part,n_nodes),
INTENT(IN) :: xi
805 REAL*8,
DIMENSION(n_part,n_nodes),
INTENT(IN) :: w
807 REAL*8,
DIMENSION(n_part,n_nodes) :: part_dens_array
808 REAL*8,
DIMENSION(n_part,n_nodes) :: part_set_vel_array
809 REAL*8,
DIMENSION(n_part,n_nodes) :: part_cp_array
810 REAL*8,
DIMENSION(n_part,n_nodes,n_nodes) :: part_beta_array
812 INTEGER :: i , j , j1 , j2
828 IF ( aggregation)
THEN
833 xi(i_part,j) , xi(i_part,j2) )
841 IF ( verbose_level .GE. 2 )
THEN
843 WRITE(*,*)
'i_part',i_part
844 WRITE(*,*)
'abscissas', xi(i_part,1:n_nodes)
845 WRITE(*,*)
'weights', w(i_part,1:n_nodes)
846 WRITE(*,*)
'part_dens_array',part_dens_array(i_part,:)
847 WRITE(*,*)
'part_set_vel_array',part_set_vel_array(i_part,:)
848 WRITE(*,*)
'part_cp_array',part_cp_array(i_part,:)
859 set_mom(i_part,i) = sum( part_set_vel_array(i_part,:) * w(i_part,:) &
860 * xi(i_part,:)**i ) / mom(i_part,i)
862 rhop_mom(i_part,i) = sum( part_dens_array(i_part,:) * w(i_part,:) &
863 * xi(i_part,:)**i ) / mom(i_part,i)
865 cp_rhop_mom(i_part,i) = sum( part_cp_array(i_part,:) &
866 * part_dens_array(i_part,:) * w(i_part,:) * xi(i_part,:)**i ) &
869 set_rhop_mom(i_part,i) = sum( part_set_vel_array(i_part,:) &
870 * part_dens_array(i_part,:) * w(i_part,:) * xi(i_part,:)**i ) &
873 set_cp_rhop_mom(i_part,i) = sum( part_set_vel_array(i_part,:) &
874 * part_cp_array(i_part,:) * part_dens_array(i_part,:) * &
875 w(i_part,:) * xi(i_part,:)**i ) / mom(i_part,i)
877 set_cp_mom(i_part,i) = sum( part_set_vel_array(i_part,:) &
878 * part_cp_array(i_part,:) * w(i_part,:) * xi(i_part,:)**i ) &
881 IF ( aggregation )
THEN
883 birth_term(i_part,i) = 0.d0
884 death_term(i_part,i) = 0.d0
890 birth_term(i_part,i) = birth_term(i_part,i) + w(i_part,j1) &
891 * w(i_part,j2) * part_beta_array(i_part,j1,j2) &
892 *( xi(i_part,j1)**3 + xi(i_part,j2)**3 ) ** ( i / 3.d0 )
894 death_term(i_part,i) = death_term(i_part,i) - w(i_part,j1) &
895 * xi(i_part,j1) * part_beta_array(i_part,j1,j2) &
896 * w(i_part,j1) * w(i_part,j2)
902 birth_term(i_part,i) = 0.5d0 * birth_term(i_part,i)
real *8 function particles_density(i_part, diam_in)
Particle density.
real *8 function particles_beta(i_part, diam_i, diam_j)
Brownian aggregation.
subroutine zmet
Meteo parameters.
subroutine initialize_particles
Particles variables inizialization.
real *8 function particles_heat_capacity(i_part, diam_in)
Heat capacity.
real *8 function collision_kernel(i_part, diam1, diam2)
Collision kernel.
real *8 function coalescence_efficiency(i_part, diam1, diam2)
Coalescence efficiency.
subroutine moments_correction(m, iter)
Moments correction.
real *8 function aggregation_kernel(i_part, diam1, diam2)
Aggregation kernel.
subroutine allocate_particles
Particles variables inizialization.
real *8 function particles_settling_velocity(i_part, diam_in)
Settling velocity.
Method of Moments module.
real *8 function collision_efficiency(i_part, diam1, diam2)
Collision efficiency.
subroutine eval_particles_moments(xi, w)
Particles moments computation.
subroutine wheeler_algorithm(m, xi, w)
Wheeler algorithm.