source: palm/trunk/SOURCE/lpm_droplet_condensation.f90 @ 1346

Last change on this file since 1346 was 1346, checked in by heinze, 10 years ago

Bugfix: REAL constants provided with KIND-attribute especially in call of intrinsic function like MAX, MIN, SIGN

  • Property svn:keywords set to Id
File size: 21.8 KB
Line 
1 SUBROUTINE lpm_droplet_condensation
2
3!--------------------------------------------------------------------------------!
4! This file is part of PALM.
5!
6! PALM is free software: you can redistribute it and/or modify it under the terms
7! of the GNU General Public License as published by the Free Software Foundation,
8! either version 3 of the License, or (at your option) any later version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2014 Leibniz Universitaet Hannover
18!--------------------------------------------------------------------------------!
19!
20! Current revisions:
21! ------------------
22! Bugfix: REAL constants provided with KIND-attribute especially in call of
23! intrinsic function like MAX, MIN, SIGN
24!
25! Former revisions:
26! -----------------
27! $Id: lpm_droplet_condensation.f90 1346 2014-03-27 13:18:20Z heinze $
28!
29! 1322 2014-03-20 16:38:49Z raasch
30! REAL constants defined as wp-kind
31!
32! 1320 2014-03-20 08:40:49Z raasch
33! ONLY-attribute added to USE-statements,
34! kind-parameters added to all INTEGER and REAL declaration statements,
35! kinds are defined in new module kinds,
36! comment fields (!:) to be used for variable explanations added to
37! all variable declaration statements
38!
39! 1318 2014-03-17 13:35:16Z raasch
40! module interfaces removed
41!
42! 1092 2013-02-02 11:24:22Z raasch
43! unused variables removed
44!
45! 1071 2012-11-29 16:54:55Z franke
46! Ventilation effect for evaporation of large droplets included
47! Check for unreasonable results included in calculation of Rosenbrock method
48! since physically unlikely results were observed and for the same
49! reason the first internal time step in Rosenbrock method should be < 1.0E02 in
50! case of evaporation
51! Unnecessary calculation of ql_int removed
52! Unnecessary calculations in Rosenbrock method (d2rdt2, drdt_m, dt_ros_last)
53! removed
54! Bugfix: factor in calculation of surface tension changed from 0.00155 to
55! 0.000155
56!
57! 1036 2012-10-22 13:43:42Z raasch
58! code put under GPL (PALM 3.9)
59!
60! 849 2012-03-15 10:35:09Z raasch
61! initial revision (former part of advec_particles)
62!
63!
64! Description:
65! ------------
66! Calculates change in droplet radius by condensation/evaporation, using
67! either an analytic formula or by numerically integrating the radius growth
68! equation including curvature and solution effects using Rosenbrocks method
69! (see Numerical recipes in FORTRAN, 2nd edition, p. 731).
70! The analytical formula and growth equation follow those given in
71! Rogers and Yau (A short course in cloud physics, 3rd edition, p. 102/103).
72!------------------------------------------------------------------------------!
73
74    USE arrays_3d,                                                             &
75        ONLY:  hyp, pt, q,  ql_c, ql_v, zu
76
77    USE cloud_parameters,                                                      &
78        ONLY:  bfactor, curvature_solution_effects, diff_coeff_l,              &
79               eps_ros, l_d_rv, l_v, rho_l,  r_v, thermal_conductivity_l
80
81    USE constants,                                                             &
82        ONLY:  pi
83
84    USE control_parameters,                                                    &
85        ONLY:  atmos_ocean_sign, dt_3d, dz, message_string,                    &
86               molecular_viscosity, rho_surface
87    USE cpulog,                                                                &
88        ONLY:  cpu_log, log_point_s
89
90    USE grid_variables,                                                        &
91        ONLY:  dx, ddx, dy, ddy
92
93    USE lpm_collision_kernels_mod,                                             &
94        ONLY:  rclass_lbound, rclass_ubound
95
96    USE kinds
97
98    USE particle_attributes,                                                   &
99        ONLY:  hall_kernel, number_of_particles, offset_ocean_nzt,             &
100               offset_ocean_nzt_m1, particles, radius_classes,                 &
101               use_kernel_tables, wang_kernel
102
103
104    IMPLICIT NONE
105
106    INTEGER(iwp) :: i                          !:
107    INTEGER(iwp) :: internal_timestep_count    !:
108    INTEGER(iwp) :: j                          !:
109    INTEGER(iwp) :: jtry                       !:
110    INTEGER(iwp) :: k                          !:
111    INTEGER(iwp) :: n                          !:
112    INTEGER(iwp) :: ros_count                  !:
113 
114    INTEGER(iwp), PARAMETER ::  maxtry = 40    !:
115
116    LOGICAL ::  repeat                         !:
117
118    REAL(wp) ::  aa                            !:
119    REAL(wp) ::  afactor                       !:
120    REAL(wp) ::  arg                           !:
121    REAL(wp) ::  bb                            !:
122    REAL(wp) ::  cc                            !:
123    REAL(wp) ::  dd                            !:
124    REAL(wp) ::  ddenom                        !:
125    REAL(wp) ::  delta_r                       !:
126    REAL(wp) ::  drdt                          !:
127    REAL(wp) ::  drdt_ini                      !:
128    REAL(wp) ::  dt_ros                        !:
129    REAL(wp) ::  dt_ros_next                   !:
130    REAL(wp) ::  dt_ros_sum                    !:
131    REAL(wp) ::  dt_ros_sum_ini                !:
132    REAL(wp) ::  d2rdtdr                       !:
133    REAL(wp) ::  errmax                        !:
134    REAL(wp) ::  err_ros                       !:
135    REAL(wp) ::  g1                            !:
136    REAL(wp) ::  g2                            !:
137    REAL(wp) ::  g3                            !:
138    REAL(wp) ::  g4                            !:
139    REAL(wp) ::  e_a                           !:
140    REAL(wp) ::  e_s                           !:
141    REAL(wp) ::  gg                            !:
142    REAL(wp) ::  new_r                         !:
143    REAL(wp) ::  p_int                         !:
144    REAL(wp) ::  pt_int                        !:
145    REAL(wp) ::  pt_int_l                      !:
146    REAL(wp) ::  pt_int_u                      !:
147    REAL(wp) ::  q_int                         !:
148    REAL(wp) ::  q_int_l                       !:
149    REAL(wp) ::  q_int_u                       !:
150    REAL(wp) ::  r_ros                         !:
151    REAL(wp) ::  r_ros_ini                     !:
152    REAL(wp) ::  sigma                         !:
153    REAL(wp) ::  t_int                         !:
154    REAL(wp) ::  x                             !:
155    REAL(wp) ::  y                             !:
156    REAL(wp) ::  re_p                          !:
157 
158!-- Parameters for Rosenbrock method
159    REAL(wp), PARAMETER ::  a21 = 2.0             !:
160    REAL(wp), PARAMETER ::  a31 = 48.0/25.0_wp    !:
161    REAL(wp), PARAMETER ::  a32 = 6.0/25.0_wp     !:
162    REAL(wp), PARAMETER ::  b1 = 19.0/9.0_wp      !:
163    REAL(wp), PARAMETER ::  b2 = 0.5              !:
164    REAL(wp), PARAMETER ::  b3 = 25.0/108.0_wp    !:
165    REAL(wp), PARAMETER ::  b4 = 125.0/108.0_wp   !:
166    REAL(wp), PARAMETER ::  c21 = -8.0            !:
167    REAL(wp), PARAMETER ::  c31 = 372.0/25.0_wp   !:
168    REAL(wp), PARAMETER ::  c32 = 12.0/5.0_wp     !:
169    REAL(wp), PARAMETER ::  c41 = -112.0/125.0_wp !:
170    REAL(wp), PARAMETER ::  c42 = -54.0/125.0_wp  !:
171    REAL(wp), PARAMETER ::  c43 = -2.0/5.0_wp     !:
172    REAL(wp), PARAMETER ::  errcon = 0.1296       !:
173    REAL(wp), PARAMETER ::  e1 = 17.0/54.0_wp     !:
174    REAL(wp), PARAMETER ::  e2 = 7.0/36.0_wp      !:
175    REAL(wp), PARAMETER ::  e3 = 0.0              !:
176    REAL(wp), PARAMETER ::  e4 = 125.0/108.0_wp   !:
177    REAL(wp), PARAMETER ::  gam = 0.5             !:
178    REAL(wp), PARAMETER ::  grow = 1.5            !:
179    REAL(wp), PARAMETER ::  pgrow = -0.25         !:
180    REAL(wp), PARAMETER ::  pshrnk = -1.0/3.0_wp  !:
181    REAL(wp), PARAMETER ::  shrnk = 0.5           !:
182
183
184
185    CALL cpu_log( log_point_s(42), 'lpm_droplet_condens', 'start' )
186
187    DO  n = 1, number_of_particles
188!
189!--    Interpolate temperature and humidity.
190!--    First determine left, south, and bottom index of the arrays.
191       i = particles(n)%x * ddx
192       j = particles(n)%y * ddy
193       k = ( particles(n)%z + 0.5 * dz * atmos_ocean_sign ) / dz  &
194           + offset_ocean_nzt                     ! only exact if equidistant
195
196       x  = particles(n)%x - i * dx
197       y  = particles(n)%y - j * dy
198       aa = x**2          + y**2
199       bb = ( dx - x )**2 + y**2
200       cc = x**2          + ( dy - y )**2
201       dd = ( dx - x )**2 + ( dy - y )**2
202       gg = aa + bb + cc + dd
203
204       pt_int_l = ( ( gg - aa ) * pt(k,j,i)   + ( gg - bb ) * pt(k,j,i+1)   &
205                  + ( gg - cc ) * pt(k,j+1,i) + ( gg - dd ) * pt(k,j+1,i+1) &
206                  ) / ( 3.0 * gg )
207
208       pt_int_u = ( ( gg-aa ) * pt(k+1,j,i)   + ( gg-bb ) * pt(k+1,j,i+1)   &
209                  + ( gg-cc ) * pt(k+1,j+1,i) + ( gg-dd ) * pt(k+1,j+1,i+1) &
210                  ) / ( 3.0 * gg )
211
212       pt_int = pt_int_l + ( particles(n)%z - zu(k) ) / dz * &
213                           ( pt_int_u - pt_int_l )
214
215       q_int_l = ( ( gg - aa ) * q(k,j,i)   + ( gg - bb ) * q(k,j,i+1)   &
216                 + ( gg - cc ) * q(k,j+1,i) + ( gg - dd ) * q(k,j+1,i+1) &
217                 ) / ( 3.0 * gg )
218
219       q_int_u = ( ( gg-aa ) * q(k+1,j,i)   + ( gg-bb ) * q(k+1,j,i+1)   &
220                 + ( gg-cc ) * q(k+1,j+1,i) + ( gg-dd ) * q(k+1,j+1,i+1) &
221                 ) / ( 3.0 * gg )
222
223       q_int = q_int_l + ( particles(n)%z - zu(k) ) / dz * &
224                           ( q_int_u - q_int_l )
225
226!
227!--    Calculate real temperature and saturation vapor pressure
228       p_int = hyp(k) + ( particles(n)%z - zu(k) ) / dz * ( hyp(k+1)-hyp(k) )
229       t_int = pt_int * ( p_int / 100000.0 )**0.286
230
231       e_s = 611.0 * EXP( l_d_rv * ( 3.6609E-3 - 1.0 / t_int ) )
232
233!
234!--    Current vapor pressure
235       e_a = q_int * p_int / ( 0.378 * q_int + 0.622 )
236
237!
238!--    Thermal conductivity for water (from Rogers and Yau, Table 7.1),
239!--    diffusivity for water vapor (after Hall und Pruppacher, 1976)
240       thermal_conductivity_l = 7.94048E-05 * t_int + 0.00227011 
241       diff_coeff_l           = 0.211E-4 * ( t_int / 273.15 )**1.94 * &
242                                ( 101325.0 / p_int)
243!
244!--    Change in radius by condensation/evaporation
245       IF ( particles(n)%radius >= 4.0E-5  .AND.  e_a/e_s < 1.0 )  THEN
246!
247!--       Approximation for large radii, where curvature and solution effects
248!--       can be neglected but ventilation effect has to be included in case of
249!--       evaporation.
250!--       First calculate the droplet's Reynolds number
251          re_p = 2.0 * particles(n)%radius * ABS( particles(n)%speed_z ) / &
252                 molecular_viscosity
253!
254!--       Ventilation coefficient after Rogers and Yau, 1989
255          IF ( re_p > 2.5 )  THEN
256             afactor = 0.78 + 0.28 * SQRT( re_p )
257          ELSE
258             afactor = 1.0 + 0.09 * re_p
259          ENDIF
260
261          arg = particles(n)%radius**2 + 2.0 * dt_3d * afactor *              &
262                           ( e_a / e_s - 1.0 ) /                              &
263                           ( ( l_d_rv / t_int - 1.0 ) * l_v * rho_l / t_int / &
264                             thermal_conductivity_l +                         &
265                             rho_l * r_v * t_int / diff_coeff_l / e_s )
266
267          new_r = SQRT( arg )
268
269       ELSEIF ( particles(n)%radius >= 1.0E-6  .OR.  &
270                .NOT. curvature_solution_effects )  THEN
271!
272!--       Approximation for larger radii in case that curvature and solution
273!--       effects are neglected and ventilation effects does not play a role
274          arg = particles(n)%radius**2 + 2.0 * dt_3d *                        &
275                           ( e_a / e_s - 1.0 ) /                              &
276                           ( ( l_d_rv / t_int - 1.0 ) * l_v * rho_l / t_int / &
277                             thermal_conductivity_l +                         &
278                             rho_l * r_v * t_int / diff_coeff_l / e_s )
279          IF ( arg < 1.0E-16 )  THEN
280             new_r = 1.0E-8
281          ELSE
282             new_r = SQRT( arg )
283          ENDIF
284       ENDIF
285
286       IF ( curvature_solution_effects  .AND.                              &
287            ( ( particles(n)%radius < 1.0E-6 ) .OR. ( new_r < 1.0E-6 ) ) ) &
288       THEN
289!
290!--       Curvature and solutions effects are included in growth equation.
291!--       Change in Radius is calculated with 4th-order Rosenbrock method
292!--       for stiff o.d.e's with monitoring local truncation error to adjust
293!--       stepsize (see Numerical recipes in FORTRAN, 2nd edition, p. 731).
294!--       For larger radii the simple analytic method (see ELSE) gives
295!--       almost the same results.
296
297          ros_count = 0
298          repeat = .TRUE.
299!
300!--       Carry out the Rosenbrock algorithm. In case of unreasonable results
301!--       the switch "repeat" will be set true and the algorithm will be carried
302!--       out again with the internal time step set to its initial (small) value.
303!--       Unreasonable results may occur if the external conditions, especially the
304!--       supersaturation, has significantly changed compared to the last PALM
305!--       timestep.
306          DO WHILE ( repeat )
307
308             repeat = .FALSE.
309!
310!--          Surface tension after (Straka, 2009)
311             sigma = 0.0761 - 0.000155 * ( t_int - 273.15 )
312
313             r_ros = particles(n)%radius
314             dt_ros_sum  = 0.0      ! internal integrated time (s)
315             internal_timestep_count = 0
316
317             ddenom  = 1.0 / ( rho_l * r_v * t_int / ( e_s * diff_coeff_l ) +  &
318                               ( l_v / ( r_v * t_int ) - 1.0 ) *               &
319                               rho_l * l_v / ( thermal_conductivity_l * t_int )&
320                             )
321
322             afactor = 2.0 * sigma / ( rho_l * r_v * t_int )
323
324!
325!--          Take internal time step values from the end of last PALM time step
326             dt_ros_next = particles(n)%rvar1
327
328!
329!--          Internal time step should not be > 1.0E-2 in case of evaporation
330!--          because larger values may lead to secondary solutions which are
331!--          physically unlikely
332             IF ( dt_ros_next > 1.0E-2  .AND.  e_a/e_s < 1.0 )  THEN
333                dt_ros_next = 1.0E-3
334             ENDIF
335!
336!--          If calculation of Rosenbrock method is repeated due to unreasonalble
337!--          results during previous try the initial internal time step has to be
338!--          reduced
339             IF ( ros_count > 1 )  THEN
340                dt_ros_next = dt_ros_next - ( 0.2 * dt_ros_next )
341             ELSEIF ( ros_count > 5 )  THEN
342!
343!--             Prevent creation of infinite loop
344                message_string = 'ros_count > 5 in Rosenbrock method'
345                CALL message( 'lpm_droplet_condensation', 'PA0018', 2, 2, &
346                               0, 6, 0 )
347             ENDIF
348
349!
350!--          Internal time step must not be larger than PALM time step
351             dt_ros = MIN( dt_ros_next, dt_3d )
352!
353!--          Integrate growth equation in time unless PALM time step is reached
354             DO WHILE ( dt_ros_sum < dt_3d )
355
356                internal_timestep_count = internal_timestep_count + 1
357
358!
359!--             Derivative at starting value
360                drdt = ddenom / r_ros * ( e_a / e_s - 1.0 - afactor / r_ros + &
361                                          bfactor / r_ros**3 )
362                drdt_ini       = drdt
363                dt_ros_sum_ini = dt_ros_sum
364                r_ros_ini      = r_ros
365
366!
367!--             Calculate radial derivative of dr/dt
368                d2rdtdr = ddenom * ( ( 1.0 - e_a/e_s ) / r_ros**2 + &
369                                     2.0 * afactor / r_ros**3 -     &
370                                     4.0 * bfactor / r_ros**5 )
371!
372!--             Adjust stepsize unless required accuracy is reached
373                DO  jtry = 1, maxtry+1
374
375                   IF ( jtry == maxtry+1 )  THEN
376                      message_string = 'maxtry > 40 in Rosenbrock method'
377                      CALL message( 'lpm_droplet_condensation', 'PA0347', 2, 2, &
378                                    0, 6, 0 )
379                   ENDIF
380
381                   aa    = 1.0 / ( gam * dt_ros ) - d2rdtdr
382                   g1    = drdt_ini / aa
383                   r_ros = r_ros_ini + a21 * g1
384                   drdt  = ddenom / r_ros * ( e_a / e_s - 1.0 - &
385                                              afactor / r_ros + &
386                                              bfactor / r_ros**3 )
387
388                   g2    = ( drdt + c21 * g1 / dt_ros )&
389                           / aa
390                   r_ros = r_ros_ini + a31 * g1 + a32 * g2
391                   drdt  = ddenom / r_ros * ( e_a / e_s - 1.0 - &
392                                              afactor / r_ros + &
393                                              bfactor / r_ros**3 )
394
395                   g3    = ( drdt +  &
396                             ( c31 * g1 + c32 * g2 ) / dt_ros ) / aa
397                   g4    = ( drdt +  &
398                             ( c41 * g1 + c42 * g2 + c43 * g3 ) / dt_ros ) / aa
399                   r_ros = r_ros_ini + b1 * g1 + b2 * g2 + b3 * g3 + b4 * g4
400
401                   dt_ros_sum = dt_ros_sum_ini + dt_ros
402
403                   IF ( dt_ros_sum == dt_ros_sum_ini )  THEN
404                      message_string = 'zero stepsize in Rosenbrock method'
405                      CALL message( 'lpm_droplet_condensation', 'PA0348', 2, 2, &
406                                    0, 6, 0 )
407                   ENDIF
408!
409!--                Calculate error
410                   err_ros = e1*g1 + e2*g2 + e3*g3 + e4*g4
411                   errmax  = 0.0
412                   errmax  = MAX( errmax, ABS( err_ros / r_ros_ini ) ) / eps_ros
413!
414!--                Leave loop if accuracy is sufficient, otherwise try again
415!--                with a reduced stepsize
416                   IF ( errmax <= 1.0 )  THEN
417                      EXIT
418                   ELSE
419                      dt_ros = SIGN( MAX( ABS( 0.9 * dt_ros * errmax**pshrnk ), &
420                                          shrnk * ABS( dt_ros ) ), dt_ros )
421                   ENDIF
422
423                ENDDO  ! loop for stepsize adjustment
424
425!
426!--             Calculate next internal time step
427                IF ( errmax > errcon )  THEN
428                   dt_ros_next = 0.9 * dt_ros * errmax**pgrow
429                ELSE
430                   dt_ros_next = grow * dt_ros
431                ENDIF
432
433!
434!--             Estimated time step is reduced if the PALM time step is exceeded
435                IF ( ( dt_ros_next + dt_ros_sum ) >= dt_3d )  THEN
436                   dt_ros = dt_3d - dt_ros_sum
437                ELSE
438                   dt_ros = dt_ros_next
439                ENDIF
440
441             ENDDO
442!
443!--          Store internal time step value for next PALM step
444             particles(n)%rvar1 = dt_ros_next
445
446             new_r = r_ros
447!
448!--          Radius should not fall below 1E-8 because Rosenbrock method may
449!--          lead to errors otherwise
450             new_r = MAX( new_r, 1.0E-8_wp )
451!
452!--          Check if calculated droplet radius change is reasonable since in
453!--          case of droplet evaporation the Rosenbrock method may lead to
454!--          secondary solutions which are physically unlikely.
455!--          Due to the solution effect the droplets may grow for relative
456!--          humidities below 100%, but change of radius should not be too large.
457!--          In case of unreasonable droplet growth the Rosenbrock method is
458!--          recalculated using a smaller initial time step.
459!--          Limiting values are tested for droplets down to 1.0E-7
460             IF ( new_r - particles(n)%radius >= 3.0E-7  .AND.  &
461                  e_a/e_s < 0.97 )  THEN
462                ros_count = ros_count + 1
463                repeat = .TRUE.
464             ENDIF
465
466          ENDDO    ! Rosenbrock method
467
468       ENDIF
469
470       delta_r = new_r - particles(n)%radius
471
472!
473!--    Sum up the change in volume of liquid water for the respective grid
474!--    volume (this is needed later in lpm_calc_liquid_water_content for
475!--    calculating the release of latent heat)
476       i = ( particles(n)%x + 0.5 * dx ) * ddx
477       j = ( particles(n)%y + 0.5 * dy ) * ddy
478       k = particles(n)%z / dz + 1 + offset_ocean_nzt_m1
479           ! only exact if equidistant
480
481       ql_c(k,j,i) = ql_c(k,j,i) + particles(n)%weight_factor *            &
482                                   rho_l * 1.33333333 * pi *               &
483                                   ( new_r**3 - particles(n)%radius**3 ) / &
484                                   ( rho_surface * dx * dy * dz )
485       IF ( ql_c(k,j,i) > 100.0 )  THEN
486          WRITE( message_string, * ) 'k=',k,' j=',j,' i=',i,      &
487                       ' ql_c=',ql_c(k,j,i), ' &part(',n,')%wf=', &
488                       particles(n)%weight_factor,' delta_r=',delta_r
489          CALL message( 'lpm_droplet_condensation', 'PA0143', 2, 2, -1, 6, 1 )
490       ENDIF
491
492!
493!--    Change the droplet radius
494       IF ( ( new_r - particles(n)%radius ) < 0.0  .AND.  new_r < 0.0 ) &
495       THEN
496          WRITE( message_string, * ) '#1 k=',k,' j=',j,' i=',i,   &
497                       ' e_s=',e_s, ' e_a=',e_a,' t_int=',t_int,  &
498                       ' &delta_r=',delta_r,                      &
499                       ' particle_radius=',particles(n)%radius
500          CALL message( 'lpm_droplet_condensation', 'PA0144', 2, 2, -1, 6, 1 )
501       ENDIF
502
503!
504!--    Sum up the total volume of liquid water (needed below for
505!--    re-calculating the weighting factors)
506       ql_v(k,j,i) = ql_v(k,j,i) + particles(n)%weight_factor * new_r**3
507
508       particles(n)%radius = new_r
509
510!
511!--    Determine radius class of the particle needed for collision
512       IF ( ( hall_kernel  .OR.  wang_kernel )  .AND.  use_kernel_tables ) &
513       THEN
514          particles(n)%class = ( LOG( new_r ) - rclass_lbound ) /  &
515                               ( rclass_ubound - rclass_lbound ) * &
516                               radius_classes
517          particles(n)%class = MIN( particles(n)%class, radius_classes )
518          particles(n)%class = MAX( particles(n)%class, 1 )
519       ENDIF
520
521    ENDDO
522
523    CALL cpu_log( log_point_s(42), 'lpm_droplet_condens', 'stop' )
524
525
526 END SUBROUTINE lpm_droplet_condensation
Note: See TracBrowser for help on using the repository browser.