diff --git a/.cproject b/.cproject deleted file mode 100644 index 6756194e9..000000000 --- a/.cproject +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml deleted file mode 100644 index 4e3a7939e..000000000 --- a/.settings/language.settings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/CMakeLists.txt b/CMakeLists.txt index 7866bd480..b990b490f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -298,7 +298,7 @@ add_subdirectory( ifs_samples ) # must come after samples ecbuild_dont_pack( DIRS concepts tests.ecmwf doxygen confluence examples.dev templates parameters java gaussian_experimental gribex examples/F77 - examples/extra bamboo fortran/fortranCtypes tigge/tools share/eccodes grib_api_for_mars + examples/extra bamboo fortran/fortranCtypes tigge/tools share/eccodes src/.deps tests/.deps tools/.deps tigge/.deps examples/C/.deps examples/python/.deps python/.deps fortran/.deps ) diff --git a/data/bufr/bufr_ref_files.txt b/data/bufr/bufr_ref_files.txt index 8b0e7f75e..cac029f12 100644 --- a/data/bufr/bufr_ref_files.txt +++ b/data/bufr/bufr_ref_files.txt @@ -384,3 +384,4 @@ uegabe.bufr.num.ref syno.bufr.out.ref airep.bufr.out.ref new_replication.bufr.ref +get_string_array.ref diff --git a/data/ret.sh b/data/ret.sh index 708178957..43cc8d6b7 100755 --- a/data/ret.sh +++ b/data/ret.sh @@ -38,7 +38,6 @@ do tar="full_${files[i]}" EOF - p4 edit ${files[i]} if [[ ${precision[i]} -gt 0 ]] then grib_set -r -s bitsPerValue=0,decimalScaleFactor=${precision[i]} full_${files[i]} ${files[i]} @@ -53,4 +52,3 @@ EOF grib_dump ${grib2} > /dev/null done - diff --git a/doxygen/build_gribex.ksh b/doxygen/build_gribex.ksh index 58cab912c..c9b1289d7 100755 --- a/doxygen/build_gribex.ksh +++ b/doxygen/build_gribex.ksh @@ -4,13 +4,9 @@ prov=$1 dest=$2 mkdir -p $dest -p4 edit $dest/*.html for file in $prov/*.html do f=`basename $file` cat head.html $file tail.html > $dest/$f done - -p4 add $dest/*.html - diff --git a/doxygen/make_dox.sh b/doxygen/make_dox.sh index afeb38be2..745fd05dc 100755 --- a/doxygen/make_dox.sh +++ b/doxygen/make_dox.sh @@ -3,7 +3,7 @@ cd ../tools ./make_dox.ksh cd ../doxygen -p4 edit ../html/* + rm -f ../html/* touch ../html/Makefile.am doxygen grib_api_wiz.cfg diff --git a/examples/F90/CMakeLists.txt b/examples/F90/CMakeLists.txt index 2bcaf3486..29ba0beb1 100644 --- a/examples/F90/CMakeLists.txt +++ b/examples/F90/CMakeLists.txt @@ -36,6 +36,7 @@ list( APPEND tests bufr_clone bufr_expanded bufr_get_keys + bufr_get_string_array bufr_keys_iterator bufr_read_header bufr_read_scatterometer diff --git a/examples/F90/bufr_get_string_array.f90 b/examples/F90/bufr_get_string_array.f90 new file mode 100644 index 000000000..6b42c997e --- /dev/null +++ b/examples/F90/bufr_get_string_array.f90 @@ -0,0 +1,58 @@ +! +!Copyright 2005-2016 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. +! +! +! FOTRAN 90 Implementation: bufr_get_string_array +! +! Description: how to get an array of strings from a BUFR message. + +program bufr_get_string_array +use eccodes +implicit none +integer :: ifile +integer :: iret,i,n +integer :: ibufr +integer :: strsize +integer, parameter :: max_strsize = 20 +character(len=max_strsize) , dimension(:),allocatable :: stationOrSiteName + + call codes_open_file(ifile,'../../data/bufr/pgps_110.bufr','r') + + call codes_bufr_new_from_file(ifile,ibufr,iret) + + + ! unpack the data values + call codes_set(ibufr,'unpack',1) + call codes_get(ibufr,'stationOrSiteName->width',strsize) + strsize=strsize/8 + if (strsize > max_strsize) then + print *,'stationOrSiteName array dimension is ',max_strsize,' and should be ',strsize + call exit(1) + end if + + call codes_get_size(ibufr,'stationOrSiteName',n) + allocate(stationOrSiteName(n)) + ! passing an array of strings stationOrSiteName which must be allocated beforehand + call codes_get_string_array(ibufr,'stationOrSiteName',stationOrSiteName) + do i=1,n + write(*,'(A)')trim(stationOrSiteName(i)) + end do + + !remember to deallocate what was allocated by codes_get_string_array + deallocate(stationOrSiteName) + + ! release the bufr message + call codes_release(ibufr) + + ! close file + call codes_close_file(ifile) + + +end program bufr_get_string_array + diff --git a/examples/F90/bufr_get_string_array.sh b/examples/F90/bufr_get_string_array.sh new file mode 100755 index 000000000..0f65ee45d --- /dev/null +++ b/examples/F90/bufr_get_string_array.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# Copyright 2005-2016 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. + +. ./include.sh +set -x +#Define a common label for all the tmp files +label="bufr_get_string_array_test_f" + +#Prepare tmp file +fTmp=${label}.tmp.txt +rm -f $fTmp | true + +#----------------------------------------------------- +# Test get string array from a BUFR +#---------------------------------------------------- + +fRef=${data_dir}/bufr/get_string_array.ref + +REDIRECT=/dev/null + +#Write the values into a file and compare with reference +${examples_dir}/eccodes_f_bufr_get_string_array $f > $fTmp + +#We compare output to the reference by ignoring the whitespaces +diff -w $fRef $fTmp + +#cat $fRes + +#Clean up +rm -f ${fTmp} | true + + + diff --git a/fortran/eccodes_f90_int.f90 b/fortran/eccodes_f90_int.f90 index 2a63abfc8..1b005c862 100644 --- a/fortran/eccodes_f90_int.f90 +++ b/fortran/eccodes_f90_int.f90 @@ -96,8 +96,8 @@ codes_get_real4, & codes_get_real8, & codes_get_string, & - codes_get_int_array, & codes_get_byte_array, & + codes_get_int_array, & codes_get_real4_array, & codes_get_real8_array end interface codes_get diff --git a/fortran/eccodes_f90_long_int.f90 b/fortran/eccodes_f90_long_int.f90 index 4c8fdd440..960f55fa9 100644 --- a/fortran/eccodes_f90_long_int.f90 +++ b/fortran/eccodes_f90_long_int.f90 @@ -100,8 +100,8 @@ codes_get_real4, & codes_get_real8, & codes_get_string, & - codes_get_int_array, & codes_get_byte_array, & + codes_get_int_array, & codes_get_real4_array, & codes_get_real8_array end interface codes_get diff --git a/fortran/eccodes_f90_tail.f90 b/fortran/eccodes_f90_tail.f90 index cceea7a93..10adf9d4d 100644 --- a/fortran/eccodes_f90_tail.f90 +++ b/fortran/eccodes_f90_tail.f90 @@ -828,6 +828,43 @@ subroutine codes_get_string ( gribid, key, value, status ) call grib_get_string ( gribid, key, value, status ) end subroutine codes_get_string +subroutine codes_get_string_array ( gribid, key, value, status ) + integer(kind=kindOfInt), intent(in) :: gribid + character(len=*), intent(in) :: key + character(len=*), dimension(:),allocatable,intent(inout) :: value + integer(kind=kindOfInt),optional, intent(out) :: status + + character :: cvalue(size(value)*len(value(0))) + integer(kind=kindOfInt) :: iret + integer(kind=kindOfInt) :: nb_values + integer(kind=kindOfInt) :: slen + integer(kind=kindOfInt) :: i,s,j + + if (allocated(value) .eqv. .false.) then + iret=CODES_NULL_POINTER + if (present(status)) then + status = iret + else + call grib_check(iret,'grib_get',key) + endif + end if + + nb_values=size(value) + slen=len(value(0)) + iret=grib_f_get_string_array ( gribid, key, cvalue , nb_values, slen ) + value=transfer(cvalue,value) + + if (iret /= 0) then + call grib_f_write_on_fail(gribid) + endif + if (present(status)) then + status = iret + else + call grib_check(iret,'grib_get',key) + endif + +end subroutine codes_get_string_array + ! Note: This function supports the allocatable array attribute ! ------------------------------------------------------------- subroutine codes_get_int_array ( gribid, key, value, status ) @@ -861,9 +898,9 @@ subroutine codes_get_int_array ( gribid, key, value, status ) value(i)=value(1) enddo endif - if (iret /= 0) then - call grib_f_write_on_fail(gribid) - endif + if (iret /= 0) then + call grib_f_write_on_fail(gribid) + endif if (present(status)) then status = iret else @@ -926,7 +963,6 @@ subroutine codes_get_byte_array ( gribid, key, value, length, status ) integer(kind=kindOfInt), optional, intent(out) :: status integer(kind=kindOfInt) :: iret integer(kind=kindOfInt) :: nb_values - character :: bytes(size(value)) call grib_get_byte_array ( gribid, key, value, length, status ) end subroutine codes_get_byte_array @@ -1144,7 +1180,6 @@ subroutine codes_set_byte_array ( gribid, key, value, length, status ) integer(kind=kindOfInt), optional, intent(out) :: status integer(kind=kindOfInt) :: iret integer(kind=kindOfInt) :: nb_values - character :: bytes(size(value)) call grib_set_byte_array ( gribid, key, value, length, status ) end subroutine codes_set_byte_array diff --git a/fortran/grib_api_externals.h b/fortran/grib_api_externals.h index 2bbd91478..7e764553e 100644 --- a/fortran/grib_api_externals.h +++ b/fortran/grib_api_externals.h @@ -32,7 +32,8 @@ integer, external :: grib_f_get_int, grib_f_get_long,grib_f_get_int_array, & grib_f_get_real8, grib_f_get_real8_array, & grib_f_get_real4_element, grib_f_get_real8_element, & grib_f_get_real4_elements, grib_f_get_real8_elements, & - grib_f_get_string,grib_f_is_missing,grib_f_is_defined + grib_f_get_string,grib_f_get_string_array, & + grib_f_is_missing,grib_f_is_defined integer, external :: grib_f_new_from_index, & grib_f_index_new_from_file, & grib_f_index_add_file, & diff --git a/fortran/grib_fortran.c b/fortran/grib_fortran.c index 99d0c2089..c2d2b4cf5 100644 --- a/fortran/grib_fortran.c +++ b/fortran/grib_fortran.c @@ -162,6 +162,16 @@ static void czstr_to_fortran(char* str,int len) *p=' '; } +/*static void czstr_to_fortran_replace0(char* str,int len) +{ + char *p,*end; + p=str; end=str+len-1; + while (p != end) { + if (*p=='\0') *p=' '; + p++; + } +}*/ + static void fort_char_clean(char* str,int len) { char *p,*end; @@ -2697,6 +2707,43 @@ int grib_f_set_real8_array(int* gid, char* key, double *val, int* size, int len) return grib_f_set_real8_array_( gid, key, val, size, len); } +/*****************************************************************************/ +int grib_f_get_string_array_(int* gid, char* key, char* val,int* nvals,int* slen,int len) +{ + grib_handle *h = get_handle(*gid); + int err = GRIB_SUCCESS; + size_t i; + char buf[1024]; + size_t lsize = *nvals; + char** cval=0; + char* p=val; + + if(!h) return GRIB_INVALID_GRIB; + + cval=(char**)grib_context_malloc_clear(h->context,sizeof(char*)*lsize); + err = grib_get_string_array(h, cast_char(buf,key,len), cval, &lsize); + if (err) return err; + + if (strlen(cval[0])>*slen) err=GRIB_ARRAY_TOO_SMALL; + + for (i=0;icontext,cval); + /*remember to deallocate each string*/ + + return err; +} + +int grib_f_get_string_array__(int* gid, char* key, char* val,int* nvals,int* slen, int len){ + return grib_f_get_string_array_( gid, key, val,nvals,slen,len); +} +int grib_f_get_string_array(int* gid, char* key, char* val,int* nvals,int* slen, int len){ + return grib_f_get_string_array_( gid, key, val, nvals, slen, len); +} + /*****************************************************************************/ int grib_f_get_string_(int* gid, char* key, char* val,int len, int len2){ diff --git a/grib_api_for_mars/definitions/grib1/local.98.35.def b/grib_api_for_mars/definitions/grib1/local.98.35.def deleted file mode 100644 index 980db3a8b..000000000 --- a/grib_api_for_mars/definitions/grib1/local.98.35.def +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2005-2016 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. -# -constant GRIBEXSection1Problem = 120 - section1Length ; - -template mars_labeling "grib1/mars_labeling.def"; - -unsigned[1] yearOfReference = yearOfCentury : dump; -unsigned[1] monthOfReference = month : dump; -unsigned[1] dayOfReference = day : dump; -unsigned[1] hourOfReference = hour : dump; -unsigned[1] minuteOfReference = minute : dump; -unsigned[1] centuryOfReference = centuryOfReferenceTimeOfData : dump; -transient secondsOfReference = 0 ; - -unsigned[1] numberOfForcasts=0 : dump; -unsigned[1] numberOfAnalysis=1 : dump; - -if (numberOfForcasts) { - unsigned[3] forecastSteps[numberOfForcasts] : dump; -} -if (numberOfAnalysis) { - signed[3] analysisOffsets[numberOfAnalysis] : dump; -} - -padto padding_local_35(offsetSection1 + 120); - -meta dateOfReference g1date(centuryOfReference,yearOfReference,monthOfReference,dayOfReference) : dump; -meta timeOfReference time(hourOfReference,minuteOfReference,secondsOfReference) : dump; - -if (indicatorOfTypeOfLevel==160) { - alias mars.levelist = level; -} - diff --git a/grib_api_for_mars/definitions/grib1/section.4.def b/grib_api_for_mars/definitions/grib1/section.4.def deleted file mode 100644 index b23f46a26..000000000 --- a/grib_api_for_mars/definitions/grib1/section.4.def +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2005-2016 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. -# -# START grib1::section -# SECTION 4, Binary data section -# Length of section -# (octets) -position offsetSection4; - -# Due to a trick done by GRIBEX to support large GRIBs, we need a special treatment -# of the message length and of the section4 lenth, so instead of -# length[3] section4Length ; -# we get: -g1_section4_length[3] section4Length(totalLength); - -meta section4Pointer section_pointer(offsetSection4,section4Length,4); - -g1_half_byte_codeflag halfByte; -flags[1] dataFlag "grib1/11.table" = 0 : read_only; -signed[2] binaryScaleFactor = 0 : read_only,dump; -ibmfloat referenceValue : read_only,dump; -unsigned[1] bitsPerValue : dump ; -alias numberOfBitsContainingEachPackedValue = bitsPerValue; - -meta referenceValueError reference_value_error(referenceValue,ibm); - -flagbit sphericalHarmonics(dataFlag,7) : dump; -flagbit complexPacking(dataFlag,6) : dump; -flagbit integerPointValues(dataFlag,5) : dump; -flagbit additionalFlagPresent(dataFlag,4) : edition_specific,dump; - -transient hideThis=0; - -concept packingType { -#set uses the last one -#get returns the first match - "grid_simple" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;} - "grid_ieee" = { sphericalHarmonics = 0; complexPacking = 0; - integerPointValues=1; additionalFlagPresent=1;} - "spectral_complex" = { sphericalHarmonics = 1; complexPacking = 1; - additionalFlagPresent = 0; } - "spectral_simple" = { sphericalHarmonics = 1; complexPacking = 0; additionalFlagPresent = 0; - representationMode=1;} - "spectral_ieee" = { sphericalHarmonics = 1; complexPacking = 1; - additionalFlagPresent = 0; hideThis=1; } - "grid_simple_matrix" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 1;} - "grid_second_order" = { sphericalHarmonics = 0; complexPacking = 1; } - "grid_complex" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;} - "grid_complex_spatial_differencing" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;} - "grid_jpeg" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;} - "grid_png" = { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;} - "grid_simple_log_preprocessing"= { sphericalHarmonics = 0; complexPacking = 0; additionalFlagPresent = 0;} -} : dump; - - -alias ls.packingType=packingType; -alias typeOfPacking=packingType; - -if( binaryScaleFactor == -32767) { - constant dataRepresentationTemplateNumber = 0; - constant bitMapIndicator = 0; - # For grib 1 -> 2 - position offsetBeforeData; - transient numberOfCodedValues=numberOfPoints; - meta values data_dummy_field( - section4Length, - offsetBeforeData, - offsetSection4, - unitsFactor, - unitsBias, - changingPrecision, - numberOfCodedValues, - bitsPerValue, - referenceValue, - binaryScaleFactor, - decimalScaleFactor, - halfByte, - packingType, - grid_ieee,precision, - missingValue, - numberOfPoints, - bitmap - ) : dump; -} else { - template dataValues "grib1/data.[packingType:s].def"; -} - -position offsetAfterData; - -transient dataLength=(offsetAfterData-offsetBeforeData)/8; - -if (bitmapPresent==1) { - alias numberOfEffectiveValues=numberOfDataPoints; -} else { - alias numberOfEffectiveValues=numberOfCodedValues; -} - -_if (sphericalHarmonics) { - alias numberOfEffectiveValues=numberOfValues; -} - -#meta setDecimalPrecision suppressed(decimalPrecision,changeDecimalPrecision); -meta changeDecimalPrecision decimal_precision(bitsPerValue,decimalScaleFactor,changingPrecision,values) : edition_specific; -meta decimalPrecision decimal_precision(bitsPerValue,decimalScaleFactor,changingPrecision) : edition_specific; -alias setDecimalPrecision=changeDecimalPrecision; - -meta bitsPerValueAndRepack bits_per_value(values,bitsPerValue) : edition_specific; -alias setBitsPerValue=bitsPerValueAndRepack; - -meta scaleValuesBy scale_values(values,missingValue) : edition_specific; -meta offsetValuesBy offset_values(values,missingValue) : edition_specific; - -concept gridType { -#set uses the last one -#get returns the first match - "regular_ll" = {dataRepresentationType = 0; sphericalHarmonics = 0; PLPresent=0;} - "reduced_ll" = {dataRepresentationType = 0; sphericalHarmonics = 0; PLPresent=1; Ni=missing(); } - "mercator" = {dataRepresentationType = 1; sphericalHarmonics = 0; PLPresent=0; } - "lambert" = {dataRepresentationType = 3; sphericalHarmonics = 0; PLPresent=0; } - "polar_stereographic" = {dataRepresentationType = 5; sphericalHarmonics = 0; PLPresent=0; } - "UTM" = {dataRepresentationType = 6; sphericalHarmonics = 0; PLPresent=0; } - "simple_polyconic" = {dataRepresentationType = 7; sphericalHarmonics = 0; PLPresent=0; } - "albers" = {dataRepresentationType = 8; sphericalHarmonics = 0; PLPresent=0; } - "miller" = {dataRepresentationType = 8; sphericalHarmonics = 0; PLPresent=0; } - "rotated_ll" = {dataRepresentationType = 10; sphericalHarmonics = 0; PLPresent=0; } - "stretched_ll" = {dataRepresentationType = 20; sphericalHarmonics = 0; PLPresent=0; } - "stretched_rotated_ll" = {dataRepresentationType = 30; sphericalHarmonics = 0; PLPresent=0; } - "regular_gg" = {dataRepresentationType = 4; sphericalHarmonics = 0; PLPresent=0; } - "rotated_gg" = {dataRepresentationType = 14; sphericalHarmonics = 0; PLPresent=0; } - "stretched_gg" = {dataRepresentationType = 24; sphericalHarmonics = 0; PLPresent=0; } - "stretched_rotated_gg" = {dataRepresentationType = 34; sphericalHarmonics = 0; PLPresent=0; } - "reduced_gg" = {dataRepresentationType = 4; sphericalHarmonics = 0; - PLPresent=1; numberOfPointsAlongAParallel = missing(); - iDirectionIncrement = missing(); ijDirectionIncrementGiven=0;} - "sh" = {dataRepresentationType = 50; sphericalHarmonics = 1; PLPresent=0; } - "rotated_sh" = {dataRepresentationType = 60; sphericalHarmonics = 1; PLPresent=0; } - "stretched_sh" = {dataRepresentationType = 70; sphericalHarmonics = 1; PLPresent=0; } - "stretched_rotated_sh" = {dataRepresentationType = 80; sphericalHarmonics = 1; PLPresent=0; } - "space_view" = {dataRepresentationType = 90; sphericalHarmonics = 0; PLPresent=0; } - "unknown" = {PLPresent=0;} - "unknown_PLPresent" = {PLPresent=1;} -} : dump; - -alias ls.gridType=gridType; -alias geography.gridType=gridType; -alias typeOfGrid=gridType; - -meta getNumberOfValues size(values) : edition_specific,dump ; - -padtoeven padding_sec4_1(offsetSection4,section4Length) ; - -meta md5Section4 md5(offsetSection4,section4Length); - - - diff --git a/mars_tests/Makefile.am b/mars_tests/Makefile.am deleted file mode 100755 index 7a8deb091..000000000 --- a/mars_tests/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -if WITH_MARS_TESTS - TESTS = ls.sh - - noinst_PROGRAMS = - - LDADD = $(top_builddir)/src/libgrib_api.a $(EMOS_LIB) - - INCLUDES = -I$(top_builddir)/src - - EXTRA_DIST = $(TESTS) - -endif diff --git a/mars_tests/include.sh b/mars_tests/include.sh deleted file mode 100644 index 426cb7525..000000000 --- a/mars_tests/include.sh +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2005-2016 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. - -set -ea - -echo -echo "TEST: $0" - -data_dir="" - -# save current working dir -save=`pwd` - -if [ -z "${data_dir}" ] -then - cd ../ - cpath=`pwd` - ECCODES_DEFINITION_PATH=$cpath/definitions - export ECCODES_DEFINITION_PATH - ECCODES_SAMPLES_PATH=$cpath/samples - export ECCODES_SAMPLES_PATH - tools_dir=$cpath/tools/ - tigge_dir=$cpath/tigge/ - data_dir=$cpath/data - test_dir=$cpath/tests - def_dir=$cpath/definitions -else - tools_dir="" - tigge_dir="" -fi - -if [ -z "${GRIB_API_INCLUDE}" ] -then - GRIB_API_INCLUDE=`pwd`/src -fi - -if [ -z "${GRIB_API_LIB}" ] -then - GRIB_API_LIB=`pwd`/src -fi - -# go back to current working dir -cd $save - -set -u diff --git a/mars_tests/ls.sh b/mars_tests/ls.sh deleted file mode 100755 index e0ecff630..000000000 --- a/mars_tests/ls.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/sh -# Copyright 2005-2016 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. - -. ./include.sh - -rm -f log | true -workdir=`pwd` - -cd ${data_dir} -infile=regular_gaussian_model_level.grib1 - -${tools_dir}grib_ls -P count $infile > log -${tools_dir}grib_ls -p count,step $infile >> log -${tools_dir}grib_ls $infile >> log -${tools_dir}grib_ls -l 0,0,1 $infile >> log -${tools_dir}grib_get -l 0,0,1 $infile >> log -${tools_dir}grib_get -p count,step $infile >> log -${tools_dir}grib_get -P count $infile >> log - -files=" reduced_gaussian_lsm.grib1 -reduced_gaussian_model_level.grib1 -reduced_gaussian_model_level.grib2 -reduced_gaussian_pressure_level.grib1 -reduced_gaussian_pressure_level.grib2 -reduced_gaussian_pressure_level_constant.grib1 -reduced_gaussian_pressure_level_constant.grib2 -reduced_gaussian_sub_area.grib1 -reduced_gaussian_sub_area.grib2 -reduced_gaussian_surface.grib1 -reduced_gaussian_surface.grib2 -reduced_latlon_surface.grib1 -reduced_latlon_surface.grib2 -regular_gaussian_model_level.grib1 -regular_gaussian_model_level.grib2 -regular_gaussian_pressure_level.grib1 -regular_gaussian_pressure_level.grib2 -regular_gaussian_pressure_level_constant.grib1 -regular_gaussian_pressure_level_constant.grib2 -regular_gaussian_surface.grib1 -regular_gaussian_surface.grib2 -regular_latlon_surface.grib1 -regular_latlon_surface.grib2 -" - -for file in $files -do - echo $file >> log - ${tools_dir}grib_ls -l 40,28 $file | grep index | awk '{print $4;}' >> log -done - -diff log ls.log -rm -f log - -cd $workdir diff --git a/src/grib_accessor_class_bufr_data_array.c b/src/grib_accessor_class_bufr_data_array.c index 1e1660382..b20b13a24 100644 --- a/src/grib_accessor_class_bufr_data_array.c +++ b/src/grib_accessor_class_bufr_data_array.c @@ -490,6 +490,7 @@ static grib_darray* decode_double_array(grib_context* c,unsigned char* data,long } else { dval=localReference*modifiedFactor; } + grib_context_log(c, GRIB_LOG_DEBUG," modifiedWidth=%ld lval=%ld dval=%g", modifiedWidth,lval,dval); grib_darray_push(c,ret,dval); } diff --git a/src/grib_iterator_class_lambert_conformal.c b/src/grib_iterator_class_lambert_conformal.c index 2a66d6553..f8c52c2dc 100644 --- a/src/grib_iterator_class_lambert_conformal.c +++ b/src/grib_iterator_class_lambert_conformal.c @@ -83,7 +83,6 @@ static void init_class(grib_iterator_class* c) static int next(grib_iterator* i, double *lat, double *lon, double *val) { - grib_iterator_lambert_conformal* self = (grib_iterator_lambert_conformal*)i; if((long)i->e >= (long)(i->nv-1)) @@ -114,161 +113,161 @@ static int next(grib_iterator* i, double *lat, double *lon, double *val) static int init(grib_iterator* iter,grib_handle* h,grib_arguments* args) { - int i, j, ret=0; - double *lats, *lons; /* the lat/lon arrays to be populated */ - long nx,ny,iScansNegatively,jScansPositively,jPointsAreConsecutive,alternativeRowScanning; - double LoVInDegrees,LaDInDegrees,Latin1InDegrees,Latin2InDegrees,latFirstInDegrees, - lonFirstInDegrees, Dx, Dy, radius=0; - double latFirstInRadians, lonFirstInRadians, LoVInRadians, Latin1InRadians, Latin2InRadians, - LaDInRadians, lonDiff, lonDeg, latDeg; - double f, n, rho, rho0, angle, x0, y0, x, y, tmp, tmp2; + int i, j, ret=0; + double *lats, *lons; /* the lat/lon arrays to be populated */ + long nx,ny,iScansNegatively,jScansPositively,jPointsAreConsecutive,alternativeRowScanning; + double LoVInDegrees,LaDInDegrees,Latin1InDegrees,Latin2InDegrees,latFirstInDegrees, + lonFirstInDegrees, Dx, Dy, radius=0; + double latFirstInRadians, lonFirstInRadians, LoVInRadians, Latin1InRadians, Latin2InRadians, + LaDInRadians, lonDiff, lonDeg, latDeg; + double f, n, rho, rho0, angle, x0, y0, x, y, tmp, tmp2; - grib_iterator_lambert_conformal* self = (grib_iterator_lambert_conformal*)iter; + grib_iterator_lambert_conformal* self = (grib_iterator_lambert_conformal*)iter; - const char* sradius = grib_arguments_get_name(h,args,self->carg++); - const char* snx = grib_arguments_get_name(h,args,self->carg++); - const char* sny = grib_arguments_get_name(h,args,self->carg++); - const char* sLoVInDegrees = grib_arguments_get_name(h,args,self->carg++); - const char* sLaDInDegrees = grib_arguments_get_name(h,args,self->carg++); - const char* sLatin1InDegrees = grib_arguments_get_name(h,args,self->carg++); - const char* sLatin2InDegrees = grib_arguments_get_name(h,args,self->carg++); - const char* slatFirstInDegrees = grib_arguments_get_name(h,args,self->carg++); - const char* slonFirstInDegrees = grib_arguments_get_name(h,args,self->carg++); - /* Dx and Dy are in Metres */ - const char* sDx = grib_arguments_get_name(h,args,self->carg++); - const char* sDy = grib_arguments_get_name(h,args,self->carg++); - const char* siScansNegatively = grib_arguments_get_name(h,args,self->carg++); - const char* sjScansPositively = grib_arguments_get_name(h,args,self->carg++); - const char* sjPointsAreConsecutive = grib_arguments_get_name(h,args,self->carg++); - const char* salternativeRowScanning = grib_arguments_get_name(h,args,self->carg++); + const char* sradius = grib_arguments_get_name(h,args,self->carg++); + const char* snx = grib_arguments_get_name(h,args,self->carg++); + const char* sny = grib_arguments_get_name(h,args,self->carg++); + const char* sLoVInDegrees = grib_arguments_get_name(h,args,self->carg++); + const char* sLaDInDegrees = grib_arguments_get_name(h,args,self->carg++); + const char* sLatin1InDegrees = grib_arguments_get_name(h,args,self->carg++); + const char* sLatin2InDegrees = grib_arguments_get_name(h,args,self->carg++); + const char* slatFirstInDegrees = grib_arguments_get_name(h,args,self->carg++); + const char* slonFirstInDegrees = grib_arguments_get_name(h,args,self->carg++); + /* Dx and Dy are in Metres */ + const char* sDx = grib_arguments_get_name(h,args,self->carg++); + const char* sDy = grib_arguments_get_name(h,args,self->carg++); + const char* siScansNegatively = grib_arguments_get_name(h,args,self->carg++); + const char* sjScansPositively = grib_arguments_get_name(h,args,self->carg++); + const char* sjPointsAreConsecutive = grib_arguments_get_name(h,args,self->carg++); + const char* salternativeRowScanning = grib_arguments_get_name(h,args,self->carg++); - if((ret = grib_get_long_internal(h, snx,&nx)) != GRIB_SUCCESS) - return ret; - if((ret = grib_get_long_internal(h, sny,&ny)) != GRIB_SUCCESS) - return ret; + if((ret = grib_get_long_internal(h, snx,&nx)) != GRIB_SUCCESS) + return ret; + if((ret = grib_get_long_internal(h, sny,&ny)) != GRIB_SUCCESS) + return ret; - if (iter->nv!=nx*ny) { - grib_context_log(h->context,GRIB_LOG_ERROR,"Wrong number of points (%ld!=%ldx%ld)",iter->nv,nx,ny); - return GRIB_WRONG_GRID; - } - if((ret = grib_get_double_internal(h, sradius,&radius)) != GRIB_SUCCESS) - return ret; - if((ret = grib_get_double_internal(h, sLoVInDegrees, &LoVInDegrees))!=GRIB_SUCCESS) - return ret; - if((ret = grib_get_double_internal(h, sLaDInDegrees, &LaDInDegrees))!=GRIB_SUCCESS) - return ret; - if((ret = grib_get_double_internal(h, sLatin1InDegrees, &Latin1InDegrees))!=GRIB_SUCCESS) - return ret; - if((ret = grib_get_double_internal(h, sLatin2InDegrees, &Latin2InDegrees))!=GRIB_SUCCESS) - return ret; - if((ret = grib_get_double_internal(h, slatFirstInDegrees,&latFirstInDegrees)) !=GRIB_SUCCESS) - return ret; - if((ret = grib_get_double_internal(h, slonFirstInDegrees,&lonFirstInDegrees)) !=GRIB_SUCCESS) - return ret; - if((ret = grib_get_double_internal(h, sDx,&Dx)) !=GRIB_SUCCESS) - return ret; - if((ret = grib_get_double_internal(h, sDy,&Dy)) !=GRIB_SUCCESS) - return ret; - if((ret = grib_get_long_internal(h, sjPointsAreConsecutive,&jPointsAreConsecutive)) !=GRIB_SUCCESS) - return ret; - if((ret = grib_get_long_internal(h, sjScansPositively,&jScansPositively)) !=GRIB_SUCCESS) - return ret; - if((ret = grib_get_long_internal(h, siScansNegatively,&iScansNegatively)) !=GRIB_SUCCESS) - return ret; - if((ret = grib_get_long_internal(h, salternativeRowScanning,&alternativeRowScanning)) !=GRIB_SUCCESS) - return ret; + if (iter->nv!=nx*ny) { + grib_context_log(h->context,GRIB_LOG_ERROR,"Wrong number of points (%ld!=%ldx%ld)",iter->nv,nx,ny); + return GRIB_WRONG_GRID; + } + if((ret = grib_get_double_internal(h, sradius,&radius)) != GRIB_SUCCESS) + return ret; + if((ret = grib_get_double_internal(h, sLoVInDegrees, &LoVInDegrees))!=GRIB_SUCCESS) + return ret; + if((ret = grib_get_double_internal(h, sLaDInDegrees, &LaDInDegrees))!=GRIB_SUCCESS) + return ret; + if((ret = grib_get_double_internal(h, sLatin1InDegrees, &Latin1InDegrees))!=GRIB_SUCCESS) + return ret; + if((ret = grib_get_double_internal(h, sLatin2InDegrees, &Latin2InDegrees))!=GRIB_SUCCESS) + return ret; + if((ret = grib_get_double_internal(h, slatFirstInDegrees,&latFirstInDegrees)) !=GRIB_SUCCESS) + return ret; + if((ret = grib_get_double_internal(h, slonFirstInDegrees,&lonFirstInDegrees)) !=GRIB_SUCCESS) + return ret; + if((ret = grib_get_double_internal(h, sDx,&Dx)) !=GRIB_SUCCESS) + return ret; + if((ret = grib_get_double_internal(h, sDy,&Dy)) !=GRIB_SUCCESS) + return ret; + if((ret = grib_get_long_internal(h, sjPointsAreConsecutive,&jPointsAreConsecutive)) !=GRIB_SUCCESS) + return ret; + if((ret = grib_get_long_internal(h, sjScansPositively,&jScansPositively)) !=GRIB_SUCCESS) + return ret; + if((ret = grib_get_long_internal(h, siScansNegatively,&iScansNegatively)) !=GRIB_SUCCESS) + return ret; + if((ret = grib_get_long_internal(h, salternativeRowScanning,&alternativeRowScanning)) !=GRIB_SUCCESS) + return ret; - /* See Wolfram MathWorld: http://mathworld.wolfram.com/LambertConformalConicProjection.html */ - latFirstInRadians = latFirstInDegrees * DEG2RAD; - lonFirstInRadians = lonFirstInDegrees * DEG2RAD; - Latin1InRadians = Latin1InDegrees * DEG2RAD; - Latin2InRadians = Latin2InDegrees * DEG2RAD; - LaDInRadians = LaDInDegrees * DEG2RAD; - LoVInRadians = LoVInDegrees * DEG2RAD; + /* See Wolfram MathWorld: http://mathworld.wolfram.com/LambertConformalConicProjection.html */ + latFirstInRadians = latFirstInDegrees * DEG2RAD; + lonFirstInRadians = lonFirstInDegrees * DEG2RAD; + Latin1InRadians = Latin1InDegrees * DEG2RAD; + Latin2InRadians = Latin2InDegrees * DEG2RAD; + LaDInRadians = LaDInDegrees * DEG2RAD; + LoVInRadians = LoVInDegrees * DEG2RAD; - if ( fabs(Latin1InRadians - Latin2InRadians) < 1E-09 ) { - n = sin(Latin1InRadians); - } - else { - n = log(cos(Latin1InRadians)/cos(Latin2InRadians)) / - log(tan(M_PI_4 + Latin2InRadians/2.0) / tan(M_PI_4 + Latin1InRadians/2.0)); - } + if ( fabs(Latin1InRadians - Latin2InRadians) < 1E-09 ) { + n = sin(Latin1InRadians); + } + else { + n = log(cos(Latin1InRadians)/cos(Latin2InRadians)) / + log(tan(M_PI_4 + Latin2InRadians/2.0) / tan(M_PI_4 + Latin1InRadians/2.0)); + } - f = (cos(Latin1InRadians) * pow(tan(M_PI_4 + Latin1InRadians/2.0), n)) / n; - rho = radius * f * pow(tan(M_PI_4 + latFirstInRadians/2.0), -n); - rho0 = radius * f * pow(tan(M_PI_4 + LaDInRadians/2.0), -n); - if ( n < 0 ) /* adjustment for southern hemisphere */ - rho0 = -rho0; - lonDiff = lonFirstInRadians - LoVInRadians; + f = (cos(Latin1InRadians) * pow(tan(M_PI_4 + Latin1InRadians/2.0), n)) / n; + rho = radius * f * pow(tan(M_PI_4 + latFirstInRadians/2.0), -n); + rho0 = radius * f * pow(tan(M_PI_4 + LaDInRadians/2.0), -n); + if ( n < 0 ) /* adjustment for southern hemisphere */ + rho0 = -rho0; + lonDiff = lonFirstInRadians - LoVInRadians; - /* Adjust longitude to range -180 to 180 */ - if (lonDiff > M_PI) lonDiff -= 2*M_PI; - if (lonDiff < -M_PI) lonDiff += 2*M_PI; - angle = n * lonDiff; - x0 = rho * sin(angle); - y0 = rho0 - rho * cos(angle); - Dx = iScansNegatively == 0 ? Dx : -Dx; - Dy = jScansPositively == 1 ? Dy : -Dy; + /* Adjust longitude to range -180 to 180 */ + if (lonDiff > M_PI) lonDiff -= 2*M_PI; + if (lonDiff < -M_PI) lonDiff += 2*M_PI; + angle = n * lonDiff; + x0 = rho * sin(angle); + y0 = rho0 - rho * cos(angle); + Dx = iScansNegatively == 0 ? Dx : -Dx; + /* GRIB-405: Don't change sign of Dy. Latitudes ALWAYS increase from latitudeOfFirstGridPoint */ + /*Dy = jScansPositively == 1 ? Dy : -Dy;*/ - /* No support (yet) for jPointsAreConsecutive */ - if (jPointsAreConsecutive) { - grib_context_log(h->context,GRIB_LOG_ERROR,"No support for: 'Adjacent points in j (y) direction being consecutive'"); - Assert(0); - } + /* No support (yet) for jPointsAreConsecutive */ + if (jPointsAreConsecutive) { + grib_context_log(h->context,GRIB_LOG_ERROR,"No support for: 'Adjacent points in j (y) direction being consecutive'"); + Assert(0); + } - /* Allocate latitude and longitude arrays */ - self->lats = (double*)grib_context_malloc(h->context,iter->nv*sizeof(double)); - if (!self->lats) { - grib_context_log(h->context,GRIB_LOG_ERROR, "unable to allocate %ld bytes",iter->nv*sizeof(double)); - return GRIB_OUT_OF_MEMORY; - } - self->lons = (double*)grib_context_malloc(h->context,iter->nv*sizeof(double)); - if (!self->lats) { - grib_context_log(h->context,GRIB_LOG_ERROR, "unable to allocate %ld bytes",iter->nv*sizeof(double)); - return GRIB_OUT_OF_MEMORY; - } - lats=self->lats; - lons=self->lons; + /* Allocate latitude and longitude arrays */ + self->lats = (double*)grib_context_malloc(h->context,iter->nv*sizeof(double)); + if (!self->lats) { + grib_context_log(h->context,GRIB_LOG_ERROR, "unable to allocate %ld bytes",iter->nv*sizeof(double)); + return GRIB_OUT_OF_MEMORY; + } + self->lons = (double*)grib_context_malloc(h->context,iter->nv*sizeof(double)); + if (!self->lats) { + grib_context_log(h->context,GRIB_LOG_ERROR, "unable to allocate %ld bytes",iter->nv*sizeof(double)); + return GRIB_OUT_OF_MEMORY; + } + lats=self->lats; + lons=self->lons; - /* Populate our arrays */ - for (j = 0; j < ny; j++) { - y = y0 + j*Dy; - if ( n < 0 ) { /* adjustment for southern hemisphere */ - y = -y; - } - tmp = rho0 - y; - tmp2 = tmp*tmp; - for (i = 0; i < nx; i++) { - int index =i+j*nx; - x = x0 + i*Dx; - if ( n < 0 ) { /* adjustment for southern hemisphere */ - x = -x; - } + /* Populate our arrays */ + for (j = 0; j < ny; j++) { + y = y0 + j*Dy; + if ( n < 0 ) { /* adjustment for southern hemisphere */ + y = -y; + } + tmp = rho0 - y; + tmp2 = tmp*tmp; + for (i = 0; i < nx; i++) { + int index =i+j*nx; + x = x0 + i*Dx; + if ( n < 0 ) { /* adjustment for southern hemisphere */ + x = -x; + } - angle = atan(x / tmp); - rho = sqrt(x*x + tmp2); - if (n <= 0) rho = -rho; - lonDeg = LoVInDegrees + (angle/n) * RAD2DEG; - latDeg = (2.0 * atan(pow(radius * f/rho, 1.0/n)) - M_PI_2) * RAD2DEG; - while ( lonDeg >= 360.0) lonDeg -= 360.0; - while ( lonDeg < 0.0) lonDeg += 360.0; - lons[index] = lonDeg; - lats[index] = latDeg; - } - } + angle = atan(x / tmp); + rho = sqrt(x*x + tmp2); + if (n <= 0) rho = -rho; + lonDeg = LoVInDegrees + (angle/n) * RAD2DEG; + latDeg = (2.0 * atan(pow(radius * f/rho, 1.0/n)) - M_PI_2) * RAD2DEG; + while ( lonDeg >= 360.0) lonDeg -= 360.0; + while ( lonDeg < 0.0) lonDeg += 360.0; + lons[index] = lonDeg; + lats[index] = latDeg; + } + } - iter->e = -1; + iter->e = -1; - return ret; + return ret; } static int destroy(grib_iterator* i) { - grib_iterator_lambert_conformal* self = (grib_iterator_lambert_conformal*)i; - const grib_context *c = i->h->context; + grib_iterator_lambert_conformal* self = (grib_iterator_lambert_conformal*)i; + const grib_context *c = i->h->context; - grib_context_free(c,self->lats); - grib_context_free(c,self->lons); - return 1; + grib_context_free(c,self->lats); + grib_context_free(c,self->lons); + return 1; } - diff --git a/tools/make_dox.ksh b/tools/make_dox.ksh index 2add4d4bf..8b543f665 100755 --- a/tools/make_dox.ksh +++ b/tools/make_dox.ksh @@ -3,30 +3,26 @@ set -ex set -A tools grib_dump grib_ls grib_get grib_copy grib_set grib_filter grib_compare grib_get_data grib_keys grib_index_build export DOXYGEN_USAGE=1 -p4 edit tools.dox - cat tools_head.dox > tools.dox for tool in ${tools[@]} do - p4 edit ${tool}.dox - -set +e + set +e ./$tool > ${tool}.dox -set -e + set -e -cat >> ${tool}.dox <> ${tool}.dox <> ${tool}.dox -cat >> ${tool}.dox <> ${tool}.dox <> tools.dox <> tools.dox <