Esempio n. 1
0
 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
}