Peano
Loading...
Searching...
No Matches
Restriction.cpp
Go to the documentation of this file.
1#include "Restriction.h"
2
3#include "Enumeration.h"
4#include "Interpolation.h"
5#include "peano4/utils/Loop.h"
6#include "tarch/Assertions.h"
11
12namespace {
13 [[maybe_unused]] tarch::logging::Log _log("toolbox::blockstructured");
14} // namespace
15
17 [[maybe_unused]] const peano4::datamanagement::CellMarker& marker,
18 [[maybe_unused]] int numberOfDoFsPerAxisInPatch,
19 [[maybe_unused]] int unknowns,
20 [[maybe_unused]] const double* __restrict__ tangentialRestrictionMatrix1d,
21 [[maybe_unused]] double* fineGridValues,
22 [[maybe_unused]] double* coarseGridValues
23) {
24 assertionMsg(false, "@Han, we have to implement this one");
25}
26
28 [[maybe_unused]] const peano4::datamanagement::CellMarker& marker,
29 [[maybe_unused]] int numberOfDoFsPerAxisInPatch,
30 [[maybe_unused]] int unknowns,
31 [[maybe_unused]] const double* __restrict__ restrictionData,
32 [[maybe_unused]] const int* __restrict__ columnIndices,
33 [[maybe_unused]] const int* __restrict__ rowIndices,
34 [[maybe_unused]] double* fineGridValues,
35 [[maybe_unused]] double* coarseGridValues
36) {
37 assertionMsg(false, "To be implemented");
38}
39
41 [[maybe_unused]] const peano4::datamanagement::CellMarker& marker,
42 [[maybe_unused]] int numberOfDoFsPerAxisInPatch,
43 [[maybe_unused]] int unknowns,
44 [[maybe_unused]] double* fineGridValues,
45 [[maybe_unused]] double* coarseGridValues
46) {
47 assertionMsg(false, "To be implemented");
48}
49
51 [[maybe_unused]] const peano4::datamanagement::CellMarker& marker,
52 [[maybe_unused]] int numberOfDoFsPerAxisInPatch,
53 [[maybe_unused]] int unknowns,
54 [[maybe_unused]] double* fineGridValues,
55 [[maybe_unused]] double* coarseGridValues
56) {
57 assertionMsg(false, "To be implemented");
58}
59
60
63 int numberOfDoFsPerAxisInPatch,
64 int overlap,
65 int unknowns,
66 const double* __restrict__ normalRestrictionMatrix1d,
67 const double* __restrict__ tangentialRestrictionMatrix1d,
68 double* fineGridValues,
69 double* coarseGridValues
70) {
72 marker,
73 numberOfDoFsPerAxisInPatch,
74 overlap,
75 unknowns,
76 normalRestrictionMatrix1d,
77 tangentialRestrictionMatrix1d,
78 fineGridValues,
79 coarseGridValues,
80 false
81 );
83 marker,
84 numberOfDoFsPerAxisInPatch,
85 overlap,
86 unknowns,
87 normalRestrictionMatrix1d,
88 tangentialRestrictionMatrix1d,
89 fineGridValues,
90 coarseGridValues,
91 true
92 );
93}
94
97 int numberOfDoFsPerAxisInPatch,
98 int overlap,
99 int unknowns,
100 const double* __restrict__ restrictionData,
101 const int* __restrict__ columnIndices,
102 const int* __restrict__ rowIndices,
103 int dataOffset,
104 int rowIndicesOffset,
105 double* fineGridValues,
106 double* coarseGridValues
107) {
109 marker,
110 numberOfDoFsPerAxisInPatch,
111 overlap,
112 unknowns,
113 restrictionData,
114 columnIndices,
115 rowIndices,
116 dataOffset,
117 rowIndicesOffset,
118 fineGridValues,
119 coarseGridValues,
120 false
121 );
123 marker,
124 numberOfDoFsPerAxisInPatch,
125 overlap,
126 unknowns,
127 restrictionData,
128 columnIndices,
129 rowIndices,
130 dataOffset,
131 rowIndicesOffset,
132 fineGridValues,
133 coarseGridValues,
134 true
135 );
136}
137
140 int numberOfDoFsPerAxisInPatch,
141 int overlap,
142 int unknowns,
143 double* fineGridValues,
144 double* coarseGridValues
145) {
146 restrictInnerHalfOfHaloLayer_AoS_second_order(
147 marker,
148 numberOfDoFsPerAxisInPatch,
149 overlap,
150 unknowns,
151 fineGridValues,
152 coarseGridValues,
153 false
154 );
155 restrictInnerHalfOfHaloLayer_AoS_second_order(
156 marker,
157 numberOfDoFsPerAxisInPatch,
158 overlap,
159 unknowns,
160 fineGridValues,
161 coarseGridValues,
162 true
163 );
164}
165
168 int numberOfDoFsPerAxisInPatch,
169 int overlap,
170 int unknowns,
171 double* fineGridValues,
172 double* coarseGridValues
173) {
174 restrictInnerHalfOfHaloLayer_AoS_third_order(
175 marker,
176 numberOfDoFsPerAxisInPatch,
177 overlap,
178 unknowns,
179 fineGridValues,
180 coarseGridValues,
181 false
182 );
183 restrictInnerHalfOfHaloLayer_AoS_third_order(
184 marker,
185 numberOfDoFsPerAxisInPatch,
186 overlap,
187 unknowns,
188 fineGridValues,
189 coarseGridValues,
190 true
191 );
192}
193
196 int numberOfDoFsPerAxisInPatch,
197 int overlap,
198 int unknowns,
199 double* fineGridValues,
200 double* coarseGridValues,
201 bool swapInsideOutside
202) {
203 const int normal = marker.getSelectedFaceNumber() % Dimensions;
204 double* stencilCenterValues = new double[unknowns];
206 int row = 0;
207
208 A(0, 0) = 1.0 / 3.0;
209 A(0, 1) = 1.0 / 18.0;
210 A(1, 0) = -1.0 / 3.0;
211 A(1, 1) = 1.0 / 18.0;
212
213 tarch::la::DynamicMatrix Q(A.rows(), A.rows());
214 tarch::la::DynamicMatrix R(A.rows(), A.cols());
216
219
220 const int i = (normal + 1) % Dimensions;
221#if Dimensions == 3
222 const int j = (normal + 2) % Dimensions;
223#endif
224
226 coarseStart(i) = (marker.getRelativePositionWithinFatherCell()(i) * numberOfDoFsPerAxisInPatch + 1) / 3;
227#if Dimensions == 3
228 coarseStart(j) = (marker.getRelativePositionWithinFatherCell()(j) * numberOfDoFsPerAxisInPatch + 1) / 3;
229#endif
230
232 coarseEnd(i) = ((marker.getRelativePositionWithinFatherCell()(i) + 1) * numberOfDoFsPerAxisInPatch + 1) / 3;
233#if Dimensions == 3
234 coarseEnd(j) = ((marker.getRelativePositionWithinFatherCell()(j) + 1) * numberOfDoFsPerAxisInPatch + 1) / 3;
235#endif
236
237 tarch::la::Vector<Dimensions, int> fineDataStart(0);
238 fineDataStart(i) = (marker.getRelativePositionWithinFatherCell()(i) * numberOfDoFsPerAxisInPatch) % 3;
239#if Dimensions == 3
240 fineDataStart(j) = (marker.getRelativePositionWithinFatherCell()(j) * numberOfDoFsPerAxisInPatch) % 3;
241#endif
242
243 if (fineDataStart(i) == 1)
244 fineDataStart(i) = -1;
245 if (fineDataStart(i) == 2)
246 fineDataStart(i) = 1;
247#if Dimensions == 3
248 if (fineDataStart(j) == 1)
249 fineDataStart(j) = -1;
250 if (fineDataStart(j) == 2)
251 fineDataStart(j) = 1;
252#endif
253
254 tarch::la::Vector<Dimensions, int> faceDimensions = coarseEnd - coarseStart;
255 faceDimensions(normal) = (overlap - 1) / 3 + 1;
256
257 dfor(kCoarse, faceDimensions){
258 tarch::la::Vector<Dimensions, int> fineCenter = kCoarse * 3 + tarch::la::Vector<Dimensions, int>(1) + fineDataStart;
259 fineCenter(normal) = (marker.getSelectedFaceNumber() < Dimensions xor swapInsideOutside) ? overlap + 1: overlap - 2;
260
261 int centerIndex = serialiseVoxelIndexInOverlap(
262 fineCenter,
263 numberOfDoFsPerAxisInPatch,
264 overlap,
265 normal
266 );
267 for (int unknown = 0; unknown < unknowns; unknown++) {
268 stencilCenterValues[unknown] = fineGridValues
269 [centerIndex * unknowns + unknown];
270 }
271
272 tarch::la::DynamicMatrix deltas(2, unknowns);
274 offset(normal) = 1;
275
277 fineCenter + offset,
278 numberOfDoFsPerAxisInPatch,
279 overlap,
280 normal
281 );
282 for (int unknown = 0; unknown < unknowns; unknown++) {
283 deltas(
284 0,
285 unknown
286 ) = fineGridValues[index * unknowns + unknown]
287 - stencilCenterValues[unknown];
288 }
289
291 fineCenter - offset,
292 numberOfDoFsPerAxisInPatch,
293 overlap,
294 normal
295 );
296 for (int unknown = 0; unknown < unknowns; unknown++) {
297 deltas(
298 1,
299 unknown
300 ) = fineGridValues[index * unknowns + unknown]
301 - stencilCenterValues[unknown];
302 }
303
304 tarch::la::DynamicMatrix c = Q_T * deltas;
305 tarch::la::DynamicMatrix derivatives = inverseR * c;
306
307
308 tarch::la::DynamicMatrix coarseMatrix(overlap, 2);
309 for (int i = 0; i < overlap; i++) {
310 int distance = (marker.getSelectedFaceNumber() < Dimensions
311 xor swapInsideOutside)
312 ? i * 3 + 3 - overlap
313 : overlap - 3 - i * 3;
314
315 coarseMatrix(i, 0) = (1.0 / 3.0) * distance;
316 coarseMatrix(i, 1) = (1.0 / 18.0) * distance * distance;
317 }
318 tarch::la::DynamicMatrix coarseValues = coarseMatrix * derivatives;
319 for (int i = 0; i < overlap; i++) {
320 tarch::la::Vector<Dimensions, int> coarseCell = kCoarse + coarseStart;
321 coarseCell(normal
322 ) = (marker.getSelectedFaceNumber() < Dimensions xor swapInsideOutside)
323 ? i + overlap
324 : overlap - i - 1;
326 coarseCell,
327 numberOfDoFsPerAxisInPatch,
328 overlap,
329 normal
330 );
331 for (int unknown = 0; unknown < unknowns; unknown++) {
332 coarseGridValues[index * unknowns + unknown]
333 = stencilCenterValues[unknown] + coarseValues(i, unknown);
334 }
335 }
336 }
337
338 delete[] stencilCenterValues;
339}
340
343 int numberOfDoFsPerAxisInPatch,
344 int overlap,
345 int unknowns,
346 double* fineGridValues,
347 double* coarseGridValues,
348 bool swapInsideOutside
349) {
350 const int normal = marker.getSelectedFaceNumber() % Dimensions;
351 double* stencilCenterValues = new double[unknowns];
352
354 int row = 0;
355
356 A(0, 0) = 1.0 / 3.0;
357 A(0, 1) = 1.0 / 18.0;
358 A(0, 2) = 1.0 / 162.0;
359 A(1, 0) = -1.0 / 3.0;
360 A(1, 1) = 1.0 / 18.0;
361 A(1, 2) = -1.0 / 162.0;
362
363 double factor = ((marker.getSelectedFaceNumber() < Dimensions)
364 xor swapInsideOutside)
365 ? -1.0
366 : 1.0;
367 A(2, 0) = factor * 2.0 / 3.0;
368 A(2, 1) = 2.0 / 9.0;
369 A(2, 2) = factor * 4.0 / 81.0;
370
371 tarch::la::DynamicMatrix Q(A.rows(), A.rows());
372 tarch::la::DynamicMatrix R(A.rows(), A.cols());
374
377
378 const int i = (normal + 1) % Dimensions;
379#if Dimensions == 3
380 const int j = (normal + 2) % Dimensions;
381#endif
382
384 coarseStart(i
385 ) = (marker.getRelativePositionWithinFatherCell()(i
386 ) * numberOfDoFsPerAxisInPatch
387 + 1)
388 / 3;
389#if Dimensions == 3
390 coarseStart(j
391 ) = (marker.getRelativePositionWithinFatherCell()(j
392 ) * numberOfDoFsPerAxisInPatch
393 + 1)
394 / 3;
395#endif
396
398 coarseEnd(i
399 ) = ((marker.getRelativePositionWithinFatherCell()(i) + 1
400 ) * numberOfDoFsPerAxisInPatch
401 + 1)
402 / 3;
403#if Dimensions == 3
404 coarseEnd(j
405 ) = ((marker.getRelativePositionWithinFatherCell()(j) + 1
406 ) * numberOfDoFsPerAxisInPatch
407 + 1)
408 / 3;
409#endif
410
411 tarch::la::Vector<Dimensions, int> fineDataStart(0);
412 fineDataStart(i
413 ) = (marker.getRelativePositionWithinFatherCell()(i)
414 * numberOfDoFsPerAxisInPatch)
415 % 3;
416#if Dimensions == 3
417 fineDataStart(j
418 ) = (marker.getRelativePositionWithinFatherCell()(j)
419 * numberOfDoFsPerAxisInPatch)
420 % 3;
421#endif
422
423 if (fineDataStart(i) == 1)
424 fineDataStart(i) = -1;
425 if (fineDataStart(i) == 2)
426 fineDataStart(i) = 1;
427#if Dimensions == 3
428 if (fineDataStart(j) == 1)
429 fineDataStart(j) = -1;
430 if (fineDataStart(j) == 2)
431 fineDataStart(j) = 1;
432#endif
433
434 tarch::la::Vector<Dimensions, int> faceDimensions = coarseEnd - coarseStart;
435 faceDimensions(normal) = (overlap - 1) / 3 + 1;
436
437 dfor(kCoarse, faceDimensions) {
439 fineCenter = kCoarse * 3 + tarch::la::Vector<Dimensions, int>(1)
440 + fineDataStart;
441 fineCenter(normal
442 ) = ((marker.getSelectedFaceNumber() < Dimensions) xor swapInsideOutside)
443 ? overlap + 1
444 : overlap - 2;
445
446 int centerIndex = serialiseVoxelIndexInOverlap(
447 fineCenter,
448 numberOfDoFsPerAxisInPatch,
449 overlap,
450 normal
451 );
452 for (int unknown = 0; unknown < unknowns; unknown++) {
453 stencilCenterValues[unknown] = fineGridValues
454 [centerIndex * unknowns + unknown];
455 }
456
457 tarch::la::DynamicMatrix deltas(3, unknowns);
459 offset(normal) = 1;
460
462 fineCenter + offset,
463 numberOfDoFsPerAxisInPatch,
464 overlap,
465 normal
466 );
467 for (int unknown = 0; unknown < unknowns; unknown++) {
468 deltas(
469 0,
470 unknown
471 ) = fineGridValues[index * unknowns + unknown]
472 - stencilCenterValues[unknown];
473 }
474
476 fineCenter - offset,
477 numberOfDoFsPerAxisInPatch,
478 overlap,
479 normal
480 );
481 for (int unknown = 0; unknown < unknowns; unknown++) {
482 deltas(
483 1,
484 unknown
485 ) = fineGridValues[index * unknowns + unknown]
486 - stencilCenterValues[unknown];
487 }
488
489 offset(normal) = factor * 2.0;
491 fineCenter + offset,
492 numberOfDoFsPerAxisInPatch,
493 overlap,
494 normal
495 );
496 for (int unknown = 0; unknown < unknowns; unknown++) {
497 deltas(
498 2,
499 unknown
500 ) = fineGridValues[index * unknowns + unknown]
501 - stencilCenterValues[unknown];
502 }
503
504
505 tarch::la::DynamicMatrix c = Q_T * deltas;
506 tarch::la::DynamicMatrix derivatives = inverseR * c;
507
508 tarch::la::DynamicMatrix coarseMatrix(overlap, 3);
509 for (int i = 0; i < overlap; i++) {
510 int distance = ((marker.getSelectedFaceNumber() < Dimensions)
511 xor swapInsideOutside)
512 ? i * 3 + 3 - overlap
513 : overlap - 3 - i * 3;
514 coarseMatrix(i, 0) = (1.0 / 3.0) * distance;
515 coarseMatrix(i, 1) = (1.0 / 18.0) * distance * distance;
516 coarseMatrix(i, 2) = (1.0 / 162.0) * distance * distance * distance;
517 }
518
519 tarch::la::DynamicMatrix coarseValues = coarseMatrix * derivatives;
520 for (int i = 0; i < overlap; i++) {
521 tarch::la::Vector<Dimensions, int> coarseCell = kCoarse + coarseStart;
522 coarseCell(normal
523 ) = ((marker.getSelectedFaceNumber() < Dimensions) xor swapInsideOutside)
524 ? i + overlap
525 : overlap - i - 1;
527 coarseCell,
528 numberOfDoFsPerAxisInPatch,
529 overlap,
530 normal
531 );
532 for (int unknown = 0; unknown < unknowns; unknown++) {
533 coarseGridValues[index * unknowns + unknown]
534 = stencilCenterValues[unknown] + coarseValues(i, unknown);
535 }
536 }
537 }
538
539 delete[] stencilCenterValues;
540}
541
542
545 int numberOfDoFsPerAxisInPatch,
546 int overlap,
547 int unknowns,
548 const double* __restrict__ restrictionMatrixData,
549 const int* __restrict__ columnIndices,
550 const int* __restrict__ rowIndices,
551 int dataOffset,
552 int rowIndicesOffset,
553 double* fineGridValues,
554 double* coarseGridValues,
555 bool swapInsideOutside
556) {
557 tarch::la::Vector<Dimensions, int> fineFaceDimensions(
558 numberOfDoFsPerAxisInPatch
559 );
560
561 const int normal = marker.getSelectedFaceNumber() % Dimensions;
562 const int matrixColumns = 2 * overlap
563 * std::
564 pow(numberOfDoFsPerAxisInPatch, Dimensions - 1);
565 const int matrixRows = overlap
566 * std::pow(numberOfDoFsPerAxisInPatch, Dimensions - 1);
567
568 const int i = (normal + 1) % Dimensions;
569#if Dimensions == 3
570 const int j = (normal + 2) % Dimensions;
571#endif
572
574 coarseStart(i) = (marker.getRelativePositionWithinFatherCell()(i) * numberOfDoFsPerAxisInPatch + 1) / 3;
575#if Dimensions == 3
576 coarseStart(j) = (marker.getRelativePositionWithinFatherCell()(j) * numberOfDoFsPerAxisInPatch + 1) / 3;
577#endif
578
580 coarseEnd(i) = ((marker.getRelativePositionWithinFatherCell()(i) + 1) * numberOfDoFsPerAxisInPatch + 1) / 3;
581#if Dimensions == 3
582 coarseEnd(j) = ((marker.getRelativePositionWithinFatherCell()(j) + 1) * numberOfDoFsPerAxisInPatch + 1) / 3;
583#endif
584
586 coarseFaceDimensions = coarseEnd - coarseStart;
587 coarseFaceDimensions(normal) = overlap;
588 fineFaceDimensions(normal) = 2 * overlap;
589
590 double* rearrangedFineData = new double[matrixColumns * unknowns];
591
592 dfor(kFine, fineFaceDimensions) {
593 int currentIndex = serialiseVoxelIndexInOverlap(
594 kFine,
595 numberOfDoFsPerAxisInPatch,
596 overlap,
597 normal
598 );
599 int newIndex = (marker.getSelectedFaceNumber() < Dimensions
600 xor swapInsideOutside)
601 ? kFine(normal)
602 : 2 * overlap - kFine(normal) - 1;
603 int base = overlap * 2;
604 for (int d = 1; d < Dimensions; d++) {
605 newIndex += kFine((normal + d) % Dimensions) * base;
606 base *= numberOfDoFsPerAxisInPatch;
607 }
608 for (int unknown = 0; unknown < unknowns; unknown++) {
609 rearrangedFineData[newIndex * unknowns + unknown] = fineGridValues
610 [currentIndex * unknowns + unknown];
611 }
612 }
613
614 dfor(kCoarse, coarseFaceDimensions) {
615 auto coarseCoords = kCoarse + coarseStart;
616 coarseCoords(normal
617 ) = ((marker.getSelectedFaceNumber() < Dimensions) xor swapInsideOutside)
618 ? overlap + kCoarse(normal)
619 : overlap - kCoarse(normal) - 1;
620 int coarseIndex = serialiseVoxelIndexInOverlap(
621 coarseCoords,
622 numberOfDoFsPerAxisInPatch,
623 overlap,
624 normal
625 );
626
627 int row = kCoarse(normal);
628 int base = overlap;
629 for (int d = 1; d < Dimensions; d++) {
630 row += kCoarse((normal + d) % Dimensions) * base;
631 base *= coarseFaceDimensions((normal + d) % Dimensions);
632 }
633
634 for (int unknown = 0; unknown < unknowns; unknown++) {
635 coarseGridValues[coarseIndex * unknowns + unknown] = 0.0;
636 }
637
638 int columnStart = rowIndices[rowIndicesOffset + row];
639 int columnEnd = rowIndices[rowIndicesOffset + row + 1];
640
641 for (int column = columnStart; column < columnEnd; column++) {
642 for (int unknown = 0; unknown < unknowns; unknown++) {
643 coarseGridValues[coarseIndex * unknowns + unknown]
644 += restrictionMatrixData[dataOffset + column]
645 * rearrangedFineData
646 [(columnIndices[dataOffset + column]) * unknowns + unknown];
647 }
648 }
649 }
650
651 delete[] rearrangedFineData;
652}
653
656 int numberOfDoFsPerAxisInPatch,
657 int overlap,
658 int unknowns,
659 const double* __restrict__ normalRestrictionMatrix1d,
660 const double* __restrict__ tangentialRestrictionMatrix1d,
661 double* fineGridValues,
662 double* coarseGridValues,
663 bool swapInsideOutside
664) {
666 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
667 marker.toString(),
668 numberOfDoFsPerAxisInPatch,
669 overlap
670 );
671
672 const int normal = marker.getSelectedFaceNumber() % Dimensions;
673
674 dfore(kCoarse, numberOfDoFsPerAxisInPatch, normal, 0) {
675 for (int iCoarse = 0; iCoarse < overlap; iCoarse++) {
677 dest(normal
678 ) = ((marker.getSelectedFaceNumber() < Dimensions) xor swapInsideOutside)
679 ? iCoarse + overlap
680 : overlap - iCoarse - 1;
681
682 int destLinearised = serialiseVoxelIndexInOverlap(
683 dest,
684 numberOfDoFsPerAxisInPatch,
685 overlap,
686 normal
687 );
688
689 logDebug(
690 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
691 "coarse volume/dof "
692 << dest
693 << " prior to update: " << coarseGridValues[destLinearised * 5 + 0]
694 );
695 assertion(
696 coarseGridValues[destLinearised * 5 + 0]
697 == coarseGridValues[destLinearised * 5 + 0]
698 );
699
700 dfore(kFine, numberOfDoFsPerAxisInPatch, normal, 0) {
701 for (int iFine = 0; iFine < 2 * overlap; iFine++) {
703 src(normal
704 ) = ((marker.getSelectedFaceNumber() < Dimensions)
705 xor swapInsideOutside)
706 ? iFine
707 : 2 * overlap - iFine - 1;
708 int srcLinearised = serialiseVoxelIndexInOverlap(
709 src,
710 numberOfDoFsPerAxisInPatch,
711 overlap,
712 normal
713 );
714
715 double weight = 1.0;
716 for (int d = 0; d < Dimensions; d++) {
717 if (d == normal) {
718 int col = iFine;
719 int row = iCoarse;
720
721 assertion4(col >= 0, row, col, src, dest);
722 assertion4(row >= 0, row, col, src, dest);
723
724 assertion4(col < 2 * overlap, row, col, src, dest);
725 assertion4(row < overlap, row, col, src, dest);
726
727 int index = col + row * 2 * overlap;
728 weight *= normalRestrictionMatrix1d[index];
729 logDebug(
730 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
731 "use normal matrix entry "
732 << row << ", " << col << ", i.e. index " << index << ": "
733 << normalRestrictionMatrix1d[index]
734 );
735 } else {
736 assertion(marker.getRelativePositionWithinFatherCell()(d) >= 0);
737 assertion(marker.getRelativePositionWithinFatherCell()(d) < 3);
738
739 assertion(src(d) >= 0);
740 int col = src(d)
741 + marker.getRelativePositionWithinFatherCell()(d
742 ) * numberOfDoFsPerAxisInPatch;
743 int row = dest(d);
745 col >= 0,
746 row,
747 col,
748 src,
749 dest,
750 marker.getRelativePositionWithinFatherCell()
751 );
753 row >= 0,
754 row,
755 col,
756 src,
757 dest,
758 marker.getRelativePositionWithinFatherCell()
759 );
761 col < 3 * numberOfDoFsPerAxisInPatch,
762 row,
763 col,
764 src,
765 dest,
766 marker.getRelativePositionWithinFatherCell()
767 );
769 row < numberOfDoFsPerAxisInPatch,
770 row,
771 col,
772 src,
773 dest,
774 marker.getRelativePositionWithinFatherCell()
775 );
776 int index = col + row * 3 * numberOfDoFsPerAxisInPatch;
777 weight *= tangentialRestrictionMatrix1d[index];
778 logDebug(
779 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
780 "use tangential matrix entry "
781 << row << ", " << row << ", i.e. index " << index << ": "
782 << tangentialRestrictionMatrix1d[index]
783 );
784 }
785 }
786
787 assertion2(weight == weight, srcLinearised, destLinearised);
788
789 for (int unknown = 0; unknown < unknowns; unknown++) {
791 fineGridValues[srcLinearised * unknowns + unknown]
792 == fineGridValues[srcLinearised * unknowns + unknown],
793 srcLinearised,
794 destLinearised
795 );
796 coarseGridValues[destLinearised * unknowns + unknown]
797 += weight * fineGridValues[srcLinearised * unknowns + unknown];
799 coarseGridValues[destLinearised * unknowns + unknown]
800 == coarseGridValues[destLinearised * unknowns + unknown],
801 srcLinearised,
802 destLinearised
803 );
804 }
805
806 logDebug(
807 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
808 "add dof "
809 << src << " (" << srcLinearised << ") to " << dest << " ("
810 << destLinearised << ") with weight " << weight << " for marker "
811 << marker.toString() << ": "
812 << coarseGridValues[destLinearised * unknowns + 0] << "<-"
813 << fineGridValues[srcLinearised * unknowns + 0]
814 );
815 }
816 }
817 logDebug(
818 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
819 "update coarse volume/dof "
820 << dest << ": " << coarseGridValues[destLinearised * 5 + 0]
821 );
822 }
823 }
824
825 logTraceOut("restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)");
826}
827
830 int numberOfDoFsPerAxisInPatch,
831 int overlap,
832 int unknowns,
833 double* fineGridValues,
834 double* coarseGridValues
835) {
837 marker,
838 numberOfDoFsPerAxisInPatch,
839 overlap,
840 unknowns,
841 fineGridValues,
842 coarseGridValues,
843 false
844 );
846 marker,
847 numberOfDoFsPerAxisInPatch,
848 overlap,
849 unknowns,
850 fineGridValues,
851 coarseGridValues,
852 true
853 );
854}
855
857 int numberOfDoFsPerAxisInSourcePatch,
858 int numberOfDoFsPerAxisInDestinationPatch,
859 int unknowns,
860 double* sourceValues,
861 double* destinationValues
862) {
863 // how many fine grid cells are mapped onto one destination cell
864 double sourceToDestinationRatio
865 = static_cast<double>(numberOfDoFsPerAxisInSourcePatch)
866 / static_cast<double>(numberOfDoFsPerAxisInDestinationPatch);
867 dfor(destinationVolume, numberOfDoFsPerAxisInDestinationPatch) {
868 const int baseIndexDestination
870 dLinearised(destinationVolume, numberOfDoFsPerAxisInDestinationPatch)
871 * unknowns;
872
874 for (int d = 0; d < Dimensions; d++) {
875 sourceVolume(d) = std::floor(
876 static_cast<double>(destinationVolume(d)) * sourceToDestinationRatio
877 + 0.5 * sourceToDestinationRatio
878 );
879 }
880
881 const int baseIndexSource = peano4::utils::dLinearised(
882 sourceVolume,
883 numberOfDoFsPerAxisInSourcePatch
884 )
885 * unknowns;
886 for (int unknown = 0; unknown < unknowns; unknown++) {
887 destinationValues[baseIndexDestination + unknown] = sourceValues
888 [baseIndexSource + unknown];
889 }
890 }
891}
892
895 int numberOfDoFsPerAxisInSourcePatch,
896 int numberOfDoFsPerAxisInDestinationPatch,
897 int unknowns,
898 double* sourceValues,
899 double* destinationValues,
900 double weightOfInjectedValue
901 ) {
902 assertion1(weightOfInjectedValue >= 0.0, weightOfInjectedValue);
903 assertion1(weightOfInjectedValue <= 1.0, weightOfInjectedValue);
904
905 // how many fine grid cells are mapped onto one destination cell
906 double sourceToDestinationRatio
907 = static_cast<double>(numberOfDoFsPerAxisInSourcePatch)
908 / static_cast<double>(numberOfDoFsPerAxisInDestinationPatch);
909 dfor(destinationVolume, numberOfDoFsPerAxisInDestinationPatch) {
910 const int baseIndexDestination
912 dLinearised(destinationVolume, numberOfDoFsPerAxisInDestinationPatch)
913 * unknowns;
914
916 for (int d = 0; d < Dimensions; d++) {
917 sourceVolume(d) = std::floor(
918 static_cast<double>(destinationVolume(d)) * sourceToDestinationRatio
919 + 0.5 * sourceToDestinationRatio
920 );
921 }
922
923 const int baseIndexSource = peano4::utils::dLinearised(
924 sourceVolume,
925 numberOfDoFsPerAxisInSourcePatch
926 )
927 * unknowns;
928 for (int unknown = 0; unknown < unknowns; unknown++) {
929 destinationValues[baseIndexDestination + unknown]
930 = weightOfInjectedValue * sourceValues[baseIndexSource + unknown]
931 + (1.0 - weightOfInjectedValue
932 ) * destinationValues[baseIndexDestination + unknown];
933 }
934 }
935}
936
939 int numberOfDoFsPerAxisInPatch,
940 int unknowns,
941 double* fineGridValues,
942 double* coarseGridValues
943) {
944 dfor(fineVolume, numberOfDoFsPerAxisInPatch) {
945 tarch::la::Vector<Dimensions, int> fineVolumeWithintCoarsePatch
946 = (fineVolume + marker.getRelativePositionWithinFatherCell() * numberOfDoFsPerAxisInPatch);
948
949 bool restrictThisVolume = true;
950 for (int d = 0; d < Dimensions; d++) {
951 restrictThisVolume &= (fineVolumeWithintCoarsePatch(d) % 3) == 1;
952 coarseVolume(d) = fineVolumeWithintCoarsePatch(3) / 3;
953 }
954
955 if (restrictThisVolume) {
956 int coarseVolumeLinearised = peano4::utils::dLinearised(
957 coarseVolume,
958 numberOfDoFsPerAxisInPatch
959 );
960 int fineVolumeLinearised = peano4::utils::dLinearised(
961 fineVolume,
962 numberOfDoFsPerAxisInPatch
963 );
964 for (int j = 0; j < unknowns; j++) {
966 coarseGridValues[coarseVolumeLinearised * unknowns + j]
967 == coarseGridValues[coarseVolumeLinearised * unknowns + j],
968 coarseVolume,
969 fineVolume,
970 marker.toString()
971 );
973 fineGridValues[fineVolumeLinearised * unknowns + j]
974 == fineGridValues[fineVolumeLinearised * unknowns + j],
975 coarseVolume,
976 fineVolume,
977 marker.toString()
978 );
979 coarseGridValues[coarseVolumeLinearised * unknowns + j] = fineGridValues
980 [fineVolumeLinearised * unknowns + j];
981 }
982 }
983 }
984}
985
988 int numberOfDoFsPerAxisInPatch,
989 int overlap,
990 int unknowns,
991 double* fineGridValues,
992 double* coarseGridValues
993) {
995 marker,
996 numberOfDoFsPerAxisInPatch,
997 overlap,
998 unknowns,
999 fineGridValues,
1000 coarseGridValues,
1001 false
1002 );
1004 marker,
1005 numberOfDoFsPerAxisInPatch,
1006 overlap,
1007 unknowns,
1008 fineGridValues,
1009 coarseGridValues,
1010 true
1011 );
1012}
1013
1016 int numberOfDoFsPerAxisInPatch,
1017 int unknowns,
1018 double* fineGridValues,
1019 double* coarseGridValues
1020) {
1021 double scaleFineGridVolume = std::pow(3.0, -static_cast<double>(Dimensions));
1022 internal::projectCells_AoS(
1023 marker,
1024 numberOfDoFsPerAxisInPatch,
1025 [&](
1026 [[maybe_unused]] tarch::la::Vector<Dimensions, int> coarseVolume,
1027 [[maybe_unused]] tarch::la::Vector<Dimensions, int> fineVolume,
1028 [[maybe_unused]] tarch::la::Vector<Dimensions, double> coarseVolumeCentre,
1029 [[maybe_unused]] tarch::la::Vector<Dimensions, double> fineVolumeCentre,
1030 [[maybe_unused]] double coarseVolumeH,
1031 [[maybe_unused]] double fineVolumeH
1032 ) -> void {
1033 int coarseVolumeLinearised = peano4::utils::dLinearised(
1034 coarseVolume,
1035 numberOfDoFsPerAxisInPatch
1036 );
1037 int fineVolumeLinearised = peano4::utils::dLinearised(
1038 fineVolume,
1039 numberOfDoFsPerAxisInPatch
1040 );
1041 logDebug(
1042 "restrictCell_AoS_averaging(...)",
1043 fineVolume << " -> " << coarseVolume
1044 );
1045 for (int j = 0; j < unknowns; j++) {
1046 coarseGridValues[coarseVolumeLinearised * unknowns + j]
1047 += scaleFineGridVolume
1048 * fineGridValues[fineVolumeLinearised * unknowns + j];
1049 }
1050 }
1051 );
1052}
1053
1056 int numberOfDoFsPerAxisInPatch,
1057 int overlap,
1058 int unknowns,
1059 double* value
1060) {
1061 const int normal = marker.getSelectedFaceNumber() % Dimensions;
1062
1063 // clear fine grid data structure
1064 dfore(k, numberOfDoFsPerAxisInPatch, normal, 0) {
1065 for (int i = 0; i < overlap * 2; i++) {
1067 targetCell(normal) = i;
1068 int targetCellSerialised = serialiseVoxelIndexInOverlap(
1069 targetCell,
1070 numberOfDoFsPerAxisInPatch,
1071 overlap,
1072 normal
1073 );
1074 assertion(targetCellSerialised >= 0);
1075 for (int j = 0; j < unknowns; j++) {
1076 value[targetCellSerialised * unknowns + j] = 0.0;
1077 }
1078 }
1079 }
1080}
1081
1083 [[maybe_unused]] const peano4::datamanagement::CellMarker& marker,
1084 [[maybe_unused]] int numberOfDoFsPerAxisInPatch,
1085 [[maybe_unused]] int unknowns,
1086 [[maybe_unused]] double* values
1087) {
1088#if Dimensions == 3
1089 for (int i = 0;
1090 i < numberOfDoFsPerAxisInPatch * numberOfDoFsPerAxisInPatch
1091 * numberOfDoFsPerAxisInPatch * unknowns;
1092 i++) {
1093#else
1094 for (int i = 0;
1095 i < numberOfDoFsPerAxisInPatch * numberOfDoFsPerAxisInPatch * unknowns;
1096 i++) {
1097#endif
1098 values[i] = 0.0;
1099 }
1100}
1101
1104 int numberOfDoFsPerAxisInPatch,
1105 int overlap,
1106 int unknowns,
1107 double* fineGridValues,
1108 double* coarseGridValues,
1109 bool swapInsideOutside
1110) {
1112 "restrictInnerHalfOfHaloLayer_AoS_averaging(...)",
1113 marker.toString(),
1114 numberOfDoFsPerAxisInPatch,
1115 overlap,
1116 unknowns
1117 );
1118
1119 assertion1(overlap == 1 or overlap % 3 == 0, overlap);
1120
1121 bool mapFromInnerHalfOfHalo
1122 = not swapInsideOutside; // mapOuterCoarseGridHaloOntoInnerFineGridHalo
1123 const int normal = marker.getSelectedFaceNumber() % Dimensions;
1124 double scaleFineGridVolume = std::pow(3.0, -static_cast<double>(Dimensions - 1))
1125 / std::min(3.0, static_cast<double>(overlap));
1126 const bool pickLeftHalfOfHalo = (marker.getSelectedFaceNumber() < Dimensions)
1127 xor mapFromInnerHalfOfHalo;
1128
1129 const double volumeHCoarse = marker.h()(0)
1130 / static_cast<double>(numberOfDoFsPerAxisInPatch)
1131 * 3.0;
1132 const double volumeHFine = marker.h()(0)
1133 / static_cast<double>(numberOfDoFsPerAxisInPatch);
1134
1135 tarch::la::Vector<Dimensions, double> leftBottomCornerOfHaloFine = marker.x();
1136 tarch::la::Vector<Dimensions, double> leftBottomCornerOfHaloCoarse = marker.x(
1137 );
1138 for (int d = 0; d < Dimensions; d++) {
1139 if (d == normal) {
1140 leftBottomCornerOfHaloFine(d
1141 ) -= static_cast<double>(overlap) * volumeHFine;
1142 leftBottomCornerOfHaloCoarse(d
1143 ) -= static_cast<double>(overlap) * volumeHCoarse;
1144 } else {
1145 leftBottomCornerOfHaloFine(d) = marker.x()(d) - marker.h()(d) / 2.0;
1146 leftBottomCornerOfHaloCoarse(d
1147 ) = leftBottomCornerOfHaloFine(d)
1148 - marker.getRelativePositionWithinFatherCell()(d) * marker.h()(d);
1149 }
1150 }
1151
1152 dfore(kFine, numberOfDoFsPerAxisInPatch, normal, 0) {
1153 for (int iFine = 0; iFine < overlap; iFine++) {
1154 tarch::la::Vector<Dimensions, int> fineVolume = kFine;
1155 fineVolume(normal) += pickLeftHalfOfHalo ? iFine : iFine + overlap;
1156
1157 tarch::la::Vector<Dimensions, int> coarseVolume = fineVolume;
1158 for (int d = 0; d < Dimensions; d++) {
1159 if (d != normal) {
1160 coarseVolume(d
1161 ) += marker.getRelativePositionWithinFatherCell()(d)
1162 * numberOfDoFsPerAxisInPatch;
1163 } else {
1164 coarseVolume(d
1165 ) = pickLeftHalfOfHalo ? fineVolume(d) : fineVolume(d) + overlap * 3;
1166 }
1167 }
1168 coarseVolume /= 3;
1169
1170 assertion3(coarseVolume(0) >= 0, kFine, iFine, marker);
1171 assertion3(coarseVolume(1) >= 0, kFine, iFine, marker);
1172 assertion3(
1173 coarseVolume(0) < numberOfDoFsPerAxisInPatch,
1174 kFine,
1175 iFine,
1176 marker
1177 );
1178 assertion3(
1179 coarseVolume(1) < numberOfDoFsPerAxisInPatch,
1180 kFine,
1181 iFine,
1182 marker
1183 );
1184
1185 [[maybe_unused]] tarch::la::Vector<Dimensions, double> volumeXCoarse
1186 = leftBottomCornerOfHaloCoarse
1187 + volumeHCoarse * tarch::la::convertScalar<double>(coarseVolume)
1188 + 0.5 * tarch::la::Vector<Dimensions, double>(volumeHCoarse);
1190 volumeXFine = leftBottomCornerOfHaloFine
1191 + volumeHFine
1192 * tarch::la::convertScalar<double>(fineVolume)
1193 + 0.5 * tarch::la::Vector<Dimensions, double>(volumeHFine);
1194
1195 int coarseVolumeLinearised = serialiseVoxelIndexInOverlap(
1196 coarseVolume,
1197 numberOfDoFsPerAxisInPatch,
1198 overlap,
1199 normal
1200 );
1201 int fineVolumeLinearised = serialiseVoxelIndexInOverlap(
1202 fineVolume,
1203 numberOfDoFsPerAxisInPatch,
1204 overlap,
1205 normal
1206 );
1207 for (int j = 0; j < unknowns; j++) {
1208 coarseGridValues[coarseVolumeLinearised * unknowns + j]
1209 += scaleFineGridVolume
1210 * fineGridValues[fineVolumeLinearised * unknowns + j];
1211 }
1212 }
1213 }
1214
1215 logTraceOut("restrictInnerHalfOfHaloLayer_AoS_averaging(...)");
1216}
1217
1220 int numberOfDoFsPerAxisInPatch,
1221 int overlap,
1222 int unknowns,
1223 double* fineGridValues,
1224 double* coarseGridValues,
1225 bool swapInsideOutside
1226) {
1228 "restrictInnerHalfOfHaloLayer_AoS_inject(...)",
1229 marker.toString(),
1230 numberOfDoFsPerAxisInPatch,
1231 overlap,
1232 unknowns,
1233 fineGridValues,
1234 coarseGridValues
1235 );
1236
1237 assertion1(overlap == 1 or overlap % 3 == 1, overlap);
1238
1239 const int normal = marker.getSelectedFaceNumber() % Dimensions;
1240 const bool pickLeftHalfOfHaloOnFineGrid = (marker.getSelectedFaceNumber()
1241 >= Dimensions)
1242 xor swapInsideOutside;
1243
1244 dfore(kFine, numberOfDoFsPerAxisInPatch, normal, 0) {
1245 tarch::la::Vector<Dimensions, int> fineVolume = kFine;
1246 tarch::la::Vector<Dimensions, int> fineVolumeAlongCoarseFace = kFine;
1247
1248 for (int iFine = 0; iFine < overlap; iFine++) {
1249 fineVolume(normal) = iFine;
1250
1251 bool restrictThisVolume = true;
1252 for (int d = 0; d < Dimensions; d++) {
1253 if (d == normal) {
1254 restrictThisVolume
1255 &= (overlap == 1 or fineVolumeAlongCoarseFace(d) % 3 == 1);
1256 } else {
1257 fineVolumeAlongCoarseFace(d
1258 ) += marker.getRelativePositionWithinFatherCell()(d)
1259 * numberOfDoFsPerAxisInPatch;
1260 restrictThisVolume &= (fineVolumeAlongCoarseFace(d) % 3) == 1;
1261 }
1262 }
1263
1264 if (restrictThisVolume) {
1266 coarseVolume = fineVolumeAlongCoarseFace / 3;
1267
1268 fineVolume(normal
1269 ) = pickLeftHalfOfHaloOnFineGrid ? iFine : iFine + overlap;
1270 coarseVolume(normal
1271 ) = pickLeftHalfOfHaloOnFineGrid ? iFine : iFine + overlap;
1272
1273 int coarseVolumeLinearised = serialiseVoxelIndexInOverlap(
1274 coarseVolume,
1275 numberOfDoFsPerAxisInPatch,
1276 overlap,
1277 normal
1278 );
1279 int fineVolumeLinearised = serialiseVoxelIndexInOverlap(
1280 fineVolume,
1281 numberOfDoFsPerAxisInPatch,
1282 overlap,
1283 normal
1284 );
1285 for (int j = 0; j < unknowns; j++) {
1286 assertion3(
1287 coarseGridValues[coarseVolumeLinearised * unknowns + j]
1288 == coarseGridValues[coarseVolumeLinearised * unknowns + j],
1289 coarseVolume,
1290 fineVolume,
1291 marker.toString()
1292 );
1293 assertion3(
1294 fineGridValues[fineVolumeLinearised * unknowns + j]
1295 == fineGridValues[fineVolumeLinearised * unknowns + j],
1296 coarseVolume,
1297 fineVolume,
1298 marker.toString()
1299 );
1300 coarseGridValues[coarseVolumeLinearised * unknowns + j] = fineGridValues
1301 [fineVolumeLinearised * unknowns + j];
1302 }
1303 } // end of restrictThisVolume
1304 } // for iFine loop, i.e. loop over halo layer depth
1305 } // dfore loop, i.e. loop over submanifold
1306
1307 logTraceOut("restrictInnerHalfOfHaloLayer_AoS_restrict(...)");
1308}
1309
1312 int numberOfDoFsPerAxisInPatch,
1313 int overlap,
1314 int unknowns,
1315 bool clearInnerPart,
1316 double* value
1317) {
1318 const int normal = marker.getSelectedFaceNumber() % Dimensions;
1319 const bool left = (marker.getSelectedFaceNumber() < Dimensions)
1320 xor clearInnerPart;
1321
1322 // clear fine grid data structure
1323 dfore(k, numberOfDoFsPerAxisInPatch, normal, 0) {
1324 for (int i = 0; i < overlap; i++) {
1326 targetCell(normal) = left ? i : i + overlap;
1327 int targetCellSerialised = serialiseVoxelIndexInOverlap(
1328 targetCell,
1329 numberOfDoFsPerAxisInPatch,
1330 overlap,
1331 normal
1332 );
1333 assertion(targetCellSerialised >= 0);
1334 for (int j = 0; j < unknowns; j++) {
1335 value[targetCellSerialised * unknowns + j] = 0.0;
1336 }
1337 }
1338 }
1339}
1340
1343 int numberOfDoFsPerAxisInPatch,
1344 std::function<void(
1347 tarch::la::Vector<Dimensions, double> coarseVolumeCentre,
1349 double coarseVolumeH,
1350 double fineVolumeH
1351 )> update
1352) {
1354 "projectCells_AoS(...)",
1355 marker.toString(),
1356 numberOfDoFsPerAxisInPatch
1357 );
1358
1359 const double volumeHCoarse = marker.h()(0)
1360 / static_cast<double>(numberOfDoFsPerAxisInPatch)
1361 * 3.0;
1362 const double volumeHFine = marker.h()(0)
1363 / static_cast<double>(numberOfDoFsPerAxisInPatch);
1364
1365 tarch::la::Vector<Dimensions, double> leftBottomOfFineCell = marker.getOffset(
1366 );
1367 tarch::la::Vector<Dimensions, double> leftBottomOfCoarseCell
1368 = marker.getOffset()
1370 marker.h(),
1372 double>(marker.getRelativePositionWithinFatherCell())
1373 );
1374
1375 dfor(kFine, numberOfDoFsPerAxisInPatch) {
1377 kCoarse = (kFine
1378 + numberOfDoFsPerAxisInPatch
1379 * marker.getRelativePositionWithinFatherCell())
1380 / 3;
1381
1383 volumeXCoarse = leftBottomOfCoarseCell
1384 + volumeHCoarse * tarch::la::convertScalar<double>(kCoarse)
1385 + 0.5
1388 volumeXFine = leftBottomOfFineCell
1389 + volumeHFine * tarch::la::convertScalar<double>(kFine)
1390 + 0.5 * tarch::la::Vector<Dimensions, double>(volumeHFine);
1391
1392 update(
1393 kCoarse,
1394 kFine,
1395 volumeXCoarse,
1396 volumeXFine,
1397 volumeHCoarse,
1398 volumeHFine
1399 );
1400 }
1401
1402 logTraceOut("projectCells_AoS(...)");
1403}
#define assertion2(expr, param0, param1)
#define assertion4(expr, param0, param1, param2, param3)
#define assertion3(expr, param0, param1, param2)
#define assertion1(expr, param)
#define assertionMsg(expr, message)
#define assertion(expr)
#define assertion5(expr, param0, param1, param2, param3, param4)
#define logDebug(methodName, logMacroMessageStream)
Definition Log.h:50
#define logTraceOut(methodName)
Definition Log.h:379
#define logTraceInWith4Arguments(methodName, argument0, argument1, argument2, argument3)
Definition Log.h:373
#define logTraceInWith3Arguments(methodName, argument0, argument1, argument2)
Definition Log.h:372
#define logTraceInWith6Arguments(methodName, argument0, argument1, argument2, argument3, argument4, argument5)
Definition Log.h:375
#define logTraceInWith2Arguments(methodName, argument0, argument1)
Definition Log.h:371
#define dfore(counter, max, dim, value)
This is an exclusive d-dimensional for loop.
Definition Loop.h:942
#define dfor(counter, max)
d-dimensional Loop
Definition Loop.h:313
tarch::logging::Log _log("::")
My standard matrix is a matrix where the size is fixed at compile time.
Log Device.
Definition Log.h:516
list offset
Definition acoustic.py:42
j
Definition euler.py:99
index
Definition makeIC.py:38
CPUGPUMethod int dLinearised(const tarch::la::Vector< Dimensions, int > &counter, int max)
Map d-dimensional vector onto integer index.
Definition Loop.cpp:106
DynamicMatrix transpose(const DynamicMatrix &matrix)
DynamicMatrix invertUpperTriangular(const DynamicMatrix &R)
void modifiedGramSchmidt(Matrix< Rows, Cols, Scalar > A, Matrix< Rows, Cols, Scalar > &Q, Matrix< Cols, Cols, Scalar > &R)
Produces an economy-size QR decomposition of a matrix A, A is changed.
tarch::la::Vector< Size, NewScalarType > convertScalar(const tarch::la::Vector< Size, Scalar > &vector)
Definition Vector.cpph:94
Matrix< Rows, Cols, Scalar > multiplyComponents(const Matrix< Rows, X, Scalar > &lhs, const Matrix< X, Cols, Scalar > &rhs)
Vector< Cols, Scalar > row(const Matrix< Rows, Cols, Scalar > &matrix, int whichRow)
Extract row from matrix.
void clearHalfOfHaloLayerAoS(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, bool clearInnerPart, double *values)
Clear half of a halo layer.
void projectCells_AoS(const peano4::datamanagement::CellMarker &fineGridCellMarker, int numberOfDoFsPerAxisInPatch, std::function< void(tarch::la::Vector< Dimensions, int > coarseVolume, tarch::la::Vector< Dimensions, int > fineVolume, tarch::la::Vector< Dimensions, double > coarseVolumeCentre, tarch::la::Vector< Dimensions, double > fineVolumeCentre, double coarseVolumeH, double fineVolumeH)> update)
Helper function.
void restrictHaloLayer_AoS_averaging(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues)
Consult commend on interpolation that clarifies why we need two different halo layer restrictions,...
void restrictCell_AoS_matrix(const peano4::datamanagement::CellMarker &marker, int numberOfDoFsPerAxisInPatch, int unknowns, double *fineGridValues, double *coarseGridValues)
void restrictCellIntoOverlappingCell_inject_and_average(int numberOfDoFsPerAxisInSourcePatch, int numberOfDoFsPerAxisInDestinationPatch, int unknowns, double *sourceValues, double *destinationValues, double weightOfInjectedValue=0.5)
Flavour of restrictCellIntoOverlappingCell_inject() where we inject the solution but then take the av...
void restrictInnerHalfOfHaloLayer_AoS_matrix(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues, bool swapInsideOutside=false)
void restrictCellIntoOverlappingCell_inject(int numberOfDoFsPerAxisInSourcePatch, int numberOfDoFsPerAxisInDestinationPatch, int unknowns, double *sourceValues, double *destinationValues)
This routine should be used if a cell hosts two sets of unknowns.
void restrictHaloLayer_AoS_inject(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues)
Restrict data by injection.
void restrictInnerHalfOfHaloLayer_AoS_third_order(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues, bool swapInsideOutside=false)
void clearCell(const peano4::datamanagement::CellMarker &marker, int numberOfDoFsPerAxisInPatch, int unknowns, double *values)
void clearHaloLayerAoS(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *values)
Clear halo layer of face.
void restrictHaloLayer_AoS_matrix(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues)
void restrictInnerHalfOfHaloLayer_AoS_inject(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues, bool swapInsideOutside=false)
Restrict data by injection.
void restrictInnerHalfOfHaloLayer_AoS_averaging(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues, bool swapInsideOutside=false)
Restrict with averaging.
void restrictHaloLayer_AoS_third_order(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues)
void restrictHaloLayer_AoS_tensor_product(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues)
void restrictInnerHalfOfHaloLayer_AoS_second_order(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues, bool swapInsideOutside=false)
void restrictCell_AoS_averaging(const peano4::datamanagement::CellMarker &marker, int numberOfDoFsPerAxisInPatch, int unknowns, double *fineGridValues, double *coarseGridValues)
This routine is used when we delete a cell due to dynamic AMR.
int serialiseVoxelIndexInOverlap(const tarch::la::Vector< Dimensions, int > &overlapCell, int numberOfDoFsPerAxisInPatch, int overlap, int normal)
The volumes or elements within an overlap are always enumerated lexicographically.
void restrictCell_AoS_inject(const peano4::datamanagement::CellMarker &marker, int numberOfDoFsPerAxisInPatch, int unknowns, double *fineGridValues, double *coarseGridValues)
void restrictCell_AoS_tensor_product(const peano4::datamanagement::CellMarker &marker, int numberOfDoFsPerAxisInPatch, int unknowns, double *fineGridValues, double *coarseGridValues)
void restrictCell_AoS_second_order(const peano4::datamanagement::CellMarker &marker, int numberOfDoFsPerAxisInPatch, int unknowns, double *fineGridValues, double *coarseGridValues)
void restrictCell_AoS_third_order(const peano4::datamanagement::CellMarker &marker, int numberOfDoFsPerAxisInPatch, int unknowns, double *fineGridValues, double *coarseGridValues)
void restrictInnerHalfOfHaloLayer_AoS_tensor_product(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues, bool swapInsideOutside=false)
void restrictHaloLayer_AoS_second_order(const peano4::datamanagement::FaceMarker &marker, int numberOfDoFsPerAxisInPatch, int overlap, int unknowns, double *fineGridValues, double *coarseGridValues)
Provide information about selected face.
Definition FaceMarker.h:35
Simple vector class.
Definition Vector.h:134