void XZHydrostatic_TemperatureResid<EvalT, Traits>:: evaluateFields(typename Traits::EvalData workset) { PHAL::set(Residual, 0.0); for (int cell=0; cell < workset.numCells; ++cell) { for (int node=0; node < numNodes; ++node) { for (int level=0; level < numLevels; ++level) { for (int qp=0; qp < numQPs; ++qp) { for (int dim=0; dim < numDims; ++dim) Residual(cell,node,level) += velx(cell,qp,level,dim)*temperatureGrad(cell,qp,level,dim)*wBF(cell,node,qp); Residual(cell,node,level) += temperatureSrc(cell,qp,level) *wBF(cell,node,qp); Residual(cell,node,level) -= omega(cell,qp,level) *wBF(cell,node,qp); Residual(cell,node,level) += etadotdT(cell,qp,level) *wBF(cell,node,qp); Residual(cell,node,level) += temperatureDot(cell,qp,level) *wBF(cell,node,qp); } } } } }
void GatherVerticallyAveragedVelocity<PHAL::AlbanyTraits::Jacobian, Traits>:: evaluateFields(typename Traits::EvalData workset) { Teuchos::RCP<const Tpetra_Vector> xT = Albany::getConstTpetraVector(workset.x); Teuchos::ArrayRCP<const ST> xT_constView = xT->get1dView(); int neq = workset.wsElNodeEqID.dimension(2); if (workset.sideSets == Teuchos::null) TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error, "Side sets defined in input file but not properly specified on the mesh" << std::endl); const Albany::LayeredMeshNumbering<LO>& layeredMeshNumbering = *workset.disc->getLayeredMeshNumbering(); int numLayers = layeredMeshNumbering.numLayers; Kokkos::deep_copy(this->averagedVel.get_view(), ScalarT(0.0)); const Albany::SideSetList& ssList = *(workset.sideSets); Albany::SideSetList::const_iterator it = ssList.find(this->meshPart); if (it != ssList.end()) { const std::vector<Albany::SideStruct>& sideSet = it->second; // Loop over the sides that form the boundary condition const Teuchos::ArrayRCP<Teuchos::ArrayRCP<GO> >& wsElNodeID = workset.disc->getWsElNodeID()[workset.wsIndex]; const Albany::NodalDOFManager& solDOFManager = workset.disc->getOverlapDOFManager("ordinary_solution"); const Teuchos::ArrayRCP<double>& layers_ratio = layeredMeshNumbering.layers_ratio; Teuchos::ArrayRCP<double> quadWeights(numLayers+1); //doing trapezoidal rule quadWeights[0] = 0.5*layers_ratio[0]; quadWeights[numLayers] = 0.5*layers_ratio[numLayers-1]; for(int i=1; i<numLayers; ++i) quadWeights[i] = 0.5*(layers_ratio[i-1] + layers_ratio[i]); for (std::size_t iSide = 0; iSide < sideSet.size(); ++iSide) { // loop over the sides on this ws and name // Get the data that corresponds to the side const int elem_GID = sideSet[iSide].elem_GID; const int elem_LID = sideSet[iSide].elem_LID; const int elem_side = sideSet[iSide].side_local_id; const CellTopologyData_Subcell& side = this->cell_topo->side[elem_side]; int numSideNodes = side.topology->node_count; const Teuchos::ArrayRCP<GO>& elNodeID = wsElNodeID[elem_LID]; std::vector<double> velx(this->numNodes,0), vely(this->numNodes,0); LO baseId, ilayer; for (int i = 0; i < numSideNodes; ++i) { std::size_t node = side.node[i]; LO lnodeId = workset.disc->getOverlapNodeMapT()->getLocalElement(elNodeID[node]); layeredMeshNumbering.getIndices(lnodeId, baseId, ilayer); std::vector<double> avVel(this->vecDimFO,0); for(int il=0; il<numLayers+1; ++il) { LO inode = layeredMeshNumbering.getId(baseId, il); for(int comp=0; comp<this->vecDimFO; ++comp) avVel[comp] += xT_constView[solDOFManager.getLocalDOF(inode, comp)]*quadWeights[il]; } for(int comp=0; comp<this->vecDimFO; ++comp) { this->averagedVel(elem_LID,elem_side,i,comp) = FadType(this->averagedVel(elem_LID,elem_side,i,comp).size(), avVel[comp]); for(int il=0; il<numLayers+1; ++il) this->averagedVel(elem_LID,elem_side,i,comp).fastAccessDx(neq*(this->numNodes+numSideNodes*il+i)+comp) = quadWeights[il]*workset.j_coeff; } } } } }