values[i] = num_replications2[subset][j] i = i+1 repl_counts.append(num_replications2[subset][j]) for l in range(num_replications2[subset][j]): # fill dummy var values[i] = 45678. i = i+1 # debug print('values[:10]: ', values[:10].tolist()) #numpy.where(values != 0)])) print('values[-10:]: ', values[-10:].tolist()) #numpy.where(values != 0)])) # do the encoding to binary format bufr.kdata = numpy.array(repl_counts) print('bufr.kdata = ', bufr.kdata.tolist()) bufr.encode_data(values, cvals) # get an instance of the RawBUFRFile class bf1 = RawBUFRFile() output_bufr_file = 'dummy_bufr_file.bfr' # 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() ##############################
def create_bufr_file(output_bufr_file, template): # #[ create bufr file ''' and use this BUFR template to create a test BUFR message ''' from pybufr_ecmwf.bufr_interface_ecmwf import BUFRInterfaceECMWF bufr = BUFRInterfaceECMWF(verbose=True) # fill sections 0, 1, 2 and 3 num_subsets = 2 bufr.fill_sections_0123(bufr_code_centre=98, # ECMWF bufr_obstype=3, # sounding bufr_subtype=253, # L2B 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(table_b_to_use='B'+TABLE_NAME, table_d_to_use='D'+TABLE_NAME) 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 = num_subsets*bufr.max_nr_expanded_descriptors values = numpy.zeros(num_values, dtype=numpy.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 = numpy.zeros((num_cvalues, 80), dtype=numpy.character) cvals_index = 0 repl_counts = [] for subset in range(num_subsets): # note that python starts counting with 0, unlike fortran, # so there is no need to take (subset-1) print 'subset,exp_descr_list_length = ', subset, exp_descr_list_length i = subset*exp_descr_list_length # fill the message with some dummy data # fill year, month, day for val in [2014, 3, 19]: # fill the header values[i] = val+subset i += 1 # fill prod_name txt = 'filename{}.txt'.format(subset) cvals[cvals_index, :] = ' ' for icval, cval in enumerate(txt): cvals[cvals_index, icval] = cval # values[i] = cvals_index * 1000 + 64 # len(txt) values[i] = (cvals_index+1) * 1000 + len(txt) i += 1 cvals_index = cvals_index + 1 for val in [5.1+0.1*subset, 55.2-0.01*subset, 23., 45., 73., 82.]: bufr.verify_in_range(i, val) values[i] = val i += 1 if USE_DELAYED_REPLICATION: # set actual delayed replication repeats num_repl = 3 + 2*subset print 'num_repl = ', num_repl values[i] = num_repl i += 1 repl_counts.append(num_repl) # fill the replicated variable for irepl in range(num_repl): val = 12.+subset*0.1 + irepl*0.01 bufr.verify_in_range(i, val) values[i] = val i += 1 # do the encoding to binary format bufr.kdata = numpy.array(repl_counts) print 'bufr.kdata = ', bufr.kdata bufr.encode_data(values, cvals) print 'DEBUG: values = ', values from pybufr_ecmwf.raw_bufr_file import RawBUFRFile # 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()
# set actual delayed replication number values[i] = num_replications2[subset][j] i = i + 1 repl_counts.append(num_replications2[subset][j]) for l in range(num_replications2[subset][j]): # fill dummy var values[i] = 45678. i = i + 1 # debug print('values: ', list(values)) #numpy.where(values != 0)])) # do the encoding to binary format bufr.kdata = numpy.array(repl_counts) print('bufr.kdata = ', bufr.kdata) bufr.encode_data(values, cvals) # get an instance of the RawBUFRFile class bf1 = RawBUFRFile() output_bufr_file = 'dummy_bufr_file.bfr' # 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() ##############################
def create_bufr_file(output_bufr_file, template): # #[ create bufr file ''' and use this BUFR template to create a test BUFR message ''' from pybufr_ecmwf.bufr_interface_ecmwf import BUFRInterfaceECMWF bufr = BUFRInterfaceECMWF(verbose=True) # fill sections 0, 1, 2 and 3 num_subsets = 2 bufr.fill_sections_0123(bufr_code_centre=98, # ECMWF bufr_obstype=3, # sounding bufr_subtype=253, # L2B 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(table_b_to_use='B'+TABLE_NAME, table_d_to_use='D'+TABLE_NAME) 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 = num_subsets*bufr.max_nr_expanded_descriptors values = numpy.zeros(num_values, dtype=numpy.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 = numpy.zeros((num_cvalues, 80), dtype=numpy.character) cvals_index = 0 repl_counts = [] for subset in range(num_subsets): # note that python starts counting with 0, unlike fortran, # so there is no need to take (subset-1) print 'subset,exp_descr_list_length = ', subset, exp_descr_list_length i = subset*exp_descr_list_length # fill the message with some dummy data # fill year, month, day for val in [2014, 3, 19]: # fill the header values[i] = val+subset i += 1 # fill prod_name # this is not python2.6 compatible #txt = 'filename{}.txt'.format(subset) txt = 'filename'+str(subset)+'.txt' cvals[cvals_index, :] = ' ' for icval, cval in enumerate(txt): cvals[cvals_index, icval] = cval # values[i] = cvals_index * 1000 + 64 # len(txt) values[i] = (cvals_index+1) * 1000 + len(txt) i += 1 cvals_index = cvals_index + 1 for val in [5.1+0.1*subset, 55.2-0.01*subset, 23., 45., 73., 82.]: bufr.verify_in_range(i, val) values[i] = val i += 1 if USE_DELAYED_REPLICATION: # set actual delayed replication repeats num_repl = 3 + 2*subset print 'num_repl = ', num_repl values[i] = num_repl i += 1 repl_counts.append(num_repl) # fill the replicated variable for irepl in range(num_repl): val = 12.+subset*0.1 + irepl*0.01 bufr.verify_in_range(i, val) values[i] = val i += 1 # do the encoding to binary format bufr.kdata = numpy.array(repl_counts) print 'bufr.kdata = ', bufr.kdata bufr.encode_data(values, cvals) print 'DEBUG: values = ', values from pybufr_ecmwf.raw_bufr_file import RawBUFRFile # 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()