void TimeIntegrator_UpdateClass( void* timeIntegrator, void* data ) {
	TimeIntegrator*        self            = (TimeIntegrator*) timeIntegrator;
	double wallTime,tmin,tmax;
	
	wallTime = MPI_Wtime();
	Journal_RPrintf(self->info,"Time Integration\n");
	self->_execute( self, data );

	wallTime = MPI_Wtime()-wallTime;
        MPI_Reduce( &wallTime, &tmin, 1, MPI_DOUBLE, MPI_MIN, 0, MPI_COMM_WORLD );
        MPI_Reduce( &wallTime, &tmax, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD );
	Journal_RPrintf(self->info,"Time Integration - %.4g [min] / %.4g [max] (secs)\n", tmin,tmax);	
}
Exemplo n.º 2
0
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;
}
void _TimeIntegrator_Execute( void* timeIntegrator, void* data ) {
	TimeIntegrator*	self = (TimeIntegrator*)timeIntegrator;
	double wallTime,tmin,tmax;


	Journal_DPrintf( self->debug, "In %s for %s '%s'\n", __func__, self->type, self->name );

	wallTime = MPI_Wtime();

	/* Set function pointer */
	switch (self->order) {
		case 1:
			self->_execute = _TimeIntegrator_ExecuteEuler; 
			break;
		case 2:
			if (self->simultaneous) 
				self->_execute = _TimeIntegrator_ExecuteRK2Simultaneous; 
			else
				self->_execute = _TimeIntegrator_ExecuteRK2; 
			break;
		case 4:
			if (self->simultaneous) 
				self->_execute = _TimeIntegrator_ExecuteRK4Simultaneous; 
			else
				self->_execute = _TimeIntegrator_ExecuteRK4; 
			break;
		default:
			Journal_Firewall( False, Journal_Register( Error_Type, (Name)self->type  ),
					"%s '%s' cannot handle order %u\n", self->type, self->name, self->order );
	}

	/* Call real function */
	
	Journal_RPrintf( self->info, "Time Integration\n" );
	self->_execute( self, data );

	wallTime = MPI_Wtime()-wallTime;
        MPI_Reduce( &wallTime, &tmin, 1, MPI_DOUBLE, MPI_MIN, 0, MPI_COMM_WORLD );
        MPI_Reduce( &wallTime, &tmax, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD );
	Journal_RPrintf(self->info,"Time Integration - %.6g [min] / %.6g [max] (secs)\n", tmin, tmax);
	
}
Exemplo n.º 4
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;
}