167 typename TRAITS::PreEvalData d)
170 using std::logic_error;
173 using Teuchos::rcp_dynamic_cast;
174 using Teuchos::typeName;
190 RCP<GlobalEvaluationData> ged;
195 xBvRoGed_ = rcp_dynamic_cast<BVROGED>(ged,
true);
204 auto roGed = rcp_dynamic_cast<const BVROGED>(ged);
205 auto blockedContainer = rcp_dynamic_cast<const BELOC>(ged);
206 if (not roGed.is_null())
207 xBvRoGed_ = rcp_dynamic_cast<BVROGED>(ged,
true);
208 else if (not blockedContainer.is_null())
211 x_ = rcp_dynamic_cast<ProductVectorBase<double>>
212 (blockedContainer->get_dxdt());
214 x_ = rcp_dynamic_cast<ProductVectorBase<double>>
215 (blockedContainer->get_x());
220 TEUCHOS_ASSERT((not
x_.is_null()) or (not
xBvRoGed_.is_null()))
230 dxBvRoGed_ = rcp_dynamic_cast<BVROGED>(ged,
true);
234 TEUCHOS_TEST_FOR_EXCEPTION(
dxBvRoGed_.is_null(), logic_error,
235 "Cannot find sensitivity vector associated with \"" +
248 typename TRAITS::EvalData workset)
254 using Teuchos::ArrayRCP;
255 using Teuchos::ptrFromRef;
257 using Teuchos::rcp_dynamic_cast;
259 using Thyra::SpmdVectorBase;
263 string blockId(this->
wda(workset).block_id);
264 const vector<size_t>& localCellIds = this->
wda(workset).cell_local_ids;
265 int numFields(
gatherFields_.size()), numCells(localCellIds.size());
270 seedValue = workset.alpha;
272 seedValue = workset.beta;
276 TEUCHOS_ASSERT(
false);
285 vector<int> blockOffsets;
290 for (
int fieldInd(0); fieldInd < numFields; ++fieldInd)
292 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldInd];
297 auto xEvRoGed =
xBvRoGed_->getGEDBlock(indexerId);
298 auto subRowIndexer =
indexers_[indexerId];
299 const vector<int>& elmtOffset =
300 subRowIndexer->getGIDFieldOffsets(blockId, subFieldNum);
301 int numBases(elmtOffset.size());
304 for (
int cell(0); cell < numCells; ++cell)
306 size_t cellLocalId(localCellIds[cell]);
307 auto LIDs = subRowIndexer->getElementLIDs(cellLocalId);
310 for (
int basis(0); basis < numBases; ++basis)
312 int offset(elmtOffset[basis]), lid(LIDs[offset]);
313 field(cell, basis) = (*xEvRoGed)[lid];
321 for (
int fieldInd(0); fieldInd < numFields; ++fieldInd)
323 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldInd];
328 ArrayRCP<const double> x;
329 rcp_dynamic_cast<SpmdVectorBase<double>>(
x_->
330 getNonconstVectorBlock(indexerId))->getLocalData(ptrFromRef(x));
331 auto subRowIndexer =
indexers_[indexerId];
332 const vector<int>& elmtOffset =
333 subRowIndexer->getGIDFieldOffsets(blockId, subFieldNum);
334 int numBases(elmtOffset.size());
337 for (
int cell(0); cell < numCells; ++cell)
339 size_t cellLocalId(localCellIds[cell]);
340 auto LIDs = subRowIndexer->getElementLIDs(cellLocalId);
343 for (
int basis(0); basis < numBases; ++basis)
345 int offset(elmtOffset[basis]), lid(LIDs[offset]);
346 field(cell, basis) = x[lid];
356 for (
int fieldInd(0); fieldInd < numFields; ++fieldInd)
358 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldInd];
361 auto subRowIndexer =
indexers_[indexerId];
362 const vector<int>& elmtOffset =
363 subRowIndexer->getGIDFieldOffsets(blockId, subFieldNum);
364 int startBlkOffset(blockOffsets[indexerId]),
365 numBases(elmtOffset.size());
368 for (
int cell(0); cell < numCells; ++cell)
371 for (
int basis(0); basis < numBases; ++basis)
373 int offset(elmtOffset[basis]);
374 field(cell, basis).fastAccessDx(startBlkOffset + offset) = seedValue;
384 for (
int fieldInd(0); fieldInd < numFields; ++fieldInd)
386 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldInd];
391 auto dxEvRoGed =
dxBvRoGed_->getGEDBlock(indexerId);
392 auto subRowIndexer =
indexers_[indexerId];
393 const vector<int>& elmtOffset =
394 subRowIndexer->getGIDFieldOffsets(blockId, subFieldNum);
395 int numBases(elmtOffset.size());
398 for (
int cell(0); cell < numCells; ++cell)
400 size_t cellLocalId(localCellIds[cell]);
401 auto LIDs = subRowIndexer->getElementLIDs(cellLocalId);
404 for (
int basis(0); basis < numBases; ++basis)
406 int offset(elmtOffset[basis]), lid(LIDs[offset]);
407 field(cell, basis).val().fastAccessDx(0) = (*dxEvRoGed)[lid];