Ignore:
Timestamp:
Jul 9, 2020 7:21:53 PM (4 years ago)
Author:
gronemeier
Message:

Summary:

bugfix: - write unlimited dimension in netcdf4-parallel mode

  • prevent unused-variable warning if preprocessor directives are not given

new : - added optional argument to dom_def_dim to allow that dimension variables can be written

by every PE

change: - set parallel access mode to independent per default (netCDF4 output files)

Details:

data_output_module.f90:

bugfix: - write unlimited dimension in netcdf4-parallel mode
new : - added optional argument to dom_def_dim to allow that dimension variables can be written

by every PE

data_output_netcdf4_module.f90:

bugfix: - allow writing of unlimited dimensions in parallel mode

  • prevent unused-variable warning if preprocessor directives are not given

change: - set parallel access mode to independent per default
new : - dimension variables can be written by every PE

data_output_binary_module.f90:

change: update argument list of routine binary_init_dimension due to changes in interface

File:
1 edited

Legend:

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

    r4579 r4597  
    2424! -----------------
    2525! $Id$
     26! change: update argument list of routine binary_init_dimension due to changes in interface
     27!
     28! 4579 2020-06-25 20:05:07Z gronemeier
    2629! corrected formatting to follow PALM coding standard
    2730!
     
    6871    INCLUDE "mpif.h"
    6972#endif
    70 
    7173
    7274    CHARACTER(LEN=*), PARAMETER ::  config_file_name = 'BINARY_TO_NETCDF_CONFIG'  !< name of config file
     
    8890    INTEGER ::  output_group_comm               !< MPI communicator addressing all MPI ranks which participate in output
    8991
    90     INTEGER, DIMENSION(:), ALLOCATABLE ::  files_highest_variable_id  !< highest assigned ID of
    91                                                                       !< variable or dimension in a file
    92 
    93     LOGICAL ::  binary_open_file_first_call = .TRUE.  !< true if binary_open_file routine was not
    94                                                       !< called yet
    95     LOGICAL ::  config_file_open = .FALSE.            !< true if config file is opened and not
    96                                                       !< closed
     92    INTEGER, DIMENSION(:), ALLOCATABLE ::  files_highest_variable_id  !< highest assigned ID of variable or dimension in a file
     93
     94    LOGICAL ::  binary_open_file_first_call = .TRUE.  !< true if binary_open_file routine was not called yet
     95    LOGICAL ::  config_file_open = .FALSE.            !< true if config file is opened and not closed
    9796    LOGICAL ::  print_debug_output = .FALSE.          !< if true, debug output is printed
    9897
     
    165164
    166165    INTEGER, INTENT(IN) ::  dom_global_id              !< global id within a file defined by DOM
    167     INTEGER, INTENT(IN) ::  master_output_rank         !< MPI rank executing tasks which must be
    168                                                        !< executed by a single PE
    169     INTEGER, INTENT(IN) ::  mpi_comm_of_output_group   !< MPI communicator specifying the rank group
    170                                                        !< participating in output
     166    INTEGER, INTENT(IN) ::  master_output_rank         !< MPI rank executing tasks which must be executed by a single PE
     167    INTEGER, INTENT(IN) ::  mpi_comm_of_output_group   !< MPI communicator specifying the rank group participating in output
    171168    INTEGER, INTENT(IN) ::  program_debug_output_unit  !< file unit number for debug output
    172169
     
    174171
    175172
    176     file_suffix       = file_suffix_of_output_group
    177     output_group_comm = mpi_comm_of_output_group
    178     master_rank       = master_output_rank
     173    file_suffix        = file_suffix_of_output_group
     174    output_group_comm  = mpi_comm_of_output_group
     175    master_rank        = master_output_rank
    179176
    180177    debug_output_unit  = program_debug_output_unit
    181178    print_debug_output = debug_output
    182179
    183     global_id_in_file = dom_global_id
     180    global_id_in_file  = dom_global_id
    184181
    185182 END SUBROUTINE binary_init_module
     
    204201    INTEGER, INTENT(OUT) ::  return_value  !< return value
    205202
    206     INTEGER, DIMENSION(:), ALLOCATABLE ::  files_highest_variable_id_tmp  !< temporary list of given
    207                                                                           !< variable IDs in file
     203    INTEGER, DIMENSION(:), ALLOCATABLE ::  files_highest_variable_id_tmp  !< temporary list of given variable IDs in file
    208204
    209205    LOGICAL ::  file_exists  !< true if file to be opened already exists
     
    238234!
    239235!--       Remove any pre-existing file
    240           INQUIRE( FILE=TRIM( config_file_name ) // TRIM( file_suffix ), EXIST = file_exists )
     236          INQUIRE( FILE=TRIM( config_file_name ) // TRIM( file_suffix ), EXIST=file_exists )
    241237
    242238          IF ( file_exists )  THEN
    243              CALL internal_message( 'debug', routine_name // ': Remove existing file ' //          &
     239             CALL internal_message( 'debug', routine_name //                                       &
     240                                    ': Remove existing file ' //                                   &
    244241                                    TRIM( config_file_name ) // TRIM( file_suffix ) )
    245242             !> @note Fortran2008 feature 'EXECUTE_COMMAND_LINE' not yet supported by
    246243             !>       PGI 18.10 compiler. Hence, non-standard 'SYSTEM' call must be used
    247              ! CALL EXECUTE_COMMAND_LINE(                                                &
     244             ! CALL EXECUTE_COMMAND_LINE( &
    248245             !         COMMAND='rm ' // TRIM( config_file_name ) // TRIM( file_suffix ), &
    249246             !         WAIT=.TRUE., EXITSTAT=return_value )
     
    288285
    289286       IF ( file_exists )  THEN
    290           CALL internal_message( 'debug', routine_name // ': remove existing file ' //             &
    291                                  TRIM( bin_filename ) )
     287          CALL internal_message( 'debug', routine_name //                                          &
     288                                 ': remove existing file ' // TRIM( bin_filename ) )
    292289          !> @note Fortran2008 feature 'EXECUTE_COMMAND_LINE' not yet supported by
    293290          !>       PGI 18.10 compiler. Hence, non-standard 'SYSTEM' call must be used
     
    320317!--       Extend file-variable/dimension-ID list by 1 and set it to 0 for new file.
    321318          IF ( ALLOCATED( files_highest_variable_id ) )  THEN
    322              ALLOCATE( files_highest_variable_id_tmp( SIZE( files_highest_variable_id ) ) )
     319             ALLOCATE( files_highest_variable_id_tmp(SIZE( files_highest_variable_id )) )
    323320             files_highest_variable_id_tmp = files_highest_variable_id
    324321             DEALLOCATE( files_highest_variable_id )
     
    333330       ELSE
    334331          return_value = 1
    335           CALL internal_message( 'error', routine_name // ': could not open file "' //             &
    336                                  TRIM( file_name ) // '"')
     332          CALL internal_message( 'error', routine_name //                                          &
     333                                 ': could not open file "' // TRIM( file_name ) // '"')
    337334       ENDIF
    338335
     
    349346                                    value_int16, value_int32, value_real32, value_real64,          &
    350347                                    return_value )
    351 
    352348
    353349    CHARACTER(LEN=*), PARAMETER ::  routine_name = 'binary_write_attribute'  !< name of this routine
     
    372368    return_value = 0
    373369
    374     CALL internal_message( 'debug', TRIM( routine_name ) // ': write attribute ' //                &
    375                            TRIM( attribute_name ) )
     370    CALL internal_message( 'debug', TRIM( routine_name ) //                                        &
     371                           ': write attribute ' // TRIM( attribute_name ) )
    376372!
    377373!-- Write attribute to file
     
    418414! ------------
    419415!> Initialize dimension. Write information in file header and save dimension values to be later
    420 !< written to file.
     416!> written to file.
    421417!--------------------------------------------------------------------------------------------------!
    422418 SUBROUTINE binary_init_dimension( mode, file_id, dimension_id, variable_id, dimension_name,       &
    423                                    dimension_type, dimension_length, return_value )
     419                                   dimension_type, dimension_length, write_only_by_master_rank,    &
     420                                   return_value )
    424421
    425422    CHARACTER(LEN=*), PARAMETER ::  routine_name = 'binary_init_dimension'  !< name of this routine
     
    436433    INTEGER, INTENT(OUT) ::  variable_id       !< variable ID
    437434
     435    LOGICAL, INTENT(IN) ::  write_only_by_master_rank  !< true if only master rank shall write variable
     436
    438437
    439438    return_value = 0
     
    441440    CALL internal_message( 'debug', routine_name // ': init dimension ' // TRIM( dimension_name ) )
    442441!
    443 !-- Check mode (not required, added for compatibility reasons only)
     442!-- Required for compatibility reasons
    444443    IF ( TRIM( mode ) == mode_binary )  CONTINUE
    445444!
     
    458457!-- Define variable associated with dimension
    459458    CALL binary_init_variable( mode, file_id, variable_id, dimension_name, dimension_type,         &
    460                                (/ dimension_id /), is_global=.TRUE., return_value=return_value )
     459                               (/ dimension_id /),                                                 &
     460                               write_only_by_master_rank=write_only_by_master_rank,                &
     461                               return_value=return_value )
     462
    461463    IF ( return_value /= 0 )  THEN
    462464       CALL internal_message( 'error', routine_name //                                             &
     
    472474!--------------------------------------------------------------------------------------------------!
    473475 SUBROUTINE binary_init_variable( mode, file_id, variable_id, variable_name, variable_type,        &
    474                                   dimension_ids, is_global, return_value )
     476                                  dimension_ids, write_only_by_master_rank, return_value )
    475477
    476478    CHARACTER(LEN=*), PARAMETER ::  routine_name = 'binary_init_variable'  !< name of this routine
    477479
     480    CHARACTER(LEN=*),       INTENT(IN) ::  mode            !< operation mode
    478481    CHARACTER(LEN=charlen)             ::  output_string   !< output string
    479     CHARACTER(LEN=*),       INTENT(IN) ::  mode            !< operation mode
    480482    CHARACTER(LEN=charlen), INTENT(IN) ::  variable_name   !< name of variable
    481483    CHARACTER(LEN=charlen), INTENT(IN) ::  variable_type   !< data type of variable
     
    487489    INTEGER, DIMENSION(:), INTENT(IN) ::  dimension_ids  !< list of dimension IDs used by variable
    488490
    489     LOGICAL, INTENT(IN)  ::  is_global  !< true if variable is global (same on all PE)
     491    LOGICAL, INTENT(IN) ::  write_only_by_master_rank  !< true if only master rank shall write variable
    490492
    491493
     
    494496    CALL internal_message( 'debug', routine_name // ': init variable ' // TRIM( variable_name ) )
    495497!
    496 !-- Check mode (not required, added for compatibility reasons only)
     498!-- Required for compatibility reasons
    497499    IF ( TRIM( mode ) == mode_binary )  CONTINUE
    498 !
    499 !-- Check if variable is global (not required, added for compatibility reasons only)
    500     IF ( is_global )  CONTINUE
     500    IF ( write_only_by_master_rank )  CONTINUE
    501501!
    502502!-- Assign variable ID
     
    533533
    534534    WRITE( temp_string, * ) file_id
    535     CALL internal_message( 'debug', routine_name // ': finalize file definition (file_id=' //      &
    536                            TRIM( temp_string ) // ')' )
     535    CALL internal_message( 'debug', routine_name //                                                &
     536                           ': finalize file definition (file_id=' // TRIM( temp_string ) // ')' )
    537537
    538538    output_string = '*** end file header ***'
     
    547547!--------------------------------------------------------------------------------------------------!
    548548 SUBROUTINE binary_write_variable(                                                                 &
    549                            file_id, variable_id, bounds_start, value_counts, bounds_origin,        &
    550                            is_global,                                                              &
    551                            values_char_0d,   values_char_1d,   values_char_2d,   values_char_3d,   &
    552                            values_int8_0d,   values_int8_1d,   values_int8_2d,   values_int8_3d,   &
    553                            values_int16_0d,  values_int16_1d,  values_int16_2d,  values_int16_3d,  &
    554                            values_int32_0d,  values_int32_1d,  values_int32_2d,  values_int32_3d,  &
    555                            values_intwp_0d,  values_intwp_1d,  values_intwp_2d,  values_intwp_3d,  &
    556                            values_real32_0d, values_real32_1d, values_real32_2d, values_real32_3d, &
    557                            values_real64_0d, values_real64_1d, values_real64_2d, values_real64_3d, &
    558                            values_realwp_0d, values_realwp_1d, values_realwp_2d, values_realwp_3d, &
    559                            return_value )
    560 
     549               file_id, variable_id, bounds_start, value_counts, bounds_origin,                    &
     550               write_only_by_master_rank,                                                          &
     551               values_char_0d,   values_char_1d,   values_char_2d,   values_char_3d,               &
     552               values_int8_0d,   values_int8_1d,   values_int8_2d,   values_int8_3d,               &
     553               values_int16_0d,  values_int16_1d,  values_int16_2d,  values_int16_3d,              &
     554               values_int32_0d,  values_int32_1d,  values_int32_2d,  values_int32_3d,              &
     555               values_intwp_0d,  values_intwp_1d,  values_intwp_2d,  values_intwp_3d,              &
     556               values_real32_0d, values_real32_1d, values_real32_2d, values_real32_3d,             &
     557               values_real64_0d, values_real64_1d, values_real64_2d, values_real64_3d,             &
     558               values_realwp_0d, values_realwp_1d, values_realwp_2d, values_realwp_3d,             &
     559               return_value )
    561560
    562561    CHARACTER(LEN=*), PARAMETER ::  routine_name = 'binary_write_variable'  !< name of this routine
     
    570569
    571570    INTEGER, INTENT(IN)  ::  file_id       !< file ID
     571    INTEGER, INTENT(OUT) ::  return_value  !< return value
    572572    INTEGER, INTENT(IN)  ::  variable_id   !< variable ID
    573     INTEGER, INTENT(OUT) ::  return_value  !< return value
    574573
    575574    INTEGER, DIMENSION(:), INTENT(IN) ::  bounds_origin  !< starting index of each dimension
     
    594593    INTEGER(iwp),    POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  values_intwp_3d  !< output variable
    595594
    596     LOGICAL, INTENT(IN) ::  is_global  !< true if variable is global (same on all PE)
     595    LOGICAL, INTENT(IN) ::  write_only_by_master_rank  !< true if only master rank shall write variable
    597596
    598597    REAL(KIND=4), POINTER,             INTENT(IN), OPTIONAL                   ::  values_real32_0d  !< output variable
     
    614613    WRITE( temp_string, '(": write variable ",I6," into file ",I6)' ) variable_id, file_id
    615614    CALL internal_message( 'debug', routine_name // TRIM( temp_string ) )
    616 
    617     IF ( is_global )  CONTINUE  ! reqired to prevent compiler warning
     615!
     616!-- Required for compatibility reasons
     617    IF ( write_only_by_master_rank )  CONTINUE
    618618
    619619    IF ( .NOT. ANY( value_counts == 0 ) )  THEN
     
    695695          WRITE( file_id )  values_int32_3d
    696696!
    697 !--    working-precision integer output
     697!--    Working-precision integer output
    698698       ELSEIF ( PRESENT( values_intwp_0d ) )  THEN
    699699          output_string = 'intwp'
     
    749749          WRITE( file_id )  values_real64_3d
    750750!
    751 !--    working-precision real output
     751!--    Working-precision real output
    752752       ELSEIF ( PRESENT( values_realwp_0d ) )  THEN
    753753          output_string = 'realwp'
Note: See TracChangeset for help on using the changeset viewer.