43 #ifdef PANZER_HAVE_TEKO 50 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
51 ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::ParameterListCallbackBlocked(
54 : connManager_(connManager), blocked_ugi_(blocked_ugi)
58 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
59 Teuchos::RCP<Teuchos::ParameterList>
60 ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::request(
const Teko::RequestMesg & rm)
62 TEUCHOS_ASSERT(handlesRequest(rm));
65 Teuchos::RCP<Teuchos::ParameterList> outputPL = rcp(
new Teuchos::ParameterList);
66 Teuchos::RCP<const Teuchos::ParameterList> inputPL = rm.getParameterList();
67 Teuchos::ParameterList::ConstIterator itr;
68 for(itr=inputPL->begin();itr!=inputPL->end();++itr) {
69 std::string * str_ptr = 0;
70 std::string
field = inputPL->entry(itr).getValue(str_ptr);
71 setFieldByKey(itr->first,
field,*outputPL);
77 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
78 bool ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::handlesRequest(
const Teko::RequestMesg & rm)
82 if(rm.getName()==
"Parameter List") {
83 bool isHandled =
true;
84 Teuchos::RCP<const Teuchos::ParameterList> pl = rm.getParameterList();
86 if(pl->isType<std::string>(
"x-coordinates")) {
87 field = pl->get<std::string>(
"x-coordinates");
92 if(pl->isType<std::string>(
"y-coordinates")) {
94 if(
field != pl->get<std::string>(
"y-coordinates")) {
98 if(pl->isType<std::string>(
"z-coordinates")) {
100 if(
field != pl->get<std::string>(
"z-coordinates")) {
104 if(pl->isType<std::string>(
"Coordinates")){
105 field = pl->get<std::string>(
"Coordinates");
113 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
114 void ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::preRequest(
const Teko::RequestMesg & rm)
116 TEUCHOS_ASSERT(handlesRequest(rm));
118 const std::string &
field = getHandledField(*rm.getParameterList());
119 int block = blocked_ugi_->getFieldBlock(blocked_ugi_->getFieldNum(
field));
122 buildArrayToVector(block,
field);
123 buildCoordinates(
field);
126 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
127 void ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::setFieldByKey(
const std::string & key,
const std::string &
field,Teuchos::ParameterList & pl)
const 130 if(key==
"x-coordinates") {
131 double * x =
const_cast<double *
>(&getCoordinateByField(0,
field)[0]);
132 pl.set<
double*>(key,x);
134 else if(key==
"y-coordinates") {
135 double * y =
const_cast<double *
>(&getCoordinateByField(1,
field)[0]);
136 pl.set<
double*>(key,y);
138 else if(key==
"z-coordinates") {
139 double * z =
const_cast<double *
>(&getCoordinateByField(2,
field)[0]);
140 pl.set<
double*>(key,z);
141 }
else if(key ==
"Coordinates") {
142 pl.set<Teuchos::RCP<Tpetra::MultiVector<double,int,GlobalOrdinalT,Node> > >(
"Coordinates",coordsVec_);
145 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::runtime_error,
146 "ParameterListCallback cannot handle key=\"" << key <<
"\"");
149 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
150 void ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::buildArrayToVector(
int block,
const std::string &
field)
152 if(arrayToVector_[
field]==Teuchos::null) {
153 Teuchos::RCP<const panzer::UniqueGlobalIndexer<LocalOrdinalT,GlobalOrdinalT> > ugi = blocked_ugi_->getFieldDOFManagers()[block];
158 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
159 void ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::buildCoordinates(
const std::string &
field)
161 std::map<std::string,Kokkos::DynRankView<double,PHX::Device> > data;
163 Teuchos::RCP<const panzer::Intrepid2FieldPattern> fieldPattern = getFieldPattern(
field);
165 std::vector<std::string> elementBlocks;
166 blocked_ugi_->getElementBlockIds(elementBlocks);
167 for(std::size_t i=0;i<elementBlocks.size();++i) {
168 std::string blockId = elementBlocks[i];
169 std::vector<std::size_t> localCellIds;
172 Kokkos::DynRankView<double,PHX::Device> & fieldData = data[blockId];
173 fieldData = Kokkos::DynRankView<double,PHX::Device>(
"fieldData",connManager_->getElementBlock(blockId).size(),fieldPattern->numberIds());
175 if(fieldPattern->supportsInterpolatoryCoordinates()) {
177 connManager_->getDofCoords(blockId,*fieldPattern,localCellIds,fieldData);
180 Teuchos::FancyOStream out(Teuchos::rcpFromRef(std::cout));
181 out.setOutputToRootOnly(-1);
182 out <<
"WARNING: In ParameterListCallback::buildCoordinates(), the Intrepid2::FieldPattern in " 183 <<
"block \"" << blockId <<
"\" does not support interpolatory coordinates. " 184 <<
"This may be fine if coordinates are not actually needed. However if they are then bad things " 185 <<
"will happen. Enjoy!" << std::endl;
191 coordsVec_ = arrayToVector_[
field]->template getDataVector<double>(
field,data);
193 switch(coordsVec_->getNumVectors()) {
195 zcoords_[
field].resize(coordsVec_->getLocalLength());
196 coordsVec_->getVector(2)->get1dCopy(Teuchos::arrayViewFromVector(zcoords_[
field]));
198 ycoords_[
field].resize(coordsVec_->getLocalLength());
199 coordsVec_->getVector(1)->get1dCopy(Teuchos::arrayViewFromVector(ycoords_[
field]));
201 xcoords_[
field].resize(coordsVec_->getLocalLength());
202 coordsVec_->getVector(0)->get1dCopy(Teuchos::arrayViewFromVector(xcoords_[
field]));
205 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
206 "ParameterListCallback::buildCoordinates: Constructed multivector has nonphysical dimensions.");
211 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
212 std::string ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::
213 getHandledField(
const Teuchos::ParameterList & pl)
const 216 if(pl.isType<std::string>(
"x-coordinates"))
217 return pl.get<std::string>(
"x-coordinates");
218 else if(pl.isType<std::string>(
"Coordinates"))
219 return pl.get<std::string>(
"Coordinates");
221 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Neither x-coordinates not Coordinates field provided.");
225 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
226 const std::vector<double> & ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>::
227 getCoordinateByField(
int dim,
const std::string &
field)
const 229 TEUCHOS_ASSERT(dim>=0);
230 TEUCHOS_ASSERT(dim<=2);
233 const std::map<std::string,std::vector<double> > * coord;
234 if(dim==0) coord = &xcoords_;
235 else if(dim==1) coord = &ycoords_;
236 else if(dim==2) coord = &zcoords_;
238 std::map<std::string,std::vector<double> >::const_iterator itr;
239 itr = coord->find(
field);
241 TEUCHOS_TEST_FOR_EXCEPTION(itr==coord->end(),std::runtime_error,
242 "ParameterListCallbackBlocked::getCoordinateByField: Coordinates for field \"" +
field +
243 "\" dimension " << dim <<
" have not been built!");
248 template <
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename Node>
249 Teuchos::RCP<const panzer::Intrepid2FieldPattern> ParameterListCallbackBlocked<LocalOrdinalT,GlobalOrdinalT,Node>
250 ::getFieldPattern(
const std::string & fieldName)
const 252 std::vector<std::string> elementBlocks;
253 blocked_ugi_->getElementBlockIds(elementBlocks);
255 for(std::size_t e=0;e<elementBlocks.size();e++) {
256 std::string blockId = elementBlocks[e];
258 if(blocked_ugi_->fieldInBlock(fieldName,blockId))
259 return Teuchos::rcp_dynamic_cast<const panzer::Intrepid2FieldPattern>(blocked_ugi_->getFieldPattern(blockId,fieldName),
true);
262 return Teuchos::null;
PHX::MDField< const ScalarT, Cell, IP > field