38 LO& numNonAggregatedNodes)
const {
39 Monitor m(*
this,
"BuildAggregates");
41 RCP<Teuchos::FancyOStream> out;
42 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
43 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
44 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
46 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
50 const bool coupled = geoData->isAggregationCoupled();
51 const bool singleCoarsePoint = geoData->isSingleCoarsePoint();
52 ArrayRCP<LO> vertex2AggId = aggregates.
GetVertex2AggId()->getDataNonConst(0);
53 ArrayRCP<LO> procWinner = aggregates.
GetProcWinner()->getDataNonConst(0);
54 Array<LO> ghostedCoarseNodeCoarseLIDs;
55 Array<int> ghostedCoarseNodeCoarsePIDs;
56 Array<GO> ghostedCoarseNodeCoarseGIDs;
58 *out <<
"Extract data for ghosted nodes" << std::endl;
59 geoData->getGhostedNodesData(graph.
GetDomainMap(), ghostedCoarseNodeCoarseLIDs,
60 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
63 Array<LO> ghostedIdx(3), coarseIdx(3);
64 LO ghostedCoarseNodeCoarseLID, aggId;
65 *out <<
"Loop over fine nodes and assign them to an aggregate and a rank" << std::endl;
66 for (LO nodeIdx = 0; nodeIdx < geoData->getNumLocalFineNodes(); ++nodeIdx) {
68 geoData->getFineNodeGhostedTuple(nodeIdx, ghostedIdx[0], ghostedIdx[1], ghostedIdx[2]);
70 for (
int dim = 0; dim < 3; ++dim) {
71 if (singleCoarsePoint && (geoData->getLocalFineNodesInDir(dim) - 1 < geoData->getCoarseningRate(dim))) {
74 coarseIdx[dim] = ghostedIdx[dim] / geoData->getCoarseningRate(dim);
75 rem = ghostedIdx[dim] % geoData->getCoarseningRate(dim);
76 if (ghostedIdx[dim] - geoData->getOffset(dim) < geoData->getLocalFineNodesInDir(dim) - geoData->getCoarseningEndRate(dim)) {
77 rate = geoData->getCoarseningRate(dim);
79 rate = geoData->getCoarseningEndRate(dim);
81 if (rem > (rate / 2)) {
84 if (coupled && (geoData->getStartGhostedCoarseNode(dim) * geoData->getCoarseningRate(dim) > geoData->getStartIndex(dim))) {
90 geoData->getCoarseNodeGhostedLID(coarseIdx[0], coarseIdx[1], coarseIdx[2],
91 ghostedCoarseNodeCoarseLID);
93 aggId = ghostedCoarseNodeCoarseLIDs[ghostedCoarseNodeCoarseLID];
94 vertex2AggId[nodeIdx] = aggId;
95 procWinner[nodeIdx] = ghostedCoarseNodeCoarsePIDs[ghostedCoarseNodeCoarseLID];
97 --numNonAggregatedNodes;
105 RCP<CrsGraph>& myGraph, RCP<const Map>& coarseCoordinatesFineMap,
106 RCP<const Map>& coarseCoordinatesMap)
const {
107 Monitor m(*
this,
"BuildGraphP");
109 RCP<Teuchos::FancyOStream> out;
110 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
111 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
112 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
114 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
117 const bool coupled = geoData->isAggregationCoupled();
120 int numInterpolationPoints = 0;
121 if (geoData->getInterpolationOrder() == 0) {
122 numInterpolationPoints = 1;
123 }
else if (geoData->getInterpolationOrder() == 1) {
125 numInterpolationPoints = 1 << geoData->getNumDimensions();
127 *out <<
"numInterpolationPoints=" << numInterpolationPoints << std::endl;
129 Array<LO> colIndex((geoData->getNumLocalCoarseNodes() + numInterpolationPoints *
130 (geoData->getNumLocalFineNodes() - geoData->getNumLocalCoarseNodes())) *
132 Array<size_t> rowPtr(geoData->getNumLocalFineNodes() * dofsPerNode + 1);
134 ArrayRCP<size_t> nnzOnRow(geoData->getNumLocalFineNodes() * dofsPerNode);
136 *out <<
"Compute prolongatorGraph data" << std::endl;
137 if (geoData->getInterpolationOrder() == 0) {
138 ComputeGraphDataConstant(graph, geoData, dofsPerNode, numInterpolationPoints,
139 nnzOnRow, rowPtr, colIndex);
140 }
else if (geoData->getInterpolationOrder() == 1) {
141 ComputeGraphDataLinear(graph, geoData, dofsPerNode, numInterpolationPoints,
142 nnzOnRow, rowPtr, colIndex);
146 RCP<Map> rowMap = MapFactory::Build(graph.
GetDomainMap(), dofsPerNode);
147 RCP<Map> colMap, domainMap;
148 *out <<
"Compute domain and column maps of the CrsGraph" << std::endl;
150 *out <<
"Extract data for ghosted nodes" << std::endl;
151 Array<LO> ghostedCoarseNodeCoarseLIDs;
152 Array<int> ghostedCoarseNodeCoarsePIDs;
153 Array<GO> ghostedCoarseNodeCoarseGIDs;
154 geoData->getGhostedNodesData(graph.
GetDomainMap(), ghostedCoarseNodeCoarseLIDs,
155 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
160 geoData->getNumGlobalCoarseNodes(),
161 ghostedCoarseNodeCoarseGIDs(),
165 LO coarseNodeIdx = 0;
166 Array<GO> coarseNodeCoarseGIDs, coarseNodeFineGIDs;
167 geoData->getCoarseNodesData(graph.
GetDomainMap(), coarseNodeCoarseGIDs, coarseNodeFineGIDs);
168 for (LO nodeIdx = 0; nodeIdx < ghostedCoarseNodeCoarseGIDs.size(); ++nodeIdx) {
169 if (ghostedCoarseNodeCoarsePIDs[nodeIdx] == colMap->getComm()->getRank()) {
170 coarseNodeCoarseGIDs[coarseNodeIdx] = ghostedCoarseNodeCoarseGIDs[nodeIdx];
174 domainMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
175 geoData->getNumGlobalCoarseNodes(),
176 coarseNodeCoarseGIDs(),
179 coarseCoordinatesMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
180 geoData->getNumGlobalCoarseNodes(),
181 coarseNodeCoarseGIDs(),
184 coarseCoordinatesFineMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
185 geoData->getNumGlobalCoarseNodes(),
186 coarseNodeFineGIDs(),
193 Teuchos::OrdinalTraits<GO>::invalid(),
194 geoData->getNumLocalCoarseNodes() * dofsPerNode,
199 Array<GO> coarseNodeCoarseGIDs(geoData->getNumLocalCoarseNodes());
200 Array<GO> coarseNodeFineGIDs(geoData->getNumLocalCoarseNodes());
201 geoData->getCoarseNodesData(graph.
GetDomainMap(), coarseNodeCoarseGIDs, coarseNodeFineGIDs);
202 coarseCoordinatesMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
203 Teuchos::OrdinalTraits<GO>::invalid(),
204 geoData->getNumLocalCoarseNodes(),
207 coarseCoordinatesFineMap = MapFactory::Build(graph.
GetDomainMap()->lib(),
208 Teuchos::OrdinalTraits<GO>::invalid(),
209 coarseNodeFineGIDs(),
214 *out <<
"Call constructor of CrsGraph" << std::endl;
215 myGraph = CrsGraphFactory::Build(rowMap,
219 *out <<
"Fill CrsGraph" << std::endl;
221 for (LO nodeIdx = 0; nodeIdx < geoData->getNumLocalFineNodes(); ++nodeIdx) {
222 for (LO dof = 0; dof < dofsPerNode; ++dof) {
223 rowIdx = nodeIdx * dofsPerNode + dof;
224 myGraph->insertLocalIndices(rowIdx, colIndex(rowPtr[rowIdx], nnzOnRow[rowIdx]));
228 *out <<
"Call fillComplete on CrsGraph" << std::endl;
229 myGraph->fillComplete(domainMap, rowMap);
230 *out <<
"Prolongator CrsGraph computed" << std::endl;
237 const LO dofsPerNode,
const int ,
238 ArrayRCP<size_t>& nnzOnRow, Array<size_t>& rowPtr,
239 Array<LO>& colIndex)
const {
240 RCP<Teuchos::FancyOStream> out;
241 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
242 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
243 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
245 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
248 Array<LO> ghostedCoarseNodeCoarseLIDs;
249 Array<int> ghostedCoarseNodeCoarsePIDs;
250 Array<GO> ghostedCoarseNodeCoarseGIDs;
251 geoData->getGhostedNodesData(graph.
GetDomainMap(), ghostedCoarseNodeCoarseLIDs,
252 ghostedCoarseNodeCoarsePIDs, ghostedCoarseNodeCoarseGIDs);
254 LO ghostedCoarseNodeCoarseLID, rem, rate;
255 Array<LO> ghostedIdx(3), coarseIdx(3);
256 for (LO nodeIdx = 0; nodeIdx < geoData->getNumLocalFineNodes(); ++nodeIdx) {
258 geoData->getFineNodeGhostedTuple(nodeIdx, ghostedIdx[0], ghostedIdx[1], ghostedIdx[2]);
260 for (
int dim = 0; dim < 3; ++dim) {
261 if (geoData->isSingleCoarsePoint() && (geoData->getLocalFineNodesInDir(dim) - 1 < geoData->getCoarseningRate(dim))) {
264 coarseIdx[dim] = ghostedIdx[dim] / geoData->getCoarseningRate(dim);
265 rem = ghostedIdx[dim] % geoData->getCoarseningRate(dim);
266 if (ghostedIdx[dim] - geoData->getOffset(dim) < geoData->getLocalFineNodesInDir(dim) - geoData->getCoarseningEndRate(dim)) {
267 rate = geoData->getCoarseningRate(dim);
269 rate = geoData->getCoarseningEndRate(dim);
271 if (rem > (rate / 2)) {
274 if ((geoData->getStartGhostedCoarseNode(dim) * geoData->getCoarseningRate(dim) > geoData->getStartIndex(dim)) && geoData->isAggregationCoupled()) {
280 geoData->getCoarseNodeGhostedLID(coarseIdx[0], coarseIdx[1], coarseIdx[2],
281 ghostedCoarseNodeCoarseLID);
283 for (LO dof = 0; dof < dofsPerNode; ++dof) {
284 nnzOnRow[nodeIdx * dofsPerNode + dof] = 1;
285 rowPtr[nodeIdx * dofsPerNode + dof + 1] = rowPtr[nodeIdx * dofsPerNode + dof] + 1;
286 colIndex[rowPtr[nodeIdx * dofsPerNode + dof]] =
287 ghostedCoarseNodeCoarseLIDs[ghostedCoarseNodeCoarseLID] * dofsPerNode + dof;
296 const LO dofsPerNode,
const int numInterpolationPoints,
297 ArrayRCP<size_t>& nnzOnRow, Array<size_t>& rowPtr,
298 Array<LO>& colIndex)
const {
299 RCP<Teuchos::FancyOStream> out;
300 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
301 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
302 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
304 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
307 const bool coupled = geoData->isAggregationCoupled();
308 const int numDimensions = geoData->getNumDimensions();
309 Array<LO> ghostedIdx(3, 0);
310 Array<LO> coarseIdx(3, 0);
311 Array<LO> ijkRem(3, 0);
312 const LO coarsePointOffset[8][3] = {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 1, 0}, {0, 0, 1}, {1, 0, 1}, {0, 1, 1}, {1, 1, 1}};
314 for (LO nodeIdx = 0; nodeIdx < geoData->getNumLocalFineNodes(); ++nodeIdx) {
316 geoData->getFineNodeGhostedTuple(nodeIdx, ghostedIdx[0], ghostedIdx[1], ghostedIdx[2]);
317 for (
int dim = 0; dim < numDimensions; dim++) {
318 coarseIdx[dim] = ghostedIdx[dim] / geoData->getCoarseningRate(dim);
319 ijkRem[dim] = ghostedIdx[dim] % geoData->getCoarseningRate(dim);
321 if (geoData->getStartGhostedCoarseNode(dim) * geoData->getCoarseningRate(dim) > geoData->getStartIndex(dim)) {
325 if (ghostedIdx[dim] == geoData->getLocalFineNodesInDir(dim) - 1) {
326 coarseIdx[dim] = geoData->getLocalCoarseNodesInDir(dim) - 1;
333 bool allCoarse =
true;
334 Array<bool> isCoarse(numDimensions);
335 for (
int dim = 0; dim < numDimensions; ++dim) {
336 isCoarse[dim] =
false;
337 if (ijkRem[dim] == 0)
338 isCoarse[dim] =
true;
341 if (ghostedIdx[dim] - geoData->getOffset(dim) == geoData->getLocalFineNodesInDir(dim) - 1 &&
342 geoData->getMeshEdge(dim * 2 + 1))
343 isCoarse[dim] =
true;
345 if (ghostedIdx[dim] - geoData->getOffset(dim) == geoData->getLocalFineNodesInDir(dim) - 1)
346 isCoarse[dim] =
true;
353 LO rowIdx = 0, colIdx = 0;
355 for (LO dof = 0; dof < dofsPerNode; ++dof) {
356 rowIdx = nodeIdx * dofsPerNode + dof;
357 nnzOnRow[rowIdx] = 1;
358 rowPtr[rowIdx + 1] = rowPtr[rowIdx] + 1;
361 geoData->getCoarseNodeGhostedLID(coarseIdx[0], coarseIdx[1], coarseIdx[2], colIdx);
362 colIndex[rowPtr[rowIdx]] = colIdx * dofsPerNode + dof;
366 for (
int dim = 0; dim < numDimensions; ++dim) {
367 if (coarseIdx[dim] == geoData->getGhostedNodesInDir(dim) - 1)
371 for (LO dof = 0; dof < dofsPerNode; ++dof) {
373 rowIdx = nodeIdx * dofsPerNode + dof;
374 nnzOnRow[rowIdx] = Teuchos::as<size_t>(numInterpolationPoints);
375 rowPtr[rowIdx + 1] = rowPtr[rowIdx] + Teuchos::as<LO>(numInterpolationPoints);
377 for (LO interpIdx = 0; interpIdx < numInterpolationPoints; ++interpIdx) {
378 geoData->getCoarseNodeGhostedLID(coarseIdx[0] + coarsePointOffset[interpIdx][0],
379 coarseIdx[1] + coarsePointOffset[interpIdx][1],
380 coarseIdx[2] + coarsePointOffset[interpIdx][2],
382 colIndex[rowPtr[rowIdx] + interpIdx] = colIdx * dofsPerNode + dof;
394 LO& numNonAggregatedNodes)
const {
395 Monitor m(*
this,
"BuildAggregates");
397 RCP<Teuchos::FancyOStream> out;
398 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
399 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
400 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
402 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
406 const LO numLocalFineNodes = geoData->getNumLocalFineNodes();
407 const LO numCoarseNodes = geoData->getNumCoarseNodes();
411 *out <<
"Loop over fine nodes and assign them to an aggregate and a rank" << std::endl;
412 LO numAggregatedNodes;
418 Kokkos::parallel_reduce(
"StructuredAggregation: fill aggregates data",
419 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes),
423 *out <<
"numCoarseNodes= " << numCoarseNodes
424 <<
", numAggregatedNodes= " << numAggregatedNodes << std::endl;
425 numNonAggregatedNodes = numNonAggregatedNodes - numAggregatedNodes;
432 RCP<CrsGraph>& myGraph)
const {
433 Monitor m(*
this,
"BuildGraphP");
435 RCP<Teuchos::FancyOStream> out;
436 if (
const char* dbg = std::getenv(
"MUELU_STRUCTUREDALGORITHM_DEBUG")) {
437 out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout));
438 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
440 out = Teuchos::getFancyOStream(rcp(
new Teuchos::oblackholestream()));
444 int numInterpolationPoints = 0;
445 if (geoData->getInterpolationOrder() == 0) {
446 numInterpolationPoints = 1;
447 }
else if (geoData->getInterpolationOrder() == 1) {
449 numInterpolationPoints = 1 << geoData->getNumDimensions();
451 *out <<
"numInterpolationPoints=" << numInterpolationPoints << std::endl;
453 const LO numLocalFineNodes = geoData->getNumLocalFineNodes();
454 const LO numCoarseNodes = geoData->getNumCoarseNodes();
455 const LO numNnzEntries = dofsPerNode * (numCoarseNodes + numInterpolationPoints * (numLocalFineNodes - numCoarseNodes));
458 entries_type colIndex(
"Prolongator graph, colIndices", numNnzEntries);
460 *out <<
"Compute prolongatorGraph data" << std::endl;
461 if (geoData->getInterpolationOrder() == 0) {
465 geoData->getCoarseningRates(),
466 geoData->getCoarseningEndRates(),
467 geoData->getLocalFineNodesPerDir(),
470 Kokkos::parallel_for(
"Structured Aggregation: compute loca graph data",
471 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes),
473 }
else if (geoData->getInterpolationOrder() == 1) {
480 numInterpolationPoints,
482 geoData->getCoarseningRates(),
483 geoData->getLocalFineNodesPerDir(),
485 Kokkos::parallel_scan(
"Structured Aggregation: compute rowPtr for prolongator graph",
486 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes + 1),
490 geoData->getNumDimensions(),
493 numInterpolationPoints,
494 geoData->getCoarseningRates(),
495 geoData->getCoarseningEndRates(),
496 geoData->getLocalFineNodesPerDir(),
497 geoData->getCoarseNodesPerDir(),
500 Kokkos::parallel_for(
"Structured Aggregation: compute loca graph data",
501 Kokkos::RangePolicy<execution_space>(0, numLocalFineNodes),
508 RCP<Map> colMap, domainMap;
509 *out <<
"Compute domain and column maps of the CrsGraph" << std::endl;
511 Teuchos::OrdinalTraits<GO>::invalid(),
517 myGraph = CrsGraphFactory::Build(myLocalGraph, graph.
GetDomainMap(), colMap,
540 LO coarseNodeCoarseLID;
541 LO nodeFineTuple[3], coarseIdx[3];
542 auto coarseRate = geoData_.getCoarseningRates();
543 auto endRate = geoData_.getCoarseningEndRates();
544 auto lFineNodesPerDir = geoData_.getLocalFineNodesPerDir();
546 geoData_.getFineLID2FineTuple(nodeIdx, nodeFineTuple);
548 for (
int dim = 0; dim < 3; ++dim) {
549 coarseIdx[dim] = nodeFineTuple[dim] / coarseRate(dim);
550 rem = nodeFineTuple[dim] % coarseRate(dim);
551 rate = (nodeFineTuple[dim] < lFineNodesPerDir(dim) - endRate(dim)) ? coarseRate(dim) : endRate(dim);
552 if (rem > (rate / 2)) {
557 geoData_.getCoarseTuple2CoarseLID(coarseIdx[0], coarseIdx[1], coarseIdx[2],
558 coarseNodeCoarseLID);
560 vertex2AggID_(nodeIdx, 0) = coarseNodeCoarseLID;
561 procWinner_(nodeIdx, 0) = myRank_;
563 ++lNumAggregatedNodes;
591 LO nodeFineTuple[3] = {0, 0, 0};
592 LO nodeCoarseTuple[3] = {0, 0, 0};
595 geoData_.getFineLID2FineTuple(nodeIdx, nodeFineTuple);
599 LO rem, rate, coarseNodeCoarseLID;
600 for (
int dim = 0; dim < 3; ++dim) {
601 nodeCoarseTuple[dim] = nodeFineTuple[dim] / coarseRate_(dim);
602 rem = nodeFineTuple[dim] % coarseRate_(dim);
603 if (nodeFineTuple[dim] < (lFineNodesPerDir_(dim) - endRate_(dim))) {
604 rate = coarseRate_(dim);
606 rate = endRate_(dim);
608 if (rem > (rate / 2)) {
609 ++nodeCoarseTuple[dim];
614 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2],
615 coarseNodeCoarseLID);
618 for (LO dof = 0; dof < dofsPerNode_; ++dof) {
619 rowPtr_(nodeIdx * dofsPerNode_ + dof + 1) = nodeIdx * dofsPerNode_ + dof + 1;
620 colIndex_(nodeIdx * dofsPerNode_ + dof) = coarseNodeCoarseLID * dofsPerNode_ + dof;
697 LO nodeFineTuple[3] = {0, 0, 0};
698 LO nodeCoarseTuple[3] = {0, 0, 0};
701 geoData_.getFineLID2FineTuple(nodeIdx, nodeFineTuple);
703 LO coarseNodeCoarseLID;
704 bool allCoarse =
false;
705 for (
int dim = 0; dim < 3; ++dim) {
706 nodeCoarseTuple[dim] = nodeFineTuple[dim] / coarseRate_(dim);
708 if (rowPtr_(nodeIdx + 1) == rowPtr_(nodeIdx) + 1) {
712 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2],
713 coarseNodeCoarseLID);
717 for (LO dof = 0; dof < dofsPerNode_; ++dof) {
718 colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof)) = coarseNodeCoarseLID * dofsPerNode_ + dof;
721 for (
int dim = 0; dim < numDimensions_; ++dim) {
722 if (nodeCoarseTuple[dim] == ghostedNodesPerDir_(dim) - 1) {
723 --nodeCoarseTuple[dim];
729 for (LO dof = 0; dof < dofsPerNode_; ++dof) {
730 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2], colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 0));
731 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0] + 1, nodeCoarseTuple[1], nodeCoarseTuple[2], colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 1));
732 if (numDimensions_ > 1) {
733 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1] + 1, nodeCoarseTuple[2], colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 2));
734 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0] + 1, nodeCoarseTuple[1] + 1, nodeCoarseTuple[2], colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 3));
735 if (numDimensions_ > 2) {
736 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1], nodeCoarseTuple[2] + 1, colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 4));
737 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0] + 1, nodeCoarseTuple[1], nodeCoarseTuple[2] + 1, colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 5));
738 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0], nodeCoarseTuple[1] + 1, nodeCoarseTuple[2] + 1, colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 6));
739 geoData_.getCoarseTuple2CoarseLID(nodeCoarseTuple[0] + 1, nodeCoarseTuple[1] + 1, nodeCoarseTuple[2] + 1, colIndex_(rowPtr_(nodeIdx * dofsPerNode_ + dof) + 7));