//-------------------------------------------------------------------------- //-------- 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); } }
//-------------------------------------------------------------------------- //-------- 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; } }