Merge branch 'master' of github.com:OpenFOAM/OpenFOAM-2.3.x

This commit is contained in:
william 2014-03-21 10:02:30 +00:00
commit 7d47fc0776
33 changed files with 803 additions and 229 deletions

View file

@ -19,6 +19,16 @@ fvOptions.makeRelative(phiHbyA);
adjustPhi(phiHbyA, U, p);
// Update the fixedFluxPressure BCs to ensure flux consistency
setSnGrad<fixedFluxPressureFvPatchScalarField>
(
p.boundaryField(),
(
phiHbyA.boundaryField()
- fvOptions.relative(mesh.Sf().boundaryField() & U.boundaryField())
)/(mesh.magSf().boundaryField()*rAUf.boundaryField())
);
// Non-orthogonal pressure corrector loop
while (pimple.correctNonOrthogonal())
{

View file

@ -41,6 +41,7 @@ Description
#include "fvIOoptionList.H"
#include "IOporosityModelList.H"
#include "IOMRFZoneList.H"
#include "fixedFluxPressureFvPatchScalarField.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2012 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2012-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -25,10 +25,19 @@ License
#include "loadOrCreateMesh.H"
#include "processorPolyPatch.H"
#include "processorCyclicPolyPatch.H"
#include "Time.H"
#include "IOPtrList.H"
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
namespace Foam
{
defineTemplateTypeNameAndDebug(IOPtrList<entry>, 0);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Read mesh if available. Otherwise create empty mesh with same non-proc
// patches as proc0 mesh. Requires all processors to have all patches
// (and in same order).
@ -48,11 +57,68 @@ Foam::autoPtr<Foam::fvMesh> Foam::loadOrCreateMesh
meshSubDir = io.name()/polyMesh::meshSubDir;
}
// Scatter master patches
PtrList<entry> patchEntries;
if (Pstream::master())
{
// Read PtrList of dictionary as dictionary.
const word oldTypeName = IOPtrList<entry>::typeName;
const_cast<word&>(IOPtrList<entry>::typeName) = word::null;
IOPtrList<entry> dictList
(
IOobject
(
"boundary",
io.time().findInstance
(
meshSubDir,
"boundary",
IOobject::MUST_READ
),
meshSubDir,
io.db(),
IOobject::MUST_READ,
IOobject::NO_WRITE,
false
)
);
const_cast<word&>(IOPtrList<entry>::typeName) = oldTypeName;
// Fake type back to what was in field
const_cast<word&>(dictList.type()) = dictList.headerClassName();
patchEntries.transfer(dictList);
// Send patches
for
(
int slave=Pstream::firstSlave();
slave<=Pstream::lastSlave();
slave++
)
{
OPstream toSlave(Pstream::scheduled, slave);
toSlave << patchEntries;
}
}
else
{
// Receive patches
IPstream fromMaster(Pstream::scheduled, Pstream::masterNo());
fromMaster >> patchEntries;
}
// Check who has a mesh
const bool haveMesh = isDir(io.time().path()/io.instance()/meshSubDir);
if (!haveMesh)
{
bool oldParRun = Pstream::parRun();
Pstream::parRun() = false;
// Create dummy mesh. Only used on procs that don't have mesh.
IOobject noReadIO(io);
noReadIO.readOpt() = IOobject::NO_READ;
@ -65,6 +131,39 @@ Foam::autoPtr<Foam::fvMesh> Foam::loadOrCreateMesh
xferCopy(labelList()),
false
);
// Add patches
List<polyPatch*> patches(patchEntries.size());
label nPatches = 0;
forAll(patchEntries, patchI)
{
const entry& e = patchEntries[patchI];
const word type(e.dict().lookup("type"));
const word& name = e.keyword();
if
(
type != processorPolyPatch::typeName
&& type != processorCyclicPolyPatch::typeName
)
{
dictionary patchDict(e.dict());
patchDict.set("nFaces", 0);
patchDict.set("startFace", 0);
patches[patchI] = polyPatch::New
(
name,
patchDict,
nPatches++,
dummyMesh.boundaryMesh()
).ptr();
}
}
patches.setSize(nPatches);
dummyMesh.addFvPatches(patches, false); // no parallel comms
// Add some dummy zones so upon reading it does not read them
// from the undecomposed case. Should be done as extra argument to
// regIOobject::readStream?
@ -106,6 +205,8 @@ Foam::autoPtr<Foam::fvMesh> Foam::loadOrCreateMesh
//Pout<< "Writing dummy mesh to " << dummyMesh.polyMesh::objectPath()
// << endl;
dummyMesh.write();
Pstream::parRun() = oldParRun;
}
//Pout<< "Reading mesh from " << io.objectPath() << endl;
@ -116,118 +217,57 @@ Foam::autoPtr<Foam::fvMesh> Foam::loadOrCreateMesh
// Sync patches
// ~~~~~~~~~~~~
if (Pstream::master())
if (!Pstream::master() && haveMesh)
{
// Send patches
for
(
int slave=Pstream::firstSlave();
slave<=Pstream::lastSlave();
slave++
)
// Check master names against mine
const polyBoundaryMesh& patches = mesh.boundaryMesh();
forAll(patchEntries, patchI)
{
OPstream toSlave(Pstream::scheduled, slave);
toSlave << mesh.boundaryMesh();
}
}
else
{
// Receive patches
IPstream fromMaster(Pstream::scheduled, Pstream::masterNo());
PtrList<entry> patchEntries(fromMaster);
const entry& e = patchEntries[patchI];
const word type(e.dict().lookup("type"));
const word& name = e.keyword();
if (haveMesh)
{
// Check master names against mine
const polyBoundaryMesh& patches = mesh.boundaryMesh();
forAll(patchEntries, patchI)
if (type == processorPolyPatch::typeName)
{
const entry& e = patchEntries[patchI];
const word type(e.dict().lookup("type"));
const word& name = e.keyword();
if (type == processorPolyPatch::typeName)
{
break;
}
if (patchI >= patches.size())
{
FatalErrorIn
(
"createMesh(const Time&, const fileName&, const bool)"
) << "Non-processor patches not synchronised."
<< endl
<< "Processor " << Pstream::myProcNo()
<< " has only " << patches.size()
<< " patches, master has "
<< patchI
<< exit(FatalError);
}
if
(
type != patches[patchI].type()
|| name != patches[patchI].name()
)
{
FatalErrorIn
(
"createMesh(const Time&, const fileName&, const bool)"
) << "Non-processor patches not synchronised."
<< endl
<< "Master patch " << patchI
<< " name:" << type
<< " type:" << type << endl
<< "Processor " << Pstream::myProcNo()
<< " patch " << patchI
<< " has name:" << patches[patchI].name()
<< " type:" << patches[patchI].type()
<< exit(FatalError);
}
break;
}
}
else
{
// Add patch
List<polyPatch*> patches(patchEntries.size());
label nPatches = 0;
forAll(patchEntries, patchI)
if (patchI >= patches.size())
{
const entry& e = patchEntries[patchI];
const word type(e.dict().lookup("type"));
const word& name = e.keyword();
if (type == processorPolyPatch::typeName)
{
break;
}
//Pout<< "Adding patch:" << nPatches
// << " name:" << name << " type:" << type << endl;
dictionary patchDict(e.dict());
patchDict.remove("nFaces");
patchDict.add("nFaces", 0);
patchDict.remove("startFace");
patchDict.add("startFace", 0);
patches[patchI] = polyPatch::New
FatalErrorIn
(
name,
patchDict,
nPatches++,
mesh.boundaryMesh()
).ptr();
"createMesh(const Time&, const fileName&, const bool)"
) << "Non-processor patches not synchronised."
<< endl
<< "Processor " << Pstream::myProcNo()
<< " has only " << patches.size()
<< " patches, master has "
<< patchI
<< exit(FatalError);
}
patches.setSize(nPatches);
mesh.addFvPatches(patches, false); // no parallel comms
//// Write empty mesh now we have correct patches
//meshPtr().write();
if
(
type != patches[patchI].type()
|| name != patches[patchI].name()
)
{
FatalErrorIn
(
"createMesh(const Time&, const fileName&, const bool)"
) << "Non-processor patches not synchronised."
<< endl
<< "Master patch " << patchI
<< " name:" << type
<< " type:" << type << endl
<< "Processor " << Pstream::myProcNo()
<< " patch " << patchI
<< " has name:" << patches[patchI].name()
<< " type:" << patches[patchI].type()
<< exit(FatalError);
}
}
}

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -649,22 +649,20 @@ void Foam::refinementHistory::countProc
// Increment parent if whole splitCell moves to same processor
if (splitCellNum[index] == 8)
{
Pout<< "Moving " << splitCellNum[index]
<< " cells originating from cell " << index
<< " from processor " << Pstream::myProcNo()
<< " to processor " << splitCellProc[index]
<< endl;
if (debug)
{
Pout<< "Moving " << splitCellNum[index]
<< " cells originating from cell " << index
<< " from processor " << Pstream::myProcNo()
<< " to processor " << splitCellProc[index]
<< endl;
}
label parent = splitCells_[index].parent_;
if (parent >= 0)
{
string oldPrefix = Pout.prefix();
Pout.prefix() = " " + oldPrefix;
countProc(parent, newProcNo, splitCellProc, splitCellNum);
Pout.prefix() = oldPrefix;
}
}
}
@ -924,7 +922,10 @@ void Foam::refinementHistory::distribute(const mapDistributePolyMesh& map)
forAll(newVisibleCells, i)
{
visibleCells_[constructMap[i]] = newVisibleCells[i] + offset;
if (newVisibleCells[i] >= 0)
{
visibleCells_[constructMap[i]] = newVisibleCells[i] + offset;
}
}
}
splitCells_.shrink();

View file

@ -168,6 +168,7 @@ $(derivedFvPatchFields)/pressureInletOutletVelocity/pressureInletOutletVelocityF
$(derivedFvPatchFields)/pressureInletUniformVelocity/pressureInletUniformVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/pressureInletVelocity/pressureInletVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/pressureNormalInletOutletVelocity/pressureNormalInletOutletVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/fixedNormalInletOutletVelocity/fixedNormalInletOutletVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/rotatingPressureInletOutletVelocity/rotatingPressureInletOutletVelocityFvPatchVectorField.C
$(derivedFvPatchFields)/rotatingTotalPressure/rotatingTotalPressureFvPatchScalarField.C
$(derivedFvPatchFields)/rotatingWallVelocity/rotatingWallVelocityFvPatchVectorField.C

View file

@ -53,7 +53,6 @@ SourceFiles
#include "fvPatchFields.H"
#include "fixedGradientFvPatchFields.H"
#include "Switch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View file

@ -0,0 +1,218 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "fixedNormalInletOutletVelocityFvPatchVectorField.H"
#include "addToRunTimeSelectionTable.H"
#include "volFields.H"
#include "surfaceFields.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::fixedNormalInletOutletVelocityFvPatchVectorField::
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF
)
:
directionMixedFvPatchVectorField(p, iF),
phiName_("phi"),
fixTangentialInflow_(true),
normalVelocity_
(
fvPatchVectorField::New("fixedValue", p, iF)
)
{
refValue() = vector::zero;
refGrad() = vector::zero;
valueFraction() = symmTensor::zero;
}
Foam::fixedNormalInletOutletVelocityFvPatchVectorField::
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fixedNormalInletOutletVelocityFvPatchVectorField& ptf,
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
directionMixedFvPatchVectorField(ptf, p, iF, mapper),
phiName_(ptf.phiName_),
fixTangentialInflow_(ptf.fixTangentialInflow_),
normalVelocity_
(
fvPatchVectorField::New(ptf.normalVelocity(), p, iF, mapper)
)
{}
Foam::fixedNormalInletOutletVelocityFvPatchVectorField::
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fvPatch& p,
const DimensionedField<vector, volMesh>& iF,
const dictionary& dict
)
:
directionMixedFvPatchVectorField(p, iF),
phiName_(dict.lookupOrDefault<word>("phi", "phi")),
fixTangentialInflow_(dict.lookup("fixTangentialInflow")),
normalVelocity_
(
fvPatchVectorField::New(p, iF, dict.subDict("normalVelocity"))
)
{
fvPatchVectorField::operator=(vectorField("value", dict, p.size()));
refValue() = normalVelocity();
refGrad() = vector::zero;
valueFraction() = symmTensor::zero;
}
Foam::fixedNormalInletOutletVelocityFvPatchVectorField::
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fixedNormalInletOutletVelocityFvPatchVectorField& pivpvf
)
:
directionMixedFvPatchVectorField(pivpvf),
phiName_(pivpvf.phiName_),
fixTangentialInflow_(pivpvf.fixTangentialInflow_),
normalVelocity_(pivpvf.normalVelocity().clone())
{}
Foam::fixedNormalInletOutletVelocityFvPatchVectorField::
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fixedNormalInletOutletVelocityFvPatchVectorField& pivpvf,
const DimensionedField<vector, volMesh>& iF
)
:
directionMixedFvPatchVectorField(pivpvf, iF),
phiName_(pivpvf.phiName_),
fixTangentialInflow_(pivpvf.fixTangentialInflow_),
normalVelocity_(pivpvf.normalVelocity().clone())
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::fixedNormalInletOutletVelocityFvPatchVectorField::autoMap
(
const fvPatchFieldMapper& m
)
{
directionMixedFvPatchVectorField::autoMap(m);
normalVelocity_->autoMap(m);
}
void Foam::fixedNormalInletOutletVelocityFvPatchVectorField::rmap
(
const fvPatchVectorField& ptf,
const labelList& addr
)
{
directionMixedFvPatchVectorField::rmap(ptf, addr);
const fixedNormalInletOutletVelocityFvPatchVectorField& fniovptf =
refCast<const fixedNormalInletOutletVelocityFvPatchVectorField>(ptf);
normalVelocity_->rmap(fniovptf.normalVelocity(), addr);
}
void Foam::fixedNormalInletOutletVelocityFvPatchVectorField::updateCoeffs()
{
if (updated())
{
return;
}
normalVelocity_->evaluate();
refValue() = normalVelocity();
valueFraction() = sqr(patch().nf());
if (fixTangentialInflow_)
{
const fvsPatchField<scalar>& phip =
patch().lookupPatchField<surfaceScalarField, scalar>(phiName_);
valueFraction() += neg(phip)*(I - valueFraction());
}
directionMixedFvPatchVectorField::updateCoeffs();
directionMixedFvPatchVectorField::evaluate();
}
void Foam::fixedNormalInletOutletVelocityFvPatchVectorField::write
(
Ostream& os
)
const
{
fvPatchVectorField::write(os);
writeEntryIfDifferent<word>(os, "phi", "phi", phiName_);
os.writeKeyword("fixTangentialInflow")
<< fixTangentialInflow_ << token::END_STATEMENT << nl;
os.writeKeyword("normalVelocity")
<< nl << indent << token::BEGIN_BLOCK << nl << incrIndent;
normalVelocity_->write(os);
os << decrIndent << indent << token::END_BLOCK << endl;
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
void Foam::fixedNormalInletOutletVelocityFvPatchVectorField::operator=
(
const fvPatchField<vector>& pvf
)
{
tmp<vectorField> normalValue = transform(valueFraction(), refValue());
tmp<vectorField> transformGradValue = transform(I - valueFraction(), pvf);
fvPatchField<vector>::operator=(normalValue + transformGradValue);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
makePatchTypeField
(
fvPatchVectorField,
fixedNormalInletOutletVelocityFvPatchVectorField
);
}
// ************************************************************************* //

View file

@ -0,0 +1,248 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::fixedNormalInletOutletVelocityFvPatchVectorField
Group
grpInletletBoundaryConditions grpOutletBoundaryConditions
Description
This velocity inlet/outlet boundary condition combines a fixed normal
component obtained from the "normalVelocity" patchField supplied with a
fixed or zero-gradiented tangential component depending on the direction
of the flow and the setting of "fixTangentialInflow":
- Outflow: apply zero-gradient condition to tangential components
- Inflow:
- fixTangentialInflow is true
apply value provided by the normalVelocity patchField to the
tangential components
- fixTangentialInflow is false
apply zero-gradient condition to tangential components.
\heading Patch usage
\table
Property | Description | Required | Default value
phi | flux field name | no | phi
fixTangentialInflow | If true fix the tangential component for inflow | yes |
normalVelocity | patchField providing the normal velocity field | yes |
\endtable
Example of the boundary condition specification:
\verbatim
myPatch
{
type fixedNormalInletOutletVelocity;
fixTangentialInflow false;
normalVelocity
{
type oscillatingFixedValue;
refValue uniform (0 1 0);
offset (0 -1 0);
amplitude table
(
( 0 0)
( 2 0.088)
( 8 0.088)
);
frequency constant 1;
}
value uniform (0 0 0);
}
\endverbatim
SourceFiles
fixedNormalInletOutletVelocityFvPatchVectorField.C
\*---------------------------------------------------------------------------*/
#ifndef fixedNormalInletOutletVelocityFvPatchVectorField_H
#define fixedNormalInletOutletVelocityFvPatchVectorField_H
#include "fvPatchFields.H"
#include "directionMixedFvPatchFields.H"
#include "Switch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class fixedNormalInletOutletVelocityFvPatchVectorField Declaration
\*---------------------------------------------------------------------------*/
class fixedNormalInletOutletVelocityFvPatchVectorField
:
public directionMixedFvPatchVectorField
{
// Private data
//- Flux field name
word phiName_;
//- Set true to fix the tangential component for inflow
Switch fixTangentialInflow_;
//- BC which provided the normal component of the velocity
tmp<fvPatchVectorField> normalVelocity_;
public:
//- Runtime type information
TypeName("fixedNormalInletOutletVelocity");
// Constructors
//- Construct from patch and internal field
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fvPatch&,
const DimensionedField<vector, volMesh>&
);
//- Construct from patch, internal field and dictionary
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fvPatch&,
const DimensionedField<vector, volMesh>&,
const dictionary&
);
//- Construct by mapping given
// fixedNormalInletOutletVelocityFvPatchVectorField onto a new patch
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fixedNormalInletOutletVelocityFvPatchVectorField&,
const fvPatch&,
const DimensionedField<vector, volMesh>&,
const fvPatchFieldMapper&
);
//- Construct as copy
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fixedNormalInletOutletVelocityFvPatchVectorField&
);
//- Construct and return a clone
virtual tmp<fvPatchVectorField> clone() const
{
return tmp<fvPatchVectorField>
(
new fixedNormalInletOutletVelocityFvPatchVectorField(*this)
);
}
//- Construct as copy setting internal field reference
fixedNormalInletOutletVelocityFvPatchVectorField
(
const fixedNormalInletOutletVelocityFvPatchVectorField&,
const DimensionedField<vector, volMesh>&
);
//- Construct and return a clone setting internal field reference
virtual tmp<fvPatchVectorField> clone
(
const DimensionedField<vector, volMesh>& iF
) const
{
return tmp<fvPatchVectorField>
(
new fixedNormalInletOutletVelocityFvPatchVectorField(*this, iF)
);
}
// Member functions
// Access
//- Return the name of phi
const word& phiName() const
{
return phiName_;
}
//- Return reference to the name of phi to allow adjustment
word& phiName()
{
return phiName_;
}
Switch fixTangentialInflow() const
{
return fixTangentialInflow_;
}
//- Return the BC which provides the normal component of velocity
const fvPatchVectorField& normalVelocity() const
{
return normalVelocity_();
}
// Mapping functions
//- Map (and resize as needed) from self given a mapping object
virtual void autoMap
(
const fvPatchFieldMapper&
);
//- Reverse map the given fvPatchField onto this fvPatchField
virtual void rmap
(
const fvPatchVectorField&,
const labelList&
);
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
//- Write
virtual void write(Ostream&) const;
// Member operators
virtual void operator=(const fvPatchField<vector>& pvf);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View file

@ -206,32 +206,40 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::normaliseWeights
)
{
// Normalise the weights
wghtSum.setSize(wght.size());
wghtSum.setSize(wght.size(), 0.0);
label nLowWeight = 0;
forAll(wght, faceI)
{
scalarList& w = wght[faceI];
scalar denom = patchAreas[faceI];
scalar s = sum(w);
scalar t = s/denom;
if (conformal)
if (w.size())
{
denom = s;
scalar denom = patchAreas[faceI];
scalar s = sum(w);
scalar t = s/denom;
if (conformal)
{
denom = s;
}
forAll(w, i)
{
w[i] /= denom;
}
wghtSum[faceI] = t;
if (t < lowWeightTol)
{
nLowWeight++;
}
}
forAll(w, i)
else
{
w[i] /= denom;
}
wghtSum[faceI] = t;
if (t < lowWeightTol)
{
nLowWeight++;
wghtSum[faceI] = 0;
}
}
@ -534,6 +542,7 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::AMIInterpolation
const SourcePatch& srcPatch,
const TargetPatch& tgtPatch,
const faceAreaIntersect::triangulationMode& triMode,
const bool requireMatch,
const interpolationMethod& method,
const scalar lowWeightCorrection,
const bool reverseTarget
@ -541,6 +550,7 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::AMIInterpolation
:
method_(method),
reverseTarget_(reverseTarget),
requireMatch_(requireMatch),
singlePatchProc_(-999),
lowWeightCorrection_(lowWeightCorrection),
srcAddress_(),
@ -564,6 +574,7 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::AMIInterpolation
const TargetPatch& tgtPatch,
const autoPtr<searchableSurface>& surfPtr,
const faceAreaIntersect::triangulationMode& triMode,
const bool requireMatch,
const interpolationMethod& method,
const scalar lowWeightCorrection,
const bool reverseTarget
@ -571,6 +582,7 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::AMIInterpolation
:
method_(method),
reverseTarget_(reverseTarget),
requireMatch_(requireMatch),
singlePatchProc_(-999),
lowWeightCorrection_(lowWeightCorrection),
srcAddress_(),
@ -654,6 +666,7 @@ Foam::AMIInterpolation<SourcePatch, TargetPatch>::AMIInterpolation
:
method_(fineAMI.method_),
reverseTarget_(fineAMI.reverseTarget_),
requireMatch_(fineAMI.requireMatch_),
singlePatchProc_(fineAMI.singlePatchProc_),
lowWeightCorrection_(-1.0),
srcAddress_(),
@ -862,7 +875,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::update
srcMagSf_,
tgtMagSf_,
triMode_,
reverseTarget_
reverseTarget_,
requireMatch_
)
);
@ -978,7 +992,8 @@ void Foam::AMIInterpolation<SourcePatch, TargetPatch>::update
srcMagSf_,
tgtMagSf_,
triMode_,
reverseTarget_
reverseTarget_,
requireMatch_
)
);

View file

@ -116,6 +116,10 @@ private:
// that the orientation of the target patch should be reversed
const bool reverseTarget_;
//- Flag to indicate that the two patches must be matched/an overlap
// exists between them
const bool requireMatch_;
//- Index of processor that holds all of both sides. -1 in all other
// cases
label singlePatchProc_;
@ -276,6 +280,7 @@ public:
const SourcePatch& srcPatch,
const TargetPatch& tgtPatch,
const faceAreaIntersect::triangulationMode& triMode,
const bool requireMatch = true,
const interpolationMethod& method = imFaceAreaWeight,
const scalar lowWeightCorrection = -1,
const bool reverseTarget = false
@ -288,6 +293,7 @@ public:
const TargetPatch& tgtPatch,
const autoPtr<searchableSurface>& surf,
const faceAreaIntersect::triangulationMode& triMode,
const bool requireMatch = true,
const interpolationMethod& method = imFaceAreaWeight,
const scalar lowWeightCorrection = -1,
const bool reverseTarget = false

View file

@ -98,6 +98,10 @@ bool Foam::AMIMethod<SourcePatch, TargetPatch>::initialise
(
"void Foam::AMIMethod<SourcePatch, TargetPatch>::initialise"
"("
"labelListList&, "
"scalarListList&, "
"labelListList&, "
"scalarListList&, "
"label&, "
"label&"
")"
@ -129,14 +133,24 @@ bool Foam::AMIMethod<SourcePatch, TargetPatch>::initialise
if (!foundFace)
{
FatalErrorIn
(
"void Foam::AMIMethod<SourcePatch, TargetPatch>::initialise"
"("
"label&, "
"label&"
")"
) << "Unable to find initial target face" << abort(FatalError);
if (requireMatch_)
{
FatalErrorIn
(
"void Foam::AMIMethod<SourcePatch, TargetPatch>::initialise"
"("
"labelListList&, "
"scalarListList&, "
"labelListList&, "
"scalarListList&, "
"label&, "
"label&"
")"
) << "Unable to find initial target face"
<< abort(FatalError);
}
return false;
}
}
@ -327,12 +341,14 @@ Foam::AMIMethod<SourcePatch, TargetPatch>::AMIMethod
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget
const bool reverseTarget,
const bool requireMatch
)
:
srcPatch_(srcPatch),
tgtPatch_(tgtPatch),
reverseTarget_(reverseTarget),
requireMatch_(requireMatch),
srcMagSf_(srcMagSf),
tgtMagSf_(tgtMagSf),
srcNonOverlap_(),

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -85,6 +85,10 @@ protected:
// that the orientation of the target patch should be reversed
const bool reverseTarget_;
//- Flag to indicate that the two patches must be matched/an overlap
// exists between them
const bool requireMatch_;
//- Source face areas
const scalarField& srcMagSf_;
@ -166,9 +170,18 @@ public:
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget
const bool reverseTarget,
const bool requireMatch
),
(srcPatch, tgtPatch, srcMagSf, tgtMagSf, triMode, reverseTarget)
(
srcPatch,
tgtPatch,
srcMagSf,
tgtMagSf,
triMode,
reverseTarget,
requireMatch
)
);
//- Construct from components
@ -179,7 +192,8 @@ public:
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget
const bool reverseTarget,
const bool requireMatch
);
//- Selector
@ -191,7 +205,8 @@ public:
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget
const bool reverseTarget,
const bool requireMatch
);

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -35,7 +35,8 @@ Foam::AMIMethod<SourcePatch, TargetPatch>::New
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget
const bool reverseTarget,
const bool requireMatch
)
{
if (debug)
@ -58,6 +59,7 @@ Foam::AMIMethod<SourcePatch, TargetPatch>::New
"const scalarField&, "
"const scalarField&, "
"const faceAreaIntersect::triangulationMode&, "
"const bool, "
"const bool"
")"
) << "Unknown AMIMethod type "
@ -75,7 +77,8 @@ Foam::AMIMethod<SourcePatch, TargetPatch>::New
srcMagSf,
tgtMagSf,
triMode,
reverseTarget
reverseTarget,
requireMatch
)
);
}

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -106,7 +106,8 @@ Foam::directAMI<SourcePatch, TargetPatch>::directAMI
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget
const bool reverseTarget,
const bool requireMatch
)
:
AMIMethod<SourcePatch, TargetPatch>
@ -116,7 +117,8 @@ Foam::directAMI<SourcePatch, TargetPatch>::directAMI
srcMagSf,
tgtMagSf,
triMode,
reverseTarget
reverseTarget,
requireMatch
)
{}

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -102,7 +102,8 @@ public:
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget = false
const bool reverseTarget = false,
const bool requireMatch = true
);

View file

@ -482,6 +482,7 @@ Foam::faceAreaWeightAMI<SourcePatch, TargetPatch>::faceAreaWeightAMI
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget,
const bool requireMatch,
const bool restartUncoveredSourceFace
)
:
@ -492,7 +493,8 @@ Foam::faceAreaWeightAMI<SourcePatch, TargetPatch>::faceAreaWeightAMI
srcMagSf,
tgtMagSf,
triMode,
reverseTarget
reverseTarget,
requireMatch
),
restartUncoveredSourceFace_(restartUncoveredSourceFace)
{}

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -144,6 +144,7 @@ public:
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget = false,
const bool requireMatch = true,
const bool restartUncoveredSourceFace = true
);

View file

@ -183,7 +183,8 @@ Foam::mapNearestAMI<SourcePatch, TargetPatch>::mapNearestAMI
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget
const bool reverseTarget,
const bool requireMatch
)
:
AMIMethod<SourcePatch, TargetPatch>
@ -193,7 +194,8 @@ Foam::mapNearestAMI<SourcePatch, TargetPatch>::mapNearestAMI
srcMagSf,
tgtMagSf,
triMode,
reverseTarget
reverseTarget,
requireMatch
)
{}

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -116,7 +116,8 @@ public:
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget = false
const bool reverseTarget = false,
const bool requireMatch = true
);

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -63,7 +63,8 @@ partialFaceAreaWeightAMI
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget
const bool reverseTarget,
const bool requireMatch
)
:
faceAreaWeightAMI<SourcePatch, TargetPatch>
@ -73,7 +74,8 @@ partialFaceAreaWeightAMI
srcMagSf,
tgtMagSf,
triMode,
reverseTarget
reverseTarget,
requireMatch
)
{}

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2013-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -93,7 +93,8 @@ public:
const scalarField& srcMagSf,
const scalarField& tgtMagSf,
const faceAreaIntersect::triangulationMode& triMode,
const bool reverseTarget = false
const bool reverseTarget = false,
const bool requireMatch = true
);

View file

@ -208,6 +208,8 @@ Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
tgtMask_(),
updated_(false)
{
AMIRequireMatch_ = false;
// Non-overlapping patch might not be valid yet so cannot determine
// associated patchID
}
@ -230,6 +232,8 @@ Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
tgtMask_(),
updated_(false)
{
AMIRequireMatch_ = false;
if (nonOverlapPatchName_ == name)
{
FatalIOErrorIn
@ -267,6 +271,8 @@ Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
tgtMask_(),
updated_(false)
{
AMIRequireMatch_ = false;
// Non-overlapping patch might not be valid yet so cannot determine
// associated patchID
}
@ -291,6 +297,8 @@ Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
tgtMask_(),
updated_(false)
{
AMIRequireMatch_ = false;
if (nonOverlapPatchName_ == name())
{
FatalErrorIn
@ -328,7 +336,9 @@ Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
srcMask_(),
tgtMask_(),
updated_(false)
{}
{
AMIRequireMatch_ = false;
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //

View file

@ -388,6 +388,7 @@ void Foam::cyclicAMIPolyPatch::resetAMI
nbrPatch0,
surfPtr(),
faceAreaIntersect::tmMesh,
AMIRequireMatch_,
AMIMethod,
AMILowWeightCorrection_,
AMIReverse_
@ -501,6 +502,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(vector::zero),
AMIPtr_(NULL),
AMIReverse_(false),
AMIRequireMatch_(true),
AMILowWeightCorrection_(-1.0),
surfPtr_(NULL),
surfDict_(fileName("surface"))
@ -530,6 +532,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(vector::zero),
AMIPtr_(NULL),
AMIReverse_(dict.lookupOrDefault<bool>("flipNormals", false)),
AMIRequireMatch_(true),
AMILowWeightCorrection_(dict.lookupOrDefault("lowWeightCorrection", -1.0)),
surfPtr_(NULL),
surfDict_(dict.subOrEmptyDict("surface"))
@ -639,6 +642,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(pp.separationVector_),
AMIPtr_(NULL),
AMIReverse_(pp.AMIReverse_),
AMIRequireMatch_(pp.AMIRequireMatch_),
AMILowWeightCorrection_(pp.AMILowWeightCorrection_),
surfPtr_(NULL),
surfDict_(pp.surfDict_)
@ -669,6 +673,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(pp.separationVector_),
AMIPtr_(NULL),
AMIReverse_(pp.AMIReverse_),
AMIRequireMatch_(pp.AMIRequireMatch_),
AMILowWeightCorrection_(pp.AMILowWeightCorrection_),
surfPtr_(NULL),
surfDict_(pp.surfDict_)
@ -713,6 +718,7 @@ Foam::cyclicAMIPolyPatch::cyclicAMIPolyPatch
separationVector_(pp.separationVector_),
AMIPtr_(NULL),
AMIReverse_(pp.AMIReverse_),
AMIRequireMatch_(pp.AMIRequireMatch_),
AMILowWeightCorrection_(pp.AMILowWeightCorrection_),
surfPtr_(NULL),
surfDict_(pp.surfDict_)

View file

@ -56,7 +56,24 @@ class cyclicAMIPolyPatch
private:
// Private data
// Private Member Functions
//- Return normal of face at max distance from rotation axis
vector findFaceNormalMaxRadius(const pointField& faceCentres) const;
void calcTransforms
(
const primitivePatch& half0,
const pointField& half0Ctrs,
const vectorField& half0Areas,
const pointField& half1Ctrs,
const vectorField& half1Areas
);
protected:
// Protected data
//- Name of other half
mutable word nbrPatchName_;
@ -97,6 +114,9 @@ private:
//- Flag to indicate that slave patch should be reversed for AMI
const bool AMIReverse_;
//- Flag to indicate that patches should match/overlap
bool AMIRequireMatch_;
//- Low weight correction threshold for AMI
const scalar AMILowWeightCorrection_;
@ -107,23 +127,6 @@ private:
const dictionary surfDict_;
// Private Member Functions
//- Return normal of face at max distance from rotation axis
vector findFaceNormalMaxRadius(const pointField& faceCentres) const;
void calcTransforms
(
const primitivePatch& half0,
const pointField& half0Ctrs,
const vectorField& half0Areas,
const pointField& half1Ctrs,
const vectorField& half1Areas
);
protected:
// Protected Member Functions
//- Reset the AMI interpolator

View file

@ -836,6 +836,7 @@ void Foam::mappedPatchBase::calcAMI() const
samplePolyPatch(), // nbrPatch0,
surfPtr(),
faceAreaIntersect::tmMesh,
true,
AMIPatchToPatchInterpolation::imFaceAreaWeight,
-1,
AMIReverse_

View file

@ -91,6 +91,7 @@ void Foam::regionCoupledBase::resetAMI() const
nbrPatch0,
surfPtr(),
faceAreaIntersect::tmMesh,
true,
AMIPatchToPatchInterpolation::imFaceAreaWeight,
-1,
AMIReverse_

View file

@ -242,6 +242,7 @@ Foam::regionModels::regionModel::interRegionAMI
p,
nbrP,
faceAreaIntersect::tmMesh,
true,
AMIPatchToPatchInterpolation::imFaceAreaWeight,
-1,
flip
@ -284,6 +285,7 @@ Foam::regionModels::regionModel::interRegionAMI
p,
nbrP,
faceAreaIntersect::tmMesh,
true,
AMIPatchToPatchInterpolation::imFaceAreaWeight,
-1,
flip

View file

@ -419,6 +419,7 @@ Foam::meshToMesh::patchAMIs() const
srcPP,
tgtPP,
faceAreaIntersect::tmMesh,
false,
interpolationMethodAMI(method_),
-1,
true // flip target patch since patch normals are aligned

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -270,7 +270,7 @@ void Foam::radiation::radiativeIntensityRay::addIntensity()
forAll(ILambda_, lambdaI)
{
I_ += absorptionEmission_.addIntensity(lambdaI, ILambda_[lambdaI]);
I_ += ILambda_[lambdaI];
}
}

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -235,17 +235,6 @@ bool Foam::radiation::absorptionEmissionModel::isGrey() const
}
Foam::tmp<Foam::volScalarField>
Foam::radiation::absorptionEmissionModel::addIntensity
(
const label rayI,
const volScalarField& ILambda
) const
{
return ILambda;
}
void Foam::radiation::absorptionEmissionModel::correct
(
volScalarField& a,

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -170,13 +170,6 @@ public:
//- Flag for whether the absorption/emission is for a grey gas
virtual bool isGrey() const;
//- Add radiative intensity for ray i
virtual tmp<volScalarField> addIntensity
(
const label rayI,
const volScalarField& ILambda
) const;
//- Correct absorption coefficients
virtual void correct
(

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -293,16 +293,6 @@ Foam::radiation::wideBandAbsorptionEmission::ECont(const label bandI) const
return E;
}
Foam::tmp<Foam::volScalarField>
Foam::radiation::wideBandAbsorptionEmission::addIntensity
(
const label i,
const volScalarField& ILambda
) const
{
return ILambda*(iBands_[i][1] - iBands_[i][0])/totalWaveLength_;
}
void Foam::radiation::wideBandAbsorptionEmission::correct
(

View file

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -227,14 +227,7 @@ public:
return iBands_[i];
}
//- Add contribution of ILambda to the total radiative intensity in
// direction i
tmp<volScalarField> addIntensity
(
const label i,
const volScalarField& ILambda
) const;
//- Correct rays
void correct
(
volScalarField& a_,