Peano 4
Loading...
Searching...
No Matches
SaintVenantKernels.h
Go to the documentation of this file.
1// This file is part of the ExaHyPE2 project. For conditions of distribution and
2// use, please see the copyright notice at www.peano-framework.org
3#pragma once
4
5#include <cmath>
6
7#include "peano4/utils/Loop.h"
9#include "tarch/la/Vector.h"
11
26enum unknowns { h = 0, hu, hv };
27
28
30
31 static void boundaryConditions(
32 const double* __restrict__ Qinside, // Qinside[3+13]
33 double* __restrict__ Qoutside, // Qoutside[3+13]
35 double t,
36 int normal,
37 int NumberOfUnknowns,
38 int NumberOfAuxiliaryVariables
39 ) {
40 // Reflecting boundary conditions
41 Qoutside[0] = Qinside[0];
42 Qoutside[1] = -Qinside[1];
43 Qoutside[2] = -Qinside[2];
44 Qoutside[3] = Qinside[3];
45 Qoutside[4] = Qinside[4];
46 Qoutside[5] = Qinside[5];
47 Qoutside[6] = Qinside[6];
48 Qoutside[7] = Qinside[7];
49 Qoutside[8] = Qinside[8];
50 Qoutside[9] = Qinside[9];
51 Qoutside[10] = Qinside[10];
52 Qoutside[11] = Qinside[11];
53 Qoutside[12] = Qinside[12];
54 Qoutside[13] = Qinside[13];
55 Qoutside[14] = Qinside[14];
56 Qoutside[15] = Qinside[15];
57 }
58
59 static double maxEigenvalue(
60 const double* __restrict__ Q, // Q[3+1],
62 double t,
63 double dt,
64 int normal,
65 int NumberOfUnknowns,
66 int NumberOfAuxiliaryVariables,
67 double Zeta = 0.0,
68 double Gravity = 9.81
69 ) {
70
71 if (tarch::la::greater(Q[0], 0.0)) {
72 assertion(Q[0] > 0);
73 double result = 1.0;
74 const double ih = 1.0 / Q[0]; // Inverse water height
75 const double c = std::sqrt(Gravity * cos(Zeta) * Q[0]);
76 double u = 0.0;
77
78 switch (normal) {
79 case 0: // x
80 // Q[1] is the momentum in x-direction but we need the velocity
81 // here. Therefore, multiply by the inverse water height (i.e., we
82 // divide by the height).
83 u = ih * Q[1];
84 result = std::max(std::abs(u - c), std::abs(u + c));
85 break;
86 case 1: // y
87 u = ih * Q[2];
88 result = std::max(std::abs(u - c), std::abs(u + c));
89 break;
90 }
91 return result;
92 }
93 return 0.0;
94 }
95
96 static void flux(
97 const double* __restrict__ Q, // Q[3+1],
99 double t,
100 double dt,
101 int normal,
102 double* __restrict__ F, // F[3]
103 int NumberOfUnknowns,
104 int NumberOfAuxiliaryVariables,
105 double Zeta = 0.0,
106 double Gravity = 9.81
107 ) {
108 if (tarch::la::greater(Q[0], 0.0)) {
109 const double ih = 1.0 / Q[0];
110
111 switch (normal) {
112 case 0:
113 F[0] = Q[1]; // hu_1
114 F[1] = ih * Q[1] * Q[1]
115 + 0.5 * Gravity * cos(Zeta) * Q[0] * Q[0]; // h(u_1)^2 +
116 // 0.5*g*h**2
117 F[2] = ih * Q[1] * Q[2]; // hu_1u_2
118 break;
119 case 1:
120 F[0] = Q[2]; // hu_2
121 F[1] = ih * Q[2] * Q[1]; // hu_1u_2
122 F[2] = ih * Q[2] * Q[2]
123 + 0.5 * Gravity * cos(Zeta) * Q[0] * Q[0]; // h(u_2)^2 +
124 // 0.5*g*h**2
125 break;
126 }
127
128 } else {
129 switch (normal) {
130 case 0:
131 F[0] = 0.0;
132 F[1] = 0.0;
133 F[2] = 0.0;
134 break;
135 case 1:
136 F[0] = 0.0;
137 F[1] = 0.0;
138 F[2] = 0.0;
139 break;
140 }
141 }
142 }
143
144 static void extrapolateHalo(
145 double* __restrict__ oldQWithHalo,
146 int NumberOfFiniteVolumesPerAxisPerPatch,
147 int NumberOfUnknowns,
148 int NumberOfAuxiliaryVariables
149 ) {
150 // extrapolation
152 topLeftCell = {0, NumberOfFiniteVolumesPerAxisPerPatch + 1};
154 NumberOfFiniteVolumesPerAxisPerPatch + 1,
155 NumberOfFiniteVolumesPerAxisPerPatch + 1};
156 tarch::la::Vector<Dimensions, int> bottomLeftCell = {0, 0};
158 bottomRightCell = {NumberOfFiniteVolumesPerAxisPerPatch + 1, 0};
159
160 tarch::la::Vector<Dimensions, int> topLeftCellN1 = topLeftCell;
161 topLeftCellN1(0)++;
162 tarch::la::Vector<Dimensions, int> topLeftCellN2 = topLeftCell;
163 topLeftCellN2(1)--;
164
165 tarch::la::Vector<Dimensions, int> topRightCellN1 = topRightCell;
166 topRightCellN1(0)--;
167 tarch::la::Vector<Dimensions, int> topRightCellN2 = topRightCell;
168 topRightCellN2(1)--;
169
170 tarch::la::Vector<Dimensions, int> bottomLeftCellN1 = bottomLeftCell;
171 bottomLeftCellN1(0)++;
172 tarch::la::Vector<Dimensions, int> bottomLeftCellN2 = bottomLeftCell;
173 bottomLeftCellN2(1)++;
174
175 tarch::la::Vector<Dimensions, int> bottomRightCellN1 = bottomRightCell;
176 bottomRightCellN1(0)--;
177 tarch::la::Vector<Dimensions, int> bottomRightCellN2 = bottomRightCell;
178 bottomRightCellN2(1)++;
179
180 const int topLeftCellSerialised = peano4::utils::dLinearised(
181 topLeftCell,
182 NumberOfFiniteVolumesPerAxisPerPatch + 2
183 );
184 const int topRightCellSerialised = peano4::utils::dLinearised(
185 topRightCell,
186 NumberOfFiniteVolumesPerAxisPerPatch + 2
187 );
188
189 const int bottomLeftCellSerialised = peano4::utils::dLinearised(
190 bottomLeftCell,
191 NumberOfFiniteVolumesPerAxisPerPatch + 2
192 );
193 const int bottomRightCellSerialised = peano4::utils::dLinearised(
194 bottomRightCell,
195 NumberOfFiniteVolumesPerAxisPerPatch + 2
196 );
197
198 const int topLeftCellN1Serialised = peano4::utils::dLinearised(
199 topLeftCellN1,
200 NumberOfFiniteVolumesPerAxisPerPatch + 2
201 );
202 const int topLeftCellN2Serialised = peano4::utils::dLinearised(
203 topLeftCellN2,
204 NumberOfFiniteVolumesPerAxisPerPatch + 2
205 );
206
207 const int topRightCellN1Serialised = peano4::utils::dLinearised(
208 topRightCellN1,
209 NumberOfFiniteVolumesPerAxisPerPatch + 2
210 );
211 const int topRightCellN2Serialised = peano4::utils::dLinearised(
212 topRightCellN2,
213 NumberOfFiniteVolumesPerAxisPerPatch + 2
214 );
215
216 const int bottomLeftCellN1Serialised = peano4::utils::dLinearised(
217 bottomLeftCellN1,
218 NumberOfFiniteVolumesPerAxisPerPatch + 2
219 );
220 const int bottomLeftCellN2Serialised = peano4::utils::dLinearised(
221 bottomLeftCellN2,
222 NumberOfFiniteVolumesPerAxisPerPatch + 2
223 );
224
225 const int bottomRightCellN1Serialised = peano4::utils::dLinearised(
226 bottomRightCellN1,
227 NumberOfFiniteVolumesPerAxisPerPatch + 2
228 );
229 const int bottomRightCellN2Serialised = peano4::utils::dLinearised(
230 bottomRightCellN2,
231 NumberOfFiniteVolumesPerAxisPerPatch + 2
232 );
233
234 for (int i = 0; i < NumberOfUnknowns + NumberOfAuxiliaryVariables; i++) {
235
236 oldQWithHalo
237 [(topLeftCellSerialised
238 ) * (NumberOfUnknowns + NumberOfAuxiliaryVariables)
239 + i]
240 = 0.5
241 * (oldQWithHalo[(topLeftCellN1Serialised) * (NumberOfUnknowns + NumberOfAuxiliaryVariables) + i] + oldQWithHalo[(topLeftCellN2Serialised) * (NumberOfUnknowns + NumberOfAuxiliaryVariables) + i]);
242 oldQWithHalo
243 [(topRightCellSerialised
244 ) * (NumberOfUnknowns + NumberOfAuxiliaryVariables)
245 + i]
246 = 0.5
247 * (oldQWithHalo[(topRightCellN1Serialised) * (NumberOfUnknowns + NumberOfAuxiliaryVariables) + i] + oldQWithHalo[(topRightCellN2Serialised) * (NumberOfUnknowns + NumberOfAuxiliaryVariables) + i]);
248
249 oldQWithHalo
250 [(bottomLeftCellSerialised
251 ) * (NumberOfUnknowns + NumberOfAuxiliaryVariables)
252 + i]
253 = 0.5
254 * (oldQWithHalo[(bottomLeftCellN1Serialised) * (NumberOfUnknowns + NumberOfAuxiliaryVariables) + i] + oldQWithHalo[(bottomLeftCellN2Serialised) * (NumberOfUnknowns + NumberOfAuxiliaryVariables) + i]);
255
256 oldQWithHalo
257 [(bottomRightCellSerialised
258 ) * (NumberOfUnknowns + NumberOfAuxiliaryVariables)
259 + i]
260 = 0.5
261 * (oldQWithHalo[(bottomRightCellN1Serialised) * (NumberOfUnknowns + NumberOfAuxiliaryVariables) + i] + oldQWithHalo[(bottomRightCellN2Serialised) * (NumberOfUnknowns + NumberOfAuxiliaryVariables) + i]);
262 }
263 }
264
266 double* __restrict__ oldQWithHalo,
267 int NumberOfFiniteVolumesPerAxisPerPatch,
268 int NumberOfUnknowns,
269 int NumberOfAuxiliaryVariables
270 ) {
271 // derivative calculation
272 // backward difference for single derivatives
273 // central difference for double derivatives
274 const int totalVariables = NumberOfUnknowns + NumberOfAuxiliaryVariables;
275
276 for (int y = 1; y < NumberOfFiniteVolumesPerAxisPerPatch + 1; y++) {
277 for (int x = 1; x < NumberOfFiniteVolumesPerAxisPerPatch + 1; x++) {
278 const tarch::la::Vector<Dimensions, int> currentCell = {x, y};
280 xLeftNeighbourCell = {x - 1, y};
282 xRightNeighbourCell = {x + 1, y};
284 yLeftNeighbourCell = {x, y - 1};
286 yRightNeighbourCell = {x, y + 1};
288 xLeftYLeftNeighbourCell = {x - 1, y - 1};
290 xLeftYRightNeighbourCell = {x - 1, y + 1};
292 xRightYLeftNeighbourCell = {x + 1, y - 1};
294 xRightYRightNeighbourCell = {x + 1, y + 1};
295
296
297 const int currentCellSerialized = peano4::utils::dLinearised(
298 currentCell,
299 NumberOfFiniteVolumesPerAxisPerPatch + 2
300 );
301 const int xLeftNeighbourCellSerialized = peano4::utils::dLinearised(
302 xLeftNeighbourCell,
303 NumberOfFiniteVolumesPerAxisPerPatch + 2
304 );
305 const int xRightNeighbourCellSerialized = peano4::utils::dLinearised(
306 xRightNeighbourCell,
307 NumberOfFiniteVolumesPerAxisPerPatch + 2
308 );
309 const int yLeftNeighbourCellSerialized = peano4::utils::dLinearised(
310 yLeftNeighbourCell,
311 NumberOfFiniteVolumesPerAxisPerPatch + 2
312 );
313 const int yRightNeighbourCellSerialized = peano4::utils::dLinearised(
314 yRightNeighbourCell,
315 NumberOfFiniteVolumesPerAxisPerPatch + 2
316 );
317
318 const int xLeftYLeftNeighbourCellSerialized = peano4::utils::dLinearised(
319 xLeftYLeftNeighbourCell,
320 NumberOfFiniteVolumesPerAxisPerPatch + 2
321 );
322
323 const int xLeftYRightNeighbourCellSerialized = peano4::utils::
325 xLeftYRightNeighbourCell,
326 NumberOfFiniteVolumesPerAxisPerPatch + 2
327 );
328
329 const int xRightYLeftNeighbourCellSerialized = peano4::utils::
331 xRightYLeftNeighbourCell,
332 NumberOfFiniteVolumesPerAxisPerPatch + 2
333 );
334
335 const int xRightYRightNeighbourCellSerialized = peano4::utils::
337 xRightYRightNeighbourCell,
338 NumberOfFiniteVolumesPerAxisPerPatch + 2
339 );
340
341 const double hCurrentCell = oldQWithHalo
342 [currentCellSerialized * totalVariables + h];
343 const double uCurrentCell
344 = (tarch::la::greater(oldQWithHalo[currentCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[currentCellSerialized * totalVariables + hu] / oldQWithHalo[currentCellSerialized * totalVariables + h] : 0.0);
345 const double vCurrentCell
346 = (tarch::la::greater(oldQWithHalo[currentCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[currentCellSerialized * totalVariables + hv] / oldQWithHalo[currentCellSerialized * totalVariables + h] : 0.0);
347
348 const double hXLeftNeighbourCell = oldQWithHalo
349 [xLeftNeighbourCellSerialized * totalVariables + h];
350 const double uXLeftNeighbourCell
351 = (tarch::la::greater(oldQWithHalo[xLeftNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xLeftNeighbourCellSerialized * totalVariables + hu] / oldQWithHalo[xLeftNeighbourCellSerialized * totalVariables + h] : 0.0);
352 const double vXLeftNeighbourCell
353 = (tarch::la::greater(oldQWithHalo[xLeftNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xLeftNeighbourCellSerialized * totalVariables + hv] / oldQWithHalo[xLeftNeighbourCellSerialized * totalVariables + h] : 0.0);
354
355 const double hXRightNeighbourCell = oldQWithHalo
356 [xRightNeighbourCellSerialized * totalVariables + h];
357 const double uXRightNeighbourCell
358 = (tarch::la::greater(oldQWithHalo[xRightNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xRightNeighbourCellSerialized * totalVariables + hu] / oldQWithHalo[xRightNeighbourCellSerialized * totalVariables + h] : 0.0);
359
360 const double vXRightNeighbourCell
361 = (tarch::la::greater(oldQWithHalo[xRightNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xRightNeighbourCellSerialized * totalVariables + hv] / oldQWithHalo[xRightNeighbourCellSerialized * totalVariables + h] : 0.0);
362
363 const double hYLeftNeighbourCell = oldQWithHalo
364 [yLeftNeighbourCellSerialized * totalVariables + h];
365 const double uYLeftNeighbourCell
366 = (tarch::la::greater(oldQWithHalo[yLeftNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[yLeftNeighbourCellSerialized * totalVariables + hu] / oldQWithHalo[yLeftNeighbourCellSerialized * totalVariables + h] : 0.0);
367 const double vYLeftNeighbourCell
368 = (tarch::la::greater(oldQWithHalo[yLeftNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[yLeftNeighbourCellSerialized * totalVariables + hv] / oldQWithHalo[yLeftNeighbourCellSerialized * totalVariables + h] : 0.0);
369
370 const double hYRightNeighbourCell = oldQWithHalo
371 [yRightNeighbourCellSerialized * totalVariables + h];
372 const double uYRightNeighbourCell
373 = (tarch::la::greater(oldQWithHalo[yRightNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[yRightNeighbourCellSerialized * totalVariables + hu] / oldQWithHalo[yRightNeighbourCellSerialized * totalVariables + h] : 0.0);
374
375 const double vYRightNeighbourCell
376 = (tarch::la::greater(oldQWithHalo[yRightNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[yRightNeighbourCellSerialized * totalVariables + hv] / oldQWithHalo[yRightNeighbourCellSerialized * totalVariables + h] : 0.0);
377
378 const double uXLeftYLeftNeighbourCell
379 = (tarch::la::greater(oldQWithHalo[xLeftYLeftNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xLeftYLeftNeighbourCellSerialized * totalVariables + hu] / oldQWithHalo[xLeftYLeftNeighbourCellSerialized * totalVariables + h] : 0.0);
380 const double vXLeftYLeftNeighbourCell
381 = (tarch::la::greater(oldQWithHalo[xLeftYLeftNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xLeftYLeftNeighbourCellSerialized * totalVariables + hv] / oldQWithHalo[xLeftYLeftNeighbourCellSerialized * totalVariables + h] : 0.0);
382
383 const double uXLeftYRightNeighbourCell
384 = (tarch::la::greater(oldQWithHalo[xLeftYRightNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xLeftYRightNeighbourCellSerialized * totalVariables + hu] / oldQWithHalo[xLeftYRightNeighbourCellSerialized * totalVariables + h] : 0.0);
385
386 const double vXLeftYRightNeighbourCell
387 = (tarch::la::greater(oldQWithHalo[xLeftYRightNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xLeftYRightNeighbourCellSerialized * totalVariables + hv] / oldQWithHalo[xLeftYRightNeighbourCellSerialized * totalVariables + h] : 0.0);
388
389
390 const double uXRightYLeftNeighbourCell
391 = (tarch::la::greater(oldQWithHalo[xRightYLeftNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xRightYLeftNeighbourCellSerialized * totalVariables + hu] / oldQWithHalo[xRightYLeftNeighbourCellSerialized * totalVariables + h] : 0.0);
392
393 const double vXRightYLeftNeighbourCell
394 = (tarch::la::greater(oldQWithHalo[xRightYLeftNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xRightYLeftNeighbourCellSerialized * totalVariables + hv] / oldQWithHalo[xRightYLeftNeighbourCellSerialized * totalVariables + h] : 0.0);
395
396
397 const double uXRightYRightNeighbourCell
398 = (tarch::la::greater(oldQWithHalo[xRightYRightNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xRightYRightNeighbourCellSerialized * totalVariables + hu] / oldQWithHalo[xRightYRightNeighbourCellSerialized * totalVariables + h] : 0.0);
399
400 const double vXRightYRightNeighbourCell
401 = (tarch::la::greater(oldQWithHalo[xRightYRightNeighbourCellSerialized * totalVariables + h], 0.0) ? oldQWithHalo[xRightYRightNeighbourCellSerialized * totalVariables + hv] / oldQWithHalo[xRightYRightNeighbourCellSerialized * totalVariables + h] : 0.0);
402
403 // Derivative calculation:
404 // Backward difference for single derivatives.
405 // Central difference for double derivatives.
406 // Only numerator is of the finite difference scheme is calculated here.
407 // The division by the denominator takes place in the ncp function after
408 // retrieval from average value. For single derivatives, one can change
409 // the numerical scheme to forward, central or backward by using
410 // appropriate neighbour cell values defined above. For double
411 // derivatives, only central difference can be used with the variables
412 // defined above.
413
414 // h_x
415 oldQWithHalo
416 [currentCellSerialized * totalVariables + NumberOfUnknowns + h_x]
417 = (hCurrentCell - hXLeftNeighbourCell);
418
419 // h_y
420 oldQWithHalo
421 [currentCellSerialized * totalVariables + NumberOfUnknowns + h_y]
422 = (hCurrentCell - hYLeftNeighbourCell);
423
424 // u_x
425 oldQWithHalo
426 [currentCellSerialized * totalVariables + NumberOfUnknowns + u_x]
427 = (uCurrentCell - uXLeftNeighbourCell);
428
429 // u_y
430 oldQWithHalo
431 [currentCellSerialized * totalVariables + NumberOfUnknowns + u_y]
432 = (uCurrentCell - uYLeftNeighbourCell);
433
434 // u_xx
435 oldQWithHalo
436 [currentCellSerialized * totalVariables + NumberOfUnknowns + u_xx]
437 = (uXRightNeighbourCell - 2 * uCurrentCell + uXLeftNeighbourCell);
438
439 // u_yy
440 oldQWithHalo
441 [currentCellSerialized * totalVariables + NumberOfUnknowns + u_yy]
442 = (uYRightNeighbourCell - 2 * uCurrentCell + uYLeftNeighbourCell);
443
444 // u_xy
445 oldQWithHalo
446 [currentCellSerialized * totalVariables + NumberOfUnknowns + u_xy]
447 = (uXRightYRightNeighbourCell - uXLeftYRightNeighbourCell - uXRightYLeftNeighbourCell + uXLeftYLeftNeighbourCell);
448
449 // v_x
450 oldQWithHalo
451 [currentCellSerialized * totalVariables + NumberOfUnknowns + v_x]
452 = (vCurrentCell - vXLeftNeighbourCell);
453
454 // v_y
455 oldQWithHalo
456 [currentCellSerialized * totalVariables + NumberOfUnknowns + v_y]
457 = (vCurrentCell - vYLeftNeighbourCell);
458
459 // v_xx
460 oldQWithHalo
461 [currentCellSerialized * totalVariables + NumberOfUnknowns + v_xx]
462 = (vXRightNeighbourCell - 2 * vCurrentCell + vXLeftNeighbourCell);
463
464 // v_yy
465 oldQWithHalo
466 [currentCellSerialized * totalVariables + NumberOfUnknowns + v_yy]
467 = (vYRightNeighbourCell - 2 * vCurrentCell + vYLeftNeighbourCell);
468
469 // v_xy
470 oldQWithHalo
471 [currentCellSerialized * totalVariables + NumberOfUnknowns + v_xy]
472 = (vXRightYRightNeighbourCell - vXLeftYRightNeighbourCell - vXRightYLeftNeighbourCell + vXLeftYLeftNeighbourCell);
473 }
474 }
475 }
476} // namespace exahype2::saintvenant
#define assertion(expr)
static void boundaryConditions(const double *__restrict__ Qinside, double *__restrict__ Qoutside, const tarch::la::Vector< Dimensions, double > &faceCentre, double t, int normal, int NumberOfUnknowns, int NumberOfAuxiliaryVariables)
static void calculateDerivatives(double *__restrict__ oldQWithHalo, int NumberOfFiniteVolumesPerAxisPerPatch, int NumberOfUnknowns, int NumberOfAuxiliaryVariables)
static void extrapolateHalo(double *__restrict__ oldQWithHalo, int NumberOfFiniteVolumesPerAxisPerPatch, int NumberOfUnknowns, int NumberOfAuxiliaryVariables)
static double maxEigenvalue(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, double t, double dt, int normal, int NumberOfUnknowns, int NumberOfAuxiliaryVariables, double Zeta=0.0, double Gravity=9.81)
static void flux(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &faceCentre, double t, double dt, int normal, double *__restrict__ F, int NumberOfUnknowns, int NumberOfAuxiliaryVariables, double Zeta=0.0, double Gravity=9.81)
CPUGPUMethod int dLinearised(const tarch::la::Vector< Dimensions, int > &counter, int max)
Map d-dimensional vector onto integer index.
Definition Loop.cpp:106
bool greater(double lhs, double rhs, double tolerance=NUMERICAL_ZERO_DIFFERENCE)
Simple vector class.
Definition Vector.h:134