コード例 #1
0
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)