meshToMesh.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | Copyright (C) 2012-2015 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 "meshToMesh.H"
27 #include "Time.H"
28 #include "globalIndex.H"
29 #include "meshToMeshMethod.H"
30 
31 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
32 
33 namespace Foam
34 {
35  defineTypeNameAndDebug(meshToMesh, 0);
36 
37  template<>
38  const char* Foam::NamedEnum
39  <
41  3
42  >::names[] =
43  {
44  "direct",
45  "mapNearest",
46  "cellVolumeWeight"
47  };
48 
51 }
52 
53 
54 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
55 
56 Foam::labelList Foam::meshToMesh::maskCells
57 (
58  const polyMesh& src,
59  const polyMesh& tgt
60 ) const
61 {
62  boundBox intersectBb
63  (
64  max(src.bounds().min(), tgt.bounds().min()),
65  min(src.bounds().max(), tgt.bounds().max())
66  );
67 
68  intersectBb.inflate(0.01);
69 
70  const cellList& srcCells = src.cells();
71  const faceList& srcFaces = src.faces();
72  const pointField& srcPts = src.points();
73 
75  forAll(srcCells, srcI)
76  {
77  boundBox cellBb(srcCells[srcI].points(srcFaces, srcPts), false);
78  if (intersectBb.overlaps(cellBb))
79  {
80  cells.append(srcI);
81  }
82  }
83 
84  if (debug)
85  {
86  Pout<< "participating source mesh cells: " << cells.size() << endl;
87  }
88 
89  return cells;
90 }
91 
92 
93 void Foam::meshToMesh::normaliseWeights
94 (
95  const word& descriptor,
96  const labelListList& addr,
97  scalarListList& wght
98 ) const
99 {
100  const label nCell = returnReduce(wght.size(), sumOp<label>());
101 
102  if (nCell > 0)
103  {
104  forAll(wght, cellI)
105  {
106  scalarList& w = wght[cellI];
107  scalar s = sum(w);
108 
109  forAll(w, i)
110  {
111  // note: normalise by s instead of cell volume since
112  // 1-to-1 methods duplicate contributions in parallel
113  w[i] /= s;
114  }
115  }
116  }
117 }
118 
119 
120 void Foam::meshToMesh::calcAddressing
121 (
122  const word& methodName,
123  const polyMesh& src,
124  const polyMesh& tgt
125 )
126 {
127  autoPtr<meshToMeshMethod> methodPtr
128  (
130  (
131  methodName,
132  src,
133  tgt
134  )
135  );
136 
137  methodPtr->calculate
138  (
139  srcToTgtCellAddr_,
140  srcToTgtCellWght_,
141  tgtToSrcCellAddr_,
142  tgtToSrcCellWght_
143  );
144 
145  V_ = methodPtr->V();
146 
147  if (debug)
148  {
149  methodPtr->writeConnectivity(src, tgt, srcToTgtCellAddr_);
150  }
151 }
152 
153 
154 void Foam::meshToMesh::calculate(const word& methodName)
155 {
156  Info<< "Creating mesh-to-mesh addressing for " << srcRegion_.name()
157  << " and " << tgtRegion_.name() << " regions using "
158  << methodName << endl;
159 
160  singleMeshProc_ = calcDistribution(srcRegion_, tgtRegion_);
161 
162  if (singleMeshProc_ == -1)
163  {
164  // create global indexing for src and tgt meshes
165  globalIndex globalSrcCells(srcRegion_.nCells());
166  globalIndex globalTgtCells(tgtRegion_.nCells());
167 
168  // Create processor map of overlapping cells. This map gets
169  // (possibly remote) cells from the tgt mesh such that they (together)
170  // cover all of the src mesh
171  autoPtr<mapDistribute> mapPtr = calcProcMap(srcRegion_, tgtRegion_);
172  const mapDistribute& map = mapPtr();
173 
174  pointField newTgtPoints;
175  faceList newTgtFaces;
176  labelList newTgtFaceOwners;
177  labelList newTgtFaceNeighbours;
178  labelList newTgtCellIDs;
179 
180  distributeAndMergeCells
181  (
182  map,
183  tgtRegion_,
184  globalTgtCells,
185  newTgtPoints,
186  newTgtFaces,
187  newTgtFaceOwners,
188  newTgtFaceNeighbours,
189  newTgtCellIDs
190  );
191 
192 
193  // create a new target mesh
194  polyMesh newTgt
195  (
196  IOobject
197  (
198  "newTgt." + Foam::name(Pstream::myProcNo()),
199  tgtRegion_.time().timeName(),
200  tgtRegion_.time(),
202  ),
203  xferMove(newTgtPoints),
204  xferMove(newTgtFaces),
205  xferMove(newTgtFaceOwners),
206  xferMove(newTgtFaceNeighbours),
207  false // no parallel comms
208  );
209 
210  // create some dummy patch info
212  patches[0] = new polyPatch
213  (
214  "defaultFaces",
215  newTgt.nFaces() - newTgt.nInternalFaces(),
216  newTgt.nInternalFaces(),
217  0,
218  newTgt.boundaryMesh(),
219  word::null
220  );
221 
222  newTgt.addPatches(patches);
223 
224  // force calculation of tet-base points used for point-in-cell
225  (void)newTgt.tetBasePtIs();
226 
227  // force construction of cell tree
228 // (void)newTgt.cellTree();
229 
230  if (debug)
231  {
232  Pout<< "Created newTgt mesh:" << nl
233  << " old cells = " << tgtRegion_.nCells()
234  << ", new cells = " << newTgt.nCells() << nl
235  << " old faces = " << tgtRegion_.nFaces()
236  << ", new faces = " << newTgt.nFaces() << endl;
237 
238  if (debug > 1)
239  {
240  Pout<< "Writing newTgt mesh: " << newTgt.name() << endl;
241  newTgt.write();
242  }
243  }
244 
245  calcAddressing(methodName, srcRegion_, newTgt);
246 
247  // per source cell the target cell address in newTgt mesh
248  forAll(srcToTgtCellAddr_, i)
249  {
250  labelList& addressing = srcToTgtCellAddr_[i];
251  forAll(addressing, addrI)
252  {
253  addressing[addrI] = newTgtCellIDs[addressing[addrI]];
254  }
255  }
256 
257  // convert target addresses in newTgtMesh into global cell numbering
258  forAll(tgtToSrcCellAddr_, i)
259  {
260  labelList& addressing = tgtToSrcCellAddr_[i];
261  forAll(addressing, addrI)
262  {
263  addressing[addrI] = globalSrcCells.toGlobal(addressing[addrI]);
264  }
265  }
266 
267  // set up as a reverse distribute
269  (
271  List<labelPair>(),
272  tgtRegion_.nCells(),
273  map.constructMap(),
274  map.subMap(),
275  tgtToSrcCellAddr_,
277  labelList()
278  );
279 
280  // set up as a reverse distribute
282  (
284  List<labelPair>(),
285  tgtRegion_.nCells(),
286  map.constructMap(),
287  map.subMap(),
288  tgtToSrcCellWght_,
290  scalarList()
291  );
292 
293  // weights normalisation
294  normaliseWeights
295  (
296  "source",
297  srcToTgtCellAddr_,
298  srcToTgtCellWght_
299  );
300 
301  normaliseWeights
302  (
303  "target",
304  tgtToSrcCellAddr_,
305  tgtToSrcCellWght_
306  );
307 
308  // cache maps and reset addresses
309  List<Map<label> > cMap;
310  srcMapPtr_.reset
311  (
312  new mapDistribute(globalSrcCells, tgtToSrcCellAddr_, cMap)
313  );
314  tgtMapPtr_.reset
315  (
316  new mapDistribute(globalTgtCells, srcToTgtCellAddr_, cMap)
317  );
318 
319  // collect volume intersection contributions
320  reduce(V_, sumOp<scalar>());
321  }
322  else
323  {
324  calcAddressing(methodName, srcRegion_, tgtRegion_);
325 
326  normaliseWeights
327  (
328  "source",
329  srcToTgtCellAddr_,
330  srcToTgtCellWght_
331  );
332 
333  normaliseWeights
334  (
335  "target",
336  tgtToSrcCellAddr_,
337  tgtToSrcCellWght_
338  );
339  }
340 
341  Info<< " Overlap volume: " << V_ << endl;
342 }
343 
344 
347 {
348  switch (method)
349  {
350  case imDirect:
351  {
353  break;
354  }
355  case imMapNearest:
356  {
358  break;
359  }
360  case imCellVolumeWeight:
361  {
363  break;
364  }
365  default:
366  {
368  (
369  "Foam::AMIPatchToPatchInterpolation::interpolationMethod"
370  "Foam::meshToMesh::interpolationMethodAMI"
371  "("
372  "const interpolationMethod method"
373  ") const"
374  )
375  << "Unhandled enumeration " << method
376  << abort(FatalError);
377  }
378  }
379 
381 }
382 
383 
384 void Foam::meshToMesh::calculatePatchAMIs(const word& AMIMethodName)
385 {
386  if (!patchAMIs_.empty())
387  {
388  FatalErrorIn("meshToMesh::calculatePatchAMIs()")
389  << "patch AMI already calculated"
390  << exit(FatalError);
391  }
392 
393  patchAMIs_.setSize(srcPatchID_.size());
394 
395  forAll(srcPatchID_, i)
396  {
397  label srcPatchI = srcPatchID_[i];
398  label tgtPatchI = tgtPatchID_[i];
399 
400  const polyPatch& srcPP = srcRegion_.boundaryMesh()[srcPatchI];
401  const polyPatch& tgtPP = tgtRegion_.boundaryMesh()[tgtPatchI];
402 
403  Info<< "Creating AMI between source patch " << srcPP.name()
404  << " and target patch " << tgtPP.name()
405  << " using " << AMIMethodName
406  << endl;
407 
408  Info<< incrIndent;
409 
410  patchAMIs_.set
411  (
412  i,
414  (
415  srcPP,
416  tgtPP,
418  false,
419  AMIMethodName,
420  -1,
421  true // flip target patch since patch normals are aligned
422  )
423  );
424 
425  Info<< decrIndent;
426  }
427 }
428 
429 
430 void Foam::meshToMesh::constructNoCuttingPatches
431 (
432  const word& methodName,
433  const word& AMIMethodName,
434  const bool interpAllPatches
435 )
436 {
437  if (interpAllPatches)
438  {
439  const polyBoundaryMesh& srcBM = srcRegion_.boundaryMesh();
440  const polyBoundaryMesh& tgtBM = tgtRegion_.boundaryMesh();
441 
442  DynamicList<label> srcPatchID(srcBM.size());
443  DynamicList<label> tgtPatchID(tgtBM.size());
444  forAll(srcBM, patchI)
445  {
446  const polyPatch& pp = srcBM[patchI];
447  if (!polyPatch::constraintType(pp.type()))
448  {
449  srcPatchID.append(pp.index());
450 
451  label tgtPatchI = tgtBM.findPatchID(pp.name());
452 
453  if (tgtPatchI != -1)
454  {
455  tgtPatchID.append(tgtPatchI);
456  }
457  else
458  {
460  (
461  "Foam::meshToMesh::meshToMesh"
462  "("
463  "const polyMesh&, "
464  "const polyMesh&, "
465  "const interpolationMethod&, "
466  "bool"
467  ")"
468  ) << "Source patch " << pp.name()
469  << " not found in target mesh. "
470  << "Available target patches are " << tgtBM.names()
471  << exit(FatalError);
472  }
473  }
474  }
475 
476  srcPatchID_.transfer(srcPatchID);
477  tgtPatchID_.transfer(tgtPatchID);
478  }
479 
480  // calculate volume addressing and weights
481  calculate(methodName);
482 
483  // calculate patch addressing and weights
484  calculatePatchAMIs(AMIMethodName);
485 }
486 
487 
488 void Foam::meshToMesh::constructFromCuttingPatches
489 (
490  const word& methodName,
491  const word& AMIMethodName,
492  const HashTable<word>& patchMap,
493  const wordList& cuttingPatches
494 )
495 {
496  srcPatchID_.setSize(patchMap.size());
497  tgtPatchID_.setSize(patchMap.size());
498 
499  label i = 0;
500  forAllConstIter(HashTable<word>, patchMap, iter)
501  {
502  const word& tgtPatchName = iter.key();
503  const word& srcPatchName = iter();
504 
505  const polyPatch& srcPatch = srcRegion_.boundaryMesh()[srcPatchName];
506  const polyPatch& tgtPatch = tgtRegion_.boundaryMesh()[tgtPatchName];
507 
508  srcPatchID_[i] = srcPatch.index();
509  tgtPatchID_[i] = tgtPatch.index();
510  i++;
511  }
512 
513  // calculate volume addressing and weights
514  calculate(methodName);
515 
516  // calculate patch addressing and weights
517  calculatePatchAMIs(AMIMethodName);
518 
519  // set IDs of cutting patches on target mesh
520  cuttingPatches_.setSize(cuttingPatches.size());
521  forAll(cuttingPatches_, i)
522  {
523  const word& patchName = cuttingPatches[i];
524  cuttingPatches_[i] = tgtRegion_.boundaryMesh().findPatchID(patchName);
525  }
526 }
527 
528 
529 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
530 
531 Foam::meshToMesh::meshToMesh
532 (
533  const polyMesh& src,
534  const polyMesh& tgt,
535  const interpolationMethod& method,
536  bool interpAllPatches
537 )
538 :
539  srcRegion_(src),
540  tgtRegion_(tgt),
541  srcPatchID_(),
542  tgtPatchID_(),
543  patchAMIs_(),
544  cuttingPatches_(),
545  srcToTgtCellAddr_(),
546  tgtToSrcCellAddr_(),
547  srcToTgtCellWght_(),
548  tgtToSrcCellWght_(),
549  V_(0.0),
550  singleMeshProc_(-1),
551  srcMapPtr_(NULL),
552  tgtMapPtr_(NULL)
553 {
554  constructNoCuttingPatches
555  (
556  interpolationMethodNames_[method],
558  (
559  interpolationMethodAMI(method)
560  ),
561  interpAllPatches
562  );
563 }
564 
565 
566 Foam::meshToMesh::meshToMesh
567 (
568  const polyMesh& src,
569  const polyMesh& tgt,
570  const word& methodName,
571  const word& AMIMethodName,
572  bool interpAllPatches
573 )
574 :
575  srcRegion_(src),
576  tgtRegion_(tgt),
577  srcPatchID_(),
578  tgtPatchID_(),
579  patchAMIs_(),
580  cuttingPatches_(),
581  srcToTgtCellAddr_(),
582  tgtToSrcCellAddr_(),
583  srcToTgtCellWght_(),
584  tgtToSrcCellWght_(),
585  V_(0.0),
586  singleMeshProc_(-1),
587  srcMapPtr_(NULL),
588  tgtMapPtr_(NULL)
589 {
590  constructNoCuttingPatches(methodName, AMIMethodName, interpAllPatches);
591 }
592 
593 
594 Foam::meshToMesh::meshToMesh
595 (
596  const polyMesh& src,
597  const polyMesh& tgt,
598  const interpolationMethod& method,
599  const HashTable<word>& patchMap,
600  const wordList& cuttingPatches
601 )
602 :
603  srcRegion_(src),
604  tgtRegion_(tgt),
605  srcPatchID_(),
606  tgtPatchID_(),
607  patchAMIs_(),
608  cuttingPatches_(),
609  srcToTgtCellAddr_(),
610  tgtToSrcCellAddr_(),
611  srcToTgtCellWght_(),
612  tgtToSrcCellWght_(),
613  V_(0.0),
614  singleMeshProc_(-1),
615  srcMapPtr_(NULL),
616  tgtMapPtr_(NULL)
617 {
618  constructFromCuttingPatches
619  (
620  interpolationMethodNames_[method],
622  (
623  interpolationMethodAMI(method)
624  ),
625  patchMap,
626  cuttingPatches
627  );
628 }
629 
630 
631 Foam::meshToMesh::meshToMesh
632 (
633  const polyMesh& src,
634  const polyMesh& tgt,
635  const word& methodName, // internal mapping
636  const word& AMIMethodName, // boundary mapping
637  const HashTable<word>& patchMap,
638  const wordList& cuttingPatches
639 )
640 :
641  srcRegion_(src),
642  tgtRegion_(tgt),
643  srcPatchID_(),
644  tgtPatchID_(),
645  patchAMIs_(),
646  cuttingPatches_(),
647  srcToTgtCellAddr_(),
648  tgtToSrcCellAddr_(),
649  srcToTgtCellWght_(),
650  tgtToSrcCellWght_(),
651  V_(0.0),
652  singleMeshProc_(-1),
653  srcMapPtr_(NULL),
654  tgtMapPtr_(NULL)
655 {
656  constructFromCuttingPatches
657  (
658  methodName,
659  AMIMethodName,
660  patchMap,
661  cuttingPatches
662  );
663 }
664 
665 
666 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
667 
669 {}
670 
671 
672 // ************************************************************************* //
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
scalar V() const
Return const access to the overlap volume.
const labelListList & subMap() const
From subsetted data back to original data.
const pointField & points
const point & min() const
Minimum describing the bounding box.
Definition: boundBoxI.H:54
label size() const
Return the number of elements in the PtrList.
Definition: PtrListI.H:32
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject( name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE ))
const word & name() const
Return name.
static void distribute(const Pstream::commsTypes commsType, const List< labelPair > &schedule, const label constructSize, const labelListList &subMap, const labelListList &constructMap, List< T > &, const int tag=UPstream::msgType())
Distribute data. Note:schedule only used for Pstream::scheduled.
word name(const complex &)
Return a string representation of a complex.
Definition: complex.C:47
const labelListList & constructMap() const
From subsetted data to new reconstructed data.
Class containing processor-to-processor mapping information.
An STL-conforming hash table.
Definition: HashTable.H:61
label index() const
Return the index of this patch in the boundaryMesh.
Calculates a unique integer (label so might not have enough room - 2G max) for processor + local inde...
Definition: globalIndex.H:63
A class for handling words, derived from string.
Definition: word.H:59
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
void size(const label)
Override size to be inconsistent with allocated storage.
Definition: ListI.H:76
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
const cellList & cells() const
messageStream Info
const polyBoundaryMesh & boundaryMesh() const
Return boundaryMesh reference.
Definition: polyPatch.C:278
Xfer< T > xferMove(T &)
void writeConnectivity(const polyMesh &mesh1, const polyMesh &mesh2, const labelListList &mesh1ToMesh2Addr) const
Write the connectivity (debugging)
static const NamedEnum< interpolationMethod, 3 > interpolationMethodNames_
Definition: meshToMesh.H:75
Namespace for OpenFOAM.
A patch is a list of labels that address the faces in the global face list.
Definition: polyPatch.H:66
patches[0]
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
Definition: pEqn.H:39
wordList names() const
Return a list of patch names.
interpolationMethod
Enumeration specifying interpolation method.
Ostream & incrIndent(Ostream &os)
Increment the indent level.
Definition: Ostream.H:228
static const char nl
Definition: Ostream.H:260
interpolationMethod
Enumeration specifying interpolation method.
Definition: meshToMesh.H:67
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
Definition: Ostream.H:235
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:91
virtual const pointField & points() const
Return raw points.
Definition: polyMesh.C:1035
Foam::polyBoundaryMesh.
static AMIPatchToPatchInterpolation::interpolationMethod interpolationMethodAMI(const interpolationMethod method)
Conversion between mesh and patch interpolation methods.
Definition: meshToMesh.C:346
virtual void calculate(labelListList &srcToTgtAddr, scalarListList &srcToTgtWght, labelListList &tgtToTgtAddr, scalarListList &tgtToTgtWght)=0
Calculate addressing and weights.
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
Interpolation class dealing with transfer of data between two primitive patches with an arbitrary mes...
#define forAll(list, i)
Definition: UList.H:421
static bool constraintType(const word &pt)
Return true if the given type is a constraint type.
Definition: polyPatch.C:246
virtual Ostream & write(const token &)=0
Write next token to stream.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
const point & max() const
Maximum describing the bounding box.
Definition: boundBoxI.H:60
label size() const
Return number of elements in table.
Definition: HashTableI.H:65
List< scalar > scalarList
A List of scalars.
Definition: scalarList.H:50
errorManip< error > abort(error &err)
Definition: errorManip.H:131
static int myProcNo(const label communicator=0)
Number of this process (starting from masterNo() = 0)
Definition: UPstream.H:404
virtual const fileName & name() const
Return the name of the stream.
Definition: OSstream.H:88
Initialise the NamedEnum HashTable from the static list of names.
Definition: NamedEnum.H:52
#define FatalErrorIn(functionName)
Report an error message using Foam::FatalError.
Definition: error.H:314
A bounding box defined in terms of the points at its extremities.
Definition: boundBox.H:55
const cellShapeList & cells
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:74
error FatalError
const boundBox & bounds() const
Return mesh bounding box.
Definition: polyMesh.H:427
List< label > labelList
A List of labels.
Definition: labelList.H:56
static word interpolationMethodToWord(const interpolationMethod &method)
Convert interpolationMethod to word representation.
void append(T *)
Append an element at the end of the list.
Definition: PtrListI.H:81
static autoPtr< meshToMeshMethod > New(const word &methodName, const polyMesh &src, const polyMesh &tgt)
Selector.
void append(const T &)
Append an element at the end of the list.
Definition: ListI.H:97
void inflate(const scalar s)
Inflate box by factor*mag(span) in all dimensions.
Definition: boundBox.C:210
virtual const faceList & faces() const
Return raw faces.
Definition: polyMesh.C:1060
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
label findPatchID(const word &patchName) const
Find patch index given a name.
Plus op for FixedList<scalar>
bool overlaps(const boundBox &) const
Overlaps/touches boundingBox?
Definition: boundBoxI.H:120
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
Definition: PtrList.H:117
static const word null
An empty word.
Definition: word.H:77
defineTypeNameAndDebug(combustionModel, 0)
prefixOSstream Pout(cout,"Pout")
Definition: IOstreams.H:53
virtual ~meshToMesh()
Destructor.
Definition: meshToMesh.C:668