Panzer  Version of the Day
Panzer_TpetraVector_ReadOnly_GlobalEvaluationData_impl.hpp
Go to the documentation of this file.
1 #ifndef __Panzer_TpetraVector_ReadOnly_GlobalEvaluationData_impl_hpp__
2 #define __Panzer_TpetraVector_ReadOnly_GlobalEvaluationData_impl_hpp__
3 
4 #include "Thyra_TpetraThyraWrappers.hpp"
5 
6 namespace panzer {
7 
8 using Teuchos::RCP;
9 
10 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
11 void
13 useConstantValues(const std::vector<GlobalOrdinalT> & indices,double value)
14 {
15  TEUCHOS_TEST_FOR_EXCEPTION(isInitialized_,std::logic_error,
16  "TpetraVector_ReadOnly_GED has been initialized, cannot call \"useConstantValues\"!");
17 
18  // add this specification to the filtered pairs vector
19  FilteredGlobalPair pair;
20  pair.first = indices;
21  pair.second = value;
22  globalFilteredPairs_.push_back(pair);
23 }
24 
25 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
26 void
29  const RCP<const MapType>& ghostedMap,
30  const RCP<const MapType>& ownedMap)
31 {
32  importer_ = importer;
33  ghostedMap_ = ghostedMap;
34  ownedMap_ = ownedMap;
35 
36  // allocate the ghosted vector
37  ghostedVector_ = Teuchos::rcp(new VectorType(ghostedMap_));
38 
39  // build up the thyra conversion data structures
40  ghostedSpace_ = Thyra::tpetraVectorSpace<ScalarT, LocalOrdinalT,
41  GlobalOrdinalT, NodeT>(ghostedMap_);
42  ownedSpace_ = Thyra::tpetraVectorSpace<ScalarT, LocalOrdinalT,
43  GlobalOrdinalT, NodeT>(ownedMap_);
44 
45 
46  // translate filtered pair GIDs to LIDs
47  // initialize some ghosted values to the user specified values
48  filteredPairs_.resize(globalFilteredPairs_.size());
49  for(std::size_t i=0;i<globalFilteredPairs_.size();i++) {
50  std::vector<LocalOrdinalT> lids;
51  const std::vector<GlobalOrdinalT> & gids = globalFilteredPairs_[i].first;
52  for(std::size_t j=0;j<gids.size();j++) {
53  LocalOrdinalT lid = ghostedMap->getLocalElement(gids[j]);
54 
55  // add legit LIDs to list
56  if(lid>=0)
57  lids.push_back(lid);
58  }
59 
60  // convert original GID vector to LID vector, store value as well
61  filteredPairs_[i].first = lids;
62  filteredPairs_[i].second = globalFilteredPairs_[i].second;
63  }
64 
65  isInitialized_ = true;
66 }
67 
68 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
69 void
71 globalToGhost(int mem)
72 {
73  TEUCHOS_TEST_FOR_EXCEPTION(ownedVector_ == Teuchos::null, std::logic_error,
74  "Owned vector has not been set, can't perform the halo exchange!");
75 
76  // Initialize the ghosted data, zeroing out things, and filling in specified
77  // constants.
78  initializeData();
79 
80  // Do the global distribution.
81  ghostedVector_->doImport(*ownedVector_, *importer_, Tpetra::INSERT);
82 }
83 
84 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
85 void
88 {
89  TEUCHOS_TEST_FOR_EXCEPTION(!isInitialized_,std::logic_error,
90  "TpetraVector_ReadOnly_GED has not been initialized, cannot call \"initializeData\"!");
91 
92  ghostedVector_->putScalar(0.0);
93 
94  typedef typename VectorType::dual_view_type::t_dev::memory_space DMS;
95  auto values_2d = ghostedVector_->template getLocalView<DMS>();
96  auto values = Kokkos::subview(values_2d, Kokkos::ALL (), 0);
97 
98  // initialize some ghosted values to the user specified values
99  for(std::size_t i=0;i<filteredPairs_.size();i++) {
100  const std::vector<int> & lids = filteredPairs_[i].first;
101  double value = filteredPairs_[i].second;
102  for(std::size_t j=0;j<lids.size();j++)
103  values(lids[j]) = value;
104  }
105 }
106 
107 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
108 void
111 {
112  TEUCHOS_ASSERT(isInitialized_);
113  ownedVector_ = ownedVector;
114 }
115 
116 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
120 {
121  TEUCHOS_ASSERT(isInitialized_);
122  return ownedVector_;
123 }
124 
125 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
129 {
130  TEUCHOS_ASSERT(isInitialized_);
131  TEUCHOS_ASSERT(ghostedVector_!=Teuchos::null);
132 
133  return ghostedVector_;
134 }
135 
136 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
137 void
140  ownedVector)
141 {
142  typedef Thyra::TpetraOperatorVectorExtraction<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> TOE;
143  TEUCHOS_ASSERT(isInitialized_);
144  ownedVector_ = TOE::getConstTpetraVector(ownedVector);
145 }
146 
147 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
151 {
152  TEUCHOS_ASSERT(isInitialized_);
153  return (ownedVector_ == Teuchos::null) ? Teuchos::null :
154  Thyra::createConstVector(ownedVector_, ownedSpace_);
155 }
156 
157 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
161 {
162  TEUCHOS_ASSERT(isInitialized_);
163  TEUCHOS_ASSERT(ghostedVector_!=Teuchos::null);
164 
165  return Thyra::createVector(ghostedVector_,ghostedSpace_);
166 }
167 
168 template <typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT>
169 void
171 print(std::ostream & os) const
172 {
173  const std::string tab = " ";
174  os << "\n";
175  os << tab << "TpetraVector_ReadOnly_GlobalEvaluationData\n"
176  << tab << " init = " << isInitialized_ << "\n"
177  << tab << " owned = " << ownedVector_ << "\n"
178  << tab << " ghosted = " << ghostedVector_ << "\n";
179 }
180 
181 
182 }
183 
184 #endif
Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > VectorType
void setOwnedVector(const Teuchos::RCP< const Thyra::VectorBase< double > > &ownedVector)
Set the owned vector (Thyra version)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void useConstantValues(const std::vector< GlobalOrdinalT > &indices, double value)
Kokkos::View< const LO **, PHX::Device > lids
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
std::vector< ScalarT > values
Teuchos::RCP< const VectorType > getOwnedVector_Tpetra() const
Get the owned vector (Tpetra version)
Teuchos::RCP< Thyra::VectorBase< double > > getGhostedVector() const
Get the ghosted vector (Thyra version)
Teuchos::RCP< VectorType > getGhostedVector_Tpetra() const
Get the ghosted vector (Tpetra version)
void setOwnedVector_Tpetra(const Teuchos::RCP< const VectorType > &ownedVector)
Set the owned vector (Tpetra version)
Teuchos::RCP< const Thyra::VectorBase< double > > getOwnedVector() const
Get the owned vector (Thyra version)
#define TEUCHOS_ASSERT(assertion_test)
void initialize(const Teuchos::RCP< const ImportType > &importer, const Teuchos::RCP< const MapType > &ghostedMap, const Teuchos::RCP< const MapType > &ownedMap)