Ignore:
Timestamp:
Aug 25, 2020 7:52:08 AM (4 years ago)
Author:
raasch
Message:

files re-formatted to follow the PALM coding standard

File:
1 edited

Legend:

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

    r4521 r4648  
    11!> @file init_masks.f90
    2 !------------------------------------------------------------------------------!
     2!--------------------------------------------------------------------------------------------------!
    33! This file is part of the PALM model system.
    44!
    5 ! PALM is free software: you can redistribute it and/or modify it under the
    6 ! terms of the GNU General Public License as published by the Free Software
    7 ! Foundation, either version 3 of the License, or (at your option) any later
    8 ! version.
    9 !
    10 ! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
    11 ! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
    12 ! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
    13 !
    14 ! You should have received a copy of the GNU General Public License along with
    15 ! PALM. If not, see <http://www.gnu.org/licenses/>.
     5! PALM is free software: you can redistribute it and/or modify it under the terms of the GNU General
     6! Public License as published by the Free Software Foundation, either version 3 of the License, or
     7! (at your option) any later version.
     8!
     9! PALM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
     10! implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
     11! Public License for more details.
     12!
     13! You should have received a copy of the GNU General Public License along with PALM. If not, see
     14! <http://www.gnu.org/licenses/>.
    1615!
    1716! Copyright 1997-2020 Leibniz Universitaet Hannover
    18 !------------------------------------------------------------------------------!
     17!--------------------------------------------------------------------------------------------------!
    1918!
    2019! Current revisions:
    2120! -----------------
    22 ! 
    23 ! 
     21!
     22!
    2423! Former revisions:
    2524! -----------------
    2625! $Id$
     26! file re-formatted to follow the PALM coding standard
     27!
     28! 4521 2020-05-06 11:39:49Z schwenkel
    2729! Rename variable
    28 ! 
     30!
    2931! 4502 2020-04-17 16:14:16Z schwenkel
    3032! Implementation of ice microphysics
    31 ! 
     33!
    3234! 4444 2020-03-05 15:59:50Z raasch
    3335! bugfix: cpp-directives for serial mode added
    34 ! 
     36!
    3537! 4360 2020-01-07 11:25:50Z suehring
    3638! Corrected "Former revisions" section
    37 ! 
     39!
    3840! 4069 2019-07-01 14:05:51Z Giersch
    39 ! Masked output running index mid has been introduced as a local variable to
    40 ! avoid runtime error (Loop variable has been modified) in time_integration
    41 ! 
     41! Masked output running index mid has been introduced as a local variable to avoid runtime error
     42! (Loop variable has been modified) in time_integration
     43!
    4244! 3766 2019-02-26 16:23:41Z raasch
    4345! unused variables removed
    44 ! 
     46!
    4547! 3687 2019-01-22 10:42:06Z knoop
    4648! unused variables removed
    47 ! 
     49!
    4850! 3655 2019-01-07 16:51:22Z knoop
    49 ! Move the control parameter "salsa" from salsa_mod to control_parameters
    50 ! (M. Kurppa)
     51! Move the control parameter "salsa" from salsa_mod to control_parameters (M. Kurppa)
    5152!
    5253! 410 2009-12-04 17:05:40Z letzel
     
    5758! ------------
    5859!> Initialize masked data output
    59 !------------------------------------------------------------------------------!
     60!--------------------------------------------------------------------------------------------------!
    6061 SUBROUTINE init_masks
    6162
    62     USE arrays_3d,                                                             &
     63    USE arrays_3d,                                                                                 &
    6364        ONLY:  zu, zw
    6465
    65     USE bulk_cloud_model_mod,                                                  &
    66         ONLY: bulk_cloud_model, microphysics_morrison, microphysics_seifert,   &
    67               microphysics_ice_phase
    68 
    69     USE control_parameters,                                                    &
    70         ONLY:  constant_diffusion, cloud_droplets,                             &
    71                data_output_masks, data_output_masks_user,                      &
    72                doav, doav_n, domask, domask_no, dz, dz_stretch_level_start,    &
    73                humidity, mask, masks, mask_scale, mask_i,                      &
    74                mask_i_global, mask_j, mask_j_global, mask_k, mask_k_global,    &
    75                mask_k_over_surface,                                            &
    76                mask_loop, mask_size, mask_size_l, mask_start_l,                &
    77                mask_surface, mask_x,                                           &
    78                mask_x_loop, mask_xyz_dimension, mask_y, mask_y_loop, mask_z,   &
    79                mask_z_loop, max_masks,  message_string,                        &
    80                passive_scalar, ocean_mode, varnamelength
    81 
    82     USE grid_variables,                                                        &
     66    USE bulk_cloud_model_mod,                                                                      &
     67        ONLY: bulk_cloud_model, microphysics_ice_phase, microphysics_morrison,                     &
     68              microphysics_seifert
     69
     70
     71    USE control_parameters,                                                                        &
     72        ONLY:  constant_diffusion, cloud_droplets, data_output_masks, data_output_masks_user, doav,&
     73               doav_n, domask, domask_no, dz, dz_stretch_level_start, humidity, mask, masks,       &
     74               mask_scale, mask_i, mask_i_global, mask_j, mask_j_global, mask_k, mask_k_global,    &
     75               mask_k_over_surface, mask_loop, mask_size, mask_size_l, mask_start_l, mask_surface, &
     76               mask_x, mask_x_loop, mask_xyz_dimension, mask_y, mask_y_loop, mask_z, mask_z_loop,  &
     77               max_masks,  message_string, passive_scalar, ocean_mode, varnamelength
     78
     79    USE grid_variables,                                                                            &
    8380        ONLY:  dx, dy
    8481
    85     USE indices,                                                               &
     82    USE indices,                                                                                   &
    8683        ONLY:  nx, nxl, nxr, ny, nyn, nys, nz, nzb, nzt
    8784
    8885    USE kinds
    8986
    90     USE module_interface,                                                      &
     87    USE module_interface,                                                                          &
    9188        ONLY:  module_interface_init_masks
    9289
    93     USE netcdf_interface,                                                      &
     90    USE netcdf_interface,                                                                          &
    9491        ONLY:  domask_unit, netcdf_data_format
    9592
    96     USE particle_attributes,                                                   &
     93    USE particle_attributes,                                                                       &
    9794        ONLY:  particle_advection
    9895
     
    103100    CHARACTER (LEN=varnamelength) ::  var  !< contains variable name
    104101    CHARACTER (LEN=7)             ::  unit !< contains unit of variable
    105    
     102
    106103    CHARACTER (LEN=varnamelength), DIMENSION(max_masks,100) ::  do_mask      !< list of output variables
    107104    CHARACTER (LEN=varnamelength), DIMENSION(max_masks,100) ::  do_mask_user !< list of user-specified output variables
     
    120117    INTEGER(iwp) ::  sender       !< PE id of sending PE
    121118#endif
    122    
     119
    123120    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  tmp_array !< temporary 1D array
    124121
     
    126123
    127124!
    128 !-- Initial values are explicitly set here due to a bug in the Cray compiler
    129 !-- in case of assignments of initial values in declaration statements for
    130 !-- arrays with more than 9999 elements (appears with -eD only)
     125!-- Initial values are explicitly set here due to a bug in the Cray compiler in case of assignments
     126!-- of initial values in declaration statements for arrays with more than 9999 elements
     127!-- (appears with -eD only)
    131128    domask = ' '
    132129
     
    135132    ALLOCATE( tmp_array( MAX(nx,ny,nz)+2 ) )
    136133
    137     ALLOCATE( mask_i(max_masks,nxr-nxl+2), &
    138               mask_j(max_masks,nyn-nys+2), &
     134    ALLOCATE( mask_i(max_masks,nxr-nxl+2),                                                         &
     135              mask_j(max_masks,nyn-nys+2),                                                         &
    139136              mask_k(max_masks,nzt-nzb+2) )
    140137!
    141138!-- internal mask arrays ("mask,dimension,selection")
    142     ALLOCATE( mask(max_masks,3,mask_xyz_dimension), &
    143               mask_loop(max_masks,3,3) )
    144    
    145 !
    146 !-- Parallel mask output not yet supported. In check_parameters data format
    147 !-- is restricted and is switched back to non-parallel output. Therefore the
    148 !-- following error can not occur at the moment.
     139    ALLOCATE( mask(max_masks,3,mask_xyz_dimension), mask_loop(max_masks,3,3) )
     140
     141!
     142!-- Parallel mask output not yet supported. In check_parameters data format is restricted and is
     143!-- switched back to non-parallel output. Therefore the following error can not occur at the moment.
    149144    IF ( netcdf_data_format > 4 )  THEN
    150        message_string = 'netCDF file formats '//                               &
    151                         '5 and 6 (with parallel I/O support)'//                &
     145       message_string = 'netCDF file formats '//                                                   &
     146                        '5 and 6 (with parallel I/O support)'//                                    &
    152147                        ' are currently not supported.'
    153148       CALL message( 'init_masks', 'PA0328', 1, 2, 0, 6, 0 )
     
    157152!-- Store data output parameters for masked data output in few shared arrays
    158153    DO  mid = 1, masks
    159    
     154
    160155       do_mask     (mid,:) = data_output_masks(mid,:)
    161156       do_mask_user(mid,:) = data_output_masks_user(mid,:)
    162        mask      (mid,1,:) = mask_x(mid,:) 
     157       mask      (mid,1,:) = mask_x(mid,:)
    163158       mask      (mid,2,:) = mask_y(mid,:)
    164        mask      (mid,3,:) = mask_z(mid,:) 
     159       mask      (mid,3,:) = mask_z(mid,:)
    165160!
    166161!--    Flag a mask as terrain following
     
    169164       ENDIF
    170165
    171        IF ( mask_x_loop(mid,1) == -1.0_wp  .AND.  mask_x_loop(mid,2) == -1.0_wp&
    172             .AND.  mask_x_loop(mid,3) == -1.0_wp )  THEN
     166       IF ( mask_x_loop(mid,1) == -1.0_wp  .AND.  mask_x_loop(mid,2) == -1.0_wp  .AND.             &
     167            mask_x_loop(mid,3) == -1.0_wp )  THEN
    173168          mask_loop(mid,1,1:2) = -1.0_wp
    174169          mask_loop(mid,1,3)   =  0.0_wp
     
    176171          mask_loop(mid,1,:) = mask_x_loop(mid,:)
    177172       ENDIF
    178        IF ( mask_y_loop(mid,1) == -1.0_wp  .AND.  mask_y_loop(mid,2) == -1.0_wp&
    179             .AND.  mask_y_loop(mid,3) == -1.0_wp )  THEN
     173       IF ( mask_y_loop(mid,1) == -1.0_wp  .AND.  mask_y_loop(mid,2) == -1.0_wp  .AND.             &
     174            mask_y_loop(mid,3) == -1.0_wp )  THEN
    180175          mask_loop(mid,2,1:2) = -1.0_wp
    181176          mask_loop(mid,2,3)   =  0.0_wp
     
    183178          mask_loop(mid,2,:) = mask_y_loop(mid,:)
    184179       ENDIF
    185        IF ( mask_z_loop(mid,1) == -1.0_wp  .AND.  mask_z_loop(mid,2) == -1.0_wp&
    186             .AND.  mask_z_loop(mid,3) == -1.0_wp )  THEN
     180       IF ( mask_z_loop(mid,1) == -1.0_wp  .AND.  mask_z_loop(mid,2) == -1.0_wp  .AND.             &
     181            mask_z_loop(mid,3) == -1.0_wp )  THEN
    187182          mask_loop(mid,3,1:2) = -1.0_wp
    188183          mask_loop(mid,3,3)   =  0.0_wp
     
    190185          mask_loop(mid,3,:) = mask_z_loop(mid,:)
    191186       ENDIF
    192        
     187
    193188    ENDDO
    194    
     189
    195190    mask_i = -1; mask_j = -1; mask_k = -1
    196    
     191
    197192!
    198193!-- Global arrays are required by define_netcdf_header.
    199194    IF ( myid == 0  .OR.  netcdf_data_format > 4 )  THEN
    200        ALLOCATE( mask_i_global(max_masks,nx+2), &
    201                  mask_j_global(max_masks,ny+2), &
     195       ALLOCATE( mask_i_global(max_masks,nx+2),                                                    &
     196                 mask_j_global(max_masks,ny+2),                                                    &
    202197                 mask_k_global(max_masks,nz+2) )
    203198       mask_i_global = -1; mask_j_global = -1; mask_k_global = -1
     
    217212          DO  WHILE ( do_mask_user(mid,j) /= ' '  .AND.  j <= 100 )
    218213             IF ( i > 100 )  THEN
    219                 WRITE ( message_string, * ) 'number of output quantitities ',  &
    220                      'given by data_output_mask and data_output_mask_user ',   &
    221                      'exceeds the limit of 100'
     214                WRITE ( message_string, * ) 'number of output quantitities ',                      &
     215                                            'given by data_output_mask and data_output_mask_user ',&
     216                                            'exceeds the limit of 100'
    222217                CALL message( 'init_masks', 'PA0329', 1, 2, 0, 6, 0 )
    223218             ENDIF
     
    249244             CASE ( 'e' )
    250245                IF ( constant_diffusion )  THEN
    251                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    252                         '" requires constant_diffusion = .FALSE.'
     246                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     247                                               '" requires constant_diffusion = .FALSE.'
    253248                   CALL message( 'init_masks', 'PA0103', 1, 2, 0, 6, 0 )
    254249                ENDIF
     
    257252             CASE ( 'thetal' )
    258253                IF ( .NOT. bulk_cloud_model )  THEN
    259                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    260                         '" requires bulk_cloud_model = .TRUE.'
     254                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     255                                               '" requires bulk_cloud_model = .TRUE.'
    261256                   CALL message( 'init_masks', 'PA0108', 1, 2, 0, 6, 0 )
    262257                ENDIF
     
    265260             CASE ( 'nc' )
    266261                IF ( .NOT. bulk_cloud_model )  THEN
    267                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    268                         '" requires bulk_cloud_model = .TRUE.'
     262                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     263                                               '" requires bulk_cloud_model = .TRUE.'
    269264                   CALL message( 'init_masks', 'PA0108', 1, 2, 0, 6, 0 )
    270                  ELSEIF ( .NOT. microphysics_morrison ) THEN
    271                    message_string = 'output of "' // TRIM( var ) // '" ' //    &
    272                          'requires  = morrison'
     265                ELSEIF ( .NOT. microphysics_morrison )  THEN
     266                   message_string = 'output of "' // TRIM( var ) // '" ' // 'requires  = morrison'
    273267                   CALL message( 'check_parameters', 'PA0359', 1, 2, 0, 6, 0 )
    274268                ENDIF
     
    277271             CASE ( 'ni' )
    278272                IF ( .NOT. bulk_cloud_model )  THEN
    279                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    280                         '" requires bulk_cloud_model = .TRUE.'
     273                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     274                                               '" requires bulk_cloud_model = .TRUE.'
    281275                   CALL message( 'init_masks', 'PA0108', 1, 2, 0, 6, 0 )
    282                  ELSEIF ( .NOT. microphysics_ice_phase ) THEN
    283                    message_string = 'output of "' // TRIM( var ) // '" ' //    &
    284                          'requires  microphysics_ice_phase = .TRUE.'
     276                 ELSEIF ( .NOT. microphysics_ice_phase )  THEN
     277                   message_string = 'output of "' // TRIM( var ) // '" ' //                        &
     278                                    'requires  microphysics_ice_phase = .TRUE.'
    285279                   CALL message( 'check_parameters', 'PA0359', 1, 2, 0, 6, 0 )
    286280                ENDIF
     
    289283             CASE ( 'nr' )
    290284                IF ( .NOT. bulk_cloud_model )  THEN
    291                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    292                         '" requires bulk_cloud_model = .TRUE.'
     285                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     286                                               '" requires bulk_cloud_model = .TRUE.'
    293287                   CALL message( 'init_masks', 'PA0108', 1, 2, 0, 6, 0 )
    294                  ELSEIF ( .NOT. microphysics_seifert ) THEN
    295                    message_string = 'output of "' // TRIM( var ) // '"' //     &
    296                          'requires cloud_scheme = seifert_beheng'
     288                ELSEIF ( .NOT. microphysics_seifert ) THEN
     289                   message_string = 'output of "' // TRIM( var ) // '"' //                         &
     290                                    'requires cloud_scheme = seifert_beheng'
    297291                   CALL message( 'check_parameters', 'PA0359', 1, 2, 0, 6, 0 )
    298292                ENDIF
     
    301295             CASE ( 'pc', 'pr' )
    302296                IF ( .NOT. particle_advection )  THEN
    303                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    304                         '" requires a "particles_par"-NAMELIST in the ',       &
    305                         'parameter file (PARIN)'
     297                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     298                                               '" requires a "particles_par"-NAMELIST in the ',    &
     299                                               'parameter file (PARIN)'
    306300                   CALL message( 'init_masks', 'PA0104', 1, 2, 0, 6, 0 )
    307301                ENDIF
     
    311305             CASE ( 'q', 'thetav' )
    312306                IF ( .NOT. humidity )  THEN
    313                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    314                         '" requires humidity = .TRUE.'
     307                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     308                                               '" requires humidity = .TRUE.'
    315309                   CALL message( 'init_masks', 'PA0105', 1, 2, 0, 6, 0 )
    316310                ENDIF
     
    320314             CASE ( 'qc' )
    321315                IF ( .NOT. bulk_cloud_model )  THEN
    322                    message_string = 'output of "' // TRIM( var ) // '"' //     &
    323                             'requires bulk_cloud_model = .TRUE.'
     316                   message_string = 'output of "' // TRIM( var ) // '"' //                         &
     317                                    'requires bulk_cloud_model = .TRUE.'
    324318                   CALL message( 'check_parameters', 'PA0108', 1, 2, 0, 6, 0 )
    325319                ENDIF
     
    328322             CASE ( 'ql' )
    329323                IF ( .NOT. ( bulk_cloud_model  .OR.  cloud_droplets ) )  THEN
    330                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    331                         '" requires bulk_cloud_model = .TRUE. or ',            &
    332                         'cloud_droplets = .TRUE.'
     324                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     325                                               '" requires bulk_cloud_model = .TRUE. or ',         &
     326                                               'cloud_droplets = .TRUE.'
    333327                   CALL message( 'init_masks', 'PA0106', 1, 2, 0, 6, 0 )
    334328                ENDIF
     
    337331             CASE ( 'ql_c', 'ql_v', 'ql_vp' )
    338332                IF ( .NOT. cloud_droplets )  THEN
    339                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    340                         '" requires cloud_droplets = .TRUE.'
     333                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     334                                               '" requires cloud_droplets = .TRUE.'
    341335                   CALL message( 'init_masks', 'PA0107', 1, 2, 0, 6, 0 )
    342336                ENDIF
     
    347341             CASE ( 'qv' )
    348342                IF ( .NOT. bulk_cloud_model )  THEN
    349                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    350                         '" requires bulk_cloud_model = .TRUE.'
     343                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     344                        '                      " requires bulk_cloud_model = .TRUE.'
    351345                   CALL message( 'init_masks', 'PA0108', 1, 2, 0, 6, 0 )
    352346                ENDIF
     
    355349             CASE ( 'qi' )
    356350                IF ( .NOT. bulk_cloud_model )  THEN
    357                    message_string = 'output of "' // TRIM( var ) // '" ' //    &
    358                             'requires bulk_cloud_model = .TRUE.'
     351                   message_string = 'output of "' // TRIM( var ) // '" ' //                        &
     352                                    'requires bulk_cloud_model = .TRUE.'
    359353                   CALL message( 'check_parameters', 'PA0108', 1, 2, 0, 6, 0 )
    360354                ELSEIF ( .NOT. microphysics_ice_phase ) THEN
    361                    message_string = 'output of "' // TRIM( var ) // '" ' //    &
    362                             'requires microphysics_ice_phase = .TRUE.'
     355                   message_string = 'output of "' // TRIM( var ) // '" ' //                        &
     356                                    'requires microphysics_ice_phase = .TRUE.'
    363357                   CALL message( 'check_parameters', 'PA0359', 1, 2, 0, 6, 0 )
    364358                ENDIF
     
    367361             CASE ( 'qr' )
    368362                IF ( .NOT. bulk_cloud_model )  THEN
    369                    message_string = 'output of "' // TRIM( var ) // '" ' //    &
    370                             'requires bulk_cloud_model = .TRUE.'
     363                   message_string = 'output of "' // TRIM( var ) // '" ' //                        &
     364                                    'requires bulk_cloud_model = .TRUE.'
    371365                   CALL message( 'check_parameters', 'PA0108', 1, 2, 0, 6, 0 )
    372366                ELSEIF ( .NOT. microphysics_seifert ) THEN
    373                    message_string = 'output of "' // TRIM( var ) // '" ' //    &
    374                             'requires cloud_scheme = seifert_beheng'
     367                   message_string = 'output of "' // TRIM( var ) // '" ' //                        &
     368                                    'requires cloud_scheme = seifert_beheng'
    375369                   CALL message( 'check_parameters', 'PA0359', 1, 2, 0, 6, 0 )
    376370                ENDIF
     
    379373             CASE ( 'rho_sea_water' )
    380374                IF ( .NOT. ocean_mode )  THEN
    381                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    382                         '" requires ocean mode'
     375                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     376                                               '" requires ocean mode'
    383377                   CALL message( 'init_masks', 'PA0109', 1, 2, 0, 6, 0 )
    384378                ENDIF
     
    387381             CASE ( 's' )
    388382                IF ( .NOT. passive_scalar )  THEN
    389                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    390                         '" requires passive_scalar = .TRUE.'
     383                   WRITE ( message_string, * ) 'output of "', TRIM( var ),                         &
     384                                               '" requires passive_scalar = .TRUE.'
    391385                   CALL message( 'init_masks', 'PA0110', 1, 2, 0, 6, 0 )
    392386                ENDIF
     
    395389             CASE ( 'sa' )
    396390                IF ( .NOT. ocean_mode )  THEN
    397                    WRITE ( message_string, * ) 'output of "', TRIM( var ),     &
    398                         '" requires ocean mode'
     391                   WRITE ( message_string, * ) 'output of "', TRIM( var ), '" requires ocean mode'
    399392                   CALL message( 'init_masks', 'PA0109', 1, 2, 0, 6, 0 )
    400393                ENDIF
     
    402395
    403396             CASE ( 'us*', 't*', 'lwp*', 'pra*', 'prr*', 'z0*', 'z0h*' )
    404                 WRITE ( message_string, * ) 'illegal value for data_',         &
    405                      'output: "', TRIM( var ), '" is only allowed',            &
    406                      'for horizontal cross section'
     397                WRITE ( message_string, * ) 'illegal value for data_', 'output: "', TRIM( var ),   &
     398                                            '" is only allowed', 'for horizontal cross section'
    407399                CALL message( 'init_masks', 'PA0111', 1, 2, 0, 6, 0 )
    408400
     
    422414                IF ( unit == 'illegal' )  THEN
    423415                   IF ( do_mask_user(mid,1) /= ' ' )  THEN
    424                       WRITE ( message_string, * ) 'illegal value for data_',   &
    425                            'output_masks or data_output_masks_user: "',        &
    426                            TRIM( do_mask(mid,i) ), '"'
     416                      WRITE ( message_string, * ) 'illegal value for data_',                       &
     417                                                  'output_masks or data_output_masks_user: "',     &
     418                                                  TRIM( do_mask(mid,i) ), '"'
    427419                      CALL message( 'init_masks', 'PA0018', 1, 2, 0, 6, 0 )
    428420                   ELSE
    429                       WRITE ( message_string, * ) 'illegal value for data_',   &
    430                            ' output_masks : "', TRIM( do_mask(mid,i) ), '"'
     421                      WRITE ( message_string, * ) 'illegal value for data_',                       &
     422                                                  ' output_masks : "', TRIM( do_mask(mid,i) ), '"'
    431423                      CALL message( 'init_masks', 'PA0330', 1, 2, 0, 6, 0 )
    432424                   ENDIF
     
    471463       ELSE
    472464!
    473 !--       Set vertical mask locations and size in case of terrain-following
    474 !--       output
     465!--       Set vertical mask locations and size in case of terrain-following output
    475466          count = 0
    476467          DO  WHILE ( mask_k_over_surface(mid, count+1) >= 0 )
    477468             m = mask_k_over_surface(mid, count+1)
    478469             IF ( m > nz+1 )  THEN
    479                 WRITE ( message_string, '(I3,A,I3,A,I1,3A,I3)' )               &
    480                      m,' in mask ',mid,' along dimension ', 3,                 &
    481                      ' exceeds (nz+1) = ',nz+1
     470                WRITE ( message_string, '(I3,A,I3,A,I1,3A,I3)' )  m, ' in mask ', mid,             &
     471                                                                  ' along dimension ', 3,          &
     472                                                                  ' exceeds (nz+1) = ', nz+1
    482473                CALL message( 'init_masks', 'PA0331', 1, 2, 0, 6, 0 )
    483474             ENDIF
     
    491482       ENDIF
    492483!
    493 !--    Set global masks along all three dimensions (required by
    494 !--    define_netcdf_header).
     484!--    Set global masks along all three dimensions (required by define_netcdf_header).
    495485#if defined( __parallel )
    496486!
    497 !--    PE0 receives partial arrays from all processors of the respective mask
    498 !--    and outputs them. Here a barrier has to be set, because otherwise
    499 !--    "-MPI- FATAL: Remote protocol queue full" may occur.
     487!--    PE0 receives partial arrays from all processors of the respective mask and outputs them. Here
     488!--    a barrier has to be set, because otherwise "-MPI- FATAL: Remote protocol queue full" may
     489!--    occur.
    500490
    501491       CALL MPI_BARRIER( comm2d, ierr )
     
    519509!--          Receive index limits first, then arrays.
    520510!--          Index limits are received in arbitrary order from the PEs.
    521              CALL MPI_RECV( ind(1), 6, MPI_INTEGER, MPI_ANY_SOURCE, 0,  &
    522                   comm2d, status, ierr )
     511             CALL MPI_RECV( ind(1), 6, MPI_INTEGER, MPI_ANY_SOURCE, 0, comm2d, status, ierr )
    523512!
    524513!--          Not all PEs have data for the mask.
    525514             IF ( ind(1) /= -9999 )  THEN
    526515                sender = status(MPI_SOURCE)
    527                 CALL MPI_RECV( tmp_array(ind(1)), ind(2)-ind(1)+1, &
    528                                MPI_INTEGER, sender, 1, comm2d, status, ierr )
     516                CALL MPI_RECV( tmp_array(ind(1)), ind(2)-ind(1)+1, MPI_INTEGER, sender, 1, comm2d, &
     517                               status, ierr )
    529518                mask_i_global(mid,ind(1):ind(2)) = tmp_array(ind(1):ind(2))
    530                 CALL MPI_RECV( tmp_array(ind(3)), ind(4)-ind(3)+1, &
    531                                MPI_INTEGER, sender, 2, comm2d, status, ierr )
     519                CALL MPI_RECV( tmp_array(ind(3)), ind(4)-ind(3)+1, MPI_INTEGER, sender, 2, comm2d, &
     520                               status, ierr )
    532521                mask_j_global(mid,ind(3):ind(4)) = tmp_array(ind(3):ind(4))
    533                 CALL MPI_RECV( tmp_array(ind(5)), ind(6)-ind(5)+1, &
    534                                MPI_INTEGER, sender, 3, comm2d, status, ierr )
     522                CALL MPI_RECV( tmp_array(ind(5)), ind(6)-ind(5)+1, MPI_INTEGER, sender, 3, comm2d, &
     523                               status, ierr )
    535524                mask_k_global(mid,ind(5):ind(6)) = tmp_array(ind(5):ind(6))
    536525             ENDIF
     
    539528       ELSE
    540529!
    541 !--       If at least part of the mask resides on the PE, send the index limits
    542 !--       for the target array, otherwise send -9999 to PE0.
    543           IF ( mask_size_l(mid,1) > 0  .AND.  mask_size_l(mid,2) > 0  .AND.  &
     530!--       If at least part of the mask resides on the PE, send the index limits for the target
     531!--       array, otherwise send -9999 to PE0.
     532          IF ( mask_size_l(mid,1) > 0  .AND.  mask_size_l(mid,2) > 0  .AND.                        &
    544533               mask_size_l(mid,3) > 0  )  THEN
    545534             ind(1) = mask_start_l(mid,1)
     
    559548          IF ( ind(1) /= -9999 )  THEN
    560549             tmp_array(:mask_size_l(mid,1)) = mask_i(mid,:mask_size_l(mid,1))
    561              CALL MPI_SEND( tmp_array(1), mask_size_l(mid,1),  &
    562                             MPI_INTEGER, 0, 1, comm2d, ierr )
     550             CALL MPI_SEND( tmp_array(1), mask_size_l(mid,1), MPI_INTEGER, 0, 1, comm2d, ierr )
    563551             tmp_array(:mask_size_l(mid,2)) = mask_j(mid,:mask_size_l(mid,2))
    564              CALL MPI_SEND( tmp_array(1), mask_size_l(mid,2),  &
    565                             MPI_INTEGER, 0, 2, comm2d, ierr )
     552             CALL MPI_SEND( tmp_array(1), mask_size_l(mid,2), MPI_INTEGER, 0, 2, comm2d, ierr )
    566553             tmp_array(:mask_size_l(mid,3)) = mask_k(mid,:mask_size_l(mid,3))
    567              CALL MPI_SEND( tmp_array(1), mask_size_l(mid,3),  &
    568                             MPI_INTEGER, 0, 3, comm2d, ierr )
     554             CALL MPI_SEND( tmp_array(1), mask_size_l(mid,3), MPI_INTEGER, 0, 3, comm2d, ierr )
    569555          ENDIF
    570556       ENDIF
    571557!
    572 !--    A barrier has to be set, because otherwise some PEs may proceed too fast
    573 !--    so that PE0 may receive wrong data on tag 0.
     558!--    A barrier has to be set, because otherwise some PEs may proceed too fast so that PE0 may
     559!--    receive wrong data on tag 0.
    574560       CALL MPI_BARRIER( comm2d, ierr )
    575        
     561
    576562       IF ( netcdf_data_format > 4 )  THEN
    577          
    578           CALL MPI_BCAST( mask_i_global(mid,:), nx+2, MPI_INTEGER, 0, comm2d, &
    579                           ierr )
    580           CALL MPI_BCAST( mask_j_global(mid,:), ny+2, MPI_INTEGER, 0, comm2d, &
    581                           ierr )
    582           CALL MPI_BCAST( mask_k_global(mid,:), nz+2, MPI_INTEGER, 0, comm2d, &
    583                           ierr )
    584      
     563
     564          CALL MPI_BCAST( mask_i_global(mid,:), nx+2, MPI_INTEGER, 0, comm2d, ierr )
     565          CALL MPI_BCAST( mask_j_global(mid,:), ny+2, MPI_INTEGER, 0, comm2d, ierr )
     566          CALL MPI_BCAST( mask_k_global(mid,:), nz+2, MPI_INTEGER, 0, comm2d, ierr )
     567
    585568       ENDIF
    586569
     
    596579    DEALLOCATE( tmp_array )
    597580!
    598 !-- Internal mask arrays cannot be deallocated on PE 0 because they are
    599 !-- required for header output on PE 0.
     581!-- Internal mask arrays cannot be deallocated on PE 0 because they are required for header output
     582!-- on PE 0.
    600583    IF ( myid /= 0 )  DEALLOCATE( mask, mask_loop )
    601584
    602585 CONTAINS
    603586
    604 !------------------------------------------------------------------------------!
     587!--------------------------------------------------------------------------------------------------!
    605588! Description:
    606589! ------------
    607590!> Set local mask for each subdomain along 'dim' direction.
    608 !------------------------------------------------------------------------------!
    609     SUBROUTINE set_mask_locations( dim, dxyz, dxyz_string, nxyz, nxyz_string, &
    610                                    lb, ub )
     591!--------------------------------------------------------------------------------------------------!
     592    SUBROUTINE set_mask_locations( dim, dxyz, dxyz_string, nxyz, nxyz_string, lb, ub )
    611593
    612594       IMPLICIT NONE
     
    614596       CHARACTER (LEN=2) ::  dxyz_string !<
    615597       CHARACTER (LEN=2) ::  nxyz_string !<
    616        
     598
    617599       INTEGER(iwp)  ::  count       !<
    618600       INTEGER(iwp)  ::  count_l     !<
     
    625607       INTEGER(iwp)  ::  nxyz        !<
    626608       INTEGER(iwp)  ::  ub          !<
    627        
     609
    628610       REAL(wp)      ::  dxyz  !<
    629611       REAL(wp)      ::  ddxyz !<
     
    631613       REAL(wp)      ::  tmp2  !<
    632614
    633        count = 0;  count_l = 0 
    634        ddxyz = 1.0_wp / dxyz 
     615       count = 0;  count_l = 0
     616       ddxyz = 1.0_wp / dxyz
    635617       tmp1  = 0.0_wp
    636618       tmp2  = 0.0_wp
     
    638620       IF ( mask(mid,dim,1) >= 0.0_wp )  THEN
    639621!
    640 !--       use predefined mask_* array
     622!--       Use predefined mask_* array
    641623          DO  WHILE ( mask(mid,dim,count+1) >= 0.0_wp )
    642624             count = count + 1
    643              IF ( dim == 1 .OR. dim == 2 )  THEN
     625             IF ( dim == 1  .OR. dim == 2 )  THEN
    644626                m = NINT( mask(mid,dim,count) * mask_scale(dim) * ddxyz - 0.5_wp )
    645627                IF ( m < 0 )  m = 0  ! avoid negative values
     
    650632             ENDIF
    651633             IF ( m > (nxyz+1) )  THEN
    652                 WRITE ( message_string, '(I3,A,I3,A,I1,3A,I3)' )               &
    653                      m,' in mask ',mid,' along dimension ',dim,                &
    654                      ' exceeds (',nxyz_string,'+1) = ',nxyz+1
     634                WRITE ( message_string, '(I3,A,I3,A,I1,3A,I3)' )  m, ' in mask ', mid,             &
     635                                                                  ' along dimension ' ,dim,        &
     636                                                                  ' exceeds (' ,nxyz_string,       &
     637                                                                  '+1) = ', nxyz+1
    655638                CALL message( 'init_masks', 'PA0331', 1, 2, 0, 6, 0 )
    656639             ENDIF
    657              IF ( ( m >= lb .AND. m <= ub ) .OR.     &
    658                   ( m == (nxyz+1) .AND. ub == nxyz )  )  THEN
     640             IF ( ( m >= lb  .AND.  m <= ub )  .OR.  ( m == (nxyz+1)  .AND.  ub == nxyz )  )  THEN
    659641                IF ( count_l == 0 )  mask_start_l(mid,dim) = count
    660642                count_l = count_l + 1
     
    674656       ELSE
    675657!
    676 !--       use predefined mask_loop_* array, or use the default (all grid points
    677 !--       along this direction)
     658!--       Use predefined mask_loop_* array, or use the default (all grid points along this
     659!--       direction)
    678660          IF ( mask_loop(mid,dim,1) < 0.0_wp )  THEN
    679661             tmp1 = mask_loop(mid,dim,1)
     
    687669             IF ( MAXVAL( mask_loop(mid,dim,1:2) )  &
    688670                  > (nxyz+1) * dxyz / mask_scale(dim) )  THEN
    689                 WRITE ( message_string, '(2(A,I3,A,I1,A,F9.3),5A,I1,A,F9.3)' ) &
    690                      'mask_loop(',mid,',',dim,',1)=',mask_loop(mid,dim,1),     &
    691                      ' and/or mask_loop(',mid,',',dim,',2)=', &
    692                      mask_loop(mid,dim,2),' exceed (', &
    693                      nxyz_string,'+1)*',dxyz_string,'/mask_scale(',dim,')=',   &
     671                WRITE ( message_string, '(2(A,I3,A,I1,A,F9.3),5A,I1,A,F9.3)' )                     &
     672                     'mask_loop(', mid, ',', dim, ',1)=', mask_loop(mid,dim,1),                    &
     673                     ' and/or mask_loop(', mid, ',', dim, ',2)=', mask_loop(mid,dim,2),            &
     674                     ' exceed (', nxyz_string,'+1)*',dxyz_string,'/mask_scale(',dim,')=',          &
    694675                     (nxyz+1)*dxyz/mask_scale(dim)
    695676                CALL message( 'init_masks', 'PA0332', 1, 2, 0, 6, 0 )
    696677             ENDIF
    697              loop_begin  = NINT( mask_loop(mid,dim,1) * mask_scale(dim)        &
    698                   * ddxyz - 0.5_wp )
    699              loop_end    = NINT( mask_loop(mid,dim,2) * mask_scale(dim)        &
    700                   * ddxyz - 0.5_wp )
    701              loop_stride = NINT( mask_loop(mid,dim,3) * mask_scale(dim)        &
    702                   * ddxyz )
     678             loop_begin  = NINT( mask_loop(mid,dim,1) * mask_scale(dim) * ddxyz - 0.5_wp )
     679             loop_end    = NINT( mask_loop(mid,dim,2) * mask_scale(dim) * ddxyz - 0.5_wp )
     680             loop_stride = NINT( mask_loop(mid,dim,3) * mask_scale(dim) * ddxyz )
    703681             IF ( loop_begin == -1 )  loop_begin = 0  ! avoid negative values
    704682          ELSEIF ( dim == 3 )  THEN
     
    707685                mask_loop(mid,dim,2) = zu(nz+1) / mask_scale(dim)   ! (default)
    708686             ENDIF
    709              IF ( MAXVAL( mask_loop(mid,dim,1:2) )  &
    710                   > zu(nz+1) / mask_scale(dim) )  THEN
    711                 WRITE ( message_string, '(2(A,I3,A,I1,A,F9.3),A,I1,A,F9.3)' )  &
    712                      'mask_loop(',mid,',',dim,',1)=',mask_loop(mid,dim,1),     &
    713                      ' and/or mask_loop(',mid,',',dim,',2)=', &
    714                      mask_loop(mid,dim,2),' exceed zu(nz+1)/mask_scale(',dim,  &
    715                      ')=',zu(nz+1)/mask_scale(dim)
     687             IF ( MAXVAL( mask_loop(mid,dim,1:2) ) > zu(nz+1) / mask_scale(dim) )  THEN
     688                WRITE ( message_string, '(2(A,I3,A,I1,A,F9.3),A,I1,A,F9.3)' )                      &
     689                      'mask_loop(', mid, ',', dim, ',1)=', mask_loop(mid,dim,1),                   &
     690                      ' and/or mask_loop(', mid, ',', dim, ',2)=', mask_loop(mid,dim,2),           &
     691                      ' exceed zu(nz+1)/mask_scale(', dim, ')=',zu(nz+1)/mask_scale(dim)
    716692                CALL message( 'init_masks', 'PA0333', 1, 2, 0, 6, 0 )
    717693             ENDIF
    718              ind_array =  &
    719                   MINLOC( ABS( mask_loop(mid,dim,1) * mask_scale(dim) - zu ) )
    720              loop_begin =  &
    721                   ind_array(1) - 1 + nzb ! MINLOC uses lower array bound 1
    722              ind_array =  &
    723                   MINLOC( ABS( mask_loop(mid,dim,2) * mask_scale(dim) - zu ) )
    724              loop_end = ind_array(1) - 1 + nzb ! MINLOC uses lower array bound 1
    725 !
    726 !--          The following line assumes a constant vertical grid spacing within
    727 !--          the vertical mask range; it fails for vertical grid stretching.
    728 !--          Maybe revise later. Issue warning but continue execution. ABS(...)
    729 !--          within the IF statement is necessary because the default value of
    730 !--          dz_stretch_level_start is -9999999.9_wp.
     694             ind_array  = MINLOC( ABS( mask_loop(mid,dim,1) * mask_scale(dim) - zu ) )
     695             loop_begin = ind_array(1) - 1 + nzb ! MINLOC uses lower array bound 1
     696             ind_array  = MINLOC( ABS( mask_loop(mid,dim,2) * mask_scale(dim) - zu ) )
     697             loop_end   = ind_array(1) - 1 + nzb ! MINLOC uses lower array bound 1
     698!
     699!--          The following line assumes a constant vertical grid spacing within the vertical mask
     700!--          range; it fails for vertical grid stretching.
     701!--          Maybe revise later. Issue warning but continue execution. ABS(...) within the IF
     702!--          statement is necessary because the default value of dz_stretch_level_start is
     703!--          -9999999.9_wp.
    731704             loop_stride = NINT( mask_loop(mid,dim,3) * mask_scale(dim) * ddxyz )
    732705
    733              IF ( mask_loop(mid,dim,2) * mask_scale(dim) >                     &
    734                   ABS( dz_stretch_level_start(1) ) )  THEN
    735                 WRITE ( message_string, '(A,I3,A,I1,A,F9.3,A,F8.2,3A)' )       &
    736                      'mask_loop(',mid,',',dim,',2)=', mask_loop(mid,dim,2),    &
    737                      ' exceeds dz_stretch_level=',dz_stretch_level_start(1),   &
    738                      '.&Vertical mask locations will not ',                    &
    739                      'match the desired heights within the stretching ',       &
    740                      'region.'
     706             IF ( mask_loop(mid,dim,2) * mask_scale(dim) > ABS( dz_stretch_level_start(1) ) )  THEN
     707                WRITE ( message_string, '(A,I3,A,I1,A,F9.3,A,F8.2,3A)' )                           &
     708                      'mask_loop(', mid, ',', dim, ',2)=', mask_loop(mid,dim,2),                   &
     709                      ' exceeds dz_stretch_level=', dz_stretch_level_start(1),                     &
     710                      '.&Vertical mask locations will not ',                                       &
     711                      'match the desired heights within the stretching ', 'region.'
    741712                CALL message( 'init_masks', 'PA0334', 0, 1, 0, 6, 0 )
    742713             ENDIF
     
    748719          IF ( tmp2 < 0.0_wp )  mask_loop(mid,dim,2) = tmp2
    749720!
    750 !--       The default stride +/-1 (every grid point) applies if
    751 !--       mask_loop(mid,dim,3) is not specified (its default is zero).
     721!--       The default stride +/-1 (every grid point) applies if mask_loop(mid,dim,3) is not
     722!--       specified (its default is zero).
    752723          IF ( loop_stride == 0 )  THEN
    753724             IF ( loop_end >= loop_begin )  THEN
     
    759730          DO  m = loop_begin, loop_end, loop_stride
    760731             count = count + 1
    761              IF ( ( m >= lb  .AND.  m <= ub ) .OR.   &
    762                   ( m == (nxyz+1) .AND. ub == nxyz )  )  THEN
     732             IF ( ( m >= lb  .AND.  m <= ub ) .OR.  ( m == (nxyz+1) .AND. ub == nxyz )  )  THEN
    763733                IF ( count_l == 0 )  mask_start_l(mid,dim) = count
    764734                count_l = count_l + 1
Note: See TracChangeset for help on using the changeset viewer.