Ignore:
Timestamp:
May 31, 2014 11:19:48 AM (7 years ago)
Author:
gronemeier
Message:

Bugfix: first and last grid points as they appear in 3D volume data can now be included to masked data output

File:
1 edited

Legend:

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

    r1354 r1414  
    2020! Current revisions:
    2121! -----------------
    22 !
     22! Bugfix: first and last grid points as they appear in 3D volume data can now
     23! be included to masked data output
    2324!
    2425! Former revisions:
     
    125126!
    126127!-- Allocation and initialization
    127     ALLOCATE( tmp_array( MAX(nx,ny,nz)+1 ) )
    128 
    129     ALLOCATE( mask_i(max_masks,nxr-nxl+1), &
    130               mask_j(max_masks,nyn-nys+1), &
    131               mask_k(max_masks,nzt-nzb+1) )
     128    ALLOCATE( tmp_array( MAX(nx,ny,nz)+2 ) )
     129
     130    ALLOCATE( mask_i(max_masks,nxr-nxl+2), &
     131              mask_j(max_masks,nyn-nys+2), &
     132              mask_k(max_masks,nzt-nzb+2) )
    132133!
    133134!-- internal mask arrays ("mask,dimension,selection")
     
    183184!-- Global arrays are required by define_netcdf_header.
    184185    IF ( myid == 0  .OR.  netcdf_data_format > 4 )  THEN
    185        ALLOCATE( mask_i_global(max_masks,nx+1), &
    186                  mask_j_global(max_masks,ny+1), &
    187                  mask_k_global(max_masks,nz+1) )
     186       ALLOCATE( mask_i_global(max_masks,nx+2), &
     187                 mask_j_global(max_masks,ny+2), &
     188                 mask_k_global(max_masks,nz+2) )
    188189       mask_i_global = -1; mask_j_global = -1; mask_k_global = -1
    189190    ENDIF
     
    469470       IF ( netcdf_data_format > 4 )  THEN
    470471         
    471           CALL MPI_BCAST( mask_i_global(mid,:), nx+1, MPI_INTEGER, 0, comm2d, &
     472          CALL MPI_BCAST( mask_i_global(mid,:), nx+2, MPI_INTEGER, 0, comm2d, &
    472473                          ierr )
    473           CALL MPI_BCAST( mask_j_global(mid,:), ny+1, MPI_INTEGER, 0, comm2d, &
     474          CALL MPI_BCAST( mask_j_global(mid,:), ny+2, MPI_INTEGER, 0, comm2d, &
    474475                          ierr )
    475           CALL MPI_BCAST( mask_k_global(mid,:), nz+1, MPI_INTEGER, 0, comm2d, &
     476          CALL MPI_BCAST( mask_k_global(mid,:), nz+2, MPI_INTEGER, 0, comm2d, &
    476477                          ierr )
    477478         
     
    537538             IF ( dim == 1 .OR. dim == 2 )  THEN
    538539                m = NINT( mask(mid,dim,count) * mask_scale(dim) * ddxyz - 0.5_wp )
     540                IF ( m < 0 )  m = 0  ! avoid negative values
    539541             ELSEIF ( dim == 3 )  THEN
    540542                ind_array =  &
     
    542544                m = ind_array(1) - 1 + nzb  ! MINLOC uses lower array bound 1
    543545             ENDIF
    544              IF ( m > nxyz )  THEN
     546             IF ( m > (nxyz+1) )  THEN
    545547                WRITE ( message_string, '(I3,A,I3,A,I1,3A,I3)' )  &
    546548                     m,' in mask ',mid,' along dimension ',dim,  &
    547                      ' exceeds ',nxyz_string,' = ',nxyz
     549                     ' exceeds (',nxyz_string,'+1) = ',nxyz+1
    548550                CALL message( 'init_masks', 'PA0331', 1, 2, 0, 6, 0 )
    549551             ENDIF
    550              IF ( m >= lb .AND. m <= ub )  THEN
     552             IF ( ( m >= lb .AND. m <= ub ) .OR.     &
     553                  ( m == (nxyz+1) .AND. ub == nxyz )  )  THEN
    551554                IF ( count_l == 0 )  mask_start_l(mid,dim) = count
    552555                count_l = count_l + 1
     
    575578             IF ( mask_loop(mid,dim,2) < 0.0_wp )  THEN
    576579                tmp2 = mask_loop(mid,dim,2)
    577                 mask_loop(mid,dim,2) = nxyz*dxyz / mask_scale(dim)   ! (default)
     580                mask_loop(mid,dim,2) = (nxyz+1)*dxyz / mask_scale(dim)   ! (default)
    578581             ENDIF
    579582             IF ( MAXVAL( mask_loop(mid,dim,1:2) )  &
    580                   > nxyz * dxyz / mask_scale(dim) )  THEN
     583                  > (nxyz+1) * dxyz / mask_scale(dim) )  THEN
    581584                WRITE ( message_string, '(2(A,I3,A,I1,A,F9.3),5A,I1,A,F9.3)' ) &
    582585                     'mask_loop(',mid,',',dim,',1)=',mask_loop(mid,dim,1), &
    583586                     ' and/or mask_loop(',mid,',',dim,',2)=', &
    584                      mask_loop(mid,dim,2),'&exceed ', &
    585                      nxyz_string,'*',dxyz_string,'/mask_scale(',dim,')=', &
    586                      nxyz*dxyz/mask_scale(dim)
     587                     mask_loop(mid,dim,2),'&exceed (', &
     588                     nxyz_string,'+1)*',dxyz_string,'/mask_scale(',dim,')=', &
     589                     (nxyz+1)*dxyz/mask_scale(dim)
    587590                CALL message( 'init_masks', 'PA0332', 1, 2, 0, 6, 0 )
    588591             ENDIF
     
    593596             loop_stride = NINT( mask_loop(mid,dim,3) * mask_scale(dim) &
    594597                  * ddxyz )
     598             IF ( loop_begin == -1 )  loop_begin = 0  ! avoid negative values
    595599          ELSEIF ( dim == 3 )  THEN
    596600             IF ( mask_loop(mid,dim,2) < 0.0_wp )  THEN
    597601                tmp2 = mask_loop(mid,dim,2)
    598                 mask_loop(mid,dim,2) = zu(nz) / mask_scale(dim)   ! (default)
     602                mask_loop(mid,dim,2) = zu(nz+1) / mask_scale(dim)   ! (default)
    599603             ENDIF
    600604             IF ( MAXVAL( mask_loop(mid,dim,1:2) )  &
    601                   > zu(nz) / mask_scale(dim) )  THEN
     605                  > zu(nz+1) / mask_scale(dim) )  THEN
    602606                WRITE ( message_string, '(2(A,I3,A,I1,A,F9.3),A,I1,A,F9.3)' ) &
    603607                     'mask_loop(',mid,',',dim,',1)=',mask_loop(mid,dim,1), &
    604608                     ' and/or mask_loop(',mid,',',dim,',2)=', &
    605                      mask_loop(mid,dim,2),'&exceed zu(nz)/mask_scale(',dim, &
    606                      ')=',zu(nz)/mask_scale(dim)
     609                     mask_loop(mid,dim,2),'&exceed zu(nz+1)/mask_scale(',dim, &
     610                     ')=',zu(nz+1)/mask_scale(dim)
    607611                CALL message( 'init_masks', 'PA0333', 1, 2, 0, 6, 0 )
    608612             ENDIF
     
    648652          DO  m = loop_begin, loop_end, loop_stride
    649653             count = count + 1
    650              IF ( m >= lb  .AND.  m <= ub )  THEN
     654             IF ( ( m >= lb  .AND.  m <= ub ) .OR.   &
     655                  ( m == (nxyz+1) .AND. ub == nxyz )  )  THEN
    651656                IF ( count_l == 0 )  mask_start_l(mid,dim) = count
    652657                count_l = count_l + 1
     
    662667          mask_size(mid,dim)   = count
    663668          mask_size_l(mid,dim) = count_l
     669
    664670       ENDIF
    665671
Note: See TracChangeset for help on using the changeset viewer.