binaryTree.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2016-2018 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "binaryTree.H"
27 #include "SortableList.H"
28 
29 // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
30 
31 template<class CompType, class ThermoType>
33 (
34  chP*& phi0,
35  bn*& newNode
36 )
37 {
38  if (phi0 == phi0->node()->leafRight())// phi0 is on the right
39  {
40  phi0->node()->leafRight() = nullptr;
41  phi0->node()->nodeRight() = newNode;
42  return;
43  }
44  else if (phi0 == phi0->node()->leafLeft())// phi0 is on the left
45  {
46  phi0->node()->leafLeft() = nullptr;
47  phi0->node()->nodeLeft() = newNode;
48  return;
49 
50  }
51 
52  // if we reach this point, there is an issue with the addressing
54  << "trying to insert a node with a wrong pointer to a chemPoint"
55  << exit(FatalError);
56 }
57 
58 
59 template<class CompType, class ThermoType>
61 (
62  const scalarField& phiq,
63  bn* y,
64  chP* x
65 )
66 {
67  if ((n2ndSearch_ < max2ndSearch_) && (y!=nullptr))
68  {
69  scalar vPhi = 0;
70  const scalarField& v = y->v();
71  const scalar a = y->a();
72  // compute v*phi
73  for (label i=0; i<phiq.size(); i++)
74  {
75  vPhi += phiq[i]*v[i];
76  }
77  if (vPhi <= a)// on the left side of the node
78  {
79  if (y->nodeLeft() == nullptr)// left is a chemPoint
80  {
81  n2ndSearch_++;
82  if (y->leafLeft()->inEOA(phiq))
83  {
84  x = y->leafLeft();
85  return true;
86  }
87  }
88  else // the left side is a node
89  {
90  if (inSubTree(phiq, y->nodeLeft(),x))
91  {
92  return true;
93  }
94  }
95 
96  // not on the left side, try the right side
97  if ((n2ndSearch_ < max2ndSearch_) && y->nodeRight() == nullptr)
98  {
99  n2ndSearch_++;
100  // we reach the end of the subTree we can return the result
101  if (y->leafRight()->inEOA(phiq))
102  {
103  x = y->leafRight();
104  return true;
105  }
106  else
107  {
108  x = nullptr;
109  return false;
110  }
111  }
112  else // test for n2ndSearch is done in the call of inSubTree
113  {
114  return inSubTree(phiq, y->nodeRight(),x);
115  }
116  }
117  else // on right side (symmetric of above)
118  {
119  if (y->nodeRight() == nullptr)
120  {
121  n2ndSearch_++;
122  if (y->leafRight()->inEOA(phiq))
123  {
124  return true;
125  }
126  }
127  else // the right side is a node
128  {
129  if (inSubTree(phiq, y->nodeRight(),x))
130  {
131  x = y->leafRight();
132  return true;
133  }
134  }
135  // if we reach this point, the retrieve has
136  // failed on the right side, explore the left side
137  if ((n2ndSearch_ < max2ndSearch_) && y->nodeLeft() == nullptr)
138  {
139  n2ndSearch_++;
140  if (y->leafLeft()->inEOA(phiq))
141  {
142  x = y->leafLeft();
143  return true;
144  }
145  else
146  {
147  x = nullptr;
148  return false;
149  }
150  }
151  else
152  {
153  return inSubTree(phiq, y->nodeLeft(),x);
154  }
155  }
156  }
157  else
158  {
159  return false;
160  }
161 }
162 
163 
164 template<class CompType, class ThermoType>
166 {
167  if (subTreeRoot != nullptr)
168  {
169  deleteDemandDrivenData(subTreeRoot->leafLeft());
170  deleteDemandDrivenData(subTreeRoot->leafRight());
171  deleteSubTree(subTreeRoot->nodeLeft());
172  deleteSubTree(subTreeRoot->nodeRight());
173  deleteDemandDrivenData(subTreeRoot);
174  }
175 }
176 
177 
178 template<class CompType, class ThermoType>
180 {
181  if (v != nullptr)
182  {
183  // u is root_
184  if (u->parent() == nullptr)
185  {
186  root_ = v;
187  }
188  // u is on the left of its parent
189  else if (u == u->parent()->nodeLeft())
190  {
191  u->parent()->nodeLeft() = v;
192  }
193  // u is ont the right of its parent
194  else if (u == u->parent()->nodeRight())
195  {
196  u->parent()->nodeRight() = v;
197  }
198  else
199  {
201  << "wrong addressing of the initial node"
202  << exit(FatalError);
203  }
204  v->parent() = u->parent();
205  }
206  else
207  {
209  << "trying to transplant a nullptr node"
210  << exit(FatalError);
211  }
212 }
213 
214 
215 template<class CompType, class ThermoType>
218 {
219  if (y->parent() != nullptr)
220  {
221  if (y == y->parent()->nodeLeft())// y is on the left, return right side
222  {
223  // might return nullptr if the right side is a node
224  return y->parent()->leafRight();
225  }
226  else if (y == y->parent()->nodeRight())
227  {
228  return y->parent()->leafLeft();
229  }
230  else
231  {
233  << "wrong addressing of the initial node"
234  << exit(FatalError);
235  return nullptr;
236  }
237  }
238 
239  // the binaryNode is root_ and has no sibling
240  return nullptr;
241 }
242 
243 
244 template<class CompType, class ThermoType>
247 {
248  if (size_>1)
249  {
250  if (x == x->node()->leafLeft())
251  {
252  // x is on the left, return right side
253  // might return nullptr if the right side is a node
254  return x->node()->leafRight();
255  }
256  else if (x == x->node()->leafRight())
257  {
258  // x is on the right, return left side
259  return x->node()->leafLeft();
260  }
261  else
262  {
264  << "wrong addressing of the initial leaf"
265  << exit(FatalError);
266  return nullptr;
267  }
268  }
269  // there is only one leaf attached to the root_, no sibling
270  return nullptr;
271 }
272 
273 
274 template<class CompType, class ThermoType>
277 {
278  if (y->parent()!=nullptr)
279  {
280  if (y == y->parent()->nodeLeft())
281  {
282  // y is on the left, return right side
283  return y->parent()->nodeRight();
284  }
285  else if (y == y->parent()->nodeRight())
286  {
287  return y->parent()->nodeLeft();
288  }
289  else
290  {
292  << "wrong addressing of the initial node"
293  << exit(FatalError);
294  return nullptr;
295  }
296  }
297  return nullptr;
298 }
299 
300 
301 template<class CompType, class ThermoType>
304 {
305  if (size_>1)
306  {
307  if (x == x->node()->leafLeft())
308  {
309  // x is on the left, return right side
310  return x->node()->nodeRight();
311  }
312  else if (x == x->node()->leafRight())
313  {
314  // x is on the right, return left side
315  return x->node()->nodeLeft();
316  }
317  else
318  {
320  << "wrong addressing of the initial leaf"
321  << exit(FatalError);
322  return nullptr;
323  }
324  }
325  return nullptr;
326 }
327 
328 
329 template<class CompType, class ThermoType>
331 {
332  if (subTreeRoot != nullptr)
333  {
334  deleteAllNode(subTreeRoot->nodeLeft());
335  deleteAllNode(subTreeRoot->nodeRight());
336  deleteDemandDrivenData(subTreeRoot);
337  }
338 }
339 
340 
341 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
342 
343 template<class CompType, class ThermoType>
345 (
347  dictionary coeffsDict
348 )
349 :
350  chemistry_(chemistry),
351  root_(nullptr),
352  maxNLeafs_(readLabel(coeffsDict.lookup("maxNLeafs"))),
353  size_(0),
354  n2ndSearch_(0),
355  max2ndSearch_(coeffsDict.lookupOrDefault("max2ndSearch",0)),
356  coeffsDict_(coeffsDict)
357 {}
358 
359 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
360 
361 template<class CompType, class ThermoType>
363 {
364  // when we reach the leaf, we return 0
365  if (subTreeRoot == nullptr)
366  {
367  return 0;
368  }
369  else
370  {
371  return
372  1
373  + max
374  (
375  depth(subTreeRoot->nodeLeft()),
376  depth(subTreeRoot->nodeRight())
377  );
378  }
379 }
380 
381 
382 template<class CompType, class ThermoType>
384 (
385  const scalarField& phiq,
386  const scalarField& Rphiq,
387  const scalarSquareMatrix& A,
388  const scalarField& scaleFactor,
389  const scalar& epsTol,
390  const label nCols,
391  chP*& phi0
392 )
393 {
394  if (size_ == 0) // no points are stored
395  {
396  // create an empty binary node and point root_ to it
397  root_ = new bn();
398  // create the new chemPoint which holds the composition point
399  // phiq and the data to initialize the EOA
400  chP* newChemPoint =
401  new chP
402  (
403  chemistry_,
404  phiq,
405  Rphiq,
406  A,
407  scaleFactor,
408  epsTol,
409  nCols,
410  coeffsDict_,
411  root_
412  );
413  root_->leafLeft()=newChemPoint;
414  }
415  else // at least one point stored
416  {
417  // no reference chemPoint, a BT search is required
418  if (phi0 == nullptr)
419  {
420  binaryTreeSearch(phiq, root_,phi0);
421  }
422  // access to the parent node of the chemPoint
423  bn* parentNode = phi0->node();
424 
425  // create the new chemPoint which holds the composition point
426  // phiq and the data to initialize the EOA
427  chP* newChemPoint =
428  new chP
429  (
430  chemistry_,
431  phiq,
432  Rphiq,
433  A,
434  scaleFactor,
435  epsTol,
436  nCols,
437  coeffsDict_
438  );
439  // insert new node on the parent node in the position of the
440  // previously stored leaf (phi0)
441  // the new node contains phi0 on the left and phiq on the right
442  // the hyper plane is computed in the binaryNode constructor
443  bn* newNode;
444  if (size_>1)
445  {
446  newNode = new bn(phi0, newChemPoint, parentNode);
447  // make the parent of phi0 point to the newly created node
448  insertNode(phi0, newNode);
449  }
450  else // size_ == 1 (because not equal to 0)
451  {
452  // when size is 1, the binaryNode is without hyperplane
453  deleteDemandDrivenData(root_);
454  newNode = new bn(phi0, newChemPoint, nullptr);
455  root_ = newNode;
456  }
457 
458  phi0->node() = newNode;
459  newChemPoint->node()=newNode;
460  }
461  size_++;
462 }
463 
464 
465 template<class CompType, class ThermoType>
467 (
468  const scalarField& phiq,
469  bn* node,
470  chP*& nearest
471 )
472 {
473  if (size_ > 1)
474  {
475  scalar vPhi=0.0;
476  const scalarField& v = node->v();
477  const scalar& a = node->a();
478  // compute v*phi
479  for (label i=0; i<phiq.size(); i++) vPhi += phiq[i]*v[i];
480 
481 
482  if (vPhi > a) // on right side (side of the newly added point)
483  {
484  if (node->nodeRight()!=nullptr)
485  {
486  binaryTreeSearch(phiq, node->nodeRight(), nearest);
487  }
488  else // the terminal node is reached, store leaf on the right
489  {
490  nearest = node->leafRight();
491  return;
492  }
493  }
494  else // on left side (side of the previously stored point)
495  {
496  if (node->nodeLeft()!=nullptr)
497  {
498  binaryTreeSearch(phiq, node->nodeLeft(), nearest);
499  }
500  else // the terminal node is reached, return element on right
501  {
502  nearest = node->leafLeft();
503  return;
504  }
505  }
506  }
507  // only one point stored (left element of the root)
508  else if (size_ == 1)
509  {
510  nearest = root_->leafLeft();
511  }
512  else // no point stored
513  {
514  nearest = nullptr;
515  }
516 }
517 
518 
519 template<class CompType, class ThermoType>
521 (
522  const scalarField& phiq,
523  chP*& x
524 )
525 {
526  // initialize n2ndSearch_
527  n2ndSearch_ = 0;
528  if ((n2ndSearch_ < max2ndSearch_) && (size_ > 1))
529  {
530  chP* xS = chemPSibling(x);
531  if (xS != nullptr)
532  {
533  n2ndSearch_++;
534  if (xS->inEOA(phiq))
535  {
536  x = xS;
537  return true;
538  }
539  }
540  else if (inSubTree(phiq, nodeSibling(x),x))
541  {
542  return true;
543  }
544  // if we reach this point, no leafs were found at this depth or lower
545  // we move upward in the tree
546  bn* y = x->node();
547  while((y->parent()!= nullptr) && (n2ndSearch_ < max2ndSearch_))
548  {
549  xS = chemPSibling(y);
550  if (xS != nullptr)
551  {
552  n2ndSearch_++;
553  if (xS->inEOA(phiq))
554  {
555  x=xS;
556  return true;
557  }
558  }
559  else if (inSubTree(phiq, nodeSibling(y),x))
560  {
561  return true;
562  }
563  y = y->parent();
564  }
565  // if we reach this point it is either because
566  // we did not find another covering EOA in the entire tree or
567  // we reach the maximum number of secondary search
568  return false;
569  }
570  else
571  {
572  return false;
573  }
574 }
575 
576 
577 template<class CompType, class ThermoType>
579 {
580  if (size_ == 1) // only one point is stored
581  {
583  deleteDemandDrivenData(root_);
584  }
585  else if (size_ > 1)
586  {
587  bn* z = phi0->node();
588  bn* x;
589  chP* siblingPhi0 = chemPSibling(phi0);
590 
591  if (siblingPhi0 != nullptr)// the sibling of phi0 is a chemPoint
592  {
593  // z was root (only two chemPoints in the tree)
594  if (z->parent() == nullptr)
595  {
596  root_ = new bn();
597  root_->leafLeft()=siblingPhi0;
598  siblingPhi0->node()=root_;
599  }
600  else if (z == z->parent()->nodeLeft())
601  {
602  z->parent()->leafLeft() = siblingPhi0;
603  z->parent()->nodeLeft() = nullptr;
604  siblingPhi0->node() = z->parent();
605  }
606  else if (z == z->parent()->nodeRight())
607  {
608  z->parent()->leafRight() = siblingPhi0;
609  z->parent()->nodeRight() = nullptr;
610  siblingPhi0->node() = z->parent();
611  }
612  else
613  {
615  << "wrong addressing of the initial leaf"
616  << exit(FatalError);
617  }
618  }
619  else
620  {
621  x = nodeSibling(phi0);
622  if (x !=nullptr)
623  {
624  transplant(z, x);
625  }
626  else
627  {
629  << "inconsistent structure of the tree, no leaf and no node"
630  << exit(FatalError);
631  }
632  }
635  }
636  size_--;
637 }
638 
639 
640 template<class CompType, class ThermoType>
642 {
643  scalarField mean(chemistry_.nEqns(),0.0);
644 
645  //1) walk through the entire tree by starting with the tree's most left
646  // chemPoint
647  chP* x = treeMin();
648  List<chP*> chemPoints(size_);
649  label chPi=0;
650  //2) compute the mean composition
651  while (x != nullptr)
652  {
653  const scalarField& phij = x->phi();
654  mean += phij;
655  chemPoints[chPi++] = x;
656  x = treeSuccessor(x);
657  }
658  mean /= size_;
659 
660  //3) compute the variance for each space direction
661  List<scalar> variance(chemistry_.nEqns(),0.0);
662  forAll(chemPoints, j)
663  {
664  const scalarField& phij = chemPoints[j]->phi();
665  forAll(variance, vi)
666  {
667  variance[vi] += sqr(phij[vi]-mean[vi]);
668  }
669  }
670 
671  //4) analyze what is the direction of the maximal variance
672  scalar maxVariance(-1.0);
673  label maxDir(-1);
674  forAll(variance, vi)
675  {
676  if (maxVariance < variance[vi])
677  {
678  maxVariance = variance[vi];
679  maxDir = vi;
680  }
681  }
682  // maxDir indicates the direction of maximum variance
683  // we create the new root node by taking the two extreme points
684  // in this direction if these extreme points were not deleted in the
685  // cleaning that come before the balance function they are still important
686  // and the tree should therefore take them into account
687  SortableList<scalar> phiMaxDir(chemPoints.size(),0.0);
688  forAll(chemPoints, j)
689  {
690  phiMaxDir[j] = chemPoints[j]->phi()[maxDir];
691  }
692 
693  phiMaxDir.sort();
694  // delete reference to all node since the tree is reshaped
695  deleteAllNode();
696  root_ = nullptr;
697 
698  // add the node for the two extremum
699  bn* newNode = new bn
700  (
701  chemPoints[phiMaxDir.indices()[0]],
702  chemPoints[phiMaxDir.indices()[phiMaxDir.size()-1]],
703  nullptr
704  );
705  root_ = newNode;
706 
707  chemPoints[phiMaxDir.indices()[0]]->node() = newNode;
708  chemPoints[phiMaxDir.indices()[phiMaxDir.size()-1]]->node() = newNode;
709 
710  for (label cpi=1; cpi<chemPoints.size()-1; cpi++)
711  {
712  chP* phi0;
713  binaryTreeSearch
714  (
715  chemPoints[phiMaxDir.indices()[cpi]]->phi(),
716  root_,
717  phi0
718  );
719  // add the chemPoint
720  bn* nodeToAdd =
721  new bn(phi0,chemPoints[phiMaxDir.indices()[cpi]], phi0->node());
722  // make the parent of phi0 point to the newly created node
723  insertNode(phi0, nodeToAdd);
724  phi0->node() = nodeToAdd;
725  chemPoints[phiMaxDir.indices()[cpi]]->node() = nodeToAdd;
726  }
727 }
728 
729 
730 template<class CompType, class ThermoType>
733 {
734  if (subTreeRoot!=nullptr)
735  {
736  while(subTreeRoot->nodeLeft() != nullptr)
737  {
738  subTreeRoot = subTreeRoot->nodeLeft();
739  }
740  return subTreeRoot->leafLeft();
741  }
742  else
743  {
744  return nullptr;
745  }
746 }
747 
748 
749 template<class CompType, class ThermoType>
752 {
753  if (size_>1)
754  {
755  if (x == x->node()->leafLeft())
756  {
757  if (x->node()->nodeRight() == nullptr)
758  {
759  return x->node()->leafRight();
760  }
761  else
762  {
763  return treeMin(x->node()->nodeRight());
764  }
765  }
766  else if (x == x->node()->leafRight())
767  {
768  bn* y = x->node();
769  while((y->parent() !=nullptr))
770  {
771  if (y == y->parent()->nodeLeft())
772  {
773  if (y->parent()->nodeRight() == nullptr)
774  {
775  return y->parent()->leafRight();
776  }
777  else
778  {
779  return treeMin(y->parent()->nodeRight());
780  }
781  }
782  y=y->parent();
783  }
784  // when we reach this point, y points to the root and
785  // never entered in the if loop (coming from the right)
786  // so we are at the tree maximum and there is no successor
787  return nullptr;
788  }
789  else
790  {
792  << "inconsistent structure of the tree, no leaf and no node"
793  << exit(FatalError);
794  return nullptr;
795  }
796  }
797 
798  return nullptr;
799 }
800 
801 
802 template<class CompType, class ThermoType>
804 {
805  // Recursively delete the element in the subTree
806  deleteSubTree();
807 
808  // Reset root node (should already be nullptr)
809  root_ = nullptr;
810 
811  // Reset size_
812  size_ = 0;
813 }
814 
815 
816 template<class CompType, class ThermoType>
818 {
819  return size_ >= maxNLeafs_;
820 }
821 
822 
823 template<class CompType, class ThermoType>
825 {
826  // Has to go along each chP of the tree
827  if (size_ > 0)
828  {
829  // First finds the first leaf
830  chP* chP0 = treeMin();
831  chP0->resetNumRetrieve();
832 
833  // Then go to each successor
834  chP* nextChP = treeSuccessor(chP0);
835  while (nextChP != nullptr)
836  {
837  nextChP->resetNumRetrieve();
838  nextChP = treeSuccessor(nextChP);
839  }
840  }
841 }
842 
843 
844 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
void resetNumRetrieve()
Definition: binaryTree.C:824
void sort()
(stable) sort the list (if changed after construction time)
Definition: SortableList.C:112
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
binaryNode< CompType, ThermoType > *& node()
error FatalError
A list of keyword definitions, which are a keyword followed by any number of values (e...
Definition: dictionary.H:158
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:319
chP * treeSuccessor(chP *x)
Definition: binaryTree.C:751
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: HashTable.H:59
A list that is sorted upon construction or when explicitly requested with the sort() method...
Definition: List.H:80
dimensionedSymmTensor sqr(const dimensionedVector &dv)
void balance()
Cheap balance function.
Definition: binaryTree.C:641
void size(const label)
Override size to be inconsistent with allocated storage.
Definition: ListI.H:163
void insertNewLeaf(const scalarField &phiq, const scalarField &Rphiq, const scalarSquareMatrix &A, const scalarField &scaleFactor, const scalar &epsTol, const label nCols, chP *&phi0)
Definition: binaryTree.C:384
Leaf of the binary tree. The chemPoint stores the composition &#39;phi&#39;, the mapping of this composition ...
const dimensionedScalar phi0
Magnetic flux quantum: default SI units: [Wb].
bool secondaryBTSearch(const scalarField &phiq, chP *&x)
Definition: binaryTree.C:521
const scalar & a() const
Definition: binaryNode.H:179
void binaryTreeSearch(const scalarField &phiq, bn *node, chP *&nearest)
Definition: binaryTree.C:467
binaryNode< CompType, ThermoType > *& parent()
Definition: binaryNode.H:162
Data storage of the chemistryOnLineLibrary according to a binary tree structure.
Definition: binaryTree.H:57
void clear()
Removes every entries of the tree and delete the associated objects.
Definition: binaryTree.C:803
Node of the binary tree.
Definition: binaryNode.H:49
binaryNode< CompType, ThermoType > *& nodeLeft()
Definition: binaryNode.H:152
label readLabel(Istream &is)
Definition: label.H:64
const scalarField & phi() const
const labelList & indices() const
Return the list of sorted indices. Updated every sort.
Definition: SortableList.H:96
volScalarField scalarField(fieldObject, mesh)
binaryTree(TDACChemistryModel< CompType, ThermoType > &chemistry, dictionary coeffsDict)
Constructors.
Definition: binaryTree.C:345
void resetNumRetrieve()
Resets the number of retrieves at each time step.
binaryNode< CompType, ThermoType > *& nodeRight()
Definition: binaryNode.H:157
chemPointISAT< CompType, ThermoType > *& leafLeft()
Access.
Definition: binaryNode.H:142
T lookupOrDefault(const word &, const T &, bool recursive=false, bool patternMatch=true) const
Find and return a T,.
void deleteLeaf(chP *&phi0)
Delete a leaf from the binary tree and reshape the binary tree for.
Definition: binaryTree.C:578
bool isFull()
ListFull.
Definition: binaryTree.C:817
bool inEOA(const scalarField &phiq)
To RETRIEVE the mapping from the stored chemPoint phi, the query.
const scalarField & v() const
Topology.
Definition: binaryNode.H:169
void deleteDemandDrivenData(DataPtr &dataPtr)
void deleteAllNode()
Definition: binaryTree.H:215
chemPointISAT< CompType, ThermoType > *& leafRight()
Definition: binaryNode.H:147
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
Definition: dictionary.C:583