Changeset 9796d0a


Ignore:
Timestamp:
09/25/17 19:20:08 (7 years ago)
Author:
Hal Finkel <hfinkel@…>
Branches:
master, pympi
Children:
56b997e
Parents:
b02d091
git-author:
Hal Finkel <hfinkel@…> (09/25/17 19:20:08)
git-committer:
Hal Finkel <hfinkel@…> (09/25/17 19:20:08)
Message:

Add support for float4 (and similar) to Python bindings

Location:
python
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • python/example.py

    rc13d973 r9796d0a  
    3939 
    4040import sys 
     41import numpy as np 
    4142import genericio as gio 
    4243 
     
    4445gio.gio_inspect(name) 
    4546 
    46 x = gio.gio_read(name, "x") 
    47 print x 
     47if gio.gio_has_variable(name, "x"): 
     48  x = gio.gio_read(name, "x") 
     49  y = gio.gio_read(name, "y") 
     50  z = gio.gio_read(name, "z") 
     51  print np.column_stack((x, y, z)) 
     52else: 
     53  pos = gio.gio_read(name, "pos") 
     54  print pos 
    4855 
  • python/genericio.py

    rc13d973 r9796d0a  
    5353libpygio.get_variable_type.argtypes=[ct.c_char_p,ct.c_char_p] 
    5454 
     55libpygio.get_variable_field_count.restype=ct.c_int 
     56libpygio.get_variable_field_count.argtypes=[ct.c_char_p,ct.c_char_p] 
     57 
    5558libpygio.read_gio_int32.restype=None 
    56 libpygio.read_gio_int32.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_int)] 
     59libpygio.read_gio_int32.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_int),ct.c_int] 
    5760 
    5861libpygio.read_gio_int64.restype=None 
    59 libpygio.read_gio_int64.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_int64)] 
     62libpygio.read_gio_int64.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_int64),ct.c_int] 
    6063 
    6164libpygio.read_gio_float.restype=None 
    62 libpygio.read_gio_float.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_float)] 
     65libpygio.read_gio_float.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_float),ct.c_int] 
    6366 
    6467libpygio.read_gio_double.restype=None 
    65 libpygio.read_gio_double.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_double)] 
     68libpygio.read_gio_double.argtypes=[ct.c_char_p,ct.c_char_p,ct.POINTER(ct.c_double),ct.c_int] 
    6669 
    6770libpygio.inspect_gio.restype=None 
     
    7174    var_size = libpygio.get_elem_num(file_name) 
    7275    var_type = libpygio.get_variable_type(file_name,var_name) 
     76    field_count = libpygio.get_variable_field_count(file_name,var_name) 
    7377    if(var_type==10): 
    7478        print "Variable not found" 
     
    7882    elif(var_type==0): 
    7983        #float 
    80         result = np.ndarray(var_size,dtype=np.float32) 
    81         libpygio.read_gio_float(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_float))) 
     84        result = np.ndarray((var_size,field_count),dtype=np.float32) 
     85        libpygio.read_gio_float(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_float)),field_count) 
    8286        return result 
    8387    elif(var_type==1): 
    8488        #double 
    85         result = np.ndarray(var_size,dtype=np.float64) 
    86         libpygio.read_gio_double(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_double))) 
     89        result = np.ndarray((var_size,field_count),dtype=np.float64) 
     90        libpygio.read_gio_double(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_double)),field_count) 
    8791        return result 
    8892    elif(var_type==2): 
    8993        #int32 
    90         result = np.ndarray(var_size,dtype=np.int32) 
    91         libpygio.read_gio_int32(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_int32))) 
     94        result = np.ndarray((var_size,field_count),dtype=np.int32) 
     95        libpygio.read_gio_int32(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_int32)),field_count) 
    9296        return result 
    9397    elif(var_type==3): 
    9498        #int64 
    95         result = np.ndarray(var_size,dtype=np.int64) 
    96         libpygio.read_gio_int64(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_int64))) 
     99        result = np.ndarray((var_size,field_count),dtype=np.int64) 
     100        libpygio.read_gio_int64(file_name,var_name,result.ctypes.data_as(ct.POINTER(ct.c_int64)),field_count) 
    97101        return result         
    98          
     102 
     103def gio_has_variable(file_name,var_name): 
     104    var_size = libpygio.get_elem_num(file_name) 
     105    var_type = libpygio.get_variable_type(file_name,var_name) 
     106    return var_type!=10 
     107 
    99108def gio_inspect(file_name): 
    100109    libpygio.inspect_gio(file_name) 
  • python/lib/gio.cxx

    rbd84570 r9796d0a  
    4343#include <iostream> 
    4444 
    45   void read_gio_float(char* file_name, char* var_name, float* data){ 
    46     read_gio<float>(file_name,var_name,data); 
     45  void read_gio_float(char* file_name, char* var_name, float* data, int field_count){ 
     46    read_gio<float>(file_name,var_name,data,field_count); 
    4747  } 
    48   void read_gio_double(char* file_name, char* var_name, double* data){ 
    49     read_gio<double>(file_name,var_name,data); 
     48  void read_gio_double(char* file_name, char* var_name, double* data, int field_count){ 
     49    read_gio<double>(file_name,var_name,data,field_count); 
    5050  } 
    51   void read_gio_int32(char* file_name, char* var_name, int* data){ 
    52     read_gio<int>(file_name,var_name,data); 
     51  void read_gio_int32(char* file_name, char* var_name, int* data, int field_count){ 
     52    read_gio<int>(file_name,var_name,data,field_count); 
    5353  } 
    54   void read_gio_int64(char* file_name, char* var_name, int64_t* data){ 
    55     read_gio<int64_t>(file_name,var_name,data); 
     54  void read_gio_int64(char* file_name, char* var_name, int64_t* data, int field_count){ 
     55    read_gio<int64_t>(file_name,var_name,data,field_count); 
    5656  } 
    5757   
     
    7777      gio::GenericIO::VariableInfo vinfo = VI[i]; 
    7878      if(vinfo.Name == var_name){ 
    79         if(vinfo.IsFloat && vinfo.Size == 4) 
     79        if(vinfo.IsFloat && vinfo.ElementSize == 4) 
    8080          return float_type; 
    81         else if(vinfo.IsFloat && vinfo.Size == 8) 
     81        else if(vinfo.IsFloat && vinfo.ElementSize == 8) 
    8282          return double_type; 
    83         else if(!vinfo.IsFloat && vinfo.Size == 4) 
     83        else if(!vinfo.IsFloat && vinfo.ElementSize == 4) 
    8484          return int32_type; 
    85         else if(!vinfo.IsFloat && vinfo.Size == 8) 
     85        else if(!vinfo.IsFloat && vinfo.ElementSize == 8) 
    8686          return int64_type; 
    8787        else 
     
    9191    return var_not_found; 
    9292       
     93  } 
     94 
     95  int get_variable_field_count(char* file_name,char* var_name){ 
     96   gio::GenericIO reader(file_name); 
     97   std::vector<gio::GenericIO::VariableInfo> VI; 
     98   reader.openAndReadHeader(gio::GenericIO::MismatchAllowed); 
     99   reader.getVariableInfo(VI); 
     100 
     101   int num =VI.size(); 
     102    for(int i =0;i<num;++i){ 
     103      gio::GenericIO::VariableInfo vinfo = VI[i]; 
     104      if(vinfo.Name == var_name) { 
     105        return vinfo.Size/vinfo.ElementSize; 
     106      } 
     107    } 
     108    return 0; 
    93109  } 
    94110 
     
    110126    else 
    111127      std::cout<<"[i"; 
    112     std::cout<<" "<<vinfo.Size*8<<"] "; 
     128    int NumElements = vinfo.Size/vinfo.ElementSize; 
     129    std::cout<<" "<<vinfo.ElementSize*8; 
     130    if (NumElements > 1) 
     131      std::cout<<"x"<<NumElements; 
     132    std::cout<<"] "; 
    113133    std::cout<<vinfo.Name<<std::endl; 
    114134  } 
  • python/lib/gio.h

    rbd84570 r9796d0a  
    4646 
    4747template <class T> 
    48 void read_gio(char* file_name, std::string var_name, T*& data){ 
     48void read_gio(char* file_name, std::string var_name, T*& data, int field_count){ 
    4949  gio::GenericIO reader(file_name); 
    5050  reader.openAndReadHeader(gio::GenericIO::MismatchAllowed); 
     
    5757      max_size = rank_size[i]; 
    5858  } 
    59   T* rank_data = new T[max_size+reader.requestedExtraSpace()/sizeof(T)]; 
     59  T* rank_data = new T[max_size*field_count+reader.requestedExtraSpace()/sizeof(T)]; 
    6060  int64_t offset =0; 
    61   reader.addVariable(var_name,rank_data,true); 
     61  reader.addScalarizedVariable(var_name,rank_data,field_count, 
     62                               gio::GenericIO::VarHasExtraSpace); 
    6263  for(int i=0;i<num_ranks;++i){ 
    6364    reader.readData(i,false); 
    64     std::copy(rank_data,rank_data+rank_size[i],data+offset); 
    65     offset +=rank_size[i]; 
     65    std::copy(rank_data,rank_data+rank_size[i]*field_count,data+offset); 
     66    offset +=rank_size[i]*field_count; 
    6667  } 
    6768  delete [] rank_data; 
     
    7071extern "C" int64_t get_elem_num(char* file_name); 
    7172 
    72 extern "C" void read_gio_float (char* file_name, char* var_name, float* data); 
    73 extern "C" void read_gio_double(char* file_name, char* var_name, double* data); 
    74 extern "C" void read_gio_int32 (char* file_name, char* var_name, int* data);  
    75 extern "C" void read_gio_int64 (char* file_name, char* var_name, int64_t* data); 
     73extern "C" void read_gio_float (char* file_name, char* var_name, float* data, int field_count); 
     74extern "C" void read_gio_double(char* file_name, char* var_name, double* data, int field_count); 
     75extern "C" void read_gio_int32 (char* file_name, char* var_name, int* data, int field_count);  
     76extern "C" void read_gio_int64 (char* file_name, char* var_name, int64_t* data, int field_count); 
    7677enum var_type{ 
    7778  float_type=0, 
     
    8384}; 
    8485extern "C" var_type get_variable_type(char* file_name,char* var_name); 
     86extern "C" int get_variable_field_count(char* file_name,char* var_name); 
    8587extern "C" void inspect_gio(char* file_name); 
Note: See TracChangeset for help on using the changeset viewer.