void promote_array(size_t n, const BaseArray<T>& s, BaseArray<T>& d) { vector<size_t> ex = s.getDims(); for (int i=0; i<n; i++) ex.push_back(1); d.setDims(ex); d.assign(s.getData()); }
void create_array_from_shape(const spec_type& sp,BaseArray<T>& s,BaseArray<T>& d) { //alocate target array vector<size_t> shape; vector<size_t>::const_iterator iter; for(iter = (sp.first).begin();iter!=(sp.first).end();++iter) { if(*iter!=0) shape.push_back(*iter); } d.setDims(shape); //Check if the dimension of passed indices match the dimension of target array if(sp.second.size()!=s.getNumDims()) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Erro in create array from shape, number of dimensions does not match"); T* data = new T[d.getNumElems()]; idx_type::const_iterator spec_iter; //calc number of indeces size_t n =1; for(spec_iter = sp.second.begin();spec_iter!=sp.second.end();++spec_iter) { n*=spec_iter->size(); } size_t k =0; size_t index=0; vector<size_t>::const_iterator indeces_iter; //initialize target array with elements of source array using passed indices vector<size_t> idx; for(int i=0;i<n;i++) { spec_iter = sp.second.begin(); for(int dim=0;dim<s.getNumDims();dim++) { size_t idx1 = getNextIndex(*spec_iter,i); idx.push_back(idx1); spec_iter++; } if(index>(d.getNumElems()-1)) { throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Erro in create array from shape, number of dimensions does not match"); } data[index] = s(idx); idx.clear(); index++; } //assign elemets to target array d.assign( data ); delete [] data; }