void Response_Functional<panzer::Traits::Tangent>:: scatterResponse() { const int n = value.size(); const int num_deriv = this->numDeriv(); TEUCHOS_ASSERT(n == 0 || n == num_deriv); ScalarT glbValue = ScalarT(num_deriv, 0.0); // do global summation -- it is possible to do the reduceAll() on the Fad's directly, but it is somewhat // complicated for DFad (due to temporaries that might get created). Since this is just a sum, it is // easier to do the reduction for each value and derivative component. Teuchos::reduceAll(*this->getComm(), Teuchos::REDUCE_SUM, Thyra::Ordinal(1), &value.val(), &glbValue.val()); if (num_deriv > 0) Teuchos::reduceAll(*this->getComm(), Teuchos::REDUCE_SUM, Thyra::Ordinal(n), value.dx(), &glbValue.fastAccessDx(0)); value = glbValue; // copy data in vectors if(this->useEpetra()) { // use epetra Epetra_MultiVector& deriv = this->getEpetraMultiVector(); for (int i=0; i<num_deriv; ++i) deriv[i][0] = glbValue.dx(i); } else { // use thyra TEUCHOS_ASSERT(this->useThyra()); Thyra::ArrayRCP< Thyra::ArrayRCP<double> > deriv = this->getThyraMultiVector(); for (int i=0; i<num_deriv; ++i) deriv[i][0] = glbValue.dx(i); } }
void EquilibriumConcentrationBC<PHAL::AlbanyTraits::Tangent, Traits>:: evaluateFields(typename Traits::EvalData dirichletWorkset) { Teuchos::RCP<Tpetra_Vector> fT = dirichletWorkset.fT; Teuchos::RCP<Tpetra_MultiVector> fpT = dirichletWorkset.fpT; Teuchos::RCP<Tpetra_MultiVector> JVT = dirichletWorkset.JVT; Teuchos::RCP<const Tpetra_Vector> xT = dirichletWorkset.xT; Teuchos::RCP<const Tpetra_MultiVector> VxT = dirichletWorkset.VxT; Teuchos::ArrayRCP<const ST> VxT_constView; Teuchos::ArrayRCP<ST> fT_nonconstView; if (fT != Teuchos::null) fT_nonconstView = fT->get1dViewNonConst(); Teuchos::ArrayRCP<const ST> xT_constView = xT->get1dView(); const RealType j_coeff = dirichletWorkset.j_coeff; const std::vector<std::vector<int>>& nsNodes = dirichletWorkset.nodeSets->find(this->nodeSetID)->second; int cunk, punk; ScalarT Cval; ScalarT pressure; for (unsigned int inode = 0; inode < nsNodes.size(); inode++) { cunk = nsNodes[inode][this->coffset_]; punk = nsNodes[inode][this->poffset_]; pressure = xT_constView[punk]; this->computeBCs(pressure, Cval); if (fT != Teuchos::null) { fT_nonconstView[cunk] = xT_constView[cunk] - Cval.val(); } if (JVT != Teuchos::null) { Teuchos::ArrayRCP<ST> JVT_nonconstView; for (int i=0; i<dirichletWorkset.num_cols_x; i++) { JVT_nonconstView = JVT->getDataNonConst(i); VxT_constView = VxT->getData(i); JVT_nonconstView[cunk] = j_coeff*VxT_constView[cunk]; } } if (fpT != Teuchos::null) { Teuchos::ArrayRCP<ST> fpT_nonconstView; for (int i=0; i<dirichletWorkset.num_cols_p; i++) { fpT_nonconstView = fpT->getDataNonConst(i); fpT_nonconstView[cunk] = -Cval.dx(dirichletWorkset.param_offset+i); } } } }