コード例 #1
0
//--------------------------------------------------------------------------
//-------- solve_and_update_external ---------------------------------------
//--------------------------------------------------------------------------
void
ProjectedNodalGradientEquationSystem::solve_and_update_external()
{
  for ( int k = 0; k < maxIterations_; ++k ) {

    // projected nodal gradient, load_complete and solve
    assemble_and_solve(qTmp_);
    
    // update
    double timeA = NaluEnv::self().nalu_time();
    field_axpby(
      realm_.meta_data(),
      realm_.bulk_data(),
      1.0, *qTmp_,
      1.0, *dqdx_, 
      realm_.get_activate_aura());
    double timeB = NaluEnv::self().nalu_time();
    timerAssemble_ += (timeB-timeA);   
  }
}
コード例 #2
0
//--------------------------------------------------------------------------
//-------- solve_and_update ------------------------------------------------
//--------------------------------------------------------------------------
void
MassFractionEquationSystem::solve_and_update()
{

  if ( isInit_ ) {
    // nothing to do now...
    isInit_ = false;
  }

  // compute effective viscosity; same for all mass fraction
  diffFluxCoeffAlgDriver_->execute();

  // we solve for n-1 mass fraction
  const int nm1MassFraction = numMassFraction_ - 1;
    
  for ( int i = 0; i < maxIterations_; ++i ) {

    NaluEnv::self().naluOutputP0() << " " << i+1 << "/" << maxIterations_ << std::setw(15) << std::right << name_ << std::endl;

    double nonLinearResidualSum = 0.0;
    double linearResidualSum = 0.0;
    double linearIterationsSum = 0.0;

    for ( int k = 0; k < nm1MassFraction; ++k ) {

      // load np1, n and nm1 mass fraction to "current"; also populate "current" bc
      double timeA = stk::cpu_time();
      set_current_mass_fraction(k);
      double timeB = stk::cpu_time();
      timerMisc_ += (timeB-timeA);

      // compute nodal gradient
      assembleNodalGradAlgDriver_->execute();

      // mass fraction assemble, load_complete and solve
      assemble_and_solve(yTmp_);

      // update
      timeA = stk::cpu_time();
      field_axpby(
        realm_.meta_data(),
        realm_.bulk_data(),
        1.0, *yTmp_,
        1.0, *currentMassFraction_, 
        realm_.get_activate_aura());
      timeB = stk::cpu_time();
      timerAssemble_ += (timeB-timeA);

      // copy currentMassFraction back to mass fraction_k
      copy_mass_fraction(*currentMassFraction_, 0, *massFraction_, k);

      // increment solve counts and norms
      linearIterationsSum += linsys_->linearSolveIterations();
      nonLinearResidualSum += linsys_->nonLinearResidual();
      linearResidualSum += linsys_->linearResidual();

    }

    // compute nth mass fraction
    compute_nth_mass_fraction();

    // save total nonlinear residual
    nonLinearResidualSum_ = nonLinearResidualSum/double(nm1MassFraction);

    // save
    if ( realm_.currentNonlinearIteration_ == 1 )
      firstNonLinearResidualSum_ = nonLinearResidualSum_;

    // dump norm and averages
    std::string systemName = "MassFractionEQS";
    const int systemNameOffset = systemName.length()+8;
    NaluEnv::self().naluOutputP0()
      << std::setw(systemNameOffset) << std::right << systemName
      << std::setw(32-systemNameOffset)  << std::right << linearIterationsSum/double(nm1MassFraction)
      << std::setw(18) << std::right << linearResidualSum/double(nm1MassFraction)
      << std::setw(15) << std::right << nonLinearResidualSum/double(nm1MassFraction)
      << std::setw(14) << std::right << nonLinearResidualSum_/firstNonLinearResidualSum_ << std::endl;
  }

}