Real
AB2PredictorCorrector::estimateTimeError(NumericVector<Number> & solution)
{
 _pred1 = _fe_problem.getNonlinearSystemBase().getPredictor()->solutionPredictor();
  TimeIntegrator * ti = _fe_problem.getNonlinearSystemBase().getTimeIntegrator();
  std::string scheme = ti->name();
  Real dt_old = _my_dt_old;
  if (dt_old == 0)
    dt_old = _dt;

  switch (stringtoint(scheme))
  {
  case 1:
  {
    // NOTE: this is never called, since stringtoint does not return 1 - EVER!
    //I am not sure this is actually correct.
    _pred1 *= -1;
    _pred1 += solution;
    Real calc = _dt * _dt * .5;
    _pred1 *= calc;
    return _pred1.l2_norm();
  }
  case 2:
  {
    // Crank Nicolson
    _pred1 -= solution;
    _pred1 *= (_dt) / (3.0 * (_dt + dt_old));
    return _pred1.l2_norm();
  }
  case 3:
  {
    // BDF2
    _pred1 *= -1.0;
    _pred1 += solution;
    Real topcalc = 2.0 * (_dt + dt_old) * (_dt + dt_old);
    Real bottomcalc = 6.0 * _dt * _dt + 12.0 * _dt * dt_old + 5.0 * dt_old * dt_old;
    _pred1 *= topcalc / bottomcalc;

    return _pred1.l2_norm();
  }
  default:
    break;
  }
  return -1;
}
Exemple #2
0
Real
AB2PredictorCorrector::estimateTimeError(NumericVector<Number> & solution)
{
  _pred1 = _fe_problem.getNonlinearSystemBase().getPredictor()->solutionPredictor();
  TimeIntegrator * ti = _fe_problem.getNonlinearSystemBase().getTimeIntegrator();
  auto scheme = Moose::stringToEnum<Moose::TimeIntegratorType>(ti->name());
  Real dt_old = _my_dt_old;
  if (dt_old == 0)
    dt_old = _dt;

  switch (scheme)
  {
    case Moose::TI_IMPLICIT_EULER:
    {
      _pred1 *= -1;
      _pred1 += solution;
      Real calc = _dt * _dt * .5;
      _pred1 *= calc;
      return _pred1.l2_norm();
    }
    case Moose::TI_CRANK_NICOLSON:
    {
      _pred1 -= solution;
      _pred1 *= (_dt) / (3.0 * (_dt + dt_old));
      return _pred1.l2_norm();
    }
    case Moose::TI_BDF2:
    {
      _pred1 *= -1.0;
      _pred1 += solution;
      Real topcalc = 2.0 * (_dt + dt_old) * (_dt + dt_old);
      Real bottomcalc = 6.0 * _dt * _dt + 12.0 * _dt * dt_old + 5.0 * dt_old * dt_old;
      _pred1 *= topcalc / bottomcalc;

      return _pred1.l2_norm();
    }
    default:
      break;
  }
  return -1;
}