Merge branch 'master' into cvm

This commit is contained in:
graham
2010-12-15 17:54:08 +00:00
85 changed files with 1193 additions and 1116 deletions

View File

@ -184,6 +184,8 @@
+ =setSet=: allows time range (e.g. 0:100) in combination with -batch argument + =setSet=: allows time range (e.g. 0:100) in combination with -batch argument
to execute the commands for multiple times. to execute the commands for multiple times.
* Post-processing * Post-processing
+ =paraFoam=, =foamToVTK=: full support for polyhedral cell type in recent
Paraview versions.
+ =foamToEnsight=: parallel continuous data. new =-nodeValues= option to generate and output nodal + =foamToEnsight=: parallel continuous data. new =-nodeValues= option to generate and output nodal
field data. field data.
+ =singleCellMesh=: new utility to convert mesh and fields to a single cell + =singleCellMesh=: new utility to convert mesh and fields to a single cell

View File

@ -218,7 +218,7 @@ void Foam::kineticTheoryModel::solve(const volTensorField& gradUat)
// The solution is higly unstable close to the packing limit. // The solution is higly unstable close to the packing limit.
gs0_ = radialModel_->g0 gs0_ = radialModel_->g0
( (
min(max(alpha_, 1e-6), alphaMax_ - 0.01), min(max(alpha_, scalar(1e-6)), alphaMax_ - 0.01),
alphaMax_ alphaMax_
); );
@ -255,7 +255,7 @@ void Foam::kineticTheoryModel::solve(const volTensorField& gradUat)
volScalarField J1 = 3.0*betaPrim; volScalarField J1 = 3.0*betaPrim;
volScalarField J2 = volScalarField J2 =
0.25*sqr(betaPrim)*da_*sqr(Ur) 0.25*sqr(betaPrim)*da_*sqr(Ur)
/(max(alpha_, 1e-6)*rhoa_*sqrtPi*(ThetaSqrt + TsmallSqrt)); /(max(alpha_, scalar(1e-6))*rhoa_*sqrtPi*(ThetaSqrt + TsmallSqrt));
// bulk viscosity p. 45 (Lun et al. 1984). // bulk viscosity p. 45 (Lun et al. 1984).
lambda_ = (4.0/3.0)*sqr(alpha_)*rhoa_*da_*gs0_*(1.0+e_)*ThetaSqrt/sqrtPi; lambda_ = (4.0/3.0)*sqr(alpha_)*rhoa_*da_*gs0_*(1.0+e_)*ThetaSqrt/sqrtPi;
@ -309,7 +309,11 @@ void Foam::kineticTheoryModel::solve(const volTensorField& gradUat)
volScalarField t1 = K1*alpha_ + rhoa_; volScalarField t1 = K1*alpha_ + rhoa_;
volScalarField l1 = -t1*trD; volScalarField l1 = -t1*trD;
volScalarField l2 = sqr(t1)*tr2D; volScalarField l2 = sqr(t1)*tr2D;
volScalarField l3 = 4.0*K4*max(alpha_, 1e-6)*(2.0*K3*trD2 + K2*tr2D); volScalarField l3 =
4.0
*K4
*max(alpha_, scalar(1e-6))
*(2.0*K3*trD2 + K2*tr2D);
Theta_ = sqr((l1 + sqrt(l2 + l3))/(2.0*(alpha_ + 1.0e-4)*K4)); Theta_ = sqr((l1 + sqrt(l2 + l3))/(2.0*(alpha_ + 1.0e-4)*K4));
} }

View File

@ -561,10 +561,6 @@ int main(int argc, char *argv[])
mkDir(args.path()); mkDir(args.path());
} }
// Switch timeStamp checking to one which does not do any
// parallel sync for same reason
regIOobject::fileModificationChecking = regIOobject::timeStamp;
# include "createTime.H" # include "createTime.H"

View File

@ -595,6 +595,7 @@ DebugSwitches
muSgsSpalartAllmarasWallFunction 0; muSgsSpalartAllmarasWallFunction 0;
multiDirRefinement 0; multiDirRefinement 0;
multiHoleInjector 0; multiHoleInjector 0;
multiLevel 1;
multivariateSelection 0; multivariateSelection 0;
mutRoughWallFunction 0; mutRoughWallFunction 0;
mutSpalartAllmarasStandardRoughWallFunction 0; mutSpalartAllmarasStandardRoughWallFunction 0;

View File

@ -40,8 +40,7 @@ const Foam::scalar
Foam::FaceCellWave<Type, TrackingData>::geomTol_ = 1e-6; Foam::FaceCellWave<Type, TrackingData>::geomTol_ = 1e-6;
template <class Type, class TrackingData> template <class Type, class TrackingData>
const Foam::scalar Foam::scalar Foam::FaceCellWave<Type, TrackingData>::propagationTol_ = 0.01;
Foam::FaceCellWave<Type, TrackingData>::propagationTol_ = 0.01;
template <class Type, class TrackingData> template <class Type, class TrackingData>
Foam::label Foam::FaceCellWave<Type, TrackingData>::dummyTrackData_ = 12345; Foam::label Foam::FaceCellWave<Type, TrackingData>::dummyTrackData_ = 12345;
@ -516,8 +515,8 @@ void Foam::FaceCellWave<Type, TrackingData>::handleProcPatches()
refCast<const processorPolyPatch>(patch); refCast<const processorPolyPatch>(patch);
// Allocate buffers // Allocate buffers
labelList receiveFaces(patch.size()); labelList receiveFaces;
List<Type> receiveFacesInfo(patch.size()); List<Type> receiveFacesInfo;
{ {
UIPstream fromNeighbour(procPatch.neighbProcNo(), pBufs); UIPstream fromNeighbour(procPatch.neighbProcNo(), pBufs);
@ -675,8 +674,7 @@ Foam::FaceCellWave<Type, TrackingData>::FaceCellWave
hasCyclicPatches_(hasCyclicPatch()), hasCyclicPatches_(hasCyclicPatch()),
nEvals_(0), nEvals_(0),
nUnvisitedCells_(mesh_.nCells()), nUnvisitedCells_(mesh_.nCells()),
nUnvisitedFaces_(mesh_.nFaces()), nUnvisitedFaces_(mesh_.nFaces())
iter_(0)
{} {}
@ -707,16 +705,15 @@ Foam::FaceCellWave<Type, TrackingData>::FaceCellWave
hasCyclicPatches_(hasCyclicPatch()), hasCyclicPatches_(hasCyclicPatch()),
nEvals_(0), nEvals_(0),
nUnvisitedCells_(mesh_.nCells()), nUnvisitedCells_(mesh_.nCells()),
nUnvisitedFaces_(mesh_.nFaces()), nUnvisitedFaces_(mesh_.nFaces())
iter_(0)
{ {
// Copy initial changed faces data // Copy initial changed faces data
setFaceInfo(changedFaces, changedFacesInfo); setFaceInfo(changedFaces, changedFacesInfo);
// Iterate until nothing changes // Iterate until nothing changes
iterate(maxIter); label iter = iterate(maxIter);
if ((maxIter > 0) && (iter_ >= maxIter)) if ((maxIter > 0) && (iter >= maxIter))
{ {
FatalErrorIn FatalErrorIn
( (
@ -796,7 +793,7 @@ Foam::label Foam::FaceCellWave<Type, TrackingData>::faceToCell()
); );
} }
// Neighbour. Hack for check if face has neighbour. // Neighbour.
if (faceI < nInternalFaces) if (faceI < nInternalFaces)
{ {
cellI = neighbour[faceI]; cellI = neighbour[faceI];
@ -927,11 +924,13 @@ Foam::label Foam::FaceCellWave<Type, TrackingData>::iterate(const label maxIter)
handleProcPatches(); handleProcPatches();
} }
while (iter_ < maxIter) label iter = 0;
while (iter < maxIter)
{ {
if (debug) if (debug)
{ {
Pout<< " Iteration " << iter_ << endl; Pout<< " Iteration " << iter << endl;
} }
nEvals_ = 0; nEvals_ = 0;
@ -963,10 +962,11 @@ Foam::label Foam::FaceCellWave<Type, TrackingData>::iterate(const label maxIter)
break; break;
} }
++iter_; ++iter;
} }
return nUnvisitedCells_; return iter;
} }
// ************************************************************************* // // ************************************************************************* //

View File

@ -114,9 +114,6 @@ class FaceCellWave
label nUnvisitedCells_; label nUnvisitedCells_;
label nUnvisitedFaces_; label nUnvisitedFaces_;
//- Iteration counter
label iter_;
// Private Member Functions // Private Member Functions
@ -232,7 +229,7 @@ class FaceCellWave
// Private static data // Private static data
static const scalar geomTol_; static const scalar geomTol_;
static const scalar propagationTol_; static scalar propagationTol_;
//- Used as default trackdata value to satisfy default template //- Used as default trackdata value to satisfy default template
// argument. // argument.
@ -340,8 +337,8 @@ public:
// counted double) // counted double)
label cellToFace(); label cellToFace();
//- Iterate until no changes or maxIter reached. Returns number of //- Iterate until no changes or maxIter reached. Returns actual
// unset cells (see getUnsetCells) // number of iterations.
label iterate(const label maxIter); label iterate(const label maxIter);
}; };

View File

@ -134,8 +134,8 @@ public:
return calc_.data(); return calc_.data();
} }
//- Iterate until no changes or maxIter reached. Returns number of //- Iterate until no changes or maxIter reached. Returns actual
// unset cells (see getUnsetCells) // number of iterations.
label iterate(const label maxIter) label iterate(const label maxIter)
{ {
return calc_.iterate(maxIter); return calc_.iterate(maxIter);

View File

@ -66,6 +66,10 @@ void Foam::IOdictionary::readFile(const bool masterOnly)
: Pstream::treeCommunication() : Pstream::treeCommunication()
); );
// Master reads headerclassname from file. Make sure this gets
// transfered as well as contents.
Pstream::scatter(comms, const_cast<word&>(headerClassName()));
Pstream::scatter(comms, note());
// Get my communication order // Get my communication order
const Pstream::commsStruct& myComm = comms[Pstream::myProcNo()]; const Pstream::commsStruct& myComm = comms[Pstream::myProcNo()];

View File

@ -201,6 +201,11 @@ bool Foam::regIOobject::read()
: Pstream::treeCommunication() : Pstream::treeCommunication()
); );
// Master reads headerclassname from file. Make sure this gets
// transfered as well as contents.
Pstream::scatter(comms, const_cast<word&>(headerClassName()));
Pstream::scatter(comms, note());
// Get my communication order // Get my communication order
const Pstream::commsStruct& myComm = comms[Pstream::myProcNo()]; const Pstream::commsStruct& myComm = comms[Pstream::myProcNo()];

View File

@ -284,10 +284,8 @@ Type Foam::interpolationTable<Type>::rateOfChange(const scalar value) const
case interpolationTable::REPEAT: case interpolationTable::REPEAT:
{ {
// adjust lookupValue to >= minLimit // adjust lookupValue to >= minLimit
while (lookupValue < minLimit) scalar span = maxLimit-minLimit;
{ lookupValue = fmod(lookupValue-minLimit, span) + minLimit;
lookupValue += maxLimit;
}
break; break;
} }
} }
@ -325,10 +323,8 @@ Type Foam::interpolationTable<Type>::rateOfChange(const scalar value) const
case interpolationTable::REPEAT: case interpolationTable::REPEAT:
{ {
// adjust lookupValue <= maxLimit // adjust lookupValue <= maxLimit
while (lookupValue > maxLimit) scalar span = maxLimit-minLimit;
{ lookupValue = fmod(lookupValue-minLimit, span) + minLimit;
lookupValue -= maxLimit;
}
break; break;
} }
} }
@ -540,11 +536,9 @@ Type Foam::interpolationTable<Type>::operator()(const scalar value) const
} }
case interpolationTable::REPEAT: case interpolationTable::REPEAT:
{ {
// adjust lookupValue to >= minLimin // adjust lookupValue to >= minLimit
while (lookupValue < minLimit) scalar span = maxLimit-minLimit;
{ lookupValue = fmod(lookupValue-minLimit, span) + minLimit;
lookupValue += maxLimit;
}
break; break;
} }
} }
@ -582,10 +576,8 @@ Type Foam::interpolationTable<Type>::operator()(const scalar value) const
case interpolationTable::REPEAT: case interpolationTable::REPEAT:
{ {
// adjust lookupValue <= maxLimit // adjust lookupValue <= maxLimit
while (lookupValue > maxLimit) scalar span = maxLimit-minLimit;
{ lookupValue = fmod(lookupValue-minLimit, span) + minLimit;
lookupValue -= maxLimit;
}
break; break;
} }
} }

View File

@ -84,7 +84,11 @@ Foam::solution::solution
dictName, dictName,
obr.time().system(), obr.time().system(),
obr, obr,
IOobject::MUST_READ_IF_MODIFIED, (
obr.readOpt() == IOobject::MUST_READ
? IOobject::MUST_READ_IF_MODIFIED
: obr.readOpt()
),
IOobject::NO_WRITE IOobject::NO_WRITE
) )
), ),
@ -94,7 +98,14 @@ Foam::solution::solution
defaultRelaxationFactor_(0), defaultRelaxationFactor_(0),
solvers_(ITstream("solvers", tokenList())()) solvers_(ITstream("solvers", tokenList())())
{ {
if
(
readOpt() == IOobject::MUST_READ
|| readOpt() == IOobject::MUST_READ_IF_MODIFIED
)
{
read(solutionDict()); read(solutionDict());
}
} }

View File

@ -273,6 +273,30 @@ void Foam::cyclicPolyPatch::calcTransforms
half1Normals, half1Normals,
half0Tols half0Tols
); );
if (transform_ == ROTATIONAL && !parallel() && forwardT().size() > 1)
{
const_cast<tensorField&>(forwardT()).setSize(1);
const_cast<tensorField&>(reverseT()).setSize(1);
const_cast<boolList&>(collocated()).setSize(1);
WarningIn
(
"cyclicPolyPatch::calcTransforms\n"
" (\n"
" const primitivePatch&,\n"
" const UList<point>&,\n"
" const UList<point>&,\n"
" const UList<point>&,\n"
" const UList<point>&\n"
" )"
) << "For patch " << name()
<< " calculated non-uniform transform tensor even though"
<< " the transform type is " << transformTypeNames[transform_]
<< ". Setting the transformation tensor to be a uniform"
<< " rotation."
<< endl;
}
} }
} }
@ -851,22 +875,6 @@ const Foam::edgeList& Foam::cyclicPolyPatch::coupledPoints() const
str<< "l " << vertI-1 << ' ' << vertI << nl; str<< "l " << vertI-1 << ' ' << vertI << nl;
} }
} }
// Remove any addressing calculated for the coupled edges calculation
const_cast<primitivePatch&>
(
static_cast<const primitivePatch&>
(
*this
)
).clearOut();
const_cast<primitivePatch&>
(
static_cast<const primitivePatch&>
(
neighbPatch()
)
).clearOut();
} }
return *coupledPointsPtr_; return *coupledPointsPtr_;
} }
@ -1006,22 +1014,6 @@ const Foam::edgeList& Foam::cyclicPolyPatch::coupledEdges() const
str<< "l " << vertI-1 << ' ' << vertI << nl; str<< "l " << vertI-1 << ' ' << vertI << nl;
} }
} }
// Remove any addressing calculated for the coupled edges calculation
const_cast<primitivePatch&>
(
static_cast<const primitivePatch&>
(
*this
)
).clearOut();
const_cast<primitivePatch&>
(
static_cast<const primitivePatch&>
(
neighbPatch
)
).clearOut();
} }
return *coupledEdgesPtr_; return *coupledEdgesPtr_;
} }

View File

@ -409,6 +409,7 @@ void Foam::processorPolyPatch::updateMesh(PstreamBuffers& pBufs)
} }
// Remove any addressing used for shared points/edges calculation // Remove any addressing used for shared points/edges calculation
// since mostly not needed.
primitivePatch::clearOut(); primitivePatch::clearOut();
} }
} }

View File

@ -174,8 +174,6 @@ void Foam::processorCyclicPolyPatch::calcGeometry(PstreamBuffers& pBufs)
// Update underlying cyclic // Update underlying cyclic
coupledPolyPatch& pp = const_cast<coupledPolyPatch&>(referPatch()); coupledPolyPatch& pp = const_cast<coupledPolyPatch&>(referPatch());
Pout<< "updating geometry on refered patch:" << pp.name() << endl;
pp.calcGeometry pp.calcGeometry
( (
*this, *this,

View File

@ -76,6 +76,8 @@ EqOp(eqMag, x = mag(y))
EqOp(plusEqMagSqr, x += magSqr(y)) EqOp(plusEqMagSqr, x += magSqr(y))
EqOp(maxEq, x = max(x, y)) EqOp(maxEq, x = max(x, y))
EqOp(minEq, x = min(x, y)) EqOp(minEq, x = min(x, y))
EqOp(minMagSqrEq, x = (magSqr(x)<=magSqr(y) ? x : y))
EqOp(maxMagSqrEq, x = (magSqr(x)>=magSqr(y) ? x : y))
EqOp(andEq, x = (x && y)) EqOp(andEq, x = (x && y))
EqOp(orEq, x = (x || y)) EqOp(orEq, x = (x || y))

View File

@ -48,9 +48,11 @@ inline tensor rotationTensor
const vector& n2 const vector& n2
) )
{ {
const scalar s = n1 & n2;
const vector n3 = n1 ^ n2;
return return
(n1 & n2)*I s*I
+ (1 - (n1 & n2))*sqr(n1 ^ n2)/(magSqr(n1 ^ n2) + VSMALL) + (1 - s)*sqr(n3)/(magSqr(n3) + VSMALL)
+ (n2*n1 - n1*n2); + (n2*n1 - n1*n2);
} }

View File

@ -163,20 +163,18 @@ tmp<scalarField> advectiveFvPatchField<Type>::advectionSpeed() const
const surfaceScalarField& phi = const surfaceScalarField& phi =
this->db().objectRegistry::lookupObject<surfaceScalarField>(phiName_); this->db().objectRegistry::lookupObject<surfaceScalarField>(phiName_);
fvsPatchField<scalar> phip = this->patch().lookupPatchField fvsPatchField<scalar> phip =
this->patch().template lookupPatchField<surfaceScalarField, scalar>
( (
phiName_, phiName_
reinterpret_cast<const surfaceScalarField*>(0),
reinterpret_cast<const scalar*>(0)
); );
if (phi.dimensions() == dimDensity*dimVelocity*dimArea) if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
{ {
const fvPatchScalarField& rhop = this->patch().lookupPatchField const fvPatchScalarField& rhop =
this->patch().template lookupPatchField<volScalarField, scalar>
( (
rhoName_, rhoName_
reinterpret_cast<const volScalarField*>(0),
reinterpret_cast<const scalar*>(0)
); );
return phip/(rhop*this->patch().magSf()); return phip/(rhop*this->patch().magSf());

View File

@ -25,15 +25,10 @@ License
#include "inletOutletFvPatchField.H" #include "inletOutletFvPatchField.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type> template<class Type>
inletOutletFvPatchField<Type>::inletOutletFvPatchField Foam::inletOutletFvPatchField<Type>::inletOutletFvPatchField
( (
const fvPatch& p, const fvPatch& p,
const DimensionedField<Type, volMesh>& iF const DimensionedField<Type, volMesh>& iF
@ -49,7 +44,7 @@ inletOutletFvPatchField<Type>::inletOutletFvPatchField
template<class Type> template<class Type>
inletOutletFvPatchField<Type>::inletOutletFvPatchField Foam::inletOutletFvPatchField<Type>::inletOutletFvPatchField
( (
const inletOutletFvPatchField<Type>& ptf, const inletOutletFvPatchField<Type>& ptf,
const fvPatch& p, const fvPatch& p,
@ -63,7 +58,7 @@ inletOutletFvPatchField<Type>::inletOutletFvPatchField
template<class Type> template<class Type>
inletOutletFvPatchField<Type>::inletOutletFvPatchField Foam::inletOutletFvPatchField<Type>::inletOutletFvPatchField
( (
const fvPatch& p, const fvPatch& p,
const DimensionedField<Type, volMesh>& iF, const DimensionedField<Type, volMesh>& iF,
@ -93,7 +88,7 @@ inletOutletFvPatchField<Type>::inletOutletFvPatchField
template<class Type> template<class Type>
inletOutletFvPatchField<Type>::inletOutletFvPatchField Foam::inletOutletFvPatchField<Type>::inletOutletFvPatchField
( (
const inletOutletFvPatchField<Type>& ptf const inletOutletFvPatchField<Type>& ptf
) )
@ -104,7 +99,7 @@ inletOutletFvPatchField<Type>::inletOutletFvPatchField
template<class Type> template<class Type>
inletOutletFvPatchField<Type>::inletOutletFvPatchField Foam::inletOutletFvPatchField<Type>::inletOutletFvPatchField
( (
const inletOutletFvPatchField<Type>& ptf, const inletOutletFvPatchField<Type>& ptf,
const DimensionedField<Type, volMesh>& iF const DimensionedField<Type, volMesh>& iF
@ -118,18 +113,17 @@ inletOutletFvPatchField<Type>::inletOutletFvPatchField
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type> template<class Type>
void inletOutletFvPatchField<Type>::updateCoeffs() void Foam::inletOutletFvPatchField<Type>::updateCoeffs()
{ {
if (this->updated()) if (this->updated())
{ {
return; return;
} }
const Field<scalar>& phip = this->patch().lookupPatchField const Field<scalar>& phip =
this->patch().template lookupPatchField<surfaceScalarField, scalar>
( (
phiName_, phiName_
reinterpret_cast<const surfaceScalarField*>(0),
reinterpret_cast<const scalar*>(0)
); );
this->valueFraction() = 1.0 - pos(phip); this->valueFraction() = 1.0 - pos(phip);
@ -139,7 +133,7 @@ void inletOutletFvPatchField<Type>::updateCoeffs()
template<class Type> template<class Type>
void inletOutletFvPatchField<Type>::write(Ostream& os) const void Foam::inletOutletFvPatchField<Type>::write(Ostream& os) const
{ {
fvPatchField<Type>::write(os); fvPatchField<Type>::write(os);
if (phiName_ != "phi") if (phiName_ != "phi")
@ -154,7 +148,7 @@ void inletOutletFvPatchField<Type>::write(Ostream& os) const
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
template<class Type> template<class Type>
void inletOutletFvPatchField<Type>::operator= void Foam::inletOutletFvPatchField<Type>::operator=
( (
const fvPatchField<Type>& ptf const fvPatchField<Type>& ptf
) )
@ -167,8 +161,4 @@ void inletOutletFvPatchField<Type>::operator=
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -56,6 +56,7 @@ protected:
// Protected data // Protected data
//- Name of flux field
word phiName_; word phiName_;

View File

@ -25,21 +25,17 @@ License
#include "outletInletFvPatchField.H" #include "outletInletFvPatchField.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type> template<class Type>
outletInletFvPatchField<Type>::outletInletFvPatchField Foam::outletInletFvPatchField<Type>::outletInletFvPatchField
( (
const fvPatch& p, const fvPatch& p,
const DimensionedField<Type, volMesh>& iF const DimensionedField<Type, volMesh>& iF
) )
: :
mixedFvPatchField<Type>(p, iF) mixedFvPatchField<Type>(p, iF),
phiName_("phi")
{ {
this->refValue() = *this; this->refValue() = *this;
this->refGrad() = pTraits<Type>::zero; this->refGrad() = pTraits<Type>::zero;
@ -48,7 +44,7 @@ outletInletFvPatchField<Type>::outletInletFvPatchField
template<class Type> template<class Type>
outletInletFvPatchField<Type>::outletInletFvPatchField Foam::outletInletFvPatchField<Type>::outletInletFvPatchField
( (
const outletInletFvPatchField<Type>& ptf, const outletInletFvPatchField<Type>& ptf,
const fvPatch& p, const fvPatch& p,
@ -56,19 +52,21 @@ outletInletFvPatchField<Type>::outletInletFvPatchField
const fvPatchFieldMapper& mapper const fvPatchFieldMapper& mapper
) )
: :
mixedFvPatchField<Type>(ptf, p, iF, mapper) mixedFvPatchField<Type>(ptf, p, iF, mapper),
phiName_(ptf.phiName_)
{} {}
template<class Type> template<class Type>
outletInletFvPatchField<Type>::outletInletFvPatchField Foam::outletInletFvPatchField<Type>::outletInletFvPatchField
( (
const fvPatch& p, const fvPatch& p,
const DimensionedField<Type, volMesh>& iF, const DimensionedField<Type, volMesh>& iF,
const dictionary& dict const dictionary& dict
) )
: :
mixedFvPatchField<Type>(p, iF) mixedFvPatchField<Type>(p, iF),
phiName_(dict.lookupOrDefault<word>("phi", "phi"))
{ {
this->refValue() = Field<Type>("outletValue", dict, p.size()); this->refValue() = Field<Type>("outletValue", dict, p.size());
@ -90,41 +88,42 @@ outletInletFvPatchField<Type>::outletInletFvPatchField
template<class Type> template<class Type>
outletInletFvPatchField<Type>::outletInletFvPatchField Foam::outletInletFvPatchField<Type>::outletInletFvPatchField
( (
const outletInletFvPatchField<Type>& ptf const outletInletFvPatchField<Type>& ptf
) )
: :
mixedFvPatchField<Type>(ptf) mixedFvPatchField<Type>(ptf),
phiName_(ptf.phiName_)
{} {}
template<class Type> template<class Type>
outletInletFvPatchField<Type>::outletInletFvPatchField Foam::outletInletFvPatchField<Type>::outletInletFvPatchField
( (
const outletInletFvPatchField<Type>& ptf, const outletInletFvPatchField<Type>& ptf,
const DimensionedField<Type, volMesh>& iF const DimensionedField<Type, volMesh>& iF
) )
: :
mixedFvPatchField<Type>(ptf, iF) mixedFvPatchField<Type>(ptf, iF),
phiName_(ptf.phiName_)
{} {}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type> template<class Type>
void outletInletFvPatchField<Type>::updateCoeffs() void Foam::outletInletFvPatchField<Type>::updateCoeffs()
{ {
if (this->updated()) if (this->updated())
{ {
return; return;
} }
const fvsPatchField<scalar>& phip = this->patch().lookupPatchField const fvsPatchField<scalar>& phip =
this->patch().template lookupPatchField<surfaceScalarField, scalar>
( (
"phi", phiName_
reinterpret_cast<const surfaceScalarField*>(0),
reinterpret_cast<const scalar*>(0)
); );
this->valueFraction() = pos(phip); this->valueFraction() = pos(phip);
@ -134,16 +133,16 @@ void outletInletFvPatchField<Type>::updateCoeffs()
template<class Type> template<class Type>
void outletInletFvPatchField<Type>::write(Ostream& os) const void Foam::outletInletFvPatchField<Type>::write(Ostream& os) const
{ {
fvPatchField<Type>::write(os); fvPatchField<Type>::write(os);
if (phiName_ != "phi")
{
os.writeKeyword("phi") << phiName_ << token::END_STATEMENT << nl;
}
this->refValue().writeEntry("outletValue", os); this->refValue().writeEntry("outletValue", os);
this->writeEntry("value", os); this->writeEntry("value", os);
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -52,6 +52,14 @@ class outletInletFvPatchField
public mixedFvPatchField<Type> public mixedFvPatchField<Type>
{ {
protected:
// Protected data
//- Name of flux field
word phiName_;
public: public:
//- Runtime type information //- Runtime type information

View File

@ -75,6 +75,7 @@ class selfContainedDirectMappedFixedValueFvPatchField
mutable autoPtr<interpolation<Type> > interpolator_; mutable autoPtr<interpolation<Type> > interpolator_;
// Private Member Functions // Private Member Functions
//- Field to sample. Either on my or nbr mesh //- Field to sample. Either on my or nbr mesh
@ -83,6 +84,7 @@ class selfContainedDirectMappedFixedValueFvPatchField
//- Access the interpolation method //- Access the interpolation method
const interpolation<Type>& interpolator() const; const interpolation<Type>& interpolator() const;
public: public:
//- Runtime type information //- Runtime type information

View File

@ -31,15 +31,10 @@ License
#include "CrankNicholsonDdtScheme.H" #include "CrankNicholsonDdtScheme.H"
#include "backwardDdtScheme.H" #include "backwardDdtScheme.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type> template<class Type>
waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField Foam::waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
( (
const fvPatch& p, const fvPatch& p,
const DimensionedField<Type, volMesh>& iF const DimensionedField<Type, volMesh>& iF
@ -52,7 +47,7 @@ waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
template<class Type> template<class Type>
waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField Foam::waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
( (
const waveTransmissiveFvPatchField& ptf, const waveTransmissiveFvPatchField& ptf,
const fvPatch& p, const fvPatch& p,
@ -67,7 +62,7 @@ waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
template<class Type> template<class Type>
waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField Foam::waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
( (
const fvPatch& p, const fvPatch& p,
const DimensionedField<Type, volMesh>& iF, const DimensionedField<Type, volMesh>& iF,
@ -81,7 +76,7 @@ waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
template<class Type> template<class Type>
waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField Foam::waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
( (
const waveTransmissiveFvPatchField& ptpsf const waveTransmissiveFvPatchField& ptpsf
) )
@ -93,7 +88,7 @@ waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
template<class Type> template<class Type>
waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField Foam::waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
( (
const waveTransmissiveFvPatchField& ptpsf, const waveTransmissiveFvPatchField& ptpsf,
const DimensionedField<Type, volMesh>& iF const DimensionedField<Type, volMesh>& iF
@ -108,34 +103,31 @@ waveTransmissiveFvPatchField<Type>::waveTransmissiveFvPatchField
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Type> template<class Type>
tmp<scalarField> waveTransmissiveFvPatchField<Type>::advectionSpeed() const Foam::tmp<Foam::scalarField>
Foam::waveTransmissiveFvPatchField<Type>::advectionSpeed() const
{ {
// Lookup the velocity and compressibility of the patch // Lookup the velocity and compressibility of the patch
const fvPatchField<scalar>& psip = this->patch().lookupPatchField const fvPatchField<scalar>& psip =
this->patch().template lookupPatchField<volScalarField, scalar>
( (
psiName_, psiName_
reinterpret_cast<const volScalarField*>(0),
reinterpret_cast<const scalar*>(0)
); );
const surfaceScalarField& phi = const surfaceScalarField& phi =
this->db().objectRegistry::lookupObject<surfaceScalarField> this->db().template lookupObject<surfaceScalarField>(this->phiName_);
(this->phiName_);
fvsPatchField<scalar> phip = this->patch().lookupPatchField fvsPatchField<scalar> phip =
this->patch().template lookupPatchField<surfaceScalarField, scalar>
( (
this->phiName_, this->phiName_
reinterpret_cast<const surfaceScalarField*>(0),
reinterpret_cast<const scalar*>(0)
); );
if (phi.dimensions() == dimDensity*dimVelocity*dimArea) if (phi.dimensions() == dimDensity*dimVelocity*dimArea)
{ {
const fvPatchScalarField& rhop = this->patch().lookupPatchField const fvPatchScalarField& rhop =
this->patch().template lookupPatchField<volScalarField, scalar>
( (
this->rhoName_, this->rhoName_
reinterpret_cast<const volScalarField*>(0),
reinterpret_cast<const scalar*>(0)
); );
phip /= rhop; phip /= rhop;
@ -149,7 +141,7 @@ tmp<scalarField> waveTransmissiveFvPatchField<Type>::advectionSpeed() const
template<class Type> template<class Type>
void waveTransmissiveFvPatchField<Type>::write(Ostream& os) const void Foam::waveTransmissiveFvPatchField<Type>::write(Ostream& os) const
{ {
fvPatchField<Type>::write(os); fvPatchField<Type>::write(os);
@ -165,6 +157,7 @@ void waveTransmissiveFvPatchField<Type>::write(Ostream& os) const
{ {
os.writeKeyword("psi") << psiName_ << token::END_STATEMENT << nl; os.writeKeyword("psi") << psiName_ << token::END_STATEMENT << nl;
} }
os.writeKeyword("gamma") << gamma_ << token::END_STATEMENT << nl; os.writeKeyword("gamma") << gamma_ << token::END_STATEMENT << nl;
if (this->lInf_ > SMALL) if (this->lInf_ > SMALL)
@ -179,8 +172,4 @@ void waveTransmissiveFvPatchField<Type>::write(Ostream& os) const
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -256,7 +256,11 @@ Foam::fvSchemes::fvSchemes(const objectRegistry& obr)
"fvSchemes", "fvSchemes",
obr.time().system(), obr.time().system(),
obr, obr,
IOobject::MUST_READ_IF_MODIFIED, (
obr.readOpt() == IOobject::MUST_READ
? IOobject::MUST_READ_IF_MODIFIED
: obr.readOpt()
),
IOobject::NO_WRITE IOobject::NO_WRITE
) )
), ),
@ -364,7 +368,14 @@ Foam::fvSchemes::fvSchemes(const objectRegistry& obr)
// persistent settings across reads is incorrect // persistent settings across reads is incorrect
clear(); clear();
if
(
readOpt() == IOobject::MUST_READ
|| readOpt() == IOobject::MUST_READ_IF_MODIFIED
)
{
read(schemesDict()); read(schemesDict());
}
} }

View File

@ -37,11 +37,7 @@ SourceFiles
#define pointEdgeStructuredWalk_H #define pointEdgeStructuredWalk_H
#include "point.H" #include "point.H"
#include "label.H"
#include "scalar.H"
#include "tensor.H" #include "tensor.H"
#include "pTraits.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -75,10 +71,12 @@ class pointEdgeStructuredWalk
// Private Member Functions // Private Member Functions
//- Evaluate distance to point. //- Evaluate distance to point.
template<class TrackingData>
inline bool update inline bool update
( (
const pointEdgeStructuredWalk& w2, const pointEdgeStructuredWalk& w2,
const scalar tol const scalar tol,
TrackingData& td
); );
public: public:
@ -111,80 +109,105 @@ public:
// Needed by meshWave // Needed by meshWave
//- Check whether still contains original (invalid) value. //- Check whether origin has been changed at all or
inline bool valid() const; // still contains original (invalid) value.
template<class TrackingData>
inline bool valid(TrackingData& td) const;
//- Check for identical geometrical data. Used for cyclics checking. //- Check for identical geometrical data. Used for cyclics checking.
template<class TrackingData>
inline bool sameGeometry inline bool sameGeometry
( (
const pointEdgeStructuredWalk&, const pointEdgeStructuredWalk&,
const scalar tol const scalar tol,
TrackingData& td
) const; ) const;
//- Convert origin to relative vector to leaving point //- Convert origin to relative vector to leaving point
// (= point coordinate) // (= point coordinate)
template<class TrackingData>
inline void leaveDomain inline void leaveDomain
( (
const polyPatch& patch, const polyPatch& patch,
const label patchPointI, const label patchPointI,
const point& pos const point& pos,
TrackingData& td
); );
//- Convert relative origin to absolute by adding entering point //- Convert relative origin to absolute by adding entering point
template<class TrackingData>
inline void enterDomain inline void enterDomain
( (
const polyPatch& patch, const polyPatch& patch,
const label patchPointI, const label patchPointI,
const point& pos const point& pos,
TrackingData& td
); );
//- Apply rotation matrix to origin //- Apply rotation matrix to origin
inline void transform(const tensor& rotTensor); template<class TrackingData>
inline void transform
(
const tensor& rotTensor,
TrackingData& td
);
//- Influence of edge on point //- Influence of edge on point
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const label edgeI, const label edgeI,
const pointEdgeStructuredWalk& edgeInfo, const pointEdgeStructuredWalk& edgeInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of different value on same point. //- Influence of different value on same point.
// Merge new and old info. // Merge new and old info.
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const pointEdgeStructuredWalk& newPointInfo, const pointEdgeStructuredWalk& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of different value on same point. //- Influence of different value on same point.
// No information about current position whatsoever. // No information about current position whatsoever.
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const pointEdgeStructuredWalk& newPointInfo, const pointEdgeStructuredWalk& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of point on edge. //- Influence of point on edge.
template<class TrackingData>
inline bool updateEdge inline bool updateEdge
( (
const polyMesh& mesh, const polyMesh& mesh,
const label edgeI, const label edgeI,
const label pointI, const label pointI,
const pointEdgeStructuredWalk& pointInfo, const pointEdgeStructuredWalk& pointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Same (like operator==)
template<class TrackingData>
inline bool equal(const pointEdgeStructuredWalk&, TrackingData&)
const;
// Member Operators // Member Operators
//Note: Used to determine whether to call update. //Note: Used to determine whether to call update.
inline bool operator==(const pointEdgeStructuredWalk&) const; inline bool operator==(const pointEdgeStructuredWalk&) const;
inline bool operator!=(const pointEdgeStructuredWalk&) const; inline bool operator!=(const pointEdgeStructuredWalk&) const;

View File

@ -29,13 +29,15 @@ License
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// Update this with w2. // Update this with w2.
template<class TrackingData>
inline bool Foam::pointEdgeStructuredWalk::update inline bool Foam::pointEdgeStructuredWalk::update
( (
const pointEdgeStructuredWalk& w2, const pointEdgeStructuredWalk& w2,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
if (!valid()) if (!valid(td))
{ {
// current not yet set. Walked from w2 to here (=point0) // current not yet set. Walked from w2 to here (=point0)
dist_ = w2.dist_ + mag(point0_-w2.previousPoint_); dist_ = w2.dist_ + mag(point0_-w2.previousPoint_);
@ -105,17 +107,20 @@ inline const Foam::vector& Foam::pointEdgeStructuredWalk::data() const
} }
inline bool Foam::pointEdgeStructuredWalk::valid() const template<class TrackingData>
inline bool Foam::pointEdgeStructuredWalk::valid(TrackingData& td) const
{ {
return previousPoint_ != vector::max; return previousPoint_ != vector::max;
} }
// Checks for cyclic points // Checks for cyclic points
template<class TrackingData>
inline bool Foam::pointEdgeStructuredWalk::sameGeometry inline bool Foam::pointEdgeStructuredWalk::sameGeometry
( (
const pointEdgeStructuredWalk& w2, const pointEdgeStructuredWalk& w2,
const scalar tol const scalar tol,
TrackingData& td
) const ) const
{ {
scalar diff = Foam::mag(dist() - w2.dist()); scalar diff = Foam::mag(dist() - w2.dist());
@ -138,18 +143,25 @@ inline bool Foam::pointEdgeStructuredWalk::sameGeometry
} }
template<class TrackingData>
inline void Foam::pointEdgeStructuredWalk::leaveDomain inline void Foam::pointEdgeStructuredWalk::leaveDomain
( (
const polyPatch& patch, const polyPatch& patch,
const label patchPointI, const label patchPointI,
const point& coord const point& coord,
TrackingData& td
) )
{ {
previousPoint_ -= coord; previousPoint_ -= coord;
} }
inline void Foam::pointEdgeStructuredWalk::transform(const tensor& rotTensor) template<class TrackingData>
inline void Foam::pointEdgeStructuredWalk::transform
(
const tensor& rotTensor,
TrackingData& td
)
{ {
previousPoint_ = Foam::transform(rotTensor, previousPoint_); previousPoint_ = Foam::transform(rotTensor, previousPoint_);
} }
@ -157,11 +169,13 @@ inline void Foam::pointEdgeStructuredWalk::transform(const tensor& rotTensor)
// Update absolute geometric quantities. Note that distance (dist_) // Update absolute geometric quantities. Note that distance (dist_)
// is not affected by leaving/entering domain. // is not affected by leaving/entering domain.
template<class TrackingData>
inline void Foam::pointEdgeStructuredWalk::enterDomain inline void Foam::pointEdgeStructuredWalk::enterDomain
( (
const polyPatch& patch, const polyPatch& patch,
const label patchPointI, const label patchPointI,
const point& coord const point& coord,
TrackingData& td
) )
{ {
// back to absolute form // back to absolute form
@ -170,18 +184,20 @@ inline void Foam::pointEdgeStructuredWalk::enterDomain
// Update this with information from connected edge // Update this with information from connected edge
template<class TrackingData>
inline bool Foam::pointEdgeStructuredWalk::updatePoint inline bool Foam::pointEdgeStructuredWalk::updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const label edgeI, const label edgeI,
const pointEdgeStructuredWalk& edgeInfo, const pointEdgeStructuredWalk& edgeInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
if (inZone()) if (inZone())
{ {
return update(edgeInfo, tol); return update(edgeInfo, tol, td);
} }
else else
{ {
@ -191,17 +207,19 @@ inline bool Foam::pointEdgeStructuredWalk::updatePoint
// Update this with new information on same point // Update this with new information on same point
template<class TrackingData>
inline bool Foam::pointEdgeStructuredWalk::updatePoint inline bool Foam::pointEdgeStructuredWalk::updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const pointEdgeStructuredWalk& newPointInfo, const pointEdgeStructuredWalk& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
if (inZone()) if (inZone())
{ {
return update(newPointInfo, tol); return update(newPointInfo, tol, td);
} }
else else
{ {
@ -211,29 +229,33 @@ inline bool Foam::pointEdgeStructuredWalk::updatePoint
// Update this with new information on same point. No extra information. // Update this with new information on same point. No extra information.
template<class TrackingData>
inline bool Foam::pointEdgeStructuredWalk::updatePoint inline bool Foam::pointEdgeStructuredWalk::updatePoint
( (
const pointEdgeStructuredWalk& newPointInfo, const pointEdgeStructuredWalk& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
return update(newPointInfo, tol); return update(newPointInfo, tol, td);
} }
// Update this with information from connected point // Update this with information from connected point
template<class TrackingData>
inline bool Foam::pointEdgeStructuredWalk::updateEdge inline bool Foam::pointEdgeStructuredWalk::updateEdge
( (
const polyMesh& mesh, const polyMesh& mesh,
const label edgeI, const label edgeI,
const label pointI, const label pointI,
const pointEdgeStructuredWalk& pointInfo, const pointEdgeStructuredWalk& pointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
if (inZone()) if (inZone())
{ {
return update(pointInfo, tol); return update(pointInfo, tol, td);
} }
else else
{ {
@ -242,6 +264,17 @@ inline bool Foam::pointEdgeStructuredWalk::updateEdge
} }
template <class TrackingData>
inline bool Foam::pointEdgeStructuredWalk::equal
(
const pointEdgeStructuredWalk& rhs,
TrackingData& td
) const
{
return operator==(rhs);
}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
inline bool Foam::pointEdgeStructuredWalk::operator== inline bool Foam::pointEdgeStructuredWalk::operator==

View File

@ -91,6 +91,9 @@ void Foam::inversePointDistanceDiffusivity::correct()
List<pointEdgePoint> pointWallDist(mesh.nPoints()); List<pointEdgePoint> pointWallDist(mesh.nPoints());
List<pointEdgePoint> edgeWallDist(mesh.nEdges()); List<pointEdgePoint> edgeWallDist(mesh.nEdges());
int dummyTrackData = 0;
{ {
// Seeds // Seeds
List<pointEdgePoint> seedInfo(nPatchEdges); List<pointEdgePoint> seedInfo(nPatchEdges);
@ -108,7 +111,7 @@ void Foam::inversePointDistanceDiffusivity::correct()
{ {
label pointI = meshPoints[i]; label pointI = meshPoints[i];
if (!pointWallDist[pointI].valid()) if (!pointWallDist[pointI].valid(dummyTrackData))
{ {
// Not yet seeded // Not yet seeded
seedInfo[nPatchEdges] = pointEdgePoint seedInfo[nPatchEdges] = pointEdgePoint
@ -135,7 +138,8 @@ void Foam::inversePointDistanceDiffusivity::correct()
pointWallDist, pointWallDist,
edgeWallDist, edgeWallDist,
mesh.globalData().nTotalPoints() // max iterations mesh.globalData().nTotalPoints(),// max iterations
dummyTrackData
); );
} }

View File

@ -86,7 +86,8 @@ void Foam::InteractionLists<ParticleType>::buildInteractionLists()
// referred cells that they interact with. // referred cells that they interact with.
PackedBoolList cellInRangeOfCoupledPatch(mesh_.nCells(), false); PackedBoolList cellInRangeOfCoupledPatch(mesh_.nCells(), false);
// IAndT: index and transform // IAndT: index (=local cell index) and transform (from
// globalIndexAndTransform)
DynamicList<labelPair> cellIAndTToExchange; DynamicList<labelPair> cellIAndTToExchange;
DynamicList<treeBoundBox> cellBbsToExchange; DynamicList<treeBoundBox> cellBbsToExchange;

View File

@ -371,10 +371,21 @@ Foam::scalar Foam::Particle<ParticleType>::trackToFace
{ {
// Apply tracking correction towards tet centre // Apply tracking correction towards tet centre
if (debug)
{
Pout<< "tracking rescue using tetCentre from " << position();
}
position_ += position_ +=
Cloud<ParticleType>::trackingCorrectionTol Cloud<ParticleType>::trackingCorrectionTol
*(tet.centre() - position_); *(tet.centre() - position_);
if (debug)
{
Pout<< " to " << position() << " due to "
<< (tet.centre() - position_) << endl;
}
cloud_.trackingRescue(); cloud_.trackingRescue();
return trackFraction; return trackFraction;
@ -639,6 +650,12 @@ Foam::scalar Foam::Particle<ParticleType>::trackToFace
tetPointRef tet = currentTet(); tetPointRef tet = currentTet();
if (debug)
{
Pout<< "tracking rescue for lambdaMin:" << lambdaMin
<< "from " << position();
}
position_ += position_ +=
Cloud<ParticleType>::trackingCorrectionTol Cloud<ParticleType>::trackingCorrectionTol
*(tet.centre() - position_); *(tet.centre() - position_);
@ -692,6 +709,11 @@ Foam::scalar Foam::Particle<ParticleType>::trackToFace
} }
} }
if (debug)
{
Pout<< " to " << position() << endl;
}
cloud_.trackingRescue(); cloud_.trackingRescue();
} }

View File

@ -159,11 +159,6 @@ Foam::label Foam::autoLayerDriver::mergePatchFacesUndo
mesh.clearOut(); mesh.clearOut();
} }
if (meshRefiner_.overwrite())
{
mesh.setInstance(meshRefiner_.oldInstance());
}
faceCombiner.updateMesh(map); faceCombiner.updateMesh(map);
meshRefiner_.updateMesh(map, labelList(0)); meshRefiner_.updateMesh(map, labelList(0));
@ -324,11 +319,6 @@ Foam::label Foam::autoLayerDriver::mergePatchFacesUndo
mesh.clearOut(); mesh.clearOut();
} }
if (meshRefiner_.overwrite())
{
mesh.setInstance(meshRefiner_.oldInstance());
}
faceCombiner.updateMesh(map); faceCombiner.updateMesh(map);
// Renumber restore maps // Renumber restore maps
@ -396,11 +386,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoLayerDriver::doRemovePoints
mesh.clearOut(); mesh.clearOut();
} }
if (meshRefiner_.overwrite())
{
mesh.setInstance(meshRefiner_.oldInstance());
}
pointRemover.updateMesh(map); pointRemover.updateMesh(map);
meshRefiner_.updateMesh(map, labelList(0)); meshRefiner_.updateMesh(map, labelList(0));
@ -454,11 +439,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoLayerDriver::doRestorePoints
mesh.clearOut(); mesh.clearOut();
} }
if (meshRefiner_.overwrite())
{
mesh.setInstance(meshRefiner_.oldInstance());
}
pointRemover.updateMesh(map); pointRemover.updateMesh(map);
meshRefiner_.updateMesh(map, labelList(0)); meshRefiner_.updateMesh(map, labelList(0));
@ -3100,10 +3080,7 @@ void Foam::autoLayerDriver::addLayers
//?neccesary? Update fields //?neccesary? Update fields
newMesh.updateMesh(map); newMesh.updateMesh(map);
if (meshRefiner_.overwrite()) newMesh.setInstance(meshRefiner_.timeName());
{
newMesh.setInstance(meshRefiner_.oldInstance());
}
// Update numbering on addLayer: // Update numbering on addLayer:
// - cell/point labels to be newMesh. // - cell/point labels to be newMesh.
@ -3229,11 +3206,6 @@ void Foam::autoLayerDriver::addLayers
mesh.clearOut(); mesh.clearOut();
} }
if (meshRefiner_.overwrite())
{
mesh.setInstance(meshRefiner_.oldInstance());
}
meshRefiner_.updateMesh(map, labelList(0)); meshRefiner_.updateMesh(map, labelList(0));

View File

@ -756,6 +756,9 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo
// Distance to wall // Distance to wall
List<pointData> pointWallDist(mesh.nPoints()); List<pointData> pointWallDist(mesh.nPoints());
// Dummy additional info for PointEdgeWave
int dummyTrackData = 0;
// 1. Calculate distance to points where displacement is specified. // 1. Calculate distance to points where displacement is specified.
{ {
@ -783,7 +786,8 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo
wallInfo, wallInfo,
pointWallDist, pointWallDist,
edgeWallDist, edgeWallDist,
mesh.globalData().nTotalPoints() // max iterations mesh.globalData().nTotalPoints(), // max iterations
dummyTrackData
); );
} }
@ -813,7 +817,7 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo
{ {
label pointI = e[ep]; label pointI = e[ep];
if (!pointMedialDist[pointI].valid()) if (!pointMedialDist[pointI].valid(dummyTrackData))
{ {
maxPoints.append(pointI); maxPoints.append(pointI);
maxInfo.append maxInfo.append
@ -857,7 +861,7 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo
{ {
label pointI = meshPoints[i]; label pointI = meshPoints[i];
if (!pointMedialDist[pointI].valid()) if (!pointMedialDist[pointI].valid(dummyTrackData))
{ {
maxPoints.append(pointI); maxPoints.append(pointI);
maxInfo.append maxInfo.append
@ -888,7 +892,8 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo
pointMedialDist, pointMedialDist,
edgeMedialDist, edgeMedialDist,
mesh.globalData().nTotalPoints() // max iterations mesh.globalData().nTotalPoints(), // max iterations
dummyTrackData
); );
// Extract medial axis distance as pointScalarField // Extract medial axis distance as pointScalarField

View File

@ -32,19 +32,20 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const pointData& wDist)
if (os.format() == IOstream::ASCII) if (os.format() == IOstream::ASCII)
{ {
return os return os
<< wDist.origin() << token::SPACE << wDist.distSqr() << static_cast<const pointEdgePoint&>(wDist)
<< token::SPACE << wDist.s() << token::SPACE << wDist.v(); << token::SPACE << wDist.s() << token::SPACE << wDist.v();
} }
else else
{ {
return os return os
<< wDist.origin() << wDist.distSqr() << wDist.s() << wDist.v(); << static_cast<const pointEdgePoint&>(wDist)
<< wDist.s() << wDist.v();
} }
} }
Foam::Istream& Foam::operator>>(Istream& is, pointData& wDist) Foam::Istream& Foam::operator>>(Istream& is, pointData& wDist)
{ {
return is >> wDist.origin_ >> wDist.distSqr_ >> wDist.s_ >> wDist.v_; return is >> static_cast<pointEdgePoint&>(wDist) >> wDist.s_ >> wDist.v_;
} }
// ************************************************************************* // // ************************************************************************* //

View File

@ -25,10 +25,10 @@ Class
Foam::pointData Foam::pointData
Description Description
Holds information regarding nearest wall point. Used in pointEdgeWave. Variant of pointEdgePoint with some transported additional data.
(so not standard meshWave) WIP - should be templated on data like wallDistData.
Passive vector v_ is not a coordinate (so no enterDomain/leaveDomain
To be used in wall distance calculation. transformation needed)
SourceFiles SourceFiles
pointDataI.H pointDataI.H
@ -39,9 +39,10 @@ SourceFiles
#ifndef pointData_H #ifndef pointData_H
#define pointData_H #define pointData_H
#include "point.H" #include "pointEdgePoint.H"
#include "label.H" //#include "point.H"
#include "tensor.H" //#include "label.H"
//#include "tensor.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -49,51 +50,22 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Class forward declarations
class polyPatch;
class polyMesh;
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class pointData Declaration Class pointData Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class pointData class pointData
:
public pointEdgePoint
{ {
// Private data // Private data
//- position of nearest wall center
point origin_;
//- normal distance (squared) from point to origin
scalar distSqr_;
//- additional information. //- additional information.
scalar s_; scalar s_;
//- additional information. //- additional information.
vector v_; vector v_;
// Private Member Functions
//- Evaluate distance to point. Update distSqr, origin from whomever
// is nearer pt. Return true if w2 is closer to point,
// false otherwise.
inline bool update
(
const point&,
const pointData& w2,
const scalar tol
);
//- Combine current with w2. Update distSqr, origin if w2 has smaller
// quantities and returns true.
inline bool update
(
const pointData& w2,
const scalar tol
);
public: public:
// Constructors // Constructors
@ -118,10 +90,6 @@ public:
// Access // Access
inline const point& origin() const;
inline scalar distSqr() const;
inline scalar s() const; inline scalar s() const;
inline const vector& v() const; inline const vector& v() const;
@ -129,81 +97,60 @@ public:
// Needed by meshWave // Needed by meshWave
//- Check whether origin has been changed at all or
// still contains original (invalid) value.
inline bool valid() const;
//- Check for identical geometrical data. Used for cyclics checking.
inline bool sameGeometry(const pointData&, const scalar tol)
const;
//- Convert origin to relative vector to leaving point
// (= point coordinate)
inline void leaveDomain
(
const polyPatch& patch,
const label patchPointI,
const point& pos
);
//- Convert relative origin to absolute by adding entering point
inline void enterDomain
(
const polyPatch& patch,
const label patchPointI,
const point& pos
);
//- Apply rotation matrix to origin //- Apply rotation matrix to origin
inline void transform(const tensor& rotTensor); template<class TrackingData>
inline void transform
(
const tensor& rotTensor,
TrackingData& td
);
//- Influence of edge on point //- Influence of edge on point
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const label edgeI, const label edgeI,
const pointData& edgeInfo, const pointData& edgeInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of different value on same point. //- Influence of different value on same point.
// Merge new and old info. // Merge new and old info.
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const pointData& newPointInfo, const pointData& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of different value on same point. //- Influence of different value on same point.
// No information about current position whatsoever. // No information about current position whatsoever.
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const pointData& newPointInfo, const pointData& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of point on edge. //- Influence of point on edge.
template<class TrackingData>
inline bool updateEdge inline bool updateEdge
( (
const polyMesh& mesh, const polyMesh& mesh,
const label edgeI, const label edgeI,
const label pointI, const label pointI,
const pointData& pointInfo, const pointData& pointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
// Member Operators
//Note: Used to determine whether to call update.
inline bool operator==(const pointData&) const;
inline bool operator!=(const pointData&) const;
// IOstream Operators // IOstream Operators
friend Ostream& operator<<(Ostream&, const pointData&); friend Ostream& operator<<(Ostream&, const pointData&);

View File

@ -26,118 +26,12 @@ License
#include "polyMesh.H" #include "polyMesh.H"
#include "transform.H" #include "transform.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// Update this with w2 if w2 nearer to pt.
inline bool Foam::pointData::update
(
const point& pt,
const pointData& w2,
const scalar tol
)
{
scalar dist2 = magSqr(pt - w2.origin());
if (!valid())
{
distSqr_ = dist2;
origin_ = w2.origin();
s_ = w2.s();
v_ = w2.v();
return true;
}
// if (v_ != w2.v())
// {
// return false;
// }
scalar diff = distSqr_ - dist2;
if (diff < 0)
{
// already nearer to pt
return false;
}
if ((diff < SMALL) || ((distSqr_ > SMALL) && (diff/distSqr_ < tol)))
{
// don't propagate small changes
return false;
}
else
{
// update with new values
distSqr_ = dist2;
origin_ = w2.origin();
s_ = w2.s();
v_ = w2.v();
return true;
}
}
// Update this with w2 (information on same point)
inline bool Foam::pointData::update
(
const pointData& w2,
const scalar tol
)
{
if (!valid())
{
// current not yet set so use any value
distSqr_ = w2.distSqr();
origin_ = w2.origin();
s_ = w2.s();
v_ = w2.v();
return true;
}
// if (v_ != w2.v())
// {
// return false;
// }
scalar diff = distSqr_ - w2.distSqr();
if (diff < 0)
{
// already nearer to pt
return false;
}
if ((diff < SMALL) || ((distSqr_ > SMALL) && (diff/distSqr_ < tol)))
{
// don't propagate small changes
return false;
}
else
{
// update with new values
distSqr_ = w2.distSqr();
origin_ = w2.origin();
s_ = w2.s();
v_ = w2.v();
return true;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Null constructor // Null constructor
inline Foam::pointData::pointData() inline Foam::pointData::pointData()
: :
origin_(point::max), pointEdgePoint(),
distSqr_(GREAT),
s_(GREAT), s_(GREAT),
v_(point::max) v_(point::max)
{} {}
@ -152,8 +46,7 @@ inline Foam::pointData::pointData
const vector& v const vector& v
) )
: :
origin_(origin), pointEdgePoint(origin, distSqr),
distSqr_(distSqr),
s_(s), s_(s),
v_(v) v_(v)
{} {}
@ -162,8 +55,7 @@ inline Foam::pointData::pointData
// Construct as copy // Construct as copy
inline Foam::pointData::pointData(const pointData& wpt) inline Foam::pointData::pointData(const pointData& wpt)
: :
origin_(wpt.origin()), pointEdgePoint(wpt),
distSqr_(wpt.distSqr()),
s_(wpt.s()), s_(wpt.s()),
v_(wpt.v()) v_(wpt.v())
{} {}
@ -171,18 +63,6 @@ inline Foam::pointData::pointData(const pointData& wpt)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline const Foam::point& Foam::pointData::origin() const
{
return origin_;
}
inline Foam::scalar Foam::pointData::distSqr() const
{
return distSqr_;
}
inline Foam::scalar Foam::pointData::s() const inline Foam::scalar Foam::pointData::s() const
{ {
return s_; return s_;
@ -195,157 +75,143 @@ inline const Foam::vector& Foam::pointData::v() const
} }
inline bool Foam::pointData::valid() const template <class TrackingData>
{ inline void Foam::pointData::transform
return origin_ != point::max;
}
// Checks for cyclic points
inline bool Foam::pointData::sameGeometry
( (
const pointData& w2, const tensor& rotTensor,
const scalar tol TrackingData& td
) const
{
scalar diff = Foam::mag(distSqr() - w2.distSqr());
if (diff < SMALL)
{
return true;
}
else
{
if ((distSqr() > SMALL) && ((diff/distSqr()) < tol))
{
return true;
}
else
{
return false;
}
}
}
inline void Foam::pointData::leaveDomain
(
const polyPatch& patch,
const label patchPointI,
const point& coord
) )
{ {
origin_ -= coord; pointEdgePoint::transform(rotTensor, td);
} v_ = Foam::transform(rotTensor, v_);
inline void Foam::pointData::transform(const tensor& rotTensor)
{
origin_ = Foam::transform(rotTensor, origin_);
}
// Update absolute geometric quantities. Note that distance (distSqr_)
// is not affected by leaving/entering domain.
inline void Foam::pointData::enterDomain
(
const polyPatch& patch,
const label patchPointI,
const point& coord
)
{
// back to absolute form
origin_ += coord;
} }
// Update this with information from connected edge // Update this with information from connected edge
template <class TrackingData>
inline bool Foam::pointData::updatePoint inline bool Foam::pointData::updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const label edgeI, const label edgeI,
const pointData& edgeInfo, const pointData& edgeInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
return if
update
( (
mesh.points()[pointI], pointEdgePoint::updatePoint
(
mesh,
pointI,
edgeI,
edgeInfo, edgeInfo,
tol tol,
); td
)
)
{
s_ = edgeInfo.s_;
v_ = edgeInfo.v_;
return true;
} }
else
{
return false;
}
}
// Update this with new information on same point // Update this with new information on same point
template <class TrackingData>
inline bool Foam::pointData::updatePoint inline bool Foam::pointData::updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const pointData& newPointInfo, const pointData& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
return if
update
( (
mesh.points()[pointI], pointEdgePoint::updatePoint
(
mesh,
pointI,
newPointInfo, newPointInfo,
tol tol,
); td
)
)
{
s_ = newPointInfo.s_;
v_ = newPointInfo.v_;
return true;
}
else
{
return false;
}
} }
// Update this with new information on same point. No extra information. // Update this with new information on same point. No extra information.
template <class TrackingData>
inline bool Foam::pointData::updatePoint inline bool Foam::pointData::updatePoint
( (
const pointData& newPointInfo, const pointData& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
return update(newPointInfo, tol); if (pointEdgePoint::updatePoint(newPointInfo, tol, td))
{
s_ = newPointInfo.s_;
v_ = newPointInfo.v_;
return true;
}
else
{
return false;
}
} }
// Update this with information from connected point // Update this with information from connected point
template <class TrackingData>
inline bool Foam::pointData::updateEdge inline bool Foam::pointData::updateEdge
( (
const polyMesh& mesh, const polyMesh& mesh,
const label edgeI, const label edgeI,
const label pointI, const label pointI,
const pointData& pointInfo, const pointData& pointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
const pointField& points = mesh.points(); if
const edge& e = mesh.edges()[edgeI];
const point edgeMid(0.5*(points[e[0]] + points[e[1]]));
return
update
( (
edgeMid, pointEdgePoint::updateEdge
(
mesh,
edgeI,
pointI,
pointInfo, pointInfo,
tol tol,
); td
} )
)
{
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // s_ = pointInfo.s_;
v_ = pointInfo.v_;
inline bool Foam::pointData::operator==(const pointData& rhs) const return true;
{ }
return origin() == rhs.origin(); else
} {
return false;
}
inline bool Foam::pointData::operator!=(const pointData& rhs) const
{
return !(*this == rhs);
} }

View File

@ -481,11 +481,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::doRemoveCells
mesh_.clearOut(); mesh_.clearOut();
} }
if (overwrite_)
{
mesh_.setInstance(oldInstance_);
}
// Update local mesh data // Update local mesh data
cellRemover.updateMesh(map); cellRemover.updateMesh(map);
@ -1903,9 +1898,14 @@ void Foam::meshRefinement::distribute(const mapDistributePolyMesh& map)
pointMap.clear(); pointMap.clear();
} }
} }
// If necessary reset the instance
mesh_.setInstance(timeName());
setInstance(mesh_.facesInstance());
} }
// Update local data for a mesh change
void Foam::meshRefinement::updateMesh void Foam::meshRefinement::updateMesh
( (
const mapPolyMesh& map, const mapPolyMesh& map,
@ -2027,6 +2027,10 @@ void Foam::meshRefinement::updateMesh
data.transfer(newFaceData); data.transfer(newFaceData);
} }
} }
// If necessary reset the instance
mesh_.setInstance(timeName());
setInstance(mesh_.facesInstance());
} }
@ -2137,7 +2141,7 @@ void Foam::meshRefinement::dumpRefinementLevel() const
IOobject IOobject
( (
"cellLevel", "cellLevel",
timeName(), mesh_.time().timeName(),// Dump to current time, not to mesh inst
mesh_, mesh_,
IOobject::NO_READ, IOobject::NO_READ,
IOobject::AUTO_WRITE, IOobject::AUTO_WRITE,
@ -2165,7 +2169,7 @@ void Foam::meshRefinement::dumpRefinementLevel() const
IOobject IOobject
( (
"pointLevel", "pointLevel",
timeName(), mesh_.time().timeName(),// Dump to current time, not to mesh inst
mesh_, mesh_,
IOobject::NO_READ, IOobject::NO_READ,
IOobject::NO_WRITE, IOobject::NO_WRITE,

View File

@ -517,11 +517,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::createBaffles
mesh_.clearOut(); mesh_.clearOut();
} }
if (overwrite())
{
mesh_.setInstance(oldInstance());
}
//- Redo the intersections on the newly create baffle faces. Note that //- Redo the intersections on the newly create baffle faces. Note that
// this changes also the cell centre positions. // this changes also the cell centre positions.
faceSet baffledFacesSet(mesh_, "baffledFacesSet", 2*nBaffles); faceSet baffledFacesSet(mesh_, "baffledFacesSet", 2*nBaffles);
@ -965,11 +960,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::mergeBaffles
mesh_.clearOut(); mesh_.clearOut();
} }
if (overwrite())
{
mesh_.setInstance(oldInstance());
}
// Update intersections. Recalculate intersections on merged faces since // Update intersections. Recalculate intersections on merged faces since
// this seems to give problems? Note: should not be nessecary since // this seems to give problems? Note: should not be nessecary since
// baffles preserve intersections from when they were created. // baffles preserve intersections from when they were created.
@ -2249,11 +2239,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::dupNonManifoldPoints()
mesh_.clearOut(); mesh_.clearOut();
} }
if (overwrite())
{
mesh_.setInstance(oldInstance());
}
// Update intersections. Is mapping only (no faces created, positions stay // Update intersections. Is mapping only (no faces created, positions stay
// same) so no need to recalculate intersections. // same) so no need to recalculate intersections.
updateMesh(map, labelList(0)); updateMesh(map, labelList(0));
@ -2783,11 +2768,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify
mesh_.clearOut(); mesh_.clearOut();
} }
if (overwrite())
{
mesh_.setInstance(oldInstance());
}
// Print some stats (note: zones are synchronised) // Print some stats (note: zones are synchronised)
if (mesh_.cellZones().size() > 0) if (mesh_.cellZones().size() > 0)
{ {

View File

@ -103,11 +103,6 @@ Foam::label Foam::meshRefinement::mergePatchFaces
mesh_.clearOut(); mesh_.clearOut();
} }
if (overwrite())
{
mesh_.setInstance(oldInstance());
}
faceCombiner.updateMesh(map); faceCombiner.updateMesh(map);
// Get the kept faces that need to be recalculated. // Get the kept faces that need to be recalculated.
@ -203,11 +198,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::mergeEdges
mesh_.clearOut(); mesh_.clearOut();
} }
if (overwrite())
{
mesh_.setInstance(oldInstance());
}
pointRemover.updateMesh(map); pointRemover.updateMesh(map);
// Get the kept faces that need to be recalculated. // Get the kept faces that need to be recalculated.

View File

@ -1236,11 +1236,6 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::refine
mesh_.clearOut(); mesh_.clearOut();
} }
if (overwrite())
{
mesh_.setInstance(oldInstance());
}
// Update intersection info // Update intersection info
updateMesh(map, getChangedFaces(map, cellsToRefine)); updateMesh(map, getChangedFaces(map, cellsToRefine));

View File

@ -32,36 +32,25 @@ License
#include "PstreamCombineReduceOps.H" #include "PstreamCombineReduceOps.H"
#include "debug.H" #include "debug.H"
#include "typeInfo.H" #include "typeInfo.H"
#include "globalMeshData.H"
#include "pointFields.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
template <class Type> template <class Type, class TrackingData>
Foam::scalar Foam::PointEdgeWave<Type>::propagationTol_ = 0.01; Foam::scalar Foam::PointEdgeWave<Type, TrackingData>::propagationTol_ = 0.01;
template <class Type, class TrackingData>
// Offset labelList. Used for transferring from one cyclic half to the other. Foam::label Foam::PointEdgeWave<Type, TrackingData>::dummyTrackData_ = 12345;
template <class Type>
void Foam::PointEdgeWave<Type>::offset(const label val, labelList& elems)
{
forAll(elems, i)
{
elems[i] += val;
}
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// Gets point-point correspondence. Is
// - list of halfA points (in cyclic patch points)
// - list of halfB points (can overlap with A!)
// - for every patchPoint its corresponding point
// Handle leaving domain. Implementation referred to Type // Handle leaving domain. Implementation referred to Type
template <class Type> template <class Type, class TrackingData>
void Foam::PointEdgeWave<Type>::leaveDomain void Foam::PointEdgeWave<Type, TrackingData>::leaveDomain
( (
const polyPatch& meshPatch, const polyPatch& patch,
const primitivePatch& patch,
const labelList& patchPointLabels, const labelList& patchPointLabels,
List<Type>& pointInfo List<Type>& pointInfo
) const ) const
@ -74,17 +63,16 @@ void Foam::PointEdgeWave<Type>::leaveDomain
const point& pt = patch.points()[meshPoints[patchPointI]]; const point& pt = patch.points()[meshPoints[patchPointI]];
pointInfo[i].leaveDomain(meshPatch, patchPointI, pt); pointInfo[i].leaveDomain(patch, patchPointI, pt, td_);
} }
} }
// Handle entering domain. Implementation referred to Type // Handle entering domain. Implementation referred to Type
template <class Type> template <class Type, class TrackingData>
void Foam::PointEdgeWave<Type>::enterDomain void Foam::PointEdgeWave<Type, TrackingData>::enterDomain
( (
const polyPatch& meshPatch, const polyPatch& patch,
const primitivePatch& patch,
const labelList& patchPointLabels, const labelList& patchPointLabels,
List<Type>& pointInfo List<Type>& pointInfo
) const ) const
@ -97,15 +85,16 @@ void Foam::PointEdgeWave<Type>::enterDomain
const point& pt = patch.points()[meshPoints[patchPointI]]; const point& pt = patch.points()[meshPoints[patchPointI]];
pointInfo[i].enterDomain(meshPatch, patchPointI, pt); pointInfo[i].enterDomain(patch, patchPointI, pt, td_);
} }
} }
// Transform. Implementation referred to Type // Transform. Implementation referred to Type
template <class Type> template <class Type, class TrackingData>
void Foam::PointEdgeWave<Type>::transform void Foam::PointEdgeWave<Type, TrackingData>::transform
( (
const polyPatch& patch,
const tensorField& rotTensor, const tensorField& rotTensor,
List<Type>& pointInfo List<Type>& pointInfo
) const ) const
@ -116,19 +105,22 @@ void Foam::PointEdgeWave<Type>::transform
forAll(pointInfo, i) forAll(pointInfo, i)
{ {
pointInfo[i].transform(T); pointInfo[i].transform(T, td_);
} }
} }
else else
{ {
FatalErrorIn FatalErrorIn
( (
"PointEdgeWave<Type>::transform(const tensorField&, List<Type>&)" "PointEdgeWave<Type, TrackingData>::transform"
) << "Parallel cyclics not supported" << abort(FatalError); "(const tensorField&, List<Type>&)"
) << "Non-uniform transformation on patch " << patch.name()
<< " not supported for point fields"
<< abort(FatalError);
forAll(pointInfo, i) forAll(pointInfo, i)
{ {
pointInfo[i].transform(rotTensor[i]); pointInfo[i].transform(rotTensor[i], td_);
} }
} }
} }
@ -139,19 +131,18 @@ void Foam::PointEdgeWave<Type>::transform
// Updates: // Updates:
// - changedPoint_, changedPoints_, nChangedPoints_, // - changedPoint_, changedPoints_, nChangedPoints_,
// - statistics: nEvals_, nUnvisitedPoints_ // - statistics: nEvals_, nUnvisitedPoints_
template <class Type> template <class Type, class TrackingData>
bool Foam::PointEdgeWave<Type>::updatePoint bool Foam::PointEdgeWave<Type, TrackingData>::updatePoint
( (
const label pointI, const label pointI,
const label neighbourEdgeI, const label neighbourEdgeI,
const Type& neighbourInfo, const Type& neighbourInfo,
const scalar tol,
Type& pointInfo Type& pointInfo
) )
{ {
nEvals_++; nEvals_++;
bool wasValid = pointInfo.valid(); bool wasValid = pointInfo.valid(td_);
bool propagate = bool propagate =
pointInfo.updatePoint pointInfo.updatePoint
@ -160,7 +151,8 @@ bool Foam::PointEdgeWave<Type>::updatePoint
pointI, pointI,
neighbourEdgeI, neighbourEdgeI,
neighbourInfo, neighbourInfo,
tol propagationTol_,
td_
); );
if (propagate) if (propagate)
@ -172,7 +164,7 @@ bool Foam::PointEdgeWave<Type>::updatePoint
} }
} }
if (!wasValid && pointInfo.valid()) if (!wasValid && pointInfo.valid(td_))
{ {
--nUnvisitedPoints_; --nUnvisitedPoints_;
} }
@ -186,18 +178,17 @@ bool Foam::PointEdgeWave<Type>::updatePoint
// Updates: // Updates:
// - changedPoint_, changedPoints_, nChangedPoints_, // - changedPoint_, changedPoints_, nChangedPoints_,
// - statistics: nEvals_, nUnvisitedPoints_ // - statistics: nEvals_, nUnvisitedPoints_
template <class Type> template <class Type, class TrackingData>
bool Foam::PointEdgeWave<Type>::updatePoint bool Foam::PointEdgeWave<Type, TrackingData>::updatePoint
( (
const label pointI, const label pointI,
const Type& neighbourInfo, const Type& neighbourInfo,
const scalar tol,
Type& pointInfo Type& pointInfo
) )
{ {
nEvals_++; nEvals_++;
bool wasValid = pointInfo.valid(); bool wasValid = pointInfo.valid(td_);
bool propagate = bool propagate =
pointInfo.updatePoint pointInfo.updatePoint
@ -205,7 +196,8 @@ bool Foam::PointEdgeWave<Type>::updatePoint
mesh_, mesh_,
pointI, pointI,
neighbourInfo, neighbourInfo,
tol propagationTol_,
td_
); );
if (propagate) if (propagate)
@ -217,7 +209,7 @@ bool Foam::PointEdgeWave<Type>::updatePoint
} }
} }
if (!wasValid && pointInfo.valid()) if (!wasValid && pointInfo.valid(td_))
{ {
--nUnvisitedPoints_; --nUnvisitedPoints_;
} }
@ -231,19 +223,18 @@ bool Foam::PointEdgeWave<Type>::updatePoint
// Updates: // Updates:
// - changedEdge_, changedEdges_, nChangedEdges_, // - changedEdge_, changedEdges_, nChangedEdges_,
// - statistics: nEvals_, nUnvisitedEdge_ // - statistics: nEvals_, nUnvisitedEdge_
template <class Type> template <class Type, class TrackingData>
bool Foam::PointEdgeWave<Type>::updateEdge bool Foam::PointEdgeWave<Type, TrackingData>::updateEdge
( (
const label edgeI, const label edgeI,
const label neighbourPointI, const label neighbourPointI,
const Type& neighbourInfo, const Type& neighbourInfo,
const scalar tol,
Type& edgeInfo Type& edgeInfo
) )
{ {
nEvals_++; nEvals_++;
bool wasValid = edgeInfo.valid(); bool wasValid = edgeInfo.valid(td_);
bool propagate = bool propagate =
edgeInfo.updateEdge edgeInfo.updateEdge
@ -252,7 +243,8 @@ bool Foam::PointEdgeWave<Type>::updateEdge
edgeI, edgeI,
neighbourPointI, neighbourPointI,
neighbourInfo, neighbourInfo,
tol propagationTol_,
td_
); );
if (propagate) if (propagate)
@ -264,7 +256,7 @@ bool Foam::PointEdgeWave<Type>::updateEdge
} }
} }
if (!wasValid && edgeInfo.valid()) if (!wasValid && edgeInfo.valid(td_))
{ {
--nUnvisitedEdges_; --nUnvisitedEdges_;
} }
@ -274,9 +266,9 @@ bool Foam::PointEdgeWave<Type>::updateEdge
// Check if patches of given type name are present // Check if patches of given type name are present
template <class Type> template <class Type, class TrackingData>
template <class PatchType> template <class PatchType>
Foam::label Foam::PointEdgeWave<Type>::countPatchType() const Foam::label Foam::PointEdgeWave<Type, TrackingData>::countPatchType() const
{ {
label nPatches = 0; label nPatches = 0;
@ -291,181 +283,82 @@ Foam::label Foam::PointEdgeWave<Type>::countPatchType() const
} }
// Collect changed patch points // Transfer all the information to/from neighbouring processors
template <class Type> template <class Type, class TrackingData>
void Foam::PointEdgeWave<Type>::getChangedPatchPoints void Foam::PointEdgeWave<Type, TrackingData>::handleProcPatches()
(
const primitivePatch& patch,
DynamicList<Type>& patchInfo,
DynamicList<label>& patchPoints,
DynamicList<label>& owner,
DynamicList<label>& ownerIndex
) const
{ {
const labelList& meshPoints = patch.meshPoints(); // 1. Send all point info on processor patches.
const faceList& localFaces = patch.localFaces();
const labelListList& pointFaces = patch.pointFaces();
forAll(meshPoints, patchPointI) PstreamBuffers pBufs(Pstream::nonBlocking);
DynamicList<Type> patchInfo;
DynamicList<label> thisPoints;
DynamicList<label> nbrPoints;
forAll(mesh_.globalData().processorPatches(), i)
{ {
label meshPointI = meshPoints[patchPointI]; label patchI = mesh_.globalData().processorPatches()[i];
const processorPolyPatch& procPatch =
refCast<const processorPolyPatch>(mesh_.boundaryMesh()[patchI]);
patchInfo.clear();
patchInfo.reserve(procPatch.nPoints());
thisPoints.clear();
thisPoints.reserve(procPatch.nPoints());
nbrPoints.clear();
nbrPoints.reserve(procPatch.nPoints());
// Get all changed points in reverse order
const labelList& neighbPoints = procPatch.neighbPoints();
forAll(neighbPoints, thisPointI)
{
label meshPointI = procPatch.meshPoints()[thisPointI];
if (changedPoint_[meshPointI]) if (changedPoint_[meshPointI])
{ {
patchInfo.append(allPointInfo_[meshPointI]); patchInfo.append(allPointInfo_[meshPointI]);
patchPoints.append(patchPointI); thisPoints.append(thisPointI);
nbrPoints.append(neighbPoints[thisPointI]);
label patchFaceI = pointFaces[patchPointI][0];
const face& f = localFaces[patchFaceI];
label index = findIndex(f, patchPointI);
owner.append(patchFaceI);
ownerIndex.append(index);
} }
} }
patchInfo.shrink();
patchPoints.shrink();
owner.shrink();
ownerIndex.shrink();
}
// Update overall for changed patch points
template <class Type>
void Foam::PointEdgeWave<Type>::updateFromPatchInfo
(
const polyPatch& meshPatch,
const primitivePatch& patch,
const labelList& owner,
const labelList& ownerIndex,
List<Type>& patchInfo
)
{
const faceList& localFaces = patch.localFaces();
const labelList& meshPoints = patch.meshPoints();
// Get patch and mesh points.
labelList changedPatchPoints(patchInfo.size());
labelList changedMeshPoints(patchInfo.size());
forAll(owner, i)
{
label faceI = owner[i];
const face& f = localFaces[faceI];
label index = (f.size() - ownerIndex[i]) % f.size();
changedPatchPoints[i] = f[index];
changedMeshPoints[i] = meshPoints[f[index]];
}
// Adapt for entering domain
enterDomain(meshPatch, patch, changedPatchPoints, patchInfo);
// Merge received info
forAll(patchInfo, i)
{
updatePoint
(
changedMeshPoints[i],
patchInfo[i],
propagationTol_,
allPointInfo_[changedMeshPoints[i]]
);
}
}
// Transfer all the information to/from neighbouring processors
template <class Type>
void Foam::PointEdgeWave<Type>::handleProcPatches()
{
// 1. Send all point info on processor patches. Send as
// face label + offset in face.
forAll(mesh_.boundaryMesh(), patchI)
{
const polyPatch& patch = mesh_.boundaryMesh()[patchI];
if (isA<processorPolyPatch>(patch))
{
// Get all changed points in relative addressing
DynamicList<Type> patchInfo(patch.nPoints());
DynamicList<label> patchPoints(patch.nPoints());
DynamicList<label> owner(patch.nPoints());
DynamicList<label> ownerIndex(patch.nPoints());
getChangedPatchPoints
(
patch,
patchInfo,
patchPoints,
owner,
ownerIndex
);
// Adapt for leaving domain // Adapt for leaving domain
leaveDomain(patch, patch, patchPoints, patchInfo); leaveDomain(procPatch, thisPoints, patchInfo);
const processorPolyPatch& procPatch =
refCast<const processorPolyPatch>(patch);
if (debug) if (debug)
{ {
Pout<< "Processor patch " << patchI << ' ' << patch.name() Pout<< "Processor patch " << patchI << ' ' << procPatch.name()
<< " communicating with " << procPatch.neighbProcNo() << " communicating with " << procPatch.neighbProcNo()
<< " Sending:" << patchInfo.size() << endl; << " Sending:" << patchInfo.size() << endl;
} }
{ UOPstream toNeighbour(procPatch.neighbProcNo(), pBufs);
OPstream toNeighbour toNeighbour << nbrPoints << patchInfo;
(
Pstream::blocking,
procPatch.neighbProcNo()
);
toNeighbour << owner << ownerIndex << patchInfo;
}
}
} }
pBufs.finishedSends();
// //
// 2. Receive all point info on processor patches. // 2. Receive all point info on processor patches.
// //
forAll(mesh_.boundaryMesh(), patchI) forAll(mesh_.globalData().processorPatches(), i)
{
const polyPatch& patch = mesh_.boundaryMesh()[patchI];
if (isA<processorPolyPatch>(patch))
{ {
label patchI = mesh_.globalData().processorPatches()[i];
const processorPolyPatch& procPatch = const processorPolyPatch& procPatch =
refCast<const processorPolyPatch>(patch); refCast<const processorPolyPatch>(mesh_.boundaryMesh()[patchI]);
List<Type> patchInfo; List<Type> patchInfo;
labelList owner; labelList patchPoints;
labelList ownerIndex;
{
IPstream fromNeighbour
(
Pstream::blocking,
procPatch.neighbProcNo()
);
fromNeighbour >> owner >> ownerIndex >> patchInfo; {
UIPstream fromNeighbour(procPatch.neighbProcNo(), pBufs);
fromNeighbour >> patchPoints >> patchInfo;
} }
if (debug) if (debug)
{ {
Pout<< "Processor patch " << patchI << ' ' << patch.name() Pout<< "Processor patch " << patchI << ' ' << procPatch.name()
<< " communicating with " << procPatch.neighbProcNo() << " communicating with " << procPatch.neighbProcNo()
<< " Received:" << patchInfo.size() << endl; << " Received:" << patchInfo.size() << endl;
} }
@ -473,19 +366,29 @@ void Foam::PointEdgeWave<Type>::handleProcPatches()
// Apply transform to received data for non-parallel planes // Apply transform to received data for non-parallel planes
if (!procPatch.parallel()) if (!procPatch.parallel())
{ {
transform(procPatch.forwardT(), patchInfo); transform(procPatch, procPatch.forwardT(), patchInfo);
} }
updateFromPatchInfo // Adapt for entering domain
enterDomain(procPatch, patchPoints, patchInfo);
// Merge received info
const labelList& meshPoints = procPatch.meshPoints();
forAll(patchInfo, i)
{
label meshPointI = meshPoints[patchPoints[i]];
if (!allPointInfo_[meshPointI].equal(patchInfo[i], td_))
{
updatePoint
( (
patch, meshPointI,
patch, patchInfo[i],
owner, allPointInfo_[meshPointI]
ownerIndex,
patchInfo
); );
} }
} }
}
@ -508,20 +411,21 @@ void Foam::PointEdgeWave<Type>::handleProcPatches()
// Combine on master. Reduce operator has to handle a list and call // Combine on master. Reduce operator has to handle a list and call
// Type.updatePoint for all elements // Type.updatePoint for all elements
combineReduce(sharedData, listUpdateOp<Type>()); combineReduce(sharedData, listUpdateOp<Type>(propagationTol_, td_));
forAll(pd.sharedPointLabels(), i) forAll(pd.sharedPointLabels(), i)
{ {
label meshPointI = pd.sharedPointLabels()[i]; label meshPointI = pd.sharedPointLabels()[i];
// Retrieve my entries from the shared points // Retrieve my entries from the shared points.
if (sharedData[pd.sharedPointAddr()[i]].valid()) const Type& nbrInfo = sharedData[pd.sharedPointAddr()[i]];
if (!allPointInfo_[meshPointI].equal(nbrInfo, td_))
{ {
updatePoint updatePoint
( (
meshPointI, meshPointI,
sharedData[pd.sharedPointAddr()[i]], nbrInfo,
propagationTol_,
allPointInfo_[meshPointI] allPointInfo_[meshPointI]
); );
} }
@ -529,11 +433,14 @@ void Foam::PointEdgeWave<Type>::handleProcPatches()
} }
template <class Type> template <class Type, class TrackingData>
void Foam::PointEdgeWave<Type>::handleCyclicPatches() void Foam::PointEdgeWave<Type, TrackingData>::handleCyclicPatches()
{ {
// 1. Send all point info on cyclic patches. Send as // 1. Send all point info on cyclic patches.
// face label + offset in face.
DynamicList<Type> nbrInfo;
DynamicList<label> nbrPoints;
DynamicList<label> thisPoints;
forAll(mesh_.boundaryMesh(), patchI) forAll(mesh_.boundaryMesh(), patchI)
{ {
@ -544,31 +451,44 @@ void Foam::PointEdgeWave<Type>::handleCyclicPatches()
const cyclicPolyPatch& cycPatch = const cyclicPolyPatch& cycPatch =
refCast<const cyclicPolyPatch>(patch); refCast<const cyclicPolyPatch>(patch);
nbrInfo.clear();
nbrInfo.reserve(cycPatch.nPoints());
nbrPoints.clear();
nbrPoints.reserve(cycPatch.nPoints());
thisPoints.clear();
thisPoints.reserve(cycPatch.nPoints());
// Collect nbrPatch points that have changed
{
const cyclicPolyPatch& nbrPatch = cycPatch.neighbPatch(); const cyclicPolyPatch& nbrPatch = cycPatch.neighbPatch();
const edgeList& pairs = cycPatch.coupledPoints();
const labelList& meshPoints = nbrPatch.meshPoints();
DynamicList<Type> nbrInfo(nbrPatch.nPoints()); forAll(pairs, pairI)
DynamicList<label> nbrPoints(nbrPatch.nPoints()); {
DynamicList<label> nbrOwner(nbrPatch.nPoints()); label thisPointI = pairs[pairI][0];
DynamicList<label> nbrIndex(nbrPatch.nPoints()); label nbrPointI = pairs[pairI][1];
label meshPointI = meshPoints[nbrPointI];
getChangedPatchPoints if (changedPoint_[meshPointI])
( {
nbrPatch, nbrInfo.append(allPointInfo_[meshPointI]);
nbrInfo, nbrPoints.append(nbrPointI);
nbrPoints, thisPoints.append(thisPointI);
nbrOwner, }
nbrIndex }
);
// nbr : adapt for leaving domain // nbr : adapt for leaving domain
leaveDomain(nbrPatch, nbrPatch, nbrPoints, nbrInfo); leaveDomain(nbrPatch, nbrPoints, nbrInfo);
}
// Apply rotation for non-parallel planes // Apply rotation for non-parallel planes
if (!cycPatch.parallel()) if (!cycPatch.parallel())
{ {
// received data from half1 // received data from half1
transform(cycPatch.forwardT(), nbrInfo); transform(cycPatch, cycPatch.forwardT(), nbrInfo);
} }
if (debug) if (debug)
@ -578,19 +498,24 @@ void Foam::PointEdgeWave<Type>::handleCyclicPatches()
<< endl; << endl;
} }
// Half1: update with data from halfB // Adapt for entering domain
updateFromPatchInfo enterDomain(cycPatch, thisPoints, nbrInfo);
(
cycPatch,
cycPatch,
nbrOwner,
nbrIndex,
nbrInfo
);
if (debug) // Merge received info
const labelList& meshPoints = cycPatch.meshPoints();
forAll(nbrInfo, i)
{ {
//checkCyclic(patch); label meshPointI = meshPoints[thisPoints[i]];
if (!allPointInfo_[meshPointI].equal(nbrInfo[i], td_))
{
updatePoint
(
meshPointI,
nbrInfo[i],
allPointInfo_[meshPointI]
);
}
} }
} }
} }
@ -601,22 +526,24 @@ void Foam::PointEdgeWave<Type>::handleCyclicPatches()
// Iterate, propagating changedPointsInfo across mesh, until no change (or // Iterate, propagating changedPointsInfo across mesh, until no change (or
// maxIter reached). Initial point values specified. // maxIter reached). Initial point values specified.
template <class Type> template <class Type, class TrackingData>
Foam::PointEdgeWave<Type>::PointEdgeWave Foam::PointEdgeWave<Type, TrackingData>::PointEdgeWave
( (
const polyMesh& mesh, const polyMesh& mesh,
const labelList& changedPoints, const labelList& changedPoints,
const List<Type>& changedPointsInfo, const List<Type>& changedPointsInfo,
List<Type>& allPointInfo, UList<Type>& allPointInfo,
List<Type>& allEdgeInfo, UList<Type>& allEdgeInfo,
const label maxIter const label maxIter,
TrackingData& td
) )
: :
mesh_(mesh), mesh_(mesh),
allPointInfo_(allPointInfo), allPointInfo_(allPointInfo),
allEdgeInfo_(allEdgeInfo), allEdgeInfo_(allEdgeInfo),
td_(td),
changedPoint_(mesh_.nPoints(), false), changedPoint_(mesh_.nPoints(), false),
changedPoints_(mesh_.nPoints()), changedPoints_(mesh_.nPoints()),
nChangedPoints_(0), nChangedPoints_(0),
@ -632,7 +559,7 @@ Foam::PointEdgeWave<Type>::PointEdgeWave
{ {
FatalErrorIn FatalErrorIn
( (
"PointEdgeWave<Type>::PointEdgeWave" "PointEdgeWave<Type, TrackingData>::PointEdgeWave"
"(const polyMesh&, const labelList&, const List<Type>," "(const polyMesh&, const labelList&, const List<Type>,"
" List<Type>&, List<Type>&, const label maxIter)" " List<Type>&, List<Type>&, const label maxIter)"
) << "size of pointInfo work array is not equal to the number" ) << "size of pointInfo work array is not equal to the number"
@ -645,7 +572,7 @@ Foam::PointEdgeWave<Type>::PointEdgeWave
{ {
FatalErrorIn FatalErrorIn
( (
"PointEdgeWave<Type>::PointEdgeWave" "PointEdgeWave<Type, TrackingData>::PointEdgeWave"
"(const polyMesh&, const labelList&, const List<Type>," "(const polyMesh&, const labelList&, const List<Type>,"
" List<Type>&, List<Type>&, const label maxIter)" " List<Type>&, List<Type>&, const label maxIter)"
) << "size of edgeInfo work array is not equal to the number" ) << "size of edgeInfo work array is not equal to the number"
@ -671,7 +598,7 @@ Foam::PointEdgeWave<Type>::PointEdgeWave
{ {
FatalErrorIn FatalErrorIn
( (
"PointEdgeWave<Type>::PointEdgeWave" "PointEdgeWave<Type, TrackingData>::PointEdgeWave"
"(const polyMesh&, const labelList&, const List<Type>," "(const polyMesh&, const labelList&, const List<Type>,"
" List<Type>&, List<Type>&, const label maxIter)" " List<Type>&, List<Type>&, const label maxIter)"
) << "Maximum number of iterations reached. Increase maxIter." << endl ) << "Maximum number of iterations reached. Increase maxIter." << endl
@ -683,17 +610,19 @@ Foam::PointEdgeWave<Type>::PointEdgeWave
} }
template <class Type> template <class Type, class TrackingData>
Foam::PointEdgeWave<Type>::PointEdgeWave Foam::PointEdgeWave<Type, TrackingData>::PointEdgeWave
( (
const polyMesh& mesh, const polyMesh& mesh,
List<Type>& allPointInfo, UList<Type>& allPointInfo,
List<Type>& allEdgeInfo UList<Type>& allEdgeInfo,
TrackingData& td
) )
: :
mesh_(mesh), mesh_(mesh),
allPointInfo_(allPointInfo), allPointInfo_(allPointInfo),
allEdgeInfo_(allEdgeInfo), allEdgeInfo_(allEdgeInfo),
td_(td),
changedPoint_(mesh_.nPoints(), false), changedPoint_(mesh_.nPoints(), false),
changedPoints_(mesh_.nPoints()), changedPoints_(mesh_.nPoints()),
nChangedPoints_(0), nChangedPoints_(0),
@ -709,31 +638,31 @@ Foam::PointEdgeWave<Type>::PointEdgeWave
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template <class Type> template <class Type, class TrackingData>
Foam::PointEdgeWave<Type>::~PointEdgeWave() Foam::PointEdgeWave<Type, TrackingData>::~PointEdgeWave()
{} {}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template <class Type> template <class Type, class TrackingData>
Foam::label Foam::PointEdgeWave<Type>::getUnsetPoints() const Foam::label Foam::PointEdgeWave<Type, TrackingData>::getUnsetPoints() const
{ {
return nUnvisitedPoints_; return nUnvisitedPoints_;
} }
template <class Type> template <class Type, class TrackingData>
Foam::label Foam::PointEdgeWave<Type>::getUnsetEdges() const Foam::label Foam::PointEdgeWave<Type, TrackingData>::getUnsetEdges() const
{ {
return nUnvisitedEdges_; return nUnvisitedEdges_;
} }
// Copy point information into member data // Copy point information into member data
template <class Type> template <class Type, class TrackingData>
void Foam::PointEdgeWave<Type>::setPointInfo void Foam::PointEdgeWave<Type, TrackingData>::setPointInfo
( (
const labelList& changedPoints, const labelList& changedPoints,
const List<Type>& changedPointsInfo const List<Type>& changedPointsInfo
@ -743,13 +672,13 @@ void Foam::PointEdgeWave<Type>::setPointInfo
{ {
label pointI = changedPoints[changedPointI]; label pointI = changedPoints[changedPointI];
bool wasValid = allPointInfo_[pointI].valid(); bool wasValid = allPointInfo_[pointI].valid(td_);
// Copy info for pointI // Copy info for pointI
allPointInfo_[pointI] = changedPointsInfo[changedPointI]; allPointInfo_[pointI] = changedPointsInfo[changedPointI];
// Maintain count of unset points // Maintain count of unset points
if (!wasValid && allPointInfo_[pointI].valid()) if (!wasValid && allPointInfo_[pointI].valid(td_))
{ {
--nUnvisitedPoints_; --nUnvisitedPoints_;
} }
@ -766,8 +695,8 @@ void Foam::PointEdgeWave<Type>::setPointInfo
// Propagate information from edge to point. Return number of points changed. // Propagate information from edge to point. Return number of points changed.
template <class Type> template <class Type, class TrackingData>
Foam::label Foam::PointEdgeWave<Type>::edgeToPoint() Foam::label Foam::PointEdgeWave<Type, TrackingData>::edgeToPoint()
{ {
for for
( (
@ -780,7 +709,7 @@ Foam::label Foam::PointEdgeWave<Type>::edgeToPoint()
if (!changedEdge_[edgeI]) if (!changedEdge_[edgeI])
{ {
FatalErrorIn("PointEdgeWave<Type>::edgeToPoint()") FatalErrorIn("PointEdgeWave<Type, TrackingData>::edgeToPoint()")
<< "edge " << edgeI << "edge " << edgeI
<< " not marked as having been changed" << nl << " not marked as having been changed" << nl
<< "This might be caused by multiple occurences of the same" << "This might be caused by multiple occurences of the same"
@ -797,14 +726,13 @@ Foam::label Foam::PointEdgeWave<Type>::edgeToPoint()
{ {
Type& currentWallInfo = allPointInfo_[e[eI]]; Type& currentWallInfo = allPointInfo_[e[eI]];
if (currentWallInfo != neighbourWallInfo) if (!currentWallInfo.equal(neighbourWallInfo, td_))
{ {
updatePoint updatePoint
( (
e[eI], e[eI],
edgeI, edgeI,
neighbourWallInfo, neighbourWallInfo,
propagationTol_,
currentWallInfo currentWallInfo
); );
} }
@ -843,8 +771,8 @@ Foam::label Foam::PointEdgeWave<Type>::edgeToPoint()
// Propagate information from point to edge. Return number of edges changed. // Propagate information from point to edge. Return number of edges changed.
template <class Type> template <class Type, class TrackingData>
Foam::label Foam::PointEdgeWave<Type>::pointToEdge() Foam::label Foam::PointEdgeWave<Type, TrackingData>::pointToEdge()
{ {
const labelListList& pointEdges = mesh_.pointEdges(); const labelListList& pointEdges = mesh_.pointEdges();
@ -859,7 +787,7 @@ Foam::label Foam::PointEdgeWave<Type>::pointToEdge()
if (!changedPoint_[pointI]) if (!changedPoint_[pointI])
{ {
FatalErrorIn("PointEdgeWave<Type>::pointToEdge()") FatalErrorIn("PointEdgeWave<Type, TrackingData>::pointToEdge()")
<< "Point " << pointI << "Point " << pointI
<< " not marked as having been changed" << nl << " not marked as having been changed" << nl
<< "This might be caused by multiple occurences of the same" << "This might be caused by multiple occurences of the same"
@ -877,14 +805,13 @@ Foam::label Foam::PointEdgeWave<Type>::pointToEdge()
Type& currentWallInfo = allEdgeInfo_[edgeI]; Type& currentWallInfo = allEdgeInfo_[edgeI];
if (currentWallInfo != neighbourWallInfo) if (!currentWallInfo.equal(neighbourWallInfo, td_))
{ {
updateEdge updateEdge
( (
edgeI, edgeI,
pointI, pointI,
neighbourWallInfo, neighbourWallInfo,
propagationTol_,
currentWallInfo currentWallInfo
); );
} }
@ -912,8 +839,11 @@ Foam::label Foam::PointEdgeWave<Type>::pointToEdge()
// Iterate // Iterate
template <class Type> template <class Type, class TrackingData>
Foam::label Foam::PointEdgeWave<Type>::iterate(const label maxIter) Foam::label Foam::PointEdgeWave<Type, TrackingData>::iterate
(
const label maxIter
)
{ {
if (nCyclicPatches_ > 0) if (nCyclicPatches_ > 0)
{ {
@ -975,4 +905,5 @@ Foam::label Foam::PointEdgeWave<Type>::iterate(const label maxIter)
return iter; return iter;
} }
// ************************************************************************* // // ************************************************************************* //

View File

@ -58,13 +58,9 @@ SourceFiles
#ifndef PointEdgeWave_H #ifndef PointEdgeWave_H
#define PointEdgeWave_H #define PointEdgeWave_H
#include "label.H"
#include "boolList.H" #include "boolList.H"
#include "scalarField.H" #include "scalarField.H"
#include "pointFields.H" #include "tensorField.H"
#include "tensor.H"
#include "primitivePatch.H"
#include "PtrList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -73,7 +69,7 @@ namespace Foam
// Forward declaration of classes // Forward declaration of classes
class polyMesh; class polyMesh;
class polyPatch;
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class PointEdgeWaveName Declaration Class PointEdgeWaveName Declaration
@ -86,7 +82,7 @@ TemplateName(PointEdgeWave);
Class PointEdgeWave Declaration Class PointEdgeWave Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
template <class Type> template <class Type, class TrackingData = int>
class PointEdgeWave class PointEdgeWave
: :
public PointEdgeWaveName public PointEdgeWaveName
@ -98,6 +94,10 @@ class PointEdgeWave
// up to Type implementation) // up to Type implementation)
static scalar propagationTol_; static scalar propagationTol_;
//- Used as default trackdata value to satisfy default template
// argument.
static label dummyTrackData_;
// Private data // Private data
@ -105,10 +105,13 @@ class PointEdgeWave
const polyMesh& mesh_; const polyMesh& mesh_;
//- Wall information for all points //- Wall information for all points
List<Type>& allPointInfo_; UList<Type>& allPointInfo_;
//- Information on all mesh edges //- Information on all mesh edges
List<Type>& allEdgeInfo_; UList<Type>& allEdgeInfo_;
//- Additional data to be passed into container
TrackingData& td_;
//- Has point changed //- Has point changed
boolList changedPoint_; boolList changedPoint_;
@ -127,9 +130,6 @@ class PointEdgeWave
//- Number of cyclic patches //- Number of cyclic patches
label nCyclicPatches_; label nCyclicPatches_;
//- For every cyclic patch two primitivePatches
PtrList<primitivePatch> cycHalves_;
//- Number of evaluations //- Number of evaluations
label nEvals_; label nEvals_;
@ -140,15 +140,10 @@ class PointEdgeWave
// Private Member Functions // Private Member Functions
//- Add value to all elements of labelList
static void offset(const label val, labelList& elems);
//- Adapt pointInfo for leaving domain //- Adapt pointInfo for leaving domain
void leaveDomain void leaveDomain
( (
const polyPatch& meshPatch, const polyPatch&,
const primitivePatch& patch,
const List<label>& patchPointLabels, const List<label>& patchPointLabels,
List<Type>& pointInfo List<Type>& pointInfo
) const; ) const;
@ -156,8 +151,7 @@ class PointEdgeWave
//- Adapt pointInfo for entering domain //- Adapt pointInfo for entering domain
void enterDomain void enterDomain
( (
const polyPatch& meshPatch, const polyPatch&,
const primitivePatch& patch,
const List<label>& patchPointLabels, const List<label>& patchPointLabels,
List<Type>& pointInfo List<Type>& pointInfo
) const; ) const;
@ -165,6 +159,7 @@ class PointEdgeWave
//- Transform. Implementation referred to Type //- Transform. Implementation referred to Type
void transform void transform
( (
const polyPatch& patch,
const tensorField& rotTensor, const tensorField& rotTensor,
List<Type>& pointInfo List<Type>& pointInfo
) const; ) const;
@ -176,7 +171,6 @@ class PointEdgeWave
const label pointI, const label pointI,
const label neighbourEdgeI, const label neighbourEdgeI,
const Type& neighbourInfo, const Type& neighbourInfo,
const scalar tol,
Type& pointInfo Type& pointInfo
); );
@ -186,7 +180,6 @@ class PointEdgeWave
( (
const label pointI, const label pointI,
const Type& neighbourInfo, const Type& neighbourInfo,
const scalar tol,
Type& pointInfo Type& pointInfo
); );
@ -197,7 +190,6 @@ class PointEdgeWave
const label edgeI, const label edgeI,
const label neighbourPointI, const label neighbourPointI,
const Type& neighbourInfo, const Type& neighbourInfo,
const scalar tol,
Type& edgeInfo Type& edgeInfo
); );
@ -207,26 +199,6 @@ class PointEdgeWave
template <class PatchType> template <class PatchType>
label countPatchType() const; label countPatchType() const;
//- Get info on patch points
void getChangedPatchPoints
(
const primitivePatch& patch,
DynamicList<Type>& patchInfo,
DynamicList<label>& patchPoints,
DynamicList<label>& owner,
DynamicList<label>& ownerIndex
) const;
//- Merge data from patch into overall data
void updateFromPatchInfo
(
const polyPatch& meshPatch,
const primitivePatch& patch,
const labelList& owner,
const labelList& ownerIndex,
List<Type>& patchInfo
);
//- Merge data from across processor boundaries //- Merge data from across processor boundaries
void handleProcPatches(); void handleProcPatches();
@ -270,9 +242,10 @@ public:
const polyMesh& mesh, const polyMesh& mesh,
const labelList& initialPoints, const labelList& initialPoints,
const List<Type>& initialPointsInfo, const List<Type>& initialPointsInfo,
List<Type>& allPointInfo, UList<Type>& allPointInfo,
List<Type>& allEdgeInfo, UList<Type>& allEdgeInfo,
const label maxIter const label maxIter,
TrackingData& td = dummyTrackData_
); );
//- Construct from mesh. Use setPointInfo and iterate() to do //- Construct from mesh. Use setPointInfo and iterate() to do
@ -280,8 +253,9 @@ public:
PointEdgeWave PointEdgeWave
( (
const polyMesh& mesh, const polyMesh& mesh,
List<Type>& allPointInfo, UList<Type>& allPointInfo,
List<Type>& allEdgeInfo UList<Type>& allEdgeInfo,
TrackingData& td = dummyTrackData_
); );
@ -291,18 +265,24 @@ public:
// Member Functions // Member Functions
//- Get allPointInfo //- Access allPointInfo
const List<Type>& allPointInfo() const UList<Type>& allPointInfo() const
{ {
return allPointInfo_; return allPointInfo_;
} }
//- Get allEdgeInfo //- Access allEdgeInfo
const List<Type>& allEdgeInfo() const UList<Type>& allEdgeInfo() const
{ {
return allEdgeInfo_; return allEdgeInfo_;
} }
//- Additional data to be passed into container
const TrackingData& data() const
{
return td_;
}
//- Get number of unvisited edges, i.e. edges that were not (yet) //- Get number of unvisited edges, i.e. edges that were not (yet)
// reached from walking across mesh. This can happen from // reached from walking across mesh. This can happen from
// - not enough iterations done // - not enough iterations done
@ -340,19 +320,29 @@ public:
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
//- List update operation //- List update operation
template <class Type> template <class Type, class TrackingData = int>
class listUpdateOp class listUpdateOp
{ {
//- Additional data to be passed into container
const scalar tol_;
TrackingData& td_;
public: public:
listUpdateOp(const scalar tol, TrackingData& td)
:
tol_(tol),
td_(td)
{}
void operator()(List<Type>& x, const List<Type>& y) const void operator()(List<Type>& x, const List<Type>& y) const
{ {
forAll(x, i) forAll(x, i)
{ {
if (y[i].valid()) if (y[i].valid(td_))
{ {
x[i].updatePoint(y[i], PointEdgeWave<Type>::propagationTol()); x[i].updatePoint(y[i], tol_, td_);
} }
} }
} }

View File

@ -73,19 +73,23 @@ class pointEdgePoint
//- Evaluate distance to point. Update distSqr, origin from whomever //- Evaluate distance to point. Update distSqr, origin from whomever
// is nearer pt. Return true if w2 is closer to point, // is nearer pt. Return true if w2 is closer to point,
// false otherwise. // false otherwise.
template<class TrackingData>
inline bool update inline bool update
( (
const point&, const point&,
const pointEdgePoint& w2, const pointEdgePoint& w2,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Combine current with w2. Update distSqr, origin if w2 has smaller //- Combine current with w2. Update distSqr, origin if w2 has smaller
// quantities and returns true. // quantities and returns true.
template<class TrackingData>
inline bool update inline bool update
( (
const pointEdgePoint& w2, const pointEdgePoint& w2,
const scalar tol const scalar tol,
TrackingData& td
); );
@ -97,7 +101,7 @@ public:
inline pointEdgePoint(); inline pointEdgePoint();
//- Construct from origin, distance //- Construct from origin, distance
inline pointEdgePoint(const point& origin, const scalar distSqr); inline pointEdgePoint(const point&, const scalar);
//- Construct as copy //- Construct as copy
inline pointEdgePoint(const pointEdgePoint&); inline pointEdgePoint(const pointEdgePoint&);
@ -116,76 +120,102 @@ public:
//- Check whether origin has been changed at all or //- Check whether origin has been changed at all or
// still contains original (invalid) value. // still contains original (invalid) value.
inline bool valid() const; template<class TrackingData>
inline bool valid(TrackingData& td) const;
//- Check for identical geometrical data. Used for cyclics checking. //- Check for identical geometrical data. Used for cyclics checking.
inline bool sameGeometry(const pointEdgePoint&, const scalar tol) template<class TrackingData>
const; inline bool sameGeometry
(
const pointEdgePoint&,
const scalar tol,
TrackingData& td
) const;
//- Convert origin to relative vector to leaving point //- Convert origin to relative vector to leaving point
// (= point coordinate) // (= point coordinate)
template<class TrackingData>
inline void leaveDomain inline void leaveDomain
( (
const polyPatch& patch, const polyPatch& patch,
const label patchPointI, const label patchPointI,
const point& pos const point& pos,
TrackingData& td
); );
//- Convert relative origin to absolute by adding entering point //- Convert relative origin to absolute by adding entering point
template<class TrackingData>
inline void enterDomain inline void enterDomain
( (
const polyPatch& patch, const polyPatch& patch,
const label patchPointI, const label patchPointI,
const point& pos const point& pos,
TrackingData& td
); );
//- Apply rotation matrix to origin //- Apply rotation matrix to origin
inline void transform(const tensor& rotTensor); template<class TrackingData>
inline void transform
(
const tensor& rotTensor,
TrackingData& td
);
//- Influence of edge on point //- Influence of edge on point
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const label edgeI, const label edgeI,
const pointEdgePoint& edgeInfo, const pointEdgePoint& edgeInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of different value on same point. //- Influence of different value on same point.
// Merge new and old info. // Merge new and old info.
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const pointEdgePoint& newPointInfo, const pointEdgePoint& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of different value on same point. //- Influence of different value on same point.
// No information about current position whatsoever. // No information about current position whatsoever.
template<class TrackingData>
inline bool updatePoint inline bool updatePoint
( (
const pointEdgePoint& newPointInfo, const pointEdgePoint& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Influence of point on edge. //- Influence of point on edge.
template<class TrackingData>
inline bool updateEdge inline bool updateEdge
( (
const polyMesh& mesh, const polyMesh& mesh,
const label edgeI, const label edgeI,
const label pointI, const label pointI,
const pointEdgePoint& pointInfo, const pointEdgePoint& pointInfo,
const scalar tol const scalar tol,
TrackingData& td
); );
//- Same (like operator==)
template<class TrackingData>
inline bool equal(const pointEdgePoint&, TrackingData& td) const;
// Member Operators // Member Operators
//Note: Used to determine whether to call update. // Needed for List IO
inline bool operator==(const pointEdgePoint&) const; inline bool operator==(const pointEdgePoint&) const;
inline bool operator!=(const pointEdgePoint&) const; inline bool operator!=(const pointEdgePoint&) const;

View File

@ -29,16 +29,18 @@ License
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// Update this with w2 if w2 nearer to pt. // Update this with w2 if w2 nearer to pt.
template<class TrackingData>
inline bool Foam::pointEdgePoint::update inline bool Foam::pointEdgePoint::update
( (
const point& pt, const point& pt,
const pointEdgePoint& w2, const pointEdgePoint& w2,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
scalar dist2 = magSqr(pt - w2.origin()); scalar dist2 = magSqr(pt - w2.origin());
if (!valid()) if (!valid(td))
{ {
// current not yet set so use any value // current not yet set so use any value
distSqr_ = dist2; distSqr_ = dist2;
@ -72,13 +74,15 @@ inline bool Foam::pointEdgePoint::update
// Update this with w2 (information on same point) // Update this with w2 (information on same point)
template<class TrackingData>
inline bool Foam::pointEdgePoint::update inline bool Foam::pointEdgePoint::update
( (
const pointEdgePoint& w2, const pointEdgePoint& w2,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
if (!valid()) if (!valid(td))
{ {
// current not yet set so use any value // current not yet set so use any value
distSqr_ = w2.distSqr(); distSqr_ = w2.distSqr();
@ -155,17 +159,20 @@ inline Foam::scalar Foam::pointEdgePoint::distSqr() const
} }
inline bool Foam::pointEdgePoint::valid() const template<class TrackingData>
inline bool Foam::pointEdgePoint::valid(TrackingData& td) const
{ {
return origin_ != point::max; return origin_ != point::max;
} }
// Checks for cyclic points // Checks for cyclic points
template<class TrackingData>
inline bool Foam::pointEdgePoint::sameGeometry inline bool Foam::pointEdgePoint::sameGeometry
( (
const pointEdgePoint& w2, const pointEdgePoint& w2,
const scalar tol const scalar tol,
TrackingData& td
) const ) const
{ {
scalar diff = Foam::mag(distSqr() - w2.distSqr()); scalar diff = Foam::mag(distSqr() - w2.distSqr());
@ -188,18 +195,25 @@ inline bool Foam::pointEdgePoint::sameGeometry
} }
template<class TrackingData>
inline void Foam::pointEdgePoint::leaveDomain inline void Foam::pointEdgePoint::leaveDomain
( (
const polyPatch& patch, const polyPatch& patch,
const label patchPointI, const label patchPointI,
const point& coord const point& coord,
TrackingData& td
) )
{ {
origin_ -= coord; origin_ -= coord;
} }
inline void Foam::pointEdgePoint::transform(const tensor& rotTensor) template<class TrackingData>
inline void Foam::pointEdgePoint::transform
(
const tensor& rotTensor,
TrackingData& td
)
{ {
origin_ = Foam::transform(rotTensor, origin_); origin_ = Foam::transform(rotTensor, origin_);
} }
@ -207,11 +221,13 @@ inline void Foam::pointEdgePoint::transform(const tensor& rotTensor)
// Update absolute geometric quantities. Note that distance (distSqr_) // Update absolute geometric quantities. Note that distance (distSqr_)
// is not affected by leaving/entering domain. // is not affected by leaving/entering domain.
template<class TrackingData>
inline void Foam::pointEdgePoint::enterDomain inline void Foam::pointEdgePoint::enterDomain
( (
const polyPatch& patch, const polyPatch& patch,
const label patchPointI, const label patchPointI,
const point& coord const point& coord,
TrackingData& td
) )
{ {
// back to absolute form // back to absolute form
@ -220,78 +236,74 @@ inline void Foam::pointEdgePoint::enterDomain
// Update this with information from connected edge // Update this with information from connected edge
template<class TrackingData>
inline bool Foam::pointEdgePoint::updatePoint inline bool Foam::pointEdgePoint::updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const label edgeI, const label edgeI,
const pointEdgePoint& edgeInfo, const pointEdgePoint& edgeInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
return return update(mesh.points()[pointI], edgeInfo, tol, td);
update
(
mesh.points()[pointI],
edgeInfo,
tol
);
} }
// Update this with new information on same point // Update this with new information on same point
template<class TrackingData>
inline bool Foam::pointEdgePoint::updatePoint inline bool Foam::pointEdgePoint::updatePoint
( (
const polyMesh& mesh, const polyMesh& mesh,
const label pointI, const label pointI,
const pointEdgePoint& newPointInfo, const pointEdgePoint& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
return return update(mesh.points()[pointI], newPointInfo, tol, td);
update
(
mesh.points()[pointI],
newPointInfo,
tol
);
} }
// Update this with new information on same point. No extra information. // Update this with new information on same point. No extra information.
template<class TrackingData>
inline bool Foam::pointEdgePoint::updatePoint inline bool Foam::pointEdgePoint::updatePoint
( (
const pointEdgePoint& newPointInfo, const pointEdgePoint& newPointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
return update(newPointInfo, tol); return update(newPointInfo, tol, td);
} }
// Update this with information from connected point // Update this with information from connected point
template<class TrackingData>
inline bool Foam::pointEdgePoint::updateEdge inline bool Foam::pointEdgePoint::updateEdge
( (
const polyMesh& mesh, const polyMesh& mesh,
const label edgeI, const label edgeI,
const label pointI, const label pointI,
const pointEdgePoint& pointInfo, const pointEdgePoint& pointInfo,
const scalar tol const scalar tol,
TrackingData& td
) )
{ {
const pointField& points = mesh.points();
const edge& e = mesh.edges()[edgeI]; const edge& e = mesh.edges()[edgeI];
return update(e.centre(mesh.points()), pointInfo, tol, td);
}
const point edgeMid(0.5*(points[e[0]] + points[e[1]]));
return template <class TrackingData>
update inline bool Foam::pointEdgePoint::equal
( (
edgeMid, const pointEdgePoint& rhs,
pointInfo, TrackingData& td
tol ) const
); {
return operator==(rhs);
} }

View File

@ -240,7 +240,13 @@ bool Foam::streamLineParticle::move
lifeTime_ = 0; lifeTime_ = 0;
} }
if (!td.keepParticle || td.switchProcessor || lifeTime_ == 0) if
(
face() != -1
|| !td.keepParticle
|| td.switchProcessor
|| lifeTime_ == 0
)
{ {
break; break;
} }

View File

@ -2,6 +2,6 @@ LESdelta/LESdelta.C
cubeRootVolDelta/cubeRootVolDelta.C cubeRootVolDelta/cubeRootVolDelta.C
PrandtlDelta/PrandtlDelta.C PrandtlDelta/PrandtlDelta.C
smoothDelta/smoothDelta.C smoothDelta/smoothDelta.C
maxhxhyhzDelta/maxhxhyhzDelta.C maxDeltaxyz/maxDeltaxyz.C
LIB = $(FOAM_LIBBIN)/libLESdeltas LIB = $(FOAM_LIBBIN)/libLESdeltas

View File

@ -23,7 +23,7 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "maxhxhyhzDelta.H" #include "maxDeltaxyz.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -33,12 +33,12 @@ namespace Foam
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
defineTypeNameAndDebug(maxhxhyhzDelta, 0); defineTypeNameAndDebug(maxDeltaxyz, 0);
addToRunTimeSelectionTable(LESdelta, maxhxhyhzDelta, dictionary); addToRunTimeSelectionTable(LESdelta, maxDeltaxyz, dictionary);
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void maxhxhyhzDelta::calcDelta() void maxDeltaxyz::calcDelta()
{ {
label nD = mesh().nGeometricD(); label nD = mesh().nGeometricD();
@ -86,7 +86,7 @@ void maxhxhyhzDelta::calcDelta()
} }
else if (nD == 2) else if (nD == 2)
{ {
WarningIn("maxhxhyhzDelta::calcDelta()") WarningIn("maxDeltaxyz::calcDelta()")
<< "Case is 2D, LES is not strictly applicable\n" << "Case is 2D, LES is not strictly applicable\n"
<< endl; << endl;
@ -94,7 +94,7 @@ void maxhxhyhzDelta::calcDelta()
} }
else else
{ {
FatalErrorIn("maxhxhyhzDelta::calcDelta()") FatalErrorIn("maxDeltaxyz::calcDelta()")
<< "Case is not 3D or 2D, LES is not applicable" << "Case is not 3D or 2D, LES is not applicable"
<< exit(FatalError); << exit(FatalError);
} }
@ -103,7 +103,7 @@ void maxhxhyhzDelta::calcDelta()
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
maxhxhyhzDelta::maxhxhyhzDelta maxDeltaxyz::maxDeltaxyz
( (
const word& name, const word& name,
const fvMesh& mesh, const fvMesh& mesh,
@ -119,14 +119,14 @@ maxhxhyhzDelta::maxhxhyhzDelta
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void maxhxhyhzDelta::read(const dictionary& dd) void maxDeltaxyz::read(const dictionary& dd)
{ {
dd.subDict(type() + "Coeffs").lookup("deltaCoeff") >> deltaCoeff_; dd.subDict(type() + "Coeffs").lookup("deltaCoeff") >> deltaCoeff_;
calcDelta(); calcDelta();
} }
void maxhxhyhzDelta::correct() void maxDeltaxyz::correct()
{ {
if (mesh_.changing()) if (mesh_.changing())
{ {

View File

@ -22,20 +22,20 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class Class
Foam::maxhxhyhzDelta Foam::maxDeltaxyz
Description Description
maxhxhyhzDelta takes the maximum of the three dimensions per cell: maxDeltaxyz takes the maximum of the three dimensions per cell:
max(hx, hy, hz). Valid for structures hexahedral cells only. max(hx, hy, hz). Valid for structures hexahedral cells only.
SourceFiles SourceFiles
maxhxhyhzDelta.C maxDeltaxyz.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef maxhxhyhzDeltaDelta_H #ifndef maxDeltaxyzDelta_H
#define maxhxhyhzDeltaDelta_H #define maxDeltaxyzDelta_H
#include "LESdelta.H" #include "LESdelta.H"
@ -45,10 +45,10 @@ namespace Foam
{ {
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class maxhxhyhzDelta Declaration Class maxDeltaxyz Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class maxhxhyhzDelta class maxDeltaxyz
: :
public LESdelta public LESdelta
{ {
@ -60,8 +60,8 @@ class maxhxhyhzDelta
// Private Member Functions // Private Member Functions
//- Disallow default bitwise copy construct and assignment //- Disallow default bitwise copy construct and assignment
maxhxhyhzDelta(const maxhxhyhzDelta&); maxDeltaxyz(const maxDeltaxyz&);
void operator=(const maxhxhyhzDelta&); void operator=(const maxDeltaxyz&);
// Calculate the delta values // Calculate the delta values
void calcDelta(); void calcDelta();
@ -70,13 +70,13 @@ class maxhxhyhzDelta
public: public:
//- Runtime type information //- Runtime type information
TypeName("maxhxhyhzDelta"); TypeName("maxDeltaxyz");
// Constructors // Constructors
//- Construct from name, mesh and IOdictionary //- Construct from name, mesh and IOdictionary
maxhxhyhzDelta maxDeltaxyz
( (
const word& name, const word& name,
const fvMesh& mesh, const fvMesh& mesh,
@ -85,7 +85,7 @@ public:
//- Destructor //- Destructor
virtual ~maxhxhyhzDelta() virtual ~maxDeltaxyz()
{} {}

View File

@ -34,7 +34,7 @@ divSchemes
div(phi,epsilon) Gauss upwind; div(phi,epsilon) Gauss upwind;
div(phi,R) Gauss upwind; div(phi,R) Gauss upwind;
div(R) Gauss linear; div(R) Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -32,7 +32,7 @@ divSchemes
div(phi,T) Gauss upwind; div(phi,T) Gauss upwind;
div(phi,k) Gauss upwind; div(phi,k) Gauss upwind;
div(phi,epsilon) Gauss upwind; div(phi,epsilon) Gauss upwind;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -34,7 +34,7 @@ divSchemes
div(phi,epsilon) Gauss upwind; div(phi,epsilon) Gauss upwind;
div(phi,R) Gauss upwind; div(phi,R) Gauss upwind;
div(R) Gauss linear; div(R) Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -33,7 +33,7 @@ divSchemes
div(phi,U) Gauss limitedLinearV 1; div(phi,U) Gauss limitedLinearV 1;
div(phi,k) Gauss limitedLinear 1; div(phi,k) Gauss limitedLinear 1;
div(phi,epsilon) Gauss limitedLinear 1; div(phi,epsilon) Gauss limitedLinear 1;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -35,7 +35,7 @@ divSchemes
div(phi,U) Gauss upwind; div(phi,U) Gauss upwind;
div(phi,k) Gauss upwind; div(phi,k) Gauss upwind;
div(phi,epsilon) Gauss upwind; div(phi,epsilon) Gauss upwind;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
div(-phi,Ua) Gauss upwind; div(-phi,Ua) Gauss upwind;
div((nuEff*dev(grad(Ua).T()))) Gauss linear; div((nuEff*dev(grad(Ua).T()))) Gauss linear;

View File

@ -32,7 +32,7 @@ divSchemes
div(phi,epsilon) Gauss linear; div(phi,epsilon) Gauss linear;
div(phi,R) Gauss linear; div(phi,R) Gauss linear;
div(phi,nuTilda) Gauss linear; div(phi,nuTilda) Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -32,7 +32,7 @@ divSchemes
div(phi,epsilon) Gauss linear; div(phi,epsilon) Gauss linear;
div(phi,R) Gauss linear; div(phi,R) Gauss linear;
div(phi,nuTilda) Gauss linear; div(phi,nuTilda) Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -33,7 +33,7 @@ divSchemes
div(phi,omega) Gauss linear; div(phi,omega) Gauss linear;
div(phi,R) Gauss linear; div(phi,R) Gauss linear;
div(phi,nuTilda) Gauss linear; div(phi,nuTilda) Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -35,7 +35,7 @@ divSchemes
div(phi,B) Gauss limitedLinear 1; div(phi,B) Gauss limitedLinear 1;
div(B) Gauss linear; div(B) Gauss linear;
div(phi,nuTilda) Gauss limitedLinear 1; div(phi,nuTilda) Gauss limitedLinear 1;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -30,7 +30,7 @@ divSchemes
{ {
default none; default none;
div(phi,U) Gauss linear; div(phi,U) Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -32,7 +32,7 @@ divSchemes
div(phi,U) Gauss linearUpwind grad(U); div(phi,U) Gauss linearUpwind grad(U);
div(phi,k) Gauss limitedLinear 1; div(phi,k) Gauss limitedLinear 1;
div(phi,omega) Gauss limitedLinear 1; div(phi,omega) Gauss limitedLinear 1;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -32,7 +32,7 @@ divSchemes
div(phi,U) Gauss linearUpwind grad(U); div(phi,U) Gauss linearUpwind grad(U);
div(phi,k) Gauss upwind; div(phi,k) Gauss upwind;
div(phi,omega) Gauss upwind; div(phi,omega) Gauss upwind;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -36,7 +36,7 @@ divSchemes
div(phi,R) Gauss limitedLinear 1; div(phi,R) Gauss limitedLinear 1;
div(R) Gauss linear; div(R) Gauss linear;
div(phi,nuTilda) Gauss limitedLinear 1; div(phi,nuTilda) Gauss limitedLinear 1;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -36,7 +36,7 @@ divSchemes
div(phi,R) Gauss limitedLinear 1; div(phi,R) Gauss limitedLinear 1;
div(R) Gauss linear; div(R) Gauss linear;
div(phi,nuTilda) Gauss limitedLinear 1; div(phi,nuTilda) Gauss limitedLinear 1;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -35,7 +35,7 @@ divSchemes
div(phi,B) Gauss limitedLinear 1; div(phi,B) Gauss limitedLinear 1;
div(phi,nuTilda) Gauss limitedLinear 1; div(phi,nuTilda) Gauss limitedLinear 1;
div(B) Gauss linear; div(B) Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -35,7 +35,7 @@ divSchemes
div(phi,B) Gauss limitedLinear 1; div(phi,B) Gauss limitedLinear 1;
div(phi,nuTilda) Gauss limitedLinear 1; div(phi,nuTilda) Gauss limitedLinear 1;
div(B) Gauss linear; div(B) Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -36,7 +36,7 @@ divSchemes
div(phi,R) Gauss limitedLinear 1; div(phi,R) Gauss limitedLinear 1;
div(R) Gauss linear; div(R) Gauss linear;
div(phi,nuTilda) Gauss limitedLinear 1; div(phi,nuTilda) Gauss limitedLinear 1;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -30,7 +30,7 @@ gradSchemes
divSchemes divSchemes
{ {
div(phi,U) Gauss upwind; div(phi,U) Gauss upwind;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
div(phi,epsilon) Gauss upwind; div(phi,epsilon) Gauss upwind;
div(phi,k) Gauss upwind; div(phi,k) Gauss upwind;
} }

View File

@ -30,7 +30,7 @@ gradSchemes
divSchemes divSchemes
{ {
div(phi,U) Gauss upwind; div(phi,U) Gauss upwind;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
div(phi,epsilon) Gauss upwind; div(phi,epsilon) Gauss upwind;
div(phi,k) Gauss upwind; div(phi,k) Gauss upwind;
} }

View File

@ -32,7 +32,7 @@ divSchemes
default none; default none;
div(phi,U) Gauss linearUpwind Gauss linear; div(phi,U) Gauss linearUpwind Gauss linear;
div(phi,nuTilda) Gauss linearUpwind Gauss linear; div(phi,nuTilda) Gauss linearUpwind Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -32,7 +32,7 @@ divSchemes
div(phi,U) Gauss linearUpwind grad(U); div(phi,U) Gauss linearUpwind grad(U);
div(phi,k) Gauss upwind; div(phi,k) Gauss upwind;
div(phi,omega) Gauss upwind; div(phi,omega) Gauss upwind;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -36,7 +36,7 @@ divSchemes
div(phi,R) Gauss upwind; div(phi,R) Gauss upwind;
div(R) Gauss linear; div(R) Gauss linear;
div(phi,nuTilda) Gauss upwind; div(phi,nuTilda) Gauss upwind;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -46,13 +46,15 @@ boundaryField
"terrain_.*" "terrain_.*"
{ {
type fixedValue; type uniformFixedValue;
uniformValue (0 0 0);
value uniform (0 0 0); value uniform (0 0 0);
} }
ground ground
{ {
type fixedValue; type uniformFixedValue;
uniformValue (0 0 0);
value uniform (0 0 0); value uniform (0 0 0);
} }

View File

@ -32,8 +32,9 @@ boundaryField
} }
inlet inlet
{ {
type fixedValue; type uniformFixedValue;
value uniform $turbulentKE; uniformValue $turbulentKE;
value $turbulentKE;
} }
"terrain_.*" "terrain_.*"
{ {

View File

@ -29,8 +29,9 @@ boundaryField
outlet outlet
{ {
type fixedValue; type uniformFixedValue;
value $internalField; value uniform $pressure;
uniformValue $pressure;
} }
"terrain_.*" "terrain_.*"

View File

@ -19,4 +19,7 @@ rm -rf constant/polyMesh/sets
#rm -rf constant/refinementHistory #rm -rf constant/refinementHistory
#rm -rf constant/surfaceIndex #rm -rf constant/surfaceIndex
# Reset decomposeParDict
cp system/decomposeParDict-nonPar system/decomposeParDict
# ----------------------------------------------------------------- end-of-file # ----------------------------------------------------------------- end-of-file

View File

@ -4,10 +4,29 @@ cd ${0%/*} || exit 1 # run from this directory
# Source tutorial run functions # Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions . $WM_PROJECT_DIR/bin/tools/RunFunctions
compileApplication windSimpleFoam
runApplication blockMesh runApplication blockMesh
runApplication snappyHexMesh -overwrite cp system/decomposeParDict-nonPar system/decomposeParDict
runApplication setSet -batch makeZones runApplication decomposePar
runApplication setsToZones -noFlipMap
runApplication windSimpleFoam #runApplication snappyHexMesh -overwrite
#runApplication setSet -batch makeZones
#runApplication setsToZones -noFlipMap
#runApplication windSimpleFoam
cp system/decomposeParDict-par system/decomposeParDict
runParallel snappyHexMesh 2 -overwrite
# Add wildcard entries for meshes patches since not preserved
# by decomposePar. Notice -literalRE option to add wildcard itself
# without evaluation.
runParallel changeDictionary 2 -literalRE
runParallel setSet 2 -batch makeZones
runParallel windSimpleFoam 2
runApplication reconstructParMesh -constant
runApplication reconstructPar
# ----------------------------------------------------------------- end-of-file # ----------------------------------------------------------------- end-of-file

View File

@ -1,2 +1,4 @@
cellSet actuationDisk1 new boxToCell (581850.5 4785805 1061) (581850.8 4785815 1071) cellSet actuationDisk1 new boxToCell (581850.5 4785805 1061) (581850.8 4785815 1071)
cellZoneSet actuationDisk1 new setToCellZone actuationDisk1
cellSet actuationDisk2 new boxToCell (581754 4785658 1065) (581754.4 4785668 1075) cellSet actuationDisk2 new boxToCell (581754 4785658 1065) (581754.4 4785668 1075)
cellZoneSet actuationDisk2 new setToCellZone actuationDisk2

View File

@ -0,0 +1,201 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object changeDictionaryDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Use absolute path to make sure it also works in parallel
#include "$FOAM_CASE/0/include/initialConditions"
dictionaryReplacement
{
// Specify
// - all fvPatchFields with potential non-uniform values
// - all fvPatchFields originating from meshing
// - all fvPatchFields originating from mesh-redistribution
p
{
boundaryField
{
outlet
{
type uniformFixedValue;
value $pressure;
uniformValue $pressure;
}
inlet
{
type zeroGradient;
}
"terrain_.*"
{
type zeroGradient;
}
ground
{
type zeroGradient;
}
#include "$FOAM_CASE/0/include/sideAndTopPatches"
"procBoundary.*"
{
type processor;
}
}
}
k
{
boundaryField
{
outlet
{
type inletOutlet;
inletValue uniform 0.0;
value uniform $turbulentKE;
}
inlet
{
type uniformFixedValue;
uniformValue $turbulentKE;
}
"terrain_.*"
{
type kqRWallFunction;
value uniform 0.0;
}
ground
{
type zeroGradient;
}
#include "$FOAM_CASE/0/include/sideAndTopPatches"
"procBoundary.*"
{
type processor;
}
}
}
U
{
boundaryField
{
outlet
{
type inletOutlet;
inletValue uniform (0 0 0);
value uniform $flowVelocity;
}
inlet
{
type atmBoundaryLayerInletVelocity;
Uref 10.0;
Href 20;
n (1 0 0);
z (0 0 1);
z0 0.1;
zGround 935.0;
value uniform $flowVelocity;
}
"terrain_.*"
{
type uniformFixedValue;
uniformValue $flowVelocity;
}
ground
{
type uniformFixedValue;
uniformValue $flowVelocity;
}
#include "$FOAM_CASE/0/include/sideAndTopPatches"
"procBoundary.*"
{
type processor;
}
}
}
nut
{
boundaryField
{
outlet
{
type calculated;
value uniform 0;
}
inlet
{
type calculated;
value uniform 0;
}
"terrain_.*"
{
type nutkRoughWallFunction;
Ks uniform 0.2; //Ks = 20 Z0
Cs uniform 0.5;
value uniform 0.0;
}
ground
{
type calculated;
value uniform 0;
}
#include "$FOAM_CASE/0/include/sideAndTopPatches"
"procBoundary.*"
{
type processor;
}
}
}
epsilon
{
boundaryField
{
outlet
{
type zeroGradient;
}
inlet
{
type atmBoundaryLayerInletEpsilon;
Ustar 0.82;
z (0 0 1);
z0 0.1;
value uniform $turbulentEpsilon;
zGround 935.0;
}
"terrain_.*"
{
type epsilonWallFunction;
Cmu 0.09;
kappa 0.4;
E 9.8;
value uniform $turbulentEpsilon;
}
ground
{
type zeroGradient;
}
#include "$FOAM_CASE/0/include/sideAndTopPatches"
"procBoundary.*"
{
type processor;
}
}
}
}
// ************************************************************************* //

View File

@ -15,35 +15,15 @@ FoamFile
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 1; numberOfSubdomains 2;
method hierarchical; method hierarchical;
// method metis;
// method ptscotch;
simpleCoeffs
{
n (4 1 1);
delta 0.001;
}
hierarchicalCoeffs hierarchicalCoeffs
{ {
n (1 1 1); n (2 1 1);
delta 0.001; delta 0.001;
order xyz; order xyz;
} }
manualCoeffs
{
dataFile "cellDecomposition";
}
metisCoeffs
{
//n (5 1 1);
//cellWeightsFile "constant/cellWeightsFile";
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -0,0 +1,29 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 2;
method hierarchical;
hierarchicalCoeffs
{
n (2 1 1);
delta 0.001;
order xyz;
}
// ************************************************************************* //

View File

@ -0,0 +1,22 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 2;
method ptscotch;
// ************************************************************************* //

View File

@ -30,7 +30,7 @@ divSchemes
{ {
default none; default none;
div(phi,U) Gauss upwind grad(U); div(phi,U) Gauss upwind grad(U);
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
div(phi,epsilon) Gauss upwind; div(phi,epsilon) Gauss upwind;
div(phi,k) Gauss upwind; div(phi,k) Gauss upwind;
} }

View File

@ -18,49 +18,49 @@ solvers
{ {
p p
{ {
solver smoothSolver; solver GAMG;
tolerance 1e-7;
relTol 0.1;
smoother GaussSeidel; smoother GaussSeidel;
tolerance 1e-6; nPreSweeps 0;
relTol 0.01; nPostSweeps 2;
maxIter 300; cacheAgglomeration on;
}; agglomerator faceAreaPair;
nCellsInCoarsestLevel 10;
mergeLevels 1;
}
U U
{ {
solver smoothSolver; solver smoothSolver;
smoother GaussSeidel; smoother GaussSeidel;
tolerance 1e-6; tolerance 1e-8;
relTol 0.01; relTol 0.1;
}; nSweeps 1;
}
k k
{ {
solver smoothSolver; solver smoothSolver;
smoother GaussSeidel; smoother GaussSeidel;
tolerance 1e-6; tolerance 1e-8;
relTol 0.01; relTol 0.1;
}; nSweeps 1;
}
epsilon epsilon
{ {
solver smoothSolver; solver smoothSolver;
smoother GaussSeidel; smoother GaussSeidel;
tolerance 1e-6; tolerance 1e-8;
relTol 0.01;
};
omega
{
solver smoothSolver;
smoother GaussSeidel;
tolerance 1e-6;
relTol 0.1; relTol 0.1;
}; nSweeps 1;
}
} }
SIMPLE SIMPLE
{ {
nNonOrthogonalCorrectors 1; nNonOrthogonalCorrectors 0;
convergence 1e-3; convergence 1e-3;
} }

View File

@ -32,7 +32,7 @@ divSchemes
div(phirb,alpha) Gauss interfaceCompression 1; div(phirb,alpha) Gauss interfaceCompression 1;
div(phi,p_rgh) Gauss upwind; div(phi,p_rgh) Gauss upwind;
div(phi,k) Gauss vanLeer; div(phi,k) Gauss vanLeer;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -32,7 +32,7 @@ divSchemes
div(phirb,alpha) Gauss interfaceCompression 1; div(phirb,alpha) Gauss interfaceCompression 1;
div(phi,p_rgh) Gauss upwind; div(phi,p_rgh) Gauss upwind;
div(phi,k) Gauss vanLeer; div(phi,k) Gauss vanLeer;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -34,7 +34,7 @@ divSchemes
div(phi,B) Gauss limitedLinear 1; div(phi,B) Gauss limitedLinear 1;
div(B) Gauss linear; div(B) Gauss linear;
div(phi,nuTilda) Gauss limitedLinear 1; div(phi,nuTilda) Gauss limitedLinear 1;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes

View File

@ -35,7 +35,7 @@ divSchemes
div(phi,R) Gauss upwind; div(phi,R) Gauss upwind;
div(R) Gauss linear; div(R) Gauss linear;
div(phi,nuTilda) Gauss upwind; div(phi,nuTilda) Gauss upwind;
div((nuEff*dev(grad(U).T()))) Gauss linear; div((nuEff*dev(T(grad(U))))) Gauss linear;
} }
laplacianSchemes laplacianSchemes