void TA_CTI( const Array2D<T> &flow_accumulation, const Array2D<U> &riserun_slope, Array2D<V> &result ){ Timer timer; RDLOG_ALG_NAME<<"d8_CTI"; if(flow_accumulation.width()!=riserun_slope.width() || flow_accumulation.height()!=riserun_slope.height()) throw std::runtime_error("Couldn't calculate CTI! The input matricies were of unequal dimensions!"); RDLOG_PROGRESS<<"Setting up the CTI matrix..."<<std::flush; result.resize(flow_accumulation); result.setNoData(-1); //Log(x) can't take this value of real inputs, so we're good RDLOG_PROGRESS<<"succeeded."; RDLOG_PROGRESS<<"Calculating CTI..."<<std::flush; timer.start(); #pragma omp parallel for collapse(2) for(int x=0;x<flow_accumulation.width();x++) for(int y=0;y<flow_accumulation.height();y++) if(flow_accumulation(x,y)==flow_accumulation.noData() || riserun_slope(x,y)==riserun_slope.noData()) result(x,y)=result.noData(); else result(x,y)=log( (flow_accumulation(x,y)/flow_accumulation.getCellArea()) / (riserun_slope(x,y)+0.001) ); RDLOG_TIME_USE<<"succeeded in "<<timer.stop()<<"s."; }