/* * access to grid information * * grid(type1, type2, type3, basetime, member, validtime, "get") * arguments: * type1, type2, type3, member: String * basetime, validtime: Integer (minuits from 00:00 1 Jan 1801) * return: * projection: String * gridsize: Array[2] (nx,ny) * gridinfo: Array[14] (basepoint_x, basepoint_y, basepoint_lat, basepoint_lon, distance_x, distance_y, standard_lat, standard_lon, standard2_lat, standard2_lon, other_lat, other_lon, other2_lat, other2_lon) * value: String * * grid(type1, type2, type3, basetime, member, validtime, "put", projection, gridsize, gridinfo, value) * arguments: * type1, type2, type3, member: String * basetime, validtime: Integer (minuits from 00:00 1 Jan 1801) * projection: String * gridsize: Array[2] (nx,ny) * gridinfo: Array[14] (basepoint_x, basepoint_y, basepoint_lat, basepoint_lon, distance_x, distance_y, standard_lat, standard_lon, standard2_lat, standard2_lon, other_lat, other_lon, other2_lat, other2_lon) * value: String * return: * nil */ VALUE rb_grid(int argc, VALUE *argv, VALUE self) { VALUE type1, type2, type3; VALUE basetime, member, validtime; VALUE getput; VALUE proj, gridsize, gridinfo, value; char cproj[3], cvalue[5]; N_SI4 cgridsize[2]; float cgridinfo[14]; struct NARRAY* nary; VALUE* ary; int16_t *cary_sint; float *cary_float; int flag=0; int i; N_SI4 code; rb_scan_args(argc, argv, "74", &type1, &type2, &type3, &basetime, &member, &validtime, &getput, &proj, &gridsize, &gridinfo, &value); GetChar(getput,3); if (strcmp(cgetput,"get") || strcmp(cgetput,"GET")) { if (argc != 7) rb_raise(rb_eArgError, "wrong number of arguments for get (%d for 7)", argc); flag = 1; } else if (strcmp(cgetput,"put") || strcmp(cgetput,"PUT")) { if (argc != 11) rb_raise(rb_eArgError, "wrong number of arguments for put (%d for 11)", argc); if (TYPE(gridsize)==T_ARRAY) { if (RARRAY_LEN(gridsize)!=2) rb_raise(rb_eArgError, "length of gridsize must be 2"); ary = RARRAY_PTR(gridsize); for (i=0;i<2;i++) cgridsize[i] = NUM2INT(ary[i]); } else if (IsNArray(gridsize)){ if (NA_TOTAL(gridsize)!=2) rb_raise(rb_eArgError, "length of gridsize must be 2"); gridsize = na_cast_object(gridsize, NA_SINT); GetNArray(gridsize,nary); cary_sint = NA_PTR_TYPE(nary,int16_t*); for (i=0;i<2;i++) cgridsize[i] = (N_SI4)cary_sint[i]; } else rb_raise(rb_eArgError, "gridsize must be NArray of Array"); if (TYPE(gridinfo)==T_ARRAY) { if (RARRAY_LEN(gridinfo)!=14) rb_raise(rb_eArgError, "length of gridsize must be 14"); ary = RARRAY_PTR(gridinfo); for (i=0;i<14;i++) cgridinfo[i] = (float)NUM2DBL(ary[i]); } else if (IsNArray(gridinfo)){ if (NA_TOTAL(gridinfo)!=14) rb_raise(rb_eArgError, "length of gridinfo must be 14"); gridinfo = na_cast_object(gridinfo, NA_SFLOAT); GetNArray(gridinfo,nary); cary_float = NA_PTR_TYPE(nary,float*); for (i=0;i<14;i++) cgridinfo[i] = cary_float[i]; } else rb_raise(rb_eArgError, "gridinfo must be NArray of Array"); GetCharUndef(proj, 3); GetCharUndef(value, 4); } GetTypes; GetTimesAndMember; code = nusdas_grid(ctype1, ctype2, ctype3, &cbasetime, cmember, &cvalidtime, cproj, cgridsize, cgridinfo, cvalue, cgetput); if (code == -5) rb_raise(rb_eRuntimeError, "getput is invalid"); else if (code != 0) rb_raise(rb_eRuntimeError, "faild: code=%d", code); if ( flag==1 ) { proj = rb_str_new(cproj,4); gridsize = rb_ary_new(); for(i=0;i<2;i++) rb_ary_push(gridsize, INT2NUM((int)cgridsize[i])); gridinfo = rb_ary_new(); for(i=0;i<14;i++) rb_ary_push(gridinfo, rb_float_new((double)cgridinfo[i])); value = rb_str_new(cvalue,4); return rb_ary_new3(4, proj, gridsize, gridinfo, value); } else return Qnil; }