• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

PHAL_GatherEigenvectors_Def.hpp

Go to the documentation of this file.
00001 //*****************************************************************//
00002 //    Albany 2.0:  Copyright 2012 Sandia Corporation               //
00003 //    This Software is released under the BSD license detailed     //
00004 //    in the file "license.txt" in the top-level Albany directory  //
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       //Gather real and imaginary parts from workset Eigendata info structure
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]; // neq==1 hardwired
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 { // Only real parts of eigenvectors is given -- "gather" zeros into imaginary fields
00088 
00089       //Gather real and imaginary parts from workset Eigendata info structure
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]; // neq==1 hardwired
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   // else (if both Re and Im are null) gather zeros into both??
00109 }
00110 
00111 // **********************************************************************
00112 
00113 }

Generated on Wed Mar 26 2014 18:36:41 for Albany: a Trilinos-based PDE code by  doxygen 1.7.1