1 // File: MeshDS_Mesh2d.gxx
2 // Created: Tue May 11 16:01:57 1993
3 // Author: Didier PIFFAULT
7 //=======================================================================
8 //function : MeshDS_Mesh2d
10 //=======================================================================
11 MeshDS_Mesh2d::MeshDS_Mesh2d(const MeshDS_BaseAllocator& theAlloc,
12 const Standard_Integer NodeNumber)
13 : myNodes(NodeNumber+3),
15 myLinks(NodeNumber*3),
17 myElements(NodeNumber*2),
18 // Not_Debuged_Yet myDelElements(theAlloc),
19 myElemOfDomain(NodeNumber*2,theAlloc),
20 myLinkOfDomain(NodeNumber*2,theAlloc)
22 myAllocator = theAlloc;
25 //=======================================================================
28 //=======================================================================
29 Standard_Integer MeshDS_Mesh2d::AddNode(const Node& theNode)
31 Standard_Integer NodeIndex=myNodes.FindIndex(theNode);
32 if (NodeIndex>0 && !myDelNodes.IsEmpty()) {
33 if (myNodes.FindKey(NodeIndex).Movability()==MeshDS_Deleted)
37 MeshDS_ListOfInteger thelist(myAllocator);
38 if (!myDelNodes.IsEmpty()) {
39 NodeIndex=myDelNodes.First();
40 myNodes.Substitute(NodeIndex, theNode, thelist);
41 myDelNodes.RemoveFirst();
44 NodeIndex=myNodes.Add(theNode, thelist);
50 //=======================================================================
53 //=======================================================================
54 const Node& MeshDS_Mesh2d::GetNode(const Standard_Integer Index)
56 return myNodes.FindKey(Index);
59 //=======================================================================
60 //function : GetNodeList
62 //=======================================================================
63 const MeshDS_ListOfInteger& MeshDS_Mesh2d::GetNodeList(const Standard_Integer Index)
65 return myNodes.FindFromIndex(Index);
68 //=======================================================================
69 //function : ForceRemoveNode
71 //=======================================================================
72 void MeshDS_Mesh2d::ForceRemoveNode(const Standard_Integer Index)
74 //Warning, the static cast from const& to & is called for
75 //performance reasons. This is applicable only in case if later
76 //modification of element (field movability) does not influent on
78 Node& vref=(Node&)myNodes.FindKey(Index);
79 if ( myNodes.FindFromIndex(Index).Extent()==0) {
80 vref.SetMovability(MeshDS_Deleted);
81 myDelNodes.Append(Index);
85 //=======================================================================
86 //function : ReplaceNodes
88 //=======================================================================
89 void MeshDS_Mesh2d::ReplaceNodes(const MeshDS_IDMapOfNode& NewNodes)
91 if (NewNodes.IsEmpty() || NewNodes.Extent() != myNodes.Extent())
93 /*for (Standard_Integer i = 1; i <= myNodes.Extent(); i++)
96 myNodes.Assign(NewNodes);
99 //=======================================================================
100 //function : ForceRemoveLink
102 //=======================================================================
103 void MeshDS_Mesh2d::ForceRemoveLink(const Standard_Integer Index)
105 //Warning, the static cast from const& to & is called for
106 //performance reasons. This is applicable only in case if later
107 //modification of element (field movability) does not influent on
109 Link& lref=(Link&)myLinks.FindKey(Index);
110 if (lref.Movability()!=MeshDS_Deleted) {
111 if (myLinks.FindFromIndex(Index).Extent()==0) {
112 MeshDS_ListOfInteger::Iterator tit;
113 MeshDS_ListOfInteger& aList1 = myNodes(lref.FirstNode());
114 for(tit.Init(aList1); tit.More(); tit.Next()){
115 if (tit.Value()==Index) {
121 MeshDS_ListOfInteger& aList2 = myNodes(lref.LastNode());
122 for(tit.Init(aList2); tit.More(); tit.Next()){
123 if (tit.Value()==Index) {
128 myLinkOfDomain.Remove(Index);
129 lref.SetMovability(MeshDS_Deleted);
130 myDelLinks.Append(Index);
135 //=======================================================================
136 //function : RemoveNode
138 //=======================================================================
139 void MeshDS_Mesh2d::RemoveNode(const Standard_Integer Index)
141 //Warning, the static cast from const& to & is called for
142 //performance reasons. This is applicable only in case if later
143 //modification of element (field movability) does not influent on
145 Node& vref=(Node&)myNodes.FindKey(Index);
146 if (vref.Movability()==MeshDS_Free &&
147 myNodes.FindFromIndex(Index).Extent()==0) {
148 vref.SetMovability(MeshDS_Deleted);
149 myDelNodes.Append(Index);
153 //=======================================================================
154 //function : MoveNode
156 //=======================================================================
157 Standard_Boolean MeshDS_Mesh2d::MoveNode(const Standard_Integer Index,
160 if (myNodes.FindIndex(newNode)==0) {
161 Node vref(myNodes.FindKey(Index));
162 const MeshDS_ListOfInteger& refLink=myNodes(Index);
163 vref.SetMovability(MeshDS_Deleted);
164 myNodes.Substitute(Index, vref, refLink);
165 myNodes.Substitute(Index, newNode, refLink);
166 return Standard_True;
168 return Standard_False;
171 //=======================================================================
174 //=======================================================================
175 Standard_Integer MeshDS_Mesh2d::NbNodes()const
177 return myNodes.Extent();
180 //=======================================================================
183 //=======================================================================
184 Standard_Integer MeshDS_Mesh2d::AddLink(const Link& theLink)
186 Standard_Integer LinkIndex=myLinks.FindIndex(theLink);
188 MeshDS_PairOfIndex aPair;
189 if (!myDelLinks.IsEmpty()) {
190 LinkIndex=myDelLinks.First();
191 myLinks.Substitute(LinkIndex, theLink, aPair);
192 myDelLinks.RemoveFirst();
195 LinkIndex=myLinks.Add(theLink, aPair);
197 myNodes(theLink.FirstNode()).Append(Abs(LinkIndex));
198 myNodes(theLink.LastNode()).Append(Abs(LinkIndex));
199 myLinkOfDomain.Add(LinkIndex);
201 else if (!theLink.SameOrientation(myLinks.FindKey(LinkIndex)))
202 LinkIndex=-LinkIndex;
207 //=======================================================================
210 //=======================================================================
211 const Link& MeshDS_Mesh2d::GetLink(const Standard_Integer Index)
213 return myLinks.FindKey(Index);
216 //=======================================================================
217 //function : RemoveLink
219 //=======================================================================
220 void MeshDS_Mesh2d::RemoveLink(const Standard_Integer Index)
222 //Warning, the static cast from const& to & is called for
223 //performance reasons. This is applicable only in case if later
224 //modification of element (field movability) does not influent on
226 Link& lref=(Link&)myLinks.FindKey(Index);
227 if (lref.Movability()!=MeshDS_Deleted) {
228 if (lref.Movability()==MeshDS_Free &&
229 myLinks.FindFromIndex(Index).Extent()==0) {
230 MeshDS_ListOfInteger::Iterator tit;
231 MeshDS_ListOfInteger& aList1 = myNodes(lref.FirstNode());
232 for(tit.Init(aList1); tit.More(); tit.Next()){
233 if (tit.Value()==Index) {
238 MeshDS_ListOfInteger& aList2 = myNodes(lref.LastNode());
239 for(tit.Init(aList2); tit.More(); tit.Next()){
240 if (tit.Value()==Index) {
245 myLinkOfDomain.Remove(Index);
246 lref.SetMovability(MeshDS_Deleted);
247 myDelLinks.Append(Index);
252 //=======================================================================
253 //function : SubstituteLink
255 //=======================================================================
256 Standard_Boolean MeshDS_Mesh2d::SubstituteLink(const Standard_Integer Index,
259 //MeshDS_ListOfInteger thelist(myAllocator);
260 MeshDS_PairOfIndex aPair;
261 Link lref=myLinks.FindKey(Index);
262 if (lref.Movability()==MeshDS_Deleted)
263 myLinks.Substitute(Index, newLink, aPair);
265 if (myLinks.FindIndex(newLink)!=0)
266 return Standard_False;
268 lref.SetMovability(MeshDS_Deleted);
269 myLinks.Substitute(Index, lref, aPair);
271 MeshDS_ListOfInteger::Iterator tit;
272 for(tit.Init(myNodes(lref.FirstNode())); tit.More(); tit.Next()){
273 if (tit.Value()==Index) {
274 myNodes(lref.FirstNode()).Remove(tit);
278 for(tit.Init(myNodes(lref.LastNode())); tit.More(); tit.Next()){
279 if (tit.Value()==Index) {
280 myNodes(lref.LastNode()).Remove(tit);
284 myLinks.Substitute(Index, newLink, aPair);
285 myNodes(newLink.FirstNode()).Append(Abs(Index));
286 myNodes(newLink.LastNode()).Append(Abs(Index));
288 return Standard_True;
291 //=======================================================================
294 //=======================================================================
295 Standard_Integer MeshDS_Mesh2d::NbLinks()const
297 return myLinks.Extent();
300 //=======================================================================
301 //function : AddElement
303 //=======================================================================
304 Standard_Integer MeshDS_Mesh2d::AddElement(const Element& theElement)
306 Standard_Integer ElemIndex=myElements.FindIndex(theElement);
310 if (!myDelElements.IsEmpty()) {
311 ElemIndex=myDelElements.First();
312 myElements.Substitute(ElemIndex, theElement);
313 myDelElements.RemoveFirst();
316 ElemIndex=myElements.Add(theElement);
318 myElemOfDomain.Add(ElemIndex);
320 Standard_Integer ed1, ed2, ed3;
321 Standard_Boolean or1, or2, or3;
322 theElement.Edges(ed1, ed2, ed3, or1, or2, or3);
323 myLinks(ed1).Append(ElemIndex);
324 myLinks(ed2).Append(ElemIndex);
325 myLinks(ed3).Append(ElemIndex);
331 //=======================================================================
332 //function : GetElement
334 //=======================================================================
335 const Element& MeshDS_Mesh2d::GetElement(const Standard_Integer Index)
337 return myElements.FindKey(Index);
340 //=======================================================================
341 //function : RemoveElement
343 //=======================================================================
344 void MeshDS_Mesh2d::RemoveElement(const Standard_Integer Index)
346 //Warning, the static cast from const& to & is called for
347 //performance reasons. This is applicable only in case if later
348 //modification of element (field movability) does not influent on
350 Element& lelem=(Element&)myElements.FindKey(Index);
351 if (lelem.Movability()!=MeshDS_Deleted) {
352 ClearElement(Index, lelem);
353 lelem.SetMovability(MeshDS_Deleted);
354 // Not_Debuged_Yet myDelElements.Append(Index);
355 myElemOfDomain.Remove(Index);
359 static void removeElementIndex(MeshDS_PairOfIndex& thePair,
360 const Standard_Integer Index)
362 for(Standard_Integer i = 1, n = thePair.Extent(); i <= n; i++) {
363 if (thePair.Index(i)==Index) {
364 thePair.RemoveIndex(i);
370 void MeshDS_Mesh2d::ClearElement(const Standard_Integer Index,
371 const Element& theElem)
373 if (theElem.Movability()==MeshDS_Free) {
374 Standard_Integer ed1, ed2, ed3;
375 Standard_Boolean or1, or2, or3;
376 theElem.Edges(ed1, ed2, ed3, or1, or2, or3);
377 removeElementIndex(myLinks(ed1),Index);
378 removeElementIndex(myLinks(ed2),Index);
379 removeElementIndex(myLinks(ed3),Index);
383 //=======================================================================
384 //function : SubstituteElement
386 //=======================================================================
387 Standard_Boolean MeshDS_Mesh2d::SubstituteElement
388 (const Standard_Integer Index, const Element& newElement)
390 const Element& lelem=myElements.FindKey(Index);
391 if (lelem.Movability()==MeshDS_Deleted)
392 myElements.Substitute(Index, newElement);
394 if (myElements.FindIndex(newElement)==0) {
395 ClearElement(Index, lelem);
396 // Warning: here new element and old element should have different Hash code
397 myElements.Substitute(Index, newElement);
399 Standard_Integer ed1, ed2, ed3;
400 Standard_Boolean or1, or2, or3;
401 newElement.Edges(ed1, ed2, ed3, or1, or2, or3);
402 myLinks(ed1).Append(Index);
403 myLinks(ed2).Append(Index);
404 myLinks(ed3).Append(Index);
406 else return Standard_False;
408 return Standard_True;
411 //=======================================================================
412 //function : ClearDomain
414 //=======================================================================
415 void MeshDS_Mesh2d::ClearDomain()
417 MeshDS_MapOfInteger freeEdges;
418 Standard_Integer ed1, ed2, ed3;
419 Standard_Boolean or1, or2, or3;
420 MeshDS_MapOfInteger::Iterator itDom(myElemOfDomain);
421 //Warning, the static cast from const& to & is called for
422 //performance reasons. This is applicable only in case if later
423 //modification of element (field movability) does not influent on
425 for (;itDom.More(); itDom.Next()) {
426 Element& lelem=(Element&)myElements.FindKey(itDom.Key());
427 lelem.Edges(ed1, ed2, ed3, or1, or2, or3);
431 ClearElement(itDom.Key(), lelem);
432 lelem.SetMovability(MeshDS_Deleted);
433 // Not_Debuged_Yet myDelElements.Append(itDom.Key());
435 myElemOfDomain.Clear();
436 MeshDS_MapOfInteger::Iterator edgeIt(freeEdges);
437 for (; edgeIt.More(); edgeIt.Next())
438 RemoveLink(edgeIt.Key());
441 //=======================================================================
442 //function : NbElements
444 //=======================================================================
445 Standard_Integer MeshDS_Mesh2d::NbElements()const
447 return myElements.Extent();
450 //=======================================================================
453 //=======================================================================
454 Standard_Integer MeshDS_Mesh2d::IndexOf(const Node& aNode)const
456 return myNodes.FindIndex(aNode);
459 //=======================================================================
462 //=======================================================================
463 Standard_Integer MeshDS_Mesh2d::IndexOf(const Link& aLink)const
465 return myLinks.FindIndex(aLink);
468 //=======================================================================
471 //=======================================================================
472 Standard_Integer MeshDS_Mesh2d::IndexOf(const Element& anElement)const
474 return myElements.FindIndex(anElement);
477 //=======================================================================
478 //function : LinkNeighboursOf
480 //=======================================================================
481 const MeshDS_ListOfInteger& MeshDS_Mesh2d::LinkNeighboursOf
482 (const Standard_Integer theNode)const
484 return myNodes.FindFromIndex(theNode);
487 //=======================================================================
488 //function : ElemConnectedTo
490 //=======================================================================
491 const MeshDS_PairOfIndex& MeshDS_Mesh2d::ElemConnectedTo
492 (const Standard_Integer theLink)const
494 return myLinks.FindFromIndex(theLink);
497 //=======================================================================
498 //function : ElemOfDomain
500 //=======================================================================
501 const MeshDS_MapOfInteger& MeshDS_Mesh2d::ElemOfDomain () const
503 return myElemOfDomain;
506 //=======================================================================
507 //function : LinkOfDomain
509 //=======================================================================
510 const MeshDS_MapOfInteger& MeshDS_Mesh2d::LinkOfDomain () const
512 return myLinkOfDomain;
515 //=======================================================================
516 //function : ClearDeleted
518 //=======================================================================
519 void MeshDS_Mesh2d::ClearDeleted()
522 // Traitement des Elements
524 Standard_Integer IndexDelItem;
526 Standard_Integer lastNonDelItem=myElements.Extent();
527 /* // Not_Debuged_Yet
528 while (!myDelElements.IsEmpty()) {
529 while (lastNonDelItem>0) {
530 if (myElements.FindKey(lastNonDelItem).Movability()!=MeshDS_Deleted)
532 myElements.RemoveLast();
536 IndexDelItem=myDelElements.First();
537 myDelElements.RemoveFirst();
539 if (IndexDelItem<lastNonDelItem) {
540 Element eItem=myElements.FindKey(lastNonDelItem);
541 myElements.RemoveLast();
542 myElements.Substitute(IndexDelItem, eItem);
543 myElemOfDomain.Remove(lastNonDelItem);
544 myElemOfDomain.Add(IndexDelItem);
547 Standard_Integer ed[3], ied;
548 Standard_Boolean orient[3];
549 eItem.Edges(ed[0], ed[1], ed[2], orient[0], orient[1], orient[2]);
550 MeshDS_ListOfInteger::Iterator itList;
551 for (ied=0; ied<3; ied++) {
552 MeshDS_PairOfIndex& aPair = myLinks(ed[ied]);
553 for(Standard_Integer j = 1, jn = aPair.Extent(); j <= jn; j++)
554 if (aPair.Index(j)==(lastNonDelItem+1)) {
555 aPair.SetIndex(j,IndexDelItem);
563 // Traitement des Links
565 lastNonDelItem=myLinks.Extent();
567 while (!myDelLinks.IsEmpty()) {
568 while (lastNonDelItem>0) {
569 if (myLinks.FindKey(lastNonDelItem).Movability()!=MeshDS_Deleted)
571 myLinks.RemoveLast();
575 IndexDelItem=myDelLinks.First();
576 myDelLinks.RemoveFirst();
578 if (IndexDelItem<lastNonDelItem) {
579 Link lItem=myLinks.FindKey(lastNonDelItem);
580 MeshDS_PairOfIndex Data(myLinks(lastNonDelItem));
581 myLinks.RemoveLast();
582 myLinks.Substitute(IndexDelItem, lItem, Data);
583 myLinkOfDomain.Remove(lastNonDelItem);
584 myLinkOfDomain.Add(IndexDelItem);
587 Standard_Integer iv[2], ivx;
588 iv[0]=lItem.FirstNode();
589 iv[1]=lItem.LastNode();
591 MeshDS_ListOfInteger::Iterator itLis;
592 for (ivx=0; ivx<2; ivx++) {
593 for (itLis.Init(myNodes(iv[ivx]));
594 itLis.More(); itLis.Next()) {
595 if (itLis.Value()==(lastNonDelItem+1)) {
596 itLis.ChangeValue()=IndexDelItem;
601 for(Standard_Integer j = 1, jn = Data.Extent(); j <= jn; j++) {
602 const Element& Elem=myElements.FindKey(Data.Index(j));
604 Standard_Integer el[3], iel;
605 Standard_Boolean orl[3];
606 Elem.Edges(el[0], el[1], el[2], orl[0], orl[1], orl[2]);
607 for (iel=0; iel<3; iel++) {
608 if (el[iel]==lastNonDelItem+1) {
609 el[iel]=IndexDelItem;
613 myElements.Substitute(itLis.Value(),
614 Element(el[0], el[1], el[2],
615 orl[0], orl[1], orl[2],
616 Elem.Movability() ));
622 // Traitement des Nodes :
624 lastNonDelItem=myNodes.Extent();
626 while (!myDelNodes.IsEmpty()) {
627 while (lastNonDelItem>0) {
628 if (myNodes.FindKey(lastNonDelItem).Movability()!=MeshDS_Deleted)
630 myNodes.RemoveLast();
633 IndexDelItem=myDelNodes.First();
634 myDelNodes.RemoveFirst();
636 if (IndexDelItem<lastNonDelItem) {
637 Node nItem=myNodes.FindKey(lastNonDelItem);
638 MeshDS_ListOfInteger Data;
639 Data.Append(myNodes(lastNonDelItem));
640 myNodes.RemoveLast();
642 myNodes.Substitute(IndexDelItem, nItem, Data);
644 MeshDS_ListOfInteger::Iterator itLi;
645 for (itLi.Init(Data); itLi.More(); itLi.Next()) {
646 const Link& li=myLinks.FindKey(itLi.Value());
647 MeshDS_PairOfIndex conx(myLinks(itLi.Value()));
648 Standard_Integer iv1=li.FirstNode();
649 Standard_Integer iv2=li.LastNode();
650 if (iv1==lastNonDelItem+1) iv1=IndexDelItem;
651 else if (iv2==lastNonDelItem+1) iv2=IndexDelItem;
653 myLinks.Substitute(itLi.Value(),
654 Link(iv1, iv2, li.Movability()), conx);
660 //=======================================================================
661 //function : Statistics
663 //=======================================================================
664 void MeshDS_Mesh2d::Statistics(Standard_OStream& S) const
666 S << " Map de nodes : \n";
667 myNodes.Statistics(S);
668 S << "\n Deleted nodes : " << myDelNodes.Extent() << endl;
670 S << "\n\n Map de Links : \n";
671 myLinks.Statistics(S);
672 S << "\n Deleted links : " << myDelLinks.Extent() << endl;
674 S << "\n\n Map d elements : \n";
675 myElements.Statistics(S);
676 // Not_Debuged_Yet S << "\n Deleted elements : " << myDelElements.Extent() << endl;
679 //=======================================================================
680 //function : Allocator()
682 //=======================================================================
683 const MeshDS_BaseAllocator& MeshDS_Mesh2d::Allocator() const