ECC-208 transient vector and subsets

This commit is contained in:
Enrico Fucile 2016-01-29 11:07:59 +00:00
parent 852f99f39c
commit 5fae39d8cb
14 changed files with 1549 additions and 1059 deletions

View File

@ -11,11 +11,11 @@ lookup[1] ed (7,editionNumber);
transient missingValue=999999;
#negative value=not used
transient inputDelayedDescriptorReplicationFactor=-1;
transient inputDelayedDescriptorReplicationFactor={-1};
#negative value=not used
transient inputExtendedDelayedDescriptorReplicationFactor=-1;
transient inputExtendedDelayedDescriptorReplicationFactor={-1};
#negative value=not used
transient inputShortDelayedDescriptorReplicationFactor=-1;
transient inputShortDelayedDescriptorReplicationFactor={-1};
template boot_edition "bufr/boot_edition_[ed:l].def";

View File

@ -32,6 +32,7 @@ list( APPEND grib_api_srcs
action_class_close.c
action_class_variable.c
action_class_modify.c
action_class_transient_darray.c
eccodes.c
grib_accessor.c
grib_concept.c
@ -167,6 +168,7 @@ list( APPEND grib_api_srcs
grib_accessor_class_spectral_truncation.c
grib_accessor_class_time.c
grib_accessor_class_transient.c
grib_accessor_class_transient_darray.c
grib_accessor_class_values.c
grib_accessor_class_simple_packing_error.c
grib_accessor_class_data_simple_packing.c

View File

@ -44,6 +44,7 @@ libeccodes_la_prototypes= \
action_class_close.c \
action_class_variable.c \
action_class_modify.c \
action_class_transient_darray.c \
grib_accessor.c \
grib_concept.c \
grib_hash_array.c \
@ -242,6 +243,7 @@ libeccodes_la_prototypes= \
grib_accessor_class_g2_eps.c \
grib_accessor_class_g2_chemical.c \
grib_accessor_class_g2_mars_labeling.c \
grib_accessor_class_transient_darray.c \
grib_accessor_class_md5.c \
grib_jasper_encoding.c \
grib_openjpeg_encoding.c \

View File

@ -0,0 +1,141 @@
/*
* 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.
*/
/***************************************************************************
* Enrico Fucile *
***************************************************************************/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = action
SUPER = action_class_gen
IMPLEMENTS = dump;xref
IMPLEMENTS = destroy;execute
MEMBERS = grib_darray *darray
MEMBERS = char *name
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "action.class" and rerun ./make_class.pl
*/
static void init_class (grib_action_class*);
static void dump (grib_action* d, FILE*,int);
static void xref (grib_action* d, FILE* f,const char* path);
static void destroy (grib_context*,grib_action*);
static int execute(grib_action* a,grib_handle* h);
typedef struct grib_action_transient_darray {
grib_action act;
/* Members defined in gen */
long len;
grib_arguments* params;
/* Members defined in transient_darray */
grib_darray *darray;
char *name;
} grib_action_transient_darray;
extern grib_action_class* grib_action_class_gen;
static grib_action_class _grib_action_class_transient_darray = {
&grib_action_class_gen, /* super */
"action_class_transient_darray", /* name */
sizeof(grib_action_transient_darray), /* size */
0, /* inited */
&init_class, /* init_class */
0, /* init */
&destroy, /* destroy */
&dump, /* dump */
&xref, /* xref */
0, /* create_accessor*/
0, /* notify_change */
0, /* reparse */
&execute, /* execute */
0, /* compile */
};
grib_action_class* grib_action_class_transient_darray = &_grib_action_class_transient_darray;
static void init_class(grib_action_class* c)
{
c->create_accessor = (*(c->super))->create_accessor;
c->notify_change = (*(c->super))->notify_change;
c->reparse = (*(c->super))->reparse;
c->compile = (*(c->super))->compile;
}
/* END_CLASS_IMP */
grib_action* grib_action_create_transient_darray( grib_context* context, const char* name, grib_darray* darray)
{
char buf[1024];
grib_action_transient_darray* a = NULL;
grib_action_class* c = grib_action_class_transient_darray;
grib_action* act = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
act->op = grib_context_strdup_persistent(context,"transient_darray");
act->cclass = c;
a = (grib_action_transient_darray*)act;
act->context = context;
a->darray = darray;
a->name = grib_context_strdup_persistent(context,name);
act->name = grib_context_strdup_persistent(context,name);
return act;
}
static int execute(grib_action* act, grib_handle *h)
{
grib_action_transient_darray* self = (grib_action_transient_darray*) act;
grib_accessor* a=grib_create_accessor(h->root, act, NULL );
size_t len=grib_darray_used_size(self->darray);
return grib_pack_double(a,self->darray->v,&len);
}
static void dump(grib_action* act, FILE* f, int lvl)
{
int i =0;
grib_action_transient_darray* self=(grib_action_transient_darray*)act;
for (i=0;i<lvl;i++)
grib_context_print(act->context,f," ");
grib_context_print(act->context,f,self->name);
printf("\n");
}
static void destroy(grib_context* context,grib_action* act)
{
grib_action_transient_darray* a = (grib_action_transient_darray*) act;
grib_context_free_persistent(context, a->name);
grib_darray_delete(context,a->darray);
grib_context_free_persistent(context, act->name);
grib_context_free_persistent(context, act->op);
}
static void xref(grib_action* d, FILE* f,const char *path)
{
}

View File

@ -195,6 +195,7 @@ extern grib_accessor_class* grib_accessor_class_to_double;
extern grib_accessor_class* grib_accessor_class_to_integer;
extern grib_accessor_class* grib_accessor_class_to_string;
extern grib_accessor_class* grib_accessor_class_transient;
extern grib_accessor_class* grib_accessor_class_transient_darray;
extern grib_accessor_class* grib_accessor_class_uint16;
extern grib_accessor_class* grib_accessor_class_uint16_little_endian;
extern grib_accessor_class* grib_accessor_class_uint32;

View File

@ -53,13 +53,13 @@
MEMBERS = int unpackMode
MEMBERS = int bitsToEndData
MEMBERS = grib_section* dataKeys
MEMBERS = int* inputReplications
MEMBERS = long* inputReplications
MEMBERS = int nInputReplications
MEMBERS = int iInputReplications
MEMBERS = int* inputExtendedReplications
MEMBERS = long* inputExtendedReplications
MEMBERS = int nInputExtendedReplications
MEMBERS = int iInputExtendedReplications
MEMBERS = int* inputShortReplications
MEMBERS = long* inputShortReplications
MEMBERS = int nInputShortReplications
MEMBERS = int iInputShortReplications
@ -124,13 +124,13 @@ typedef struct grib_accessor_bufr_data_array {
int unpackMode;
int bitsToEndData;
grib_section* dataKeys;
int* inputReplications;
long* inputReplications;
int nInputReplications;
int iInputReplications;
int* inputExtendedReplications;
long* inputExtendedReplications;
int nInputExtendedReplications;
int iInputExtendedReplications;
int* inputShortReplications;
long* inputShortReplications;
int nInputShortReplications;
int iInputShortReplications;
} grib_accessor_bufr_data_array;
@ -1629,32 +1629,38 @@ static int create_keys(grib_accessor* a)
}
static int set_input_replications(grib_handle* h,grib_accessor_bufr_data_array *self) {
size_t nInputReplications;
size_t nInputExtendedReplications;
size_t nInputShortReplications;
self->nInputReplications=-1;
self->nInputExtendedReplications=-1;
self->nInputShortReplications=-1;
self->iInputReplications=0;
self->iInputExtendedReplications=0;
self->iInputShortReplications=0;
if (grib_get_size(h,"inputDelayedDescriptorReplicationFactor",&(self->nInputReplications))==0) {
if (grib_get_size(h,"inputDelayedDescriptorReplicationFactor",&nInputReplications)==0 && nInputReplications!=0) {
if (self->inputReplications) grib_context_free(h->context,self->inputReplications);
self->inputReplications=grib_context_malloc_clear(h->context,sizeof(long)*self->nInputReplications);
grib_get_long_array(h,"inputDelayedDescriptorReplicationFactor",self->inputReplications,&(self->nInputReplications));
self->inputReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputReplications);
grib_get_long_array(h,"inputDelayedDescriptorReplicationFactor",self->inputReplications,&nInputReplications);
/* default-> no input replications*/
if (self->inputReplications[0]<0) self->nInputReplications=-1;
else self->nInputReplications=nInputReplications;
}
if (grib_get_size(h,"inputExtendedDelayedDescriptorReplicationFactor",&(self->nInputExtendedReplications))==0) {
if (grib_get_size(h,"inputExtendedDelayedDescriptorReplicationFactor",&nInputExtendedReplications)==0 && nInputExtendedReplications!=0) {
if (self->inputExtendedReplications) grib_context_free(h->context,self->inputExtendedReplications);
self->inputExtendedReplications=grib_context_malloc_clear(h->context,sizeof(long)*self->nInputExtendedReplications);
grib_get_long_array(h,"inputExtendedDelayedDescriptorReplicationFactor",self->inputExtendedReplications,&(self->nInputExtendedReplications));
self->inputExtendedReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputExtendedReplications);
grib_get_long_array(h,"inputExtendedDelayedDescriptorReplicationFactor",self->inputExtendedReplications,&nInputExtendedReplications);
/* default-> no input replications*/
if (self->inputExtendedReplications[0]<0) self->nInputExtendedReplications=-1;
else self->nInputExtendedReplications=nInputExtendedReplications;
}
if (grib_get_size(h,"inputShortDelayedDescriptorReplicationFactor",&(self->nInputShortReplications))==0) {
if (grib_get_size(h,"inputShortDelayedDescriptorReplicationFactor",&nInputShortReplications)==0 && nInputShortReplications!=0) {
if (self->inputShortReplications) grib_context_free(h->context,self->inputShortReplications);
self->inputShortReplications=grib_context_malloc_clear(h->context,sizeof(long)*self->nInputShortReplications);
grib_get_long_array(h,"inputShortDelayedDescriptorReplicationFactor",self->inputShortReplications,&(self->nInputShortReplications));
self->inputShortReplications=grib_context_malloc_clear(h->context,sizeof(long)*nInputShortReplications);
grib_get_long_array(h,"inputShortDelayedDescriptorReplicationFactor",self->inputShortReplications,&nInputShortReplications);
/* default-> no input replications*/
if (self->inputShortReplications[0]<0) self->nInputShortReplications=-1;
else self->nInputShortReplications=nInputShortReplications;
}
}

View File

@ -0,0 +1,285 @@
/*
* 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 "grib_api_internal.h"
#include <limits.h>
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = accessor
SUPER = grib_accessor_class_gen
IMPLEMENTS = unpack_double;pack_double
IMPLEMENTS = unpack_long;pack_long;destroy
IMPLEMENTS = init;dump;value_count
IMPLEMENTS = compare;get_native_type
MEMBERS=grib_darray* arr
MEMBERS=int type;
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "accessor.class" and rerun ./make_class.pl
*/
static int get_native_type(grib_accessor*);
static int pack_double(grib_accessor*, const double* val,size_t *len);
static int pack_long(grib_accessor*, const long* val,size_t *len);
static int unpack_double(grib_accessor*, double* val,size_t *len);
static int unpack_long(grib_accessor*, long* val,size_t *len);
static int value_count(grib_accessor*,long*);
static void destroy(grib_context*,grib_accessor*);
static void dump(grib_accessor*, grib_dumper*);
static void init(grib_accessor*,const long, grib_arguments* );
static void init_class(grib_accessor_class*);
static int compare(grib_accessor*, grib_accessor*);
typedef struct grib_accessor_transient_darray {
grib_accessor att;
/* Members defined in gen */
/* Members defined in transient_darray */
grib_darray* arr;
int type;
} grib_accessor_transient_darray;
extern grib_accessor_class* grib_accessor_class_gen;
static grib_accessor_class _grib_accessor_class_transient_darray = {
&grib_accessor_class_gen, /* super */
"transient_darray", /* name */
sizeof(grib_accessor_transient_darray), /* size */
0, /* inited */
&init_class, /* init_class */
&init, /* init */
0, /* post_init */
&destroy, /* free mem */
&dump, /* describes himself */
0, /* get length of section */
0, /* get length of string */
&value_count, /* get number of values */
0, /* get number of bytes */
0, /* get offset to bytes */
&get_native_type, /* get native type */
0, /* get sub_section */
0, /* grib_pack procedures long */
0, /* grib_pack procedures long */
&pack_long, /* grib_pack procedures long */
&unpack_long, /* grib_unpack procedures long */
&pack_double, /* grib_pack procedures double */
&unpack_double, /* grib_unpack procedures double */
0, /* grib_pack procedures string */
0, /* grib_unpack procedures string */
0, /* grib_pack array procedures string */
0, /* grib_unpack array procedures string */
0, /* grib_pack procedures bytes */
0, /* grib_unpack procedures bytes */
0, /* pack_expression */
0, /* notify_change */
0, /* update_size */
0, /* preferred_size */
0, /* resize */
0, /* nearest_smaller_value */
0, /* next accessor */
&compare, /* compare vs. another accessor */
0, /* unpack only ith value */
0, /* unpack a subarray */
0, /* clear */
0, /* clone accessor */
};
grib_accessor_class* grib_accessor_class_transient_darray = &_grib_accessor_class_transient_darray;
static void init_class(grib_accessor_class* c)
{
c->next_offset = (*(c->super))->next_offset;
c->string_length = (*(c->super))->string_length;
c->byte_count = (*(c->super))->byte_count;
c->byte_offset = (*(c->super))->byte_offset;
c->sub_section = (*(c->super))->sub_section;
c->pack_missing = (*(c->super))->pack_missing;
c->is_missing = (*(c->super))->is_missing;
c->pack_string = (*(c->super))->pack_string;
c->unpack_string = (*(c->super))->unpack_string;
c->pack_string_array = (*(c->super))->pack_string_array;
c->unpack_string_array = (*(c->super))->unpack_string_array;
c->pack_bytes = (*(c->super))->pack_bytes;
c->unpack_bytes = (*(c->super))->unpack_bytes;
c->pack_expression = (*(c->super))->pack_expression;
c->notify_change = (*(c->super))->notify_change;
c->update_size = (*(c->super))->update_size;
c->preferred_size = (*(c->super))->preferred_size;
c->resize = (*(c->super))->resize;
c->nearest_smaller_value = (*(c->super))->nearest_smaller_value;
c->next = (*(c->super))->next;
c->unpack_double_element = (*(c->super))->unpack_double_element;
c->unpack_double_subarray = (*(c->super))->unpack_double_subarray;
c->clear = (*(c->super))->clear;
c->make_clone = (*(c->super))->make_clone;
}
/* END_CLASS_IMP */
static void init(grib_accessor* a, const long length , grib_arguments* args )
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
self->arr=NULL;
self->type=GRIB_TYPE_DOUBLE;
a->length = 0;
}
static void dump(grib_accessor* a, grib_dumper* dumper)
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
grib_dump_double(dumper,a,NULL);
}
static int pack_double(grib_accessor* a, const double* val, size_t *len)
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
size_t i;
if (self->arr) grib_darray_delete(a->context,self->arr);
self->arr=grib_darray_new(a->context,*len,10);
for (i=0;i<*len;i++)
grib_darray_push(a->context,self->arr,val[i]);
return GRIB_SUCCESS;
}
static int pack_long(grib_accessor* a, const long* val, size_t *len)
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
size_t i;
if (self->arr) grib_darray_delete(a->context,self->arr);
self->arr=grib_darray_new(a->context,*len,10);
for (i=0;i<*len;i++)
grib_darray_push(a->context,self->arr,(double)val[i]);
return GRIB_SUCCESS;
}
static int unpack_double(grib_accessor* a, double* val, size_t *len)
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
long count=0;
size_t i;
value_count(a,&count);
if(*len < count)
{
grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s (setting %d, required %d) ", a->name , *len,count );
return GRIB_ARRAY_TOO_SMALL;
}
*len=count;
for (i=0;i<*len;i++) val[i]=self->arr->v[i];
return GRIB_SUCCESS;
}
static int unpack_long(grib_accessor* a, long* val, size_t *len)
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
long count=0;
size_t i;
value_count(a,&count);
if(*len < count)
{
grib_context_log(a->context, GRIB_LOG_ERROR, "Wrong size for %s (setting %d, required %d) ", a->name , *len,count );
return GRIB_ARRAY_TOO_SMALL;
}
*len=count;
for (i=0;i<*len;i++) val[i]=(long)self->arr->v[i];
return GRIB_SUCCESS;
}
static void destroy(grib_context* c,grib_accessor* a)
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
if (self->arr) grib_darray_delete(a->context,self->arr);
}
static int value_count(grib_accessor* a,long* count)
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
if (self->arr) *count=grib_darray_used_size(self->arr);
else *count=0;
return 0;
}
static int compare(grib_accessor* a, grib_accessor* b) {
int retval=0;
double *aval=0;
double *bval=0;
size_t alen = 0;
size_t blen = 0;
int err=0;
long count=0;
err=grib_value_count(a,&count);
if (err) return err;
alen=count;
err=grib_value_count(b,&count);
if (err) return err;
blen=count;
if (alen != blen) return GRIB_COUNT_MISMATCH;
aval=(double*)grib_context_malloc(a->context,alen*sizeof(double));
bval=(double*)grib_context_malloc(b->context,blen*sizeof(double));
grib_unpack_double(a,aval,&alen);
grib_unpack_double(b,bval,&blen);
retval = GRIB_SUCCESS;
while (alen != 0) {
if (*bval != *aval) retval = GRIB_DOUBLE_VALUE_MISMATCH;
alen--;
}
grib_context_free(a->context,aval);
grib_context_free(b->context,bval);
return retval;
}
static int get_native_type(grib_accessor* a)
{
grib_accessor_transient_darray *self = (grib_accessor_transient_darray*)a;
return self->type;
}

View File

@ -194,6 +194,7 @@
{ "to_integer", &grib_accessor_class_to_integer, },
{ "to_string", &grib_accessor_class_to_string, },
{ "transient", &grib_accessor_class_transient, },
{ "transient_darray", &grib_accessor_class_transient_darray, },
{ "uint16", &grib_accessor_class_uint16, },
{ "uint16_little_endian", &grib_accessor_class_uint16_little_endian, },
{ "uint32", &grib_accessor_class_uint32, },

View File

@ -204,6 +204,7 @@ to_double, &grib_accessor_class_to_double
to_integer, &grib_accessor_class_to_integer
to_string, &grib_accessor_class_to_string
transient, &grib_accessor_class_transient
transient_darray, &grib_accessor_class_transient_darray
uint16, &grib_accessor_class_uint16
uint16_little_endian, &grib_accessor_class_uint16_little_endian
uint32, &grib_accessor_class_uint32

View File

@ -1,5 +1,6 @@
#line 2 "gribl.c"
#line 3 "lex.grib_yy.c"
#line 4 "gribl.c"
#define YY_INT_ALIGNED short int
@ -1148,7 +1149,7 @@ void _grib_ignore_grib_yyunput_unused_error() { grib_yyunput(0,0); }
#define GET_INPUT input
#endif
#line 1152 "lex.grib_yy.c"
#line 1153 "gribl.c"
#define INITIAL 0
@ -1334,7 +1335,7 @@ YY_DECL
#line 1338 "lex.grib_yy.c"
#line 1339 "gribl.c"
if ( !(grib_yy_init) )
{
@ -2166,7 +2167,7 @@ YY_RULE_SETUP
#line 283 "gribl.l"
ECHO;
YY_BREAK
#line 2170 "lex.grib_yy.c"
#line 2171 "gribl.c"
case YY_STATE_EOF(INITIAL):
grib_yyterminate();

File diff suppressed because it is too large Load Diff

View File

@ -482,6 +482,8 @@ simple : UNSIGNED '[' INTEGER ']' IDENT default flags
| TRANS IDENT '=' argument flags
{ $$ = grib_action_create_variable(grib_parser_context,$2,"transient",0,$4,$4,$5,NULL); free($2); }
| TRANS IDENT '=' '{' dvalues '}'
{ $$ = grib_action_create_transient_darray(grib_parser_context,$2,$5); free($2); }
| FLOAT IDENT default flags
{ $$ = grib_action_create_gen(grib_parser_context,$2,"ieeefloat",4,NULL,$3,$4,NULL,NULL); free($2); }

View File

@ -6,3 +6,10 @@ sed 's/yy/grib_yy/g' < $LEX_OUT | sed 's/static void grib_yyunput/void grib_yyun
sed 's/fgetc/getc/g' < grib_lex1.c > grib_lex.c
rm -f grib_lex1.c
rm -f $LEX_OUT
yacc -d griby.y
sed 's/yy/grib_yy/g' < y.tab.c > grib_yacc1.c
sed 's/fgetc/getc/g' < grib_yacc1.c > grib_yacc.c
rm -f grib_yacc1.c
sed 's/yy/grib_yy/g' < y.tab.h > grib_yacc.h
rm -f y.tab.c y.tab.h

View File

@ -832,20 +832,26 @@ cat > $fRules <<EOF
set localTablesVersionNumber=0;
set masterTablesVersionNumber=23;
set inputDelayedDescriptorReplicationFactor = 3;
set inputExtendedDelayedDescriptorReplicationFactor = 3;
set inputDelayedDescriptorReplicationFactor = {2,3};
print "inputDelayedDescriptorReplicationFactor=[inputDelayedDescriptorReplicationFactor]";
set inputExtendedDelayedDescriptorReplicationFactor = {3,4};
print "inputExtendedDelayedDescriptorReplicationFactor=[inputExtendedDelayedDescriptorReplicationFactor]";
set numberOfSubsets=2;
set unexpandedDescriptors={309052};
set pressure={102400,50000,40000,30000,20000,15000};
print "/subsetNumber=1/delayedDescriptorReplicationFactor=[/subsetNumber=1/delayedDescriptorReplicationFactor]";
print "/subsetNumber=1/extendedDelayedDescriptorReplicationFactor=[/subsetNumber=1/extendedDelayedDescriptorReplicationFactor]";
print "pressure=[pressure]";
print "geopotentialHeight=[geopotentialHeight]";
print "delayedDescriptorReplicationFactor=[delayedDescriptorReplicationFactor]";
print "extendedDelayedDescriptorReplicationFactor=[extendedDelayedDescriptorReplicationFactor]";
print "/subsetNumber=2/delayedDescriptorReplicationFactor=[/subsetNumber=2/delayedDescriptorReplicationFactor]";
print "/subsetNumber=2/extendedDelayedDescriptorReplicationFactor=[/subsetNumber=2/extendedDelayedDescriptorReplicationFactor]";
set pressure={102400,50000,40000,30000,20000,15000,102400,50000,40000,30000,20000,15000};
set pack=1;
print "pressure={[pressure!12',']}";
write;
EOF
@ -858,10 +864,14 @@ ${tools_dir}bufr_filter -o ${fOut} $fRules $f 2>> $fLog 1>> $fLog
${tools_dir}bufr_filter -o ${fOut} $fRules $f > ${fOut}.log
cat > ${fOut}.log.ref <<EOF
pressure=102400 50000 40000 30000 20000 15000
geopotentialHeight=2147483647 2147483647 2147483647
delayedDescriptorReplicationFactor=3
extendedDelayedDescriptorReplicationFactor=3
inputDelayedDescriptorReplicationFactor=2 3
inputExtendedDelayedDescriptorReplicationFactor=3 4
/subsetNumber=1/delayedDescriptorReplicationFactor=2
/subsetNumber=1/extendedDelayedDescriptorReplicationFactor=3
/subsetNumber=2/delayedDescriptorReplicationFactor=3
/subsetNumber=2/extendedDelayedDescriptorReplicationFactor=4
pressure={102400,50000,40000,30000,20000,15000,102400,50000,40000,30000,20000,15000
}
EOF
diff ${fOut}.log.ref ${fOut}.log