12 using namespace dealii;
14 template <
typename StateVector,
typename Number>
18 auto &dst_U = std::get<0>(dst);
19 auto &src_U = std::get<0>(src);
20 dst_U.sadd(s, b, src_U);
22 auto &dst_V = std::get<2>(dst);
23 auto &src_V = std::get<2>(src);
24 dst_V.sadd(s, b, src_V);
28 template <
typename Description,
int dim,
typename Number>
34 const std::string &subsection )
35 : ParameterAcceptor(subsection)
36 , mpi_ensemble_(mpi_ensemble)
37 , offline_data_(&offline_data)
38 , hyperbolic_module_(&hyperbolic_module)
39 , parabolic_module_(¶bolic_module)
41 cfl_min_ = Number(0.45);
45 "Minimal admissible relative CFL constant. How this parameter is used "
46 "depends on the chosen CFL recovery strategy");
48 cfl_max_ = Number(0.90);
52 "Maximal admissible relative CFL constant. How this parameter is used "
53 "depends on the chosen CFL recovery strategy");
56 add_parameter(
"cfl recovery strategy",
57 cfl_recovery_strategy_,
58 "CFL/invariant domain violation recovery strategy: none, "
59 "bang bang control, cruise control");
61 acceptable_tau_max_ratio_ = Number(2.0);
62 add_parameter(
"acceptable tau_max ratio",
63 acceptable_tau_max_ratio_,
64 "Maximal acceptable discrepancy between computed tau_max of "
65 "a (sub)step and enforced time-step size tau. If the ratio "
66 "is violated then a restart will be singnalled.");
68 if (ParabolicSystem::is_identity)
72 add_parameter(
"time stepping scheme",
73 time_stepping_scheme_,
74 "Time stepping scheme: ssprk 22, ssprk 33, erk 11, erk 22, "
75 "erk 33, erk 43, erk "
76 "54, strang ssprk 33 cn, strang erk 33 cn, strang erk 43 cn, "
77 "imex 11, imex 22, imex 33");
81 template <
typename Description,
int dim,
typename Number>
85 std::cout <<
"TimeIntegrator<dim, Number>::prepare()" << std::endl;
90 switch (time_stepping_scheme_) {
147 for (
auto &it : temp_) {
148 Vectors::reinit_state_vector<Description>(it, *offline_data_);
153 AssertThrow(cfl_min_ > 0., ExcMessage(
"cfl min must be a positive value"));
154 AssertThrow(cfl_max_ >= cfl_min_,
155 ExcMessage(
"cfl max must be greater than or equal to cfl min"));
158 acceptable_tau_max_ratio_ >= 1.0,
160 "acceptable tau_max ratio must be greater than or equal to 1."));
162 hyperbolic_module_->cfl(cfl_max_);
163 hyperbolic_module_->acceptable_tau_max_ratio(acceptable_tau_max_ratio_);
165 const auto check_whether_timestepping_makes_sense = [&]() {
170 switch (time_stepping_scheme_) {
185 ParabolicSystem::is_identity,
187 "The selected equation consists of a hyperbolic and nontrivial "
188 "parabolic subsystem and requires an IMEX timestepping "
189 "scheme such as »strang erk 33 cn«."));
204 !ParabolicSystem::is_identity,
206 "The selected equation has a trivial parabolic subsystem and "
207 "should not be run with an IMEX timestepping scheme."));
213 check_whether_timestepping_makes_sense();
214 this->parse_parameters_call_back.connect(
215 check_whether_timestepping_makes_sense);
226 template <
typename Description,
int dim,
typename Number>
232 Number tau_max = t_final - t;
235 std::cout <<
"TimeIntegrator<dim, Number>::step()" << std::endl;
236 std::cout <<
" enforcing tau_max <= " << tau_max << std::endl;
239 const auto single_step = [&]() {
240 switch (time_stepping_scheme_) {
242 return step_ssprk_22(state_vector, t, tau_max);
244 return step_ssprk_33(state_vector, t, tau_max);
246 return step_erk_11(state_vector, t, tau_max);
248 return step_erk_22(state_vector, t, tau_max);
250 return step_erk_33(state_vector, t, tau_max);
252 return step_erk_43(state_vector, t, tau_max);
254 return step_erk_54(state_vector, t, tau_max);
256 return step_strang_ssprk_33_cn(state_vector, t, tau_max);
258 return step_strang_erk_33_cn(state_vector, t, tau_max);
260 return step_strang_erk_43_cn(state_vector, t, tau_max);
262 return step_imex_11(state_vector, t, tau_max);
264 return step_imex_22(state_vector, t, tau_max);
266 return step_imex_33(state_vector, t, tau_max);
268 __builtin_unreachable();
273 hyperbolic_module_->id_violation_strategy_ =
275 parabolic_module_->id_violation_strategy_ =
277 hyperbolic_module_->cfl(cfl_max_);
281 return single_step();
283 }
catch (
const Restart &restart) {
286 dealii::ExcInternalError());
295 <<
" restart with bang bang control: setting cfl to cfl_min"
298 hyperbolic_module_->cfl(cfl_min_);
305 <<
" restart with cruise control: using suggested_tau_max"
319 std::min(tau_max, efficiency_ * Number(restart.suggested_tau_max));
322 return single_step();
334 template <
typename Description,
int dim,
typename Number>
341 std::cout <<
"TimeIntegrator<dim, Number>::step_ssprk_22()" << std::endl;
344 Assert(efficiency_ == 1., dealii::ExcInternalError());
347 hyperbolic_module_->prepare_state_vector(state_vector, t);
348 Number tau = hyperbolic_module_->template step<0>(
349 state_vector, {}, {}, temp_[0], Number(0.), tau_max);
352 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
353 hyperbolic_module_->template step<0>(temp_[0], {}, {}, temp_[1], tau);
356 sadd(temp_[1], Number(1.0 / 2.0), Number(1.0 / 2.0), state_vector);
358 state_vector.swap(temp_[1]);
363 template <
typename Description,
int dim,
typename Number>
365 StateVector &state_vector, Number t, Number tau_max)
370 std::cout <<
"TimeIntegrator<dim, Number>::step_ssprk_33()" << std::endl;
373 Assert(efficiency_ == 1., dealii::ExcInternalError());
376 hyperbolic_module_->prepare_state_vector(state_vector, t);
377 Number tau = hyperbolic_module_->template step<0>(
378 state_vector, {}, {}, temp_[0], Number(0.), tau_max);
381 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
382 hyperbolic_module_->template step<0>(temp_[0], {}, {}, temp_[1], tau);
385 sadd(temp_[1], Number(1.0 / 4.0), Number(3.0 / 4.0), state_vector);
388 hyperbolic_module_->prepare_state_vector(temp_[1], t + 0.5 * tau);
389 hyperbolic_module_->template step<0>(temp_[1], {}, {}, temp_[0], tau);
392 sadd(temp_[0], Number(2.0 / 3.0), Number(1.0 / 3.0), state_vector);
394 state_vector.swap(temp_[0]);
399 template <
typename Description,
int dim,
typename Number>
401 StateVector &state_vector, Number t, Number tau_max)
404 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_11()" << std::endl;
407 Assert(efficiency_ == 1., dealii::ExcInternalError());
410 hyperbolic_module_->prepare_state_vector(state_vector, t);
411 Number tau = hyperbolic_module_->template step<0>(
412 state_vector, {}, {}, temp_[0], Number(0.), tau_max);
414 state_vector.swap(temp_[0]);
419 template <
typename Description,
int dim,
typename Number>
424 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_22()" << std::endl;
427 Assert(efficiency_ == 2., dealii::ExcInternalError());
430 hyperbolic_module_->prepare_state_vector(state_vector, t);
431 Number tau = hyperbolic_module_->template step<0>(
432 state_vector, {}, {}, temp_[0], Number(.0), tau_max / efficiency_);
435 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
436 hyperbolic_module_->template step<1>(
437 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
439 state_vector.swap(temp_[1]);
440 return efficiency_ * tau;
444 template <
typename Description,
int dim,
typename Number>
446 StateVector &state_vector, Number t, Number tau_max)
449 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_33()" << std::endl;
452 Assert(efficiency_ == 3., dealii::ExcInternalError());
455 hyperbolic_module_->prepare_state_vector(state_vector, t);
456 Number tau = hyperbolic_module_->template step<0>(
457 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
460 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
461 hyperbolic_module_->template step<1>(
462 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
468 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
469 hyperbolic_module_->template step<2>(temp_[1],
470 {{state_vector, temp_[0]}},
471 {{Number(0.75), Number(-2.)}},
475 state_vector.swap(temp_[2]);
476 return efficiency_ * tau;
480 template <
typename Description,
int dim,
typename Number>
482 StateVector &state_vector, Number t, Number tau_max)
485 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_43()" << std::endl;
488 Assert(efficiency_ == 4., dealii::ExcInternalError());
491 hyperbolic_module_->prepare_state_vector(state_vector, t);
492 Number tau = hyperbolic_module_->template step<0>(
493 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
496 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
497 hyperbolic_module_->template step<1>(
498 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
501 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
502 hyperbolic_module_->template step<1>(
503 temp_[1], {{temp_[0]}}, {{Number(-1.)}}, temp_[2], tau);
509 hyperbolic_module_->prepare_state_vector(temp_[2], t + 3.0 * tau);
510 hyperbolic_module_->template step<2>(temp_[2],
511 {{temp_[0], temp_[1]}},
512 {{Number(5. / 3.), Number(-10. / 3.)}},
516 state_vector.swap(temp_[3]);
517 return efficiency_ * tau;
521 template <
typename Description,
int dim,
typename Number>
523 StateVector &state_vector, Number t, Number tau_max)
526 std::cout <<
"TimeIntegrator<dim, Number>::step_erk_54()" << std::endl;
529 Assert(efficiency_ == 5., dealii::ExcInternalError());
531 constexpr Number c = 0.2;
532 constexpr Number a_21 = +0.2;
533 constexpr Number a_31 = +0.26075582269554909;
534 constexpr Number a_32 = +0.13924417730445096;
535 constexpr Number a_41 = -0.25856517872570289;
536 constexpr Number a_42 = +0.91136274166280729;
537 constexpr Number a_43 = -0.05279756293710430;
538 constexpr Number a_51 = +0.21623276431503774;
539 constexpr Number a_52 = +0.51534223099602405;
540 constexpr Number a_53 = -0.81662794199265554;
541 constexpr Number a_54 = +0.88505294668159373;
542 constexpr Number a_61 = -0.10511678454691901;
543 constexpr Number a_62 = +0.87880047152100838;
544 constexpr Number a_63 = -0.58903404061484477;
545 constexpr Number a_64 = +0.46213380485434047;
546 constexpr Number a_65 [[maybe_unused]] = +0.35321654878641495;
549 hyperbolic_module_->prepare_state_vector(state_vector, t);
550 Number tau = hyperbolic_module_->template step<0>(
551 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
554 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
555 hyperbolic_module_->template step<1>(
556 temp_[0], {{state_vector}}, {{(a_31 - a_21) / c}}, temp_[1], tau);
559 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
560 hyperbolic_module_->template step<2>(
562 {{state_vector, temp_[0]}},
563 {{(a_41 - a_31) / c, (a_42 - a_32) / c}},
568 hyperbolic_module_->prepare_state_vector(temp_[2], t + 3.0 * tau);
569 hyperbolic_module_->template step<3>(
571 {{state_vector, temp_[0], temp_[1]}},
572 {{(a_51 - a_41) / c, (a_52 - a_42) / c, (a_53 - a_43) / c}},
577 hyperbolic_module_->prepare_state_vector(temp_[3], t + 4.0 * tau);
578 hyperbolic_module_->template step<4>(
580 {{state_vector, temp_[0], temp_[1], temp_[2]}},
588 state_vector.swap(temp_[4]);
589 return efficiency_ * tau;
593 template <
typename Description,
int dim,
typename Number>
595 StateVector &state_vector, Number t, Number tau_max)
600 std::cout <<
"TimeIntegrator<dim, Number>::step_strang_ssprk_33_cn()"
604 Assert(efficiency_ == 2., dealii::ExcInternalError());
606 parabolic_module_->prepare_state_vector(state_vector, t);
610 hyperbolic_module_->prepare_state_vector(state_vector, t);
611 Number tau = hyperbolic_module_->template step<0>(
612 state_vector, {}, {}, temp_[0], Number(0.0), tau_max / efficiency_);
614 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
615 hyperbolic_module_->template step<0>(temp_[0], {}, {}, temp_[1], tau);
616 sadd(temp_[1], Number(1.0 / 4.0), Number(3.0 / 4.0), state_vector);
618 hyperbolic_module_->prepare_state_vector(temp_[1], t + 0.5 * tau);
619 hyperbolic_module_->template step<0>(temp_[1], {}, {}, temp_[0], tau);
620 sadd(temp_[0], Number(2.0 / 3.0), Number(1.0 / 3.0), state_vector);
625 parabolic_module_->crank_nicolson_step(temp_[0], t, temp_[2], 2.0 * tau);
634 hyperbolic_module_->prepare_state_vector( temp_[2], t + 1.0 * tau);
635 hyperbolic_module_->template step<0>( temp_[2], {}, {}, temp_[0], tau);
637 hyperbolic_module_->prepare_state_vector(temp_[0], t + 2.0 * tau);
638 hyperbolic_module_->template step<0>(temp_[0], {}, {}, temp_[1], tau);
639 sadd(temp_[1], Number(1.0 / 4.0), Number(3.0 / 4.0), temp_[2]);
641 hyperbolic_module_->prepare_state_vector(temp_[1], t + 1.5 * tau);
642 hyperbolic_module_->template step<0>(temp_[1], {}, {}, temp_[0], tau);
643 sadd(temp_[0], Number(2.0 / 3.0), Number(1.0 / 3.0), temp_[2]);
645 state_vector.swap(temp_[0]);
646 return efficiency_ * tau;
650 template <
typename Description,
int dim,
typename Number>
652 StateVector &state_vector, Number t, Number tau_max)
657 std::cout <<
"TimeIntegrator<dim, Number>::step_strang_erk_33_cn()"
661 Assert(efficiency_ == 6., dealii::ExcInternalError());
663 parabolic_module_->prepare_state_vector(state_vector, t);
667 hyperbolic_module_->prepare_state_vector(state_vector, t);
668 Number tau = hyperbolic_module_->template step<0>(
669 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
671 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
672 hyperbolic_module_->template step<1>(
673 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
675 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
676 hyperbolic_module_->template step<2>(temp_[1],
677 {{state_vector, temp_[0]}},
678 {{Number(0.75), Number(-2.)}},
685 parabolic_module_->crank_nicolson_step(temp_[2], t, temp_[3], 6.0 * tau);
694 hyperbolic_module_->prepare_state_vector(temp_[3], t + 3.0 * tau);
695 hyperbolic_module_->template step<0>(
696 temp_[3], {}, {}, temp_[0], tau);
698 hyperbolic_module_->prepare_state_vector(temp_[0], t + 4.0 * tau);
699 hyperbolic_module_->template step<1>(
700 temp_[0], {{ temp_[3]}}, {{Number(-1.)}}, temp_[1], tau);
702 hyperbolic_module_->prepare_state_vector(temp_[1], t + 5.0 * tau);
703 hyperbolic_module_->template step<2>(temp_[1],
704 {{ temp_[3], temp_[0]}},
705 {{Number(0.75), Number(-2.)}},
709 state_vector.swap(temp_[2]);
710 return efficiency_ * tau;
714 template <
typename Description,
int dim,
typename Number>
716 StateVector &state_vector, Number t, Number tau_max)
721 std::cout <<
"TimeIntegrator<dim, Number>::step_strang_erk_43_cn()"
725 Assert(efficiency_ == 8., dealii::ExcInternalError());
727 parabolic_module_->prepare_state_vector(state_vector, t);
731 hyperbolic_module_->prepare_state_vector(state_vector, t);
732 Number tau = hyperbolic_module_->template step<0>(
733 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
735 hyperbolic_module_->prepare_state_vector(temp_[0], t + 1.0 * tau);
736 hyperbolic_module_->template step<1>(
737 temp_[0], {{state_vector}}, {{Number(-1.)}}, temp_[1], tau);
739 hyperbolic_module_->prepare_state_vector(temp_[1], t + 2.0 * tau);
740 hyperbolic_module_->template step<1>(
741 temp_[1], {{temp_[0]}}, {{Number(-1.)}}, temp_[2], tau);
743 hyperbolic_module_->prepare_state_vector(temp_[2], t + 3.0 * tau);
744 hyperbolic_module_->template step<2>(temp_[2],
745 {{temp_[0], temp_[1]}},
746 {{Number(5. / 3.), Number(-10. / 3.)}},
753 parabolic_module_->crank_nicolson_step(temp_[3], t, temp_[2], 8.0 * tau);
762 hyperbolic_module_->prepare_state_vector(temp_[2], t + 4.0 * tau);
763 hyperbolic_module_->template step<0>(
764 temp_[2], {}, {}, temp_[0], tau);
766 hyperbolic_module_->prepare_state_vector(temp_[0], t + 5.0 * tau);
767 hyperbolic_module_->template step<1>(
768 temp_[0], {{ temp_[2]}}, {{Number(-1.)}}, temp_[1], tau);
770 hyperbolic_module_->prepare_state_vector(temp_[1], t + 6.0 * tau);
771 hyperbolic_module_->template step<1>(
772 temp_[1], {{temp_[0]}}, {{Number(-1.)}}, temp_[2], tau);
774 hyperbolic_module_->prepare_state_vector(temp_[2], t + 7.0 * tau);
775 hyperbolic_module_->template step<2>(temp_[2],
776 {{temp_[0], temp_[1]}},
777 {{Number(5. / 3.), Number(-10. / 3.)}},
781 state_vector.swap(temp_[3]);
782 return efficiency_ * tau;
786 template <
typename Description,
int dim,
typename Number>
788 StateVector &state_vector, Number t, Number tau_max)
791 std::cout <<
"TimeIntegrator<dim, Number>::step_imex_11()" << std::endl;
794 Assert(efficiency_ == 1., dealii::ExcInternalError());
796 parabolic_module_->prepare_state_vector(state_vector, t);
799 hyperbolic_module_->prepare_state_vector(state_vector, t);
800 Number tau = hyperbolic_module_->template step<0>(
801 state_vector, {}, {}, temp_[0], Number(0.), tau_max);
804 parabolic_module_->template backward_euler_step<0>(
805 temp_[0], t, {}, {}, temp_[1], 1.0 * tau);
807 state_vector.swap(temp_[1]);
812 template <
typename Description,
int dim,
typename Number>
814 StateVector &state_vector, Number t, Number tau_max)
817 std::cout <<
"TimeIntegrator<dim, Number>::step_imex_22()" << std::endl;
820 Assert(efficiency_ == 2., dealii::ExcInternalError());
822 parabolic_module_->prepare_state_vector(state_vector, t);
825 hyperbolic_module_->prepare_state_vector(state_vector, t);
826 Number tau = hyperbolic_module_->template step<0>(
827 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
830 parabolic_module_->template backward_euler_step<0>(
831 temp_[0], t, {}, {}, temp_[1], tau);
834 hyperbolic_module_->prepare_state_vector(temp_[1], t + 1.0 * tau);
835 hyperbolic_module_->template step<1>(
836 temp_[1], {{state_vector}}, {{Number(-1.)}}, temp_[2], tau);
839 parabolic_module_->template backward_euler_step<1>(temp_[2],
846 state_vector.swap(temp_[3]);
847 return efficiency_ * tau;
851 template <
typename Description,
int dim,
typename Number>
853 StateVector &state_vector, Number t, Number tau_max)
856 std::cout <<
"TimeIntegrator<dim, Number>::step_imex_33()" << std::endl;
859 Assert(efficiency_ == 3., dealii::ExcInternalError());
861 parabolic_module_->prepare_state_vector(state_vector, t);
865 const Number gamma = Number(0.5) + std::sqrt(Number(3.0)) / Number(6.0);
868 hyperbolic_module_->prepare_state_vector(state_vector, t);
869 Number tau = hyperbolic_module_->template step<0>(
870 state_vector, {}, {}, temp_[0], Number(0.), tau_max / efficiency_);
873 parabolic_module_->template backward_euler_step<1>(
877 {{Number(1. - 3. * gamma)}},
882 hyperbolic_module_->prepare_state_vector(temp_[1], t + 1.0 * tau);
883 hyperbolic_module_->template step<1>(
884 temp_[1], {{state_vector}}, {{Number(-1.)}}, temp_[2], tau);
890 parabolic_module_->template backward_euler_step<2>(
893 {{state_vector, temp_[1]}},
894 {{Number(6. * gamma - 1.), Number(2. - 9 * gamma)}},
899 hyperbolic_module_->prepare_state_vector(temp_[3], t + 2. * tau);
900 hyperbolic_module_->template step<2>(temp_[3],
901 {{state_vector, temp_[1]}},
902 {{Number(0.75), Number(-2.)}},
907 parabolic_module_->template backward_euler_step<3>(
910 {{state_vector, temp_[1], temp_[3]}},
911 {{Number(0.75 - 3. * gamma),
912 Number(6. * gamma - 2.),
913 Number(9. / 4. - 3. * gamma)}},
917 state_vector.swap(temp_[5]);
918 return efficiency_ * tau;
Number step_imex_33(StateVector &state_vector, Number t, Number tau_max)
TimeIntegrator(const MPIEnsemble &mpi_ensemble, const OfflineData< dim, Number > &offline_data, const HyperbolicModule< Description, dim, Number > &hyperbolic_module, const ParabolicModule< Description, dim, Number > ¶bolic_module, const std::string &subsection="/TimeIntegrator")
Number step_strang_ssprk_33_cn(StateVector &state_vector, Number t, Number tau_max)
Number step_erk_22(StateVector &state_vector, Number t, Number tau_max)
Number step_imex_11(StateVector &state_vector, Number t, Number tau_max)
Number step_strang_erk_43_cn(StateVector &state_vector, Number t, Number tau_max)
Number step_erk_54(StateVector &state_vector, Number t, Number tau_max)
Number step_erk_33(StateVector &state_vector, Number t, Number tau_max)
Number step_erk_43(StateVector &state_vector, Number t, Number tau_max)
Number step_imex_22(StateVector &state_vector, Number t, Number tau_max)
typename View::StateVector StateVector
Number step_erk_11(StateVector &state_vector, Number t, Number tau_max)
Number step_ssprk_22(StateVector &state_vector, Number t, Number tau_max)
Number step_ssprk_33(StateVector &state_vector, Number t, Number tau_max)
Number step(StateVector &state_vector, Number t, Number t_final=std::numeric_limits< Number >::max())
Number step_strang_erk_33_cn(StateVector &state_vector, Number t, Number tau_max)
std::tuple< MultiComponentVector< Number, problem_dim >, MultiComponentVector< Number, prec_dim >, BlockVector< Number > > StateVector
void sadd(StateVector &dst, const Number s, const Number b, const StateVector &src)