43 #ifndef __Panzer_Response_Probe_impl_hpp__
44 #define __Panzer_Response_Probe_impl_hpp__
46 #include "Teuchos_Comm.hpp"
47 #include "Teuchos_CommHelpers.hpp"
48 #include "Teuchos_dyn_cast.hpp"
50 #include "Epetra_LocalMap.h"
52 #include "Sacado_Traits.hpp"
56 template <
typename EvalT>
61 have_probe(false), linObjFactory_(linObjFact)
76 template <
typename EvalT>
83 if(ghostedContainer_!=Teuchos::null) ghostedContainer_->initialize();
86 template <
typename EvalT>
90 double glbValue = Sacado::ScalarValue<ScalarT>::eval(value);
93 int locProc = have_probe ? this->getComm()->getRank() : this->getComm()->getSize();
95 Teuchos::reduceAll(*this->getComm(),
Teuchos::REDUCE_MIN, Thyra::Ordinal(1), &locProc, &glbProc);
100 Teuchos::broadcast(*this->getComm(), glbProc, Thyra::Ordinal(1), &glbValue);
105 if(this->useEpetra()) {
107 this->getEpetraVector()[0] = glbValue;
113 this->getThyraVector()[0] = glbValue;
121 using Teuchos::rcp_dynamic_cast;
125 uniqueContainer_ = linObjFactory_->buildLinearObjContainer();
130 uniqueContainer_ = Teuchos::null;
133 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
138 using Teuchos::rcp_dynamic_cast;
142 uniqueContainer_ = linObjFactory_->buildLinearObjContainer();
147 uniqueContainer_ = Teuchos::null;
155 const int n = value.size();
156 const int num_deriv = this->numDeriv();
159 value.resize(num_deriv);
163 int locProc = have_probe ? this->getComm()->getRank() : this->getComm()->getSize();
165 Teuchos::reduceAll(*this->getComm(),
Teuchos::REDUCE_MIN, Thyra::Ordinal(1), &locProc, &glbProc);
170 Teuchos::broadcast(*this->getComm(), glbProc, Thyra::Ordinal(num_deriv), &value.fastAccessDx(0));
174 if(this->useEpetra()) {
177 for (
int i=0; i<num_deriv; ++i)
178 deriv[i][0] = value.dx(i);
183 Thyra::ArrayRCP< Thyra::ArrayRCP<double> > deriv = this->getThyraMultiVector();
184 for (
int i=0; i<num_deriv; ++i)
185 deriv[i][0] = value.dx(i);
190 template <
typename EvalT>
199 setDerivativeVectorSpace(soln_vs);
202 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
208 setDerivativeVectorSpace(soln_vs);
213 template <
typename EvalT>
222 linObjFactory_->adjustForDirichletConditions(Teuchos::dyn_cast<const LinearObjContainer>(localBCRows),
223 Teuchos::dyn_cast<const LinearObjContainer>(globalBCRows),
224 *ghostedContainer_,
true,
true);
227 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
233 linObjFactory_->adjustForDirichletConditions(Teuchos::dyn_cast<const LinearObjContainer>(localBCRows),
234 Teuchos::dyn_cast<const LinearObjContainer>(globalBCRows),
235 *ghostedContainer_,
true,
true);
virtual void scatterResponse()
This simply does global summation, then shoves the result into a vector.
Teuchos::RCP< LinearObjContainer > ghostedContainer_
Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > linObjFactory_
void adjustForDirichletConditions(const GlobalEvaluationData &localBCRows, const GlobalEvaluationData &globalBCRows)
Teuchos::RCP< const panzer::ThyraObjFactory< double > > thyraObjFactory_
void setSolnVectorSpace(const Teuchos::RCP< const Thyra::VectorSpaceBase< double > > &soln_vs)
Set solution vector space.
virtual void initializeResponse()
#define TEUCHOS_ASSERT(assertion_test)