15 const double position[3],
17 std::vector<int> range_z,
18 std::vector<int> range_y,
19 std::vector<int> range_x,
22 for (
int k : range_z) {
23 double dz = range_z.back() - range_z.front();
25 (position[0] - range_z.front()) / dz,
27 range_z.back() - range_z.front() + 1
29 for (
int j : range_y) {
30 double dy = range_y.back() - range_y.front();
32 (position[1] - range_y.front()) / dy,
34 range_y.back() - range_y.front() + 1
36 for (
int i : range_x) {
37 double dx = range_x.back() - range_x.front();
39 (position[2] - range_x.front()) / dx,
41 range_x.back() - range_x.front() + 1
44 for (
int d = 0; d <
NCOORDS; d++) {
45 result[d] += lagrange_z * lagrange_y * lagrange_x
55 std::vector<double> nodes,
56 std::vector<double> values,
60 if (nodes.size() != values.size() /
NCOORDS) {
61 throw std::out_of_range(
"Values and nodes dont't fit in 1d lagrange interpolation");
64 std::fill_n(result,
NCOORDS, 0);
66 for (
int i : index_range) {
69 for (
int d = 0; d <
NCOORDS; d++) {
70 result[d] += lagrange * values[idx(d, i)];
77 double denominator = 1;
78 for (
int j = 0; j < i; j++) {
79 nominator *= (position - range[j]);
80 denominator *= (range[i] - range[j]);
83 for (
int j = i + 1; j < range.size(); j++) {
84 nominator *= (position - range[j]);
85 denominator *= (range[i] - range[j]);
88 return nominator / denominator;
96 for (
int j = 0; j < i; j++) {
97 result *= (position - uniform_mesh[j]);
100 for (
int j = i + 1; j < range; j++) {
101 result *= (position - uniform_mesh[j]);
121 std::vector<double> uniform_mesh;
123 for (
int i = 0; i < range; i++) {
124 uniform_mesh.push_back(i /
double(range - 1));
143 double denominator = 1;
145 for (
int j = 0; j < i; j++) {
146 denominator *= uniformMesh[i] - uniformMesh[j];
149 for (
int j = i + 1; j < range; j++) {
150 denominator *= uniformMesh[i] - uniformMesh[j];
void Interpolation(double *result, tarch::la::Vector< Dimensions, int > *IndexForInter, double *raw, const double *coor, tarch::la::Vector< Dimensions, double > Offset, double volumeH, int patchSize)