39 {
return masterEdges.count(edge) > 0; }
43 {
return masterFaces.count(face) > 0; }
47 {
return v2e.at(vertices); }
70 bool coarsened)
override;
74 Array<int> aux_e_meshOffsets, aux_f_meshOffsets;
77 Array<int> aux_e_spaceOffsets, aux_f_spaceOffsets;
106 EdgePairInfo() : isSet(false) { }
108 EdgePairInfo(
int vertex,
int knotIndex,
int childEdge,
int parentEdge)
109 : v(vertex), ksi(knotIndex), child(childEdge), parent(parentEdge),
113 void Set(
int vertex,
int knotIndex,
int childEdge,
int parentEdge)
122 bool operator==(
const EdgePairInfo& other)
const
124 return v == other.v && ksi == other.ksi && child == other.child
125 && parent == other.parent;
130 struct MasterEdgeInfo
132 std::vector<int> slaves;
133 std::vector<int> vertices;
138 std::reverse(slaves.begin(), slaves.end());
139 std::reverse(vertices.begin(), vertices.end());
140 std::reverse(ks.begin(), ks.end());
145 struct MasterFaceInfo
147 std::vector<int> slaves;
148 std::vector<int> slaveCorners;
149 std::array<int, 2> ne;
150 std::array<int, 2> s0;
153 MasterFaceInfo() : rev(false)
155 for (
int i=0; i<2; ++i)
162 MasterFaceInfo(
int ne1,
int ne2) : rev(false)
166 for (
int i=0; i<2; ++i) { s0[i] = -1; }
189 std::vector<AuxiliaryEdge> auxEdges;
190 std::vector<AuxiliaryFace> auxFaces;
195 std::map<std::pair<int, int>,
int> auxv2e, auxv2f;
198 std::map<std::pair<int, int>,
int> v2e;
201 std::set<int> masterEdges, masterFaces;
204 Array<int> masterEdgeIndex;
208 std::vector<int> slaveEdges;
209 std::vector<SlaveFaceInfo> slaveFaces;
212 Array<int> slaveEdgesUnique, slaveFacesUnique;
215 std::map<int,int> slaveEdgesToUnique, slaveFacesToUnique;
218 std::map<int,int> masterEdgeToId, masterFaceToId;
221 std::vector<MasterEdgeInfo> masterEdgeInfo;
222 std::vector<MasterFaceInfo> masterFaceInfo;
226 int GetEdgeOffset(
bool dof,
int edge,
int increment)
const;
230 int GetFaceOffset(
bool dof,
int face,
int increment)
const;
233 std::map<std::pair<int, int>, std::array<int, 2>> parentToKV;
236 void UpdateAuxiliaryKnotSpans(
const Array<int> &rf);
240 void GetMasterEdgePieceOffsets(
int mid, Array<int> &os);
243 int AuxiliaryEdgeNE(
int aux_edge);
254 void GetFaceOrdering(
int sf,
int n1,
int n2,
int v0,
int e1,
int e2,
255 Array<int> &perm)
const;
258 void FindAdditionalFacesSA(
259 std::map<std::pair<int, int>,
int> &v2f,
260 std::set<int> &addParentFaces,
261 std::vector<FacePairInfo> &facePairs);
264 void ProcessFacePairs(
int start,
int midStart,
265 const std::vector<std::array<int, 2>> &parentSize,
266 std::vector<int> &parentVerts,
267 const std::vector<FacePairInfo> &facePairs);
270 void ProcessVertexToKnot2D(
const VertexToKnotSpan &v2k,
271 std::set<int> &reversedParents,
272 std::vector<EdgePairInfo> &edgePairs);
275 void ProcessVertexToKnot3D(
const VertexToKnotSpan &v2k,
276 const std::map<std::pair<int, int>,
int> &v2f,
277 std::vector<std::array<int, 2>> &parentSize,
278 std::vector<EdgePairInfo> &edgePairs,
279 std::vector<FacePairInfo> &facePairs,
280 std::vector<int> &parentFaces,
281 std::vector<int> &parentVerts);
284 void SetDofToPatch()
override;
287 void GetAuxFaceToPatchTable(Array2D<int> &auxface2patch);
288 void GetSlaveFaceToPatchTable(Array2D<int> &sface2patch);
291 void Refine(
bool coarsened,
const Array<int> *rf =
nullptr);
294 void GetAuxEdgeVertices(
int auxEdge, Array<int> &verts)
const;
297 void GetAuxFaceVertices(
int auxFace, Array<int> &verts)
const;
300 void GetAuxFaceEdges(
int auxFace, Array<int> &edges)
const;
303 void SlaveEdgeToParent(
int se,
int parent,
const Array<int> &os,
304 const std::vector<int> &parentVerts,
308 void GetMasterEdgeEntities(
int edge, Array<int> &edgeV, Array<int> &edgeE,
309 Array<int> &edgeVki);
312 void UpdateCoarseKVF();
319 void ReadCoarsePatchCP(std::istream &input)
override;
322 void PrintCoarsePatches(std::ostream &os)
override;
324 std::vector<Array<int>> auxef;