791 template<
short_t d,
class T>
796 m_C0s.resize(m_nVerts);
797 if (m_options.getSwitch(
"SharpCorners"))
798 m_C0s = getSharpCorners(m_options.getReal(
"SharpCornerTolerance"));
800 std::fill(m_C0s.begin(), m_C0s.end(),
false);
809 template<
short_t d,
class T>
812 m_topology.checkConsistency();
813 m_nSides = 2*m_topology.nInterfaces() + m_topology.nBoundary();
814 m_nVerts = 4*m_Bbases.nBases();
816 m_sideCheck.resize(m_nSides);
817 std::fill(m_sideCheck.begin(), m_sideCheck.end(),
false);
818 m_vertCheck.resize(m_nVerts);
819 std::fill(m_vertCheck.begin(), m_vertCheck.end(),
false);
822 template<
short_t d,
class T>
826 for (
size_t k=0; k!=m_Bbases.nBases(); ++k)
831 m_bases.addBasis(m_Bbases.basis(k).clone());
833 gsWarn<<
"No THB basis was constructed";
835 m_bases.setTopology(m_topology);
838 template<
short_t d,
class T>
843 template<
short_t d,
class T>
850 template<
short_t d,
class T>
853 m_matrix.resize(m_size,m_bases.totalSize());
856 template<
short_t d,
class T>
859 for (
size_t p=0; p!=m_bases.nBases(); p++)
861 gsInfo<<
"----------------------------------\n";
862 gsInfo<<
"patch "<<p<<
"\n";
863 for (
size_t b=0; b!=m_mapOriginal.patchSize(p); b++)
865 index_t idx = m_mapModified.index(b,p);
866 if (m_mapModified.is_free_index(idx))
867 gsInfo<<
"basis function "<<b<<
" (check="<<m_basisCheck[idx]<<
") on patch "<<p<<
" is "<<(m_basisCheck[idx] ?
"":
"not ")<<
"handled\n";
869 gsInfo<<
"basis function "<<b<<
" on patch "<<p<<
" is "<<
"eliminated\n";
874 template<
short_t d,
class T>
877 bool checkSides = std::all_of(m_sideCheck.begin(), m_sideCheck.end(), [](
bool m_sideCheck) { return m_sideCheck; });
879 bool checkVerts = std::all_of(m_vertCheck.begin(), m_vertCheck.end(), [](
bool m_vertCheck) { return m_vertCheck; });
880 GISMO_ENSURE(checkVerts,
"Not all vertices are checked");
885 bool checkBasis = std::all_of(m_basisCheck.begin(), m_basisCheck.end(), [](
bool m_basisCheck) { return m_basisCheck; });
886 GISMO_ENSURE(checkBasis,
"Not all basis functions are checked");
889 template<
short_t d,
class T>
892 m_sideCheck.resize(m_nSides);
893 std::fill(m_sideCheck.begin(), m_sideCheck.end(),
false);
894 m_vertCheck.resize(m_nVerts);
895 std::fill(m_vertCheck.begin(), m_vertCheck.end(),
false);
900 m_basisCheck.resize(m_size);
901 std::fill(m_basisCheck.begin(), m_basisCheck.end(),
false);
905 template<
short_t d,
class T>
908 std::vector<patchSide> psides;
909 std::vector<patchCorner> corners;
910 sparseEntry_t entries;
920 index_t b11_p1 = _indexFromVert(1,pcorner,psides[0],1);
921 rowIdx = m_mapModified.index(b11_p1,pcorner.patch);
922 colIdx = m_mapOriginal.index(b11_p1,pcorner.patch);
925 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
927 m_topology.getCornerList(pcorner,corners);
932 for (std::vector<patchCorner>::iterator corn = corners.begin(); corn != corners.end(); ++corn)
934 tmpBasis = &m_bases.
basis(corn->patch);
935 index = tmpBasis->functionAtCorner(corn->corner());
936 colIdx = m_mapOriginal.index(index,corn->patch);
938 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
944 for (std::vector<patchSide>::iterator side = psides.begin(); side != psides.end(); ++side)
946 GISMO_ENSURE(m_topology.getInterface(*side,iface),
"Side must be an interface!");
947 m_topology.getNeighbour(*side,otherSide);
948 patchCorner otherCorner = iface.mapCorner(pcorner);
950 index_t b10_p1 = _indexFromVert(1,pcorner,*side,0);
951 index_t b10_p2 = _indexFromVert(1,otherCorner,otherSide,0);
954 colIdx = m_mapOriginal.index(b10_p1,side->patch);
955 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
956 colIdx = m_mapOriginal.index(b10_p2,otherSide.
patch);
957 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
961 #pragma omp critical (handle_interior_vertex)
963 _pushAndCheck(entries);
964 m_vertCheck[ _vertIndex(pcorner.patch, pcorner.corner()) ] =
true;
969 template<
short_t d,
class T>
973 if (m_vertCheck[ _vertIndex(pcorner.patch, pcorner.corner()) ])
979 std::pair<index_t,bool> vdata = _vertexData(pcorner);
981 bool C0 = m_C0s[_vertIndex(pcorner.patch,pcorner.corner())];
985 _handleRegularCorner(pcorner);
986 else if (vdata.first==2 && !C0)
987 _handleRegularBoundaryVertexSmooth(pcorner,vdata.first);
988 else if (vdata.first==2 && C0)
989 _handleRegularBoundaryVertexNonSmooth(pcorner,vdata.first);
990 else if (vdata.first> 2 && !C0)
991 _handleIrregularBoundaryVertexSmooth(pcorner,vdata.first);
992 else if (vdata.first> 2 && C0)
993 _handleIrregularBoundaryVertexNonSmooth(pcorner,vdata.first);
998 _handleInteriorVertex(pcorner,vdata.first);
1001 template<
short_t d,
class T>
1010 std::vector<patchCorner> pcorners;
1012 std::vector<std::vector<index_t>> selectedIndices(2);
1013 std::vector<std::vector<index_t>> selectedOIndices(2);
1015 std::vector<gsBasis<T> *> basis(2);
1016 std::vector<gsMatrix<index_t>> indices(2);
1017 std::vector<gsMatrix<index_t>> oindices(2);
1019 sparseEntry_t entries;
1022 basis[0] = &m_bases.basis(iface.
first().
patch);
1026 basis[0]->matchWith(iface,*basis[1],indices[0],indices[1],0);
1027 basis[0]->matchWith(iface,*basis[1],oindices[0],oindices[1],1);
1036 selectedIndices[p].push_back(_indexFromVert(0,pcorners[c],ifacep,0));
1037 selectedIndices[p].push_back(_indexFromVert(1,pcorners[c],ifacep,0));
1039 selectedOIndices[p].push_back(_indexFromVert(0,pcorners[c],ifacep,1));
1040 selectedOIndices[p].push_back(_indexFromVert(1,pcorners[c],ifacep,1));
1042 std::vector<index_t> allIndices(indices[p].data(), indices[p].data() + indices[p].rows() * indices[p].cols());
1043 std::vector<index_t> result;
1044 std::copy_if(allIndices.begin(), allIndices.end(), std::back_inserter(result),
1045 [&selectedIndices,&p] (
index_t entry)
1047 std::vector<index_t>::const_iterator res = std::find(selectedIndices[p].begin(), selectedIndices[p].end(), entry);
1048 return (res == selectedIndices[p].end());
1052 std::vector<index_t> allOIndices(oindices[p].data(), oindices[p].data() + oindices[p].rows() * oindices[p].cols());
1054 std::copy_if(allOIndices.begin(), allOIndices.end(), std::back_inserter(result),
1055 [&selectedOIndices,&p] (
index_t entry)
1057 std::vector<index_t>::const_iterator res = std::find(selectedOIndices[p].begin(), selectedOIndices[p].end(), entry);
1058 return (res == selectedOIndices[p].end());
1063 GISMO_ASSERT(indices[0].size()==indices[1].size(),
"Indices do not have the right size, indices[0].size()="<<indices[0].size()<<
",indices[1].size()="<<indices[1].size());
1064 GISMO_ASSERT(oindices[0].size()==oindices[1].size(),
"Offset indices do not have the right size, oindices[0].size()="<<oindices[0].size()<<
",oindices[1].size()="<<oindices[1].size());
1069 for (
index_t p =0; p!= 2; p++)
1074 for (
index_t k=0; k!= indices[p].size(); k++ )
1076 GISMO_ASSERT(m_mapModified.is_free(oindices[p].at(k),ifacep.
patch),
"Index "<<oindices[p].at(k)<<
" on patch "<<ifacep.
patch<<
" is eliminated. Something went wrong?");
1077 rowIdx = m_mapModified.index(oindices[p].at(k),ifacep.
patch);
1079 GISMO_ASSERT(m_mapOriginal.is_free(oindices[p].at(k),ifacep.
patch),
"Index is eliminated. Something went wrong?");
1080 colIdx = m_mapOriginal.index(oindices[p].at(k),ifacep.
patch);
1083 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1085 GISMO_ASSERT(m_mapOriginal.is_free(indices[p].at(k),ifacep.
patch),
"Index is eliminated. Something went wrong?");
1086 colIdx = m_mapOriginal.index(indices[p].at(k),ifacep.
patch);
1089 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1091 GISMO_ASSERT(m_mapOriginal.is_free(indices[np].at(k),ifacenp.
patch),
"Index is eliminated. Something went wrong?");
1092 colIdx = m_mapOriginal.index(indices[np].at(k),ifacenp.
patch);
1095 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1102 #pragma omp critical (handle_interface)
1104 _pushAndCheck(entries);
1105 m_sideCheck[ _sideIndex(iface.
first().
patch, iface.
first().side()) ] =
true;
1111 template<
short_t d,
class T>
1114 std::vector<patchCorner> pcorners;
1115 std::vector<index_t> selectedIndices;
1116 gsBasis<T> * basis = &m_bases.basis(side.patch);
1117 sparseEntry_t entries;
1120 side.getContainedCorners(d,pcorners);
1123 selectedIndices.push_back(_indexFromVert(0,pcorners[c],side,0));
1124 selectedIndices.push_back(_indexFromVert(1,pcorners[c],side,0));
1127 std::sort(selectedIndices.begin(),selectedIndices.end());
1128 std::vector<index_t> allIndices(indices.data(), indices.data() + indices.rows() * indices.cols());
1129 std::vector<index_t> result(allIndices.size());
1130 std::vector<index_t>::iterator it=std::set_difference (allIndices.begin(), allIndices.end(), selectedIndices.begin(), selectedIndices.end(), result.begin());
1131 result.resize(it-result.begin());
1135 for (std::vector<index_t>::iterator it = result.begin(); it!=result.end(); ++it)
1137 rowIdx = m_mapModified.index(*it,side.patch);
1138 colIdx = m_mapOriginal.index(*it,side.patch);
1140 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1146 #pragma omp critical (handle_boundary)
1148 _pushAndCheck(entries);
1150 m_sideCheck.at( _sideIndex(side.patch,side.side()) ) =
true;
1154 template<
short_t d,
class T>
1157 #pragma omp critical (handle_interior)
1160 for(
size_t p=0; p!=m_bases.nBases(); p++)
1161 for (
index_t b=0; b!=m_bases.basis(p).size(); b++)
1163 rowIdx = m_mapModified.index(b,p);
1165 if ( (!m_mapModified.is_free(b,p)) || (m_basisCheck[rowIdx]) )
1168 colIdx = m_mapOriginal.index(b,p);
1169 m_matrix(rowIdx,colIdx) = 1;
1170 m_basisCheck[rowIdx] =
true;
1176 template<
short_t d,
class T>
1179 GISMO_ASSERT((
size_t)m_mapModified.freeSize()==m_size,
"Size does not match predicted size, m_mapModified.freeSize()="<<m_mapModified.freeSize()<<
"; m_size="<<m_size);
1187 for (
size_t p=0; p<m_bases.nBases(); p++)
1192 for(gsBoxTopology::const_iiterator iit = m_topology.iBegin(); iit< m_topology.iEnd(); iit++)
1193 _handleInterface(*iit);
1197 for(gsBoxTopology::const_biterator bit = m_topology.bBegin(); bit< m_topology.bEnd(); bit++)
1198 _handleBoundary(*bit);
1202 if (m_options.getSwitch(
"Verbose")) { _whichHandled(); }
1204 _performChecks(
true);
1205 m_matrix.makeCompressed();
1208 template<
short_t d,
class T>
1212 _resetChecks(
false);
1220 for(gsBoxTopology::const_iiterator iit = m_topology.iBegin(); iit!= m_topology.iEnd(); iit++)
1221 _computeInterfaceMapper(*iit);
1227 for(gsBoxTopology::const_biterator bit = m_topology.bBegin(); bit!= m_topology.bEnd(); bit++)
1228 _computeBoundaryMapper(*bit);
1239 for (
size_t p=0; p!=m_bases.nBases(); p++)
1245 _computeVertexMapper(pcorner);
1248 m_mapModified.finalize();
1249 m_mapOriginal.finalize();
1251 GISMO_ASSERT((
size_t)m_mapModified.freeSize()==m_size,
"Size does not match predicted size, m_mapModified.freeSize()="<<m_mapModified.freeSize()<<
"; m_size="<<m_size);
1252 m_matrix.resize( m_size, m_mapOriginal.freeSize() );
1260 template<
short_t d,
class T>
1264 if (m_sideCheck.at(sidx))
1268 std::pair<index_t,bool> vdata1, vdata2;
1269 std::vector<index_t> patches(2);
1270 std::vector<patchSide> psides(2);
1272 std::vector<patchCorner> pcorners;
1279 for (
index_t p = 0; p != 2; p++)
1281 sidx = _sideIndex( patches[p] ,psides[p] );
1282 if (m_sideCheck.at(sidx))
1302 basis = &m_bases.basis(patches[p]);
1306 vdata1 = this->_vertexData(pcorners[0]);
1307 vdata2 = this->_vertexData(pcorners[1]);
1310 std::vector<index_t> allIndices(indices.data(), indices.data() + indices.rows() * indices.cols());
1314 std::vector<index_t> selectedIndices;
1318 selectedIndices.push_back(_indexFromVert(0,pcorners[c],psides[p],0));
1319 selectedIndices.push_back(_indexFromVert(1,pcorners[c],psides[p],0));
1322 std::sort(selectedIndices.begin(),selectedIndices.end());
1326 std::vector<index_t> result(allIndices.size());
1327 std::vector<index_t>::iterator it=std::set_difference (allIndices.begin(), allIndices.end(), selectedIndices.begin(), selectedIndices.end(), result.begin());
1328 result.resize(it-result.begin());
1330 gsAsMatrix<index_t> indices(result,result.size(),1);
1332 #pragma omp critical (side_interface)
1334 m_mapModified.markBoundary(patches[p], indices);
1335 m_sideCheck.at(sidx) =
true;
1340 template<
short_t d,
class T>
1341 void gsDPatchBase<d,T>::_computeBoundaryMapper(patchSide boundary)
1343 index_t sidx = _sideIndex(boundary.patch,boundary.side());
1344 m_sideCheck.at(sidx) =
true;
1347 template<
short_t d,
class T>
1348 void gsDPatchBase<d,T>::_computeVertexMapper(patchCorner pcorner)
1350 index_t cidx = _vertIndex(pcorner.patch,pcorner.corner());
1351 if (m_vertCheck.at(cidx))
1354 bool C0 = m_C0s[cidx];
1358 std::tie(valence,interior) = _vertexData(pcorner);
1359 if (!interior && valence==1)
1360 _computeMapperRegularCorner_v1(pcorner,valence);
1361 else if (!interior && valence==2 && C0)
1362 _computeMapperRegularBoundaryVertexNonSmooth_v2(pcorner,valence);
1363 else if (!interior && valence==2 && !C0)
1364 _computeMapperRegularBoundaryVertexSmooth_v2(pcorner,valence);
1365 else if (!interior && valence >2 && C0)
1366 _computeMapperIrregularBoundaryVertexNonSmooth_v(pcorner,valence);
1367 else if (!interior && valence >2 && !C0)
1368 _computeMapperIrregularBoundaryVertexSmooth_v(pcorner,valence);
1370 _computeMapperInteriorVertex_v(pcorner,valence);
1372 GISMO_ERROR(
"Something went terribly wrong, interior="<<interior<<
"; valence="<<valence);
1375 m_vertCheck[ cidx ] =
true;
1378 template<
short_t d,
class T>
1379 void gsDPatchBase<d,T>::_computeMapperRegularCorner_v1(patchCorner pcorner,
index_t valence)
1388 template<
short_t d,
class T>
1389 void gsDPatchBase<d,T>::_computeMapperRegularBoundaryVertexSmooth_v2(patchCorner pcorner,
index_t valence)
1393 std::vector<patchSide> psides(2);
1423 pcorner.getContainingSides(d,psides);
1424 for (
size_t p=0; p!=psides.size(); p++)
1427 if (m_topology.isInterface(psides[p]))
1430 m_mapModified.eliminateDof(_indexFromVert(k,pcorner,psides[p],0),pcorner.patch);
1447 template<
short_t d,
class T>
1448 void gsDPatchBase<d,T>::_computeMapperRegularBoundaryVertexNonSmooth_v2(patchCorner pcorner,
index_t valence)
1452 std::vector<patchSide> psides(2);
1465 pcorner.getContainingSides(d,psides);
1466 for (
size_t p=0; p!=psides.size(); p++)
1468 if (m_topology.isInterface(psides[p]))
1470 m_mapModified.eliminateDof(this->_indexFromVert(1,pcorner,psides[p],0),pcorner.patch);
1475 template<
short_t d,
class T>
1476 void gsDPatchBase<d,T>::_computeMapperIrregularBoundaryVertexSmooth_v(patchCorner pcorner,
index_t valence)
1495 gsWarn<<
"C0 handling for boundary corners with valence >2 has not yet been implemented. Using the default approach\n";
1496 this->_computeMapperIrregularBoundaryVertexNonSmooth_v(pcorner,valence);
1499 template<
short_t d,
class T>
1500 void gsDPatchBase<d,T>::_computeMapperIrregularBoundaryVertexNonSmooth_v(patchCorner pcorner,
index_t valence)
1506 std::vector<patchSide> psides(2);
1507 pcorner.getContainingSides(d,psides);
1508 for (
size_t p=0; p!=psides.size(); p++)
1511 if (m_topology.isInterface(psides[p]))
1512 m_mapModified.eliminateDof(_indexFromVert(1,pcorner,psides[p],0),pcorner.patch);
1516 template<
short_t d,
class T>
1517 void gsDPatchBase<d,T>::_computeMapperInteriorVertex_v(patchCorner pcorner,
index_t valence)
1521 std::vector<patchSide> psides(2);
1539 pcorner.getContainingSides(d,psides);
1540 for (
size_t p=0; p!=psides.size(); p++)
1542 m_mapModified.eliminateDof(this->_indexFromVert(0,pcorner,psides[p],0),pcorner.patch);
1543 m_mapModified.eliminateDof(this->_indexFromVert(1,pcorner,psides[p],0),pcorner.patch);
1547 template<
short_t d,
class T>
1550 std::vector<patchSide> psides;
1551 std::vector<index_t> indices(4);
1552 sparseEntry_t entries;
1555 indices[0] = _indexFromVert(0,pcorner,psides[0],0);
1556 indices[1] = _indexFromVert(1,pcorner,psides[0],0);
1557 indices[2] = _indexFromVert(1,pcorner,psides[1],0);
1558 indices[3] = _indexFromVert(1,pcorner,psides[1],1);
1562 for (std::vector<index_t>::iterator it = indices.begin(); it!=indices.end(); ++it)
1564 rowIdx = m_mapModified.index(*it,pcorner.patch);
1565 colIdx = m_mapOriginal.index(*it,pcorner.patch);
1566 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1569 #pragma omp critical (handle_boundary_vertex_tt)
1571 _pushAndCheck(entries);
1572 m_vertCheck[ _vertIndex(pcorner.patch, pcorner.corner()) ] =
true;
1578 template<
short_t d,
class T>
1583 std::vector<patchSide> psides;
1584 std::vector<index_t> indices(3);
1586 sparseEntry_t entries;
1596 index_t iindex = m_topology.isInterface(psides[0]) ? 0 : 1;
1598 GISMO_ENSURE(m_topology.getInterface(psides[iindex],iface),
"Must be an interface");
1603 patchCorner otherCorner = iface.mapCorner(pcorner);
1604 for (
index_t k = 0; k!=2; k++)
1606 indices[0] = _indexFromVert(k,pcorner,psides[iindex],1);
1607 indices[1] = _indexFromVert(k,pcorner,psides[iindex],0);
1608 indices[2] = _indexFromVert(k,otherCorner,otherSide,0);
1610 rowIdx = m_mapModified.index(indices[0],pcorner.patch);
1611 colIdx = m_mapOriginal.index(indices[0],pcorner.patch);
1613 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1614 colIdx = m_mapOriginal.index(indices[1],psides[iindex].patch);
1616 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1617 colIdx = m_mapOriginal.index(indices[2],otherSide.
patch);
1619 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1622 #pragma omp critical (handle_boundary_vertex_tt)
1624 _pushAndCheck(entries);
1625 m_vertCheck[ _vertIndex(pcorner.patch, pcorner.corner()) ] =
true;
1629 template<
short_t d,
class T>
1630 void gsDPatchBase<d,T>::_handleRegularBoundaryVertexNonSmooth(patchCorner pcorner,
index_t valence)
1634 std::vector<patchSide> psides;
1635 std::vector<index_t> indices(3);
1637 sparseEntry_t entries;
1641 boundaryInterface iface;
1644 pcorner.getContainingSides(d,psides);
1647 index_t iindex = m_topology.isInterface(psides[0]) ? 0 : 1;
1649 GISMO_ENSURE(m_topology.getInterface(psides[iindex],iface),
"Must be an interface");
1653 patchSide otherSide = iface.other(psides[iindex]);
1654 patchCorner otherCorner = iface.mapCorner(pcorner);
1655 for (
index_t k = 1; k!=2; k++)
1657 indices[0] = _indexFromVert(k,pcorner,psides[iindex],1);
1658 indices[1] = _indexFromVert(k,pcorner,psides[iindex],0);
1659 indices[2] = _indexFromVert(k,otherCorner,otherSide,0);
1661 rowIdx = m_mapModified.index(indices[0],pcorner.patch);
1662 colIdx = m_mapOriginal.index(indices[0],pcorner.patch);
1664 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1665 colIdx = m_mapOriginal.index(indices[1],psides[iindex].patch);
1667 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1668 colIdx = m_mapOriginal.index(indices[2],otherSide.patch);
1670 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1673 #pragma omp critical (handle_boundary_vertex_tt)
1675 _pushAndCheck(entries);
1676 m_vertCheck[ _vertIndex(pcorner.patch, pcorner.corner()) ] =
true;
1680 template<
short_t d,
class T>
1681 void gsDPatchBase<d,T>::_handleIrregularBoundaryVertexSmooth(patchCorner pcorner,
index_t valence)
1685 gsWarn<<
"C1 handling for boundary corners with valence >2 has not yet been implemented. Using the default approach\n";
1686 this->_handleIrregularBoundaryVertexNonSmooth(pcorner,valence);
1689 template<
short_t d,
class T>
1690 void gsDPatchBase<d,T>::_handleIrregularBoundaryVertexNonSmooth(patchCorner pcorner,
index_t valence)
1694 std::vector<patchSide> psides;
1695 std::vector<patchCorner> corners;
1696 std::vector<index_t> indices;
1697 sparseEntry_t entries;
1699 boundaryInterface iface;
1700 patchSide otherSide;
1705 pcorner.getContainingSides(d,psides);
1707 std::vector<index_t> rowIndices, colIndices, patchIndices;
1710 m_topology.getCornerList(pcorner,corners);
1714 index_t b11_p1 = _indexFromVert(1,pcorner,psides[0],1);
1715 rowIdx = m_mapModified.index(b11_p1,pcorner.patch);
1716 colIdx = m_mapOriginal.index(b11_p1,pcorner.patch);
1719 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1723 for (
index_t k = 0; k!=2; k++)
1727 if (!m_topology.getInterface(psides[k],iface))
1729 idx = _indexFromVert(1,pcorner,psides[k],0);
1730 rowIdx = m_mapModified.index(idx,pcorner.patch);
1731 colIdx = m_mapOriginal.index(idx,pcorner.patch);
1733 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1739 rowIdx = m_mapModified.index(b11_p1,pcorner.patch);
1741 patchSide otherSide = iface.other(psides[k]);
1742 patchCorner otherCorner = iface.mapCorner(pcorner);
1744 idx = _indexFromVert(1,pcorner,psides[k],0);
1745 colIdx = m_mapOriginal.index(idx,pcorner.patch);
1746 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1748 idx = _indexFromVert(1,otherCorner,otherSide,0);
1749 colIdx = m_mapOriginal.index(idx,otherCorner.patch);
1750 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1755 index_t b00_p1 = _indexFromVert(0,pcorner,psides[0],0);
1756 rowIdx = m_mapModified.index(b00_p1,pcorner.patch);
1757 colIdx = m_mapOriginal.index(b00_p1,pcorner.patch);
1760 entries.push_back(std::make_tuple(rowIdx,colIdx,weight));
1762 #pragma omp critical (handle_boundary_vertex_ff)
1764 _pushAndCheck(entries);
1765 m_vertCheck[ _vertIndex(pcorner.patch, pcorner.corner()) ] =
true;