void GatherEigenvectors<EvalT,Traits>:: evaluateFields(typename Traits::EvalData workset) { if(nEigenvectors == 0) return; if(workset.eigenDataPtr->eigenvectorRe != Teuchos::null) { if(workset.eigenDataPtr->eigenvectorIm != Teuchos::null) { //Gather real and imaginary parts from workset Eigendata info structure const Epetra_MultiVector& e_r = *(workset.eigenDataPtr->eigenvectorRe); const Epetra_MultiVector& e_i = *(workset.eigenDataPtr->eigenvectorIm); int numVecsInWorkset = std::min(e_r.NumVectors(),e_i.NumVectors()); int numVecsToGather = std::min(numVecsInWorkset, (int)nEigenvectors); for (std::size_t cell=0; cell < workset.numCells; ++cell ) { const Teuchos::ArrayRCP<Teuchos::ArrayRCP<int> >& nodeID = workset.wsElNodeEqID[cell]; for(std::size_t node =0; node < this->numNodes; ++node) { int offsetIntoVec = nodeID[node][0]; // neq==1 hardwired for (std::size_t k = 0; k < numVecsToGather; ++k) { (this->eigenvector_Re[k])(cell,node) = (*(e_r(k)))[offsetIntoVec]; (this->eigenvector_Im[k])(cell,node) = (*(e_i(k)))[offsetIntoVec]; } } } } else { // Only real parts of eigenvectors is given -- "gather" zeros into imaginary fields //Gather real and imaginary parts from workset Eigendata info structure const Epetra_MultiVector& e_r = *(workset.eigenDataPtr->eigenvectorRe); int numVecsInWorkset = e_r.NumVectors(); int numVecsToGather = std::min(numVecsInWorkset, (int)nEigenvectors); for (std::size_t cell=0; cell < workset.numCells; ++cell ) { const Teuchos::ArrayRCP<Teuchos::ArrayRCP<int> >& nodeID = workset.wsElNodeEqID[cell]; for(std::size_t node =0; node < this->numNodes; ++node) { int offsetIntoVec = nodeID[node][0]; // neq==1 hardwired for (std::size_t k = 0; k < numVecsToGather; ++k) { (this->eigenvector_Re[k])(cell,node) = (*(e_r(k)))[offsetIntoVec]; (this->eigenvector_Im[k])(cell,node) = 0.0; } } } } } // else (if both Re and Im are null) gather zeros into both?? }
NOX::Abstract::Group::ReturnType SaveEigenData_Epetra::save( Teuchos::RCP< std::vector<double> >& evals_r, Teuchos::RCP< std::vector<double> >& evals_i, Teuchos::RCP< NOX::Abstract::MultiVector >& evecs_r, Teuchos::RCP< NOX::Abstract::MultiVector >& evecs_i) { if (nsave==0) return NOX::Abstract::Group::Ok; Teuchos::RCP<NOX::Epetra::MultiVector> ne_r = Teuchos::rcp_dynamic_cast<NOX::Epetra::MultiVector>(evecs_r); Teuchos::RCP<NOX::Epetra::MultiVector> ne_i = Teuchos::rcp_dynamic_cast<NOX::Epetra::MultiVector>(evecs_i); Epetra_MultiVector& e_r = ne_r->getEpetraMultiVector(); Epetra_MultiVector& e_i = ne_i->getEpetraMultiVector(); int ns = nsave; if (ns > evecs_r->numVectors()) ns = evecs_r->numVectors(); for (int i=0; i<ns; i++) { if ((*evals_i)[i]==0) { cout << setprecision(8) << "Eigenvalue " << i << " with value: " << (*evals_r)[i] << "\n Has Eigenvector: " << *(e_r(i)) << "\n" << endl; } else { cout << setprecision(8) << "Eigenvalue " << i << " with value: " << (*evals_r)[i] << " + " << (*evals_i)[i] << " i \nHas Eigenvector Re, Im" << *(e_r(i)) << "\n" << *(e_i(i)) << endl; } } return NOX::Abstract::Group::Ok; }