def call_g2s_client(a_netcdf_dir, a_file_path, a_ecmwf_path, a_lats, a_lons, a_sta_names): """ call g2s_client """ conf = Conf.get_instance() lib_g2s_path = conf.get('G2SCLIENT','lib_g2s') # get nb of altitude values n_z = conf.getint('G2SCLIENT', 'nb_levels', 401) d_z = conf.getfloat('G2SCLIENT', 'level_step', 0.5) libg2s = ctypes.cdll.LoadLibrary(lib_g2s_path) print("libg2s = %s\n" % (libg2s) ) # call the g2sclient g2sclient_pt = libg2s.g2sclient_pt err = -1 pt_err = ctypes.byref(ctypes.c_int(err)) nb_points = len(a_lats) pt_nb_points = ctypes.byref(ctypes.c_int(nb_points)) # Prepare type double * nb of lat points lat_arr = ctypes.c_double * nb_points lon_arr = ctypes.c_double * nb_points # allocate and add values (lat=10 and lon=10) lat_points = lat_arr() lon_points = lon_arr() for i in xrange(0, nb_points): lat_points[i] = a_lats[i] lon_points[i] = a_lons[i] pt_nz = ctypes.byref(ctypes.c_int(n_z)) pt_dz = ctypes.byref(ctypes.c_double(d_z)) #command = 'extract' # need to pad with space chars the command string command = 'extract'.ljust(128) pt_command = ctypes.c_char_p(command) # check if filename exist otherwise error if not os.path.exists(os.path.normpath(a_file_path)): print("Error the G2S binary file cannot be found %s\n" % (a_file_path)) return err filename = a_file_path.ljust(128) pt_filename = ctypes.c_char_p(filename) # add datetime the_dt = get_datetime_from_ecmwf_file_name(a_ecmwf_path) # create the 3 array types dim = nb_points * n_z cz_t = ctypes.c_double * dim uz_t = ctypes.c_double * dim vz_t = ctypes.c_double * dim c_z = cz_t() u_z = uz_t() v_z = vz_t() print("Calling g2sclient_pt") #g2sclient_pt(pt_err,lat_points, lon_points, pt_nb_points, pt_filename, pt_command, pt_nz, pt_dz, cz, uz, vz) time_spent = utils.ftimer(g2sclient_pt, [pt_err, lat_points, lon_points, pt_nb_points, pt_filename, \ pt_command, pt_nz, pt_dz, c_z, u_z, v_z], {}) print("Run g2sclient in %.2f sec\n" %(time_spent)) # the fortran program returns if we have 2 points and 3 lev # (pt1,lev1),(pt2,lev1),(pt1,lev2),(pt2,lev2),(pt1,lev3),(pt2,lev3) # so we need to reshape dim1=nz (3) dim= nb_points (2): # # (pt1,lev3),(pt2,lev3) # (pt1,lev2),(pt2,lev2) # (pt1,lev1),(pt2,lev1) # we can then transpose the axes to obtain # (pt2,lev1),(pt2,lev2),(pt2,lev3) # (pt1,lev1),(pt1,lev2),(pt1,lev3) # try to reshape c_z = numpy.reshape(c_z, (n_z, nb_points)) c_z = numpy.transpose(c_z) u_z = numpy.reshape(u_z, (n_z, nb_points)) u_z = numpy.transpose(u_z) v_z = numpy.reshape(v_z, (n_z, nb_points)) v_z = numpy.transpose(v_z) #for pt in range(nb_points): # for lev in range(nz): # print("pt_ind=%s,lev_ind=%s,celerity=%s\n" %(pt, lev, cz[pt][lev])) err = create_netcdf('%s/G2SECMWF_%s_STA.nc' % (a_netcdf_dir, the_dt.strftime('%y%m%d%H') ), \ lat_points, lon_points, n_z, c_z, u_z, v_z, the_dt, a_sta_names) return err
load_configuration(args) args = parse_arguments(sys.argv[1:]) ecmwf_data_paths = get_ecmwf_data(args["start"], args["end"]) print ("BIN files written in %s\n" % (args["bin_dir"])) print ("netcdf files written in %s\n" % (args["netcdf_dir"])) print ("Ecmwf data paths %s\n" % (ecmwf_data_paths)) (sta_names, lats, lons) = _get_station_info() for path in ecmwf_data_paths: time_spent = ftimer(do_run, [path, args, lats, lons, sta_names], {}) print ("Generation for %s done in %.2f seconds \n" % (path, time_spent)) except ParsingError, e: # Not Runner set print print ("Error - %s" % (e.get_message_error())) usage() sys.exit(2) except ConfAccessError, e: # Not Runner set print print ("Error - %s" % (e.get_message_error())) if args.get("verbose", 1) == 3: print ("Traceback: %s." % (get_exception_traceback())) usage() sys.exit(2)