GeometricBoundaryField.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) 2011-2026 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 "GeometricBoundaryField.H"
27 #include "GeometricFieldFwd.H"
28 #include "emptyPolyPatch.H"
29 #include "processorPolyPatch.H"
30 #include "commSchedule.H"
31 #include "globalMeshData.H"
32 
33 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 
35 template<class Type, class GeoMesh, template<class> class PrimitiveField>
37 (
39  const dictionary& dict
40 )
41 {
42  printDictionary print(dict);
43 
44  // Clear the boundary field if already initialised
45  this->clear();
46 
47  this->setSize(bmesh_.size());
48 
50  {
52  }
53 
54  // Construct a list of entry pointers for each patch
55  UPtrList<const entry> patchEntries(this->size());
56 
57  // 1. Explicit patch names
59  {
60  if (iter().isDict() && !iter().keyword().isPattern())
61  {
62  const label patchi = bmesh_.findIndex(iter().keyword());
63 
64  if (patchi != -1)
65  {
66  patchEntries.set(patchi, &(iter()));
67  }
68  }
69  }
70 
71  // 2. Patch-groups
72  // Note: This is done in reverse order of the entries in the dictionary,
73  // so that it is consistent with dictionary wildcard behaviour.
74  if (dict.size())
75  {
76  for
77  (
79  iter != dict.rend();
80  ++iter
81  )
82  {
83  if (iter().isDict() && !iter().keyword().isPattern())
84  {
85  const labelList patchIDs =
86  bmesh_.findIndices(wordRe(iter().keyword()), true);
87 
88  forAll(patchIDs, i)
89  {
90  const label patchi = patchIDs[i];
91 
92  if (!patchEntries.set(patchi))
93  {
94  patchEntries.set(patchi, &(iter()));
95  }
96  }
97  }
98  }
99  }
100 
101  // 3. Empty patches
102  // These take precedence over wildcards
103  // (... apparently. Why not wedges and/or other constraints too?)
104  forAll(bmesh_, patchi)
105  {
106  if (!patchEntries.set(patchi))
107  {
108  if (bmesh_[patchi].type() == emptyPolyPatch::typeName)
109  {
110  patchEntries.set(patchi, NullObjectPtr<entry>());
111  }
112  }
113  }
114 
115  // 4. Wildcards
116  forAll(bmesh_, patchi)
117  {
118  if (!patchEntries.set(patchi))
119  {
120  const entry* ePtr =
121  dict.lookupEntryPtr(bmesh_[patchi].name(), false, true);
122 
123  if (ePtr)
124  {
125  patchEntries.set(patchi, ePtr);
126  }
127  }
128  }
129 
130  // Construct all the patches in order
131  forAll(bmesh_, patchi)
132  {
133  if (patchEntries.set(patchi) && !isNull(patchEntries(patchi)))
134  {
135  this->set
136  (
137  patchi,
138  Patch::New
139  (
140  bmesh_[patchi],
141  field,
142  patchEntries[patchi].dict()
143  )
144  );
145  }
146  else if (patchEntries.set(patchi) && isNull(patchEntries[patchi]))
147  {
148  this->set
149  (
150  patchi,
151  Patch::New
152  (
154  bmesh_[patchi],
155  field
156  )
157  );
158  }
159  else
160  {
162  << "Cannot find patchField entry for "
163  << bmesh_[patchi].name() << exit(FatalIOError);
164  }
165  }
166 }
167 
168 
169 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
170 
171 template<class Type, class GeoMesh, template<class> class PrimitiveField>
174 (
175  const BoundaryMesh& bmesh
176 )
177 :
178  FieldField<GeoMesh::template PatchField, Type>(bmesh.size()),
179  bmesh_(bmesh)
180 {}
181 
182 
183 template<class Type, class GeoMesh, template<class> class PrimitiveField>
186 (
187  const BoundaryMesh& bmesh,
189  const word& patchFieldType
190 )
191 :
192  FieldField<GeoMesh::template PatchField, Type>(bmesh.size()),
193  bmesh_(bmesh)
194 {
196  {
197  InfoInFunction << endl;
198  }
199 
200  forAll(bmesh_, patchi)
201  {
202  this->set
203  (
204  patchi,
205  Patch::New
206  (
208  bmesh_[patchi],
209  field
210  )
211  );
212  }
213 }
214 
215 
216 template<class Type, class GeoMesh, template<class> class PrimitiveField>
219 (
220  const BoundaryMesh& bmesh,
222  const wordList& patchFieldTypes,
223  const wordList& constraintTypes
224 )
225 :
226  FieldField<GeoMesh::template PatchField, Type>(bmesh.size()),
227  bmesh_(bmesh)
228 {
230  {
231  InfoInFunction << endl;
232  }
233 
234  if
235  (
236  patchFieldTypes.size() != this->size()
237  || (constraintTypes.size() && (constraintTypes.size() != this->size()))
238  )
239  {
241  << "Incorrect number of patch type specifications given" << nl
242  << " Number of patches in mesh = " << bmesh.size()
243  << " number of patch type specifications = "
244  << patchFieldTypes.size()
245  << abort(FatalError);
246  }
247 
248  if (constraintTypes.size())
249  {
250  forAll(bmesh_, patchi)
251  {
252  this->set
253  (
254  patchi,
255  Patch::New
256  (
257  patchFieldTypes[patchi],
258  constraintTypes[patchi],
259  bmesh_[patchi],
260  field
261  )
262  );
263  }
264  }
265  else
266  {
267  forAll(bmesh_, patchi)
268  {
269  this->set
270  (
271  patchi,
272  Patch::New
273  (
274  patchFieldTypes[patchi],
275  bmesh_[patchi],
276  field
277  )
278  );
279  }
280  }
281 }
282 
283 
284 template<class Type, class GeoMesh, template<class> class PrimitiveField>
287 (
288  const BoundaryMesh& bmesh,
290  const PtrList<Patch>& ptfl
291 )
292 :
293  FieldField<GeoMesh::template PatchField, Type>(bmesh.size()),
294  bmesh_(bmesh)
295 {
297  {
298  InfoInFunction << endl;
299  }
300 
301  forAll(bmesh_, patchi)
302  {
303  this->set(patchi, ptfl[patchi].clone(field));
304  }
305 }
306 
307 
308 template<class Type, class GeoMesh, template<class> class PrimitiveField>
311 (
314 )
315 :
316  FieldField<GeoMesh::template PatchField, Type>(btf.size()),
317  bmesh_(btf.bmesh_)
318 {
320  {
321  InfoInFunction << endl;
322  }
323 
324  forAll(bmesh_, patchi)
325  {
326  this->set(patchi, btf[patchi].clone(field));
327  }
328 }
329 
330 
331 template<class Type, class GeoMesh, template<class> class PrimitiveField>
334 (
335  const BoundaryMesh& bmesh,
337  const dictionary& dict
338 )
339 :
340  FieldField<GeoMesh::template PatchField, Type>(bmesh.size()),
341  bmesh_(bmesh)
342 {
343  readField(field, dict);
344 }
345 
346 
347 template<class Type, class GeoMesh, template<class> class PrimitiveField>
348 template<template<class> class PrimitiveField2>
351 (
354 )
355 :
356  FieldField<GeoMesh::template PatchField, Type>(btf.size()),
357  bmesh_(btf.bmesh_)
358 {
360  {
361  InfoInFunction << endl;
362  }
363 
364  forAll(bmesh_, patchi)
365  {
366  this->set(patchi, btf[patchi].clone(field));
367  }
368 }
369 
370 
371 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
372 
373 template<class Type, class GeoMesh, template<class> class PrimitiveField>
375 {
377  {
378  InfoInFunction << endl;
379  }
380 
381  forAll(*this, patchi)
382  {
383  this->operator[](patchi).updateCoeffs();
384  }
385 }
386 
387 
388 template<class Type, class GeoMesh, template<class> class PrimitiveField>
390 {
392  {
393  InfoInFunction << endl;
394  }
395 
396  if
397  (
400  )
401  {
402  label nReq = Pstream::nRequests();
403 
404  forAll(*this, patchi)
405  {
406  this->operator[](patchi).initEvaluate(Pstream::defaultCommsType);
407  }
408 
409  // Block for any outstanding requests
410  if
411  (
414  )
415  {
416  Pstream::waitRequests(nReq);
417  }
418 
419  forAll(*this, patchi)
420  {
421  this->operator[](patchi).evaluate(Pstream::defaultCommsType);
422  }
423  }
425  {
426  const lduSchedule& patchSchedule =
427  bmesh_.mesh().globalData().patchSchedule();
428 
429  forAll(patchSchedule, patchEvali)
430  {
431  if (patchSchedule[patchEvali].init)
432  {
433  this->operator[](patchSchedule[patchEvali].patch)
434  .initEvaluate(Pstream::commsTypes::scheduled);
435  }
436  else
437  {
438  this->operator[](patchSchedule[patchEvali].patch)
440  }
441  }
442  }
443  else
444  {
446  << "Unsupported communications type "
448  << exit(FatalError);
449  }
450 }
451 
452 
453 template<class Type, class GeoMesh, template<class> class PrimitiveField>
456 {
458 
459  wordList Types(pff.size());
460 
461  forAll(pff, patchi)
462  {
463  Types[patchi] = pff[patchi].type();
464  }
465 
466  return Types;
467 }
468 
469 
470 template<class Type, class GeoMesh, template<class> class PrimitiveField>
473 boundaryInternalField() const
474 {
475  typedef
477  resultType;
478 
479  tmp<resultType> tresult(new resultType(Internal::null(), *this));
480  resultType& result = tresult.ref();
481 
482  forAll(*this, patchi)
483  {
484  result[patchi] == this->operator[](patchi).patchInternalField();
485  }
486 
487  return tresult;
488 }
489 
490 
491 template<class Type, class GeoMesh, template<class> class PrimitiveField>
494 coupledNeighbourField() const
495 {
496  PtrList<Field<Type>> result(bmesh_.size());
497 
498  if
499  (
502  )
503  {
504  const label nReq = Pstream::nRequests();
505 
506  forAll(*this, patchi)
507  {
508  if (this->operator[](patchi).coupled())
509  {
510  this->operator[](patchi)
511  .initPatchNeighbourField(Pstream::defaultCommsType);
512  }
513  }
514 
515  // Block for any outstanding requests
516  if
517  (
520  )
521  {
522  Pstream::waitRequests(nReq);
523  }
524 
525  forAll(*this, patchi)
526  {
527  if (this->operator[](patchi).coupled())
528  {
529  result.set
530  (
531  patchi,
532  this->operator[](patchi)
533  .patchNeighbourField(Pstream::defaultCommsType)
534  );
535  }
536  }
537  }
539  {
540  const lduSchedule& patchSchedule =
541  bmesh_.mesh().globalData().patchSchedule();
542 
543  forAll(patchSchedule, patchEvali)
544  {
545  if (this->operator[](patchSchedule[patchEvali].patch).coupled())
546  {
547  if (patchSchedule[patchEvali].init)
548  {
549  this->operator[](patchSchedule[patchEvali].patch)
550  .initPatchNeighbourField(Pstream::defaultCommsType);
551  }
552  else
553  {
554  result.set
555  (
556  patchSchedule[patchEvali].patch,
557  this->operator[](patchSchedule[patchEvali].patch)
558  .patchNeighbourField(Pstream::defaultCommsType)
559  );
560  }
561  }
562  }
563  }
564  else
565  {
567  << "Unsupported communications type "
569  << exit(FatalError);
570  }
571 
572  return result;
573 }
574 
575 
576 template<class Type, class GeoMesh, template<class> class PrimitiveField>
580 {
581  typedef
583  resultType;
584 
585  tmp<resultType> tresult(new resultType(Internal::null(), *this));
586  resultType& result = tresult.ref();
587 
588  if
589  (
592  )
593  {
594  const label nReq = Pstream::nRequests();
595 
596  forAll(*this, patchi)
597  {
598  if (this->operator[](patchi).coupled())
599  {
600  this->operator[](patchi)
601  .initPatchNeighbourField(Pstream::defaultCommsType);
602  }
603  }
604 
605  // Block for any outstanding requests
606  if
607  (
610  )
611  {
612  Pstream::waitRequests(nReq);
613  }
614 
615  forAll(*this, patchi)
616  {
617  if (this->operator[](patchi).coupled())
618  {
619  result[patchi] =
620  this->operator[](patchi)
621  .patchNeighbourField(Pstream::defaultCommsType);
622  }
623  }
624  }
626  {
627  const lduSchedule& patchSchedule =
628  bmesh_.mesh().globalData().patchSchedule();
629 
630  forAll(patchSchedule, patchEvali)
631  {
632  if (this->operator[](patchSchedule[patchEvali].patch).coupled())
633  {
634  if (patchSchedule[patchEvali].init)
635  {
636  this->operator[](patchSchedule[patchEvali].patch)
637  .initPatchNeighbourField(Pstream::defaultCommsType);
638  }
639  else
640  {
641  result[patchSchedule[patchEvali].patch] =
642  this->operator[](patchSchedule[patchEvali].patch)
643  .patchNeighbourField(Pstream::defaultCommsType);
644  }
645  }
646  }
647  }
648  else
649  {
651  << "Unsupported communications type "
653  << exit(FatalError);
654  }
655 
656  return tresult;
657 }
658 
659 
660 template<class Type, class GeoMesh, template<class> class PrimitiveField>
663 {
664  LduInterfaceFieldPtrsList<Type> interfaces(this->size());
665 
666  forAll(interfaces, patchi)
667  {
668  if (isA<LduInterfaceField<Type>>(this->operator[](patchi)))
669  {
670  interfaces.set
671  (
672  patchi,
674  (
675  this->operator[](patchi)
676  )
677  );
678  }
679  }
680 
681  return interfaces;
682 }
683 
684 
685 template<class Type, class GeoMesh, template<class> class PrimitiveField>
688 scalarInterfaces() const
689 {
690  lduInterfaceFieldPtrsList interfaces(this->size());
691 
692  forAll(interfaces, patchi)
693  {
694  if (isA<lduInterfaceField>(this->operator[](patchi)))
695  {
696  interfaces.set
697  (
698  patchi,
699  &refCast<const lduInterfaceField>
700  (
701  this->operator[](patchi)
702  )
703  );
704  }
705  }
706 
707  return interfaces;
708 }
709 
710 
711 template<class Type, class GeoMesh, template<class> class PrimitiveField>
713 (
715 )
716 {
717  // Reset the number of patches in case the decomposition changed
718  this->setSize(btf.size());
719 
720  const polyBoundaryMesh& pbm = bmesh_.mesh().poly().boundary();
721 
722  forAll(*this, patchi)
723  {
724  // Construct new processor patch fields in case the decomposition
725  // changed
726  if (isA<processorPolyPatch>(pbm[patchi]))
727  {
728  this->set
729  (
730  patchi,
731  btf[patchi].clone
732  (
733  bmesh_[patchi],
734  this->operator[](0).internalField()
735  )
736  );
737  }
738  else
739  {
740  this->operator[](patchi).reset(btf[patchi]);
741  }
742  }
743 }
744 
745 
746 
747 template<class Type, class GeoMesh, template<class> class PrimitiveField>
749 (
750  const word& keyword,
751  Ostream& os
752 ) const
753 {
754  os << keyword << nl << token::BEGIN_BLOCK << incrIndent << nl;
755 
756  forAll(*this, patchi)
757  {
758  os << indent << this->operator[](patchi).patch().name() << nl
759  << indent << token::BEGIN_BLOCK << nl
760  << incrIndent << this->operator[](patchi) << decrIndent
761  << indent << token::END_BLOCK << endl;
762  }
763 
764  os << decrIndent << token::END_BLOCK << endl;
765 
766  // Check state of IOstream
767  os.check
768  (
769  "GeometricBoundaryField<Type, GeoMesh, PrimitiveField>::"
770  "writeEntry(const word& keyword, Ostream& os) const"
771  );
772 }
773 
774 
775 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
776 
777 template<class Type, class GeoMesh, template<class> class PrimitiveField>
780 {
782 }
783 
784 
785 template<class Type, class GeoMesh, template<class> class PrimitiveField>
787 operator=(GeometricBoundaryField<Type, GeoMesh, PrimitiveField>&& bf)
788 {
790 }
791 
792 
793 template<class Type, class GeoMesh, template<class> class PrimitiveField>
796 {
798 }
799 
800 
801 template<class Type, class GeoMesh, template<class> class PrimitiveField>
802 template<template<class> class OtherPatchField>
805 {
807 }
808 
809 
810 template<class Type, class GeoMesh, template<class> class PrimitiveField>
812 operator=(const Type& t)
813 {
815 }
816 
817 
818 template<class Type, class GeoMesh, template<class> class PrimitiveField>
821 {
822  forAll(*this, patchi)
823  {
824  this->operator[](patchi) == bf[patchi];
825  }
826 }
827 
828 
829 template<class Type, class GeoMesh, template<class> class PrimitiveField>
832 {
833  forAll(*this, patchi)
834  {
835  this->operator[](patchi) == ptff[patchi];
836  }
837 }
838 
839 
840 template<class Type, class GeoMesh, template<class> class PrimitiveField>
841 template<template<class> class OtherPatchField>
844 {
845  forAll(*this, patchi)
846  {
847  this->operator[](patchi) == ptff[patchi];
848  }
849 }
850 
851 
852 template<class Type, class GeoMesh, template<class> class PrimitiveField>
854 operator==(const Type& t)
855 {
856  forAll(*this, patchi)
857  {
858  this->operator[](patchi) == t;
859  }
860 }
861 
862 
863 // * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
864 
865 template<class Type, class GeoMesh, template<class> class PrimitiveField>
866 Foam::Ostream& Foam::operator<<
867 (
868  Ostream& os,
870 )
871 {
872  os <<
873  static_cast<const FieldField<GeoMesh::template PatchField, Type>&>(bf);
874  return os;
875 }
876 
877 
878 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:449
#define forAllConstIter(Container, container, iter)
Iterate across all elements in the container object of type.
Definition: UList.H:492
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Generic field type.
Definition: FieldField.H:77
tmp< FieldField< GeoMesh::template PatchField, Type > > clone() const
Clone.
Definition: FieldField.C:188
void operator=(const FieldField< Field, Type > &)
Definition: FieldField.C:290
Generic GeometricBoundaryField class.
PtrList< Field< Type > > coupledNeighbourField() const
Return BoundaryField of the values on the other side of couples.
tmp< GeometricBoundaryField > boundaryNeighbourField() const
Return BoundaryField with the values on the other side of couples.
lduInterfaceFieldPtrsList scalarInterfaces() const
Return a list of pointers for each patch field with only those.
friend class GeometricBoundaryField
Declare friendship with other geometric boundary fields.
void readField(const Internal &field, const dictionary &dict)
Read the boundary field.
wordList types() const
Return a list of the patch field types.
void evaluate()
Evaluate boundary conditions.
LduInterfaceFieldPtrsList< Type > interfaces() const
Return a list of pointers for each patch field with only those.
void operator==(const GeometricBoundaryField &)
Forced assignment to.
void writeEntry(const word &keyword, Ostream &os) const
Write boundary field as dictionary entry.
void updateCoeffs()
Update the boundary condition coefficients.
GeoMesh::BoundaryMesh BoundaryMesh
Type of boundary mesh on which this boundary is instantiated.
tmp< GeometricBoundaryField > boundaryInternalField() const
Return BoundaryField of the cell values neighbouring.
void reset(const GeometricBoundaryField &)
Reset the boundary field contents to the given field.
void operator=(const GeometricBoundaryField &)
Assignment operator.
Generic GeometricField class.
virtual bool check(const char *operation) const
Check IOstream status for given operation.
Definition: IOstream.C:108
virtual const fileName & name() const
Return the name of the stream.
Definition: IOstream.H:297
An abstract base class for implicitly-coupled interface fields e.g. processor and cyclic patch fields...
void size(const label)
Override size to be inconsistent with allocated storage.
Definition: ListI.H:164
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:57
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
Definition: PtrList.H:75
bool set(const label) const
Is element set.
Definition: PtrListI.H:62
An STL-conforming const_reverse_iterator.
Definition: UILList.H:302
static const NamedEnum< commsTypes, 3 > commsTypeNames
Definition: UPstream.H:71
static label nRequests()
Get number of outstanding requests.
Definition: UPstream.C:137
static void waitRequests(const label start=0)
Wait until all requests (from start onwards) have finished.
Definition: UPstream.C:147
static bool & parRun()
Is this a parallel run?
Definition: UPstream.H:399
static commsTypes defaultCommsType
Default commsType.
Definition: UPstream.H:272
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
Definition: UPtrList.H:66
bool set(const label) const
Is element set.
Definition: UPtrListI.H:87
label size() const
Return the number of elements in the UPtrList.
Definition: UPtrListI.H:29
A list of keywords followed by any number of values (e.g. words and numbers) or sub-dictionaries.
Definition: dictionary.H:162
A keyword and a list of tokens is an 'entry'.
Definition: entry.H:68
Foam::polyBoundaryMesh.
const polyMesh & mesh() const
Return the mesh reference.
const polyBoundaryMesh & boundary() const
Return boundary mesh.
Definition: polyMesh.H:393
Enables the printing of a dictionary and subsequently looked-up defaulted entries.
A class for managing temporary objects.
Definition: tmp.H:55
T & ref() const
Return non-const reference or generate a fatal error.
Definition: tmpI.H:197
@ BEGIN_BLOCK
Definition: token.H:114
@ END_BLOCK
Definition: token.H:115
A wordRe is a word, but can also have a regular expression for matching words.
Definition: wordRe.H:77
A class for handling words, derived from string.
Definition: word.H:63
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition: error.H:346
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:334
label patchi
tUEqn clear()
#define InfoInFunction
Report an information message using Foam::Info.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
Definition: Ostream.H:272
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
To & refCast(From &r)
Reference type cast template function.
Definition: typeInfo.H:141
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:288
String typeName(const std::type_info &info)
Return the un-mangled name given the standard type info.
errorManip< error > abort(error &err)
Definition: errorManip.H:131
Ostream & incrIndent(Ostream &os)
Increment the indent level.
Definition: Ostream.H:265
bool isA(const Type &t)
Check if a dynamic_cast to typeid is possible.
Definition: typeInfo.H:178
word patchFieldType(const PatchField &pf)
T clone(const T &t)
Definition: List.H:55
IOerror FatalIOError
word name(const LagrangianState state)
Return a string representation of a Lagrangian state enumeration.
bool isNull(const T &t)
Return true if t is a reference to the nullObject of type T.
Definition: nullObjectI.H:58
error FatalError
Ostream & indent(Ostream &os)
Indent stream.
Definition: Ostream.H:243
tmp< DimensionedField< TypeR, GeoMesh, Field > > New(const tmp< DimensionedField< TypeR, GeoMesh, Field >> &tdf1, const word &name, const dimensionSet &dimensions)
static const char nl
Definition: Ostream.H:297
fileType type(const fileName &, const bool checkVariants=true, const bool followLink=true)
Return the file type: directory or file.
Definition: POSIX.C:488
points setSize(newPointi)
dictionary dict