135 typename TRAITS::PreEvalData d)
138 using std::logic_error;
141 using Teuchos::rcp_dynamic_cast;
142 using Teuchos::typeName;
158 RCP<GlobalEvaluationData> ged;
163 xBvRoGed_ = rcp_dynamic_cast<BVROGED>(ged,
true);
172 auto roGed = rcp_dynamic_cast<const BVROGED>(ged);
173 auto blockedContainer = rcp_dynamic_cast<const BELOC>(ged);
174 if (not roGed.is_null())
175 xBvRoGed_ = rcp_dynamic_cast<BVROGED>(ged,
true);
176 else if (not blockedContainer.is_null())
179 x_ = rcp_dynamic_cast<ProductVectorBase<double>>
180 (blockedContainer->get_dxdt());
182 x_ = rcp_dynamic_cast<ProductVectorBase<double>>
183 (blockedContainer->get_x());
188 TEUCHOS_ASSERT((not
x_.is_null()) or (not
xBvRoGed_.is_null()))
198 dxBvRoGed_ = rcp_dynamic_cast<BVROGED>(ged,
true);
202 TEUCHOS_TEST_FOR_EXCEPTION(
dxBvRoGed_.is_null(), logic_error,
203 "Cannot find sensitivity vector associated with \"" +
216 typename TRAITS::EvalData workset)
222 using Teuchos::ArrayRCP;
223 using Teuchos::ptrFromRef;
225 using Teuchos::rcp_dynamic_cast;
227 using Thyra::SpmdVectorBase;
231 string blockId(this->
wda(workset).block_id);
232 const vector<size_t>& localCellIds = this->
wda(workset).cell_local_ids;
233 int numFields(
gatherFields_.size()), numCells(localCellIds.size());
238 seedValue = workset.alpha;
240 seedValue = workset.beta;
244 TEUCHOS_ASSERT(
false);
253 vector<int> blockOffsets;
258 for (
int fieldInd(0); fieldInd < numFields; ++fieldInd)
260 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldInd];
265 auto xEvRoGed =
xBvRoGed_->getGEDBlock(indexerId);
266 auto subRowIndexer =
indexers_[indexerId];
267 const vector<int>& elmtOffset =
268 subRowIndexer->getGIDFieldOffsets(blockId, subFieldNum);
269 int numBases(elmtOffset.size());
272 for (
int cell(0); cell < numCells; ++cell)
274 size_t cellLocalId(localCellIds[cell]);
275 auto LIDs = subRowIndexer->getElementLIDs(cellLocalId);
278 for (
int basis(0); basis < numBases; ++basis)
280 int offset(elmtOffset[basis]), lid(LIDs[offset]);
281 field(cell, basis) = (*xEvRoGed)[lid];
289 for (
int fieldInd(0); fieldInd < numFields; ++fieldInd)
291 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldInd];
296 ArrayRCP<const double> x;
297 rcp_dynamic_cast<SpmdVectorBase<double>>(
x_->
298 getNonconstVectorBlock(indexerId))->getLocalData(ptrFromRef(x));
299 auto subRowIndexer =
indexers_[indexerId];
300 const vector<int>& elmtOffset =
301 subRowIndexer->getGIDFieldOffsets(blockId, subFieldNum);
302 int numBases(elmtOffset.size());
305 for (
int cell(0); cell < numCells; ++cell)
307 size_t cellLocalId(localCellIds[cell]);
308 auto LIDs = subRowIndexer->getElementLIDs(cellLocalId);
311 for (
int basis(0); basis < numBases; ++basis)
313 int offset(elmtOffset[basis]), lid(LIDs[offset]);
314 field(cell, basis) = x[lid];
324 for (
int fieldInd(0); fieldInd < numFields; ++fieldInd)
326 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldInd];
329 auto subRowIndexer =
indexers_[indexerId];
330 const vector<int>& elmtOffset =
331 subRowIndexer->getGIDFieldOffsets(blockId, subFieldNum);
332 int startBlkOffset(blockOffsets[indexerId]),
333 numBases(elmtOffset.size());
336 for (
int cell(0); cell < numCells; ++cell)
339 for (
int basis(0); basis < numBases; ++basis)
341 int offset(elmtOffset[basis]);
342 field(cell, basis).fastAccessDx(startBlkOffset + offset) = seedValue;
352 for (
int fieldInd(0); fieldInd < numFields; ++fieldInd)
354 MDField<ScalarT, Cell, NODE>& field =
gatherFields_[fieldInd];
359 auto dxEvRoGed =
dxBvRoGed_->getGEDBlock(indexerId);
360 auto subRowIndexer =
indexers_[indexerId];
361 const vector<int>& elmtOffset =
362 subRowIndexer->getGIDFieldOffsets(blockId, subFieldNum);
363 int numBases(elmtOffset.size());
366 for (
int cell(0); cell < numCells; ++cell)
368 size_t cellLocalId(localCellIds[cell]);
369 auto LIDs = subRowIndexer->getElementLIDs(cellLocalId);
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];