void inner_prod_impl(vector_base<NumericT> const & x, vector_tuple<NumericT> const & vec_tuple, vector_base<NumericT> & result) { typedef NumericT value_type; value_type const * data_x = detail::extract_raw_pointer<value_type>(x); vcl_size_t start_x = viennacl::traits::start(x); vcl_size_t inc_x = viennacl::traits::stride(x); vcl_size_t size_x = viennacl::traits::size(x); std::vector<value_type> temp(vec_tuple.const_size()); std::vector<value_type const *> data_y(vec_tuple.const_size()); std::vector<vcl_size_t> start_y(vec_tuple.const_size()); std::vector<vcl_size_t> stride_y(vec_tuple.const_size()); for (vcl_size_t j=0; j<vec_tuple.const_size(); ++j) { data_y[j] = detail::extract_raw_pointer<value_type>(vec_tuple.const_at(j)); start_y[j] = viennacl::traits::start(vec_tuple.const_at(j)); stride_y[j] = viennacl::traits::stride(vec_tuple.const_at(j)); } // Note: No OpenMP here because it cannot perform a reduction on temp-array. Savings in memory bandwidth are expected to still justify this approach... for (vcl_size_t i = 0; i < size_x; ++i) { value_type entry_x = data_x[i*inc_x+start_x]; for (vcl_size_t j=0; j < vec_tuple.const_size(); ++j) temp[j] += entry_x * data_y[j][i*stride_y[j]+start_y[j]]; } for (vcl_size_t j=0; j < vec_tuple.const_size(); ++j) result[j] = temp[j]; //Note: Assignment to result might be expensive, thus 'temp' is used for accumulation }
bool _curv_save_shp(const d_curv * contour, const char * filename) { if (!contour->getName()) writelog(LOG_MESSAGE,"saving curv to ERSI shape file %s", filename); else writelog(LOG_MESSAGE,"saving curv \"%s\" to ERSI shape file %s", contour->getName(), filename); if (!contour) { writelog(LOG_WARNING, "NULL pointer to curv."); return false; }; DBFHandle hDBF; SHPHandle hSHP; hSHP = SHPOpen( filename, "rb+" ); hDBF = DBFOpen( filename, "rb+" ); if (hSHP == NULL || hDBF == NULL) { if (hSHP) SHPClose( hSHP ); if (hDBF) DBFClose( hDBF ); hSHP = SHPCreate( filename, SHPT_ARC ); if( hSHP == NULL ) { writelog(LOG_ERROR, "Unable to create:%s", filename ); return false; } hDBF = DBFCreate( filename ); } int shpType; SHPGetInfo(hSHP, NULL, &shpType, NULL, NULL); if (shpType != SHPT_ARC) { writelog(LOG_ERROR, "%s : Wrong shape type! Should be SHPT_ARC.", filename); SHPClose( hSHP ); DBFClose( hDBF ); return false; } int name_field = DBFGetFieldIndex( hDBF, "NAME" ); if (name_field == -1) { if( DBFAddField( hDBF, "NAME", FTString, 50, 0 ) == -1 ) { writelog(LOG_ERROR, "DBFAddField(%s,FTString) failed.", "NAME"); SHPClose( hSHP ); DBFClose( hDBF ); return false; } name_field = DBFGetFieldIndex( hDBF, "NAME" ); }; std::vector<REAL> data_x(contour->size()); std::vector<REAL> data_y(contour->size()); std::copy(contour->X->begin(), contour->X->end(), data_x.begin()); std::copy(contour->Y->begin(), contour->Y->end(), data_y.begin()); SHPObject * psObject = SHPCreateObject(SHPT_ARC, -1, 0, NULL, NULL, contour->size(), &*(data_x.begin()), &*(data_y.begin()), NULL, NULL); SHPComputeExtents(psObject); int pos = SHPWriteObject(hSHP, -1, psObject); SHPDestroyObject(psObject); if (contour->getName()) DBFWriteStringAttribute(hDBF, pos, name_field, contour->getName() ); SHPClose( hSHP ); DBFClose( hDBF ); return true; };