void gradient( Vector<Real> &g, const Vector<Real> &x, Real &tol ) { DualSROMVector<Real> &eg = Teuchos::dyn_cast<DualSROMVector<Real> >(g); const PrimalSROMVector<Real> &ex = Teuchos::dyn_cast<const PrimalSROMVector<Real> >(x); size_t dimension = ex.getDimension(); size_t numSamples = ex.getNumSamples(); std::vector<Real> gradx(numSamples,0.), gradp(numSamples,0.); Real scale = 0.; std::vector<std::pair<size_t, Real> > data; std::vector<Real> val_wt(numSamples,0.), tmp(dimension,0.); std::vector<std::vector<Real> > val_pt(numSamples,tmp); for (size_t d = 0; d < dimension; d++) { data = moments_[d]; for (size_t m = 0; m < data.size(); m++) { momentGradient(gradx,gradp,scale,d,(Real)data[m].first,data[m].second,ex); for (size_t k = 0; k < numSamples; k++) { (val_pt[k])[d] += scale*gradx[k]; val_wt[k] += scale*gradp[k]; } } } for (size_t k = 0; k < numSamples; k++) { eg.setPoint(k,val_pt[k]); eg.setWeight(k,val_wt[k]); } }
void gradient( Vector<Real> &g, const Vector<Real> &x, Real &tol ) { SROMVector<Real> &eg = Teuchos::dyn_cast<SROMVector<Real> >(g); const SROMVector<Real> &ex = Teuchos::dyn_cast<const SROMVector<Real> >(x); const int dimension = ex.getDimension(); const int numSamples = ex.getNumSamples(); std::vector<Real> gradx(numSamples,0.), gradp(numSamples,0.); Real diff = 0., xpt = 0., val = 0., sum = 0.; std::vector<Real> val_wt(numSamples,0.), tmp(dimension,0.); std::vector<std::vector<Real> > val_pt(numSamples,tmp); for (int d = 0; d < dimension; d++) { for (int k = 0; k < numSamples; k++) { xpt = (*ex.getPoint(k))[d]; val = gradientCDF(gradx,gradp,d,xpt,ex); diff = (val-dist_[d]->evaluateCDF(xpt)); sum = 0.; for (int j = 0; j < numSamples; j++) { (val_pt[j])[d] += diff * gradx[j]; val_wt[j] += diff * gradp[j]; sum -= gradx[j]; } (val_pt[k])[d] += diff * (sum - dist_[d]->evaluatePDF(xpt)); } } for (int k = 0; k < numSamples; k++) { eg.setPoint(k,val_pt[k]); eg.setWeight(k,val_wt[k]); } }
KOKKOS_INLINE_FUNCTION void XZHydrostatic_Omega<EvalT, Traits>:: operator() (const XZHydrostatic_Omega_Tag& tag, const int& cell) const{ for (int qp=0; qp < numQPs; ++qp) { for (int level=0; level < numLevels; ++level) { ScalarT sum = -0.5*divpivelx(cell,qp,level) * delta(level); for (int j=0; j<level; ++j) sum -= divpivelx(cell,qp,j) * delta(j); for (int dim=0; dim < numDims; ++dim) sum += Velocity(cell,qp,level,dim)*gradp(cell,qp,level,dim); omega(cell,qp,level) = sum/(Cpstar(cell,qp,level)*density(cell,qp,level)); } } }
void XZHydrostatic_Omega<EvalT, Traits>:: evaluateFields(typename Traits::EvalData workset) { for (int cell=0; cell < workset.numCells; ++cell) { for (int qp=0; qp < numQPs; ++qp) { for (int level=0; level < numLevels; ++level) { ScalarT sum = Velx(cell,qp,level)*gradp(cell,qp,level) + 0.5*gradpivelx(cell,qp,level)*DeltaEta(cell,qp,level) ; for (int j=0; j<level-1; ++j) { sum -= gradpivelx(cell,qp,level) * DeltaEta(cell,qp,level); } omega(cell,qp,level) = (density(cell,qp,level)/Cp)*sum; } } } }
void XZHydrostatic_Omega<EvalT, Traits>:: evaluateFields(typename Traits::EvalData workset) { #ifndef ALBANY_KOKKOS_UNDER_DEVELOPMENT for (int cell=0; cell < workset.numCells; ++cell) { for (int qp=0; qp < numQPs; ++qp) { for (int level=0; level < numLevels; ++level) { ScalarT sum = -0.5*divpivelx(cell,qp,level) * E.delta(level); for (int j=0; j<level; ++j) sum -= divpivelx(cell,qp,j) * E.delta(j); for (int dim=0; dim < numDims; ++dim) sum += Velocity(cell,qp,level,dim)*gradp(cell,qp,level,dim); omega(cell,qp,level) = sum/(Cpstar(cell,qp,level)*density(cell,qp,level)); } } } #else Kokkos::parallel_for(XZHydrostatic_Omega_Policy(0,workset.numCells),*this); cudaCheckError(); #endif }