Project
Loading...
Searching...
No Matches
TriCubic.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
20
21using namespace o2::tpc;
22
24template <typename DataT>
26{
27 if (this != &other) {
28 mExtrapolationType = other.mExtrapolationType;
29 // do not change address of old pointers!
30 other.mGridData = nullptr;
31 other.mGridProperties = nullptr;
32 }
33}
34
35template <typename DataT>
37{
38 if (this != &other) {
39 mExtrapolationType = other.mExtrapolationType;
40 // do not change address of old pointers!
41 other.mGridData = nullptr;
42 other.mGridProperties = nullptr;
43 }
44 return *this;
45}
46
47template <typename DataT>
48DataT TriCubicInterpolator<DataT>::extrapolation(const DataT valk, const DataT valk1, const DataT valk2) const
49{
50 switch (mExtrapolationType) {
51 case ExtrapolationType::Linear:
52 default:
53 return linearExtrapolation(valk, valk1);
54 break;
55 case ExtrapolationType::Parabola:
56 return parabolExtrapolation(valk, valk1, valk2);
57 break;
58 }
59}
60
61template <typename DataT>
64 const DataT val = 2 * valk - valk1;
65 return val;
67
68template <typename DataT>
69DataT TriCubicInterpolator<DataT>::parabolExtrapolation(const DataT valk, const DataT valk1, const DataT valk2) const
70{
71 const DataT val = 3 * (valk - valk1) + valk2; // legendre polynom with x0=0, x1=1, x2=2 and z=-1
72 return val;
73}
74
75template <typename DataT>
77{
78 // check if data is empty
79 if (!mGridData->getNDataPoints()) {
80 return 0;
81 }
82 const Vector<DataT, FDim> coordinates{{z, r, phi}}; // vector holding the coordinates
83 Vector<DataT, FDim> posRel{(coordinates - mGridProperties->getGridMin()) * mGridProperties->getInvSpacing()}; // needed for the grid index
84 posRel[FPHI] = mGridProperties->clampToGridCircularRel(posRel[FPHI], FPHI);
85 Vector<DataT, FDim> posRelN{posRel};
86 posRel[FZ] = mGridProperties->clampToGridRel(posRel[FZ], FZ);
87 posRel[FR] = mGridProperties->clampToGridRel(posRel[FR], FR);
88 if (!mExtraPolateValues) {
89 posRelN[FZ] = posRel[FZ];
90 posRelN[FR] = posRel[FR];
91 }
92
93 const int nPoints = 4;
94 std::array<Vector<DataT, nPoints>, 16> cVals;
95 const Vector<DataT, FDim> index{floor_vec(posRel)};
96 setValues(index[FZ], index[FR], index[FPHI], cVals);
97
98 const Vector<DataT, FDim> vals0{posRelN - index};
99 const Vector<DataT, FDim> vals1{vals0 * vals0};
100 const Vector<DataT, FDim> vals2{vals0 * vals1};
101
102 const Vector<DataT, nPoints> vecValX{{1, vals0[FZ], vals1[FZ], vals2[FZ]}};
103 const Vector<DataT, nPoints> vecValY{{1, vals0[FR], vals1[FR], vals2[FR]}};
104 const Vector<DataT, nPoints> vecValZ{{1, vals0[FPHI], vals1[FPHI], vals2[FPHI]}};
105
106 const static std::array<Vc::Memory<Vc::Vector<DataT>, nPoints>, nPoints> matrixA{{{0, -0.5, 1, -0.5},
107 {1, 0, -2.5, 1.5},
108 {0, 0.5, 2., -1.5},
109 {0, 0, -0.5, 0.5}}};
110
111 const Vector<DataT, nPoints> vecValXMult{matrixA * vecValX};
112 const Vector<DataT, nPoints> vecValYMult{matrixA * vecValY};
113 const Vector<DataT, nPoints> vecValZMult{matrixA * vecValZ};
114
115 DataT result{};
116 int ind = 0;
117 for (int slice = 0; slice < nPoints; ++slice) {
118 const Vector<DataT, nPoints> vecA{vecValZMult[slice] * vecValYMult};
119 for (int row = 0; row < nPoints; ++row) {
120 result += sum(vecA[row] * vecValXMult * cVals[ind++]);
121 }
122 }
123 return result;
124}
125
126// for perdiodic boundary condition
127template <typename DataT>
128void TriCubicInterpolator<DataT>::getDataIndexCircularArray(const int index0, const int dim, int arr[]) const
129{
130 const int delta_min1 = getRegulatedDelta(index0, -1, dim, mGridProperties->getN(dim) - 1);
131 const int delta_plus1 = getRegulatedDelta(index0, +1, dim, 1 - mGridProperties->getN(dim));
132 const int delta_plus2 = getRegulatedDelta(index0, +2, dim, 2 - mGridProperties->getN(dim));
133
134 arr[0] = mGridProperties->getDeltaDataIndex(delta_min1, dim);
135 arr[1] = mGridProperties->getDeltaDataIndex(delta_plus1, dim);
136 arr[2] = mGridProperties->getDeltaDataIndex(delta_plus2, dim);
137}
138
139template <typename DataT>
140typename TriCubicInterpolator<DataT>::GridPos TriCubicInterpolator<DataT>::findPos(const int iz, const int ir, const int iphi) const
141{
142 GridPos pos = GridPos::None;
143 if (isInInnerVolume(iz, ir, iphi, pos)) {
144 return pos;
145 }
146
147 if (findEdge(iz, ir, iphi, pos)) {
148 return pos;
149 }
150
151 if (findLine(iz, ir, iphi, pos)) {
152 return pos;
153 }
154
155 if (findSide(iz, ir, iphi, pos)) {
156 return pos;
157 }
158 return GridPos::None;
159}
160
161template <typename DataT>
162bool TriCubicInterpolator<DataT>::findEdge(const int iz, const int ir, const int iphi, GridPos& posType) const
163{
164 const int iR = 2;
165 if (iz == 0 && ir == 0) {
166 if (iphi == 0) {
167 posType = GridPos::Edge0;
168 return true;
169 } else if (iphi == mGridData->getNPhi() - iR) {
170 posType = GridPos::Edge4;
171 return true;
172 }
173 } else if (iz == mGridData->getNZ() - iR && ir == 0) {
174 if (iphi == 0) {
175 posType = GridPos::Edge1;
176 return true;
177 } else if (iphi == mGridData->getNPhi() - iR) {
178 posType = GridPos::Edge5;
179 return true;
180 }
181 } else if (iz == 0 && ir == mGridData->getNR() - iR) {
182 if (iphi == 0) {
183 posType = GridPos::Edge2;
184 return true;
185 } else if (iphi == mGridData->getNPhi() - iR) {
186 posType = GridPos::Edge6;
187 return true;
188 }
189 } else if (iz == mGridData->getNZ() - iR && ir == mGridData->getNR() - iR) {
190 if (iphi == 0) {
191 posType = GridPos::Edge3;
192 return true;
193 } else if (iphi == mGridData->getNPhi() - iR) {
194 posType = GridPos::Edge7;
195 return true;
196 }
197 }
198 return false;
199}
200
201template <typename DataT>
202bool TriCubicInterpolator<DataT>::findLine(const int iz, const int ir, const int iphi, GridPos& posType) const
203{
204 const int iR = 2;
205 // check line
206 if (ir == 0) {
207 if (iphi == 0) {
208 posType = GridPos::LineA;
209 return true;
210 } else if (iphi == mGridData->getNPhi() - iR) {
211 posType = GridPos::LineE;
212 return true;
213 }
214 if (iz == 0) {
215 posType = GridPos::LineI;
216 return true;
217 } else if (iz == mGridData->getNZ() - iR) {
218 posType = GridPos::LineJ;
219 return true;
220 }
221 } else if (ir == mGridData->getNR() - iR) {
222 if (iphi == 0) {
223 posType = GridPos::LineB;
224 return true;
225 } else if (iphi == mGridData->getNPhi() - iR) {
226 posType = GridPos::LineF;
227 return true;
228 }
229 if (iz == 0) {
230 posType = GridPos::LineK;
231 return true;
232 } else if (iz == mGridData->getNZ() - iR) {
233 posType = GridPos::LineL;
234 return true;
235 }
236 } else if (iz == 0) {
237 if (iphi == 0) {
238 posType = GridPos::LineC;
239 return true;
240 } else if (iphi == mGridData->getNPhi() - iR) {
241 posType = GridPos::LineG;
242 return true;
243 }
244 } else if (iz == mGridData->getNZ() - iR) {
245 if (iphi == 0) {
246 posType = GridPos::LineD;
247 return true;
248 } else if (iphi == mGridData->getNPhi() - iR) {
249 posType = GridPos::LineH;
250 return true;
251 }
252 }
253 return false;
254}
255
256template <typename DataT>
257bool TriCubicInterpolator<DataT>::findSide(const int iz, const int ir, const int iphi, GridPos& posType) const
258{
259 if (isSideRight(iz, FZ)) {
260 posType = GridPos::SideXRight;
261 return true;
262 } else if (isSideLeft(iz)) {
263 posType = GridPos::SideXLeft;
264 return true;
265 }
266 if (isSideRight(ir, FR)) {
267 posType = GridPos::SideYRight;
268 return true;
269 } else if (isSideLeft(ir)) {
270 posType = GridPos::SideYLeft;
271 return true;
272 }
273 if (isSideRight(iphi, FPHI)) {
274 posType = GridPos::SideZRight;
275 return true;
276 } else if (isSideLeft(iphi)) {
277 posType = GridPos::SideZLeft;
278 return true;
279 }
280 return false;
281}
282
283template <typename DataT>
284bool TriCubicInterpolator<DataT>::isInInnerVolume(const int iz, const int ir, const int iphi, GridPos& posType) const
285{
286 if (iz >= 1 && iz < static_cast<int>(mGridData->getNZ() - 2) && ir >= 1 && ir < static_cast<int>(mGridData->getNR() - 2) && iphi >= 1 && iphi < static_cast<int>(mGridData->getNPhi() - 2)) {
287 posType = GridPos::InnerVolume;
288 return true;
289 }
290 return false;
291}
292
293template <typename DataT>
294bool TriCubicInterpolator<DataT>::isSideRight(const int ind, const int dim) const
295{
296 if (ind == static_cast<int>(mGridProperties->getN(dim) - 2)) {
297 return true;
298 }
299 return false;
300}
301
302template <typename DataT>
303bool TriCubicInterpolator<DataT>::isSideLeft(const int ind) const
304{
305 if (ind == 0) {
306 return true;
307 }
308 return false;
309}
310
311template <typename DataT>
312void TriCubicInterpolator<DataT>::setValues(const int iz, const int ir, const int iphi, std::array<Vector<DataT, 4>, 16>& cVals) const
313{
314 const GridPos location = findPos(iz, ir, iphi);
315 const int ii_x_y_z = mGridData->getDataIndex(iz, ir, iphi);
316 cVals[5][1] = (*mGridData)[ii_x_y_z];
317
318 int deltaZ[3]{mGridProperties->getDeltaDataIndex(-1, 0), mGridProperties->getDeltaDataIndex(1, 0), mGridProperties->getDeltaDataIndex(2, 0)};
319 int deltaR[3]{mGridProperties->getDeltaDataIndex(-1, 1), mGridProperties->getDeltaDataIndex(1, 1), mGridProperties->getDeltaDataIndex(2, 1)};
320 int deltaPhi[3]{};
321 getDataIndexCircularArray(iphi, FPHI, deltaPhi);
322
323 const int i0 = 0;
324 const int i1 = 1;
325 const int i2 = 2;
326
327 switch (location) {
328 case GridPos::InnerVolume:
329 case GridPos::SideZRight:
330 case GridPos::SideZLeft:
331 default: {
332 const int ind[4][4][4]{
333 {{ii_x_y_z + deltaPhi[i0] + deltaR[i0] + deltaZ[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0], ind[0][0][2] - deltaZ[i0]},
334 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0], ind[0][1][2] - deltaZ[i0]},
335 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0], ind[0][2][2] - deltaZ[i0]},
336 {ind[0][2][0] - deltaR[i0], ind[0][3][0] - deltaZ[i0], ind[0][3][1] - deltaZ[i0], ind[0][3][2] - deltaZ[i0]}},
337 {{ii_x_y_z + deltaR[i0] + deltaZ[i0], ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0], ind[1][0][2] - deltaZ[i0]},
338 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0], ind[1][1][2] - deltaZ[i0]},
339 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0], ind[1][2][2] - deltaZ[i0]},
340 {ind[1][2][0] - deltaR[i0], ind[1][3][0] - deltaZ[i0], ind[1][3][1] - deltaZ[i0], ind[1][3][2] - deltaZ[i0]}},
341 {{ii_x_y_z + deltaPhi[i1] + deltaR[i0] + deltaZ[i0], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0], ind[2][0][2] - deltaZ[i0]},
342 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0], ind[2][1][2] - deltaZ[i0]},
343 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0], ind[2][2][2] - deltaZ[i0]},
344 {ind[2][2][0] - deltaR[i0], ind[2][3][0] - deltaZ[i0], ind[2][3][1] - deltaZ[i0], ind[2][3][2] - deltaZ[i0]}},
345 {{ii_x_y_z + deltaPhi[i2] + deltaR[i0] + deltaZ[i0], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0], ind[3][0][2] - deltaZ[i0]},
346 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0], ind[3][1][2] - deltaZ[i0]},
347 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0], ind[3][2][2] - deltaZ[i0]},
348 {ind[3][2][0] - deltaR[i0], ind[3][3][0] - deltaZ[i0], ind[3][3][1] - deltaZ[i0], ind[3][3][2] - deltaZ[i0]}}};
349
350 cVals[0][0] = (*mGridData)[ind[0][0][0]];
351 cVals[0][1] = (*mGridData)[ind[0][0][1]];
352 cVals[0][2] = (*mGridData)[ind[0][0][2]];
353 cVals[0][3] = (*mGridData)[ind[0][0][3]];
354 cVals[1][0] = (*mGridData)[ind[0][1][0]];
355 cVals[1][1] = (*mGridData)[ind[0][1][1]];
356 cVals[1][2] = (*mGridData)[ind[0][1][2]];
357 cVals[1][3] = (*mGridData)[ind[0][1][3]];
358 cVals[2][0] = (*mGridData)[ind[0][2][0]];
359 cVals[2][1] = (*mGridData)[ind[0][2][1]];
360 cVals[2][2] = (*mGridData)[ind[0][2][2]];
361 cVals[2][3] = (*mGridData)[ind[0][2][3]];
362 cVals[3][0] = (*mGridData)[ind[0][3][0]];
363 cVals[3][1] = (*mGridData)[ind[0][3][1]];
364 cVals[3][2] = (*mGridData)[ind[0][3][2]];
365 cVals[3][3] = (*mGridData)[ind[0][3][3]];
366 cVals[4][0] = (*mGridData)[ind[1][0][0]];
367 cVals[4][1] = (*mGridData)[ind[1][0][1]];
368 cVals[4][2] = (*mGridData)[ind[1][0][2]];
369 cVals[4][3] = (*mGridData)[ind[1][0][3]];
370 cVals[5][2] = (*mGridData)[ind[1][1][2]];
371 cVals[5][0] = (*mGridData)[ind[1][1][0]];
372 cVals[5][3] = (*mGridData)[ind[1][1][3]];
373 cVals[6][0] = (*mGridData)[ind[1][2][0]];
374 cVals[6][1] = (*mGridData)[ind[1][2][1]];
375 cVals[6][2] = (*mGridData)[ind[1][2][2]];
376 cVals[6][3] = (*mGridData)[ind[1][2][3]];
377 cVals[7][0] = (*mGridData)[ind[1][3][0]];
378 cVals[7][1] = (*mGridData)[ind[1][3][1]];
379 cVals[7][2] = (*mGridData)[ind[1][3][2]];
380 cVals[7][3] = (*mGridData)[ind[1][3][3]];
381 cVals[8][0] = (*mGridData)[ind[2][0][0]];
382 cVals[8][1] = (*mGridData)[ind[2][0][1]];
383 cVals[8][2] = (*mGridData)[ind[2][0][2]];
384 cVals[8][3] = (*mGridData)[ind[2][0][3]];
385 cVals[9][0] = (*mGridData)[ind[2][1][0]];
386 cVals[9][1] = (*mGridData)[ind[2][1][1]];
387 cVals[9][2] = (*mGridData)[ind[2][1][2]];
388 cVals[9][3] = (*mGridData)[ind[2][1][3]];
389 cVals[10][0] = (*mGridData)[ind[2][2][0]];
390 cVals[10][1] = (*mGridData)[ind[2][2][1]];
391 cVals[10][2] = (*mGridData)[ind[2][2][2]];
392 cVals[10][3] = (*mGridData)[ind[2][2][3]];
393 cVals[11][0] = (*mGridData)[ind[2][3][0]];
394 cVals[11][1] = (*mGridData)[ind[2][3][1]];
395 cVals[11][2] = (*mGridData)[ind[2][3][2]];
396 cVals[11][3] = (*mGridData)[ind[2][3][3]];
397 cVals[12][0] = (*mGridData)[ind[3][0][0]];
398 cVals[12][1] = (*mGridData)[ind[3][0][1]];
399 cVals[12][2] = (*mGridData)[ind[3][0][2]];
400 cVals[12][3] = (*mGridData)[ind[3][0][3]];
401 cVals[13][0] = (*mGridData)[ind[3][1][0]];
402 cVals[13][1] = (*mGridData)[ind[3][1][1]];
403 cVals[13][2] = (*mGridData)[ind[3][1][2]];
404 cVals[13][3] = (*mGridData)[ind[3][1][3]];
405 cVals[14][0] = (*mGridData)[ind[3][2][0]];
406 cVals[14][1] = (*mGridData)[ind[3][2][1]];
407 cVals[14][2] = (*mGridData)[ind[3][2][2]];
408 cVals[14][3] = (*mGridData)[ind[3][2][3]];
409 cVals[15][0] = (*mGridData)[ind[3][3][0]];
410 cVals[15][1] = (*mGridData)[ind[3][3][1]];
411 cVals[15][2] = (*mGridData)[ind[3][3][2]];
412 cVals[15][3] = (*mGridData)[ind[3][3][3]];
413 } break;
414
415 case GridPos::SideXRight:
416 case GridPos::LineD:
417 case GridPos::LineH: {
418 const int ind[4][4][3]{
419 {{ii_x_y_z + deltaPhi[i0] + deltaR[i0] + deltaZ[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0]},
420 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0]},
421 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0]},
422 {ind[0][2][0] - deltaR[i0], ind[0][3][0] - deltaZ[i0], ind[0][3][1] - deltaZ[i0]}},
423 {{ii_x_y_z + deltaR[i0] + deltaZ[i0], ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0]},
424 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0]},
425 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0]},
426 {ind[1][2][0] - deltaR[i0], ind[1][3][0] - deltaZ[i0], ind[1][3][1] - deltaZ[i0]}},
427 {{ii_x_y_z + deltaPhi[i1] + deltaR[i0] + deltaZ[i0], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0]},
428 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0]},
429 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0]},
430 {ind[2][2][0] - deltaR[i0], ind[2][3][0] - deltaZ[i0], ind[2][3][1] - deltaZ[i0]}},
431 {{ii_x_y_z + deltaPhi[i2] + deltaR[i0] + deltaZ[i0], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0]},
432 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0]},
433 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0]},
434 {ind[3][2][0] - deltaR[i0], ind[3][3][0] - deltaZ[i0], ind[3][3][1] - deltaZ[i0]}}};
435
436 cVals[0][0] = (*mGridData)[ind[0][0][0]];
437 cVals[0][1] = (*mGridData)[ind[0][0][1]];
438 cVals[0][2] = (*mGridData)[ind[0][0][2]];
439 cVals[0][3] = extrapolation((*mGridData)[ind[0][0][2]], (*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][0][0]]);
440 cVals[1][0] = (*mGridData)[ind[0][1][0]];
441 cVals[1][1] = (*mGridData)[ind[0][1][1]];
442 cVals[1][2] = (*mGridData)[ind[0][1][2]];
443 cVals[1][3] = extrapolation((*mGridData)[ind[0][1][2]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][1][0]]);
444 cVals[2][0] = (*mGridData)[ind[0][2][0]];
445 cVals[2][1] = (*mGridData)[ind[0][2][1]];
446 cVals[2][2] = (*mGridData)[ind[0][2][2]];
447 cVals[2][3] = extrapolation((*mGridData)[ind[0][2][2]], (*mGridData)[ind[0][2][1]], (*mGridData)[ind[0][2][0]]);
448 cVals[3][0] = (*mGridData)[ind[0][3][0]];
449 cVals[3][1] = (*mGridData)[ind[0][3][1]];
450 cVals[3][2] = (*mGridData)[ind[0][3][2]];
451 cVals[3][3] = extrapolation((*mGridData)[ind[0][3][2]], (*mGridData)[ind[0][3][1]], (*mGridData)[ind[0][3][0]]);
452 cVals[4][0] = (*mGridData)[ind[1][0][0]];
453 cVals[4][1] = (*mGridData)[ind[1][0][1]];
454 cVals[4][2] = (*mGridData)[ind[1][0][2]];
455 cVals[4][3] = extrapolation((*mGridData)[ind[1][0][2]], (*mGridData)[ind[1][0][1]], (*mGridData)[ind[1][0][0]]);
456 cVals[5][0] = (*mGridData)[ind[1][1][0]];
457 cVals[5][2] = (*mGridData)[ind[1][1][2]];
458 cVals[5][3] = extrapolation((*mGridData)[ind[1][1][2]], (*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][0]]);
459 cVals[6][0] = (*mGridData)[ind[1][2][0]];
460 cVals[6][1] = (*mGridData)[ind[1][2][1]];
461 cVals[6][2] = (*mGridData)[ind[1][2][2]];
462 cVals[6][3] = extrapolation((*mGridData)[ind[1][2][2]], (*mGridData)[ind[1][2][1]], (*mGridData)[ind[1][2][0]]);
463 cVals[7][0] = (*mGridData)[ind[1][3][0]];
464 cVals[7][1] = (*mGridData)[ind[1][3][1]];
465 cVals[7][2] = (*mGridData)[ind[1][3][2]];
466 cVals[7][3] = extrapolation((*mGridData)[ind[1][3][2]], (*mGridData)[ind[1][3][1]], (*mGridData)[ind[1][3][0]]);
467 cVals[8][0] = (*mGridData)[ind[2][0][0]];
468 cVals[8][1] = (*mGridData)[ind[2][0][1]];
469 cVals[8][2] = (*mGridData)[ind[2][0][2]];
470 cVals[8][3] = extrapolation((*mGridData)[ind[2][0][2]], (*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][0][0]]);
471 cVals[9][0] = (*mGridData)[ind[2][1][0]];
472 cVals[9][1] = (*mGridData)[ind[2][1][1]];
473 cVals[9][2] = (*mGridData)[ind[2][1][2]];
474 cVals[9][3] = extrapolation((*mGridData)[ind[2][1][2]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][1][0]]);
475 cVals[10][0] = (*mGridData)[ind[2][2][0]];
476 cVals[10][1] = (*mGridData)[ind[2][2][1]];
477 cVals[10][2] = (*mGridData)[ind[2][2][2]];
478 cVals[10][3] = extrapolation((*mGridData)[ind[2][2][2]], (*mGridData)[ind[2][2][1]], (*mGridData)[ind[2][2][0]]);
479 cVals[11][0] = (*mGridData)[ind[2][3][0]];
480 cVals[11][1] = (*mGridData)[ind[2][3][1]];
481 cVals[11][2] = (*mGridData)[ind[2][3][2]];
482 cVals[11][3] = extrapolation((*mGridData)[ind[2][3][2]], (*mGridData)[ind[2][3][1]], (*mGridData)[ind[2][3][0]]);
483 cVals[12][0] = (*mGridData)[ind[3][0][0]];
484 cVals[12][1] = (*mGridData)[ind[3][0][1]];
485 cVals[12][2] = (*mGridData)[ind[3][0][2]];
486 cVals[13][0] = (*mGridData)[ind[3][1][0]];
487 cVals[12][3] = extrapolation((*mGridData)[ind[3][0][2]], (*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][0][0]]);
488 cVals[13][1] = (*mGridData)[ind[3][1][1]];
489 cVals[13][2] = (*mGridData)[ind[3][1][2]];
490 cVals[13][3] = extrapolation((*mGridData)[ind[3][1][2]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][1][0]]);
491 cVals[14][0] = (*mGridData)[ind[3][2][0]];
492 cVals[14][1] = (*mGridData)[ind[3][2][1]];
493 cVals[14][2] = (*mGridData)[ind[3][2][2]];
494 cVals[14][3] = extrapolation((*mGridData)[ind[3][2][2]], (*mGridData)[ind[3][2][1]], (*mGridData)[ind[3][2][0]]);
495 cVals[15][0] = (*mGridData)[ind[3][3][0]];
496 cVals[15][1] = (*mGridData)[ind[3][3][1]];
497 cVals[15][2] = (*mGridData)[ind[3][3][2]];
498 cVals[15][3] = extrapolation((*mGridData)[ind[3][3][2]], (*mGridData)[ind[3][3][1]], (*mGridData)[ind[3][3][0]]);
499 } break;
500
501 case GridPos::SideYRight:
502 case GridPos::LineB:
503 case GridPos::LineF: {
504 const int ind[4][3][4]{
505 {{ii_x_y_z + deltaPhi[i0] + deltaR[i0] + deltaZ[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0], ind[0][0][2] - deltaZ[i0]},
506 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0], ind[0][1][2] - deltaZ[i0]},
507 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0], ind[0][2][2] - deltaZ[i0]}},
508 {{ii_x_y_z + deltaR[i0] + deltaZ[i0], ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0], ind[1][0][2] - deltaZ[i0]},
509 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0], ind[1][1][2] - deltaZ[i0]},
510 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0], ind[1][2][2] - deltaZ[i0]}},
511 {{ii_x_y_z + deltaPhi[i1] + deltaR[i0] + deltaZ[i0], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0], ind[2][0][2] - deltaZ[i0]},
512 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0], ind[2][1][2] - deltaZ[i0]},
513 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0], ind[2][2][2] - deltaZ[i0]}},
514 {{ii_x_y_z + deltaPhi[i2] + deltaR[i0] + deltaZ[i0], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0], ind[3][0][2] - deltaZ[i0]},
515 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0], ind[3][1][2] - deltaZ[i0]},
516 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0], ind[3][2][2] - deltaZ[i0]}}};
517
518 cVals[0][0] = (*mGridData)[ind[0][0][0]];
519 cVals[0][1] = (*mGridData)[ind[0][0][1]];
520 cVals[0][2] = (*mGridData)[ind[0][0][2]];
521 cVals[0][3] = (*mGridData)[ind[0][0][3]];
522 cVals[1][0] = (*mGridData)[ind[0][1][0]];
523 cVals[1][1] = (*mGridData)[ind[0][1][1]];
524 cVals[1][2] = (*mGridData)[ind[0][1][2]];
525 cVals[1][3] = (*mGridData)[ind[0][1][3]];
526 cVals[2][0] = (*mGridData)[ind[0][2][0]];
527 cVals[2][1] = (*mGridData)[ind[0][2][1]];
528 cVals[2][2] = (*mGridData)[ind[0][2][2]];
529 cVals[2][3] = (*mGridData)[ind[0][2][3]];
530 cVals[3][0] = extrapolation((*mGridData)[ind[0][2][0]], (*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][0][0]]);
531 cVals[3][1] = extrapolation((*mGridData)[ind[0][2][1]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][0][1]]);
532 cVals[3][2] = extrapolation((*mGridData)[ind[0][2][2]], (*mGridData)[ind[0][1][2]], (*mGridData)[ind[0][0][2]]);
533 cVals[3][3] = extrapolation((*mGridData)[ind[0][2][3]], (*mGridData)[ind[0][1][3]], (*mGridData)[ind[0][0][3]]);
534 cVals[4][0] = (*mGridData)[ind[1][0][0]];
535 cVals[4][1] = (*mGridData)[ind[1][0][1]];
536 cVals[4][2] = (*mGridData)[ind[1][0][2]];
537 cVals[4][3] = (*mGridData)[ind[1][0][3]];
538 cVals[5][0] = (*mGridData)[ind[1][1][0]];
539 cVals[5][2] = (*mGridData)[ind[1][1][2]];
540 cVals[5][3] = (*mGridData)[ind[1][1][3]];
541 cVals[6][0] = (*mGridData)[ind[1][2][0]];
542 cVals[6][1] = (*mGridData)[ind[1][2][1]];
543 cVals[6][2] = (*mGridData)[ind[1][2][2]];
544 cVals[6][3] = (*mGridData)[ind[1][2][3]];
545 cVals[7][0] = extrapolation((*mGridData)[ind[1][2][0]], (*mGridData)[ind[1][1][0]], (*mGridData)[ind[1][0][0]]);
546 cVals[7][1] = extrapolation((*mGridData)[ind[1][2][1]], (*mGridData)[ii_x_y_z], (*mGridData)[ind[1][0][1]]);
547 cVals[7][2] = extrapolation((*mGridData)[ind[1][2][2]], (*mGridData)[ind[1][1][2]], (*mGridData)[ind[1][0][2]]);
548 cVals[7][3] = extrapolation((*mGridData)[ind[1][2][3]], (*mGridData)[ind[1][1][3]], (*mGridData)[ind[1][0][3]]);
549 cVals[8][0] = (*mGridData)[ind[2][0][0]];
550 cVals[8][1] = (*mGridData)[ind[2][0][1]];
551 cVals[8][2] = (*mGridData)[ind[2][0][2]];
552 cVals[8][3] = (*mGridData)[ind[2][0][3]];
553 cVals[9][0] = (*mGridData)[ind[2][1][0]];
554 cVals[9][1] = (*mGridData)[ind[2][1][1]];
555 cVals[9][2] = (*mGridData)[ind[2][1][2]];
556 cVals[9][3] = (*mGridData)[ind[2][1][3]];
557 cVals[10][0] = (*mGridData)[ind[2][2][0]];
558 cVals[10][1] = (*mGridData)[ind[2][2][1]];
559 cVals[10][2] = (*mGridData)[ind[2][2][2]];
560 cVals[10][3] = (*mGridData)[ind[2][2][3]];
561 cVals[11][0] = extrapolation((*mGridData)[ind[2][2][0]], (*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][0][0]]);
562 cVals[11][1] = extrapolation((*mGridData)[ind[2][2][1]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][0][1]]);
563 cVals[11][2] = extrapolation((*mGridData)[ind[2][2][2]], (*mGridData)[ind[2][1][2]], (*mGridData)[ind[2][0][2]]);
564 cVals[11][3] = extrapolation((*mGridData)[ind[2][2][3]], (*mGridData)[ind[2][1][3]], (*mGridData)[ind[2][0][3]]);
565 cVals[12][0] = (*mGridData)[ind[3][0][0]];
566 cVals[12][1] = (*mGridData)[ind[3][0][1]];
567 cVals[12][2] = (*mGridData)[ind[3][0][2]];
568 cVals[12][3] = (*mGridData)[ind[3][0][3]];
569 cVals[13][0] = (*mGridData)[ind[3][1][0]];
570 cVals[13][1] = (*mGridData)[ind[3][1][1]];
571 cVals[13][2] = (*mGridData)[ind[3][1][2]];
572 cVals[13][3] = (*mGridData)[ind[3][1][3]];
573 cVals[14][0] = (*mGridData)[ind[3][2][0]];
574 cVals[14][1] = (*mGridData)[ind[3][2][1]];
575 cVals[14][2] = (*mGridData)[ind[3][2][2]];
576 cVals[14][3] = (*mGridData)[ind[3][2][3]];
577 cVals[15][0] = extrapolation((*mGridData)[ind[3][2][0]], (*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][0][0]]);
578 cVals[15][1] = extrapolation((*mGridData)[ind[3][2][1]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][0][1]]);
579 cVals[15][2] = extrapolation((*mGridData)[ind[3][2][2]], (*mGridData)[ind[3][1][2]], (*mGridData)[ind[3][0][2]]);
580 cVals[15][3] = extrapolation((*mGridData)[ind[3][2][3]], (*mGridData)[ind[3][1][3]], (*mGridData)[ind[3][0][3]]);
581 } break;
582
583 case GridPos::SideYLeft:
584 case GridPos::LineA:
585 case GridPos::LineE: {
586 const int ind[4][3][4]{
587 {{ii_x_y_z + deltaPhi[i0] + deltaZ[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0], ind[0][0][2] - deltaZ[i0]},
588 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0], ind[0][1][2] - deltaZ[i0]},
589 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0], ind[0][2][2] - deltaZ[i0]}},
590 {{ii_x_y_z + deltaZ[i0], ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0], ind[1][0][2] - deltaZ[i0]},
591 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0], ind[1][1][2] - deltaZ[i0]},
592 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0], ind[1][2][2] - deltaZ[i0]}},
593 {{ii_x_y_z + deltaPhi[i1] + deltaZ[i0], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0], ind[2][0][2] - deltaZ[i0]},
594 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0], ind[2][1][2] - deltaZ[i0]},
595 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0], ind[2][2][2] - deltaZ[i0]}},
596 {{ii_x_y_z + deltaPhi[i2] + deltaZ[i0], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0], ind[3][0][2] - deltaZ[i0]},
597 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0], ind[3][1][2] - deltaZ[i0]},
598 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0], ind[3][2][2] - deltaZ[i0]}}};
599
600 cVals[0][0] = extrapolation((*mGridData)[ind[0][0][0]], (*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][2][0]]);
601 cVals[0][1] = extrapolation((*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][2][1]]);
602 cVals[0][2] = extrapolation((*mGridData)[ind[0][0][2]], (*mGridData)[ind[0][1][2]], (*mGridData)[ind[0][2][2]]);
603 cVals[0][3] = extrapolation((*mGridData)[ind[0][0][3]], (*mGridData)[ind[0][1][3]], (*mGridData)[ind[0][2][3]]);
604 cVals[1][0] = (*mGridData)[ind[0][0][0]];
605 cVals[1][1] = (*mGridData)[ind[0][0][1]];
606 cVals[1][2] = (*mGridData)[ind[0][0][2]];
607 cVals[1][3] = (*mGridData)[ind[0][0][3]];
608 cVals[2][0] = (*mGridData)[ind[0][1][0]];
609 cVals[2][1] = (*mGridData)[ind[0][1][1]];
610 cVals[2][2] = (*mGridData)[ind[0][1][2]];
611 cVals[2][3] = (*mGridData)[ind[0][1][3]];
612 cVals[3][0] = (*mGridData)[ind[0][2][0]];
613 cVals[3][1] = (*mGridData)[ind[0][2][1]];
614 cVals[3][2] = (*mGridData)[ind[0][2][2]];
615 cVals[3][3] = (*mGridData)[ind[0][2][3]];
616 cVals[4][0] = extrapolation((*mGridData)[ind[1][0][0]], (*mGridData)[ind[1][1][0]], (*mGridData)[ind[1][2][0]]);
617 cVals[4][1] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][2][1]]);
618 cVals[4][2] = extrapolation((*mGridData)[ind[1][0][2]], (*mGridData)[ind[1][1][2]], (*mGridData)[ind[1][2][2]]);
619 cVals[4][3] = extrapolation((*mGridData)[ind[1][0][3]], (*mGridData)[ind[1][1][3]], (*mGridData)[ind[1][2][3]]);
620 cVals[5][0] = (*mGridData)[ind[1][0][0]];
621 cVals[5][2] = (*mGridData)[ind[1][0][2]];
622 cVals[5][3] = (*mGridData)[ind[1][0][3]];
623 cVals[6][0] = (*mGridData)[ind[1][1][0]];
624 cVals[6][1] = (*mGridData)[ind[1][1][1]];
625 cVals[6][2] = (*mGridData)[ind[1][1][2]];
626 cVals[6][3] = (*mGridData)[ind[1][1][3]];
627 cVals[7][0] = (*mGridData)[ind[1][2][0]];
628 cVals[7][1] = (*mGridData)[ind[1][2][1]];
629 cVals[7][2] = (*mGridData)[ind[1][2][2]];
630 cVals[7][3] = (*mGridData)[ind[1][2][3]];
631 cVals[8][0] = extrapolation((*mGridData)[ind[2][0][0]], (*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][2][0]]);
632 cVals[8][1] = extrapolation((*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][2][1]]);
633 cVals[8][2] = extrapolation((*mGridData)[ind[2][0][2]], (*mGridData)[ind[2][1][2]], (*mGridData)[ind[2][2][2]]);
634 cVals[8][3] = extrapolation((*mGridData)[ind[2][0][3]], (*mGridData)[ind[2][1][3]], (*mGridData)[ind[2][2][3]]);
635 cVals[9][0] = (*mGridData)[ind[2][0][0]];
636 cVals[9][1] = (*mGridData)[ind[2][0][1]];
637 cVals[9][2] = (*mGridData)[ind[2][0][2]];
638 cVals[9][3] = (*mGridData)[ind[2][0][3]];
639 cVals[10][0] = (*mGridData)[ind[2][1][0]];
640 cVals[10][1] = (*mGridData)[ind[2][1][1]];
641 cVals[10][2] = (*mGridData)[ind[2][1][2]];
642 cVals[10][3] = (*mGridData)[ind[2][1][3]];
643 cVals[11][0] = (*mGridData)[ind[2][2][0]];
644 cVals[11][1] = (*mGridData)[ind[2][2][1]];
645 cVals[11][2] = (*mGridData)[ind[2][2][2]];
646 cVals[11][3] = (*mGridData)[ind[2][2][3]];
647 cVals[12][0] = extrapolation((*mGridData)[ind[3][0][0]], (*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][2][0]]);
648 cVals[12][1] = extrapolation((*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][2][1]]);
649 cVals[12][2] = extrapolation((*mGridData)[ind[3][0][2]], (*mGridData)[ind[3][1][2]], (*mGridData)[ind[3][2][2]]);
650 cVals[12][3] = extrapolation((*mGridData)[ind[3][0][3]], (*mGridData)[ind[3][1][3]], (*mGridData)[ind[3][2][3]]);
651 cVals[13][0] = (*mGridData)[ind[3][0][0]];
652 cVals[13][1] = (*mGridData)[ind[3][0][1]];
653 cVals[13][2] = (*mGridData)[ind[3][0][2]];
654 cVals[13][3] = (*mGridData)[ind[3][0][3]];
655 cVals[14][0] = (*mGridData)[ind[3][1][0]];
656 cVals[14][1] = (*mGridData)[ind[3][1][1]];
657 cVals[14][2] = (*mGridData)[ind[3][1][2]];
658 cVals[14][3] = (*mGridData)[ind[3][1][3]];
659 cVals[15][0] = (*mGridData)[ind[3][2][0]];
660 cVals[15][1] = (*mGridData)[ind[3][2][1]];
661 cVals[15][2] = (*mGridData)[ind[3][2][2]];
662 cVals[15][3] = (*mGridData)[ind[3][2][3]];
663 } break;
664
665 case GridPos::SideXLeft:
666 case GridPos::LineC:
667 case GridPos::LineG: {
668 const int ind[4][4][3]{
669 {{ii_x_y_z + deltaPhi[i0] + deltaR[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0]},
670 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0]},
671 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0]},
672 {ind[0][2][0] - deltaR[i0], ind[0][3][0] - deltaZ[i0], ind[0][3][1] - deltaZ[i0]}},
673 {{ii_x_y_z + deltaR[i0], ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0]},
674 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0]},
675 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0]},
676 {ind[1][2][0] - deltaR[i0], ind[1][3][0] - deltaZ[i0], ind[1][3][1] - deltaZ[i0]}},
677 {{ii_x_y_z + deltaPhi[i1] + deltaR[i0], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0]},
678 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0]},
679 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0]},
680 {ind[2][2][0] - deltaR[i0], ind[2][3][0] - deltaZ[i0], ind[2][3][1] - deltaZ[i0]}},
681 {{ii_x_y_z + deltaPhi[i2] + deltaR[i0], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0]},
682 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0]},
683 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0]},
684 {ind[3][2][0] - deltaR[i0], ind[3][3][0] - deltaZ[i0], ind[3][3][1] - deltaZ[i0]}}};
685
686 cVals[0][0] = extrapolation((*mGridData)[ind[0][0][0]], (*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][0][2]]);
687 cVals[0][1] = (*mGridData)[ind[0][0][0]];
688 cVals[0][2] = (*mGridData)[ind[0][0][1]];
689 cVals[0][3] = (*mGridData)[ind[0][0][2]];
690 cVals[1][0] = extrapolation((*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][1][2]]);
691 cVals[1][1] = (*mGridData)[ind[0][1][0]];
692 cVals[1][2] = (*mGridData)[ind[0][1][1]];
693 cVals[1][3] = (*mGridData)[ind[0][1][2]];
694 cVals[2][0] = extrapolation((*mGridData)[ind[0][2][0]], (*mGridData)[ind[0][2][1]], (*mGridData)[ind[0][2][2]]);
695 cVals[2][1] = (*mGridData)[ind[0][2][0]];
696 cVals[2][2] = (*mGridData)[ind[0][2][1]];
697 cVals[2][3] = (*mGridData)[ind[0][2][2]];
698 cVals[3][0] = extrapolation((*mGridData)[ind[0][3][0]], (*mGridData)[ind[0][3][1]], (*mGridData)[ind[0][3][2]]);
699 cVals[3][1] = (*mGridData)[ind[0][3][0]];
700 cVals[3][2] = (*mGridData)[ind[0][3][1]];
701 cVals[3][3] = (*mGridData)[ind[0][3][2]];
702 cVals[4][0] = extrapolation((*mGridData)[ind[1][0][0]], (*mGridData)[ind[1][0][1]], (*mGridData)[ind[1][0][2]]);
703 cVals[4][1] = (*mGridData)[ind[1][0][0]];
704 cVals[4][2] = (*mGridData)[ind[1][0][1]];
705 cVals[4][3] = (*mGridData)[ind[1][0][2]];
706 cVals[5][0] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][1][2]]);
707 cVals[5][2] = (*mGridData)[ind[1][1][1]];
708 cVals[5][3] = (*mGridData)[ind[1][1][2]];
709 cVals[6][0] = extrapolation((*mGridData)[ind[1][2][0]], (*mGridData)[ind[1][2][1]], (*mGridData)[ind[1][2][2]]);
710 cVals[6][1] = (*mGridData)[ind[1][2][0]];
711 cVals[6][2] = (*mGridData)[ind[1][2][1]];
712 cVals[6][3] = (*mGridData)[ind[1][2][2]];
713 cVals[7][0] = extrapolation((*mGridData)[ind[1][3][0]], (*mGridData)[ind[1][3][1]], (*mGridData)[ind[1][3][2]]);
714 cVals[7][1] = (*mGridData)[ind[1][3][0]];
715 cVals[7][2] = (*mGridData)[ind[1][3][1]];
716 cVals[7][3] = (*mGridData)[ind[1][3][2]];
717 cVals[8][0] = extrapolation((*mGridData)[ind[2][0][0]], (*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][0][2]]);
718 cVals[8][1] = (*mGridData)[ind[2][0][0]];
719 cVals[8][2] = (*mGridData)[ind[2][0][1]];
720 cVals[8][3] = (*mGridData)[ind[2][0][2]];
721 cVals[9][0] = extrapolation((*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][1][2]]);
722 cVals[9][1] = (*mGridData)[ind[2][1][0]];
723 cVals[9][2] = (*mGridData)[ind[2][1][1]];
724 cVals[9][3] = (*mGridData)[ind[2][1][2]];
725 cVals[10][0] = extrapolation((*mGridData)[ind[2][2][0]], (*mGridData)[ind[2][2][1]], (*mGridData)[ind[2][2][2]]);
726 cVals[10][1] = (*mGridData)[ind[2][2][0]];
727 cVals[10][2] = (*mGridData)[ind[2][2][1]];
728 cVals[10][3] = (*mGridData)[ind[2][2][2]];
729 cVals[11][0] = extrapolation((*mGridData)[ind[2][3][0]], (*mGridData)[ind[2][3][1]], (*mGridData)[ind[2][3][2]]);
730 cVals[11][1] = (*mGridData)[ind[2][3][0]];
731 cVals[11][2] = (*mGridData)[ind[2][3][1]];
732 cVals[11][3] = (*mGridData)[ind[2][3][2]];
733 cVals[12][0] = extrapolation((*mGridData)[ind[3][0][0]], (*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][0][2]]);
734 cVals[12][1] = (*mGridData)[ind[3][0][0]];
735 cVals[12][2] = (*mGridData)[ind[3][0][1]];
736 cVals[12][3] = (*mGridData)[ind[3][0][2]];
737 cVals[13][0] = extrapolation((*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][1][2]]);
738 cVals[13][1] = (*mGridData)[ind[3][1][0]];
739 cVals[13][2] = (*mGridData)[ind[3][1][1]];
740 cVals[13][3] = (*mGridData)[ind[3][1][2]];
741 cVals[14][0] = extrapolation((*mGridData)[ind[3][2][0]], (*mGridData)[ind[3][2][1]], (*mGridData)[ind[3][2][2]]);
742 cVals[14][1] = (*mGridData)[ind[3][2][0]];
743 cVals[14][2] = (*mGridData)[ind[3][2][1]];
744 cVals[14][3] = (*mGridData)[ind[3][2][2]];
745 cVals[15][0] = extrapolation((*mGridData)[ind[3][3][0]], (*mGridData)[ind[3][3][1]], (*mGridData)[ind[3][3][2]]);
746 cVals[15][1] = (*mGridData)[ind[3][3][0]];
747 cVals[15][2] = (*mGridData)[ind[3][3][1]];
748 cVals[15][3] = (*mGridData)[ind[3][3][2]];
749 } break;
750
751 case GridPos::Edge0:
752 case GridPos::Edge4:
753 case GridPos::LineI: {
754 const int ind[4][3][3]{
755 {{ii_x_y_z + deltaPhi[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0]},
756 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0]},
757 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0]}},
758 {{ii_x_y_z, ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0]},
759 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0]},
760 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0]}},
761 {{ii_x_y_z + deltaPhi[i1], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0]},
762 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0]},
763 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0]}},
764 {{ii_x_y_z + deltaPhi[i2], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0]},
765 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0]},
766 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0]}}};
767
768 cVals[0][0] = extrapolation((*mGridData)[ind[0][0][0]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][2][2]]);
769 cVals[0][1] = extrapolation((*mGridData)[ind[0][0][0]], (*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][2][0]]);
770 cVals[0][2] = extrapolation((*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][2][1]]);
771 cVals[0][3] = extrapolation((*mGridData)[ind[0][0][2]], (*mGridData)[ind[0][1][2]], (*mGridData)[ind[0][2][2]]);
772 cVals[1][0] = extrapolation((*mGridData)[ind[0][0][0]], (*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][0][2]]);
773 cVals[1][1] = (*mGridData)[ind[0][0][0]];
774 cVals[1][2] = (*mGridData)[ind[0][0][1]];
775 cVals[1][3] = (*mGridData)[ind[0][0][2]];
776 cVals[2][0] = extrapolation((*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][1][2]]);
777 cVals[2][1] = (*mGridData)[ind[0][1][0]];
778 cVals[2][2] = (*mGridData)[ind[0][1][1]];
779 cVals[2][3] = (*mGridData)[ind[0][1][2]];
780 cVals[3][0] = extrapolation((*mGridData)[ind[0][2][0]], (*mGridData)[ind[0][2][1]], (*mGridData)[ind[0][2][2]]);
781 cVals[3][1] = (*mGridData)[ind[0][2][0]];
782 cVals[3][2] = (*mGridData)[ind[0][2][1]];
783 cVals[3][3] = (*mGridData)[ind[0][2][2]];
784 cVals[4][0] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][2][2]]);
785 cVals[4][1] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][0]], (*mGridData)[ind[1][2][0]]);
786 cVals[4][2] = extrapolation((*mGridData)[ind[1][0][1]], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][2][1]]);
787 cVals[4][3] = extrapolation((*mGridData)[ind[1][0][2]], (*mGridData)[ind[1][1][2]], (*mGridData)[ind[1][2][2]]);
788 cVals[5][0] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][0][1]], (*mGridData)[ind[1][0][2]]);
789 cVals[5][2] = (*mGridData)[ind[1][0][1]];
790 cVals[5][3] = (*mGridData)[ind[1][0][2]];
791 cVals[6][0] = extrapolation((*mGridData)[ind[1][1][0]], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][1][2]]);
792 cVals[6][1] = (*mGridData)[ind[1][1][0]];
793 cVals[6][2] = (*mGridData)[ind[1][1][1]];
794 cVals[6][3] = (*mGridData)[ind[1][1][2]];
795 cVals[7][0] = extrapolation((*mGridData)[ind[1][2][0]], (*mGridData)[ind[1][2][1]], (*mGridData)[ind[1][2][2]]);
796 cVals[7][1] = (*mGridData)[ind[1][2][0]];
797 cVals[7][2] = (*mGridData)[ind[1][2][1]];
798 cVals[7][3] = (*mGridData)[ind[1][2][2]];
799 cVals[8][0] = extrapolation((*mGridData)[ind[2][0][0]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][2][2]]);
800 cVals[8][1] = extrapolation((*mGridData)[ind[2][0][0]], (*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][2][0]]);
801 cVals[8][2] = extrapolation((*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][2][1]]);
802 cVals[8][3] = extrapolation((*mGridData)[ind[2][0][2]], (*mGridData)[ind[2][1][2]], (*mGridData)[ind[2][2][2]]);
803 cVals[9][0] = extrapolation((*mGridData)[ind[2][0][0]], (*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][0][2]]);
804 cVals[9][1] = (*mGridData)[ind[2][0][0]];
805 cVals[9][2] = (*mGridData)[ind[2][0][1]];
806 cVals[9][3] = (*mGridData)[ind[2][0][2]];
807 cVals[10][0] = extrapolation((*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][1][2]]);
808 cVals[10][1] = (*mGridData)[ind[2][1][0]];
809 cVals[10][2] = (*mGridData)[ind[2][1][1]];
810 cVals[10][3] = (*mGridData)[ind[2][1][2]];
811 cVals[11][0] = extrapolation((*mGridData)[ind[2][2][0]], (*mGridData)[ind[2][2][1]], (*mGridData)[ind[2][2][2]]);
812 cVals[11][1] = (*mGridData)[ind[2][2][0]];
813 cVals[11][2] = (*mGridData)[ind[2][2][1]];
814 cVals[11][3] = (*mGridData)[ind[2][2][2]];
815 cVals[12][0] = extrapolation((*mGridData)[ind[3][0][0]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][2][2]]);
816 cVals[12][1] = extrapolation((*mGridData)[ind[3][0][0]], (*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][2][0]]);
817 cVals[12][2] = extrapolation((*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][2][1]]);
818 cVals[12][3] = extrapolation((*mGridData)[ind[3][0][2]], (*mGridData)[ind[3][1][2]], (*mGridData)[ind[3][2][2]]);
819 cVals[13][0] = extrapolation((*mGridData)[ind[3][0][0]], (*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][0][2]]);
820 cVals[13][1] = (*mGridData)[ind[3][0][0]];
821 cVals[13][2] = (*mGridData)[ind[3][0][1]];
822 cVals[13][3] = (*mGridData)[ind[3][0][2]];
823 cVals[14][0] = extrapolation((*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][1][2]]);
824 cVals[14][1] = (*mGridData)[ind[3][1][0]];
825 cVals[14][2] = (*mGridData)[ind[3][1][1]];
826 cVals[14][3] = (*mGridData)[ind[3][1][2]];
827 cVals[15][0] = extrapolation((*mGridData)[ind[3][2][0]], (*mGridData)[ind[3][2][1]], (*mGridData)[ind[3][2][2]]);
828 cVals[15][1] = (*mGridData)[ind[3][2][0]];
829 cVals[15][2] = (*mGridData)[ind[3][2][1]];
830 cVals[15][3] = (*mGridData)[ind[3][2][2]];
831 } break;
832
833 case GridPos::Edge1:
834 case GridPos::Edge5:
835 case GridPos::LineJ: {
836 const int ind[4][3][3]{
837 {{ii_x_y_z + deltaPhi[i0] + deltaZ[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0]},
838 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0]},
839 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0]}},
840 {{ii_x_y_z + deltaZ[i0], ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0]},
841 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0]},
842 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0]}},
843 {{ii_x_y_z + deltaPhi[i1] + deltaZ[i0], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0]},
844 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0]},
845 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0]}},
846 {{ii_x_y_z + deltaPhi[i2] + deltaZ[i0], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0]},
847 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0]},
848 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0]}}};
849
850 cVals[0][0] = extrapolation((*mGridData)[ind[0][0][0]], (*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][2][0]]);
851 cVals[0][1] = extrapolation((*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][2][1]]);
852 cVals[0][2] = extrapolation((*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][2][0] + deltaZ[i0]]);
853 cVals[0][3] = extrapolation((*mGridData)[ind[0][0][2]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][2][0]]);
854 cVals[1][0] = (*mGridData)[ind[0][0][0]];
855 cVals[1][1] = (*mGridData)[ind[0][0][1]];
856 cVals[1][2] = (*mGridData)[ind[0][0][2]];
857 cVals[1][3] = extrapolation((*mGridData)[ind[0][0][2]], (*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][0][0]]);
858 cVals[2][0] = (*mGridData)[ind[0][1][0]];
859 cVals[2][1] = (*mGridData)[ind[0][1][1]];
860 cVals[2][2] = (*mGridData)[ind[0][1][2]];
861 cVals[2][3] = extrapolation((*mGridData)[ind[0][1][2]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][1][0]]);
862 cVals[3][0] = (*mGridData)[ind[0][2][0]];
863 cVals[3][1] = (*mGridData)[ind[0][2][1]];
864 cVals[3][2] = (*mGridData)[ind[0][2][2]];
865 cVals[3][3] = extrapolation((*mGridData)[ind[0][2][2]], (*mGridData)[ind[0][2][1]], (*mGridData)[ind[0][2][0]]);
866 cVals[4][0] = extrapolation((*mGridData)[ind[1][0][0]], (*mGridData)[ind[1][1][0]], (*mGridData)[ind[1][2][0]]);
867 cVals[4][1] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][2][1]]);
868 cVals[4][2] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][0]], (*mGridData)[ind[1][2][0] + deltaZ[i0]]);
869 cVals[4][3] = extrapolation((*mGridData)[ind[1][0][2]], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][2][0]]);
870 cVals[5][0] = (*mGridData)[ind[1][0][0]];
871 cVals[5][2] = (*mGridData)[ind[1][0][2]];
872 cVals[5][3] = extrapolation((*mGridData)[ind[1][0][2]], (*mGridData)[ii_x_y_z], (*mGridData)[ind[1][0][0]]);
873 cVals[6][0] = (*mGridData)[ind[1][1][0]];
874 cVals[6][1] = (*mGridData)[ind[1][1][1]];
875 cVals[6][2] = (*mGridData)[ind[1][1][2]];
876 cVals[6][3] = extrapolation((*mGridData)[ind[1][1][2]], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][1][0]]);
877 cVals[7][0] = (*mGridData)[ind[1][2][0]];
878 cVals[7][1] = (*mGridData)[ind[1][2][1]];
879 cVals[7][2] = (*mGridData)[ind[1][2][2]];
880 cVals[7][3] = extrapolation((*mGridData)[ind[1][2][2]], (*mGridData)[ind[1][2][1]], (*mGridData)[ind[1][2][0]]);
881 cVals[8][0] = extrapolation((*mGridData)[ind[2][0][0]], (*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][2][0]]);
882 cVals[8][1] = extrapolation((*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][2][1]]);
883 cVals[8][2] = extrapolation((*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][2][0] + deltaZ[i0]]);
884 cVals[8][3] = extrapolation((*mGridData)[ind[2][0][2]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][2][0]]);
885 cVals[9][0] = (*mGridData)[ind[2][0][0]];
886 cVals[9][1] = (*mGridData)[ind[2][0][1]];
887 cVals[9][2] = (*mGridData)[ind[2][0][2]];
888 cVals[9][3] = extrapolation((*mGridData)[ind[2][0][2]], (*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][0][0]]);
889 cVals[10][0] = (*mGridData)[ind[2][1][0]];
890 cVals[10][1] = (*mGridData)[ind[2][1][1]];
891 cVals[10][2] = (*mGridData)[ind[2][1][2]];
892 cVals[10][3] = extrapolation((*mGridData)[ind[2][1][2]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][1][0]]);
893 cVals[11][0] = (*mGridData)[ind[2][2][0]];
894 cVals[11][1] = (*mGridData)[ind[2][2][1]];
895 cVals[11][2] = (*mGridData)[ind[2][2][2]];
896 cVals[11][3] = extrapolation((*mGridData)[ind[2][2][2]], (*mGridData)[ind[2][2][1]], (*mGridData)[ind[2][2][0]]);
897 cVals[12][0] = extrapolation((*mGridData)[ind[3][0][0]], (*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][2][0]]);
898 cVals[12][1] = extrapolation((*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][2][1]]);
899 cVals[12][2] = extrapolation((*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][2][0] + deltaZ[i0]]);
900 cVals[12][3] = extrapolation((*mGridData)[ind[3][0][2]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][2][0]]);
901 cVals[13][0] = (*mGridData)[ind[3][0][0]];
902 cVals[13][1] = (*mGridData)[ind[3][0][1]];
903 cVals[13][2] = (*mGridData)[ind[3][0][2]];
904 cVals[13][3] = extrapolation((*mGridData)[ind[3][0][2]], (*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][0][0]]);
905 cVals[14][0] = (*mGridData)[ind[3][1][0]];
906 cVals[14][1] = (*mGridData)[ind[3][1][1]];
907 cVals[14][2] = (*mGridData)[ind[3][1][2]];
908 cVals[14][3] = extrapolation((*mGridData)[ind[3][1][2]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][1][0]]);
909 cVals[15][0] = (*mGridData)[ind[3][2][0]];
910 cVals[15][1] = (*mGridData)[ind[3][2][1]];
911 cVals[15][2] = (*mGridData)[ind[3][2][2]];
912 cVals[15][3] = extrapolation((*mGridData)[ind[3][2][2]], (*mGridData)[ind[3][2][1]], (*mGridData)[ind[3][2][0]]);
913 } break;
914
915 case GridPos::Edge2:
916 case GridPos::Edge6:
917 case GridPos::LineK: {
918 const int ind[4][3][3]{
919 {{ii_x_y_z + deltaPhi[i0] + deltaR[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0]},
920 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0]},
921 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0]}},
922 {{ii_x_y_z + deltaR[i0], ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0]},
923 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0]},
924 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0]}},
925 {{ii_x_y_z + deltaPhi[i1] + deltaR[i0], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0]},
926 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0]},
927 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0]}},
928 {{ii_x_y_z + deltaPhi[i2] + deltaR[i0], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0]},
929 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0]},
930 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0]}}};
931
932 cVals[0][0] = extrapolation((*mGridData)[ind[0][0][0]], (*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][0][2]]);
933 cVals[0][1] = (*mGridData)[ind[0][0][0]];
934 cVals[0][2] = (*mGridData)[ind[0][0][1]];
935 cVals[0][3] = (*mGridData)[ind[0][0][2]];
936 cVals[1][0] = extrapolation((*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][1][2]]);
937 cVals[1][1] = (*mGridData)[ind[0][1][0]];
938 cVals[1][2] = (*mGridData)[ind[0][1][1]];
939 cVals[1][3] = (*mGridData)[ind[0][1][2]];
940 cVals[2][0] = extrapolation((*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][0][2] + deltaR[i0]]);
941 cVals[2][1] = (*mGridData)[ind[0][2][0]];
942 cVals[2][2] = (*mGridData)[ind[0][2][1]];
943 cVals[2][3] = (*mGridData)[ind[0][2][2]];
944 cVals[3][0] = extrapolation((*mGridData)[ind[0][2][0]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][0][2]]);
945 cVals[3][1] = extrapolation((*mGridData)[ind[0][2][0]], (*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][0][0]]);
946 cVals[3][2] = extrapolation((*mGridData)[ind[0][2][1]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][0][1]]);
947 cVals[3][3] = extrapolation((*mGridData)[ind[0][2][2]], (*mGridData)[ind[0][1][2]], (*mGridData)[ind[0][0][2]]);
948 cVals[4][0] = extrapolation((*mGridData)[ind[1][0][0]], (*mGridData)[ind[1][0][1]], (*mGridData)[ind[1][0][2]]);
949 cVals[4][1] = (*mGridData)[ind[1][0][0]];
950 cVals[4][2] = (*mGridData)[ind[1][0][1]];
951 cVals[4][3] = (*mGridData)[ind[1][0][2]];
952 cVals[5][0] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][1][2]]);
953 cVals[5][2] = (*mGridData)[ind[1][1][1]];
954 cVals[5][3] = (*mGridData)[ind[1][1][2]];
955 cVals[6][0] = extrapolation((*mGridData)[ii_x_y_z], (*mGridData)[ind[1][0][1]], (*mGridData)[ind[1][0][2] + deltaR[i0]]);
956 cVals[6][1] = (*mGridData)[ind[1][2][0]];
957 cVals[6][2] = (*mGridData)[ind[1][2][1]];
958 cVals[6][3] = (*mGridData)[ind[1][2][2]];
959 cVals[7][0] = extrapolation((*mGridData)[ind[1][2][0]], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][0][2]]);
960 cVals[7][1] = extrapolation((*mGridData)[ind[1][2][0]], (*mGridData)[ii_x_y_z], (*mGridData)[ind[1][0][0]]);
961 cVals[7][2] = extrapolation((*mGridData)[ind[1][2][1]], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][0][1]]);
962 cVals[8][0] = extrapolation((*mGridData)[ind[2][0][0]], (*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][0][2]]);
963 cVals[7][3] = extrapolation((*mGridData)[ind[1][2][2]], (*mGridData)[ind[1][1][2]], (*mGridData)[ind[1][0][2]]);
964 cVals[8][1] = (*mGridData)[ind[2][0][0]];
965 cVals[8][2] = (*mGridData)[ind[2][0][1]];
966 cVals[8][3] = (*mGridData)[ind[2][0][2]];
967 cVals[9][0] = extrapolation((*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][1][2]]);
968 cVals[9][1] = (*mGridData)[ind[2][1][0]];
969 cVals[9][2] = (*mGridData)[ind[2][1][1]];
970 cVals[9][3] = (*mGridData)[ind[2][1][2]];
971 cVals[10][0] = extrapolation((*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][0][2] + deltaR[i0]]);
972 cVals[10][1] = (*mGridData)[ind[2][2][0]];
973 cVals[10][2] = (*mGridData)[ind[2][2][1]];
974 cVals[10][3] = (*mGridData)[ind[2][2][2]];
975 cVals[11][0] = extrapolation((*mGridData)[ind[2][2][0]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][0][2]]);
976 cVals[11][1] = extrapolation((*mGridData)[ind[2][2][0]], (*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][0][0]]);
977 cVals[11][2] = extrapolation((*mGridData)[ind[2][2][1]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][0][1]]);
978 cVals[11][3] = extrapolation((*mGridData)[ind[2][2][2]], (*mGridData)[ind[2][1][2]], (*mGridData)[ind[2][0][2]]);
979 cVals[12][0] = extrapolation((*mGridData)[ind[3][0][0]], (*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][0][2]]);
980 cVals[12][1] = (*mGridData)[ind[3][0][0]];
981 cVals[12][2] = (*mGridData)[ind[3][0][1]];
982 cVals[12][3] = (*mGridData)[ind[3][0][2]];
983 cVals[13][0] = extrapolation((*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][1][2]]);
984 cVals[13][1] = (*mGridData)[ind[3][1][0]];
985 cVals[13][2] = (*mGridData)[ind[3][1][1]];
986 cVals[13][3] = (*mGridData)[ind[3][1][2]];
987 cVals[14][0] = extrapolation((*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][0][2] + deltaR[i0]]);
988 cVals[14][1] = (*mGridData)[ind[3][2][0]];
989 cVals[14][2] = (*mGridData)[ind[3][2][1]];
990 cVals[14][3] = (*mGridData)[ind[3][2][2]];
991 cVals[15][0] = extrapolation((*mGridData)[ind[3][2][0]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][0][2]]);
992 cVals[15][1] = extrapolation((*mGridData)[ind[3][2][0]], (*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][0][0]]);
993 cVals[15][2] = extrapolation((*mGridData)[ind[3][2][1]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][0][1]]);
994 cVals[15][3] = extrapolation((*mGridData)[ind[3][2][2]], (*mGridData)[ind[3][1][2]], (*mGridData)[ind[3][0][2]]);
995 } break;
996
997 case GridPos::Edge3:
998 case GridPos::Edge7:
999 case GridPos::LineL: {
1000 const int ind[4][3][3]{
1001 {{ii_x_y_z + deltaPhi[i0] + deltaR[i0] + deltaZ[i0], ind[0][0][0] - deltaZ[i0], ind[0][0][1] - deltaZ[i0]},
1002 {ind[0][0][0] - deltaR[i0], ind[0][1][0] - deltaZ[i0], ind[0][1][1] - deltaZ[i0]},
1003 {ind[0][1][0] - deltaR[i0], ind[0][2][0] - deltaZ[i0], ind[0][2][1] - deltaZ[i0]}},
1004 {{ii_x_y_z + deltaR[i0] + deltaZ[i0], ind[1][0][0] - deltaZ[i0], ind[1][0][1] - deltaZ[i0]},
1005 {ind[1][0][0] - deltaR[i0], ind[1][1][0] - deltaZ[i0], ind[1][1][1] - deltaZ[i0]},
1006 {ind[1][1][0] - deltaR[i0], ind[1][2][0] - deltaZ[i0], ind[1][2][1] - deltaZ[i0]}},
1007 {{ii_x_y_z + deltaPhi[i1] + deltaR[i0] + deltaZ[i0], ind[2][0][0] - deltaZ[i0], ind[2][0][1] - deltaZ[i0]},
1008 {ind[2][0][0] - deltaR[i0], ind[2][1][0] - deltaZ[i0], ind[2][1][1] - deltaZ[i0]},
1009 {ind[2][1][0] - deltaR[i0], ind[2][2][0] - deltaZ[i0], ind[2][2][1] - deltaZ[i0]}},
1010 {{ii_x_y_z + deltaPhi[i2] + deltaR[i0] + deltaZ[i0], ind[3][0][0] - deltaZ[i0], ind[3][0][1] - deltaZ[i0]},
1011 {ind[3][0][0] - deltaR[i0], ind[3][1][0] - deltaZ[i0], ind[3][1][1] - deltaZ[i0]},
1012 {ind[3][1][0] - deltaR[i0], ind[3][2][0] - deltaZ[i0], ind[3][2][1] - deltaZ[i0]}}};
1013
1014 cVals[0][0] = (*mGridData)[ind[0][0][0]];
1015 cVals[0][1] = (*mGridData)[ind[0][0][1]];
1016 cVals[0][2] = (*mGridData)[ind[0][0][2]];
1017 cVals[0][3] = extrapolation((*mGridData)[ind[0][0][2]], (*mGridData)[ind[0][0][1]], (*mGridData)[ind[0][0][0]]);
1018 cVals[1][0] = (*mGridData)[ind[0][1][0]];
1019 cVals[1][1] = (*mGridData)[ind[0][1][1]];
1020 cVals[1][2] = (*mGridData)[ind[0][1][2]];
1021 cVals[1][3] = extrapolation((*mGridData)[ind[0][1][2]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][1][0]]);
1022 cVals[2][0] = (*mGridData)[ind[0][2][0]];
1023 cVals[2][1] = (*mGridData)[ind[0][2][1]];
1024 cVals[2][2] = (*mGridData)[ind[0][2][2]];
1025 cVals[2][3] = extrapolation((*mGridData)[ind[0][2][2]], (*mGridData)[ind[0][2][1]], (*mGridData)[ind[0][2][0]]);
1026 cVals[3][0] = extrapolation((*mGridData)[ind[0][2][0]], (*mGridData)[ind[0][1][0]], (*mGridData)[ind[0][0][0]]);
1027 cVals[3][1] = extrapolation((*mGridData)[ind[0][2][1]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][0][1]]);
1028 cVals[3][2] = extrapolation((*mGridData)[ind[0][2][2]], (*mGridData)[ind[0][1][2]], (*mGridData)[ind[0][0][2]]);
1029 cVals[3][3] = extrapolation((*mGridData)[ind[0][2][2]], (*mGridData)[ind[0][1][1]], (*mGridData)[ind[0][0][0]]);
1030 cVals[4][0] = (*mGridData)[ind[1][0][0]];
1031 cVals[4][1] = (*mGridData)[ind[1][0][1]];
1032 cVals[4][2] = (*mGridData)[ind[1][0][2]];
1033 cVals[4][3] = extrapolation((*mGridData)[ind[1][0][2]], (*mGridData)[ind[1][0][1]], (*mGridData)[ind[1][0][0]]);
1034 cVals[5][0] = (*mGridData)[ind[1][1][0]];
1035 cVals[5][2] = (*mGridData)[ind[1][1][2]];
1036 cVals[5][3] = extrapolation((*mGridData)[ind[1][1][2]], (*mGridData)[ii_x_y_z], (*mGridData)[ind[1][1][0]]);
1037 cVals[6][0] = (*mGridData)[ind[1][2][0]];
1038 cVals[6][1] = (*mGridData)[ind[1][2][1]];
1039 cVals[6][2] = (*mGridData)[ind[1][2][2]];
1040 cVals[6][3] = extrapolation((*mGridData)[ind[1][2][2]], (*mGridData)[ind[1][2][1]], (*mGridData)[ind[1][2][0]]);
1041 cVals[7][0] = extrapolation((*mGridData)[ind[1][2][0]], (*mGridData)[ind[1][1][0]], (*mGridData)[ind[1][0][0]]);
1042 cVals[7][1] = extrapolation((*mGridData)[ind[1][2][1]], (*mGridData)[ii_x_y_z], (*mGridData)[ind[1][0][1]]);
1043 cVals[7][2] = extrapolation((*mGridData)[ind[1][2][2]], (*mGridData)[ind[1][1][2]], (*mGridData)[ind[1][0][2]]);
1044 cVals[7][3] = extrapolation((*mGridData)[ind[1][2][2]], (*mGridData)[ind[1][1][1]], (*mGridData)[ind[1][0][0]]);
1045 cVals[8][0] = (*mGridData)[ind[2][0][0]];
1046 cVals[8][1] = (*mGridData)[ind[2][0][1]];
1047 cVals[8][2] = (*mGridData)[ind[2][0][2]];
1048 cVals[8][3] = extrapolation((*mGridData)[ind[2][0][2]], (*mGridData)[ind[2][0][1]], (*mGridData)[ind[2][0][0]]);
1049 cVals[9][0] = (*mGridData)[ind[2][1][0]];
1050 cVals[9][1] = (*mGridData)[ind[2][1][1]];
1051 cVals[9][2] = (*mGridData)[ind[2][1][2]];
1052 cVals[9][3] = extrapolation((*mGridData)[ind[2][1][2]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][1][0]]);
1053 cVals[10][0] = (*mGridData)[ind[2][2][0]];
1054 cVals[10][1] = (*mGridData)[ind[2][2][1]];
1055 cVals[10][2] = (*mGridData)[ind[2][2][2]];
1056 cVals[10][3] = extrapolation((*mGridData)[ind[2][2][2]], (*mGridData)[ind[2][2][1]], (*mGridData)[ind[2][2][0]]);
1057 cVals[11][0] = extrapolation((*mGridData)[ind[2][2][0]], (*mGridData)[ind[2][1][0]], (*mGridData)[ind[2][0][0]]);
1058 cVals[11][1] = extrapolation((*mGridData)[ind[2][2][1]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][0][1]]);
1059 cVals[11][2] = extrapolation((*mGridData)[ind[2][2][2]], (*mGridData)[ind[2][1][2]], (*mGridData)[ind[2][0][2]]);
1060 cVals[11][3] = extrapolation((*mGridData)[ind[2][2][2]], (*mGridData)[ind[2][1][1]], (*mGridData)[ind[2][0][0]]);
1061 cVals[12][0] = (*mGridData)[ind[3][0][0]];
1062 cVals[12][1] = (*mGridData)[ind[3][0][1]];
1063 cVals[12][2] = (*mGridData)[ind[3][0][2]];
1064 cVals[12][3] = extrapolation((*mGridData)[ind[3][0][2]], (*mGridData)[ind[3][0][1]], (*mGridData)[ind[3][0][0]]);
1065 cVals[13][0] = (*mGridData)[ind[3][1][0]];
1066 cVals[13][1] = (*mGridData)[ind[3][1][1]];
1067 cVals[13][2] = (*mGridData)[ind[3][1][2]];
1068 cVals[13][3] = extrapolation((*mGridData)[ind[3][1][2]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][1][0]]);
1069 cVals[14][0] = (*mGridData)[ind[3][2][0]];
1070 cVals[14][1] = (*mGridData)[ind[3][2][1]];
1071 cVals[14][2] = (*mGridData)[ind[3][2][2]];
1072 cVals[14][3] = extrapolation((*mGridData)[ind[3][2][2]], (*mGridData)[ind[3][2][1]], (*mGridData)[ind[3][2][0]]);
1073 cVals[15][0] = extrapolation((*mGridData)[ind[3][2][0]], (*mGridData)[ind[3][1][0]], (*mGridData)[ind[3][0][0]]);
1074 cVals[15][1] = extrapolation((*mGridData)[ind[3][2][1]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][0][1]]);
1075 cVals[15][2] = extrapolation((*mGridData)[ind[3][2][2]], (*mGridData)[ind[3][1][2]], (*mGridData)[ind[3][0][2]]);
1076 cVals[15][3] = extrapolation((*mGridData)[ind[3][2][2]], (*mGridData)[ind[3][1][1]], (*mGridData)[ind[3][0][0]]);
1077 } break;
1078 }
1079}
1080
This class provides a simple method to store values on a large 3-Dim grid with ROOT io functionality.
uint16_t pos
Definition RawData.h:3
Definition of TriCubic class.
TriCubicInterpolator(const DataContainer &gridData, const Grid3D &gridProperties)
Definition TriCubic.h:60
TriCubicInterpolator< DataT > & operator=(TriCubicInterpolator< DataT > &&)
move assignment
Definition TriCubic.cxx:36
GLuint index
Definition glcorearb.h:781
GLuint GLfloat * val
Definition glcorearb.h:1582
GLboolean r
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
Global TPC definitions and constants.
Definition SimTraits.h:167
Vector< DataT, N > floor_vec(const Vector< DataT, N > &a)
Definition Vector.h:74
DataT sum(const Vector< DataT, N > &a)
Definition Vector.h:107
VectorOfTObjectPtrs other
o2::InteractionRecord ir(0, 0)
std::vector< int > row