Description

This example shows: How to decode GRIB2 multi-field messages. Try to turn on and off multi support to see the difference. Default is OFF.
For all the tools (e.g., grib_ls etc) multi support is ON.

Source code

grib_multi.f90
! (C) Copyright 2005- ECMWF.
!
! This software is licensed under the terms of the Apache Licence Version 2.0
! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
!
! In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
! virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
!
!
!  Description: How to decode GRIB2 multi-field messages.
!               Try to turn on and off multi support to
!               see the difference. Default is OFF.
!               For all the tools (e.g., grib_ls etc) multi support is ON.
!
!
program multi
  use eccodes
  implicit none

  integer              :: iret
  integer(kind = 4)    :: step
  integer              :: ifile,igrib

  call codes_open_file(ifile, '../../data/multi_created.grib2','r')

  !     turn on support for multi fields messages */
  call codes_grib_multi_support_on()

  !     turn off support for multi fields messages */
  !call codes_grib_multi_support_off()

  call codes_grib_new_from_file(ifile,igrib, iret)
  !     Loop on all the messages in a file.

  write(*,*) 'step'
  do while (iret /= CODES_END_OF_FILE)

     call codes_get(igrib,'step', step)
     write(*,'(i3)') step

     call codes_grib_new_from_file(ifile,igrib, iret)

  end do
  call codes_close_file(ifile)

end program multi
grib_multi.c
/*
 * (C) Copyright 2005- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 *
 * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
 * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
 */

/*
 * C Implementation: grib_multi
 *
 * Description: How to decode GRIB2 multi-field messages.
 *              Try to turn on and off multi support to
 *              see the difference. Default is OFF.
 *              For all the tools (e.g., grib_ls etc) multi support is ON.
 *
 */
#include <stdio.h>
#include <stdlib.h>

#include "eccodes.h"

int main(int argc, char** argv)
{
    int err = 0;
    long parameterCategory=0,parameterNumber=0,discipline=0;
    FILE* in = NULL;
    const char* filename = "../../data/multi.grib2";
    codes_handle *h = NULL;

    /* turn on support for multi fields messages */
    codes_grib_multi_support_on(NULL);

    /* turn off support for multi fields messages */
    /* codes_multi_support_off(NULL); */

    in = fopen(filename,"r");
    if(!in) {
        printf("ERROR: unable to open file %s\n",filename);
        return 1;
    }

    while ((h = codes_handle_new_from_file(0, in, PRODUCT_GRIB, &err)) != NULL ) {

        CODES_CHECK(err,0);

        CODES_CHECK(codes_get_long(h,"discipline",&discipline),0);
        printf("discipline=%ld\n",discipline);

        CODES_CHECK(codes_get_long(h,"parameterCategory",&parameterCategory),0);
        printf("parameterCategory=%ld\n",parameterCategory);

        CODES_CHECK(codes_get_long(h,"parameterNumber",&parameterNumber),0);
        printf("parameterNumber=%ld\n",parameterNumber);

        if ( discipline == 0 && parameterCategory==2) {
            if (parameterNumber == 2) printf("-------- u -------\n");
            if (parameterNumber == 3) printf("-------- v -------\n");
        }
        codes_handle_delete(h);
    }

    fclose(in);
    return 0;
}