Ignore:
Timestamp:
Aug 5, 2019 12:24:51 PM (5 years ago)
Author:
gronemeier
Message:

changes in data-output module (data_output_binary_module, data_output_module, data_output_netcdf4_module, binary_to_netcdf):

  • renaming of variables
  • changes to formatting and layout
  • update routine descriptions
File:
1 edited

Legend:

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

    r4123 r4141  
    6262   CHARACTER(LEN=*), PARAMETER ::  mode_serial   = 'serial'    !< string selecting netcdf4 serial mode
    6363
    64    INTEGER(iwp) ::  debug_output_unit       !< Fortran Unit Number of the debug-output file
    65    INTEGER(iwp) ::  global_id_in_file = -1  !< value of global ID within a file
    66    INTEGER      ::  master_rank             !< master rank for tasks to be executed by single PE only
    67    INTEGER      ::  output_group_comm       !< MPI communicator addressing all MPI ranks which participate in output
     64   INTEGER ::  debug_output_unit       !< Fortran Unit Number of the debug-output file
     65   INTEGER ::  global_id_in_file = -1  !< value of global ID within a file
     66   INTEGER ::  master_rank             !< master rank for tasks to be executed by single PE only
     67   INTEGER ::  output_group_comm       !< MPI communicator addressing all MPI ranks which participate in output
    6868
    6969   LOGICAL ::  print_debug_output = .FALSE.  !< if true, debug output is printed
     
    9393   END INTERFACE netcdf4_write_attribute
    9494
    95    INTERFACE netcdf4_init_end
    96       MODULE PROCEDURE netcdf4_init_end
    97    END INTERFACE netcdf4_init_end
     95   INTERFACE netcdf4_stop_file_header_definition
     96      MODULE PROCEDURE netcdf4_stop_file_header_definition
     97   END INTERFACE netcdf4_stop_file_header_definition
    9898
    9999   INTERFACE netcdf4_write_variable
     
    113113      netcdf4_get_error_message, &
    114114      netcdf4_init_dimension, &
    115       netcdf4_init_end, &
     115      netcdf4_stop_file_header_definition, &
    116116      netcdf4_init_module, &
    117117      netcdf4_init_variable, &
     
    136136                                                                 !> must be unique for each output group
    137137
    138    INTEGER(iwp), INTENT(IN) ::  dom_global_id              !< global id within a file defined by DOM
    139    INTEGER,      INTENT(IN) ::  master_output_rank         !< MPI rank executing tasks which must be executed by a single PE
    140    INTEGER,      INTENT(IN) ::  mpi_comm_of_output_group   !< MPI communicator specifying the rank group participating in output
    141    INTEGER(iwp), INTENT(IN) ::  program_debug_output_unit  !< file unit number for debug output
     138   INTEGER, INTENT(IN) ::  dom_global_id              !< global id within a file defined by DOM
     139   INTEGER, INTENT(IN) ::  master_output_rank         !< MPI rank executing tasks which must be executed by a single PE
     140   INTEGER, INTENT(IN) ::  mpi_comm_of_output_group   !< MPI communicator specifying the rank group participating in output
     141   INTEGER, INTENT(IN) ::  program_debug_output_unit  !< file unit number for debug output
    142142
    143143   LOGICAL, INTENT(IN) ::  debug_output  !< if true, debug output is printed
     
    160160!> Open netcdf file.
    161161!--------------------------------------------------------------------------------------------------!
    162 SUBROUTINE netcdf4_open_file( mode, filename, file_id, return_value )
    163 
    164    CHARACTER(LEN=*), INTENT(IN) ::  filename  !< name of file
    165    CHARACTER(LEN=*), INTENT(IN) ::  mode      !< operation mode (either parallel or serial)
     162SUBROUTINE netcdf4_open_file( mode, file_name, file_id, return_value )
     163
     164   CHARACTER(LEN=*), INTENT(IN) ::  file_name  !< name of file
     165   CHARACTER(LEN=*), INTENT(IN) ::  mode       !< operation mode (either parallel or serial)
    166166
    167167   CHARACTER(LEN=*), PARAMETER ::  routine_name = 'netcdf4_open_file'  !< name of this routine
    168168
    169    INTEGER(iwp), INTENT(OUT) ::  file_id       !< file ID
    170    INTEGER                   ::  my_rank       !< MPI rank of processor
    171    INTEGER(iwp)              ::  nc_stat       !< netcdf return value
    172    INTEGER(iwp), INTENT(OUT) ::  return_value  !< return value
     169   INTEGER, INTENT(OUT) ::  file_id       !< file ID
     170   INTEGER              ::  my_rank       !< MPI rank of processor
     171   INTEGER              ::  nc_stat       !< netcdf return value
     172   INTEGER, INTENT(OUT) ::  return_value  !< return value
    173173
    174174
     
    177177
    178178   !-- Open new file
    179    CALL internal_message( 'debug', routine_name // ': create file "' // TRIM( filename ) // '"' )
     179   CALL internal_message( 'debug', routine_name // ': create file "' // TRIM( file_name ) // '"' )
    180180
    181181   IF ( TRIM( mode ) == mode_serial )  THEN
     
    200200
    201201      IF ( return_value == 0 )  &
    202          nc_stat = NF90_CREATE( TRIM( filename ) // TRIM( file_suffix ), &
    203                                 IOR( NF90_NOCLOBBER, NF90_NETCDF4 ), &
     202         nc_stat = NF90_CREATE( TRIM( file_name ) // TRIM( file_suffix ), &
     203                                IOR( NF90_NOCLOBBER, NF90_NETCDF4 ),      &
    204204                                file_id )
    205205#else
     
    214214
    215215#if defined( __parallel ) && defined( __netcdf4 ) && defined( __netcdf4_parallel )
    216       nc_stat = NF90_CREATE( TRIM( filename ) // TRIM( file_suffix ),                &
     216      nc_stat = NF90_CREATE( TRIM( file_name ) // TRIM( file_suffix ),               &
    217217                             IOR( NF90_NOCLOBBER, IOR( NF90_NETCDF4, NF90_MPIIO ) ), &
    218218                             file_id, COMM = output_group_comm, INFO = MPI_INFO_NULL )
     
    229229      nc_stat = 0
    230230      return_value = 1
    231       CALL internal_message( 'error', routine_name // ': selected mode "' // &
     231      CALL internal_message( 'error', routine_name // ': selected mode "' //  &
    232232                                      TRIM( mode ) // '" must be either "' // &
    233233                                      mode_serial // '" or "' // mode_parallel // '"' )
     
    237237   IF ( nc_stat /= NF90_NOERR  .AND.  return_value == 0 )  THEN
    238238      return_value = 1
    239       CALL internal_message( 'error', routine_name // ': NetCDF error while opening file "' // &
    240                                       TRIM( filename ) // '": ' // NF90_STRERROR( nc_stat ) )
     239      CALL internal_message( 'error', routine_name //                 &
     240                             ': NetCDF error while opening file "' // &
     241                             TRIM( file_name ) // '": ' // NF90_STRERROR( nc_stat ) )
    241242   ENDIF
    242243#endif
     
    249250!> Write attribute to netcdf file.
    250251!--------------------------------------------------------------------------------------------------!
    251 SUBROUTINE netcdf4_write_attribute( file_id, var_id, att_name, att_value_char, &
    252                  att_value_int8, att_value_int16, att_value_int32,             &
    253                  att_value_real32, att_value_real64, return_value )
    254 
    255    CHARACTER(LEN=*), INTENT(IN)           ::  att_name        !< name of attribute
    256    CHARACTER(LEN=*), INTENT(IN), OPTIONAL ::  att_value_char  !< value of attribute
     252SUBROUTINE netcdf4_write_attribute( file_id, variable_id, attribute_name, &
     253                 value_char, value_int8, value_int16, value_int32,        &
     254                 value_real32, value_real64, return_value )
     255
     256   CHARACTER(LEN=*), INTENT(IN)           ::  attribute_name  !< name of attribute
     257   CHARACTER(LEN=*), INTENT(IN), OPTIONAL ::  value_char      !< value of attribute
    257258
    258259   CHARACTER(LEN=*), PARAMETER ::  routine_name = 'netcdf4_write_attribute'  !< name of this routine
    259260
    260    INTEGER(iwp) ::  nc_stat    !< netcdf return value
    261    INTEGER(iwp) ::  target_id  !< ID of target which gets attribute (either global or var_id)
    262 
    263    INTEGER(iwp), INTENT(IN)  ::  file_id       !< file ID
    264    INTEGER(iwp), INTENT(OUT) ::  return_value  !< return value
    265    INTEGER(iwp), INTENT(IN)  ::  var_id        !< variable ID
    266 
    267    INTEGER(KIND=1), INTENT(IN), OPTIONAL ::  att_value_int8   !< value of attribute
    268    INTEGER(KIND=2), INTENT(IN), OPTIONAL ::  att_value_int16  !< value of attribute
    269    INTEGER(KIND=4), INTENT(IN), OPTIONAL ::  att_value_int32  !< value of attribute
    270 
    271    REAL(KIND=4), INTENT(IN), OPTIONAL ::  att_value_real32  !< value of attribute
    272    REAL(KIND=8), INTENT(IN), OPTIONAL ::  att_value_real64  !< value of attribute
     261   INTEGER ::  nc_stat    !< netcdf return value
     262   INTEGER ::  target_id  !< ID of target which gets attribute (either global or variable_id)
     263
     264   INTEGER, INTENT(IN)  ::  file_id       !< file ID
     265   INTEGER, INTENT(OUT) ::  return_value  !< return value
     266   INTEGER, INTENT(IN)  ::  variable_id   !< variable ID
     267
     268   INTEGER(KIND=1), INTENT(IN), OPTIONAL ::  value_int8   !< value of attribute
     269   INTEGER(KIND=2), INTENT(IN), OPTIONAL ::  value_int16  !< value of attribute
     270   INTEGER(KIND=4), INTENT(IN), OPTIONAL ::  value_int32  !< value of attribute
     271
     272   REAL(KIND=4), INTENT(IN), OPTIONAL ::  value_real32  !< value of attribute
     273   REAL(KIND=8), INTENT(IN), OPTIONAL ::  value_real64  !< value of attribute
    273274
    274275
     
    276277   return_value = 0
    277278
    278    IF ( var_id == global_id_in_file )  THEN
     279   IF ( variable_id == global_id_in_file )  THEN
    279280      target_id = NF90_GLOBAL
    280281   ELSE
    281       target_id = var_id
    282    ENDIF
    283 
    284    CALL internal_message( 'debug', &
    285                           routine_name // ': write attribute "' // TRIM( att_name ) // '"' )
    286 
    287    IF ( PRESENT( att_value_char ) )  THEN
    288       nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( att_name ), TRIM( att_value_char ) )
    289    ELSEIF ( PRESENT( att_value_int8 ) )  THEN
    290       nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( att_name ), att_value_int8 )
    291    ELSEIF ( PRESENT( att_value_int16 ) )  THEN
    292       nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( att_name ), att_value_int16 )
    293    ELSEIF ( PRESENT( att_value_int32 ) )  THEN
    294       nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( att_name ), att_value_int32 )
    295    ELSEIF ( PRESENT( att_value_real32 ) )  THEN
    296       nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( att_name ), att_value_real32 )
    297    ELSEIF ( PRESENT( att_value_real64 ) )  THEN
    298       nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( att_name ), att_value_real64 )
     282      target_id = variable_id
     283   ENDIF
     284
     285   CALL internal_message( 'debug', routine_name // &
     286                          ': write attribute "' // TRIM( attribute_name ) // '"' )
     287
     288   IF ( PRESENT( value_char ) )  THEN
     289      nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( attribute_name ), TRIM( value_char ) )
     290   ELSEIF ( PRESENT( value_int8 ) )  THEN
     291      nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( attribute_name ), value_int8 )
     292   ELSEIF ( PRESENT( value_int16 ) )  THEN
     293      nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( attribute_name ), value_int16 )
     294   ELSEIF ( PRESENT( value_int32 ) )  THEN
     295      nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( attribute_name ), value_int32 )
     296   ELSEIF ( PRESENT( value_real32 ) )  THEN
     297      nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( attribute_name ), value_real32 )
     298   ELSEIF ( PRESENT( value_real64 ) )  THEN
     299      nc_stat = NF90_PUT_ATT( file_id, target_id, TRIM( attribute_name ), value_real64 )
    299300   ELSE
    300301      return_value = 1
    301       CALL internal_message( 'error', TRIM( routine_name ) // &
    302                                       ': attribute "' // TRIM( att_name ) // '": no value given' )
     302      CALL internal_message( 'error', routine_name // &
     303                             ': no value given for attribute "' // TRIM( attribute_name ) // '"' )
    303304   ENDIF
    304305
     
    306307      IF ( nc_stat /= NF90_NOERR )  THEN
    307308         return_value = 1
    308          CALL internal_message( 'error',                                       &
    309                  routine_name // ': NetCDF error while writing attribute "' // &
    310                  TRIM( att_name ) // '": ' // NF90_STRERROR( nc_stat ) )
     309         CALL internal_message( 'error', routine_name //                      &
     310                               ': NetCDF error while writing attribute "' // &
     311                                TRIM( attribute_name ) // '": ' // NF90_STRERROR( nc_stat ) )
    311312      ENDIF
    312313   ENDIF
     
    322323!> Initialize dimension.
    323324!--------------------------------------------------------------------------------------------------!
    324 SUBROUTINE netcdf4_init_dimension( mode, file_id, dim_id, var_id, &
    325               dim_name, dim_type, dim_length, return_value )
    326 
    327    CHARACTER(LEN=*), INTENT(IN) ::  dim_name  !< name of dimension
    328    CHARACTER(LEN=*), INTENT(IN) ::  dim_type  !< data type of dimension
    329    CHARACTER(LEN=*), INTENT(IN) ::  mode      !< operation mode (either parallel or serial)
     325SUBROUTINE netcdf4_init_dimension( mode, file_id, dimension_id, variable_id, &
     326              dimension_name, dimension_type, dimension_length, return_value )
     327
     328   CHARACTER(LEN=*), INTENT(IN) ::  dimension_name  !< name of dimension
     329   CHARACTER(LEN=*), INTENT(IN) ::  dimension_type  !< data type of dimension
     330   CHARACTER(LEN=*), INTENT(IN) ::  mode            !< operation mode (either parallel or serial)
    330331
    331332   CHARACTER(LEN=*), PARAMETER ::  routine_name = 'netcdf4_init_dimension'  !< name of this routine
    332333
    333    INTEGER(iwp), INTENT(OUT) ::  dim_id         !< dimension ID
    334    INTEGER(iwp), INTENT(IN)  ::  dim_length     !< length of dimension
    335    INTEGER(iwp), INTENT(IN)  ::  file_id        !< file ID
    336    INTEGER(iwp)              ::  nc_dim_length  !< length of dimension
    337    INTEGER(iwp)              ::  nc_stat        !< netcdf return value
    338    INTEGER(iwp), INTENT(OUT) ::  return_value   !< return value
    339    INTEGER(iwp), INTENT(OUT) ::  var_id         !< variable ID
     334   INTEGER, INTENT(OUT) ::  dimension_id         !< dimension ID
     335   INTEGER, INTENT(IN)  ::  dimension_length     !< length of dimension
     336   INTEGER, INTENT(IN)  ::  file_id              !< file ID
     337   INTEGER              ::  nc_dimension_length  !< length of dimension
     338   INTEGER              ::  nc_stat              !< netcdf return value
     339   INTEGER, INTENT(OUT) ::  return_value         !< return value
     340   INTEGER, INTENT(OUT) ::  variable_id          !< variable ID
    340341
    341342
    342343#if defined( __netcdf4 )
    343344   return_value = 0
    344    var_id = -1
    345 
    346    CALL internal_message( 'debug', &
    347                           routine_name // ': init dimension "' // TRIM( dim_name ) // '"' )
     345   variable_id = -1
     346
     347   CALL internal_message( 'debug', routine_name // &
     348                          ': init dimension "' // TRIM( dimension_name ) // '"' )
    348349
    349350   !-- Check if dimension is unlimited
    350    IF ( dim_length < 0 )  THEN
    351       nc_dim_length = NF90_UNLIMITED
     351   IF ( dimension_length < 0 )  THEN
     352      nc_dimension_length = NF90_UNLIMITED
    352353   ELSE
    353       nc_dim_length = dim_length
     354      nc_dimension_length = dimension_length
    354355   ENDIF
    355356
    356357   !-- Define dimension in file
    357    nc_stat = NF90_DEF_DIM( file_id, dim_name, nc_dim_length, dim_id )
     358   nc_stat = NF90_DEF_DIM( file_id, dimension_name, nc_dimension_length, dimension_id )
    358359
    359360   IF ( nc_stat == NF90_NOERR )  THEN
    360361
    361362      !-- Define variable holding dimension values in file
    362       CALL netcdf4_init_variable( mode, file_id, var_id, dim_name, dim_type, (/dim_id/), &
    363                                           is_global=.TRUE., return_value=return_value )
     363      CALL netcdf4_init_variable( mode, file_id, variable_id, dimension_name, dimension_type, &
     364                                  (/ dimension_id /), is_global=.TRUE., return_value=return_value )
    364365
    365366   ELSE
    366367      return_value = 1
    367       CALL internal_message( 'error', routine_name //                                    &
    368                                       ': NetCDF error while initializing dimension "' // &
    369                                       TRIM( dim_name ) // '": ' // NF90_STRERROR( nc_stat ) )
     368      CALL internal_message( 'error', routine_name //                           &
     369                             ': NetCDF error while initializing dimension "' // &
     370                             TRIM( dimension_name ) // '": ' // NF90_STRERROR( nc_stat ) )
    370371   ENDIF
    371372#else
    372373   return_value = 1
    373    var_id = -1
    374    dim_id = -1
     374   variable_id = -1
     375   dimension_id = -1
    375376#endif
    376377
     
    382383!> Initialize variable.
    383384!--------------------------------------------------------------------------------------------------!
    384 SUBROUTINE netcdf4_init_variable( mode, file_id, var_id, var_name, var_type, var_dim_ids, &
    385                                   is_global, return_value )
    386 
    387    CHARACTER(LEN=*), INTENT(IN) ::  mode      !< operation mode (either parallel or serial)
    388    CHARACTER(LEN=*), INTENT(IN) ::  var_name  !< name of variable
    389    CHARACTER(LEN=*), INTENT(IN) ::  var_type  !< data type of variable
     385SUBROUTINE netcdf4_init_variable( mode, file_id, variable_id, variable_name, variable_type, &
     386                                  dimension_ids, is_global, return_value )
     387
     388   CHARACTER(LEN=*), INTENT(IN) ::  mode           !< operation mode (either parallel or serial)
     389   CHARACTER(LEN=*), INTENT(IN) ::  variable_name  !< name of variable
     390   CHARACTER(LEN=*), INTENT(IN) ::  variable_type  !< data type of variable
    390391
    391392   CHARACTER(LEN=*), PARAMETER ::  routine_name = 'netcdf4_init_variable'  !< name of this routine
    392393
    393    INTEGER(iwp), INTENT(IN)  ::  file_id       !< file ID
    394    INTEGER(iwp)              ::  nc_stat       !< netcdf return value
    395    INTEGER(iwp)              ::  nc_var_type   !< netcdf data type
    396    INTEGER(iwp), INTENT(OUT) ::  return_value  !< return value
    397    INTEGER(iwp), INTENT(OUT) ::  var_id        !< variable ID
    398 
    399    INTEGER(iwp), DIMENSION(:), INTENT(IN) ::  var_dim_ids  !< list of dimension IDs used by variable
     394   INTEGER, INTENT(IN)  ::  file_id           !< file ID
     395   INTEGER              ::  nc_stat           !< netcdf return value
     396   INTEGER              ::  nc_variable_type  !< netcdf data type
     397   INTEGER, INTENT(OUT) ::  return_value      !< return value
     398   INTEGER, INTENT(OUT) ::  variable_id       !< variable ID
     399
     400   INTEGER, DIMENSION(:), INTENT(IN) ::  dimension_ids  !< list of dimension IDs used by variable
    400401
    401402   LOGICAL, INTENT(IN)  ::  is_global  !< true if variable is global (same on all PE)
     
    406407
    407408   WRITE( temp_string, * ) is_global
    408    CALL internal_message( 'debug', routine_name // ': init variable "' // TRIM( var_name ) // &
    409                                    '" ( is_global = ' // TRIM( temp_string ) // ')' )
    410 
    411    nc_var_type = get_netcdf_data_type( var_type )
    412 
    413    IF ( nc_var_type /= -1_iwp )  THEN
     409   CALL internal_message( 'debug', routine_name //                        &
     410                          ': init variable "' // TRIM( variable_name ) // &
     411                          '" ( is_global = ' // TRIM( temp_string ) // ')' )
     412
     413   nc_variable_type = get_netcdf_data_type( variable_type )
     414
     415   IF ( nc_variable_type /= -1 )  THEN
    414416
    415417      !-- Define variable in file
    416       nc_stat = NF90_DEF_VAR( file_id, var_name, nc_var_type, var_dim_ids, var_id )
     418      nc_stat = NF90_DEF_VAR( file_id, variable_name, nc_variable_type, dimension_ids, variable_id )
    417419
    418420#if defined( __netcdf4_parallel )
     
    420422      IF ( nc_stat == NF90_NOERR  .AND.  TRIM( mode ) == mode_parallel )  THEN
    421423         IF ( is_global )  THEN
    422             nc_stat = NF90_VAR_PAR_ACCESS( file_id, var_id, NF90_INDEPENDENT )
     424            nc_stat = NF90_VAR_PAR_ACCESS( file_id, variable_id, NF90_INDEPENDENT )
    423425         ELSE
    424             nc_stat = NF90_VAR_PAR_ACCESS( file_id, var_id, NF90_COLLECTIVE )
     426            nc_stat = NF90_VAR_PAR_ACCESS( file_id, variable_id, NF90_COLLECTIVE )
    425427         ENDIF
    426428      ENDIF
    427429#endif
    428430
    429       IF ( nc_stat /= NF90_NOERR)  THEN
     431      IF ( nc_stat /= NF90_NOERR )  THEN
    430432         return_value = 1
    431          CALL internal_message( 'error', routine_name //                                   &
    432                                          ': NetCDF error while initializing variable "' // &
    433                                          TRIM( var_name ) // '": ' // NF90_STRERROR( nc_stat ) )
     433         CALL internal_message( 'error', routine_name //                          &
     434                                ': NetCDF error while initializing variable "' // &
     435                                TRIM( variable_name ) // '": ' // NF90_STRERROR( nc_stat ) )
    434436      ENDIF
    435437
     
    440442#else
    441443   return_value = 1
    442    var_id = -1
     444   variable_id = -1
    443445#endif
    444446
     
    450452!> Leave file definition state.
    451453!--------------------------------------------------------------------------------------------------!
    452 SUBROUTINE netcdf4_init_end( file_id, return_value )
    453 
    454    CHARACTER(LEN=*), PARAMETER ::  routine_name = 'netcdf4_init_end'  !< name of this routine
    455 
    456    INTEGER(iwp), INTENT(IN)  ::  file_id       !< file ID
    457    INTEGER(iwp)              ::  nc_stat       !< netcdf return value
    458    INTEGER(iwp)              ::  old_mode      !< previous netcdf fill mode
    459    INTEGER(iwp), INTENT(OUT) ::  return_value  !< return value
     454SUBROUTINE netcdf4_stop_file_header_definition( file_id, return_value )
     455
     456   CHARACTER(LEN=*), PARAMETER ::  routine_name = 'netcdf4_stop_file_header_definition'  !< name of this routine
     457
     458   INTEGER, INTENT(IN)  ::  file_id        !< file ID
     459   INTEGER              ::  nc_stat        !< netcdf return value
     460   INTEGER              ::  old_fill_mode  !< previous netcdf fill mode
     461   INTEGER, INTENT(OUT) ::  return_value   !< return value
    460462
    461463
     
    464466
    465467   WRITE( temp_string, * ) file_id
    466    CALL internal_message( 'debug',        &
    467                           routine_name // &
     468   CALL internal_message( 'debug', routine_name // &
    468469                          ': finalize file definition (file_id=' // TRIM( temp_string ) // ')' )
    469470
    470471   !-- Set general no fill, otherwise the performance drops significantly
    471    nc_stat = NF90_SET_FILL( file_id, NF90_NOFILL, old_mode )
     472   nc_stat = NF90_SET_FILL( file_id, NF90_NOFILL, old_fill_mode )
    472473
    473474   IF ( nc_stat == NF90_NOERR )  THEN
     
    477478   IF ( nc_stat /= NF90_NOERR )  THEN
    478479      return_value = 1
    479       CALL internal_message( 'error', routine_name // ': NetCDF error: ' // &
    480                                      NF90_STRERROR( nc_stat ) )
     480      CALL internal_message( 'error', routine_name // &
     481                             ': NetCDF error: ' // NF90_STRERROR( nc_stat ) )
    481482   ENDIF
    482483#else
     
    484485#endif
    485486
    486 END SUBROUTINE netcdf4_init_end
     487END SUBROUTINE netcdf4_stop_file_header_definition
    487488
    488489!--------------------------------------------------------------------------------------------------!
     
    491492!> Write variable of different kind into netcdf file.
    492493!--------------------------------------------------------------------------------------------------!
    493 SUBROUTINE netcdf4_write_variable(                                        &
    494               file_id, var_id, bounds_start, value_counts, bounds_origin, &
    495               is_global,                                                  &
    496               var_int8_0d,   var_int8_1d,   var_int8_2d,   var_int8_3d,   &
    497               var_int16_0d,  var_int16_1d,  var_int16_2d,  var_int16_3d,  &
    498               var_int32_0d,  var_int32_1d,  var_int32_2d,  var_int32_3d,  &
    499               var_intwp_0d,  var_intwp_1d,  var_intwp_2d,  var_intwp_3d,  &
    500               var_real32_0d, var_real32_1d, var_real32_2d, var_real32_3d, &
    501               var_real64_0d, var_real64_1d, var_real64_2d, var_real64_3d, &
    502               var_realwp_0d, var_realwp_1d, var_realwp_2d, var_realwp_3d, &
     494SUBROUTINE netcdf4_write_variable(                                                    &
     495              file_id, variable_id, bounds_start, value_counts, bounds_origin,        &
     496              is_global,                                                              &
     497              values_int8_0d,   values_int8_1d,   values_int8_2d,   values_int8_3d,   &
     498              values_int16_0d,  values_int16_1d,  values_int16_2d,  values_int16_3d,  &
     499              values_int32_0d,  values_int32_1d,  values_int32_2d,  values_int32_3d,  &
     500              values_intwp_0d,  values_intwp_1d,  values_intwp_2d,  values_intwp_3d,  &
     501              values_real32_0d, values_real32_1d, values_real32_2d, values_real32_3d, &
     502              values_real64_0d, values_real64_1d, values_real64_2d, values_real64_3d, &
     503              values_realwp_0d, values_realwp_1d, values_realwp_2d, values_realwp_3d, &
    503504              return_value )
    504505
    505506   CHARACTER(LEN=*), PARAMETER ::  routine_name = 'netcdf4_write_variable'  !< name of this routine
    506507
    507    INTEGER(iwp)              ::  d             !< loop index
    508    INTEGER(iwp), INTENT(IN)  ::  file_id       !< file ID
    509    INTEGER                   ::  my_rank       !< MPI rank of processor
    510    INTEGER(iwp)              ::  nc_stat       !< netcdf return value
    511    INTEGER(iwp)              ::  ndim          !< number of dimensions of variable in file
    512    INTEGER(iwp), INTENT(OUT) ::  return_value  !< return value
    513    INTEGER(iwp), INTENT(IN)  ::  var_id        !< variable ID
    514 
    515    INTEGER(iwp), DIMENSION(:), INTENT(IN)  ::  bounds_origin  !< starting index of each dimension
    516    INTEGER(iwp), DIMENSION(:), INTENT(IN)  ::  bounds_start   !< starting index of variable
    517    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  dim_ids        !< IDs of dimensions of variable in file
    518    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  dim_lengths    !< length of dimensions of variable in file
    519    INTEGER(iwp), DIMENSION(:), INTENT(IN)  ::  value_counts   !< count of values along each dimension to be written
    520 
    521    INTEGER(KIND=1), POINTER, INTENT(IN), OPTIONAL                               ::  var_int8_0d  !< output variable
    522    INTEGER(KIND=1), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  var_int8_1d  !< output variable
    523    INTEGER(KIND=1), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  var_int8_2d  !< output variable
    524    INTEGER(KIND=1), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  var_int8_3d  !< output variable
    525 
    526    INTEGER(KIND=2), POINTER, INTENT(IN), OPTIONAL                               ::  var_int16_0d  !< output variable
    527    INTEGER(KIND=2), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  var_int16_1d  !< output variable
    528    INTEGER(KIND=2), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  var_int16_2d  !< output variable
    529    INTEGER(KIND=2), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  var_int16_3d  !< output variable
    530 
    531    INTEGER(KIND=4), POINTER, INTENT(IN), OPTIONAL                               ::  var_int32_0d  !< output variable
    532    INTEGER(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  var_int32_1d  !< output variable
    533    INTEGER(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  var_int32_2d  !< output variable
    534    INTEGER(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  var_int32_3d  !< output variable
    535 
    536    INTEGER(iwp), POINTER, INTENT(IN), OPTIONAL                               ::  var_intwp_0d  !< output variable
    537    INTEGER(iwp), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  var_intwp_1d  !< output variable
    538    INTEGER(iwp), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  var_intwp_2d  !< output variable
    539    INTEGER(iwp), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  var_intwp_3d  !< output variable
     508   INTEGER              ::  d             !< loop index
     509   INTEGER, INTENT(IN)  ::  file_id       !< file ID
     510   INTEGER              ::  my_rank       !< MPI rank of processor
     511   INTEGER              ::  nc_stat       !< netcdf return value
     512   INTEGER              ::  ndims         !< number of dimensions of variable in file
     513   INTEGER, INTENT(OUT) ::  return_value  !< return value
     514   INTEGER, INTENT(IN)  ::  variable_id   !< variable ID
     515
     516   INTEGER, DIMENSION(:),              INTENT(IN)  ::  bounds_origin      !< starting index of each dimension
     517   INTEGER, DIMENSION(:),              INTENT(IN)  ::  bounds_start       !< starting index of variable
     518   INTEGER, DIMENSION(:), ALLOCATABLE              ::  dimension_ids      !< IDs of dimensions of variable in file
     519   INTEGER, DIMENSION(:), ALLOCATABLE              ::  dimension_lengths  !< length of dimensions of variable in file
     520   INTEGER, DIMENSION(:),              INTENT(IN)  ::  value_counts       !< count of values along each dimension to be written
     521
     522   INTEGER(KIND=1), POINTER,             INTENT(IN), OPTIONAL                   ::  values_int8_0d   !< output variable
     523   INTEGER(KIND=2), POINTER,             INTENT(IN), OPTIONAL                   ::  values_int16_0d  !< output variable
     524   INTEGER(KIND=4), POINTER,             INTENT(IN), OPTIONAL                   ::  values_int32_0d  !< output variable
     525   INTEGER(iwp),    POINTER,             INTENT(IN), OPTIONAL                   ::  values_intwp_0d  !< output variable
     526   INTEGER(KIND=1), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  values_int8_1d   !< output variable
     527   INTEGER(KIND=2), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  values_int16_1d  !< output variable
     528   INTEGER(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  values_int32_1d  !< output variable
     529   INTEGER(iwp),    POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  values_intwp_1d  !< output variable
     530   INTEGER(KIND=1), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  values_int8_2d   !< output variable
     531   INTEGER(KIND=2), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  values_int16_2d  !< output variable
     532   INTEGER(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  values_int32_2d  !< output variable
     533   INTEGER(iwp),    POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  values_intwp_2d  !< output variable
     534   INTEGER(KIND=1), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  values_int8_3d   !< output variable
     535   INTEGER(KIND=2), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  values_int16_3d  !< output variable
     536   INTEGER(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  values_int32_3d  !< output variable
     537   INTEGER(iwp),    POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  values_intwp_3d  !< output variable
    540538
    541539   LOGICAL, INTENT(IN) ::  is_global  !< true if variable is global (same on all PE)
    542540
    543    REAL(KIND=4), POINTER, INTENT(IN), OPTIONAL                               ::  var_real32_0d  !< output variable
    544    REAL(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  var_real32_1d  !< output variable
    545    REAL(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  var_real32_2d  !< output variable
    546    REAL(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  var_real32_3d  !< output variable
    547 
    548    REAL(KIND=8), POINTER, INTENT(IN), OPTIONAL                               ::  var_real64_0d  !< output variable
    549    REAL(KIND=8), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  var_real64_1d  !< output variable
    550    REAL(KIND=8), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  var_real64_2d  !< output variable
    551    REAL(KIND=8), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  var_real64_3d  !< output variable
    552 
    553    REAL(wp), POINTER, INTENT(IN), OPTIONAL                               ::  var_realwp_0d  !< output variable
    554    REAL(wp), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  var_realwp_1d  !< output variable
    555    REAL(wp), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  var_realwp_2d  !< output variable
    556    REAL(wp), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  var_realwp_3d  !< output variable
     541   REAL(KIND=4), POINTER,             INTENT(IN), OPTIONAL                   ::  values_real32_0d  !< output variable
     542   REAL(KIND=8), POINTER,             INTENT(IN), OPTIONAL                   ::  values_real64_0d  !< output variable
     543   REAL(wp),     POINTER,             INTENT(IN), OPTIONAL                   ::  values_realwp_0d  !< output variable
     544   REAL(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  values_real32_1d  !< output variable
     545   REAL(KIND=8), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  values_real64_1d  !< output variable
     546   REAL(wp),     POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:)     ::  values_realwp_1d  !< output variable
     547   REAL(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  values_real32_2d  !< output variable
     548   REAL(KIND=8), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  values_real64_2d  !< output variable
     549   REAL(wp),     POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:)   ::  values_realwp_2d  !< output variable
     550   REAL(KIND=4), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  values_real32_3d  !< output variable
     551   REAL(KIND=8), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  values_real64_3d  !< output variable
     552   REAL(wp),     POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  values_realwp_3d  !< output variable
    557553
    558554
     
    571567   IF ( return_value == 0  .AND.  ( .NOT. is_global  .OR.  my_rank == master_rank ) )  THEN
    572568
    573       WRITE( temp_string, * ) var_id
     569      WRITE( temp_string, * ) variable_id
    574570      CALL internal_message( 'debug', routine_name // ': write variable ' // TRIM( temp_string ) )
    575571
    576       ndim = SIZE( bounds_start )
     572      ndims = SIZE( bounds_start )
    577573
    578574      !-- 8bit integer output
    579       IF ( PRESENT( var_int8_0d ) )  THEN
    580          nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_int8_0d /),      &
    581                                  start = bounds_start - bounds_origin + 1, &
    582                                  count = value_counts )
    583       ELSEIF ( PRESENT( var_int8_1d ) )  THEN
    584          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int8_1d,             &
    585                                  start = bounds_start - bounds_origin + 1, &
    586                                  count = value_counts )
    587       ELSEIF ( PRESENT( var_int8_2d ) )  THEN
    588          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int8_2d,             &
    589                                  start = bounds_start - bounds_origin + 1, &
    590                                  count = value_counts )
    591       ELSEIF ( PRESENT( var_int8_3d ) )  THEN
    592          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int8_3d,             &
     575      IF ( PRESENT( values_int8_0d ) )  THEN
     576         nc_stat = NF90_PUT_VAR( file_id, variable_id, (/ values_int8_0d /), &
     577                                 start = bounds_start - bounds_origin + 1,   &
     578                                 count = value_counts )
     579      ELSEIF ( PRESENT( values_int8_1d ) )  THEN
     580         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int8_1d,     &
     581                                 start = bounds_start - bounds_origin + 1, &
     582                                 count = value_counts )
     583      ELSEIF ( PRESENT( values_int8_2d ) )  THEN
     584         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int8_2d,     &
     585                                 start = bounds_start - bounds_origin + 1, &
     586                                 count = value_counts )
     587      ELSEIF ( PRESENT( values_int8_3d ) )  THEN
     588         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int8_3d,     &
    593589                                 start = bounds_start - bounds_origin + 1, &
    594590                                 count = value_counts )
    595591      !-- 16bit integer output
    596       ELSEIF ( PRESENT( var_int16_0d ) )  THEN
    597          nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_int16_0d /),      &
    598                                  start = bounds_start - bounds_origin + 1, &
    599                                  count = value_counts )
    600       ELSEIF ( PRESENT( var_int16_1d ) )  THEN
    601          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int16_1d,            &
    602                                  start = bounds_start - bounds_origin + 1, &
    603                                  count = value_counts )
    604       ELSEIF ( PRESENT( var_int16_2d ) )  THEN
    605          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int16_2d,            &
    606                                  start = bounds_start - bounds_origin + 1, &
    607                                  count = value_counts )
    608       ELSEIF ( PRESENT( var_int16_3d ) )  THEN
    609          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int16_3d,            &
     592      ELSEIF ( PRESENT( values_int16_0d ) )  THEN
     593         nc_stat = NF90_PUT_VAR( file_id, variable_id, (/ values_int16_0d /), &
     594                                 start = bounds_start - bounds_origin + 1,    &
     595                                 count = value_counts )
     596      ELSEIF ( PRESENT( values_int16_1d ) )  THEN
     597         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int16_1d,    &
     598                                 start = bounds_start - bounds_origin + 1, &
     599                                 count = value_counts )
     600      ELSEIF ( PRESENT( values_int16_2d ) )  THEN
     601         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int16_2d,    &
     602                                 start = bounds_start - bounds_origin + 1, &
     603                                 count = value_counts )
     604      ELSEIF ( PRESENT( values_int16_3d ) )  THEN
     605         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int16_3d,    &
    610606                                 start = bounds_start - bounds_origin + 1, &
    611607                                 count = value_counts )
    612608      !-- 32bit integer output
    613       ELSEIF ( PRESENT( var_int32_0d ) )  THEN
    614          nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_int32_0d /),      &
    615                                  start = bounds_start - bounds_origin + 1, &
    616                                  count = value_counts )
    617       ELSEIF ( PRESENT( var_int32_1d ) )  THEN
    618          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int32_1d,            &
    619                                  start = bounds_start - bounds_origin + 1, &
    620                                  count = value_counts )
    621       ELSEIF ( PRESENT( var_int32_2d ) )  THEN
    622          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int32_2d,            &
    623                                  start = bounds_start - bounds_origin + 1, &
    624                                  count = value_counts )
    625       ELSEIF ( PRESENT( var_int32_3d ) )  THEN
    626          nc_stat = NF90_PUT_VAR( file_id, var_id, var_int32_3d,            &
     609      ELSEIF ( PRESENT( values_int32_0d ) )  THEN
     610         nc_stat = NF90_PUT_VAR( file_id, variable_id, (/ values_int32_0d /),  &
     611                                 start = bounds_start - bounds_origin + 1,     &
     612                                 count = value_counts )
     613      ELSEIF ( PRESENT( values_int32_1d ) )  THEN
     614         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int32_1d,    &
     615                                 start = bounds_start - bounds_origin + 1, &
     616                                 count = value_counts )
     617      ELSEIF ( PRESENT( values_int32_2d ) )  THEN
     618         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int32_2d,    &
     619                                 start = bounds_start - bounds_origin + 1, &
     620                                 count = value_counts )
     621      ELSEIF ( PRESENT( values_int32_3d ) )  THEN
     622         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_int32_3d,    &
    627623                                 start = bounds_start - bounds_origin + 1, &
    628624                                 count = value_counts )
    629625      !-- working-precision integer output
    630       ELSEIF ( PRESENT( var_intwp_0d ) )  THEN
    631          nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_intwp_0d /),      &
    632                                  start = bounds_start - bounds_origin + 1, &
    633                                  count = value_counts )
    634       ELSEIF ( PRESENT( var_intwp_1d ) )  THEN
    635          nc_stat = NF90_PUT_VAR( file_id, var_id, var_intwp_1d,            &
    636                                  start = bounds_start - bounds_origin + 1, &
    637                                  count = value_counts )
    638       ELSEIF ( PRESENT( var_intwp_2d ) )  THEN
    639          nc_stat = NF90_PUT_VAR( file_id, var_id, var_intwp_2d,            &
    640                                  start = bounds_start - bounds_origin + 1, &
    641                                  count = value_counts )
    642       ELSEIF ( PRESENT( var_intwp_3d ) )  THEN
    643          nc_stat = NF90_PUT_VAR( file_id, var_id, var_intwp_3d,            &
     626      ELSEIF ( PRESENT( values_intwp_0d ) )  THEN
     627         nc_stat = NF90_PUT_VAR( file_id, variable_id, (/ values_intwp_0d /),  &
     628                                 start = bounds_start - bounds_origin + 1,     &
     629                                 count = value_counts )
     630      ELSEIF ( PRESENT( values_intwp_1d ) )  THEN
     631         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_intwp_1d,    &
     632                                 start = bounds_start - bounds_origin + 1, &
     633                                 count = value_counts )
     634      ELSEIF ( PRESENT( values_intwp_2d ) )  THEN
     635         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_intwp_2d,    &
     636                                 start = bounds_start - bounds_origin + 1, &
     637                                 count = value_counts )
     638      ELSEIF ( PRESENT( values_intwp_3d ) )  THEN
     639         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_intwp_3d,    &
    644640                                 start = bounds_start - bounds_origin + 1, &
    645641                                 count = value_counts )
    646642      !-- 32bit real output
    647       ELSEIF ( PRESENT( var_real32_0d ) )  THEN
    648          nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_real32_0d /),    &
    649                                  start = bounds_start - bounds_origin + 1, &
    650                                  count = value_counts )
    651       ELSEIF ( PRESENT( var_real32_1d ) )  THEN
    652          nc_stat = NF90_PUT_VAR( file_id, var_id, var_real32_1d,           &
    653                                  start = bounds_start - bounds_origin + 1, &
    654                                  count = value_counts )
    655       ELSEIF ( PRESENT( var_real32_2d ) )  THEN
    656          nc_stat = NF90_PUT_VAR( file_id, var_id, var_real32_2d,           &
    657                                  start = bounds_start - bounds_origin + 1, &
    658                                  count = value_counts )
    659       ELSEIF ( PRESENT( var_real32_3d ) )  THEN
    660          nc_stat = NF90_PUT_VAR( file_id, var_id, var_real32_3d,           &
     643      ELSEIF ( PRESENT( values_real32_0d ) )  THEN
     644         nc_stat = NF90_PUT_VAR( file_id, variable_id, (/ values_real32_0d /), &
     645                                 start = bounds_start - bounds_origin + 1,     &
     646                                 count = value_counts )
     647      ELSEIF ( PRESENT( values_real32_1d ) )  THEN
     648         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_real32_1d,   &
     649                                 start = bounds_start - bounds_origin + 1, &
     650                                 count = value_counts )
     651      ELSEIF ( PRESENT( values_real32_2d ) )  THEN
     652         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_real32_2d,   &
     653                                 start = bounds_start - bounds_origin + 1, &
     654                                 count = value_counts )
     655      ELSEIF ( PRESENT( values_real32_3d ) )  THEN
     656         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_real32_3d,   &
    661657                                 start = bounds_start - bounds_origin + 1, &
    662658                                 count = value_counts )
    663659      !-- 64bit real output
    664       ELSEIF ( PRESENT( var_real64_0d ) )  THEN
    665          nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_real64_0d /),    &
    666                                  start = bounds_start - bounds_origin + 1, &
    667                                  count = value_counts )
    668       ELSEIF ( PRESENT( var_real64_1d ) )  THEN
    669          nc_stat = NF90_PUT_VAR( file_id, var_id, var_real64_1d,           &
    670                                  start = bounds_start - bounds_origin + 1, &
    671                                  count = value_counts )
    672       ELSEIF ( PRESENT( var_real64_2d ) )  THEN
    673          nc_stat = NF90_PUT_VAR( file_id, var_id, var_real64_2d,           &
    674                                  start = bounds_start - bounds_origin + 1, &
    675                                  count = value_counts )
    676       ELSEIF ( PRESENT( var_real64_3d ) )  THEN
    677          nc_stat = NF90_PUT_VAR( file_id, var_id, var_real64_3d,           &
     660      ELSEIF ( PRESENT( values_real64_0d ) )  THEN
     661         nc_stat = NF90_PUT_VAR( file_id, variable_id, (/ values_real64_0d /), &
     662                                 start = bounds_start - bounds_origin + 1,     &
     663                                 count = value_counts )
     664      ELSEIF ( PRESENT( values_real64_1d ) )  THEN
     665         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_real64_1d,   &
     666                                 start = bounds_start - bounds_origin + 1, &
     667                                 count = value_counts )
     668      ELSEIF ( PRESENT( values_real64_2d ) )  THEN
     669         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_real64_2d,   &
     670                                 start = bounds_start - bounds_origin + 1, &
     671                                 count = value_counts )
     672      ELSEIF ( PRESENT( values_real64_3d ) )  THEN
     673         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_real64_3d,   &
    678674                                 start = bounds_start - bounds_origin + 1, &
    679675                                 count = value_counts )
    680676      !-- working-precision real output
    681       ELSEIF ( PRESENT( var_realwp_0d ) )  THEN
    682          nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_realwp_0d /),    &
    683                                  start = bounds_start - bounds_origin + 1, &
    684                                  count = value_counts )
    685       ELSEIF ( PRESENT( var_realwp_1d ) )  THEN
    686          nc_stat = NF90_PUT_VAR( file_id, var_id, var_realwp_1d,           &
    687                                  start = bounds_start - bounds_origin + 1, &
    688                                  count = value_counts )
    689       ELSEIF ( PRESENT( var_realwp_2d ) )  THEN
    690          nc_stat = NF90_PUT_VAR( file_id, var_id, var_realwp_2d,           &
    691                                  start = bounds_start - bounds_origin + 1, &
    692                                  count = value_counts )
    693       ELSEIF ( PRESENT( var_realwp_3d ) )  THEN
    694          nc_stat = NF90_PUT_VAR( file_id, var_id, var_realwp_3d,           &
     677      ELSEIF ( PRESENT( values_realwp_0d ) )  THEN
     678         nc_stat = NF90_PUT_VAR( file_id, variable_id, (/ values_realwp_0d /), &
     679                                 start = bounds_start - bounds_origin + 1,     &
     680                                 count = value_counts )
     681      ELSEIF ( PRESENT( values_realwp_1d ) )  THEN
     682         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_realwp_1d,   &
     683                                 start = bounds_start - bounds_origin + 1, &
     684                                 count = value_counts )
     685      ELSEIF ( PRESENT( values_realwp_2d ) )  THEN
     686         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_realwp_2d,   &
     687                                 start = bounds_start - bounds_origin + 1, &
     688                                 count = value_counts )
     689      ELSEIF ( PRESENT( values_realwp_3d ) )  THEN
     690         nc_stat = NF90_PUT_VAR( file_id, variable_id, values_realwp_3d,   &
    695691                                 start = bounds_start - bounds_origin + 1, &
    696692                                 count = value_counts )
     
    698694         return_value = 1
    699695         nc_stat = NF90_NOERR
    700          WRITE( temp_string, '(": variable_id=",I6,", file_id=",I6)' ) var_id, file_id
     696         WRITE( temp_string, '(": variable_id=",I6,", file_id=",I6)' ) variable_id, file_id
    701697         CALL internal_message( 'error', routine_name // &
    702                                 TRIM( temp_string ) //   &
    703                                 ': no output values given' )
     698                                ': no output values given ' // TRIM( temp_string ) )
    704699      ENDIF
    705700
     
    713708            WRITE( temp_string, * )  NF90_STRERROR( nc_stat )
    714709
    715             ALLOCATE( dim_ids(ndim) )
    716             ALLOCATE( dim_lengths(ndim) )
    717 
    718             nc_stat = NF90_INQUIRE_VARIABLE( file_id, var_id, dimids=dim_ids )
     710            ALLOCATE( dimension_ids(ndims) )
     711            ALLOCATE( dimension_lengths(ndims) )
     712
     713            nc_stat = NF90_INQUIRE_VARIABLE( file_id, variable_id, dimids=dimension_ids )
    719714
    720715            d = 1
    721             DO WHILE ( d <= ndim .AND. nc_stat == NF90_NOERR )
    722                nc_stat = NF90_INQUIRE_DIMENSION( file_id, dim_ids(d), len=dim_lengths(d) )
     716            DO WHILE ( d <= ndims .AND. nc_stat == NF90_NOERR )
     717               nc_stat = NF90_INQUIRE_DIMENSION( file_id, dimension_ids(d), &
     718                                                 LEN=dimension_lengths(d) )
    723719               d = d + 1
    724720            ENDDO
     
    728724                  'start=', bounds_start, ', count=', value_counts, ', origin=', bounds_origin
    729725               CALL internal_message( 'error', routine_name //     &
    730                                       ': error while writing: ' // &
    731                                       TRIM( temp_string ) )
     726                                      ': error while writing: ' // TRIM( temp_string ) )
    732727            ELSE
    733728               !-- Error occured during NF90_INQUIRE_VARIABLE or NF90_INQUIRE_DIMENSION
    734729               CALL internal_message( 'error', routine_name //            &
    735730                                      ': error while accessing file: ' // &
    736                                       NF90_STRERROR( nc_stat ) )
     731                                       NF90_STRERROR( nc_stat ) )
    737732            ENDIF
    738733
     
    740735            !-- Other NetCDF error
    741736            CALL internal_message( 'error', routine_name //     &
    742                                    ': error while writing: ' // &
    743                                    NF90_STRERROR( nc_stat ) )
     737                                   ': error while writing: ' // NF90_STRERROR( nc_stat ) )
    744738         ENDIF
    745739      ENDIF
     
    761755   CHARACTER(LEN=*), PARAMETER ::  routine_name = 'netcdf4_finalize'  !< name of routine
    762756
    763    INTEGER(iwp), INTENT(IN)  ::  file_id       !< file ID
    764    INTEGER(iwp)              ::  nc_stat       !< netcdf return value
    765    INTEGER(iwp), INTENT(OUT) ::  return_value  !< return value
     757   INTEGER, INTENT(IN)  ::  file_id       !< file ID
     758   INTEGER              ::  nc_stat       !< netcdf return value
     759   INTEGER, INTENT(OUT) ::  return_value  !< return value
    766760
    767761
     
    769763   WRITE( temp_string, * ) file_id
    770764   CALL internal_message( 'debug', routine_name // &
    771                                    ': close file (file_id=' // TRIM( temp_string ) // ')' )
     765                          ': close file (file_id=' // TRIM( temp_string ) // ')' )
    772766
    773767   nc_stat = NF90_CLOSE( file_id )
     
    777771      return_value = 1
    778772      CALL internal_message( 'error', routine_name // &
    779                                       ': NetCDF error: ' // NF90_STRERROR( nc_stat ) )
     773                             ': NetCDF error: ' // NF90_STRERROR( nc_stat ) )
    780774   ENDIF
    781775#else
     
    796790   CHARACTER(LEN=*), PARAMETER ::  routine_name = 'get_netcdf_data_type'  !< name of this routine
    797791
    798    INTEGER(iwp) ::  return_value  !< netcdf data type
     792   INTEGER ::  return_value  !< netcdf data type
    799793
    800794
     
    823817      CASE DEFAULT
    824818         CALL internal_message( 'error', routine_name // &
    825                                          ': data type unknown (' // TRIM( data_type ) // ')' )
    826          return_value = -1_iwp
     819                                ': data type unknown (' // TRIM( data_type ) // ')' )
     820         return_value = -1
    827821
    828822   END SELECT
     
    860854!> Return the last created error message.
    861855!--------------------------------------------------------------------------------------------------!
    862 SUBROUTINE netcdf4_get_error_message( error_message )
    863 
    864    CHARACTER(LEN=800), INTENT(OUT) ::  error_message  !< return error message to main program
    865 
    866 
    867    error_message = internal_error_message
    868 
    869 END SUBROUTINE netcdf4_get_error_message
     856FUNCTION netcdf4_get_error_message() RESULT( error_message )
     857
     858   CHARACTER(LEN=800) ::  error_message  !< return error message to main program
     859
     860
     861   error_message = TRIM( internal_error_message )
     862
     863   internal_error_message = ''
     864
     865END FUNCTION netcdf4_get_error_message
    870866
    871867
Note: See TracChangeset for help on using the changeset viewer.