Ignore:
Timestamp:
Mar 19, 2010 5:30:02 AM (14 years ago)
Author:
raasch
Message:

NetCDF4 support for particle data; special character allowed for NetCDF variable names

File:
1 edited

Legend:

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

    r494 r519  
    77! Current revisions:
    88! ------------------
    9 !
     9! Particle number defined as unlimited dimension in case of NetCDF4 output,
     10! special characters like * and " are now allowed for NetCDF variable names,
     11! replacement of these characters removed, routine clean_netcdf_varname
     12! removed
    1013!
    1114! Former revisions:
     
    9598    CHARACTER (LEN=4)              ::  grid_x, grid_y, grid_z
    9699    CHARACTER (LEN=6)              ::  mode
    97     CHARACTER (LEN=10)             ::  netcdf_var_name, netcdf_var_name_base, &
    98                                        precision, var
     100    CHARACTER (LEN=10)             ::  netcdf_var_name, precision, var
    99101    CHARACTER (LEN=80)             ::  time_average_text
    100102    CHARACTER (LEN=2000)           ::  var_list, var_list_old
     
    15561558!--             surface variable. Define it with id_dim_zu1_xy.
    15571559                IF ( INDEX( do2d(av,i), '*' ) /= 0 )  THEN
    1558 !
    1559 !--                First, remove those characters not allowed by NetCDF
    1560                    netcdf_var_name = do2d(av,i)
    1561                    CALL clean_netcdf_varname( netcdf_var_name )
    1562 
    1563                    nc_stat = NF90_DEF_VAR( id_set_xy(av), netcdf_var_name,     &
     1560
     1561                   nc_stat = NF90_DEF_VAR( id_set_xy(av),  do2d(av,i),         &
    15641562                                           nc_precision(1),                    &
    15651563                                           (/ id_dim_x_xy(av), id_dim_y_xy(av),&
     
    15681566                                           id_var_do2d(av,i) )
    15691567
    1570                    var_list = TRIM(var_list) // TRIM(netcdf_var_name) // ';'
     1568                   var_list = TRIM(var_list) // TRIM( do2d(av,i) ) // ';'
    15711569
    15721570                ELSE
     
    18271825          DO WHILE ( do2d(av,i)(1:1) /= ' ' )
    18281826             IF ( INDEX( do2d(av,i), 'xy' ) /= 0 )  THEN
    1829                 netcdf_var_name = do2d(av,i)
    1830                 CALL clean_netcdf_varname( netcdf_var_name )
    1831                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // ';'
     1827                var_list = TRIM( var_list ) // TRIM( do2d(av,i) ) // ';'
    18321828             ENDIF
    18331829             i = i + 1
     
    19671963          DO WHILE ( do2d(av,i)(1:1) /= ' ' )
    19681964             IF ( INDEX( do2d(av,i), 'xy' ) /= 0 )  THEN
    1969                 netcdf_var_name = do2d(av,i)
    1970                 CALL clean_netcdf_varname( netcdf_var_name )
    1971                 nc_stat = NF90_INQ_VARID( id_set_xy(av), netcdf_var_name, &
     1965                nc_stat = NF90_INQ_VARID( id_set_xy(av), do2d(av,i), &
    19721966                                          id_var_do2d(av,i) )
    19731967                CALL handle_netcdf_error( 'netcdf', 138 )
     
    24012395          DO WHILE ( do2d(av,i)(1:1) /= ' ' )
    24022396             IF ( INDEX( do2d(av,i), 'xz' ) /= 0 )  THEN
    2403                 netcdf_var_name = do2d(av,i)
    2404                 CALL clean_netcdf_varname( netcdf_var_name )
    2405                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // ';'
     2397                var_list = TRIM( var_list ) // TRIM( do2d(av,i) ) // ';'
    24062398             ENDIF
    24072399             i = i + 1
     
    25412533          DO WHILE ( do2d(av,i)(1:1) /= ' ' )
    25422534             IF ( INDEX( do2d(av,i), 'xz' ) /= 0 )  THEN
    2543                 netcdf_var_name = do2d(av,i)
    2544                 CALL clean_netcdf_varname( netcdf_var_name )
    2545                 nc_stat = NF90_INQ_VARID( id_set_xz(av), netcdf_var_name, &
     2535                nc_stat = NF90_INQ_VARID( id_set_xz(av), do2d(av,i), &
    25462536                                          id_var_do2d(av,i) )
    25472537                CALL handle_netcdf_error( 'netcdf', 177 )
     
    29892979          DO WHILE ( do2d(av,i)(1:1) /= ' ' )
    29902980             IF ( INDEX( do2d(av,i), 'yz' ) /= 0 )  THEN
    2991                 netcdf_var_name = do2d(av,i)
    2992                 CALL clean_netcdf_varname( netcdf_var_name )
    2993                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // ';'
     2981                var_list = TRIM( var_list ) // TRIM( do2d(av,i) ) // ';'
    29942982             ENDIF
    29952983             i = i + 1
     
    31293117          DO WHILE ( do2d(av,i)(1:1) /= ' ' )
    31303118             IF ( INDEX( do2d(av,i), 'yz' ) /= 0 )  THEN
    3131                 netcdf_var_name = do2d(av,i)
    3132                 CALL clean_netcdf_varname( netcdf_var_name )
    3133                 nc_stat = NF90_INQ_VARID( id_set_yz(av), netcdf_var_name, &
     3119                nc_stat = NF90_INQ_VARID( id_set_yz(av), do2d(av,i), &
    31343120                                          id_var_do2d(av,i) )
    31353121                CALL handle_netcdf_error( 'netcdf', 216 )
     
    32293215          var_list = ';'
    32303216          DO  i = 1, dopr_n
    3231 !
    3232 !--          First, remove those characters not allowed by NetCDF
    3233              netcdf_var_name = data_output_pr(i)
    3234              CALL clean_netcdf_varname( netcdf_var_name )
    32353217
    32363218             IF ( statistic_regions == 0 )  THEN
     
    32383220!
    32393221!--             Define the z-axes (each variable gets its own z-axis)
    3240                 nc_stat = NF90_DEF_DIM( id_set_pr, 'z'//TRIM(netcdf_var_name), &
     3222                nc_stat = NF90_DEF_DIM( id_set_pr,                        &
     3223                                        'z' // TRIM( data_output_pr(i) ), &
    32413224                                        nzt+2-nzb, id_dim_z_pr(i,0) )
    32423225                CALL handle_netcdf_error( 'netcdf', 223 )
    32433226
    3244                 nc_stat = NF90_DEF_VAR( id_set_pr, 'z'//TRIM(netcdf_var_name), &
    3245                                         NF90_DOUBLE, id_dim_z_pr(i,0),         &
     3227                nc_stat = NF90_DEF_VAR( id_set_pr,                        &
     3228                                        'z' // TRIM( data_output_pr(i) ), &
     3229                                        NF90_DOUBLE, id_dim_z_pr(i,0),    &
    32463230                                        id_var_z_pr(i,0) )
    32473231                CALL handle_netcdf_error( 'netcdf', 224 )
     
    32523236!
    32533237!--             Define the variable
    3254                 nc_stat = NF90_DEF_VAR( id_set_pr, netcdf_var_name,           &
     3238                nc_stat = NF90_DEF_VAR( id_set_pr, data_output_pr(i),         &
    32553239                                        nc_precision(5), (/ id_dim_z_pr(i,0), &
    32563240                                        id_dim_time_pr /), id_var_dopr(i,0) )
     
    32653249                CALL handle_netcdf_error( 'netcdf', 228 )
    32663250
    3267                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // ';'
     3251                var_list = TRIM( var_list ) // TRIM( data_output_pr(i) ) // ';'
    32683252
    32693253             ELSE
     
    32773261!--                Define the z-axes (each variable gets it own z-axis)
    32783262                   nc_stat = NF90_DEF_DIM( id_set_pr,                          &
    3279                                            'z'//TRIM(netcdf_var_name)//suffix, &
     3263                                         'z'//TRIM(data_output_pr(i))//suffix, &
    32803264                                           nzt+2-nzb, id_dim_z_pr(i,j) )
    32813265                   CALL handle_netcdf_error( 'netcdf', 229 )
    32823266
    32833267                   nc_stat = NF90_DEF_VAR( id_set_pr,                          &
    3284                                            'z'//TRIM(netcdf_var_name)//suffix, &
     3268                                         'z'//TRIM(data_output_pr(i))//suffix, &
    32853269                                           nc_precision(5), id_dim_z_pr(i,j),  &
    32863270                                           id_var_z_pr(i,j) )
     
    32943278!--                Define the variable
    32953279                   nc_stat = NF90_DEF_VAR( id_set_pr,                         &
    3296                                            TRIM( netcdf_var_name ) // suffix, &
     3280                                           TRIM(data_output_pr(i)) // suffix, &
    32973281                                           nc_precision(5),                   &
    32983282                                           (/ id_dim_z_pr(i,j),               &
     
    33103294                   CALL handle_netcdf_error( 'netcdf', 234 )
    33113295
    3312                    var_list = TRIM(var_list) // TRIM(netcdf_var_name) // &
     3296                   var_list = TRIM( var_list ) // TRIM( data_output_pr(i) ) // &
    33133297                              suffix // ';'
    33143298
     
    33763360          DO  i = 1, dopr_n
    33773361
    3378              netcdf_var_name = data_output_pr(i)
    3379              CALL clean_netcdf_varname( netcdf_var_name )
    3380 
    33813362             IF ( statistic_regions == 0 )  THEN
    3382                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // ';'
     3363                var_list = TRIM( var_list ) // TRIM( data_output_pr(i) ) // ';'
    33833364             ELSE
    33843365                DO  j = 0, statistic_regions
    33853366                   WRITE ( suffix, '(''_'',I1)' )  j
    3386                    var_list = TRIM(var_list) // TRIM(netcdf_var_name) // &
     3367                   var_list = TRIM( var_list ) // TRIM( data_output_pr(i) ) // &
    33873368                              suffix // ';'
    33883369                ENDDO
     
    34453426          DO  i = 1, dopr_n
    34463427 
    3447              netcdf_var_name_base = data_output_pr(i)
    3448              CALL clean_netcdf_varname( netcdf_var_name_base )
    3449 
    34503428             IF ( statistic_regions == 0 )  THEN
    3451                 nc_stat = NF90_INQ_VARID( id_set_pr, netcdf_var_name_base, &
     3429                nc_stat = NF90_INQ_VARID( id_set_pr, data_output_pr(i), &
    34523430                                          id_var_dopr(i,0) )
    34533431                CALL handle_netcdf_error( 'netcdf', 245 )
     
    34553433                DO  j = 0, statistic_regions
    34563434                   WRITE ( suffix, '(''_'',I1)' )  j
    3457                    netcdf_var_name = TRIM( netcdf_var_name_base ) // suffix
     3435                   netcdf_var_name = TRIM( data_output_pr(i) ) // suffix
    34583436                   nc_stat = NF90_INQ_VARID( id_set_pr, netcdf_var_name, &
    34593437                                             id_var_dopr(i,j) )
     
    35253503          var_list = ';'
    35263504          DO  i = 1, dots_num
    3527 !
    3528 !--          First, remove those characters not allowed by NetCDF
    3529              netcdf_var_name = dots_label(i)
    3530              CALL clean_netcdf_varname( netcdf_var_name )
    35313505
    35323506             IF ( statistic_regions == 0 )  THEN
    35333507
    3534                 nc_stat = NF90_DEF_VAR( id_set_ts, netcdf_var_name,            &
     3508                nc_stat = NF90_DEF_VAR( id_set_ts, dots_label(i),              &
    35353509                                        nc_precision(6), (/ id_dim_time_ts /), &
    35363510                                        id_var_dots(i,0) )
     
    35453519                CALL handle_netcdf_error( 'netcdf', 255 )
    35463520
    3547                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // ';'
     3521                var_list = TRIM( var_list ) // TRIM( dots_label(i) ) // ';'
    35483522
    35493523             ELSE
     
    35553529
    35563530                   nc_stat = NF90_DEF_VAR( id_set_ts,                         &
    3557                                            TRIM( netcdf_var_name ) // suffix, &
     3531                                           TRIM( dots_label(i) ) // suffix,  &
    35583532                                           nc_precision(6),                   &
    35593533                                           (/ id_dim_time_ts /),              &
     
    35713545                   CALL handle_netcdf_error( 'netcdf', 347 )
    35723546
    3573                    var_list = TRIM(var_list) // TRIM(netcdf_var_name) // &
     3547                   var_list = TRIM( var_list ) // TRIM( dots_label(i) ) // &
    35743548                              suffix // ';'
    35753549
     
    36073581          DO  i = 1, dots_num
    36083582
    3609              netcdf_var_name = dots_label(i)
    3610              CALL clean_netcdf_varname( netcdf_var_name )
    3611 
    36123583             IF ( statistic_regions == 0 )  THEN
    3613                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // ';'
     3584                var_list = TRIM( var_list ) // TRIM( dots_label(i) ) // ';'
    36143585             ELSE
    36153586                DO  j = 0, statistic_regions
    36163587                   WRITE ( suffix, '(''_'',I1)' )  j
    3617                    var_list = TRIM(var_list) // TRIM(netcdf_var_name) // &
     3588                   var_list = TRIM( var_list ) // TRIM( dots_label(i) ) // &
    36183589                              suffix // ';'
    36193590                ENDDO
     
    36763647          DO  i = 1, dots_num
    36773648 
    3678              netcdf_var_name_base = dots_label(i)
    3679              CALL clean_netcdf_varname( netcdf_var_name_base )
    3680 
    36813649             IF ( statistic_regions == 0 )  THEN
    3682                 nc_stat = NF90_INQ_VARID( id_set_ts, netcdf_var_name_base, &
     3650                nc_stat = NF90_INQ_VARID( id_set_ts, dots_label(i), &
    36833651                                          id_var_dots(i,0) )
    36843652                CALL handle_netcdf_error( 'netcdf', 265 )
     
    36863654                DO  j = 0, statistic_regions
    36873655                   WRITE ( suffix, '(''_'',I1)' )  j
    3688                    netcdf_var_name = TRIM( netcdf_var_name_base ) // suffix
     3656                   netcdf_var_name = TRIM( dots_label(i) ) // suffix
    36893657                   nc_stat = NF90_INQ_VARID( id_set_ts, netcdf_var_name, &
    36903658                                             id_var_dots(i,j) )
     
    38423810!--             Define the variable
    38433811                netcdf_var_name = TRIM( data_output_sp(i) ) // '_x'
    3844                 CALL clean_netcdf_varname( netcdf_var_name )
    38453812                IF ( TRIM( grid_z ) == 'zw' )  THEN
    38463813                   nc_stat = NF90_DEF_VAR( id_set_sp, netcdf_var_name,      &
     
    38733840!--             Define the variable
    38743841                netcdf_var_name = TRIM( data_output_sp(i) ) // '_y'
    3875                 CALL clean_netcdf_varname( netcdf_var_name )
    38763842                IF ( TRIM( grid_z ) == 'zw' )  THEN
    38773843                   nc_stat = NF90_DEF_VAR( id_set_sp, netcdf_var_name,      &
     
    41744140!
    41754141!--       Define particle coordinate (maximum particle number)
    4176           nc_stat = NF90_DEF_DIM( id_set_prt, 'particle_number', &
    4177                                   maximum_number_of_particles, id_dim_prtnum )
     4142          IF ( netcdf_data_format < 3 )  THEN
     4143             nc_stat = NF90_DEF_DIM( id_set_prt, 'particle_number', &
     4144                                     maximum_number_of_particles, id_dim_prtnum)
     4145          ELSE
     4146!
     4147!--          NetCDF4 allows more than one unlimited dimension
     4148             nc_stat = NF90_DEF_DIM( id_set_prt, 'particle_number', &
     4149                                     NF90_UNLIMITED, id_dim_prtnum)
     4150          ENDIF
    41784151          CALL handle_netcdf_error( 'netcdf', 314 )
    41794152
     
    43114284          DO  i = 1, dopts_num
    43124285
    4313 !
    4314 !--          First, remove those characters not allowed by NetCDF
    4315              netcdf_var_name = dopts_label(i)
    4316              CALL clean_netcdf_varname( netcdf_var_name )
    4317 
    43184286             DO  j = 0, number_of_particle_groups
    43194287
     
    43254293
    43264294                nc_stat = NF90_DEF_VAR( id_set_pts,                         &
    4327                                         TRIM( netcdf_var_name ) // suffix1, &
     4295                                        TRIM( dopts_label(i) ) // suffix1, &
    43284296                                        nc_precision(6),                    &
    43294297                                        (/ id_dim_time_pts /),              &
     
    43474315                CALL handle_netcdf_error( 'netcdf', 402 )
    43484316
    4349                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // &
     4317                var_list = TRIM( var_list ) // TRIM( dopts_label(i) ) // &
    43504318                           suffix1 // ';'
    43514319
     
    43854353          DO  i = 1, dopts_num
    43864354
    4387              netcdf_var_name = dopts_label(i)
    4388              CALL clean_netcdf_varname( netcdf_var_name )
    4389 
    43904355             DO  j = 0, number_of_particle_groups
    43914356
     
    43964361                ENDIF
    43974362
    4398                 var_list = TRIM(var_list) // TRIM(netcdf_var_name) // &
     4363                var_list = TRIM( var_list ) // TRIM( dopts_label(i) ) // &
    43994364                           suffix1 // ';'
    44004365
     
    44594424          DO  i = 1, dopts_num
    44604425 
    4461              netcdf_var_name_base = dopts_label(i)
    4462              CALL clean_netcdf_varname( netcdf_var_name_base )
    4463 
    44644426             DO  j = 0, number_of_particle_groups
    44654427
     
    44704432                ENDIF
    44714433
    4472                 netcdf_var_name = TRIM( netcdf_var_name_base ) // suffix1
     4434                netcdf_var_name = TRIM( dopts_label(i) ) // suffix1
    44734435
    44744436                nc_stat = NF90_INQ_VARID( id_set_pts, netcdf_var_name, &
     
    45464508#endif
    45474509 END SUBROUTINE handle_netcdf_error
    4548 
    4549 
    4550 
    4551  SUBROUTINE clean_netcdf_varname( string )
    4552 #if defined( __netcdf )
    4553 
    4554 !------------------------------------------------------------------------------!
    4555 !
    4556 ! Description:
    4557 ! ------------
    4558 ! Replace those characters in string which are not allowed by NetCDF.
    4559 !------------------------------------------------------------------------------!
    4560 
    4561     USE netcdf_control
    4562 
    4563     IMPLICIT NONE
    4564 
    4565     CHARACTER (LEN=10), INTENT(INOUT) ::  string
    4566 
    4567     INTEGER ::  i, ic
    4568 
    4569     DO  i = 1, replace_num
    4570        DO
    4571           ic = INDEX( string, replace_char(i) )
    4572           IF ( ic /= 0 )  THEN
    4573              string(ic:ic) = replace_by(i)
    4574           ELSE
    4575              EXIT
    4576           ENDIF
    4577        ENDDO
    4578     ENDDO
    4579 
    4580 #endif
    4581  END SUBROUTINE clean_netcdf_varname
Note: See TracChangeset for help on using the changeset viewer.