def create_bufr_template(): # #[ create the template ''' now use these definitions to create a BUFR template ''' from pybufr_ecmwf.bufr_template import BufrTemplate variable3 = 0 template = BufrTemplate() template.add_descriptor(D_301192) # 4 items template.add_descriptor(D_301193) # 6 items if USE_DELAYED_REPLICATION: max_nr = 5 # max. 5*1 items template.add_delayed_replic_descriptors(max_nr, [variable3,]) return template
def create_bufr_template(): # #[ create the template ''' now use these definitions to create a BUFR template ''' from pybufr_ecmwf.bufr_template import BufrTemplate variable3 = 0 template = BufrTemplate(verbose=True) template.add_descriptor(D_301192) # 4 items template.add_descriptor(D_301193) # 6 items if USE_DELAYED_REPLICATION: max_nr = 5 # max. 5*1 items template.add_delayed_replic_descriptors(max_nr, [variable3,]) return template
def encoding_example(output_bufr_file): # #[ """ wrap the example in a function to circumvent the pylint convention of requiring capitals for constants in the global scope (since most of these variables are not constants at all)) """ bufr = BUFRInterfaceECMWF(verbose=True) # fill sections 0, 1, 2 and 3 num_subsets = 4 bufr.fill_sections_0123(bufr_code_centre=98, # ECMWF bufr_obstype=3, # sounding bufr_subtype=251, # L1B bufr_table_local_version=1, bufr_table_master=0, bufr_table_master_version=15, bufr_code_subcentre=0, # L2B processing facility num_subsets=num_subsets, bufr_compression_flag=0) # 64=compression/0=no compression # determine information from sections 0123 to construct the BUFR table # names expected by the ECMWF BUFR library and create symlinks to the # default tables if needed bufr.setup_tables() # define a descriptor list template = BufrTemplate() template.add_descriptors(DD_D_DATE_YYYYMMDD, # 0 DD_D_TIME_HHMM) # 1 # delay replication for the next 2 descriptors # allow at most 2 delayed replications template.add_delayed_replic_descriptors(2, DD_PRESSURE, DD_TEMPERATURE) # replicate the next 2 descriptors 3 times template.add_replicated_descriptors(3, DD_LATITUDE_HIGH_ACCURACY, DD_LONGITUDE_HIGH_ACCURACY) bufr.register_and_expand_descriptors(template) # activate this one if the encoding crashes without clear cause: # bufr.estimated_num_bytes_for_encoding = 25000 # retrieve the length of the expanded descriptor list exp_descr_list_length = bufr.ktdexl print "exp_descr_list_length = ", exp_descr_list_length # fill the values array with some dummy varying data num_values = exp_descr_list_length*num_subsets values = np.zeros(num_values, dtype=np.float64) # this is the default # note: these two must be identical for now, otherwise the # python to fortran interface breaks down. This also ofcourse is the # cause of the huge memory use of cvals in case num_values is large. num_cvalues = num_values cvals = np.zeros((num_cvalues, 80), dtype=np.character) for subset in range(num_subsets): # note that python starts counting with 0, unlike fortran, # so there is no need to take (subset-1) i = subset*exp_descr_list_length values[i] = 1999 # year i = i+1 values[i] = 12 # month i = i+1 values[i] = 31 # day i = i+1 values[i] = 23 # hour i = i+1 values[i] = 59 - subset # minute i = i+1 values[i] = 2 # delayed replication factor # this delayed replication factor determines the actual number # of values to be stored for this particular subset # even if it is less then the number given in kdata above ! for repl in range(2): i = i+1 values[i] = 1013.e2 - 100.e2*subset+i+repl # pressure [pa] i = i+1 values[i] = 273.15 - 10.*subset+i+repl # temperature [K] for repl in range(3): i = i+1 values[i] = 51.82 + 0.05*subset+i+repl # latitude i = i+1 values[i] = 5.25 + 0.1*subset+i+repl # longitude # do the encoding to binary format bufr.encode_data(values, cvals) # get an instance of the RawBUFRFile class bf1 = RawBUFRFile() # open the file for writing bf1.open(output_bufr_file, 'wb') # write the encoded BUFR message bf1.write_raw_bufr_msg(bufr.encoded_message) # close the file bf1.close()
print('='*50) print("D-table:") print('='*50) bufr_table_set.print_D_table() print('='*50) # define the table name without preceding 'B' or 'D' character # (which will be prepended by the below write method) table_name = '_test_table.txt' bufr_table_set.write_tables(table_name) # now use these definitions to create a BUFR template max_nr_of_repeats = 5 template = BufrTemplate(verbose=True) template.add_descriptor(var1) # 1 item template.add_delayed_replic_descriptors(max_nr_of_repeats, D_363192) # max. 1 + 5*5 items # and use this BUFR template to create a test BUFR message bufr = BUFRInterfaceECMWF(verbose=True) # fill sections 0, 1, 2 and 3 num_subsets = 3 bufr.fill_sections_0123(bufr_code_centre=0, bufr_obstype=0, bufr_subtype=0, bufr_table_local_version=0, bufr_table_master=0, bufr_table_master_version=0, bufr_code_subcentre=0, num_subsets=num_subsets, bufr_compression_flag=0)
def encoding_example(output_bufr_file): # #[ """ wrap the example in a function to circumvent the pylint convention of requiring capitals for constants in the global scope (since most of these variables are not constants at all)) """ bufr = BUFRInterfaceECMWF(verbose=True) # fill sections 0, 1, 2 and 3 num_subsets = 4 bufr.fill_sections_0123( bufr_code_centre=98, # ECMWF bufr_obstype=3, # sounding bufr_subtype=251, # L1B bufr_table_local_version=1, bufr_table_master=0, bufr_table_master_version=15, bufr_code_subcentre=0, # L2B processing facility num_subsets=num_subsets, bufr_compression_flag=0) # 64=compression/0=no compression # determine information from sections 0123 to construct the BUFR table # names expected by the ECMWF BUFR library and create symlinks to the # default tables if needed bufr.setup_tables() # define a descriptor list template = BufrTemplate(verbose=True) template.add_descriptors( DD_D_DATE_YYYYMMDD, # 0 DD_D_TIME_HHMM) # 1 # delay replication for the next 2 descriptors # allow at most 2 delayed replications template.add_delayed_replic_descriptors(2, DD_PRESSURE, DD_TEMPERATURE) # replicate the next 2 descriptors 3 times template.add_replicated_descriptors(3, DD_LATITUDE_HIGH_ACCURACY, DD_LONGITUDE_HIGH_ACCURACY) bufr.register_and_expand_descriptors(template) # activate this one if the encoding crashes without clear cause: # bufr.estimated_num_bytes_for_encoding = 25000 # retrieve the length of the expanded descriptor list exp_descr_list_length = bufr.ktdexl print("exp_descr_list_length = ", exp_descr_list_length) # fill the values array with some dummy varying data num_values = exp_descr_list_length * num_subsets values = np.zeros(num_values, dtype=np.float64) # this is the default # note: these two must be identical for now, otherwise the # python to fortran interface breaks down. This also ofcourse is the # cause of the huge memory use of cvals in case num_values is large. num_cvalues = num_values cvals = np.zeros((num_cvalues, 80), dtype=np.character) for subset in range(num_subsets): # note that python starts counting with 0, unlike fortran, # so there is no need to take (subset-1) i = subset * exp_descr_list_length values[i] = 1999 # year i = i + 1 values[i] = 12 # month i = i + 1 values[i] = 31 # day i = i + 1 values[i] = 23 # hour i = i + 1 values[i] = 59 - subset # minute i = i + 1 values[i] = 2 # delayed replication factor # this delayed replication factor determines the actual number # of values to be stored for this particular subset # even if it is less then the number given in kdata above ! for repl in range(2): i = i + 1 values[i] = 1013.e2 - 100.e2 * subset + i + repl # pressure [pa] i = i + 1 values[i] = 273.15 - 10. * subset + i + repl # temperature [K] for repl in range(3): i = i + 1 values[i] = 51.82 + 0.05 * subset + i + repl # latitude i = i + 1 values[i] = 5.25 + 0.1 * subset + i + repl # longitude # do the encoding to binary format bufr.encode_data(values, cvals) # get an instance of the RawBUFRFile class bf1 = RawBUFRFile() # open the file for writing bf1.open(output_bufr_file, 'wb') # write the encoded BUFR message bf1.write_raw_bufr_msg(bufr.encoded_message) # close the file bf1.close()