48 #ifndef MUI_COUPLING_ALGORITHM_AITKEN_H_
49 #define MUI_COUPLING_ALGORITHM_AITKEN_H_
51 #include "../../general/util.h"
52 #include "../../config.h"
60 using REAL =
typename CONFIG::REAL;
61 using INT =
typename CONFIG::INT;
67 REAL under_relaxation_factor_max = 1.0,
68 MPI_Comm local_comm = MPI_COMM_NULL,
69 std::vector<std::pair<point_type, REAL>> pts_vlu_init =
70 std::vector<std::pair<point_type, REAL>>(),
71 REAL res_l2_norm_nm1 = 0.0):
77 std::make_pair(std::make_pair(
78 std::numeric_limits<time_type>::lowest(),
83 if (!pts_vlu_init.empty()) {
85 std::make_pair(std::make_pair(
86 std::numeric_limits<time_type>::lowest(),
92 if(res_l2_norm_nm1 != 0.0){
94 std::make_pair(std::make_pair(
95 std::numeric_limits<time_type>::lowest(),
97 (std::make_pair(
static_cast<INT>(0), res_l2_norm_nm1)
105 template<
typename OTYPE>
108 OTYPE filtered_old_value = 0.0;
114 filtered_old_value = 0.0;
116 std::vector<std::pair<point_type, REAL>> pts_value_temp{
117 std::make_pair(focus,calculate_relaxed_value(t,filtered_value,filtered_old_value))
122 std::vector<std::pair<point_type, REAL>> pts_res_temp{
123 std::make_pair(focus,calculate_point_residual(t,filtered_value,filtered_old_value))
128 return calculate_relaxed_value(t,filtered_value,filtered_old_value);
133 [t](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
134 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
135 (t.second == b.first.second);});
139 [t, &mi](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
140 return ((t.second == mi) ?
141 (b.first.first < t.first) ||
142 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
143 (b.first.second == (mi - 1))) :
144 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
145 (b.first.second < t.second));});
148 [t](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
149 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
150 (t.second == b.first.second);});
154 [t, &mi](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
155 return ((t.second == mi) ?
156 (b.first.first < t.first) ||
157 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
158 (b.first.second == (mi - 1))) :
159 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
160 (b.first.second < t.second));});
167 std::cerr <<
"Non-monotonic time marching does not (yet) supported for the Aitken coupling method! " << std::endl;
172 assert((((present_iter->first.first - present_res_iter->first.first) < std::numeric_limits<time_type>::epsilon()) &&
173 (present_iter->first.second == present_res_iter->first.second)) ||
pts_time_res_.empty());
179 auto pts_relx_value_iter = std::find_if(present_iter->second.begin(),
180 present_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
181 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
184 auto pts_relx_res_iter = std::find_if(present_res_iter->second.begin(),
185 present_res_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
186 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
189 if ( pts_relx_value_iter == std::end(present_iter->second) ) {
191 assert((pts_relx_res_iter == std::end(present_res_iter->second)) ||
pts_time_res_.empty());
196 OTYPE value_1st = 0, value_2nd = 0;
197 for(
size_t i = 0 ; i < present_iter->second.size() ; i++ ) {
198 REAL dr2 =
normsq( focus - present_iter->second[i].first );
199 if ( dr2 < r2min_1st ) {
200 r2min_2nd = r2min_1st;
201 value_2nd = value_1st;
203 value_1st = present_iter->second[i].second ;
204 }
else if ( dr2 < r2min_2nd ) {
206 value_2nd = present_iter->second[i].second ;
210 REAL r1 = std::sqrt( r2min_1st );
211 REAL r2 = std::sqrt( r2min_2nd );
213 auto relaxed_value_temp = ( value_1st * r2 + value_2nd * r1 ) / ( r1 + r2 );
215 present_iter->second.insert(present_iter->second.begin(),std::make_pair(focus, relaxed_value_temp));
219 std::vector<std::pair<point_type, REAL>> pts_res_temp{
220 std::make_pair(focus, (filtered_value-relaxed_value_temp))
226 present_res_iter->second.insert(present_res_iter->second.begin(),std::make_pair(focus, (filtered_value-relaxed_value_temp)));
229 return relaxed_value_temp;
233 assert((
normsq(pts_relx_value_iter->first - pts_relx_res_iter->first) < std::numeric_limits<REAL>::epsilon()) ||
pts_time_res_.empty());
235 return pts_relx_value_iter->second;
244 auto pts_relx_value_iter = std::find_if(previous_iter->second.begin(),
245 previous_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
246 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
249 if ( pts_relx_value_iter == std::end(previous_iter->second) ) {
254 OTYPE value_1st = 0, value_2nd = 0;
255 for(
size_t i = 0 ; i < previous_iter->second.size() ; i++ ) {
256 REAL dr2 =
normsq( focus - previous_iter->second[i].first );
257 if ( dr2 < r2min_1st ) {
258 r2min_2nd = r2min_1st;
259 value_2nd = value_1st;
261 value_1st = previous_iter->second[i].second ;
262 }
else if ( dr2 < r2min_2nd ) {
264 value_2nd = previous_iter->second[i].second ;
268 REAL r1 = std::sqrt( r2min_1st );
269 REAL r2 = std::sqrt( r2min_2nd );
271 filtered_old_value = ( value_1st * r2 + value_2nd * r1 ) / ( r1 + r2 );
275 filtered_old_value = pts_relx_value_iter->second;
279 std::vector<std::pair<point_type, REAL>> pts_value_temp{
280 std::make_pair(focus,calculate_relaxed_value(t,filtered_value,filtered_old_value))
285 std::vector<std::pair<point_type, REAL>> pts_res_temp{
286 std::make_pair(focus,calculate_point_residual(t,filtered_value,filtered_old_value))
292 [t](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
293 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
294 (t.second == b.first.second);});
298 [t, &mi](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
299 return ((t.second == mi) ?
300 (b.first.first < t.first) ||
301 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
302 (b.first.second == (mi - 1))) :
303 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
304 (b.first.second < t.second));});
307 [t](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
308 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
309 (t.second == b.first.second);});
313 [t, &mi](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
314 return ((t.second == mi) ?
315 (b.first.first < t.first) ||
316 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
317 (b.first.second == (mi - 1))) :
318 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
319 (b.first.second < t.second));});
322 residual_l2_norm_.end(), [previous_iter](std::pair<std::pair<time_type,iterator_type>,std::pair<INT, REAL>> b) {
323 return ((previous_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
324 (previous_iter->first.second == b.first.second);});
330 assert(((previous_iter->first.first - previous_res_iter->first.first) < std::numeric_limits<time_type>::epsilon()) &&
331 (previous_iter->first.second == previous_res_iter->first.second) );
333 REAL local_residual_mag_sq_sum_temp = 0.0;
334 REAL residual_mag_sq_sum_temp = 0.0;
336 for (
auto & element_pair : previous_res_iter->second) {
337 local_residual_mag_sq_sum_temp += std::pow(element_pair.second, 2);
341 residual_mag_sq_sum_temp = local_residual_mag_sq_sum_temp;
343 MPI_Allreduce(&local_residual_mag_sq_sum_temp, &residual_mag_sq_sum_temp, 1, MPI_DOUBLE, MPI_SUM,
local_mpi_comm_world_);
349 previous_res_iter->first, (
352 previous_res_iter->second.size()
353 ), std::sqrt(residual_mag_sq_sum_temp)
360 residual_l2_norm_.end(), [previous_iter](std::pair<std::pair<time_type,iterator_type>,std::pair<INT, REAL>> b) {
361 return ((previous_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
362 (previous_iter->first.second == b.first.second);});
368 if(pts_residual_l2_norm_iter->second.first != 0) {
371 pts_time_res_.end(), [previous_res_iter](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
372 return ((previous_res_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
373 (previous_res_iter->first.second == b.first.second);});
377 if(pts_time_res_iter->second.size() !=
static_cast<size_t>(pts_residual_l2_norm_iter->second.first)) {
379 REAL local_residual_mag_sq_sum_temp = 0.0;
380 REAL residual_mag_sq_sum_temp = 0.0;
382 for (
auto & element_pair : pts_time_res_iter->second) {
383 local_residual_mag_sq_sum_temp += std::pow(element_pair.second, 2);
387 residual_mag_sq_sum_temp = local_residual_mag_sq_sum_temp;
389 MPI_Allreduce(&local_residual_mag_sq_sum_temp, &residual_mag_sq_sum_temp, 1, MPI_DOUBLE, MPI_SUM,
local_mpi_comm_world_);
392 pts_residual_l2_norm_iter->second.second = std::sqrt(residual_mag_sq_sum_temp);
397 return calculate_relaxed_value(t,filtered_value,filtered_old_value);
401 assert((((present_iter->first.first - present_res_iter->first.first) < std::numeric_limits<time_type>::epsilon()) &&
402 (present_iter->first.second == present_res_iter->first.second)) ||
pts_time_res_.empty());
404 auto pts_relx_value_iter = std::find_if(previous_iter->second.begin(),
405 previous_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
406 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
409 if ( pts_relx_value_iter == std::end(previous_iter->second) ) {
414 OTYPE value_1st = 0, value_2nd = 0;
415 for(
size_t i = 0 ; i < previous_iter->second.size() ; i++ ) {
416 REAL dr2 =
normsq( focus - previous_iter->second[i].first );
417 if ( dr2 < r2min_1st ) {
418 r2min_2nd = r2min_1st;
419 value_2nd = value_1st;
421 value_1st = previous_iter->second[i].second ;
422 }
else if ( dr2 < r2min_2nd ) {
424 value_2nd = previous_iter->second[i].second ;
428 REAL r1 = std::sqrt( r2min_1st );
429 REAL r2 = std::sqrt( r2min_2nd );
431 filtered_old_value = ( value_1st * r2 + value_2nd * r1 ) / ( r1 + r2 );
435 filtered_old_value = pts_relx_value_iter->second;
439 auto pts_present_relx_value_iter = std::find_if(present_iter->second.begin(),
440 present_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
441 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
444 auto pts_relx_res_iter = std::find_if(present_res_iter->second.begin(),
445 present_res_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
446 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
449 if ( pts_present_relx_value_iter == std::end(present_iter->second) ) {
451 assert((pts_relx_res_iter == std::end(present_res_iter->second)) ||
pts_time_res_.empty());
453 present_iter->second.insert(present_iter->second.begin(),
454 std::make_pair(focus,calculate_relaxed_value(
455 t,filtered_value,filtered_old_value)
461 std::vector<std::pair<point_type, REAL>> pts_res_temp{
462 std::make_pair(focus,calculate_point_residual(
463 t,filtered_value,filtered_old_value))
470 present_res_iter->second.insert(present_res_iter->second.begin(),
471 std::make_pair(focus,calculate_point_residual(
472 t,filtered_value,filtered_old_value)
478 assert((
normsq(pts_present_relx_value_iter->first - pts_relx_res_iter->first) < std::numeric_limits<REAL>::epsilon()) ||
pts_time_res_.empty());
480 pts_present_relx_value_iter->second = calculate_relaxed_value(t,filtered_value,filtered_old_value);
484 std::vector<std::pair<point_type, REAL>> pts_res_temp{
485 std::make_pair(focus,calculate_point_residual(
486 t,filtered_value,filtered_old_value))
492 pts_relx_res_iter->second = calculate_point_residual(t,filtered_value,filtered_old_value);
496 return calculate_relaxed_value(t,filtered_value,filtered_old_value);
498 return calculate_relaxed_value(t,filtered_value,filtered_old_value);
504 std::pair<time_type,iterator_type> t = std::make_pair(std::numeric_limits<time_type>::lowest(),t_single);
506 update_under_relaxation_factor(t);
510 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
511 (t.second == b.first.second);});
515 return under_relaxation_present_iter->second;
521 std::pair<time_type,iterator_type>
time = std::make_pair(t,it);
523 update_under_relaxation_factor(
time);
527 return ((time.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
528 (time.second == b.first.second);});
532 return under_relaxation_present_iter->second;
538 std::pair<time_type,iterator_type> t = std::make_pair(std::numeric_limits<time_type>::lowest(),t_single);
540 update_under_relaxation_factor(t);
544 residual_l2_norm_.end(), [t, &mi](std::pair<std::pair<time_type,iterator_type>,std::pair<INT, REAL>> b) {
545 return ((t.second == mi) ?
546 (b.first.first < t.first) ||
547 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
548 (b.first.second == (mi - 1))) :
549 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
550 (b.first.second < t.second));});
553 return res_l2_norm_nm1_iter->second.second;
561 std::pair<time_type,iterator_type>
time = std::make_pair(t,it);
563 update_under_relaxation_factor(
time);
567 residual_l2_norm_.end(), [
time, &mi](std::pair<std::pair<time_type,iterator_type>,std::pair<INT, REAL>> b) {
568 return ((time.second == mi) ?
569 (b.first.first < time.first) ||
570 (((time.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
571 (b.first.second == (mi - 1))) :
572 ((time.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
573 (b.first.second < time.second));});
576 return res_l2_norm_nm1_iter->second.second;
583 template<
typename OTYPE>
584 OTYPE calculate_relaxed_value(std::pair<time_type,iterator_type> t, OTYPE filtered_value, OTYPE filtered_old_value)
const {
586 update_under_relaxation_factor(t);
590 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
591 (t.second == b.first.second);});
595 return (under_relaxation_present_iter->second * filtered_value) +
596 ((1 - under_relaxation_present_iter->second) * filtered_old_value);
600 void update_under_relaxation_factor(std::pair<time_type,iterator_type> t)
const {
604 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
605 (t.second == b.first.second);});
610 return ((t.second == mi) ?
611 (b.first.first < t.first) ||
612 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
613 (b.first.second == (mi - 1))) :
614 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
615 (b.first.second < t.second));});
619 residual_l2_norm_.end(), [t, &mi](std::pair<std::pair<time_type,iterator_type>,std::pair<INT, REAL>> b) {
620 return ((t.second == mi) ?
621 (b.first.first < t.first) ||
622 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
623 (b.first.second == (mi - 1))) :
624 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
625 (b.first.second < t.second));});
629 residual_l2_norm_.end(), [res_l2_norm_nm1_iter, &mi](std::pair<std::pair<time_type,iterator_type>,std::pair<INT, REAL>> b) {
630 return ((res_l2_norm_nm1_iter->first.second == mi) ?
631 (b.first.first < res_l2_norm_nm1_iter->first.first) ||
632 (((res_l2_norm_nm1_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
633 (b.first.second == (mi - 1))) :
634 ((res_l2_norm_nm1_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
635 (b.first.second < res_l2_norm_nm1_iter->first.second));});
644 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
645 (t.second == b.first.second);});
650 return ((t.second == mi) ?
651 (b.first.first < t.first) ||
652 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
653 (b.first.second == (mi - 1))) :
654 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
655 (b.first.second < t.second));});
667 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
668 (t.second == b.first.second);});
673 return ((t.second == mi) ?
674 (b.first.first < t.first) ||
675 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
676 (b.first.second == (mi - 1))) :
677 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
678 (b.first.second < t.second));});
683 if(res_l2_norm_nm2_iter->second.first != 0 ) {
684 auto pts_time_res_nm2_iter = std::find_if(
pts_time_res_.begin(),
685 pts_time_res_.end(), [res_l2_norm_nm2_iter](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
686 return ((res_l2_norm_nm2_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
687 (res_l2_norm_nm2_iter->first.second == b.first.second);});
691 if(pts_time_res_nm2_iter->second.size() !=
static_cast<size_t>(res_l2_norm_nm2_iter->second.first)) {
693 REAL local_residual_mag_sq_sum_temp = 0.0;
694 REAL residual_mag_sq_sum_temp = 0.0;
696 for (
auto & element_pair : pts_time_res_nm2_iter->second) {
697 local_residual_mag_sq_sum_temp += std::pow(element_pair.second, 2);
701 residual_mag_sq_sum_temp = local_residual_mag_sq_sum_temp;
703 MPI_Allreduce(&local_residual_mag_sq_sum_temp, &residual_mag_sq_sum_temp, 1, MPI_DOUBLE, MPI_SUM,
local_mpi_comm_world_);
706 res_l2_norm_nm2_iter->second.second = std::sqrt(residual_mag_sq_sum_temp);
708 update_under_relaxation_factor(res_l2_norm_nm2_iter->first);
711 auto pts_time_res_nm1_iter = std::find_if(
pts_time_res_.begin(),
712 pts_time_res_.end(), [res_l2_norm_nm1_iter](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
713 return ((res_l2_norm_nm1_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
714 (res_l2_norm_nm1_iter->first.second == b.first.second);});
716 if(pts_time_res_nm1_iter->second.size() !=
static_cast<size_t>(res_l2_norm_nm1_iter->second.first)) {
718 REAL local_residual_mag_sq_sum_temp = 0.0;
719 REAL residual_mag_sq_sum_temp = 0.0;
721 for (
auto & element_pair : pts_time_res_nm1_iter->second) {
722 local_residual_mag_sq_sum_temp += std::pow(element_pair.second, 2);
726 residual_mag_sq_sum_temp = local_residual_mag_sq_sum_temp;
728 MPI_Allreduce(&local_residual_mag_sq_sum_temp, &residual_mag_sq_sum_temp, 1, MPI_DOUBLE, MPI_SUM,
local_mpi_comm_world_);
731 res_l2_norm_nm1_iter->second.second = std::sqrt(residual_mag_sq_sum_temp);
733 update_under_relaxation_factor(res_l2_norm_nm1_iter->first);
737 double nominator = res_l2_norm_nm2_iter->second.second;
738 double denominator = res_l2_norm_nm1_iter->second.second - res_l2_norm_nm2_iter->second.second;
740 if (denominator != 0.0 ) {
751 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
752 (t.second == b.first.second);
758 return ((t.second == mi) ?
759 (b.first.first < t.first) ||
760 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
761 (b.first.second == (mi - 1))) :
762 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
763 (b.first.second < t.second));});
767 t, calculate_aitken_constraint_pnz_control(
768 -under_relaxation_prev_iter->second * (nominator/denominator)
775 return ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
776 (t.second == b.first.second);});
781 return ((t.second == mi) ?
782 (b.first.first < t.first) ||
783 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
784 (b.first.second == (mi - 1))) :
785 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
786 (b.first.second < t.second));});
794 return ((t.first - b.first.first) < std::numeric_limits<REAL>::epsilon()) &&
795 (t.second == b.first.second);});
800 return ((t.second == mi) ?
801 (b.first.first < t.first) ||
802 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
803 (b.first.second == (mi - 1))) :
804 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
805 (b.first.second < t.second));});
814 std::cout <<
"change under Relax Factor to its initial value." << std::endl;
819 if(res_l2_norm_nm2_iter->second.first != 0 ) {
820 auto pts_time_res_nm2_iter = std::find_if(
pts_time_res_.begin(),
821 pts_time_res_.end(), [res_l2_norm_nm2_iter](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
822 return ((res_l2_norm_nm2_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
823 (res_l2_norm_nm2_iter->first.second == b.first.second);});
827 if(pts_time_res_nm2_iter->second.size() !=
static_cast<size_t>(res_l2_norm_nm2_iter->second.first)) {
829 REAL local_residual_mag_sq_sum_temp = 0.0;
830 REAL residual_mag_sq_sum_temp = 0.0;
832 for (
auto & element_pair : pts_time_res_nm2_iter->second) {
833 local_residual_mag_sq_sum_temp += std::pow(element_pair.second, 2);
837 residual_mag_sq_sum_temp = local_residual_mag_sq_sum_temp;
839 MPI_Allreduce(&local_residual_mag_sq_sum_temp, &residual_mag_sq_sum_temp, 1, MPI_DOUBLE, MPI_SUM,
local_mpi_comm_world_);
842 res_l2_norm_nm2_iter->second.second = std::sqrt(residual_mag_sq_sum_temp);
846 auto pts_time_res_nm1_iter = std::find_if(
pts_time_res_.begin(),
847 pts_time_res_.end(), [res_l2_norm_nm1_iter](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
848 return (((res_l2_norm_nm1_iter->first.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
849 (res_l2_norm_nm1_iter->first.second == b.first.second));});
851 if(pts_time_res_nm1_iter->second.size() !=
static_cast<size_t>(res_l2_norm_nm1_iter->second.first)) {
853 REAL local_residual_mag_sq_sum_temp = 0.0;
854 REAL residual_mag_sq_sum_temp = 0.0;
856 for (
auto & element_pair : pts_time_res_nm1_iter->second) {
857 local_residual_mag_sq_sum_temp += std::pow(element_pair.second, 2);
861 residual_mag_sq_sum_temp = local_residual_mag_sq_sum_temp;
863 MPI_Allreduce(&local_residual_mag_sq_sum_temp, &residual_mag_sq_sum_temp, 1, MPI_DOUBLE, MPI_SUM,
local_mpi_comm_world_);
866 res_l2_norm_nm1_iter->second.second = std::sqrt(residual_mag_sq_sum_temp);
868 update_under_relaxation_factor(res_l2_norm_nm1_iter->first);
872 double nominator = res_l2_norm_nm2_iter->second.second;
873 double denominator = res_l2_norm_nm1_iter->second.second - res_l2_norm_nm2_iter->second.second;
875 if (denominator != 0.0 ) {
880 std::cout <<
"Update under Relx Factor. Position 01." << std::endl;
884 if(under_relaxation_present_iter->second != calculate_aitken_constraint_pnz_control(
885 -under_relaxation_prev_iter->second * (nominator/denominator))
887 std::cout <<
"Update under Relx Factor. Position 02." << std::endl;
888 under_relaxation_present_iter->second = calculate_aitken_constraint_pnz_control(
889 -under_relaxation_prev_iter->second * (nominator/denominator)
895 std::cout <<
"Update under Relx Factor. Position 03." << std::endl;
904 REAL calculate_aitken_constraint(
REAL under_relaxation_factor) {
910 REAL calculate_aitken_constraint_pn_control(
REAL under_relaxation_factor) {
915 REAL calculate_aitken_constraint_pnz_control(
REAL under_relaxation_factor)
const {
920 template<
typename OTYPE>
921 OTYPE calculate_point_residual(std::pair<time_type,iterator_type> t, OTYPE filtered_value, OTYPE filtered_old_value)
const {
923 return (filtered_value - calculate_relaxed_value(t, filtered_value, filtered_old_value));
929 return (value < 0) ? -1 : ((value > 0) ? 1 : 0);
943 mutable std::vector<std::pair<std::pair<time_type,iterator_type>,std::pair<INT, REAL>>>
residual_l2_norm_;
945 mutable std::vector<std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>>>
pts_time_value_;
947 mutable std::vector<std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>>>
pts_time_res_;
Definition: algo_aitken.h:58
REAL get_residual_L2_Norm(time_type t_single)
Definition: algo_aitken.h:536
iterator_type minimum_iterator_
Definition: algo_aitken.h:939
std::vector< std::pair< std::pair< time_type, iterator_type >, std::vector< std::pair< point_type, REAL > > > > pts_time_value_
Definition: algo_aitken.h:945
REAL get_residual_L2_Norm(time_type t, iterator_type it)
Definition: algo_aitken.h:559
const REAL init_under_relaxation_factor_
Definition: algo_aitken.h:933
const REAL under_relaxation_factor_max_
Definition: algo_aitken.h:935
typename CONFIG::REAL REAL
Definition: algo_aitken.h:60
REAL get_under_relaxation_factor(time_type t, iterator_type it)
Definition: algo_aitken.h:519
std::vector< std::pair< std::pair< time_type, iterator_type >, REAL > > under_relaxation_factor_
Definition: algo_aitken.h:941
OTYPE relaxation(std::pair< time_type, iterator_type > t, point_type focus, OTYPE filtered_value) const
Definition: algo_aitken.h:106
typename CONFIG::INT INT
Definition: algo_aitken.h:61
typename CONFIG::point_type point_type
Definition: algo_aitken.h:64
REAL get_under_relaxation_factor(time_type t_single)
Definition: algo_aitken.h:502
algo_aitken(REAL under_relaxation_factor=1.0, REAL under_relaxation_factor_max=1.0, MPI_Comm local_comm=MPI_COMM_NULL, std::vector< std::pair< point_type, REAL >> pts_vlu_init=std::vector< std::pair< point_type, REAL >>(), REAL res_l2_norm_nm1=0.0)
Definition: algo_aitken.h:66
MPI_Comm local_mpi_comm_world_
Definition: algo_aitken.h:937
typename CONFIG::time_type time_type
Definition: algo_aitken.h:62
std::vector< std::pair< std::pair< time_type, iterator_type >, std::pair< INT, REAL > > > residual_l2_norm_
Definition: algo_aitken.h:943
std::vector< std::pair< std::pair< time_type, iterator_type >, std::vector< std::pair< point_type, REAL > > > > pts_time_res_
Definition: algo_aitken.h:947
typename CONFIG::iterator_type iterator_type
Definition: algo_aitken.h:63
dim< 0, 0, 1, 0, 0, 0, 0, 0 > time
Definition: dim.h:207
u u u u u u min
Definition: dim.h:289
SCALAR max(vexpr< E, SCALAR, D > const &u)
Definition: point.h:350
SCALAR normsq(vexpr< E, SCALAR, D > const &u)
Definition: point.h:380