source: palm/trunk/SOURCE/init_dvrp.f90 @ 273

Last change on this file since 273 was 273, checked in by raasch, 15 years ago

further small changes concerning dvr usage on necriam

  • Property svn:keywords set to Id
File size: 26.9 KB
Line 
1  SUBROUTINE init_dvrp
2
3!------------------------------------------------------------------------------!
4! Current revisions:
5! -----------------
6! Definition of a colortable to be used for particles.
7! Output names are changed: surface=groundplate, buildings=topography
8! Output of messages replaced by message handling routine.
9! Clipping implemented.
10! Polygon reduction for building and ground plate isosurface. Reduction level
11! for buildings can be chosen with parameter cluster_size.
12! Steering, splitting, and rtsp routines not used on nec.
13! ToDo: checking of mode_dvrp for legal values is not correct
14! Implementation of a MPI-1 coupling: __mpi2 adjustments for MPI_COMM_WORLD
15!
16! Former revisions:
17! -----------------
18! $Id: init_dvrp.f90 273 2009-03-26 02:04:05Z raasch $
19!
20! 210 2008-11-06 08:54:02Z raasch
21! DVRP arguments changed to single precision, mode pathlines added
22!
23! 155 2008-03-28 10:56:30Z letzel
24! introduce prefix_chr to ensure unique dvrp_file path
25!
26! 130 2007-11-13 14:08:40Z letzel
27! allow two instead of one digit to specify isosurface and slicer variables
28! Test output of isosurface on camera file
29!
30! 82 2007-04-16 15:40:52Z raasch
31! Preprocessor strings for different linux clusters changed to "lc",
32! routine local_flush is used for buffer flushing
33!
34! 17 2007-02-19 01:57:39Z raasch
35! dvrp_output_local activated for all streams
36!
37! 13 2007-02-14 12:15:07Z raasch
38! RCS Log replace by Id keyword, revision history cleaned up
39!
40! Revision 1.12  2006/02/23 12:30:22  raasch
41! ebene renamed section, pl.. replaced by do..,
42!
43! Revision 1.1  2000/04/27 06:24:39  raasch
44! Initial revision
45!
46!
47! Description:
48! ------------
49! Initializing actions needed when using dvrp-software
50!------------------------------------------------------------------------------!
51#if defined( __dvrp_graphics )
52
53    USE arrays_3d
54    USE DVRP
55    USE dvrp_variables
56    USE grid_variables
57    USE indices
58    USE pegrid
59    USE control_parameters
60
61    IMPLICIT NONE
62
63    CHARACTER (LEN=2)  ::  section_chr
64    CHARACTER (LEN=3)  ::  prefix_chr
65    CHARACTER (LEN=80) ::  dvrp_file_local
66    INTEGER ::  cluster_mode, cluster_size_x, cluster_size_y, cluster_size_z, &
67                gradient_normals, i, j, k, l, m, nx_dvrp_l, nx_dvrp_r,        &
68                ny_dvrp_n, ny_dvrp_s, pn, tv, vn
69    LOGICAL ::  allocated
70    REAL(4) ::  center(3), cluster_alpha, distance, tmp_b, tmp_g, tmp_r, &
71                tmp_t, tmp_th, tmp_thr, tmp_x1, tmp_x2, tmp_y1, tmp_y2,  &
72                tmp_z1, tmp_z2, tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6, tmp_7
73
74    REAL(4), DIMENSION(:,:,:), ALLOCATABLE ::  local_pf
75
76    TYPE(CSTRING), SAVE ::  dvrp_directory_c, dvrp_file_c, &
77                            dvrp_file_local_c,dvrp_host_c, &
78                            dvrp_password_c, dvrp_username_c, name_c
79
80!
81!-- Set clipping to default (total domain), if not set by user
82    IF ( clip_dvrp_l == 9999999.9 )  clip_dvrp_l = 0.0
83    IF ( clip_dvrp_r == 9999999.9 )  clip_dvrp_r = ( nx + 1 ) * dx
84    IF ( clip_dvrp_s == 9999999.9 )  clip_dvrp_s = 0.0
85    IF ( clip_dvrp_n == 9999999.9 )  clip_dvrp_n = ( ny + 1 ) * dy
86
87!
88!-- Calculate the clipping index limits
89    nx_dvrp_l = clip_dvrp_l / dx
90    nx_dvrp_r = clip_dvrp_r / dx
91    ny_dvrp_s = clip_dvrp_s / dy
92    ny_dvrp_n = clip_dvrp_n / dy
93
94    IF ( nx_dvrp_l < nxr  .AND.  nx_dvrp_r > nxl  .AND. &
95         ny_dvrp_s < nyn  .AND.  ny_dvrp_n > nys )  THEN
96
97       dvrp_overlap = .TRUE.
98       nxl_dvrp = MAX( nxl, nx_dvrp_l )
99       nxr_dvrp = MIN( nxr, nx_dvrp_r )
100       nys_dvrp = MAX( nys, ny_dvrp_s )
101       nyn_dvrp = MIN( nyn, ny_dvrp_n )
102
103       IF ( nxl_dvrp == nxl  .AND.  nxr_dvrp == nxr  .AND.  &
104            nys_dvrp == nys  .AND.  nyn_dvrp == nyn )  THEN
105          dvrp_total_overlap = .TRUE.
106       ELSE
107          dvrp_total_overlap = .FALSE.
108       ENDIF
109
110    ELSE
111!
112!--    This subdomain does not overlap with the clipping area. Define an
113!--    arbitrary (small) domain within in the clipping area.
114       dvrp_overlap       = .FALSE.
115       dvrp_total_overlap = .FALSE.
116!       nxl_dvrp = nx_dvrp_l
117!       nxr_dvrp = nxl_dvrp + 4
118!       nys_dvrp = ny_dvrp_s
119!       nyn_dvrp = nys_dvrp + 4
120       nxl_dvrp = nxl
121       nxr_dvrp = MIN( nxl+4, nxr )
122       nys_dvrp = nys
123       nyn_dvrp = MIN( nys+4, nyn )
124
125    ENDIF
126
127!
128!-- Set the maximum time the program can be suspended on user request (by
129!-- dvrp steering). This variable is defined in module DVRP.
130    DVRP_MAX_SUSPEND_TIME = 7200
131
132!
133!-- Allocate array holding the names and limits of the steering variables
134!-- (must have the same number of elements as array mode_dvrp!)
135    ALLOCATE( steering_dvrp(10) )
136
137!
138!-- Check, if output parameters are given and/or allowed
139!-- and set default-values, where necessary
140    IF ( dvrp_username == ' ' )  THEN
141        message_string = 'dvrp_username is undefined'
142        CALL message( 'init_dvrp', 'PA0195', 1, 2, 0, 6, 0 )         
143    ENDIF
144
145    IF ( dvrp_output /= 'ftp'  .AND.  dvrp_output /= 'rtsp'  .AND. &
146         dvrp_output /= 'local' )  THEN
147       message_string = 'dvrp_output="' // TRIM( dvrp_output ) // '" not allowed'
148       CALL message( 'init_dvrp', 'PA0196', 1, 2, 0, 6, 0 )
149    ENDIF
150
151    IF ( dvrp_directory == 'default' )  THEN
152       dvrp_directory = TRIM( dvrp_username ) // '/' // TRIM( run_identifier )
153    ENDIF
154
155!
156!-- A local dvrserver running always outputs on temporary directory DATA_DVR
157    IF ( local_dvrserver_running )  THEN
158       dvrp_directory = 'DATA_DVR'
159    ENDIF
160
161    IF ( dvrp_output /= 'local' )  THEN
162       IF ( dvrp_file /= 'default'  .AND.  dvrp_file /= '/dev/null' )  THEN
163          message_string = 'dvrp_file="' // TRIM( dvrp_file ) // '" not allowed'
164          CALL message( 'init_dvrp', 'PA0197', 1, 2, 0, 6, 0 )
165       ENDIF
166    ENDIF
167
168!
169!-- Strings are assigned to strings of special type which have a CHAR( 0 )
170!-- (C end-of-character symbol) at their end. This is needed when strings are
171!-- passed to C routines.
172    dvrp_directory_c = dvrp_directory
173    dvrp_file_c      = dvrp_file
174    dvrp_host_c      = dvrp_host
175    dvrp_password_c  = dvrp_password
176    dvrp_username_c  = dvrp_username
177
178!
179!-- Loop over all output modes choosed
180    m = 1
181    allocated = .FALSE.
182    DO WHILE ( mode_dvrp(m) /= ' ' )
183   
184!
185!--    Check, if mode is allowed
186       IF ( mode_dvrp(m)(1:10) /= 'isosurface'  .AND. &
187            mode_dvrp(m)(1:6)  /= 'slicer'      .AND. &
188            mode_dvrp(m)(1:9)  /= 'particles'   .AND. &
189            mode_dvrp(m)(1:9)  /= 'pathlines' )  THEN
190
191          message_string = 'mode_dvrp="' // TRIM( mode_dvrp(m) ) // '" not allowed'
192          CALL message( 'init_dvrp', 'PA0198', 1, 2, 0, 6, 0 )
193          CALL local_stop
194
195       ENDIF
196!
197!--    Determine prefix for dvrp_file
198       WRITE ( prefix_chr, '(I2.2,''_'')' )  m
199!
200!--    Camera position must be computed and written on file when no dvrp-output
201!--    has been generated so far (in former runs)
202!       IF ( dvrp_filecount == 0 )  THEN
203!
204!--       Compute center of domain and distance of camera from center
205          center(1) = ( clip_dvrp_l + clip_dvrp_r ) * 0.5 * superelevation_x
206          center(2) = ( clip_dvrp_s + clip_dvrp_n ) * 0.5 * superelevation_y
207          center(3) = ( zu(nz_do3d) - zu(nzb) ) * 0.5 * superelevation
208          distance  = 1.5 * MAX( (clip_dvrp_r-clip_dvrp_l) * superelevation_x, &
209                                 (clip_dvrp_n-clip_dvrp_s) * superelevation_y, &
210                                 ( zu(nz_do3d) - zu(nzb) ) * superelevation )
211
212!
213!--       Write camera position on file
214          CALL DVRP_INIT( m-1, 0 )
215
216!
217!--       Create filename for camera
218          IF ( dvrp_output == 'rtsp' )  THEN
219
220             dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // '/camera.dvr'
221             dvrp_file_c = dvrp_file
222#ifndef __nec
223             CALL DVRP_OUTPUT_RTSP( m-1, dvrp_host_c, dvrp_username_c, &
224                                    dvrp_password_c, dvrp_directory_c, &
225                                    dvrp_file_c )
226#endif
227
228          ELSEIF ( dvrp_output == 'ftp' )  THEN
229
230             dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // '.camera.dvr'
231             dvrp_file_c = dvrp_file
232!             CALL DVRP_OUTPUT_FTP( m-1, 0, dvrp_host_c, dvrp_username_c, &
233!                                   dvrp_password_c, dvrp_directory_c,    &
234!                                   dvrp_file_c )
235
236          ELSE
237
238             IF ( dvrp_file(1:9) /= '/dev/null' )  THEN
239                dvrp_file_local   = prefix_chr // TRIM( mode_dvrp(m) )  &
240                     // '.camera.dvr'
241                dvrp_file_local_c = dvrp_file_local
242             ELSE
243                dvrp_file_local_c = dvrp_file_c
244             ENDIF
245             CALL DVRP_OUTPUT_LOCAL( m-1, 0, dvrp_file_local_c )
246
247          ENDIF
248
249          CALL DVRP_CAMERA( m-1, center, distance )
250
251!
252!--       Define bounding box material and create a bounding box
253          tmp_r = 0.5;  tmp_g = 0.5;  tmp_b = 0.5;  tmp_t = 0.0
254          CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t )
255
256          tmp_1 = 0.01;
257          tmp_2 = clip_dvrp_l * superelevation_x
258          tmp_3 = clip_dvrp_s * superelevation_y
259          tmp_4 = 0.0
260          tmp_5 = (clip_dvrp_r+dx) * superelevation_x
261          tmp_6 = (clip_dvrp_n+dy) * superelevation_y
262          tmp_7 = zu(nz_do3d) * superelevation
263          CALL DVRP_BOUNDINGBOX( m-1, 1, tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, &
264                                 tmp_6, tmp_7 )
265
266          CALL DVRP_VISUALIZE( m-1, 0, 0 )
267          CALL DVRP_EXIT( m-1 )
268
269!
270!--       Write topography isosurface on file
271          IF ( TRIM( topography ) /= 'flat' )  THEN
272
273             CALL DVRP_INIT( m-1, 0 )
274
275!
276!--          Create filename for topography
277             IF ( dvrp_output == 'rtsp' )  THEN
278
279                dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) )  &
280                              // '/topography.dvr'
281                dvrp_file_c = dvrp_file
282#ifndef __nec
283                CALL DVRP_OUTPUT_RTSP( m-1, dvrp_host_c, dvrp_username_c, &
284                                       dvrp_password_c, dvrp_directory_c, &
285                                       dvrp_file_c )
286#endif
287
288             ELSEIF ( dvrp_output == 'ftp' )  THEN
289
290                dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) )  &
291                              // '.topography.dvr'
292                dvrp_file_c = dvrp_file
293!                CALL DVRP_OUTPUT_FTP( m-1, 0, dvrp_host_c, dvrp_username_c, &
294!                                      dvrp_password_c, dvrp_directory_c,    &
295!                                      dvrp_file_c )
296
297             ELSE
298
299                IF ( dvrp_file(1:9) /= '/dev/null' )  THEN
300                   dvrp_file_local   = prefix_chr // TRIM( mode_dvrp(m) )  &
301                                       // '.topography.dvr'
302                   dvrp_file_local_c = dvrp_file_local
303                ELSE
304                   dvrp_file_local_c = dvrp_file_c
305                ENDIF
306                CALL DVRP_OUTPUT_LOCAL( m-1, 0, dvrp_file_local_c )
307
308             ENDIF
309
310!
311!--          Determine local gridpoint coordinates
312             IF ( .NOT. allocated )  THEN
313                ALLOCATE( xcoor_dvrp(nxl_dvrp:nxr_dvrp+1), &
314                          ycoor_dvrp(nys_dvrp:nyn_dvrp+1), &
315                          zcoor_dvrp(nzb:nz_do3d) )
316                allocated = .TRUE.
317
318                DO  i = nxl_dvrp, nxr_dvrp+1
319                   xcoor_dvrp(i) = i * dx * superelevation_x
320                ENDDO
321                DO  j = nys_dvrp, nyn_dvrp+1
322                   ycoor_dvrp(j) = j * dy * superelevation_y
323                ENDDO
324                zcoor_dvrp = zu(nzb:nz_do3d) * superelevation
325                nx_dvrp    = nxr_dvrp+1 - nxl_dvrp + 1
326                ny_dvrp    = nyn_dvrp+1 - nys_dvrp + 1
327                nz_dvrp    = nz_do3d - nzb + 1
328             ENDIF
329
330!
331!--          Define the grid used by dvrp
332             CALL DVRP_NO_GLOBAL_GRID( m-1, 1 )
333             CALL DVRP_GRID( m-1, nx_dvrp, ny_dvrp, nz_dvrp, xcoor_dvrp, &
334                             ycoor_dvrp, zcoor_dvrp )
335
336             tmp_r = 0.8;  tmp_g = 0.7;  tmp_b = 0.6;  tmp_t = 0.0
337             CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t )
338
339!
340!--          Compute and plot isosurface in dvr-format
341             ALLOCATE( local_pf(nxl_dvrp:nxr_dvrp+1,nys_dvrp:nyn_dvrp+1, &
342                                nzb:nz_do3d) )
343             local_pf = 0.0
344             IF ( dvrp_overlap )  THEN
345                DO  i = nxl_dvrp, nxr_dvrp+1
346                   DO  j = nys_dvrp, nyn_dvrp+1
347                      IF ( nzb_s_inner(j,i) > 0 )  THEN
348                         local_pf(i,j,nzb:nzb_s_inner(j,i)) = 1.0
349                      ENDIF
350                   ENDDO
351                ENDDO
352             ENDIF
353
354             CALL DVRP_DATA( m-1, local_pf, 1, nx_dvrp, ny_dvrp, nz_dvrp, &
355                             cyclic_dvrp, cyclic_dvrp, cyclic_dvrp )
356
357             tmp_th = 1.0
358             CALL DVRP_THRESHOLD( m-1, tmp_th )
359
360!
361!--          Reduce the number of polygones, if required
362             IF ( cluster_size > 1 )  THEN
363
364                cluster_size_x = cluster_size
365                cluster_size_y = cluster_size
366                cluster_size_z = cluster_size
367                cluster_mode     = 4    ! vertex clustering mode
368                gradient_normals = 0    ! use flat-shading
369
370                CALL DVRP_CLUSTER_SIZE( m-1, cluster_size_x, cluster_size_y, &
371                                        cluster_size_z )
372                CALL DVRP_CLUSTERING_MODE( m-1, cluster_mode )
373                CALL DVRP_GRADIENTNORMALS( m-1, gradient_normals )
374!
375!--             Set parameter for vertex clustering mode 4.
376!--             ATTENTION: A seperate procedure for setting cluster_alpha will
377!--                        be in the next version of libDVRP (Feb 09)
378                cluster_alpha = 38.0
379                CALL DVRP_THRESHOLD( -(m-1)-1, cluster_alpha )
380
381                CALL DVRP_VISUALIZE( m-1, 21, 0 )
382
383             ELSE
384!
385!--             No polygon reduction
386                CALL DVRP_VISUALIZE( m-1, 1, 0 )
387
388             ENDIF
389
390             DEALLOCATE( local_pf )
391
392             CALL DVRP_EXIT( m-1 )
393
394          ENDIF
395
396!
397!--       Write the ground plate (z=0) isosurface on file
398          CALL DVRP_INIT( m-1, 0 )
399
400!
401!--       Create filename for surface
402          IF ( dvrp_output == 'rtsp' )  THEN
403
404             dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // &
405                           '/groundplate.dvr'
406             dvrp_file_c = dvrp_file
407#ifndef __nec
408             CALL DVRP_OUTPUT_RTSP( m-1, dvrp_host_c, dvrp_username_c, &
409                                    dvrp_password_c, dvrp_directory_c, &
410                                    dvrp_file_c )
411#endif
412
413          ELSEIF ( dvrp_output == 'ftp' )  THEN
414
415             dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // &
416                           '.groundplate.dvr'
417             dvrp_file_c = dvrp_file
418!             CALL DVRP_OUTPUT_FTP( m-1, 0, dvrp_host_c, dvrp_username_c, &
419!                                   dvrp_password_c, dvrp_directory_c,    &
420!                                   dvrp_file_c )
421
422          ELSE
423
424             IF ( dvrp_file(1:9) /= '/dev/null' )  THEN
425                dvrp_file_local   = prefix_chr // TRIM( mode_dvrp(m) )  &
426                     // '.groundplate.dvr'
427                dvrp_file_local_c = dvrp_file_local
428             ELSE
429                dvrp_file_local_c = dvrp_file_c
430             ENDIF
431             CALL DVRP_OUTPUT_LOCAL( m-1, 0, dvrp_file_local_c )
432
433          ENDIF
434
435!
436!--       Determine local gridpoint coordinates
437          IF ( .NOT. allocated )  THEN
438             ALLOCATE( xcoor_dvrp(nxl_dvrp:nxr_dvrp+1), &
439                       ycoor_dvrp(nys_dvrp:nyn_dvrp+1), &
440                       zcoor_dvrp(nzb:nz_do3d) )
441             allocated = .TRUE.
442
443             DO  i = nxl_dvrp, nxr_dvrp+1
444                xcoor_dvrp(i) = i * dx * superelevation_x
445             ENDDO
446             DO  j = nys_dvrp, nyn_dvrp+1
447                ycoor_dvrp(j) = j * dy * superelevation_y
448             ENDDO
449             zcoor_dvrp = zu(nzb:nz_do3d) * superelevation
450             nx_dvrp    = nxr_dvrp+1 - nxl_dvrp + 1
451             ny_dvrp    = nyn_dvrp+1 - nys_dvrp + 1
452             nz_dvrp    = nz_do3d - nzb + 1
453          ENDIF
454
455!
456!--       Define the grid used by dvrp
457          CALL DVRP_NO_GLOBAL_GRID( m-1, 1 )
458          CALL DVRP_GRID( m-1, nx_dvrp, ny_dvrp, nz_dvrp, xcoor_dvrp, &
459                          ycoor_dvrp, zcoor_dvrp )
460
461          tmp_r = 0.0;  tmp_g = 0.6;  tmp_b = 0.0;  tmp_t = 0.0
462          CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t )
463
464!
465!--       Compute and plot isosurface in dvr-format
466          ALLOCATE( local_pf(nxl_dvrp:nxr_dvrp+1,nys_dvrp:nyn_dvrp+1, &
467                             nzb:nz_do3d) )
468          local_pf = 0.0
469          IF (dvrp_overlap )  local_pf(:,:,0) = 1.0
470
471          CALL DVRP_DATA( m-1, local_pf, 1, nx_dvrp, ny_dvrp, nz_dvrp, &
472                          cyclic_dvrp, cyclic_dvrp, cyclic_dvrp )
473          tmp_th = 1.0
474          CALL DVRP_THRESHOLD( m-1, tmp_th )
475
476!
477!--       Always reduce the number of polygones as much as possible
478          cluster_size_x = 5
479          cluster_size_y = 5
480          cluster_size_z = 5
481          cluster_mode     = 4    ! vertex clustering mode
482          gradient_normals = 0    ! use flat-shading
483
484          CALL DVRP_CLUSTER_SIZE( m-1, cluster_size_x, cluster_size_y, &
485                                  cluster_size_z )
486          CALL DVRP_CLUSTERING_MODE( m-1, cluster_mode )
487          CALL DVRP_GRADIENTNORMALS( m-1, gradient_normals )
488!
489!--       Set parameter for vertex clustering mode 4.
490!--       ATTENTION: A seperate procedure for setting cluster_alpha will be in
491!--                  the next version of libDVRP (Feb 09)
492          cluster_alpha = 38.0
493          CALL DVRP_THRESHOLD( -(m-1)-1, cluster_alpha )
494
495          CALL DVRP_VISUALIZE( m-1, 21, 0 )
496
497          DEALLOCATE( local_pf )
498
499          CALL DVRP_EXIT( m-1 )
500   
501!       ENDIF
502
503
504!
505!--    Initialize dvrp for all dvrp-calls during the run
506       CALL DVRP_INIT( m-1, 0 )
507
508!
509!--    Preliminary definition of filename for dvrp-output
510       IF ( dvrp_output == 'rtsp' )  THEN
511
512!
513!--       First initialize parameters for possible interactive steering.
514!--       Every parameter has to be passed to the respective stream.
515          pn = 1
516!
517!--       Initialize threshold counter needed for initialization of the
518!--       isosurface steering variables
519          tv = 0
520
521          DO WHILE ( mode_dvrp(pn) /= ' ' )
522
523             IF ( mode_dvrp(pn)(1:10) == 'isosurface' )  THEN
524
525                READ ( mode_dvrp(pn), '(10X,I2)' )  vn
526                steering_dvrp(pn)%name = do3d(0,vn)
527                tv = tv + 1
528
529                IF ( do3d(0,vn)(1:1) == 'w' )  THEN
530                   steering_dvrp(pn)%min  = -4.0
531                   steering_dvrp(pn)%max  =  5.0
532                ELSE
533                   steering_dvrp(pn)%min  = 288.0
534                   steering_dvrp(pn)%max  = 292.0
535                ENDIF
536
537                name_c  = TRIM( do3d(0,vn) )
538                tmp_thr = threshold(tv)
539#ifndef __nec
540                CALL DVRP_STEERING_INIT( m-1, name_c, steering_dvrp(pn)%min, &
541                                         steering_dvrp(pn)%max, tmp_thr )
542#endif
543
544             ELSEIF ( mode_dvrp(pn)(1:6) == 'slicer' )  THEN
545
546                READ ( mode_dvrp(pn), '(6X,I2)' )  vn
547                steering_dvrp(pn)%name = do2d(0,vn)
548                name_c = TRIM( do2d(0,vn) )
549
550                l = MAX( 2, LEN_TRIM( do2d(0,vn) ) )
551                section_chr = do2d(0,vn)(l-1:l)
552                SELECT CASE ( section_chr )
553                   CASE ( 'xy' )
554                      steering_dvrp(pn)%imin   = 0
555                      steering_dvrp(pn)%imax   = nz_do3d
556                      slicer_position_dvrp(pn) = section(1,1)
557#ifndef __nec
558                      CALL DVRP_STEERING_INIT( m-1, name_c,            &
559                                               steering_dvrp(pn)%imin, &
560                                               steering_dvrp(pn)%imax, &
561                                               slicer_position_dvrp(pn) )
562#endif
563                   CASE ( 'xz' )
564                      steering_dvrp(pn)%imin   = 0
565                      steering_dvrp(pn)%imax   = ny
566                      slicer_position_dvrp(pn) = section(1,2)
567#ifndef __nec
568                      CALL DVRP_STEERING_INIT( m-1, name_c,            &
569                                               steering_dvrp(pn)%imin, &
570                                               steering_dvrp(pn)%imax, &
571                                               slicer_position_dvrp(pn) )
572#endif
573                   CASE ( 'yz' )
574                      steering_dvrp(pn)%imin = 0
575                      steering_dvrp(pn)%imax = nx
576                      slicer_position_dvrp(pn) = section(1,3)
577#ifndef __nec
578                      CALL DVRP_STEERING_INIT( m-1, name_c,            &
579                                               steering_dvrp(pn)%imin, &
580                                               steering_dvrp(pn)%imax, &
581                                               slicer_position_dvrp(pn) )
582#endif
583                END SELECT
584
585             ENDIF
586
587             pn = pn + 1
588
589          ENDDO
590
591          dvrp_file = prefix_chr // TRIM( mode_dvrp(m) ) // '/*****.dvr'
592          dvrp_file_c = dvrp_file
593#ifndef __nec
594          CALL DVRP_OUTPUT_RTSP( m-1, dvrp_host_c, dvrp_username_c, &
595                                 dvrp_password_c, dvrp_directory_c, &
596                                 dvrp_file_c )
597#endif
598
599       ELSEIF ( dvrp_output == 'ftp' )  THEN
600
601          dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // '.%05d.dvr'
602          dvrp_file_c = dvrp_file
603!          CALL DVRP_OUTPUT_FTP( m-1, 0, dvrp_host_c, dvrp_username_c, &
604!                                dvrp_password_c, dvrp_directory_c, dvrp_file_c )
605
606       ELSE
607
608          IF ( dvrp_file(1:9) /= '/dev/null' )  THEN
609             dvrp_file_local   = prefix_chr // TRIM( mode_dvrp(m) )  &
610                  // '_%05d.dvr'
611             dvrp_file_local_c = dvrp_file_local
612          ELSE
613             dvrp_file_local_c = dvrp_file_c
614          ENDIF
615          CALL DVRP_OUTPUT_LOCAL( m-1, 0, dvrp_file_local_c )
616
617       ENDIF
618
619!
620!--    Determine local gridpoint coordinates
621       IF ( .NOT. allocated )  THEN
622          ALLOCATE( xcoor_dvrp(nxl_dvrp:nxr_dvrp+1), &
623                    ycoor_dvrp(nys_dvrp:nyn_dvrp+1), &
624                    zcoor_dvrp(nzb:nz_do3d) )
625          allocated = .TRUE.
626
627          DO  i = nxl_dvrp, nxr_dvrp+1
628             xcoor_dvrp(i) = i * dx * superelevation_x
629          ENDDO
630          DO  j = nys_dvrp, nyn_dvrp+1
631             ycoor_dvrp(j) = j * dy * superelevation_y
632          ENDDO
633          zcoor_dvrp = zu(nzb:nz_do3d) * superelevation
634          nx_dvrp    = nxr_dvrp+1 - nxl_dvrp + 1
635          ny_dvrp    = nyn_dvrp+1 - nys_dvrp + 1
636          nz_dvrp    = nz_do3d - nzb + 1
637       ENDIF
638
639!
640!--    Define the grid used by dvrp
641       IF ( mode_dvrp(m) /= 'pathlines' )  THEN
642          CALL DVRP_NO_GLOBAL_GRID( m-1, 1 )
643       ENDIF
644       CALL DVRP_GRID( m-1, nx_dvrp, ny_dvrp, nz_dvrp, xcoor_dvrp, ycoor_dvrp, &
645                       zcoor_dvrp )
646
647       IF ( mode_dvrp(m) == 'pathlines' )  THEN
648
649          tmp_x1 = 0.0;  tmp_y1 = 0.0;  tmp_z1 = 0.0
650          tmp_x2 = 1.0;  tmp_y2 = 1.0;  tmp_z2 = 0.3
651          CALL DVRP_CUBIC_SEEDING( m-1, tmp_x1, tmp_y1, tmp_z1, tmp_x2, tmp_y2,&
652                                   tmp_z2, pathlines_linecount, 2, 0 )
653!
654!--       Set wavecount and wavetime
655          CALL DVRP_PATHLINES_BEHAVIOUR_WAVE( m-1, pathlines_wavecount, &
656                                              pathlines_wavetime,       &
657                                              pathlines_fadeintime,     &
658                                              pathlines_fadeouttime )
659!
660!--       Set pathline length
661          CALL DVRP_PATHLINES_SETMAXHISTORY( m-1, pathlines_maxhistory )
662          CALL DVRP_PATHLINES_SETFADING( m-1, 1, 0.0 )
663
664          CALL DVRP_INIT_PATHLINES( m-1, 0 )
665
666       ENDIF
667
668       IF ( mode_dvrp(m)(1:9) == 'particles' )  THEN
669!
670!--       Define a default colourtable for particles
671          DO  i = 1, 11
672             interval_values_dvrp_prt(1,i) = i - 1.0
673             interval_values_dvrp_prt(2,i) = REAL( i )
674             interval_h_dvrp_prt(:,i) = 270.0 - ( i - 1.0 ) * 9.0
675          ENDDO
676
677          DO  i = 12, 22
678             interval_values_dvrp_prt(1,i) = i - 1.0
679             interval_values_dvrp_prt(2,i) = REAL( i )
680             interval_h_dvrp_prt(:,i) = 70.0 - ( i - 12.0 ) * 9.5
681          ENDDO
682
683          dvrp_colortable_entries_prt = 22
684
685       ENDIF
686
687       m = m + 1
688
689    ENDDO
690
691#endif
692 END SUBROUTINE init_dvrp
693
694 
695 SUBROUTINE init_dvrp_logging
696
697!------------------------------------------------------------------------------!
698! Description:
699! ------------
700! Initializes logging events for time measurement with dvrp software
701! and splits one PE from the global communicator in case that dvrp output
702! shall be done by one single PE.
703!------------------------------------------------------------------------------!
704#if defined( __dvrp_graphics )
705
706    USE control_parameters
707    USE dvrp_variables
708    USE pegrid
709
710    IMPLICIT NONE
711
712    CHARACTER (LEN=4) ::  chr
713    INTEGER           ::  idummy
714
715!
716!-- Initialize logging of calls by DVRP graphic software
717    CALL DVRP_LOG_INIT( 'DVRP_LOG' // CHAR( 0 ), 0 )
718
719!
720!-- User-defined logging events: #1 (total time needed by PALM)
721    CALL DVRP_LOG_SYMBOL( 1, 'PALM_total' // CHAR( 0 ) )
722    CALL DVRP_LOG_SYMBOL( 2, 'PALM_timestep' // CHAR( 0 ) )
723    CALL DVRP_LOG_EVENT( 1, 1 )
724
725#if defined( __parallel )
726!
727!-- Find out, if dvrp output shall be done by a dedicated PE
728    CALL local_getenv( 'use_seperate_pe_for_dvrp_output', 31, chr, idummy )
729    IF ( chr == 'true' )  THEN
730
731       use_seperate_pe_for_dvrp_output = .TRUE.
732
733!
734!--    Adjustment for new MPI-1 coupling. This might be unnecessary.
735#if defined( __mpi2 )
736#ifndef __nec
737       CALL DVRP_SPLIT( MPI_COMM_WORLD, comm_palm )
738#endif
739#else
740       IF ( coupling_mode /= 'uncoupled' ) THEN
741          message_string = 'split of communicator not realized with' // &
742                          ' MPI1 coupling atmosphere-ocean'
743          CALL message( 'init_dvrp_logging', 'PA0199', 1, 2, 0, 6, 0 )
744 
745#ifndef __nec
746          CALL DVRP_SPLIT( comm_inter, comm_palm )
747#endif
748       ELSE
749#ifndef __nec
750          CALL DVRP_SPLIT( MPI_COMM_WORLD, comm_palm )
751#endif
752       ENDIF
753#endif
754
755       CALL MPI_COMM_SIZE( comm_palm, numprocs, ierr )
756
757    ENDIF
758#endif
759
760#endif
761 END SUBROUTINE init_dvrp_logging
762
763
764 SUBROUTINE close_dvrp
765
766!------------------------------------------------------------------------------!
767! Description:
768! ------------
769! Exit of dvrp software and finish dvrp logging
770!------------------------------------------------------------------------------!
771#if defined( __dvrp_graphics )
772
773    USE control_parameters
774    USE dvrp
775    USE dvrp_variables
776
777    INTEGER ::  m
778
779!
780!-- If required, close dvrp-software and logging of dvrp-calls
781    IF ( dt_dvrp /= 9999999.9 )  THEN
782       m = 1
783       DO WHILE ( mode_dvrp(m) /= ' ' )
784          CALL DVRP_EXIT( m-1 )
785          m = m + 1
786       ENDDO
787       CALL DVRP_LOG_EVENT( -1, 1 )   ! Logging of total cpu-time used by PALM
788       IF ( use_seperate_pe_for_dvrp_output )  THEN
789#ifndef __nec
790          CALL DVRP_SPLIT_EXIT( 1 )      ! Argument 0: reduced output
791#endif
792       ELSE
793          CALL DVRP_LOG_EXIT( 1 )        ! Argument 0: reduced output
794       ENDIF
795    ENDIF
796
797#endif
798 END SUBROUTINE close_dvrp
Note: See TracBrowser for help on using the repository browser.