48 #ifndef MUI_COUPLING_ALGORITHM_FIXED_RELAXATION_H_
49 #define MUI_COUPLING_ALGORITHM_FIXED_RELAXATION_H_
51 #include "../../general/util.h"
52 #include "../../config.h"
59 using REAL =
typename CONFIG::REAL;
60 using INT =
typename CONFIG::INT;
66 std::vector<std::pair<point_type, REAL>> pts_value_init =
67 std::vector<std::pair<point_type, REAL>>() ):
73 if (!pts_value_init.empty()) {
77 std::numeric_limits<time_type>::lowest(),
86 template<
typename OTYPE>
89 OTYPE filtered_old_value = 0.0;
93 filtered_old_value = 0.0;
95 std::vector<std::pair<point_type, REAL>> pts_value_temp{
96 std::make_pair(focus,calculate_relaxed_value(filtered_value,filtered_old_value))
101 return calculate_relaxed_value(filtered_value,filtered_old_value);
106 [t](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
107 return (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
108 (t.second == b.first.second));
113 [t, &mi](std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>> b) {
114 return ((t.second == mi) ?
115 (b.first.first < t.first) ||
116 (((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
117 (b.first.second == (mi - 1))) :
118 ((t.first - b.first.first) < std::numeric_limits<time_type>::epsilon()) &&
119 (b.first.second < t.second));
125 std::cerr <<
"Non-monotonic time marching does not (yet) supported for the Fixed Relaxation coupling method! " << std::endl;
130 auto pts_relx_val_iter = std::find_if(present_iter->second.begin(),
131 present_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
132 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
135 if ( pts_relx_val_iter == std::end(present_iter->second) ) {
140 OTYPE value_1st = 0, value_2nd = 0;
141 for(
size_t i = 0 ; i < present_iter->second.size() ; i++ ) {
142 REAL dr2 =
normsq( focus - present_iter->second[i].first );
143 if ( dr2 < r2min_1st ) {
144 r2min_2nd = r2min_1st;
145 value_2nd = value_1st;
147 value_1st = present_iter->second[i].second ;
148 }
else if ( dr2 < r2min_2nd ) {
150 value_2nd = present_iter->second[i].second ;
154 REAL r1 = std::sqrt( r2min_1st );
155 REAL r2 = std::sqrt( r2min_2nd );
157 auto relaxed_value_temp = ( value_1st * r2 + value_2nd * r1 ) / ( r1 + r2 );
159 present_iter->second.insert(present_iter->second.begin(),std::make_pair(focus, relaxed_value_temp));
161 return relaxed_value_temp;
165 return pts_relx_val_iter->second;
172 auto pts_relx_val_iter = std::find_if(previous_iter->second.begin(),
173 previous_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
174 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
177 if ( pts_relx_val_iter == std::end(previous_iter->second) ) {
182 OTYPE value_1st = 0, value_2nd = 0;
183 for(
size_t i = 0 ; i < previous_iter->second.size() ; i++ ) {
184 REAL dr2 =
normsq( focus - previous_iter->second[i].first );
185 if ( dr2 < r2min_1st ) {
186 r2min_2nd = r2min_1st;
187 value_2nd = value_1st;
189 value_1st = previous_iter->second[i].second ;
190 }
else if ( dr2 < r2min_2nd ) {
192 value_2nd = previous_iter->second[i].second ;
196 REAL r1 = std::sqrt( r2min_1st );
197 REAL r2 = std::sqrt( r2min_2nd );
199 filtered_old_value = ( value_1st * r2 + value_2nd * r1 ) / ( r1 + r2 );
203 filtered_old_value = pts_relx_val_iter->second;
207 std::vector<std::pair<point_type, REAL>> pts_value_temp{
208 std::make_pair(focus,calculate_relaxed_value(filtered_value,filtered_old_value))
213 return calculate_relaxed_value(filtered_value,filtered_old_value);
217 auto pts_relx_val_iter = std::find_if(previous_iter->second.begin(),
218 previous_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
219 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
222 if ( pts_relx_val_iter == std::end(previous_iter->second) ) {
227 OTYPE value_1st = 0, value_2nd = 0;
228 for(
size_t i = 0 ; i < previous_iter->second.size() ; i++ ) {
229 REAL dr2 =
normsq( focus - previous_iter->second[i].first );
230 if ( dr2 < r2min_1st ) {
231 r2min_2nd = r2min_1st;
232 value_2nd = value_1st;
234 value_1st = previous_iter->second[i].second ;
235 }
else if ( dr2 < r2min_2nd ) {
237 value_2nd = previous_iter->second[i].second ;
241 REAL r1 = std::sqrt( r2min_1st );
242 REAL r2 = std::sqrt( r2min_2nd );
244 filtered_old_value = ( value_1st * r2 + value_2nd * r1 ) / ( r1 + r2 );
248 filtered_old_value = pts_relx_val_iter->second;
252 auto pts_present_relx_val_iter = std::find_if(present_iter->second.begin(),
253 present_iter->second.end(), [focus](std::pair<point_type, REAL> b) {
254 return normsq(focus - b.first) < std::numeric_limits<REAL>::epsilon();
257 if ( pts_present_relx_val_iter == std::end(present_iter->second) ) {
259 present_iter->second.insert(present_iter->second.begin(),
260 std::make_pair(focus,calculate_relaxed_value(
261 filtered_value,filtered_old_value)
267 pts_present_relx_val_iter->second = calculate_relaxed_value(filtered_value,filtered_old_value);
271 return calculate_relaxed_value(filtered_value,filtered_old_value);
274 return calculate_relaxed_value(filtered_value,filtered_old_value);
279 template<
typename OTYPE>
280 OTYPE calculate_relaxed_value(OTYPE filtered_value, OTYPE filtered_old_value)
const {
291 mutable std::vector<std::pair<std::pair<time_type,iterator_type>,std::vector<std::pair<point_type, REAL>>>>
pts_time_value_;
Definition: algo_fixed_relaxation.h:57
typename CONFIG::point_type point_type
Definition: algo_fixed_relaxation.h:63
std::vector< std::pair< std::pair< time_type, iterator_type >, std::vector< std::pair< point_type, REAL > > > > pts_time_value_
Definition: algo_fixed_relaxation.h:291
typename CONFIG::REAL REAL
Definition: algo_fixed_relaxation.h:59
REAL init_under_relaxation_factor_
Definition: algo_fixed_relaxation.h:287
typename CONFIG::iterator_type iterator_type
Definition: algo_fixed_relaxation.h:62
typename CONFIG::time_type time_type
Definition: algo_fixed_relaxation.h:61
typename CONFIG::INT INT
Definition: algo_fixed_relaxation.h:60
algo_fixed_relaxation(REAL under_relaxation_factor=1.0, std::vector< std::pair< point_type, REAL >> pts_value_init=std::vector< std::pair< point_type, REAL >>())
Definition: algo_fixed_relaxation.h:65
OTYPE relaxation(std::pair< time_type, iterator_type > t, point_type focus, OTYPE filtered_value) const
Definition: algo_fixed_relaxation.h:87
REAL under_relaxation_factor_
Definition: algo_fixed_relaxation.h:288
iterator_type minimum_iterator_
Definition: algo_fixed_relaxation.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