Index: palm/trunk/SOURCE/lagrangian_particle_model_mod.f90
===================================================================
--- palm/trunk/SOURCE/lagrangian_particle_model_mod.f90	(revision 4275)
+++ palm/trunk/SOURCE/lagrangian_particle_model_mod.f90	(revision 4276)
@@ -25,4 +25,7 @@
 ! -----------------
 ! $Id$
+! Modularize lpm: Move conditions in time intergration to module
+! 
+! 4275 2019-10-28 15:34:55Z schwenkel
 ! Change call of simple predictor corrector method, i.e. two divergence free
 ! velocitiy fields are now used.
@@ -122,4 +125,5 @@
                dt_3d, dt_3d_reached, humidity,                                 &
                dt_3d_reached_l, dt_dopts, dz, initializing_actions,            &
+               intermediate_timestep_count, intermediate_timestep_count_max,   &
                message_string, molecular_viscosity, ocean_mode,                &
                particle_maximum_age, iran,                                     & 
@@ -1999,268 +2003,290 @@
 
        CASE ( 'after_pressure_solver' )
-
-          CALL cpu_log( log_point(25), 'lpm', 'start' )
-!
-!--       Write particle data at current time on file.
-!--       This has to be done here, before particles are further processed,
-!--       because they may be deleted within this timestep (in case that
-!--       dt_write_particle_data = dt_prel = particle_maximum_age).
-          time_write_particle_data = time_write_particle_data + dt_3d
-          IF ( time_write_particle_data >= dt_write_particle_data )  THEN
-
-             CALL lpm_data_output_particles
-!
-!--       The MOD function allows for changes in the output interval with restart
-!--       runs.
-             time_write_particle_data = MOD( time_write_particle_data, &
-                                        MAX( dt_write_particle_data, dt_3d ) )
-          ENDIF
-
-!
-!--       Initialize arrays for marking those particles to be deleted after the
-!--       (sub-) timestep
-          deleted_particles = 0
-
-!
-!--       Initialize variables used for accumulating the number of particles
-!--       xchanged between the subdomains during all sub-timesteps (if sgs
-!--       velocities are included). These data are output further below on the
-!--       particle statistics file.
-          trlp_count_sum      = 0
-          trlp_count_recv_sum = 0
-          trrp_count_sum      = 0
-          trrp_count_recv_sum = 0
-          trsp_count_sum      = 0
-          trsp_count_recv_sum = 0
-          trnp_count_sum      = 0
-          trnp_count_recv_sum = 0
-!
-!--       Calculate exponential term used in case of particle inertia for each
-!--       of the particle groups
-          DO  m = 1, number_of_particle_groups
-             IF ( particle_groups(m)%density_ratio /= 0.0_wp )  THEN
-                particle_groups(m)%exp_arg  =                                        &
-                          4.5_wp * particle_groups(m)%density_ratio *                &
-                          molecular_viscosity / ( particle_groups(m)%radius )**2
-
-                particle_groups(m)%exp_term = EXP( -particle_groups(m)%exp_arg *     &
-                          dt_3d )
+!
+!--       The particle model is executed if particle advection start is reached and only at the end
+!--       of the intermediate time step loop.
+          IF ( time_since_reference_point >= particle_advection_start   &
+               .AND.  intermediate_timestep_count == intermediate_timestep_count_max )             &
+          THEN
+             CALL cpu_log( log_point(25), 'lpm', 'start' )
+!
+!--          Write particle data at current time on file.
+!--          This has to be done here, before particles are further processed,
+!--          because they may be deleted within this timestep (in case that
+!--          dt_write_particle_data = dt_prel = particle_maximum_age).
+             time_write_particle_data = time_write_particle_data + dt_3d
+             IF ( time_write_particle_data >= dt_write_particle_data )  THEN
+
+                CALL lpm_data_output_particles
+!
+!--          The MOD function allows for changes in the output interval with restart
+!--          runs.
+                time_write_particle_data = MOD( time_write_particle_data, &
+                                           MAX( dt_write_particle_data, dt_3d ) )
              ENDIF
-          ENDDO
-!
-!--       If necessary, release new set of particles
-          IF ( ( simulated_time - last_particle_release_time ) >= dt_prel  .AND.     &
-                 end_time_prel > simulated_time )  THEN
-             DO WHILE ( ( simulated_time - last_particle_release_time ) >= dt_prel )
-                CALL lpm_create_particle( PHASE_RELEASE )
-                last_particle_release_time = last_particle_release_time + dt_prel
+
+!
+!--          Initialize arrays for marking those particles to be deleted after the
+!--          (sub-) timestep
+             deleted_particles = 0
+
+!
+!--          Initialize variables used for accumulating the number of particles
+!--          xchanged between the subdomains during all sub-timesteps (if sgs
+!--          velocities are included). These data are output further below on the
+!--          particle statistics file.
+             trlp_count_sum      = 0
+             trlp_count_recv_sum = 0
+             trrp_count_sum      = 0
+             trrp_count_recv_sum = 0
+             trsp_count_sum      = 0
+             trsp_count_recv_sum = 0
+             trnp_count_sum      = 0
+             trnp_count_recv_sum = 0
+!
+!--          Calculate exponential term used in case of particle inertia for each
+!--          of the particle groups
+             DO  m = 1, number_of_particle_groups
+                IF ( particle_groups(m)%density_ratio /= 0.0_wp )  THEN
+                   particle_groups(m)%exp_arg  =                                        &
+                             4.5_wp * particle_groups(m)%density_ratio *                &
+                             molecular_viscosity / ( particle_groups(m)%radius )**2
+
+                   particle_groups(m)%exp_term = EXP( -particle_groups(m)%exp_arg *     &
+                             dt_3d )
+                ENDIF
              ENDDO
-          ENDIF
-!
-!--       Reset summation arrays
-          IF ( cloud_droplets )  THEN
-             ql_c  = 0.0_wp
-             ql_v  = 0.0_wp
-             ql_vp = 0.0_wp
-          ENDIF
-
-          first_loop_stride = .TRUE.
-          grid_particles(:,:,:)%time_loop_done = .TRUE.
-!
-!--       Timestep loop for particle advection.
-!--       This loop has to be repeated until the advection time of every particle
-!--       (within the total domain!) has reached the LES timestep (dt_3d).
-!--       In case of including the SGS velocities, the particle timestep may be
-!--       smaller than the LES timestep (because of the Lagrangian timescale 
-!--       restriction) and particles may require to undergo several particle 
-!--       timesteps, before the LES timestep is reached. Because the number of these 
-!--       particle timesteps to be carried out is unknown at first, these steps are 
-!--       carried out in the following infinite loop with exit condition.
-          DO
-             CALL cpu_log( log_point_s(44), 'lpm_advec', 'start' )
-             CALL cpu_log( log_point_s(44), 'lpm_advec', 'pause' )
-
-!
-!--          If particle advection includes SGS velocity components, calculate the
-!--          required SGS quantities (i.e. gradients of the TKE, as well as 
-!--          horizontally averaged profiles of the SGS TKE and the resolved-scale 
-!--          velocity variances)
-             IF ( use_sgs_for_particles  .AND.  .NOT. cloud_droplets )  THEN
-                CALL lpm_init_sgs_tke
+!
+!--          If necessary, release new set of particles
+             IF ( ( simulated_time - last_particle_release_time ) >= dt_prel  .AND.     &
+                    end_time_prel > simulated_time )  THEN
+                DO WHILE ( ( simulated_time - last_particle_release_time ) >= dt_prel )
+                   CALL lpm_create_particle( PHASE_RELEASE )
+                   last_particle_release_time = last_particle_release_time + dt_prel
+                ENDDO
              ENDIF
 !
-!--          In case SGS-particle speed is considered, particles may carry out 
-!--          several particle timesteps. In order to prevent unnecessary 
-!--          treatment of particles that already reached the final time level, 
-!--          particles are sorted into contiguous blocks of finished and 
-!--          not-finished particles, in addition to their already sorting
-!--          according to their sub-boxes. 
-             IF ( .NOT. first_loop_stride  .AND.  use_sgs_for_particles )            &
-                CALL lpm_sort_timeloop_done
-             DO  i = nxl, nxr
-                DO  j = nys, nyn
-                   DO  k = nzb+1, nzt
-
-                      number_of_particles = prt_count(k,j,i)
-!
-!--                   If grid cell gets empty, flag must be true
-                      IF ( number_of_particles <= 0 )  THEN
-                         grid_particles(k,j,i)%time_loop_done = .TRUE.
-                         CYCLE
-                      ENDIF
-
-                      IF ( .NOT. first_loop_stride  .AND.  &
-                           grid_particles(k,j,i)%time_loop_done )  CYCLE
-
-                      particles => grid_particles(k,j,i)%particles(1:number_of_particles)
-
-                      particles(1:number_of_particles)%particle_mask = .TRUE.
-!
-!--                   Initialize the variable storing the total time that a particle 
-!--                   has advanced within the timestep procedure
-                      IF ( first_loop_stride )  THEN
-                         particles(1:number_of_particles)%dt_sum = 0.0_wp
-                      ENDIF
-!
-!--                   Particle (droplet) growth by condensation/evaporation and 
-!--                   collision
-                      IF ( cloud_droplets  .AND.  first_loop_stride)  THEN
-!
-!--                      Droplet growth by condensation / evaporation
-                         CALL lpm_droplet_condensation(i,j,k)
-!
-!--                      Particle growth by collision
-                         IF ( collision_kernel /= 'none' )  THEN
-                            CALL lpm_droplet_collision(i,j,k)
+!--          Reset summation arrays
+             IF ( cloud_droplets )  THEN
+                ql_c  = 0.0_wp
+                ql_v  = 0.0_wp
+                ql_vp = 0.0_wp
+             ENDIF
+
+             first_loop_stride = .TRUE.
+             grid_particles(:,:,:)%time_loop_done = .TRUE.
+!
+!--          Timestep loop for particle advection.
+!--          This loop has to be repeated until the advection time of every particle
+!--          (within the total domain!) has reached the LES timestep (dt_3d).
+!--          In case of including the SGS velocities, the particle timestep may be
+!--          smaller than the LES timestep (because of the Lagrangian timescale
+!--          restriction) and particles may require to undergo several particle
+!--          timesteps, before the LES timestep is reached. Because the number of these
+!--          particle timesteps to be carried out is unknown at first, these steps are
+!--          carried out in the following infinite loop with exit condition.
+             DO
+                CALL cpu_log( log_point_s(44), 'lpm_advec', 'start' )
+                CALL cpu_log( log_point_s(44), 'lpm_advec', 'pause' )
+
+!
+!--             If particle advection includes SGS velocity components, calculate the
+!--             required SGS quantities (i.e. gradients of the TKE, as well as
+!--             horizontally averaged profiles of the SGS TKE and the resolved-scale
+!--             velocity variances)
+                IF ( use_sgs_for_particles  .AND.  .NOT. cloud_droplets )  THEN
+                   CALL lpm_init_sgs_tke
+                ENDIF
+!
+!--             In case SGS-particle speed is considered, particles may carry out
+!--             several particle timesteps. In order to prevent unnecessary
+!--             treatment of particles that already reached the final time level,
+!--             particles are sorted into contiguous blocks of finished and
+!--             not-finished particles, in addition to their already sorting
+!--             according to their sub-boxes.
+                IF ( .NOT. first_loop_stride  .AND.  use_sgs_for_particles )            &
+                   CALL lpm_sort_timeloop_done
+                DO  i = nxl, nxr
+                   DO  j = nys, nyn
+                      DO  k = nzb+1, nzt
+
+                         number_of_particles = prt_count(k,j,i)
+!
+!--                      If grid cell gets empty, flag must be true
+                         IF ( number_of_particles <= 0 )  THEN
+                            grid_particles(k,j,i)%time_loop_done = .TRUE.
+                            CYCLE
                          ENDIF
 
-                      ENDIF
-!
-!--                   Initialize the switch used for the loop exit condition checked
-!--                   at the end of this loop. If at least one particle has failed to
-!--                   reach the LES timestep, this switch will be set false in 
-!--                   lpm_advec.
-                      dt_3d_reached_l = .TRUE.
-
-!
-!--                   Particle advection
-                      CALL lpm_advec( i, j, k )
-!
-!--                   Particle reflection from walls. Only applied if the particles 
-!--                   are in the vertical range of the topography. (Here, some
-!--                   optimization is still possible.)
-                      IF ( topography /= 'flat'  .AND.  k < nzb_max + 2 )  THEN
-                         CALL  lpm_boundary_conds( 'walls', i, j, k )
-                      ENDIF
-!
-!--                   User-defined actions after the calculation of the new particle 
-!--                   position
-                      CALL user_lpm_advec( i, j, k )
-!
-!--                   Apply boundary conditions to those particles that have crossed 
-!--                   the top or bottom boundary and delete those particles, which are
-!--                   older than allowed
-                      CALL lpm_boundary_conds( 'bottom/top', i, j, k )
-!
-!---                  If not all particles of the actual grid cell have reached the 
-!--                   LES timestep, this cell has to do another loop iteration. Due to
-!--                   the fact that particles can move into neighboring grid cells, 
-!--                   these neighbor cells also have to perform another loop iteration.
-!--                   Please note, this realization does not work properly if 
-!--                   particles move into another subdomain. 
-                      IF ( .NOT. dt_3d_reached_l )  THEN
-                         ks = MAX(nzb+1,k-1)
-                         ke = MIN(nzt,k+1)
-                         js = MAX(nys,j-1)
-                         je = MIN(nyn,j+1)
-                         is = MAX(nxl,i-1)
-                         ie = MIN(nxr,i+1)
-                         grid_particles(ks:ke,js:je,is:ie)%time_loop_done = .FALSE.
-                      ELSE
-                         grid_particles(k,j,i)%time_loop_done = .TRUE.
-                      ENDIF
-
+                         IF ( .NOT. first_loop_stride  .AND.  &
+                              grid_particles(k,j,i)%time_loop_done )  CYCLE
+
+                         particles => grid_particles(k,j,i)%particles(1:number_of_particles)
+
+                         particles(1:number_of_particles)%particle_mask = .TRUE.
+!
+!--                      Initialize the variable storing the total time that a particle
+!--                      has advanced within the timestep procedure
+                         IF ( first_loop_stride )  THEN
+                            particles(1:number_of_particles)%dt_sum = 0.0_wp
+                         ENDIF
+!
+!--                      Particle (droplet) growth by condensation/evaporation and
+!--                      collision
+                         IF ( cloud_droplets  .AND.  first_loop_stride)  THEN
+!
+!--                         Droplet growth by condensation / evaporation
+                            CALL lpm_droplet_condensation(i,j,k)
+!
+!--                         Particle growth by collision
+                            IF ( collision_kernel /= 'none' )  THEN
+                               CALL lpm_droplet_collision(i,j,k)
+                            ENDIF
+
+                         ENDIF
+!
+!--                      Initialize the switch used for the loop exit condition checked
+!--                      at the end of this loop. If at least one particle has failed to
+!--                      reach the LES timestep, this switch will be set false in
+!--                      lpm_advec.
+                         dt_3d_reached_l = .TRUE.
+
+!
+!--                      Particle advection
+                         CALL lpm_advec( i, j, k )
+!
+!--                      Particle reflection from walls. Only applied if the particles
+!--                      are in the vertical range of the topography. (Here, some
+!--                      optimization is still possible.)
+                         IF ( topography /= 'flat'  .AND.  k < nzb_max + 2 )  THEN
+                            CALL  lpm_boundary_conds( 'walls', i, j, k )
+                         ENDIF
+!
+!--                      User-defined actions after the calculation of the new particle
+!--                      position
+                         CALL user_lpm_advec( i, j, k )
+!
+!--                      Apply boundary conditions to those particles that have crossed
+!--                      the top or bottom boundary and delete those particles, which are
+!--                      older than allowed
+                         CALL lpm_boundary_conds( 'bottom/top', i, j, k )
+!
+!---                     If not all particles of the actual grid cell have reached the
+!--                      LES timestep, this cell has to do another loop iteration. Due to
+!--                      the fact that particles can move into neighboring grid cells,
+!--                      these neighbor cells also have to perform another loop iteration.
+!--                      Please note, this realization does not work properly if
+!--                      particles move into another subdomain.
+                         IF ( .NOT. dt_3d_reached_l )  THEN
+                            ks = MAX(nzb+1,k-1)
+                            ke = MIN(nzt,k+1)
+                            js = MAX(nys,j-1)
+                            je = MIN(nyn,j+1)
+                            is = MAX(nxl,i-1)
+                            ie = MIN(nxr,i+1)
+                            grid_particles(ks:ke,js:je,is:ie)%time_loop_done = .FALSE.
+                         ELSE
+                            grid_particles(k,j,i)%time_loop_done = .TRUE.
+                         ENDIF
+
+                      ENDDO
                    ENDDO
                 ENDDO
-             ENDDO
-             steps = steps + 1
-             dt_3d_reached_l = ALL(grid_particles(:,:,:)%time_loop_done)
-!
-!--          Find out, if all particles on every PE have completed the LES timestep
-!--          and set the switch corespondingly
+                steps = steps + 1
+                dt_3d_reached_l = ALL(grid_particles(:,:,:)%time_loop_done)
+!
+!--             Find out, if all particles on every PE have completed the LES timestep
+!--             and set the switch corespondingly
 #if defined( __parallel )
-             IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
-             CALL MPI_ALLREDUCE( dt_3d_reached_l, dt_3d_reached, 1, MPI_LOGICAL, &
-                                 MPI_LAND, comm2d, ierr )
+                IF ( collective_wait )  CALL MPI_BARRIER( comm2d, ierr )
+                CALL MPI_ALLREDUCE( dt_3d_reached_l, dt_3d_reached, 1, MPI_LOGICAL, &
+                                    MPI_LAND, comm2d, ierr )
 #else
-             dt_3d_reached = dt_3d_reached_l
+                dt_3d_reached = dt_3d_reached_l
 #endif
-             CALL cpu_log( log_point_s(44), 'lpm_advec', 'stop' )
-
-!
-!--          Apply splitting and merging algorithm
-             IF ( cloud_droplets )  THEN
-                IF ( splitting )  THEN
-                   CALL lpm_splitting
+                CALL cpu_log( log_point_s(44), 'lpm_advec', 'stop' )
+
+!
+!--             Apply splitting and merging algorithm
+                IF ( cloud_droplets )  THEN
+                   IF ( splitting )  THEN
+                      CALL lpm_splitting
+                   ENDIF
+                   IF ( merging )  THEN
+                      CALL lpm_merging
+                   ENDIF
                 ENDIF
-                IF ( merging )  THEN
-                   CALL lpm_merging
+!
+!--             Move Particles local to PE to a different grid cell
+                CALL lpm_move_particle
+!
+!--             Horizontal boundary conditions including exchange between subdmains
+                CALL lpm_exchange_horiz
+
+!
+!--             IF .FALSE., lpm_sort_and_delete is done inside pcmp
+                IF ( .NOT. dt_3d_reached  .OR.  .NOT. nested_run )   THEN
+!
+!--                Pack particles (eliminate those marked for deletion),
+!--                determine new number of particles
+                   CALL lpm_sort_and_delete
+
+!--                Initialize variables for the next (sub-) timestep, i.e., for marking
+!--                those particles to be deleted after the timestep
+                   deleted_particles = 0
                 ENDIF
-             ENDIF
-!
-!--          Move Particles local to PE to a different grid cell
-             CALL lpm_move_particle
-!
-!--          Horizontal boundary conditions including exchange between subdmains
-             CALL lpm_exchange_horiz
-
-!
-!--          IF .FALSE., lpm_sort_and_delete is done inside pcmp
-             IF ( .NOT. dt_3d_reached  .OR.  .NOT. nested_run )   THEN
-!
-!--             Pack particles (eliminate those marked for deletion),
-!--             determine new number of particles
+
+                IF ( dt_3d_reached )  EXIT
+
+                first_loop_stride = .FALSE.
+             ENDDO   ! timestep loop
+!
+!--          in case of nested runs do the transfer of particles after every full model time step
+             IF ( nested_run )   THEN
+                CALL particles_from_parent_to_child
+                CALL particles_from_child_to_parent
+                CALL pmcp_p_delete_particles_in_fine_grid_area
+
                 CALL lpm_sort_and_delete
 
-!--             Initialize variables for the next (sub-) timestep, i.e., for marking
-!--             those particles to be deleted after the timestep
                 deleted_particles = 0
              ENDIF
 
-             IF ( dt_3d_reached )  EXIT
-
-             first_loop_stride = .FALSE.
-          ENDDO   ! timestep loop
-!
-!--       in case of nested runs do the transfer of particles after every full model time step
-          IF ( nested_run )   THEN
-             CALL particles_from_parent_to_child
-             CALL particles_from_child_to_parent
-             CALL pmcp_p_delete_particles_in_fine_grid_area
-
-             CALL lpm_sort_and_delete
-
-             deleted_particles = 0
-          ENDIF
-
-!
-!--       Calculate the new liquid water content for each grid box
-          IF ( cloud_droplets )  CALL lpm_calc_liquid_water_content
-
-!
-!--       Deallocate unused memory
-          IF ( deallocate_memory  .AND.  lpm_count == step_dealloc )  THEN
-             CALL dealloc_particles_array
-             lpm_count = 0
-          ELSEIF ( deallocate_memory )  THEN
-             lpm_count = lpm_count + 1
-          ENDIF
-
-!
-!--       Write particle statistics (in particular the number of particles
-!--       exchanged between the subdomains) on file
-          IF ( write_particle_statistics )  CALL lpm_write_exchange_statistics
-
-          CALL cpu_log( log_point(25), 'lpm', 'stop' )
+!
+!--          Calculate the new liquid water content for each grid box
+             IF ( cloud_droplets )  CALL lpm_calc_liquid_water_content
+
+!
+!--          At the end all arrays are exchanged
+             IF ( cloud_droplets )  THEN
+                CALL exchange_horiz( ql, nbgp )
+                CALL exchange_horiz( ql_c, nbgp )
+                CALL exchange_horiz( ql_v, nbgp )
+                CALL exchange_horiz( ql_vp, nbgp )
+             ENDIF
+
+!
+!--          Deallocate unused memory
+             IF ( deallocate_memory  .AND.  lpm_count == step_dealloc )  THEN
+                CALL dealloc_particles_array
+                lpm_count = 0
+             ELSEIF ( deallocate_memory )  THEN
+                lpm_count = lpm_count + 1
+             ENDIF
+
+!
+!--          Write particle statistics (in particular the number of particles
+!--          exchanged between the subdomains) on file
+             IF ( write_particle_statistics )  CALL lpm_write_exchange_statistics
+!
+!--          Execute Interactions of condnesation and evaporation to humidity and
+!--          temperature field
+             IF ( cloud_droplets )  THEN
+                CALL lpm_interaction_droplets_ptq
+                CALL exchange_horiz( pt, nbgp )
+                CALL exchange_horiz( q, nbgp )
+             ENDIF
+
+             CALL cpu_log( log_point(25), 'lpm', 'stop' )
 
 ! !
@@ -2274,4 +2300,9 @@
 !              ENDIF
 !           ENDIF
+
+!
+!--           Set this switch to .false. @todo: maybe find better solution.
+              first_call_lpm = .FALSE.
+           ENDIF! ENDIF statement of lpm_actions('after_pressure_solver')
 
        CASE ( 'after_integration' )
@@ -3010,5 +3041,5 @@
 
        END SELECT
-               
+
 
  END SUBROUTINE lpm_rrd_local
Index: palm/trunk/SOURCE/time_integration.f90
===================================================================
--- palm/trunk/SOURCE/time_integration.f90	(revision 4275)
+++ palm/trunk/SOURCE/time_integration.f90	(revision 4276)
@@ -25,9 +25,12 @@
 ! -----------------
 ! $Id$
+! Further modularization of lpm code components
+! 
+! 4275 2019-10-28 15:34:55Z schwenkel
 ! Move call oft lpm to the end of intermediate timestep loop
-! 
+!
 ! 4268 2019-10-17 11:29:38Z schwenkel
 ! Removing module specific boundary conditions an put them into their modules
-! 
+!
 ! 4227 2019-09-10 18:04:34Z gronemeier
 ! implement new palm_date_time_mod
@@ -177,5 +180,5 @@
     USE arrays_3d,                                                                                 &
         ONLY:  diss, diss_p, dzu, e, e_p, nc, nc_p, nr, nr_p, prho, pt, pt_p, pt_init, q_init, q,  &
-               qc, qc_p, ql, ql_c, ql_v, ql_vp, qr, qr_p, q_p, ref_state, rho_ocean, s, s_p, sa_p, &
+               qc, qc_p, qr, qr_p, q_p, ref_state, rho_ocean, s, s_p, sa_p, &
                tend, u, u_p, v, vpt, v_p, w, w_p
 
@@ -207,5 +210,5 @@
                averaging_interval, averaging_interval_pr, bc_lr_cyc, bc_ns_cyc, bc_pt_t_val,       &
                bc_q_t_val, biometeorology, call_psolver_at_all_substeps,  child_domain,            &
-               cloud_droplets, constant_flux_layer, constant_heatflux, create_disturbances,        &
+               constant_flux_layer, constant_heatflux, create_disturbances,        &
                dopr_n, constant_diffusion, coupling_mode, coupling_start_time,                     &
                current_timestep_number, disturbance_created, disturbance_energy_limit, dist_range, &
@@ -254,5 +257,5 @@
 
     USE lagrangian_particle_model_mod,                                                             &
-        ONLY:  lpm_data_output_ptseries, lpm_interaction_droplets_ptq
+        ONLY:  lpm_data_output_ptseries
 
     USE lsf_nudging_mod,                                                                           &
@@ -588,5 +591,5 @@
        IF ( nesting_offline )  CALL nesting_offl_input
 !
-!--    Execute all other module actions routunes
+!--    Execute all other module actions routines
        CALL module_interface_actions( 'before_timestep' )
 
@@ -975,27 +978,10 @@
 !--       ### particle model should be moved before prognostic_equations, in order
 !--       to regard droplet interactions directly
-          IF ( particle_advection  .AND.  time_since_reference_point >= particle_advection_start   &
-               .AND.  intermediate_timestep_count == intermediate_timestep_count_max )             &
-          THEN
-             CALL module_interface_actions( 'after_pressure_solver' )
-             first_call_lpm = .FALSE.
-          ENDIF
-
-          IF ( cloud_droplets )  THEN
-             CALL exchange_horiz( ql, nbgp )
-             CALL exchange_horiz( ql_c, nbgp )
-             CALL exchange_horiz( ql_v, nbgp )
-             CALL exchange_horiz( ql_vp, nbgp )
-          ENDIF
+
+          CALL module_interface_actions( 'after_pressure_solver' )
 !
 !--       Interaction of droplets with temperature and mixing ratio.
 !--       Droplet condensation and evaporation is calculated within
 !--       advec_particles.
-          IF ( cloud_droplets  .AND.  intermediate_timestep_count == intermediate_timestep_count_max ) &
-          THEN
-             CALL lpm_interaction_droplets_ptq
-             CALL exchange_horiz( pt, nbgp )
-             CALL exchange_horiz( q, nbgp )
-          ENDIF
 !
 !--       If required, compute liquid water content
