merge after conflict resolution

This commit is contained in:
andy
2009-07-01 10:59:48 +01:00
304 changed files with 19439 additions and 3857 deletions

View File

@ -7,7 +7,7 @@
basicPsiThermo& thermo = pThermo(); basicPsiThermo& thermo = pThermo();
volScalarField& p = thermo.p(); volScalarField& p = thermo.p();
volScalarField& e = thermo.h(); volScalarField& e = thermo.e();
const volScalarField& psi = thermo.psi(); const volScalarField& psi = thermo.psi();
volScalarField rho volScalarField rho

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -14,5 +14,5 @@ IOdictionary mdEquilibrationDict
scalar targetTemperature = readScalar scalar targetTemperature = readScalar
( (
mdEquilibrationDict.lookup("equilibrationTargetTemperature") mdEquilibrationDict.lookup("targetTemperature")
); );

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -1,4 +1,5 @@
EXE_INC = \ EXE_INC = \
-I../buoyantBoussinesqSimpleFoam \
-I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/turbulenceModels \ -I$(LIB_SRC)/turbulenceModels \
-I$(LIB_SRC)/turbulenceModels/incompressible/RAS/lnInclude \ -I$(LIB_SRC)/turbulenceModels/incompressible/RAS/lnInclude \

View File

@ -2,7 +2,7 @@
volScalarField kappaEff volScalarField kappaEff
( (
"kappaEff", "kappaEff",
turbulence->nu() + turbulence->nut()/Prt turbulence->nu()/Pr + turbulence->nut()/Prt
); );
fvScalarMatrix TEqn fvScalarMatrix TEqn
@ -15,4 +15,6 @@
TEqn.relax(); TEqn.relax();
TEqn.solve(); TEqn.solve();
rhok = 1.0 - beta*(T - TRef);
} }

View File

@ -1,23 +1,26 @@
// Solve the momentum equation // Solve the momentum equation
tmp<fvVectorMatrix> UEqn fvVectorMatrix UEqn
( (
fvm::ddt(U) fvm::ddt(U)
+ fvm::div(phi, U) + fvm::div(phi, U)
+ turbulence->divDevReff(U) + turbulence->divDevReff(U)
); );
UEqn().relax(); UEqn.relax();
solve if (momentumPredictor)
( {
UEqn() solve
==
-fvc::reconstruct
( (
UEqn
==
fvc::reconstruct
( (
fvc::snGrad(pd) (
- betaghf*fvc::snGrad(T) fvc::interpolate(rhok)*(g & mesh.Sf())
) * mesh.magSf() - fvc::snGrad(p)*mesh.magSf()
) )
); )
);
}

View File

@ -30,18 +30,18 @@ Description
Uses the Boussinesq approximation: Uses the Boussinesq approximation:
\f[ \f[
rho_{eff} = 1 - beta(T - T_{ref}) rho_{k} = 1 - beta(T - T_{ref})
\f] \f]
where: where:
\f$ rho_{eff} \f$ = the effective (driving) density \f$ rho_{k} \f$ = the effective (driving) kinematic density
beta = thermal expansion coefficient [1/K] beta = thermal expansion coefficient [1/K]
T = temperature [K] T = temperature [K]
\f$ T_{ref} \f$ = reference temperature [K] \f$ T_{ref} \f$ = reference temperature [K]
Valid when: Valid when:
\f[ \f[
rho_{eff} << 1 rho_{k} << 1
\f] \f]
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -78,20 +78,17 @@ int main(int argc, char *argv[])
#include "setDeltaT.H" #include "setDeltaT.H"
#include "UEqn.H" #include "UEqn.H"
#include "TEqn.H"
// --- PISO loop // --- PISO loop
for (int corr=0; corr<nCorr; corr++) for (int corr=0; corr<nCorr; corr++)
{ {
#include "TEqn.H" #include "pEqn.H"
#include "pdEqn.H"
} }
turbulence->correct(); turbulence->correct();
if (runTime.write()) runTime.write();
{
#include "writeAdditionalFields.H"
}
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s"

View File

@ -14,13 +14,12 @@
mesh mesh
); );
// kinematic pd Info<< "Reading field p\n" << endl;
Info<< "Reading field pd\n" << endl; volScalarField p
volScalarField pd
( (
IOobject IOobject
( (
"pd", "p",
runTime.timeName(), runTime.timeName(),
mesh, mesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -53,15 +52,25 @@
incompressible::RASModel::New(U, phi, laminarTransport) incompressible::RASModel::New(U, phi, laminarTransport)
); );
Info<< "Calculating field beta*(g.h)\n" << endl; label pRefCell = 0;
surfaceScalarField betaghf("betagh", beta*(g & mesh.Cf())); scalar pRefValue = 0.0;
label pdRefCell = 0;
scalar pdRefValue = 0.0;
setRefCell setRefCell
( (
pd, p,
mesh.solutionDict().subDict("SIMPLE"), mesh.solutionDict().subDict("PISO"),
pdRefCell, pRefCell,
pdRefValue pRefValue
);
// Kinematic density for buoyancy force
volScalarField rhok
(
IOobject
(
"rhok",
runTime.timeName(),
mesh
),
1.0 - beta*(T - TRef)
); );

View File

@ -1,9 +1,8 @@
{ {
volScalarField rUA("rUA", 1.0/UEqn().A()); volScalarField rUA("rUA", 1.0/UEqn.A());
surfaceScalarField rUAf("(1|A(U))", fvc::interpolate(rUA)); surfaceScalarField rUAf("(1|A(U))", fvc::interpolate(rUA));
U = rUA*UEqn().H(); U = rUA*UEqn.H();
UEqn.clear();
surfaceScalarField phiU surfaceScalarField phiU
( (
@ -11,31 +10,31 @@
+ fvc::ddtPhiCorr(rUA, U, phi) + fvc::ddtPhiCorr(rUA, U, phi)
); );
phi = phiU + betaghf*fvc::snGrad(T)*rUAf*mesh.magSf(); phi = phiU + rUAf*fvc::interpolate(rhok)*(g & mesh.Sf());
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
{ {
fvScalarMatrix pdEqn fvScalarMatrix pEqn
( (
fvm::laplacian(rUAf, pd) == fvc::div(phi) fvm::laplacian(rUAf, p) == fvc::div(phi)
); );
if (corr == nCorr-1 && nonOrth == nNonOrthCorr) if (corr == nCorr-1 && nonOrth == nNonOrthCorr)
{ {
pdEqn.solve(mesh.solver(pd.name() + "Final")); pEqn.solve(mesh.solver(p.name() + "Final"));
} }
else else
{ {
pdEqn.solve(mesh.solver(pd.name())); pEqn.solve(mesh.solver(p.name()));
} }
if (nonOrth == nNonOrthCorr) if (nonOrth == nNonOrthCorr)
{ {
phi += pdEqn.flux(); phi -= pEqn.flux();
} }
} }
U -= rUA*fvc::reconstruct((phi - phiU)/rUAf); U += rUA*fvc::reconstruct((phi - phiU)/rUAf);
U.correctBoundaryConditions(); U.correctBoundaryConditions();
#include "continuityErrs.H" #include "continuityErrs.H"

View File

@ -1,13 +0,0 @@
singlePhaseTransportModel laminarTransport(U, phi);
// thermal expansion coefficient [1/K]
dimensionedScalar beta(laminarTransport.lookup("beta"));
// reference temperature [K]
dimensionedScalar TRef(laminarTransport.lookup("TRef"));
// reference kinematic pressure [m2/s2]
dimensionedScalar pRef(laminarTransport.lookup("pRef"));
// turbulent Prandtl number
dimensionedScalar Prt(laminarTransport.lookup("Prt"));

View File

@ -1,29 +0,0 @@
{
volScalarField rhoEff
(
IOobject
(
"rhoEff",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
1.0 - beta*(T - TRef)
);
rhoEff.write();
volScalarField p
(
IOobject
(
"p",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
pd + rhoEff*(g & mesh.C()) + pRef
);
p.write();
}

View File

@ -2,7 +2,7 @@
volScalarField kappaEff volScalarField kappaEff
( (
"kappaEff", "kappaEff",
turbulence->nu() + turbulence->nut()/Prt turbulence->nu()/Pr + turbulence->nut()/Prt
); );
fvScalarMatrix TEqn fvScalarMatrix TEqn
@ -16,4 +16,6 @@
eqnResidual = TEqn.solve().initialResidual(); eqnResidual = TEqn.solve().initialResidual();
maxResidual = max(eqnResidual, maxResidual); maxResidual = max(eqnResidual, maxResidual);
rhok = 1.0 - beta*(T - TRef);
} }

View File

@ -13,12 +13,12 @@
( (
UEqn() UEqn()
== ==
-fvc::reconstruct fvc::reconstruct
( (
( (
fvc::snGrad(pd) fvc::interpolate(rhok)*(g & mesh.Sf())
- betaghf*fvc::snGrad(T) - fvc::snGrad(p)*mesh.magSf()
) * mesh.magSf() )
) )
).initialResidual(); ).initialResidual();

View File

@ -72,21 +72,18 @@ int main(int argc, char *argv[])
#include "readSIMPLEControls.H" #include "readSIMPLEControls.H"
#include "initConvergenceCheck.H" #include "initConvergenceCheck.H"
pd.storePrevIter(); p.storePrevIter();
// Pressure-velocity SIMPLE corrector // Pressure-velocity SIMPLE corrector
{ {
#include "UEqn.H" #include "UEqn.H"
#include "TEqn.H" #include "TEqn.H"
#include "pdEqn.H" #include "pEqn.H"
} }
turbulence->correct(); turbulence->correct();
if (runTime.write()) runTime.write();
{
#include "writeAdditionalFields.H"
}
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s"

View File

@ -14,13 +14,12 @@
mesh mesh
); );
// kinematic pd Info<< "Reading field p\n" << endl;
Info<< "Reading field pd\n" << endl; volScalarField p
volScalarField pd
( (
IOobject IOobject
( (
"pd", "p",
runTime.timeName(), runTime.timeName(),
mesh, mesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -56,12 +55,25 @@
Info<< "Calculating field beta*(g.h)\n" << endl; Info<< "Calculating field beta*(g.h)\n" << endl;
surfaceScalarField betaghf("betagh", beta*(g & mesh.Cf())); surfaceScalarField betaghf("betagh", beta*(g & mesh.Cf()));
label pdRefCell = 0; label pRefCell = 0;
scalar pdRefValue = 0.0; scalar pRefValue = 0.0;
setRefCell setRefCell
( (
pd, p,
mesh.solutionDict().subDict("SIMPLE"), mesh.solutionDict().subDict("SIMPLE"),
pdRefCell, pRefCell,
pdRefValue pRefValue
);
// Kinematic density for buoyancy force
volScalarField rhok
(
IOobject
(
"rhok",
runTime.timeName(),
mesh
),
1.0 - beta*(T - TRef)
); );

View File

@ -6,41 +6,42 @@
UEqn.clear(); UEqn.clear();
phi = fvc::interpolate(U) & mesh.Sf(); phi = fvc::interpolate(U) & mesh.Sf();
adjustPhi(phi, U, pd); adjustPhi(phi, U, p);
surfaceScalarField buoyancyPhi = -betaghf*fvc::snGrad(T)*rUAf*mesh.magSf(); surfaceScalarField buoyancyPhi =
phi -= buoyancyPhi; rUAf*fvc::interpolate(rhok)*(g & mesh.Sf());
phi += buoyancyPhi;
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
{ {
fvScalarMatrix pdEqn fvScalarMatrix pEqn
( (
fvm::laplacian(rUAf, pd) == fvc::div(phi) fvm::laplacian(rUAf, p) == fvc::div(phi)
); );
pdEqn.setReference(pdRefCell, pdRefValue); pEqn.setReference(pRefCell, pRefValue);
// retain the residual from the first iteration // retain the residual from the first iteration
if (nonOrth == 0) if (nonOrth == 0)
{ {
eqnResidual = pdEqn.solve().initialResidual(); eqnResidual = pEqn.solve().initialResidual();
maxResidual = max(eqnResidual, maxResidual); maxResidual = max(eqnResidual, maxResidual);
} }
else else
{ {
pdEqn.solve(); pEqn.solve();
} }
if (nonOrth == nNonOrthCorr) if (nonOrth == nNonOrthCorr)
{ {
// Calculate the conservative fluxes // Calculate the conservative fluxes
phi -= pdEqn.flux(); phi -= pEqn.flux();
// Explicitly relax pressure for momentum corrector // Explicitly relax pressure for momentum corrector
pd.relax(); p.relax();
// Correct the momentum source with the pressure gradient flux // Correct the momentum source with the pressure gradient flux
// calculated from the relaxed pressure // calculated from the relaxed pressure
U -= rUA*fvc::reconstruct((buoyancyPhi + pdEqn.flux())/rUAf); U += rUA*fvc::reconstruct((buoyancyPhi - pEqn.flux())/rUAf);
U.correctBoundaryConditions(); U.correctBoundaryConditions();
} }
} }

View File

@ -1,13 +1,13 @@
singlePhaseTransportModel laminarTransport(U, phi); singlePhaseTransportModel laminarTransport(U, phi);
// thermal expansion coefficient [1/K] // Thermal expansion coefficient [1/K]
dimensionedScalar beta(laminarTransport.lookup("beta")); dimensionedScalar beta(laminarTransport.lookup("beta"));
// reference temperature [K] // Reference temperature [K]
dimensionedScalar TRef(laminarTransport.lookup("TRef")); dimensionedScalar TRef(laminarTransport.lookup("TRef"));
// reference kinematic pressure [m2/s2] // Laminar Prandtl number
dimensionedScalar pRef(laminarTransport.lookup("pRef")); dimensionedScalar Pr(laminarTransport.lookup("Pr"));
// turbulent Prandtl number // Turbulent Prandtl number
dimensionedScalar Prt(laminarTransport.lookup("Prt")); dimensionedScalar Prt(laminarTransport.lookup("Prt"));

View File

@ -1,29 +0,0 @@
{
volScalarField rhoEff
(
IOobject
(
"rhoEff",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
1.0 - beta*(T - TRef)
);
rhoEff.write();
volScalarField p
(
IOobject
(
"p",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
pd + rhoEff*(g & mesh.C()) + pRef
);
p.write();
}

View File

@ -65,4 +65,3 @@
dimensionedScalar initialMass = fvc::domainIntegrate(rho); dimensionedScalar initialMass = fvc::domainIntegrate(rho);
dimensionedScalar totalVolume = sum(mesh.V()); dimensionedScalar totalVolume = sum(mesh.V());

View File

@ -41,16 +41,15 @@ Description
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
#include "readEnvironmentalProperties.H"
#include "createFields.H"
#include "createRadiationModel.H"
#include "initContinuityErrs.H"
# include "setRootCase.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
# include "createTime.H"
# include "createMesh.H"
# include "readEnvironmentalProperties.H"
# include "createFields.H"
# include "createRadiationModel.H"
# include "initContinuityErrs.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Info<< "\nStarting time loop\n" << endl; Info<< "\nStarting time loop\n" << endl;
@ -58,17 +57,17 @@ int main(int argc, char *argv[])
{ {
Info<< "Time = " << runTime.timeName() << nl << endl; Info<< "Time = " << runTime.timeName() << nl << endl;
# include "readSIMPLEControls.H" #include "readSIMPLEControls.H"
# include "initConvergenceCheck.H" #include "initConvergenceCheck.H"
p.storePrevIter(); p.storePrevIter();
rho.storePrevIter(); rho.storePrevIter();
// Pressure-velocity SIMPLE corrector // Pressure-velocity SIMPLE corrector
{ {
# include "UEqn.H" #include "UEqn.H"
# include "hEqn.H" #include "hEqn.H"
# include "pEqn.H" #include "pEqn.H"
} }
turbulence->correct(); turbulence->correct();
@ -79,7 +78,7 @@ int main(int argc, char *argv[])
<< " ClockTime = " << runTime.elapsedClockTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl; << nl << endl;
# include "convergenceCheck.H" #include "convergenceCheck.H"
} }
Info<< "End\n" << endl; Info<< "End\n" << endl;

View File

@ -7,7 +7,8 @@
runTime.constant(), runTime.constant(),
mesh, mesh,
IOobject::MUST_READ, IOobject::MUST_READ,
IOobject::NO_WRITE IOobject::NO_WRITE,
false
) )
); );

View File

@ -1,7 +1,7 @@
Info<< "Creating merge patch pairs" << nl << endl;
if (mergePatchPairs.size()) if (mergePatchPairs.size())
{ {
Info<< "Creating merge patch pairs" << nl << endl;
// Create and add point and face zones and mesh modifiers // Create and add point and face zones and mesh modifiers
List<pointZone*> pz(mergePatchPairs.size()); List<pointZone*> pz(mergePatchPairs.size());
List<faceZone*> fz(3*mergePatchPairs.size()); List<faceZone*> fz(3*mergePatchPairs.size());

View File

@ -26,12 +26,31 @@ action new;
topoSetSources topoSetSources
( (
// Select by explicitly providing cell labels
labelToCell
{
value (12 13 56); // labels of cells
}
// Copy elements from cellSet // Copy elements from cellSet
cellToCell cellToCell
{ {
set c1; set c1;
} }
// Cells in cell zone
zoneToCell
{
name ".*Zone"; // Name of cellZone, regular expressions allowed
}
// Cells on master or slave side of faceZone
faceZoneToCell
{
name ".*Zone"; // Name of faceZone, regular expressions allowed
option master; // master/slave
}
// Select based on faceSet // Select based on faceSet
faceToCell faceToCell
{ {
@ -51,12 +70,6 @@ topoSetSources
//option all; // cell with all points in pointSet //option all; // cell with all points in pointSet
} }
// Select by explicitly providing cell labels
labelToCell
{
value (12 13 56); // labels of cells
}
// Select based on cellShape // Select based on cellShape
shapeToCell shapeToCell
{ {
@ -87,7 +100,6 @@ topoSetSources
radius 5.0; radius 5.0;
} }
// Cells with centre within sphere // Cells with centre within sphere
sphereToCell sphereToCell
{ {
@ -95,20 +107,6 @@ topoSetSources
radius 5.0; radius 5.0;
} }
// Cells in cell zone
zoneToCell
{
name ".*Zone"; // Name of cellZone, regular expressions allowed
}
// values of field within certain range
fieldToCell
{
fieldName U; // Note: uses mag(U) since volVectorField
min 0.1;
max 0.5;
}
// Cells with cellCentre nearest to coordinates // Cells with cellCentre nearest to coordinates
nearestToCell nearestToCell
{ {
@ -129,6 +127,22 @@ topoSetSources
// and near surf curvature // and near surf curvature
// (set to -100 if not used) // (set to -100 if not used)
} }
// values of field within certain range
fieldToCell
{
fieldName U; // Note: uses mag(U) since volVectorField
min 0.1;
max 0.5;
}
// Mesh region (non-face connected part of (subset of)mesh)
regionToCell
{
set c0; // name of cellSet giving mesh subset
insidePoint (1 2 3); // point inside region to select
}
); );

View File

@ -7,6 +7,31 @@
#include "pointSet.H" #include "pointSet.H"
#include "IOmanip.H" #include "IOmanip.H"
bool Foam::checkSync(const wordList& names)
{
List<wordList> allNames(Pstream::nProcs());
allNames[Pstream::myProcNo()] = names;
Pstream::gatherList(allNames);
bool hasError = false;
for (label procI = 1; procI < allNames.size(); procI++)
{
if (allNames[procI] != allNames[0])
{
hasError = true;
Info<< " ***Inconsistent zones across processors, "
"processor 0 has zones:" << allNames[0]
<< ", processor " << procI << " has zones:"
<< allNames[procI]
<< endl;
}
}
return hasError;
}
Foam::label Foam::checkTopology Foam::label Foam::checkTopology
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -24,6 +49,31 @@ Foam::label Foam::checkTopology
// Check if the boundary processor patches are correct // Check if the boundary processor patches are correct
mesh.boundaryMesh().checkParallelSync(true); mesh.boundaryMesh().checkParallelSync(true);
// Check names of zones are equal
if (checkSync(mesh.cellZones().names()))
{
noFailedChecks++;
}
if (checkSync(mesh.faceZones().names()))
{
noFailedChecks++;
}
if (checkSync(mesh.pointZones().names()))
{
noFailedChecks++;
}
// Check contents of faceZones consistent
{
forAll(mesh.faceZones(), zoneI)
{
if (mesh.faceZones()[zoneI].checkParallelSync(true))
{
noFailedChecks++;
}
}
}
{ {
pointSet points(mesh, "unusedPoints", mesh.nPoints()/100); pointSet points(mesh, "unusedPoints", mesh.nPoints()/100);
if (mesh.checkPoints(true, &points)) if (mesh.checkPoints(true, &points))

View File

@ -1,8 +1,11 @@
#include "label.H" #include "label.H"
#include "wordList.H"
namespace Foam namespace Foam
{ {
class polyMesh; class polyMesh;
bool checkSync(const wordList& names);
label checkTopology(const polyMesh&, const bool, const bool); label checkTopology(const polyMesh&, const bool, const bool);
} }

View File

@ -69,13 +69,13 @@ void Foam::printMeshStats(const polyMesh& mesh, const bool allTopology)
<< " cells: " << " cells: "
<< returnReduce(mesh.cells().size(), sumOp<label>()) << nl << returnReduce(mesh.cells().size(), sumOp<label>()) << nl
<< " boundary patches: " << " boundary patches: "
<< returnReduce(mesh.boundaryMesh().size(), sumOp<label>()) << nl << mesh.boundaryMesh().size() << nl
<< " point zones: " << " point zones: "
<< returnReduce(mesh.pointZones().size(), sumOp<label>()) << nl << mesh.pointZones().size() << nl
<< " face zones: " << " face zones: "
<< returnReduce(mesh.faceZones().size(), sumOp<label>()) << nl << mesh.faceZones().size() << nl
<< " cell zones: " << " cell zones: "
<< returnReduce(mesh.cellZones().size(), sumOp<label>()) << nl << mesh.cellZones().size() << nl
<< endl; << endl;

View File

@ -43,16 +43,89 @@ Description
#include "ReadFields.H" #include "ReadFields.H"
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H" #include "surfaceFields.H"
#include "ZoneIDs.H"
using namespace Foam; using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void modifyOrAddFace
(
polyTopoChange& meshMod,
const face& f,
const label faceI,
const label own,
const bool flipFaceFlux,
const label newPatchI,
const label zoneID,
const bool zoneFlip,
PackedBoolList& modifiedFace
)
{
if (!modifiedFace[faceI])
{
// First usage of face. Modify.
meshMod.setAction
(
polyModifyFace
(
f, // modified face
faceI, // label of face
own, // owner
-1, // neighbour
flipFaceFlux, // face flip
newPatchI, // patch for face
false, // remove from zone
zoneID, // zone for face
zoneFlip // face flip in zone
)
);
modifiedFace[faceI] = 1;
}
else
{
// Second or more usage of face. Add.
meshMod.setAction
(
polyAddFace
(
f, // modified face
own, // owner
-1, // neighbour
-1, // master point
-1, // master edge
faceI, // master face
flipFaceFlux, // face flip
newPatchI, // patch for face
zoneID, // zone for face
zoneFlip // face flip in zone
)
);
}
}
label findPatchID(const polyMesh& mesh, const word& name)
{
label patchI = mesh.boundaryMesh().findPatchID(name);
if (patchI == -1)
{
FatalErrorIn("findPatchID(const polyMesh&, const word&)")
<< "Cannot find patch " << name << endl
<< "Valid patches are " << mesh.boundaryMesh().names()
<< exit(FatalError);
}
return patchI;
}
// Main program: // Main program:
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
argList::validArgs.append("set"); argList::validArgs.append("faceZone");
argList::validArgs.append("patch"); argList::validArgs.append("patch");
argList::validOptions.insert("additionalPatches", "(patch2 .. patchN)"); argList::validOptions.insert("additionalPatches", "(patch2 .. patchN)");
argList::validOptions.insert("overwrite", ""); argList::validOptions.insert("overwrite", "");
@ -67,30 +140,28 @@ int main(int argc, char *argv[])
const faceZoneMesh& faceZones = mesh.faceZones(); const faceZoneMesh& faceZones = mesh.faceZones();
// Faces to baffle // Faces to baffle
word setName(args.additionalArgs()[0]); faceZoneID zoneID(args.additionalArgs()[0], faceZones);
Info<< "Reading faceSet from " << setName << nl << endl;
faceSet facesToSplit(mesh, setName);
// Make sure set is synchronised across couples
facesToSplit.sync(mesh);
Info<< "Read " << returnReduce(facesToSplit.size(), sumOp<label>())
<< " faces from " << setName << nl << endl;
Info<< "Converting faces on zone " << zoneID.name()
<< " into baffles." << nl << endl;
const faceZone& fZone = faceZones[zoneID.index()];
Info<< "Found " << returnReduce(fZone.size(), sumOp<label>())
<< " faces on zone " << zoneID.name() << nl << endl;
// Make sure patches and zoneFaces are synchronised across couples
patches.checkParallelSync(true);
fZone.checkParallelSync(true);
// Patches to put baffles into // Patches to put baffles into
DynamicList<label> newPatches(1); DynamicList<label> newPatches(1);
word patchName(args.additionalArgs()[1]); word patchName(args.additionalArgs()[1]);
newPatches.append(patches.findPatchID(patchName)); newPatches.append(findPatchID(mesh, patchName));
Pout<< "Using patch " << patchName Info<< "Using patch " << patchName
<< " at index " << newPatches[0] << endl; << " at index " << newPatches[0] << endl;
if (newPatches[0] == -1)
{
FatalErrorIn(args.executable())
<< "Cannot find patch " << patchName << endl
<< "Valid patches are " << patches.names() << exit(FatalError);
}
// Additional patches // Additional patches
if (args.optionFound("additionalPatches")) if (args.optionFound("additionalPatches"))
@ -103,19 +174,9 @@ int main(int argc, char *argv[])
newPatches.reserve(patchNames.size() + 1); newPatches.reserve(patchNames.size() + 1);
forAll(patchNames, i) forAll(patchNames, i)
{ {
label patchI = patches.findPatchID(patchNames[i]); newPatches.append(findPatchID(mesh, patchNames[i]));
Info<< "Using additional patch " << patchNames[i] Info<< "Using additional patch " << patchNames[i]
<< " at index " << patchI << endl; << " at index " << newPatches[newPatches.size()-1] << endl;
if (patchI == -1)
{
FatalErrorIn(args.executable())
<< "Cannot find patch " << patchNames[i] << endl
<< "Valid patches are " << patches.names()
<< exit(FatalError);
}
newPatches.append(patchI);
} }
} }
@ -166,111 +227,112 @@ int main(int argc, char *argv[])
polyTopoChange meshMod(mesh); polyTopoChange meshMod(mesh);
// Do the actual changes // Do the actual changes. Note:
// Note order in which faces are modified/added is so they end up correctly // - loop in incrementing face order (not necessary if faceZone ordered).
// for cyclic patches (original faces first and then reversed faces) // Preserves any existing ordering on patch faces.
// since otherwise it will have trouble matching baffles. // - two passes, do non-flip faces first and flip faces second. This
// guarantees that when e.g. creating a cyclic all faces from one
// side come first and faces from the other side next.
label nBaffled = 0; PackedBoolList modifiedFace(mesh.nFaces());
forAll(newPatches, i) forAll(newPatches, i)
{ {
label newPatchI = newPatches[i]; label newPatchI = newPatches[i];
// Pass 1. Do selected side of zone
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++) for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
{ {
if (facesToSplit.found(faceI)) label zoneFaceI = fZone.whichFace(faceI);
{
const face& f = mesh.faces()[faceI];
label zoneID = faceZones.whichZone(faceI);
bool zoneFlip = false;
if (zoneID >= 0)
{
const faceZone& fZone = faceZones[zoneID];
zoneFlip = fZone.flipMap()[fZone.whichFace(faceI)];
}
if (i == 0) if (zoneFaceI != -1)
{
if (!fZone.flipMap()[zoneFaceI])
{ {
// First usage of face. Modify. // Use owner side of face
meshMod.setAction modifyOrAddFace
( (
polyModifyFace meshMod,
( mesh.faces()[faceI], // modified face
f, // modified face faceI, // label of face
faceI, // label of face mesh.faceOwner()[faceI],// owner
mesh.faceOwner()[faceI], // owner false, // face flip
-1, // neighbour newPatchI, // patch for face
false, // face flip zoneID.index(), // zone for face
newPatchI, // patch for face false, // face flip in zone
false, // remove from zone modifiedFace // modify or add status
zoneID, // zone for face
zoneFlip // face flip in zone
)
); );
} }
else else
{ {
// Second or more usage of face. Add. // Use neighbour side of face
meshMod.setAction modifyOrAddFace
( (
polyAddFace meshMod,
( mesh.faces()[faceI].reverseFace(), // modified face
f, // modified face faceI, // label of face
mesh.faceOwner()[faceI], // owner mesh.faceNeighbour()[faceI],// owner
-1, // neighbour
-1, // master point
-1, // master edge
faceI, // master face
false, // face flip
newPatchI, // patch for face
zoneID, // zone for face
zoneFlip // face flip in zone
)
);
}
nBaffled++;
}
}
// Add the reversed face.
for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
{
if (facesToSplit.found(faceI))
{
const face& f = mesh.faces()[faceI];
label zoneID = faceZones.whichZone(faceI);
bool zoneFlip = false;
if (zoneID >= 0)
{
const faceZone& fZone = faceZones[zoneID];
zoneFlip = fZone.flipMap()[fZone.whichFace(faceI)];
}
label nei = mesh.faceNeighbour()[faceI];
meshMod.setAction
(
polyAddFace
(
f.reverseFace(), // modified face
nei, // owner
-1, // neighbour
-1, // masterPointID
-1, // masterEdgeID
faceI, // masterFaceID,
true, // face flip true, // face flip
newPatchI, // patch for face newPatchI, // patch for face
zoneID, // zone for face zoneID.index(), // zone for face
zoneFlip // face flip in zone true, // face flip in zone
) modifiedFace // modify or add status
); );
}
nBaffled++;
} }
} }
// Pass 2. Do other side of zone
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
{
label zoneFaceI = fZone.whichFace(faceI);
if (zoneFaceI != -1)
{
if (!fZone.flipMap()[zoneFaceI])
{
// Use neighbour side of face
modifyOrAddFace
(
meshMod,
mesh.faces()[faceI].reverseFace(), // modified face
faceI, // label of face
mesh.faceNeighbour()[faceI], // owner
true, // face flip
newPatchI, // patch for face
zoneID.index(), // zone for face
true, // face flip in zone
modifiedFace // modify or add
);
}
else
{
// Use owner side of face
modifyOrAddFace
(
meshMod,
mesh.faces()[faceI], // modified face
faceI, // label of face
mesh.faceOwner()[faceI],// owner
false, // face flip
newPatchI, // patch for face
zoneID.index(), // zone for face
false, // face flip in zone
modifiedFace // modify or add status
);
}
}
}
// Modify any boundary faces // Modify any boundary faces
// ~~~~~~~~~~~~~~~~~~~~~~~~~
forAll(patches, patchI) forAll(patches, patchI)
{ {
const polyPatch& pp = patches[patchI]; const polyPatch& pp = patches[patchI];
@ -286,58 +348,22 @@ int main(int argc, char *argv[])
{ {
label faceI = pp.start()+i; label faceI = pp.start()+i;
if (facesToSplit.found(faceI)) label zoneFaceI = fZone.whichFace(faceI);
if (zoneFaceI != -1)
{ {
const face& f = mesh.faces()[faceI]; modifyOrAddFace
label zoneID = faceZones.whichZone(faceI); (
bool zoneFlip = false; meshMod,
if (zoneID >= 0) mesh.faces()[faceI], // modified face
{ faceI, // label of face
const faceZone& fZone = faceZones[zoneID]; mesh.faceOwner()[faceI], // owner
zoneFlip = fZone.flipMap()[fZone.whichFace(faceI)]; false, // face flip
} newPatchI, // patch for face
zoneID.index(), // zone for face
if (i == 0) fZone.flipMap()[zoneFaceI], // face flip in zone
{ modifiedFace // modify or add status
// First usage of face. Modify. );
meshMod.setAction
(
polyModifyFace
(
f, // modified face
faceI, // label of face
mesh.faceOwner()[faceI],// owner
-1, // neighbour
false, // face flip
newPatchI, // patch for face
false, // remove from zone
zoneID, // zone for face
zoneFlip // face flip in zone
)
);
}
else
{
// Second or more usage of face. Add.
meshMod.setAction
(
polyAddFace
(
f, // modified face
mesh.faceOwner()[faceI],// owner
-1, // neighbour
-1, // master point
-1, // master edge
faceI, // master face
false, // face flip
newPatchI, // patch for face
zoneID, // zone for face
zoneFlip // face flip in zone
)
);
}
nBaffled++;
} }
} }
} }
@ -345,7 +371,7 @@ int main(int argc, char *argv[])
} }
Info<< "Converted " << returnReduce(nBaffled, sumOp<label>()) Info<< "Converted " << returnReduce(modifiedFace.count(), sumOp<label>())
<< " faces into boundary faces on patch " << patchName << nl << endl; << " faces into boundary faces on patch " << patchName << nl << endl;
if (!overwrite) if (!overwrite)

View File

@ -51,18 +51,24 @@ topoSetSources
value (12 13 56); // labels of points value (12 13 56); // labels of points
} }
// Points with coordinate within box
boxToPoint
{
box (0 0 0) (1 1 1);
}
// All points in pointzone // All points in pointzone
zoneToPoint zoneToPoint
{ {
name ".*Zone"; // name of pointZone, regular expressions allowed name ".*Zone"; // name of pointZone, regular expressions allowed
} }
// Points nearest to coordinates
nearestToPoint
{
points ((0 0 0) (1 1 1));
}
// Points with coordinate within box
boxToPoint
{
box (0 0 0) (1 1 1);
}
// Select based on surface // Select based on surface
surfaceToPoint surfaceToPoint
{ {

View File

@ -367,7 +367,7 @@ bool doCommand
{ {
r = IOobject::NO_READ; r = IOobject::NO_READ;
backup(mesh, setName, setName + "_old"); //backup(mesh, setName, setName + "_old");
currentSetPtr = topoSet::New(setType, mesh, setName, typSize); currentSetPtr = topoSet::New(setType, mesh, setName, typSize);
} }
@ -399,11 +399,11 @@ bool doCommand
<< " Action:" << actionName << " Action:" << actionName
<< endl; << endl;
if ((r == IOobject::MUST_READ) && (action != topoSetSource::LIST)) //if ((r == IOobject::MUST_READ) && (action != topoSetSource::LIST))
{ //{
// currentSet has been read so can make copy. // // currentSet has been read so can make copy.
backup(mesh, setName, currentSet, setName + "_old"); // backup(mesh, setName, currentSet, setName + "_old");
} //}
switch (action) switch (action)
{ {
@ -558,7 +558,8 @@ void printMesh(const Time& runTime, const polyMesh& mesh)
<< " cells:" << mesh.nCells() << " cells:" << mesh.nCells()
<< " faces:" << mesh.nFaces() << " faces:" << mesh.nFaces()
<< " points:" << mesh.nPoints() << " points:" << mesh.nPoints()
<< " patches:" << mesh.boundaryMesh().size() << nl; << " patches:" << mesh.boundaryMesh().size()
<< " bb:" << mesh.bounds() << nl;
} }

View File

@ -28,8 +28,8 @@ Description
There is one catch: for faceZones you also need to specify a flip There is one catch: for faceZones you also need to specify a flip
condition which basically denotes the side of the face. In this app condition which basically denotes the side of the face. In this app
it reads a cellSet (xxxCells if 'xxx' is the name of the faceSet) and it reads a cellSet (xxxCells if 'xxx' is the name of the faceSet) which
any face whose neighbour is in the cellSet gets a flip=true. is the masterCells of the zone.
There are lots of situations in which this will go wrong but it is the There are lots of situations in which this will go wrong but it is the
best I can think of for now. best I can think of for now.
@ -87,7 +87,7 @@ int main(int argc, char *argv[])
polyMesh::meshSubDir/"sets" polyMesh::meshSubDir/"sets"
); );
Pout<< "Searched : " << mesh.pointsInstance()/polyMesh::meshSubDir/"sets" Info<< "Searched : " << mesh.pointsInstance()/polyMesh::meshSubDir/"sets"
<< nl << nl
<< "Found : " << objects.names() << nl << "Found : " << objects.names() << nl
<< endl; << endl;
@ -95,7 +95,7 @@ int main(int argc, char *argv[])
IOobjectList pointObjects(objects.lookupClass(pointSet::typeName)); IOobjectList pointObjects(objects.lookupClass(pointSet::typeName));
Pout<< "pointSets:" << pointObjects.names() << endl; //Pout<< "pointSets:" << pointObjects.names() << endl;
for for
( (
@ -126,6 +126,7 @@ int main(int argc, char *argv[])
) )
); );
mesh.pointZones().writeOpt() = IOobject::AUTO_WRITE; mesh.pointZones().writeOpt() = IOobject::AUTO_WRITE;
mesh.pointZones().instance() = mesh.facesInstance();
} }
else else
{ {
@ -133,57 +134,17 @@ int main(int argc, char *argv[])
<< " with that of set " << set.name() << "." << endl; << " with that of set " << set.name() << "." << endl;
mesh.pointZones()[zoneID] = pointLabels; mesh.pointZones()[zoneID] = pointLabels;
mesh.pointZones().writeOpt() = IOobject::AUTO_WRITE; mesh.pointZones().writeOpt() = IOobject::AUTO_WRITE;
mesh.pointZones().instance() = mesh.facesInstance();
} }
} }
IOobjectList cellObjects(objects.lookupClass(cellSet::typeName));
Pout<< "cellSets:" << cellObjects.names() << endl;
for
(
IOobjectList::const_iterator iter = cellObjects.begin();
iter != cellObjects.end();
++iter
)
{
// Not in memory. Load it.
cellSet set(*iter());
SortableList<label> cellLabels(set.toc());
label zoneID = mesh.cellZones().findZoneID(set.name());
if (zoneID == -1)
{
Info<< "Adding set " << set.name() << " as a cellZone." << endl;
label sz = mesh.cellZones().size();
mesh.cellZones().setSize(sz+1);
mesh.cellZones().set
(
sz,
new cellZone
(
set.name(), //name
cellLabels, //addressing
sz, //index
mesh.cellZones() //pointZoneMesh
)
);
mesh.cellZones().writeOpt() = IOobject::AUTO_WRITE;
}
else
{
Info<< "Overwriting contents of existing cellZone " << zoneID
<< " with that of set " << set.name() << "." << endl;
mesh.cellZones()[zoneID] = cellLabels;
mesh.cellZones().writeOpt() = IOobject::AUTO_WRITE;
}
}
IOobjectList faceObjects(objects.lookupClass(faceSet::typeName)); IOobjectList faceObjects(objects.lookupClass(faceSet::typeName));
Pout<< "faceSets:" << faceObjects.names() << endl; HashSet<word> slaveCellSets;
//Pout<< "faceSets:" << faceObjects.names() << endl;
for for
( (
@ -201,14 +162,11 @@ int main(int argc, char *argv[])
if (!noFlipMap) if (!noFlipMap)
{ {
word setName(set.name() + "Cells"); word setName(set.name() + "SlaveCells");
Pout<< "Trying to load cellSet " << setName Info<< "Trying to load cellSet " << setName
<< " to find out the flipMap." << nl << " to find out the slave side of the zone." << nl
<< "If the neighbour side of the face is in the cellSet" << "If you do not care about the flipMap"
<< " the flipMap becomes true," << nl
<< "in all other cases it stays false."
<< " If you do not care about the flipMap"
<< " (i.e. do not use the sideness)" << nl << " (i.e. do not use the sideness)" << nl
<< "use the -noFlipMap command line option." << "use the -noFlipMap command line option."
<< endl; << endl;
@ -216,6 +174,9 @@ int main(int argc, char *argv[])
// Load corresponding cells // Load corresponding cells
cellSet cells(mesh, setName); cellSet cells(mesh, setName);
// Store setName to exclude from cellZones further on
slaveCellSets.insert(setName);
forAll(faceLabels, i) forAll(faceLabels, i)
{ {
label faceI = faceLabels[i]; label faceI = faceLabels[i];
@ -302,6 +263,7 @@ int main(int argc, char *argv[])
) )
); );
mesh.faceZones().writeOpt() = IOobject::AUTO_WRITE; mesh.faceZones().writeOpt() = IOobject::AUTO_WRITE;
mesh.faceZones().instance() = mesh.facesInstance();
} }
else else
{ {
@ -313,10 +275,63 @@ int main(int argc, char *argv[])
flipMap.shrink() flipMap.shrink()
); );
mesh.faceZones().writeOpt() = IOobject::AUTO_WRITE; mesh.faceZones().writeOpt() = IOobject::AUTO_WRITE;
mesh.faceZones().instance() = mesh.facesInstance();
} }
} }
Pout<< "Writing mesh." << endl;
IOobjectList cellObjects(objects.lookupClass(cellSet::typeName));
//Pout<< "cellSets:" << cellObjects.names() << endl;
for
(
IOobjectList::const_iterator iter = cellObjects.begin();
iter != cellObjects.end();
++iter
)
{
if (!slaveCellSets.found(iter.key()))
{
// Not in memory. Load it.
cellSet set(*iter());
SortableList<label> cellLabels(set.toc());
label zoneID = mesh.cellZones().findZoneID(set.name());
if (zoneID == -1)
{
Info<< "Adding set " << set.name() << " as a cellZone." << endl;
label sz = mesh.cellZones().size();
mesh.cellZones().setSize(sz+1);
mesh.cellZones().set
(
sz,
new cellZone
(
set.name(), //name
cellLabels, //addressing
sz, //index
mesh.cellZones() //pointZoneMesh
)
);
mesh.cellZones().writeOpt() = IOobject::AUTO_WRITE;
mesh.cellZones().instance() = mesh.facesInstance();
}
else
{
Info<< "Overwriting contents of existing cellZone " << zoneID
<< " with that of set " << set.name() << "." << endl;
mesh.cellZones()[zoneID] = cellLabels;
mesh.cellZones().writeOpt() = IOobject::AUTO_WRITE;
mesh.cellZones().instance() = mesh.facesInstance();
}
}
}
Info<< "Writing mesh." << endl;
if (!mesh.write()) if (!mesh.write())
{ {
@ -325,7 +340,7 @@ int main(int argc, char *argv[])
<< exit(FatalError); << exit(FatalError);
} }
Pout << nl << "End" << endl; Info<< nl << "End" << endl;
return 0; return 0;
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -1,8 +0,0 @@
latticeStructures = latticeStructures
velocityDistributions = velocityDistributions
createMolecules.C
molConfig.C
genMolConfig.C
EXE = $(FOAM_APPBIN)/molConfig

View File

@ -1,17 +0,0 @@
EXE_INC = \
-I$(latticeStructures) \
-I$(velocityDistributions) \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/dynamicMesh/lnInclude \
-I$(LIB_SRC)/lagrangian/molecularDynamics/molecule/lnInclude \
-I$(LIB_SRC)/lagrangian/molecularDynamics/potential/lnInclude \
-I$(LIB_SRC)/lagrangian/basic/lnInclude \
-I$(LIB_SRC)/finiteVolume/lnInclude
EXE_LIBS = \
-lmeshTools \
-ldynamicMesh \
-lfiniteVolume \
-llagrangian \
-lmolecule \
-lpotential

View File

@ -1,21 +0,0 @@
for (molN = totalMols; molN < totalMols + totalZoneMols; molN++)
{
// Remove bulk momentum introduced by random numbers and add
// desired bulk velocity
// For systems with molecules of significantly differing masses, this may
// need to be an iterative process or employ a better algorithm for
// removing an appropriate share of the excess momentum from each molecule.
initialVelocities(molN) += bulkVelocity - momentumSum/totalZoneMols/mass;
}
// momentumSum = vector::zero;
//
// for (molN = totalMols; molN < totalMols + totalZoneMols; molN++)
// {
// momentumSum += mass*initialVelocities(molN);
// }
//
// Info << "Check momentum adjustment: " << momentumSum << endl;

View File

@ -1,253 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*----------------------------------------------------------------------------*/
#include "molConfig.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void Foam::molConfig::createMolecules()
{
Info<< nl << "Creating molecules from zone specifications\n" << endl;
DynamicList<vector> initialPositions(0);
DynamicList<label> initialIds(0);
DynamicList<scalar> initialMasses(0);
DynamicList<label> initialCelli(0);
DynamicList<vector> initialVelocities(0);
DynamicList<vector> initialAccelerations(0);
DynamicList<label> initialTethered(0);
DynamicList<vector> initialTetherPositions(0);
label totalMols = 0;
label idAssign;
Random rand(clock::getTime());
// * * * * * * * * Building the IdList * * * * * * * * * //
//Notes: - each processor will have an identical idList_.
// - The order of id's inside the idList_ depends on the order
// of subDicts inside the molConigDict.
Info<< "Building the idList: " ;
forAll(molConfigDescription_.toc(), cZs)
{
word subDictName (molConfigDescription_.toc()[cZs]);
word iD (molConfigDescription_.subDict(subDictName).lookup("id"));
if (findIndex(idList_,iD) == -1)
{
idList_.append(iD);
}
}
forAll(idList_, i)
{
Info << " " << idList_[i];
}
Info << nl << endl;
// * * * * * * * * Filling the Mesh * * * * * * * * * //
const cellZoneMesh& cellZoneI = mesh_.cellZones();
if (cellZoneI.size())
{
Info<< "Filling the zones with molecules." << nl << endl;
}
else
{
FatalErrorIn("void createMolecules()\n")
<< "No cellZones found in mesh description."
<< abort(FatalError);
}
forAll (cellZoneI, cZ)
{
if (cellZoneI[cZ].size())
{
if (!molConfigDescription_.found(cellZoneI[cZ].name()))
{
Info << "Zone specification subDictionary: "
<< cellZoneI[cZ].name() << " not found." << endl;
}
else
{
label n = 0;
label totalZoneMols = 0;
label molsPlacedThisIteration;
# include "readZoneSubDict.H"
idAssign = findIndex(idList_,id);
# include "startingPoint.H"
// Continue trying to place molecules as long as at
// least one molecule is placed in each iteration.
// The "|| totalZoneMols == 0" condition means that the
// algorithm will continue if the origin is outside the
// zone - it will cause an infinite loop if no molecules
// are ever placed by the algorithm.
if (latticeStructure != "empty")
{
while
(
molsPlacedThisIteration != 0
|| totalZoneMols == 0
)
{
molsPlacedThisIteration = 0;
bool partOfLayerInBounds = false;
# include "createPositions.H"
if
(
totalZoneMols == 0
&& !partOfLayerInBounds
)
{
WarningIn("molConfig::createMolecules()")
<< "A whole layer of unit cells was placed "
<< "outside the bounds of the mesh, but no "
<< "molecules have been placed in zone '"
<< cellZoneI[cZ].name()
<< "'. This is likely to be because the zone "
<< "has few cells ("
<< cellZoneI[cZ].size()
<< " in this case) and no lattice position "
<< "fell inside them. "
<< "Aborting filling this zone."
<< endl;
break;
}
totalZoneMols += molsPlacedThisIteration;
n++;
}
label molN;
for
(
molN = totalMols;
molN < totalMols + totalZoneMols;
molN++
)
{
initialIds.append(idAssign);
initialMasses.append(mass);
initialAccelerations.append(vector::zero);
if (tethered)
{
initialTethered.append(1);
initialTetherPositions.append
(
initialPositions[molN]
);
}
else
{
initialTethered.append(0);
initialTetherPositions.append(vector::zero);
}
}
# include "createVelocities.H"
# include "correctVelocities.H"
}
totalMols += totalZoneMols;
}
}
}
idList_.shrink();
positions_ = initialPositions;
positions_.setSize(initialPositions.size());
id_ = initialIds;
id_.setSize(initialIds.size());
mass_ = initialMasses;
mass_.setSize(initialMasses.size());
cells_ = initialCelli;
cells_.setSize(initialCelli.size());
U_ = initialVelocities;
U_.setSize(initialVelocities.size());
A_ = initialAccelerations;
A_.setSize(initialAccelerations.size());
tethered_ = initialTethered;
tethered_.setSize(initialTethered.size());
tetherPositions_ = initialTetherPositions;
tetherPositions_.setSize(initialTetherPositions.size());
nMol_ = totalMols;
}
// ************************************************************************* //

View File

@ -1,26 +0,0 @@
vector latticePosition;
vector globalPosition;
if (latticeStructure == "SC")
{
# include "SC.H"
}
else if (latticeStructure == "FCC")
{
# include "FCC.H"
}
else if (latticeStructure == "BCC")
{
# include "BCC.H"
}
else
{
FatalErrorIn("createPositions.H\n")
<< "latticeStructure " << latticeStructure
<< " not supported."
<< abort(FatalError);
}

View File

@ -1,13 +0,0 @@
vector velocity;
vector momentumSum = vector::zero;
if (velocityDistribution == "uniform")
{
# include "uniform.H"
}
if (velocityDistribution == "maxwellian")
{
# include "maxwellian.H"
}

View File

@ -1,129 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "molConfig.H"
#include "fvCFD.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
# include "setRootCase.H"
# include "createTime.H"
# include "createMesh.H"
Info<< nl << "Reading molecular configuration description dictionary"
<< endl;
IOobject molConfigDescriptionIOobject
(
"molConfigDict",
runTime.system(),
runTime,
IOobject::MUST_READ,
IOobject::NO_WRITE,
false
);
if (!molConfigDescriptionIOobject.headerOk())
{
FatalErrorIn(args.executable())
<< "Cannot find molConfig description file " << nl
<< args.caseName()/runTime.system()/"molConfig"/"molConfigDict"
<< nl << exit(FatalError);
}
IOdictionary molConfigDescription(molConfigDescriptionIOobject);
// Create molCloud, registering object with mesh
Info<< nl << "Creating molecular configuration" << endl;
molConfig molecules(molConfigDescription, mesh);
label totalMolecules = molecules.nMol();
if (Pstream::parRun())
{
reduce(totalMolecules, sumOp<label>());
}
Info<< nl << "Total number of molecules added: " << totalMolecules
<< nl << endl;
moleculeCloud molCloud
(
mesh,
molecules.nMol(),
molecules.id(),
molecules.mass(),
molecules.positions(),
molecules.cells(),
molecules.U(),
molecules.A(),
molecules.tethered(),
molecules.tetherPositions()
);
IOdictionary idListDict
(
IOobject
(
"idList",
mesh.time().constant(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
)
);
idListDict.add("idList", molecules.molIdList());
IOstream::defaultPrecision(12);
Info << nl << "Writing molecular configuration" << endl;
if (!mesh.write())
{
FatalErrorIn(args.executable())
<< "Failed writing moleculeCloud."
<< nl << exit(FatalError);
}
Info<< nl << "ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl;
Info << nl << "End\n" << endl;
return 0;
}
// ************************************************************************* //

View File

@ -1,179 +0,0 @@
labelVector iN(0,0,0);
vector gap = (vector::one)*pow((numberDensity/2.0),-(1.0/3.0));
#include "origin.H"
// Info<< "gap = " << gap << endl;
// Special treatment is required for the first position, i.e. iteration zero.
if (n == 0)
{
latticePosition.x() = (iN.x()*gap.x());
latticePosition.y() = (iN.y()*gap.y());
latticePosition.z() = (iN.z()*gap.z());
// Placing 2 molecules in each unit cell, using the algorithm from
// D. Rapaport, The Art of Molecular Dynamics Simulation, 2nd Ed, p68
for (label iU = 0; iU < 2; iU++)
{
vector unitCellLatticePosition = latticePosition;
if (iU == 1)
{
unitCellLatticePosition += 0.5 * gap;
}
if (originSpecifies == "corner")
{
unitCellLatticePosition -= 0.25*gap;
}
// Info << nl << n << ", " << unitCellLatticePosition;
globalPosition =
origin + transform(latticeToGlobal,unitCellLatticePosition);
partOfLayerInBounds = mesh_.bounds().contains(globalPosition);
if
(
findIndex(mesh_.cellZones()[cZ], mesh_.findCell(globalPosition))
!= -1
)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
}
}
else
{
// Place top and bottom caps.
for (iN.z() = -n; iN.z() <= n; iN.z() += 2*n)
{
for (iN.y() = -n; iN.y() <= n; iN.y()++)
{
for (iN.x() = -n; iN.x() <= n; iN.x()++)
{
latticePosition.x() = (iN.x() * gap.x());
latticePosition.y() = (iN.y() * gap.y());
latticePosition.z() = (iN.z() * gap.z());
for (label iU = 0; iU < 2; iU++)
{
vector unitCellLatticePosition = latticePosition;
if (iU == 1)
{
unitCellLatticePosition += 0.5*gap;
}
if(originSpecifies == "corner")
{
unitCellLatticePosition -= 0.25*gap;
}
// Info << nl << iN << ", " << unitCellLatticePosition;
globalPosition =
origin
+ transform(latticeToGlobal,unitCellLatticePosition);
partOfLayerInBounds =
mesh_.bounds().contains(globalPosition);
if
(
findIndex
(
mesh_.cellZones()[cZ],
mesh_.findCell(globalPosition)
)
!= -1)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
}
}
}
}
// Placing sides
for (iN.z() = -(n-1); iN.z() <= (n-1); iN.z()++)
{
for (label iR = 0; iR <= 2*n -1; iR++)
{
latticePosition.x() = (n*gap.x());
latticePosition.y() = ((-n + (iR + 1))*gap.y());
latticePosition.z() = (iN.z() * gap.z());
for (label iK = 0; iK < 4; iK++)
{
for (label iU = 0; iU < 2; iU++)
{
vector unitCellLatticePosition = latticePosition;
if (iU == 1)
{
unitCellLatticePosition += 0.5 * gap;
}
if (originSpecifies == "corner")
{
unitCellLatticePosition -= 0.25*gap;
}
globalPosition =
origin
+ transform(latticeToGlobal,unitCellLatticePosition);
partOfLayerInBounds =
mesh_.bounds().contains(globalPosition);
if
(
findIndex
(
mesh_.cellZones()[cZ],
mesh_.findCell(globalPosition)
)
!= -1
)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
}
latticePosition =
vector
(
- latticePosition.y(),
latticePosition.x(),
latticePosition.z()
);
}
}
}
}

View File

@ -1,217 +0,0 @@
labelVector iN(0,0,0);
vector gap = (vector::one)*pow((numberDensity/4.0),-(1.0/3.0));
#include "origin.H"
// Info<< "gap = " << gap << endl;
// Special treatment is required for the first position, i.e. iteration zero.
if (n == 0)
{
latticePosition.x() = (iN.x() * gap.x());
latticePosition.y() = (iN.y() * gap.y());
latticePosition.z() = (iN.z() * gap.z());
// Placing 4 molecules in each unit cell, using the algorithm from
// D. Rapaport, The Art of Molecular Dynamics Simulation, 2nd Ed, p68
for (label iU = 0; iU < 4; iU++)
{
vector unitCellLatticePosition = latticePosition;
if (iU != 3)
{
if (iU != 0)
{
unitCellLatticePosition.x() += 0.5 * gap.x();
}
if (iU != 1)
{
unitCellLatticePosition.y() += 0.5 * gap.y();
}
if (iU != 2)
{
unitCellLatticePosition.z() += 0.5 * gap.z();
}
}
if (originSpecifies == "corner")
{
unitCellLatticePosition -= 0.25*gap;
}
// Info << nl << n << ", " << unitCellLatticePosition;
globalPosition =
origin + transform(latticeToGlobal,unitCellLatticePosition);
partOfLayerInBounds = mesh_.bounds().contains(globalPosition);
if
(
findIndex(mesh_.cellZones()[cZ], mesh_.findCell(globalPosition))
!= -1
)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
}
}
else
{
// Place top and bottom caps.
for (iN.z() = -n; iN.z() <= n; iN.z() += 2*n)
{
for (iN.y() = -n; iN.y() <= n; iN.y()++)
{
for (iN.x() = -n; iN.x() <= n; iN.x()++)
{
latticePosition.x() = (iN.x() * gap.x());
latticePosition.y() = (iN.y() * gap.y());
latticePosition.z() = (iN.z() * gap.z());
for (label iU = 0; iU < 4; iU++)
{
vector unitCellLatticePosition = latticePosition;
if (iU != 3)
{
if (iU != 0)
{
unitCellLatticePosition.x() += 0.5 * gap.x();
}
if (iU != 1)
{
unitCellLatticePosition.y() += 0.5 * gap.y();
}
if (iU != 2)
{
unitCellLatticePosition.z() += 0.5 * gap.z();
}
}
if (originSpecifies == "corner")
{
unitCellLatticePosition -= 0.25*gap;
}
globalPosition =
origin
+ transform(latticeToGlobal,unitCellLatticePosition);
partOfLayerInBounds =
mesh_.bounds().contains(globalPosition);
if
(
findIndex
(
mesh_.cellZones()[cZ],
mesh_.findCell(globalPosition)
)
!= -1
)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
}
}
}
}
// Placing sides
for (iN.z() = -(n-1); iN.z() <= (n-1); iN.z()++)
{
for (label iR = 0; iR <= 2*n -1; iR++)
{
latticePosition.x() = (n * gap.x());
latticePosition.y() = ((-n + (iR + 1)) * gap.y());
latticePosition.z() = (iN.z() * gap.z());
for (label iK = 0; iK < 4; iK++)
{
for (label iU = 0; iU < 4; iU++)
{
vector unitCellLatticePosition = latticePosition;
if (iU != 3)
{
if (iU != 0)
{
unitCellLatticePosition.x() += 0.5 * gap.x();
}
if (iU != 1)
{
unitCellLatticePosition.y() += 0.5 * gap.y();
}
if (iU != 2)
{
unitCellLatticePosition.z() += 0.5 * gap.z();
}
}
if (originSpecifies == "corner")
{
unitCellLatticePosition -= 0.25*gap;
}
globalPosition =
origin
+ transform(latticeToGlobal,unitCellLatticePosition);
partOfLayerInBounds =
mesh_.bounds().contains(globalPosition);
if
(
findIndex
(
mesh_.cellZones()[cZ],
mesh_.findCell(globalPosition)
)
!= -1
)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
}
latticePosition =
vector
(
- latticePosition.y(),
latticePosition.x(),
latticePosition.z()
);
}
}
}
}

View File

@ -1,127 +0,0 @@
labelVector iN(0,0,0);
vector gap = (vector::one)*pow(numberDensity, -(1.0/3.0));
#include "origin.H"
// Info<< "gap = " << gap << endl;
// Special treatment is required for the first position, i.e. iteration zero.
if (n == 0)
{
latticePosition = vector::zero;
if (originSpecifies == "corner")
{
latticePosition += 0.5*gap;
}
globalPosition = origin + transform(latticeToGlobal,latticePosition);
partOfLayerInBounds = mesh_.bounds().contains(globalPosition);
if (findIndex(mesh_.cellZones()[cZ], mesh_.findCell(globalPosition)) != -1)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
}
else
{
for (iN.z() = -n; iN.z() <= n; iN.z() += 2*n)
{
for (iN.y() = -n; iN.y() <= n; iN.y()++)
{
for (iN.x() = -n; iN.x() <= n; iN.x()++)
{
latticePosition.x() = (iN.x() * gap.x());
latticePosition.y() = (iN.y() * gap.y());
latticePosition.z() = (iN.z() * gap.z());
if (originSpecifies == "corner")
{
latticePosition += 0.5*gap;
}
globalPosition =
origin + transform(latticeToGlobal,latticePosition);
partOfLayerInBounds = mesh_.bounds().contains(globalPosition);
if
(
findIndex
(
mesh_.cellZones()[cZ],
mesh_.findCell(globalPosition)
)
!= -1
)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
}
}
}
tensor quarterRotate(EulerCoordinateRotation(-90, 0, 0, true).R());
iN.x() = n;
for (iN.z() = -(n-1); iN.z() <= (n-1); iN.z()++)
{
for (iN.y() = -(n-1); iN.y() <= n; iN.y()++)
{
latticePosition.x() = (iN.x()*gap.x());
latticePosition.y() = (iN.y()*gap.y());
latticePosition.z() = (iN.z()*gap.z());
for (label iR = 0; iR < 4; iR++)
{
vector offsetCorrectedLatticePosition = latticePosition;
if (originSpecifies == "corner")
{
offsetCorrectedLatticePosition += 0.5*gap;
}
globalPosition =
origin
+ transform(latticeToGlobal,offsetCorrectedLatticePosition);
partOfLayerInBounds = mesh_.bounds().contains(globalPosition);
if
(
findIndex
(
mesh_.cellZones()[cZ],
mesh_.findCell(globalPosition)
)
!= -1
)
{
molsPlacedThisIteration++;
initialPositions.append(globalPosition);
initialCelli.append(mesh_.findCell(globalPosition));
}
latticePosition = transform(quarterRotate,latticePosition);
}
}
}
}

View File

@ -1,50 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "molConfig.H"
// * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
Foam::molConfig::molConfig
(
IOdictionary& molConfigDescription,
const polyMesh& mesh
)
:
molConfigDescription_(molConfigDescription),
mesh_(mesh)
{
createMolecules();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::molConfig::~molConfig()
{}
// ************************************************************************* //

View File

@ -1,49 +0,0 @@
// Please refer to notes
// 1. Determine the unit cell dimensions: xU, yU and zU
const scalar xU = gap.x();
const scalar yU = gap.y();
const scalar zU = gap.z();
// 2. Determine the anchorPoint co-ordinates: xA, yA and zA
const scalar xA = anchorPoint.x();
const scalar yA = anchorPoint.y();
const scalar zA = anchorPoint.z();
// 3. Determine the vector rAB from global co-ordinate system:
const vector rAB((xMid - xA), (yMid - yA), (zMid - zA));
// 4. Transform vector rAS into lattice co-ordinate system:
const vector rASTransf = transform(latticeToGlobal.T(), rAB);
// Info << "The vector rAS = " << rAS << endl;
// Info << "The vector rAStransf = " << rAStransf << endl;
// 5. Calculate the integer values: ni, nj and nk
scalar nIscalar = rASTransf.x()/xU;
scalar nJscalar = rASTransf.y()/yU;
scalar nKscalar = rASTransf.z()/zU;
// Info << "The nI, nJ, nK values before are: " << nIscalar <<" "<< nJscalar <<" "<< nKscalar << endl;
label nI = label(nIscalar + 0.5*sign(nIscalar));
label nJ = label(nJscalar + 0.5*sign(nJscalar));
label nK = label(nKscalar + 0.5*sign(nKscalar));
// Info << "The nI, nJ, nK values after are: " << nI <<" "<< nJ <<" "<< nK << endl;
// 6. Calculate the corrected starting point, rAC (in the lattice co-ordinate system):
const vector rAC((nI*xU), (nJ*yU), (nK*zU));
// 7. Transform the corrected starting point in the global co-ordinate system, rC:
const vector rC = anchorPoint + transform(latticeToGlobal, rAC);
const vector& origin = rC;
// Pout << "The Corrected Starting Point: " << origin << endl;

View File

@ -1,93 +0,0 @@
// Info << "Zone description subDict " << cZ <<": " << cellZoneI[cZ].name() << endl;
const dictionary& subDictI =
molConfigDescription_.subDict(cellZoneI[cZ].name());
const scalar temperature(readScalar(subDictI.lookup("temperature")));
const word velocityDistribution(subDictI.lookup("velocityDistribution"));
const vector bulkVelocity(subDictI.lookup("bulkVelocity"));
const word id(subDictI.lookup("id"));
const scalar mass(readScalar(subDictI.lookup("mass")));
scalar numberDensity_read(0.0);
if (subDictI.found("numberDensity"))
{
numberDensity_read = readScalar(subDictI.lookup("numberDensity"));
}
else if (subDictI.found("massDensity"))
{
numberDensity_read = readScalar(subDictI.lookup("massDensity"))/mass;
}
else
{
FatalErrorIn("readZoneSubDict.H\n")
<< "massDensity or numberDensity not specified " << nl
<< abort(FatalError);
}
const scalar numberDensity(numberDensity_read);
const word latticeStructure(subDictI.lookup("latticeStructure"));
const vector anchorPoint(subDictI.lookup("anchor"));
const word originSpecifies(subDictI.lookup("anchorSpecifies"));
if
(
originSpecifies != "corner"
&& originSpecifies != "molecule"
)
{
FatalErrorIn("readZoneSubDict.H\n")
<< "anchorSpecifies must be either 'corner' or 'molecule', found "
<< originSpecifies << nl
<< abort(FatalError);
}
bool tethered = false;
if (subDictI.found("tethered"))
{
tethered = Switch(subDictI.lookup("tethered"));
}
const vector orientationAngles(subDictI.lookup("orientationAngles"));
scalar phi(orientationAngles.x()*mathematicalConstant::pi/180.0);
scalar theta(orientationAngles.y()*mathematicalConstant::pi/180.0);
scalar psi(orientationAngles.z()*mathematicalConstant::pi/180.0);
const tensor latticeToGlobal
(
cos(psi)*cos(phi) - cos(theta)*sin(phi)*sin(psi),
cos(psi)*sin(phi) + cos(theta)*cos(phi)*sin(psi),
sin(psi)*sin(theta),
- sin(psi)*cos(phi) - cos(theta)*sin(phi)*cos(psi),
- sin(psi)*sin(phi) + cos(theta)*cos(phi)*cos(psi),
cos(psi)*sin(theta),
sin(theta)*sin(phi),
- sin(theta)*cos(phi),
cos(theta)
);
// Info << "\tcells: " << cellZoneI[cZ].size() << endl;
// Info << "\tnumberDensity: " << numberDensity << endl;
// Info << "\ttemperature: " << temperature << endl;
// Info << "\tvelocityDistribution: " << velocityDistribution << endl;
// Info << "\tbulkVelocity: " << bulkVelocity << endl;
// Info << "\tid: " << id << endl;
// Info << "\tmass: " << mass << endl;
// Info << "\tlatticeStructure: " << latticeStructure << endl;
// Info << "\tanchor: " << anchorPoint << endl;
// Info << "\toriginSpecifies: " << originSpecifies << endl;
// Info << "\ttethered: " << tethered << endl;
// Info << "\torientationAngles: " << orientationAngles << endl;
// Info << "\tlatticeToGlobal: " << latticeToGlobal << endl;

View File

@ -1,97 +0,0 @@
scalar xMax = 0;
scalar yMax = 0;
scalar zMax = 0;
scalar xMin = 0;
scalar yMin = 0;
scalar zMin = 0;
label xMaxPtLabel = 0;
label yMaxPtLabel = 0;
label zMaxPtLabel = 0;
label xMinPtLabel = 0;
label yMinPtLabel = 0;
label zMinPtLabel = 0;
forAll (cellZoneI[cZ], nC)
{
const labelList& cellPointsJ = mesh_.cellPoints()[cellZoneI[cZ][nC]];
forAll(cellPointsJ, nP)
{
const point& ptI = mesh_.points()[cellPointsJ[nP]];
const label& ptILabel = cellPointsJ[nP];
if (ptI.x() > xMax || nC == 0)
{
xMax = ptI.x();
xMaxPtLabel = ptILabel;
}
if (ptI.y() > yMax || nC == 0)
{
yMax = ptI.y();
yMaxPtLabel = ptILabel;
}
if (ptI.z() > zMax || nC == 0)
{
zMax = ptI.z();
zMaxPtLabel = ptILabel;
}
if (ptI.x() < xMin || nC == 0)
{
xMin = ptI.x();
xMinPtLabel = ptILabel;
}
if (ptI.y() < yMin || nC == 0)
{
yMin = ptI.y();
yMinPtLabel = ptILabel;
}
if (ptI.z() < zMin || nC == 0)
{
zMin = ptI.z();
zMinPtLabel = ptILabel;
}
}
}
// Info << "Xmax: label = " << xMaxPtLabel2 << "; vector = " <<mesh_.points()[xMaxPtLabel2]
// <<"; x-component = " << mesh_.points()[xMaxPtLabel2].x() << endl;
// Info << "Ymax: label = " << yMaxPtLabel2 << "; vector = " <<mesh_.points()[yMaxPtLabel2]
// <<"; y-component = " << mesh_.points()[yMaxPtLabel2].y() << endl;
// Info << "Zmax: label = " << zMaxPtLabel2 << "; vector = " <<mesh_.points()[zMaxPtLabel2]
// <<"; z-component = " << mesh_.points()[zMaxPtLabel2].z() << endl;
//
// Info << "Xmin: label = " << xMinPtLabel << "; vector = " <<mesh_.points()[xMinPtLabel]
// <<"; x-component = " << mesh_.points()[xMinPtLabel].x() << endl;
// Info << "Ymin: label = " << yMinPtLabel << "; vector = " <<mesh_.points()[yMinPtLabel]
// <<"; y-component = " << mesh_.points()[yMinPtLabel].y() << endl;
// Info << "Zmin: label = " << zMinPtLabel << "; vector = " <<mesh_.points()[zMinPtLabel]
// <<"; z-component = " << mesh_.points()[zMinPtLabel].z() << endl;
scalar xMid =
(mesh_.points()[xMaxPtLabel].x()
+ mesh_.points()[xMinPtLabel].x()) / 2;
scalar yMid =
(mesh_.points()[yMaxPtLabel].y()
+ mesh_.points()[yMinPtLabel].y()) / 2;
scalar zMid =
(mesh_.points()[zMaxPtLabel].z()
+ mesh_.points()[zMinPtLabel].z()) / 2;
vector rS(xMid, yMid, zMid);
// Info << "\t The Estimated Starting Point: " << rS << endl;

View File

@ -1,26 +0,0 @@
scalar velCmptMag = sqrt(moleculeCloud::kb*temperature/mass);
for (molN = totalMols; molN < totalMols + totalZoneMols; molN++)
{
// Assign velocity: random direction, magnitude determined by desired
// maxwellian distribution at temperature
// Temperature gradients could be created by specifying a gradient in the
// zone subDict, or by reading a field from a mesh.
// The velocities are treated on a zone-by-zone basis for the purposes of
// removal of bulk momentum - hence nMols becomes totalZoneMols
velocity = vector
(
velCmptMag*rand.GaussNormal(),
velCmptMag*rand.GaussNormal(),
velCmptMag*rand.GaussNormal()
);
momentumSum += mass*velocity;
initialVelocities.append(velocity);
}

View File

@ -1,27 +0,0 @@
scalar initVelMag =
sqrt
(
3.0*(1.0 - 1.0 / totalZoneMols)
*moleculeCloud::kb*temperature
/mass
);
for (molN = totalMols; molN < totalMols + totalZoneMols; molN++)
{
// Assign velocity: random direction, magnitude determined by desired
// temperature
// Temperature gradients could be created by specifying a gradient in the
// zone subDict, or by reading a field from a mesh.
// The velocities are treated on a zone-by-zone basis for the purposes of
// removal of bulk momentum - hence nMols becomes totalZoneMols
velocity = (2.0*rand.vector01() - vector::one);
velocity *= initVelMag/mag(velocity);
momentumSum += mass*velocity;
initialVelocities.append(velocity);
}

View File

@ -35,8 +35,6 @@ License
#include "BiIndirectList.H" #include "BiIndirectList.H"
#include "contiguous.H" #include "contiguous.H"
#include <algorithm>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
@ -442,34 +440,6 @@ void Foam::List<T>::transfer(SortableList<T>& a)
} }
template<class T>
void Foam::sort(List<T>& a)
{
std::sort(a.begin(), a.end());
}
template<class T, class Cmp>
void Foam::sort(List<T>& a, const Cmp& cmp)
{
std::sort(a.begin(), a.end(), cmp);
}
template<class T>
void Foam::stableSort(List<T>& a)
{
std::stable_sort(a.begin(), a.end());
}
template<class T, class Cmp>
void Foam::stableSort(List<T>& a, const Cmp& cmp)
{
std::stable_sort(a.begin(), a.end(), cmp);
}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
// Assignment to UList operator. Takes linear time. // Assignment to UList operator. Takes linear time.

View File

@ -248,18 +248,6 @@ public:
template<class T> template<class T>
List<T> readList(Istream&); List<T> readList(Istream&);
template<class T>
void sort(List<T>&);
template<class T, class Cmp>
void sort(List<T>&, const Cmp&);
template<class T>
void stableSort(List<T>&);
template<class T, class Cmp>
void stableSort(List<T>&, const Cmp&);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -30,6 +30,8 @@ License
#include "ListLoopM.H" #include "ListLoopM.H"
#include "contiguous.H" #include "contiguous.H"
#include <algorithm>
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class T> template<class T>
@ -116,6 +118,34 @@ Foam::label Foam::UList<T>::byteSize() const
} }
template<class T>
void Foam::sort(UList<T>& a)
{
std::sort(a.begin(), a.end());
}
template<class T, class Cmp>
void Foam::sort(UList<T>& a, const Cmp& cmp)
{
std::sort(a.begin(), a.end(), cmp);
}
template<class T>
void Foam::stableSort(UList<T>& a)
{
std::stable_sort(a.begin(), a.end());
}
template<class T, class Cmp>
void Foam::stableSort(UList<T>& a, const Cmp& cmp)
{
std::stable_sort(a.begin(), a.end(), cmp);
}
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
template<class T> template<class T>

View File

@ -320,6 +320,18 @@ public:
); );
}; };
template<class T>
void sort(UList<T>&);
template<class T, class Cmp>
void sort(UList<T>&, const Cmp&);
template<class T>
void stableSort(UList<T>&);
template<class T, class Cmp>
void stableSort(UList<T>&, const Cmp&);
// Reverse the first n elements of the list // Reverse the first n elements of the list
template<class T> template<class T>
inline void reverse(UList<T>&, const label n); inline void reverse(UList<T>&, const label n);

View File

@ -106,6 +106,15 @@ public:
//- Global sum of localSizes //- Global sum of localSizes
inline label size() const; inline label size() const;
//- Size of procI data
inline label localSize(const label procI) const;
//- From local to global on procI
inline label toGlobal(const label procI, const label i) const;
//- Is on processor procI
inline bool isLocal(const label procI, const label i) const;
//- From global to local on procI //- From global to local on procI
inline label toLocal(const label procI, const label i) const; inline label toLocal(const label procI, const label i) const;
@ -115,9 +124,6 @@ public:
//- Start of procI data //- Start of procI data
inline label offset(const label procI) const; inline label offset(const label procI) const;
//- Size of procI data
inline label localSize(const label procI) const;
// IOstream Operators // IOstream Operators

View File

@ -63,27 +63,39 @@ inline Foam::label Foam::globalIndex::size() const
} }
inline Foam::label Foam::globalIndex::toGlobal(const label i) const inline Foam::label Foam::globalIndex::toGlobal
(
const label procI,
const label i
) const
{ {
return return(procI == 0 ? i : i + offsets_[procI-1]);
(
Pstream::myProcNo() == 0
? i
: i + offsets_[Pstream::myProcNo()-1]
);
} }
inline Foam::label Foam::globalIndex::toGlobal(const label i) const
{
return toGlobal(Pstream::myProcNo(), i);
}
//- Is on local processor //- Is on local processor
inline bool Foam::globalIndex::isLocal(const label i) const inline bool Foam::globalIndex::isLocal(const label procI, const label i) const
{ {
return return
(i < offsets_[Pstream::myProcNo()]) (i < offsets_[procI])
&& (i >= (Pstream::myProcNo() == 0 ? 0 : offsets_[Pstream::myProcNo()-1])); && (i >= (procI == 0 ? 0 : offsets_[procI-1]));
}
inline bool Foam::globalIndex::isLocal(const label i) const
{
return isLocal(Pstream::myProcNo(), i);
} }
inline Foam::label Foam::globalIndex::toLocal(const label procI, const label i) inline Foam::label Foam::globalIndex::toLocal(const label procI, const label i)
const const
{ {
label localI = (procI == 0 ? i : i - offsets_[procI-1]); label localI = (procI == 0 ? i : i - offsets_[procI-1]);

View File

@ -32,7 +32,6 @@ Description
SourceFiles SourceFiles
coupledPolyPatch.C coupledPolyPatch.C
coupledPolyPatchMorph.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/

View File

@ -34,6 +34,7 @@ Description
#include "primitiveMesh.H" #include "primitiveMesh.H"
#include "demandDrivenData.H" #include "demandDrivenData.H"
#include "mapPolyMesh.H" #include "mapPolyMesh.H"
#include "syncTools.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -530,6 +531,87 @@ bool Foam::faceZone::checkDefinition(const bool report) const
} }
bool Foam::faceZone::checkParallelSync(const bool report) const
{
const polyMesh& mesh = zoneMesh().mesh();
const polyBoundaryMesh& bm = mesh.boundaryMesh();
bool boundaryError = false;
// Check that zone faces are synced
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{
boolList neiZoneFace(mesh.nFaces()-mesh.nInternalFaces(), false);
boolList neiZoneFlip(mesh.nFaces()-mesh.nInternalFaces(), false);
forAll(*this, i)
{
label faceI = operator[](i);
if (!mesh.isInternalFace(faceI))
{
neiZoneFace[faceI-mesh.nInternalFaces()] = true;
neiZoneFlip[faceI-mesh.nInternalFaces()] = flipMap()[i];
}
}
boolList myZoneFace(neiZoneFace);
syncTools::swapBoundaryFaceList(mesh, neiZoneFace, false);
boolList myZoneFlip(neiZoneFlip);
syncTools::swapBoundaryFaceList(mesh, neiZoneFlip, false);
forAll(*this, i)
{
label faceI = operator[](i);
label patchI = bm.whichPatch(faceI);
if (patchI != -1 && bm[patchI].coupled())
{
label bFaceI = faceI-mesh.nInternalFaces();
// Check face in zone on both sides
if (myZoneFace[bFaceI] != neiZoneFace[bFaceI])
{
boundaryError = true;
if (report)
{
Pout<< " ***Problem with faceZone " << index()
<< " named " << name()
<< ". Face " << faceI
<< " on coupled patch "
<< bm[patchI].name()
<< " is not consistent with its coupled neighbour."
<< endl;
}
}
// Flip state should be opposite.
if (myZoneFlip[bFaceI] == neiZoneFlip[bFaceI])
{
boundaryError = true;
if (report)
{
Pout<< " ***Problem with faceZone " << index()
<< " named " << name()
<< ". Face " << faceI
<< " on coupled patch "
<< bm[patchI].name()
<< " does not have consistent flipMap"
<< " across coupled faces."
<< endl;
}
}
}
}
}
return returnReduce(boundaryError, orOp<bool>());
}
void Foam::faceZone::movePoints(const pointField& p) void Foam::faceZone::movePoints(const pointField& p)
{ {
if (patchPtr_) if (patchPtr_)

View File

@ -302,6 +302,10 @@ public:
//- Check zone definition. Return true if in error. //- Check zone definition. Return true if in error.
bool checkDefinition(const bool report = false) const; bool checkDefinition(const bool report = false) const;
//- Check whether all procs have faces synchronised. Return
// true if in error.
bool checkParallelSync(const bool report = false) const;
//- Correct patch after moving points //- Correct patch after moving points
virtual void movePoints(const pointField&); virtual void movePoints(const pointField&);

View File

@ -607,6 +607,18 @@ inline bool triangle<Point, PointRef>::classify
// system E0, E1 // system E0, E1
// //
//Pout<< "alpha:" << alpha << endl;
//Pout<< "beta:" << beta << endl;
//Pout<< "hit:" << hit << endl;
//Pout<< "tol:" << tol << endl;
if (hit)
{
// alpha,beta might get negative due to precision errors
alpha = max(0.0, min(1.0, alpha));
beta = max(0.0, min(1.0, beta));
}
nearType = NONE; nearType = NONE;
nearLabel = -1; nearLabel = -1;

View File

@ -110,7 +110,7 @@ Foam::label Foam::meshRefinement::createBaffle
-1, // masterPointID -1, // masterPointID
-1, // masterEdgeID -1, // masterEdgeID
faceI, // masterFaceID, faceI, // masterFaceID,
false, // face flip true, // face flip
neiPatch, // patch for face neiPatch, // patch for face
zoneID, // zone for face zoneID, // zone for face
zoneFlip // face flip in zone zoneFlip // face flip in zone
@ -1017,7 +1017,7 @@ void Foam::meshRefinement::findCellZoneGeometric
if (namedSurfaceIndex[faceI] == -1 && (ownZone != neiZone)) if (namedSurfaceIndex[faceI] == -1 && (ownZone != neiZone))
{ {
// Give face the zone of the owner // Give face the zone of max cell zone
namedSurfaceIndex[faceI] = findIndex namedSurfaceIndex[faceI] = findIndex
( (
surfaceToCellZone, surfaceToCellZone,
@ -1059,7 +1059,7 @@ void Foam::meshRefinement::findCellZoneGeometric
if (namedSurfaceIndex[faceI] == -1 && (ownZone != neiZone)) if (namedSurfaceIndex[faceI] == -1 && (ownZone != neiZone))
{ {
// Give face the zone of the owner // Give face the max cell zone
namedSurfaceIndex[faceI] = findIndex namedSurfaceIndex[faceI] = findIndex
( (
surfaceToCellZone, surfaceToCellZone,
@ -2211,16 +2211,14 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify
{ {
label faceI = testFaces[i]; label faceI = testFaces[i];
label own = mesh_.faceOwner()[faceI];
if (mesh_.isInternalFace(faceI)) if (mesh_.isInternalFace(faceI))
{ {
start[i] = cellCentres[own]; start[i] = cellCentres[faceOwner[faceI]];
end[i] = cellCentres[mesh_.faceNeighbour()[faceI]]; end[i] = cellCentres[faceNeighbour[faceI]];
} }
else else
{ {
start[i] = cellCentres[own]; start[i] = cellCentres[faceOwner[faceI]];
end[i] = neiCc[faceI-mesh_.nInternalFaces()]; end[i] = neiCc[faceI-mesh_.nInternalFaces()];
} }
} }
@ -2357,6 +2355,20 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify
if (surfI != -1) if (surfI != -1)
{ {
// Orient face zone to have slave cells in max cell zone.
label ownZone = cellToZone[faceOwner[faceI]];
label neiZone = cellToZone[faceNeighbour[faceI]];
bool flip;
if (ownZone == max(ownZone, neiZone))
{
flip = false;
}
else
{
flip = true;
}
meshMod.setAction meshMod.setAction
( (
polyModifyFace polyModifyFace
@ -2369,12 +2381,31 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify
-1, // patch for face -1, // patch for face
false, // remove from zone false, // remove from zone
surfaceToFaceZone[surfI], // zone for face surfaceToFaceZone[surfI], // zone for face
false // face flip in zone flip // face flip in zone
) )
); );
} }
} }
// Get coupled neighbour cellZone. Set to -1 on non-coupled patches.
labelList neiCellZone(mesh_.nFaces()-mesh_.nInternalFaces(), -1);
forAll(patches, patchI)
{
const polyPatch& pp = patches[patchI];
if (pp.coupled())
{
forAll(pp, i)
{
label faceI = pp.start()+i;
neiCellZone[faceI-mesh_.nInternalFaces()] =
cellToZone[mesh_.faceOwner()[faceI]];
}
}
}
syncTools::swapBoundaryFaceList(mesh_, neiCellZone, false);
// Set owner as no-flip
forAll(patches, patchI) forAll(patches, patchI)
{ {
const polyPatch& pp = patches[patchI]; const polyPatch& pp = patches[patchI];
@ -2387,6 +2418,19 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify
if (surfI != -1) if (surfI != -1)
{ {
label ownZone = cellToZone[faceOwner[faceI]];
label neiZone = neiCellZone[faceI-mesh_.nInternalFaces()];
bool flip;
if (ownZone == max(ownZone, neiZone))
{
flip = false;
}
else
{
flip = true;
}
meshMod.setAction meshMod.setAction
( (
polyModifyFace polyModifyFace
@ -2399,7 +2443,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::meshRefinement::zonify
patchI, // patch for face patchI, // patch for face
false, // remove from zone false, // remove from zone
surfaceToFaceZone[surfI], // zone for face surfaceToFaceZone[surfI], // zone for face
false // face flip in zone flip // face flip in zone
) )
); );
} }

View File

@ -159,7 +159,7 @@ public:
// return nRegions_; // return nRegions_;
//} //}
//- Per point that is to duplicated to the local index //- Per point that is to be duplicated the local index
const Map<label>& meshPointMap() const const Map<label>& meshPointMap() const
{ {
return meshPointMap_; return meshPointMap_;

View File

@ -58,23 +58,6 @@ const Foam::point Foam::polyTopoChange::greatPoint
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// Renumber
void Foam::polyTopoChange::renumber
(
const labelList& map,
DynamicList<label>& elems
)
{
forAll(elems, elemI)
{
if (elems[elemI] >= 0)
{
elems[elemI] = map[elems[elemI]];
}
}
}
// Renumber with special handling for merged items (marked with <-1) // Renumber with special handling for merged items (marked with <-1)
void Foam::polyTopoChange::renumberReverseMap void Foam::polyTopoChange::renumberReverseMap
( (
@ -208,6 +191,20 @@ void Foam::polyTopoChange::countMap
} }
Foam::labelHashSet Foam::polyTopoChange::getSetIndices(const PackedBoolList& lst)
{
labelHashSet values(lst.count());
forAll(lst, i)
{
if (lst[i])
{
values.insert(i);
}
}
return values;
}
void Foam::polyTopoChange::writeMeshStats(const polyMesh& mesh, Ostream& os) void Foam::polyTopoChange::writeMeshStats(const polyMesh& mesh, Ostream& os)
{ {
const polyBoundaryMesh& patches = mesh.boundaryMesh(); const polyBoundaryMesh& patches = mesh.boundaryMesh();
@ -782,9 +779,11 @@ void Foam::polyTopoChange::reorderCompactFaces
renumberKey(oldToNew, faceFromPoint_); renumberKey(oldToNew, faceFromPoint_);
renumberKey(oldToNew, faceFromEdge_); renumberKey(oldToNew, faceFromEdge_);
renumber(oldToNew, flipFaceFlux_); inplaceReorder(oldToNew, flipFaceFlux_);
flipFaceFlux_.setCapacity(newSize);
renumberKey(oldToNew, faceZone_); renumberKey(oldToNew, faceZone_);
renumberKey(oldToNew, faceZoneFlip_); inplaceReorder(oldToNew, faceZoneFlip_);
faceZoneFlip_.setCapacity(newSize);
} }
@ -1097,6 +1096,18 @@ void Foam::polyTopoChange::compact
{ {
faces_[faceI] = faces_[faceI].reverseFace(); faces_[faceI] = faces_[faceI].reverseFace();
Swap(faceOwner_[faceI], faceNeighbour_[faceI]); Swap(faceOwner_[faceI], faceNeighbour_[faceI]);
flipFaceFlux_[faceI] =
(
flipFaceFlux_[faceI]
? 0
: 1
);
faceZoneFlip_[faceI] =
(
faceZoneFlip_[faceI]
? 0
: 1
);
} }
} }
} }
@ -2302,9 +2313,9 @@ void Foam::polyTopoChange::addMesh
faceMap_.setCapacity(faceMap_.size() + nAllFaces); faceMap_.setCapacity(faceMap_.size() + nAllFaces);
faceFromPoint_.resize(faceFromPoint_.size() + nAllFaces/100); faceFromPoint_.resize(faceFromPoint_.size() + nAllFaces/100);
faceFromEdge_.resize(faceFromEdge_.size() + nAllFaces/100); faceFromEdge_.resize(faceFromEdge_.size() + nAllFaces/100);
flipFaceFlux_.resize(flipFaceFlux_.size() + nAllFaces/100); flipFaceFlux_.setCapacity(faces_.size() + nAllFaces);
faceZone_.resize(faceZone_.size() + nAllFaces/100); faceZone_.resize(faceZone_.size() + nAllFaces/100);
faceZoneFlip_.resize(faceZoneFlip_.size() + nAllFaces/100); faceZoneFlip_.setCapacity(faces_.size() + nAllFaces);
// Precalc offset zones // Precalc offset zones
@ -2716,16 +2727,13 @@ Foam::label Foam::polyTopoChange::addFace
} }
reverseFaceMap_.append(faceI); reverseFaceMap_.append(faceI);
if (flipFaceFlux) flipFaceFlux_[faceI] = (flipFaceFlux ? 1 : 0);
{
flipFaceFlux_.insert(faceI);
}
if (zoneID >= 0) if (zoneID >= 0)
{ {
faceZone_.insert(faceI, zoneID); faceZone_.insert(faceI, zoneID);
faceZoneFlip_.insert(faceI, zoneFlip);
} }
faceZoneFlip_[faceI] = (zoneFlip ? 1 : 0);
return faceI; return faceI;
} }
@ -2754,14 +2762,7 @@ void Foam::polyTopoChange::modifyFace
faceNeighbour_[faceI] = nei; faceNeighbour_[faceI] = nei;
region_[faceI] = patchID; region_[faceI] = patchID;
if (flipFaceFlux) flipFaceFlux_[faceI] = (flipFaceFlux ? 1 : 0);
{
flipFaceFlux_.insert(faceI);
}
else
{
flipFaceFlux_.erase(faceI);
}
Map<label>::iterator faceFnd = faceZone_.find(faceI); Map<label>::iterator faceFnd = faceZone_.find(faceI);
@ -2770,19 +2771,17 @@ void Foam::polyTopoChange::modifyFace
if (zoneID >= 0) if (zoneID >= 0)
{ {
faceFnd() = zoneID; faceFnd() = zoneID;
faceZoneFlip_.find(faceI)() = zoneFlip;
} }
else else
{ {
faceZone_.erase(faceFnd); faceZone_.erase(faceFnd);
faceZoneFlip_.erase(faceI);
} }
} }
else if (zoneID >= 0) else if (zoneID >= 0)
{ {
faceZone_.insert(faceI, zoneID); faceZone_.insert(faceI, zoneID);
faceZoneFlip_.insert(faceI, zoneFlip);
} }
faceZoneFlip_[faceI] = (zoneFlip ? 1 : 0);
} }
@ -2823,9 +2822,9 @@ void Foam::polyTopoChange::removeFace(const label faceI, const label mergeFaceI)
} }
faceFromEdge_.erase(faceI); faceFromEdge_.erase(faceI);
faceFromPoint_.erase(faceI); faceFromPoint_.erase(faceI);
flipFaceFlux_.erase(faceI); flipFaceFlux_[faceI] = 0;
faceZone_.erase(faceI); faceZone_.erase(faceI);
faceZoneFlip_.erase(faceI); faceZoneFlip_[faceI] = 0;
} }
@ -3119,6 +3118,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::changeMesh
labelListList faceZonePointMap(mesh.faceZones().size()); labelListList faceZonePointMap(mesh.faceZones().size());
calcFaceZonePointMap(mesh, oldFaceZoneMeshPointMaps, faceZonePointMap); calcFaceZonePointMap(mesh, oldFaceZoneMeshPointMaps, faceZonePointMap);
labelHashSet flipFaceFluxSet(getSetIndices(flipFaceFlux_));
return autoPtr<mapPolyMesh> return autoPtr<mapPolyMesh>
( (
@ -3147,7 +3147,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::changeMesh
reverseFaceMap_, reverseFaceMap_,
reverseCellMap_, reverseCellMap_,
flipFaceFlux_, flipFaceFluxSet,
patchPointMap, patchPointMap,
@ -3410,6 +3410,8 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::makeMesh
writeMeshStats(mesh, Pout); writeMeshStats(mesh, Pout);
} }
labelHashSet flipFaceFluxSet(getSetIndices(flipFaceFlux_));
return autoPtr<mapPolyMesh> return autoPtr<mapPolyMesh>
( (
new mapPolyMesh new mapPolyMesh
@ -3437,7 +3439,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::makeMesh
reverseFaceMap_, reverseFaceMap_,
reverseCellMap_, reverseCellMap_,
flipFaceFlux_, flipFaceFluxSet,
patchPointMap, patchPointMap,

View File

@ -171,13 +171,13 @@ class polyTopoChange
Map<label> faceFromEdge_; Map<label> faceFromEdge_;
//- In mapping whether to reverse the flux. //- In mapping whether to reverse the flux.
labelHashSet flipFaceFlux_; PackedBoolList flipFaceFlux_;
//- Zone of face //- Zone of face
Map<label> faceZone_; Map<label> faceZone_;
//- Orientation of face in zone //- Orientation of face in zone
Map<bool> faceZoneFlip_; PackedBoolList faceZoneFlip_;
//- Active faces //- Active faces
label nActiveFaces_; label nActiveFaces_;
@ -216,8 +216,7 @@ class polyTopoChange
template<class T> template<class T>
static void renumberKey(const labelList& map, Map<T>&); static void renumberKey(const labelList& map, Map<T>&);
//- Renumber elements of list according to map //- Renumber elements of container according to map
static void renumber(const labelList&, DynamicList<label>&);
static void renumber(const labelList&, labelHashSet&); static void renumber(const labelList&, labelHashSet&);
//- Special handling of reverse maps which have <-1 in them //- Special handling of reverse maps which have <-1 in them
static void renumberReverseMap(const labelList&, DynamicList<label>&); static void renumberReverseMap(const labelList&, DynamicList<label>&);
@ -225,6 +224,9 @@ class polyTopoChange
//- Renumber & compact elements of list according to map //- Renumber & compact elements of list according to map
static void renumberCompact(const labelList&, labelList&); static void renumberCompact(const labelList&, labelList&);
//- Get all set elements as a labelHashSet
static labelHashSet getSetIndices(const PackedBoolList&);
//- Count number of added and removed quantities from maps. //- Count number of added and removed quantities from maps.
static void countMap static void countMap
( (

View File

@ -109,7 +109,6 @@ $(derivedFvPatchFields)/directMappedFixedValue/directMappedFixedValueFvPatchFiel
$(derivedFvPatchFields)/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C $(derivedFvPatchFields)/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C
$(derivedFvPatchFields)/fan/fanFvPatchFields.C $(derivedFvPatchFields)/fan/fanFvPatchFields.C
$(derivedFvPatchFields)/fixedFluxBuoyantPressure/fixedFluxBuoyantPressureFvPatchScalarField.C $(derivedFvPatchFields)/fixedFluxBuoyantPressure/fixedFluxBuoyantPressureFvPatchScalarField.C
$(derivedFvPatchFields)/fixedFluxBoussinesqBuoyantPressure/fixedFluxBoussinesqBuoyantPressureFvPatchScalarField.C
$(derivedFvPatchFields)/fixedFluxPressure/fixedFluxPressureFvPatchScalarField.C $(derivedFvPatchFields)/fixedFluxPressure/fixedFluxPressureFvPatchScalarField.C
$(derivedFvPatchFields)/fixedInternalValueFvPatchField/fixedInternalValueFvPatchFields.C $(derivedFvPatchFields)/fixedInternalValueFvPatchField/fixedInternalValueFvPatchFields.C
$(derivedFvPatchFields)/fixedNormalSlip/fixedNormalSlipFvPatchFields.C $(derivedFvPatchFields)/fixedNormalSlip/fixedNormalSlipFvPatchFields.C
@ -148,6 +147,7 @@ $(derivedFvPatchFields)/turbulentInlet/turbulentInletFvPatchFields.C
$(derivedFvPatchFields)/turbulentIntensityKineticEnergyInlet/turbulentIntensityKineticEnergyInletFvPatchScalarField.C $(derivedFvPatchFields)/turbulentIntensityKineticEnergyInlet/turbulentIntensityKineticEnergyInletFvPatchScalarField.C
$(derivedFvPatchFields)/uniformFixedValue/uniformFixedValueFvPatchFields.C $(derivedFvPatchFields)/uniformFixedValue/uniformFixedValueFvPatchFields.C
$(derivedFvPatchFields)/waveTransmissive/waveTransmissiveFvPatchFields.C $(derivedFvPatchFields)/waveTransmissive/waveTransmissiveFvPatchFields.C
$(derivedFvPatchFields)/uniformDensityHydrostaticPressure/uniformDensityHydrostaticPressureFvPatchScalarField.C
fvsPatchFields = fields/fvsPatchFields fvsPatchFields = fields/fvsPatchFields
$(fvsPatchFields)/fvsPatchField/fvsPatchFields.C $(fvsPatchFields)/fvsPatchField/fvsPatchFields.C

View File

@ -92,6 +92,7 @@ void Foam::setRefCell
dict dict
) << "Unable to set reference cell for field " << field.name() ) << "Unable to set reference cell for field " << field.name()
<< nl << " Reference point " << refPointName << nl << " Reference point " << refPointName
<< " " << refPointi
<< " found on " << sumHasRef << " domains (should be one)" << " found on " << sumHasRef << " domains (should be one)"
<< nl << exit(FatalIOError); << nl << exit(FatalIOError);
} }

View File

@ -1,149 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "fixedFluxBoussinesqBuoyantPressureFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField::
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
fixedGradientFvPatchScalarField(p, iF)
{}
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField::
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField
(
const fixedFluxBoussinesqBuoyantPressureFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
fixedGradientFvPatchScalarField(ptf, p, iF, mapper)
{}
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField::
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary&
)
:
fixedGradientFvPatchScalarField(p, iF)
{
fvPatchField<scalar>::operator=(patchInternalField());
gradient() = 0.0;
}
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField::
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField
(
const fixedFluxBoussinesqBuoyantPressureFvPatchScalarField& wbppsf
)
:
fixedGradientFvPatchScalarField(wbppsf)
{}
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField::
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField
(
const fixedFluxBoussinesqBuoyantPressureFvPatchScalarField& wbppsf,
const DimensionedField<scalar, volMesh>& iF
)
:
fixedGradientFvPatchScalarField(wbppsf, iF)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void fixedFluxBoussinesqBuoyantPressureFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
const dictionary& environmentalProperties
= db().lookupObject<IOdictionary>("environmentalProperties");
dimensionedVector g(environmentalProperties.lookup("g"));
const dictionary& transportProperties
= db().lookupObject<IOdictionary>("transportProperties");
dimensionedScalar beta(transportProperties.lookup("beta"));
const fvPatchField<scalar>& T =
patch().lookupPatchField<volScalarField, scalar>("T");
gradient() = beta.value()*T.snGrad()*(g.value() & patch().Cf());
fixedGradientFvPatchScalarField::updateCoeffs();
}
void fixedFluxBoussinesqBuoyantPressureFvPatchScalarField::write
(
Ostream& os
) const
{
fixedGradientFvPatchScalarField::write(os);
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePatchTypeField
(
fvPatchScalarField,
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField
);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View File

@ -43,10 +43,27 @@ fixedFluxBuoyantPressureFvPatchScalarField
const DimensionedField<scalar, volMesh>& iF const DimensionedField<scalar, volMesh>& iF
) )
: :
fixedGradientFvPatchScalarField(p, iF) fixedGradientFvPatchScalarField(p, iF),
rhoName_("rho")
{} {}
fixedFluxBuoyantPressureFvPatchScalarField::
fixedFluxBuoyantPressureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
fixedGradientFvPatchScalarField(p, iF),
rhoName_(dict.lookupOrDefault<word>("rho", "rho"))
{
fvPatchField<scalar>::operator=(patchInternalField());
gradient() = 0.0;
}
fixedFluxBuoyantPressureFvPatchScalarField:: fixedFluxBuoyantPressureFvPatchScalarField::
fixedFluxBuoyantPressureFvPatchScalarField fixedFluxBuoyantPressureFvPatchScalarField
( (
@ -56,43 +73,31 @@ fixedFluxBuoyantPressureFvPatchScalarField
const fvPatchFieldMapper& mapper const fvPatchFieldMapper& mapper
) )
: :
fixedGradientFvPatchScalarField(ptf, p, iF, mapper) fixedGradientFvPatchScalarField(ptf, p, iF, mapper),
rhoName_(ptf.rhoName_)
{} {}
fixedFluxBuoyantPressureFvPatchScalarField:: fixedFluxBuoyantPressureFvPatchScalarField::
fixedFluxBuoyantPressureFvPatchScalarField fixedFluxBuoyantPressureFvPatchScalarField
( (
const fvPatch& p, const fixedFluxBuoyantPressureFvPatchScalarField& ptf
const DimensionedField<scalar, volMesh>& iF,
const dictionary&
) )
: :
fixedGradientFvPatchScalarField(p, iF) fixedGradientFvPatchScalarField(ptf),
{ rhoName_(ptf.rhoName_)
fvPatchField<scalar>::operator=(patchInternalField());
gradient() = 0.0;
}
fixedFluxBuoyantPressureFvPatchScalarField::
fixedFluxBuoyantPressureFvPatchScalarField
(
const fixedFluxBuoyantPressureFvPatchScalarField& wbppsf
)
:
fixedGradientFvPatchScalarField(wbppsf)
{} {}
fixedFluxBuoyantPressureFvPatchScalarField:: fixedFluxBuoyantPressureFvPatchScalarField::
fixedFluxBuoyantPressureFvPatchScalarField fixedFluxBuoyantPressureFvPatchScalarField
( (
const fixedFluxBuoyantPressureFvPatchScalarField& wbppsf, const fixedFluxBuoyantPressureFvPatchScalarField& ptf,
const DimensionedField<scalar, volMesh>& iF const DimensionedField<scalar, volMesh>& iF
) )
: :
fixedGradientFvPatchScalarField(wbppsf, iF) fixedGradientFvPatchScalarField(ptf, iF),
rhoName_(ptf.rhoName_)
{} {}
@ -111,7 +116,7 @@ void fixedFluxBuoyantPressureFvPatchScalarField::updateCoeffs()
dimensionedVector g(environmentalProperties.lookup("g")); dimensionedVector g(environmentalProperties.lookup("g"));
const fvPatchField<scalar>& rho = const fvPatchField<scalar>& rho =
patch().lookupPatchField<volScalarField, scalar>("rho"); patch().lookupPatchField<volScalarField, scalar>(rhoName_);
// If the variable name is "pd" assume it is p - rho*g.h // If the variable name is "pd" assume it is p - rho*g.h
// and set the gradient appropriately. // and set the gradient appropriately.
@ -132,6 +137,7 @@ void fixedFluxBuoyantPressureFvPatchScalarField::updateCoeffs()
void fixedFluxBuoyantPressureFvPatchScalarField::write(Ostream& os) const void fixedFluxBuoyantPressureFvPatchScalarField::write(Ostream& os) const
{ {
fixedGradientFvPatchScalarField::write(os); fixedGradientFvPatchScalarField::write(os);
os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl;
writeEntry("value", os); writeEntry("value", os);
} }

View File

@ -55,6 +55,11 @@ class fixedFluxBuoyantPressureFvPatchScalarField
: :
public fixedGradientFvPatchScalarField public fixedGradientFvPatchScalarField
{ {
// Private data
//- Name of the density field used to calculate the buoyancy force
word rhoName_;
public: public:

View File

@ -30,7 +30,6 @@ License
#include "volFields.H" #include "volFields.H"
#include "surfaceFields.H" #include "surfaceFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //

View File

@ -0,0 +1,168 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "uniformDensityHydrostaticPressureFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "surfaceFields.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::uniformDensityHydrostaticPressureFvPatchScalarField::
uniformDensityHydrostaticPressureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF
)
:
fixedValueFvPatchScalarField(p, iF),
rho_(0.0),
pRefValue_(0.0),
pRefPoint_(vector::zero)
{}
Foam::uniformDensityHydrostaticPressureFvPatchScalarField::
uniformDensityHydrostaticPressureFvPatchScalarField
(
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const dictionary& dict
)
:
fixedValueFvPatchScalarField(p, iF),
rho_(readScalar(dict.lookup("rho"))),
pRefValue_(readScalar(dict.lookup("pRefValue"))),
pRefPoint_(dict.lookup("pRefPoint"))
{
if (dict.found("value"))
{
fvPatchField<scalar>::operator=
(
scalarField("value", dict, p.size())
);
}
else
{
evaluate();
}
}
Foam::uniformDensityHydrostaticPressureFvPatchScalarField::
uniformDensityHydrostaticPressureFvPatchScalarField
(
const uniformDensityHydrostaticPressureFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField<scalar, volMesh>& iF,
const fvPatchFieldMapper& mapper
)
:
fixedValueFvPatchScalarField(ptf, p, iF, mapper),
rho_(ptf.rho_),
pRefValue_(ptf.pRefValue_),
pRefPoint_(ptf.pRefPoint_)
{}
Foam::uniformDensityHydrostaticPressureFvPatchScalarField::
uniformDensityHydrostaticPressureFvPatchScalarField
(
const uniformDensityHydrostaticPressureFvPatchScalarField& ptf
)
:
fixedValueFvPatchScalarField(ptf),
rho_(ptf.rho_),
pRefValue_(ptf.pRefValue_),
pRefPoint_(ptf.pRefPoint_)
{}
Foam::uniformDensityHydrostaticPressureFvPatchScalarField::
uniformDensityHydrostaticPressureFvPatchScalarField
(
const uniformDensityHydrostaticPressureFvPatchScalarField& ptf,
const DimensionedField<scalar, volMesh>& iF
)
:
fixedValueFvPatchScalarField(ptf, iF),
rho_(ptf.rho_),
pRefValue_(ptf.pRefValue_),
pRefPoint_(ptf.pRefPoint_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::uniformDensityHydrostaticPressureFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
const dictionary& environmentalProperties
= db().lookupObject<IOdictionary>("environmentalProperties");
dimensionedVector g(environmentalProperties.lookup("g"));
operator==
(
pRefValue_
+ rho_*((g.value() & patch().Cf()) - (g.value() & pRefPoint_))
);
fixedValueFvPatchScalarField::updateCoeffs();
}
void Foam::uniformDensityHydrostaticPressureFvPatchScalarField::write
(
Ostream& os
) const
{
fvPatchScalarField::write(os);
os.writeKeyword("rho") << rho_ << token::END_STATEMENT << nl;
os.writeKeyword("pRefValue") << pRefValue_ << token::END_STATEMENT << nl;
os.writeKeyword("pRefPoint") << pRefPoint_ << token::END_STATEMENT << nl;
writeEntry("value", os);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
makePatchTypeField
(
fvPatchScalarField,
uniformDensityHydrostaticPressureFvPatchScalarField
);
}
// ************************************************************************* //

View File

@ -23,23 +23,24 @@ License
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class Class
Foam::fixedFluxBoussinesqBuoyantPressureFvPatchScalarField Foam::uniformDensityHydrostaticPressureFvPatchScalarField
Description Description
Boundary condition on pressure for use with buoyant solvers employing the Hydrostatic pressure boundary condition calculated as
Boussinesq approximation to balance the flux generated by the temperature
gradient. pRefValue + rho*g.(x - pRefPoint)
where rho is provided and assumed uniform.
SourceFiles SourceFiles
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField.C uniformDensityHydrostaticPressureFvPatchScalarField.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef fixedFluxBoussinesqBuoyantPressureFvPatchScalarFields_H #ifndef uniformDensityHydrostaticPressureFvPatchScalarField_H
#define fixedFluxBoussinesqBuoyantPressureFvPatchScalarFields_H #define uniformDensityHydrostaticPressureFvPatchScalarField_H
#include "fvPatchFields.H" #include "fixedValueFvPatchFields.H"
#include "fixedGradientFvPatchFields.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -47,30 +48,42 @@ namespace Foam
{ {
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class fixedFluxBoussinesqBuoyantPressureFvPatchScalarField Declaration Class uniformDensityHydrostaticPressureFvPatch Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class fixedFluxBoussinesqBuoyantPressureFvPatchScalarField class uniformDensityHydrostaticPressureFvPatchScalarField
: :
public fixedGradientFvPatchScalarField public fixedValueFvPatchScalarField
{ {
// Private data
//- Constant density in the far-field
scalar rho_;
//- Reference pressure
scalar pRefValue_;
//- Reference pressure location
vector pRefPoint_;
public: public:
//- Runtime type information //- Runtime type information
TypeName("fixedFluxBoussinesqBuoyantPressure"); TypeName("uniformDensityHydrostaticPressure");
// Constructors // Constructors
//- Construct from patch and internal field //- Construct from patch and internal field
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField uniformDensityHydrostaticPressureFvPatchScalarField
( (
const fvPatch&, const fvPatch&,
const DimensionedField<scalar, volMesh>& const DimensionedField<scalar, volMesh>&
); );
//- Construct from patch, internal field and dictionary //- Construct from patch, internal field and dictionary
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField uniformDensityHydrostaticPressureFvPatchScalarField
( (
const fvPatch&, const fvPatch&,
const DimensionedField<scalar, volMesh>&, const DimensionedField<scalar, volMesh>&,
@ -78,20 +91,19 @@ public:
); );
//- Construct by mapping given //- Construct by mapping given
// fixedFluxBoussinesqBuoyantPressureFvPatchScalarField onto a new // uniformDensityHydrostaticPressureFvPatchScalarField onto a new patch
// patch uniformDensityHydrostaticPressureFvPatchScalarField
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField
( (
const fixedFluxBoussinesqBuoyantPressureFvPatchScalarField&, const uniformDensityHydrostaticPressureFvPatchScalarField&,
const fvPatch&, const fvPatch&,
const DimensionedField<scalar, volMesh>&, const DimensionedField<scalar, volMesh>&,
const fvPatchFieldMapper& const fvPatchFieldMapper&
); );
//- Construct as copy //- Construct as copy
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField uniformDensityHydrostaticPressureFvPatchScalarField
( (
const fixedFluxBoussinesqBuoyantPressureFvPatchScalarField& const uniformDensityHydrostaticPressureFvPatchScalarField&
); );
//- Construct and return a clone //- Construct and return a clone
@ -99,14 +111,14 @@ public:
{ {
return tmp<fvPatchScalarField> return tmp<fvPatchScalarField>
( (
new fixedFluxBoussinesqBuoyantPressureFvPatchScalarField(*this) new uniformDensityHydrostaticPressureFvPatchScalarField(*this)
); );
} }
//- Construct as copy setting internal field reference //- Construct as copy setting internal field reference
fixedFluxBoussinesqBuoyantPressureFvPatchScalarField uniformDensityHydrostaticPressureFvPatchScalarField
( (
const fixedFluxBoussinesqBuoyantPressureFvPatchScalarField&, const uniformDensityHydrostaticPressureFvPatchScalarField&,
const DimensionedField<scalar, volMesh>& const DimensionedField<scalar, volMesh>&
); );
@ -118,7 +130,7 @@ public:
{ {
return tmp<fvPatchScalarField> return tmp<fvPatchScalarField>
( (
new fixedFluxBoussinesqBuoyantPressureFvPatchScalarField new uniformDensityHydrostaticPressureFvPatchScalarField
( (
*this, *this,
iF iF
@ -129,8 +141,52 @@ public:
// Member functions // Member functions
//- Update the coefficients associated with the patch field // Access
virtual void updateCoeffs();
//- Return the constant density in the far-field
scalar rho() const
{
return rho_;
}
//- Return reference to the constant density in the far-field
// to allow adjustment
scalar& rho()
{
return rho_;
}
//- Return the reference pressure
scalar pRefValue() const
{
return pRefValue_;
}
//- Return reference to the reference pressure to allow adjustment
scalar& pRefValue()
{
return pRefValue_;
}
//- Return the pressure reference location
const vector& pRefPoint() const
{
return pRefPoint_;
}
//- Return reference to the pressure reference location
// to allow adjustment
vector& pRefPoint()
{
return pRefPoint_;
}
// Evaluation functions
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
//- Write //- Write
virtual void write(Ostream&) const; virtual void write(Ostream&) const;

View File

@ -30,5 +30,6 @@ pointPatchFields/derived/angularOscillatingVelocity/angularOscillatingVelocityPo
pointPatchFields/derived/oscillatingDisplacement/oscillatingDisplacementPointPatchVectorField.C pointPatchFields/derived/oscillatingDisplacement/oscillatingDisplacementPointPatchVectorField.C
pointPatchFields/derived/angularOscillatingDisplacement/angularOscillatingDisplacementPointPatchVectorField.C pointPatchFields/derived/angularOscillatingDisplacement/angularOscillatingDisplacementPointPatchVectorField.C
pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.C pointPatchFields/derived/surfaceSlipDisplacement/surfaceSlipDisplacementPointPatchVectorField.C
pointPatchFields/derived/surfaceDisplacement/surfaceDisplacementPointPatchVectorField.C
LIB = $(FOAM_LIBBIN)/libfvMotionSolvers LIB = $(FOAM_LIBBIN)/libfvMotionSolvers

View File

@ -0,0 +1,514 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "surfaceDisplacementPointPatchVectorField.H"
#include "addToRunTimeSelectionTable.H"
#include "Time.H"
#include "transformField.H"
#include "fvMesh.H"
#include "displacementLaplacianFvMotionSolver.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
template<>
const char*
NamedEnum<surfaceDisplacementPointPatchVectorField::projectMode, 3>::
names[] =
{
"nearest",
"pointNormal",
"fixedNormal"
};
const NamedEnum<surfaceDisplacementPointPatchVectorField::projectMode, 3>
surfaceDisplacementPointPatchVectorField::projectModeNames_;
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void surfaceDisplacementPointPatchVectorField::calcProjection
(
vectorField& displacement
) const
{
const polyMesh& mesh = patch().boundaryMesh().mesh()();
const pointField& localPoints = patch().localPoints();
const labelList& meshPoints = patch().meshPoints();
//const scalar deltaT = mesh.time().deltaT().value();
// Construct large enough vector in direction of projectDir so
// we're guaranteed to hit something.
//- Per point projection vector:
const scalar projectLen = mag(mesh.bounds().max()-mesh.bounds().min());
// For case of fixed projection vector:
vector projectVec;
if (projectMode_ == FIXEDNORMAL)
{
vector n = projectDir_/mag(projectDir_);
projectVec = projectLen*n;
}
// Get fixed points (bit of a hack)
const pointZone* zonePtr = NULL;
if (frozenPointsZone_.size() > 0)
{
const pointZoneMesh& pZones = mesh.pointZones();
zonePtr = &pZones[pZones.findZoneID(frozenPointsZone_)];
Pout<< "surfaceDisplacementPointPatchVectorField : Fixing all "
<< zonePtr->size() << " points in pointZone " << zonePtr->name()
<< endl;
}
// Get the starting locations from the motionSolver
const pointField& points0 = mesh.lookupObject<displacementFvMotionSolver>
(
"dynamicMeshDict"
).points0();
pointField start(meshPoints.size());
forAll(start, i)
{
start[i] = points0[meshPoints[i]] + displacement[i];
}
label nNotProjected = 0;
if (projectMode_ == NEAREST)
{
List<pointIndexHit> nearest;
labelList hitSurfaces;
surfaces().findNearest
(
start,
scalarField(start.size(), sqr(projectLen)),
hitSurfaces,
nearest
);
forAll(nearest, i)
{
if (zonePtr && (zonePtr->whichPoint(meshPoints[i]) >= 0))
{
// Fixed point. Reset to point0 location.
displacement[i] = points0[meshPoints[i]] - localPoints[i];
}
else if (nearest[i].hit())
{
displacement[i] =
nearest[i].hitPoint()
- points0[meshPoints[i]];
}
else
{
nNotProjected++;
if (debug)
{
Pout<< " point:" << meshPoints[i]
<< " coord:" << localPoints[i]
<< " did not find any surface within " << projectLen
<< endl;
}
}
}
}
else
{
// Do tests on all points. Combine later on.
// 1. Check if already on surface
List<pointIndexHit> nearest;
{
labelList nearestSurface;
surfaces().findNearest
(
start,
scalarField(start.size(), sqr(SMALL)),
nearestSurface,
nearest
);
}
// 2. intersection. (combined later on with information from nearest
// above)
vectorField projectVecs(start.size(), projectVec);
if (projectMode_ == POINTNORMAL)
{
projectVecs = projectLen*patch().pointNormals();
}
// Knock out any wedge component
scalarField offset(start.size(), 0.0);
if (wedgePlane_ >= 0 && wedgePlane_ <= vector::nComponents)
{
forAll(offset, i)
{
offset[i] = start[i][wedgePlane_];
start[i][wedgePlane_] = 0;
projectVecs[i][wedgePlane_] = 0;
}
}
List<pointIndexHit> rightHit;
{
labelList rightSurf;
surfaces().findAnyIntersection
(
start,
start+projectVecs,
rightSurf,
rightHit
);
}
List<pointIndexHit> leftHit;
{
labelList leftSurf;
surfaces().findAnyIntersection
(
start,
start-projectVecs,
leftSurf,
leftHit
);
}
// 3. Choose either -fixed, nearest, right, left.
forAll(displacement, i)
{
if (zonePtr && (zonePtr->whichPoint(meshPoints[i]) >= 0))
{
// Fixed point. Reset to point0 location.
displacement[i] = points0[meshPoints[i]] - localPoints[i];
}
else if (nearest[i].hit())
{
// Found nearest.
displacement[i] =
nearest[i].hitPoint()
- points0[meshPoints[i]];
}
else
{
pointIndexHit interPt;
if (rightHit[i].hit())
{
if (leftHit[i].hit())
{
if
(
magSqr(rightHit[i].hitPoint()-start[i])
< magSqr(leftHit[i].hitPoint()-start[i])
)
{
interPt = rightHit[i];
}
else
{
interPt = leftHit[i];
}
}
else
{
interPt = rightHit[i];
}
}
else
{
if (leftHit[i].hit())
{
interPt = leftHit[i];
}
}
if (interPt.hit())
{
if (wedgePlane_ >= 0 && wedgePlane_ <= vector::nComponents)
{
interPt.rawPoint()[wedgePlane_] += offset[i];
}
displacement[i] = interPt.rawPoint()-points0[meshPoints[i]];
}
else
{
nNotProjected++;
if (debug)
{
Pout<< " point:" << meshPoints[i]
<< " coord:" << localPoints[i]
<< " did not find any intersection between"
<< " ray from " << start[i]-projectVecs[i]
<< " to " << start[i]+projectVecs[i] << endl;
}
}
}
}
}
reduce(nNotProjected, sumOp<label>());
if (nNotProjected > 0)
{
Info<< "surfaceDisplacement :"
<< " on patch " << patch().name()
<< " did not project " << nNotProjected
<< " out of " << returnReduce(localPoints.size(), sumOp<label>())
<< " points." << endl;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
surfaceDisplacementPointPatchVectorField::
surfaceDisplacementPointPatchVectorField
(
const pointPatch& p,
const DimensionedField<vector, pointMesh>& iF
)
:
fixedValuePointPatchVectorField(p, iF),
velocity_(vector::zero),
projectMode_(NEAREST),
projectDir_(vector::zero),
wedgePlane_(-1)
{}
surfaceDisplacementPointPatchVectorField::
surfaceDisplacementPointPatchVectorField
(
const pointPatch& p,
const DimensionedField<vector, pointMesh>& iF,
const dictionary& dict
)
:
fixedValuePointPatchVectorField(p, iF, dict),
velocity_(dict.lookup("velocity")),
surfacesDict_(dict.subDict("geometry")),
projectMode_(projectModeNames_.read(dict.lookup("projectMode"))),
projectDir_(dict.lookup("projectDirection")),
wedgePlane_(readLabel(dict.lookup("wedgePlane"))),
frozenPointsZone_(dict.lookupOrDefault("frozenPointsZone", word::null))
{
if (velocity_.x() < 0 || velocity_.y() < 0 || velocity_.z() < 0)
{
FatalErrorIn
(
"surfaceDisplacementPointPatchVectorField::\n"
"surfaceDisplacementPointPatchVectorField\n"
"(\n"
" const pointPatch& p,\n"
" const DimensionedField<vector, pointMesh>& iF,\n"
" const dictionary& dict\n"
")\n"
) << "All components of velocity have to be positive : "
<< velocity_ << nl
<< "Set velocity components to a great value if no clipping"
<< " necessary." << exit(FatalError);
}
}
surfaceDisplacementPointPatchVectorField::
surfaceDisplacementPointPatchVectorField
(
const surfaceDisplacementPointPatchVectorField& ppf,
const pointPatch& p,
const DimensionedField<vector, pointMesh>& iF,
const pointPatchFieldMapper& mapper
)
:
fixedValuePointPatchVectorField(ppf, p, iF, mapper),
velocity_(ppf.velocity_),
surfacesDict_(ppf.surfacesDict_),
projectMode_(ppf.projectMode_),
projectDir_(ppf.projectDir_),
wedgePlane_(ppf.wedgePlane_),
frozenPointsZone_(ppf.frozenPointsZone_)
{}
surfaceDisplacementPointPatchVectorField::
surfaceDisplacementPointPatchVectorField
(
const surfaceDisplacementPointPatchVectorField& ppf
)
:
fixedValuePointPatchVectorField(ppf),
velocity_(ppf.velocity_),
surfacesDict_(ppf.surfacesDict_),
projectMode_(ppf.projectMode_),
projectDir_(ppf.projectDir_),
wedgePlane_(ppf.wedgePlane_),
frozenPointsZone_(ppf.frozenPointsZone_)
{}
surfaceDisplacementPointPatchVectorField::
surfaceDisplacementPointPatchVectorField
(
const surfaceDisplacementPointPatchVectorField& ppf,
const DimensionedField<vector, pointMesh>& iF
)
:
fixedValuePointPatchVectorField(ppf, iF),
velocity_(ppf.velocity_),
surfacesDict_(ppf.surfacesDict_),
projectMode_(ppf.projectMode_),
projectDir_(ppf.projectDir_),
wedgePlane_(ppf.wedgePlane_),
frozenPointsZone_(ppf.frozenPointsZone_)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
const searchableSurfaces&
surfaceDisplacementPointPatchVectorField::surfaces() const
{
if (surfacesPtr_.empty())
{
surfacesPtr_.reset
(
new searchableSurfaces
(
IOobject
(
"abc", // dummy name
db().time().constant(), // directory
"triSurface", // instance
db().time(), // registry
IOobject::MUST_READ,
IOobject::NO_WRITE
),
surfacesDict_
)
);
}
return surfacesPtr_();
}
void surfaceDisplacementPointPatchVectorField::updateCoeffs()
{
if (this->updated())
{
return;
}
const polyMesh& mesh = patch().boundaryMesh().mesh()();
vectorField currentDisplacement = this->patchInternalField();
// Calculate intersections with surface w.r.t points0.
vectorField displacement(currentDisplacement);
calcProjection(displacement);
// offset wrt current displacement
vectorField offset = displacement-currentDisplacement;
// Clip offset to maximum displacement possible: velocity*timestep
const scalar deltaT = mesh.time().deltaT().value();
const vector clipVelocity = velocity_*deltaT;
forAll(displacement, i)
{
vector& d = offset[i];
for (direction cmpt = 0; cmpt < vector::nComponents; cmpt++)
{
if (d[cmpt] < 0)
{
d[cmpt] = max(d[cmpt], -clipVelocity[cmpt]);
}
else
{
d[cmpt] = min(d[cmpt], clipVelocity[cmpt]);
}
}
}
this->operator==(currentDisplacement+offset);
fixedValuePointPatchVectorField::updateCoeffs();
}
void surfaceDisplacementPointPatchVectorField::write(Ostream& os) const
{
fixedValuePointPatchVectorField::write(os);
os.writeKeyword("velocity") << velocity_
<< token::END_STATEMENT << nl;
os.writeKeyword("geometry") << surfacesDict_
<< token::END_STATEMENT << nl;
os.writeKeyword("projectMode") << projectModeNames_[projectMode_]
<< token::END_STATEMENT << nl;
os.writeKeyword("projectDirection") << projectDir_
<< token::END_STATEMENT << nl;
os.writeKeyword("wedgePlane") << wedgePlane_
<< token::END_STATEMENT << nl;
if (frozenPointsZone_ != word::null)
{
os.writeKeyword("frozenPointsZone") << frozenPointsZone_
<< token::END_STATEMENT << nl;
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
makePointPatchTypeField
(
fixedValuePointPatchVectorField,
surfaceDisplacementPointPatchVectorField
);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

View File

@ -0,0 +1,223 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class
surfaceDisplacementPointPatchVectorField
Description
Displacement fixed by projection onto triSurface.
Use in a displacement fvMotionSolver
as a bc on the pointDisplacement field.
Calculates the projection onto the surface according
to the projectMode
- NEAREST : nearest
- POINTNORMAL : intersection with point normal
- FIXEDNORMAL : intersection with fixed vector
This displacement is then clipped with the specified velocity * deltaT.
Optionally (intersection only) removes a component ("wedgePlane") to
stay in 2D.
Needs:
- geometry : dictionary with searchableSurfaces. (usually
triSurfaceMeshes in constant/triSurface)
- projectMode : see above
- projectDirection : if projectMode = fixedNormal
- wedgePlane : -1 or component to knock out of intersection normal
- frozenPointsZone : empty or name of pointZone containing points
that do not move
SourceFiles
surfaceDisplacementPointPatchVectorField.C
\*---------------------------------------------------------------------------*/
#ifndef surfaceDisplacementPointPatchVectorField_H
#define surfaceDisplacementPointPatchVectorField_H
#include "pointPatchFields.H"
#include "fixedValuePointPatchFields.H"
#include "searchableSurfaces.H"
#include "Switch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class surfaceDisplacementPointPatchVectorField Declaration
\*---------------------------------------------------------------------------*/
class surfaceDisplacementPointPatchVectorField
:
public fixedValuePointPatchVectorField
{
public:
// Public data types
enum projectMode
{
NEAREST,
POINTNORMAL,
FIXEDNORMAL
};
private:
// Private data
//- project mode names
static const NamedEnum<projectMode, 3> projectModeNames_;
//- Maximum velocity
const vector velocity_;
//- names of surfaces
const dictionary surfacesDict_;
//- How to project/project onto surface
const projectMode projectMode_;
//- direction to project
const vector projectDir_;
//- plane for 2D wedge case or -1.
const label wedgePlane_;
//- pointZone with frozen points
const word frozenPointsZone_;
//- Demand driven: surface to project
mutable autoPtr<searchableSurfaces> surfacesPtr_;
// Private Member Functions
//- Calculate displacement (w.r.t. points0()) to project onto surface
void calcProjection(vectorField& displacement) const;
//- Disallow default bitwise assignment
void operator=(const surfaceDisplacementPointPatchVectorField&);
public:
//- Runtime type information
TypeName("surfaceDisplacement");
// Constructors
//- Construct from patch and internal field
surfaceDisplacementPointPatchVectorField
(
const pointPatch&,
const DimensionedField<vector, pointMesh>&
);
//- Construct from patch, internal field and dictionary
surfaceDisplacementPointPatchVectorField
(
const pointPatch&,
const DimensionedField<vector, pointMesh>&,
const dictionary&
);
//- Construct by mapping given patchField<vector> onto a new patch
surfaceDisplacementPointPatchVectorField
(
const surfaceDisplacementPointPatchVectorField&,
const pointPatch&,
const DimensionedField<vector, pointMesh>&,
const pointPatchFieldMapper&
);
//- Construct as copy
surfaceDisplacementPointPatchVectorField
(
const surfaceDisplacementPointPatchVectorField&
);
//- Construct and return a clone
virtual autoPtr<pointPatchVectorField> clone() const
{
return autoPtr<pointPatchVectorField>
(
new surfaceDisplacementPointPatchVectorField
(
*this
)
);
}
//- Construct as copy setting internal field reference
surfaceDisplacementPointPatchVectorField
(
const surfaceDisplacementPointPatchVectorField&,
const DimensionedField<vector, pointMesh>&
);
//- Construct and return a clone setting internal field reference
virtual autoPtr<pointPatchVectorField> clone
(
const DimensionedField<vector, pointMesh>& iF
) const
{
return autoPtr<pointPatchVectorField>
(
new surfaceDisplacementPointPatchVectorField
(
*this,
iF
)
);
}
// Member Functions
//- Surface to follow. Demand loads surfaceNames.
const searchableSurfaces& surfaces() const;
//- Update the coefficients associated with the patch field
virtual void updateCoeffs();
//- Write
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -40,7 +40,7 @@ namespace Foam
template<> template<>
const char* const char*
NamedEnum<surfaceSlipDisplacementPointPatchVectorField::followMode, 3>:: NamedEnum<surfaceSlipDisplacementPointPatchVectorField::projectMode, 3>::
names[] = names[] =
{ {
"nearest", "nearest",
@ -48,8 +48,8 @@ names[] =
"fixedNormal" "fixedNormal"
}; };
const NamedEnum<surfaceSlipDisplacementPointPatchVectorField::followMode, 3> const NamedEnum<surfaceSlipDisplacementPointPatchVectorField::projectMode, 3>
surfaceSlipDisplacementPointPatchVectorField::followModeNames_; surfaceSlipDisplacementPointPatchVectorField::projectModeNames_;
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
@ -95,12 +95,10 @@ void surfaceSlipDisplacementPointPatchVectorField::calcProjection
} }
// Get the starting locations from the motionSolver // Get the starting locations from the motionSolver
const displacementFvMotionSolver& motionSolver = const pointField& points0 = mesh.lookupObject<displacementFvMotionSolver>
mesh.lookupObject<displacementFvMotionSolver> (
( "dynamicMeshDict"
"dynamicMeshDict" ).points0();
);
const pointField& points0 = motionSolver.points0();
pointField start(meshPoints.size()); pointField start(meshPoints.size());
@ -326,7 +324,7 @@ surfaceSlipDisplacementPointPatchVectorField
: :
pointPatchVectorField(p, iF, dict), pointPatchVectorField(p, iF, dict),
surfacesDict_(dict.subDict("geometry")), surfacesDict_(dict.subDict("geometry")),
projectMode_(followModeNames_.read(dict.lookup("followMode"))), projectMode_(projectModeNames_.read(dict.lookup("projectMode"))),
projectDir_(dict.lookup("projectDirection")), projectDir_(dict.lookup("projectDirection")),
wedgePlane_(readLabel(dict.lookup("wedgePlane"))), wedgePlane_(readLabel(dict.lookup("wedgePlane"))),
frozenPointsZone_(dict.lookupOrDefault("frozenPointsZone", word::null)) frozenPointsZone_(dict.lookupOrDefault("frozenPointsZone", word::null))
@ -343,11 +341,11 @@ surfaceSlipDisplacementPointPatchVectorField
) )
: :
pointPatchVectorField(p, iF), pointPatchVectorField(p, iF),
surfacesDict_(ppf.surfacesDict()), surfacesDict_(ppf.surfacesDict_),
projectMode_(ppf.projectMode()), projectMode_(ppf.projectMode_),
projectDir_(ppf.projectDir()), projectDir_(ppf.projectDir_),
wedgePlane_(ppf.wedgePlane()), wedgePlane_(ppf.wedgePlane_),
frozenPointsZone_(ppf.frozenPointsZone()) frozenPointsZone_(ppf.frozenPointsZone_)
{} {}
@ -358,11 +356,11 @@ surfaceSlipDisplacementPointPatchVectorField
) )
: :
pointPatchVectorField(ppf), pointPatchVectorField(ppf),
surfacesDict_(ppf.surfacesDict()), surfacesDict_(ppf.surfacesDict_),
projectMode_(ppf.projectMode()), projectMode_(ppf.projectMode_),
projectDir_(ppf.projectDir()), projectDir_(ppf.projectDir_),
wedgePlane_(ppf.wedgePlane()), wedgePlane_(ppf.wedgePlane_),
frozenPointsZone_(ppf.frozenPointsZone()) frozenPointsZone_(ppf.frozenPointsZone_)
{} {}
@ -374,11 +372,11 @@ surfaceSlipDisplacementPointPatchVectorField
) )
: :
pointPatchVectorField(ppf, iF), pointPatchVectorField(ppf, iF),
surfacesDict_(ppf.surfacesDict()), surfacesDict_(ppf.surfacesDict_),
projectMode_(ppf.projectMode()), projectMode_(ppf.projectMode_),
projectDir_(ppf.projectDir()), projectDir_(ppf.projectDir_),
wedgePlane_(ppf.wedgePlane()), wedgePlane_(ppf.wedgePlane_),
frozenPointsZone_(ppf.frozenPointsZone()) frozenPointsZone_(ppf.frozenPointsZone_)
{} {}
@ -435,7 +433,7 @@ void surfaceSlipDisplacementPointPatchVectorField::write(Ostream& os) const
pointPatchVectorField::write(os); pointPatchVectorField::write(os);
os.writeKeyword("geometry") << surfacesDict_ os.writeKeyword("geometry") << surfacesDict_
<< token::END_STATEMENT << nl; << token::END_STATEMENT << nl;
os.writeKeyword("followMode") << followModeNames_[projectMode_] os.writeKeyword("projectMode") << projectModeNames_[projectMode_]
<< token::END_STATEMENT << nl; << token::END_STATEMENT << nl;
os.writeKeyword("projectDirection") << projectDir_ os.writeKeyword("projectDirection") << projectDir_
<< token::END_STATEMENT << nl; << token::END_STATEMENT << nl;

View File

@ -26,8 +26,10 @@ Class
Foam::surfaceSlipDisplacementPointPatchVectorField Foam::surfaceSlipDisplacementPointPatchVectorField
Description Description
Displacement follows a triSurface. Use in a displacement fvMotionSolver. Displacement follows a triSurface. Use in a displacement fvMotionSolver
Following is either as a bc on the pointDisplacement field.
Following is done by calculating the projection onto the surface according
to the projectMode
- NEAREST : nearest - NEAREST : nearest
- POINTNORMAL : intersection with point normal - POINTNORMAL : intersection with point normal
- FIXEDNORMAL : intersection with fixed vector - FIXEDNORMAL : intersection with fixed vector
@ -36,9 +38,10 @@ Description
stay in 2D. stay in 2D.
Needs: Needs:
- projectSurfaces : names of triSurfaceMeshes (in constant/triSurface) - geometry : dictionary with searchableSurfaces. (usually
- followMode : see above triSurfaceMeshes in constant/triSurface)
- projectDirection : if followMode = fixedNormal - projectMode : see above
- projectDirection : if projectMode = fixedNormal
- wedgePlane : -1 or component to knock out of intersection normal - wedgePlane : -1 or component to knock out of intersection normal
- frozenPointsZone : empty or name of pointZone containing points - frozenPointsZone : empty or name of pointZone containing points
that do not move that do not move
@ -72,7 +75,7 @@ public:
// Public data types // Public data types
enum followMode enum projectMode
{ {
NEAREST, NEAREST,
POINTNORMAL, POINTNORMAL,
@ -83,14 +86,14 @@ private:
// Private data // Private data
//- follow mode names //- project mode names
static const NamedEnum<followMode, 3> followModeNames_; static const NamedEnum<projectMode, 3> projectModeNames_;
//- names of surfaces //- names of surfaces
const dictionary surfacesDict_; const dictionary surfacesDict_;
//- How to follow/project onto surface //- How to project/project onto surface
const followMode projectMode_; const projectMode projectMode_;
//- direction to project //- direction to project
const vector projectDir_; const vector projectDir_;
@ -101,13 +104,13 @@ private:
//- pointZone with frozen points //- pointZone with frozen points
const word frozenPointsZone_; const word frozenPointsZone_;
//- Demand driven: surface to follow //- Demand driven: surface to project
mutable autoPtr<searchableSurfaces> surfacesPtr_; mutable autoPtr<searchableSurfaces> surfacesPtr_;
// Private Member Functions // Private Member Functions
//- Calculate displacement to project onto surface //- Calculate displacement (w.r.t. points0()) to project onto surface
void calcProjection(vectorField& displacement) const; void calcProjection(vectorField& displacement) const;
//- Disallow default bitwise assignment //- Disallow default bitwise assignment
@ -189,40 +192,9 @@ public:
// Member Functions // Member Functions
//- Surfaces to follow
const dictionary& surfacesDict() const
{
return surfacesDict_;
}
//- Surface to follow. Demand loads surfaceNames. //- Surface to follow. Demand loads surfaceNames.
const searchableSurfaces& surfaces() const; const searchableSurfaces& surfaces() const;
//- Mode of projection/following
followMode projectMode() const
{
return projectMode_;
}
//- Direction to project back onto surface
const vector& projectDir() const
{
return projectDir_;
}
//- Normal of wedgeplane (0, 1, 2) or -1. Note: should be obtained
// from twoDPointCorrector.
label wedgePlane() const
{
return wedgePlane_;
}
//- Zone containing frozen points
const word& frozenPointsZone() const
{
return frozenPointsZone_;
}
//- Update the patch field //- Update the patch field
virtual void evaluate virtual void evaluate
( (

View File

@ -152,26 +152,26 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#define makeBinaryCollisionModel(CloudType) \ #define makeBinaryCollisionModel(CloudType) \
\ \
defineNamedTemplateTypeNameAndDebug \ defineNamedTemplateTypeNameAndDebug \
( \ ( \
BinaryCollisionModel<CloudType>, \ BinaryCollisionModel<CloudType>, \
0 \ 0 \
); \ ); \
\ \
defineTemplateRunTimeSelectionTable \ defineTemplateRunTimeSelectionTable \
( \ ( \
BinaryCollisionModel<CloudType>, \ BinaryCollisionModel<CloudType>, \
dictionary \ dictionary \
); );
#define makeBinaryCollisionModelType(SS, CloudType, ParcelType) \ #define makeBinaryCollisionModelType(SS, CloudType, ParcelType) \
\ \
defineNamedTemplateTypeNameAndDebug(SS<CloudType<ParcelType> >, 0); \ defineNamedTemplateTypeNameAndDebug(SS<CloudType<ParcelType> >, 0); \
\ \
BinaryCollisionModel<CloudType<ParcelType> >:: \ BinaryCollisionModel<CloudType<ParcelType> >:: \
adddictionaryConstructorToTable<SS<CloudType<ParcelType> > > \ adddictionaryConstructorToTable<SS<CloudType<ParcelType> > > \
add##SS##CloudType##ParcelType##ConstructorToTable_; add##SS##CloudType##ParcelType##ConstructorToTable_;

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -126,6 +126,7 @@ void Foam::bufferedAccumulator<Type>::setSizes
} }
} }
template<class Type> template<class Type>
Foam::label Foam::bufferedAccumulator<Type>::addToBuffers Foam::label Foam::bufferedAccumulator<Type>::addToBuffers
( (
@ -184,11 +185,10 @@ Foam::Field<Type> Foam::bufferedAccumulator<Type>::averaged() const
WarningIn WarningIn
( (
"bufferedAccumulator<Type>::averagedbufferedAccumulator() const" "bufferedAccumulator<Type>::averagedbufferedAccumulator() const"
) ) << "Averaged correlation function requested but averagesTaken = "
<< "Averaged correlation function requested but averagesTaken = " << averagesTaken_
<< averagesTaken_ << ". Returning empty field."
<< ". Returning empty field." << endl;
<< endl;
return Field<Type>(bufferLength(), pTraits<Type>::zero); return Field<Type>(bufferLength(), pTraits<Type>::zero);
} }
@ -218,8 +218,7 @@ void Foam::bufferedAccumulator<Type>::operator=
FatalErrorIn FatalErrorIn
( (
"bufferedAccumulator<Type>::operator=(const bufferedAccumulator&)" "bufferedAccumulator<Type>::operator=(const bufferedAccumulator&)"
) ) << "Attempted assignment to self"
<< "Attempted assignment to self"
<< abort(FatalError); << abort(FatalError);
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -34,9 +34,9 @@ Foam::Ostream&
Foam::operator<<(Ostream& os, const bufferedAccumulator<Type>& bA) Foam::operator<<(Ostream& os, const bufferedAccumulator<Type>& bA)
{ {
os<< bA.averagesTaken_ os << bA.averagesTaken_
<< static_cast<const List< Field<Type> >&>(bA) << static_cast<const List< Field<Type> >&>(bA)
<< bA.bufferOffsets(); << bA.bufferOffsets();
// Check state of Ostream // Check state of Ostream
os.check os.check

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -138,7 +138,7 @@ void Foam::correlationFunction<Type>::calculateCorrelationFunction
FatalErrorIn("correlationFunction<Type>::calculateCorrelationFunction") FatalErrorIn("correlationFunction<Type>::calculateCorrelationFunction")
<< "Trying to supply a Field of length" << "Trying to supply a Field of length"
<< currentValues.size() << currentValues.size()
<<" to calculate the correlation function. " << " to calculate the correlation function. "
<< "Expecting a Field of length " << "Expecting a Field of length "
<< measurandFieldSize() << nl << measurandFieldSize() << nl
<< abort(FatalError); << abort(FatalError);
@ -205,7 +205,7 @@ Foam::scalar Foam::correlationFunction<Type>::integral() const
scalar cFIntegral = 0.0; scalar cFIntegral = 0.0;
for(label v = 0; v < averageCF.size() - 1; v++) for (label v = 0; v < averageCF.size() - 1; v++)
{ {
cFIntegral += cFIntegral +=
0.5 0.5

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -155,7 +155,10 @@ public:
// IOstream Operators // IOstream Operators
friend Ostream& operator<< <Type> friend Ostream& operator<< <Type>
(Ostream&, const correlationFunction<Type>&); (
Ostream&,
const correlationFunction<Type>&
);
}; };

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -34,10 +34,10 @@ bool Foam::correlationFunction<Type>::writeAveraged(Ostream& os) const
forAll(averageCF, v) forAll(averageCF, v)
{ {
os<< v*sampleInterval() os << v*sampleInterval()
<< token::SPACE << token::SPACE
<< averageCF[v] << averageCF[v]
<< nl; << nl;
} }
return os.good(); return os.good();
@ -51,12 +51,12 @@ Foam::Ostream& Foam::operator<<
const correlationFunction<Type>& cF const correlationFunction<Type>& cF
) )
{ {
os<< cF.duration() os << cF.duration()
<< nl << cF.sampleInterval() << nl << cF.sampleInterval()
<< nl << cF.averagingInterval() << nl << cF.averagingInterval()
<< nl << cF.sampleSteps() << nl << cF.sampleSteps()
<< nl << cF.tZeroBuffers() << nl << cF.tZeroBuffers()
<< nl << static_cast<const bufferedAccumulator<scalar>&>(cF); << nl << static_cast<const bufferedAccumulator<scalar>&>(cF);
// Check state of Ostream // Check state of Ostream
os.check os.check

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -75,7 +75,7 @@ label distribution::totalEntries() const
<< "sumOfEntries = " << sumOfEntries << "sumOfEntries = " << sumOfEntries
<< ". This is most likely to be because too many samples " << ". This is most likely to be because too many samples "
<< "have been added to the bins and the label has 'rolled " << "have been added to the bins and the label has 'rolled "
<< "round'. Try distribution::approxTotalEntries which " << "round'. Try distribution::approxTotalEntries which "
<< "returns a scalar." << endl; << "returns a scalar." << endl;
sumOfEntries = -1; sumOfEntries = -1;
@ -336,8 +336,8 @@ List< Pair<scalar> > distribution::normalisedShifted(const scalar shiftValue)
*(oldDist[u].second() - oldDist[u-1].second()) *(oldDist[u].second() - oldDist[u-1].second())
+ +
( (
oldDist[u-1].second() * oldDist[u].first() oldDist[u-1].second()*oldDist[u].first()
- oldDist[u].second() * oldDist[u-1].first() - oldDist[u].second()*oldDist[u-1].first()
) )
/binWidth_; /binWidth_;
} }
@ -348,7 +348,7 @@ List< Pair<scalar> > distribution::normalisedShifted(const scalar shiftValue)
{ {
newDist[u].second() = newDist[u].second() =
(0.5 + scalar(newKey))*-oldDist[u].second() (0.5 + scalar(newKey))*-oldDist[u].second()
+ oldDist[u].second() * (oldDist[u].first() + binWidth_) + oldDist[u].second()*(oldDist[u].first() + binWidth_)
/binWidth_; /binWidth_;
} }
else else
@ -358,8 +358,8 @@ List< Pair<scalar> > distribution::normalisedShifted(const scalar shiftValue)
*(oldDist[u+1].second() - oldDist[u].second()) *(oldDist[u+1].second() - oldDist[u].second())
+ +
( (
oldDist[u].second() * oldDist[u+1].first() oldDist[u].second()*oldDist[u+1].first()
- oldDist[u+1].second() * oldDist[u].first() - oldDist[u+1].second()*oldDist[u].first()
) )
/binWidth_; /binWidth_;
} }
@ -395,7 +395,7 @@ List<Pair<scalar> > distribution::raw()
{ {
label key = keys[k]; label key = keys[k];
rawDist[k].first() = (0.5 + scalar(key)) * binWidth_; rawDist[k].first() = (0.5 + scalar(key))*binWidth_;
rawDist[k].second() = scalar((*this)[key]); rawDist[k].second() = scalar((*this)[key]);
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -30,7 +30,6 @@ Description
SourceFiles SourceFiles
distributionI.H distributionI.H
distribution.C distribution.C
distributionIO.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -46,7 +45,7 @@ namespace Foam
{ {
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class distribution Declaration Class distribution Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class distribution class distribution

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -1,35 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "distribution.H"
#include "IOstreams.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// construct from Istream
// ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -79,8 +79,12 @@ void Foam::directInteractionList::buildDirectInteractionList
{ {
if if
( (
findIndex(directInteractionList[cellI], findIndex
cellJ) == -1 (
directInteractionList[cellI],
cellJ
)
== -1
) )
{ {
directInteractionList[cellI].append(cellJ); directInteractionList[cellI].append(cellJ);
@ -91,8 +95,13 @@ void Foam::directInteractionList::buildDirectInteractionList
{ {
if if
( (
findIndex(directInteractionList[cellJ], findIndex
cellI) == -1 (
directInteractionList[cellJ],
cellI
)
==
-1
) )
{ {
directInteractionList[cellJ].append(cellI); directInteractionList[cellJ].append(cellI);
@ -109,18 +118,16 @@ void Foam::directInteractionList::buildDirectInteractionList
Info<< tab << "Point-Face, Edge-Edge direct interaction list build." Info<< tab << "Point-Face, Edge-Edge direct interaction list build."
<< endl; << endl;
forAll (mesh.points(), p) forAll(mesh.points(), p)
{ {
forAll(mesh.faces(), f) forAll(mesh.faces(), f)
{ {
if(il_.testPointFaceDistance(p, f)) if (il_.testPointFaceDistance(p, f))
{ {
const labelList& pCells(mesh.pointCells()[p]); const labelList& pCells(mesh.pointCells()[p]);
const label cellO(mesh.faceOwner()[f]); const label cellO(mesh.faceOwner()[f]);
const label cellN(mesh.faceNeighbour()[f]);
forAll(pCells, pC) forAll(pCells, pC)
{ {
const label cellI(pCells[pC]); const label cellI(pCells[pC]);
@ -131,8 +138,13 @@ void Foam::directInteractionList::buildDirectInteractionList
{ {
if if
( (
findIndex(directInteractionList[cellI], findIndex
cellO) == -1 (
directInteractionList[cellI],
cellO
)
==
-1
) )
{ {
directInteractionList[cellI].append(cellO); directInteractionList[cellI].append(cellO);
@ -143,8 +155,13 @@ void Foam::directInteractionList::buildDirectInteractionList
{ {
if if
( (
findIndex(directInteractionList[cellO], findIndex
cellI) == -1 (
directInteractionList[cellO],
cellI
)
==
-1
) )
{ {
directInteractionList[cellO].append(cellI); directInteractionList[cellO].append(cellI);
@ -156,12 +173,19 @@ void Foam::directInteractionList::buildDirectInteractionList
// boundary faces will not have neighbour // boundary faces will not have neighbour
// information // information
const label cellN(mesh.faceNeighbour()[f]);
if (cellN > cellI) if (cellN > cellI)
{ {
if if
( (
findIndex(directInteractionList[cellI], findIndex
cellN) == -1 (
directInteractionList[cellI],
cellN
)
==
-1
) )
{ {
directInteractionList[cellI].append(cellN); directInteractionList[cellI].append(cellN);
@ -172,8 +196,13 @@ void Foam::directInteractionList::buildDirectInteractionList
{ {
if if
( (
findIndex(directInteractionList[cellN], findIndex
cellI) == -1 (
directInteractionList[cellN],
cellI
)
==
-1
) )
{ {
directInteractionList[cellN].append(cellI); directInteractionList[cellN].append(cellI);
@ -187,7 +216,7 @@ void Foam::directInteractionList::buildDirectInteractionList
label edgeJIndex; label edgeJIndex;
forAll (mesh.edges(), edgeIIndex) forAll(mesh.edges(), edgeIIndex)
{ {
const edge& eI(mesh.edges()[edgeIIndex]); const edge& eI(mesh.edges()[edgeIIndex]);
@ -218,8 +247,13 @@ void Foam::directInteractionList::buildDirectInteractionList
{ {
if if
( (
findIndex(directInteractionList[cellI], findIndex
cellJ) == -1 (
directInteractionList[cellI],
cellJ
)
==
-1
) )
{ {
directInteractionList[cellI].append(cellJ); directInteractionList[cellI].append(cellJ);
@ -230,8 +264,13 @@ void Foam::directInteractionList::buildDirectInteractionList
{ {
if if
( (
findIndex(directInteractionList[cellJ], findIndex
cellI) == -1 (
directInteractionList[cellJ],
cellI
)
==
-1
) )
{ {
directInteractionList[cellJ].append(cellI); directInteractionList[cellJ].append(cellI);
@ -272,11 +311,11 @@ Foam::directInteractionList::directInteractionList
labelListList(il.mesh().nCells()), labelListList(il.mesh().nCells()),
il_(il) il_(il)
{ {
if((*this).size() > 1) if ((*this).size() > 1)
{ {
buildDirectInteractionList(pointPointListBuild); buildDirectInteractionList(pointPointListBuild);
} }
else if((*this).size() == 1) else if ((*this).size() == 1)
{ {
Info<< nl Info<< nl
<< "Single cell mesh, no direct interaction lists required." << "Single cell mesh, no direct interaction lists required."
@ -305,16 +344,4 @@ Foam::directInteractionList::~directInteractionList()
{} {}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
// ************************************************************************* // // ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -59,6 +59,7 @@ class directInteractionList
const interactionLists& il_; const interactionLists& il_;
// Private Member Functions // Private Member Functions
void buildDirectInteractionList void buildDirectInteractionList
@ -72,6 +73,7 @@ class directInteractionList
//- Disallow default bitwise assignment //- Disallow default bitwise assignment
void operator=(const directInteractionList&); void operator=(const directInteractionList&);
public: public:
// Constructors // Constructors
@ -89,6 +91,7 @@ public:
const interactionLists& il const interactionLists& il
); );
// Destructor // Destructor
~directInteractionList(); ~directInteractionList();
@ -100,12 +103,6 @@ public:
inline const interactionLists& il() const; inline const interactionLists& il() const;
// Check
// Edit
// Write
// IOstream Operators // IOstream Operators

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -24,8 +24,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline const Foam::interactionLists& Foam::directInteractionList::il() const inline const Foam::interactionLists& Foam::directInteractionList::il() const
@ -34,7 +32,4 @@ inline const Foam::interactionLists& Foam::directInteractionList::il() const
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// ************************************************************************* // // ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -342,6 +342,7 @@ bool Foam::interactionLists::testPointFaceDistance
); );
} }
bool Foam::interactionLists::testPointFaceDistance bool Foam::interactionLists::testPointFaceDistance
( (
const vector& p, const vector& p,

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -52,7 +52,7 @@ namespace Foam
{ {
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class interactionLists Declaration Class interactionLists Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
class interactionLists class interactionLists
@ -71,6 +71,7 @@ class interactionLists
List<receivingReferralList> cellReceivingReferralLists_; List<receivingReferralList> cellReceivingReferralLists_;
// Private Member Functions // Private Member Functions
//- Build referralLists which define how to send information //- Build referralLists which define how to send information
@ -83,6 +84,7 @@ class interactionLists
//- Disallow default bitwise assignment //- Disallow default bitwise assignment
void operator=(const interactionLists&); void operator=(const interactionLists&);
public: public:
// Static data members // Static data members
@ -90,6 +92,7 @@ public:
//- Tolerance for checking that faces on a patch segment //- Tolerance for checking that faces on a patch segment
static scalar transTol; static scalar transTol;
// Constructors // Constructors
//- Construct and create all information from the mesh //- Construct and create all information from the mesh
@ -103,6 +106,7 @@ public:
//- Construct from file //- Construct from file
interactionLists(const polyMesh& mesh); interactionLists(const polyMesh& mesh);
// Destructor // Destructor
~interactionLists(); ~interactionLists();
@ -177,6 +181,7 @@ public:
const labelList& segmentPoints const labelList& segmentPoints
) const; ) const;
// Access // Access
inline const polyMesh& mesh() const; inline const polyMesh& mesh() const;

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -143,7 +143,7 @@ bool operator==
Foam::Istream& Foam::operator>>(Istream& is, receivingReferralList& rRL) Foam::Istream& Foam::operator>>(Istream& is, receivingReferralList& rRL)
{ {
is >> rRL.sourceProc_ >> static_cast<labelListList&>(rRL); is >> rRL.sourceProc_ >> static_cast<labelListList&>(rRL);
is.check is.check
( (
@ -160,7 +160,7 @@ Foam::Ostream& Foam::operator<<
const receivingReferralList& rRL const receivingReferralList& rRL
) )
{ {
os << rRL.sourceProc() << token::SPACE os << rRL.sourceProc() << token::SPACE
<< static_cast< const labelListList& >(rRL); << static_cast< const labelListList& >(rRL);
os.check os.check
@ -171,7 +171,5 @@ Foam::Ostream& Foam::operator<<
return os; return os;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// ************************************************************************* // // ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -24,8 +24,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline Foam::label Foam::receivingReferralList::sourceProc() const inline Foam::label Foam::receivingReferralList::sourceProc() const
@ -46,7 +44,4 @@ inline bool operator!=
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// ************************************************************************* // // ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -145,7 +145,7 @@ Foam::Istream& Foam::operator>>
sendingReferralList& sRL sendingReferralList& sRL
) )
{ {
is >> sRL.destinationProc_ >> static_cast<labelList&>(sRL); is >> sRL.destinationProc_ >> static_cast<labelList&>(sRL);
is.check("Istream& operator<<(Istream& f, const sendingReferralList& sRL"); is.check("Istream& operator<<(Istream& f, const sendingReferralList& sRL");
@ -159,7 +159,7 @@ Foam::Ostream& Foam::operator<<
const sendingReferralList& rL const sendingReferralList& rL
) )
{ {
os << rL.destinationProc() << token::SPACE os << rL.destinationProc() << token::SPACE
<< static_cast< const labelList& >(rL); << static_cast< const labelList& >(rL);
os.check("Ostream& operator<<(Ostream& f, const sendingReferralList& rL"); os.check("Ostream& operator<<(Ostream& f, const sendingReferralList& rL");
@ -168,6 +168,4 @@ Foam::Ostream& Foam::operator<<
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// ************************************************************************* // // ************************************************************************* //

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2009 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -24,8 +24,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline Foam::label Foam::sendingReferralList::destinationProc() const inline Foam::label Foam::sendingReferralList::destinationProc() const
@ -46,6 +44,4 @@ inline bool operator!=
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// ************************************************************************* // // ************************************************************************* //

Some files were not shown because too many files have changed in this diff Show More