38 #define checkField(gf1, gf2, op) \ 39 if ((gf1).mesh() != (gf2).mesh()) \ 41 FatalErrorInFunction \ 42 << "different mesh for fields " \ 43 << (gf1).name() << " and " << (gf2).name() \ 44 << " during operation " << op \ 45 << abort(FatalError); \ 51 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
54 const dictionary&
dict 57 Internal::readField(
dict,
"internalField");
59 boundaryField_.readField(*
this,
dict.subDict(
"boundaryField"));
63 if (
dict.readIfPresent(
"referenceLevel", refLevel))
65 Field<Type>::operator+=(refLevel);
67 forAll(boundaryField_, patchi)
69 boundaryField_[patchi] == boundaryField_[patchi] + refLevel;
75 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
78 const localIOdictionary
dict 99 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
102 if (this->isReadRequired())
105 <<
"read option IOobject::MUST_READ or MUST_READ_IF_MODIFIED" 106 <<
" suggests that a read constructor for field " << this->
name()
107 <<
" would be more appropriate." <<
endl;
111 this->isReadOptional()
112 && this->
template typeHeaderOk<GeometricField<Type, PatchField, GeoMesh>>
121 if (this->size() != GeoMesh::size(this->
mesh()))
124 <<
" number of field elements = " << this->size()
125 <<
" number of mesh elements = " 126 << GeoMesh::size(this->
mesh())
130 readOldTimeIfPresent();
139 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
148 IOobject::READ_IF_PRESENT,
149 IOobject::AUTO_WRITE,
150 this->registerObject()
155 field0.template typeHeaderOk<GeometricField<Type, PatchField, GeoMesh>>
162 <<
"Reading old time level for field" <<
nl << this->info() <<
endl;
164 field0Ptr_ =
new GeometricField<Type, PatchField, GeoMesh>
173 field0Ptr_->oriented() = this->oriented();
175 field0Ptr_->timeIndex_ = timeIndex_ - 1;
177 if (!field0Ptr_->readOldTimeIfPresent())
179 field0Ptr_->oldTime();
191 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
197 const word& patchFieldType
200 Internal(
io,
mesh, ds, false),
203 fieldPrevIterPtr_(nullptr),
207 <<
"Creating temporary" <<
nl << this->info() <<
endl;
213 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
223 Internal(
io,
mesh, ds, false),
226 fieldPrevIterPtr_(nullptr),
227 boundaryField_(
mesh.
boundary(), *this, patchFieldTypes, actualPatchTypes)
230 <<
"Creating temporary" <<
nl << this->info() <<
endl;
236 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
242 const word& patchFieldType
245 Internal(
io,
mesh, dt, false),
248 fieldPrevIterPtr_(nullptr),
252 <<
"Creating temporary" <<
nl << this->info() <<
endl;
254 boundaryField_ == dt.
value();
260 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
270 Internal(
io,
mesh, dt, false),
273 fieldPrevIterPtr_(nullptr),
274 boundaryField_(
mesh.
boundary(), *this, patchFieldTypes, actualPatchTypes)
277 <<
"Creating temporary" <<
nl << this->info() <<
endl;
279 boundaryField_ == dt.
value();
285 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
289 const Internal& diField,
290 const PtrList<PatchField<Type>>& ptfl
293 Internal(
io, diField),
296 fieldPrevIterPtr_(nullptr),
300 <<
"Copy construct from components" <<
nl << this->info() <<
endl;
306 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
311 const PtrList<PatchField<Type>>& ptfl
314 Internal(
io,
std::move(diField)),
317 fieldPrevIterPtr_(nullptr),
321 <<
"Move construct from components" <<
nl << this->info() <<
endl;
327 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
332 const PtrList<PatchField<Type>>& ptfl
335 Internal(
io, tfield),
338 fieldPrevIterPtr_(nullptr),
342 <<
"Construct from tmp internalField" <<
nl << this->info() <<
endl;
348 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
351 const Internal& diField,
352 const PtrList<PatchField<Type>>& ptfl
358 fieldPrevIterPtr_(nullptr),
362 <<
"Copy construct from components" <<
nl << this->info() <<
endl;
368 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
372 const PtrList<PatchField<Type>>& ptfl
375 Internal(
std::move(diField)),
378 fieldPrevIterPtr_(nullptr),
382 <<
"Move construct from components" <<
nl << this->info() <<
endl;
388 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
395 const word& patchFieldType
398 Internal(
io,
mesh, ds, iField),
401 fieldPrevIterPtr_(nullptr),
405 <<
"Copy construct from internal field" <<
nl << this->info() <<
endl;
411 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
418 const word& patchFieldType
421 Internal(
io,
mesh, ds,
std::move(iField)),
424 fieldPrevIterPtr_(nullptr),
428 <<
"Move construct from internal field" <<
nl << this->info() <<
endl;
434 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
441 const PtrList<PatchField<Type>>& ptfl
444 Internal(
io,
mesh, ds, iField),
447 fieldPrevIterPtr_(nullptr),
451 <<
"Copy construct from components" <<
nl << this->info() <<
endl;
457 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
464 const PtrList<PatchField<Type>>& ptfl
467 Internal(
io,
mesh, ds,
std::move(iField)),
470 fieldPrevIterPtr_(nullptr),
474 <<
"Move construct from components" <<
nl << this->info() <<
endl;
480 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
487 const PtrList<PatchField<Type>>& ptfl
490 Internal(
io,
mesh, ds, tfield),
493 fieldPrevIterPtr_(nullptr),
497 <<
"Construct from tmp internalField" <<
nl << this->info() <<
endl;
503 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
508 const bool readOldTime
514 fieldPrevIterPtr_(nullptr),
521 if (this->size() != GeoMesh::size(this->
mesh()))
524 <<
" number of field elements = " << this->size()
525 <<
" number of mesh elements = " << GeoMesh::size(this->
mesh())
531 readOldTimeIfPresent();
535 <<
"Finishing read-construction" <<
nl << this->info() <<
endl;
539 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
550 fieldPrevIterPtr_(nullptr),
557 if (this->size() != GeoMesh::size(this->
mesh()))
560 <<
" number of field elements = " << this->size()
561 <<
" number of mesh elements = " << GeoMesh::size(this->
mesh())
566 <<
"Finishing dictionary-construct" <<
nl << this->info() <<
endl;
570 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
579 fieldPrevIterPtr_(nullptr),
580 boundaryField_(*this, gf.boundaryField_)
583 <<
"Copy construct" <<
nl << this->info() <<
endl;
593 this->writeOpt(IOobject::NO_WRITE);
597 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
603 Internal(tgf.constCast(), tgf.movable()),
606 fieldPrevIterPtr_(nullptr),
607 boundaryField_(*this, tgf().boundaryField_)
610 <<
"Constructing from tmp" <<
nl << this->info() <<
endl;
612 this->writeOpt(IOobject::NO_WRITE);
618 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
628 fieldPrevIterPtr_(nullptr),
629 boundaryField_(*this, gf.boundaryField_)
632 <<
"Copy construct, resetting IO params" <<
nl 633 << this->info() <<
endl;
646 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
650 const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf
653 Internal(
io, tgf.constCast(), tgf.movable()),
656 fieldPrevIterPtr_(nullptr),
657 boundaryField_(*this, tgf().boundaryField_)
660 <<
"Constructing from tmp resetting IO params" <<
nl 661 << this->info() <<
endl;
669 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
676 Internal(newName, gf),
679 fieldPrevIterPtr_(nullptr),
680 boundaryField_(*this, gf.boundaryField_)
683 <<
"Copy construct, resetting name" <<
nl 684 << this->info() <<
endl;
697 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
701 const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf
704 Internal(newName, tgf.constCast(), tgf.movable()),
707 fieldPrevIterPtr_(nullptr),
708 boundaryField_(*this, tgf().boundaryField_)
711 <<
"Constructing from tmp resetting name" <<
nl 712 << this->info() <<
endl;
718 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
723 const word& patchFieldType
729 fieldPrevIterPtr_(nullptr),
730 boundaryField_(this->
mesh().
boundary(), *this, patchFieldType)
733 <<
"Copy construct, resetting IO params" <<
nl 734 << this->info() <<
endl;
736 boundaryField_ == gf.boundaryField_;
749 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
753 const GeometricField<Type, PatchField, GeoMesh>& gf,
761 fieldPrevIterPtr_(nullptr),
771 <<
"Copy construct, resetting IO params and patch types" <<
nl 772 << this->info() <<
endl;
774 boundaryField_ == gf.boundaryField_;
778 field0Ptr_ =
new GeometricField<Type, PatchField, GeoMesh>
787 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
791 const GeometricField<Type, PatchField, GeoMesh>& gf,
793 const word& patchFieldType
799 fieldPrevIterPtr_(nullptr),
800 boundaryField_(*this, gf.boundaryField_, patchIDs, patchFieldType)
803 <<
"Copy construct, resetting IO params and setting patchFieldType " 804 <<
"for patchIDs" <<
nl 805 << this->info() <<
endl;
809 field0Ptr_ =
new GeometricField<Type, PatchField, GeoMesh>
818 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
822 const tmp<GeometricField<Type, PatchField, GeoMesh>>& tgf,
827 Internal(
io, tgf.constCast(), tgf.movable()),
830 fieldPrevIterPtr_(nullptr),
840 <<
"Constructing from tmp resetting IO params and patch types" <<
nl 841 << this->info() <<
endl;
843 boundaryField_ == tgf().boundaryField_;
849 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
859 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
869 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
874 const bool updateAccessTime
877 if (updateAccessTime)
886 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
891 const bool updateAccessTime
894 if (updateAccessTime)
903 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
908 const bool updateAccessTime
911 if (updateAccessTime)
916 return boundaryField_;
920 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
926 && timeIndex_ != this->time().
timeIndex()
927 && !this->
name().ends_with(
"_0")
931 timeIndex_ = this->time().timeIndex();
939 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
944 field0Ptr_->storeOldTime();
947 <<
"Storing old time field for field" <<
nl << this->info() <<
endl;
949 *field0Ptr_ == *
this;
950 field0Ptr_->timeIndex_ = timeIndex_;
952 if (field0Ptr_->field0Ptr_)
954 field0Ptr_->writeOpt(this->writeOpt());
960 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
965 return field0Ptr_->nOldTimes() + 1;
972 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
987 this->registerObject()
995 <<
"created old time field " << field0Ptr_->info() <<
endl;
999 error::printStack(
Info);
1012 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1023 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1026 if (!fieldPrevIterPtr_)
1029 <<
"Allocating previous iteration field" <<
nl 1030 << this->info() <<
endl;
1034 this->
name() +
"PrevIter",
1040 *fieldPrevIterPtr_ == *
this;
1045 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1049 if (!fieldPrevIterPtr_)
1052 <<
"previous iteration field" <<
endl << this->info() <<
endl 1054 <<
" Use field.storePrevIter() at start of iteration." 1058 return *fieldPrevIterPtr_;
1062 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1066 this->setUpToDate();
1068 boundaryField_.evaluate();
1072 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1078 bool needRef =
true;
1080 for (
const auto& pf : boundaryField_)
1082 if (pf.fixesValue())
1093 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1103 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1110 this->
mesh().data::template getOrDefault<bool>
1127 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1135 return this->
name() +
"Final";
1138 return this->
name();
1142 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1155 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1166 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1174 this->
name() +
".T()",
1182 Foam::T(tresult.ref().primitiveFieldRef(), primitiveField());
1183 Foam::T(tresult.ref().boundaryFieldRef(), boundaryField());
1189 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1204 auto tresult = tmp<GeometricField<cmptType, PatchField, GeoMesh>>
::New 1216 Foam::component(tresult.ref().primitiveFieldRef(), primitiveField(), d);
1217 Foam::component(tresult.ref().boundaryFieldRef(), boundaryField(), d);
1223 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1227 const GeometricField
1229 typename GeometricField<Type, PatchField, GeoMesh>::cmptType,
1236 boundaryFieldRef().replace(d, gcf.boundaryField());
1240 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1248 boundaryFieldRef().replace(d, ds.
value());
1252 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1263 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1274 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1285 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1299 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1306 this->
clip(minVal, maxVal);
1310 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1314 boundaryFieldRef().negate();
1318 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1322 boundaryFieldRef().normalise();
1328 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1348 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1354 const auto& gf = tgf();
1384 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1390 internalFieldRef() = dt;
1391 boundaryFieldRef() = dt.
value();
1395 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1401 const auto& gf = tgf();
1414 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1420 internalFieldRef() = dt;
1421 boundaryFieldRef() == dt.
value();
1425 #define COMPUTED_ASSIGNMENT(TYPE, op) \ 1427 template<class Type, template<class> class PatchField, class GeoMesh> \ 1428 void Foam::GeometricField<Type, PatchField, GeoMesh>::operator op \ 1430 const GeometricField<TYPE, PatchField, GeoMesh>& gf \ 1433 checkField(*this, gf, #op); \ 1435 internalFieldRef() op gf.internalField(); \ 1436 boundaryFieldRef() op gf.boundaryField(); \ 1439 template<class Type, template<class> class PatchField, class GeoMesh> \ 1440 void Foam::GeometricField<Type, PatchField, GeoMesh>::operator op \ 1442 const tmp<GeometricField<TYPE, PatchField, GeoMesh>>& tgf \ 1445 operator op(tgf()); \ 1449 template<class Type, template<class> class PatchField, class GeoMesh> \ 1450 void Foam::GeometricField<Type, PatchField, GeoMesh>::operator op \ 1452 const dimensioned<TYPE>& dt \ 1455 internalFieldRef() op dt; \ 1456 boundaryFieldRef() op dt.value(); \ 1464 #undef COMPUTED_ASSIGNMENT 1469 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
1485 template<
class Type,
template<
class>
class PatchField,
class GeoMesh>
#define COMPUTED_ASSIGNMENT(TYPE, op)
const Type & value() const noexcept
Return const reference to value.
const GeometricField< Type, PatchField, GeoMesh > & oldTime() const
Return old time field.
#define checkField(gf1, gf2, op)
const Internal::FieldType & primitiveField() const noexcept
Return a const-reference to the internal field values.
errorManipArg< error, int > exit(error &err, const int errNo=1)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
bool writeData(Ostream &) const
WriteData member function required by regIOobject.
Field< Type >::cmptType cmptType
Component type of the field elements.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
const Internal & internalField() const noexcept
Return a const-reference to the dimensioned internal field.
constexpr char nl
The newline '\n' character (0x0a)
A min/max value pair with additional methods. In addition to conveniently storing values...
Ostream & endl(Ostream &os)
Add newline and flush stream.
tmp< GeometricField< cmptType, PatchField, GeoMesh > > component(const direction) const
Return a component of the field.
orientedType oriented() const noexcept
Return oriented type.
void clip(const dimensioned< MinMax< Type >> &range)
Clip the field to be bounded within the specified range.
Generic GeometricField class.
Generic dimensioned Type class.
const dimensionSet dimless
Dimensionless.
label nOldTimes() const
Return the number of old time fields stored.
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tdf1, const word &name, const dimensionSet &dimensions, const bool initCopy=false)
Global function forwards to reuseTmpDimensionedField::New.
GeometricField(const IOobject &io, const Mesh &mesh, const dimensionSet &ds, const word &patchFieldType=PatchField< Type >::calculatedType())
Construct given IOobject, mesh, dimensions and patch type.
word select(bool final) const
Select the final iteration parameters if `final' is true.
conserve primitiveFieldRef()+
MinMax< label > minMax(const labelHashSet &set)
Find the min/max values of labelHashSet.
#define forAll(list, i)
Loop across all elements in list.
bool needReference() const
Does the field need a reference level for solution.
Dimension set for the base types, which can be used to implement rigorous dimension checking for alge...
const T & min() const noexcept
The min value (first)
bool returnReduceAnd(const bool value, const label comm=UPstream::worldComm)
Perform logical (and) MPI Allreduce on a copy. Uses UPstream::reduceAnd.
IOobject io("surfaceFilmProperties", mesh.time().constant(), mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, false)
void storeOldTimes() const
Store the old-time fields.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
Generic templated field type.
dimensionSet clip(const dimensionSet &ds1, const dimensionSet &ds2)
A class for handling words, derived from Foam::string.
#define DebugInFunction
Report an information message using Foam::Info.
void min(const dimensioned< Type > &dt)
Use the minimum of the field and specified value.
void storeOldTime() const
Store the old-time field.
void maxMin(const dimensioned< Type > &minVal, const dimensioned< Type > &maxVal)
Deprecated(2019-01) identical to clip()
void writeMinMax(Ostream &os) const
Helper function to write the min and max to an Ostream.
propsDict readIfPresent("fields", acceptFields)
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
errorManip< error > abort(error &err)
void negate()
Negate the field inplace. See notes in Field.
An Ostream is an abstract base class for all output systems (streams, files, token lists...
Internal & internalFieldRef(const bool updateAccessTime=true)
Return a reference to the dimensioned internal field.
tmp< GeometricField< Type, PatchField, GeoMesh > > T() const
Return transpose (only if it is a tensor field)
int debug
Static debugging option.
void normalise()
Normalise the field inplace. See notes in Field.
const GeometricField< Type, PatchField, GeoMesh > & prevIter() const
Return previous iteration field.
OBJstream os(runTime.globalPath()/outputName)
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
virtual ~GeometricField()
Destructor.
Generic GeometricBoundaryField class.
List< word > wordList
A List of words.
Template functions to aid in the implementation of demand driven data.
Internal::FieldType & primitiveFieldRef(const bool updateAccessTime=true)
Return a reference to the internal field values.
tmp< GeometricField< Type, PatchField, GeoMesh > > clone() const
Clone.
#define WarningInFunction
Report a warning using Foam::Warning.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers...
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
Boundary & boundaryFieldRef(const bool updateAccessTime=true)
Return a reference to the boundary field.
void correctBoundaryConditions()
Correct boundary field.
messageStream Info
Information stream (stdout output on master, null elsewhere)
void storePrevIter() const
Store the field as the previous iteration value.
void readFields(const typename GeoFieldType::Mesh &mesh, const IOobjectList &objects, const wordHashSet &selectedFields, LIFOStack< regIOobject *> &storedObjects)
Read the selected GeometricFields of the templated type.
Generic mesh wrapper used by volMesh, surfaceMesh, pointMesh etc.
List< label > labelList
A List of labels.
A class for managing temporary objects.
tmp< faMatrix< Type > > operator==(const faMatrix< Type > &, const faMatrix< Type > &)
void max(const dimensioned< Type > &dt)
Use the maximum of the field and specified value.
const dimensionedScalar alpha
Fine-structure constant: default SI units: [].
void deleteDemandDrivenData(DataPtr &dataPtr)
Defines the attributes of an object for which implicit objectRegistry management is supported...
void component(FieldField< Field, typename FieldField< Field, Type >::cmptType > &sf, const FieldField< Field, Type > &f, const direction d)
const Boundary & boundaryField() const noexcept
Return const-reference to the boundary field.
void relax()
Relax field (for steady-state solution).
const dimensionSet & dimensions() const noexcept
Return dimensions.
IOerror FatalIOError
Error stream (stdout output on all processes), with additional 'FOAM FATAL IO ERROR' header text and ...
#define InfoInFunction
Report an information message using Foam::Info.
void replace(const direction d, const GeometricField< cmptType, PatchField, GeoMesh > &gcf)
Replace specified field component with content from another field.