Changeset 3065 for palm/trunk/SOURCE


Ignore:
Timestamp:
Jun 12, 2018 7:03:02 AM (6 years ago)
Author:
Giersch
Message:

New vertical stretching procedure has been introduced

Location:
palm/trunk/SOURCE
Files:
21 edited

Legend:

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

    r3049 r3065  
    2525! -----------------
    2626! $Id$
     27! dz was replaced by dz(1), error message revised
     28!
     29! 3049 2018-05-29 13:52:36Z Giersch
    2730! add variable description
    2831!
     
    41784181    IF ( ( constant_flux_layer .OR.  &
    41794182           INDEX( initializing_actions, 'set_1d-model_profiles' ) /= 0 )       &
    4180          .AND. roughness_length >= 0.5 * dz )  THEN
     4183         .AND. roughness_length >= 0.5 * dz(1) )  THEN
    41814184       message_string = 'roughness_length must be smaller than dz/2'
    41824185       CALL message( 'check_parameters', 'PA0424', 1, 2, 0, 6, 0 )
     
    41984201!-- Check if vertical grid stretching is switched off in case of complex
    41994202!-- terrain simulations
    4200     IF ( complex_terrain  .AND.  dz_stretch_level < 100000.0_wp )  THEN
     4203    IF ( complex_terrain  .AND.                                                &
     4204         ANY( dz_stretch_level_start /= -9999999.9_wp ) )  THEN
    42014205       message_string = 'Vertical grid stretching is not allowed for ' //      &
    42024206                        'complex_terrain = .T.'
  • palm/trunk/SOURCE/header.f90

    r3045 r3065  
    2525! -----------------
    2626! $Id$
     27! Header output concerning stretching revised
     28!
     29! 3045 2018-05-28 07:55:41Z Giersch
    2730! Error messages revised
    2831!
     
    800803!-- Computational grid
    801804    IF ( .NOT. ocean )  THEN
    802        WRITE ( io, 250 )  dx, dy, dz, (nx+1)*dx, (ny+1)*dy, zu(nzt+1)
    803        IF ( dz_stretch_level_index < nzt+1 )  THEN
    804           WRITE ( io, 252 )  dz_stretch_level, dz_stretch_level_index, &
    805                              dz_stretch_factor, dz_max
    806        ENDIF
     805       WRITE ( io, 250 )  dx, dy
     806       
     807       DO i = 1, number_stretch_level_start+1
     808          WRITE ( io, 253 )  i, dz(i)
     809       ENDDO
     810       
     811       WRITE( io, 251 ) (nx+1)*dx, (ny+1)*dy, zu(nzt+1)
     812       
     813       IF ( ANY( dz_stretch_level_start_index < nzt+1 ) )  THEN
     814          WRITE( io, '(A)', advance='no') ' Vertical stretching starts at height:'
     815          DO i = 1, number_stretch_level_start
     816             WRITE ( io, '(F10.1,A3)', advance='no' )  dz_stretch_level_start(i), ' m,'
     817          ENDDO
     818          WRITE( io, '(/,A)', advance='no') ' Vertical stretching starts at index: '
     819          DO i = 1, number_stretch_level_start
     820             WRITE ( io, '(I12,A1)', advance='no' )  dz_stretch_level_start_index(i), ','
     821          ENDDO
     822          WRITE( io, '(/,A)', advance='no') ' Vertical stretching ends at height:  '
     823          DO i = 1, number_stretch_level_start
     824             WRITE ( io, '(F10.1,A3)', advance='no' )  dz_stretch_level_end(i), ' m,'
     825          ENDDO
     826          WRITE( io, '(/,A)', advance='no') ' Vertical stretching ends at index:   '
     827          DO i = 1, number_stretch_level_start
     828             WRITE ( io, '(I12,A1)', advance='no' )  dz_stretch_level_end_index(i), ','
     829          ENDDO
     830          WRITE( io, '(/,A)', advance='no') ' Factor used for stretching:          '
     831          DO i = 1, number_stretch_level_start
     832             WRITE ( io, '(F12.3,A1)', advance='no' )  dz_stretch_factor_array(i), ','
     833          ENDDO
     834       ENDIF
     835       
    807836    ELSE
    808        WRITE ( io, 250 )  dx, dy, dz, (nx+1)*dx, (ny+1)*dy, zu(0)
    809        IF ( dz_stretch_level_index > 0 )  THEN
    810           WRITE ( io, 252 )  dz_stretch_level, dz_stretch_level_index, &
    811                              dz_stretch_factor, dz_max
    812        ENDIF
    813     ENDIF
    814     WRITE ( io, 254 )  nx, ny, nzt+1, MIN( nnx, nx+1 ), MIN( nny, ny+1 ), &
     837       WRITE ( io, 250 )  dx, dy
     838       DO i = 1, number_stretch_level_start+1
     839          WRITE ( io, 253 )  i, dz(i)
     840       ENDDO
     841       
     842       WRITE ( io, 251 ) (nx+1)*dx, (ny+1)*dy, zu(0)
     843       
     844       IF ( ANY( dz_stretch_level_start_index > 0 ) )  THEN
     845          WRITE( io, '(A)', advance='no') ' Vertical stretching starts at height:'
     846          DO i = 1, number_stretch_level_start
     847             WRITE ( io, '(F10.1,A3)', advance='no' )  dz_stretch_level_start(i), ' m,'
     848          ENDDO
     849          WRITE( io, '(/,A)', advance='no') ' Vertical stretching starts at index: '
     850          DO i = 1, number_stretch_level_start
     851             WRITE ( io, '(I12,A1)', advance='no' )  dz_stretch_level_start_index(i), ','
     852          ENDDO
     853          WRITE( io, '(/,A)', advance='no') ' Vertical stretching ends at height:  '
     854          DO i = 1, number_stretch_level_start
     855             WRITE ( io, '(F10.1,A3)', advance='no' )  dz_stretch_level_end(i), ' m,'
     856          ENDDO
     857          WRITE( io, '(/,A)', advance='no') ' Vertical stretching ends at index:   '
     858          DO i = 1, number_stretch_level_start
     859             WRITE ( io, '(I12,A1)', advance='no' )  dz_stretch_level_end_index(i), ','
     860          ENDDO
     861          WRITE( io, '(/,A)', advance='no') ' Factor used for stretching:          '
     862          DO i = 1, number_stretch_level_start
     863             WRITE ( io, '(F12.3,A1)', advance='no' )  dz_stretch_factor_array(i), ','
     864          ENDDO
     865       ENDIF
     866    ENDIF
     867    WRITE ( io, 254 )  nx, ny, nzt+1, MIN( nnx, nx+1 ), MIN( nny, ny+1 ),      &
    815868                       MIN( nnz+2, nzt+2 )
    816869    IF ( sloping_surface )  WRITE ( io, 260 )  alpha_surface
     
    20832136250 FORMAT (//' Computational grid and domain size:'/ &
    20842137              ' ----------------------------------'// &
    2085               ' Grid length:      dx =    ',F7.3,' m    dy =    ',F7.3, &
    2086               ' m    dz =    ',F7.3,' m'/ &
    2087               ' Domain size:       x = ',F10.3,' m     y = ',F10.3, &
     2138              ' Grid length:      dx =    ',F8.3,' m    dy =    ',F8.3, ' m')
     2139251 FORMAT (  /' Domain size:       x = ',F10.3,' m     y = ',F10.3, &
    20882140              ' m  z(u) = ',F10.3,' m'/)
    2089 252 FORMAT (' dz constant up to ',F10.3,' m (k=',I4,'), then stretched by', &
    2090               ' factor:',F6.3/ &
    2091             ' maximum dz not to be exceeded is dz_max = ',F10.3,' m'/)
    2092 254 FORMAT (' Number of gridpoints (x,y,z):  (0:',I4,', 0:',I4,', 0:',I4,')'/ &
     2141253 FORMAT ( '                dz(',I1,') =    ', F8.3, ' m')
     2142254 FORMAT (//' Number of gridpoints (x,y,z):  (0:',I4,', 0:',I4,', 0:',I4,')'/ &
    20932143            ' Subdomain size (x,y,z):        (  ',I4,',   ',I4,',   ',I4,')'/)
    20942144260 FORMAT (/' The model has a slope in x-direction. Inclination angle: ',F6.2,&
  • palm/trunk/SOURCE/init_grid.f90

    r3051 r3065  
    2525! -----------------
    2626! $Id$
     27! New vertical stretching mechanism introduced
     28!
     29! 3051 2018-05-30 17:43:55Z suehring
    2730! Minor bugfix concerning mapping 3D buildings on top of terrain
    2831!
     
    325328               canyon_height, canyon_wall_left, canyon_wall_south,             &
    326329               canyon_width_x, canyon_width_y, constant_flux_layer,            &
    327                dp_level_ind_b, dz, dz_max, dz_stretch_factor,                  &
    328                dz_stretch_level, dz_stretch_level_index, grid_level,           &
     330               dp_level_ind_b, dz, dz_max, dz_stretch_factor,                  &   
     331               dz_stretch_factor_array, dz_stretch_level, dz_stretch_level_end,&
     332               dz_stretch_level_end_index, dz_stretch_level_start_index,       &
     333               dz_stretch_level_start, grid_level,                             &
    329334               force_bound_l, force_bound_r, force_bound_n, force_bound_s,     &
    330335               ibc_uv_b, inflow_l, inflow_n, inflow_r, inflow_s,               &
    331336               masking_method, maximum_grid_level, message_string,             &
    332                momentum_advec, nest_domain, nest_bound_l, nest_bound_n,        &
    333                nest_bound_r, nest_bound_s, ocean, outflow_l, outflow_n,        &
    334                outflow_r, outflow_s, psolver, scalar_advec, topography,        &
    335                topography_grid_convention, tunnel_height, tunnel_length,       &
    336                tunnel_width_x, tunnel_width_y, tunnel_wall_depth,              &
    337                use_surface_fluxes, use_top_fluxes, wall_adjustment_factor
     337               momentum_advec, nest_domain, nest_bound_l,                      &
     338               nest_bound_n, nest_bound_r, nest_bound_s,                       &
     339               number_stretch_level_end, number_stretch_level_start, ocean,    &
     340               outflow_l, outflow_n, outflow_r, outflow_s, psolver,            &
     341               scalar_advec, topography, topography_grid_convention,           &
     342               tunnel_height, tunnel_length, tunnel_width_x, tunnel_width_y,   &
     343               tunnel_wall_depth, use_surface_fluxes, use_top_fluxes,          &
     344               wall_adjustment_factor
    338345         
    339346    USE grid_variables,                                                        &
     
    361368    IMPLICIT NONE
    362369
    363     INTEGER(iwp) ::  i                !< index variable along x
    364     INTEGER(iwp) ::  j                !< index variable along y
    365     INTEGER(iwp) ::  k                !< index variable along z
    366     INTEGER(iwp) ::  k_top            !< topography top index on local PE
    367     INTEGER(iwp) ::  l                !< loop variable
    368     INTEGER(iwp) ::  nzb_local_max    !< vertical grid index of maximum topography height
    369     INTEGER(iwp) ::  nzb_local_min    !< vertical grid index of minimum topography height
     370    INTEGER(iwp) ::  i                           !< index variable along x
     371    INTEGER(iwp) ::  j                           !< index variable along y
     372    INTEGER(iwp) ::  k                           !< index variable along z
     373    INTEGER(iwp) ::  k_top                       !< topography top index on local PE
     374    INTEGER(iwp) ::  n                           !< loop variable for stretching
     375    INTEGER(iwp) ::  number_dz                   !< number of user-specified dz values       
     376    INTEGER(iwp) ::  nzb_local_max               !< vertical grid index of maximum topography height
     377    INTEGER(iwp) ::  nzb_local_min               !< vertical grid index of minimum topography height
    370378                                     
    371     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nzb_local      !< index for topography top at cell-center
    372     INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nzb_tmp        !< dummy to calculate topography indices on u- and v-grid
     379    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nzb_local  !< index for topography top at cell-center
     380    INTEGER(iwp), DIMENSION(:,:), ALLOCATABLE ::  nzb_tmp    !< dummy to calculate topography indices on u- and v-grid
    373381
    374382    INTEGER(iwp), DIMENSION(:,:,:), ALLOCATABLE ::  topo !< input array for 3D topography and dummy array for setting "outer"-flags
    375383
     384    REAL(wp) ::  dz_level_end  !< distance between calculated height level for u/v-grid and user-specified end level for stretching
    376385    REAL(wp) ::  dz_stretched  !< stretched vertical grid spacing
     386   
     387    REAL(wp), DIMENSION(:), ALLOCATABLE ::  min_dz_stretch_level_end !< Array that contains all minimum heights where the stretching can end
    377388
    378389
     
    391402!
    392403!-- Compute height of u-levels from constant grid length and dz stretch factors
    393     IF ( dz == -1.0_wp )  THEN
     404    IF ( dz(1) == -1.0_wp )  THEN
    394405       message_string = 'missing dz'
    395406       CALL message( 'init_grid', 'PA0200', 1, 2, 0, 6, 0 )
    396     ELSEIF ( dz <= 0.0_wp )  THEN
    397        WRITE( message_string, * ) 'dz=',dz,' <= 0.0'
     407    ELSEIF ( dz(1) <= 0.0_wp )  THEN
     408       WRITE( message_string, * ) 'dz=',dz(1),' <= 0.0'
    398409       CALL message( 'init_grid', 'PA0201', 1, 2, 0, 6, 0 )
    399410    ENDIF
    400411
    401412!
     413!-- Initialize dz_stretch_level_start with the value of dz_stretch_level
     414!-- if it was set by the user
     415    IF ( dz_stretch_level /= -9999999.9_wp ) THEN
     416       dz_stretch_level_start(1) = dz_stretch_level
     417    ENDIF
     418       
     419!
     420!-- Determine number of dz values and stretching levels specified by the
     421!-- user to allow right controlling of the stretching mechanism and to
     422!-- perform error checks
     423    number_dz = COUNT( dz /= -1.0_wp )
     424    number_stretch_level_start = COUNT( dz_stretch_level_start /=              &
     425                                       -9999999.9_wp )
     426    number_stretch_level_end = COUNT( dz_stretch_level_end /=                  &
     427                                      9999999.9_wp )
     428
     429!
     430!-- The number of specified end levels +1 has to be the same than the number
     431!-- of specified dz values
     432    IF ( number_dz /= number_stretch_level_end + 1 ) THEN
     433       WRITE( message_string, * ) 'The number of values for dz = ',         &
     434                                   number_dz, 'has to be the same than& ',  &
     435                                   'the number of values for ',             &
     436                                   'dz_stretch_level_end + 1 = ',           &
     437                                   number_stretch_level_end+1
     438          CALL message( 'init_grid', 'PA0156', 1, 2, 0, 6, 0 )
     439    ENDIF
     440   
     441!
     442!--    The number of specified start levels has to be the same or one less than
     443!--    the number of specified dz values
     444    IF ( number_dz /= number_stretch_level_start + 1 .AND.                  &
     445         number_dz /= number_stretch_level_start ) THEN
     446       WRITE( message_string, * ) 'The number of values for dz = ',         &
     447                                   number_dz, 'has to be the same or one ', &
     448                                   'more than& the number of values for ',  &
     449                                   'dz_stretch_level_start = ',             &
     450                                   number_stretch_level_start
     451          CALL message( 'init_grid', 'PA0211', 1, 2, 0, 6, 0 )
     452    ENDIF
     453   
     454!--    The number of specified start levels has to be the same or one more than
     455!--    the number of specified end levels
     456    IF ( number_stretch_level_start /= number_stretch_level_end + 1 .AND.   &
     457         number_stretch_level_start /= number_stretch_level_end ) THEN
     458       WRITE( message_string, * ) 'The number of values for ',              &
     459                                  'dz_stretch_level_start = ',              &
     460                                   dz_stretch_level_start, 'has to be the ',&
     461                                   'same or one more than& the number of ', &
     462                                   'values for dz_stretch_level_end = ',    &
     463                                   number_stretch_level_end
     464          CALL message( 'init_grid', 'PA0216', 1, 2, 0, 6, 0 )
     465    ENDIF
     466
     467!
     468!-- Initialize dz for the free atmosphere with the value of dz_max
     469    IF ( dz(number_stretch_level_start+1) == -1.0_wp .AND.                     &
     470         number_stretch_level_start /= 0 ) THEN
     471       dz(number_stretch_level_start+1) = dz_max
     472    ENDIF
     473       
     474!
     475!-- Initialize the stretching factor if (infinitely) stretching in the free
     476!-- atmosphere is desired (dz_stretch_level_end was not specified for the
     477!-- free atmosphere)
     478    IF ( number_stretch_level_start == number_stretch_level_end + 1 ) THEN
     479       dz_stretch_factor_array(number_stretch_level_start) =                   &
     480       dz_stretch_factor
     481    ENDIF
     482   
     483!
     484!-- Allocation of arrays for stretching
     485    ALLOCATE( min_dz_stretch_level_end(number_stretch_level_start) )
     486   
     487!
    402488!-- Define the vertical grid levels
    403489    IF ( .NOT. ocean )  THEN
     490   
     491!
     492!--    The stretching region has to be large enough to allow for a smooth
     493!--    transition between two different grid spacings
     494       DO n = 1, number_stretch_level_start
     495          min_dz_stretch_level_end(n) = dz_stretch_level_start(n) +            &
     496                                        4 * MAX( dz(n),dz(n+1) )
     497       ENDDO
     498
     499       IF ( ANY( min_dz_stretch_level_end > dz_stretch_level_end ) ) THEN
     500             message_string= 'Eeach dz_stretch_level_end has to be larger ' // &
     501                             'than its corresponding value for &' //           &
     502                             'dz_stretch_level_start + 4*MAX(dz(n),dz(n+1)) '//&
     503                             'to allow for smooth grid stretching'
     504             CALL message( 'init_grid', 'PA0224', 1, 2, 0, 6, 0 )
     505       ENDIF
     506       
     507!
     508!--    Stretching must not be applied within the prandtl_layer
     509!--    (first two grid points). For the default case dz_stretch_level_start
     510!--    is negative. Therefore the absolut value is checked here.
     511       IF ( ANY( ABS( dz_stretch_level_start ) < dz(1) * 1.5_wp ) ) THEN
     512          WRITE( message_string, * ) 'Eeach dz_stretch_level_start has to be ',&
     513                                     'larger than ', dz(1) * 1.5
     514             CALL message( 'init_grid', 'PA0226', 1, 2, 0, 6, 0 )
     515       ENDIF
     516
     517!
     518!--    The stretching has to start and end on a grid level. Therefore
     519!--    user-specified values have to ''interpolate'' to the next lowest level
     520       IF ( number_stretch_level_start /= 0 ) THEN
     521          dz_stretch_level_start(1) = INT( (dz_stretch_level_start(1) -        &
     522                                            dz(1)/2.0) / dz(1) )               &
     523                                      * dz(1) + dz(1)/2.0
     524       ENDIF
     525       
     526       IF ( number_stretch_level_start > 1 ) THEN
     527          DO n = 2, number_stretch_level_start
     528             dz_stretch_level_start(n) = INT( dz_stretch_level_start(n) /      &
     529                                              dz(n) ) * dz(n)
     530          ENDDO
     531       ENDIF
     532       
     533       IF ( number_stretch_level_end /= 0 ) THEN
     534          DO n = 1, number_stretch_level_end
     535             dz_stretch_level_end(n) = INT( dz_stretch_level_end(n) /          &
     536                                            dz(n+1) ) * dz(n+1)
     537          ENDDO
     538       ENDIF
     539 
     540!
     541!--    Determine stretching factor if necessary
     542       IF ( number_stretch_level_end >= 1 ) THEN
     543          CALL calculate_stretching_factor( number_stretch_level_end )
     544       ENDIF
     545
    404546!
    405547!--    Grid for atmosphere with surface at z=0 (k=0, w-grid).
     548!--    First compute the u- and v-levels. In case of dirichlet bc for u and v
     549!--    the first u/v- and w-level (k=0) are defined at same height (z=0).
    406550!--    The second u-level (k=1) corresponds to the top of the
    407551!--    Prandtl-layer.
    408 
    409552       IF ( ibc_uv_b == 0 .OR. ibc_uv_b == 2 ) THEN
    410553          zu(0) = 0.0_wp
    411       !    zu(0) = - dz * 0.5_wp
    412554       ELSE
    413           zu(0) = - dz * 0.5_wp
    414        ENDIF
    415        zu(1) =   dz * 0.5_wp
    416 
    417        dz_stretch_level_index = nzt+1
    418        dz_stretched = dz
     555          zu(0) = - dz(1) * 0.5_wp
     556       ENDIF
     557         
     558       zu(1) =   dz(1) * 0.5_wp
     559       
     560!
     561!--    Determine u and v height levels considering the possibility of grid
     562!--    stretching in several heights.
     563       n = 1
     564       dz_stretch_level_start_index = nzt+1
     565       dz_stretch_level_end_index = nzt+1
     566       dz_stretched = dz(1)
     567
     568!--    The default value of dz_stretch_level_start is negative, thus the first
     569!--    condition is always true. Hence, the second condition is necessary.
    419570       DO  k = 2, nzt+1
    420           IF ( dz_stretch_level <= zu(k-1)  .AND.  dz_stretched < dz_max )  THEN
    421              dz_stretched = dz_stretched * dz_stretch_factor
    422              dz_stretched = MIN( dz_stretched, dz_max )
    423              IF ( dz_stretch_level_index == nzt+1 ) dz_stretch_level_index = k-1
    424           ENDIF
     571          IF ( dz_stretch_level_start(n) <= zu(k-1) .AND.                      &
     572               dz_stretch_level_start(n) /= -9999999.9_wp ) THEN
     573             dz_stretched = dz_stretched * dz_stretch_factor_array(n)
     574             
     575             IF ( dz(n) > dz(n+1) ) THEN
     576                dz_stretched = MAX( dz_stretched, dz(n+1) ) !Restrict dz_stretched to the user-specified (higher) dz
     577             ELSE
     578                dz_stretched = MIN( dz_stretched, dz(n+1) ) !Restrict dz_stretched to the user-specified (lower) dz
     579             ENDIF
     580             
     581             IF ( dz_stretch_level_start_index(n) == nzt+1 )                         &
     582             dz_stretch_level_start_index(n) = k-1
     583             
     584          ENDIF
     585         
    425586          zu(k) = zu(k-1) + dz_stretched
     587         
     588!
     589!--       Make sure that the stretching ends exactly at dz_stretch_level_end
     590          dz_level_end = ABS( zu(k) - dz_stretch_level_end(n) )
     591         
     592          IF ( dz_level_end  < dz(n+1)/3.0 ) THEN
     593             zu(k) = dz_stretch_level_end(n)
     594             dz_stretched = dz(n+1)
     595             dz_stretch_level_end_index(n) = k
     596             n = n + 1             
     597          ENDIF
    426598       ENDDO
    427599
     
    438610
    439611    ELSE
     612
     613!
     614!--    The stretching region has to be large enough to allow for a smooth
     615!--    transition between two different grid spacings
     616       DO n = 1, number_stretch_level_start
     617          min_dz_stretch_level_end(n) = dz_stretch_level_start(n) -            &
     618                                        4 * MAX( dz(n),dz(n+1) )
     619       ENDDO
     620       
     621       IF ( ANY( min_dz_stretch_level_end < dz_stretch_level_end ) ) THEN
     622             message_string= 'Eeach dz_stretch_level_end has to be less ' //   &
     623                             'than its corresponding value for &' //           &
     624                             'dz_stretch_level_start - 4*MAX(dz(n),dz(n+1)) '//&
     625                             'to allow for smooth grid stretching'
     626             CALL message( 'init_grid', 'PA0224', 1, 2, 0, 6, 0 )
     627       ENDIF
     628       
     629!
     630!--    Stretching must not be applied within the prandtl_layer
     631!--    (first two grid points). For the default case dz_stretch_level_start
     632!--    is negative. Therefore the absolut value is checked here.
     633       IF ( ANY( dz_stretch_level_start > dz(1) * 1.5_wp ) ) THEN
     634          WRITE( message_string, * ) 'Eeach dz_stretch_level_start has to be ',&
     635                                     'less than ', dz(1) * 1.5
     636             CALL message( 'init_grid', 'PA0226', 1, 2, 0, 6, 0 )
     637       ENDIF
     638
     639!
     640!--    The stretching has to start and end on a grid level. Therefore
     641!--    user-specified values have to ''interpolate'' to the next highest level
     642       IF ( number_stretch_level_start /= 0 ) THEN
     643          dz_stretch_level_start(1) = INT( (dz_stretch_level_start(1) +        &
     644                                            dz(1)/2.0) / dz(1) )               &
     645                                      * dz(1) - dz(1)/2.0
     646       ENDIF
     647       
     648       IF ( number_stretch_level_start > 1 ) THEN
     649          DO n = 2, number_stretch_level_start
     650             dz_stretch_level_start(n) = INT( dz_stretch_level_start(n) /      &
     651                                              dz(n) ) * dz(n)
     652          ENDDO
     653       ENDIF
     654       
     655       IF ( number_stretch_level_end /= 0 ) THEN
     656          DO n = 1, number_stretch_level_end
     657             dz_stretch_level_end(n) = INT( dz_stretch_level_end(n) /          &
     658                                            dz(n+1) ) * dz(n+1)
     659          ENDDO
     660       ENDIF
     661       
     662!
     663!--    Determine stretching factor if necessary
     664       IF ( number_stretch_level_end >= 1 ) THEN
     665          CALL calculate_stretching_factor( number_stretch_level_end )
     666       ENDIF
     667
    440668!
    441669!--    Grid for ocean with free water surface is at k=nzt (w-grid).
     
    444672!--    w-level are defined at same height, but staggered from the second level.
    445673!--    The second u-level (k=1) corresponds to the top of the Prandtl-layer.
    446        zu(nzt+1) =   dz * 0.5_wp
    447        zu(nzt)   = - dz * 0.5_wp
    448 
    449        dz_stretch_level_index = 0
    450        dz_stretched = dz
     674!--    z values are negative starting from z=0 (surface)
     675       zu(nzt+1) =   dz(1) * 0.5_wp
     676       zu(nzt)   = - dz(1) * 0.5_wp
     677
     678!
     679!--    Determine u and v height levels considering the possibility of grid
     680!--    stretching in several heights.
     681       n = 1
     682       dz_stretch_level_start_index = 0
     683       dz_stretch_level_end_index = 0
     684       dz_stretched = dz(1)
     685
    451686       DO  k = nzt-1, 0, -1
    452 !
    453 !--       The default value of dz_stretch_level is positive, thus the first
    454 !--       condition is always true. Hence, the second condition is necessary.
    455           IF ( dz_stretch_level >= zu(k+1)  .AND.  dz_stretch_level <= 0.0  &
    456                .AND.  dz_stretched < dz_max )  THEN
    457              dz_stretched = dz_stretched * dz_stretch_factor
    458              dz_stretched = MIN( dz_stretched, dz_max )
    459              IF ( dz_stretch_level_index == 0 ) dz_stretch_level_index = k+1
    460           ENDIF
     687         
     688          IF ( dz_stretch_level_start(n) >= zu(k+1) ) THEN
     689             dz_stretched = dz_stretched * dz_stretch_factor_array(n)
     690
     691             IF ( dz(n) > dz(n+1) ) THEN
     692                dz_stretched = MAX( dz_stretched, dz(n+1) ) !Restrict dz_stretched to the user-specified (higher) dz
     693             ELSE
     694                dz_stretched = MIN( dz_stretched, dz(n+1) ) !Restrict dz_stretched to the user-specified (lower) dz
     695             ENDIF
     696             
     697             IF ( dz_stretch_level_start_index(n) == 0 )                             &
     698             dz_stretch_level_start_index(n) = k+1
     699             
     700          ENDIF
     701         
    461702          zu(k) = zu(k+1) - dz_stretched
     703         
     704!
     705!--       Make sure that the stretching ends exactly at dz_stretch_level_end
     706          dz_level_end = ABS( zu(k) - dz_stretch_level_end(n) )
     707         
     708          IF ( dz_level_end  < dz(n+1)/3.0 ) THEN
     709             zu(k) = dz_stretch_level_end(n)
     710             dz_stretched = dz(n+1)
     711             dz_stretch_level_end_index(n) = k
     712             n = n + 1             
     713          ENDIF
    462714       ENDDO
    463 
     715       
    464716!
    465717!--    Compute the w-levels. They are always staggered half-way between the
     
    468720!--    same height. The top w-level (nzt+1) is not used but set for
    469721!--    consistency, since w and all scalar variables are defined up tp nzt+1.
    470        zw(nzt+1) = dz
     722       zw(nzt+1) = dz(1)
    471723       zw(nzt)   = 0.0_wp
    472724       DO  k = 0, nzt
     
    8551107 END SUBROUTINE init_grid
    8561108
     1109
     1110! Description:
     1111! -----------------------------------------------------------------------------!
     1112!> Calculation of the stretching factor through an iterative method. Ideas were
     1113!> taken from the paper "Regional stretched grid generation and its application
     1114!> to the NCAR RegCM (1999)". Normally, no analytic solution exists because the
     1115!> system of equations has two variables (r,l) but four requirements
     1116!> (l=integer, r=[0,88;1,2], Eq(6), Eq(5) starting from index j=1) which
     1117!> results into an overdetermined system.
     1118!------------------------------------------------------------------------------!
     1119 SUBROUTINE calculate_stretching_factor( number_end )
     1120 
     1121    USE control_parameters,                                                    &
     1122        ONLY:  dz, dz_stretch_factor, dz_stretch_factor_array,                 &   
     1123               dz_stretch_level_end, dz_stretch_level_start, message_string
     1124 
     1125    USE kinds
     1126   
     1127    IMPLICIT NONE
     1128   
     1129    INTEGER(iwp) ::  iterations  !< number of iterations until stretch_factor_lower/upper_limit is reached 
     1130    INTEGER(iwp) ::  l_rounded   !< after l_rounded grid levels dz(n) is strechted to dz(n+1) with stretch_factor_2
     1131    INTEGER(iwp) ::  n           !< loop variable for stretching
     1132   
     1133    INTEGER(iwp), INTENT(IN) ::  number_end !< number of user-specified end levels for stretching
     1134       
     1135    REAL(wp) ::  delta_l               !< absolute difference between l and l_rounded
     1136    REAL(wp) ::  delta_stretch_factor  !< absolute difference between stretch_factor_1 and stretch_factor_2
     1137    REAL(wp) ::  delta_total_new       !< sum of delta_l and delta_stretch_factor for the next iteration (should be as small as possible)
     1138    REAL(wp) ::  delta_total_old       !< sum of delta_l and delta_stretch_factor for the last iteration
     1139    REAL(wp) ::  distance              !< distance between dz_stretch_level_start and dz_stretch_level_end (stretching region)
     1140    REAL(wp) ::  l                     !< value that fulfil Eq. (5) in the paper mentioned above together with stretch_factor_1 exactly
     1141    REAL(wp) ::  numerator             !< numerator of the quotient
     1142    REAL(wp) ::  stretch_factor_1      !< stretching factor that fulfil Eq. (5) togehter with l exactly
     1143    REAL(wp) ::  stretch_factor_2      !< stretching factor that fulfil Eq. (6) togehter with l_rounded exactly
     1144   
     1145    REAL(wp), PARAMETER ::  stretch_factor_interval = 1.0E-06  !< interval for sampling possible stretching factors
     1146    REAL(wp), PARAMETER ::  stretch_factor_lower_limit = 0.88  !< lowest possible stretching factor
     1147    REAL(wp), PARAMETER ::  stretch_factor_upper_limit = 1.12  !< highest possible stretching factor
     1148 
     1149 
     1150       l = 0
     1151       DO  n = 1, number_end
     1152       
     1153          iterations = 1
     1154          stretch_factor_1 = 1.0
     1155          stretch_factor_2 = 1.0
     1156          delta_total_old = 1.0
     1157         
     1158          IF ( dz(n) > dz(n+1) ) THEN
     1159             DO WHILE ( stretch_factor_1 >= stretch_factor_lower_limit )
     1160               
     1161                stretch_factor_1 = 1.0 - iterations * stretch_factor_interval
     1162                distance = ABS( dz_stretch_level_end(n) -                   &
     1163                           dz_stretch_level_start(n) )
     1164                numerator = distance*stretch_factor_1/dz(n) +               &
     1165                            stretch_factor_1 - distance/dz(n)
     1166               
     1167                IF ( numerator > 0.0 ) THEN
     1168                   l = LOG( numerator ) / LOG( stretch_factor_1 ) - 1.0
     1169                   l_rounded = NINT( l )
     1170                   delta_l = ABS( l_rounded - l ) / l
     1171                ENDIF
     1172               
     1173                stretch_factor_2 = EXP( LOG( dz(n+1)/dz(n) ) / (l_rounded) )
     1174               
     1175                delta_stretch_factor = ABS( stretch_factor_1 -              &
     1176                                            stretch_factor_2 ) /            &
     1177                                       stretch_factor_2
     1178               
     1179                delta_total_new = delta_l + delta_stretch_factor
     1180
     1181!
     1182!--                stretch_factor_1 is taken to guarantee that the stretching
     1183!--                procedure ends as close as possible to dz_stretch_level_end.
     1184!--                stretch_factor_2 would guarantee that the stretched dz(n) is
     1185!--                equal to dz(n+1) after l_rounded grid levels.
     1186                IF (delta_total_new < delta_total_old) THEN
     1187                   dz_stretch_factor_array(n) = stretch_factor_1
     1188                   delta_total_old = delta_total_new
     1189                ENDIF
     1190               
     1191                iterations = iterations + 1
     1192               
     1193             ENDDO
     1194               
     1195          ELSEIF ( dz(n) < dz(n+1) ) THEN
     1196             DO WHILE ( stretch_factor_1 <= stretch_factor_upper_limit )
     1197                       
     1198                stretch_factor_1 = 1.0 + iterations * stretch_factor_interval
     1199                distance = ABS( dz_stretch_level_end(n) -                   &
     1200                           dz_stretch_level_start(n) )
     1201                numerator = distance*stretch_factor_1/dz(n) +               &
     1202                            stretch_factor_1 - distance/dz(n)
     1203               
     1204                l = LOG( numerator ) / LOG( stretch_factor_1 ) - 1.0
     1205                l_rounded = NINT( l )
     1206                delta_l = ABS( l_rounded - l ) / l
     1207               
     1208                stretch_factor_2 = EXP( LOG( dz(n+1)/dz(n) ) / (l_rounded) )
     1209
     1210                delta_stretch_factor = ABS( stretch_factor_1 -              &
     1211                                           stretch_factor_2 ) /             &
     1212                                           stretch_factor_2
     1213               
     1214                delta_total_new = delta_l + delta_stretch_factor
     1215               
     1216!
     1217!--                stretch_factor_1 is taken to guarantee that the stretching
     1218!--                procedure ends as close as possible to dz_stretch_level_end.
     1219!--                stretch_factor_2 would guarantee that the stretched dz(n) is
     1220!--                equal to dz(n+1) after l_rounded grid levels.
     1221                IF (delta_total_new < delta_total_old) THEN
     1222                   dz_stretch_factor_array(n) = stretch_factor_1
     1223                   delta_total_old = delta_total_new
     1224                ENDIF
     1225               
     1226                iterations = iterations + 1
     1227             ENDDO
     1228             
     1229          ELSE
     1230             message_string= 'Two adjacent values of dz must be different'
     1231             CALL message( 'init_grid', 'PA0228', 1, 2, 0, 6, 0 )
     1232             
     1233          ENDIF
     1234       ENDDO
     1235       
     1236 END SUBROUTINE calculate_stretching_factor
     1237 
     1238 
    8571239! Description:
    8581240! -----------------------------------------------------------------------------!
     
    17032085!--       Tunnel-wall depth
    17042086          IF ( tunnel_wall_depth == 9999999.9_wp )  THEN 
    1705              td = MAX ( dx, dy, dz )
     2087             td = MAX ( dx, dy, dz(1) )
    17062088          ELSE
    17072089             td = tunnel_wall_depth
  • palm/trunk/SOURCE/init_masks.f90

    r3049 r3065  
    2525! -----------------
    2626! $Id$
     27! dz_stretch_level was replaced by dz_stretch_level_start
     28!
     29! 3049 2018-05-29 13:52:36Z Giersch
    2730! Error messages revised
    2831!
     
    133136        ONLY:  constant_diffusion, cloud_droplets, cloud_physics,              &
    134137               data_output_masks, data_output_masks_user,                      &
    135                doav, doav_n, domask, domask_no, dz, dz_stretch_level, humidity,&
    136                mask, masks, mask_scale, mask_i,                                &
     138               doav, doav_n, domask, domask_no, dz, dz_stretch_level_start,    &
     139               humidity, mask, masks, mask_scale, mask_i,                      &
    137140               mask_i_global, mask_j, mask_j_global, mask_k, mask_k_global,    &
    138141               mask_loop, mask_size, mask_size_l, mask_start_l, mask_x,        &
     
    141144               microphysics_morrison, microphysics_seifert, passive_scalar,    &
    142145               ocean, varnamelength
     146               
    143147
    144148    USE grid_variables,                                                        &
     
    490494       CALL set_mask_locations( 1, dx, 'dx', nx, 'nx', nxl, nxr )
    491495       CALL set_mask_locations( 2, dy, 'dy', ny, 'ny', nys, nyn )
    492        CALL set_mask_locations( 3, dz, 'dz', nz, 'nz', nzb, nzt )
     496       CALL set_mask_locations( 3, dz(1), 'dz', nz, 'nz', nzb, nzt )
    493497!
    494498!--    Set global masks along all three dimensions (required by
     
    727731!--          The following line assumes a constant vertical grid spacing within
    728732!--          the vertical mask range; it fails for vertical grid stretching.
    729 !--          Maybe revise later. Issue warning but continue execution.
     733!--          Maybe revise later. Issue warning but continue execution. ABS(...)
     734!--          within the IF statement is necessary because the default value of
     735!--          dz_stretch_level_start is -9999999.9_wp.
    730736             loop_stride = NINT( mask_loop(mid,dim,3) * mask_scale(dim) * ddxyz )
    731737
    732              IF ( mask_loop(mid,dim,2) * mask_scale(dim) > dz_stretch_level )  &
    733                   THEN
     738             IF ( mask_loop(mid,dim,2) * mask_scale(dim) >                     &
     739                  ABS( dz_stretch_level_start(1) ) )  THEN
    734740                WRITE ( message_string, '(A,I3,A,I1,A,F9.3,A,F8.2,3A)' )       &
    735741                     'mask_loop(',mid,',',dim,',2)=', mask_loop(mid,dim,2),    &
    736                      ' exceeds dz_stretch_level=',dz_stretch_level,            &
     742                     ' exceeds dz_stretch_level=',dz_stretch_level_start(1),   &
    737743                     '.&Vertical mask locations will not ',                    &
    738744                     'match the desired heights within the stretching ',       &
  • palm/trunk/SOURCE/lpm_advec.f90

    r2969 r3065  
    2525! -----------------
    2626! $Id$
     27! dz values were replaced by dzw or dz(1) to allow for right vertical stretching
     28!
     29! 2969 2018-04-13 11:55:09Z thiele
    2730! Bugfix in Interpolation indices.
    2831!
     
    158161
    159162    USE arrays_3d,                                                             &
    160         ONLY:  de_dx, de_dy, de_dz, diss, e, km, u, v, w, zu, zw
     163        ONLY:  de_dx, de_dy, de_dz, diss, dzw, e, km, u, v, w, zu, zw
    161164
    162165    USE cpulog
     
    409412                            + ( gg-cc ) * u(k+1,j+1,i) + ( gg-dd ) *           &
    410413                            u(k+1,j+1,i+1) ) / ( 3.0_wp * gg ) - u_gtrans
    411                 u_int(n) = u_int_l + ( zv(n) - zu(k) ) / dz *                  &
     414                u_int(n) = u_int_l + ( zv(n) - zu(k) ) / dzw(k) *               &
    412415                           ( u_int_u - u_int_l )
    413416             ENDIF
     
    503506                          + ( gg-cc ) * v(k+1,j+1,i) + ( gg-dd ) * v(k+1,j+1,i+1) &
    504507                          ) / ( 3.0_wp * gg ) - v_gtrans
    505                 v_int(n) = v_int_l + ( zv(n) - zu(k) ) / dz * &
     508                v_int(n) = v_int_l + ( zv(n) - zu(k) ) / dzw(k) *              &
    506509                                  ( v_int_u - v_int_l )
    507510             ENDIF
     
    540543                            ( gg-dd ) * w(k+1,j+1,i+1) &
    541544                          ) / ( 3.0_wp * gg )
    542                 w_int(n) = w_int_l + ( zv(n) - zw(k) ) / dz * &
     545                w_int(n) = w_int_l + ( zv(n) - zw(k) ) / dzw(k) *              &
    543546                           ( w_int_u - w_int_l )
    544547             ENDIF
     
    611614                               ( gg - dd ) * e(k+1,j+1,i+1) &
    612615                            ) / ( 3.0_wp * gg )
    613                    e_int(n) = e_int_l + ( zv(n) - zu(k) ) / dz * &
     616                   e_int(n) = e_int_l + ( zv(n) - zu(k) ) / dzw(k) *            &
    614617                                     ( e_int_u - e_int_l )
    615618                ENDIF
     
    637640                                   ( gg - dd ) * de_dx(k+1,j+1,i+1) &
    638641                                  ) / ( 3.0_wp * gg )
    639                    de_dx_int(n) = de_dx_int_l + ( zv(n) - zu(k) ) / dz * &
     642                   de_dx_int(n) = de_dx_int_l + ( zv(n) - zu(k) ) / dzw(k) *    &
    640643                                              ( de_dx_int_u - de_dx_int_l )
    641644                ENDIF
     
    655658                                   ( gg - dd ) * de_dy(k+1,j+1,i+1) &
    656659                                  ) / ( 3.0_wp * gg )
    657                       de_dy_int(n) = de_dy_int_l + ( zv(n) - zu(k) ) / dz * &
     660                      de_dy_int(n) = de_dy_int_l + ( zv(n) - zu(k) ) / dzw(k) * &
    658661                                                 ( de_dy_int_u - de_dy_int_l )
    659662                ENDIF
     
    661664!
    662665!--             Interpolate the TKE gradient along z
    663                 IF ( zv(n) < 0.5_wp * dz )  THEN
     666                IF ( zv(n) < 0.5_wp * dz(1) )  THEN
    664667                   de_dz_int(n) = 0.0_wp
    665668                ELSE
     
    678681                                      ( gg - dd ) * de_dz(k+1,j+1,i+1) &
    679682                                     ) / ( 3.0_wp * gg )
    680                       de_dz_int(n) = de_dz_int_l + ( zv(n) - zu(k) ) / dz * &
     683                      de_dz_int(n) = de_dz_int_l + ( zv(n) - zu(k) ) / dzw(k) * &
    681684                                                 ( de_dz_int_u - de_dz_int_l )
    682685                   ENDIF
     
    699702                                  ( gg - dd ) * diss(k+1,j+1,i+1) &
    700703                                 ) / ( 3.0_wp * gg )
    701                    diss_int(n) = diss_int_l + ( zv(n) - zu(k) ) / dz * &
     704                   diss_int(n) = diss_int_l + ( zv(n) - zu(k) ) / dzw(k) *      &
    702705                                            ( diss_int_u - diss_int_l )
    703706                ENDIF
  • palm/trunk/SOURCE/lpm_exchange_horiz.f90

    r3049 r3065  
    2525! -----------------
    2626! $Id$
     27! dz was replaced by dz(1) to allow for right vertical stretching
     28!
     29! 3049 2018-05-29 13:52:36Z Giersch
    2730! Error messages revised
    2831!
     
    910913       ip = particle_array(n)%x * ddx
    911914       jp = particle_array(n)%y * ddy
    912        kp = particle_array(n)%z / dz + 1 + offset_ocean_nzt
     915       kp = particle_array(n)%z / dz(1) + 1 + offset_ocean_nzt
    913916!
    914917!--    In case of grid stretching a particle might be above or below the 
  • palm/trunk/SOURCE/lpm_init.f90

    r3049 r3065  
    2525! -----------------
    2626! $Id$
     27! dz was replaced by dzw or dz(1) to allow for right vertical stretching
     28!
     29! 3049 2018-05-29 13:52:36Z Giersch
    2730! Error messages revised
    2831!
     
    794797                               ip = tmp_particle%x * ddx
    795798                               jp = tmp_particle%y * ddy
    796                                kp = tmp_particle%z / dz + 1 + offset_ocean_nzt                               
     799                               kp = tmp_particle%z / dz(1) + 1 + offset_ocean_nzt                               
    797800                               DO WHILE( zw(kp) < tmp_particle%z )
    798801                                  kp = kp + 1
     
    969972                                     pdz(particles(n)%group)
    970973                      particles(n)%z = particles(n)%z +                        &
    971                               MERGE( rand_contr, SIGN( dz, rand_contr ),       &
    972                                      ABS( rand_contr ) < dz                    &
     974                              MERGE( rand_contr, SIGN( dzw(kp), rand_contr ),  &
     975                                     ABS( rand_contr ) < dzw(kp)               &
    973976                                   )
    974977                   ENDIF
     
    987990                   i = particles(n)%x * ddx
    988991                   j = particles(n)%y * ddy
    989                    k = particles(n)%z / dz + 1 + offset_ocean_nzt
     992                   k = particles(n)%z / dz(1) + 1 + offset_ocean_nzt
    990993                   DO WHILE( zw(k) < particles(n)%z )
    991994                      k = k + 1
  • palm/trunk/SOURCE/lpm_set_attributes.f90

    r2718 r3065  
    2525! -----------------
    2626! $Id$
     27! dz was replaced by dzw to allow for right vertical stretching
     28!
     29! 2718 2018-01-02 08:49:38Z maronga
    2730! Corrected "Former revisions" section
    2831!
     
    8083
    8184    USE arrays_3d,                                                             &
    82         ONLY:  pt, u, v, w, zu, zw
     85        ONLY:  dzw, pt, u, v, w, zu, zw
    8386
    8487    USE control_parameters,                                                    &
    85         ONLY:  u_gtrans, v_gtrans, dz
     88        ONLY:  u_gtrans, v_gtrans
    8689
    8790    USE cpulog,                                                                &
     
    207210                                     ( gg - dd ) * u(k+1,j+1,i+1)                &
    208211                                   ) / ( 3.0_wp * gg ) - u_gtrans
    209                          u_int(n) = u_int_l + ( zv(n) - zu(k) ) / dz *         &
     212                         u_int(n) = u_int_l + ( zv(n) - zu(k) ) / dzw(k) *      &
    210213                                           ( u_int_u - u_int_l )
    211214                      ENDIF
     
    240243                                      ( gg - dd ) * v(k+1,j+1,i+1)                &
    241244                                    ) / ( 3.0_wp * gg ) - v_gtrans
    242                          v_int(n) = v_int_l + ( zv(n) - zu(k) ) / dz *         &
     245                         v_int(n) = v_int_l + ( zv(n) - zu(k) ) / dzw(k) *      &
    243246                                           ( v_int_u - v_int_l )
    244247                      ENDIF
     
    344347                                 ) / ( 3.0_wp * gg ) - sums(k,4)
    345348
    346                       pt_int = pt_int_l + ( zv(n) - zu(k) ) / dz *    &
     349                      pt_int = pt_int_l + ( zv(n) - zu(k) ) / dzw(k) *          &
    347350                                          ( pt_int_u - pt_int_l )
    348351
  • palm/trunk/SOURCE/modules.f90

    r3045 r3065  
    2525! -----------------
    2626! $Id$
     27! Variables concerning stretching introduced or revised
     28!
     29! 3045 2018-05-28 07:55:41Z Giersch
    2730! z_max_do2d removed
    2831!
     
    11481151    INTEGER(iwp) ::  dp_level_ind_b = 0                !< lowest grid index for external pressure gradient forcing
    11491152    INTEGER(iwp) ::  dvrp_filecount = 0                !< parameter for dvr visualization software
    1150     INTEGER(iwp) ::  dz_stretch_level_index            !< vertical grid level index above which the vertical grid spacing is stretched
    11511153    INTEGER(iwp) ::  ensemble_member_nr = 0            !< namelist parameter
    11521154    INTEGER(iwp) ::  gamma_mg                          !< switch for steering the multigrid cycle: 1: v-cycle, 2: w-cycle
     
    11901192    INTEGER(iwp) ::  num_var_fl                        !< number of sampling/output variables in virtual flight measurements
    11911193    INTEGER(iwp) ::  num_var_fl_user=0                 !< number of user-defined sampling/output variables in virtual flight measurements
     1194    INTEGER(iwp) ::  number_stretch_level_start        !< number of user-specified start levels for stretching
     1195    INTEGER(iwp) ::  number_stretch_level_end          !< number of user-specified end levels for stretching
    11921196    INTEGER(iwp) ::  nz_do3d = -9999                   !< namelist parameter
    11931197    INTEGER(iwp) ::  prt_time_count = 0                !< number of output intervals for particle data output
     
    11991203    INTEGER(iwp) ::  timestep_count = 0                !< number of timesteps carried out since the beginning of the initial run
    12001204    INTEGER(iwp) ::  y_shift = 0                       !< namelist parameter
     1205   
    12011206    INTEGER(iwp) ::  dist_nxl(0:1)                               !< left boundary of disturbance region
    12021207    INTEGER(iwp) ::  dist_nxr(0:1)                               !< right boundary of disturbance region
     
    12111216    INTEGER(iwp) ::  domask_no(max_masks,0:1) = 0                !< number of masked output quantities
    12121217    INTEGER(iwp) ::  domask_time_count(max_masks,0:1)            !< number of output intervals for masked data
     1218    INTEGER(iwp) ::  dz_stretch_level_end_index(9)               !< vertical grid level index until which the vertical grid spacing is stretched
     1219    INTEGER(iwp) ::  dz_stretch_level_start_index(9)             !< vertical grid level index above which the vertical grid spacing is stretched
    12131220    INTEGER(iwp) ::  mask_size(max_masks,3) = -1                 !< size of mask array per mask and dimension (for netcdf output)
    12141221    INTEGER(iwp) ::  mask_size_l(max_masks,3) = -1               !< subdomain size of mask array per mask and dimension (for netcdf output)
     
    14161423    REAL(wp) ::  dt_spinup = 60.0_wp                           !< namelist parameter
    14171424    REAL(wp) ::  dt_3d = 1.0_wp                                !< time step
    1418     REAL(wp) ::  dz = -1.0_wp                                  !< namelist parameter
    1419     REAL(wp) ::  dz_max = 9999999.9_wp                         !< namelist parameter
     1425    REAL(wp) ::  dz_max = 1000.0_wp                            !< namelist parameter
    14201426    REAL(wp) ::  dz_stretch_factor = 1.08_wp                   !< namelist parameter
    1421     REAL(wp) ::  dz_stretch_level = 100000.0_wp                !< namelist parameter
     1427    REAL(wp) ::  dz_stretch_level = -9999999.9_wp              !< namelist parameter
    14221428    REAL(wp) ::  e_init = 0.0_wp                               !< namelist parameter
    14231429    REAL(wp) ::  e_min = 0.0_wp                                !< namelist parameter
     
    15291535    REAL(wp) ::  dpdxy(1:2) = 0.0_wp                               !< namelist parameter
    15301536    REAL(wp) ::  dt_domask(max_masks) = 9999999.9_wp               !< namelist parameter
     1537    REAL(wp) ::  dz(10) = -1.0_wp                                  !< namelist parameter
     1538    REAL(wp) ::  dz_stretch_level_start(9) = -9999999.9_wp         !< namelist parameter
     1539    REAL(wp) ::  dz_stretch_level_end(9) = 9999999.9_wp            !< namelist parameter
     1540    REAL(wp) ::  dz_stretch_factor_array(9) = 1.08_wp              !< namelist parameter
    15311541    REAL(wp) ::  mask_scale(3)                                     !< collective array for mask_scale_x/y/z
    15321542    REAL(wp) ::  pt_vertical_gradient(10) = 0.0_wp                 !< namelist parameter
  • palm/trunk/SOURCE/parin.f90

    r3049 r3065  
    2525! -----------------
    2626! $Id$
     27! New initialization parameters added
     28!
     29! 3049 2018-05-29 13:52:36Z Giersch
    2730! Error messages revised
    2831!
     
    509512             dp_external, dp_level_b, dp_smooth, dpdxy, dry_aerosol_radius,    &
    510513             dt, dt_pr_1d, dt_run_control_1d, dt_spinup, dx, dy, dz, dz_max,   &
    511              dz_stretch_factor, dz_stretch_level, end_time_1d,                 &
    512              ensemble_member_nr, e_init, e_min, fft_method,                    &
    513              flux_input_mode, flux_output_mode, forcing,                       &
     514             dz_stretch_factor, dz_stretch_level, dz_stretch_level_start,      &
     515             dz_stretch_level_end, end_time_1d, ensemble_member_nr, e_init,    &
     516             e_min, fft_method, flux_input_mode, flux_output_mode, forcing,    &
    514517             galilei_transformation, humidity,                                 &
    515518             inflow_damping_height, inflow_damping_width,                      &
     
    579582             dp_external, dp_level_b, dp_smooth, dpdxy, dry_aerosol_radius,    &
    580583             dt, dt_pr_1d, dt_run_control_1d, dt_spinup, dx, dy, dz, dz_max,   &
    581              dz_stretch_factor, dz_stretch_level, end_time_1d,                 &
    582              ensemble_member_nr, e_init, e_min, fft_method,                    &
    583              flux_input_mode, flux_output_mode, forcing,                       &
     584             dz_stretch_factor, dz_stretch_level, dz_stretch_level_start,      &
     585             dz_stretch_level_end, end_time_1d, ensemble_member_nr, e_init,    &
     586             e_min, fft_method, flux_input_mode, flux_output_mode, forcing,    &
    584587             galilei_transformation, humidity,                                 &
    585588             inflow_damping_height, inflow_damping_width,                      &
  • palm/trunk/SOURCE/plant_canopy_model_mod.f90

    r3049 r3065  
    2525! -----------------
    2626! $Id$
     27! dz was replaced by the help of zw to allow for vertical stretching
     28!
     29! 3049 2018-05-29 13:52:36Z Giersch
    2730! Error messages revised
    2831!
     
    550553
    551554       USE control_parameters,                                                 &
    552            ONLY: dz, passive_scalar
     555           ONLY: passive_scalar
    553556
    554557
     
    568571       REAL(wp) ::  canopy_height       !< canopy height (in m)
    569572       
    570        canopy_height = pch_index * dz
     573       canopy_height = zw(pch_index)
    571574
    572575       WRITE ( io, 1 )  canopy_mode, canopy_height, pch_index,                 &
     
    668671
    669672       USE control_parameters,                                                 &
    670            ONLY: dz, humidity, io_blocks, io_group, message_string, ocean,     &
     673           ONLY: humidity, io_blocks, io_group, message_string, ocean,         &
    671674                 passive_scalar, urban_surface
    672675
     
    761764!--       Use beta function for lad-profile construction
    762765          int_bpdf = 0.0_wp
    763           canopy_height = pch_index * dz
     766          canopy_height = zw(pch_index)
    764767
    765768          DO k = 0, pch_index
  • palm/trunk/SOURCE/pmc_interface_mod.f90

    r3049 r3065  
    2525! -----------------
    2626! $Id$
     27! dz was replaced by dz(1)
     28!
     29! 3049 2018-05-29 13:52:36Z Giersch
    2730! Error messages revised
    2831!
     
    913916          parent_grid_info_real(5) = lower_left_coord_x + ( nx + 1 ) * dx
    914917          parent_grid_info_real(6) = lower_left_coord_y + ( ny + 1 ) * dy
    915           parent_grid_info_real(7) = dz
     918          parent_grid_info_real(7) = dz(1)
    916919
    917920          parent_grid_info_int(1)  = nx
     
    13181321       fval(3) = dx
    13191322       fval(4) = dy
    1320        fval(5) = dz
     1323       fval(5) = dz(1)
    13211324
    13221325       IF ( myid == 0 )  THEN
  • palm/trunk/SOURCE/radiation_model_mod.f90

    r3049 r3065  
    2828! -----------------
    2929! $Id$
     30! dz was replaced by dz(1), error message concerning vertical stretching was
     31! added 
     32!
     33! 3049 2018-05-29 13:52:36Z Giersch
    3034! Error messages revised
    3135!
     
    330334! ------------
    331335!> Radiation models and interfaces
     336!> @todo Replace dz(1) appropriatly to account for grid stretching
    332337!> @todo move variable definitions used in radiation_init only to the subroutine
    333338!>       as they are no longer required after initialization.
     
    43714376     IF ( plant_canopy )  THEN
    43724377         pchf_prep(:) = r_d * (hyp(nzub:nzut) / 100000.0_wp)**0.286_wp &
    4373                      / (cp * hyp(nzub:nzut) * dx*dy*dz) !< equals to 1 / (rho * c_p * Vbox * T)
     4378                     / (cp * hyp(nzub:nzut) * dx*dy*dz(1)) !< equals to 1 / (rho * c_p * Vbox * T)
    43744379         pctf_prep(:) = r_d * (hyp(nzub:nzut) / 100000.0_wp)**0.286_wp &
    43754380                     / (l_v * hyp(nzub:nzut) * dx*dy*dz)
     
    43964401!--         each dimension, so that this new direction vector will allow us
    43974402!--         to traverse the ray path within grid coordinates directly
    4398          sunorig_grid = (/ sunorig(1)/dz, sunorig(2)/dy, sunorig(3)/dx /)
     4403         sunorig_grid = (/ sunorig(1)/dz(1), sunorig(2)/dy, sunorig(3)/dx /)
    43994404!--         sunorig_grid = sunorig_grid / norm2(sunorig_grid)
    44004405         sunorig_grid = sunorig_grid / SQRT(SUM(sunorig_grid**2))
     
    44034408!--            precompute effective box depth with prototype Leaf Area Density
    44044409            pc_box_dimshift = MAXLOC(ABS(sunorig), 1) - 1
    4405             CALL box_absorb(CSHIFT((/dz,dy,dx/), pc_box_dimshift),      &
     4410            CALL box_absorb(CSHIFT((/dz(1),dy,dx/), pc_box_dimshift),      &
    44064411                                60, prototype_lad,                          &
    44074412                                CSHIFT(ABS(sunorig), pc_box_dimshift),      &
     
    48014806        IF ( idir(d) == 0 ) facearea(d) = facearea(d) * dx
    48024807        IF ( jdir(d) == 0 ) facearea(d) = facearea(d) * dy
    4803         IF ( kdir(d) == 0 ) facearea(d) = facearea(d) * dz
     4808        IF ( kdir(d) == 0 ) facearea(d) = facearea(d) * dz(1)
    48044809     ENDDO
    48054810!
     
    50145019    SUBROUTINE radiation_interaction_init
    50155020
     5021       USE control_parameters,                                                 &
     5022           ONLY:  dz_stretch_level_start
     5023           
    50165024       USE netcdf_data_input_mod,                                              &
    50175025           ONLY:  leaf_area_density_f
     
    50955103       nzpt = nzptl
    50965104#endif
     5105!
     5106!--    Stretching (non-uniform grid spacing) is not considered in the radiation
     5107!--    model. Therefore, vertical stretching has to be applied above the area
     5108!--    where the parts of the radiation model which assume constant grid spacing
     5109!--    are active. ABS (...) is required because the default value of
     5110!--    dz_stretch_level_start is -9999999.9_wp (negative).
     5111       IF ( ABS( dz_stretch_level_start(1) ) <= zw(nzut) ) THEN
     5112          WRITE( message_string, * ) 'The lowest level where vertical ',       &
     5113                                     'stretching is applied have to be ',      &
     5114                                     'greater than ', zw(nzut)
     5115          CALL message( 'init_grid', 'PA0496', 1, 2, 0, 6, 0 )
     5116       ENDIF
    50975117!
    50985118!--    global number of urban and plant layers
     
    53905410            IF ( idir(d) == 0 ) facearea(d) = facearea(d) * dx
    53915411            IF ( jdir(d) == 0 ) facearea(d) = facearea(d) * dy
    5392             IF ( kdir(d) == 0 ) facearea(d) = facearea(d) * dz
     5412            IF ( kdir(d) == 0 ) facearea(d) = facearea(d) * dz(1)
    53935413        ENDDO
    53945414
     
    55125532
    55135533!--                 unit vector source -> target
    5514                     uv = (/ (ta(1)-sa(1))*dz, (ta(2)-sa(2))*dy, (ta(3)-sa(3))*dx /)
     5534                    uv = (/ (ta(1)-sa(1))*dz(1), (ta(2)-sa(2))*dy, (ta(3)-sa(3))*dx /)
    55155535                    sqdist = SUM(uv(:)**2)
    55165536                    uv = uv / SQRT(sqdist)
     
    56775697
    56785698!--               unit vector source -> target
    5679                   uv = (/ (ta(1)-sa(1))*dz, (ta(2)-sa(2))*dy, (ta(3)-sa(3))*dx /)
     5699                  uv = (/ (ta(1)-sa(1))*dz(1), (ta(2)-sa(2))*dy, (ta(3)-sa(3))*dx /)
    56805700                  sqdist = SUM(uv(:)**2)
    56815701                  uv = uv / SQRT(sqdist)
     
    61276147        ENDIF
    61286148        uvect(:) = delta(:) / distance
    6129         realdist = SQRT(SUM( (uvect(:)*(/dz,dy,dx/))**2 ))
     6149        realdist = SQRT(SUM( (uvect(:)*(/dz(1),dy,dx/))**2 ))
    61306150
    61316151        lastdist = 0._wp
     
    65096529                     zb1 = CEILING(zexit * zsgn - .5_wp) - 1  ! because it must be smaller than exit
    65106530                     nz = MAX(zb1 - zb0 + 3, 2)
    6511                      rt2_dist(nz) = SQRT(((zexit-zorig)*dz)**2 + dxxyy)
     6531                     rt2_dist(nz) = SQRT(((zexit-zorig)*dz(1))**2 + dxxyy)
    65126532                     qdist = rt2_dist(nz) / (zexit-zorig)
    65136533                     rt2_dist(2:nz-1) = (/( ((REAL(l, wp) + .5_wp) * zsgn - zorig) * qdist , l = zb0, zb1 )/)
     
    65676587                  zb1 = CEILING(zexit * zsgn - .5_wp) - 1  ! because it must be smaller than exit
    65686588                  nz = MAX(zb1 - zb0 + 3, 2)
    6569                   rt2_dist(nz) = SQRT(((zexit-zorig)*dz)**2 + dxxyy)
     6589                  rt2_dist(nz) = SQRT(((zexit-zorig)*dz(1))**2 + dxxyy)
    65706590                  qdist = rt2_dist(nz) / (zexit-zorig)
    65716591                  rt2_dist(2:nz-1) = (/( ((REAL(l, wp) + .5_wp) * zsgn - zorig) * qdist , l = zb0, zb1 )/)
  • palm/trunk/SOURCE/read_restart_data_mod.f90

    r3056 r3065  
    2525! -----------------
    2626! $Id$
     27! New parameters concerning vertical grid stretching have been added
     28!
     29! 3056 2018-06-04 07:49:35Z Giersch
    2730! found variable has to be set to false inside overlap loop
    2831!
     
    407410             CASE ( 'dz_stretch_factor' )
    408411                READ ( 13 )  dz_stretch_factor
     412             CASE ( 'dz_stretch_factor_array' )
     413                READ ( 13 )  dz_stretch_factor_array
    409414             CASE ( 'dz_stretch_level' )
    410415                READ ( 13 )  dz_stretch_level
     416             CASE ( 'dz_stretch_level_end' )
     417                READ ( 13 )  dz_stretch_level_end
     418             CASE ( 'dz_stretch_level_start' )
     419                READ ( 13 )  dz_stretch_level_start
    411420             CASE ( 'e_min' )
    412421                READ ( 13 )  e_min
     
    12511260    THEN
    12521261       WRITE( message_string, * ) 'number of PEs or virtual PE-grid changed ', &
    1253                         'in restart run PE', myid, ' will read from files ', &
     1262                        'in restart run & PE', myid, ' will read from files ', &
    12541263                         file_list(1:files_to_be_opened)
    12551264       CALL message( 'rrd_local', 'PA0285', 0, 0, 0, 6, 0 )
  • palm/trunk/SOURCE/synthetic_turbulence_generator_mod.f90

    r3051 r3065  
    2525! -----------------
    2626! $Id$
     27! Error message related to vertical stretching has been added, dz was replaced
     28! by dz(1)
     29!
     30! 3051 2018-05-30 17:43:55Z suehring
    2731! Bugfix in calculation of initial Reynolds-stress tensor.
    2832!
     
    313317
    314318    USE control_parameters,                                                    &
    315         ONLY:  bc_lr, bc_ns, forcing, nest_domain, rans_mode, turbulent_inflow
     319        ONLY:  bc_lr, bc_ns, forcing, nest_domain, number_stretch_level_start, &
     320               rans_mode, turbulent_inflow
    316321
    317322    USE pmc_interface,                                                         &
     
    365370                              'is not allowed'
    366371          CALL message( 'stg_check_parameters', 'PA0039', 1, 2, 0, 6, 0 )
     372       ENDIF
     373       
     374       IF ( number_stretch_level_start > 0 )  THEN
     375          message_string = 'Using synthetic turbulence generator ' //          &
     376                           'in combination with stretching is not allowed'
     377          CALL message( 'stg_check_parameters', 'PA0420', 1, 2, 0, 6, 0 )
    367378       ENDIF
    368379
     
    607618
    608619!
    609 !--       Convert length scales from meter to number of grid points
     620!--       Convert length scales from meter to number of grid points. Attention:
     621!--       Does not work if grid stretching is used
    610622          nuy(k) = INT( luy * ddy )
    611           nuz(k) = INT( luz / dz  )
     623          nuz(k) = INT( luz / dz(1)  )
    612624          nvy(k) = INT( lvy * ddy )
    613           nvz(k) = INT( lvz / dz  )
     625          nvz(k) = INT( lvz / dz(1)  )
    614626          nwy(k) = INT( lwy * ddy )
    615           nwz(k) = INT( lwz / dz  )
     627          nwz(k) = INT( lwz / dz(1)  )
    616628!
    617629!--       Workaround, assume isotropic turbulence
  • palm/trunk/SOURCE/urban_surface_mod.f90

    r3049 r3065  
    2828! -----------------
    2929! $Id$
     30! Unused array dxdir was removed, dz was replaced by dzu to consider vertical
     31! grid stretching
     32!
     33! 3049 2018-05-29 13:52:36Z Giersch
    3034! Error messages revised
    3135!
     
    282286#if ! defined( __nopointer )
    283287    USE arrays_3d,                                                             &
    284         ONLY:  hyp, zu, pt, pt_1, pt_2, p, u, v, w, hyp, tend
     288        ONLY:  dzu, hyp, zu, pt, pt_1, pt_2, p, u, v, w, hyp, tend
    285289#endif
    286290
     
    292296   
    293297    USE control_parameters,                                                    &
    294         ONLY:  coupling_start_time, dz, topography, dt_3d,                     &
     298        ONLY:  coupling_start_time, topography, dt_3d,                         &
    295299               intermediate_timestep_count, initializing_actions,              &
    296300               intermediate_timestep_count_max, simulated_time, end_time,      &
     
    72077211        REAL(wp), DIMENSION(nzb:nzt)          :: exn                !< value of the Exner function in layers
    72087212       
    7209         REAL(wp), DIMENSION(0:4)              :: dxdir              !< surface normal direction gridbox length
    72107213        REAL(wp)                              :: dtime              !< simulated time of day (in UTC)
    72117214        INTEGER(iwp)                          :: dhour              !< simulated hour of day (in UTC)
     
    72137216
    72147217
    7215         dxdir = (/dz,dy,dy,dx,dx/)
    72167218#if ! defined( __nopointer )
    72177219        exn(nzb:nzt) = (hyp(nzb:nzt) / 100000.0_wp )**0.286_wp          !< Exner function
     
    76347636                         (dtime/3600.0_wp-REAL(dhour,wp))*aheatprof(k,dhour+1)
    76357637                 IF ( aheat(k,j,i) > 0.0_wp )  THEN
    7636                     pt(k,j,i) = pt(k,j,i) + aheat(k,j,i)*acoef*dt_3d/(exn(k)*rho_cp*dz)
     7638                    pt(k,j,i) = pt(k,j,i) + aheat(k,j,i)*acoef*dt_3d/(exn(k)*rho_cp*dzu(k))
    76377639                 ENDIF
    76387640              ENDIF
  • palm/trunk/SOURCE/user_init_grid.f90

    r2718 r3065  
    2525! -----------------
    2626! $Id$
     27! dz was replaced by dz(1)
     28!
     29! 2718 2018-01-02 08:49:38Z maronga
    2730! Corrected "Former revisions" section
    2831!
     
    108111!--       topography, bit is 1 for atmospheric grid point.
    109112!--       The following example shows how to prescribe sine-like topography
    110 !--       along x-direction with amplitude of 10 * dz and wavelength 10 * dy.
     113!--       along x-direction with amplitude of 10 * dz(1) and wavelength 10 * dy.
    111114!           DO  i = nxlg, nxrg
    112 !              h_topo = 10.0_wp * dz * (SIN(3.14_wp*0.5_wp)*i*dx / ( 5.0_wp * dy ) )**2
     115!              h_topo = 10.0_wp * dz(1) * (SIN(3.14_wp*0.5_wp)*i*dx / ( 5.0_wp * dy ) )**2
    113116!
    114117!              k_topo = MINLOC( ABS( zw - h_topo ), 1 ) - 1
  • palm/trunk/SOURCE/vertical_nesting_mod.f90

    r3049 r3065  
    2626! -----------------
    2727! $Id$
     28! dz was replaced by dz(1), error messages related to vertical grid stretching
     29! have been added
     30!
     31! 3049 2018-05-29 13:52:36Z Giersch
    2832! Error messages revised
    2933!
     
    7377!> after spin-up of the CG
    7478!>
     79!> @todo Replace dz(1) appropriatly to account for grid stretching
    7580!> @todo Ensure that code can be compiled for serial and parallel mode. Please
    7681!>       check the placement of the directive "__parallel".
     
    36393644
    36403645       USE control_parameters,                                                    &
    3641            ONLY:  coupling_mode, coupling_mode_remote, coupling_topology, dz
     3646           ONLY:  coupling_mode, coupling_mode_remote, coupling_topology, dz,     &
     3647                  dz_stretch_level_start, message_string
    36423648
    36433649       USE grid_variables,                                                        &
     
    36783684           dxc = dx
    36793685           dyc = dy
    3680            dzc = dz
     3686           dzc = dz(1)
    36813687           cg_nprocs = numprocs
    36823688
    36833689           IF ( myid == 0 )  THEN
    36843690
    3685                CALL MPI_SEND( nxc, 1, MPI_INTEGER  , numprocs, 1,  comm_inter,  &
     3691               CALL MPI_SEND( nxc, 1, MPI_INTEGER  , numprocs, 1,  comm_inter, &
    36863692                   ierr )
    3687                CALL MPI_SEND( nyc, 1, MPI_INTEGER  , numprocs, 2,  comm_inter,  &
     3693               CALL MPI_SEND( nyc, 1, MPI_INTEGER  , numprocs, 2,  comm_inter, &
    36883694                   ierr )
    3689                CALL MPI_SEND( nzc, 1, MPI_INTEGER  , numprocs, 3,  comm_inter,  &
     3695               CALL MPI_SEND( nzc, 1, MPI_INTEGER  , numprocs, 3,  comm_inter, &
    36903696                   ierr )
    3691                CALL MPI_SEND( dxc, 1, MPI_REAL     , numprocs, 4,  comm_inter,  &
     3697               CALL MPI_SEND( dxc, 1, MPI_REAL     , numprocs, 4,  comm_inter, &
    36923698                   ierr )
    3693                CALL MPI_SEND( dyc, 1, MPI_REAL     , numprocs, 5,  comm_inter,  &
     3699               CALL MPI_SEND( dyc, 1, MPI_REAL     , numprocs, 5,  comm_inter, &
    36943700                   ierr )
    3695                CALL MPI_SEND( dzc, 1, MPI_REAL     , numprocs, 6,  comm_inter,  &
     3701               CALL MPI_SEND( dzc, 1, MPI_REAL     , numprocs, 6,  comm_inter, &
    36963702                   ierr )
    3697                CALL MPI_SEND( pdims, 2, MPI_INTEGER, numprocs, 7,  comm_inter,  &
     3703               CALL MPI_SEND( pdims, 2, MPI_INTEGER, numprocs, 7,  comm_inter, &
    36983704                   ierr )
    36993705               CALL MPI_SEND( cg_nprocs, 1, MPI_INTEGER, numprocs, 8,  comm_inter,  &
    37003706                   ierr )
    3701                CALL MPI_RECV( nxf, 1, MPI_INTEGER,   numprocs, 21, comm_inter,  &
     3707               CALL MPI_RECV( nxf, 1, MPI_INTEGER,   numprocs, 21, comm_inter, &
    37023708                   status, ierr )
    3703                CALL MPI_RECV( nyf, 1, MPI_INTEGER,   numprocs, 22, comm_inter,  &
     3709               CALL MPI_RECV( nyf, 1, MPI_INTEGER,   numprocs, 22, comm_inter, &
    37043710                   status, ierr )
    3705                CALL MPI_RECV( nzf, 1, MPI_INTEGER,   numprocs, 23, comm_inter,  &
     3711               CALL MPI_RECV( nzf, 1, MPI_INTEGER,   numprocs, 23, comm_inter, &
    37063712                   status, ierr )
    3707                CALL MPI_RECV( dxf, 1, MPI_REAL,      numprocs, 24, comm_inter,  &
     3713               CALL MPI_RECV( dxf, 1, MPI_REAL,      numprocs, 24, comm_inter, &
    37083714                   status, ierr )
    3709                CALL MPI_RECV( dyf, 1, MPI_REAL,      numprocs, 25, comm_inter,  &
     3715               CALL MPI_RECV( dyf, 1, MPI_REAL,      numprocs, 25, comm_inter, &
    37103716                   status, ierr )
    3711                CALL MPI_RECV( dzf, 1, MPI_REAL,      numprocs, 26, comm_inter,  &
     3717               CALL MPI_RECV( dzf, 1, MPI_REAL,      numprocs, 26, comm_inter, &
    37123718                   status, ierr )
    3713                CALL MPI_RECV( pdims_partner, 2, MPI_INTEGER,                     &
     3719               CALL MPI_RECV( pdims_partner, 2, MPI_INTEGER,                   &
    37143720                   numprocs, 27, comm_inter, status, ierr )
    3715                CALL MPI_RECV( fg_nprocs, 1, MPI_INTEGER,                     &
     3721               CALL MPI_RECV( fg_nprocs, 1, MPI_INTEGER,                       &
    37163722                   numprocs, 28, comm_inter, status, ierr )
    37173723           ENDIF
     
    37253731           CALL MPI_BCAST( pdims_partner, 2, MPI_INTEGER, 0, comm2d, ierr )
    37263732           CALL MPI_BCAST( fg_nprocs,  1, MPI_INTEGER, 0, comm2d, ierr )
     3733           
     3734!
     3735!--        Check if stretching is used within the nested domain. ABS(...) is
     3736!--        necessary because of the default value of -9999999.9_wp (negative)
     3737           IF ( ABS( dz_stretch_level_start(1) ) <= (nzf+1)*dzf )  THEN       
     3738               message_string = 'Stretching in the parent domain is '//        &
     3739                                'only allowed above the nested domain'
     3740               CALL message( 'vertical_nesting_mod', 'PA0497', 1, 2, 0, 6, 0 )
     3741           ENDIF
    37273742
    37283743       ELSEIF ( coupling_mode ==  'vnested_fine' )  THEN
     
    37333748           dxf = dx
    37343749           dyf = dy
    3735            dzf = dz
     3750           dzf = dz(1)
    37363751           fg_nprocs = numprocs
    37373752
     
    37743789
    37753790       ENDIF
    3776  
     3791       
    37773792       ngp_c = ( nxc+1 + 2 * nbgp ) * ( nyc+1 + 2 * nbgp )
    37783793       ngp_f = ( nxf+1 + 2 * nbgp ) * ( nyf+1 + 2 * nbgp )
     
    39103925 
    39113926#if defined( __parallel )
    3912           USE arrays_3d,                                                             &
     3927          USE arrays_3d,                                                       &
    39133928              ONLY:  zu, zw
    39143929             
    3915           USE control_parameters,                                                    &
    3916               ONLY:  coupling_mode
     3930          USE control_parameters,                                              &
     3931              ONLY:  coupling_mode, message_string, number_stretch_level_start
    39173932             
    3918           USE indices,                                                               &
     3933          USE indices,                                                         &
    39193934              ONLY:  nzt
    39203935         
     
    39253940          IMPLICIT NONE
    39263941     
    3927           !-- Allocate and Exchange zuc and zuf, zwc and zwf
     3942!
     3943!--       Allocate and Exchange zuc and zuf, zwc and zwf
    39283944          IF ( coupling_mode(1:8)  == 'vnested_' )  THEN
    39293945         
     
    39323948         
    39333949             IF ( coupling_mode ==  'vnested_crse' )  THEN
    3934          
    3935                    zuc = zu
    3936                    zwc = zw
     3950               
     3951                zuc = zu
     3952                zwc = zw
     3953               
    39373954                IF ( myid == 0 )  THEN
    39383955         
     
    39543971             ELSEIF ( coupling_mode ==  'vnested_fine' )  THEN
    39553972         
    3956                    zuf = zu
    3957                    zwf = zw
     3973!
     3974!--             Check if stretching is used within the nested domain
     3975                IF ( number_stretch_level_start > 0 )  THEN
     3976                   message_string = 'Stretching in the nested domain is not '//&
     3977                           'allowed'
     3978                   CALL message( 'vertical_nesting_mod', 'PA0498', 1, 2, 0, 6, 0 )
     3979                ENDIF
     3980               
     3981                zuf = zu
     3982                zwf = zw
     3983               
    39583984                IF ( myid == 0 )  THEN
    39593985         
  • palm/trunk/SOURCE/virtual_flight_mod.f90

    r3049 r3065  
    2525! -----------------
    2626! $Id$
     27! IF statement revised to consider new vertical grid stretching
     28!
     29! 3049 2018-05-29 13:52:36Z Giersch
    2730! Error messages revised
    2831!
     
    734737
    735738       USE control_parameters,                                                 &
    736            ONLY:  dz, dz_stretch_level   
     739           ONLY:  dz, dz_stretch_level_start   
    737740 
    738741      USE grid_variables,                                                     &
     
    777780!--    if flight position is above the vertical grid-stretching level.
    778781!--    fac=1 if variable is on scalar grid level, fac=0 for w-component.
    779        IF ( z_pos(l) < dz_stretch_level )  THEN
    780           k = ( z_pos(l) + fac * 0.5_wp * dz ) / dz
     782       IF ( z_pos(l) < dz_stretch_level_start(1) )  THEN
     783          k = ( z_pos(l) + fac * 0.5_wp * dz(1) ) / dz(1)
    781784       ELSE
    782785!
  • palm/trunk/SOURCE/wind_turbine_model_mod.f90

    r3049 r3065  
    2626! -----------------
    2727! $Id$
     28! dz was replaced by dz(1), error message concerning grid stretching has been
     29! introduced
     30!
     31! 3049 2018-05-29 13:52:36Z Giersch
    2832! Error messages revised
    2933!
     
    132136!> automatically).
    133137!>
     138!> @todo Replace dz(1) appropriatly to account for grid stretching
    134139!> @todo Revise code according to PALM Coding Standard
    135140!> @todo Implement ADM and ALM turbine models
     
    740745       delta_r_factor = segment_width
    741746       delta_t_factor = segment_length
    742        delta_r_init   = delta_r_factor * MIN( dx, dy, dz)
     747       delta_r_init   = delta_r_factor * MIN( dx, dy, dz(1))
    743748
    744749       DO inot = 1, nturbines
     
    937942
    938943   
     944       USE control_parameters,                                                 &
     945           ONLY:  dz_stretch_level_start
     946   
    939947       IMPLICIT NONE
    940948
     
    9921000                 pi**( 1.0_wp / 6.0_wp ) * eps_kernel
    9931001!
     1002!--    Stretching (non-uniform grid spacing) is not considered in the wind
     1003!--    turbine model. Therefore, vertical stretching has to be applied above
     1004!--    the area where the wtm is active. ABS (...) is required because the
     1005!--    default value of dz_stretch_level_start is -9999999.9_wp (negative).
     1006       IF ( ABS( dz_stretch_level_start(1) ) <= MAXVAL(rcz) + MAXVAL(rr) +     &
     1007       eps_min)  THEN
     1008          WRITE( message_string, * ) 'The lowest level where vertical ',       &
     1009                                     'stretching is applied &have to be ',     &
     1010                                     'greater than ', MAXVAL(rcz) +            &
     1011                                      MAXVAL(rr) + eps_min
     1012          CALL message( 'init_grid', 'PA0484', 1, 2, 0, 6, 0 )
     1013       ENDIF
     1014!
    9941015!--    Square of eps_min:
    9951016       eps_min2 = eps_min**2
     
    10221043          i_hub(inot) = INT(   rcx(inot)                 / dx )
    10231044          j_hub(inot) = INT( ( rcy(inot) + 0.5_wp * dy ) / dy )
    1024           k_hub(inot) = INT( ( rcz(inot) + 0.5_wp * dz ) / dz )
     1045          k_hub(inot) = INT( ( rcz(inot) + 0.5_wp * dz(1) ) / dz(1) )
    10251046
    10261047!
     
    10311052          i_smear(inot) = CEILING( ( rr(inot) + eps_min ) / dx )
    10321053          j_smear(inot) = CEILING( ( rr(inot) + eps_min ) / dy )
    1033           k_smear(inot) = CEILING( ( rr(inot) + eps_min ) / dz )
     1054          k_smear(inot) = CEILING( ( rr(inot) + eps_min ) / dz(1) )
    10341055       
    10351056       ENDDO
     
    11211142!--       surface. All points between z=0 and z=dz/s would already be contained
    11221143!--       in grid box 1.
    1123           index_nacb(inot) = INT( ( rcz(inot) - rnac(inot) ) / dz ) + 1
    1124           index_nact(inot) = INT( ( rcz(inot) + rnac(inot) ) / dz ) + 1
     1144          index_nacb(inot) = INT( ( rcz(inot) - rnac(inot) ) / dz(1) ) + 1
     1145          index_nact(inot) = INT( ( rcz(inot) + rnac(inot) ) / dz(1) ) + 1
    11251146
    11261147!
     
    11481169                            IF ( j == tower_s )  THEN
    11491170                               tow_cd_surf(k,j,i) = ( rcz(inot) -              &
    1150                                     ( k_hub(inot) * dz - 0.5_wp * dz ) )  *    & ! extension in z-direction
     1171                                    ( k_hub(inot) * dz(1) - 0.5_wp * dz(1) ) )*& ! extension in z-direction
    11511172                                  ( ( tower_s + 1.0_wp + 0.5_wp ) * dy    -    &
    11521173                                    ( rcy(inot) - 0.5_wp * dtow(inot) ) ) *    & ! extension in y-direction
     
    11541175                            ELSEIF ( j == tower_n )  THEN
    11551176                               tow_cd_surf(k,j,i) = ( rcz(inot)            -   &
    1156                                     ( k_hub(inot) * dz - 0.5_wp * dz ) )  *    & ! extension in z-direction
     1177                                    ( k_hub(inot) * dz(1) - 0.5_wp * dz(1) ) )*& ! extension in z-direction
    11571178                                  ( ( rcy(inot) + 0.5_wp * dtow(inot) )   -    &
    11581179                                    ( tower_n + 0.5_wp ) * dy )           *    & ! extension in y-direction
     
    11631184                            ELSE
    11641185                               tow_cd_surf(k,j,i) = ( rcz(inot) -              &
    1165                                     ( k_hub(inot) * dz - 0.5_wp * dz ) )  *    &
     1186                                    ( k_hub(inot) * dz(1) - 0.5_wp * dz(1) ) )*&
    11661187                                    dy * turb_cd_tower(inot)
    11671188                            ENDIF
     
    11691190!--                      tower lies completely within one grid box:
    11701191                         ELSE
    1171                             tow_cd_surf(k,j,i) = ( rcz(inot)                 - &
    1172                                        ( k_hub(inot) * dz - 0.5_wp * dz ) ) *  &
     1192                            tow_cd_surf(k,j,i) = ( rcz(inot) - ( k_hub(inot) * &
     1193                                       dz(1) - 0.5_wp * dz(1) ) ) *            &
    11731194                                       dtow(inot) * turb_cd_tower(inot)
    11741195                         ENDIF
     
    11821203!--                         leftmost and rightmost grid box:
    11831204                            IF ( j == tower_s )  THEN                         
    1184                                tow_cd_surf(k,j,i) = dz * (                     &
     1205                               tow_cd_surf(k,j,i) = dz(1) * (                  &
    11851206                                      ( tower_s + 1 + 0.5_wp ) * dy         -  &
    11861207                                      ( rcy(inot) - 0.5_wp * dtow(inot) )      &
    11871208                                                        ) * turb_cd_tower(inot)
    11881209                            ELSEIF ( j == tower_n )  THEN
    1189                                tow_cd_surf(k,j,i) = dz * (                     &
     1210                               tow_cd_surf(k,j,i) = dz(1) * (                  &
    11901211                                      ( rcy(inot) + 0.5_wp * dtow(inot) )   -  &
    11911212                                      ( tower_n + 0.5_wp ) * dy                &
     
    11951216!--                         (where tow_cd_surf = grid box area):
    11961217                            ELSE
    1197                                tow_cd_surf(k,j,i) = dz * dy * turb_cd_tower(inot)
     1218                               tow_cd_surf(k,j,i) = dz(1) * dy *               &
     1219                                                    turb_cd_tower(inot)
    11981220                            ENDIF
    11991221!
    12001222!--                         tower lies completely within one grid box:
    12011223                         ELSE
    1202                             tow_cd_surf(k,j,i) = dz * dtow(inot) *             &
     1224                            tow_cd_surf(k,j,i) = dz(1) * dtow(inot) *          &
    12031225                                                turb_cd_tower(inot)
    12041226                         ENDIF ! end if larger than grid box
     
    13021324       ENDDO   ! end of loop over turbines
    13031325
    1304        tow_cd_surf   = tow_cd_surf   / ( dx * dy * dz )      ! Normalize tower drag
    1305        nac_cd_surf = nac_cd_surf / ( dx * dy * dz )      ! Normalize nacelle drag
     1326       tow_cd_surf   = tow_cd_surf   / ( dx * dy * dz(1) )  ! Normalize tower drag
     1327       nac_cd_surf = nac_cd_surf / ( dx * dy * dz(1) )      ! Normalize nacelle drag
    13061328
    13071329       CALL wtm_read_blade_tables
     
    17461768                   ii =   rbx(ring,rseg) * ddx
    17471769                   jj = ( rby(ring,rseg) - 0.5_wp * dy ) * ddy
    1748                    kk = ( rbz(ring,rseg) + 0.5_wp * dz ) / dz
     1770                   kk = ( rbz(ring,rseg) + 0.5_wp * dz(1) ) / dz(1)
    17491771!
    17501772!--                Interpolate only if all required information is available on
     
    17761798
    17771799                         u_int_1_l(inot,ring,rseg) = u_int_l          +        &
    1778                                      ( rbz(ring,rseg) - zu(kk) ) / dz *        &
     1800                                     ( rbz(ring,rseg) - zu(kk) ) / dz(1) *     &
    17791801                                     ( u_int_u - u_int_l )
    17801802
     
    17911813                   ii = ( rbx(ring,rseg) - 0.5_wp * dx ) * ddx
    17921814                   jj =   rby(ring,rseg)                 * ddy
    1793                    kk = ( rbz(ring,rseg) + 0.5_wp * dz ) / dz
     1815                   kk = ( rbz(ring,rseg) + 0.5_wp * dz(1) ) / dz(1)
    17941816!
    17951817!--                Interpolate only if all required information is available on
     
    18211843
    18221844                         v_int_1_l(inot,ring,rseg) = v_int_l +                 &
    1823                                      ( rbz(ring,rseg) - zu(kk) ) / dz *        &
     1845                                     ( rbz(ring,rseg) - zu(kk) ) / dz(1) *     &
    18241846                                     ( v_int_u - v_int_l )
    18251847
     
    18361858                   ii = ( rbx(ring,rseg) - 0.5_wp * dx ) * ddx
    18371859                   jj = ( rby(ring,rseg) - 0.5_wp * dy ) * ddy
    1838                    kk =   rbz(ring,rseg)                 / dz
     1860                   kk =   rbz(ring,rseg)                 / dz(1)
    18391861!
    18401862!--                Interpolate only if all required information is available on
     
    18661888
    18671889                         w_int_1_l(inot,ring,rseg) = w_int_l +                 &
    1868                                      ( rbz(ring,rseg) - zw(kk) ) / dz *        &
     1890                                     ( rbz(ring,rseg) - zw(kk) ) / dz(1) *     &
    18691891                                     ( w_int_u - w_int_l )
    18701892                      ELSE
     
    22732295                            dist_u_3d = ( i * dx               - rbx(ring,rseg) )**2 + &
    22742296                                        ( j * dy + 0.5_wp * dy - rby(ring,rseg) )**2 + &
    2275                                         ( k * dz - 0.5_wp * dz - rbz(ring,rseg) )**2
     2297                                        ( k * dz(1) - 0.5_wp * dz(1) - rbz(ring,rseg) )**2
    22762298                            dist_v_3d = ( i * dx + 0.5_wp * dx - rbx(ring,rseg) )**2 + &
    22772299                                        ( j * dy               - rby(ring,rseg) )**2 + &
    2278                                         ( k * dz - 0.5_wp * dz - rbz(ring,rseg) )**2
     2300                                        ( k * dz(1) - 0.5_wp * dz(1) - rbz(ring,rseg) )**2
    22792301                            dist_w_3d = ( i * dx + 0.5_wp * dx - rbx(ring,rseg) )**2 + &
    22802302                                        ( j * dy + 0.5_wp * dy - rby(ring,rseg) )**2 + &
    2281                                         ( k * dz               - rbz(ring,rseg) )**2
     2303                                        ( k * dz(1)               - rbz(ring,rseg) )**2
    22822304
    22832305!
  • palm/trunk/SOURCE/write_restart_data_mod.f90

    r3004 r3065  
    2525! -----------------
    2626! $Id$
     27! New parameters concerning vertical grid stretching have been added
     28!
     29! 3004 2018-04-27 12:33:25Z Giersch
    2730! precipitation_rate_av removed
    2831!
     
    380383       CALL wrd_write_string( 'dz' )
    381384       WRITE ( 14 )  dz
    382 
     385       
    383386       CALL wrd_write_string( 'dz_max' )
    384387       WRITE ( 14 )  dz_max
     
    386389       CALL wrd_write_string( 'dz_stretch_factor' )
    387390       WRITE ( 14 )  dz_stretch_factor
    388 
     391       
     392       CALL wrd_write_string( 'dz_stretch_factor_array' )
     393       WRITE ( 14 )  dz_stretch_factor_array
     394       
    389395       CALL wrd_write_string( 'dz_stretch_level' )
    390396       WRITE ( 14 )  dz_stretch_level
    391397
     398       CALL wrd_write_string( 'dz_stretch_level_end' )
     399       WRITE ( 14 )  dz_stretch_level_end
     400       
     401       CALL wrd_write_string( 'dz_stretch_level_start' )
     402       WRITE ( 14 )  dz_stretch_level_start
     403       
    392404       CALL wrd_write_string( 'e_min' )
    393405       WRITE ( 14 )  e_min
Note: See TracChangeset for help on using the changeset viewer.