IdentifierModel<Adapter>::IdentifierModel( const RCP<const Adapter> &ia, const RCP<const Environment> &env, const RCP<const Comm<int> > &comm, modelFlag_t &modelFlags): numGlobalIdentifiers_(), env_(env), comm_(comm), gids_(), nUserWeights_(0), weights_() { // Get the local and global problem size size_t nLocalIds = ia->getLocalNumIDs(); gno_t lsum = nLocalIds; reduceAll<int, gno_t>(*comm_, Teuchos::REDUCE_SUM, 1, &lsum, &numGlobalIdentifiers_); // Get the number of weights // Use max number of weights over all processes as nUserWeights_ int tmp = ia->getNumWeightsPerID(); Teuchos::reduceAll<int, int>(*comm, Teuchos::REDUCE_MAX, 1, &tmp, &nUserWeights_); // Prepare to store views from input adapter // TODO: Do we have to store these views, or can we get them on an // TODO: as-needed basis? Array<const scalar_t *> wgts(nUserWeights_, (const scalar_t *)NULL); Array<int> wgtStrides(nUserWeights_, 0); if (nUserWeights_ > 0){ input_t *w = new input_t [nUserWeights_]; weights_ = arcp<input_t>(w, 0, nUserWeights_); } const gno_t *gids=NULL; // Get the input adapter's views try{ ia->getIDsView(gids); for (int idx=0; idx < nUserWeights_; idx++) ia->getWeightsView(wgts[idx], wgtStrides[idx], idx); } Z2_FORWARD_EXCEPTIONS; if (nLocalIds){ gids_ = arcp(gids, 0, nLocalIds, false); if (nUserWeights_ > 0){ for (int idx=0; idx < nUserWeights_; idx++){ ArrayRCP<const scalar_t> wgtArray(wgts[idx], 0, nLocalIds*wgtStrides[idx], false); weights_[idx] = input_t(wgtArray, wgtStrides[idx]); } } } env_->memory("After construction of identifier model"); }
IdentifierModel<IdentifierInput<User> >::IdentifierModel( const IdentifierInput<User> *ia, const RCP<const Environment> &env, const RCP<const Comm<int> > &comm, modelFlag_t &modelFlags): gnosAreGids_(false), numGlobalIdentifiers_(), env_(env), comm_(comm), gids_(), userWeightDim_(0), weights_(), gnos_(), gnosConst_() { userWeightDim_ = ia->getNumberOfWeights(); size_t nLocalIds = ia->getLocalNumberOfIdentifiers(); Model<IdentifierInput<User> >::maxCount(*comm, userWeightDim_); Array<const scalar_t *> wgts(userWeightDim_, (const scalar_t *)NULL); Array<int> wgtStrides(userWeightDim_, 0); Array<lno_t> weightArrayLengths(userWeightDim_, 0); if (userWeightDim_ > 0){ input_t *w = new input_t [userWeightDim_]; weights_ = arcp<input_t>(w, 0, userWeightDim_); } const gid_t *gids=NULL; try{ ia->getIdentifierList(gids); for (int dim=0; dim < userWeightDim_; dim++) ia->getIdentifierWeights(dim, wgts[dim], wgtStrides[dim]); } Z2_FORWARD_EXCEPTIONS; if (nLocalIds){ gids_ = arcp(gids, 0, nLocalIds, false); if (userWeightDim_ > 0){ for (int i=0; i < userWeightDim_; i++){ if (wgts[i] != NULL){ ArrayRCP<const scalar_t> wgtArray( wgts[i], 0, nLocalIds*wgtStrides[i], false); weights_[i] = input_t(wgtArray, wgtStrides[i]); weightArrayLengths[i] = nLocalIds; } } } } this->setWeightArrayLengths(weightArrayLengths, *comm_); RCP<const idmap_t> idMap; try{ if (modelFlags.test(IDS_MUST_BE_GLOBALLY_CONSECUTIVE)) idMap = rcp(new idmap_t(env_, comm_, gids_, true)); else idMap = rcp(new idmap_t(env_, comm_, gids_, false)); } Z2_FORWARD_EXCEPTIONS; gnosAreGids_ = idMap->gnosAreGids(); this->setIdentifierMap(idMap); gno_t lsum = nLocalIds; reduceAll<int, gno_t>(*comm_, Teuchos::REDUCE_SUM, 1, &lsum, &numGlobalIdentifiers_); if (!gnosAreGids_ && nLocalIds>0){ gno_t *tmpGno = new gno_t [nLocalIds]; env_->localMemoryAssertion(__FILE__, __LINE__, nLocalIds, tmpGno); gnos_ = arcp(tmpGno, 0, nLocalIds); try{ ArrayRCP<gid_t> gidsNonConst = arcp_const_cast<gid_t>(gids_); idMap->gidTranslate( gidsNonConst(0,nLocalIds), gnos_(0,nLocalIds), TRANSLATE_APP_TO_LIB); } Z2_FORWARD_EXCEPTIONS; }