source: palm/trunk/SOURCE/lpm_boundary_conds.f90 @ 849

Last change on this file since 849 was 849, checked in by raasch, 10 years ago

Changed:


Original routine advec_particles split into several new subroutines and renamed
lpm.
init_particles renamed lpm_init
user_advec_particles renamed user_lpm_advec,
particle_boundary_conds renamed lpm_boundary_conds,
set_particle_attributes renamed lpm_set_attributes,
user_init_particles renamed user_lpm_init,
user_particle_attributes renamed user_lpm_set_attributes
(Makefile, lpm_droplet_collision, lpm_droplet_condensation, init_3d_model, modules, palm, read_var_list, time_integration, write_var_list, deleted: advec_particles, init_particles, particle_boundary_conds, set_particle_attributes, user_advec_particles, user_init_particles, user_particle_attributes, new: lpm, lpm_advec, lpm_boundary_conds, lpm_calc_liquid_water_content, lpm_data_output_particles, lpm_droplet_collision, lpm_drollet_condensation, lpm_exchange_horiz, lpm_extend_particle_array, lpm_extend_tails, lpm_extend_tail_array, lpm_init, lpm_init_sgs_tke, lpm_pack_arrays, lpm_read_restart_file, lpm_release_set, lpm_set_attributes, lpm_sort_arrays, lpm_write_exchange_statistics, lpm_write_restart_file, user_lpm_advec, user_lpm_init, user_lpm_set_attributes

  • Property svn:keywords set to Id
File size: 23.7 KB
Line 
1 SUBROUTINE lpm_boundary_conds( range )
2
3!------------------------------------------------------------------------------!
4! Current revisions:
5! -----------------
6! routine renamed lpm_boundary_conds, bottom and top boundary conditions
7! included
8!
9! Former revisions:
10! -----------------
11! $Id: lpm_boundary_conds.f90 849 2012-03-15 10:35:09Z raasch $
12!
13! 824 2012-02-17 09:09:57Z raasch
14! particle attributes speed_x|y|z_sgs renamed rvar1|2|3
15!
16! 150 2008-02-29 08:19:58Z raasch
17! Vertical index calculations adjusted for ocean runs.
18!
19! Initial version (2007/03/09)
20!
21! Description:
22! ------------
23! Boundary conditions for the Lagrangian particles.
24! The routine consists of two different parts. One handles the bottom (flat)
25! and top boundary. In this part, also particles which exceeded their lifetime
26! are deleted.
27! The other part handles the reflection of particles from vertical walls.
28! This part was developed by Jin Zhang during 2006-2007.
29!
30! To do: Code structure for finding the t_index values and for checking the
31! -----  reflection conditions is basically the same for all four cases, so it
32!        should be possible to further simplify/shorten it.
33!
34! THE WALLS PART OF THIS ROUTINE HAS NOT BEEN TESTED FOR OCEAN RUNS SO FAR!!!!
35! (see offset_ocean_*)
36!------------------------------------------------------------------------------!
37
38    USE arrays_3d
39    USE control_parameters
40    USE cpulog
41    USE grid_variables
42    USE indices
43    USE interfaces
44    USE particle_attributes
45    USE pegrid
46
47    IMPLICIT NONE
48
49    CHARACTER (LEN=*) ::  range
50
51    INTEGER ::  i, inc, ir, i1, i2, i3, i5, j, jr, j1, j2, j3, j5, k, k1, k2, &
52                k3, k5, n, nn, t_index, t_index_number
53
54    LOGICAL ::  reflect_x, reflect_y, reflect_z
55
56    REAL ::  dt_particle, pos_x, pos_x_old, pos_y, pos_y_old, pos_z, &
57             pos_z_old, prt_x, prt_y, prt_z, tmp_t, xline, yline, zline
58
59    REAL ::  t(1:200)
60
61
62
63    IF ( range == 'bottom/top' )  THEN
64
65!
66!--    Apply boundary conditions to those particles that have crossed the top or
67!--    bottom boundary and delete those particles, which are older than allowed
68       DO  n = 1, number_of_particles
69
70          nn = particles(n)%tail_id
71
72!
73!--       Stop if particles have moved further than the length of one
74!--       PE subdomain (newly released particles have age = age_m!)
75          IF ( particles(n)%age /= particles(n)%age_m )  THEN
76             IF ( ABS(particles(n)%speed_x) >                                  &
77                  ((nxr-nxl+2)*dx)/(particles(n)%age-particles(n)%age_m)  .OR. &
78                  ABS(particles(n)%speed_y) >                                  &
79                  ((nyn-nys+2)*dy)/(particles(n)%age-particles(n)%age_m) )  THEN
80
81                  WRITE( message_string, * )  'particle too fast.  n = ',  n
82                  CALL message( 'lpm_boundary_conds', 'PA0148', 2, 2, -1, 6, 1 )
83             ENDIF
84          ENDIF
85
86          IF ( particles(n)%age > particle_maximum_age  .AND.  &
87               particle_mask(n) )                              &
88          THEN
89             particle_mask(n)  = .FALSE.
90             deleted_particles = deleted_particles + 1
91             IF ( use_particle_tails  .AND.  nn /= 0 )  THEN
92                tail_mask(nn) = .FALSE.
93                deleted_tails = deleted_tails + 1
94             ENDIF
95          ENDIF
96
97          IF ( particles(n)%z >= zu(nz)  .AND.  particle_mask(n) )  THEN
98             IF ( ibc_par_t == 1 )  THEN
99!
100!--             Particle absorption
101                particle_mask(n)  = .FALSE.
102                deleted_particles = deleted_particles + 1
103                IF ( use_particle_tails  .AND.  nn /= 0 )  THEN
104                   tail_mask(nn) = .FALSE.
105                   deleted_tails = deleted_tails + 1
106                ENDIF
107             ELSEIF ( ibc_par_t == 2 )  THEN
108!
109!--             Particle reflection
110                particles(n)%z       = 2.0 * zu(nz) - particles(n)%z
111                particles(n)%speed_z = -particles(n)%speed_z
112                IF ( use_sgs_for_particles  .AND. &
113                     particles(n)%rvar3 > 0.0 )  THEN
114                   particles(n)%rvar3 = -particles(n)%rvar3
115                ENDIF
116                IF ( use_particle_tails  .AND.  nn /= 0 )  THEN
117                   particle_tail_coordinates(1,3,nn) = 2.0 * zu(nz) - &
118                                               particle_tail_coordinates(1,3,nn)
119                ENDIF
120             ENDIF
121          ENDIF
122          IF ( particles(n)%z < zw(0)  .AND.  particle_mask(n) )  THEN
123             IF ( ibc_par_b == 1 )  THEN
124!
125!--             Particle absorption
126                particle_mask(n)  = .FALSE.
127                deleted_particles = deleted_particles + 1
128                IF ( use_particle_tails  .AND.  nn /= 0 )  THEN
129                   tail_mask(nn) = .FALSE.
130                   deleted_tails = deleted_tails + 1
131                ENDIF
132             ELSEIF ( ibc_par_b == 2 )  THEN
133!
134!--             Particle reflection
135                particles(n)%z       = 2.0 * zw(0) - particles(n)%z
136                particles(n)%speed_z = -particles(n)%speed_z
137                IF ( use_sgs_for_particles  .AND. &
138                     particles(n)%rvar3 < 0.0 )  THEN
139                   particles(n)%rvar3 = -particles(n)%rvar3
140                ENDIF
141                IF ( use_particle_tails  .AND.  nn /= 0 )  THEN
142                   particle_tail_coordinates(1,3,nn) = 2.0 * zu(nz) - &
143                                               particle_tail_coordinates(1,3,nn)
144                ENDIF
145                IF ( use_particle_tails  .AND.  nn /= 0 )  THEN
146                   particle_tail_coordinates(1,3,nn) = 2.0 * zw(0) - &
147                                               particle_tail_coordinates(1,3,nn)
148                ENDIF
149             ENDIF
150          ENDIF
151       ENDDO
152
153    ELSEIF ( range == 'walls' )  THEN
154
155       CALL cpu_log( log_point_s(48), 'lpm_wall_reflect', 'start' )
156
157       reflect_x = .FALSE.
158       reflect_y = .FALSE.
159       reflect_z = .FALSE.
160
161       DO  n = 1, number_of_particles
162
163          dt_particle = particles(n)%age - particles(n)%age_m
164
165          i2 = ( particles(n)%x + 0.5 * dx ) * ddx
166          j2 = ( particles(n)%y + 0.5 * dy ) * ddy
167          k2 = particles(n)%z / dz + 1 + offset_ocean_nzt_m1
168
169          prt_x = particles(n)%x
170          prt_y = particles(n)%y
171          prt_z = particles(n)%z
172
173!
174!--       If the particle position is below the surface, it has to be reflected
175          IF ( k2 <= nzb_s_inner(j2,i2)  .AND.  nzb_s_inner(j2,i2) /=0 )  THEN
176
177             pos_x_old = particles(n)%x - particles(n)%speed_x * dt_particle
178             pos_y_old = particles(n)%y - particles(n)%speed_y * dt_particle
179             pos_z_old = particles(n)%z - particles(n)%speed_z * dt_particle
180             i1 = ( pos_x_old + 0.5 * dx ) * ddx
181             j1 = ( pos_y_old + 0.5 * dy ) * ddy
182             k1 = pos_z_old / dz + offset_ocean_nzt_m1
183
184!
185!--          Case 1
186             IF ( particles(n)%x > pos_x_old .AND. particles(n)%y > pos_y_old )&
187             THEN
188                t_index = 1
189
190                DO  i = i1, i2
191                   xline      = i * dx + 0.5 * dx
192                   t(t_index) = ( xline - pos_x_old ) / &
193                                ( particles(n)%x - pos_x_old )
194                   t_index    = t_index + 1
195                ENDDO
196
197                DO  j = j1, j2
198                   yline      = j * dy + 0.5 * dy
199                   t(t_index) = ( yline - pos_y_old ) / &
200                                ( particles(n)%y - pos_y_old )
201                   t_index    = t_index + 1
202                ENDDO
203
204                IF ( particles(n)%z < pos_z_old )  THEN
205                   DO  k = k1, k2 , -1
206                      zline      = k * dz
207                      t(t_index) = ( pos_z_old - zline ) / &
208                                   ( pos_z_old - particles(n)%z )
209                      t_index    = t_index + 1
210                   ENDDO
211                ENDIF
212
213                t_index_number = t_index - 1
214
215!
216!--             Sorting t
217                inc = 1
218                jr  = 1
219                DO WHILE ( inc <= t_index_number )
220                   inc = 3 * inc + 1
221                ENDDO
222
223                DO WHILE ( inc > 1 )
224                   inc = inc / 3
225                   DO  ir = inc+1, t_index_number
226                      tmp_t = t(ir)
227                      jr    = ir
228                      DO WHILE ( t(jr-inc) > tmp_t )
229                         t(jr) = t(jr-inc)
230                         jr    = jr - inc
231                         IF ( jr <= inc )  EXIT
232                      ENDDO
233                      t(jr) = tmp_t
234                   ENDDO
235                ENDDO
236
237         case1: DO  t_index = 1, t_index_number
238
239                   pos_x = pos_x_old + t(t_index) * ( prt_x - pos_x_old )
240                   pos_y = pos_y_old + t(t_index) * ( prt_y - pos_y_old )
241                   pos_z = pos_z_old + t(t_index) * ( prt_z - pos_z_old )
242
243                   i3 = ( pos_x + 0.5 * dx ) * ddx   
244                   j3 = ( pos_y + 0.5 * dy ) * ddy
245                   k3 = pos_z / dz + offset_ocean_nzt_m1
246
247                   i5 = pos_x * ddx
248                   j5 = pos_y * ddy
249                   k5 = pos_z / dz + offset_ocean_nzt_m1
250
251                   IF ( k5 <= nzb_s_inner(j5,i3)  .AND. &
252                        nzb_s_inner(j5,i3) /= 0 )  THEN
253
254                      IF ( pos_z == nzb_s_inner(j5,i3) * dz  .AND. &
255                           k3 == nzb_s_inner(j5,i3) )  THEN
256                         reflect_z = .TRUE.
257                         EXIT case1
258                      ENDIF
259
260                   ENDIF
261
262                   IF ( k5 <= nzb_s_inner(j3,i5)  .AND. &
263                        nzb_s_inner(j3,i5) /= 0 )  THEN
264
265                      IF ( pos_z == nzb_s_inner(j3,i5) * dz  .AND. &
266                           k3 == nzb_s_inner(j3,i5) )  THEN
267                         reflect_z = .TRUE.
268                         EXIT case1
269                      ENDIF
270
271                   ENDIF
272
273                   IF ( k3 <= nzb_s_inner(j3,i3)  .AND. &
274                        nzb_s_inner(j3,i3) /= 0 )  THEN
275
276                      IF ( pos_z == nzb_s_inner(j3,i3) * dz  .AND. &
277                           k3 == nzb_s_inner(j3,i3) )  THEN
278                         reflect_z = .TRUE.
279                         EXIT case1
280                      ENDIF
281
282                      IF ( pos_y == ( j3 * dy - 0.5 * dy )  .AND. &
283                           pos_z < nzb_s_inner(j3,i3) * dz )  THEN
284                         reflect_y = .TRUE.
285                         EXIT case1
286                      ENDIF
287
288                      IF ( pos_x == ( i3 * dx - 0.5 * dx )  .AND. &
289                           pos_z < nzb_s_inner(j3,i3) * dz )  THEN
290                         reflect_x = .TRUE.
291                         EXIT case1
292                      ENDIF
293
294                   ENDIF
295
296                ENDDO case1
297
298!
299!--          Case 2
300             ELSEIF ( particles(n)%x > pos_x_old  .AND. &
301                      particles(n)%y < pos_y_old )  THEN
302
303                t_index = 1
304
305                DO  i = i1, i2
306                   xline      = i * dx + 0.5 * dx
307                   t(t_index) = ( xline - pos_x_old ) / &
308                                ( particles(n)%x - pos_x_old )
309                   t_index    = t_index + 1
310                ENDDO
311
312                DO  j = j1, j2, -1
313                   yline      = j * dy - 0.5 * dy
314                   t(t_index) = ( pos_y_old - yline ) / &
315                                ( pos_y_old - particles(n)%y )
316                   t_index    = t_index + 1
317                ENDDO
318
319                IF ( particles(n)%z < pos_z_old )  THEN
320                   DO  k = k1, k2 , -1
321                      zline      = k * dz
322                      t(t_index) = ( pos_z_old - zline ) / &
323                                   ( pos_z_old - particles(n)%z )
324                      t_index    = t_index + 1
325                   ENDDO
326                ENDIF
327                t_index_number = t_index-1
328
329!
330!--             Sorting t
331                inc = 1
332                jr  = 1
333                DO WHILE ( inc <= t_index_number )
334                   inc = 3 * inc + 1
335                ENDDO
336
337                DO WHILE ( inc > 1 )
338                   inc = inc / 3
339                   DO  ir = inc+1, t_index_number
340                      tmp_t = t(ir)
341                      jr    = ir
342                      DO WHILE ( t(jr-inc) > tmp_t )
343                         t(jr) = t(jr-inc)
344                         jr    = jr - inc
345                         IF ( jr <= inc )  EXIT
346                      ENDDO
347                      t(jr) = tmp_t
348                   ENDDO
349                ENDDO
350
351         case2: DO  t_index = 1, t_index_number
352
353                   pos_x = pos_x_old + t(t_index) * ( prt_x - pos_x_old )
354                   pos_y = pos_y_old + t(t_index) * ( prt_y - pos_y_old )
355                   pos_z = pos_z_old + t(t_index) * ( prt_z - pos_z_old )
356
357                   i3 = ( pos_x + 0.5 * dx ) * ddx
358                   j3 = ( pos_y + 0.5 * dy ) * ddy
359                   k3 = pos_z / dz + offset_ocean_nzt_m1
360
361                   i5 = pos_x * ddx
362                   j5 = pos_y * ddy
363                   k5 = pos_z / dz + offset_ocean_nzt_m1
364
365                   IF ( k5 <= nzb_s_inner(j3,i5)  .AND. &
366                        nzb_s_inner(j3,i5) /= 0 )  THEN
367
368                      IF ( pos_z == nzb_s_inner(j3,i5) * dz  .AND. &
369                           k3 == nzb_s_inner(j3,i5) )  THEN
370                         reflect_z = .TRUE.
371                         EXIT case2
372                      ENDIF
373
374                   ENDIF
375
376                   IF ( k3 <= nzb_s_inner(j3,i3)  .AND. &
377                        nzb_s_inner(j3,i3) /= 0 )  THEN
378
379                      IF ( pos_z == nzb_s_inner(j3,i3) * dz  .AND. &
380                           k3 == nzb_s_inner(j3,i3) )  THEN
381                         reflect_z = .TRUE.
382                         EXIT case2
383                      ENDIF
384
385                      IF ( pos_x == ( i3 * dx - 0.5 * dx )  .AND. &
386                           pos_z < nzb_s_inner(j3,i3) * dz )  THEN
387                         reflect_x = .TRUE.
388                         EXIT case2
389                      ENDIF
390
391                   ENDIF
392
393                   IF ( k5 <= nzb_s_inner(j5,i3)  .AND. &
394                        nzb_s_inner(j5,i3) /= 0 )  THEN
395
396                      IF ( pos_z == nzb_s_inner(j5,i3) * dz  .AND. &
397                           k3 == nzb_s_inner(j5,i3) )  THEN
398                         reflect_z = .TRUE.
399                         EXIT case2
400                      ENDIF
401
402                      IF ( pos_y == ( j5 * dy + 0.5 * dy )  .AND. &
403                           pos_z < nzb_s_inner(j5,i3) * dz )  THEN
404                         reflect_y = .TRUE.
405                         EXIT case2
406                      ENDIF
407
408                   ENDIF
409
410                ENDDO case2
411
412!
413!--          Case 3
414             ELSEIF ( particles(n)%x < pos_x_old  .AND. &
415                      particles(n)%y > pos_y_old )  THEN
416
417                t_index = 1
418
419                DO  i = i1, i2, -1
420                   xline      = i * dx - 0.5 * dx
421                   t(t_index) = ( pos_x_old - xline ) / &
422                                ( pos_x_old - particles(n)%x )
423                   t_index    = t_index + 1
424                ENDDO
425
426                DO  j = j1, j2
427                   yline      = j * dy + 0.5 * dy
428                   t(t_index) = ( yline - pos_y_old ) / &
429                                ( particles(n)%y - pos_y_old )
430                   t_index    = t_index + 1
431                ENDDO
432
433                IF ( particles(n)%z < pos_z_old )  THEN
434                   DO  k = k1, k2 , -1
435                      zline      = k * dz
436                      t(t_index) = ( pos_z_old - zline ) / &
437                                   ( pos_z_old - particles(n)%z )
438                      t_index    = t_index + 1
439                   ENDDO
440                ENDIF
441                t_index_number = t_index - 1
442
443!
444!--             Sorting t
445                inc = 1
446                jr  = 1
447
448                DO WHILE ( inc <= t_index_number )
449                   inc = 3 * inc + 1
450                ENDDO
451
452                DO WHILE ( inc > 1 )
453                   inc = inc / 3
454                   DO  ir = inc+1, t_index_number
455                      tmp_t = t(ir)
456                      jr    = ir
457                      DO WHILE ( t(jr-inc) > tmp_t )
458                         t(jr) = t(jr-inc)
459                         jr    = jr - inc
460                         IF ( jr <= inc )  EXIT
461                      ENDDO
462                      t(jr) = tmp_t
463                   ENDDO
464                ENDDO
465
466         case3: DO  t_index = 1, t_index_number
467
468                   pos_x = pos_x_old + t(t_index) * ( prt_x - pos_x_old )
469                   pos_y = pos_y_old + t(t_index) * ( prt_y - pos_y_old )
470                   pos_z = pos_z_old + t(t_index) * ( prt_z - pos_z_old )
471
472                   i3 = ( pos_x + 0.5 * dx ) * ddx
473                   j3 = ( pos_y + 0.5 * dy ) * ddy
474                   k3 = pos_z / dz + offset_ocean_nzt_m1
475
476                   i5 = pos_x * ddx
477                   j5 = pos_y * ddy
478                   k5 = pos_z / dz + offset_ocean_nzt_m1
479
480                   IF ( k5 <= nzb_s_inner(j5,i3)  .AND. &
481                        nzb_s_inner(j5,i3) /= 0 )  THEN
482
483                      IF ( pos_z == nzb_s_inner(j5,i3) * dz  .AND. &
484                           k3 == nzb_s_inner(j5,i3) )  THEN
485                         reflect_z = .TRUE.
486                         EXIT case3
487                      ENDIF
488
489                   ENDIF
490
491                   IF ( k3 <= nzb_s_inner(j3,i3)  .AND. &
492                        nzb_s_inner(j3,i3) /= 0 )  THEN
493
494                      IF ( pos_z == nzb_s_inner(j3,i3) * dz  .AND. &
495                           k3 == nzb_s_inner(j3,i3) )  THEN
496                         reflect_z = .TRUE.
497                         EXIT case3
498                      ENDIF
499
500                      IF ( pos_y == ( j3 * dy - 0.5 * dy )  .AND. &
501                           pos_z < nzb_s_inner(j3,i3) * dz )  THEN
502                         reflect_y = .TRUE.
503                         EXIT case3
504                      ENDIF
505
506                   ENDIF
507
508                   IF ( k5 <= nzb_s_inner(j3,i5)  .AND. &
509                        nzb_s_inner(j3,i5) /= 0 )  THEN
510
511                      IF ( pos_z == nzb_s_inner(j3,i5) * dz  .AND. &
512                           k3 == nzb_s_inner(j3,i5) )  THEN
513                         reflect_z = .TRUE.
514                         EXIT case3
515                      ENDIF
516
517                      IF ( pos_x == ( i5 * dx + 0.5 * dx )  .AND. &
518                           pos_z < nzb_s_inner(j3,i5) * dz )  THEN
519                         reflect_x = .TRUE.
520                         EXIT case3
521                      ENDIF
522
523                   ENDIF
524
525                ENDDO case3
526
527!
528!--          Case 4
529             ELSEIF ( particles(n)%x < pos_x_old  .AND. &
530                      particles(n)%y < pos_y_old )  THEN
531
532                t_index = 1
533
534                DO  i = i1, i2, -1
535                   xline      = i * dx - 0.5 * dx
536                   t(t_index) = ( pos_x_old - xline ) / &
537                                ( pos_x_old - particles(n)%x )
538                   t_index    = t_index + 1
539                ENDDO
540
541                DO  j = j1, j2, -1
542                   yline      = j * dy - 0.5 * dy
543                   t(t_index) = ( pos_y_old - yline ) / &
544                                ( pos_y_old - particles(n)%y )
545                   t_index    = t_index + 1
546                ENDDO
547
548                IF ( particles(n)%z < pos_z_old )  THEN
549                   DO  k = k1, k2 , -1
550                      zline      = k * dz
551                      t(t_index) = ( pos_z_old - zline ) / &
552                                   ( pos_z_old-particles(n)%z )
553                      t_index    = t_index + 1
554                   ENDDO
555                ENDIF
556                t_index_number = t_index-1
557
558!
559!--             Sorting t
560                inc = 1
561                jr  = 1
562
563                DO WHILE ( inc <= t_index_number )
564                   inc = 3 * inc + 1
565                ENDDO
566
567                DO WHILE ( inc > 1 )
568                   inc = inc / 3
569                   DO  ir = inc+1, t_index_number
570                      tmp_t = t(ir)
571                      jr = ir
572                      DO WHILE ( t(jr-inc) > tmp_t )
573                         t(jr) = t(jr-inc)
574                         jr    = jr - inc
575                         IF ( jr <= inc )  EXIT
576                      ENDDO
577                      t(jr) = tmp_t
578                   ENDDO
579                ENDDO
580
581         case4: DO  t_index = 1, t_index_number
582
583                   pos_x = pos_x_old + t(t_index) * ( prt_x - pos_x_old )
584                   pos_y = pos_y_old + t(t_index) * ( prt_y - pos_y_old )
585                   pos_z = pos_z_old + t(t_index) * ( prt_z - pos_z_old )
586
587                   i3 = ( pos_x + 0.5 * dx ) * ddx   
588                   j3 = ( pos_y + 0.5 * dy ) * ddy
589                   k3 = pos_z / dz + offset_ocean_nzt_m1
590
591                   i5 = pos_x * ddx
592                   j5 = pos_y * ddy
593                   k5 = pos_z / dz + offset_ocean_nzt_m1
594
595                   IF ( k3 <= nzb_s_inner(j3,i3)  .AND. &
596                        nzb_s_inner(j3,i3) /= 0 )  THEN
597
598                      IF ( pos_z == nzb_s_inner(j3,i3) * dz  .AND. &
599                           k3 == nzb_s_inner(j3,i3) )  THEN
600                         reflect_z = .TRUE.
601                         EXIT case4
602                      ENDIF
603
604                   ENDIF
605
606                   IF ( k5 <= nzb_s_inner(j3,i5)  .AND. &
607                        nzb_s_inner(j3,i5) /= 0 )  THEN
608
609                      IF ( pos_z == nzb_s_inner(j3,i5) * dz  .AND. &
610                           k3 == nzb_s_inner(j3,i5) )  THEN
611                         reflect_z = .TRUE.
612                         EXIT case4
613                      ENDIF
614
615                      IF ( pos_x == ( i5 * dx + 0.5 * dx )  .AND. &
616                           nzb_s_inner(j3,i5) /=0  .AND.          &
617                           pos_z < nzb_s_inner(j3,i5) * dz )  THEN
618                         reflect_x = .TRUE.
619                         EXIT case4
620                      ENDIF
621
622                   ENDIF
623
624                   IF ( k5 <= nzb_s_inner(j5,i3)  .AND. &
625                        nzb_s_inner(j5,i3) /= 0 )  THEN
626
627                      IF ( pos_z == nzb_s_inner(j5,i3) * dz  .AND. &
628                           k5 == nzb_s_inner(j5,i3) )  THEN
629                         reflect_z = .TRUE.
630                         EXIT case4
631                      ENDIF
632
633                      IF ( pos_y == ( j5 * dy + 0.5 * dy )  .AND. &
634                           nzb_s_inner(j5,i3) /= 0  .AND.         &
635                           pos_z < nzb_s_inner(j5,i3) * dz )  THEN
636                         reflect_y = .TRUE.
637                         EXIT case4
638                      ENDIF
639
640                   ENDIF
641 
642                ENDDO case4
643
644             ENDIF
645
646          ENDIF      ! Check, if particle position is below the surface
647
648!
649!--       Do the respective reflection, in case that one of the above conditions
650!--       is found to be true
651          IF ( reflect_z )  THEN
652
653             particles(n)%z       = 2.0 * pos_z - prt_z
654             particles(n)%speed_z = - particles(n)%speed_z
655
656             IF ( use_sgs_for_particles )  THEN
657                particles(n)%rvar3 = - particles(n)%rvar3
658             ENDIF
659             reflect_z = .FALSE.
660
661          ELSEIF ( reflect_y )  THEN
662
663             particles(n)%y       = 2.0 * pos_y - prt_y
664             particles(n)%speed_y = - particles(n)%speed_y
665
666             IF ( use_sgs_for_particles )  THEN
667                particles(n)%rvar2 = - particles(n)%rvar2
668             ENDIF
669             reflect_y = .FALSE.
670
671          ELSEIF ( reflect_x )  THEN
672
673             particles(n)%x       = 2.0 * pos_x - prt_x
674             particles(n)%speed_x = - particles(n)%speed_x
675
676             IF ( use_sgs_for_particles )  THEN
677                particles(n)%rvar1 = - particles(n)%rvar1
678             ENDIF
679             reflect_x = .FALSE.
680
681          ENDIF       
682   
683       ENDDO
684
685       CALL cpu_log( log_point_s(48), 'lpm_wall_reflect', 'stop' )
686
687    ENDIF
688
689 END SUBROUTINE lpm_boundary_conds
Note: See TracBrowser for help on using the repository browser.