*
Calculation of turbulent particle trajectories utilizing a * zero-acceleration scheme, which is corrected by a numerically more * accurate Petterssen scheme whenever possible. * * Particle positions are read in, incremented, and returned to the calling * program. * * In different regions of the atmosphere (PBL vs. free troposphere), * different parameters are needed for advection, parameterizing turbulent * velocities, etc. For efficiency, different interpolation routines have * been written for these different cases, with the disadvantage that there * exist several routines doing almost the same. They all share the * included file 'interpol_mod'. The following * interpolation routines are used: * * interpol_all(_nest) interpolates everything (called inside the PBL) * interpol_misslev(_nest) if a particle moves vertically in the PBL, * additional parameters are interpolated if it * crosses a model level * interpol_wind(_nest) interpolates the wind and determines the * standard deviation of the wind (called outside * PBL) also interpolates potential vorticity * interpol_wind_short(_nest) only interpolates the wind (needed for the * Petterssen scheme) * interpol_vdep(_nest) interpolates deposition velocities * * * Author: A. Stohl * * 16 December 1997 * * Changes: * * 8 April 2000: Deep convection parameterization * * May 2002: Petterssen scheme introduced * * 2021, L. Bakels: * - Separated PBL and above PBL computations in different * subroutines * - Moved all turbulence computations to turbulence_mod.f90 *
*
Variables: * icbt 1 if particle not transferred to forbidden state, * else -1 * dawsave accumulated displacement in along-wind direction * dcwsave accumulated displacement in cross-wind direction * dxsave accumulated displacement in longitude * dysave accumulated displacement in latitude * h [m] Mixing height * lwindinterv [s] time interval between two wind fields * itime [s] time at which this subroutine is entered * itimec [s] actual time, which is incremented in this subroutine * href [m] height for which dry deposition velocity is calculated * ladvance [s] Total integration time period * ldirect 1 forward, -1 backward * ldt [s] Time step for the next integration * lsynctime [s] Synchronisation interval of FLEXPART * ngrid index which grid is to be used * nrand index for a variable to be picked from rannumb * nstop if > 1 particle has left domain and must be stopped * prob probability of absorption due to dry deposition * rannumb(maxrand) normally distributed random variables * rhoa air density * rhograd vertical gradient of the air density * up,vp,wp random velocities due to turbulence (along wind, cross * wind, vertical wind * usig,vsig,wsig mesoscale wind fluctuations * xt,yt,zt Particle position * *
Interpolate necessary data
If particle is in the PBL, interpolate once and then make a time loop until end of interval is reached
In the PBL we use meters instead of eta coordinates for vertical transport
For all particles that are outside the PBL, make a single time step. Only horizontal turbulent disturbances are calculated. Vertical disturbances are reset.
Add mesoscale random disturbances This is done only once for the whole lsynctime interval to save computation time
Transform along and cross wind components to xy coordinates, add them to u and v, transform u,v to grid units/second and calculate new position
Now we could finish, as this was done in FLEXPART versions up to 4.0. However, truncation errors of the advection can be significantly reduced by doing one iteration of the Petterssen scheme, if this is possible. Note that this is applied only to the grid-scale winds, not to the turbulent winds.
ngr = ngrid call find_ngrid(part(ipart)%xlon,part(ipart)%ylat)
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | itime | |||
integer, | intent(in) | :: | ipart | |||
integer, | intent(in) | :: | ithread |