Changeset 210 for palm/trunk/SOURCE
- Timestamp:
- Nov 6, 2008 8:54:02 AM (16 years ago)
- Location:
- palm/trunk/SOURCE
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/CURRENT_MODIFICATIONS
r209 r210 7 7 (-Y option). Adjustments in mrun, mbuild, and subjob for lcxt4. 8 8 9 DVRP arguments changed to single precision, mode pathlines added 9 10 10 check_for_restart, check_parameters, init_dvrp, init_pegrid, local_stop, modules, palm, surface_coupler, timestep 11 12 check_for_restart, check_parameters, data_output_dvrp, init_dvrp, init_pegrid, local_stop, modules, package_parin, palm, surface_coupler, timestep 11 13 Makefile, mrun, mbuild, subjob 12 14 … … 21 23 ------ 22 24 25 Size of pf3d adjusted to the required output size (1 gridpoint less, along 26 all three dimensions), because output of a subset of the data 27 (pf3d(nxa:nxe...) in the NF90_PUT_VAR statement caused segmentation fault 28 with the INTEL compiler. (combine_plot_fields) 29 23 30 Bugfix: error in zu index in case of section_xy = -1 (header) 24 31 … … 27 34 dwdy, dvdx and dwdx. (production_e) 28 35 29 header, production_e 36 combine_plot_fields, header, production_e -
palm/trunk/SOURCE/data_output_dvrp.f90
r139 r210 32 32 ! Actual revisions: 33 33 ! ----------------- 34 ! 34 ! DVRP arguments changed to single precision, mode pathlines added 35 35 ! TEST: different colours for isosurfaces 36 36 ! TEST: write statements … … 72 72 USE arrays_3d 73 73 USE cloud_parameters 74 USE constants 74 75 USE cpulog 75 76 USE DVRP … … 87 88 CHARACTER (LEN=2) :: section_chr 88 89 CHARACTER (LEN=6) :: output_variable 89 INTEGER :: i, j, k, l, m, n, nn, section_mode, tv, vn 90 INTEGER :: c_mode, c_size_x, c_size_y, c_size_z, gradient_normals, i, j, & 91 k, l, m, n, nn, section_mode, tv, vn 90 92 INTEGER, DIMENSION(:), ALLOCATABLE :: p_c, p_t 91 REAL :: center(3), distance, slicer_position, surface_value 92 REAL, DIMENSION(:), ALLOCATABLE :: psize, p_x, p_y, p_z 93 REAL, DIMENSION(:,:,:), ALLOCATABLE :: local_pf 93 REAL(4) :: center(3), distance, slicer_position, surface_value, & 94 tmp_alpha, tmp_alpha_w, tmp_b, tmp_c_alpha, tmp_g, tmp_norm, & 95 tmp_pos, tmp_r, tmp_t, tmp_th 96 REAL(4), DIMENSION(:), ALLOCATABLE :: psize, p_x, p_y, p_z 97 REAL(4), DIMENSION(:,:,:), ALLOCATABLE :: local_pf 98 REAL(4), DIMENSION(:,:,:,:), ALLOCATABLE :: local_pfi 94 99 95 100 … … 112 117 ! WRITE ( 9, * ) '*** myid=', myid, ' data_output_dvrp: vor steering_update' 113 118 ! CALL local_flush( 9 ) 114 CALL DVRP_STEERING_UPDATE( m-1, data_output_dvrp )119 ! CALL DVRP_STEERING_UPDATE( m-1, data_output_dvrp ) 115 120 ! WRITE ( 9, * ) '*** myid=', myid, ' data_output_dvrp: nach steering_update' 116 121 ! CALL local_flush( 9 ) … … 157 162 ! 158 163 !-- Definition of characteristics of particle material 159 ! CALL DVRP_MATERIAL_RGB( m-1, 1, 0.1, 0.7, 0.1, 0.0 ) 160 CALL DVRP_MATERIAL_RGB( m-1, 1, 0.0, 0.0, 0.0, 0.0 ) 164 ! tmp_r = 0.1; tmp_g = 0.7; tmp_b = 0.1; tmp_t = 0.0 165 tmp_r = 0.0; tmp_g = 0.0; tmp_b = 0.0; tmp_t = 0.0 166 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 161 167 162 168 ! … … 437 443 ! 438 444 !-- Definition of characteristics of isosurface material 439 !-- Preliminary settings for w !445 !-- Preliminary settings for w and pt! 440 446 IF ( output_variable == 'w' ) THEN 441 447 IF ( tv == 1 ) THEN 442 CALL DVRP_MATERIAL_RGB( m-1, 1, 0.8, 0.1, 0.1, 0.0 ) 448 tmp_r = 0.8; tmp_g = 0.1; tmp_b = 0.1; tmp_t = 0.0 449 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 443 450 ELSE 444 CALL DVRP_MATERIAL_RGB( m-1, 1, 0.1, 0.1, 0.8, 0.0 ) 451 tmp_r = 0.1; tmp_g = 0.1; tmp_b = 0.8; tmp_t = 0.0 452 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 445 453 ENDIF 454 ELSEIF ( output_variable == 'pt' ) THEN 455 tmp_r = 0.8; tmp_g = 0.1; tmp_b = 0.1; tmp_t = 0.0 456 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 446 457 ELSE 447 CALL DVRP_MATERIAL_RGB( m-1, 1, 0.9, 0.9, 0.9, 0.0 ) 458 tmp_r = 0.9; tmp_g = 0.9; tmp_b = 0.9; tmp_t = 0.0 459 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 448 460 ENDIF 449 461 … … 452 464 CALL DVRP_DATA( m-1, local_pf, 1, nx_dvrp, ny_dvrp, nz_dvrp, & 453 465 cyclic_dvrp, cyclic_dvrp, cyclic_dvrp ) 454 CALL DVRP_THRESHOLD( m-1, threshold(tv) ) 455 CALL DVRP_VISUALIZE( m-1, 1, dvrp_filecount ) 466 467 c_size_x = vc_size_x; c_size_y = vc_size_y; c_size_z = vc_size_z 468 CALL DVRP_CLUSTER_SIZE( m-1, c_size_x, c_size_y, c_size_z ) 469 470 c_mode = vc_mode 471 CALL DVRP_CLUSTERING_MODE( m-1, c_mode ) 472 473 gradient_normals = vc_gradient_normals 474 CALL DVRP_GRADIENTNORMALS( m-1, gradient_normals ) 475 ! 476 !-- A seperate procedure for setting vc_alpha will be in the next 477 !-- version of libDVRP 478 tmp_c_alpha = vc_alpha 479 CALL DVRP_THRESHOLD( -(m-1)-1, tmp_c_alpha ) 480 481 tmp_th = threshold(tv) 482 CALL DVRP_THRESHOLD( m-1, tmp_th ) 483 CALL DVRP_VISUALIZE( m-1, 21, dvrp_filecount ) 484 456 485 ! WRITE ( 9, * ) '*** myid=', myid, ' data_output_dvrp: ende isosurface' 457 486 ! CALL local_flush( 9 ) … … 469 498 ! 470 499 !-- Material and color definitions 471 CALL DVRP_MATERIAL_RGB( m-1, 1, 0.0, 0.0, 0.0, 0.0 ) 500 tmp_r = 0.0; tmp_g = 0.0; tmp_b = 0.0; tmp_t = 0.0 501 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 472 502 473 503 islice_dvrp = islice_dvrp + 1 … … 487 517 cyclic_dvrp, cyclic_dvrp, cyclic_dvrp ) 488 518 ! CALL DVRP_SLICER( m-1, section_mode, slicer_position ) 489 CALL DVRP_SLICER( m-1, 2, 1.0 ) 519 tmp_pos = 1.0 520 CALL DVRP_SLICER( m-1, 2, tmp_pos ) 490 521 WRITE (9,*) 'nx_dvrp=', nx_dvrp 491 522 WRITE (9,*) 'ny_dvrp=', ny_dvrp … … 505 536 DEALLOCATE( local_pf ) 506 537 538 ELSEIF ( mode_dvrp(m)(1:9) == 'pathlines' ) THEN 539 540 ALLOCATE( local_pfi(4,nxl:nxr+1,nys:nyn+1,nzb:nz_do3d) ) 541 DO i = nxl, nxr+1 542 DO j = nys, nyn+1 543 DO k = nzb, nz_do3d 544 local_pfi(1,i,j,k) = u(k,j,i) 545 local_pfi(2,i,j,k) = v(k,j,i) 546 local_pfi(3,i,j,k) = w(k,j,i) 547 tmp_norm = SQRT( u(k,j,i) * u(k,j,i) + & 548 v(k,j,i) * v(k,j,i) + & 549 w(k,j,i) * w(k,j,i) ) 550 tmp_alpha = ACOS( 0.0 * u(k,j,i) / tmp_norm + & 551 0.0 * v(k,j,i) / tmp_norm - & 552 1.0 * w(k,j,i) / tmp_norm ) 553 tmp_alpha_w = tmp_alpha / pi * 180.0 554 local_pfi(4,i,j,k) = tmp_alpha_w 555 ENDDO 556 ENDDO 557 ENDDO 558 559 CALL cpu_log( log_point_s(31), 'dvrp_pathlines', 'start' ) 560 561 CALL DVRP_DATA( m-1, local_pfi, 4, nx_dvrp, ny_dvrp, nz_dvrp, & 562 cyclic_dvrp, cyclic_dvrp, cyclic_dvrp ) 563 CALL DVRP_VISUALIZE( m-1, 20, dvrp_filecount ) 564 565 CALL cpu_log( log_point_s(31), 'dvrp_pathlines', 'stop' ) 566 567 DEALLOCATE( local_pfi ) 568 507 569 ENDIF 508 570 -
palm/trunk/SOURCE/init_dvrp.f90
r206 r210 4 4 ! Actual revisions: 5 5 ! ----------------- 6 ! 6 ! DVRP arguments changed to single precision, mode pathlines added 7 7 ! TEST: print* statements 8 8 ! ToDo: checking of mode_dvrp for legal values is not correct … … 50 50 USE control_parameters 51 51 52 !53 !-- New coupling54 USE coupling55 56 52 IMPLICIT NONE 57 53 … … 61 57 INTEGER :: i, j, k, l, m, pn, tv, vn 62 58 LOGICAL :: allocated 63 REAL :: center(3), distance 64 65 REAL, DIMENSION(:,:,:), ALLOCATABLE :: local_pf 59 REAL(4) :: center(3), distance, tmp_b, tmp_g, tmp_r, tmp_t, tmp_th, & 60 tmp_thr, tmp_x1, tmp_x2, tmp_y1, tmp_y2, tmp_z1, tmp_z2, & 61 tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6, tmp_7 62 63 REAL(4), DIMENSION(:,:,:), ALLOCATABLE :: local_pf 66 64 67 65 TYPE(CSTRING), SAVE :: dvrp_directory_c, dvrp_file_c, & … … 130 128 IF ( mode_dvrp(m)(1:10) /= 'isosurface' .AND. & 131 129 mode_dvrp(m)(1:6) /= 'slicer' .AND. & 132 mode_dvrp(m)(1:9) /= 'particles' ) THEN 130 mode_dvrp(m)(1:9) /= 'particles' .AND. & 131 mode_dvrp(m)(1:9) /= 'pathlines' ) THEN 133 132 134 133 IF ( myid == 0 ) THEN … … 200 199 ! 201 200 !-- Define bounding box material and create a bounding box 202 CALL DVRP_MATERIAL_RGB( m-1, 1, 0.5, 0.5, 0.5, 0.0 ) 203 CALL DVRP_BOUNDINGBOX( m-1, 1, 0.01, 0.0, 0.0, 0.0, & 204 (nx+1) * dx * superelevation_x, & 205 (ny+1) * dy * superelevation_y, & 206 zu(nz_do3d) * superelevation ) 201 tmp_r = 0.5; tmp_g = 0.5; tmp_b = 0.5; tmp_t = 0.0 202 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 203 204 tmp_1 = 0.01; tmp_2 = 0.0; tmp_3 = 0.0; tmp_4 = 0.0 205 tmp_5 = (nx+1) * dx * superelevation_x 206 tmp_6 = (ny+1) * dy * superelevation_y 207 tmp_7 = zu(nz_do3d) * superelevation 208 CALL DVRP_BOUNDINGBOX( m-1, 1, tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, & 209 tmp_6, tmp_7 ) 207 210 208 211 CALL DVRP_VISUALIZE( m-1, 0, 0 ) … … 272 275 ! 273 276 !-- Define the grid used by dvrp 277 CALL DVRP_NO_GLOBAL_GRID( m-1, 1 ) 274 278 CALL DVRP_GRID( m-1, nx_dvrp, ny_dvrp, nz_dvrp, xcoor_dvrp, & 275 279 ycoor_dvrp, zcoor_dvrp ) 276 CALL DVRP_MATERIAL_RGB( m-1, 1, 0.8, 0.7, 0.6, 0.0 ) 280 281 tmp_r = 0.8; tmp_g = 0.7; tmp_b = 0.6; tmp_t = 0.0 282 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 277 283 WRITE ( 9, * ) '*** #4' 278 284 CALL local_flush( 9 ) … … 295 301 WRITE ( 9, * ) '*** #4.2' 296 302 CALL local_flush( 9 ) 297 CALL DVRP_THRESHOLD( m-1, 1.0 ) 303 tmp_th = 1.0 304 CALL DVRP_THRESHOLD( m-1, tmp_th ) 298 305 WRITE ( 9, * ) '*** #4.3' 299 306 CALL local_flush( 9 ) … … 366 373 ! 367 374 !-- Define the grid used by dvrp 375 CALL DVRP_NO_GLOBAL_GRID( m-1, 1 ) 368 376 CALL DVRP_GRID( m-1, nx_dvrp, ny_dvrp, nz_dvrp, xcoor_dvrp, & 369 377 ycoor_dvrp, zcoor_dvrp ) 370 CALL DVRP_MATERIAL_RGB( m-1, 1, 0.0, 0.6, 0.0, 0.0 ) 378 379 tmp_r = 0.0; tmp_g = 0.6; tmp_b = 0.0; tmp_t = 0.0 380 CALL DVRP_MATERIAL_RGB( m-1, 1, tmp_r, tmp_g, tmp_b, tmp_t ) 371 381 WRITE ( 9, * ) '*** #7' 372 382 CALL local_flush( 9 ) … … 380 390 CALL DVRP_DATA( m-1, local_pf, 1, nx_dvrp, ny_dvrp, nz_dvrp, & 381 391 cyclic_dvrp, cyclic_dvrp, cyclic_dvrp ) 382 CALL DVRP_THRESHOLD( m-1, 1.0 ) 392 tmp_th = 1.0 393 CALL DVRP_THRESHOLD( m-1, tmp_th ) 383 394 CALL DVRP_VISUALIZE( m-1, 1, 0 ) 384 395 … … 429 440 WRITE ( 9, * ) '*** #9' 430 441 CALL local_flush( 9 ) 442 tmp_thr = threshold(tv) 431 443 CALL DVRP_STEERING_INIT( m-1, name_c, steering_dvrp(pn)%min, & 432 steering_dvrp(pn)%max, t hreshold(tv))444 steering_dvrp(pn)%max, tmp_thr ) 433 445 WRITE ( 9, * ) '*** #10' 434 446 CALL local_flush( 9 ) … … 541 553 CALL local_flush( 9 ) 542 554 555 IF ( mode_dvrp(m) /= 'pathlines' ) THEN 556 CALL DVRP_NO_GLOBAL_GRID( m-1, 1 ) 557 ENDIF 543 558 CALL DVRP_GRID( m-1, nx_dvrp, ny_dvrp, nz_dvrp, xcoor_dvrp, ycoor_dvrp, & 544 559 zcoor_dvrp ) 560 561 IF ( mode_dvrp(m) == 'pathlines' ) THEN 562 563 tmp_x1 = 0.0; tmp_y1 = 0.0; tmp_z1 = 0.0 564 tmp_x2 = 1.0; tmp_y2 = 1.0; tmp_z2 = 0.3 565 CALL DVRP_CUBIC_SEEDING( m-1, tmp_x1, tmp_y1, tmp_z1, tmp_x2, tmp_y2,& 566 tmp_z2, pathlines_linecount, 2, 0 ) 567 ! 568 !-- Set wavecount and wavetime 569 CALL DVRP_PATHLINES_BEHAVIOUR_WAVE( m-1, pathlines_wavecount, & 570 pathlines_wavetime, & 571 pathlines_fadeintime, & 572 pathlines_fadeouttime ) 573 ! 574 !-- Set pathline length 575 CALL DVRP_PATHLINES_SETMAXHISTORY( m-1, pathlines_maxhistory ) 576 CALL DVRP_PATHLINES_SETFADING( m-1, 1, 0.0 ) 577 578 CALL DVRP_INIT_PATHLINES( m-1, 0 ) 579 580 ENDIF 581 545 582 WRITE ( 9, * ) '*** #14' 546 583 CALL local_flush( 9 ) … … 566 603 #if defined( __dvrp_graphics ) 567 604 605 USE control_parameters 568 606 USE dvrp_variables 569 607 USE pegrid … … 602 640 IF ( chr == 'true' ) THEN 603 641 use_seperate_pe_for_dvrp_output = .TRUE. 604 WRITE ( 9, * ) '*** myid=', myid, ' vor DVRP_SPLIT'605 CALL local_flush( 9 )606 607 ! 608 !-- Adjustment for new MPI-1 coupling. This might be unnecessary.642 WRITE ( 9, * ) '*** myid=', myid, ' vor DVRP_SPLIT' 643 CALL local_flush( 9 ) 644 645 ! 646 !-- Adjustment for new MPI-1 coupling. This might be unnecessary. 609 647 #if defined( __mpi2 ) 610 648 CALL DVRP_SPLIT( MPI_COMM_WORLD, comm_palm ) 611 649 #else 612 IF ( coupling_mode /= 'uncoupled' ) THEN 613 CALL DVRP_SPLIT( comm_inter, comm_palm ) 614 ELSE 615 CALL DVRP_SPLIT( MPI_COMM_WORLD, comm_palm ) 616 ENDIF 650 IF ( coupling_mode /= 'uncoupled' ) THEN 651 IF ( myid == 0 ) THEN 652 PRINT*, '+++ init_dvrp: split of communicator not realized with', & 653 ' MPI1 coupling atmosphere-ocean' 654 ENDIF 655 CALL local_stop 656 ! CALL DVRP_SPLIT( comm_inter, comm_palm ) 657 ELSE 658 CALL DVRP_SPLIT( MPI_COMM_WORLD, comm_palm ) 659 ENDIF 617 660 #endif 618 661 619 WRITE ( 9, * ) '*** myid=', myid, ' nach DVRP_SPLIT'620 CALL local_flush( 9 )662 WRITE ( 9, * ) '*** myid=', myid, ' nach DVRP_SPLIT' 663 CALL local_flush( 9 ) 621 664 CALL MPI_COMM_SIZE( comm_palm, numprocs, ierr ) 622 665 ENDIF -
palm/trunk/SOURCE/modules.f90
r206 r210 5 5 ! Actual revisions: 6 6 ! ----------------- 7 ! +target_id 7 ! some dvrp-variables changed to single precision, variables for dvrp-mode 8 ! pathlines added, +target_id 8 9 ! 9 10 ! Former revisions: … … 521 522 dvrp_username = ' ' 522 523 523 INTEGER :: dvrp_colourtable_entries = 4, islice_dvrp, nx_dvrp, ny_dvrp, & 524 nz_dvrp 524 INTEGER :: dvrp_colourtable_entries = 4, islice_dvrp, nx_dvrp, ny_dvrp, & 525 nz_dvrp, pathlines_fadeintime = 5, pathlines_fadeouttime = 5, & 526 pathlines_linecount = 1000, pathlines_maxhistory = 40, & 527 pathlines_wavecount = 10, pathlines_wavetime = 50, & 528 vc_gradient_normals = 0, vc_mode = 0, vc_size_x = 2, & 529 vc_size_y = 2, vc_size_z = 2 525 530 526 531 INTEGER, DIMENSION(10) :: slicer_position_dvrp … … 530 535 531 536 REAL :: superelevation = 1.0, superelevation_x = 1.0, & 532 superelevation_y = 1.0 537 superelevation_y = 1.0, vc_alpha = 38.0 533 538 534 539 #if defined( __decalpha ) … … 538 543 -1.0, 1.0, -1.0, 1.0 /) 539 544 540 REAL , DIMENSION(2,100) :: interval_values_dvrp, interval_h_dvrp =&541 (/ 270.0, 225.0, 225.0, 180.0, 70.0, 25.0,&542 25.0, -25.0, ( 0.0, i9 = 1, 192 ) /),&543 interval_l_dvrp = 0.5, interval_s_dvrp = 1.0,&544 interval_a_dvrp = 0.0545 REAL/4), DIMENSION(2,100) :: interval_values_dvrp, interval_h_dvrp = & 546 (/ 270.0, 225.0, 225.0, 180.0, 70.0, 25.0, & 547 25.0, -25.0, ( 0.0, i9 = 1, 192 ) /), & 548 interval_l_dvrp = 0.5, interval_s_dvrp = 1.0,& 549 interval_a_dvrp = 0.0 545 550 #else 546 551 REAL, DIMENSION(2,10) :: slicer_range_limits_dvrp 547 552 548 REAL , DIMENSION(2,100) :: interval_values_dvrp, interval_h_dvrp,&549 interval_l_dvrp = 0.5, interval_s_dvrp = 1.0,&550 interval_a_dvrp = 0.0553 REAL(4), DIMENSION(2,100) :: interval_values_dvrp, interval_h_dvrp, & 554 interval_l_dvrp = 0.5, interval_s_dvrp = 1.0,& 555 interval_a_dvrp = 0.0 551 556 552 557 DATA slicer_range_limits_dvrp / -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, & … … 559 564 #endif 560 565 561 REAL , DIMENSION(:), ALLOCATABLE :: xcoor_dvrp, ycoor_dvrp, zcoor_dvrp566 REAL(4), DIMENSION(:), ALLOCATABLE :: xcoor_dvrp, ycoor_dvrp, zcoor_dvrp 562 567 563 568 TYPE steering 564 569 CHARACTER (LEN=20) :: name 565 REAL 570 REAL(4) :: min, max 566 571 INTEGER :: imin, imax 567 572 END TYPE steering -
palm/trunk/SOURCE/package_parin.f90
r139 r210 4 4 ! Actual revisions: 5 5 ! ----------------- 6 ! 6 ! Variables for dvrp-mode pathlines added 7 7 ! 8 8 ! Former revisions: … … 14 14 ! 15 15 ! 60 2007-03-11 11:50:04Z raasch 16 ! Particles-pac lage is now part of the default code16 ! Particles-package is now part of the default code 17 17 ! 18 18 ! RCS Log replace by Id keyword, revision history cleaned up … … 44 44 dvrp_host, dvrp_output, dvrp_password, & 45 45 dvrp_username, mode_dvrp, & 46 pathlines_fadeintime, pathlines_fadeouttime, & 47 pathlines_linecount, pathlines_maxhistory, & 48 pathlines_wavecount, pathlines_wavetime, & 46 49 slicer_range_limits_dvrp, superelevation, & 47 superelevation_x, superelevation_y, threshold 50 superelevation_x, superelevation_y, & 51 threshold, vc_alpha, vc_gradient_normals, & 52 vc_mode, vc_size_x, vc_size_y, vc_size_z 48 53 NAMELIST /particles_par/ bc_par_b, bc_par_lr, bc_par_ns, bc_par_t, & 49 54 density_ratio, radius, dt_dopts, &
Note: See TracChangeset
for help on using the changeset viewer.