315 <<
" restart with cruise control: using suggested_tau_max"
332 return single_step();
344 template <
typename HD,
typename PD,
int dim,
typename Number>
345 Number TimeIntegrator<HD, PD, dim, Number>::step_ssprk_22(
346 StateVector<Number> &state_vector, Number t, Number tau_max)
351 std::cout <<
"TimeIntegrator<dim, Number>::step_ssprk_22()" << std::endl;
354 Assert(efficiency_ == 1., dealii::ExcInternalError());
357 Number tau = hyperbolic_module_->template step<0>(
358 state_vector, {}, {}, temp_[0], Number(0.), tau_max);
361 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
362 hyperbolic_module_->template step<0>(temp_[0], {}, {}, temp_[1], tau);
365 sadd<selected_memory_space_t>(
366 temp_[1], Number(1.0 / 2.0), Number(1.0 / 2.0), state_vector);
368 std::swap(state_vector, temp_[1]);
373 template <
typename HD,
typename PD,
int dim,
typename Number>
374 Number TimeIntegrator<HD, PD, dim, Number>::step_ssprk_33(
375 StateVector<Number> &state_vector, Number t, Number tau_max)
380 std::cout <<
"TimeIntegrator<dim, Number>::step_ssprk_33()" << std::endl;
383 Assert(efficiency_ == 1., dealii::ExcInternalError());
386 Number tau = hyperbolic_module_->template step<0>(
387 state_vector, {}, {}, temp_[0], Number(0.), tau_max);
390 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
391 hyperbolic_module_->template step<0>(temp_[0], {}, {}, temp_[1], tau);
394 sadd<selected_memory_space_t>(
395 temp_[1], Number(1.0 / 4.0), Number(3.0 / 4.0), state_vector);
398 hyperbolic_module_->prepare_state_vector(temp_[1], t + 0.5 * tau);
399 hyperbolic_module_->template step<0>(temp_[1], {}, {}, temp_[0], tau);
402 sadd<selected_memory_space_t>(
403 temp_[0], Number(2.0 / 3.0), Number(1.0 / 3.0), state_vector);
405 std::swap(state_vector, temp_[0]);
410 template <
typename HD,
typename PD,
int dim,
typename Number>
411 Number TimeIntegrator<HD, PD, dim, Number>::step_erk_11(
412 StateVector<Number> &state_vector, Number , Number tau_max)
415 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_11()" << std::endl;
418 Assert(efficiency_ == 1., dealii::ExcInternalError());
421 Number tau = hyperbolic_module_->template step<0>(
422 state_vector, {}, {}, temp_[0], Number(0.), tau_max);
424 std::swap(state_vector, temp_[0]);
429 template <
typename HD,
typename PD,
int dim,
typename Number>
430 Number TimeIntegrator<HD, PD, dim, Number>::step_erk_22(
431 StateVector<Number> &state_vector, Number t, Number tau_max)
434 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_22()" << std::endl;
437 Assert(efficiency_ == 2., dealii::ExcInternalError());
440 Number tau = hyperbolic_module_->template step<0>(
441 state_vector, {}, {}, temp_[0], Number(.0), tau_max / efficiency_);
444 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
445 hyperbolic_module_->template step<1>(
446 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
448 std::swap(state_vector, temp_[1]);
449 return efficiency_ * tau;
453 template <
typename HD,
typename PD,
int dim,
typename Number>
454 Number TimeIntegrator<HD, PD, dim, Number>::step_erk_33(
455 StateVector<Number> &state_vector, Number t, Number tau_max)
458 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_33()" << std::endl;
461 Assert(efficiency_ == 3., dealii::ExcInternalError());
464 Number tau = hyperbolic_module_->template step<0>(
465 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
468 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
469 hyperbolic_module_->template step<1>(
470 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
476 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
477 hyperbolic_module_->template step<2>(temp_[1],
478 {{state_vector, temp_[0]}},
479 {{Number(0.75), Number(-2.)}},
483 std::swap(state_vector, temp_[2]);
484 return efficiency_ * tau;
488 template <
typename HD,
typename PD,
int dim,
typename Number>
489 Number TimeIntegrator<HD, PD, dim, Number>::step_erk_43(
490 StateVector<Number> &state_vector, Number t, Number tau_max)
493 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_43()" << std::endl;
496 Assert(efficiency_ == 4., dealii::ExcInternalError());
499 Number tau = hyperbolic_module_->template step<0>(
500 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
503 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
504 hyperbolic_module_->template step<1>(
505 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
508 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
509 hyperbolic_module_->template step<1>(
510 temp_[1], {{temp_[0]}}, {{Number(-1.)}}, temp_[2], tau);
516 hyperbolic_module_->prepare_state_vector(temp_[2], t + 3.0 * tau);
517 hyperbolic_module_->template step<2>(temp_[2],
518 {{temp_[0], temp_[1]}},
519 {{Number(5. / 3.), Number(-10. / 3.)}},
523 std::swap(state_vector, temp_[3]);
524 return efficiency_ * tau;
528 template <
typename HD,
typename PD,
int dim,
typename Number>
529 Number TimeIntegrator<HD, PD, dim, Number>::step_erk_54(
530 StateVector<Number> &state_vector, Number t, Number tau_max)
533 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_54()" << std::endl;
536 Assert(efficiency_ == 5., dealii::ExcInternalError());
538 constexpr Number c = 0.2;
539 constexpr Number a_21 = +0.2;
540 constexpr Number a_31 = +0.26075582269554909;
541 constexpr Number a_32 = +0.13924417730445096;
542 constexpr Number a_41 = -0.25856517872570289;
543 constexpr Number a_42 = +0.91136274166280729;
544 constexpr Number a_43 = -0.05279756293710430;
545 constexpr Number a_51 = +0.21623276431503774;
546 constexpr Number a_52 = +0.51534223099602405;
547 constexpr Number a_53 = -0.81662794199265554;
548 constexpr Number a_54 = +0.88505294668159373;
549 constexpr Number a_61 = -0.10511678454691901;
550 constexpr Number a_62 = +0.87880047152100838;
551 constexpr Number a_63 = -0.58903404061484477;
552 constexpr Number a_64 = +0.46213380485434047;
553 constexpr Number a_65 [[maybe_unused]] = +0.35321654878641495;
556 Number tau = hyperbolic_module_->template step<0>(
557 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
560 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
561 hyperbolic_module_->template step<1>(
562 temp_[0], {{state_vector}}, {{(a_31 - a_21) / c}}, temp_[1], tau);
565 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
566 hyperbolic_module_->template step<2>(
568 {{state_vector, temp_[0]}},
569 {{(a_41 - a_31) / c, (a_42 - a_32) / c}},
574 hyperbolic_module_->prepare_state_vector(temp_[2], t + 3.0 * tau);
575 hyperbolic_module_->template step<3>(
577 {{state_vector, temp_[0], temp_[1]}},
578 {{(a_51 - a_41) / c, (a_52 - a_42) / c, (a_53 - a_43) / c}},
583 hyperbolic_module_->prepare_state_vector(temp_[3], t + 4.0 * tau);
584 hyperbolic_module_->template step<4>(
586 {{state_vector, temp_[0], temp_[1], temp_[2]}},
594 std::swap(state_vector, temp_[4]);
595 return efficiency_ * tau;
599 template <
typename HD,
typename PD,
int dim,
typename Number>
600 Number TimeIntegrator<HD, PD, dim, Number>::step_strang_ssprk_33_cn(
601 StateVector<Number> &state_vector, Number t, Number tau_max)
606 std::cout <<
"TimeIntegrator<dim, Number>::step_strang_ssprk_33_cn()"
610 Assert(efficiency_ == 2., dealii::ExcInternalError());
614 Number tau = hyperbolic_module_->template step<0>(
615 state_vector, {}, {}, temp_[0], Number(0.0), tau_max / efficiency_);
617 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
618 hyperbolic_module_->template step<0>(temp_[0], {}, {}, temp_[1], tau);
619 sadd<selected_memory_space_t>(
620 temp_[1], Number(1.0 / 4.0), Number(3.0 / 4.0), state_vector);
622 hyperbolic_module_->prepare_state_vector(temp_[1], t + 0.5 * tau);
623 hyperbolic_module_->template step<0>(temp_[1], {}, {}, temp_[0], tau);
624 sadd<selected_memory_space_t>(
625 temp_[0], Number(2.0 / 3.0), Number(1.0 / 3.0), state_vector);
630 parabolic_module_->crank_nicolson_step(temp_[0], t, temp_[2], 2.0 * tau);
631 }
catch (Restart &restart) {
633 restart.suggested_tau_max /= efficiency_;
639 hyperbolic_module_->prepare_state_vector( temp_[2], t + 1.0 * tau);
640 hyperbolic_module_->template step<0>( temp_[2], {}, {}, temp_[0], tau);
642 hyperbolic_module_->prepare_state_vector(temp_[0], t + 2.0 * tau);
643 hyperbolic_module_->template step<0>(temp_[0], {}, {}, temp_[1], tau);
644 sadd<selected_memory_space_t>(
645 temp_[1], Number(1.0 / 4.0), Number(3.0 / 4.0), temp_[2]);
647 hyperbolic_module_->prepare_state_vector(temp_[1], t + 1.5 * tau);
648 hyperbolic_module_->template step<0>(temp_[1], {}, {}, temp_[0], tau);
649 sadd<selected_memory_space_t>(
650 temp_[0], Number(2.0 / 3.0), Number(1.0 / 3.0), temp_[2]);
652 std::swap(state_vector, temp_[0]);
653 return efficiency_ * tau;
657 template <
typename HD,
typename PD,
int dim,
typename Number>
658 Number TimeIntegrator<HD, PD, dim, Number>::step_strang_erk_33_cn(
659 StateVector<Number> &state_vector, Number t, Number tau_max)
664 std::cout <<
"TimeIntegrator<dim, Number>::step_strang_erk_33_cn()"
668 Assert(efficiency_ == 6., dealii::ExcInternalError());
672 Number tau = hyperbolic_module_->template step<0>(
673 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
675 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
676 hyperbolic_module_->template step<1>(
677 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
679 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
680 hyperbolic_module_->template step<2>(temp_[1],
681 {{state_vector, temp_[0]}},
682 {{Number(0.75), Number(-2.)}},
689 parabolic_module_->crank_nicolson_step(temp_[2], t, temp_[3], 6.0 * tau);
690 }
catch (Restart &restart) {
692 restart.suggested_tau_max /= efficiency_;
698 hyperbolic_module_->prepare_state_vector(temp_[3], t + 3.0 * tau);
699 hyperbolic_module_->template step<0>(
700 temp_[3], {}, {}, temp_[0], tau);
702 hyperbolic_module_->prepare_state_vector(temp_[0], t + 4.0 * tau);
703 hyperbolic_module_->template step<1>(
704 temp_[0], {{ temp_[3]}}, {{Number(-1.)}}, temp_[1], tau);
706 hyperbolic_module_->prepare_state_vector(temp_[1], t + 5.0 * tau);
707 hyperbolic_module_->template step<2>(temp_[1],
708 {{ temp_[3], temp_[0]}},
709 {{Number(0.75), Number(-2.)}},
713 std::swap(state_vector, temp_[2]);
714 return efficiency_ * tau;
718 template <
typename HD,
typename PD,
int dim,
typename Number>
719 Number TimeIntegrator<HD, PD, dim, Number>::step_strang_erk_43_cn(
720 StateVector<Number> &state_vector, Number t, Number tau_max)
725 std::cout <<
"TimeIntegrator<dim, Number>::step_strang_erk_43_cn()"
729 Assert(efficiency_ == 8., dealii::ExcInternalError());
733 Number tau = hyperbolic_module_->template step<0>(
734 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
736 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
737 hyperbolic_module_->template step<1>(
738 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
740 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
741 hyperbolic_module_->template step<1>(
742 temp_[1], {{temp_[0]}}, {{Number(-1.)}}, temp_[2], tau);
744 hyperbolic_module_->prepare_state_vector(temp_[2], t + 3.0 * tau);
745 hyperbolic_module_->template step<2>(temp_[2],
746 {{temp_[0], temp_[1]}},
747 {{Number(5. / 3.), Number(-10. / 3.)}},
754 parabolic_module_->crank_nicolson_step(temp_[3], t, temp_[2], 8.0 * tau);
755 }
catch (Restart &restart) {
757 restart.suggested_tau_max /= efficiency_;
763 hyperbolic_module_->prepare_state_vector(temp_[2], t + 4.0 * tau);
764 hyperbolic_module_->template step<0>(
765 temp_[2], {}, {}, temp_[0], tau);
767 hyperbolic_module_->prepare_state_vector(temp_[0], t + 5.0 * tau);
768 hyperbolic_module_->template step<1>(
769 temp_[0], {{ temp_[2]}}, {{Number(-1.)}}, temp_[1], tau);
771 hyperbolic_module_->prepare_state_vector(temp_[1], t + 6.0 * tau);
772 hyperbolic_module_->template step<1>(
773 temp_[1], {{temp_[0]}}, {{Number(-1.)}}, temp_[2], tau);
775 hyperbolic_module_->prepare_state_vector(temp_[2], t + 7.0 * tau);
776 hyperbolic_module_->template step<2>(temp_[2],
777 {{temp_[0], temp_[1]}},
778 {{Number(5. / 3.), Number(-10. / 3.)}},
782 std::swap(state_vector, temp_[3]);
783 return efficiency_ * tau;
787 template <
typename HD,
typename PD,
int dim,
typename Number>
788 Number TimeIntegrator<HD, PD, dim, Number>::step_imex_11(
789 StateVector<Number> &state_vector, Number t, Number tau_max)
792 std::cout <<
"TimeIntegrator<dim, Number>::step_imex_11()" << std::endl;
795 Assert(efficiency_ == 1., dealii::ExcInternalError());
798 Number tau = hyperbolic_module_->template step<0>(
799 state_vector, {}, {}, temp_[0], Number(0.), tau_max);
802 parabolic_module_->template backward_euler_step<0>(
803 temp_[0], t, {}, {}, temp_[1], 1.0 * tau);
805 std::swap(state_vector, temp_[1]);
810 template <
typename HD,
typename PD,
int dim,
typename Number>
811 Number TimeIntegrator<HD, PD, dim, Number>::step_imex_22(
812 StateVector<Number> &state_vector, Number t, Number tau_max)
815 std::cout <<
"TimeIntegrator<dim, Number>::step_imex_22()" << std::endl;
818 Assert(efficiency_ == 2., dealii::ExcInternalError());
821 Number tau = hyperbolic_module_->template step<0>(
822 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
825 parabolic_module_->template backward_euler_step<0>(
826 temp_[0], t, {}, {}, temp_[1], tau);
829 hyperbolic_module_->prepare_state_vector(temp_[1], t + 1.0 * tau);
830 hyperbolic_module_->template step<1>(
831 temp_[1], {{state_vector}}, {{Number(-1.)}}, temp_[2], tau);
834 parabolic_module_->template backward_euler_step<1>(temp_[2],
841 std::swap(state_vector, temp_[3]);
842 return efficiency_ * tau;
846 template <
typename HD,
typename PD,
int dim,
typename Number>
847 Number TimeIntegrator<HD, PD, dim, Number>::step_imex_33(
848 StateVector<Number> &state_vector, Number t, Number tau_max)
851 std::cout <<
"TimeIntegrator<dim, Number>::step_imex_33()" << std::endl;
854 Assert(efficiency_ == 3., dealii::ExcInternalError());
858 const Number gamma = Number(0.5) + std::sqrt(Number(3.0)) / Number(6.0);
861 Number tau = hyperbolic_module_->template step<0>(
862 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
865 parabolic_module_->template backward_euler_step<1>(
869 {{Number(1. - 3. * gamma)}},
874 hyperbolic_module_->prepare_state_vector(temp_[1], t + 1.0 * tau);
875 hyperbolic_module_->template step<1>(
876 temp_[1], {{state_vector}}, {{Number(-1.)}}, temp_[2], tau);
882 parabolic_module_->template backward_euler_step<2>(
885 {{state_vector, temp_[1]}},
886 {{Number(6. * gamma - 1.), Number(2. - 9 * gamma)}},
891 hyperbolic_module_->prepare_state_vector(temp_[3], t + 2. * tau);
892 hyperbolic_module_->template step<2>(temp_[3],
893 {{state_vector, temp_[1]}},
894 {{Number(0.75), Number(-2.)}},
899 parabolic_module_->template backward_euler_step<3>(
902 {{state_vector, temp_[1], temp_[3]}},
903 {{Number(0.75 - 3. * gamma),
904 Number(6. * gamma - 2.),
905 Number(9. / 4. - 3. * gamma)}},
909 std::swap(state_vector, temp_[5]);
910 return efficiency_ * tau;