Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include <vector>
00008 #include <string>
00009
00010 #include "Teuchos_TestForException.hpp"
00011 #include "Phalanx_DataLayout.hpp"
00012
00013 namespace PHAL {
00014
00015
00016 template<typename EvalT, typename Traits>
00017 GatherEigenvectors<EvalT,Traits>::
00018 GatherEigenvectors(const Teuchos::ParameterList& p,
00019 const Teuchos::RCP<Albany::Layouts>& dl)
00020 {
00021 char buf[200];
00022
00023 std::string eigenvector_name_root = p.get<std::string>("Eigenvector field name root");
00024 nEigenvectors = p.get<int>("Number of eigenvectors");
00025
00026 eigenvector_Re.resize(nEigenvectors);
00027 eigenvector_Im.resize(nEigenvectors);
00028 for (std::size_t k = 0; k < nEigenvectors; ++k) {
00029 sprintf(buf, "%s_Re%d", eigenvector_name_root.c_str(), (int)k);
00030 PHX::MDField<ScalarT,Cell,Node> fr(buf,dl->node_scalar);
00031 eigenvector_Re[k] = fr;
00032 this->addEvaluatedField(eigenvector_Re[k]);
00033
00034 sprintf(buf, "%s_Im%d", eigenvector_name_root.c_str(), (int)k);
00035 PHX::MDField<ScalarT,Cell,Node> fi(buf,dl->node_scalar);
00036 eigenvector_Im[k] = fi;
00037 this->addEvaluatedField(eigenvector_Im[k]);
00038 }
00039
00040 this->setName("Gather Eigenvectors"+PHX::TypeString<EvalT>::value);
00041 }
00042
00043
00044 template<typename EvalT, typename Traits>
00045 void GatherEigenvectors<EvalT,Traits>::
00046 postRegistrationSetup(typename Traits::SetupData d,
00047 PHX::FieldManager<Traits>& fm)
00048 {
00049 for (std::size_t k = 0; k < nEigenvectors; ++k) {
00050 this->utils.setFieldData(eigenvector_Re[k],fm);
00051 this->utils.setFieldData(eigenvector_Im[k],fm);
00052 }
00053
00054 numNodes = (nEigenvectors > 0) ? eigenvector_Re[0].dimension(1) : 0;
00055 }
00056
00057
00058
00059 template<typename EvalT, typename Traits>
00060 void GatherEigenvectors<EvalT,Traits>::
00061 evaluateFields(typename Traits::EvalData workset)
00062 {
00063 if(nEigenvectors == 0) return;
00064
00065 if(workset.eigenDataPtr->eigenvectorRe != Teuchos::null) {
00066 if(workset.eigenDataPtr->eigenvectorIm != Teuchos::null) {
00067
00068
00069 const Epetra_MultiVector& e_r = *(workset.eigenDataPtr->eigenvectorRe);
00070 const Epetra_MultiVector& e_i = *(workset.eigenDataPtr->eigenvectorIm);
00071 int numVecsInWorkset = std::min(e_r.NumVectors(),e_i.NumVectors());
00072 int numVecsToGather = std::min(numVecsInWorkset, (int)nEigenvectors);
00073
00074 for (std::size_t cell=0; cell < workset.numCells; ++cell ) {
00075 const Teuchos::ArrayRCP<Teuchos::ArrayRCP<int> >& nodeID = workset.wsElNodeEqID[cell];
00076
00077 for(std::size_t node =0; node < this->numNodes; ++node) {
00078 int offsetIntoVec = nodeID[node][0];
00079
00080 for (std::size_t k = 0; k < numVecsToGather; ++k) {
00081 (this->eigenvector_Re[k])(cell,node) = (*(e_r(k)))[offsetIntoVec];
00082 (this->eigenvector_Im[k])(cell,node) = (*(e_i(k)))[offsetIntoVec];
00083 }
00084 }
00085 }
00086 }
00087 else {
00088
00089
00090 const Epetra_MultiVector& e_r = *(workset.eigenDataPtr->eigenvectorRe);
00091 int numVecsInWorkset = e_r.NumVectors();
00092 int numVecsToGather = std::min(numVecsInWorkset, (int)nEigenvectors);
00093
00094 for (std::size_t cell=0; cell < workset.numCells; ++cell ) {
00095 const Teuchos::ArrayRCP<Teuchos::ArrayRCP<int> >& nodeID = workset.wsElNodeEqID[cell];
00096
00097 for(std::size_t node =0; node < this->numNodes; ++node) {
00098 int offsetIntoVec = nodeID[node][0];
00099
00100 for (std::size_t k = 0; k < numVecsToGather; ++k) {
00101 (this->eigenvector_Re[k])(cell,node) = (*(e_r(k)))[offsetIntoVec];
00102 (this->eigenvector_Im[k])(cell,node) = 0.0;
00103 }
00104 }
00105 }
00106 }
00107 }
00108
00109 }
00110
00111
00112
00113 }