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