Merge branch 'master' into cvm

This commit is contained in:
graham
2011-05-31 16:18:03 +01:00
482 changed files with 20601 additions and 49813 deletions

4
.gitignore vendored
View File

@ -60,8 +60,8 @@ doc/[Dd]oxygen/man
# untracked configuration files # untracked configuration files
/etc/prefs.csh /etc/prefs.csh
/etc/prefs.sh /etc/prefs.sh
/etc/config/*.csh /etc/config/prefs.csh
/etc/config/*.sh /etc/config/prefs.sh
# source packages - anywhere # source packages - anywhere
*.tar.bz2 *.tar.bz2

View File

@ -126,7 +126,9 @@
globalPointPatch. Moving mesh cases can now be run non-parallel and globalPointPatch. Moving mesh cases can now be run non-parallel and
continued in parallel and reconstructed without any limitation. continued in parallel and reconstructed without any limitation.
*** *New* compact binary I/O for faces and cells. *** *New* compact binary I/O for faces and cells.
This speeds up reading/writing meshes in binary. This speeds up reading/writing meshes in binary. Binary mesh reading
is backwards (but not forwards) compatible. Use ascii mesh format or
foamFormatConvert.
*** *Updated* runTimeModifiable *** *Updated* runTimeModifiable
+ user selectable model to use for checking run-time modifiable + user selectable model to use for checking run-time modifiable
dictionaries (see also doc/changes/inotify.txt): dictionaries (see also doc/changes/inotify.txt):
@ -139,8 +141,9 @@
+ on linux optionally uses inotify instead of time stamps - more efficient + on linux optionally uses inotify instead of time stamps - more efficient
for large numbers of monitored files. No more fileModificationSkew needed. for large numbers of monitored files. No more fileModificationSkew needed.
+ single integer reduction instead of one reduction per monitored file. + single integer reduction instead of one reduction per monitored file.
+ only files that can be re-read are being checked. Drastic reduction of + only files that can be re-read are being checked by specifying
number of files to check. in the IOobject constructor MUST_READ_IF_MODIFIED instead of
MUST_READ. Drastic reduction of number of files to check.
*** *New* #codeStream dictionary entry *** *New* #codeStream dictionary entry
Uses dynamic compilation of OpenFOAM C++ code to construct dictionary. Uses dynamic compilation of OpenFOAM C++ code to construct dictionary.
E.g. in blockMeshDict: E.g. in blockMeshDict:
@ -241,9 +244,11 @@
- works in parallel - works in parallel
+ =snappyHexMesh=: + =snappyHexMesh=:
+ extrude across multi-processor boundaries + extrude across multi-processor boundaries
+ preserve faceZones during layering + preserve faceZones shape during layering
+ combining patch faces after snapping + combining coincident patch faces is now default after snapping
+ *Warning*: + *Warning*:
- snapControls::tolerance setting fixed w.r.t. 17x. Is the
multiplication to calculate the local search distance for nearest.
- minMedianAxisAngle angle fixed w.r.t. 17x. Set to - minMedianAxisAngle angle fixed w.r.t. 17x. Set to
90 to get same behaviour as 130 in 17x. 90 to get same behaviour as 130 in 17x.
- nGrow did not work in 17x. Set to 0 - nGrow did not work in 17x. Set to 0
@ -308,6 +313,8 @@
+ multipleBoxes, hotBoxes, panel, evaporationTest + multipleBoxes, hotBoxes, panel, evaporationTest
+ =interDyMFoam= tutorials: + =interDyMFoam= tutorials:
+ testTubeMixer: showcases =solidBodyMotionFunction= + testTubeMixer: showcases =solidBodyMotionFunction=
+ =snappyHexMesh= tutorials:
+ flange: demonstration of feature lines in snappyHexMesh
* Other * Other
+ compilable with =clang= + compilable with =clang=

View File

@ -49,6 +49,10 @@ int main(int argc, char *argv[])
Info<< nl << "Calculating potential flow" << endl; Info<< nl << "Calculating potential flow" << endl;
// Since solver contains no time loop it would never execute
// function objects so do it ourselves.
runTime.functionObjects().start();
adjustPhi(phi, U, p); adjustPhi(phi, U, p);
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
@ -99,6 +103,9 @@ int main(int argc, char *argv[])
p.write(); p.write();
} }
runTime.functionObjects().end();
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s" Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s" << " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl; << nl << endl;

View File

@ -0,0 +1,3 @@
sprayFoam.C
EXE = $(FOAM_APPBIN)/sprayFoam

View File

@ -0,0 +1,50 @@
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I${LIB_SRC}/meshTools/lnInclude \
-I$(LIB_SRC)/turbulenceModels/compressible/turbulenceModel \
-I$(LIB_SRC)/lagrangian/basic/lnInclude \
-I$(LIB_SRC)/lagrangian/intermediate/lnInclude \
-I$(LIB_SRC)/lagrangian/spray/lnInclude \
-I$(LIB_SRC)/lagrangian/distributionModels/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/properties/liquidProperties/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/properties/liquidMixtureProperties/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/properties/solidProperties/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/properties/solidMixtureProperties/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/thermophysicalFunctions/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/reactionThermo/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/SLGThermo/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/chemistryModel/lnInclude \
-I$(LIB_SRC)/thermophysicalModels/radiationModels/lnInclude \
-I$(LIB_SRC)/ODE/lnInclude \
-I$(LIB_SRC)/regionModels/regionModel/lnInclude \
-I$(LIB_SRC)/regionModels/surfaceFilmModels/lnInclude \
-I$(LIB_SRC)/sampling/lnInclude \
-I$(FOAM_SOLVERS)/lagrangian/reactingParcelFoam
EXE_LIBS = \
-lfiniteVolume \
-lmeshTools \
-lcompressibleTurbulenceModel \
-lcompressibleRASModels \
-lcompressibleLESModels \
-llagrangian \
-llagrangianIntermediate \
-llagrangianSpray \
-lspecie \
-lbasicThermophysicalModels \
-lliquidProperties \
-lliquidMixtureProperties \
-lsolidProperties \
-lsolidMixtureProperties \
-lthermophysicalFunctions \
-lreactionThermophysicalModels \
-lSLGThermo \
-lchemistryModel \
-lradiationModels \
-lODE \
-lregionModels \
-lsurfaceFilmModels \
-lsampling

View File

@ -0,0 +1,44 @@
if (chemistry.chemistry())
{
Info<< "Solving chemistry" << endl;
chemistry.solve
(
runTime.value() - runTime.deltaTValue(),
runTime.deltaTValue()
);
// turbulent time scale
if (turbulentReaction)
{
tmp<volScalarField> tepsilon(turbulence->epsilon());
const volScalarField& epsilon = tepsilon();
tmp<volScalarField> tmuEff(turbulence->muEff());
const volScalarField& muEff = tmuEff();
tmp<volScalarField> ttc(chemistry.tc());
const volScalarField& tc = ttc();
forAll(epsilon, i)
{
if (epsilon[i] > 0)
{
// Chalmers PaSR model
scalar tk = Cmix.value()*Foam::sqrt(muEff[i]/rho[i]/epsilon[i]);
kappa[i] =
(runTime.deltaTValue() + tc[i])
/(runTime.deltaTValue() + tc[i] + tk);
}
else
{
// Return to laminar combustion
kappa[i] = 1.0;
}
}
}
else
{
kappa = 1.0;
}
chemistrySh = kappa*chemistry.Sh()();
}

View File

@ -0,0 +1,9 @@
Info<< "\nConstructing reacting cloud" << endl;
basicSprayCloud parcels
(
"sprayCloud",
rho,
U,
g,
slgThermo
);

View File

@ -0,0 +1,119 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2011 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 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Application
sprayFoam
Description
Transient PIMPLE solver for compressible, laminar or turbulent flow with
spray parcels.
\*---------------------------------------------------------------------------*/
#include "fvCFD.H"
#include "hCombustionThermo.H"
#include "turbulenceModel.H"
#include "basicSprayCloud.H"
#include "psiChemistryModel.H"
#include "chemistrySolver.H"
#include "radiationModel.H"
#include "SLGThermo.H"
#include "pimpleControl.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
#include "readChemistryProperties.H"
#include "readGravitationalAcceleration.H"
#include "createFields.H"
#include "createClouds.H"
#include "createRadiationModel.H"
#include "initContinuityErrs.H"
#include "readTimeControls.H"
#include "compressibleCourantNo.H"
#include "setInitialDeltaT.H"
pimpleControl pimple(mesh);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Info<< "\nStarting time loop\n" << endl;
while (runTime.run())
{
#include "readTimeControls.H"
#include "compressibleCourantNo.H"
#include "setDeltaT.H"
runTime++;
Info<< "Time = " << runTime.timeName() << nl << endl;
parcels.evolve();
#include "chemistry.H"
#include "rhoEqn.H"
// --- Pressure-velocity PIMPLE corrector loop
for (pimple.start(); pimple.loop(); pimple++)
{
#include "UEqn.H"
#include "YEqn.H"
#include "hsEqn.H"
// --- PISO loop
for (int corr=0; corr<pimple.nCorr(); corr++)
{
#include "pEqn.H"
}
if (pimple.turbCorr())
{
turbulence->correct();
}
}
rho = thermo.rho();
if (runTime.write())
{
chemistry.dQ()().write();
}
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl;
}
Info<< "End\n" << endl;
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) 2010-2010 OpenCFD Ltd. \\ / A nd | Copyright (C) 2010-2011 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -453,6 +453,7 @@ void Foam::createShellMesh::setRefinement
label region0 = pointRegions_[eFaces[0]][fp0]; label region0 = pointRegions_[eFaces[0]][fp0];
label region1 = pointRegions_[eFaces[0]][fp1]; label region1 = pointRegions_[eFaces[0]][fp1];
// Pick up points with correct normal
if (layerI == 0) if (layerI == 0)
{ {
newF[0] = f[fp0]; newF[0] = f[fp0];
@ -468,6 +469,22 @@ void Foam::createShellMesh::setRefinement
newF[3] = addedPoints[nLayers*region0+layerI]; newF[3] = addedPoints[nLayers*region0+layerI];
} }
// Optionally rotate so e[0] is always 0th vertex. Note that
// this normally is automatically done by coupled face ordering
// but with NOORDERING we have to do it ourselves.
if (f[fp0] != e[0])
{
// rotate one back to get newF[1] (originating from e[0])
// into newF[0]
label v0 = newF[0];
for (label i = 0; i < newF.size()-1; i++)
{
newF[i] = newF[newF.fcIndex(i)];
}
newF.last() = v0;
}
label minCellI = addedCells[nLayers*eFaces[0]+layerI]; label minCellI = addedCells[nLayers*eFaces[0]+layerI];
label maxCellI; label maxCellI;
label patchI; label patchI;
@ -569,6 +586,21 @@ void Foam::createShellMesh::setRefinement
newF[3] = addedPoints[nLayers*region0+layerI]; newF[3] = addedPoints[nLayers*region0+layerI];
} }
// Optionally rotate so e[0] is always 0th vertex. Note that
// this normally is automatically done by coupled face
// ordering but with NOORDERING we have to do it ourselves.
if (f[fp0] != e[0])
{
// rotate one back to get newF[1] (originating
// from e[0]) into newF[0].
label v0 = newF[0];
for (label i = 0; i < newF.size()-1; i++)
{
newF[i] = newF[newF.fcIndex(i)];
}
newF.last() = v0;
}
////if (ePatches.size() == 0) ////if (ePatches.size() == 0)
//{ //{
// Pout<< "Adding from MULTI face:" // Pout<< "Adding from MULTI face:"

View File

@ -220,7 +220,7 @@ snapControls
//- Maximum relative distance for points to be attracted by surface. //- Maximum relative distance for points to be attracted by surface.
// True distance is this factor times local maximum edge length. // True distance is this factor times local maximum edge length.
// Note: changed(corrected) w.r.t 17x! (17x used 2* tolerance) // Note: changed(corrected) w.r.t 17x! (17x used 2* tolerance)
tolerance 2.0; tolerance 1.0;
//- Number of mesh displacement relaxation iterations. //- Number of mesh displacement relaxation iterations.
nSolveIter 30; nSolveIter 30;
@ -228,6 +228,10 @@ snapControls
//- Maximum number of snapping relaxation iterations. Should stop //- Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh. // before upon reaching a correct mesh.
nRelaxIter 5; nRelaxIter 5;
//- Highly experimental and wip: number of feature edge snapping
// iterations. Leave out altogether to disable.
//nFeatureSnapIter 10;
} }
@ -258,6 +262,9 @@ addLayersControls
//- Wanted thickness of final added cell layer. If multiple layers //- Wanted thickness of final added cell layer. If multiple layers
// is the
// thickness of the layer furthest away from the wall.
// Relative to undistorted size of cell outside layer.
// is the thickness of the layer furthest away from the wall. // is the thickness of the layer furthest away from the wall.
// See relativeSizes parameter. // See relativeSizes parameter.
finalLayerThickness 0.3; finalLayerThickness 0.3;
@ -410,7 +417,7 @@ debug 0;
// Merge tolerance. Is fraction of overall bounding box of initial mesh. // Merge tolerance. Is fraction of overall bounding box of initial mesh.
// Note: the write tolerance needs to be higher than this. // Note: the write tolerance needs to be higher than this.
mergeTolerance 1E-6; mergeTolerance 1e-6;
// ************************************************************************* // // ************************************************************************* //

View File

@ -144,10 +144,30 @@ bool writeZones(const word& name, const fileName& meshDir, Time& runTime)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
timeSelector::addOptions(); timeSelector::addOptions();
argList::addBoolOption
(
"noConstant",
"exclude the 'constant/' dir in the times list"
);
# include "addRegionOption.H" # include "addRegionOption.H"
# include "setRootCase.H" # include "setRootCase.H"
// enable noConstant by switching
if (!args.optionFound("noConstant"))
{
args.setOption("constant", "");
}
else
{
args.unsetOption("constant");
Info<< "Excluding the constant directory." << nl << endl;
}
# include "createTime.H" # include "createTime.H"
// Make sure we do not use the master-only reading since we read // Make sure we do not use the master-only reading since we read
// fields (different per processor) as dictionaries. // fields (different per processor) as dictionaries.
regIOobject::fileModificationChecking = regIOobject::timeStamp; regIOobject::fileModificationChecking = regIOobject::timeStamp;

View File

@ -98,6 +98,44 @@ autoPtr<fvMesh> createMesh
xferCopy(labelList()), xferCopy(labelList()),
false false
); );
// Add some dummy zones so upon reading it does not read them
// from the undecomposed case. Should be done as extra argument to
// regIOobject::readStream?
List<pointZone*> pz
(
1,
new pointZone
(
"dummyPointZone",
labelList(0),
0,
dummyMesh.pointZones()
)
);
List<faceZone*> fz
(
1,
new faceZone
(
"dummyFaceZone",
labelList(0),
boolList(0),
0,
dummyMesh.faceZones()
)
);
List<cellZone*> cz
(
1,
new cellZone
(
"dummyCellZone",
labelList(0),
0,
dummyMesh.cellZones()
)
);
dummyMesh.addZones(pz, fz, cz);
//Pout<< "Writing dummy mesh to " << dummyMesh.polyMesh::objectPath() //Pout<< "Writing dummy mesh to " << dummyMesh.polyMesh::objectPath()
// << endl; // << endl;
dummyMesh.write(); dummyMesh.write();
@ -239,7 +277,11 @@ autoPtr<fvMesh> createMesh
if (!haveMesh) if (!haveMesh)
{ {
// Add the zones // Add the zones. Make sure to remove the old dummy ones first
mesh.pointZones().clear();
mesh.faceZones().clear();
mesh.cellZones().clear();
List<pointZone*> pz(pointZoneNames.size()); List<pointZone*> pz(pointZoneNames.size());
forAll(pointZoneNames, i) forAll(pointZoneNames, i)
{ {
@ -389,6 +431,12 @@ void printMeshData(const polyMesh& mesh)
globalIndex globalBoundaryFaces(mesh.nFaces()-mesh.nInternalFaces()); globalIndex globalBoundaryFaces(mesh.nFaces()-mesh.nInternalFaces());
label maxProcCells = 0;
label totProcFaces = 0;
label maxProcPatches = 0;
label totProcPatches = 0;
label maxProcFaces = 0;
for (label procI = 0; procI < Pstream::nProcs(); procI++) for (label procI = 0; procI < Pstream::nProcs(); procI++)
{ {
Info<< endl Info<< endl
@ -413,7 +461,32 @@ void printMeshData(const polyMesh& mesh)
<< " Number of processor faces = " << nProcFaces << nl << " Number of processor faces = " << nProcFaces << nl
<< " Number of boundary faces = " << " Number of boundary faces = "
<< globalBoundaryFaces.localSize(procI) << endl; << globalBoundaryFaces.localSize(procI) << endl;
maxProcCells = max(maxProcCells, globalCells.localSize(procI));
totProcFaces += nProcFaces;
totProcPatches += nei.size();
maxProcPatches = max(maxProcPatches, nei.size());
maxProcFaces = max(maxProcFaces, nProcFaces);
} }
// Stats
scalar avgProcCells = scalar(globalCells.size())/Pstream::nProcs();
scalar avgProcPatches = scalar(totProcPatches)/Pstream::nProcs();
scalar avgProcFaces = scalar(totProcFaces)/Pstream::nProcs();
Info<< nl
<< "Number of processor faces = " << totProcFaces/2 << nl
<< "Max number of cells = " << maxProcCells
<< " (" << 100.0*(maxProcCells-avgProcCells)/avgProcCells
<< "% above average " << avgProcCells << ")" << nl
<< "Max number of processor patches = " << maxProcPatches
<< " (" << 100.0*(maxProcPatches-avgProcPatches)/avgProcPatches
<< "% above average " << avgProcPatches << ")" << nl
<< "Max number of faces between processors = " << maxProcFaces
<< " (" << 100.0*(maxProcFaces-avgProcFaces)/avgProcFaces
<< "% above average " << avgProcFaces << ")" << nl
<< endl;
} }
@ -641,6 +714,16 @@ int main(int argc, char *argv[])
); );
# include "setRootCase.H" # include "setRootCase.H"
if (env("FOAM_SIGFPE"))
{
WarningIn(args.executable())
<< "Detected floating point exception trapping (FOAM_SIGFPE)."
<< " This might give" << nl
<< " problems when mapping fields. Switch it off in case"
<< " of problems." << endl;
}
// Create processor directory if non-existing // Create processor directory if non-existing
if (!Pstream::master() && !isDir(args.path())) if (!Pstream::master() && !isDir(args.path()))
{ {
@ -906,7 +989,7 @@ int main(int argc, char *argv[])
// Debugging: Create additional volField that will be mapped. // Debugging: Create additional volField that will be mapped.
// Used to test correctness of mapping // Used to test correctness of mapping
volVectorField mapCc("mapCc", 1*mesh.C()); //volVectorField mapCc("mapCc", 1*mesh.C());
// Global matching tolerance // Global matching tolerance
const scalar tolDim = getMergeDistance const scalar tolDim = getMergeDistance
@ -948,7 +1031,7 @@ int main(int argc, char *argv[])
// Debugging: test mapped cellcentre field. // Debugging: test mapped cellcentre field.
compareFields(tolDim, mesh.C(), mapCc); //compareFields(tolDim, mesh.C(), mapCc);
// Print nice message // Print nice message
// ~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~

View File

@ -3,7 +3,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) 2004-2010 OpenCFD Ltd. # \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
# \\/ M anipulation | # \\/ M anipulation |
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# License # License
@ -31,6 +31,39 @@
# #
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# Select the version of make to be used
#------------------------------------------------------------------------------
# normally use "make"
make="make"
# set WM_NCOMPPROCS automatically when both WM_HOSTS and WM_SCHEDULER are set
if [ -z "$WM_NCOMPPROCS" -a -n "$WM_HOSTS" -a -n "$WM_SCHEDULER" ]
then
WM_NCOMPPROCS=$(wmakeScheduler -count)
[ $? -eq 0 ] || unset WM_NCOMPPROCS
fi
if [ "$WM_NCOMPPROCS" ]
then
if [ "$WM_NCOMPPROCS" -gt 1 -a ! "$MAKEFLAGS" ]
then
lockDir=$HOME/.$WM_PROJECT/.wmake
if [ -d $lockDir ]
then
rm -f $lockDir/*
else
mkdir -p $lockDir
fi
make="make --no-print-directory -j "$WM_NCOMPPROCS
fi
fi
# Source tutorial functions # Source tutorial functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions . $WM_PROJECT_DIR/bin/tools/RunFunctions
@ -62,13 +95,15 @@ else
fi fi
done done
# Recurse to subdirectories # Recurse to subdirectories
for caseName in * #for caseName in *
do #do
if [ -d $caseName ] # if [ -d $caseName ]
then # then
( cd $caseName && $thisScript ) # ( cd $caseName && $thisScript )
fi # fi
done #done
FOAM_TARGETS=$(for d in *; do [ -d "$d" ] && echo "$d"; done | xargs)
$make -k -f $WM_PROJECT_DIR/bin/tools/MakefileDirs FOAM_TARGETS="$FOAM_TARGETS" FOAM_APP="$WM_SCHEDULER $thisScript"
fi fi
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

@ -37,7 +37,7 @@ usage() {
while [ "$#" -ge 1 ]; do echo "$1"; shift; done while [ "$#" -ge 1 ]; do echo "$1"; shift; done
cat<<USAGE cat<<USAGE
Usage: ${0##*/} [OPTION] Usage: ${0##*/} [OPTION] [PARAVIEW_OPTION]
options: options:
-block use blockMesh reader (uses .blockMesh extension) -block use blockMesh reader (uses .blockMesh extension)
-builtin use VTK builtin OpenFOAM reader (uses .foam extension) -builtin use VTK builtin OpenFOAM reader (uses .foam extension)
@ -47,6 +47,9 @@ options:
-touchAll create .blockMesh, .OpenFOAM files (and for all regions) -touchAll create .blockMesh, .OpenFOAM files (and for all regions)
-help print the usage -help print the usage
paraview options start with a double dashes
* start paraview $ParaView_VERSION with the OpenFOAM libraries * start paraview $ParaView_VERSION with the OpenFOAM libraries
USAGE USAGE
@ -57,7 +60,7 @@ USAGE
# to clean up # to clean up
unset FOAM_ABORT unset FOAM_ABORT
unset regionName touchOpt unset regionName optTouch
# reader extension # reader extension
extension=OpenFOAM extension=OpenFOAM
@ -88,19 +91,48 @@ do
shift 2 shift 2
;; ;;
-touch) -touch)
touchOpt=true optTouch=true
shift shift
;; ;;
-touchAll) -touchAll)
touchOpt=all optTouch=all
shift shift
;; ;;
--)
shift
break # stop here, treat balance as paraview options
;;
--*)
break # stop here, treat this and balance as paraview options
;;
*) *)
usage "unknown option/argument: '$*'" usage "unknown option/argument: '$*'"
;; ;;
esac esac
done done
#
# check for --data=... argument
#
hasDataArg()
{
hasData=false
while [ "$#" -gt 0 ]
do
case "$1" in
(--data=*)
hasData=true
break
;;
esac
shift
done
}
hasDataArg $@
# get a sensible caseName from the directory name # get a sensible caseName from the directory name
caseName=${PWD##*/} caseName=${PWD##*/}
caseFile="$caseName.$extension" caseFile="$caseName.$extension"
@ -112,7 +144,7 @@ then
fvControls="$fvControls/$regionName" fvControls="$fvControls/$regionName"
fi fi
case "${touchOpt:-false}" in case "${optTouch:-false}" in
all) all)
extension=OpenFOAM extension=OpenFOAM
if [ -f constant/polyMesh/blockMeshDict ] if [ -f constant/polyMesh/blockMeshDict ]
@ -149,33 +181,56 @@ case "$caseName" in
esac esac
# if [ "${hasData:-false}" = true ]
# check existence of essential files then
#
case $extension in
blockMesh)
for check in system/controlDict constant/polyMesh/blockMeshDict
do
[ -s "$parentDir/$check" ] || usage "file does not exist: '$parentDir/$check'"
done
;;
builtin | OpenFOAM) # has --data=.., send directly to paraview
for check in system/controlDict $fvControls/fvSchemes $fvControls/fvSolution exec paraview "$@"
do
[ -s "$parentDir/$check" ] || usage "file does not exist: '$parentDir/$check'"
done
;;
esac
else
# only create/remove caseFile if it didn't already exist # check existence of essential files
[ -e $caseFile ] || { warn="WARN file does not exist:"
trap "rm -f $caseFile 2>/dev/null; exit 0" EXIT TERM INT case $extension in
touch "$caseFile" blockMesh)
echo "created temporary '$caseFile'" for check in \
} system/controlDict \
constant/polyMesh/blockMeshDict \
;
do
[ -s "$parentDir/$check" ] || {
[ -n "$warn" ] && echo "$warn" 1>&2
echo " $parentDir/$check" 1>&2
unset warn
}
done
;;
builtin | OpenFOAM)
for check in \
system/controlDict \
$fvControls/fvSchemes \
$fvControls/fvSolution \
;
do
[ -s "$parentDir/$check" ] || {
[ -n "$warn" ] && echo "$warn" 1>&2
echo " $parentDir/$check" 1>&2
unset warn
}
done
;;
esac
# only create/remove caseFile if it didn't already exist
[ -e $caseFile ] || {
trap "rm -f $caseFile 2>/dev/null; exit 0" EXIT TERM INT
touch "$caseFile"
echo "created temporary '$caseFile'"
}
paraview --data="$caseFile" "$@"
fi
paraview --data="$caseFile"
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

42
bin/tools/MakefileDirs Normal file
View File

@ -0,0 +1,42 @@
#-------------------------------*- makefile -*---------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\ / A nd | Copyright (C) 2004-2011 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 3 of the License, or
# (at your option) any later version.
#
# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
#
# File
# MakefileDirs
#
# Description
# Makefile used by
# foamRunTutorials
# to call some script in subdirectories.
#
#------------------------------------------------------------------------------
.PHONY: application $(FOAM_TARGETS)
application: $(FOAM_TARGETS)
$(FOAM_TARGETS):
@(cd $@ && $(FOAM_APP))
#------------------------------------------------------------------------------

View File

@ -131,7 +131,7 @@ do
paraviewInstall="$2" paraviewInstall="$2"
# replace ParaView_DIR=... # replace ParaView_DIR=...
_inlineSed \ _inlineSed \
etc/apps/paraview3/bashrc \ etc/config/paraview.sh \
'/^[^#]/s@ParaView_DIR=.*@ParaView_DIR='"$paraviewInstall@" \ '/^[^#]/s@ParaView_DIR=.*@ParaView_DIR='"$paraviewInstall@" \
"Replacing ParaView_DIR setting by '$paraviewInstall'" "Replacing ParaView_DIR setting by '$paraviewInstall'"
shift 2 shift 2

View File

@ -120,7 +120,12 @@ export WM_THIRD_PARTY_DIR=$WM_PROJECT_INST_DIR/ThirdParty-$WM_PROJECT_VERSION
# Location of site-specific templates etc # Location of site-specific templates etc
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# unset is equivalent to $WM_PROJECT_INST_DIR/site # unset is equivalent to $WM_PROJECT_INST_DIR/site
unset WM_PROJECT_SITE if [ -d "$WM_PROJECT_SITE" ]
then
export WM_PROJECT_SITE
else
unset WM_PROJECT_SITE
fi
# Location of user files # Location of user files
# ~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~
@ -177,7 +182,7 @@ _foamEval()
_foamSource `$WM_PROJECT_DIR/bin/foamEtcFile prefs.sh` _foamSource `$WM_PROJECT_DIR/bin/foamEtcFile prefs.sh`
# Evaluate command-line parameters and record settings for later # Evaluate command-line parameters and record settings for later
# these can be used to set/unset values, or specify prefs files # these can be used to set/unset values, or specify alternative pref files
export FOAM_SETTINGS="$@" export FOAM_SETTINGS="$@"
_foamEval $@ _foamEval $@
@ -200,14 +205,14 @@ export PATH LD_LIBRARY_PATH MANPATH
# Source project setup files # Source project setup files
# ~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~
_foamSource $WM_PROJECT_DIR/etc/settings.sh _foamSource $WM_PROJECT_DIR/etc/config/settings.sh
_foamSource $WM_PROJECT_DIR/etc/aliases.sh _foamSource $WM_PROJECT_DIR/etc/config/aliases.sh
# Source user setup files for optional packages # Source user setup files for optional packages
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_foamSource `$WM_PROJECT_DIR/bin/foamEtcFile apps/paraview3/bashrc` _foamSource `$WM_PROJECT_DIR/bin/foamEtcFile config/paraview.sh`
_foamSource `$WM_PROJECT_DIR/bin/foamEtcFile apps/ensight/bashrc` _foamSource `$WM_PROJECT_DIR/bin/foamEtcFile config/ensight.sh`
# Clean environment paths again. Only remove duplicates # Clean environment paths again. Only remove duplicates

51
etc/config/README Normal file
View File

@ -0,0 +1,51 @@
The main OpenFOAM settings are located in the parent etc/ directory
* bashrc, cshrc
entry point for sourcing
* prefs.csh, prefs.sh
these files are untracked and can be used for some site-defined
settings
The etc/config/ directory contains various configuration files in
sh/csh variants:
* settings.csh, settings.sh
core settings
* aliases.csh, aliases.sh
aliases for interactive shells
* unset.csh, unset.sh
sourced to clear as many OpenFOAM environment settings as possible
* ensight.csh, ensight.sh
application settings for EnSight
* paraview.csh, paraview.sh
application settings for ParaView
* scotch.sh
application settings for compiling against scotch
---
The config/example directory contains various example configuration files
in sh/csh variants
* compiler.csh, compiler.sh
an example of fine tuning ThirdParty compiler settings for OpenFOAM
* openmpi.csh, openmpi.sh
an example of fine tuning openmpi settings for OpenFOAM
* paraview.csh, paraview.sh
an example of chaining to the standard config/paraview.sh with a
different ParaView_VERSION
* prefs.csh, prefs.sh
an example of supplying alternative site-defined settings
---

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# etc/aliases.csh # etc/config/aliases.csh
# #
# Description # Description
# Aliases for working with OpenFOAM # Aliases for working with OpenFOAM
@ -39,7 +39,7 @@ alias wmSP 'wmSET WM_PRECISION_OPTION=SP'
alias wmDP 'wmSET WM_PRECISION_OPTION=DP' alias wmDP 'wmSET WM_PRECISION_OPTION=DP'
# clear env # clear env
alias wmUNSET='source $WM_PROJECT_DIR/etc/unset.csh' alias wmUNSET='source $WM_PROJECT_DIR/etc/config/unset.csh'
# Toggle wmakeScheduler on/off # Toggle wmakeScheduler on/off
# - also need to set WM_HOSTS # - also need to set WM_HOSTS
@ -49,7 +49,7 @@ alias wmSchedOFF 'unsetenv WM_SCHEDULER'
# Change ParaView version # Change ParaView version
# ~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~
alias foamPV 'source `$WM_PROJECT_DIR/etc/apps/paraview3/cshrc` ParaView_VERSION=\!*; echo paraview-$ParaView_VERSION' alias foamPV 'source `$WM_PROJECT_DIR/etc/config/paraview.csh` ParaView_VERSION=\!*; echo paraview-$ParaView_VERSION'
# Change directory aliases # Change directory aliases

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# etc/aliases.sh # etc/config/aliases.sh
# #
# Description # Description
# Aliases for working with OpenFOAM # Aliases for working with OpenFOAM
@ -39,7 +39,7 @@ alias wmSP='wmSET WM_PRECISION_OPTION=SP'
alias wmDP='wmSET WM_PRECISION_OPTION=DP' alias wmDP='wmSET WM_PRECISION_OPTION=DP'
# clear env # clear env
alias wmUNSET='. $WM_PROJECT_DIR/etc/unset.sh' alias wmUNSET='. $WM_PROJECT_DIR/etc/config/unset.sh'
# Toggle wmakeScheduler on/off # Toggle wmakeScheduler on/off
# - also need to set WM_HOSTS # - also need to set WM_HOSTS
@ -52,7 +52,7 @@ alias wmSchedOFF='unset WM_SCHEDULER'
unset foamPV unset foamPV
foamPV() foamPV()
{ {
. $WM_PROJECT_DIR/etc/apps/paraview3/bashrc ParaView_VERSION=$1 . $WM_PROJECT_DIR/etc/config/paraview.sh ParaView_VERSION=$1
echo "paraview-$ParaView_VERSION (major: $ParaView_MAJOR)" echo "paraview-$ParaView_VERSION (major: $ParaView_MAJOR)"
} }

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) 2004-2010 OpenCFD Ltd. # \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
# \\/ M anipulation | # \\/ M anipulation |
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
# License # License
@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# ensight/cshrc # config/ensight.csh
# #
# Description # Description
# Setup file for Ensight # Setup file for Ensight

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) 2004-2010 OpenCFD Ltd. # \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
# \\/ M anipulation | # \\/ M anipulation |
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# License # License
@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# ensight/bashrc # config/ensight.sh
# #
# Description # Description
# Setup file for Ensight # Setup file for Ensight

View File

@ -22,11 +22,11 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# config/compiler.csh # config/example/compiler.csh
# #
# Description # Description
# Fine tuning of ThirdParty compiler settings for OpenFOAM # Example of fine tuning ThirdParty compiler settings for OpenFOAM
# Sourced from OpenFOAM-<VERSION>/etc/settings.csh # Sourced from OpenFOAM-<VERSION>/etc/config/settings.csh
# #
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

@ -22,11 +22,11 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# config/compiler.sh # config/example/compiler.sh
# #
# Description # Description
# Fine tuning of ThirdParty compiler settings for OpenFOAM # Example of fine tuning ThirdParty compiler settings for OpenFOAM
# Sourced from OpenFOAM-<VERSION>/etc/settings.sh # Sourced from OpenFOAM-<VERSION>/etc/config/settings.sh
# #
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

@ -22,11 +22,11 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# config/openmpi.csh # config/example/openmpi.csh
# #
# Description # Description
# Fine tuning of openmpi settings for OpenFOAM # Example of fine tuning openmpi settings for OpenFOAM
# Sourced from OpenFOAM-<VERSION>/etc/settings.csh # Sourced from OpenFOAM-<VERSION>/etc/config/settings.csh
# #
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

@ -22,11 +22,11 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# config/openmpi.sh # config/example/openmpi.sh
# #
# Description # Description
# Fine tuning of openmpi settings for OpenFOAM # Example of fine tuning openmpi settings for OpenFOAM
# Sourced from OpenFOAM-<VERSION>/etc/settings.sh # Sourced from OpenFOAM-<VERSION>/etc/config/settings.sh
# #
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

@ -22,10 +22,10 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# paraview3/cshrc-EXAMPLE # config/example/paraview.csh
# #
# Description # Description
# Example of chaining to the standard paraview3/cshrc with a # Example of chaining to the standard config/paraview.csh with a
# different ParaView_VERSION # different ParaView_VERSION
# #
# Note # Note
@ -35,10 +35,10 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# #
# Use other (shipped) cshrc with a different ParaView_VERSION # Use other (shipped) paraview.csh with a different ParaView_VERSION
# #
set foamFile=`$WM_PROJECT_DIR/bin/foamEtcFile -mode o apps/paraview3/cshrc` set foamFile=`$WM_PROJECT_DIR/bin/foamEtcFile -mode o config/paraview.csh`
if ( $status == 0 ) source $foamFile ParaView_VERSION=3.9.0 if ( $status == 0 ) source $foamFile ParaView_VERSION=3.9.0
unset foamFile unset foamFile

View File

@ -22,10 +22,10 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# paraview3/bashrc-EXAMPLE # config/example/paraview.sh
# #
# Description # Description
# Example of chaining to the standard paraview3/bashrc with a # Example of chaining to the standard config/paraview.sh with a
# different ParaView_VERSION # different ParaView_VERSION
# #
# Note # Note
@ -35,10 +35,10 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# #
# Use other (shipped) bashrc with a different ParaView_VERSION # Use other (shipped) paraview.sh with a different ParaView_VERSION
# #
foamFile=$($WM_PROJECT_DIR/bin/foamEtcFile -mode o apps/paraview3/bashrc 2>/dev/null) foamFile=$($WM_PROJECT_DIR/bin/foamEtcFile -mode o config/paraview.sh 2>/dev/null)
[ $? -eq 0 ] && . $foamFile ParaView_VERSION=3.9.0 [ $? -eq 0 ] && . $foamFile ParaView_VERSION=3.9.0
unset foamFile unset foamFile

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# etc/prefs.csh # config/example/prefs.csh
# #
# Description # Description
# Preset variables for the OpenFOAM configuration - C-Shell shell syntax. # Preset variables for the OpenFOAM configuration - C-Shell shell syntax.

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# etc/prefs.sh # config/example/prefs.sh
# #
# Description # Description
# Preset variables for the OpenFOAM configuration - POSIX shell syntax. # Preset variables for the OpenFOAM configuration - POSIX shell syntax.

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# paraview3/cshrc # config/paraview.csh
# #
# Description # Description
# Setup file for paraview-3.x # Setup file for paraview-3.x
@ -49,7 +49,7 @@ foreach cmake ( cmake-2.8.4 cmake-2.8.3 cmake-2.8.1 )
end end
#- ParaView version, automatically determine major version: #- ParaView version, automatically determine major version:
setenv ParaView_VERSION 3.8.0 setenv ParaView_VERSION 3.10.1
setenv ParaView_MAJOR detect setenv ParaView_MAJOR detect

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# paraview3/bashrc # config/paraview.sh
# #
# Description # Description
# Setup file for paraview-3.x # Setup file for paraview-3.x
@ -51,7 +51,7 @@ done
#- ParaView version, automatically determine major version #- ParaView version, automatically determine major version
export ParaView_VERSION=3.8.0 export ParaView_VERSION=3.10.1
export ParaView_MAJOR=detect export ParaView_MAJOR=detect
@ -113,7 +113,6 @@ else
unset PV_PLUGIN_PATH unset PV_PLUGIN_PATH
fi fi
unset _foamParaviewEval unset _foamParaviewEval
unset cleaned cmake paraviewInstDir paraviewPython unset cleaned cmake paraviewInstDir paraviewPython

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# scotch/bashrc # config/scotch.sh
# #
# Description # Description
# Setup file for scotch include/libraries. # Setup file for scotch include/libraries.
@ -36,5 +36,4 @@
export SCOTCH_VERSION=scotch_5.1.11 export SCOTCH_VERSION=scotch_5.1.11
export SCOTCH_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$SCOTCH_VERSION export SCOTCH_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$SCOTCH_VERSION
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# etc/settings.csh # etc/config/settings.csh
# #
# Description # Description
# Startup file for OpenFOAM # Startup file for OpenFOAM
@ -193,7 +193,7 @@ unsetenv MPFR_ARCH_PATH GMP_ARCH_PATH
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if ( ! $?foamCompiler ) then if ( ! $?foamCompiler ) then
set foamCompiler=system set foamCompiler=system
echo "Warning in $WM_PROJECT_DIR/etc/settings.csh:" echo "Warning in $WM_PROJECT_DIR/etc/config/settings.csh:"
echo " foamCompiler not set, using '$foamCompiler'" echo " foamCompiler not set, using '$foamCompiler'"
endif endif
@ -241,7 +241,7 @@ case ThirdParty:
breaksw breaksw
default: default:
echo echo
echo "Warning in $WM_PROJECT_DIR/etc/settings.csh:" echo "Warning in $WM_PROJECT_DIR/etc/config/settings.csh:"
echo " Unknown OpenFOAM compiler type '$WM_COMPILER'" echo " Unknown OpenFOAM compiler type '$WM_COMPILER'"
echo " Please check your settings" echo " Please check your settings"
echo echo
@ -262,7 +262,7 @@ case ThirdParty:
# Check that the compiler directory can be found # Check that the compiler directory can be found
if ( ! -d "$gccDir" ) then if ( ! -d "$gccDir" ) then
echo echo
echo "Warning in $WM_PROJECT_DIR/etc/settings.csh:" echo "Warning in $WM_PROJECT_DIR/etc/config/settings.csh:"
echo " Cannot find $gccDir installation." echo " Cannot find $gccDir installation."
echo " Please install this compiler version or if you wish to use the system compiler," echo " Please install this compiler version or if you wish to use the system compiler,"
echo " change the 'foamCompiler' setting to 'system'" echo " change the 'foamCompiler' setting to 'system'"
@ -302,7 +302,7 @@ case ThirdParty:
# Check that the compiler directory can be found # Check that the compiler directory can be found
if ( ! -d "$clangDir" ) then if ( ! -d "$clangDir" ) then
echo echo
echo "Warning in $WM_PROJECT_DIR/etc/settings.csh:" echo "Warning in $WM_PROJECT_DIR/etc/config/settings.csh:"
echo " Cannot find $clangDir installation." echo " Cannot find $clangDir installation."
echo " Please install this compiler version or if you wish to use the system compiler," echo " Please install this compiler version or if you wish to use the system compiler,"
echo " change the 'foamCompiler' setting to 'system'" echo " change the 'foamCompiler' setting to 'system'"

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# etc/settings.sh # etc/config/settings.sh
# #
# Description # Description
# Startup file for OpenFOAM # Startup file for OpenFOAM
@ -215,7 +215,7 @@ unset MPFR_ARCH_PATH GMP_ARCH_PATH
if [ -z "$foamCompiler" ] if [ -z "$foamCompiler" ]
then then
foamCompiler=system foamCompiler=system
echo "Warning in $WM_PROJECT_DIR/etc/settings.sh:" 1>&2 echo "Warning in $WM_PROJECT_DIR/etc/config/settings.sh:" 1>&2
echo " foamCompiler not set, using '$foamCompiler'" 1>&2 echo " foamCompiler not set, using '$foamCompiler'" 1>&2
fi fi
@ -258,7 +258,7 @@ OpenFOAM | ThirdParty)
;; ;;
*) *)
echo echo
echo "Warning in $WM_PROJECT_DIR/etc/settings.sh:" echo "Warning in $WM_PROJECT_DIR/etc/config/settings.sh:"
echo " Unknown OpenFOAM compiler type '$WM_COMPILER'" echo " Unknown OpenFOAM compiler type '$WM_COMPILER'"
echo " Please check your settings" echo " Please check your settings"
echo echo
@ -278,7 +278,7 @@ OpenFOAM | ThirdParty)
# Check that the compiler directory can be found # Check that the compiler directory can be found
[ -d "$gccDir" ] || { [ -d "$gccDir" ] || {
echo echo
echo "Warning in $WM_PROJECT_DIR/etc/settings.sh:" echo "Warning in $WM_PROJECT_DIR/etc/config/settings.sh:"
echo " Cannot find $gccDir installation." echo " Cannot find $gccDir installation."
echo " Please install this compiler version or if you wish to use the system compiler," echo " Please install this compiler version or if you wish to use the system compiler,"
echo " change the 'foamCompiler' setting to 'system'" echo " change the 'foamCompiler' setting to 'system'"
@ -322,7 +322,7 @@ OpenFOAM | ThirdParty)
# Check that the compiler directory can be found # Check that the compiler directory can be found
[ -d "$clangDir" ] || { [ -d "$clangDir" ] || {
echo echo
echo "Warning in $WM_PROJECT_DIR/etc/settings.sh:" echo "Warning in $WM_PROJECT_DIR/etc/config/settings.sh:"
echo " Cannot find $clangDir installation." echo " Cannot find $clangDir installation."
echo " Please install this compiler version or if you wish to use the system compiler," echo " Please install this compiler version or if you wish to use the system compiler,"
echo " change the 'foamCompiler' setting to 'system'" echo " change the 'foamCompiler' setting to 'system'"

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# etc/unset.csh # etc/config/unset.csh
# #
# Description # Description
# Clear as many OpenFOAM environment settings as possible # Clear as many OpenFOAM environment settings as possible

View File

@ -22,7 +22,7 @@
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. # along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
# #
# File # File
# etc/unset.sh # etc/config/unset.sh
# #
# Description # Description
# Clear as many OpenFOAM environment settings as possible # Clear as many OpenFOAM environment settings as possible

View File

@ -494,6 +494,7 @@ DebugSwitches
geomCellLooper 0; geomCellLooper 0;
geometricSurfacePatch 0; geometricSurfacePatch 0;
global 0; global 0;
globalIndexAndTransform 0;
globalMeshData 0; globalMeshData 0;
globalPoints 0; globalPoints 0;
gnuplot 0; gnuplot 0;

View File

@ -107,9 +107,6 @@ if ( $?WM_PROJECT_INST_DIR ) then
set foamOldDirs="$WM_PROJECT_INST_DIR $foamOldDirs" set foamOldDirs="$WM_PROJECT_INST_DIR $foamOldDirs"
endif endif
endif endif
if ( $?WM_PROJECT_SITE ) then
set foamOldDirs="$WM_PROJECT_SITE $foamOldDirs"
endif
# Location of installation # Location of installation
@ -124,7 +121,12 @@ setenv WM_THIRD_PARTY_DIR $WM_PROJECT_INST_DIR/ThirdParty-$WM_PROJECT_VERSION
# Location of site-specific templates etc # Location of site-specific templates etc
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# unset is equivalent to $WM_PROJECT_INST_DIR/site # unset is equivalent to $WM_PROJECT_INST_DIR/site
unsetenv WM_PROJECT_SITE if ( $?WM_PROJECT_SITE ) then
set foamOldDirs="$WM_PROJECT_SITE $foamOldDirs"
if ( ! -d "$WM_PROJECT_SITE" ) unsetenv WM_PROJECT_SITE
else
unsetenv WM_PROJECT_SITE
endif
# Location of user files # Location of user files
# ~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~
@ -138,7 +140,7 @@ alias _foamSource 'if ($?FOAM_VERBOSE && $?prompt) echo "Sourcing: \!*"; if (\!*
_foamSource `$WM_PROJECT_DIR/bin/foamEtcFile prefs.csh` _foamSource `$WM_PROJECT_DIR/bin/foamEtcFile prefs.csh`
# Evaluate command-line parameters and record settings for later # Evaluate command-line parameters and record settings for later
# these can be used to set/unset values, or specify prefs files # these can be used to set/unset values, or specify alternative pref files
setenv FOAM_SETTINGS "${*}" setenv FOAM_SETTINGS "${*}"
while ( $#argv > 0 ) while ( $#argv > 0 )
switch ($argv[1]) switch ($argv[1])
@ -194,13 +196,13 @@ if ( $status == 0 ) setenv MANPATH $cleaned
# Source project setup files # Source project setup files
# ~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~
_foamSource $WM_PROJECT_DIR/etc/settings.csh _foamSource $WM_PROJECT_DIR/etc/config/settings.csh
_foamSource $WM_PROJECT_DIR/etc/aliases.csh _foamSource $WM_PROJECT_DIR/etc/config/aliases.csh
# Source user setup files for optional packages # Source user setup files for optional packages
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_foamSource `$WM_PROJECT_DIR/bin/foamEtcFile apps/paraview3/cshrc` _foamSource `$WM_PROJECT_DIR/bin/foamEtcFile config/paraview.csh`
_foamSource `$WM_PROJECT_DIR/bin/foamEtcFile apps/ensight/cshrc` _foamSource `$WM_PROJECT_DIR/bin/foamEtcFile config/ensight.csh`
# Clean environment paths again. Only remove duplicates # Clean environment paths again. Only remove duplicates

View File

@ -71,6 +71,27 @@ void Foam::dynamicCode::checkSecurity
<< "using dlopen)" << "using dlopen)"
<< exit(FatalIOError); << exit(FatalIOError);
} }
if (!allowSystemOperations)
{
FatalIOErrorIn
(
title,
dict
) << "Loading a shared library using case-supplied code is not"
<< " enabled by default" << nl
<< "because of security issues. If you trust the code you can"
<< " enable this" << nl
<< "facility be adding to the InfoSwitches setting in the system"
<< " controlDict:" << nl << nl
<< " allowSystemOperations 1" << nl << nl
<< "The system controlDict is either" << nl << nl
<< " ~/.OpenFOAM/$WM_PROJECT_VERSION/controlDict" << nl << nl
<< "or" << nl << nl
<< " $WM_PROJECT_DIR/etc/controlDict" << nl
<< endl
<< exit(FatalIOError);
}
} }
@ -400,26 +421,6 @@ bool Foam::dynamicCode::copyOrCreateFiles(const bool verbose) const
Info<< "Creating new library in " << this->libRelPath() << endl; Info<< "Creating new library in " << this->libRelPath() << endl;
} }
if (!allowSystemOperations)
{
FatalErrorIn
(
"dynamicCode::copyOrCreateFiles() const"
) << "Loading a shared library using case-supplied code is not"
<< " enabled by default" << nl
<< "because of security issues. If you trust the code you can"
<< " enable this" << nl
<< "facility be adding to the InfoSwitches setting in the system"
<< " controlDict:" << nl << nl
<< " allowSystemOperations 1" << nl << nl
<< "The system controlDict is either" << nl << nl
<< " ~/.OpenFOAM/$WM_PROJECT_VERSION/controlDict" << nl << nl
<< "or" << nl << nl
<< " $WM_PROJECT_DIR/etc/controlDict" << nl
<< endl
<< exit(FatalError);
}
const label nFiles = compileFiles_.size() + copyFiles_.size(); const label nFiles = compileFiles_.size() + copyFiles_.size();
DynamicList<fileName> resolvedFiles(nFiles); DynamicList<fileName> resolvedFiles(nFiles);

View File

@ -414,11 +414,11 @@ Foam::argList::argList
( (
( (
validOptions.found(optionName) validOptions.found(optionName)
&& validOptions[optionName] != "" && !validOptions[optionName].empty()
) )
|| ( || (
validParOptions.found(optionName) validParOptions.found(optionName)
&& validParOptions[optionName] != "" && !validParOptions[optionName].empty()
) )
) )
{ {
@ -833,6 +833,116 @@ Foam::argList::~argList()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::argList::setOption(const word& opt, const string& param)
{
bool changed = false;
// only allow valid options
if (validOptions.found(opt))
{
// some options are to be protected
if
(
opt == "case"
|| opt == "parallel"
|| opt == "roots"
)
{
FatalError
<<"used argList::setOption on a protected option: '"
<< opt << "'" << endl;
FatalError.exit();
}
if (validOptions[opt].empty())
{
// bool option
if (!param.empty())
{
// disallow change of type
FatalError
<<"used argList::setOption to change bool to non-bool: '"
<< opt << "'" << endl;
FatalError.exit();
}
else
{
// did not previously exist
changed = !options_.found(opt);
}
}
else
{
// non-bool option
if (param.empty())
{
// disallow change of type
FatalError
<<"used argList::setOption to change non-bool to bool: '"
<< opt << "'" << endl;
FatalError.exit();
}
else
{
// existing value needs changing, or did not previously exist
changed = options_.found(opt) ? options_[opt] != param : true;
}
}
}
else
{
FatalError
<<"used argList::setOption on an invalid option: '"
<< opt << "'" << nl << "allowed are the following:"
<< validOptions << endl;
FatalError.exit();
}
// set/change the option as required
if (changed)
{
options_.set(opt, param);
}
return changed;
}
bool Foam::argList::unsetOption(const word& opt)
{
// only allow valid options
if (validOptions.found(opt))
{
// some options are to be protected
if
(
opt == "case"
|| opt == "parallel"
|| opt == "roots"
)
{
FatalError
<<"used argList::unsetOption on a protected option: '"
<< opt << "'" << endl;
FatalError.exit();
}
// remove the option, return true if state changed
return options_.erase(opt);
}
else
{
FatalError
<<"used argList::unsetOption on an invalid option: '"
<< opt << "'" << nl << "allowed are the following:"
<< validOptions << endl;
FatalError.exit();
}
return false;
}
void Foam::argList::printNotes() const void Foam::argList::printNotes() const
{ {
// output notes directly - no automatic text wrapping // output notes directly - no automatic text wrapping

View File

@ -334,6 +334,19 @@ public:
static void noParallel(); static void noParallel();
//- Set option directly (use with caution)
// An option with an empty param is a bool option.
// Not all valid options can also be set: eg, -case, -roots, ...
// Return true if the existing option value needed changing,
// or if the option did not previously exist.
bool setOption(const word& opt, const string& param = "");
//- Unset option directly (use with caution)
// Not all valid options can also be unset: eg, -case, -roots ...
// Return true if the option existed before being unset.
bool unsetOption(const word& opt);
// Print // Print
//- Print notes (if any) //- Print notes (if any)

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) 2004-2010 OpenCFD Ltd. \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -124,7 +124,7 @@ bool Foam::matchPoints
{ {
label faceI = pts1MagSqr.indices()[j]; label faceI = pts1MagSqr.indices()[j];
Pout<< "Compared coord:" << pts1[faceI] Pout<< " Compared coord:" << pts1[faceI]
<< " with difference to point " << " with difference to point "
<< mag(pts1[faceI] - pts0[face0I]) << endl; << mag(pts1[faceI] - pts0[face0I]) << endl;
} }

View File

@ -57,6 +57,30 @@ Foam::label Foam::globalPoints::countPatchPoints
} }
Foam::label Foam::globalPoints::findSamePoint
(
const labelPairList& allInfo,
const labelPair& info
) const
{
const label procI = globalIndexAndTransform::processor(info);
const label index = globalIndexAndTransform::index(info);
forAll(allInfo, i)
{
if
(
globalIndexAndTransform::processor(allInfo[i]) == procI
&& globalIndexAndTransform::index(allInfo[i]) == index
)
{
return i;
}
}
return -1;
}
Foam::labelPairList Foam::globalPoints::addSendTransform Foam::labelPairList Foam::globalPoints::addSendTransform
( (
const label patchI, const label patchI,
@ -67,6 +91,15 @@ Foam::labelPairList Foam::globalPoints::addSendTransform
forAll(info, i) forAll(info, i)
{ {
//Pout<< " adding send transform to" << nl
// << " proc:" << globalIndexAndTransform::processor(info[i])
// << nl
// << " index:" << globalIndexAndTransform::index(info[i]) << nl
// << " trafo:"
// << globalTransforms_.decodeTransformIndex
// (globalIndexAndTransform::transformIndex(info[i]))
// << endl;
sendInfo[i] = globalIndexAndTransform::encode sendInfo[i] = globalIndexAndTransform::encode
( (
globalIndexAndTransform::processor(info[i]), globalIndexAndTransform::processor(info[i]),
@ -129,72 +162,63 @@ bool Foam::globalPoints::mergeInfo
{ {
bool anyChanged = false; bool anyChanged = false;
// Extend to make space for the nbrInfo (trimmed later)
labelPairList newInfo(myInfo); labelPairList newInfo(myInfo);
label newI = newInfo.size(); label newI = newInfo.size();
newInfo.setSize(newI + nbrInfo.size()); newInfo.setSize(newI + nbrInfo.size());
forAll(nbrInfo, i) forAll(nbrInfo, i)
{ {
const labelPair& info = nbrInfo[i];
label nbrProcI = globalIndexAndTransform::processor(info);
label nbrIndex = globalIndexAndTransform::index(info);
label nbrTransform = globalIndexAndTransform::transformIndex(info);
// Check if already have information about nbr point. There are two // Check if already have information about nbr point. There are two
// possibilities: // possibilities:
// - information found about same point but different transform. // - information found about same point but different transform.
// Combine transforms // Combine transforms
// - information not found. // - information not found.
label myIndex = -1; label index = findSamePoint(myInfo, nbrInfo[i]);
forAll(myInfo, myI)
{
if (myInfo[myI] == info)
{
// Fully identical. We already have nbrInfo.
myIndex = myI;
}
else if
(
globalIndexAndTransform::processor(myInfo[myI]) == nbrProcI
&& globalIndexAndTransform::index(myInfo[myI]) == nbrIndex
)
{
// Only differing is the transform.
label myTransform = globalIndexAndTransform::transformIndex
(
myInfo[myI]
);
// Combine mine and nbr transform if (index == -1)
label t = globalTransforms_.mergeTransformIndex
(
nbrTransform,
myTransform
);
myIndex = myI;
if (t != myTransform)
{
// Same point but different transformation
newInfo[myI] = globalIndexAndTransform::encode
(
nbrProcI,
nbrIndex,
t
);
anyChanged = true;
break;
}
}
}
if (myIndex == -1)
{ {
// New point // New point
newInfo[newI++] = nbrInfo[i]; newInfo[newI++] = nbrInfo[i];
anyChanged = true; anyChanged = true;
} }
else
{
// Same point. So we already have a connection between localPointI
// and the nbrIndex. Two situations:
// - same transform
// - one transform takes two steps, the other just a single.
if (myInfo[index] == nbrInfo[i])
{
// Everything same (so also transform). Nothing changed.
}
else
{
label myTransform = globalIndexAndTransform::transformIndex
(
myInfo[index]
);
label nbrTransform = globalIndexAndTransform::transformIndex
(
nbrInfo[i]
);
// Different transform. See which is 'simplest'.
label minTransform = globalTransforms_.minimumTransformIndex
(
myTransform,
nbrTransform
);
if (minTransform != myTransform)
{
// Use nbr info.
newInfo[index] = nbrInfo[i];
anyChanged = true;
}
}
}
} }
newInfo.setSize(newI); newInfo.setSize(newI);
@ -327,7 +351,7 @@ void Foam::globalPoints::printProcPoints
label index = globalIndexAndTransform::index(pointInfo[i]); label index = globalIndexAndTransform::index(pointInfo[i]);
label trafoI = globalIndexAndTransform::transformIndex(pointInfo[i]); label trafoI = globalIndexAndTransform::transformIndex(pointInfo[i]);
Pout<< "proc:" << procI; Pout<< " proc:" << procI;
Pout<< " localpoint:"; Pout<< " localpoint:";
Pout<< index; Pout<< index;
Pout<< " through transform:" Pout<< " through transform:"
@ -386,6 +410,10 @@ void Foam::globalPoints::initOwnPoints
) )
); );
//Pout<< "For point "<< pp.points()[meshPointI]
// << " inserting info " << knownInfo
// << endl;
// Update changedpoints info. // Update changedpoints info.
if (storeInitialInfo(knownInfo, localPointI)) if (storeInitialInfo(knownInfo, localPointI))
{ {
@ -613,80 +641,59 @@ void Foam::globalPoints::receivePatchPoints
label meshPointA = meshPoints[i]; label meshPointA = meshPoints[i];
label meshPointB = coupledMeshPoints[i]; label meshPointB = coupledMeshPoints[i];
//Pout<< "Connection between point " << meshPointA if (meshPointA != meshPointB)
// << " at " << mesh_.points()[meshPointA]
// << " and " << meshPointB
// << " at " << mesh_.points()[meshPointB] << endl;
label localA = meshToLocalPoint
(
meshToPatchPoint,
meshPointA
);
label localB = meshToLocalPoint
(
meshToPatchPoint,
meshPointB
);
// Do we have information on pointA?
Map<label>::iterator procPointA =
meshToProcPoint_.find(localA);
labelPairList infoA;
if (procPointA != meshToProcPoint_.end())
{ {
infoA = addSendTransform //Pout<< "Connection between point " << meshPointA
// << " at " << mesh_.points()[meshPointA]
// << " and " << meshPointB
// << " at " << mesh_.points()[meshPointB] << endl;
label localA = meshToLocalPoint
( (
cycPatch.index(), meshToPatchPoint,
procPoints_[procPointA()] meshPointA
); );
} label localB = meshToLocalPoint
// Same for info on pointB
Map<label>::iterator procPointB =
meshToProcPoint_.find(localB);
labelPairList infoB;
if (procPointB != meshToProcPoint_.end())
{
infoB = addSendTransform
( (
cycPatch.neighbPatchID(), meshToPatchPoint,
procPoints_[procPointB()] meshPointB
); );
}
if (infoA.size()) // Do we have information on pointA?
{ Map<label>::iterator procPointA =
if (mergeInfo(infoA, localB)) meshToProcPoint_.find(localA);
if (procPointA != meshToProcPoint_.end())
{ {
//Pout<< " Combined info at point " const labelPairList infoA = addSendTransform
// << mesh_.points()[meshPointB] (
// << " now " << endl; cycPatch.index(),
//printProcPoints procPoints_[procPointA()]
//( );
// patchToMeshPoint,
// procPoints_[meshToProcPoint_[localB]] if (mergeInfo(infoA, localB))
//); {
changedPoints.insert(localB); changedPoints.insert(localB);
}
} }
}
if (infoB.size()) // Same for info on pointB
{ Map<label>::iterator procPointB =
if (mergeInfo(infoB, localA)) meshToProcPoint_.find(localB);
if (procPointB != meshToProcPoint_.end())
{ {
//Pout<< " Combined info at point " const labelPairList infoB = addSendTransform
// << mesh_.points()[meshPointA] (
// << " now " << endl; cycPatch.neighbPatchID(),
//printProcPoints procPoints_[procPointB()]
//( );
// patchToMeshPoint,
// procPoints_[meshToProcPoint_[localA]] if (mergeInfo(infoB, localA))
//); {
changedPoints.insert(localA); changedPoints.insert(localA);
}
} }
} }
} }
@ -842,6 +849,9 @@ void Foam::globalPoints::calculateSharedPoints
{ {
Pout<< "globalPoints::calculateSharedPoints(..) : " Pout<< "globalPoints::calculateSharedPoints(..) : "
<< "doing processor to processor communication to get sharedPoints" << "doing processor to processor communication to get sharedPoints"
<< endl
<< " keepAllPoints :" << keepAllPoints << endl
<< " mergeSeparated:" << mergeSeparated << endl
<< endl; << endl;
} }
@ -948,7 +958,7 @@ void Foam::globalPoints::calculateSharedPoints
// printProcPoints(patchToMeshPoint, pointInfo); // printProcPoints(patchToMeshPoint, pointInfo);
// Pout<< endl; // Pout<< endl;
//} //}
//
// Remove direct neighbours from point equivalences. // Remove direct neighbours from point equivalences.
if (!keepAllPoints) if (!keepAllPoints)

View File

@ -143,6 +143,13 @@ class globalPoints
// information is collected. // information is collected.
static label countPatchPoints(const polyBoundaryMesh&); static label countPatchPoints(const polyBoundaryMesh&);
//- Find index of same processor+index
label findSamePoint
(
const labelPairList& allInfo,
const labelPair& info
) const;
labelPairList addSendTransform labelPairList addSendTransform
( (
const label patchI, const label patchI,

View File

@ -24,11 +24,12 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "globalIndexAndTransform.H" #include "globalIndexAndTransform.H"
#include "coupledPolyPatch.H"
#include "cyclicPolyPatch.H" #include "cyclicPolyPatch.H"
// * * * * * * * * * * * * Private Static Data Members * * * * * * * * * * * // // * * * * * * * * * * * * Private Static Data Members * * * * * * * * * * * //
defineTypeNameAndDebug(Foam::globalIndexAndTransform, 0);
const Foam::label Foam::globalIndexAndTransform::base_ = 32; const Foam::label Foam::globalIndexAndTransform::base_ = 32;
@ -135,7 +136,19 @@ void Foam::globalIndexAndTransform::determineTransforms()
{ {
const polyPatch& pp = patches[patchI]; const polyPatch& pp = patches[patchI];
if (isA<coupledPolyPatch>(pp)) // Note: special check for unordered cyclics. These are in fact
// transform bcs and should probably be split off.
if
(
isA<coupledPolyPatch>(pp)
&& !(
isA<cyclicPolyPatch>(pp)
&& (
refCast<const cyclicPolyPatch>(pp).transform()
== cyclicPolyPatch::NOORDERING
)
)
)
{ {
const coupledPolyPatch& cpp = refCast<const coupledPolyPatch>(pp); const coupledPolyPatch& cpp = refCast<const coupledPolyPatch>(pp);
@ -163,21 +176,19 @@ void Foam::globalIndexAndTransform::determineTransforms()
) == 0 ) == 0
) )
{ {
if (nextTrans == 6)
{
FatalErrorIn
(
"void Foam::globalIndexAndTransform::"
"determineTransforms()"
) << "More than six unsigned transforms"
<< " detected:" << nl << transforms_
<< exit(FatalError);
}
transforms_[nextTrans] = transform; transforms_[nextTrans] = transform;
maxTol[nextTrans++] = cpp.matchTolerance(); maxTol[nextTrans++] = cpp.matchTolerance();
} }
if (nextTrans > 6)
{
FatalErrorIn
(
"void Foam::globalIndexAndTransform::"
"determineTransforms()"
)
<< "More than six unsigned transforms detected:"
<< nl << transforms_
<< exit(FatalError);
}
} }
} }
} }
@ -205,21 +216,19 @@ void Foam::globalIndexAndTransform::determineTransforms()
) == 0 ) == 0
) )
{ {
if (nextTrans == 6)
{
FatalErrorIn
(
"void Foam::globalIndexAndTransform::"
"determineTransforms()"
) << "More than six unsigned transforms"
<< " detected:" << nl << transforms_
<< exit(FatalError);
}
transforms_[nextTrans] = transform; transforms_[nextTrans] = transform;
maxTol[nextTrans++] = cpp.matchTolerance(); maxTol[nextTrans++] = cpp.matchTolerance();
} }
if (nextTrans > 6)
{
FatalErrorIn
(
"void Foam::globalIndexAndTransform::"
"determineTransforms()"
)
<< "More than six unsigned transforms detected:"
<< nl << transforms_
<< exit(FatalError);
}
} }
} }
} }
@ -362,7 +371,19 @@ void Foam::globalIndexAndTransform::determinePatchTransformSign()
// Pout<< nl << patchI << " " << pp.name() << endl; // Pout<< nl << patchI << " " << pp.name() << endl;
if (isA<coupledPolyPatch>(pp)) // Note: special check for unordered cyclics. These are in fact
// transform bcs and should probably be split off.
if
(
isA<coupledPolyPatch>(pp)
&& !(
isA<cyclicPolyPatch>(pp)
&& (
refCast<const cyclicPolyPatch>(pp).transform()
== cyclicPolyPatch::NOORDERING
)
)
)
{ {
const coupledPolyPatch& cpp = const coupledPolyPatch& cpp =
refCast<const coupledPolyPatch>(pp); refCast<const coupledPolyPatch>(pp);
@ -478,6 +499,63 @@ Foam::globalIndexAndTransform::globalIndexAndTransform
determineTransformPermutations(); determineTransformPermutations();
determinePatchTransformSign(); determinePatchTransformSign();
if (debug && transforms_.size() > 0)
{
const polyBoundaryMesh& patches = mesh_.boundaryMesh();
Info<< "Determined global transforms :" << endl;
Info<< "\t\ttranslation\trotation" << endl;
forAll(transforms_, i)
{
Info<< '\t' << i << '\t';
const vectorTensorTransform& trafo = transforms_[i];
if (trafo.hasR())
{
Info<< trafo.t() << '\t' << trafo.R();
}
else
{
Info<< trafo.t() << '\t' << "---";
}
Info<< endl;
}
Info<< endl;
Info<< "\tpatch\ttransform\tsign" << endl;
forAll(patchTransformSign_, patchI)
{
if (patchTransformSign_[patchI].first() != -1)
{
Info<< '\t' << patches[patchI].name()
<< '\t' << patchTransformSign_[patchI].first()
<< '\t' << patchTransformSign_[patchI].second()
<< endl;
}
}
Info<< endl;
Info<< "Permutations of transformations:" << endl
<< "\t\ttranslation\trotation" << endl;
forAll(transformPermutations_, i)
{
Info<< '\t' << i << '\t';
const vectorTensorTransform& trafo = transformPermutations_[i];
if (trafo.hasR())
{
Info<< trafo.t() << '\t' << trafo.R();
}
else
{
Info<< trafo.t() << '\t' << "---";
}
Info<< endl;
}
Info<< "nullTransformIndex:" << nullTransformIndex() << endl
<< endl;
}
} }

View File

@ -164,6 +164,10 @@ public:
friend class globalPoints; friend class globalPoints;
// Declare name of the class and its debug switch
ClassName("globalIndexAndTransform");
// Constructors // Constructors
//- Construct from components //- Construct from components

View File

@ -267,85 +267,47 @@ Foam::label Foam::globalIndexAndTransform::addToTransformIndex
} }
Foam::label Foam::globalIndexAndTransform::mergeTransformIndex
(
const label transformIndex0,
const label transformIndex1
) const
{
FixedList<label, 3> permutation0 = decodeTransformIndex(transformIndex0);
FixedList<label, 3> permutation1 = decodeTransformIndex(transformIndex1);
forAll(permutation0, i)
{
if (permutation0[i] == 0)
{
// Take over whatever sign 1 has
permutation0[i] = permutation1[i];
}
else if (permutation1[i] != 0 && permutation0[i] != permutation1[i])
{
FatalErrorIn
(
"Foam::label "
"Foam::globalIndexAndTransform::addToTransformIndex\n"
"(\n"
"const label,\n"
"const label\n"
") const\n"
) << "More than one patch accessing the same transform "
<< "but not of the same sign." << endl
<< "Trying to combine two transforms " << transformIndex0
<< " with signs " << permutation0
<< " and " << transformIndex1
<< " with signs " << permutation1
<< exit(FatalError);
}
}
return encodeTransformIndex(permutation0);
}
Foam::label Foam::globalIndexAndTransform::minimumTransformIndex Foam::label Foam::globalIndexAndTransform::minimumTransformIndex
( (
const label transformIndex0, const label transformIndex0,
const label transformIndex1 const label transformIndex1
) const ) const
{ {
FixedList<label, 3> permutation0 = decodeTransformIndex(transformIndex0); if (transformIndex0 == transformIndex1)
FixedList<label, 3> permutation1 = decodeTransformIndex(transformIndex1); {
return transformIndex0;
}
// Count number of transforms
FixedList<label, 3> permutation0 = decodeTransformIndex(transformIndex0);
label n0 = 0;
forAll(permutation0, i) forAll(permutation0, i)
{ {
if (permutation0[i] == 0) if (permutation0[i] != 0)
{ {
// 0 wins. n0++;
}
else if (permutation1[i] == 0)
{
// 0 wins.
permutation0[i] = permutation1[i];
}
else if (permutation0[i] != permutation1[i])
{
FatalErrorIn
(
"Foam::label "
"Foam::globalIndexAndTransform::minimumTransformIndex\n"
"(\n"
"const label,\n"
"const label\n"
") const\n"
) << "More than one patch accessing the same transform "
<< "but not of the same sign." << endl
<< "Trying to combine two transforms " << transformIndex0
<< " with signs " << permutation0
<< " and " << transformIndex1
<< " with signs " << permutation1
<< exit(FatalError);
} }
} }
return encodeTransformIndex(permutation0);
FixedList<label, 3> permutation1 = decodeTransformIndex(transformIndex1);
label n1 = 0;
forAll(permutation1, i)
{
if (permutation1[i] != 0)
{
n1++;
}
}
if (n0 <= n1)
{
return transformIndex0;
}
else
{
return transformIndex1;
}
} }

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) 2004-2010 OpenCFD Ltd. \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -40,6 +40,48 @@ Foam::dynamicFvMesh::dynamicFvMesh(const IOobject& io)
{} {}
Foam::dynamicFvMesh::dynamicFvMesh
(
const IOobject& io,
const Xfer<pointField>& points,
const Xfer<faceList>& faces,
const Xfer<labelList>& allOwner,
const Xfer<labelList>& allNeighbour,
const bool syncPar
)
:
fvMesh
(
io,
points,
faces,
allOwner,
allNeighbour,
syncPar
)
{}
Foam::dynamicFvMesh::dynamicFvMesh
(
const IOobject& io,
const Xfer<pointField>& points,
const Xfer<faceList>& faces,
const Xfer<cellList>& cells,
const bool syncPar
)
:
fvMesh
(
io,
points,
faces,
cells,
syncPar
)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::dynamicFvMesh::~dynamicFvMesh() Foam::dynamicFvMesh::~dynamicFvMesh()

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) 2004-2010 OpenCFD Ltd. \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -85,6 +85,29 @@ public:
//- Construct from objectRegistry, and read/write options //- Construct from objectRegistry, and read/write options
explicit dynamicFvMesh(const IOobject& io); explicit dynamicFvMesh(const IOobject& io);
//- Construct from components without boundary.
// Boundary is added using addFvPatches() member function
dynamicFvMesh
(
const IOobject& io,
const Xfer<pointField>& points,
const Xfer<faceList>& faces,
const Xfer<labelList>& allOwner,
const Xfer<labelList>& allNeighbour,
const bool syncPar = true
);
//- Construct without boundary from cells rather than owner/neighbour.
// Boundary is added using addPatches() member function
dynamicFvMesh
(
const IOobject& io,
const Xfer<pointField>& points,
const Xfer<faceList>& faces,
const Xfer<cellList>& cells,
const bool syncPar = true
);
// Selectors // Selectors

View File

@ -7,6 +7,7 @@ wmake $makeType distributionModels
wmake $makeType basic wmake $makeType basic
wmake $makeType solidParticle wmake $makeType solidParticle
wmake $makeType intermediate wmake $makeType intermediate
wmake $makeType spray
wmake $makeType dieselSpray wmake $makeType dieselSpray
wmake $makeType dsmc wmake $makeType dsmc
wmake $makeType coalCombustion wmake $makeType coalCombustion

View File

@ -126,17 +126,6 @@ void Foam::KinematicCloud<CloudType>::solve(TrackData& td)
} }
template<class CloudType>
void Foam::KinematicCloud<CloudType>::preEvolve()
{
Info<< "\nSolving cloud " << this->name() << endl;
this->dispersion().cacheFields(true);
forces_.cacheFields(true);
updateCellOccupancy();
}
template<class CloudType> template<class CloudType>
void Foam::KinematicCloud<CloudType>::buildCellOccupancy() void Foam::KinematicCloud<CloudType>::buildCellOccupancy()
{ {
@ -310,6 +299,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
U_(U), U_(U),
mu_(mu), mu_(mu),
g_(g), g_(g),
pAmbient_(0.0),
forces_ forces_
( (
*this, *this,
@ -403,6 +393,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
U_(c.U_), U_(c.U_),
mu_(c.mu_), mu_(c.mu_),
g_(c.g_), g_(c.g_),
pAmbient_(c.pAmbient_),
forces_(c.forces_), forces_(c.forces_),
functions_(c.functions_), functions_(c.functions_),
dispersionModel_(c.dispersionModel_->clone()), dispersionModel_(c.dispersionModel_->clone()),
@ -478,6 +469,7 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
U_(c.U_), U_(c.U_),
mu_(c.mu_), mu_(c.mu_),
g_(c.g_), g_(c.g_),
pAmbient_(c.pAmbient_),
forces_(*this, mesh), forces_(*this, mesh),
functions_(*this), functions_(*this),
dispersionModel_(NULL), dispersionModel_(NULL),
@ -506,6 +498,17 @@ bool Foam::KinematicCloud<CloudType>::hasWallImpactDistance() const
} }
template<class CloudType>
void Foam::KinematicCloud<CloudType>::setParcelThermoProperties
(
parcelType& parcel,
const scalar lagrangianDt
)
{
parcel.rho() = constProps_.rho0();
}
template<class CloudType> template<class CloudType>
void Foam::KinematicCloud<CloudType>::checkParcelProperties void Foam::KinematicCloud<CloudType>::checkParcelProperties
( (
@ -514,11 +517,6 @@ void Foam::KinematicCloud<CloudType>::checkParcelProperties
const bool fullyDescribed const bool fullyDescribed
) )
{ {
if (!fullyDescribed)
{
parcel.rho() = constProps_.rho0();
}
const scalar carrierDt = mesh_.time().deltaTValue(); const scalar carrierDt = mesh_.time().deltaTValue();
parcel.stepFraction() = (carrierDt - lagrangianDt)/carrierDt; parcel.stepFraction() = (carrierDt - lagrangianDt)/carrierDt;
parcel.typeId() = constProps_.parcelTypeId(); parcel.typeId() = constProps_.parcelTypeId();
@ -600,6 +598,20 @@ void Foam::KinematicCloud<CloudType>::scaleSources()
} }
template<class CloudType>
void Foam::KinematicCloud<CloudType>::preEvolve()
{
Info<< "\nSolving cloud " << this->name() << endl;
this->dispersion().cacheFields(true);
forces_.cacheFields(true);
updateCellOccupancy();
pAmbient_ = constProps_.dict().template
lookupOrDefault<scalar>("pAmbient", pAmbient_);
}
template<class CloudType> template<class CloudType>
void Foam::KinematicCloud<CloudType>::evolve() void Foam::KinematicCloud<CloudType>::evolve()
{ {

View File

@ -176,6 +176,9 @@ protected:
//- Gravity //- Gravity
const dimensionedVector& g_; const dimensionedVector& g_;
//- Averaged ambient domain pressure
scalar pAmbient_;
//- Optional particle forces //- Optional particle forces
forceType forces_; forceType forces_;
@ -230,9 +233,6 @@ protected:
template<class TrackData> template<class TrackData>
void solve(TrackData& td); void solve(TrackData& td);
//- Pre-evolve
void preEvolve();
//- Build the cellOccupancy //- Build the cellOccupancy
void buildCellOccupancy(); void buildCellOccupancy();
@ -367,6 +367,12 @@ public:
//- Gravity //- Gravity
inline const dimensionedVector& g() const; inline const dimensionedVector& g() const;
//- Return const-access to the ambient pressure
inline scalar pAmbient() const;
//- Return reference to the ambient pressure
inline scalar& pAmbient();
//- Optional particle forces //- Optional particle forces
// inline const typename parcelType::forceType& forces() const; // inline const typename parcelType::forceType& forces() const;
@ -456,6 +462,12 @@ public:
//- Total rotational kinetic energy in the system //- Total rotational kinetic energy in the system
inline scalar rotationalKineticEnergyOfSystem() const; inline scalar rotationalKineticEnergyOfSystem() const;
//- Penetration for percentage of the current total mass
inline scalar penetration(const scalar& prc) const;
//- Mean diameter Dij
inline scalar Dij(const label i, const label j) const;
// Fields // Fields
@ -474,6 +486,13 @@ public:
// Cloud evolution functions // Cloud evolution functions
//- Set parcel thermo properties
void setParcelThermoProperties
(
parcelType& parcel,
const scalar lagrangianDt
);
//- Check parcel properties //- Check parcel properties
void checkParcelProperties void checkParcelProperties
( (
@ -514,6 +533,9 @@ public:
//- Apply scaling to (transient) cloud sources //- Apply scaling to (transient) cloud sources
void scaleSources(); void scaleSources();
//- Pre-evolve
void preEvolve();
//- Evolve the cloud //- Evolve the cloud
void evolve(); void evolve();

View File

@ -109,6 +109,20 @@ inline const Foam::dimensionedVector& Foam::KinematicCloud<CloudType>::g() const
} }
template<class CloudType>
inline Foam::scalar Foam::KinematicCloud<CloudType>::pAmbient() const
{
return pAmbient_;
}
template<class CloudType>
inline Foam::scalar& Foam::KinematicCloud<CloudType>::pAmbient()
{
return pAmbient_;
}
template<class CloudType> template<class CloudType>
//inline const typename CloudType::parcelType::forceType& //inline const typename CloudType::parcelType::forceType&
inline const typename Foam::KinematicCloud<CloudType>::forceType& inline const typename Foam::KinematicCloud<CloudType>::forceType&
@ -264,6 +278,131 @@ Foam::KinematicCloud<CloudType>::rotationalKineticEnergyOfSystem() const
} }
template<class CloudType>
inline Foam::scalar Foam::KinematicCloud<CloudType>::Dij
(
const label i,
const label j
) const
{
scalar si = 0.0;
scalar sj = 0.0;
forAllConstIter(typename KinematicCloud<CloudType>, *this, iter)
{
const parcelType& p = iter();
si += p.nParticle()*pow(p.d(), i);
sj += p.nParticle()*pow(p.d(), j);
}
reduce(si, sumOp<scalar>());
reduce(sj, sumOp<scalar>());
sj = max(sj, VSMALL);
return si/sj;
}
template<class CloudType>
inline Foam::scalar Foam::KinematicCloud<CloudType>::penetration
(
const scalar& prc
) const
{
scalar distance = 0.0;
scalar mTot = 0.0;
label np = this->size();
// arrays containing the parcels mass and
// distance from injector in ascending order
scalarField mass(np);
scalarField dist(np);
if (np > 0)
{
label n = 0;
// first arrange the parcels in ascending order
// the first parcel is closest to its injection position
// and the last one is most far away.
forAllConstIter(typename KinematicCloud<CloudType>, *this, iter)
{
const parcelType& p = iter();
scalar mi = p.nParticle()*p.mass();
scalar di = mag(p.position() - p.position0());
mTot += mi;
// insert at the last place
mass[n] = mi;
dist[n] = di;
label i = 0;
bool found = false;
// insert the parcel in the correct place
// and move the others
while ((i < n) && (!found))
{
if (di < dist[i])
{
found = true;
for (label j=n; j>i; j--)
{
mass[j] = mass[j-1];
dist[j] = dist[j-1];
}
mass[i] = mi;
dist[i] = di;
}
i++;
}
n++;
}
}
reduce(mTot, sumOp<scalar>());
if (np > 0)
{
scalar mLimit = prc*mTot;
scalar mOff = (1.0 - prc)*mTot;
if (np > 1)
{
// 'prc' is large enough that the parcel most far
// away will be used, no need to loop...
if (mLimit > mTot - mass[np-1])
{
distance = dist[np-1];
}
else
{
scalar mOffSum = 0.0;
label i = np;
while ((mOffSum < mOff) && (i>0))
{
i--;
mOffSum += mass[i];
}
distance =
dist[i+1]
+ (dist[i] - dist[i+1])*(mOffSum - mOff)
/mass[i+1] ;
}
}
else
{
distance = dist[0];
}
}
reduce(distance, maxOp<scalar>());
return distance;
}
template<class CloudType> template<class CloudType>
inline Foam::cachedRandom& Foam::KinematicCloud<CloudType>::rndGen() inline Foam::cachedRandom& Foam::KinematicCloud<CloudType>::rndGen()
{ {

View File

@ -174,6 +174,9 @@ public:
//- Return const access to the coupled flag //- Return const access to the coupled flag
inline const Switch coupled() const; inline const Switch coupled() const;
//- Return non-const access to the coupled flag
inline Switch& coupled();
//- Return const access to the cell value correction flag //- Return const access to the cell value correction flag
inline const Switch cellValueSourceCorrection() const; inline const Switch cellValueSourceCorrection() const;

View File

@ -101,6 +101,12 @@ inline Foam::scalar Foam::cloudSolution::trackTime() const
} }
inline Foam::Switch& Foam::cloudSolution::coupled()
{
return coupled_;
}
inline const Foam::Switch Foam::cloudSolution::coupled() const inline const Foam::Switch Foam::cloudSolution::coupled() const
{ {
return coupled_; return coupled_;

View File

@ -223,6 +223,20 @@ Foam::ReactingCloud<CloudType>::~ReactingCloud()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
void Foam::ReactingCloud<CloudType>::setParcelThermoProperties
(
parcelType& parcel,
const scalar lagrangianDt
)
{
CloudType::setParcelThermoProperties(parcel, lagrangianDt);
parcel.pc() = this->thermo().thermo().p()[parcel.cell()];
parcel.Y() = composition().YMixture0();
}
template<class CloudType> template<class CloudType>
void Foam::ReactingCloud<CloudType>::checkParcelProperties void Foam::ReactingCloud<CloudType>::checkParcelProperties
( (
@ -231,18 +245,9 @@ void Foam::ReactingCloud<CloudType>::checkParcelProperties
const bool fullyDescribed const bool fullyDescribed
) )
{ {
CloudType::checkParcelProperties CloudType::checkParcelProperties(parcel, lagrangianDt, fullyDescribed);
(
parcel,
lagrangianDt,
fullyDescribed
);
if (!fullyDescribed) if (fullyDescribed)
{
parcel.Y() = composition().YMixture0();
}
else
{ {
checkSuppliedComposition checkSuppliedComposition
( (

View File

@ -267,6 +267,13 @@ public:
// Cloud evolution functions // Cloud evolution functions
//- Set parcel thermo properties
void setParcelThermoProperties
(
parcelType& parcel,
const scalar lagrangianDt
);
//- Check parcel properties //- Check parcel properties
void checkParcelProperties void checkParcelProperties
( (

View File

@ -154,6 +154,25 @@ Foam::ReactingMultiphaseCloud<CloudType>::~ReactingMultiphaseCloud()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
void Foam::ReactingMultiphaseCloud<CloudType>::setParcelThermoProperties
(
parcelType& parcel,
const scalar lagrangianDt
)
{
CloudType::setParcelThermoProperties(parcel, lagrangianDt);
label idGas = this->composition().idGas();
label idLiquid = this->composition().idLiquid();
label idSolid = this->composition().idSolid();
parcel.YGas() = this->composition().Y0(idGas);
parcel.YLiquid() = this->composition().Y0(idLiquid);
parcel.YSolid() = this->composition().Y0(idSolid);
}
template<class CloudType> template<class CloudType>
void Foam::ReactingMultiphaseCloud<CloudType>::checkParcelProperties void Foam::ReactingMultiphaseCloud<CloudType>::checkParcelProperties
( (
@ -162,25 +181,14 @@ void Foam::ReactingMultiphaseCloud<CloudType>::checkParcelProperties
const bool fullyDescribed const bool fullyDescribed
) )
{ {
CloudType::checkParcelProperties CloudType::checkParcelProperties(parcel, lagrangianDt, fullyDescribed);
(
parcel,
lagrangianDt,
fullyDescribed
);
label idGas = this->composition().idGas(); if (fullyDescribed)
label idLiquid = this->composition().idLiquid(); {
label idSolid = this->composition().idSolid(); label idGas = this->composition().idGas();
label idLiquid = this->composition().idLiquid();
label idSolid = this->composition().idSolid();
if (!fullyDescribed)
{
parcel.YGas() = this->composition().Y0(idGas);
parcel.YLiquid() = this->composition().Y0(idLiquid);
parcel.YSolid() = this->composition().Y0(idSolid);
}
else
{
this->checkSuppliedComposition this->checkSuppliedComposition
( (
parcel.YGas(), parcel.YGas(),

View File

@ -41,7 +41,6 @@ SourceFiles
#ifndef ReactingMultiphaseCloud_H #ifndef ReactingMultiphaseCloud_H
#define ReactingMultiphaseCloud_H #define ReactingMultiphaseCloud_H
#include "ReactingCloud.H"
#include "reactingMultiphaseCloud.H" #include "reactingMultiphaseCloud.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -241,6 +240,13 @@ public:
// Cloud evolution functions // Cloud evolution functions
//- Set parcel thermo properties
void setParcelThermoProperties
(
parcelType& parcel,
const scalar lagrangianDt
);
//- Check parcel properties //- Check parcel properties
void checkParcelProperties void checkParcelProperties
( (

View File

@ -233,6 +233,20 @@ Foam::ThermoCloud<CloudType>::~ThermoCloud()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
void Foam::ThermoCloud<CloudType>::setParcelThermoProperties
(
parcelType& parcel,
const scalar lagrangianDt
)
{
CloudType::setParcelThermoProperties(parcel, lagrangianDt);
parcel.T() = constProps_.T0();
parcel.Cp() = constProps_.Cp0();
}
template<class CloudType> template<class CloudType>
void Foam::ThermoCloud<CloudType>::checkParcelProperties void Foam::ThermoCloud<CloudType>::checkParcelProperties
( (
@ -242,12 +256,6 @@ void Foam::ThermoCloud<CloudType>::checkParcelProperties
) )
{ {
CloudType::checkParcelProperties(parcel, lagrangianDt, fullyDescribed); CloudType::checkParcelProperties(parcel, lagrangianDt, fullyDescribed);
if (!fullyDescribed)
{
parcel.T() = constProps_.T0();
parcel.Cp() = constProps_.Cp0();
}
} }
@ -304,6 +312,15 @@ void Foam::ThermoCloud<CloudType>::scaleSources()
} }
template<class CloudType>
void Foam::ThermoCloud<CloudType>::preEvolve()
{
CloudType::preEvolve();
this->pAmbient() = thermo_.thermo().p().average().value();
}
template<class CloudType> template<class CloudType>
void Foam::ThermoCloud<CloudType>::evolve() void Foam::ThermoCloud<CloudType>::evolve()
{ {

View File

@ -281,6 +281,13 @@ public:
// Cloud evolution functions // Cloud evolution functions
//- Set parcel thermo properties
void setParcelThermoProperties
(
parcelType& parcel,
const scalar lagrangianDt
);
//- Check parcel properties //- Check parcel properties
void checkParcelProperties void checkParcelProperties
( (
@ -304,6 +311,9 @@ public:
//- Apply scaling to (transient) cloud sources //- Apply scaling to (transient) cloud sources
void scaleSources(); void scaleSources();
//- Pre-evolve
void preEvolve();
//- Evolve the cloud //- Evolve the cloud
void evolve(); void evolve();

View File

@ -124,6 +124,17 @@ public:
const bool readFields = true const bool readFields = true
); );
//- Construct from components
constantProperties
(
const label parcelTypeId,
const scalar rhoMin,
const scalar rho0,
const scalar minParticleMass,
const scalar youngsModulus,
const scalar poissonsRatio
);
// Member functions // Member functions
@ -536,6 +547,15 @@ public:
const scalar muc // carrier dynamic viscosity const scalar muc // carrier dynamic viscosity
) const; ) const;
//- Weber number
inline scalar We
(
const vector& U, // particle velocity
const scalar d, // particle diameter
const scalar rhoc, // carrier density
const scalar sigma // particle surface tension
) const;
// Main calculation loop // Main calculation loop

View File

@ -85,6 +85,26 @@ inline Foam::KinematicParcel<ParcelType>::constantProperties::constantProperties
} }
} }
template<class ParcelType>
inline Foam::KinematicParcel<ParcelType>::constantProperties::constantProperties
(
const label parcelTypeId,
const scalar rhoMin,
const scalar rho0,
const scalar minParticleMass,
const scalar youngsModulus,
const scalar poissonsRatio
)
:
dict_(dictionary::null),
parcelTypeId_(parcelTypeId),
rhoMin_(rhoMin),
rho0_(rho0),
minParticleMass_(minParticleMass),
youngsModulus_(youngsModulus),
poissonsRatio_(poissonsRatio)
{}
template<class ParcelType> template<class ParcelType>
inline Foam::KinematicParcel<ParcelType>::KinematicParcel inline Foam::KinematicParcel<ParcelType>::KinematicParcel
@ -522,4 +542,17 @@ inline Foam::scalar Foam::KinematicParcel<ParcelType>::Re
} }
template<class ParcelType>
inline Foam::scalar Foam::KinematicParcel<ParcelType>::We
(
const vector& U,
const scalar d,
const scalar rhoc,
const scalar sigma
) const
{
return rhoc*magSqr(U - Uc_)*d/(sigma + ROOTVSMALL);
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -38,8 +38,8 @@ SourceFiles
#ifndef ReactingMultiphaseParcel_H #ifndef ReactingMultiphaseParcel_H
#define ReactingMultiphaseParcel_H #define ReactingMultiphaseParcel_H
#include "ReactingParcel.H" #include "particle.H"
#include "ReactingMultiphaseCloud.H" #include "SLGThermo.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -26,8 +26,7 @@ License
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class ParcelType> template<class ParcelType>
inline inline Foam::ReactingMultiphaseParcel<ParcelType>::constantProperties::
Foam::ReactingMultiphaseParcel<ParcelType>::constantProperties::
constantProperties() constantProperties()
: :
ParcelType::constantProperties(), ParcelType::constantProperties(),
@ -37,8 +36,7 @@ constantProperties()
template<class ParcelType> template<class ParcelType>
inline inline Foam::ReactingMultiphaseParcel<ParcelType>::constantProperties::
Foam::ReactingMultiphaseParcel<ParcelType>::constantProperties::
constantProperties constantProperties
( (
const constantProperties& cp const constantProperties& cp
@ -227,4 +225,5 @@ inline bool& Foam::ReactingMultiphaseParcel<ParcelType>::canCombust()
return canCombust_; return canCombust_;
} }
// ************************************************************************* // // ************************************************************************* //

View File

@ -24,8 +24,9 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "ReactingParcel.H" #include "ReactingParcel.H"
#include "mathematicalConstants.H"
#include "specie.H" #include "specie.H"
#include "CompositionModel.H"
#include "mathematicalConstants.H"
using namespace Foam::constant::mathematical; using namespace Foam::constant::mathematical;

View File

@ -38,8 +38,8 @@ SourceFiles
#ifndef ReactingParcel_H #ifndef ReactingParcel_H
#define ReactingParcel_H #define ReactingParcel_H
#include "ThermoParcel.H" #include "particle.H"
#include "ReactingCloud.H" #include "SLGThermo.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -104,6 +104,27 @@ public:
const bool readFields = true const bool readFields = true
); );
//- Construct from components
constantProperties
(
const label parcelTypeId,
const scalar rhoMin,
const scalar rho0,
const scalar minParticleMass,
const scalar youngsModulus,
const scalar poissonsRatio,
const scalar T0,
const scalar TMin,
const scalar Cp0,
const scalar epsilon0,
const scalar f0,
const scalar Pr,
const scalar pMin,
const Switch& constantVolume,
const scalar Tvap,
const scalar Tbp
);
// Access // Access
@ -136,7 +157,6 @@ public:
autoPtr<interpolation<scalar> > pInterp_; autoPtr<interpolation<scalar> > pInterp_;
public: public:
typedef typename ParcelType::template TrackingData<CloudType>::trackPart typedef typename ParcelType::template TrackingData<CloudType>::trackPart
@ -327,6 +347,9 @@ public:
//- Return the owner cell pressure //- Return the owner cell pressure
inline scalar pc() const; inline scalar pc() const;
//- Return reference to the owner cell pressure
inline scalar& pc();
// Edit // Edit
@ -403,7 +426,7 @@ public:
const CompositionType& compModel const CompositionType& compModel
); );
//- Read - composition supplied //- Write - composition supplied
template<class CloudType> template<class CloudType>
static void writeFields(const CloudType& c); static void writeFields(const CloudType& c);

View File

@ -74,6 +74,49 @@ inline Foam::ReactingParcel<ParcelType>::constantProperties::constantProperties
} }
template<class ParcelType>
inline Foam::ReactingParcel<ParcelType>::constantProperties::constantProperties
(
const label parcelTypeId,
const scalar rhoMin,
const scalar rho0,
const scalar minParticleMass,
const scalar youngsModulus,
const scalar poissonsRatio,
const scalar T0,
const scalar TMin,
const scalar Cp0,
const scalar epsilon0,
const scalar f0,
const scalar Pr,
const scalar pMin,
const Switch& constantVolume,
const scalar Tvap,
const scalar Tbp
)
:
ParcelType::constantProperties
(
parcelTypeId,
rhoMin,
rho0,
minParticleMass,
youngsModulus,
poissonsRatio,
T0,
TMin,
Cp0,
epsilon0,
f0,
Pr
),
pMin_(pMin),
constantVolume_(constantVolume),
Tvap_(Tvap),
Tbp_(Tbp)
{}
template<class ParcelType> template<class ParcelType>
inline Foam::ReactingParcel<ParcelType>::ReactingParcel inline Foam::ReactingParcel<ParcelType>::ReactingParcel
( (
@ -194,6 +237,13 @@ inline Foam::scalar Foam::ReactingParcel<ParcelType>::pc() const
} }
template<class ParcelType>
inline Foam::scalar& Foam::ReactingParcel<ParcelType>::pc()
{
return pc_;
}
template<class ParcelType> template<class ParcelType>
inline Foam::scalar& Foam::ReactingParcel<ParcelType>::mass0() inline Foam::scalar& Foam::ReactingParcel<ParcelType>::mass0()
{ {

View File

@ -39,8 +39,8 @@ SourceFiles
#ifndef ThermoParcel_H #ifndef ThermoParcel_H
#define ThermoParcel_H #define ThermoParcel_H
#include "KinematicParcel.H" #include "particle.H"
#include "ThermoCloud.H" #include "SLGThermo.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -112,6 +112,23 @@ public:
const bool readFields = true const bool readFields = true
); );
//- Construct from components
constantProperties
(
const label parcelTypeId,
const scalar rhoMin,
const scalar rho0,
const scalar minParticleMass,
const scalar youngsModulus,
const scalar poissonsRatio,
const scalar T0,
const scalar TMin,
const scalar Cp0,
const scalar epsilon0,
const scalar f0,
const scalar Pr
);
// Member functions // Member functions

View File

@ -81,6 +81,41 @@ inline Foam::ThermoParcel<ParcelType>::constantProperties::constantProperties
} }
template<class ParcelType>
inline Foam::ThermoParcel<ParcelType>::constantProperties::constantProperties
(
const label parcelTypeId,
const scalar rhoMin,
const scalar rho0,
const scalar minParticleMass,
const scalar youngsModulus,
const scalar poissonsRatio,
const scalar T0,
const scalar TMin,
const scalar Cp0,
const scalar epsilon0,
const scalar f0,
const scalar Pr
)
:
ParcelType::constantProperties
(
parcelTypeId,
rhoMin,
rho0,
minParticleMass,
youngsModulus,
poissonsRatio
),
T0_(T0),
TMin_(TMin),
Cp0_(Cp0),
epsilon0_(epsilon0),
f0_(f0),
Pr_(Pr)
{}
template<class ParcelType> template<class ParcelType>
inline Foam::ThermoParcel<ParcelType>::ThermoParcel inline Foam::ThermoParcel<ParcelType>::ThermoParcel
( (

View File

@ -45,9 +45,6 @@ License
namespace Foam namespace Foam
{ {
typedef basicReactingCloud::thermoCloudType thermoCloudType2;
typedef basicReactingCloud::kinematicCloudType kinematicCloudType2;
makeParcelCloudFunctionObjects(basicReactingCloud); makeParcelCloudFunctionObjects(basicReactingCloud);
// Kinematic sub-models // Kinematic sub-models

View File

@ -30,6 +30,7 @@ License
#include "CellZoneInjection.H" #include "CellZoneInjection.H"
#include "ConeInjection.H" #include "ConeInjection.H"
#include "ConeNozzleInjection.H"
#include "FieldActivatedInjection.H" #include "FieldActivatedInjection.H"
#include "InflationInjection.H" #include "InflationInjection.H"
#include "KinematicLookupTableInjection.H" #include "KinematicLookupTableInjection.H"

View File

@ -30,6 +30,7 @@ License
#include "CellZoneInjection.H" #include "CellZoneInjection.H"
#include "ConeInjection.H" #include "ConeInjection.H"
#include "ConeNozzleInjection.H"
#include "FieldActivatedInjection.H" #include "FieldActivatedInjection.H"
#include "ManualInjection.H" #include "ManualInjection.H"
#include "NoInjection.H" #include "NoInjection.H"

View File

@ -30,6 +30,7 @@ License
#include "CellZoneInjection.H" #include "CellZoneInjection.H"
#include "ConeInjection.H" #include "ConeInjection.H"
#include "ConeNozzleInjection.H"
#include "FieldActivatedInjection.H" #include "FieldActivatedInjection.H"
#include "ManualInjection.H" #include "ManualInjection.H"
#include "NoInjection.H" #include "NoInjection.H"

View File

@ -27,24 +27,33 @@ License
#include "Pstream.H" #include "Pstream.H"
#include "ListListOps.H" #include "ListListOps.H"
#include "surfaceWriter.H" #include "surfaceWriter.H"
#include "globalIndex.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
Foam::label Foam::FacePostProcessing<CloudType>::applyToFace void Foam::FacePostProcessing<CloudType>::applyToFace
( (
const label faceI const label faceIn,
label& zoneI,
label& faceI
) const ) const
{ {
forAll(fZone_, i) const faceZoneMesh& fzm = this->owner().mesh().faceZones();
{
if (fZone_[i] == faceI)
{
return i;
}
}
return -1; forAll(faceZoneIDs_, i)
{
const faceZone& fz = fzm[faceZoneIDs_[i]];
forAll(fz, j)
{
if (fz[j] == faceIn)
{
zoneI = i;
faceI = j;
return;
}
}
}
} }
@ -52,6 +61,7 @@ template<class CloudType>
void Foam::FacePostProcessing<CloudType>::write() void Foam::FacePostProcessing<CloudType>::write()
{ {
const fvMesh& mesh = this->owner().mesh(); const fvMesh& mesh = this->owner().mesh();
const faceZoneMesh& fzm = this->owner().mesh().faceZones();
const scalar dt = this->owner().time().deltaTValue(); const scalar dt = this->owner().time().deltaTValue();
totalTime_ += dt; totalTime_ += dt;
@ -59,136 +69,163 @@ void Foam::FacePostProcessing<CloudType>::write()
const scalar alpha = (totalTime_ - dt)/totalTime_; const scalar alpha = (totalTime_ - dt)/totalTime_;
const scalar beta = dt/totalTime_; const scalar beta = dt/totalTime_;
massTotal_ += mass_; forAll(faceZoneIDs_, zoneI)
{
massFlux_ = alpha*massFlux_ + beta*mass_/dt; massTotal_[zoneI] += mass_[zoneI];
massFlux_[zoneI] = alpha*massFlux_[zoneI] + beta*mass_[zoneI]/dt;
}
const label procI = Pstream::myProcNo(); const label procI = Pstream::myProcNo();
scalarListList allProcMass(Pstream::nProcs()); Info<< "particleFaceFlux output:" << nl;
allProcMass[procI].setSize(massTotal_.size());
allProcMass[procI] = massTotal_;
Pstream::gatherList(allProcMass);
scalarList allMass
(
ListListOps::combine<scalarList>
(
allProcMass, accessOp<scalarList>()
)
);
scalarListList allProcMassFlux(Pstream::nProcs()); List<scalarField> zoneMassTotal(mass_.size());
allProcMassFlux[procI].setSize(massFlux_.size()); forAll(zoneMassTotal, zoneI)
allProcMassFlux[procI] = massFlux_; {
Pstream::gatherList(allProcMassFlux); scalarListList allProcMass(Pstream::nProcs());
scalarList allMassFlux allProcMass[procI] = massTotal_[zoneI];
( Pstream::gatherList(allProcMass);
ListListOps::combine<scalarList> zoneMassTotal[zoneI] =
( ListListOps::combine<scalarList>
allProcMassFlux, accessOp<scalarList>() (
) allProcMass, accessOp<scalarList>()
); );
Info<< "particleFaceFlux output:" << nl const word& zoneName = fzm[faceZoneIDs_[zoneI]].name();
<< " total mass = " << sum(allMass) << nl Info<< " " << zoneName << " total mass = "
<< " average mass flux = " << sum(allMassFlux) << nl << endl; << sum(zoneMassTotal[zoneI]) << nl;
}
List<scalarField> zoneMassFlux(massFlux_.size());
forAll(zoneMassFlux, zoneI)
{
scalarListList allProcMassFlux(Pstream::nProcs());
allProcMassFlux[procI] = massFlux_[zoneI];
Pstream::gatherList(allProcMassFlux);
zoneMassFlux[zoneI] =
ListListOps::combine<scalarList>
(
allProcMassFlux, accessOp<scalarList>()
);
const word& zoneName = fzm[faceZoneIDs_[zoneI]].name();
Info<< " " << zoneName << " average mass flux = "
<< sum(zoneMassFlux[zoneI]) << nl;
}
Info<< endl;
if (surfaceFormat_ != "none") if (surfaceFormat_ != "none")
{ {
labelList pointToGlobal; fileName outputDir = mesh.time().path();
labelList uniqueMeshPointLabels;
autoPtr<globalIndex> globalPointsPtr =
mesh.globalData().mergePoints
(
fZone_().meshPoints(),
fZone_().meshPointMap(),
pointToGlobal,
uniqueMeshPointLabels
);
pointField uniquePoints(mesh.points(), uniqueMeshPointLabels); if (Pstream::parRun())
List<pointField> allProcPoints(Pstream::nProcs());
allProcPoints[procI].setSize(uniquePoints.size());
allProcPoints[procI] = uniquePoints;
Pstream::gatherList(allProcPoints);
pointField allPoints
(
ListListOps::combine<pointField>
(
allProcPoints, accessOp<pointField>()
)
);
faceList faces(fZone_().localFaces());
forAll(faces, i)
{ {
inplaceRenumber(pointToGlobal, faces[i]); // Put in undecomposed case (Note: gives problems for
// distributed data running)
outputDir =
outputDir/".."/"postProcessing"/cloud::prefix/
this->owner().name()/mesh.time().timeName();
} }
List<faceList> allProcFaces(Pstream::nProcs()); else
allProcFaces[procI].setSize(faces.size());
allProcFaces[procI] = faces;
Pstream::gatherList(allProcFaces);
faceList allFaces
(
ListListOps::combine<faceList>
(
allProcFaces, accessOp<faceList>()
)
);
if (Pstream::master())
{ {
fileName outputDir = mesh.time().path(); outputDir =
outputDir/"postProcessing"/cloud::prefix/
this->owner().name()/mesh.time().timeName();
}
if (Pstream::parRun()) forAll(faceZoneIDs_, zoneI)
{ {
// Put in undecomposed case (Note: gives problems for const faceZone& fZone = fzm[faceZoneIDs_[zoneI]];
// distributed data running)
outputDir =
outputDir/".."/"postProcessing"/cloud::prefix/
this->owner().name()/mesh.time().timeName();
}
else
{
outputDir =
outputDir/"postProcessing"/cloud::prefix/
this->owner().name()/mesh.time().timeName();
}
autoPtr<surfaceWriter> writer(surfaceWriter::New(surfaceFormat_)); labelList pointToGlobal;
writer->write labelList uniqueMeshPointLabels;
( autoPtr<globalIndex> globalPointsPtr =
outputDir, mesh.globalData().mergePoints
"massTotal", (
allPoints, fZone().meshPoints(),
allFaces, fZone().meshPointMap(),
"massTotal", pointToGlobal,
massTotal_, uniqueMeshPointLabels
false );
);
writer->write pointField uniquePoints(mesh.points(), uniqueMeshPointLabels);
( List<pointField> allProcPoints(Pstream::nProcs());
outputDir, allProcPoints[procI] = uniquePoints;
"massFlux", Pstream::gatherList(allProcPoints);
allPoints,
allFaces, faceList faces(fZone().localFaces());
"massFlux", forAll(faces, i)
massFlux_, {
false inplaceRenumber(pointToGlobal, faces[i]);
); }
List<faceList> allProcFaces(Pstream::nProcs());
allProcFaces[procI] = faces;
Pstream::gatherList(allProcFaces);
if (Pstream::master())
{
pointField allPoints
(
ListListOps::combine<pointField>
(
allProcPoints, accessOp<pointField>()
)
);
faceList allFaces
(
ListListOps::combine<faceList>
(
allProcFaces, accessOp<faceList>()
)
);
autoPtr<surfaceWriter> writer
(
surfaceWriter::New(surfaceFormat_)
);
writer->write
(
outputDir,
fZone.name(),
allPoints,
allFaces,
"massTotal",
zoneMassTotal[zoneI],
false
);
writer->write
(
outputDir,
fZone.name(),
allPoints,
allFaces,
"massFlux",
zoneMassFlux[zoneI],
false
);
}
} }
} }
if (resetOnWrite_) if (resetOnWrite_)
{ {
massFlux_ = 0.0; forAll(faceZoneIDs_, zoneI)
{
massFlux_[zoneI] = 0.0;
}
totalTime_ = 0.0; totalTime_ = 0.0;
} }
mass_ = 0.0; forAll(mass_, zoneI)
{
mass_[zoneI] = 0.0;
}
// writeProperties(); // writeProperties();
} }
@ -204,7 +241,7 @@ Foam::FacePostProcessing<CloudType>::FacePostProcessing
) )
: :
CloudFunctionObject<CloudType>(dict, owner, typeName), CloudFunctionObject<CloudType>(dict, owner, typeName),
fZone_(owner.mesh().faceZones()[this->coeffDict().lookup("faceZone")]), faceZoneIDs_(),
surfaceFormat_(this->coeffDict().lookup("surfaceFormat")), surfaceFormat_(this->coeffDict().lookup("surfaceFormat")),
resetOnWrite_(this->coeffDict().lookup("resetOnWrite")), resetOnWrite_(this->coeffDict().lookup("resetOnWrite")),
totalTime_(0.0), totalTime_(0.0),
@ -212,15 +249,32 @@ Foam::FacePostProcessing<CloudType>::FacePostProcessing
massTotal_(), massTotal_(),
massFlux_() massFlux_()
{ {
label allFaces = returnReduce(fZone_().size(), sumOp<scalar>()); wordList faceZoneNames(this->coeffDict().lookup("faceZones"));
Info<< " Number of faces = " << allFaces << endl; mass_.setSize(faceZoneNames.size());
massTotal_.setSize(faceZoneNames.size());
massFlux_.setSize(faceZoneNames.size());
mass_.setSize(fZone_.size(), 0.0); DynamicList<label> zoneIDs;
const faceZoneMesh& fzm = owner.mesh().faceZones();
forAll(faceZoneNames, i)
{
const word& zoneName = faceZoneNames[i];
label zoneI = fzm.findZoneID(zoneName);
if (zoneI != -1)
{
zoneIDs.append(zoneI);
const faceZone& fz = fzm[zoneI];
label nFaces = returnReduce(fz.size(), sumOp<label>());
mass_[i].setSize(nFaces, 0.0);
massTotal_[i].setSize(nFaces, 0.0);
massFlux_[i].setSize(nFaces, 0.0);
Info<< " " << zoneName << " faces: " << nFaces;
}
}
faceZoneIDs_.transfer(zoneIDs);
// readProperties(); AND initialise mass... fields // readProperties(); AND initialise mass... fields
massTotal_.setSize(fZone_.size(), 0.0);
massFlux_.setSize(fZone_.size(), 0.0);
} }
@ -231,7 +285,7 @@ Foam::FacePostProcessing<CloudType>::FacePostProcessing
) )
: :
CloudFunctionObject<CloudType>(pff), CloudFunctionObject<CloudType>(pff),
fZone_(pff.fZone_.clone(pff.fZone_.zoneMesh())), faceZoneIDs_(pff.faceZoneIDs_),
surfaceFormat_(pff.surfaceFormat_), surfaceFormat_(pff.surfaceFormat_),
resetOnWrite_(pff.resetOnWrite_), resetOnWrite_(pff.resetOnWrite_),
totalTime_(pff.totalTime_), totalTime_(pff.totalTime_),
@ -268,11 +322,13 @@ void Foam::FacePostProcessing<CloudType>::postFace(const parcelType& p)
|| this->owner().solution().transient() || this->owner().solution().transient()
) )
{ {
const label faceI = applyToFace(p.face()); label zoneI = -1;
label faceI = -1;
applyToFace(p.face(), zoneI, faceI);
if (faceI != -1) if ((zoneI != -1) && (faceI != -1))
{ {
mass_[faceI] += p.mass()*p.nParticle(); mass_[zoneI][faceI] += p.mass()*p.nParticle();
} }
} }
} }

View File

@ -64,8 +64,8 @@ class FacePostProcessing
typedef typename CloudType::parcelType parcelType; typedef typename CloudType::parcelType parcelType;
//- Face zone //- Face zone IDs
const faceZone& fZone_; labelList faceZoneIDs_;
//- Surface output format //- Surface output format
const word surfaceFormat_; const word surfaceFormat_;
@ -77,19 +77,24 @@ class FacePostProcessing
scalar totalTime_; scalar totalTime_;
//- Mass storage //- Mass storage
scalarField mass_; List<scalarField> mass_;
//- Mass total storage //- Mass total storage
scalarField massTotal_; List<scalarField> massTotal_;
//- Mass flux storage //- Mass flux storage
scalarField massFlux_; List<scalarField> massFlux_;
// Private Member Functions // Private Member Functions
//- Return index into massFlux_ list if valid face, else -1 //- Return index into storage lists if valid zone and face
label applyToFace(const label faceI) const; void applyToFace
(
const label faceIn,
label& zoneI, label&
faceI
) const;
protected: protected:

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) 2009-2010 OpenCFD Ltd. \\ / A nd | Copyright (C) 2009-2011 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -87,7 +87,7 @@ public:
// this model this will always be 1. // this model this will always be 1.
virtual label nSubCycles() const; virtual label nSubCycles() const;
//- Flag to indicate whether model activates injection model //- Flag to indicate whether model activates collision model
virtual bool active() const; virtual bool active() const;
//- Indicates whether model determines wall collisions or not, //- Indicates whether model determines wall collisions or not,

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) 2008-2010 OpenCFD Ltd. \\ / A nd | Copyright (C) 2008-2011 OpenCFD Ltd.
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -92,12 +92,14 @@ Foam::PairSpringSliderDashpot<CloudType>::PairSpringSliderDashpot
alpha_(readScalar(this->coeffDict().lookup("alpha"))), alpha_(readScalar(this->coeffDict().lookup("alpha"))),
b_(readScalar(this->coeffDict().lookup("b"))), b_(readScalar(this->coeffDict().lookup("b"))),
mu_(readScalar(this->coeffDict().lookup("mu"))), mu_(readScalar(this->coeffDict().lookup("mu"))),
cohesionEnergyDensity_
(
readScalar(this->coeffDict().lookup("cohesionEnergyDensity"))
),
cohesion_(false),
collisionResolutionSteps_ collisionResolutionSteps_
( (
readScalar readScalar(this->coeffDict().lookup("collisionResolutionSteps"))
(
this->coeffDict().lookup("collisionResolutionSteps")
)
), ),
volumeFactor_(1.0), volumeFactor_(1.0),
useEquivalentSize_(Switch(this->coeffDict().lookup("useEquivalentSize"))) useEquivalentSize_(Switch(this->coeffDict().lookup("useEquivalentSize")))
@ -116,6 +118,8 @@ Foam::PairSpringSliderDashpot<CloudType>::PairSpringSliderDashpot
scalar G = E/(2.0*(1.0 + nu)); scalar G = E/(2.0*(1.0 + nu));
Gstar_ = G/(2.0*(2.0 - nu)); Gstar_ = G/(2.0*(2.0 - nu));
cohesion_ = (mag(cohesionEnergyDensity_) > VSMALL);
} }
@ -183,13 +187,15 @@ void Foam::PairSpringSliderDashpot<CloudType>::evaluatePair
dBEff *= cbrt(pB.nParticle()*volumeFactor_); dBEff *= cbrt(pB.nParticle()*volumeFactor_);
} }
scalar normalOverlapMag = 0.5*(dAEff + dBEff) - mag(r_AB); scalar r_AB_mag = mag(r_AB);
scalar normalOverlapMag = 0.5*(dAEff + dBEff) - r_AB_mag;
if (normalOverlapMag > 0) if (normalOverlapMag > 0)
{ {
//Particles in collision //Particles in collision
vector rHat_AB = r_AB/(mag(r_AB) + VSMALL); vector rHat_AB = r_AB/(r_AB_mag + VSMALL);
vector U_AB = pA.U() - pB.U(); vector U_AB = pA.U() - pB.U();
@ -208,6 +214,15 @@ void Foam::PairSpringSliderDashpot<CloudType>::evaluatePair
rHat_AB rHat_AB
*(kN*pow(normalOverlapMag, b_) - etaN*(U_AB & rHat_AB)); *(kN*pow(normalOverlapMag, b_) - etaN*(U_AB & rHat_AB));
// Cohesion force
if (cohesion_)
{
fN_AB +=
-cohesionEnergyDensity_
*overlapArea(dAEff/2.0, dBEff/2.0, r_AB_mag)
*rHat_AB;
}
pA.f() += fN_AB; pA.f() += fN_AB;
pB.f() += -fN_AB; pB.f() += -fN_AB;

View File

@ -34,6 +34,7 @@ Description
#include "PairModel.H" #include "PairModel.H"
#include "CollisionRecordList.H" #include "CollisionRecordList.H"
#include "mathematicalConstants.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -67,6 +68,12 @@ class PairSpringSliderDashpot
//- Coefficient of friction in for tangential sliding //- Coefficient of friction in for tangential sliding
scalar mu_; scalar mu_;
//- Cohesion energy density [J/m^3]
scalar cohesionEnergyDensity_;
// Switch cohesion on and off
bool cohesion_;
//- The number of steps over which to resolve the minimum //- The number of steps over which to resolve the minimum
// harmonic approximation of the collision period // harmonic approximation of the collision period
scalar collisionResolutionSteps_; scalar collisionResolutionSteps_;
@ -129,6 +136,23 @@ public:
return volumeFactor_; return volumeFactor_;
} }
// Return the area of overlap between two spheres of radii rA and rB,
// centres separated by a distance rAB. Assumes rAB < (rA + rB).
inline scalar overlapArea(scalar rA, scalar rB, scalar rAB) const
{
// From:
// http://mathworld.wolfram.com/Sphere-SphereIntersection.html
return
mathematical::pi/4.0
/sqr(rAB)
*(
(-rAB + rA - rB)
*(-rAB - rA + rB)
*(-rAB + rA + rB)
*( rAB + rA + rA)
);
}
//- Whether the PairModel has a timestep limit that will //- Whether the PairModel has a timestep limit that will
// require subCycling // require subCycling
virtual bool controlsTimestep() const; virtual bool controlsTimestep() const;

View File

@ -158,45 +158,6 @@ void Foam::CellZoneInjection<CloudType>::setPositions
} }
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class CloudType>
Foam::label Foam::CellZoneInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((0.0 >= time0) && (0.0 < time1))
{
return positions_.size();
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::CellZoneInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
// All parcels introduced at SOI
if ((0.0 >= time0) && (0.0 < time1))
{
return this->volumeTotal_;
}
else
{
return 0.0;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
@ -316,6 +277,43 @@ Foam::scalar Foam::CellZoneInjection<CloudType>::timeEnd() const
} }
template<class CloudType>
Foam::label Foam::CellZoneInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((0.0 >= time0) && (0.0 < time1))
{
return positions_.size();
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::CellZoneInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
// All parcels introduced at SOI
if ((0.0 >= time0) && (0.0 < time1))
{
return this->volumeTotal_;
}
else
{
return 0.0;
}
}
template<class CloudType> template<class CloudType>
void Foam::CellZoneInjection<CloudType>::setPositionAndCell void Foam::CellZoneInjection<CloudType>::setPositionAndCell
( (

View File

@ -95,25 +95,6 @@ class CellZoneInjection
void setPositions(const labelList& cellZoneCells); void setPositions(const labelList& cellZoneCells);
protected:
// Protected member functions
//- Number of parcels to introduce over the time step relative to SOI
label parcelsToInject
(
const scalar time0,
const scalar time1
);
//- Volume of parcels to introduce over the time step relative to SOI
scalar volumeToInject
(
const scalar time0,
const scalar time1
);
public: public:
//- Runtime type information //- Runtime type information
@ -147,6 +128,12 @@ public:
//- Return the end-of-injection time //- Return the end-of-injection time
scalar timeEnd() const; scalar timeEnd() const;
//- Number of parcels to introduce relative to SOI
label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce relative to SOI
scalar volumeToInject(const scalar time0, const scalar time1);
// Injection geometry // Injection geometry

View File

@ -30,53 +30,6 @@ License
using namespace Foam::constant::mathematical; using namespace Foam::constant::mathematical;
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class CloudType>
Foam::label Foam::ConeInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((time0 >= 0.0) && (time0 < duration_))
{
const scalar targetVolume = flowRateProfile_().integrate(0, time1);
const label targetParcels =
parcelsPerInjector_*targetVolume/this->volumeTotal_;
const label nToInject = targetParcels - nInjected_;
nInjected_ += nToInject;
return positionAxis_.size()*nToInject;
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::ConeInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
if ((time0 >= 0.0) && (time0 < duration_))
{
return flowRateProfile_().integrate(time0, time1);
}
else
{
return 0.0;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
@ -195,6 +148,51 @@ Foam::scalar Foam::ConeInjection<CloudType>::timeEnd() const
} }
template<class CloudType>
Foam::label Foam::ConeInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((time0 >= 0.0) && (time0 < duration_))
{
const scalar targetVolume = flowRateProfile_().integrate(0, time1);
const label targetParcels =
parcelsPerInjector_*targetVolume/this->volumeTotal_;
const label nToInject = targetParcels - nInjected_;
nInjected_ += nToInject;
return positionAxis_.size()*nToInject;
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::ConeInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
if ((time0 >= 0.0) && (time0 < duration_))
{
return flowRateProfile_().integrate(time0, time1);
}
else
{
return 0.0;
}
}
template<class CloudType> template<class CloudType>
void Foam::ConeInjection<CloudType>::setPositionAndCell void Foam::ConeInjection<CloudType>::setPositionAndCell
( (

View File

@ -113,17 +113,6 @@ class ConeInjection
vectorList tanVec2_; vectorList tanVec2_;
protected:
// Protected Member Functions
//- Number of parcels to introduce over the time step relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce over the time step relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
public: public:
//- Runtime type information //- Runtime type information
@ -157,6 +146,13 @@ public:
//- Return the end-of-injection time //- Return the end-of-injection time
scalar timeEnd() const; scalar timeEnd() const;
//- Number of parcels to introduce relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
// Injection geometry // Injection geometry

View File

@ -0,0 +1,374 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2011 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 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "ConeNozzleInjection.H"
#include "DataEntry.H"
#include "mathematicalConstants.H"
#include "distributionModel.H"
using namespace Foam::constant;
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType>
Foam::ConeNozzleInjection<CloudType>::ConeNozzleInjection
(
const dictionary& dict,
CloudType& owner
)
:
InjectionModel<CloudType>(dict, owner, typeName),
injectionMethod_(imPoint),
outerNozzleDiameter_
(
readScalar(this->coeffDict().lookup("outerNozzleDiameter"))
),
innerNozzleDiameter_
(
readScalar(this->coeffDict().lookup("innerNozzleDiameter"))
),
duration_(readScalar(this->coeffDict().lookup("duration"))),
position_(this->coeffDict().lookup("position")),
injectorCell_(-1),
tetFaceI_(-1),
tetPtI_(-1),
direction_(this->coeffDict().lookup("direction")),
parcelsPerSecond_
(
readScalar(this->coeffDict().lookup("parcelsPerSecond"))
),
volumeFlowRate_
(
DataEntry<scalar>::New
(
"volumeFlowRate",
this->coeffDict()
)
),
Cd_
(
DataEntry<scalar>::New
(
"Cd",
this->coeffDict()
)
),
thetaInner_
(
DataEntry<scalar>::New
(
"thetaInner",
this->coeffDict()
)
),
thetaOuter_
(
DataEntry<scalar>::New
(
"thetaOuter",
this->coeffDict()
)
),
sizeDistribution_
(
distributionModels::distributionModel::New
(
this->coeffDict().subDict("sizeDistribution"),
owner.rndGen()
)
),
tanVec1_(vector::zero),
tanVec2_(vector::zero),
normal_(vector::zero)
{
if (innerNozzleDiameter_ >= outerNozzleDiameter_)
{
FatalErrorIn
(
"Foam::ConeNozzleInjection<CloudType>::ConeNozzleInjection"
"("
"const dictionary&, "
"CloudType&"
")"
)<< "innerNozzleDiameter >= outerNozzleDiameter" << nl
<< exit(FatalError);
}
word injectionMethodType = this->coeffDict().lookup("injectionMethod");
if (injectionMethodType == "disc")
{
injectionMethod_ = imDisc;
}
else if (injectionMethodType == "point")
{
injectionMethod_ = imPoint;
// Set/cache the injector cell
this->findCellAtPosition
(
injectorCell_,
tetFaceI_,
tetPtI_,
position_,
false
);
}
else
{
FatalErrorIn
(
"Foam::InjectionModel<CloudType>::InjectionModel"
"("
"const dictionary&, "
"CloudType&"
")"
)<< "injectionMethod must be either 'point' or 'disc'" << nl
<< exit(FatalError);
}
cachedRandom& rndGen = this->owner().rndGen();
// Normalise direction vector
direction_ /= mag(direction_);
// Determine direction vectors tangential to direction
vector tangent = vector::zero;
scalar magTangent = 0.0;
while(magTangent < SMALL)
{
vector v = rndGen.sample01<vector>();
tangent = v - (v & direction_)*direction_;
magTangent = mag(tangent);
}
tanVec1_ = tangent/magTangent;
tanVec2_ = direction_^tanVec1_;
// Set total volume to inject
this->volumeTotal_ = volumeFlowRate_().integrate(0.0, duration_);
}
template<class CloudType>
Foam::ConeNozzleInjection<CloudType>::ConeNozzleInjection
(
const ConeNozzleInjection<CloudType>& im
)
:
InjectionModel<CloudType>(im),
injectionMethod_(im.injectionMethod_),
outerNozzleDiameter_(im.outerNozzleDiameter_),
innerNozzleDiameter_(im.innerNozzleDiameter_),
duration_(im.duration_),
position_(im.position_),
injectorCell_(im.injectorCell_),
direction_(im.direction_),
parcelsPerSecond_(im.parcelsPerSecond_),
volumeFlowRate_(im.volumeFlowRate_().clone().ptr()),
Cd_(im.Cd_().clone().ptr()),
thetaInner_(im.thetaInner_().clone().ptr()),
thetaOuter_(im.thetaOuter_().clone().ptr()),
sizeDistribution_(im.sizeDistribution_().clone().ptr()),
tanVec1_(im.tanVec1_),
tanVec2_(im.tanVec1_),
normal_(im.normal_)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class CloudType>
Foam::ConeNozzleInjection<CloudType>::~ConeNozzleInjection()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
Foam::scalar Foam::ConeNozzleInjection<CloudType>::timeEnd() const
{
return this->SOI_ + duration_;
}
template<class CloudType>
Foam::label Foam::ConeNozzleInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((time0 >= 0.0) && (time0 < duration_))
{
return floor((time1 - time0)*parcelsPerSecond_);
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::ConeNozzleInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
if ((time0 >= 0.0) && (time0 < duration_))
{
return volumeFlowRate_().integrate(time0, time1);
}
else
{
return 0.0;
}
}
template<class CloudType>
void Foam::ConeNozzleInjection<CloudType>::setPositionAndCell
(
const label,
const label,
const scalar,
vector& position,
label& cellOwner,
label& tetFaceI,
label& tetPtI
)
{
cachedRandom& rndGen = this->owner().rndGen();
scalar beta = mathematical::twoPi*rndGen.sample01<scalar>();
normal_ = tanVec1_*cos(beta) + tanVec2_*sin(beta);
switch (injectionMethod_)
{
case imPoint:
{
position = position_;
cellOwner = injectorCell_;
tetFaceI = tetFaceI_;
tetPtI = tetPtI_;
break;
}
case imDisc:
{
scalar frac = rndGen.sample01<scalar>();
scalar dr = outerNozzleDiameter_ - innerNozzleDiameter_;
scalar r = 0.5*(innerNozzleDiameter_ + frac*dr);
position = position_ + r*normal_;
this->findCellAtPosition
(
cellOwner,
tetFaceI,
tetPtI,
position,
false
);
break;
}
default:
{
FatalErrorIn
(
"void Foam::ConeNozzleInjection<CloudType>::setPositionAndCell"
"("
"const label, "
"const label, "
"const scalar, "
"vector&, "
"label&"
")"
)<< "Unknown injectionMethod type" << nl
<< exit(FatalError);
}
}
}
template<class CloudType>
void Foam::ConeNozzleInjection<CloudType>::setProperties
(
const label parcelI,
const label,
const scalar time,
typename CloudType::parcelType& parcel
)
{
cachedRandom& rndGen = this->owner().rndGen();
// set particle velocity
const scalar deg2Rad = mathematical::pi/180.0;
scalar t = time - this->SOI_;
scalar ti = thetaInner_().value(t);
scalar to = thetaOuter_().value(t);
scalar coneAngle = rndGen.sample01<scalar>()*(to - ti) + ti;
coneAngle *= deg2Rad;
scalar alpha = sin(coneAngle);
scalar dcorr = cos(coneAngle);
vector normal = alpha*normal_;
vector dirVec = dcorr*direction_;
dirVec += normal;
dirVec /= mag(dirVec);
scalar Ao = 0.25*mathematical::pi*outerNozzleDiameter_*outerNozzleDiameter_;
scalar Ai = 0.25*mathematical::pi*innerNozzleDiameter_*innerNozzleDiameter_;
scalar massFlowRate =
this->massTotal()*volumeFlowRate_().value(t)/this->volumeTotal();
scalar Umag = massFlowRate/(parcel.rho()*Cd_().value(t)*(Ao - Ai));
parcel.U() = Umag*dirVec;
// set particle diameter
parcel.d() = sizeDistribution_->sample();
}
template<class CloudType>
bool Foam::ConeNozzleInjection<CloudType>::fullyDescribed() const
{
return false;
}
template<class CloudType>
bool Foam::ConeNozzleInjection<CloudType>::validInjection(const label)
{
return true;
}
// ************************************************************************* //

View File

@ -0,0 +1,235 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2011 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 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::ConeNozzleInjection
Description
Cone injection
- User specifies
- time of start of injection
- injector position
- direction (along injection axis)
- parcel flow rate
- discharge coefficient, Cd
- inner and outer cone angles
- Parcel diameters obtained by size distribution model
- Parcel velocity is calculated as:
U = V_dot/(A * Cd), where V_dot is the volume flow rate
Based on the old 'unitInjection' model
SourceFiles
ConeNozzleInjection.C
\*---------------------------------------------------------------------------*/
#ifndef ConeNozzleInjection_H
#define ConeNozzleInjection_H
#include "InjectionModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
template<class Type>
class DataEntry;
class distributionModel;
/*---------------------------------------------------------------------------*\
Class ConeNozzleInjection Declaration
\*---------------------------------------------------------------------------*/
template<class CloudType>
class ConeNozzleInjection
:
public InjectionModel<CloudType>
{
public:
//- Injection method enumeration
enum injectionMethod
{
imPoint,
imDisc
};
private:
// Private data
//- point/disc injection method
injectionMethod injectionMethod_;
//- Outer nozzle diameter [m]
const scalar outerNozzleDiameter_;
//- Inner nozzle diameter [m]
const scalar innerNozzleDiameter_;
//- Injection duration [s]
const scalar duration_;
//- Injector position [m]
vector position_;
//- Cell containing injector position []
label injectorCell_;
//- Index of tet face for injector cell
label tetFaceI_;
//- Index of tet point for injector cell
label tetPtI_;
//- Injector direction []
vector direction_;
//- Number of parcels to introduce per second []
const label parcelsPerSecond_;
//- Volume flow rate of parcels to introduce relative to SOI [m^3/s]
const autoPtr<DataEntry<scalar> > volumeFlowRate_;
//- Discharge coefficient, relative to SOI [m/s]
const autoPtr<DataEntry<scalar> > Cd_;
//- Inner cone angle relative to SOI [deg]
const autoPtr<DataEntry<scalar> > thetaInner_;
//- Outer cone angle relative to SOI [deg]
const autoPtr<DataEntry<scalar> > thetaOuter_;
//- Parcel size PDF model
const autoPtr<distributionModels::distributionModel> sizeDistribution_;
// Tangential vectors to the direction vector
//- First tangential vector
vector tanVec1_;
//- Second tangential vector
vector tanVec2_;
//- injection vector orthogonal to direction
vector normal_;
public:
//- Runtime type information
TypeName("coneNozzleInjection");
// Constructors
//- Construct from dictionary
ConeNozzleInjection(const dictionary& dict, CloudType& owner);
//- Construct copy
ConeNozzleInjection(const ConeNozzleInjection<CloudType>& im);
//- Construct and return a clone
virtual autoPtr<InjectionModel<CloudType> > clone() const
{
return autoPtr<InjectionModel<CloudType> >
(
new ConeNozzleInjection<CloudType>(*this)
);
}
//- Destructor
virtual ~ConeNozzleInjection();
// Member Functions
//- Return the end-of-injection time
scalar timeEnd() const;
//- Number of parcels to introduce relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
// Injection geometry
//- Set the injection position and owner cell
virtual void setPositionAndCell
(
const label parcelI,
const label nParcels,
const scalar time,
vector& position,
label& cellOwner,
label& tetFaceI,
label& tetPtI
);
//- Set the parcel properties
virtual void setProperties
(
const label parcelI,
const label nParcels,
const scalar time,
typename CloudType::parcelType& parcel
);
//- Flag to identify whether model fully describes the parcel
virtual bool fullyDescribed() const;
//- Return flag to identify whether or not injection of parcelI is
// permitted
virtual bool validInjection(const label parcelI);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "ConeNozzleInjection.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -29,44 +29,6 @@ License
using namespace Foam::constant::mathematical; using namespace Foam::constant::mathematical;
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class CloudType>
Foam::label Foam::FieldActivatedInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if (sum(nParcelsInjected_) < nParcelsPerInjector_*positions_.size())
{
return positions_.size();
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::FieldActivatedInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
if (sum(nParcelsInjected_) < nParcelsPerInjector_*positions_.size())
{
return this->volumeTotal_/nParcelsPerInjector_;
}
else
{
return 0;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
@ -180,16 +142,45 @@ Foam::FieldActivatedInjection<CloudType>::~FieldActivatedInjection()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
bool Foam::FieldActivatedInjection<CloudType>::active() const Foam::scalar Foam::FieldActivatedInjection<CloudType>::timeEnd() const
{ {
return true; return GREAT;
} }
template<class CloudType> template<class CloudType>
Foam::scalar Foam::FieldActivatedInjection<CloudType>::timeEnd() const Foam::label Foam::FieldActivatedInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{ {
return GREAT; if (sum(nParcelsInjected_) < nParcelsPerInjector_*positions_.size())
{
return positions_.size();
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::FieldActivatedInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
if (sum(nParcelsInjected_) < nParcelsPerInjector_*positions_.size())
{
return this->volumeTotal_/nParcelsPerInjector_;
}
else
{
return 0;
}
} }

View File

@ -115,17 +115,6 @@ class FieldActivatedInjection
sizeDistribution_; sizeDistribution_;
protected:
// Protected Member Functions
//- Number of parcels to introduce over the time step relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce over the time step relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
public: public:
//- Runtime type information //- Runtime type information
@ -156,12 +145,15 @@ public:
// Member Functions // Member Functions
//- Flag to indicate whether model activates injection model
bool active() const;
//- Return the end-of-injection time //- Return the end-of-injection time
scalar timeEnd() const; scalar timeEnd() const;
//- Number of parcels to introduce relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
// Injection geometry // Injection geometry

View File

@ -31,7 +31,129 @@ License
using namespace Foam::constant::mathematical; using namespace Foam::constant::mathematical;
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType>
Foam::InflationInjection<CloudType>::InflationInjection
(
const dictionary& dict,
CloudType& owner
)
:
InjectionModel<CloudType>(dict, owner, typeName),
generationSetName_(this->coeffDict().lookup("generationCellSet")),
inflationSetName_(this->coeffDict().lookup("inflationCellSet")),
generationCells_(),
inflationCells_(),
duration_(readScalar(this->coeffDict().lookup("duration"))),
flowRateProfile_
(
DataEntry<scalar>::New
(
"flowRateProfile",
this->coeffDict()
)
),
growthRate_
(
DataEntry<scalar>::New
(
"growthRate",
this->coeffDict()
)
),
newParticles_(),
volumeAccumulator_(0.0),
fraction_(1.0),
selfSeed_(this->coeffDict().lookupOrDefault("selfSeed", false)),
dSeed_(SMALL),
sizeDistribution_
(
distributionModels::distributionModel::New
(
this->coeffDict().subDict("sizeDistribution"),
owner.rndGen()
)
)
{
if (selfSeed_)
{
dSeed_ = readScalar(this->coeffDict().lookup("dSeed"));
}
cellSet generationCells(this->owner().mesh(), generationSetName_);
generationCells_ = generationCells.toc();
cellSet inflationCells(this->owner().mesh(), inflationSetName_);
// Union of cellSets
inflationCells |= generationCells;
inflationCells_ = inflationCells.toc();
if (Pstream::parRun())
{
scalar generationVolume = 0.0;
forAll(generationCells_, gCI)
{
label cI = generationCells_[gCI];
generationVolume += this->owner().mesh().cellVolumes()[cI];
}
scalar totalGenerationVolume = generationVolume;
reduce(totalGenerationVolume, sumOp<scalar>());
fraction_ = generationVolume/totalGenerationVolume;
}
// Set total volume/mass to inject
this->volumeTotal_ = fraction_*flowRateProfile_().integrate(0.0, duration_);
this->massTotal_ *= fraction_;
}
template<class CloudType>
Foam::InflationInjection<CloudType>::InflationInjection
(
const Foam::InflationInjection<CloudType>& im
)
:
InjectionModel<CloudType>(im),
generationSetName_(im.generationSetName_),
inflationSetName_(im.inflationSetName_),
generationCells_(im.generationCells_),
inflationCells_(im.inflationCells_),
duration_(im.duration_),
flowRateProfile_(im.flowRateProfile_().clone().ptr()),
growthRate_(im.growthRate_().clone().ptr()),
newParticles_(im.newParticles_),
volumeAccumulator_(im.volumeAccumulator_),
fraction_(im.fraction_),
selfSeed_(im.selfSeed_),
dSeed_(im.dSeed_),
sizeDistribution_(im.sizeDistribution_().clone().ptr())
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class CloudType>
Foam::InflationInjection<CloudType>::~InflationInjection()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
Foam::scalar Foam::InflationInjection<CloudType>::timeEnd() const
{
return this->SOI_ + duration_;
}
template<class CloudType> template<class CloudType>
Foam::label Foam::InflationInjection<CloudType>::parcelsToInject Foam::label Foam::InflationInjection<CloudType>::parcelsToInject
@ -305,130 +427,6 @@ Foam::scalar Foam::InflationInjection<CloudType>::volumeToInject
} }
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType>
Foam::InflationInjection<CloudType>::InflationInjection
(
const dictionary& dict,
CloudType& owner
)
:
InjectionModel<CloudType>(dict, owner, typeName),
generationSetName_(this->coeffDict().lookup("generationCellSet")),
inflationSetName_(this->coeffDict().lookup("inflationCellSet")),
generationCells_(),
inflationCells_(),
duration_(readScalar(this->coeffDict().lookup("duration"))),
flowRateProfile_
(
DataEntry<scalar>::New
(
"flowRateProfile",
this->coeffDict()
)
),
growthRate_
(
DataEntry<scalar>::New
(
"growthRate",
this->coeffDict()
)
),
newParticles_(),
volumeAccumulator_(0.0),
fraction_(1.0),
selfSeed_(this->coeffDict().lookupOrDefault("selfSeed", false)),
dSeed_(SMALL),
sizeDistribution_
(
distributionModels::distributionModel::New
(
this->coeffDict().subDict("sizeDistribution"),
owner.rndGen()
)
)
{
if (selfSeed_)
{
dSeed_ = readScalar(this->coeffDict().lookup("dSeed"));
}
cellSet generationCells(this->owner().mesh(), generationSetName_);
generationCells_ = generationCells.toc();
cellSet inflationCells(this->owner().mesh(), inflationSetName_);
// Union of cellSets
inflationCells |= generationCells;
inflationCells_ = inflationCells.toc();
if (Pstream::parRun())
{
scalar generationVolume = 0.0;
forAll(generationCells_, gCI)
{
label cI = generationCells_[gCI];
generationVolume += this->owner().mesh().cellVolumes()[cI];
}
scalar totalGenerationVolume = generationVolume;
reduce(totalGenerationVolume, sumOp<scalar>());
fraction_ = generationVolume/totalGenerationVolume;
}
// Set total volume/mass to inject
this->volumeTotal_ = fraction_*flowRateProfile_().integrate(0.0, duration_);
this->massTotal_ *= fraction_;
}
template<class CloudType>
Foam::InflationInjection<CloudType>::InflationInjection
(
const Foam::InflationInjection<CloudType>& im
)
:
InjectionModel<CloudType>(im),
generationSetName_(im.generationSetName_),
inflationSetName_(im.inflationSetName_),
generationCells_(im.generationCells_),
inflationCells_(im.inflationCells_),
duration_(im.duration_),
flowRateProfile_(im.flowRateProfile_().clone().ptr()),
growthRate_(im.growthRate_().clone().ptr()),
newParticles_(im.newParticles_),
volumeAccumulator_(im.volumeAccumulator_),
fraction_(im.fraction_),
selfSeed_(im.selfSeed_),
dSeed_(im.dSeed_),
sizeDistribution_(im.sizeDistribution_().clone().ptr())
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class CloudType>
Foam::InflationInjection<CloudType>::~InflationInjection()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
Foam::scalar Foam::InflationInjection<CloudType>::timeEnd() const
{
return this->SOI_ + duration_;
}
template<class CloudType> template<class CloudType>
void Foam::InflationInjection<CloudType>::setPositionAndCell void Foam::InflationInjection<CloudType>::setPositionAndCell
( (

View File

@ -111,17 +111,6 @@ class InflationInjection
const autoPtr<distributionModels::distributionModel> sizeDistribution_; const autoPtr<distributionModels::distributionModel> sizeDistribution_;
protected:
// Protected Member Functions
//- Number of parcels to introduce over the time step relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce over the time step relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
public: public:
//- Runtime type information //- Runtime type information
@ -155,6 +144,12 @@ public:
//- Return the end-of-injection time //- Return the end-of-injection time
scalar timeEnd() const; scalar timeEnd() const;
//- Number of parcels to introduce relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
// Injection geometry // Injection geometry

View File

@ -101,46 +101,6 @@ void Foam::InjectionModel<CloudType>::writeProps()
} }
template<class CloudType>
Foam::label Foam::InjectionModel<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
notImplemented
(
"Foam::label Foam::InjectionModel<CloudType>::parcelsToInject"
"("
"const scalar, "
"const scalar"
") const"
);
return 0;
}
template<class CloudType>
Foam::scalar Foam::InjectionModel<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
notImplemented
(
"Foam::scalar Foam::InjectionModel<CloudType>::volumeToInject"
"("
"const scalar, "
"const scalar"
") const"
);
return 0.0;
}
template<class CloudType> template<class CloudType>
bool Foam::InjectionModel<CloudType>::validInjection(const label parcelI) bool Foam::InjectionModel<CloudType>::validInjection(const label parcelI)
{ {
@ -510,6 +470,54 @@ Foam::scalar Foam::InjectionModel<CloudType>::timeEnd() const
} }
template<class CloudType>
Foam::label Foam::InjectionModel<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
notImplemented
(
"Foam::label Foam::InjectionModel<CloudType>::parcelsToInject"
"("
"const scalar, "
"const scalar"
") const"
);
return 0;
}
template<class CloudType>
Foam::scalar Foam::InjectionModel<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
notImplemented
(
"Foam::scalar Foam::InjectionModel<CloudType>::volumeToInject"
"("
"const scalar, "
"const scalar"
") const"
);
return 0.0;
}
template<class CloudType>
Foam::scalar Foam::InjectionModel<CloudType>::averageParcelMass()
{
label nTotal = parcelsToInject(0.0, timeEnd() - timeStart());
return massTotal_/nTotal;
}
template<class CloudType> template<class CloudType>
template<class TrackData> template<class TrackData>
void Foam::InjectionModel<CloudType>::inject(TrackData& td) void Foam::InjectionModel<CloudType>::inject(TrackData& td)
@ -522,6 +530,7 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
const scalar time = this->owner().db().time().value(); const scalar time = this->owner().db().time().value();
const scalar trackTime = this->owner().solution().trackTime(); const scalar trackTime = this->owner().solution().trackTime();
const polyMesh& mesh = this->owner().mesh(); const polyMesh& mesh = this->owner().mesh();
typename TrackData::cloudType& cloud = td.cloud();
// Prepare for next time step // Prepare for next time step
label parcelsAdded = 0; label parcelsAdded = 0;
@ -583,11 +592,14 @@ void Foam::InjectionModel<CloudType>::inject(TrackData& td)
tetPtI tetPtI
); );
// Check/set new parcel thermo properties
cloud.setParcelThermoProperties(*pPtr, dt);
// Assign new parcel properties in injection model // Assign new parcel properties in injection model
setProperties(parcelI, newParcels, timeInj, *pPtr); setProperties(parcelI, newParcels, timeInj, *pPtr);
// Check new parcel properties // Check/set new parcel injection properties
td.cloud().checkParcelProperties(*pPtr, dt, fullyDescribed()); cloud.checkParcelProperties(*pPtr, dt, fullyDescribed());
// Apply correction to velocity for 2-D cases // Apply correction to velocity for 2-D cases
meshTools::constrainDirection meshTools::constrainDirection
@ -639,6 +651,7 @@ void Foam::InjectionModel<CloudType>::injectSteadyState
} }
const polyMesh& mesh = this->owner().mesh(); const polyMesh& mesh = this->owner().mesh();
typename TrackData::cloudType& cloud = td.cloud();
// Reset counters // Reset counters
time0_ = 0.0; time0_ = 0.0;
@ -688,11 +701,14 @@ void Foam::InjectionModel<CloudType>::injectSteadyState
tetPtI tetPtI
); );
// Check/set new parcel thermo properties
cloud.setParcelThermoProperties(*pPtr, 0.0);
// Assign new parcel properties in injection model // Assign new parcel properties in injection model
setProperties(parcelI, newParcels, 0.0, *pPtr); setProperties(parcelI, newParcels, 0.0, *pPtr);
// Check new parcel properties // Check/set new parcel injection properties
td.cloud().checkParcelProperties(*pPtr, 0.0, fullyDescribed()); cloud.checkParcelProperties(*pPtr, 0.0, fullyDescribed());
// Apply correction to velocity for 2-D cases // Apply correction to velocity for 2-D cases
meshTools::constrainDirection meshTools::constrainDirection

View File

@ -143,12 +143,6 @@ protected:
// Protected Member Functions // Protected Member Functions
//- Number of parcels to introduce over the time step relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce over the time step relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
//- Additional flag to identify whether or not injection of parcelI is //- Additional flag to identify whether or not injection of parcelI is
// permitted // permitted
virtual bool validInjection(const label parcelI); virtual bool validInjection(const label parcelI);
@ -266,6 +260,24 @@ public:
//- Return the end-of-injection time //- Return the end-of-injection time
virtual scalar timeEnd() const; virtual scalar timeEnd() const;
//- Number of parcels to introduce relative to SOI
virtual label parcelsToInject
(
const scalar time0,
const scalar time1
);
//- Volume of parcels to introduce relative to SOI
virtual scalar volumeToInject
(
const scalar time0,
const scalar time1
);
//- Return the average parcel mass over the injection period
scalar averageParcelMass();
// Counters // Counters
//- Return the number of injections //- Return the number of injections

View File

@ -26,46 +26,6 @@ License
#include "KinematicLookupTableInjection.H" #include "KinematicLookupTableInjection.H"
#include "scalarIOList.H" #include "scalarIOList.H"
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class CloudType>
Foam::label Foam::KinematicLookupTableInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((time0 >= 0.0) && (time0 < duration_))
{
return floor(injectorCells_.size()*(time1 - time0)*parcelsPerSecond_);
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
scalar volume = 0.0;
if ((time0 >= 0.0) && (time0 < duration_))
{
forAll(injectors_, i)
{
volume += injectors_[i].mDot()/injectors_[i].rho()*(time1 - time0);
}
}
return volume;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
@ -156,6 +116,44 @@ Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::timeEnd() const
} }
template<class CloudType>
Foam::label Foam::KinematicLookupTableInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((time0 >= 0.0) && (time0 < duration_))
{
return floor(injectorCells_.size()*(time1 - time0)*parcelsPerSecond_);
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
scalar volume = 0.0;
if ((time0 >= 0.0) && (time0 < duration_))
{
forAll(injectors_, i)
{
volume += injectors_[i].mDot()/injectors_[i].rho()*(time1 - time0);
}
}
return volume;
}
template<class CloudType> template<class CloudType>
void Foam::KinematicLookupTableInjection<CloudType>::setPositionAndCell void Foam::KinematicLookupTableInjection<CloudType>::setPositionAndCell
( (

View File

@ -91,17 +91,6 @@ class KinematicLookupTableInjection
labelList injectorTetPts_; labelList injectorTetPts_;
protected:
// Protected Member Functions
//- Number of parcels to introduce over the time step relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce over the time step relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
public: public:
//- Runtime type information //- Runtime type information
@ -138,6 +127,12 @@ public:
//- Return the end-of-injection time //- Return the end-of-injection time
scalar timeEnd() const; scalar timeEnd() const;
//- Number of parcels to introduce relative to SOI
virtual label parcelsToInject(const scalar time0, const scalar time1);
//- Volume of parcels to introduce relative to SOI
virtual scalar volumeToInject(const scalar time0, const scalar time1);
// Injection geometry // Injection geometry

View File

@ -30,45 +30,6 @@ License
using namespace Foam::constant::mathematical; using namespace Foam::constant::mathematical;
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
template<class CloudType>
Foam::label Foam::ManualInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((0.0 >= time0) && (0.0 < time1))
{
return positions_.size();
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::ManualInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
// All parcels introduced at SOI
if ((0.0 >= time0) && (0.0 < time1))
{
return this->volumeTotal_;
}
else
{
return 0.0;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType> template<class CloudType>
@ -192,6 +153,43 @@ Foam::scalar Foam::ManualInjection<CloudType>::timeEnd() const
} }
template<class CloudType>
Foam::label Foam::ManualInjection<CloudType>::parcelsToInject
(
const scalar time0,
const scalar time1
)
{
if ((0.0 >= time0) && (0.0 < time1))
{
return positions_.size();
}
else
{
return 0;
}
}
template<class CloudType>
Foam::scalar Foam::ManualInjection<CloudType>::volumeToInject
(
const scalar time0,
const scalar time1
)
{
// All parcels introduced at SOI
if ((0.0 >= time0) && (0.0 < time1))
{
return this->volumeTotal_;
}
else
{
return 0.0;
}
}
template<class CloudType> template<class CloudType>
void Foam::ManualInjection<CloudType>::setPositionAndCell void Foam::ManualInjection<CloudType>::setPositionAndCell
( (

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