Ignore:
Timestamp:
Jul 26, 2019 1:45:03 PM (2 years ago)
Author:
gronemeier
Message:

bugfix: do not assue that output arrays start with index 0

File:
1 edited

Legend:

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

    r4107 r4123  
    492492!--------------------------------------------------------------------------------------------------!
    493493SUBROUTINE netcdf4_write_variable(                                        &
    494               file_id, var_id, bounds_start, bounds_end, bounds_origin,  &
    495               do_output, is_global,                                       &
     494              file_id, var_id, bounds_start, value_counts, bounds_origin, &
     495              is_global,                                                  &
    496496              var_int8_0d,   var_int8_1d,   var_int8_2d,   var_int8_3d,   &
    497497              var_int16_0d,  var_int16_1d,  var_int16_2d,  var_int16_3d,  &
     
    514514
    515515   INTEGER(iwp), DIMENSION(:), INTENT(IN)  ::  bounds_origin  !< starting index of each dimension
    516    INTEGER(iwp), DIMENSION(:), INTENT(IN)  ::  bounds_end     !< ending index of variable
    517516   INTEGER(iwp), DIMENSION(:), INTENT(IN)  ::  bounds_start   !< starting index of variable
    518517   INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  dim_ids        !< IDs of dimensions of variable in file
    519518   INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  dim_lengths    !< length of dimensions of variable in file
    520    INTEGER(iwp), DIMENSION(:), ALLOCATABLE ::  value_count    !< count of values along each dimension to be written
     519   INTEGER(iwp), DIMENSION(:), INTENT(IN)  ::  value_counts   !< count of values along each dimension to be written
    521520
    522521   INTEGER(KIND=1), POINTER, INTENT(IN), OPTIONAL                               ::  var_int8_0d  !< output variable
     
    540539   INTEGER(iwp), POINTER, CONTIGUOUS, INTENT(IN), OPTIONAL, DIMENSION(:,:,:) ::  var_intwp_3d  !< output variable
    541540
    542    LOGICAL, INTENT(IN) ::  do_output  !< if false, set count to 0 and do no output
    543541   LOGICAL, INTENT(IN) ::  is_global  !< true if variable is global (same on all PE)
    544542
     
    578576      ndim = SIZE( bounds_start )
    579577
    580       ALLOCATE( value_count(ndim) )
    581 
    582       IF ( do_output ) THEN
    583          value_count = bounds_end - bounds_start + 1
    584       ELSE
    585          value_count = 0
    586       END IF
    587 
    588578      !-- 8bit integer output
    589579      IF ( PRESENT( var_int8_0d ) )  THEN
    590580         nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_int8_0d /),       &
    591581                                 start = bounds_start - bounds_origin + 1, &
    592                                  count = value_count )
     582                                 count = value_counts )
    593583      ELSEIF ( PRESENT( var_int8_1d ) )  THEN
    594584         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int8_1d,             &
    595585                                 start = bounds_start - bounds_origin + 1, &
    596                                  count = value_count )
     586                                 count = value_counts )
    597587      ELSEIF ( PRESENT( var_int8_2d ) )  THEN
    598588         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int8_2d,             &
    599589                                 start = bounds_start - bounds_origin + 1, &
    600                                  count = value_count )
     590                                 count = value_counts )
    601591      ELSEIF ( PRESENT( var_int8_3d ) )  THEN
    602592         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int8_3d,             &
    603593                                 start = bounds_start - bounds_origin + 1, &
    604                                  count = value_count )
     594                                 count = value_counts )
    605595      !-- 16bit integer output
    606596      ELSEIF ( PRESENT( var_int16_0d ) )  THEN
    607597         nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_int16_0d /),      &
    608598                                 start = bounds_start - bounds_origin + 1, &
    609                                  count = value_count )
     599                                 count = value_counts )
    610600      ELSEIF ( PRESENT( var_int16_1d ) )  THEN
    611601         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int16_1d,            &
    612602                                 start = bounds_start - bounds_origin + 1, &
    613                                  count = value_count )
     603                                 count = value_counts )
    614604      ELSEIF ( PRESENT( var_int16_2d ) )  THEN
    615605         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int16_2d,            &
    616606                                 start = bounds_start - bounds_origin + 1, &
    617                                  count = value_count )
     607                                 count = value_counts )
    618608      ELSEIF ( PRESENT( var_int16_3d ) )  THEN
    619609         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int16_3d,            &
    620610                                 start = bounds_start - bounds_origin + 1, &
    621                                  count = value_count )
     611                                 count = value_counts )
    622612      !-- 32bit integer output
    623613      ELSEIF ( PRESENT( var_int32_0d ) )  THEN
    624614         nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_int32_0d /),      &
    625615                                 start = bounds_start - bounds_origin + 1, &
    626                                  count = value_count )
     616                                 count = value_counts )
    627617      ELSEIF ( PRESENT( var_int32_1d ) )  THEN
    628618         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int32_1d,            &
    629619                                 start = bounds_start - bounds_origin + 1, &
    630                                  count = value_count )
     620                                 count = value_counts )
    631621      ELSEIF ( PRESENT( var_int32_2d ) )  THEN
    632622         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int32_2d,            &
    633623                                 start = bounds_start - bounds_origin + 1, &
    634                                  count = value_count )
     624                                 count = value_counts )
    635625      ELSEIF ( PRESENT( var_int32_3d ) )  THEN
    636626         nc_stat = NF90_PUT_VAR( file_id, var_id, var_int32_3d,            &
    637627                                 start = bounds_start - bounds_origin + 1, &
    638                                  count = value_count )
     628                                 count = value_counts )
    639629      !-- working-precision integer output
    640630      ELSEIF ( PRESENT( var_intwp_0d ) )  THEN
    641631         nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_intwp_0d /),      &
    642632                                 start = bounds_start - bounds_origin + 1, &
    643                                  count = value_count )
     633                                 count = value_counts )
    644634      ELSEIF ( PRESENT( var_intwp_1d ) )  THEN
    645635         nc_stat = NF90_PUT_VAR( file_id, var_id, var_intwp_1d,            &
    646636                                 start = bounds_start - bounds_origin + 1, &
    647                                  count = value_count )
     637                                 count = value_counts )
    648638      ELSEIF ( PRESENT( var_intwp_2d ) )  THEN
    649639         nc_stat = NF90_PUT_VAR( file_id, var_id, var_intwp_2d,            &
    650640                                 start = bounds_start - bounds_origin + 1, &
    651                                  count = value_count )
     641                                 count = value_counts )
    652642      ELSEIF ( PRESENT( var_intwp_3d ) )  THEN
    653643         nc_stat = NF90_PUT_VAR( file_id, var_id, var_intwp_3d,            &
    654644                                 start = bounds_start - bounds_origin + 1, &
    655                                  count = value_count )
     645                                 count = value_counts )
    656646      !-- 32bit real output
    657647      ELSEIF ( PRESENT( var_real32_0d ) )  THEN
    658648         nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_real32_0d /),     &
    659649                                 start = bounds_start - bounds_origin + 1, &
    660                                  count = value_count )
     650                                 count = value_counts )
    661651      ELSEIF ( PRESENT( var_real32_1d ) )  THEN
    662652         nc_stat = NF90_PUT_VAR( file_id, var_id, var_real32_1d,           &
    663653                                 start = bounds_start - bounds_origin + 1, &
    664                                  count = value_count )
     654                                 count = value_counts )
    665655      ELSEIF ( PRESENT( var_real32_2d ) )  THEN
    666656         nc_stat = NF90_PUT_VAR( file_id, var_id, var_real32_2d,           &
    667657                                 start = bounds_start - bounds_origin + 1, &
    668                                  count = value_count )
     658                                 count = value_counts )
    669659      ELSEIF ( PRESENT( var_real32_3d ) )  THEN
    670660         nc_stat = NF90_PUT_VAR( file_id, var_id, var_real32_3d,           &
    671661                                 start = bounds_start - bounds_origin + 1, &
    672                                  count = value_count )
     662                                 count = value_counts )
    673663      !-- 64bit real output
    674664      ELSEIF ( PRESENT( var_real64_0d ) )  THEN
    675665         nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_real64_0d /),     &
    676666                                 start = bounds_start - bounds_origin + 1, &
    677                                  count = value_count )
     667                                 count = value_counts )
    678668      ELSEIF ( PRESENT( var_real64_1d ) )  THEN
    679669         nc_stat = NF90_PUT_VAR( file_id, var_id, var_real64_1d,           &
    680670                                 start = bounds_start - bounds_origin + 1, &
    681                                  count = value_count )
     671                                 count = value_counts )
    682672      ELSEIF ( PRESENT( var_real64_2d ) )  THEN
    683673         nc_stat = NF90_PUT_VAR( file_id, var_id, var_real64_2d,           &
    684674                                 start = bounds_start - bounds_origin + 1, &
    685                                  count = value_count )
     675                                 count = value_counts )
    686676      ELSEIF ( PRESENT( var_real64_3d ) )  THEN
    687677         nc_stat = NF90_PUT_VAR( file_id, var_id, var_real64_3d,           &
    688678                                 start = bounds_start - bounds_origin + 1, &
    689                                  count = value_count )
     679                                 count = value_counts )
    690680      !-- working-precision real output
    691681      ELSEIF ( PRESENT( var_realwp_0d ) )  THEN
    692682         nc_stat = NF90_PUT_VAR( file_id, var_id, (/ var_realwp_0d /),     &
    693683                                 start = bounds_start - bounds_origin + 1, &
    694                                  count = value_count )
     684                                 count = value_counts )
    695685      ELSEIF ( PRESENT( var_realwp_1d ) )  THEN
    696686         nc_stat = NF90_PUT_VAR( file_id, var_id, var_realwp_1d,           &
    697687                                 start = bounds_start - bounds_origin + 1, &
    698                                  count = value_count )
     688                                 count = value_counts )
    699689      ELSEIF ( PRESENT( var_realwp_2d ) )  THEN
    700690         nc_stat = NF90_PUT_VAR( file_id, var_id, var_realwp_2d,           &
    701691                                 start = bounds_start - bounds_origin + 1, &
    702                                  count = value_count )
     692                                 count = value_counts )
    703693      ELSEIF ( PRESENT( var_realwp_3d ) )  THEN
    704694         nc_stat = NF90_PUT_VAR( file_id, var_id, var_realwp_3d,           &
    705695                                 start = bounds_start - bounds_origin + 1, &
    706                                  count = value_count )
     696                                 count = value_counts )
    707697      ELSE
    708698         return_value = 1
     
    736726            IF ( nc_stat == NF90_NOERR )  THEN
    737727               WRITE( temp_string, * )  TRIM( temp_string ) // '; given variable bounds: ' //  &
    738                   'start=', bounds_start, ', end=', bounds_end, '; file dimension bounds: ' // &
    739                   'start=', bounds_origin, ', end=', bounds_origin + dim_lengths - 1
     728                  'start=', bounds_start, ', count=', value_counts, ', origin=', bounds_origin
    740729               CALL internal_message( 'error', routine_name //     &
    741730                                      ': error while writing: ' // &
Note: See TracChangeset for help on using the changeset viewer.