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",¶meterCategory),0); printf("parameterCategory=%ld\n",parameterCategory); CODES_CHECK(codes_get_long(h,"parameterNumber",¶meterNumber),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; }