void Stokhos::BasisInteractionGraph::initialize(const Stokhos::OrthogPolyBasis<int,double> & max_basis, const Stokhos::Sparse3Tensor<int,double> & Cijk, int porder) { using Teuchos::RCP; typedef Stokhos::Sparse3Tensor<int,double> Cijk_type; // // max it out if defaulted // if(porder<0) // porder = max_basis.size(); // RCP<Stokhos::Sparse3Tensor<int,double> > Cijk = max_basis.computeTripleProductTensor(porder); Cijk_type::k_iterator k_end = Cijk.k_end(); if (onlyUseLinear_) { int dim = max_basis.dimension(); k_end = Cijk.find_k(dim+1); } vecLookup_.resize(max_basis.size()); // defines number of rows numCols_ = vecLookup_.size(); // set number of columns // Loop over Cijk entries including a non-zero in the graph at // indices (i,j) if there is any k for which Cijk is non-zero for(Cijk_type::k_iterator k_it=Cijk.k_begin(); k_it!=k_end; ++k_it) { for(Cijk_type::kj_iterator j_it = Cijk.j_begin(k_it); j_it != Cijk.j_end(k_it); ++j_it) { int j = index(j_it); for(Cijk_type::kji_iterator i_it = Cijk.i_begin(j_it); i_it != Cijk.i_end(j_it); ++i_it) { int i = index(i_it); vecLookup_[i].push_back(j); } } } }
Stokhos::BasisInteractionGraph::BasisInteractionGraph(const Stokhos::OrthogPolyBasis<int,double> & max_basis,bool onlyUseLinear,int porder) : onlyUseLinear_(onlyUseLinear) { using Teuchos::RCP; RCP<const Stokhos::Sparse3Tensor<int,double> > Cijk; if(porder<0) Cijk = max_basis.computeTripleProductTensor(); else Cijk = max_basis.computeLinearTripleProductTensor(); initialize(max_basis,*Cijk,porder); }
Stokhos::PCECovarianceOp:: PCECovarianceOp(const Teuchos::RCP<const EpetraExt::BlockVector>& X_bv, const Stokhos::OrthogPolyBasis<int,double>& basis) : label("Stokhos::PCECovarianceOp"), X(), s(basis.norm_squared()), useTranspose(false), tmp_map(), tmp() { const Epetra_BlockMap& base_map = X_bv->GetBaseMap(); int N = base_map.NumMyElements(); int sz = basis.size(); X = Teuchos::rcp(new Epetra_MultiVector(View, base_map, X_bv->Values()+N, N, sz-1)); tmp_map = Teuchos::rcp(new Epetra_LocalMap(X->NumVectors(), 0, X->Map().Comm())); }
Stokhos::PCECovarianceOp:: PCECovarianceOp(const Teuchos::RCP<const Epetra_MultiVector>& X_, const Stokhos::OrthogPolyBasis<int,double>& basis) : label("Stokhos::PCECovarianceOp"), X(X_), s(basis.norm_squared()), useTranspose(false), tmp_map(), tmp() { tmp_map = Teuchos::rcp(new Epetra_LocalMap(X->NumVectors(), 0, X->Map().Comm())); }
Teuchos::RCP<Epetra_CrsGraph> sparse3Tensor2CrsGraph( const Stokhos::OrthogPolyBasis<ordinal_type,value_type>& basis, const Stokhos::Sparse3Tensor<ordinal_type,value_type>& Cijk, const Epetra_Comm& comm) { typedef Stokhos::Sparse3Tensor<ordinal_type,value_type> Cijk_type; // Number of stochastic rows ordinal_type num_rows = basis.size(); // Replicated local map Epetra_LocalMap map(num_rows, 0, comm); // Graph to be created Teuchos::RCP<Epetra_CrsGraph> graph = Teuchos::rcp(new Epetra_CrsGraph(Copy, map, 0)); // Loop over Cijk entries including a non-zero in the graph at // indices (i,j) if there is any k for which Cijk is non-zero for (typename Cijk_type::k_iterator k_it=Cijk.k_begin(); k_it!=Cijk.k_end(); ++k_it) { for (typename Cijk_type::kj_iterator j_it = Cijk.j_begin(k_it); j_it != Cijk.j_end(k_it); ++j_it) { ordinal_type j = index(j_it); for (typename Cijk_type::kji_iterator i_it = Cijk.i_begin(j_it); i_it != Cijk.i_end(j_it); ++i_it) { ordinal_type i = index(i_it); graph->InsertGlobalIndices(i, 1, &j); } } } // Sort, remove redundencies, transform to local, ... graph->FillComplete(); return graph; }
Teuchos::RCP<Epetra_CrsGraph> sparse3Tensor2CrsGraph( const Stokhos::OrthogPolyBasis<ordinal_type,value_type>& basis, const Stokhos::Sparse3Tensor<ordinal_type,value_type>& Cijk, const Epetra_Comm& comm) { // Number of stochastic rows ordinal_type num_rows = basis.size(); // Replicated local map Epetra_LocalMap map(num_rows, 0, comm); // Graph to be created Teuchos::RCP<Epetra_CrsGraph> graph = Teuchos::rcp(new Epetra_CrsGraph(Copy, map, 0)); // Loop over Cijk entries including a non-zero in the graph at // indices (i,j) if there is any k for which Cijk is non-zero ordinal_type Cijk_size = Cijk.size(); for (ordinal_type k=0; k<Cijk_size; k++) { ordinal_type nj = Cijk.num_j(k); const Teuchos::Array<int>& j_indices = Cijk.Jindices(k); for (ordinal_type jj=0; jj<nj; jj++) { ordinal_type j = j_indices[jj]; const Teuchos::Array<int>& i_indices = Cijk.Iindices(k,jj); ordinal_type ni = i_indices.size(); for (ordinal_type ii=0; ii<ni; ii++) { ordinal_type i = i_indices[ii]; graph->InsertGlobalIndices(i, 1, &j); } } } // Sort, remove redundencies, transform to local, ... graph->FillComplete(); return graph; }