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
24 assertionMsg(
false,
"@Han, we have to implement this one");
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
42 [[maybe_unused]]
int numberOfDoFsPerAxisInPatch,
43 [[maybe_unused]]
int unknowns,
44 [[maybe_unused]]
double* fineGridValues,
45 [[maybe_unused]]
double* coarseGridValues
52 [[maybe_unused]]
int numberOfDoFsPerAxisInPatch,
53 [[maybe_unused]]
int unknowns,
54 [[maybe_unused]]
double* fineGridValues,
55 [[maybe_unused]]
double* coarseGridValues
63 int numberOfDoFsPerAxisInPatch,
66 const double* __restrict__ normalRestrictionMatrix1d,
67 const double* __restrict__ tangentialRestrictionMatrix1d,
68 double* fineGridValues,
69 double* coarseGridValues
73 numberOfDoFsPerAxisInPatch,
76 normalRestrictionMatrix1d,
77 tangentialRestrictionMatrix1d,
84 numberOfDoFsPerAxisInPatch,
87 normalRestrictionMatrix1d,
88 tangentialRestrictionMatrix1d,
97 int numberOfDoFsPerAxisInPatch,
100 const double* __restrict__ restrictionData,
101 const int* __restrict__ columnIndices,
102 const int* __restrict__ rowIndices,
104 int rowIndicesOffset,
105 double* fineGridValues,
106 double* coarseGridValues
110 numberOfDoFsPerAxisInPatch,
124 numberOfDoFsPerAxisInPatch,
140 int numberOfDoFsPerAxisInPatch,
143 double* fineGridValues,
144 double* coarseGridValues
146 restrictInnerHalfOfHaloLayer_AoS_second_order(
148 numberOfDoFsPerAxisInPatch,
155 restrictInnerHalfOfHaloLayer_AoS_second_order(
157 numberOfDoFsPerAxisInPatch,
168 int numberOfDoFsPerAxisInPatch,
171 double* fineGridValues,
172 double* coarseGridValues
174 restrictInnerHalfOfHaloLayer_AoS_third_order(
176 numberOfDoFsPerAxisInPatch,
183 restrictInnerHalfOfHaloLayer_AoS_third_order(
185 numberOfDoFsPerAxisInPatch,
196 int numberOfDoFsPerAxisInPatch,
199 double* fineGridValues,
200 double* coarseGridValues,
201 bool swapInsideOutside
203 const int normal =
marker.getSelectedFaceNumber() % Dimensions;
204 double* stencilCenterValues =
new double[
unknowns];
209 A(0, 1) = 1.0 / 18.0;
210 A(1, 0) = -1.0 / 3.0;
211 A(1, 1) = 1.0 / 18.0;
220 const int i = (
normal + 1) % Dimensions;
222 const int j = (
normal + 2) % Dimensions;
226 coarseStart(i) = (
marker.getRelativePositionWithinFatherCell()(
i) * numberOfDoFsPerAxisInPatch + 1) / 3;
228 coarseStart(j) = (
marker.getRelativePositionWithinFatherCell()(
j) * numberOfDoFsPerAxisInPatch + 1) / 3;
232 coarseEnd(i) = ((
marker.getRelativePositionWithinFatherCell()(
i) + 1) * numberOfDoFsPerAxisInPatch + 1) / 3;
234 coarseEnd(j) = ((
marker.getRelativePositionWithinFatherCell()(
j) + 1) * numberOfDoFsPerAxisInPatch + 1) / 3;
238 fineDataStart(i) = (
marker.getRelativePositionWithinFatherCell()(
i) * numberOfDoFsPerAxisInPatch) % 3;
240 fineDataStart(j) = (
marker.getRelativePositionWithinFatherCell()(
j) * numberOfDoFsPerAxisInPatch) % 3;
243 if (fineDataStart(i) == 1)
244 fineDataStart(i) = -1;
245 if (fineDataStart(i) == 2)
246 fineDataStart(i) = 1;
248 if (fineDataStart(j) == 1)
249 fineDataStart(j) = -1;
250 if (fineDataStart(j) == 2)
251 fineDataStart(j) = 1;
255 faceDimensions(normal) = (
overlap - 1) / 3 + 1;
257 dfor(kCoarse, faceDimensions){
259 fineCenter(normal) = (
marker.getSelectedFaceNumber() < Dimensions xor swapInsideOutside) ? overlap + 1:
overlap - 2;
263 numberOfDoFsPerAxisInPatch,
267 for (
int unknown = 0; unknown <
unknowns; unknown++) {
268 stencilCenterValues[unknown] = fineGridValues
278 numberOfDoFsPerAxisInPatch,
282 for (
int unknown = 0; unknown <
unknowns; unknown++) {
287 - stencilCenterValues[unknown];
292 numberOfDoFsPerAxisInPatch,
296 for (
int unknown = 0; unknown <
unknowns; unknown++) {
301 - stencilCenterValues[unknown];
310 int distance = (
marker.getSelectedFaceNumber() < Dimensions
311 xor swapInsideOutside)
312 ? i * 3 + 3 - overlap
315 coarseMatrix(i, 0) = (1.0 / 3.0) * distance;
316 coarseMatrix(i, 1) = (1.0 / 18.0) * distance * distance;
322 ) = (
marker.getSelectedFaceNumber() < Dimensions xor swapInsideOutside)
327 numberOfDoFsPerAxisInPatch,
331 for (
int unknown = 0; unknown <
unknowns; unknown++) {
333 = stencilCenterValues[unknown] + coarseValues(i, unknown);
338 delete[] stencilCenterValues;
343 int numberOfDoFsPerAxisInPatch,
346 double* fineGridValues,
347 double* coarseGridValues,
348 bool swapInsideOutside
350 const int normal =
marker.getSelectedFaceNumber() % Dimensions;
351 double* stencilCenterValues =
new double[
unknowns];
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;
363 double factor = ((
marker.getSelectedFaceNumber() < Dimensions)
364 xor swapInsideOutside)
367 A(2, 0) = factor * 2.0 / 3.0;
369 A(2, 2) = factor * 4.0 / 81.0;
378 const int i = (
normal + 1) % Dimensions;
380 const int j = (
normal + 2) % Dimensions;
385 ) = (
marker.getRelativePositionWithinFatherCell()(
i
386 ) * numberOfDoFsPerAxisInPatch
391 ) = (
marker.getRelativePositionWithinFatherCell()(
j
392 ) * numberOfDoFsPerAxisInPatch
399 ) = ((
marker.getRelativePositionWithinFatherCell()(
i) + 1
400 ) * numberOfDoFsPerAxisInPatch
405 ) = ((
marker.getRelativePositionWithinFatherCell()(
j) + 1
406 ) * numberOfDoFsPerAxisInPatch
413 ) = (
marker.getRelativePositionWithinFatherCell()(
i)
414 * numberOfDoFsPerAxisInPatch)
418 ) = (
marker.getRelativePositionWithinFatherCell()(
j)
419 * numberOfDoFsPerAxisInPatch)
423 if (fineDataStart(i) == 1)
424 fineDataStart(i) = -1;
425 if (fineDataStart(i) == 2)
426 fineDataStart(i) = 1;
428 if (fineDataStart(j) == 1)
429 fineDataStart(j) = -1;
430 if (fineDataStart(j) == 2)
431 fineDataStart(j) = 1;
435 faceDimensions(normal) = (
overlap - 1) / 3 + 1;
437 dfor(kCoarse, faceDimensions) {
442 ) = ((
marker.getSelectedFaceNumber() < Dimensions) xor swapInsideOutside)
448 numberOfDoFsPerAxisInPatch,
452 for (
int unknown = 0; unknown <
unknowns; unknown++) {
453 stencilCenterValues[unknown] = fineGridValues
463 numberOfDoFsPerAxisInPatch,
467 for (
int unknown = 0; unknown <
unknowns; unknown++) {
472 - stencilCenterValues[unknown];
477 numberOfDoFsPerAxisInPatch,
481 for (
int unknown = 0; unknown <
unknowns; unknown++) {
486 - stencilCenterValues[unknown];
489 offset(normal) = factor * 2.0;
492 numberOfDoFsPerAxisInPatch,
496 for (
int unknown = 0; unknown <
unknowns; unknown++) {
501 - stencilCenterValues[unknown];
510 int distance = ((
marker.getSelectedFaceNumber() < Dimensions)
511 xor swapInsideOutside)
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;
523 ) = ((
marker.getSelectedFaceNumber() < Dimensions) xor swapInsideOutside)
528 numberOfDoFsPerAxisInPatch,
532 for (
int unknown = 0; unknown <
unknowns; unknown++) {
534 = stencilCenterValues[unknown] + coarseValues(i, unknown);
539 delete[] stencilCenterValues;
545 int numberOfDoFsPerAxisInPatch,
548 const double* __restrict__ restrictionMatrixData,
549 const int* __restrict__ columnIndices,
550 const int* __restrict__ rowIndices,
552 int rowIndicesOffset,
553 double* fineGridValues,
554 double* coarseGridValues,
555 bool swapInsideOutside
558 numberOfDoFsPerAxisInPatch
561 const int normal = marker.getSelectedFaceNumber() % Dimensions;
562 const int matrixColumns = 2 * overlap
564 pow(numberOfDoFsPerAxisInPatch, Dimensions - 1);
565 const int matrixRows = overlap
566 * std::pow(numberOfDoFsPerAxisInPatch, Dimensions - 1);
568 const int i = (normal + 1) % Dimensions;
570 const int j = (normal + 2) % Dimensions;
574 coarseStart(i) = (marker.getRelativePositionWithinFatherCell()(i) * numberOfDoFsPerAxisInPatch + 1) / 3;
576 coarseStart(j) = (marker.getRelativePositionWithinFatherCell()(j) * numberOfDoFsPerAxisInPatch + 1) / 3;
580 coarseEnd(i) = ((marker.getRelativePositionWithinFatherCell()(i) + 1) * numberOfDoFsPerAxisInPatch + 1) / 3;
582 coarseEnd(j) = ((marker.getRelativePositionWithinFatherCell()(j) + 1) * numberOfDoFsPerAxisInPatch + 1) / 3;
586 coarseFaceDimensions = coarseEnd - coarseStart;
587 coarseFaceDimensions(normal) = overlap;
588 fineFaceDimensions(normal) = 2 * overlap;
590 double* rearrangedFineData =
new double[matrixColumns * unknowns];
592 dfor(kFine, fineFaceDimensions) {
595 numberOfDoFsPerAxisInPatch,
599 int newIndex = (marker.getSelectedFaceNumber() < Dimensions
600 xor swapInsideOutside)
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;
608 for (
int unknown = 0; unknown < unknowns; unknown++) {
609 rearrangedFineData[newIndex * unknowns + unknown] = fineGridValues
610 [currentIndex * unknowns + unknown];
614 dfor(kCoarse, coarseFaceDimensions) {
615 auto coarseCoords = kCoarse + coarseStart;
617 ) = ((marker.getSelectedFaceNumber() < Dimensions) xor swapInsideOutside)
618 ? overlap + kCoarse(normal)
619 : overlap - kCoarse(normal) - 1;
622 numberOfDoFsPerAxisInPatch,
627 int row = kCoarse(normal);
629 for (
int d = 1; d < Dimensions; d++) {
630 row += kCoarse((normal + d) % Dimensions) * base;
631 base *= coarseFaceDimensions((normal + d) % Dimensions);
634 for (
int unknown = 0; unknown < unknowns; unknown++) {
635 coarseGridValues[coarseIndex * unknowns + unknown] = 0.0;
638 int columnStart = rowIndices[rowIndicesOffset + row];
639 int columnEnd = rowIndices[rowIndicesOffset + row + 1];
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]
646 [(columnIndices[dataOffset + column]) * unknowns + unknown];
651 delete[] rearrangedFineData;
656 int numberOfDoFsPerAxisInPatch,
659 const double* __restrict__ normalRestrictionMatrix1d,
660 const double* __restrict__ tangentialRestrictionMatrix1d,
661 double* fineGridValues,
662 double* coarseGridValues,
663 bool swapInsideOutside
666 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
668 numberOfDoFsPerAxisInPatch,
672 const int normal = marker.getSelectedFaceNumber() % Dimensions;
674 dfore(kCoarse, numberOfDoFsPerAxisInPatch, normal, 0) {
675 for (
int iCoarse = 0; iCoarse < overlap; iCoarse++) {
678 ) = ((marker.getSelectedFaceNumber() < Dimensions) xor swapInsideOutside)
680 : overlap - iCoarse - 1;
684 numberOfDoFsPerAxisInPatch,
690 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
693 <<
" prior to update: " << coarseGridValues[destLinearised * 5 + 0]
696 coarseGridValues[destLinearised * 5 + 0]
697 == coarseGridValues[destLinearised * 5 + 0]
700 dfore(kFine, numberOfDoFsPerAxisInPatch, normal, 0) {
701 for (
int iFine = 0; iFine < 2 * overlap; iFine++) {
704 ) = ((marker.getSelectedFaceNumber() < Dimensions)
705 xor swapInsideOutside)
707 : 2 * overlap - iFine - 1;
710 numberOfDoFsPerAxisInPatch,
716 for (
int d = 0; d < Dimensions; d++) {
724 assertion4(col < 2 * overlap, row, col, src, dest);
725 assertion4(row < overlap, row, col, src, dest);
727 int index = col + row * 2 * overlap;
728 weight *= normalRestrictionMatrix1d[index];
730 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
731 "use normal matrix entry "
732 << row <<
", " << col <<
", i.e. index " << index <<
": "
733 << normalRestrictionMatrix1d[index]
736 assertion(marker.getRelativePositionWithinFatherCell()(d) >= 0);
737 assertion(marker.getRelativePositionWithinFatherCell()(d) < 3);
741 + marker.getRelativePositionWithinFatherCell()(d
742 ) * numberOfDoFsPerAxisInPatch;
750 marker.getRelativePositionWithinFatherCell()
758 marker.getRelativePositionWithinFatherCell()
761 col < 3 * numberOfDoFsPerAxisInPatch,
766 marker.getRelativePositionWithinFatherCell()
769 row < numberOfDoFsPerAxisInPatch,
774 marker.getRelativePositionWithinFatherCell()
776 int index = col + row * 3 * numberOfDoFsPerAxisInPatch;
777 weight *= tangentialRestrictionMatrix1d[index];
779 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
780 "use tangential matrix entry "
781 << row <<
", " << row <<
", i.e. index " << index <<
": "
782 << tangentialRestrictionMatrix1d[index]
787 assertion2(weight == weight, srcLinearised, destLinearised);
789 for (
int unknown = 0; unknown < unknowns; unknown++) {
791 fineGridValues[srcLinearised * unknowns + unknown]
792 == fineGridValues[srcLinearised * unknowns + unknown],
796 coarseGridValues[destLinearised * unknowns + unknown]
797 += weight * fineGridValues[srcLinearised * unknowns + unknown];
799 coarseGridValues[destLinearised * unknowns + unknown]
800 == coarseGridValues[destLinearised * unknowns + unknown],
807 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
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]
818 "restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)",
819 "update coarse volume/dof "
820 << dest <<
": " << coarseGridValues[destLinearised * 5 + 0]
825 logTraceOut(
"restrictInnerHalfOfHaloLayer_AoS_tensor_product(...)");
830 int numberOfDoFsPerAxisInPatch,
833 double* fineGridValues,
834 double* coarseGridValues
838 numberOfDoFsPerAxisInPatch,
847 numberOfDoFsPerAxisInPatch,
857 int numberOfDoFsPerAxisInSourcePatch,
858 int numberOfDoFsPerAxisInDestinationPatch,
860 double* sourceValues,
861 double* destinationValues
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)
874 for (
int d = 0; d < Dimensions; d++) {
875 sourceVolume(d) = std::floor(
876 static_cast<double>(destinationVolume(d)) * sourceToDestinationRatio
877 + 0.5 * sourceToDestinationRatio
883 numberOfDoFsPerAxisInSourcePatch
886 for (
int unknown = 0; unknown < unknowns; unknown++) {
887 destinationValues[baseIndexDestination + unknown] = sourceValues
888 [baseIndexSource + unknown];
895 int numberOfDoFsPerAxisInSourcePatch,
896 int numberOfDoFsPerAxisInDestinationPatch,
898 double* sourceValues,
899 double* destinationValues,
900 double weightOfInjectedValue
902 assertion1(weightOfInjectedValue >= 0.0, weightOfInjectedValue);
903 assertion1(weightOfInjectedValue <= 1.0, weightOfInjectedValue);
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)
916 for (
int d = 0; d < Dimensions; d++) {
917 sourceVolume(d) = std::floor(
918 static_cast<double>(destinationVolume(d)) * sourceToDestinationRatio
919 + 0.5 * sourceToDestinationRatio
925 numberOfDoFsPerAxisInSourcePatch
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];
939 int numberOfDoFsPerAxisInPatch,
941 double* fineGridValues,
942 double* coarseGridValues
944 dfor(fineVolume, numberOfDoFsPerAxisInPatch) {
946 = (fineVolume + marker.getRelativePositionWithinFatherCell() * numberOfDoFsPerAxisInPatch);
949 bool restrictThisVolume =
true;
950 for (
int d = 0; d < Dimensions; d++) {
951 restrictThisVolume &= (fineVolumeWithintCoarsePatch(d) % 3) == 1;
952 coarseVolume(d) = fineVolumeWithintCoarsePatch(3) / 3;
955 if (restrictThisVolume) {
958 numberOfDoFsPerAxisInPatch
962 numberOfDoFsPerAxisInPatch
964 for (
int j = 0; j < unknowns; j++) {
966 coarseGridValues[coarseVolumeLinearised * unknowns + j]
967 == coarseGridValues[coarseVolumeLinearised * unknowns + j],
973 fineGridValues[fineVolumeLinearised * unknowns + j]
974 == fineGridValues[fineVolumeLinearised * unknowns + j],
979 coarseGridValues[coarseVolumeLinearised * unknowns + j] = fineGridValues
980 [fineVolumeLinearised * unknowns + j];
988 int numberOfDoFsPerAxisInPatch,
991 double* fineGridValues,
992 double* coarseGridValues
996 numberOfDoFsPerAxisInPatch,
1005 numberOfDoFsPerAxisInPatch,
1016 int numberOfDoFsPerAxisInPatch,
1018 double* fineGridValues,
1019 double* coarseGridValues
1021 double scaleFineGridVolume = std::pow(3.0, -
static_cast<double>(Dimensions));
1022 internal::projectCells_AoS(
1024 numberOfDoFsPerAxisInPatch,
1030 [[maybe_unused]]
double coarseVolumeH,
1031 [[maybe_unused]]
double fineVolumeH
1035 numberOfDoFsPerAxisInPatch
1039 numberOfDoFsPerAxisInPatch
1042 "restrictCell_AoS_averaging(...)",
1043 fineVolume <<
" -> " << coarseVolume
1045 for (
int j = 0; j < unknowns; j++) {
1046 coarseGridValues[coarseVolumeLinearised * unknowns + j]
1047 += scaleFineGridVolume
1048 * fineGridValues[fineVolumeLinearised * unknowns + j];
1056 int numberOfDoFsPerAxisInPatch,
1061 const int normal = marker.getSelectedFaceNumber() % Dimensions;
1064 dfore(k, numberOfDoFsPerAxisInPatch, normal, 0) {
1065 for (
int i = 0; i < overlap * 2; i++) {
1067 targetCell(normal) = i;
1070 numberOfDoFsPerAxisInPatch,
1075 for (
int j = 0; j < unknowns; j++) {
1076 value[targetCellSerialised * unknowns + j] = 0.0;
1084 [[maybe_unused]]
int numberOfDoFsPerAxisInPatch,
1085 [[maybe_unused]]
int unknowns,
1086 [[maybe_unused]]
double* values
1090 i < numberOfDoFsPerAxisInPatch * numberOfDoFsPerAxisInPatch
1091 * numberOfDoFsPerAxisInPatch * unknowns;
1095 i < numberOfDoFsPerAxisInPatch * numberOfDoFsPerAxisInPatch * unknowns;
1104 int numberOfDoFsPerAxisInPatch,
1107 double* fineGridValues,
1108 double* coarseGridValues,
1109 bool swapInsideOutside
1112 "restrictInnerHalfOfHaloLayer_AoS_averaging(...)",
1114 numberOfDoFsPerAxisInPatch,
1119 assertion1(overlap == 1 or overlap % 3 == 0, overlap);
1121 bool mapFromInnerHalfOfHalo
1122 = not swapInsideOutside;
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;
1129 const double volumeHCoarse = marker.h()(0)
1130 /
static_cast<double>(numberOfDoFsPerAxisInPatch)
1132 const double volumeHFine = marker.h()(0)
1133 /
static_cast<double>(numberOfDoFsPerAxisInPatch);
1138 for (
int d = 0; d < Dimensions; d++) {
1140 leftBottomCornerOfHaloFine(d
1141 ) -=
static_cast<double>(overlap) * volumeHFine;
1142 leftBottomCornerOfHaloCoarse(d
1143 ) -=
static_cast<double>(overlap) * volumeHCoarse;
1145 leftBottomCornerOfHaloFine(d) = marker.x()(d) - marker.h()(d) / 2.0;
1146 leftBottomCornerOfHaloCoarse(d
1147 ) = leftBottomCornerOfHaloFine(d)
1148 - marker.getRelativePositionWithinFatherCell()(d) * marker.h()(d);
1152 dfore(kFine, numberOfDoFsPerAxisInPatch, normal, 0) {
1153 for (
int iFine = 0; iFine < overlap; iFine++) {
1155 fineVolume(normal) += pickLeftHalfOfHalo ? iFine : iFine + overlap;
1158 for (
int d = 0; d < Dimensions; d++) {
1161 ) += marker.getRelativePositionWithinFatherCell()(d)
1162 * numberOfDoFsPerAxisInPatch;
1165 ) = pickLeftHalfOfHalo ? fineVolume(d) : fineVolume(d) + overlap * 3;
1170 assertion3(coarseVolume(0) >= 0, kFine, iFine, marker);
1171 assertion3(coarseVolume(1) >= 0, kFine, iFine, marker);
1173 coarseVolume(0) < numberOfDoFsPerAxisInPatch,
1179 coarseVolume(1) < numberOfDoFsPerAxisInPatch,
1186 = leftBottomCornerOfHaloCoarse
1187 + volumeHCoarse * tarch::la::convertScalar<double>(coarseVolume)
1190 volumeXFine = leftBottomCornerOfHaloFine
1192 * tarch::la::convertScalar<double>(fineVolume)
1197 numberOfDoFsPerAxisInPatch,
1203 numberOfDoFsPerAxisInPatch,
1207 for (
int j = 0; j < unknowns; j++) {
1208 coarseGridValues[coarseVolumeLinearised * unknowns + j]
1209 += scaleFineGridVolume
1210 * fineGridValues[fineVolumeLinearised * unknowns + j];
1215 logTraceOut(
"restrictInnerHalfOfHaloLayer_AoS_averaging(...)");
1220 int numberOfDoFsPerAxisInPatch,
1223 double* fineGridValues,
1224 double* coarseGridValues,
1225 bool swapInsideOutside
1228 "restrictInnerHalfOfHaloLayer_AoS_inject(...)",
1230 numberOfDoFsPerAxisInPatch,
1237 assertion1(overlap == 1 or overlap % 3 == 1, overlap);
1239 const int normal = marker.getSelectedFaceNumber() % Dimensions;
1240 const bool pickLeftHalfOfHaloOnFineGrid = (marker.getSelectedFaceNumber()
1242 xor swapInsideOutside;
1244 dfore(kFine, numberOfDoFsPerAxisInPatch, normal, 0) {
1248 for (
int iFine = 0; iFine < overlap; iFine++) {
1249 fineVolume(normal) = iFine;
1251 bool restrictThisVolume =
true;
1252 for (
int d = 0; d < Dimensions; d++) {
1255 &= (overlap == 1 or fineVolumeAlongCoarseFace(d) % 3 == 1);
1257 fineVolumeAlongCoarseFace(d
1258 ) += marker.getRelativePositionWithinFatherCell()(d)
1259 * numberOfDoFsPerAxisInPatch;
1260 restrictThisVolume &= (fineVolumeAlongCoarseFace(d) % 3) == 1;
1264 if (restrictThisVolume) {
1266 coarseVolume = fineVolumeAlongCoarseFace / 3;
1269 ) = pickLeftHalfOfHaloOnFineGrid ? iFine : iFine + overlap;
1271 ) = pickLeftHalfOfHaloOnFineGrid ? iFine : iFine + overlap;
1275 numberOfDoFsPerAxisInPatch,
1281 numberOfDoFsPerAxisInPatch,
1285 for (
int j = 0; j < unknowns; j++) {
1287 coarseGridValues[coarseVolumeLinearised * unknowns + j]
1288 == coarseGridValues[coarseVolumeLinearised * unknowns + j],
1294 fineGridValues[fineVolumeLinearised * unknowns + j]
1295 == fineGridValues[fineVolumeLinearised * unknowns + j],
1300 coarseGridValues[coarseVolumeLinearised * unknowns + j] = fineGridValues
1301 [fineVolumeLinearised * unknowns + j];
1307 logTraceOut(
"restrictInnerHalfOfHaloLayer_AoS_restrict(...)");
1312 int numberOfDoFsPerAxisInPatch,
1315 bool clearInnerPart,
1318 const int normal = marker.getSelectedFaceNumber() % Dimensions;
1319 const bool left = (marker.getSelectedFaceNumber() < Dimensions)
1323 dfore(k, numberOfDoFsPerAxisInPatch, normal, 0) {
1324 for (
int i = 0; i < overlap; i++) {
1326 targetCell(normal) = left ? i : i + overlap;
1329 numberOfDoFsPerAxisInPatch,
1334 for (
int j = 0; j < unknowns; j++) {
1335 value[targetCellSerialised * unknowns + j] = 0.0;
1343 int numberOfDoFsPerAxisInPatch,
1349 double coarseVolumeH,
1354 "projectCells_AoS(...)",
1356 numberOfDoFsPerAxisInPatch
1359 const double volumeHCoarse = marker.h()(0)
1360 /
static_cast<double>(numberOfDoFsPerAxisInPatch)
1362 const double volumeHFine = marker.h()(0)
1363 /
static_cast<double>(numberOfDoFsPerAxisInPatch);
1368 = marker.getOffset()
1372 double>(marker.getRelativePositionWithinFatherCell())
1375 dfor(kFine, numberOfDoFsPerAxisInPatch) {
1378 + numberOfDoFsPerAxisInPatch
1379 * marker.getRelativePositionWithinFatherCell())
1383 volumeXCoarse = leftBottomOfCoarseCell
1384 + volumeHCoarse * tarch::la::convertScalar<double>(kCoarse)
1388 volumeXFine = leftBottomOfFineCell
1389 + volumeHFine * tarch::la::convertScalar<double>(kFine)
#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 assertion5(expr, param0, param1, param2, param3, param4)
#define logDebug(methodName, logMacroMessageStream)
#define logTraceOut(methodName)
#define logTraceInWith4Arguments(methodName, argument0, argument1, argument2, argument3)
#define logTraceInWith3Arguments(methodName, argument0, argument1, argument2)
#define logTraceInWith6Arguments(methodName, argument0, argument1, argument2, argument3, argument4, argument5)
#define logTraceInWith2Arguments(methodName, argument0, argument1)
#define dfore(counter, max, dim, value)
This is an exclusive d-dimensional for loop.
#define dfor(counter, max)
d-dimensional Loop
tarch::logging::Log _log("::")
My standard matrix is a matrix where the size is fixed at compile time.
CPUGPUMethod int dLinearised(const tarch::la::Vector< Dimensions, int > &counter, int max)
Map d-dimensional vector onto integer index.
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)
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.
Provide information about selected face.