Ignore:
Timestamp:
Feb 16, 2009 9:57:56 AM (15 years ago)
Author:
raasch
Message:

polygon reduction for topography and ground plate isosurface (dvr)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/init_dvrp.f90

    r226 r237  
    44! Actual revisions:
    55! -----------------
    6 ! TEST: print* statements
     6! Polygon reduction for building and ground plate isosurface. Reduction level
     7! for buildings can be chosen with parameter cluster_size.
    78! ToDo: checking of mode_dvrp for legal values is not correct
    89! Implementation of a MPI-1 coupling: __mpi2 adjustments for MPI_COMM_WORLD
     
    5859    CHARACTER (LEN=3)  ::  prefix_chr
    5960    CHARACTER (LEN=80) ::  dvrp_file_local
    60     INTEGER ::  i, j, k, l, m, pn, tv, vn
     61    INTEGER ::  cluster_mode, cluster_size_x, cluster_size_y, cluster_size_z, &
     62                gradient_normals, i, j, k, l, m, pn, tv, vn
    6163    LOGICAL ::  allocated
    62     REAL(4) ::  center(3), distance, tmp_b, tmp_g, tmp_r, tmp_t, tmp_th, &
    63                 tmp_thr, tmp_x1, tmp_x2, tmp_y1, tmp_y2, tmp_z1, tmp_z2, &
    64                 tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6, tmp_7
     64    REAL(4) ::  center(3), cluster_alpha, distance, tmp_b, tmp_g, tmp_r, &
     65                tmp_t, tmp_th, tmp_thr, tmp_x1, tmp_x2, tmp_y1, tmp_y2, &
     66                tmp_z1, tmp_z2, tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6, tmp_7
    6567
    6668    REAL(4), DIMENSION(:,:,:), ALLOCATABLE ::  local_pf
     
    164166          IF ( dvrp_output == 'rtsp' )  THEN
    165167
    166     WRITE ( 9, * ) '***  vor dvrp_output_rtsp'
    167     CALL local_flush( 9 )
    168 
    169168             dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // '/camera.dvr'
    170169             dvrp_file_c = dvrp_file
     
    172171                                    dvrp_password_c, dvrp_directory_c, &
    173172                                    dvrp_file_c )
    174     WRITE ( 9, * ) '***  nach dvrp_output_rtsp'
    175     CALL local_flush( 9 )
    176173
    177174          ELSEIF ( dvrp_output == 'ftp' )  THEN
     
    197194
    198195          CALL DVRP_CAMERA( m-1, center, distance )
    199     WRITE ( 9, * ) '***  #1'
    200     CALL local_flush( 9 )
    201196
    202197!
     
    214209          CALL DVRP_VISUALIZE( m-1, 0, 0 )
    215210          CALL DVRP_EXIT( m-1 )
    216     WRITE ( 9, * ) '***  #2'
    217     CALL local_flush( 9 )
    218 
    219211
    220212!
    221213!--       Write topography isosurface on file
     214          IF ( TRIM( topography ) /= 'flat' )  THEN
     215
     216             CALL DVRP_INIT( m-1, 0 )
     217
     218!
     219!--          Create filename for buildings
     220             IF ( dvrp_output == 'rtsp' )  THEN
     221
     222                dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) )  &
     223                              // '/buildings.dvr'
     224                dvrp_file_c = dvrp_file
     225                CALL DVRP_OUTPUT_RTSP( m-1, dvrp_host_c, dvrp_username_c, &
     226                                       dvrp_password_c, dvrp_directory_c, &
     227                                       dvrp_file_c )
     228
     229             ELSEIF ( dvrp_output == 'ftp' )  THEN
     230
     231                dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) )  &
     232                              // '.buildings.dvr'
     233                dvrp_file_c = dvrp_file
     234!                CALL DVRP_OUTPUT_FTP( m-1, 0, dvrp_host_c, dvrp_username_c, &
     235!                                      dvrp_password_c, dvrp_directory_c,    &
     236!                                      dvrp_file_c )
     237
     238             ELSE
     239
     240                IF ( dvrp_file(1:9) /= '/dev/null' )  THEN
     241                   dvrp_file_local   = prefix_chr // TRIM( mode_dvrp(m) )  &
     242                                       // '.buildings.dvr'
     243                   dvrp_file_local_c = dvrp_file_local
     244                ELSE
     245                   dvrp_file_local_c = dvrp_file_c
     246                ENDIF
     247                CALL DVRP_OUTPUT_LOCAL( m-1, 0, dvrp_file_local_c )
     248
     249             ENDIF
     250
     251!
     252!--          Determine local gridpoint coordinates
     253             IF ( .NOT. allocated )  THEN
     254                ALLOCATE( xcoor_dvrp(nxl:nxr+1), ycoor_dvrp(nys:nyn+1), &
     255                          zcoor_dvrp(nzb:nz_do3d) )
     256                allocated = .TRUE.
     257
     258                DO  i = nxl, nxr+1
     259                   xcoor_dvrp(i) = i * dx * superelevation_x
     260                ENDDO
     261                DO  j = nys, nyn+1
     262                   ycoor_dvrp(j) = j * dy * superelevation_y
     263                ENDDO
     264                zcoor_dvrp = zu(nzb:nz_do3d) * superelevation
     265                nx_dvrp    = nxr+1 - nxl + 1
     266                ny_dvrp    = nyn+1 - nys + 1
     267                nz_dvrp    = nz_do3d - nzb + 1
     268             ENDIF
     269
     270!
     271!--          Define the grid used by dvrp
     272             CALL DVRP_NO_GLOBAL_GRID( m-1, 1 )
     273             CALL DVRP_GRID( m-1, nx_dvrp, ny_dvrp, nz_dvrp, xcoor_dvrp, &
     274                             ycoor_dvrp, zcoor_dvrp )
     275
     276             tmp_r = 0.8;  tmp_g = 0.7;  tmp_b = 0.6;  tmp_t = 0.0
     277             CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t )
     278
     279!
     280!--          Compute and plot isosurface in dvr-format
     281             ALLOCATE( local_pf(nxl:nxr+1,nys:nyn+1,nzb:nz_do3d) )
     282             local_pf = 0.0
     283             DO  i = nxl, nxr+1
     284                DO  j = nys, nyn+1
     285                   IF ( nzb_s_inner(j,i) > 0 )  THEN
     286                         local_pf(i,j,nzb:nzb_s_inner(j,i)) = 1.0
     287                      ENDIF
     288                ENDDO
     289             ENDDO
     290
     291             CALL DVRP_DATA( m-1, local_pf, 1, nx_dvrp, ny_dvrp, nz_dvrp, &
     292                             cyclic_dvrp, cyclic_dvrp, cyclic_dvrp )
     293
     294             tmp_th = 1.0
     295             CALL DVRP_THRESHOLD( m-1, tmp_th )
     296
     297!
     298!--          Reduce the number of polygones, if required
     299             IF ( cluster_size > 1 )  THEN
     300
     301                cluster_size_x = cluster_size
     302                cluster_size_y = cluster_size
     303                cluster_size_z = cluster_size
     304                cluster_mode     = 4    ! vertex clustering mode
     305                gradient_normals = 0    ! use flat-shading
     306
     307                CALL DVRP_CLUSTER_SIZE( m-1, cluster_size_x, cluster_size_y, &
     308                                        cluster_size_z )
     309                CALL DVRP_CLUSTERING_MODE( m-1, cluster_mode )
     310                CALL DVRP_GRADIENTNORMALS( m-1, gradient_normals )
     311!
     312!--             Set parameter for vertex clustering mode 4.
     313!--             ATTENTION: A seperate procedure for setting cluster_alpha will
     314!--                        be in the next version of libDVRP (Feb 09)
     315                cluster_alpha = 38.0
     316                CALL DVRP_THRESHOLD( -(m-1)-1, cluster_alpha )
     317
     318                CALL DVRP_VISUALIZE( m-1, 21, 0 )
     319
     320             ELSE
     321!
     322!--             No polygon reduction
     323                CALL DVRP_VISUALIZE( m-1, 1, 0 )
     324
     325             ENDIF
     326
     327             DEALLOCATE( local_pf )
     328
     329             CALL DVRP_EXIT( m-1 )
     330
     331          ENDIF
     332
     333!
     334!--       Write the surface isosurface (ground plate at z=0) on file
    222335          CALL DVRP_INIT( m-1, 0 )
    223336
    224337!
    225 !--       Create filename for buildings
     338!--       Create filename for surface
    226339          IF ( dvrp_output == 'rtsp' )  THEN
    227340
    228              dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) )  &
    229                   // '/buildings.dvr'
     341             dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // '/surface.dvr'
    230342             dvrp_file_c = dvrp_file
    231343             CALL DVRP_OUTPUT_RTSP( m-1, dvrp_host_c, dvrp_username_c, &
    232344                                    dvrp_password_c, dvrp_directory_c, &
    233345                                    dvrp_file_c )
    234     WRITE ( 9, * ) '***  #3'
    235     CALL local_flush( 9 )
    236346
    237347          ELSEIF ( dvrp_output == 'ftp' )  THEN
    238348
    239              dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) )  &
    240                   // '.buildings.dvr'
     349             dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // '.surface.dvr'
    241350             dvrp_file_c = dvrp_file
    242351!             CALL DVRP_OUTPUT_FTP( m-1, 0, dvrp_host_c, dvrp_username_c, &
     
    248357             IF ( dvrp_file(1:9) /= '/dev/null' )  THEN
    249358                dvrp_file_local   = prefix_chr // TRIM( mode_dvrp(m) )  &
    250                      // '.buildings.dvr'
     359                     // '.surface.dvr'
    251360                dvrp_file_local_c = dvrp_file_local
    252361             ELSE
     
    282391                          ycoor_dvrp, zcoor_dvrp )
    283392
    284           tmp_r = 0.8;  tmp_g = 0.7;  tmp_b = 0.6;  tmp_t = 0.0
    285           CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t )
    286     WRITE ( 9, * ) '***  #4'
    287     CALL local_flush( 9 )
    288 
    289 !
    290 !--       Compute and plot isosurface in dvr-format
    291           ALLOCATE( local_pf(nxl:nxr+1,nys:nyn+1,nzb:nz_do3d) )
    292           local_pf = 0.0
    293           DO  i = nxl, nxr+1
    294              DO  j = nys, nyn+1
    295                 IF ( nzb_s_inner(j,i) > 0 )  THEN
    296                       local_pf(i,j,nzb:nzb_s_inner(j,i)) = 1.0
    297                    ENDIF
    298              ENDDO
    299           ENDDO
    300     WRITE ( 9, * ) '***  #4.1'
    301     CALL local_flush( 9 )
    302           CALL DVRP_DATA( m-1, local_pf, 1, nx_dvrp, ny_dvrp, nz_dvrp, &
    303                           cyclic_dvrp, cyclic_dvrp, cyclic_dvrp )
    304     WRITE ( 9, * ) '***  #4.2'
    305     CALL local_flush( 9 )
    306           tmp_th = 1.0
    307           CALL DVRP_THRESHOLD( m-1, tmp_th )
    308     WRITE ( 9, * ) '***  #4.3'
    309     CALL local_flush( 9 )
    310           CALL DVRP_VISUALIZE( m-1, 1, 0 )
    311     WRITE ( 9, * ) '***  #4.4'
    312     CALL local_flush( 9 )
    313 
    314           DEALLOCATE( local_pf )
    315 
    316           CALL DVRP_EXIT( m-1 )
    317     WRITE ( 9, * ) '***  #5'
    318     CALL local_flush( 9 )
    319 
    320 !
    321 !--       Write the surface isosurface on file
    322           CALL DVRP_INIT( m-1, 0 )
    323 
    324 !
    325 !--       Create filename for surface
    326           IF ( dvrp_output == 'rtsp' )  THEN
    327 
    328              dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // '/surface.dvr'
    329              dvrp_file_c = dvrp_file
    330              CALL DVRP_OUTPUT_RTSP( m-1, dvrp_host_c, dvrp_username_c, &
    331                                     dvrp_password_c, dvrp_directory_c, &
    332                                     dvrp_file_c )
    333     WRITE ( 9, * ) '***  #6'
    334     CALL local_flush( 9 )
    335 
    336           ELSEIF ( dvrp_output == 'ftp' )  THEN
    337 
    338              dvrp_file   = prefix_chr // TRIM( mode_dvrp(m) ) // '.surface.dvr'
    339              dvrp_file_c = dvrp_file
    340 !             CALL DVRP_OUTPUT_FTP( m-1, 0, dvrp_host_c, dvrp_username_c, &
    341 !                                   dvrp_password_c, dvrp_directory_c,    &
    342 !                                   dvrp_file_c )
    343 
    344           ELSE
    345 
    346              IF ( dvrp_file(1:9) /= '/dev/null' )  THEN
    347                 dvrp_file_local   = prefix_chr // TRIM( mode_dvrp(m) )  &
    348                      // '.surface.dvr'
    349                 dvrp_file_local_c = dvrp_file_local
    350              ELSE
    351                 dvrp_file_local_c = dvrp_file_c
    352              ENDIF
    353              CALL DVRP_OUTPUT_LOCAL( m-1, 0, dvrp_file_local_c )
    354 
    355           ENDIF
    356 
    357 !
    358 !--       Determine local gridpoint coordinates
    359           IF ( .NOT. allocated )  THEN
    360              ALLOCATE( xcoor_dvrp(nxl:nxr+1), ycoor_dvrp(nys:nyn+1), &
    361                        zcoor_dvrp(nzb:nz_do3d) )
    362              allocated = .TRUE.
    363 
    364              DO  i = nxl, nxr+1
    365                 xcoor_dvrp(i) = i * dx * superelevation_x
    366              ENDDO
    367              DO  j = nys, nyn+1
    368                 ycoor_dvrp(j) = j * dy * superelevation_y
    369              ENDDO
    370              zcoor_dvrp = zu(nzb:nz_do3d) * superelevation
    371              nx_dvrp    = nxr+1 - nxl + 1
    372              ny_dvrp    = nyn+1 - nys + 1
    373              nz_dvrp    = nz_do3d - nzb + 1
    374           ENDIF
    375 
    376 !
    377 !--       Define the grid used by dvrp
    378           CALL DVRP_NO_GLOBAL_GRID( m-1, 1 )
    379           CALL DVRP_GRID( m-1, nx_dvrp, ny_dvrp, nz_dvrp, xcoor_dvrp, &
    380                           ycoor_dvrp, zcoor_dvrp )
    381 
    382393          tmp_r = 0.0;  tmp_g = 0.6;  tmp_b = 0.0;  tmp_t = 0.0
    383394          CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t )
    384     WRITE ( 9, * ) '***  #7'
    385     CALL local_flush( 9 )
    386395
    387396!
     
    395404          tmp_th = 1.0
    396405          CALL DVRP_THRESHOLD( m-1, tmp_th )
    397           CALL DVRP_VISUALIZE( m-1, 1, 0 )
     406
     407!
     408!--       Always reduce the number of polygones
     409          cluster_size_x = 5
     410          cluster_size_y = 5
     411          cluster_size_z = 5
     412          cluster_mode     = 4    ! vertex clustering mode
     413          gradient_normals = 0    ! use flat-shading
     414
     415          CALL DVRP_CLUSTER_SIZE( m-1, cluster_size_x, cluster_size_y, &
     416                                  cluster_size_z )
     417          CALL DVRP_CLUSTERING_MODE( m-1, cluster_mode )
     418          CALL DVRP_GRADIENTNORMALS( m-1, gradient_normals )
     419!
     420!--       Set parameter for vertex clustering mode 4.
     421!--       ATTENTION: A seperate procedure for setting cluster_alpha will be in
     422!--                  the next version of libDVRP (Feb 09)
     423          cluster_alpha = 38.0
     424          CALL DVRP_THRESHOLD( -(m-1)-1, cluster_alpha )
     425
     426          CALL DVRP_VISUALIZE( m-1, 21, 0 )
    398427
    399428          DEALLOCATE( local_pf )
    400429
    401430          CALL DVRP_EXIT( m-1 )
    402     WRITE ( 9, * ) '***  #8'
    403     CALL local_flush( 9 )
    404 
    405431   
    406432!       ENDIF
     
    440466                ENDIF
    441467
    442                 name_c = TRIM( do3d(0,vn) )
    443     WRITE ( 9, * ) '***  #9'
    444     CALL local_flush( 9 )
     468                name_c  = TRIM( do3d(0,vn) )
    445469                tmp_thr = threshold(tv)
    446470                CALL DVRP_STEERING_INIT( m-1, name_c, steering_dvrp(pn)%min, &
    447471                                         steering_dvrp(pn)%max, tmp_thr )
    448     WRITE ( 9, * ) '***  #10'
    449     CALL local_flush( 9 )
    450472
    451473             ELSEIF ( mode_dvrp(pn)(1:6) == 'slicer' )  THEN
     
    490512          ENDDO
    491513
    492     WRITE ( 9, * ) '***  #11'
    493     CALL local_flush( 9 )
    494 
    495514          dvrp_file = prefix_chr // TRIM( mode_dvrp(m) ) // '/*****.dvr'
    496515          dvrp_file_c = dvrp_file
     
    498517                                 dvrp_password_c, dvrp_directory_c, &
    499518                                 dvrp_file_c )
    500     WRITE ( 9, * ) '***  #12'
    501     CALL local_flush( 9 )
    502519
    503520       ELSEIF ( dvrp_output == 'ftp' )  THEN
     
    520537
    521538       ENDIF
    522 
    523 !       dvrp_file = prefix_chr // TRIM( mode_dvrp(m) ) // '.%05d.dvr'  &
    524 !                   // CHAR( 0 )
    525 !       dvrp_file = prefix_chr // TRIM( mode_dvrp(m) ) // '/*****.dvr'  &
    526 !                   // CHAR( 0 )
    527 !       dvrp_file = '/dev/null' // CHAR( 0 )
    528 !       CALL DVRP_OUTPUT_FTP( m-1, 0, dvrp_host, dvrp_username, dvrp_password, &
    529 !                             dvrp_directory, dvrp_file )
    530 !       CALL DVRP_OUTPUT_RTSP( m-1, dvrp_host, dvrp_username, dvrp_password, &
    531 !                              dvrp_directory, dvrp_file )
    532 !       CALL DVRP_OUTPUT_LOCAL( m-1, 0, dvrp_file )
    533539
    534540!
     
    553559!
    554560!--    Define the grid used by dvrp
    555     WRITE ( 9, * ) '***  #13'
    556     CALL local_flush( 9 )
    557 
    558561       IF ( mode_dvrp(m) /= 'pathlines' )  THEN
    559562          CALL DVRP_NO_GLOBAL_GRID( m-1, 1 )
     
    582585
    583586       ENDIF
    584 
    585     WRITE ( 9, * ) '***  #14'
    586     CALL local_flush( 9 )
    587 
    588587
    589588       m = m + 1
     
    617616!
    618617!-- Initialize logging of calls by DVRP graphic software
    619     WRITE ( 9, * ) '*** myid=', myid, ' vor DVRP_LOG_INIT'
    620     CALL local_flush( 9 )
    621618    CALL DVRP_LOG_INIT( 'DVRP_LOG' // CHAR( 0 ), 0 )
    622     WRITE ( 9, * ) '*** myid=', myid, ' nach DVRP_LOG_INIT'
    623     CALL local_flush( 9 )
    624619
    625620!
    626621!-- User-defined logging events: #1 (total time needed by PALM)
    627     WRITE ( 9, * ) '*** myid=', myid, ' vor DVRP_LOG_SYMBOL'
    628     CALL local_flush( 9 )
    629622    CALL DVRP_LOG_SYMBOL( 1, 'PALM_total' // CHAR( 0 ) )
    630     WRITE ( 9, * ) '*** myid=', myid, ' nach DVRP_LOG_SYMBOL'
    631     CALL local_flush( 9 )
    632623    CALL DVRP_LOG_SYMBOL( 2, 'PALM_timestep' // CHAR( 0 ) )
    633     WRITE ( 9, * ) '*** myid=', myid, ' vor DVRP_LOG_EVENT'
    634     CALL local_flush( 9 )
    635624    CALL DVRP_LOG_EVENT( 1, 1 )
    636     WRITE ( 9, * ) '*** myid=', myid, ' nach DVRP_LOG_EVENT'
    637     CALL local_flush( 9 )
    638625
    639626#if defined( __parallel )
     
    642629    CALL local_getenv( 'use_seperate_pe_for_dvrp_output', 31, chr, idummy )
    643630    IF ( chr == 'true' )  THEN
     631
    644632       use_seperate_pe_for_dvrp_output = .TRUE.
    645        WRITE ( 9, * ) '*** myid=', myid, ' vor DVRP_SPLIT'
    646        CALL local_flush( 9 )
    647633
    648634!
     
    663649#endif
    664650
    665        WRITE ( 9, * ) '*** myid=', myid, ' nach DVRP_SPLIT'
    666        CALL local_flush( 9 )
    667651       CALL MPI_COMM_SIZE( comm_palm, numprocs, ierr )
     652
    668653    ENDIF
    669654#endif
Note: See TracChangeset for help on using the changeset viewer.