Peano
Loading...
Searching...
No Matches
TransfiniteInterpolation.h
Go to the documentation of this file.
1// This file is part of the Peano project. For conditions of distribution and
2// use, please see the copyright notice at www.peano-framework.org
3#pragma once
4
9
10namespace toolbox {
11 namespace curvi {
12 namespace Interpolation {
14 public:
35 static void interpolate2D(FaceBoundary& boundary, std::vector<double>& face) {
36
37 Coordinate eta = boundary.getCoord(1);
38 Coordinate xi = boundary.getCoord(0);
39
40 int neta = boundary.getIndexSize(eta);
41 int nxi = boundary.getIndexSize(xi);
42
43 double mesh_size_eta = 1.0 / (neta - 1);
44 double mesh_size_xi = 1.0 / (nxi - 1);
45
46 double r;
47 double q;
48
49 idx3 id_dxy(NCOORDS, nxi, neta);
50 idx2 id_dx(NCOORDS, neta);
51 idx2 id_dy(NCOORDS, nxi);
52
53 Edge& left_bnd = boundary.getEdge(eta, false);
54 Edge& right_bnd = boundary.getEdge(eta, true);
55 Edge& bottom_bnd = boundary.getEdge(xi, false);
56 Edge& top_bnd = boundary.getEdge(xi, true);
57
58 for (int d = 0; d < NCOORDS; d++) {
59 for (int j = 0; j < nxi; j++) {
60 for (int i = 0; i < neta; i++) {
61 q = (i)*mesh_size_eta;
62 r = (j)*mesh_size_xi;
63 // From https://en.wikipedia.org/wiki/Transfinite_interpolation
64 face[id_dxy(
65 d,
66 j,
67 i
68 )] = (1 - q) * left_bnd(d, j) + q * right_bnd(d, j) + (1 - r) * bottom_bnd(d, i) + r * top_bnd(d, i)
69 - (1 - q) * (1 - r) * left_bnd(d, 0) // intersection left bottom
70 - q * (1 - r) * right_bnd(d, 0) // intersection right bottom
71 - (1 - q) * r * top_bnd(d, 0) // intersection left top
72 - q * r * top_bnd(d, neta - 1); // intersection right top
73 }
74 }
75 }
76 }
77
78
79 static void interpolate3D(BlockBoundary& boundary, Block& block) {
81 boundary,
82 boundary.getIndexOffset(boundary.getCoord(0)), // mu
83 boundary.getIndexSize(boundary.getCoord(0)),
84 boundary.getIndexOffset(boundary.getCoord(1)), // xi
85 boundary.getIndexSize(boundary.getCoord(1)),
86 boundary.getIndexOffset(boundary.getCoord(2)), // eta
87 boundary.getIndexSize(boundary.getCoord(2)),
88 block
89 );
90 }
91
92
93 static void interpolate3D(
94 BlockBoundary& boundary,
95 int o_mu,
96 int s_mu,
97 int o_xi,
98 int s_xi,
99 int o_eta,
100 int s_eta,
101 Block& block
102 ) {
103
104 Coordinate coords[3];
105 boundary.getCoord(coords);
106 Coordinate eta = coords[2];
107 Coordinate xi = coords[1];
108 Coordinate mu = coords[0];
109
110 double bs_eta = boundary.getIndexSize(eta);
111 double bs_xi = boundary.getIndexSize(xi);
112 double bs_mu = boundary.getIndexSize(mu);
113
114 double bo_eta = boundary.getIndexOffset(eta);
115 double bo_xi = boundary.getIndexOffset(xi);
116 double bo_mu = boundary.getIndexOffset(mu);
117
118 double mesh_size_eta = 1.0 / double(bs_eta - 1.0);
119 double mesh_size_xi = 1.0 / double(bs_xi - 1.0);
120 double mesh_size_mu = 1.0 / double(bs_mu - 1.0);
121
122 int bp_eta = bo_eta + bs_eta;
123 int bp_xi = bo_xi + bs_xi;
124 int bp_mu = bo_mu + bs_mu;
125
126
127 int p_eta = o_eta + s_eta;
128 int p_xi = o_xi + s_xi;
129 int p_mu = o_mu + s_mu;
130
131 double u, v, w;
132 double uv, vw, uw, uvw1, uvw2;
133
134 double d_eta, d_xi, d_mu;
135
136 Face left_bnd = boundary.getFace(eta, false); // mu xi
137 Face right_bnd = boundary.getFace(eta, true); // mu xi
138 Face bottom_bnd = boundary.getFace(mu, false); // xi eta
139 Face top_bnd = boundary.getFace(mu, true); // xi eta
140 Face front_bnd = boundary.getFace(xi, false); // mu eta
141 Face back_bnd = boundary.getFace(xi, true); // mu eta
142
143 for (int d = 0; d < NCOORDS; d++) { // eta
144 for (int i_eta = o_eta; i_eta < p_eta; i_eta++) {
145 d_eta = mesh_size_eta * (i_eta - bo_eta);
146 for (int i_xi = o_xi; i_xi < p_xi; i_xi++) { // xi
147 d_xi = mesh_size_xi * (i_xi - bo_xi);
148 for (int i_mu = o_mu; i_mu < p_mu; i_mu++) { // mu
149 d_mu = mesh_size_mu * (i_mu - bo_mu);
150
151 //(1-eta) * l(0,i_xi) + eta * r(0,i_xi)
152 u = (1 - d_eta) * left_bnd(d, mu, i_mu, xi, i_xi) + d_eta * right_bnd(d, mu, i_mu, xi, i_xi);
153
154 // d_mu = 0 => i_mu = 0
155 v = (1 - d_mu) * bottom_bnd(d, xi, i_xi, eta, i_eta) + d_mu * top_bnd(d, xi, i_xi, eta, i_eta);
156
157 //(1-xi) * f(0,i_eta) + xi * b(0,i_eta)
158 w = (1 - d_xi) * front_bnd(d, mu, i_mu, eta, i_eta) + d_xi * back_bnd(d, mu, i_mu, eta, i_eta);
159
160 // (1-eta) * l(0,i_xi) + eta * l(0,0) * (1-eta) * l(0,i_xi) + eta * l(0,0)
161 uw = (1 - d_eta) * (1 - d_xi) * left_bnd(d, mu, i_mu, xi, bo_xi)
162 + (1 - d_eta) * d_xi * left_bnd(d, mu, i_mu, xi, bp_xi - 1)
163 + d_eta * (1 - d_xi) * right_bnd(d, mu, i_mu, xi, bo_xi)
164 + d_eta * d_xi * right_bnd(d, mu, i_mu, xi, bp_xi - 1);
165
166 // (1-xi) * B(0,i_eta) + xi * B(n_xi-1,i_eta)
167 uv = (1 - d_mu) * (1 - d_eta) * bottom_bnd(d, xi, i_xi, eta, bo_eta)
168 + (1 - d_mu) * d_eta * bottom_bnd(d, xi, i_xi, eta, bp_eta - 1)
169 + d_mu * (1 - d_eta) * top_bnd(d, xi, i_xi, eta, bo_eta)
170 + d_mu * d_eta * top_bnd(d, xi, i_xi, eta, bp_eta - 1);
171
172 // (1-xi) * f(0,i_eta) + ix * b(0,i_eta)
173 vw = (1 - d_xi) * (1 - d_mu) * front_bnd(d, mu, bo_mu, eta, i_eta)
174 + (1 - d_xi) * d_mu * front_bnd(d, mu, bp_mu - 1, eta, i_eta)
175 + d_xi * (1 - d_mu) * back_bnd(d, mu, bo_mu, eta, i_eta)
176 + d_xi * d_mu * back_bnd(d, mu, bp_mu - 1, eta, i_eta);
177
178 //(1-xi)*(1-eta) B(0,0) + (xi)*(1-eta) B(n_xi-1,0)
179 uvw1 = (1 - d_mu) * (1 - d_xi) * (1 - d_eta) * bottom_bnd(d, xi, bo_xi, eta, bo_eta)
180 + (1 - d_mu) * d_xi * (1 - d_eta) * bottom_bnd(d, xi, bp_xi - 1, eta, bo_eta)
181 + d_mu * (1 - d_xi) * (1 - d_eta) * top_bnd(d, xi, bo_xi, eta, bo_eta)
182 + d_mu * d_xi * (1 - d_eta) * top_bnd(d, xi, bp_xi - 1, eta, bo_eta);
183
184 //(1-xi)*(1-eta) B(0,n_eta-1) + (xi)*(1-eta) B(n_xi-1,n_eta-1)
185 uvw2 = (1 - d_mu) * (1 - d_xi) * d_eta * bottom_bnd(d, xi, bo_xi, eta, bp_eta - 1)
186 + (1 - d_mu) * d_xi * d_eta * bottom_bnd(d, xi, bp_xi - 1, eta, bp_eta - 1)
187 + d_mu * (1 - d_xi) * d_eta * top_bnd(d, xi, bo_xi, eta, bp_eta - 1)
188 + d_mu * d_xi * d_eta * top_bnd(d, xi, bp_xi - 1, eta, bp_eta - 1);
189
190 block(d, coords[0], i_mu, coords[1], i_xi, coords[2], i_eta) = u + v + w - uv - uw - vw + uvw1 + uvw2;
191 }
192 }
193 }
194 }
195 }
196 };
197 }; // namespace Interpolation
198 } // namespace curvi
199} // namespace toolbox
#define NCOORDS
Definition Coordinate.h:12
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)
static void interpolate3D(BlockBoundary &boundary, Block &block)
static void interpolate3D(BlockBoundary &boundary, int o_mu, int s_mu, int o_xi, int s_xi, int o_eta, int s_eta, Block &block)
static void interpolate2D(FaceBoundary &boundary, std::vector< double > &face)
2D Transfinite interpolation Performs 2d transfinite interpolation on a uniform grid.