/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2016-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see .
\*---------------------------------------------------------------------------*/
#include "genericPointPatchField.H"
#include "pointPatchFieldMapper.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template
Foam::genericPointPatchField::genericPointPatchField
(
const pointPatch& p,
const DimensionedField& iF
)
:
calculatedPointPatchField(p, iF)
{
NotImplemented;
}
template
Foam::genericPointPatchField::genericPointPatchField
(
const pointPatch& p,
const DimensionedField& iF,
const dictionary& dict
)
:
calculatedPointPatchField(p, iF, dict),
actualTypeName_(dict.get("type")),
dict_(dict)
{
const label patchSize = this->size();
for (const entry& dEntry : dict_)
{
const keyType& key = dEntry.keyword();
if
(
key == "type"
|| !dEntry.isStream() || dEntry.stream().empty()
)
{
continue;
}
ITstream& is = dEntry.stream();
// Read first token
token firstToken(is);
if (firstToken.isWord("nonuniform"))
{
token fieldToken(is);
if (!fieldToken.isCompound())
{
if
(
fieldToken.isLabel()
&& fieldToken.labelToken() == 0
)
{
scalarFields_.insert(key, autoPtr::New());
}
else
{
FatalIOErrorInFunction(dict)
<< "\n token following 'nonuniform' "
"is not a compound"
<< "\n on patch " << this->patch().name()
<< " of field "
<< this->internalField().name()
<< " in file "
<< this->internalField().objectPath() << nl
<< exit(FatalIOError);
}
}
else if
(
fieldToken.compoundToken().type()
== token::Compound>::typeName
)
{
auto fPtr = autoPtr::New();
fPtr->transfer
(
dynamicCast>>
(
fieldToken.transferCompoundToken(is)
)
);
if (fPtr->size() != patchSize)
{
FatalIOErrorInFunction(dict)
<< "\n size of field " << key
<< " (" << fPtr->size() << ')'
<< " is not the same size as the patch ("
<< patchSize << ')'
<< "\n on patch " << this->patch().name()
<< " of field "
<< this->internalField().name()
<< " in file "
<< this->internalField().objectPath() << nl
<< exit(FatalIOError);
}
scalarFields_.insert(key, fPtr);
}
else if
(
fieldToken.compoundToken().type()
== token::Compound>::typeName
)
{
auto fPtr = autoPtr::New();
fPtr->transfer
(
dynamicCast>>
(
fieldToken.transferCompoundToken(is)
)
);
if (fPtr->size() != patchSize)
{
FatalIOErrorInFunction(dict)
<< "\n size of field " << key
<< " (" << fPtr->size() << ')'
<< " is not the same size as the patch ("
<< patchSize << ')'
<< "\n on patch " << this->patch().name()
<< " of field "
<< this->internalField().name()
<< " in file "
<< this->internalField().objectPath() << nl
<< exit(FatalIOError);
}
vectorFields_.insert(key, fPtr);
}
else if
(
fieldToken.compoundToken().type()
== token::Compound>::typeName
)
{
auto fPtr = autoPtr::New();
fPtr->transfer
(
dynamicCast>>
(
fieldToken.transferCompoundToken(is)
)
);
if (fPtr->size() != patchSize)
{
FatalIOErrorInFunction(dict)
<< "\n size of field " << key
<< " (" << fPtr->size() << ')'
<< " is not the same size as the patch ("
<< patchSize << ')'
<< "\n on patch " << this->patch().name()
<< " of field "
<< this->internalField().name()
<< " in file "
<< this->internalField().objectPath() << nl
<< exit(FatalIOError);
}
sphTensorFields_.insert(key, fPtr);
}
else if
(
fieldToken.compoundToken().type()
== token::Compound>::typeName
)
{
auto fPtr = autoPtr::New();
fPtr->transfer
(
dynamicCast>>
(
fieldToken.transferCompoundToken(is)
)
);
if (fPtr->size() != patchSize)
{
FatalIOErrorInFunction(dict)
<< "\n size of field " << key
<< " (" << fPtr->size() << ')'
<< " is not the same size as the patch ("
<< patchSize << ')'
<< "\n on patch " << this->patch().name()
<< " of field "
<< this->internalField().name()
<< " in file "
<< this->internalField().objectPath() << nl
<< exit(FatalIOError);
}
symmTensorFields_.insert(key, fPtr);
}
else if
(
fieldToken.compoundToken().type()
== token::Compound>::typeName
)
{
auto fPtr = autoPtr::New();
fPtr->transfer
(
dynamicCast>>
(
fieldToken.transferCompoundToken(is)
)
);
if (fPtr->size() != patchSize)
{
FatalIOErrorInFunction(dict)
<< "\n size of field " << key
<< " (" << fPtr->size() << ')'
<< " is not the same size as the patch ("
<< patchSize << ')'
<< "\n on patch " << this->patch().name()
<< " of field "
<< this->internalField().name()
<< " in file "
<< this->internalField().objectPath() << nl
<< exit(FatalIOError);
}
tensorFields_.insert(key, fPtr);
}
else
{
FatalIOErrorInFunction(dict)
<< "\n compound " << fieldToken.compoundToken()
<< " not supported"
<< "\n on patch " << this->patch().name()
<< " of field "
<< this->internalField().name()
<< " in file "
<< this->internalField().objectPath() << nl
<< exit(FatalIOError);
}
}
}
}
template
Foam::genericPointPatchField::genericPointPatchField
(
const genericPointPatchField& ptf,
const pointPatch& p,
const DimensionedField& iF,
const pointPatchFieldMapper& mapper
)
:
calculatedPointPatchField(ptf, p, iF, mapper),
actualTypeName_(ptf.actualTypeName_),
dict_(ptf.dict_)
{
forAllConstIters(ptf.scalarFields_, iter)
{
scalarFields_.insert
(
iter.key(),
autoPtr::New(*iter(), mapper)
);
}
forAllConstIters(ptf.vectorFields_, iter)
{
vectorFields_.insert
(
iter.key(),
autoPtr::New(*iter(), mapper)
);
}
forAllConstIters(ptf.sphTensorFields_, iter)
{
sphTensorFields_.insert
(
iter.key(),
autoPtr::New(*iter(), mapper)
);
}
forAllConstIters(ptf.symmTensorFields_, iter)
{
symmTensorFields_.insert
(
iter.key(),
autoPtr::New(*iter(), mapper)
);
}
forAllConstIters(ptf.tensorFields_, iter)
{
tensorFields_.insert
(
iter.key(),
autoPtr::New(*iter(), mapper)
);
}
}
template
Foam::genericPointPatchField::genericPointPatchField
(
const genericPointPatchField& ptf,
const DimensionedField& iF
)
:
calculatedPointPatchField(ptf, iF),
actualTypeName_(ptf.actualTypeName_),
dict_(ptf.dict_),
scalarFields_(ptf.scalarFields_),
vectorFields_(ptf.vectorFields_),
sphTensorFields_(ptf.sphTensorFields_),
symmTensorFields_(ptf.symmTensorFields_),
tensorFields_(ptf.tensorFields_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template
void Foam::genericPointPatchField::autoMap
(
const pointPatchFieldMapper& m
)
{
forAllIters(scalarFields_, iter)
{
(*iter)->autoMap(m);
}
forAllIters(vectorFields_, iter)
{
(*iter)->autoMap(m);
}
forAllIters(sphTensorFields_, iter)
{
(*iter)->autoMap(m);
}
forAllIters(symmTensorFields_, iter)
{
(*iter)->autoMap(m);
}
forAllIters(tensorFields_, iter)
{
(*iter)->autoMap(m);
}
}
template
void Foam::genericPointPatchField::rmap
(
const pointPatchField& ptf,
const labelList& addr
)
{
const genericPointPatchField& dptf =
refCast>(ptf);
forAllIters(scalarFields_, iter)
{
const auto iter2 = dptf.scalarFields_.cfind(iter.key());
if (iter2.found())
{
(*iter)->rmap(*iter2(), addr);
}
}
forAllIters(vectorFields_, iter)
{
const auto iter2 = dptf.vectorFields_.cfind(iter.key());
if (iter2.found())
{
(*iter)->rmap(*iter2(), addr);
}
}
forAllIters(sphTensorFields_, iter)
{
const auto iter2 = dptf.sphTensorFields_.find(iter.key());
if (iter2.found())
{
(*iter)->rmap(*iter2(), addr);
}
}
forAllIters(symmTensorFields_, iter)
{
const auto iter2 = dptf.symmTensorFields_.find(iter.key());
if (iter2.found())
{
(*iter)->rmap(*iter2(), addr);
}
}
forAllIters(tensorFields_, iter)
{
const auto iter2 = dptf.tensorFields_.find(iter.key());
if (iter2.found())
{
(*iter)->rmap(*iter2(), addr);
}
}
}
template
const Foam::word& Foam::genericPointPatchField::actualType() const
{
return actualTypeName_;
}
template
void Foam::genericPointPatchField::write(Ostream& os) const
{
os.writeEntry("type", actualTypeName_);
for (const entry& dEntry : dict_)
{
const keyType& key = dEntry.keyword();
if (key == "type")
{
// NB: "type" written first, no special treatment for "value"
continue;
}
else if
(
dEntry.isStream()
&& dEntry.stream().size()
&& dEntry.stream()[0].isWord("nonuniform")
)
{
if (scalarFields_.found(key))
{
scalarFields_.cfind(key)()->writeEntry(key, os);
}
else if (vectorFields_.found(key))
{
vectorFields_.cfind(key)()->writeEntry(key, os);
}
else if (sphTensorFields_.found(key))
{
sphTensorFields_.cfind(key)()->writeEntry(key, os);
}
else if (symmTensorFields_.found(key))
{
symmTensorFields_.cfind(key)()->writeEntry(key, os);
}
else if (tensorFields_.found(key))
{
tensorFields_.cfind(key)()->writeEntry(key, os);
}
}
else
{
dEntry.write(os);
}
}
}
// ************************************************************************* //