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