55 std::vector<GlobalVector*>
const& x_prev,
56 std::size_t
const n_nodes)
const
58 using EntryInput = std::vector<double>;
60 for (std::size_t node_id = 0; node_id < n_nodes; ++node_id)
62 std::vector<InterpolationPoint> interpolation_points;
63 EntryInput base_entry_input;
68 auto const process_id = input_field.variable_id;
69 auto const& variable_name = input_field.name;
70 double input_field_value =
71 variable_name.find(
"_prev") == std::string::npos
72 ? x[process_id]->get(node_id)
73 : x_prev[process_id]->get(node_id);
75 (std::abs(input_field_value) + input_field_value) / 2;
76 auto bounding_seed_points =
77 input_field.getBoundingSeedPoints(input_field_value);
81 interpolation_points.push_back(interpolation_point);
83 base_entry_input.push_back(bounding_seed_points.first);
89 EntryInput bounding_entry_input{base_entry_input};
90 std::vector<std::size_t> bounding_entry_ids;
91 for (std::size_t i = 0; i < interpolation_points.size(); ++i)
93 bounding_entry_input[i] =
94 interpolation_points[i].bounding_points.second;
96 bounding_entry_input[i] =
97 interpolation_points[i].bounding_points.first;
102 if (input_field.name.find(
"_prev") != std::string::npos)
107 auto const output_field_name = input_field.name +
"_new";
108 auto const base_value =
110 auto new_value = base_value;
113 for (std::size_t i = 0; i < interpolation_points.size(); ++i)
115 auto const interpolation_point_value =
116 tabular_data.at(output_field_name)[bounding_entry_ids[i]];
118 (interpolation_point_value - base_value) /
119 (interpolation_points[i].bounding_points.second -
120 interpolation_points[i].bounding_points.first);
123 slope * (interpolation_points[i].value -
124 interpolation_points[i].bounding_points.first);
127 x[input_field.variable_id]->set(node_id, new_value);