Merge commit 'OpenCFD/master' into olesenm

This commit is contained in:
Mark Olesen
2009-09-22 09:33:23 +02:00
138 changed files with 73792 additions and 471 deletions

View File

@ -282,13 +282,13 @@ void Foam::FaceCellWave<Type>::checkCyclic(const polyPatch& patch) const
}
// Check if patches of given type name are present
// Check if has cyclic patches
template <class Type>
bool Foam::FaceCellWave<Type>::hasPatchType(const word& nameOfType)
bool Foam::FaceCellWave<Type>::hasCyclicPatch() const
{
forAll(mesh_.boundaryMesh(), patchI)
{
if (mesh_.boundaryMesh()[patchI].type() == nameOfType)
if (isA<cyclicPolyPatch>(mesh_.boundaryMesh()[patchI]))
{
return true;
}
@ -811,7 +811,7 @@ Foam::FaceCellWave<Type>::FaceCellWave
changedCell_(mesh_.nCells(), false),
changedCells_(mesh_.nCells()),
nChangedCells_(0),
hasCyclicPatches_(hasPatchType(cyclicPolyPatch::typeName)),
hasCyclicPatches_(hasCyclicPatch()),
nEvals_(0),
nUnvisitedCells_(mesh_.nCells()),
nUnvisitedFaces_(mesh_.nFaces()),
@ -841,7 +841,7 @@ Foam::FaceCellWave<Type>::FaceCellWave
changedCell_(mesh_.nCells(), false),
changedCells_(mesh_.nCells()),
nChangedCells_(0),
hasCyclicPatches_(hasPatchType(cyclicPolyPatch::typeName)),
hasCyclicPatches_(hasCyclicPatch()),
nEvals_(0),
nUnvisitedCells_(mesh_.nCells()),
nUnvisitedFaces_(mesh_.nFaces()),

View File

@ -184,8 +184,8 @@ class FaceCellWave
//- Debugging: check info on both sides of cyclic
void checkCyclic(const polyPatch& pPatch) const;
//- Has patches of certain type?
bool hasPatchType(const word& nameOfType);
//- Has cyclic patch?
bool hasCyclicPatch() const;
//- Merge received patch data into global data
void mergeFaceInfo

View File

@ -139,10 +139,7 @@ void Foam::IOerror::exit(const int)
if (abort_)
{
Perr<< endl << *this << endl
<< "\nFOAM aborting (FOAM_ABORT set)\n" << endl;
printStack(Perr);
::abort();
abort();
}
if (Pstream::parRun())
@ -155,7 +152,13 @@ void Foam::IOerror::exit(const int)
{
if (throwExceptions_)
{
throw *this;
// Make a copy of the error to throw
IOerror errorException(*this);
// Rewind the message buffer for the next error message
messageStreamPtr_->rewind();
throw errorException;
}
else
{
@ -194,7 +197,13 @@ void Foam::IOerror::abort()
{
if (throwExceptions_)
{
throw *this;
// Make a copy of the error to throw
IOerror errorException(*this);
// Rewind the message buffer for the next error message
messageStreamPtr_->rewind();
throw errorException;
}
else
{
@ -209,7 +218,9 @@ void Foam::IOerror::abort()
Foam::Ostream& Foam::operator<<(Ostream& os, const IOerror& ioErr)
{
os << endl << ioErr.message().c_str() << endl << endl;
os << endl
<< ioErr.title().c_str() << endl
<< ioErr.message().c_str() << endl << endl;
os << "file: " << ioErr.ioFileName().c_str();
@ -238,6 +249,6 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const IOerror& ioErr)
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Global error definitions
Foam::IOerror Foam::FatalIOError("--> FOAM FATAL IO ERROR : ");
Foam::IOerror Foam::FatalIOError("--> FOAM FATAL IO ERROR: ");
// ************************************************************************* //

View File

@ -105,7 +105,6 @@ Foam::OSstream& Foam::error::operator()
const int sourceFileLineNumber
)
{
messageStreamPtr_->rewind();
functionName_ = functionName;
sourceFileName_ = sourceFileName;
sourceFileLineNumber_ = sourceFileLineNumber;
@ -137,7 +136,6 @@ Foam::error::operator OSstream&()
Perr<< endl
<< "error::operator OSstream&() : error stream has failed"
<< endl;
printStack(Perr);
abort();
}
@ -178,9 +176,6 @@ void Foam::error::exit(const int errNo)
if (abort_)
{
printStack(*this);
Perr<< endl << *this << endl
<< "\nFOAM aborting (FOAM_ABORT set)\n" << endl;
abort();
}
@ -194,7 +189,13 @@ void Foam::error::exit(const int errNo)
{
if (throwExceptions_)
{
throw *this;
// Make a copy of the error to throw
error errorException(*this);
// Rewind the message buffer for the next error message
messageStreamPtr_->rewind();
throw errorException;
}
else
{
@ -216,30 +217,36 @@ void Foam::error::abort()
if (abort_)
{
printStack(*this);
Perr<< endl << *this << endl
<< "\nFOAM aborting (FOAM_ABORT set)\n" << endl;
printStack(Perr);
::abort();
}
if (Pstream::parRun())
{
printStack(*this);
Perr<< endl << *this << endl
<< "\nFOAM parallel run aborting\n" << endl;
printStack(Perr);
Pstream::abort();
}
else
{
if (throwExceptions_)
{
throw *this;
// Make a copy of the error to throw
error errorException(*this);
// Rewind the message buffer for the next error message
messageStreamPtr_->rewind();
throw errorException;
}
else
{
printStack(*this);
Perr<< endl << *this << endl
<< "\nFOAM aborting\n" << endl;
printStack(Perr);
::abort();
}
}
@ -248,7 +255,9 @@ void Foam::error::abort()
Foam::Ostream& Foam::operator<<(Ostream& os, const error& fErr)
{
os << endl << fErr.message().c_str();
os << endl
<< fErr.title().c_str() << endl
<< fErr.message().c_str();
if (error::level >= 2 && fErr.sourceFileLineNumber())
{
@ -265,6 +274,6 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const error& fErr)
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Global error definitions
Foam::error Foam::FatalError("--> FOAM FATAL ERROR : ");
Foam::error Foam::FatalError("--> FOAM FATAL ERROR: ");
// ************************************************************************* //

View File

@ -35,7 +35,6 @@ int Foam::messageStream::level(Foam::debug::debugSwitch("level", 2));
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Construct from components
Foam::messageStream::messageStream
(
const string& title,
@ -50,7 +49,6 @@ Foam::messageStream::messageStream
{}
//- Construct from dictionary
Foam::messageStream::messageStream(const dictionary& dict)
:
title_(dict.lookup("title")),

View File

@ -47,7 +47,7 @@ Foam::labelList Foam::ProcessorTopology<Patch, ProcPatch>::procNeighbours
{
const Patch& patch = patches[patchi];
if (isType<ProcPatch>(patch))
if (isA<ProcPatch>(patch))
{
const ProcPatch& procPatch =
refCast<const ProcPatch>(patch);
@ -69,7 +69,7 @@ Foam::labelList Foam::ProcessorTopology<Patch, ProcPatch>::procNeighbours
{
const Patch& patch = patches[patchi];
if (isType<ProcPatch>(patch))
if (isA<ProcPatch>(patch))
{
const ProcPatch& procPatch =
refCast<const ProcPatch>(patch);
@ -116,7 +116,7 @@ Foam::ProcessorTopology<Patch, ProcPatch>::ProcessorTopology
forAll(patches, patchi)
{
if (!isType<ProcPatch>(patches[patchi]))
if (!isA<ProcPatch>(patches[patchi]))
{
patchSchedule_[patchEvali].patch = patchi;
patchSchedule_[patchEvali++].init = true;
@ -204,7 +204,7 @@ Foam::ProcessorTopology<Patch, ProcPatch>::ProcessorTopology
forAll(patches, patchi)
{
if (!isType<ProcPatch>(patches[patchi]))
if (!isA<ProcPatch>(patches[patchi]))
{
patchSchedule_[patchEvali].patch = patchi;
patchSchedule_[patchEvali++].init = true;
@ -219,7 +219,7 @@ Foam::ProcessorTopology<Patch, ProcPatch>::ProcessorTopology
// 2a. initEvaluate
forAll(patches, patchi)
{
if (isType<ProcPatch>(patches[patchi]))
if (isA<ProcPatch>(patches[patchi]))
{
patchSchedule_[patchEvali].patch = patchi;
patchSchedule_[patchEvali++].init = true;
@ -229,7 +229,7 @@ Foam::ProcessorTopology<Patch, ProcPatch>::ProcessorTopology
// 2b. evaluate
forAll(patches, patchi)
{
if (isType<ProcPatch>(patches[patchi]))
if (isA<ProcPatch>(patches[patchi]))
{
patchSchedule_[patchEvali].patch = patchi;
patchSchedule_[patchEvali++].init = false;

View File

@ -158,11 +158,7 @@ void Foam::ensightParts::recalculate(const polyMesh& pMesh)
forAll(pMesh.boundaryMesh(), patchI)
{
const polyPatch& pPatch = pMesh.boundaryMesh()[patchI];
if
(
pPatch.size()
&& typeid(pPatch) != typeid(processorPolyPatch)
)
if (pPatch.size() && !isA<processorPolyPatch>(pPatch))
{
partsList_.set
(

View File

@ -31,6 +31,7 @@ License
#include "fvMeshAdder.H"
#include "faceCoupleInfo.H"
#include "processorFvPatchField.H"
#include "processorFvsPatchField.H"
#include "polyTopoChange.H"
#include "removeCells.H"
#include "polyModifyFace.H"
@ -2124,54 +2125,56 @@ Foam::autoPtr<Foam::mapDistributePolyMesh> Foam::fvMeshDistribute::distribute
// Bit of hack: processorFvPatchField does not get reset since created
// from nothing so explicitly reset.
initPatchFields<volScalarField>
initPatchFields<volScalarField, processorFvPatchField<scalar> >
(
processorFvPatchField<scalar>::typeName,
pTraits<scalar>::zero
);
initPatchFields<volVectorField>
initPatchFields<volVectorField, processorFvPatchField<vector> >
(
processorFvPatchField<vector>::typeName,
pTraits<vector>::zero
);
initPatchFields<volSphericalTensorField>
initPatchFields
<
volSphericalTensorField,
processorFvPatchField<sphericalTensor>
>
(
processorFvPatchField<sphericalTensor>::typeName,
pTraits<sphericalTensor>::zero
);
initPatchFields<volSymmTensorField>
initPatchFields<volSymmTensorField, processorFvPatchField<symmTensor> >
(
processorFvPatchField<symmTensor>::typeName,
pTraits<symmTensor>::zero
);
initPatchFields<volTensorField>
initPatchFields<volTensorField, processorFvPatchField<tensor> >
(
processorFvPatchField<tensor>::typeName,
pTraits<tensor>::zero
);
initPatchFields<surfaceScalarField>
initPatchFields<surfaceScalarField, processorFvsPatchField<scalar> >
(
processorFvPatchField<scalar>::typeName,
pTraits<scalar>::zero
);
initPatchFields<surfaceVectorField>
initPatchFields<surfaceVectorField, processorFvsPatchField<vector> >
(
processorFvPatchField<vector>::typeName,
pTraits<vector>::zero
);
initPatchFields<surfaceSphericalTensorField>
initPatchFields
<
surfaceSphericalTensorField,
processorFvsPatchField<sphericalTensor>
>
(
processorFvPatchField<sphericalTensor>::typeName,
pTraits<sphericalTensor>::zero
);
initPatchFields<surfaceSymmTensorField>
initPatchFields
<
surfaceSymmTensorField,
processorFvsPatchField<symmTensor>
>
(
processorFvPatchField<symmTensor>::typeName,
pTraits<symmTensor>::zero
);
initPatchFields<surfaceTensorField>
initPatchFields<surfaceTensorField, processorFvsPatchField<tensor> >
(
processorFvPatchField<tensor>::typeName,
pTraits<tensor>::zero
);

View File

@ -164,10 +164,9 @@ class fvMeshDistribute
);
//- Init patch fields of certain type
template<class GeoField>
template<class GeoField, class PatchFieldType>
void initPatchFields
(
const word& patchFieldType,
const typename GeoField::value_type& initVal
);

View File

@ -235,10 +235,9 @@ void Foam::fvMeshDistribute::mapBoundaryFields
// Init patch fields of certain type
template<class GeoField>
template<class GeoField, class PatchFieldType>
void Foam::fvMeshDistribute::initPatchFields
(
const word& patchFieldType,
const typename GeoField::value_type& initVal
)
{
@ -264,7 +263,7 @@ void Foam::fvMeshDistribute::initPatchFields
forAll(bfld, patchI)
{
if (bfld[patchI].type() == patchFieldType)
if (isA<PatchFieldType>(bfld[patchI]))
{
bfld[patchI] == initVal;
}

View File

@ -774,7 +774,7 @@ void Foam::addPatchCellLayer::setRefinement
", polyTopoChange&)"
) << "boundary-edge-to-be-extruded:"
<< pp.points()[meshPoints[e[0]]]
<< pp.points()[meshPoints[e[0]]]
<< pp.points()[meshPoints[e[1]]]
<< " has more than two faces using it:" << eFaces
<< abort(FatalError);
}
@ -816,7 +816,7 @@ void Foam::addPatchCellLayer::setRefinement
", polyTopoChange&)"
) << "boundary-edge-to-be-extruded:"
<< pp.points()[meshPoints[e[0]]]
<< pp.points()[meshPoints[e[0]]]
<< pp.points()[meshPoints[e[1]]]
<< " has more than two boundary faces"
<< " using it:"
<< bFaceI << " fc:"

View File

@ -52,7 +52,7 @@ bool Foam::adjustPhi
const fvPatchVectorField& Up = U.boundaryField()[patchi];
const fvsPatchScalarField& phip = phi.boundaryField()[patchi];
if (!isType<processorFvsPatchScalarField>(phip))
if (!isA<processorFvsPatchScalarField>(phip))
{
if
(
@ -128,7 +128,7 @@ bool Foam::adjustPhi
const fvPatchVectorField& Up = U.boundaryField()[patchi];
fvsPatchScalarField& phip = phi.boundaryField()[patchi];
if (!isType<processorFvsPatchScalarField>(phip))
if (!isA<processorFvsPatchScalarField>(phip))
{
if
(

View File

@ -1,4 +1,4 @@
if (!isType<zeroGradientFvPatchScalarField>(k_.boundaryField()[patchi]))
if (!isA<zeroGradientFvPatchScalarField>(k_.boundaryField()[patchi]))
{
FatalErrorIn("wall-function evaluation")
<< k_.boundaryField()[patchi].type()
@ -8,7 +8,7 @@ if (!isType<zeroGradientFvPatchScalarField>(k_.boundaryField()[patchi]))
<< exit(FatalError);
}
if (!isType<zeroGradientFvPatchScalarField>(epsilon_.boundaryField()[patchi]))
if (!isA<zeroGradientFvPatchScalarField>(epsilon_.boundaryField()[patchi]))
{
FatalErrorIn("wall-function evaluation")
<< epsilon_.boundaryField()[patchi].type()

View File

@ -61,7 +61,7 @@ void Foam::fanFvPatchField<Foam::scalar>::updateCoeffs()
(
scalarField::subField(phip, size()/2)
/scalarField::subField(patch().magSf(), size()/2),
0.0
scalar(0)
);
if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
@ -79,7 +79,7 @@ void Foam::fanFvPatchField<Foam::scalar>::updateCoeffs()
jump_ += f_[i]*pow(Un, i);
}
jump_ = max(jump_, 0.0);
jump_ = max(jump_, scalar(0));
}
jumpCyclicFvPatchField<scalar>::updateCoeffs();

View File

@ -111,7 +111,7 @@ void Foam::fvMeshSubset::doCoupledPatches
{
const polyPatch& pp = oldPatches[oldPatchI];
if (typeid(pp) == typeid(processorPolyPatch))
if (isA<processorPolyPatch>(pp))
{
const processorPolyPatch& procPatch =
refCast<const processorPolyPatch>(pp);
@ -133,7 +133,7 @@ void Foam::fvMeshSubset::doCoupledPatches
{
const polyPatch& pp = oldPatches[oldPatchI];
if (typeid(pp) == typeid(processorPolyPatch))
if (isA<processorPolyPatch>(pp))
{
const processorPolyPatch& procPatch =
refCast<const processorPolyPatch>(pp);
@ -171,7 +171,7 @@ void Foam::fvMeshSubset::doCoupledPatches
{
const polyPatch& pp = oldPatches[oldPatchI];
if (typeid(pp) == typeid(cyclicPolyPatch))
if (isA<cyclicPolyPatch>(pp))
{
const cyclicPolyPatch& cycPatch =
refCast<const cyclicPolyPatch>(pp);

View File

@ -37,13 +37,7 @@ void Foam::nearWallDist::doAll()
cellDistFuncs wallUtils(mesh_);
// Get patch ids of walls
labelHashSet wallPatchIDs
(
wallUtils.getPatchIDs
(
wallPolyPatch::typeName
)
);
labelHashSet wallPatchIDs(wallUtils.getPatchIDs<wallPolyPatch>());
// Size neighbours array for maximum possible
@ -60,7 +54,7 @@ void Foam::nearWallDist::doAll()
const fvPatch& patch = mesh_.boundary()[patchI];
if (patch.type() == wallFvPatch::typeName)
if (isA<wallFvPatch>(patch))
{
const polyPatch& pPatch = patch.patch();

View File

@ -41,7 +41,7 @@ void Foam::nearWallDistNoSearch::doAll()
{
fvPatchScalarField& ypatch = operator[](patchI);
if (patches[patchI].type() == wallFvPatch::typeName)
if (isA<wallFvPatch>(patches[patchI]))
{
const unallocLabelList& faceCells = patches[patchI].faceCells();

View File

@ -60,7 +60,7 @@ void Foam::reflectionVectors::correct()
forAll(patches, patchi)
{
// find the nearest face for every cell
if (patches[patchi].type() == wallFvPatch::typeName)
if (isA<wallFvPatch>(patches[patchi]))
{
n_.boundaryField()[patchi] =
mesh.Sf().boundaryField()[patchi]

View File

@ -68,7 +68,7 @@ Foam::wallDist::~wallDist()
void Foam::wallDist::correct()
{
// Get patchids of walls
labelHashSet wallPatchIDs(getPatchIDs(wallPolyPatch::typeName));
labelHashSet wallPatchIDs(getPatchIDs<wallPolyPatch>());
// Calculate distance starting from wallPatch faces.
patchWave wave(cellDistFuncs::mesh(), wallPatchIDs, correctWalls_);
@ -79,7 +79,7 @@ void Foam::wallDist::correct()
// Transfer values on patches into boundaryField of *this
forAll(boundaryField(), patchI)
{
if (boundaryField()[patchI].type() != emptyFvPatchScalarField::typeName)
if (!isA<emptyFvPatchScalarField>(boundaryField()[patchI]))
{
scalarField& waveFld = wave.patchDistance()[patchI];

View File

@ -80,7 +80,7 @@ void Foam::wallDistData<TransferType>::correct()
//
// Get patchids of walls
labelHashSet wallPatchIDs(getPatchIDs(wallPolyPatch::typeName));
labelHashSet wallPatchIDs(getPatchIDs<wallPolyPatch>());
// Collect pointers to data on patches
UPtrList<Field<Type> > patchData(mesh.boundaryMesh().size());
@ -109,7 +109,7 @@ void Foam::wallDistData<TransferType>::correct()
{
scalarField& waveFld = wave.patchDistance()[patchI];
if (boundaryField()[patchI].type() != emptyFvPatchScalarField::typeName)
if (!isA<emptyFvPatchScalarField>(boundaryField()[patchI]))
{
boundaryField()[patchI].transfer(waveFld);

View File

@ -367,7 +367,7 @@ Foam::genericFvPatchField<Type>::genericFvPatchField
new scalarField
(
this->size(),
fieldToken.scalarToken()
fieldToken.number()
)
);
}

View File

@ -1,4 +1,4 @@
if (isType<wallPolyPatch>(pbMesh[patch(face())]))
if (isA<wallPolyPatch>(pbMesh[patch(face())]))
{
keepParcel = sDB.wall().wallTreatment(*this, face());
@ -12,7 +12,7 @@ if (isType<wallPolyPatch>(pbMesh[patch(face())]))
U() = (magUs/magV1)*v1*n() + vs*sDB.axisOfSymmetry();
}
}
else if (isType<wedgePolyPatch>(pbMesh[patch(face())]))
else if (isA<wedgePolyPatch>(pbMesh[patch(face())]))
{
// check if parcel is trying to move out of the domain
label patchi = patch(face());
@ -27,7 +27,7 @@ else if (isType<wedgePolyPatch>(pbMesh[patch(face())]))
U() -= 2.0*Un2*n();
}
}
else if (isType<symmetryPolyPatch>(pbMesh[patch(face())]))
else if (isA<symmetryPolyPatch>(pbMesh[patch(face())]))
{
// check if parcel is trying to move out of the domain
label patchi = patch(face());

View File

@ -314,7 +314,7 @@ bool Foam::parcel::move(spray& sDB)
{
if (face() > -1)
{
if (isType<processorPolyPatch>(pbMesh[patch(face())]))
if (isA<processorPolyPatch>(pbMesh[patch(face())]))
{
switchProcessor = true;
}

View File

@ -242,11 +242,11 @@ Foam::spray::spray
// check for the type of boundary condition
forAll(bMesh, patchi)
{
if (isType<symmetryPolyPatch>(bMesh[patchi]))
if (isA<symmetryPolyPatch>(bMesh[patchi]))
{
symPlaneExist = true;
}
else if (isType<wedgePolyPatch>(bMesh[patchi]))
else if (isA<wedgePolyPatch>(bMesh[patchi]))
{
wedgeExist = true;
patches[n++] = patchi;

View File

@ -82,7 +82,7 @@ bool reflectParcel::wallTreatment
const polyMesh& mesh = spray_.mesh();
if (isType<wallPolyPatch>(mesh_.boundaryMesh()[patchi]))
if (isA<wallPolyPatch>(mesh_.boundaryMesh()[patchi]))
{
// wallNormal defined to point outwards of domain
vector Sf = mesh_.Sf().boundaryField()[patchi][facei];

View File

@ -60,7 +60,7 @@ bool Foam::DsmcParcel<ParcelType>::move
if (p.onBoundary() && td.keepParticle)
{
if (isType<processorPolyPatch>(pbMesh[p.patch(p.face())]))
if (isA<processorPolyPatch>(pbMesh[p.patch(p.face())]))
{
td.switchProcessor = true;
}

View File

@ -52,7 +52,7 @@ Foam::FreeStream<CloudType>::FreeStream
{
const polyPatch& patch = cloud.mesh().boundaryMesh()[p];
if (patch.type() == polyPatch::typeName)
if (isType<polyPatch>(patch))
{
patches.append(p);
}

View File

@ -263,7 +263,7 @@ bool Foam::KinematicParcel<ParcelType>::move(TrackData& td)
if (p.onBoundary() && td.keepParticle)
{
if (isType<processorPolyPatch>(pbMesh[p.patch(p.face())]))
if (isA<processorPolyPatch>(pbMesh[p.patch(p.face())]))
{
td.switchProcessor = true;
}

View File

@ -367,7 +367,7 @@ void Foam::referredCellList::buildReferredCellList
// boundaries. Separate treatment allows the serial version to run
// transparently.
if (mesh.boundaryMesh()[patchI].type() == "cyclic")
if (isA<cyclicPolyPatch>(mesh.boundaryMesh()[patchI]))
{
const cyclicPolyPatch& patch = refCast<const cyclicPolyPatch>
(

View File

@ -84,7 +84,7 @@ bool Foam::solidParticle::move(solidParticle::trackData& td)
if (onBoundary() && td.keepParticle)
{
if (isType<processorPolyPatch>(pbMesh[patch(face())]))
if (isA<processorPolyPatch>(pbMesh[patch(face())]))
{
td.switchProcessor = true;
}

View File

@ -104,27 +104,6 @@ Foam::labelHashSet Foam::cellDistFuncs::getPatchIDs
}
// Get patch ids of patches of certain type (e.g. 'polyProcessorPatch')
Foam::labelHashSet Foam::cellDistFuncs::getPatchIDs(const word& wantedType)
const
{
const polyBoundaryMesh& bMesh = mesh().boundaryMesh();
labelHashSet patchIDs(bMesh.size());
forAll(bMesh, patchI)
{
const polyPatch& patch = bMesh[patchI];
if (patch.type() == wantedType)
{
patchIDs.insert(patchI);
}
}
return patchIDs;
}
// Return smallest true distance from p to any of wallFaces.
// Note that even if normal hits face we still check other faces.
// Note that wallFaces is untruncated and we explicitly pass in size.

View File

@ -30,6 +30,7 @@ Description
SourceFiles
cellDistFuncs.C
cellDistFuncsTemplates.C
\*---------------------------------------------------------------------------*/
@ -101,8 +102,10 @@ public:
//- Get patchIDs of named patches
labelHashSet getPatchIDs(const wordList&) const;
//- Get patchIDs of certain type (e.g. 'processorPolyPatch')
labelHashSet getPatchIDs(const word&) const;
//- Get patchIDs of/derived off certain type (e.g. 'processorPolyPatch')
// Uses isA, not isType
template<class Type>
labelHashSet getPatchIDs() const;
//- Calculate smallest true distance (and face index)
// from pt to faces wallFaces.
@ -159,6 +162,12 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "cellDistFuncsTemplates.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,52 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 2 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, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "cellDistFuncs.H"
#include "polyMesh.H"
#include "polyBoundaryMesh.H"
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type>
Foam::labelHashSet Foam::cellDistFuncs::getPatchIDs() const
{
const polyBoundaryMesh& bMesh = mesh().boundaryMesh();
labelHashSet patchIDs(bMesh.size());
forAll(bMesh, patchI)
{
if (isA<Type>(bMesh[patchI]))
{
patchIDs.insert(patchI);
}
}
return patchIDs;
}
// ************************************************************************* //

View File

@ -366,14 +366,24 @@ void Foam::directMappedPatchBase::calcMapping() const
if
(
offset_ == vector::zero
&& mode_ == NEARESTPATCHFACE
&& sampleRegion_ == patch_.boundaryMesh().mesh().name()
&& samplePatch_ == patch_.name()
)
{
FatalErrorIn("directMappedPatchBase::calcMapping() const")
WarningIn("directMappedPatchBase::calcMapping() const")
<< "Invalid offset " << offset_ << endl
<< "Offset is the vector added to the patch face centres to"
<< " find the cell supplying the data."
<< exit(FatalError);
<< " find the patch face supplying the data." << endl
<< "Setting it to " << offset_
<< " on the same patch, on the same region"
<< " will find the faces themselves which does not make sense"
<< " for anything but testing." << endl
<< "patch_:" << patch_.name() << endl
<< "sampleRegion_:" << sampleRegion_ << endl
<< "mode_:" << sampleModeNames_[mode_] << endl
<< "samplePatch_:" << samplePatch_ << endl
<< "offset_:" << offset_ << endl;
}
@ -422,7 +432,7 @@ void Foam::directMappedPatchBase::calcMapping() const
+ "_directMapped.obj"
);
Pout<< "Dumping mapping as lines from patch faceCentres to"
<< " sampled cellCentres to file " << str.name() << endl;
<< " sampled cell/faceCentres to file " << str.name() << endl;
label vertI = 0;

View File

@ -113,7 +113,7 @@ void faceSet::sync(const polyMesh& mesh)
{
const polyPatch& pp = patches[patchI];
if (isType<processorPolyPatch>(pp))
if (isA<processorPolyPatch>(pp))
{
const processorPolyPatch& procPatch =
refCast<const processorPolyPatch>(pp);
@ -145,7 +145,7 @@ void faceSet::sync(const polyMesh& mesh)
{
const polyPatch& pp = patches[patchI];
if (isType<processorPolyPatch>(pp))
if (isA<processorPolyPatch>(pp))
{
const processorPolyPatch& procPatch =
refCast<const processorPolyPatch>(pp);
@ -174,7 +174,7 @@ void faceSet::sync(const polyMesh& mesh)
{
const polyPatch& pp = patches[patchI];
if (typeid(pp) == typeid(cyclicPolyPatch))
if (isA<cyclicPolyPatch>(pp))
{
const cyclicPolyPatch& cycPatch =
refCast<const cyclicPolyPatch>(pp);

View File

@ -100,7 +100,7 @@ meshToMesh::meshToMesh
forAll (toMesh_.boundaryMesh(), patchi)
{
// Add the processor patches in the toMesh to the cuttingPatches list
if (toMesh_.boundaryMesh()[patchi].type() == processorFvPatch::typeName)
if (isA<processorPolyPatch>(toMesh_.boundaryMesh()[patchi]))
{
cuttingPatches_.insert
(

View File

@ -179,8 +179,8 @@ void Foam::thresholdCellFaces::calculate
if
(
isType<emptyPolyPatch>(p)
|| (Pstream::parRun() && isType<processorPolyPatch>(p))
isA<emptyPolyPatch>(p)
|| (Pstream::parRun() && isA<processorPolyPatch>(p))
)
{
continue;

View File

@ -175,7 +175,7 @@ void Foam::linearValveFvMesh::makeSlidersDead()
// Enable layering
forAll (topoChanges, modI)
{
if (typeid(topoChanges[modI]) == typeid(slidingInterface))
if (isA<slidingInterface>(topoChanges[modI]))
{
topoChanges[modI].disable();
}
@ -197,7 +197,7 @@ void Foam::linearValveFvMesh::makeSlidersLive()
// Enable sliding interface
forAll (topoChanges, modI)
{
if (typeid(topoChanges[modI]) == typeid(slidingInterface))
if (isA<slidingInterface>(topoChanges[modI]))
{
topoChanges[modI].enable();
}
@ -220,7 +220,7 @@ bool Foam::linearValveFvMesh::attached() const
forAll (topoChanges, modI)
{
if (typeid(topoChanges[modI]) == typeid(slidingInterface))
if (isA<slidingInterface>(topoChanges[modI]))
{
result =
result
@ -231,7 +231,7 @@ bool Foam::linearValveFvMesh::attached() const
// Check thal all sliders are in sync (debug only)
forAll (topoChanges, modI)
{
if (typeid(topoChanges[modI]) == typeid(slidingInterface))
if (isA<slidingInterface>(topoChanges[modI]))
{
if
(

View File

@ -219,11 +219,11 @@ void Foam::linearValveLayersFvMesh::makeLayersLive()
// Enable layering
forAll (topoChanges, modI)
{
if (typeid(topoChanges[modI]) == typeid(layerAdditionRemoval))
if (isA<layerAdditionRemoval>(topoChanges[modI]))
{
topoChanges[modI].enable();
}
else if (typeid(topoChanges[modI]) == typeid(slidingInterface))
else if (isA<slidingInterface>(topoChanges[modI]))
{
topoChanges[modI].disable();
}
@ -245,11 +245,11 @@ void Foam::linearValveLayersFvMesh::makeSlidersLive()
// Enable sliding interface
forAll (topoChanges, modI)
{
if (typeid(topoChanges[modI]) == typeid(layerAdditionRemoval))
if (isA<layerAdditionRemoval>(topoChanges[modI]))
{
topoChanges[modI].disable();
}
else if (typeid(topoChanges[modI]) == typeid(slidingInterface))
else if (isA<slidingInterface>(topoChanges[modI]))
{
topoChanges[modI].enable();
}
@ -272,7 +272,7 @@ bool Foam::linearValveLayersFvMesh::attached() const
forAll (topoChanges, modI)
{
if (typeid(topoChanges[modI]) == typeid(slidingInterface))
if (isA<slidingInterface>(topoChanges[modI]))
{
result =
result
@ -283,7 +283,7 @@ bool Foam::linearValveLayersFvMesh::attached() const
// Check thal all sliders are in sync (debug only)
forAll (topoChanges, modI)
{
if (typeid(topoChanges[modI]) == typeid(slidingInterface))
if (isA<slidingInterface>(topoChanges[modI]))
{
if
(

View File

@ -46,6 +46,11 @@ bool triSurface::stitchTriangles
pointField newPoints;
bool hasMerged = mergePoints(rawPoints, tol, verbose, pointMap, newPoints);
pointField& ps = storedPoints();
// Set the coordinates to the merged ones
ps = newPoints;
if (hasMerged)
{
if (verbose)
@ -54,11 +59,6 @@ bool triSurface::stitchTriangles
<< " points down to " << newPoints.size() << endl;
}
pointField& ps = storedPoints();
// Set the coordinates to the merged ones
ps = newPoints;
// Reset the triangle point labels to the unique points array
label newTriangleI = 0;
forAll(*this, i)

View File

@ -71,7 +71,7 @@ void vanDriestDelta::calcDelta()
const fvPatchList& patches = mesh_.boundary();
forAll(patches, patchi)
{
if (isType<wallFvPatch>(patches[patchi]))
if (isA<wallFvPatch>(patches[patchi]))
{
const fvPatchVectorField& Uw = U.boundaryField()[patchi];
const scalarField& rhow = rho.boundaryField()[patchi];

View File

@ -370,7 +370,7 @@ void LRR::correct()
{
const fvPatch& curPatch = patches[patchi];
if (typeid(curPatch) == typeid(wallFvPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -432,7 +432,7 @@ void LRR::correct()
{
const fvPatch& curPatch = patches[patchi];
if (typeid(curPatch) == typeid(wallFvPatch))
if (isA<wallFvPatch>(curPatch))
{
symmTensorField& Rw = R_.boundaryField()[patchi];

View File

@ -408,7 +408,7 @@ void LaunderGibsonRSTM::correct()
{
const fvPatch& curPatch = patches[patchi];
if (typeid(curPatch) == typeid(wallFvPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -478,7 +478,7 @@ void LaunderGibsonRSTM::correct()
{
const fvPatch& curPatch = patches[patchi];
if (typeid(curPatch) == typeid(wallFvPatch))
if (isA<wallFvPatch>(curPatch))
{
symmTensorField& Rw = R_.boundaryField()[patchi];

View File

@ -142,7 +142,7 @@ LaunderSharmaKE::LaunderSharmaKE
"k",
runTime_.timeName(),
mesh_,
IOobject::NO_READ,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh_
@ -155,7 +155,7 @@ LaunderSharmaKE::LaunderSharmaKE
"epsilon",
runTime_.timeName(),
mesh_,
IOobject::NO_READ,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh_

View File

@ -37,6 +37,8 @@ $(kqRWallFunctions)/kqRWallFunction/kqRWallFunctionFvPatchFields.C
derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C
derivedFvPatchFields/turbulentMixingLengthDissipationRateInlet/turbulentMixingLengthDissipationRateInletFvPatchScalarField.C
derivedFvPatchFields/turbulentMixingLengthFrequencyInlet/turbulentMixingLengthFrequencyInletFvPatchScalarField.C
derivedFvPatchFields/turbulentTemperatureCoupledBaffle/turbulentTemperatureCoupledBaffleFvPatchScalarField.C
derivedFvPatchFields/turbulentTemperatureCoupledBaffle/regionProperties.C
backwardsCompatibility/wallFunctions/backwardsCompatibilityWallFunctions.C

View File

@ -7,4 +7,6 @@ EXE_INC = \
LIB_LIBS = \
-lcompressibleTurbulenceModel \
-lfiniteVolume \
-lbasicThermophysicalModels \
-lspecie \
-lmeshTools

View File

@ -174,7 +174,7 @@ tmp<scalarField> RASModel::yPlus(const label patchNo, const scalar Cmu) const
tmp<scalarField> tYp(new scalarField(curPatch.size()));
scalarField& Yp = tYp();
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
Yp = pow025(Cmu)
*y_[patchNo]

View File

@ -73,7 +73,7 @@ tmp<volScalarField> autoCreateAlphat
forAll(bm, patchI)
{
if (isType<wallFvPatch>(bm[patchI]))
if (isA<wallFvPatch>(bm[patchI]))
{
alphatBoundaryTypes[patchI] =
RASModels::alphatWallFunctionFvPatchScalarField::typeName;
@ -143,7 +143,7 @@ tmp<volScalarField> autoCreateMut
forAll(bm, patchI)
{
if (isType<wallFvPatch>(bm[patchI]))
if (isA<wallFvPatch>(bm[patchI]))
{
mutBoundaryTypes[patchI] =
RASModels::mutkWallFunctionFvPatchScalarField::typeName;

View File

@ -28,7 +28,7 @@ License
#include "Time.H"
#include "OSspecific.H"
#include "wallPolyPatch.H"
#include "wallFvPatch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -111,7 +111,7 @@ autoCreateWallFunctionField
forAll(newPatchFields, patchI)
{
if (isType<wallPolyPatch>(mesh.boundaryMesh()[patchI]))
if (isA<wallFvPatch>(mesh.boundary()[patchI]))
{
newPatchFields.set
(

View File

@ -27,7 +27,6 @@ License
#include "turbulentMixingLengthFrequencyInletFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "surfaceFields.H"
#include "volFields.H"
#include "RASModel.H"

View File

@ -0,0 +1,69 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 2 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, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "regionProperties.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::regionProperties::regionProperties(const Time& runTime)
:
IOdictionary
(
IOobject
(
"regionProperties",
runTime.time().constant(),
runTime.db(),
IOobject::MUST_READ,
IOobject::NO_WRITE
)
),
fluidRegionNames_(lookup("fluidRegionNames")),
solidRegionNames_(lookup("solidRegionNames"))
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::regionProperties::~regionProperties()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
const Foam::List<Foam::word>& Foam::regionProperties::fluidRegionNames() const
{
return fluidRegionNames_;
}
const Foam::List<Foam::word>& Foam::regionProperties::solidRegionNames() const
{
return solidRegionNames_;
}
// ************************************************************************* //

View File

@ -0,0 +1,106 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 2 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, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class
regionProperties
Description
Simple class to hold region information for coupled region simulations
SourceFiles
regionProperties.C
\*---------------------------------------------------------------------------*/
#ifndef regionProperties_H
#define regionProperties_H
#include "IOdictionary.H"
#include "Time.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class regionProperties Declaration
\*---------------------------------------------------------------------------*/
class regionProperties
:
public IOdictionary
{
// Private data
//- List of the fluid region names
List<word> fluidRegionNames_;
//- List of the solid region names
List<word> solidRegionNames_;
// Private Member Functions
//- Disallow default bitwise copy construct
regionProperties(const regionProperties&);
//- Disallow default bitwise assignment
void operator=(const regionProperties&);
public:
// Constructors
//- Construct from components
regionProperties(const Time& runTime);
// Destructor
~regionProperties();
// Member Functions
// Access
//- Return const reference to the list of fluid region names
const List<word>& fluidRegionNames() const;
//- Return const reference to the list of solid region names
const List<word>& solidRegionNames() const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,430 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 2 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, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "turbulentTemperatureCoupledBaffleFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "directMappedPatchBase.H"
#include "regionProperties.H"
#include "basicThermo.H"
#include "RASModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace compressible
{
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
bool turbulentTemperatureCoupledBaffleFvPatchScalarField::interfaceOwner
(
const polyMesh& nbrRegion,
const polyPatch& nbrPatch
) const
{
const fvMesh& myRegion = patch().boundaryMesh().mesh();
if (nbrRegion.name() == myRegion.name())
{
return patch().index() < nbrPatch.index();
}
else
{
const regionProperties& props =
myRegion.objectRegistry::parent().lookupObject<regionProperties>
(
"regionProperties"
);
label myIndex = findIndex(props.fluidRegionNames(), myRegion.name());
if (myIndex == -1)
{
label i = findIndex(props.solidRegionNames(), myRegion.name());
if (i == -1)
{
FatalErrorIn
(
"turbulentTemperatureCoupledBaffleFvPatchScalarField"
"::interfaceOwner(const polyMesh&"
", const polyPatch&)const"
) << "Cannot find region " << myRegion.name()
<< " neither in fluids " << props.fluidRegionNames()
<< " nor in solids " << props.solidRegionNames()
<< exit(FatalError);
}
myIndex = props.fluidRegionNames().size() + i;
}
label nbrIndex = findIndex
(
props.fluidRegionNames(),
nbrRegion.name()
);
if (nbrIndex == -1)
{
label i = findIndex(props.solidRegionNames(), nbrRegion.name());
if (i == -1)
{
FatalErrorIn
(
"coupleManager::interfaceOwner"
"(const polyMesh&, const polyPatch&) const"
) << "Cannot find region " << nbrRegion.name()
<< " neither in fluids " << props.fluidRegionNames()
<< " nor in solids " << props.solidRegionNames()
<< exit(FatalError);
}
nbrIndex = props.fluidRegionNames().size() + i;
}
return myIndex < nbrIndex;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
turbulentTemperatureCoupledBaffleFvPatchScalarField::
turbulentTemperatureCoupledBaffleFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
mixedFvPatchScalarField(p, iF),
neighbourFieldName_("undefined-neighbourFieldName"),
KName_("undefined-K")
{
this->refValue() = 0.0;
this->refGrad() = 0.0;
this->valueFraction() = 1.0;
this->fixesValue_ = true;
}
turbulentTemperatureCoupledBaffleFvPatchScalarField::
turbulentTemperatureCoupledBaffleFvPatchScalarField
(
const turbulentTemperatureCoupledBaffleFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
mixedFvPatchScalarField(ptf, p, iF, mapper),
neighbourFieldName_(ptf.neighbourFieldName_),
KName_(ptf.KName_),
fixesValue_(ptf.fixesValue_)
{}
turbulentTemperatureCoupledBaffleFvPatchScalarField::
turbulentTemperatureCoupledBaffleFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
mixedFvPatchScalarField(p, iF),
neighbourFieldName_(dict.lookup("neighbourFieldName")),
KName_(dict.lookup("K"))
{
if (!isA<directMappedPatchBase>(this->patch().patch()))
{
FatalErrorIn
(
"turbulentTemperatureCoupledBaffleFvPatchScalarField::"
"turbulentTemperatureCoupledBaffleFvPatchScalarField\n"
"(\n"
" const fvPatch& p,\n"
" const DimensionedField<scalar, volMesh>& iF,\n"
" const dictionary& dict\n"
")\n"
) << "\n patch type '" << p.type()
<< "' not type '" << directMappedPatchBase::typeName << "'"
<< "\n for patch " << p.name()
<< " of field " << dimensionedInternalField().name()
<< " in file " << dimensionedInternalField().objectPath()
<< exit(FatalError);
}
fvPatchScalarField::operator=(scalarField("value", dict, p.size()));
if (dict.found("refValue"))
{
// Full restart
refValue() = scalarField("refValue", dict, p.size());
refGrad() = scalarField("refGradient", dict, p.size());
valueFraction() = scalarField("valueFraction", dict, p.size());
fixesValue_ = readBool(dict.lookup("fixesValue"));
}
else
{
// Start from user entered data. Assume fixedValue.
refValue() = *this;
refGrad() = 0.0;
valueFraction() = 1.0;
fixesValue_ = true;
}
}
turbulentTemperatureCoupledBaffleFvPatchScalarField::
turbulentTemperatureCoupledBaffleFvPatchScalarField
(
const turbulentTemperatureCoupledBaffleFvPatchScalarField& wtcsf,
const DimensionedField<scalar, volMesh>& iF
)
:
mixedFvPatchScalarField(wtcsf, iF),
neighbourFieldName_(wtcsf.neighbourFieldName_),
KName_(wtcsf.KName_),
fixesValue_(wtcsf.fixesValue_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
tmp<scalarField>
turbulentTemperatureCoupledBaffleFvPatchScalarField::K() const
{
if (KName_ == "none")
{
const compressible::RASModel& model =
db().lookupObject<compressible::RASModel>("RASProperties");
tmp<volScalarField> talpha = model.alphaEff();
const basicThermo& thermo =
db().lookupObject<basicThermo>("thermophysicalProperties");
return
talpha().boundaryField()[patch().index()]
*thermo.rho()().boundaryField()[patch().index()]
*thermo.Cp()().boundaryField()[patch().index()];
}
else
{
return patch().lookupPatchField<volScalarField, scalar>(KName_);
}
}
void turbulentTemperatureCoupledBaffleFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
// Get the coupling information from the directMappedPatchBase
const directMappedPatchBase& mpp = refCast<const directMappedPatchBase>
(
patch().patch()
);
const polyMesh& nbrMesh = mpp.sampleMesh();
const fvPatch& nbrPatch = refCast<const fvMesh>
(
nbrMesh
).boundary()[mpp.samplePolyPatch().index()];
// Force recalculation of mapping and schedule
const mapDistribute& distMap = mpp.map();
(void)distMap.schedule();
tmp<scalarField> intFld = patchInternalField();
if (interfaceOwner(nbrMesh, nbrPatch.patch()))
{
// Note: other side information could be cached - it only needs
// to be updated the first time round the iteration (i.e. when
// switching regions) but unfortunately we don't have this information.
// Calculate the temperature by harmonic averaging
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const turbulentTemperatureCoupledBaffleFvPatchScalarField& nbrField =
refCast<const turbulentTemperatureCoupledBaffleFvPatchScalarField>
(
nbrPatch.lookupPatchField<volScalarField, scalar>
(
neighbourFieldName_
)
);
// Swap to obtain full local values of neighbour internal field
scalarField nbrIntFld = nbrField.patchInternalField();
mapDistribute::distribute
(
Pstream::defaultCommsType,
distMap.schedule(),
distMap.constructSize(),
distMap.subMap(), // what to send
distMap.constructMap(), // what to receive
nbrIntFld
);
// Swap to obtain full local values of neighbour K*delta
scalarField nbrKDelta = nbrField.K()*nbrPatch.deltaCoeffs();
mapDistribute::distribute
(
Pstream::defaultCommsType,
distMap.schedule(),
distMap.constructSize(),
distMap.subMap(), // what to send
distMap.constructMap(), // what to receive
nbrKDelta
);
tmp<scalarField> myKDelta = K()*patch().deltaCoeffs();
// Calculate common wall temperature. Reuse *this to store common value.
scalarField Twall
(
(myKDelta()*intFld() + nbrKDelta*nbrIntFld)
/ (myKDelta() + nbrKDelta)
);
// Assign to me
fvPatchScalarField::operator=(Twall);
// Distribute back and assign to neighbour
mapDistribute::distribute
(
Pstream::defaultCommsType,
distMap.schedule(),
nbrField.size(),
distMap.constructMap(), // reverse : what to send
distMap.subMap(),
Twall
);
const_cast<turbulentTemperatureCoupledBaffleFvPatchScalarField&>
(
nbrField
).fvPatchScalarField::operator=(Twall);
}
// Switch between fixed value (of harmonic avg) or gradient
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
label nFixed = 0;
// Like snGrad but bypass switching on refValue/refGrad.
tmp<scalarField> normalGradient = (*this-intFld())*patch().deltaCoeffs();
if (debug)
{
scalar Q = gSum(K()*patch().magSf()*normalGradient());
Info<< patch().boundaryMesh().mesh().name() << ':'
<< patch().name() << ':'
<< this->dimensionedInternalField().name() << " -> "
<< nbrMesh.name() << ':'
<< nbrPatch.name() << ':'
<< this->dimensionedInternalField().name() << " :"
<< " heatFlux:" << Q
<< " walltemperature "
<< " min:" << gMin(*this)
<< " max:" << gMax(*this)
<< " avg:" << gAverage(*this)
<< endl;
}
forAll(*this, i)
{
// if outgoing flux use fixed value.
if (normalGradient()[i] < 0.0)
{
this->refValue()[i] = operator[](i);
this->refGrad()[i] = 0.0; // not used
this->valueFraction()[i] = 1.0;
nFixed++;
}
else
{
this->refValue()[i] = 0.0; // not used
this->refGrad()[i] = normalGradient()[i];
this->valueFraction()[i] = 0.0;
}
}
reduce(nFixed, sumOp<label>());
fixesValue_ = (nFixed > 0);
if (debug)
{
label nTotSize = returnReduce(this->size(), sumOp<label>());
Info<< patch().boundaryMesh().mesh().name() << ':'
<< patch().name() << ':'
<< this->dimensionedInternalField().name() << " -> "
<< nbrMesh.name() << ':'
<< nbrPatch.name() << ':'
<< this->dimensionedInternalField().name() << " :"
<< " patch:" << patch().name()
<< " out of:" << nTotSize
<< " fixedBC:" << nFixed
<< " gradient:" << nTotSize-nFixed << endl;
}
mixedFvPatchScalarField::updateCoeffs();
}
void turbulentTemperatureCoupledBaffleFvPatchScalarField::write
(
Ostream& os
) const
{
mixedFvPatchScalarField::write(os);
os.writeKeyword("neighbourFieldName")<< neighbourFieldName_
<< token::END_STATEMENT << nl;
os.writeKeyword("K") << KName_ << token::END_STATEMENT << nl;
os.writeKeyword("fixesValue") << fixesValue_ << token::END_STATEMENT << nl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField
(
fvPatchScalarField,
turbulentTemperatureCoupledBaffleFvPatchScalarField
);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace compressible
} // End namespace Foam
// ************************************************************************* //

View File

@ -0,0 +1,200 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
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 2 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, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class
Foam::compressible::turbulentTemperatureCoupledBaffleFvPatchScalarField
Description
Mixed boundary condition for temperature, to be used for heat-transfer
on back-to-back baffles.
If my temperature is T1, neighbour is T2:
T1 > T2: my side becomes fixedValue T2 bc, other side becomes fixedGradient.
Example usage:
myInterfacePatchName
{
type turbulentTemperatureCoupledBaffle;
neighbourFieldName T;
K K; // or none
value uniform 300;
}
Needs to be on underlying directMapped(Wall)FvPatch.
Note: if K is "none" looks up RASModel and basicThermo, otherwise expects
the solver to calculate a 'K' field.
Note: runs in parallel with arbitrary decomposition. Uses directMapped
functionality to calculate exchange.
Note: lags interface data so both sides use same data.
- problem: schedule to calculate average would interfere
with standard processor swaps.
- so: updateCoeffs sets both to same Twall. Only need to do
this for last outer iteration but don't have access to this.
SourceFiles
turbulentTemperatureCoupledBaffleFvPatchScalarField.C
\*---------------------------------------------------------------------------*/
#ifndef turbulentTemperatureCoupledBaffleFvPatchScalarField_H
#define turbulentTemperatureCoupledBaffleFvPatchScalarField_H
//#include "fvPatchFields.H"
#include "mixedFvPatchFields.H"
//#include "fvPatch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace compressible
{
/*---------------------------------------------------------------------------*\
Class turbulentTemperatureCoupledBaffleFvPatchScalarField Declaration
\*---------------------------------------------------------------------------*/
class turbulentTemperatureCoupledBaffleFvPatchScalarField
:
public mixedFvPatchScalarField
{
// Private data
//- Name of field on the neighbour region
const word neighbourFieldName_;
//- Name of thermal conductivity field
const word KName_;
bool fixesValue_;
// Private Member Functions
//- Am I or neighbour owner of interface
bool interfaceOwner(const polyMesh&, const polyPatch&) const;
public:
//- Runtime type information
TypeName("compressible::turbulentTemperatureCoupledBaffle");
// Constructors
//- Construct from patch and internal field
turbulentTemperatureCoupledBaffleFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&
);
//- Construct from patch, internal field and dictionary
turbulentTemperatureCoupledBaffleFvPatchScalarField
(
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const dictionary&
);
//- Construct by mapping given
// turbulentTemperatureCoupledBaffleFvPatchScalarField onto a new patch
turbulentTemperatureCoupledBaffleFvPatchScalarField
(
const turbulentTemperatureCoupledBaffleFvPatchScalarField&,
const fvPatch&,
const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct and return a clone
virtual tmp<fvPatchScalarField> clone() const
{
return tmp<fvPatchScalarField>
(
new turbulentTemperatureCoupledBaffleFvPatchScalarField(*this)
);
}
//- Construct as copy setting internal field reference
turbulentTemperatureCoupledBaffleFvPatchScalarField
(
const turbulentTemperatureCoupledBaffleFvPatchScalarField&,
const DimensionedField<scalar, volMesh>&
);
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchScalarField> clone
(
const DimensionedField<scalar, volMesh>& iF
) const
{
return tmp<fvPatchScalarField>
(
new turbulentTemperatureCoupledBaffleFvPatchScalarField
(
*this,
iF
)
);
}
// Member functions
//- Get corresponding K field
tmp<scalarField> K() const;
//- Return true if this patch field fixes a value.
// Needed to check if a level has to be specified while solving
// Poissons equations.
virtual bool fixesValue() const
{
return fixesValue_;
}
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace compressible
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -70,7 +70,7 @@ void vanDriestDelta::calcDelta()
const fvPatchList& patches = mesh_.boundary();
forAll(patches, patchi)
{
if (isType<wallFvPatch>(patches[patchi]))
if (isA<wallFvPatch>(patches[patchi]))
{
const fvPatchVectorField& Uw = U.boundaryField()[patchi];
const scalarField& nuw = nu.boundaryField()[patchi];

View File

@ -331,7 +331,7 @@ void LRR::correct()
{
const fvPatch& curPatch = patches[patchi];
if (typeid(curPatch) == typeid(wallFvPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -390,7 +390,7 @@ void LRR::correct()
{
const fvPatch& curPatch = patches[patchi];
if (typeid(curPatch) == typeid(wallFvPatch))
if (isA<wallFvPatch>(curPatch))
{
symmTensorField& Rw = R_.boundaryField()[patchi];

View File

@ -373,7 +373,7 @@ void LaunderGibsonRSTM::correct()
{
const fvPatch& curPatch = patches[patchi];
if (typeid(curPatch) == typeid(wallFvPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -441,7 +441,7 @@ void LaunderGibsonRSTM::correct()
{
const fvPatch& curPatch = patches[patchi];
if (typeid(curPatch) == typeid(wallFvPatch))
if (isA<wallFvPatch>(curPatch))
{
symmTensorField& Rw = R_.boundaryField()[patchi];

View File

@ -14,7 +14,7 @@
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -29,7 +29,7 @@
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -58,7 +58,7 @@
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{

View File

@ -14,7 +14,7 @@
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -29,7 +29,7 @@
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -58,7 +58,7 @@
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{

View File

@ -169,7 +169,7 @@ tmp<scalarField> RASModel::yPlus(const label patchNo, const scalar Cmu) const
tmp<scalarField> tYp(new scalarField(curPatch.size()));
scalarField& Yp = tYp();
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
Yp = pow025(Cmu)
*y_[patchNo]

View File

@ -26,7 +26,6 @@ License
#include "SpalartAllmaras.H"
#include "addToRunTimeSelectionTable.H"
#include "wallDist.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -72,7 +72,7 @@ tmp<volScalarField> autoCreateNut
forAll(bm, patchI)
{
if (isType<wallFvPatch>(bm[patchI]))
if (isA<wallFvPatch>(bm[patchI]))
{
nutBoundaryTypes[patchI] =
RASModels::nutkWallFunctionFvPatchScalarField::typeName;

View File

@ -28,7 +28,7 @@ License
#include "Time.H"
#include "OSspecific.H"
#include "wallPolyPatch.H"
#include "wallFvPatch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -111,7 +111,7 @@ autoCreateWallFunctionField
forAll(newPatchFields, patchI)
{
if (isType<wallPolyPatch>(mesh.boundaryMesh()[patchI]))
if (isA<wallFvPatch>(mesh.boundary()[patchI]))
{
newPatchFields.set
(

View File

@ -43,7 +43,7 @@ Description
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{
@ -61,7 +61,7 @@ Description
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
#include "checkPatchFieldTypes.H"
@ -112,7 +112,7 @@ Description
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
forAll(curPatch, facei)
{

View File

@ -37,7 +37,7 @@ Description
{
const fvPatch& p = patches[patchi];
if (isType<wallFvPatch>(p))
if (isA<wallFvPatch>(p))
{
epsEqn().setValues
(

View File

@ -39,7 +39,7 @@ Description
{
const fvPatch& curPatch = patches[patchi];
if (isType<wallFvPatch>(curPatch))
if (isA<wallFvPatch>(curPatch))
{
const scalarField& nuw = nu().boundaryField()[patchi];
scalarField& nutw = nut_.boundaryField()[patchi];