139 typename TRAITS::PreEvalData d)
141 using std::logic_error;
144 using Teuchos::rcp_dynamic_cast;
167 xEvRoGed_ = rcp_dynamic_cast<EVROGED>(ged,
true);
176 xEvRoGed_ = rcp_dynamic_cast<EVROGED>(ged);
177 auto epetraContainer = rcp_dynamic_cast<ELOC>(ged);
181 auto locPair = rcp_dynamic_cast<LPGED>(ged);
182 if (not locPair.is_null())
184 RCP<LOC> loc = locPair->getGhostedLOC();
185 epetraContainer = rcp_dynamic_cast<ELOC>(loc);
188 if ((
xEvRoGed_.is_null()) and (not epetraContainer.is_null()))
191 x_ = epetraContainer->get_dxdt();
193 x_ = epetraContainer->get_x();
198 TEUCHOS_TEST_FOR_EXCEPTION((
x_.is_null()) and (
xEvRoGed_.is_null()),
199 logic_error,
"GatherSolution_Epetra_Hessian::preEvaluate(): Unable to " \
200 "find solution vector.")
210 dxEvRoGed_ = rcp_dynamic_cast<EVROGED>(ged,
true);
213 TEUCHOS_TEST_FOR_EXCEPTION(
dxEvRoGed_.is_null(), logic_error,
"Cannot " \
228 typename TRAITS::EvalData workset)
234 using Teuchos::ArrayRCP;
235 using Teuchos::ptrFromRef;
237 using Teuchos::rcp_dynamic_cast;
238 using Thyra::SpmdVectorBase;
241 string blockId(this->
wda(workset).block_id);
242 const vector<size_t>& localCellIds = this->
wda(workset).cell_local_ids;
243 int numFields(
gatherFields_.size()), numCells(localCellIds.size());
250 seedValue = workset.alpha;
252 seedValue = workset.beta;
256 TEUCHOS_ASSERT(
false);
269 if (this->
wda.getDetailsIndex() == 1)
272 dos =
globalIndexer_->getElementBlockGIDCount(workset.details(0).block_id);
278 for (
int fieldIndex(0); fieldIndex < numFields; ++fieldIndex)
280 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldIndex];
282 const vector<int>& elmtOffset =
284 int numBases(elmtOffset.size());
287 for (
int cell(0); cell < numCells; ++cell)
289 size_t cellLocalId(localCellIds[cell]);
293 for (
int basis(0); basis < numBases; ++basis)
295 int offset(elmtOffset[basis]), lid(LIDs[offset]);
296 field(cell, basis) = (*xEvRoGed_)[lid];
304 for (
int fieldIndex(0); fieldIndex < numFields; ++fieldIndex)
306 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldIndex];
308 const vector<int>& elmtOffset =
310 int numBases(elmtOffset.size());
313 for (
int cell(0); cell < numCells; ++cell)
315 size_t cellLocalId(localCellIds[cell]);
319 for (
int basis(0); basis < numBases; ++basis)
321 int offset(elmtOffset[basis]), lid(LIDs[offset]);
322 field(cell, basis) = (*x_)[lid];
332 for (
int fieldIndex(0); fieldIndex < numFields; ++fieldIndex)
334 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldIndex];
336 const vector<int>& elmtOffset =
338 int numBases(elmtOffset.size());
341 for (
int cell(0); cell < numCells; ++cell)
344 for (
int basis(0); basis < numBases; ++basis)
346 int offset(elmtOffset[basis]);
347 field(cell, basis).fastAccessDx(dos + offset) = seedValue;
357 for (
int fieldIndex(0); fieldIndex < numFields; ++fieldIndex)
359 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldIndex];
361 const vector<int>& elmtOffset =
363 int numBases(elmtOffset.size());
366 for (
int cell(0); cell < numCells; ++cell)
368 size_t cellLocalId(localCellIds[cell]);
372 for (
int basis(0); basis < numBases; ++basis)
374 int offset(elmtOffset[basis]), lid(LIDs[offset]);
375 field(cell, basis).val().fastAccessDx(0) = (*dxEvRoGed_)[lid];