dimensionedType.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-2024 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 "dimensionedType.H"
27 #include "pTraits.H"
28 #include "dictionary.H"
29 
30 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
31 
32 template<class Type>
34 (
35  const word& name,
36  const unitConversion& defaultUnits,
37  Istream& is
38 )
39 {
40  token nextToken(is);
41 
42  // Set the name using the argument, if specified, or read it from the
43  // stream if it is present. If neither are, then it will be set to a word
44  // representation of the value lower down.
45  if (!name.empty())
46  {
47  name_ = name;
48  }
49  else if (nextToken.isWord())
50  {
51  name_ = nextToken.wordToken();
52  }
53  else
54  {
55  name_ = word::null;
56  }
57 
58  // Put the token back if it wasn't the name
59  if (!nextToken.isWord())
60  {
61  is.putBack(nextToken);
62  }
63 
64  // Read the units if they are before the value
65  unitConversion units(defaultUnits);
66  const bool haveUnits = units.readIfPresent(is);
67 
68  // Read the value
69  value_ = pTraits<Type>(is);
70 
71  // Read the units if they are after the value
72  if (!haveUnits && !is.eof())
73  {
74  units.readIfPresent(is);
75  }
76 
77  // Set the name
78  if (name_.empty())
79  {
80  name_ = Foam::name(value_);
81  }
82 
83  // Set the dimensions
84  dimensions_.reset(units.dimensions());
85 
86  // Modify the value by the unit conversion
87  units.makeStandard(value_);
88 }
89 
90 
91 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
92 
93 template<class Type>
95 :
96  name_("NaN"),
97  dimensions_(dimless),
98  value_(pTraits<Type>::nan)
99 {}
100 
101 
102 template<class Type>
104 (
105  const word& name,
106  const dimensionSet& dims,
107  const Type& t
108 )
109 :
110  name_(name),
111  dimensions_(dims),
112  value_(t)
113 {}
114 
115 
116 template<class Type>
118 :
119  name_(::Foam::name(t)),
120  dimensions_(dims),
121  value_(t)
122 {}
123 
124 
125 template<class Type>
127 :
128  name_(::Foam::name(t)),
129  dimensions_(dimless),
130  value_(t)
131 {}
132 
133 
134 template<class Type>
136 (
137  const word& name,
138  const dimensioned<Type>& dt
139 )
140 :
141  name_(name),
142  dimensions_(dt.dimensions_),
143  value_(dt.value_)
144 {}
145 
146 
147 template<class Type>
149 :
150  dimensions_(dimless)
151 {
152  initialise(word::null, unitAny, is);
153 }
154 
155 
156 template<class Type>
158 :
159  name_(name),
160  dimensions_(dimless)
161 {
162  initialise(name, unitAny, is);
163 }
164 
165 
166 template<class Type>
168 (
169  const word& name,
170  const dimensionSet& dims,
171  Istream& is
172 )
173 :
174  name_(name),
175  dimensions_(dims),
176  value_(Zero)
177 {
178  initialise(name, dims, is);
179 }
180 
181 
182 template<class Type>
184 (
185  const word& name,
187  Istream& is
188 )
189 :
190  name_(name),
191  dimensions_(units.dimensions()),
192  value_(Zero)
193 {
194  initialise(name, units, is);
195 }
196 
197 
198 template<class Type>
200 (
201  const word& name,
202  const dimensionSet& dims,
203  const dictionary& dict
204 )
205 :
206  name_(name),
207  dimensions_(dims),
208  value_(Zero)
209 {
210  initialise(name, dims, dict.lookup(name));
211 }
212 
213 
214 template<class Type>
216 (
217  const word& name,
218  const unitConversion& units,
219  const dictionary& dict
220 )
221 :
222  name_(name),
223  dimensions_(units.dimensions()),
224  value_(Zero)
225 {
226  initialise(name, units, dict.lookup(name));
227 }
228 
229 
230 template<class Type>
232 (
233  const word& name,
234  const dimensionSet& dims,
235  const dictionary& dict,
236  const Type& defaultValue,
237  const bool writeDefault
238 )
239 :
240  name_(name),
241  dimensions_(dims),
242  value_(defaultValue)
243 {
244  if (dict.found(name))
245  {
246  initialise(name, dims, dict.lookup(name));
247  }
248  else if (writeDefault)
249  {
250  Info<< indent << "Default: " << name;
251 
252  if (!dims.dimensionless())
253  {
254  Info<< " " << dims.info();
255  }
256 
257  Info<< " " << defaultValue;
258 
259  if (dict.name() != fileName::null)
260  {
261  Info<< " in " << dict.name().relativePath();
262  }
263  Info<< endl;
264  }
265 }
266 
267 
268 template<class Type>
270 (
271  const word& name,
272  const dictionary& dict,
273  const Type& defaultValue,
274  const bool writeDefault
275 )
276 :
277  dimensioned(name, dimless, dict, defaultValue, writeDefault)
278 {}
279 
280 
281 template<class Type>
283 (
284  const word& name,
285  const unitConversion& units,
286  const dictionary& dict,
287  const Type& defaultValue,
288  const bool writeDefault
289 )
290 :
291  name_(name),
292  dimensions_(units.dimensions()),
293  value_(defaultValue)
294 {
295  if (dict.found(name))
296  {
297  initialise(name, units, dict.lookup(name));
298  }
299  else if (writeDefault)
300  {
301  Info<< indent << "Default: " << name;
302 
303  if (!units.dimensions().dimensionless())
304  {
305  Info<< " " << units.info();
306  }
307 
308  Info<< " " << defaultValue;
309 
310  if (dict.name() != fileName::null)
311  {
312  Info<< " in " << dict.name().relativePath();
313  }
314  Info<< endl;
315  }
316 }
317 
318 
319 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
320 
321 template<class Type>
323 {
324  return name_;
325 }
326 
327 template<class Type>
329 {
330  return name_;
331 }
332 
333 
334 template<class Type>
336 {
337  return dimensions_;
338 }
339 
340 template<class Type>
342 {
343  return dimensions_;
344 }
345 
346 
347 template<class Type>
349 {
350  return value_;
351 }
352 
353 template<class Type>
355 {
356  return value_;
357 }
358 
359 
360 template<class Type>
363 (
364  const direction d
365 ) const
366 {
367  return dimensioned<cmptType>
368  (
369  name_ + ".component(" + Foam::name(d) + ')',
370  dimensions_,
371  value_.component(d)
372  );
373 }
374 
375 
376 template<class Type>
378 (
379  const direction d,
380  const dimensioned<typename dimensioned<Type>::cmptType>& dc
381 )
382 {
383  dimensions_ = dc.dimensions();
384  value_.replace(d, dc.value());
385 }
386 
387 
388 template<class Type>
390 (
391  const dictionary& dict,
392  const unitConversion& defaultUnits
393 )
394 {
395  initialise
396  (
397  name_,
398  isNull(defaultUnits) ? dimensions_ : defaultUnits,
399  dict.lookup(name_)
400  );
401 }
402 
403 
404 template<class Type>
406 (
407  const dictionary& dict,
408  const unitConversion& defaultUnits
409 )
410 {
411  const entry* entryPtr = dict.lookupEntryPtr(name_, false, true);
412 
413  if (entryPtr)
414  {
415  initialise
416  (
417  name_,
418  isNull(defaultUnits) ? dimensions_ : defaultUnits,
419  entryPtr->stream()
420  );
421  return true;
422  }
423  else
424  {
425  if (dictionary::writeOptionalEntries)
426  {
428  << "Optional entry '" << name_ << "' is not present,"
429  << " the default value '" << *this << "' will be used."
430  << endl;
431  }
432 
433  return false;
434  }
435 }
436 
437 
438 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
439 
440 template<class Type>
443 {
444  return component(d);
445 }
446 
447 
448 template<class Type>
450 {
451  dimensions_ += dt.dimensions_;
452  value_ += dt.value_;
453 }
454 
455 
456 template<class Type>
458 {
459  dimensions_ -= dt.dimensions_;
460  value_ -= dt.value_;
461 }
462 
463 
464 template<class Type>
466 {
467  value_ *= s;
468 }
469 
470 
471 template<class Type>
473 {
474  value_ /= s;
475 }
476 
477 
478 // * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * //
479 
480 template<class Type, Foam::direction r>
483 {
485  (
486  "pow(" + dt.name() + ',' + name(r) + ')',
487  pow(dt.dimensions(), r),
488  pow(dt.value(), 2)
489  );
490 }
491 
492 
493 template<class Type>
495 Foam::sqr(const dimensioned<Type>& dt)
496 {
498  (
499  "sqr(" + dt.name() + ')',
500  sqr(dt.dimensions()),
501  sqr(dt.value())
502  );
503 }
504 
505 
506 template<class Type>
507 Foam::dimensioned<Foam::scalar> Foam::magSqr(const dimensioned<Type>& dt)
508 {
509  return dimensioned<scalar>
510  (
511  "magSqr(" + dt.name() + ')',
512  magSqr(dt.dimensions()),
513  magSqr(dt.value())
514  );
515 }
516 
517 
518 template<class Type>
519 Foam::dimensioned<Foam::scalar> Foam::mag(const dimensioned<Type>& dt)
520 {
521  return dimensioned<scalar>
522  (
523  "mag(" + dt.name() + ')',
524  dt.dimensions(),
525  mag(dt.value())
526  );
527 }
528 
529 
530 template<class Type>
532 (
533  const dimensioned<Type>& dt1,
534  const dimensioned<Type>& dt2
535 )
536 {
537  return dimensioned<Type>
538  (
539  "cmptMultiply(" + dt1.name() + ',' + dt2.name() + ')',
540  cmptMultiply(dt1.dimensions(), dt2.dimensions()),
541  cmptMultiply(dt1.value(), dt2.value())
542  );
543 }
544 
545 
546 template<class Type>
548 (
549  const dimensioned<Type>& dt1,
550  const dimensioned<Type>& dt2
551 )
552 {
553  return dimensioned<Type>
554  (
555  "cmptDivide(" + dt1.name() + ',' + dt2.name() + ')',
556  cmptDivide(dt1.dimensions(), dt2.dimensions()),
557  cmptDivide(dt1.value(), dt2.value())
558  );
559 }
560 
561 
562 template<class Type>
564 (
565  const dimensioned<Type>& dt1,
566  const dimensioned<Type>& dt2
567 )
568 {
569  if (dt1.dimensions() != dt2.dimensions())
570  {
572  << "dimensions of arguments are not equal"
573  << abort(FatalError);
574  }
575 
576  return dimensioned<Type>
577  (
578  "max(" + dt1.name() + ',' + dt2.name() + ')',
579  dt1.dimensions(),
580  max(dt1.value(), dt2.value())
581  );
582 }
583 
584 
585 template<class Type>
587 (
588  const dimensioned<Type>& dt1,
589  const dimensioned<Type>& dt2
590 )
591 {
592  if (dt1.dimensions() != dt2.dimensions())
593  {
595  << "dimensions of arguments are not equal"
596  << abort(FatalError);
597  }
598 
599  return dimensioned<Type>
600  (
601  "min(" + dt1.name() + ',' + dt2.name() + ')',
602  dt1.dimensions(),
603  min(dt1.value(), dt2.value())
604  );
605 }
606 
607 
608 // * * * * * * * * * * * * * * * IOstream Functions * * * * * * * * * * * * //
609 
610 template<class Type>
612 {
613  // Write the dimensions
614  dt.dimensions().write(os);
615 
616  os << token::SPACE;
617 
618  // Write the value
619  os << dt.value();
620 }
621 
622 
623 // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
624 
625 template<class Type>
626 Foam::Istream& Foam::operator>>(Istream& is, dimensioned<Type>& dt)
627 {
628  dt.initialise(word::null, unitAny, is);
629 
630  // Check state of Istream
631  is.check("Istream& operator>>(Istream&, dimensioned<Type>&)");
632 
633  return is;
634 }
635 
636 
637 template<class Type>
638 Foam::Ostream& Foam::operator<<(Ostream& os, const dimensioned<Type>& dt)
639 {
640  // Write the name
641  os << dt.name() << token::SPACE;
642 
643  // Write the dimensions
644  dt.dimensions().write(os);
645 
646  os << token::SPACE;
647 
648  // Write the value
649  os << dt.value();
650 
651  // Check state of Ostream
652  os.check("Ostream& operator<<(Ostream&, const dimensioned<Type>&)");
653 
654  return os;
655 }
656 
657 
658 // * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * //
659 
660 template<class Type>
661 bool Foam::operator>
662 (
663  const dimensioned<Type>& dt1,
664  const dimensioned<Type>& dt2
665 )
666 {
667  return dt1.value() > dt2.value();
668 }
669 
670 
671 template<class Type>
672 bool Foam::operator<
673 (
674  const dimensioned<Type>& dt1,
675  const dimensioned<Type>& dt2
676 )
677 {
678  return dt1.value() < dt2.value();
679 }
680 
681 
682 template<class Type>
683 Foam::dimensioned<Type> Foam::operator+
684 (
685  const dimensioned<Type>& dt1,
686  const dimensioned<Type>& dt2
687 )
688 {
689  return dimensioned<Type>
690  (
691  '(' + dt1.name() + '+' + dt2.name() + ')',
692  dt1.dimensions() + dt2.dimensions(),
693  dt1.value() + dt2.value()
694  );
695 }
696 
697 
698 template<class Type>
699 Foam::dimensioned<Type> Foam::operator-(const dimensioned<Type>& dt)
700 {
701  return dimensioned<Type>
702  (
703  '-' + dt.name(),
704  dt.dimensions(),
705  -dt.value()
706  );
707 }
708 
709 
710 template<class Type>
711 Foam::dimensioned<Type> Foam::operator-
712 (
713  const dimensioned<Type>& dt1,
714  const dimensioned<Type>& dt2
715 )
716 {
717  return dimensioned<Type>
718  (
719  '(' + dt1.name() + '-' + dt2.name() + ')',
720  dt1.dimensions() - dt2.dimensions(),
721  dt1.value() - dt2.value()
722  );
723 }
724 
725 
726 template<class Type>
727 Foam::dimensioned<Type> Foam::operator*
728 (
729  const dimensioned<scalar>& ds,
730  const dimensioned<Type>& dt
731 )
732 {
733  return dimensioned<Type>
734  (
735  '(' + ds.name() + '*' + dt.name() + ')',
736  ds.dimensions() * dt.dimensions(),
737  ds.value() * dt.value()
738  );
739 }
740 
741 
742 template<class Type>
743 Foam::dimensioned<Type> Foam::operator/
744 (
745  const dimensioned<Type>& dt,
746  const dimensioned<scalar>& ds
747 )
748 {
749  return dimensioned<Type>
750  (
751  '(' + dt.name() + '|' + ds.name() + ')',
752  dt.dimensions()/ds.dimensions(),
753  dt.value()/ds.value()
754  );
755 }
756 
757 
758 #define PRODUCT_OPERATOR(product, op, opFunc) \
759  \
760 template<class Type1, class Type2> \
761 Foam::dimensioned<typename Foam::product<Type1, Type2>::type> \
762 Foam::operator op \
763 ( \
764  const dimensioned<Type1>& dt1, \
765  const dimensioned<Type2>& dt2 \
766 ) \
767 { \
768  return dimensioned<typename product<Type1, Type2>::type> \
769  ( \
770  '(' + dt1.name() + #op + dt2.name() + ')', \
771  dt1.dimensions() op dt2.dimensions(), \
772  dt1.value() op dt2.value() \
773  ); \
774 } \
775  \
776 template<class Type, class Form, class Cmpt, Foam::direction nCmpt> \
777 Foam::dimensioned<typename Foam::product<Type, Form>::type> \
778 Foam::operator op \
779 ( \
780  const dimensioned<Type>& dt1, \
781  const VectorSpace<Form,Cmpt,nCmpt>& t2 \
782 ) \
783 { \
784  return dimensioned<typename product<Type, Form>::type> \
785  ( \
786  '(' + dt1.name() + #op + name(t2) + ')', \
787  dt1.dimensions(), \
788  dt1.value() op static_cast<const Form&>(t2) \
789  ); \
790 } \
791  \
792 template<class Type, class Form, class Cmpt, Foam::direction nCmpt> \
793 Foam::dimensioned<typename Foam::product<Form, Type>::type> \
794 Foam::operator op \
795 ( \
796  const VectorSpace<Form,Cmpt,nCmpt>& t1, \
797  const dimensioned<Type>& dt2 \
798 ) \
799 { \
800  return dimensioned<typename product<Form, Type>::type> \
801  ( \
802  '(' + name(t1) + #op + dt2.name() + ')', \
803  dt2.dimensions(), \
804  static_cast<const Form&>(t1) op dt2.value() \
805  ); \
806 }
807 
808 PRODUCT_OPERATOR(outerProduct, *, outer)
809 PRODUCT_OPERATOR(crossProduct, ^, cross)
810 PRODUCT_OPERATOR(innerProduct, &, dot)
811 PRODUCT_OPERATOR(scalarProduct, &&, dotdot)
812 
813 #undef PRODUCT_OPERATOR
814 
815 
816 // ************************************************************************* //
virtual bool check(const char *operation) const
Check IOstream status for given operation.
Definition: IOstream.C:92
virtual const fileName & name() const
Return the name of the stream.
Definition: IOstream.H:297
An Istream is an abstract base class for all input systems (streams, files, token lists etc)....
Definition: Istream.H:60
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:57
A list of keywords followed by any number of values (e.g. words and numbers) or sub-dictionaries.
Definition: dictionary.H:162
Dimension set for the base types.
Definition: dimensionSet.H:125
InfoProxy< dimensionSet > info() const
Return info proxy.
Definition: dimensionSet.H:245
Ostream & write(Ostream &os) const
Write.
bool dimensionless() const
Return true if it is dimensionless.
Definition: dimensionSet.C:107
Generic dimensioned Type class.
void operator+=(const dimensioned< Type > &)
void read(const dictionary &, const unitConversion &defaultUnits=NullObjectRef< unitConversion >())
Update the value of dimensioned<Type>
dimensioned()
Null constructor.
void replace(const direction, const dimensioned< cmptType > &)
Return a component with a dimensioned<cmptType>
const dimensionSet & dimensions() const
Return const reference to dimensions.
pTraits< Type >::cmptType cmptType
Component type.
const Type & value() const
Return const reference to value.
dimensioned< cmptType > component(const direction) const
Return a component as a dimensioned<cmptType>
void operator/=(const scalar)
void operator-=(const dimensioned< Type > &)
dimensioned< cmptType > operator[](const direction) const
Return a component as a dimensioned<cmptType>
const word & name() const
Return const reference to name.
bool readIfPresent(const dictionary &, const unitConversion &defaultUnits=NullObjectRef< unitConversion >())
Update the value of dimensioned<Type> if found in the dictionary.
void operator*=(const scalar)
A keyword and a list of tokens is an 'entry'.
Definition: entry.H:68
virtual ITstream & stream() const =0
Return token stream if this entry is a primitive entry.
Traits class for primitives.
Definition: pTraits.H:53
symmTypeOfRank< typename pTraits< arg1 >::cmptType, arg2 *direction(pTraits< arg1 >::rank) >::type type
Definition: products.H:136
Unit conversion structure. Contains the associated dimensions and the multiplier with which to conver...
A class for handling words, derived from string.
Definition: word.H:62
static const word null
An empty word.
Definition: word.H:77
#define PRODUCT_OPERATOR(product, op, opFunc)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:334
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(lagrangian::Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.name(), lagrangian::cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
#define IOInfoInFunction(ios)
Report an IO information message using Foam::Info.
Namespace for OpenFOAM.
static const zero Zero
Definition: zero.H:97
void dot(LagrangianPatchField< typename innerProduct< Type1, Type2 >::type > &f, const LagrangianPatchField< Type1 > &f1, const LagrangianPatchField< Type2 > &f2)
void cmptMultiply(LagrangianPatchField< Type > &f, const LagrangianPatchField< Type > &f1, const LagrangianPatchField< Type > &f2)
void outer(LagrangianPatchField< typename outerProduct< Type1, Type2 >::type > &f, const LagrangianPatchField< Type1 > &f1, const LagrangianPatchField< Type2 > &f2)
void dotdot(LagrangianPatchField< typename scalarProduct< Type1, Type2 >::type > &f, const LagrangianPatchField< Type1 > &f1, const LagrangianPatchField< Type2 > &f2)
const unitConversion unitAny
const HashTable< dimensionSet > & dimensions()
Get the table of dimension sets.
Definition: dimensionSets.C:96
void cmptDivide(LagrangianPatchField< Type > &f, const LagrangianPatchField< Type > &f1, const LagrangianPatchField< Type > &f2)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:258
errorManip< error > abort(error &err)
Definition: errorManip.H:131
const dimensionSet dimless
messageStream Info
void cross(LagrangianPatchField< typename crossProduct< Type1, Type2 >::type > &f, const LagrangianPatchField< Type1 > &f1, const LagrangianPatchField< Type2 > &f2)
void mag(LagrangianPatchField< scalar > &f, const LagrangianPatchField< Type > &f1)
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
const HashTable< unitConversion > & units()
Get the table of unit conversions.
void component(LagrangianPatchField< typename LagrangianPatchField< Type >::cmptType > &sf, const LagrangianPatchField< Type > &f, const direction d)
void writeEntry(Ostream &os, const HashTable< T, Key, Hash > &ht)
Definition: HashTableIO.C:96
void pow(LagrangianPatchField< typename powProduct< Type, r >::type > &f, const LagrangianPatchField< Type > &f1)
Istream & operator>>(Istream &, pistonPointEdgeData &)
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
void sqr(LagrangianPatchField< typename outerProduct< Type, Type >::type > &f, const LagrangianPatchField< Type > &f1)
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
Ostream & operator<<(Ostream &os, const fvConstraints &constraints)
error FatalError
void magSqr(LagrangianPatchField< scalar > &f, const LagrangianPatchField< Type > &f1)
tmp< fvMatrix< Type > > operator-(const fvMatrix< Type > &)
Ostream & indent(Ostream &os)
Indent stream.
Definition: Ostream.H:228
uint8_t direction
Definition: direction.H:45
fileType type(const fileName &, const bool checkVariants=true, const bool followLink=true)
Return the file type: directory or file.
Definition: POSIX.C:488
dictionary dict