mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Merge branch 'master' of ssh://noisy/home/noisy3/OpenFOAM/OpenFOAM-dev
This commit is contained in:
@ -1,11 +0,0 @@
|
|||||||
// Solve the Momentum equation
|
|
||||||
|
|
||||||
tmp<fvVectorMatrix> UEqn
|
|
||||||
(
|
|
||||||
fvm::div(phi, U)
|
|
||||||
+ turbulence->divDevRhoReff(U)
|
|
||||||
);
|
|
||||||
|
|
||||||
UEqn().relax();
|
|
||||||
|
|
||||||
solve(UEqn() == -fvc::grad(p));
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
fvScalarMatrix hEqn
|
|
||||||
(
|
|
||||||
fvm::div(phi, h)
|
|
||||||
- fvm::Sp(fvc::div(phi), h)
|
|
||||||
- fvm::laplacian(turbulence->alphaEff(), h)
|
|
||||||
==
|
|
||||||
fvc::div(phi/fvc::interpolate(rho)*fvc::interpolate(p, "div(U,p)"))
|
|
||||||
- p*fvc::div(phi/fvc::interpolate(rho))
|
|
||||||
);
|
|
||||||
|
|
||||||
hEqn.relax();
|
|
||||||
|
|
||||||
hEqn.solve();
|
|
||||||
|
|
||||||
thermo.correct();
|
|
||||||
|
|
||||||
rho = thermo.rho();
|
|
||||||
|
|
||||||
if (!transonic)
|
|
||||||
{
|
|
||||||
rho.relax();
|
|
||||||
}
|
|
||||||
|
|
||||||
Info<< "rho max/min : "
|
|
||||||
<< max(rho).value() << " "
|
|
||||||
<< min(rho).value() << endl;
|
|
||||||
}
|
|
||||||
@ -1,3 +1,8 @@
|
|||||||
|
rho = thermo.rho();
|
||||||
|
rho = max(rho, rhoMin);
|
||||||
|
rho = min(rho, rhoMax);
|
||||||
|
rho.relax();
|
||||||
|
|
||||||
volScalarField p0 = p;
|
volScalarField p0 = p;
|
||||||
|
|
||||||
volScalarField AU = UEqn().A();
|
volScalarField AU = UEqn().A();
|
||||||
@ -24,8 +29,8 @@ if (transonic)
|
|||||||
+ phid*(fvc::interpolate(p) - fvc::interpolate(p, "UD"))
|
+ phid*(fvc::interpolate(p) - fvc::interpolate(p, "UD"))
|
||||||
);
|
);
|
||||||
|
|
||||||
refCast<mixedFvPatchScalarField>(p.boundaryField()[1]).refValue()
|
//refCast<mixedFvPatchScalarField>(p.boundaryField()[1]).refValue()
|
||||||
= p.boundaryField()[1];
|
// = p.boundaryField()[1];
|
||||||
|
|
||||||
fvScalarMatrix pEqn
|
fvScalarMatrix pEqn
|
||||||
(
|
(
|
||||||
@ -35,6 +40,7 @@ if (transonic)
|
|||||||
+ fvc::div(phid)*p
|
+ fvc::div(phid)*p
|
||||||
- fvm::laplacian(rho/AtU, p)
|
- fvm::laplacian(rho/AtU, p)
|
||||||
);
|
);
|
||||||
|
//pEqn.relax();
|
||||||
|
|
||||||
pEqn.setReference(pRefCell, pRefValue);
|
pEqn.setReference(pRefCell, pRefValue);
|
||||||
|
|
||||||
|
|||||||
@ -57,6 +57,7 @@ int main(int argc, char *argv[])
|
|||||||
#include "readSIMPLEControls.H"
|
#include "readSIMPLEControls.H"
|
||||||
|
|
||||||
p.storePrevIter();
|
p.storePrevIter();
|
||||||
|
rho.storePrevIter();
|
||||||
|
|
||||||
if (!transonic)
|
if (!transonic)
|
||||||
{
|
{
|
||||||
|
|||||||
3
applications/test/memInfo/Make/files
Normal file
3
applications/test/memInfo/Make/files
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
memInfo.C
|
||||||
|
|
||||||
|
EXE = $(FOAM_USER_APPBIN)/memInfo
|
||||||
0
applications/test/memInfo/Make/options
Normal file
0
applications/test/memInfo/Make/options
Normal file
19
applications/test/memInfo/memInfo.C
Normal file
19
applications/test/memInfo/memInfo.C
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#include "memInfo.H"
|
||||||
|
#include "IOstreams.H"
|
||||||
|
#include "List.H"
|
||||||
|
#include "vector.H"
|
||||||
|
|
||||||
|
using namespace Foam;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
memInfo m;
|
||||||
|
|
||||||
|
Info<< m << endl;
|
||||||
|
|
||||||
|
List<vector> l(10000000, vector::one);
|
||||||
|
|
||||||
|
Info<< m.update() << endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@ -56,6 +56,14 @@ int main(int argc, char *argv[])
|
|||||||
"specify a list of fields to be reconstructed. Eg, '(U T p)' - "
|
"specify a list of fields to be reconstructed. Eg, '(U T p)' - "
|
||||||
"regular expressions not currently supported"
|
"regular expressions not currently supported"
|
||||||
);
|
);
|
||||||
|
argList::addOption
|
||||||
|
(
|
||||||
|
"lagrangianFields",
|
||||||
|
"list",
|
||||||
|
"specify a list of lagrangian fields to be reconstructed. Eg, '(U d)' -"
|
||||||
|
"regular expressions not currently supported, "
|
||||||
|
"positions always included."
|
||||||
|
);
|
||||||
argList::addBoolOption
|
argList::addBoolOption
|
||||||
(
|
(
|
||||||
"noLagrangian",
|
"noLagrangian",
|
||||||
@ -73,6 +81,20 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
const bool noLagrangian = args.optionFound("noLagrangian");
|
const bool noLagrangian = args.optionFound("noLagrangian");
|
||||||
|
|
||||||
|
HashSet<word> selectedLagrangianFields;
|
||||||
|
if (args.optionFound("lagrangianFields"))
|
||||||
|
{
|
||||||
|
if (noLagrangian)
|
||||||
|
{
|
||||||
|
FatalErrorIn(args.executable())
|
||||||
|
<< "Cannot specify noLagrangian and lagrangianFields "
|
||||||
|
<< "options together."
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
args.optionLookup("lagrangianFields")() >> selectedLagrangianFields;
|
||||||
|
}
|
||||||
|
|
||||||
// determine the processor count directly
|
// determine the processor count directly
|
||||||
label nProcs = 0;
|
label nProcs = 0;
|
||||||
while (isDir(args.path()/(word("processor") + name(nProcs))))
|
while (isDir(args.path()/(word("processor") + name(nProcs))))
|
||||||
@ -403,84 +425,96 @@ int main(int argc, char *argv[])
|
|||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFieldFields<label>
|
reconstructLagrangianFieldFields<label>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFields<scalar>
|
reconstructLagrangianFields<scalar>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFieldFields<scalar>
|
reconstructLagrangianFieldFields<scalar>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFields<vector>
|
reconstructLagrangianFields<vector>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFieldFields<vector>
|
reconstructLagrangianFieldFields<vector>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFields<sphericalTensor>
|
reconstructLagrangianFields<sphericalTensor>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFieldFields<sphericalTensor>
|
reconstructLagrangianFieldFields<sphericalTensor>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFields<symmTensor>
|
reconstructLagrangianFields<symmTensor>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFieldFields<symmTensor>
|
reconstructLagrangianFieldFields<symmTensor>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFields<tensor>
|
reconstructLagrangianFields<tensor>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
reconstructLagrangianFieldFields<tensor>
|
reconstructLagrangianFieldFields<tensor>
|
||||||
(
|
(
|
||||||
cloudName,
|
cloudName,
|
||||||
mesh,
|
mesh,
|
||||||
procMeshes.meshes(),
|
procMeshes.meshes(),
|
||||||
sprayObjs
|
sprayObjs,
|
||||||
|
selectedLagrangianFields
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -188,12 +188,12 @@ then
|
|||||||
fi
|
fi
|
||||||
mpiopts="-np $NPROCS"
|
mpiopts="-np $NPROCS"
|
||||||
|
|
||||||
#
|
#
|
||||||
# is the machine ready to run parallel?
|
# is the machine ready to run parallel?
|
||||||
#
|
#
|
||||||
echo "Parallel processing using $WM_MPLIB with $NPROCS processors"
|
echo "Parallel processing using $WM_MPLIB with $NPROCS processors"
|
||||||
case "$WM_MPLIB" in
|
case "$WM_MPLIB" in
|
||||||
OPENMPI)
|
*OPENMPI)
|
||||||
# add hostfile info
|
# add hostfile info
|
||||||
for hostfile in \
|
for hostfile in \
|
||||||
hostfile \
|
hostfile \
|
||||||
|
|||||||
@ -221,7 +221,7 @@ done
|
|||||||
unset cmd
|
unset cmd
|
||||||
|
|
||||||
case "$WM_MPLIB" in
|
case "$WM_MPLIB" in
|
||||||
OPENMPI)
|
*OPENMPI)
|
||||||
cmd="mpirun -app $PWD/mpirun.schema </dev/null"
|
cmd="mpirun -app $PWD/mpirun.schema </dev/null"
|
||||||
;;
|
;;
|
||||||
MPICH)
|
MPICH)
|
||||||
|
|||||||
@ -146,13 +146,20 @@ checkIllegalCode()
|
|||||||
badFiles=$(
|
badFiles=$(
|
||||||
for f in $fileList
|
for f in $fileList
|
||||||
do
|
do
|
||||||
# parse line numbers from grep output:
|
case "$f" in
|
||||||
# <lineNr>: contents
|
# exclude potential makefiles
|
||||||
lines=$(git grep -E -hn -e "$reBad" $scope"$f" |
|
(wmake/[Mm]akefile* | wmake/rules/*)
|
||||||
sed -e 's@:.*@@' |
|
;;
|
||||||
tr '\n' ' '
|
(*)
|
||||||
)
|
# parse line numbers from grep output:
|
||||||
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
# <lineNr>: contents
|
||||||
|
lines=$(git grep -E -hn -e "$reBad" $scope"$f" |
|
||||||
|
sed -e 's@:.*@@' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)
|
||||||
|
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
done
|
done
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -243,7 +250,7 @@ checkLineLengthNonComments()
|
|||||||
# parse line numbers from grep output:
|
# parse line numbers from grep output:
|
||||||
# <lineNr>: contents
|
# <lineNr>: contents
|
||||||
lines=$(git grep -hn -e '^.\{81,\}' \
|
lines=$(git grep -hn -e '^.\{81,\}' \
|
||||||
--and --not -e "^ *//" \
|
--and --not -e '^ *//' \
|
||||||
$scope"$f" |
|
$scope"$f" |
|
||||||
sed -e 's@:.*@@' |
|
sed -e 's@:.*@@' |
|
||||||
tr '\n' ' '
|
tr '\n' ' '
|
||||||
@ -276,7 +283,7 @@ checkLineLengthNonDirective()
|
|||||||
# parse line numbers from grep output:
|
# parse line numbers from grep output:
|
||||||
# <lineNr>: contents
|
# <lineNr>: contents
|
||||||
lines=$(git grep -hn -e '^.\{81,\}' \
|
lines=$(git grep -hn -e '^.\{81,\}' \
|
||||||
--and --not -e "^ *#" \
|
--and --not -e '^ *#' \
|
||||||
$scope"$f" |
|
$scope"$f" |
|
||||||
sed -e 's@:.*@@' |
|
sed -e 's@:.*@@' |
|
||||||
tr '\n' ' '
|
tr '\n' ' '
|
||||||
|
|||||||
@ -109,13 +109,20 @@ checkIllegalCode()
|
|||||||
badFiles=$(
|
badFiles=$(
|
||||||
for f in $fileList
|
for f in $fileList
|
||||||
do
|
do
|
||||||
# parse line numbers from grep output:
|
case "$f" in
|
||||||
# <lineNr>: contents
|
# exclude potential makefiles
|
||||||
lines=$(git grep -E -hn -e "$reBad" $scope"$f" |
|
(wmake/[Mm]akefile* | wmake/rules/*)
|
||||||
sed -e 's@:.*@@' |
|
;;
|
||||||
tr '\n' ' '
|
(*)
|
||||||
)
|
# parse line numbers from grep output:
|
||||||
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
# <lineNr>: contents
|
||||||
|
lines=$(git grep -E -hn -e "$reBad" $scope"$f" |
|
||||||
|
sed -e 's@:.*@@' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)
|
||||||
|
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
done
|
done
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -206,7 +213,7 @@ checkLineLengthNonComments()
|
|||||||
# parse line numbers from grep output:
|
# parse line numbers from grep output:
|
||||||
# <lineNr>: contents
|
# <lineNr>: contents
|
||||||
lines=$(git grep -hn -e '^.\{81,\}' \
|
lines=$(git grep -hn -e '^.\{81,\}' \
|
||||||
--and --not -e "^ *//" \
|
--and --not -e '^ *//' \
|
||||||
$scope"$f" |
|
$scope"$f" |
|
||||||
sed -e 's@:.*@@' |
|
sed -e 's@:.*@@' |
|
||||||
tr '\n' ' '
|
tr '\n' ' '
|
||||||
@ -239,7 +246,7 @@ checkLineLengthNonDirective()
|
|||||||
# parse line numbers from grep output:
|
# parse line numbers from grep output:
|
||||||
# <lineNr>: contents
|
# <lineNr>: contents
|
||||||
lines=$(git grep -hn -e '^.\{81,\}' \
|
lines=$(git grep -hn -e '^.\{81,\}' \
|
||||||
--and --not -e "^ *#" \
|
--and --not -e '^ *#' \
|
||||||
$scope"$f" |
|
$scope"$f" |
|
||||||
sed -e 's@:.*@@' |
|
sed -e 's@:.*@@' |
|
||||||
tr '\n' ' '
|
tr '\n' ' '
|
||||||
|
|||||||
@ -24,21 +24,63 @@ be quite a gain on large numbers of processors.
|
|||||||
|
|
||||||
|
|
||||||
- all file monitoring is done by an instance of 'fileMonitor' in the Time
|
- all file monitoring is done by an instance of 'fileMonitor' in the Time
|
||||||
class. The fileMonitor class can be found in OSspecific. Default is
|
class. The fileMonitor class can be found in OSspecific. It uses either
|
||||||
to use the (linux-specific) 'inotify' system calls.
|
timestamps as before or the (linux-specific) 'inotify' system framework
|
||||||
If compiled with -DFOAM_USE_STAT it will revert to the current 'stat' system
|
(available only if compiled with -DFOAM_USE_INOTIFY).
|
||||||
calls.
|
|
||||||
|
|
||||||
|
|
||||||
- inotify does not need timestamps. There is no need for fileModificationSkew
|
- the monitoring can be done in one of four modes as set by
|
||||||
|
OptimisationSwitches::fileModificationChecking
|
||||||
|
|
||||||
|
- timeStamp : old behaviour : all nodes check the timestamp
|
||||||
|
- inotify : using inotify instead of timestamps
|
||||||
|
- timeStampMaster,inotifyMaster : only the master node checks the file
|
||||||
|
and only the master node reads it and distribute it to the
|
||||||
|
slaves. This makes runTimeModifiable possible on distributed
|
||||||
|
running (see below).
|
||||||
|
|
||||||
|
- distributed running:
|
||||||
|
- set fileModificationChecking to e.g. timeStampMaster
|
||||||
|
- decompose a case, e.g. cavity
|
||||||
|
- copy system and constant to processor0/
|
||||||
|
- put the all the processor* directories on the wanted nodes inside
|
||||||
|
the case directory. E.g.
|
||||||
|
- on master have /tmp/cavity/processor0
|
||||||
|
- on slaveN have /tmp/cavity/processorN
|
||||||
|
- so to reiterate:
|
||||||
|
- there is no need for cavity/constant or cavity/system, all the
|
||||||
|
dictionaries are only in processor0/constant or processor0/system
|
||||||
|
- the slave processor directories have no system directory and the
|
||||||
|
constant directory only contains the mesh.
|
||||||
|
- start the job in distributed mode by specifying the slave roots
|
||||||
|
(so one less than the number of processors) with
|
||||||
|
the -roots command line option:
|
||||||
|
|
||||||
|
mpirun -np 2 icoFoam -roots '("/tmp")' -parallel
|
||||||
|
|
||||||
|
- the alternative to the -roots option is to have a
|
||||||
|
cavity/system/decomposeParDict on the master with
|
||||||
|
distributed yes;
|
||||||
|
roots ("/tmp");
|
||||||
|
|
||||||
|
|
||||||
|
Details:
|
||||||
|
- timeStampMaster, inotifyMaster : this works only for IOdictionaries that
|
||||||
|
are READ_IF_MODIFIED. It means that slaves read exactly the same dictionary
|
||||||
|
as the master so cannot be used for dictionaries that contain e.g. mesh
|
||||||
|
specific information.
|
||||||
|
|
||||||
|
- inotify is a monitoring framework used to monitor changes in
|
||||||
|
lots of files (e.g. used in desktop searched like beagle). You specify
|
||||||
|
files to monitor and then get warned for any changes to these files.
|
||||||
|
It does not need timestamps. There is no need for fileModificationSkew
|
||||||
to allow for time differences. (there can still temporarily be a difference
|
to allow for time differences. (there can still temporarily be a difference
|
||||||
in modified status between different processors due to nfs lagging)
|
in modified status between different processors due to nfs lagging). The big
|
||||||
|
problem is that it does not work over nfs3 (not sure about nfs4).
|
||||||
|
|
||||||
- fileMonitor stores two hashtables per file so there is a small overhead
|
- fileMonitor stores two hashtables per file so there is a small overhead
|
||||||
adding and removing files from monitoring.
|
adding and removing files from monitoring.
|
||||||
|
|
||||||
|
|
||||||
- if runTimeModifiable is false at start of run no files will get monitored,
|
- if runTimeModifiable is false at start of run no files will get monitored,
|
||||||
however if runTimeModified gets set to false during the run the files
|
however if runTimeModified gets set to false during the run the files
|
||||||
will still get monitored (though never reloaded). This is only a hypothetical
|
will still get monitored (though never reloaded). This is only a hypothetical
|
||||||
@ -46,7 +88,6 @@ problem in that the kernel still stores events for the monitored files. However
|
|||||||
inotify is very efficient - e.g. it gets used to track changes on file systems
|
inotify is very efficient - e.g. it gets used to track changes on file systems
|
||||||
for desktop search engines.
|
for desktop search engines.
|
||||||
|
|
||||||
|
|
||||||
- in the old system one could call modified() on any object and get
|
- in the old system one could call modified() on any object and get
|
||||||
and uptodate state. In the new system it will return the state from
|
and uptodate state. In the new system it will return the state from
|
||||||
the last runTime++ (which if it triggered any re-reads will have reset the
|
the last runTime++ (which if it triggered any re-reads will have reset the
|
||||||
|
|||||||
@ -872,6 +872,14 @@ InfoSwitches
|
|||||||
OptimisationSwitches
|
OptimisationSwitches
|
||||||
{
|
{
|
||||||
fileModificationSkew 10;
|
fileModificationSkew 10;
|
||||||
|
|
||||||
|
//- Modification checking:
|
||||||
|
// - timeStamp : use modification time on file
|
||||||
|
// - inotify : use inotify framework
|
||||||
|
// - timeStampMaster : do time stamp (and file reading) only on master.
|
||||||
|
// - inotifyMaster : do inotify (and file reading) only on master.
|
||||||
|
fileModificationChecking timeStampMaster;//inotify;timeStamp;inotifyMaster;
|
||||||
|
|
||||||
commsType nonBlocking; //scheduled; //blocking;
|
commsType nonBlocking; //scheduled; //blocking;
|
||||||
floatTransfer 0;
|
floatTransfer 0;
|
||||||
nProcsSimpleSum 0;
|
nProcsSimpleSum 0;
|
||||||
|
|||||||
@ -90,17 +90,20 @@ switch ("$compilerInstall")
|
|||||||
case OpenFOAM:
|
case OpenFOAM:
|
||||||
switch ("$WM_COMPILER")
|
switch ("$WM_COMPILER")
|
||||||
case Gcc:
|
case Gcc:
|
||||||
|
case Gcc++0x:
|
||||||
set gcc_version=gcc-4.4.3
|
set gcc_version=gcc-4.4.3
|
||||||
set gmp_version=gmp-5.0.1
|
set gmp_version=gmp-5.0.1
|
||||||
set mpfr_version=mpfr-2.4.2
|
set mpfr_version=mpfr-2.4.2
|
||||||
breaksw
|
breaksw
|
||||||
case Gcc45:
|
case Gcc45:
|
||||||
|
case Gcc45++0x:
|
||||||
set gcc_version=gcc-4.5.0
|
set gcc_version=gcc-4.5.0
|
||||||
set gmp_version=gmp-5.0.1
|
set gmp_version=gmp-5.0.1
|
||||||
set mpfr_version=mpfr-2.4.2
|
set mpfr_version=mpfr-2.4.2
|
||||||
set mpc_version=mpc-0.8.1
|
set mpc_version=mpc-0.8.1
|
||||||
breaksw
|
breaksw
|
||||||
case Gcc44:
|
case Gcc44:
|
||||||
|
case Gcc44++0x:
|
||||||
set gcc_version=gcc-4.4.3
|
set gcc_version=gcc-4.4.3
|
||||||
set gmp_version=gmp-5.0.1
|
set gmp_version=gmp-5.0.1
|
||||||
set mpfr_version=mpfr-2.4.2
|
set mpfr_version=mpfr-2.4.2
|
||||||
@ -190,6 +193,18 @@ case OpenFOAM:
|
|||||||
endsw
|
endsw
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# add c++0x flags for external programs
|
||||||
|
#
|
||||||
|
if ( $?WM_CXXFLAGS ) then
|
||||||
|
switch ("$WM_COMPILER")
|
||||||
|
case Gcc*++0x:
|
||||||
|
setenv WM_CXXFLAGS "$WM_CXXFLAGS -std=c++0x"
|
||||||
|
breaksw
|
||||||
|
endsw
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
# boost and CGAL
|
# boost and CGAL
|
||||||
# ~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@ -236,9 +251,7 @@ case OPENMPI:
|
|||||||
breaksw
|
breaksw
|
||||||
|
|
||||||
case SYSTEMOPENMPI:
|
case SYSTEMOPENMPI:
|
||||||
|
# Use the system installed openmpi, get library directory via mpicc
|
||||||
# This uses the installed openmpi. It needs mpicc installed!
|
|
||||||
|
|
||||||
set mpi_version=openmpi-system
|
set mpi_version=openmpi-system
|
||||||
|
|
||||||
# Set compilation flags here instead of in wmake/rules/../mplibSYSTEMOPENMPI
|
# Set compilation flags here instead of in wmake/rules/../mplibSYSTEMOPENMPI
|
||||||
|
|||||||
@ -111,18 +111,18 @@ unset MPFR_ARCH_PATH
|
|||||||
case "${compilerInstall:-OpenFOAM}" in
|
case "${compilerInstall:-OpenFOAM}" in
|
||||||
OpenFOAM)
|
OpenFOAM)
|
||||||
case "$WM_COMPILER" in
|
case "$WM_COMPILER" in
|
||||||
Gcc)
|
Gcc | Gcc++0x)
|
||||||
gcc_version=gcc-4.4.3
|
gcc_version=gcc-4.4.3
|
||||||
gmp_version=gmp-5.0.1
|
gmp_version=gmp-5.0.1
|
||||||
mpfr_version=mpfr-2.4.2
|
mpfr_version=mpfr-2.4.2
|
||||||
;;
|
;;
|
||||||
Gcc45)
|
Gcc45 | Gcc45++0x)
|
||||||
gcc_version=gcc-4.5.0
|
gcc_version=gcc-4.5.0
|
||||||
gmp_version=gmp-5.0.1
|
gmp_version=gmp-5.0.1
|
||||||
mpfr_version=mpfr-2.4.2
|
mpfr_version=mpfr-2.4.2
|
||||||
mpc_version=mpc-0.8.1
|
mpc_version=mpc-0.8.1
|
||||||
;;
|
;;
|
||||||
Gcc44)
|
Gcc44 | Gcc44++0x)
|
||||||
gcc_version=gcc-4.4.3
|
gcc_version=gcc-4.4.3
|
||||||
gmp_version=gmp-5.0.1
|
gmp_version=gmp-5.0.1
|
||||||
mpfr_version=mpfr-2.4.2
|
mpfr_version=mpfr-2.4.2
|
||||||
@ -213,6 +213,19 @@ OpenFOAM)
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# add c++0x flags for external programs
|
||||||
|
#
|
||||||
|
if [ -n "$WM_CXXFLAGS" ]
|
||||||
|
then
|
||||||
|
case "$WM_COMPILER" in
|
||||||
|
Gcc*++0x)
|
||||||
|
WM_CXXFLAGS="$WM_CXXFLAGS -std=c++0x"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# boost and CGAL
|
# boost and CGAL
|
||||||
# ~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@ -261,7 +274,7 @@ OPENMPI)
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
SYSTEMOPENMPI)
|
SYSTEMOPENMPI)
|
||||||
# use the system installed openmpi, get library directory via mpicc
|
# Use the system installed openmpi, get library directory via mpicc
|
||||||
mpi_version=openmpi-system
|
mpi_version=openmpi-system
|
||||||
|
|
||||||
# Set compilation flags here instead of in wmake/rules/../mplibSYSTEMOPENMPI
|
# Set compilation flags here instead of in wmake/rules/../mplibSYSTEMOPENMPI
|
||||||
|
|||||||
@ -12,9 +12,9 @@ unset COMP_FLAGS LINK_FLAGS
|
|||||||
if [ -f /usr/include/sys/inotify.h -a "${1%USE_STAT}" = "$1" ]
|
if [ -f /usr/include/sys/inotify.h -a "${1%USE_STAT}" = "$1" ]
|
||||||
then
|
then
|
||||||
echo "Found <sys/inotify.h> -- using inotify for file monitoring."
|
echo "Found <sys/inotify.h> -- using inotify for file monitoring."
|
||||||
unset COMP_FLAGS
|
export COMP_FLAGS="-DFOAM_USE_INOTIFY"
|
||||||
else
|
else
|
||||||
export COMP_FLAGS="-DFOAM_USE_STAT"
|
unset COMP_FLAGS
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@ fileStat.C
|
|||||||
POSIX.C
|
POSIX.C
|
||||||
cpuTime/cpuTime.C
|
cpuTime/cpuTime.C
|
||||||
clockTime/clockTime.C
|
clockTime/clockTime.C
|
||||||
|
memInfo/memInfo.C
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: fileMonitor assumes inotify by default. Compile with -DFOAM_USE_STAT
|
* Note: fileMonitor assumes inotify by default. Compile with -DFOAM_USE_STAT
|
||||||
|
|||||||
@ -36,6 +36,7 @@ Description
|
|||||||
#include "fileName.H"
|
#include "fileName.H"
|
||||||
#include "fileStat.H"
|
#include "fileStat.H"
|
||||||
#include "timer.H"
|
#include "timer.H"
|
||||||
|
#include "IFstream.H"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
|||||||
@ -24,38 +24,25 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "clockTime.H"
|
#include "clockTime.H"
|
||||||
#include "scalar.H"
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Static Members * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
void clockTime::getTime(struct timeval& t)
|
void Foam::clockTime::getTime(timeType& t)
|
||||||
{
|
{
|
||||||
gettimeofday(&t, NULL);
|
gettimeofday(&t, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double clockTime::timeDifference
|
double Foam::clockTime::timeDifference(const timeType& beg, const timeType& end)
|
||||||
(
|
|
||||||
const struct timeval& start,
|
|
||||||
const struct timeval& end
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
return end.tv_sec - start.tv_sec + 1E-6*(end.tv_usec - start.tv_usec);
|
return end.tv_sec - beg.tv_sec + 1E-6*(end.tv_usec - beg.tv_usec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
clockTime::clockTime()
|
Foam::clockTime::clockTime()
|
||||||
{
|
{
|
||||||
getTime(startTime_);
|
getTime(startTime_);
|
||||||
lastTime_ = startTime_;
|
lastTime_ = startTime_;
|
||||||
@ -65,14 +52,14 @@ clockTime::clockTime()
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
double clockTime::elapsedTime() const
|
double Foam::clockTime::elapsedTime() const
|
||||||
{
|
{
|
||||||
getTime(newTime_);
|
getTime(newTime_);
|
||||||
return timeDifference(startTime_, newTime_);
|
return timeDifference(startTime_, newTime_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double clockTime::timeIncrement() const
|
double Foam::clockTime::timeIncrement() const
|
||||||
{
|
{
|
||||||
lastTime_ = newTime_;
|
lastTime_ = newTime_;
|
||||||
getTime(newTime_);
|
getTime(newTime_);
|
||||||
@ -80,8 +67,4 @@ double clockTime::timeIncrement() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -44,43 +44,45 @@ namespace Foam
|
|||||||
{
|
{
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class clockTime Declaration
|
Class clockTime Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
class clockTime
|
class clockTime
|
||||||
{
|
{
|
||||||
// Private data
|
// Private data
|
||||||
|
|
||||||
struct timeval startTime_;
|
//- Time structure used
|
||||||
mutable struct timeval lastTime_;
|
typedef struct timeval timeType;
|
||||||
mutable struct timeval newTime_;
|
|
||||||
|
|
||||||
static void getTime(struct timeval& t);
|
timeType startTime_;
|
||||||
|
|
||||||
static double timeDifference
|
mutable timeType lastTime_;
|
||||||
(
|
mutable timeType newTime_;
|
||||||
const struct timeval& start,
|
|
||||||
const struct timeval& end
|
// Private Member Functions
|
||||||
);
|
|
||||||
|
//- Retrieve the current time values from the system
|
||||||
|
static void getTime(timeType&);
|
||||||
|
|
||||||
|
//- Difference between two times
|
||||||
|
static double timeDifference(const timeType& beg, const timeType& end);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct from components
|
//- Construct with the current clock time
|
||||||
clockTime();
|
clockTime();
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
// Access
|
//- Return time (in seconds) from the start
|
||||||
|
double elapsedTime() const;
|
||||||
|
|
||||||
//- Returns CPU time from start of run
|
//- Return time (in seconds) since last call to timeIncrement()
|
||||||
double elapsedTime() const;
|
double timeIncrement() const;
|
||||||
|
|
||||||
//- Returns CPU time from last call of clockTimeIncrement()
|
|
||||||
double timeIncrement() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -21,45 +21,32 @@ License
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Description
|
|
||||||
Starts timing CPU usage and return elapsed time from start.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "cpuTime.H"
|
#include "cpuTime.H"
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Static Members * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Static Members * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
long cpuTime::Hz_(sysconf(_SC_CLK_TCK));
|
const long Foam::cpuTime::Hz_(sysconf(_SC_CLK_TCK));
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
void cpuTime::getTime(struct tms& t)
|
void Foam::cpuTime::getTime(timeType& t)
|
||||||
{
|
{
|
||||||
times(&t);
|
times(&t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double cpuTime::timeDifference
|
double Foam::cpuTime::timeDifference(const timeType& beg, const timeType& end)
|
||||||
(
|
|
||||||
const struct tms& start,
|
|
||||||
const struct tms& end
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
(
|
(
|
||||||
double
|
double
|
||||||
(
|
(
|
||||||
(end.tms_utime + end.tms_stime)
|
(end.tms_utime + end.tms_stime)
|
||||||
- (start.tms_utime + start.tms_stime)
|
- (beg.tms_utime + beg.tms_stime)
|
||||||
)/Hz_
|
)/Hz_
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -67,7 +54,7 @@ double cpuTime::timeDifference
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
cpuTime::cpuTime()
|
Foam::cpuTime::cpuTime()
|
||||||
{
|
{
|
||||||
getTime(startTime_);
|
getTime(startTime_);
|
||||||
lastTime_ = startTime_;
|
lastTime_ = startTime_;
|
||||||
@ -77,14 +64,14 @@ cpuTime::cpuTime()
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
double cpuTime::elapsedCpuTime() const
|
double Foam::cpuTime::elapsedCpuTime() const
|
||||||
{
|
{
|
||||||
getTime(newTime_);
|
getTime(newTime_);
|
||||||
return timeDifference(startTime_, newTime_);
|
return timeDifference(startTime_, newTime_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double cpuTime::cpuTimeIncrement() const
|
double Foam::cpuTime::cpuTimeIncrement() const
|
||||||
{
|
{
|
||||||
lastTime_ = newTime_;
|
lastTime_ = newTime_;
|
||||||
getTime(newTime_);
|
getTime(newTime_);
|
||||||
@ -92,8 +79,4 @@ double cpuTime::cpuTimeIncrement() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -54,38 +54,41 @@ class cpuTime
|
|||||||
{
|
{
|
||||||
// Private data
|
// Private data
|
||||||
|
|
||||||
static long Hz_;
|
//- Time structure used
|
||||||
|
typedef struct tms timeType;
|
||||||
|
|
||||||
struct tms startTime_;
|
//- Clock-ticks per second
|
||||||
mutable struct tms lastTime_;
|
static const long Hz_;
|
||||||
mutable struct tms newTime_;
|
|
||||||
|
|
||||||
static void getTime(struct tms& t);
|
//- The start time
|
||||||
|
timeType startTime_;
|
||||||
|
mutable timeType lastTime_;
|
||||||
|
mutable timeType newTime_;
|
||||||
|
|
||||||
static double timeDifference
|
// Private Member Functions
|
||||||
(
|
|
||||||
const struct tms& start,
|
//- Retrieve the current time values from the system
|
||||||
const struct tms& end
|
static void getTime(timeType&);
|
||||||
);
|
|
||||||
|
//- Difference between two times
|
||||||
|
static double timeDifference(const timeType& beg, const timeType& end);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct from components
|
//- Construct with the current clock time
|
||||||
cpuTime();
|
cpuTime();
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
// Access
|
//- Return CPU time (in seconds) from the start
|
||||||
|
double elapsedCpuTime() const;
|
||||||
|
|
||||||
//- Returns CPU time from start of run
|
//- Return CPU time (in seconds) since last call to cpuTimeIncrement()
|
||||||
double elapsedCpuTime() const;
|
double cpuTimeIncrement() const;
|
||||||
|
|
||||||
//- Returns CPU time from last call of cpuTimeIncrement()
|
|
||||||
double cpuTimeIncrement() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -32,17 +32,17 @@ Class
|
|||||||
#include "PackedList.H"
|
#include "PackedList.H"
|
||||||
#include "PstreamReduceOps.H"
|
#include "PstreamReduceOps.H"
|
||||||
#include "OSspecific.H"
|
#include "OSspecific.H"
|
||||||
|
#include "regIOobject.H" // for fileModificationSkew symbol
|
||||||
|
|
||||||
#ifdef FOAM_USE_STAT
|
#ifdef FOAM_USE_INOTIFY
|
||||||
# include "OSspecific.H"
|
|
||||||
# include "regIOobject.H" // for fileModificationSkew symbol
|
|
||||||
#else
|
|
||||||
# include <sys/inotify.h>
|
# include <sys/inotify.h>
|
||||||
# include <sys/ioctl.h>
|
# include <sys/ioctl.h>
|
||||||
# include <errno.h>
|
# include <errno.h>
|
||||||
# define EVENT_SIZE ( sizeof (struct inotify_event) )
|
# define EVENT_SIZE ( sizeof (struct inotify_event) )
|
||||||
# define EVENT_LEN (EVENT_SIZE + 16)
|
# define EVENT_LEN (EVENT_SIZE + 16)
|
||||||
# define EVENT_BUF_LEN ( 1024 * EVENT_LEN )
|
# define EVENT_BUF_LEN ( 1024 * EVENT_LEN )
|
||||||
|
#else
|
||||||
|
# include "OSspecific.H"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
@ -111,78 +111,77 @@ namespace Foam
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
#ifdef FOAM_USE_STAT
|
const bool useInotify_;
|
||||||
//- From watch descriptor to modified time
|
|
||||||
DynamicList<time_t> lastMod_;
|
|
||||||
|
|
||||||
//- initialize HashTable size
|
// For inotify
|
||||||
inline fileMonitorWatcher(const label sz = 20)
|
|
||||||
:
|
|
||||||
lastMod_(sz)
|
|
||||||
{}
|
|
||||||
|
|
||||||
inline bool addWatch(const label watchFd, const fileName& fName)
|
//- File descriptor for the inotify instance
|
||||||
{
|
int inotifyFd_;
|
||||||
if (watchFd < lastMod_.size() && lastMod_[watchFd] != 0)
|
|
||||||
{
|
|
||||||
// Reuse of watchFd : should have lastMod set to 0.
|
|
||||||
FatalErrorIn("addWatch(const label, const fileName&)")
|
|
||||||
<< "Problem adding watch " << watchFd
|
|
||||||
<< " to file " << fName
|
|
||||||
<< abort(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
lastMod_(watchFd) = lastModified(fName);
|
//- Current watchIDs and corresponding directory id
|
||||||
return true;
|
DynamicList<label> dirWatches_;
|
||||||
}
|
DynamicList<fileName> dirFiles_;
|
||||||
|
|
||||||
inline bool removeWatch(const label watchFd)
|
// For stat
|
||||||
{
|
|
||||||
lastMod_[watchFd] = 0;
|
//- From watch descriptor to modified time
|
||||||
return true;
|
DynamicList<time_t> lastMod_;
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
//- File descriptor for the inotify instance
|
|
||||||
int inotifyFd_;
|
|
||||||
|
|
||||||
//- Current watchIDs and corresponding directory id
|
|
||||||
DynamicList<label> dirWatches_;
|
|
||||||
DynamicList<fileName> dirFiles_;
|
|
||||||
|
|
||||||
//- initialise inotify
|
//- initialise inotify
|
||||||
inline fileMonitorWatcher(const label sz = 20)
|
inline fileMonitorWatcher(const bool useInotify, const label sz = 20)
|
||||||
:
|
:
|
||||||
inotifyFd_(inotify_init()),
|
useInotify_(useInotify)
|
||||||
dirWatches_(sz),
|
|
||||||
dirFiles_(sz)
|
|
||||||
{
|
{
|
||||||
if (inotifyFd_ < 0)
|
if (useInotify_)
|
||||||
{
|
{
|
||||||
static bool hasWarned = false;
|
#ifdef FOAM_USE_INOTIFY
|
||||||
if (!hasWarned)
|
inotifyFd_ = inotify_init();
|
||||||
|
dirWatches_.setCapacity(sz);
|
||||||
|
dirFiles_.setCapacity(sz);
|
||||||
|
|
||||||
|
if (inotifyFd_ < 0)
|
||||||
{
|
{
|
||||||
hasWarned = true;
|
static bool hasWarned = false;
|
||||||
WarningIn("fileMonitorWatcher(const label)")
|
if (!hasWarned)
|
||||||
<< "Failed allocating an inotify descriptor : "
|
{
|
||||||
<< string(strerror(errno)) << endl
|
hasWarned = true;
|
||||||
<< " Please increase the number of allowable "
|
WarningIn("fileMonitorWatcher(const bool, const label)")
|
||||||
<< "inotify instances" << endl
|
<< "Failed allocating an inotify descriptor : "
|
||||||
<< " (/proc/sys/fs/inotify/max_user_instances"
|
<< string(strerror(errno)) << endl
|
||||||
<< " on Linux)" << endl
|
<< " Please increase the number of allowable "
|
||||||
<< " , switch off runTimeModifiable." << endl
|
<< "inotify instances" << endl
|
||||||
<< " or compile this file with FOAM_USE_STAT to use"
|
<< " (/proc/sys/fs/inotify/max_user_instances"
|
||||||
<< " time stamps instead of inotify." << endl
|
<< " on Linux)" << endl
|
||||||
<< " Continuing without additional file monitoring."
|
<< " , switch off runTimeModifiable." << endl
|
||||||
<< endl;
|
<< " or compile this file without "
|
||||||
|
<< "FOAM_USE_INOTIFY"
|
||||||
|
<< " to use time stamps instead of inotify." << endl
|
||||||
|
<< " Continuing without additional file"
|
||||||
|
<< " monitoring."
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
FatalErrorIn("fileMonitorWatcher(const bool, const label)")
|
||||||
|
<< "You selected inotify but this file was compiled"
|
||||||
|
<< " without FOAM_USE_INOTIFY"
|
||||||
|
<< "Please select another fileModification test method"
|
||||||
|
<< exit(FatalError);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastMod_.setCapacity(sz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//- remove all watches
|
//- remove all watches
|
||||||
inline ~fileMonitorWatcher()
|
inline ~fileMonitorWatcher()
|
||||||
{
|
{
|
||||||
if (inotifyFd_ >= 0)
|
#ifdef FOAM_USE_INOTIFY
|
||||||
|
if (useInotify_ && inotifyFd_ >= 0)
|
||||||
{
|
{
|
||||||
forAll(dirWatches_, i)
|
forAll(dirWatches_, i)
|
||||||
{
|
{
|
||||||
@ -197,57 +196,92 @@ namespace Foam
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool addWatch(const label watchFd, const fileName& fName)
|
inline bool addWatch(const label watchFd, const fileName& fName)
|
||||||
{
|
{
|
||||||
if (inotifyFd_ < 0)
|
if (useInotify_)
|
||||||
{
|
{
|
||||||
return false;
|
if (inotifyFd_ < 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef FOAM_USE_INOTIFY
|
||||||
|
// Add/retrieve watch on directory containing file.
|
||||||
|
// Note that fName might be non-existing in special situations
|
||||||
|
// (master-only reading for IODictionaries)
|
||||||
|
|
||||||
|
const fileName dir = fName.path();
|
||||||
|
|
||||||
|
label dirWatchID = -1;
|
||||||
|
if (isDir(dir))
|
||||||
|
{
|
||||||
|
dirWatchID = inotify_add_watch
|
||||||
|
(
|
||||||
|
inotifyFd_,
|
||||||
|
dir.c_str(),
|
||||||
|
IN_CLOSE_WRITE
|
||||||
|
);
|
||||||
|
|
||||||
|
if (dirWatchID < 0)
|
||||||
|
{
|
||||||
|
FatalErrorIn("addWatch(const label, const fileName&)")
|
||||||
|
<< "Failed adding watch " << watchFd
|
||||||
|
<< " to directory " << fName << " due to "
|
||||||
|
<< string(strerror(errno))
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (watchFd < dirWatches_.size() && dirWatches_[watchFd] != -1)
|
||||||
|
{
|
||||||
|
// Reuse of watchFd : should have dir watchID set to -1.
|
||||||
|
FatalErrorIn("addWatch(const label, const fileName&)")
|
||||||
|
<< "Problem adding watch " << watchFd
|
||||||
|
<< " to file " << fName
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
dirWatches_(watchFd) = dirWatchID;
|
||||||
|
dirFiles_(watchFd) = fName.name();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (watchFd < lastMod_.size() && lastMod_[watchFd] != 0)
|
||||||
|
{
|
||||||
|
// Reuse of watchFd : should have lastMod set to 0.
|
||||||
|
FatalErrorIn("addWatch(const label, const fileName&)")
|
||||||
|
<< "Problem adding watch " << watchFd
|
||||||
|
<< " to file " << fName
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastMod_(watchFd) = lastModified(fName);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add/retrieve watch on directory containing file
|
|
||||||
label dirWatchID = inotify_add_watch
|
|
||||||
(
|
|
||||||
inotifyFd_,
|
|
||||||
fName.path().c_str(),
|
|
||||||
IN_CLOSE_WRITE
|
|
||||||
);
|
|
||||||
|
|
||||||
if (dirWatchID < 0)
|
|
||||||
{
|
|
||||||
FatalErrorIn("addWatch(const label, const fileName&)")
|
|
||||||
<< "Failed adding watch " << watchFd
|
|
||||||
<< " to directory " << fName << " due to "
|
|
||||||
<< string(strerror(errno))
|
|
||||||
<< exit(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (watchFd < dirWatches_.size() && dirWatches_[watchFd] != -1)
|
|
||||||
{
|
|
||||||
// Reuse of watchFd : should have dir watchID set to -1.
|
|
||||||
FatalErrorIn("addWatch(const label, const fileName&)")
|
|
||||||
<< "Problem adding watch " << watchFd
|
|
||||||
<< " to file " << fName
|
|
||||||
<< abort(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
dirWatches_(watchFd) = dirWatchID;
|
|
||||||
dirFiles_(watchFd) = fName.name();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool removeWatch(const label watchFd)
|
inline bool removeWatch(const label watchFd)
|
||||||
{
|
{
|
||||||
if (inotifyFd_ < 0)
|
if (useInotify_)
|
||||||
{
|
{
|
||||||
return false;
|
if (inotifyFd_ < 0)
|
||||||
}
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
dirWatches_[watchFd] = -1;
|
dirWatches_[watchFd] = -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastMod_[watchFd] = 0;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
};
|
};
|
||||||
//! @endcond
|
//! @endcond
|
||||||
@ -258,131 +292,146 @@ namespace Foam
|
|||||||
|
|
||||||
void Foam::fileMonitor::checkFiles() const
|
void Foam::fileMonitor::checkFiles() const
|
||||||
{
|
{
|
||||||
#ifdef FOAM_USE_STAT
|
if (useInotify_)
|
||||||
forAll(watcher_->lastMod_, watchFd)
|
|
||||||
{
|
{
|
||||||
time_t oldTime = watcher_->lastMod_[watchFd];
|
#ifdef FOAM_USE_INOTIFY
|
||||||
|
// Large buffer for lots of events
|
||||||
|
char buffer[EVENT_BUF_LEN];
|
||||||
|
|
||||||
if (oldTime != 0)
|
while (true)
|
||||||
{
|
{
|
||||||
const fileName& fName = watchFile_[watchFd];
|
struct timeval zeroTimeout = {0, 0};
|
||||||
time_t newTime = lastModified(fName);
|
|
||||||
|
|
||||||
if (newTime == 0)
|
//- Pre-allocated structure containing file descriptors
|
||||||
|
fd_set fdSet;
|
||||||
|
// Add notify descriptor to select fd_set
|
||||||
|
FD_ZERO(&fdSet);
|
||||||
|
FD_SET(watcher_->inotifyFd_, &fdSet);
|
||||||
|
|
||||||
|
int ready = select
|
||||||
|
(
|
||||||
|
watcher_->inotifyFd_+1, // num filedescriptors in fdSet
|
||||||
|
&fdSet, // fdSet with only inotifyFd
|
||||||
|
NULL, // No writefds
|
||||||
|
NULL, // No errorfds
|
||||||
|
&zeroTimeout // eNo timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
if (ready < 0)
|
||||||
{
|
{
|
||||||
state_[watchFd] = DELETED;
|
FatalErrorIn("fileMonitor::updateStates()")
|
||||||
|
<< "Problem in issuing select."
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
else if (FD_ISSET(watcher_->inotifyFd_, &fdSet))
|
||||||
|
{
|
||||||
|
// Read events
|
||||||
|
ssize_t nBytes = read
|
||||||
|
(
|
||||||
|
watcher_->inotifyFd_,
|
||||||
|
buffer,
|
||||||
|
EVENT_BUF_LEN
|
||||||
|
);
|
||||||
|
|
||||||
|
if (nBytes < 0)
|
||||||
|
{
|
||||||
|
FatalErrorIn("fileMonitor::updateStates(const fileName&)")
|
||||||
|
<< "read of " << watcher_->inotifyFd_
|
||||||
|
<< " failed with " << label(nBytes)
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Go through buffer, consuming events
|
||||||
|
int i = 0;
|
||||||
|
while (i < nBytes)
|
||||||
|
{
|
||||||
|
const struct inotify_event* inotifyEvent =
|
||||||
|
reinterpret_cast<const struct inotify_event*>
|
||||||
|
(
|
||||||
|
&buffer[i]
|
||||||
|
);
|
||||||
|
|
||||||
|
//Pout<< "watchFd:" << inotifyEvent->wd << nl
|
||||||
|
// << "mask:" << inotifyEvent->mask << nl
|
||||||
|
// << endl;
|
||||||
|
//Pout<< "file:" << fileName(inotifyEvent->name) << endl;
|
||||||
|
//Pout<< "len:" << inotifyEvent->len << endl;
|
||||||
|
|
||||||
|
if
|
||||||
|
(
|
||||||
|
(inotifyEvent->mask & IN_CLOSE_WRITE)
|
||||||
|
&& inotifyEvent->len
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Search for file
|
||||||
|
forAll(watcher_->dirWatches_, i)
|
||||||
|
{
|
||||||
|
label id = watcher_->dirWatches_[i];
|
||||||
|
if
|
||||||
|
(
|
||||||
|
id == inotifyEvent->wd
|
||||||
|
&& inotifyEvent->name == watcher_->dirFiles_[i]
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Correct directory and name
|
||||||
|
state_[i] = MODIFIED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i += EVENT_SIZE + inotifyEvent->len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (newTime > (oldTime + regIOobject::fileModificationSkew))
|
// No data
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
forAll(watcher_->lastMod_, watchFd)
|
||||||
|
{
|
||||||
|
time_t oldTime = watcher_->lastMod_[watchFd];
|
||||||
|
|
||||||
|
if (oldTime != 0)
|
||||||
|
{
|
||||||
|
const fileName& fName = watchFile_[watchFd];
|
||||||
|
time_t newTime = lastModified(fName);
|
||||||
|
|
||||||
|
if (newTime == 0)
|
||||||
{
|
{
|
||||||
watcher_->lastMod_[watchFd] = newTime;
|
state_[watchFd] = DELETED;
|
||||||
state_[watchFd] = MODIFIED;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
state_[watchFd] = UNMODIFIED;
|
if (newTime > (oldTime + regIOobject::fileModificationSkew))
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// Large buffer for lots of events
|
|
||||||
char buffer[EVENT_BUF_LEN];
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
struct timeval zeroTimeout = {0, 0};
|
|
||||||
|
|
||||||
//- Pre-allocated structure containing file descriptors
|
|
||||||
fd_set fdSet;
|
|
||||||
// Add notify descriptor to select fd_set
|
|
||||||
FD_ZERO(&fdSet);
|
|
||||||
FD_SET(watcher_->inotifyFd_, &fdSet);
|
|
||||||
|
|
||||||
int ready = select
|
|
||||||
(
|
|
||||||
watcher_->inotifyFd_+1, // num filedescriptors in fdSet
|
|
||||||
&fdSet, // fdSet with only inotifyFd
|
|
||||||
NULL, // No writefds
|
|
||||||
NULL, // No errorfds
|
|
||||||
&zeroTimeout // eNo timeout
|
|
||||||
);
|
|
||||||
|
|
||||||
if (ready < 0)
|
|
||||||
{
|
|
||||||
FatalErrorIn("fileMonitor::updateStates()")
|
|
||||||
<< "Problem in issuing select."
|
|
||||||
<< abort(FatalError);
|
|
||||||
}
|
|
||||||
else if (FD_ISSET(watcher_->inotifyFd_, &fdSet))
|
|
||||||
{
|
|
||||||
// Read events
|
|
||||||
ssize_t nBytes = read(watcher_->inotifyFd_, buffer, EVENT_BUF_LEN);
|
|
||||||
|
|
||||||
if (nBytes < 0)
|
|
||||||
{
|
|
||||||
FatalErrorIn("fileMonitor::updateStates(const fileName&)")
|
|
||||||
<< "read of " << watcher_->inotifyFd_
|
|
||||||
<< " failed with " << label(nBytes)
|
|
||||||
<< abort(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Go through buffer, consuming events
|
|
||||||
int i = 0;
|
|
||||||
while (i < nBytes)
|
|
||||||
{
|
|
||||||
const struct inotify_event* inotifyEvent =
|
|
||||||
reinterpret_cast<const struct inotify_event*>
|
|
||||||
(
|
|
||||||
&buffer[i]
|
|
||||||
);
|
|
||||||
|
|
||||||
//Pout<< "watchFd:" << inotifyEvent->wd << nl
|
|
||||||
// << "mask:" << inotifyEvent->mask << nl
|
|
||||||
// << endl;
|
|
||||||
//Pout<< "file:" << fileName(inotifyEvent->name) << endl;
|
|
||||||
//Pout<< "len:" << inotifyEvent->len << endl;
|
|
||||||
|
|
||||||
if ((inotifyEvent->mask & IN_CLOSE_WRITE) && inotifyEvent->len)
|
|
||||||
{
|
|
||||||
// Search for file
|
|
||||||
forAll(watcher_->dirWatches_, i)
|
|
||||||
{
|
{
|
||||||
label id = watcher_->dirWatches_[i];
|
watcher_->lastMod_[watchFd] = newTime;
|
||||||
if
|
state_[watchFd] = MODIFIED;
|
||||||
(
|
}
|
||||||
id == inotifyEvent->wd
|
else
|
||||||
&& inotifyEvent->name == watcher_->dirFiles_[i]
|
{
|
||||||
)
|
state_[watchFd] = UNMODIFIED;
|
||||||
{
|
|
||||||
// Correct directory and name
|
|
||||||
state_[i] = MODIFIED;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i += EVENT_SIZE + inotifyEvent->len;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// No data
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|
||||||
Foam::fileMonitor::fileMonitor()
|
Foam::fileMonitor::fileMonitor(const bool useInotify)
|
||||||
:
|
:
|
||||||
|
useInotify_(useInotify),
|
||||||
state_(20),
|
state_(20),
|
||||||
watchFile_(20),
|
watchFile_(20),
|
||||||
freeWatchFds_(2),
|
freeWatchFds_(2),
|
||||||
watcher_(new fileMonitorWatcher(20))
|
watcher_(new fileMonitorWatcher(useInotify_, 20))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
@ -394,6 +443,8 @@ Foam::fileMonitor::~fileMonitor()
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
// Note: fName might not exist (on slaves if in master-only mode for
|
||||||
|
// regIOobject)
|
||||||
Foam::label Foam::fileMonitor::addWatch(const fileName& fName)
|
Foam::label Foam::fileMonitor::addWatch(const fileName& fName)
|
||||||
{
|
{
|
||||||
label watchFd;
|
label watchFd;
|
||||||
@ -458,50 +509,97 @@ const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::fileMonitor::updateStates(const bool syncPar) const
|
void Foam::fileMonitor::updateStates
|
||||||
|
(
|
||||||
|
const bool masterOnly,
|
||||||
|
const bool syncPar
|
||||||
|
) const
|
||||||
{
|
{
|
||||||
checkFiles();
|
if (Pstream::master() || !masterOnly)
|
||||||
|
{
|
||||||
|
checkFiles();
|
||||||
|
}
|
||||||
|
|
||||||
if (syncPar)
|
if (syncPar)
|
||||||
{
|
{
|
||||||
PackedList<2> stats(state_.size());
|
// Pack current state (might be on master only)
|
||||||
forAll(state_, watchFd)
|
PackedList<2> stats(state_.size(), MODIFIED);
|
||||||
|
if (Pstream::master() || !masterOnly)
|
||||||
{
|
{
|
||||||
stats[watchFd] = static_cast<unsigned int>(state_[watchFd]);
|
forAll(state_, watchFd)
|
||||||
|
{
|
||||||
|
stats[watchFd] = static_cast<unsigned int>(state_[watchFd]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Save local state for warning message below
|
|
||||||
PackedList<2> thisProcStats(stats);
|
|
||||||
|
|
||||||
if (stats.storage().size() == 1)
|
|
||||||
|
// Save local state for warning message below
|
||||||
|
PackedList<2> thisProcStats;
|
||||||
|
if (!masterOnly)
|
||||||
{
|
{
|
||||||
// Optimisation valid for most cases.
|
thisProcStats = stats;
|
||||||
reduce(stats.storage()[0], reduceFileStates());
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Scatter or reduce to synchronise state
|
||||||
|
if (masterOnly)
|
||||||
|
{
|
||||||
|
// Scatter
|
||||||
|
if (stats.storage().size() == 1)
|
||||||
|
{
|
||||||
|
Pstream::scatter(stats.storage()[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Pstream::listCombineScatter(stats.storage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Pstream::listCombineGather
|
// Reduce
|
||||||
(
|
if (stats.storage().size() == 1)
|
||||||
stats.storage(),
|
{
|
||||||
combineReduceFileStates()
|
// Optimisation valid for most cases.
|
||||||
);
|
reduce(stats.storage()[0], reduceFileStates());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Pstream::listCombineGather
|
||||||
|
(
|
||||||
|
stats.storage(),
|
||||||
|
combineReduceFileStates()
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Update local state
|
||||||
forAll(state_, watchFd)
|
forAll(state_, watchFd)
|
||||||
{
|
{
|
||||||
if (thisProcStats[watchFd] != UNMODIFIED)
|
if (masterOnly)
|
||||||
{
|
{
|
||||||
if (stats[watchFd] == UNMODIFIED)
|
// No need to check for inconsistent state. Just assign.
|
||||||
|
unsigned int stat = stats[watchFd];
|
||||||
|
state_[watchFd] = fileState(stat);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Check for inconsistent state before assigning.
|
||||||
|
if (thisProcStats[watchFd] != UNMODIFIED)
|
||||||
{
|
{
|
||||||
WarningIn("fileMonitor::updateStates(const bool) const")
|
if (stats[watchFd] == UNMODIFIED)
|
||||||
<< "Delaying reading " << watchFile_[watchFd]
|
{
|
||||||
<< " due to inconsistent "
|
WarningIn("fileMonitor::updateStates(const bool) const")
|
||||||
"file time-stamps between processors"
|
<< "Delaying reading " << watchFile_[watchFd]
|
||||||
<< endl;
|
<< " due to inconsistent "
|
||||||
}
|
"file time-stamps between processors"
|
||||||
else
|
<< endl;
|
||||||
{
|
}
|
||||||
unsigned int stat = stats[watchFd];
|
else
|
||||||
state_[watchFd] = fileState(stat);
|
{
|
||||||
|
unsigned int stat = stats[watchFd];
|
||||||
|
state_[watchFd] = fileState(stat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -511,10 +609,12 @@ void Foam::fileMonitor::updateStates(const bool syncPar) const
|
|||||||
|
|
||||||
void Foam::fileMonitor::setUnmodified(const label watchFd)
|
void Foam::fileMonitor::setUnmodified(const label watchFd)
|
||||||
{
|
{
|
||||||
#ifdef FOAM_USE_STAT
|
|
||||||
watcher_->lastMod_[watchFd] = lastModified(watchFile_[watchFd]);
|
|
||||||
#endif
|
|
||||||
state_[watchFd] = UNMODIFIED;
|
state_[watchFd] = UNMODIFIED;
|
||||||
|
|
||||||
|
if (!useInotify_)
|
||||||
|
{
|
||||||
|
watcher_->lastMod_[watchFd] = lastModified(watchFile_[watchFd]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -28,10 +28,11 @@ Description
|
|||||||
Checking for changes to files.
|
Checking for changes to files.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
The default is to use inotify (Linux specific, since 2.6.13)
|
The default is to use stat to get the timestamp.
|
||||||
|
|
||||||
Compiling with FOAM_USE_STAT (or if /usr/include/sys/inotify.h
|
Compile with FOAM_USE_INOTIFY to use the inotify
|
||||||
does not exist) uses the stat function call.
|
(Linux specific, since 2.6.13) framework. The problem is that inotify does
|
||||||
|
not work on nfs3 mounted directories!!
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
fileMonitor.C
|
fileMonitor.C
|
||||||
@ -78,6 +79,9 @@ public:
|
|||||||
private:
|
private:
|
||||||
// Private data
|
// Private data
|
||||||
|
|
||||||
|
//- Whether to use inotify (requires -DFOAM_USE_INOTIFY, see above)
|
||||||
|
const bool useInotify_;
|
||||||
|
|
||||||
//- State for all watchFds
|
//- State for all watchFds
|
||||||
mutable DynamicList<fileState> state_;
|
mutable DynamicList<fileState> state_;
|
||||||
|
|
||||||
@ -111,7 +115,7 @@ public:
|
|||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct null
|
//- Construct null
|
||||||
fileMonitor();
|
fileMonitor(const bool useInotify);
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
@ -133,7 +137,11 @@ public:
|
|||||||
fileState getState(const label watchFd) const;
|
fileState getState(const label watchFd) const;
|
||||||
|
|
||||||
//- Check state of all files. Updates state_.
|
//- Check state of all files. Updates state_.
|
||||||
void updateStates(const bool syncPar) const;
|
void updateStates
|
||||||
|
(
|
||||||
|
const bool masterOnly,
|
||||||
|
const bool syncPar
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Reset state (e.g. after having read it) using handle
|
//- Reset state (e.g. after having read it) using handle
|
||||||
void setUnmodified(const label watchFd);
|
void setUnmodified(const label watchFd);
|
||||||
|
|||||||
117
src/OSspecific/POSIX/memInfo/memInfo.C
Normal file
117
src/OSspecific/POSIX/memInfo/memInfo.C
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2010-2010 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 "memInfo.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::memInfo::memInfo()
|
||||||
|
:
|
||||||
|
peak_(-1),
|
||||||
|
size_(-1),
|
||||||
|
rss_(-1)
|
||||||
|
{
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::memInfo::~memInfo()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
const Foam::memInfo& Foam::memInfo::update()
|
||||||
|
{
|
||||||
|
IFstream is("/proc/" + name(pid()) + "/status");
|
||||||
|
|
||||||
|
while (is.good())
|
||||||
|
{
|
||||||
|
string line;
|
||||||
|
is.getLine(line);
|
||||||
|
char tag[32];
|
||||||
|
int value;
|
||||||
|
|
||||||
|
if (sscanf(line.c_str(), "%30s %d", tag, &value) == 2)
|
||||||
|
{
|
||||||
|
if (!strcmp(tag, "VmPeak:"))
|
||||||
|
{
|
||||||
|
peak_ = value;
|
||||||
|
}
|
||||||
|
else if (!strcmp(tag, "VmSize:"))
|
||||||
|
{
|
||||||
|
size_ = value;
|
||||||
|
}
|
||||||
|
else if (!strcmp(tag, "VmRSS:"))
|
||||||
|
{
|
||||||
|
rss_ = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::Istream& Foam::operator>>(Istream& is, memInfo& m)
|
||||||
|
{
|
||||||
|
is.readBegin("memInfo");
|
||||||
|
|
||||||
|
is >> m.peak_ >> m.size_ >> m.rss_;
|
||||||
|
|
||||||
|
is.readEnd("memInfo");
|
||||||
|
|
||||||
|
// Check state of Istream
|
||||||
|
is.check
|
||||||
|
(
|
||||||
|
"Foam::Istream& Foam::operator>>(Foam::Istream&, Foam::memInfo&)"
|
||||||
|
);
|
||||||
|
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::Ostream& Foam::operator<<(Ostream& os, const memInfo& m)
|
||||||
|
{
|
||||||
|
os << token::BEGIN_LIST
|
||||||
|
<< m.peak_ << token::SPACE << m.size_ << token::SPACE << m.rss_
|
||||||
|
<< token::END_LIST;
|
||||||
|
|
||||||
|
// Check state of Ostream
|
||||||
|
os.check
|
||||||
|
(
|
||||||
|
"Foam::Ostream& Foam::operator<<(Foam::Ostream&, "
|
||||||
|
"const Foam::memInfo&)"
|
||||||
|
);
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
118
src/OSspecific/POSIX/memInfo/memInfo.H
Normal file
118
src/OSspecific/POSIX/memInfo/memInfo.H
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2010-2010 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::memInfo
|
||||||
|
|
||||||
|
Description
|
||||||
|
Memory usage information for the process running this object.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
memInfo.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef memInfo_H
|
||||||
|
#define memInfo_H
|
||||||
|
|
||||||
|
#include "OSspecific.H"
|
||||||
|
#include "POSIX.H"
|
||||||
|
#include "IFstream.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class memInfo Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class memInfo
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Peak memory used by the process (VmPeak in /proc/<pid>/status)
|
||||||
|
int peak_;
|
||||||
|
|
||||||
|
//- Memory used by the process (VmSize in /proc/<pid>/status)
|
||||||
|
int size_;
|
||||||
|
|
||||||
|
//- Resident set size of the process (VmRSS in /proc/<pid>/status)
|
||||||
|
int rss_;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
memInfo();
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
~memInfo();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Parse /proc/<pid>/status
|
||||||
|
const memInfo& update();
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Access the stored peak memory
|
||||||
|
int peak() const
|
||||||
|
{
|
||||||
|
return peak_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Access the stored memory size
|
||||||
|
int size() const
|
||||||
|
{
|
||||||
|
return size_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Access the stored rss value
|
||||||
|
int rss() const
|
||||||
|
{
|
||||||
|
return rss_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// IOstream Operators
|
||||||
|
|
||||||
|
friend Istream& operator>>(Istream&, memInfo&);
|
||||||
|
friend Ostream& operator<<(Ostream&, const memInfo&);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -24,7 +24,6 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "NamedEnum.H"
|
#include "NamedEnum.H"
|
||||||
#include "stringList.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -85,4 +84,42 @@ void Foam::NamedEnum<Enum, nEnum>::write(const Enum e, Ostream& os) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Enum, int nEnum>
|
||||||
|
Foam::stringList Foam::NamedEnum<Enum, nEnum>::strings()
|
||||||
|
{
|
||||||
|
stringList lst(nEnum);
|
||||||
|
|
||||||
|
label nElem = 0;
|
||||||
|
for (int enumI = 0; enumI < nEnum; ++enumI)
|
||||||
|
{
|
||||||
|
if (names[enumI] && names[enumI][0])
|
||||||
|
{
|
||||||
|
lst[nElem++] = names[enumI];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lst.setSize(nElem);
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Enum, int nEnum>
|
||||||
|
Foam::wordList Foam::NamedEnum<Enum, nEnum>::words()
|
||||||
|
{
|
||||||
|
wordList lst(nEnum);
|
||||||
|
|
||||||
|
label nElem = 0;
|
||||||
|
for (int enumI = 0; enumI < nEnum; ++enumI)
|
||||||
|
{
|
||||||
|
if (names[enumI] && names[enumI][0])
|
||||||
|
{
|
||||||
|
lst[nElem++] = names[enumI];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lst.setSize(nElem);
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -37,6 +37,8 @@ SourceFiles
|
|||||||
|
|
||||||
#include "HashTable.H"
|
#include "HashTable.H"
|
||||||
#include "StaticAssert.H"
|
#include "StaticAssert.H"
|
||||||
|
#include "stringList.H"
|
||||||
|
#include "wordList.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -87,6 +89,12 @@ public:
|
|||||||
//- Write the name representation of the enumeration to an Ostream
|
//- Write the name representation of the enumeration to an Ostream
|
||||||
void write(const Enum e, Ostream&) const;
|
void write(const Enum e, Ostream&) const;
|
||||||
|
|
||||||
|
//- The set of names as a list of strings
|
||||||
|
static stringList strings();
|
||||||
|
|
||||||
|
//- The set of names as a list of words
|
||||||
|
static wordList words();
|
||||||
|
|
||||||
|
|
||||||
// Member Operators
|
// Member Operators
|
||||||
|
|
||||||
|
|||||||
@ -31,12 +31,61 @@ Description
|
|||||||
|
|
||||||
#include "IOdictionary.H"
|
#include "IOdictionary.H"
|
||||||
#include "objectRegistry.H"
|
#include "objectRegistry.H"
|
||||||
|
#include "Pstream.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
defineTypeNameAndDebug(Foam::IOdictionary, 0);
|
defineTypeNameAndDebug(Foam::IOdictionary, 0);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
// Parallel aware reading, using non-virtual type information (typeName instead
|
||||||
|
// of type()) because of use in constructor.
|
||||||
|
void Foam::IOdictionary::readFile(const bool masterOnly)
|
||||||
|
{
|
||||||
|
if (Pstream::master() || !masterOnly)
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
Pout<< "IOdictionary : Reading " << objectPath()
|
||||||
|
<< " from file " << endl;
|
||||||
|
}
|
||||||
|
readStream(typeName) >> *this;
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (masterOnly)
|
||||||
|
{
|
||||||
|
// Scatter master data
|
||||||
|
if (Pstream::master())
|
||||||
|
{
|
||||||
|
for
|
||||||
|
(
|
||||||
|
int slave=Pstream::firstSlave();
|
||||||
|
slave<=Pstream::lastSlave();
|
||||||
|
slave++
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
OPstream toSlave(Pstream::scheduled, slave);
|
||||||
|
IOdictionary::writeData(toSlave);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
Pout<< "IOdictionary : Reading " << objectPath()
|
||||||
|
<< " from master processor " << Pstream::masterNo() << endl;
|
||||||
|
}
|
||||||
|
IPstream fromMaster(Pstream::scheduled, Pstream::masterNo());
|
||||||
|
IOdictionary::readData(fromMaster);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::IOdictionary::IOdictionary(const IOobject& io)
|
Foam::IOdictionary::IOdictionary(const IOobject& io)
|
||||||
@ -56,17 +105,41 @@ Foam::IOdictionary::IOdictionary(const IOobject& io)
|
|||||||
//<< abort(FatalError);
|
//<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Everyone check or just master
|
||||||
|
bool masterOnly =
|
||||||
|
regIOobject::fileModificationChecking == timeStampMaster
|
||||||
|
|| regIOobject::fileModificationChecking == inotifyMaster;
|
||||||
|
|
||||||
|
|
||||||
|
// Check if header is ok for READ_IF_PRESENT
|
||||||
|
bool isHeaderOk = false;
|
||||||
|
if (io.readOpt() == IOobject::READ_IF_PRESENT)
|
||||||
|
{
|
||||||
|
if (masterOnly)
|
||||||
|
{
|
||||||
|
if (Pstream::master())
|
||||||
|
{
|
||||||
|
isHeaderOk = headerOk();
|
||||||
|
}
|
||||||
|
Pstream::scatter(isHeaderOk);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isHeaderOk = headerOk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
(
|
(
|
||||||
io.readOpt() == IOobject::MUST_READ
|
io.readOpt() == IOobject::MUST_READ
|
||||||
|| io.readOpt() == IOobject::MUST_READ_IF_MODIFIED
|
|| io.readOpt() == IOobject::MUST_READ_IF_MODIFIED
|
||||||
)
|
)
|
||||||
|| (io.readOpt() == IOobject::READ_IF_PRESENT && headerOk())
|
|| isHeaderOk
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
readStream(typeName) >> *this;
|
readFile(masterOnly);
|
||||||
close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dictionary::name() = IOobject::objectPath();
|
dictionary::name() = IOobject::objectPath();
|
||||||
@ -90,17 +163,41 @@ Foam::IOdictionary::IOdictionary(const IOobject& io, const dictionary& dict)
|
|||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Everyone check or just master
|
||||||
|
bool masterOnly =
|
||||||
|
regIOobject::fileModificationChecking == timeStampMaster
|
||||||
|
|| regIOobject::fileModificationChecking == inotifyMaster;
|
||||||
|
|
||||||
|
|
||||||
|
// Check if header is ok for READ_IF_PRESENT
|
||||||
|
bool isHeaderOk = false;
|
||||||
|
if (io.readOpt() == IOobject::READ_IF_PRESENT)
|
||||||
|
{
|
||||||
|
if (masterOnly)
|
||||||
|
{
|
||||||
|
if (Pstream::master())
|
||||||
|
{
|
||||||
|
isHeaderOk = headerOk();
|
||||||
|
}
|
||||||
|
Pstream::scatter(isHeaderOk);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isHeaderOk = headerOk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
(
|
(
|
||||||
io.readOpt() == IOobject::MUST_READ
|
io.readOpt() == IOobject::MUST_READ
|
||||||
|| io.readOpt() == IOobject::MUST_READ_IF_MODIFIED
|
|| io.readOpt() == IOobject::MUST_READ_IF_MODIFIED
|
||||||
)
|
)
|
||||||
|| (io.readOpt() == IOobject::READ_IF_PRESENT && headerOk())
|
|| isHeaderOk
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
readStream(typeName) >> *this;
|
readFile(masterOnly);
|
||||||
close();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@ -57,6 +57,11 @@ class IOdictionary
|
|||||||
public dictionary
|
public dictionary
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- read dictionary from file
|
||||||
|
void readFile(const bool);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TypeName("dictionary");
|
TypeName("dictionary");
|
||||||
|
|||||||
@ -250,8 +250,27 @@ Foam::Time::Time
|
|||||||
// Time objects not registered so do like objectRegistry::checkIn ourselves.
|
// Time objects not registered so do like objectRegistry::checkIn ourselves.
|
||||||
if (runTimeModifiable_)
|
if (runTimeModifiable_)
|
||||||
{
|
{
|
||||||
monitorPtr_.reset(new fileMonitor());
|
monitorPtr_.reset
|
||||||
controlDict_.watchIndex() = addWatch(controlDict_.filePath());
|
(
|
||||||
|
new fileMonitor
|
||||||
|
(
|
||||||
|
regIOobject::fileModificationChecking == inotify
|
||||||
|
|| regIOobject::fileModificationChecking == inotifyMaster
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// File might not exist yet.
|
||||||
|
fileName f(controlDict_.filePath());
|
||||||
|
|
||||||
|
if (!f.size())
|
||||||
|
{
|
||||||
|
// We don't have this file but would like to re-read it.
|
||||||
|
// Possibly if in master-only reading mode. Use a non-existing
|
||||||
|
// file to keep fileMonitor synced.
|
||||||
|
f = controlDict_.objectPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
controlDict_.watchIndex() = addWatch(f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,19 +327,36 @@ Foam::Time::Time
|
|||||||
readLibs_(controlDict_, "libs"),
|
readLibs_(controlDict_, "libs"),
|
||||||
functionObjects_(*this)
|
functionObjects_(*this)
|
||||||
{
|
{
|
||||||
|
// Since could not construct regIOobject with setting:
|
||||||
|
controlDict_.readOpt() = IOobject::MUST_READ_IF_MODIFIED;
|
||||||
|
|
||||||
|
|
||||||
setControls();
|
setControls();
|
||||||
|
|
||||||
// Time objects not registered so do like objectRegistry::checkIn ourselves.
|
// Time objects not registered so do like objectRegistry::checkIn ourselves.
|
||||||
if (runTimeModifiable_)
|
if (runTimeModifiable_)
|
||||||
{
|
{
|
||||||
monitorPtr_.reset(new fileMonitor());
|
monitorPtr_.reset
|
||||||
|
(
|
||||||
|
new fileMonitor
|
||||||
|
(
|
||||||
|
regIOobject::fileModificationChecking == inotify
|
||||||
|
|| regIOobject::fileModificationChecking == inotifyMaster
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
// File might not exist yet.
|
// File might not exist yet.
|
||||||
fileName f(controlDict_.filePath());
|
fileName f(controlDict_.filePath());
|
||||||
if (f != fileName::null)
|
|
||||||
|
if (!f.size())
|
||||||
{
|
{
|
||||||
controlDict_.watchIndex() = addWatch(f);
|
// We don't have this file but would like to re-read it.
|
||||||
|
// Possibly if in master-only reading mode. Use a non-existing
|
||||||
|
// file to keep fileMonitor synced.
|
||||||
|
f = controlDict_.objectPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
controlDict_.watchIndex() = addWatch(f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -211,7 +211,14 @@ void Foam::Time::readModifiedObjects()
|
|||||||
// valid filePath).
|
// valid filePath).
|
||||||
// Note: requires same ordering in objectRegistries on different
|
// Note: requires same ordering in objectRegistries on different
|
||||||
// processors!
|
// processors!
|
||||||
monitorPtr_().updateStates(Pstream::parRun());
|
monitorPtr_().updateStates
|
||||||
|
(
|
||||||
|
(
|
||||||
|
regIOobject::fileModificationChecking == inotifyMaster
|
||||||
|
|| regIOobject::fileModificationChecking == timeStampMaster
|
||||||
|
),
|
||||||
|
Pstream::parRun()
|
||||||
|
);
|
||||||
|
|
||||||
// Time handling is special since controlDict_ is the one dictionary
|
// Time handling is special since controlDict_ is the one dictionary
|
||||||
// that is not registered to any database.
|
// that is not registered to any database.
|
||||||
|
|||||||
@ -198,7 +198,13 @@ bool Foam::functionObjectList::read()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update existing and add new functionObjects
|
// Update existing and add new functionObjects
|
||||||
const entry* entryPtr = parentDict_.lookupEntryPtr("functions",false,false);
|
const entry* entryPtr = parentDict_.lookupEntryPtr
|
||||||
|
(
|
||||||
|
"functions",
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
if (entryPtr)
|
if (entryPtr)
|
||||||
{
|
{
|
||||||
PtrList<functionObject> newPtrs;
|
PtrList<functionObject> newPtrs;
|
||||||
|
|||||||
@ -36,6 +36,35 @@ int Foam::regIOobject::fileModificationSkew
|
|||||||
Foam::debug::optimisationSwitch("fileModificationSkew", 30)
|
Foam::debug::optimisationSwitch("fileModificationSkew", 30)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
template<>
|
||||||
|
const char* Foam::NamedEnum<Foam::regIOobject::fileCheckTypes, 4>::names[] =
|
||||||
|
{
|
||||||
|
"timeStamp",
|
||||||
|
"timeStampMaster",
|
||||||
|
"inotify",
|
||||||
|
"inotifyMaster"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const Foam::NamedEnum<Foam::regIOobject::fileCheckTypes, 4>
|
||||||
|
Foam::regIOobject::fileCheckTypesNames;
|
||||||
|
|
||||||
|
// Default fileCheck type
|
||||||
|
Foam::regIOobject::fileCheckTypes Foam::regIOobject::fileModificationChecking
|
||||||
|
(
|
||||||
|
fileCheckTypesNames.read
|
||||||
|
(
|
||||||
|
debug::optimisationSwitches().lookup
|
||||||
|
(
|
||||||
|
"fileModificationChecking"
|
||||||
|
//Foam::regIOobject::timeStamp
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -149,10 +178,13 @@ bool Foam::regIOobject::checkIn()
|
|||||||
}
|
}
|
||||||
|
|
||||||
fileName f = filePath();
|
fileName f = filePath();
|
||||||
if (f != fileName::null)
|
if (!f.size())
|
||||||
{
|
{
|
||||||
watchIndex_ = time().addWatch(f);
|
// We don't have this file but would like to re-read it.
|
||||||
|
// Possibly if master-only reading mode.
|
||||||
|
f = objectPath();
|
||||||
}
|
}
|
||||||
|
watchIndex_ = time().addWatch(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check-in on defaultRegion is allowed to fail, since subsetted meshes
|
// check-in on defaultRegion is allowed to fail, since subsetted meshes
|
||||||
|
|||||||
@ -41,6 +41,7 @@ SourceFiles
|
|||||||
#include "IOobject.H"
|
#include "IOobject.H"
|
||||||
#include "typeInfo.H"
|
#include "typeInfo.H"
|
||||||
#include "OSspecific.H"
|
#include "OSspecific.H"
|
||||||
|
#include "NamedEnum.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -57,6 +58,20 @@ class regIOobject
|
|||||||
public IOobject
|
public IOobject
|
||||||
{
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Types of communications
|
||||||
|
enum fileCheckTypes
|
||||||
|
{
|
||||||
|
timeStamp,
|
||||||
|
timeStampMaster,
|
||||||
|
inotify,
|
||||||
|
inotifyMaster
|
||||||
|
};
|
||||||
|
|
||||||
|
static const NamedEnum<fileCheckTypes, 4> fileCheckTypesNames;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Private data
|
// Private data
|
||||||
@ -95,6 +110,8 @@ public:
|
|||||||
|
|
||||||
static int fileModificationSkew;
|
static int fileModificationSkew;
|
||||||
|
|
||||||
|
static fileCheckTypes fileModificationChecking;
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
|
|||||||
@ -26,7 +26,7 @@ License
|
|||||||
#include "regIOobject.H"
|
#include "regIOobject.H"
|
||||||
#include "IFstream.H"
|
#include "IFstream.H"
|
||||||
#include "Time.H"
|
#include "Time.H"
|
||||||
//#include "PstreamReduceOps.H"
|
#include "Pstream.H"
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
@ -170,8 +170,50 @@ bool Foam::regIOobject::readData(Istream&)
|
|||||||
|
|
||||||
bool Foam::regIOobject::read()
|
bool Foam::regIOobject::read()
|
||||||
{
|
{
|
||||||
bool ok = readData(readStream(type()));
|
// Note: cannot do anything in readStream itself since this is used by
|
||||||
close();
|
// e.g. GeometricField.
|
||||||
|
|
||||||
|
bool masterOnly =
|
||||||
|
regIOobject::fileModificationChecking == timeStampMaster
|
||||||
|
|| regIOobject::fileModificationChecking == inotifyMaster;
|
||||||
|
|
||||||
|
bool ok;
|
||||||
|
if (Pstream::master() || !masterOnly)
|
||||||
|
{
|
||||||
|
ok = readData(readStream(type()));
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (masterOnly)
|
||||||
|
{
|
||||||
|
// Scatter master data
|
||||||
|
if (Pstream::master())
|
||||||
|
{
|
||||||
|
for
|
||||||
|
(
|
||||||
|
int slave=Pstream::firstSlave();
|
||||||
|
slave<=Pstream::lastSlave();
|
||||||
|
slave++
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
OPstream toSlave(Pstream::scheduled, slave);
|
||||||
|
writeData(toSlave);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (IFstream::debug)
|
||||||
|
{
|
||||||
|
Pout<< "regIOobject::read() : "
|
||||||
|
<< "reading object " << name()
|
||||||
|
<< " from master processor " << Pstream::masterNo()
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
IPstream fromMaster(Pstream::scheduled, Pstream::masterNo());
|
||||||
|
ok = readData(fromMaster);
|
||||||
|
}
|
||||||
|
}
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,6 +55,12 @@ Foam::argList::initValidTables::initValidTables()
|
|||||||
);
|
);
|
||||||
argList::addBoolOption("parallel", "run in parallel");
|
argList::addBoolOption("parallel", "run in parallel");
|
||||||
validParOptions.set("parallel", "");
|
validParOptions.set("parallel", "");
|
||||||
|
argList::addOption
|
||||||
|
(
|
||||||
|
"roots", "(dir1 .. dirn)",
|
||||||
|
"slave root directories for distributed running"
|
||||||
|
);
|
||||||
|
validParOptions.set("roots", "(dir1 .. dirn)");
|
||||||
|
|
||||||
Pstream::addValidParOptions(validParOptions);
|
Pstream::addValidParOptions(validParOptions);
|
||||||
}
|
}
|
||||||
@ -511,6 +517,10 @@ Foam::argList::argList
|
|||||||
// Case is a single processor run unless it is running parallel
|
// Case is a single processor run unless it is running parallel
|
||||||
int nProcs = 1;
|
int nProcs = 1;
|
||||||
|
|
||||||
|
// Roots if running distributed
|
||||||
|
fileNameList roots;
|
||||||
|
|
||||||
|
|
||||||
// If this actually is a parallel run
|
// If this actually is a parallel run
|
||||||
if (parRunControl_.parRun())
|
if (parRunControl_.parRun())
|
||||||
{
|
{
|
||||||
@ -520,28 +530,42 @@ Foam::argList::argList
|
|||||||
// establish rootPath_/globalCase_/case_ for master
|
// establish rootPath_/globalCase_/case_ for master
|
||||||
getRootCase();
|
getRootCase();
|
||||||
|
|
||||||
IFstream decompDictStream
|
// See if running distributed (different roots for different procs)
|
||||||
(
|
label dictNProcs = -1;
|
||||||
rootPath_/globalCase_/"system/decomposeParDict"
|
fileName source;
|
||||||
);
|
|
||||||
|
|
||||||
if (!decompDictStream.good())
|
if (options_.found("roots"))
|
||||||
{
|
{
|
||||||
FatalError
|
IStringStream str(options_["roots"]);
|
||||||
<< "Cannot read "
|
str >> roots;
|
||||||
<< decompDictStream.name()
|
dictNProcs = roots.size()+1;
|
||||||
<< exit(FatalError);
|
source = "roots-command-line";
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
source = rootPath_/globalCase_/"system/decomposeParDict";
|
||||||
|
IFstream decompDictStream(source);
|
||||||
|
|
||||||
dictionary decompDict(decompDictStream);
|
if (!decompDictStream.good())
|
||||||
|
{
|
||||||
|
FatalError
|
||||||
|
<< "Cannot read "
|
||||||
|
<< decompDictStream.name()
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
label dictNProcs
|
dictionary decompDict(decompDictStream);
|
||||||
(
|
|
||||||
readLabel
|
dictNProcs = readLabel
|
||||||
(
|
(
|
||||||
decompDict.lookup("numberOfSubdomains")
|
decompDict.lookup("numberOfSubdomains")
|
||||||
)
|
);
|
||||||
);
|
|
||||||
|
if (decompDict.lookupOrDefault("distributed", false))
|
||||||
|
{
|
||||||
|
decompDict.lookup("roots") >> roots;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check number of processors.
|
// Check number of processors.
|
||||||
// nProcs => number of actual procs
|
// nProcs => number of actual procs
|
||||||
@ -555,23 +579,27 @@ Foam::argList::argList
|
|||||||
if (dictNProcs > Pstream::nProcs())
|
if (dictNProcs > Pstream::nProcs())
|
||||||
{
|
{
|
||||||
FatalError
|
FatalError
|
||||||
<< decompDictStream.name()
|
<< source
|
||||||
<< " specifies " << dictNProcs
|
<< " specifies " << dictNProcs
|
||||||
<< " processors but job was started with "
|
<< " processors but job was started with "
|
||||||
<< Pstream::nProcs() << " processors."
|
<< Pstream::nProcs() << " processors."
|
||||||
<< exit(FatalError);
|
<< exit(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// distributed data
|
// distributed data
|
||||||
if (decompDict.lookupOrDefault("distributed", false))
|
if (roots.size())
|
||||||
{
|
{
|
||||||
fileNameList roots;
|
forAll(roots, i)
|
||||||
decompDict.lookup("roots") >> roots;
|
{
|
||||||
|
roots[i] = roots[i].expand();
|
||||||
|
}
|
||||||
|
|
||||||
if (roots.size() != Pstream::nProcs()-1)
|
if (roots.size() != Pstream::nProcs()-1)
|
||||||
{
|
{
|
||||||
FatalError
|
FatalError
|
||||||
<< "number of entries in decompositionDict::roots"
|
<< "number of entries in roots "
|
||||||
|
<< roots.size()
|
||||||
<< " is not equal to the number of slaves "
|
<< " is not equal to the number of slaves "
|
||||||
<< Pstream::nProcs()-1
|
<< Pstream::nProcs()-1
|
||||||
<< exit(FatalError);
|
<< exit(FatalError);
|
||||||
@ -705,8 +733,12 @@ Foam::argList::argList
|
|||||||
|
|
||||||
if (parRunControl_.parRun())
|
if (parRunControl_.parRun())
|
||||||
{
|
{
|
||||||
Info<< "Slaves : " << slaveProcs << nl
|
Info<< "Slaves : " << slaveProcs << nl;
|
||||||
<< "Pstream initialized with:" << nl
|
if (roots.size())
|
||||||
|
{
|
||||||
|
Info<< "Roots : " << roots << nl;
|
||||||
|
}
|
||||||
|
Info<< "Pstream initialized with:" << nl
|
||||||
<< " floatTransfer : " << Pstream::floatTransfer << nl
|
<< " floatTransfer : " << Pstream::floatTransfer << nl
|
||||||
<< " nProcsSimpleSum : " << Pstream::nProcsSimpleSum << nl
|
<< " nProcsSimpleSum : " << Pstream::nProcsSimpleSum << nl
|
||||||
<< " commsType : "
|
<< " commsType : "
|
||||||
@ -722,6 +754,10 @@ Foam::argList::argList
|
|||||||
{
|
{
|
||||||
jobInfo.add("slaves", slaveProcs);
|
jobInfo.add("slaves", slaveProcs);
|
||||||
}
|
}
|
||||||
|
if (roots.size())
|
||||||
|
{
|
||||||
|
jobInfo.add("roots", roots);
|
||||||
|
}
|
||||||
jobInfo.write();
|
jobInfo.write();
|
||||||
|
|
||||||
// Switch on signal trapping. We have to wait until after Pstream::init
|
// Switch on signal trapping. We have to wait until after Pstream::init
|
||||||
|
|||||||
@ -620,24 +620,23 @@ Foam::dynamicRefineFvMesh::cellToPoint(const scalarField& vFld) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Calculate error. Is < 0 or distance from inbetween levels
|
// Calculate error. Is < 0 or distance to minLevel, maxLevel
|
||||||
Foam::scalarField
|
Foam::scalarField Foam::dynamicRefineFvMesh::error
|
||||||
Foam::dynamicRefineFvMesh::error
|
|
||||||
(
|
(
|
||||||
const scalarField& fld,
|
const scalarField& fld,
|
||||||
const scalar minLevel,
|
const scalar minLevel,
|
||||||
const scalar maxLevel
|
const scalar maxLevel
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
const scalar halfLevel = 0.5*(minLevel + maxLevel);
|
|
||||||
|
|
||||||
scalarField c(fld.size(), -1);
|
scalarField c(fld.size(), -1);
|
||||||
|
|
||||||
forAll(fld, i)
|
forAll(fld, i)
|
||||||
{
|
{
|
||||||
if (fld[i] >= minLevel && fld[i] < maxLevel)
|
scalar err = min(fld[i]-minLevel, maxLevel-fld[i]);
|
||||||
|
|
||||||
|
if (err >= 0)
|
||||||
{
|
{
|
||||||
c[i] = mag(fld[i] - halfLevel);
|
c[i] = err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
@ -877,6 +876,10 @@ Foam::dynamicRefineFvMesh::dynamicRefineFvMesh(const IOobject& io)
|
|||||||
nRefinementIterations_(0),
|
nRefinementIterations_(0),
|
||||||
protectedCell_(nCells(), 0)
|
protectedCell_(nCells(), 0)
|
||||||
{
|
{
|
||||||
|
// Read static part of dictionary
|
||||||
|
readDict();
|
||||||
|
|
||||||
|
|
||||||
const labelList& cellLevel = meshCutter_.cellLevel();
|
const labelList& cellLevel = meshCutter_.cellLevel();
|
||||||
const labelList& pointLevel = meshCutter_.pointLevel();
|
const labelList& pointLevel = meshCutter_.pointLevel();
|
||||||
|
|
||||||
|
|||||||
249
src/edgeMesh/featureEdgeMesh/featureEdgeMeshI.H
Normal file
249
src/edgeMesh/featureEdgeMesh/featureEdgeMeshI.H
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2009-2010 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::convexStart() const
|
||||||
|
{
|
||||||
|
return convexStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::concaveStart() const
|
||||||
|
{
|
||||||
|
return concaveStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::mixedStart() const
|
||||||
|
{
|
||||||
|
return mixedStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::nonFeatureStart() const
|
||||||
|
{
|
||||||
|
return nonFeatureStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::externalStart() const
|
||||||
|
{
|
||||||
|
return externalStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::internalStart() const
|
||||||
|
{
|
||||||
|
return internalStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::flatStart() const
|
||||||
|
{
|
||||||
|
return flatStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::openStart() const
|
||||||
|
{
|
||||||
|
return openStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::featureEdgeMesh::multipleStart() const
|
||||||
|
{
|
||||||
|
return multipleStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::featureEdgeMesh::featurePoint(label ptI) const
|
||||||
|
{
|
||||||
|
return ptI < nonFeatureStart_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::vectorField& Foam::featureEdgeMesh::normals() const
|
||||||
|
{
|
||||||
|
return normals_;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const Foam::vectorField& Foam::featureEdgeMesh::edgeDirections() const
|
||||||
|
{
|
||||||
|
return edgeDirections_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::vector Foam::featureEdgeMesh::edgeDirection
|
||||||
|
(
|
||||||
|
label edgeI,
|
||||||
|
label ptI
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const edge& e = edges()[edgeI];
|
||||||
|
|
||||||
|
if (ptI == e.start())
|
||||||
|
{
|
||||||
|
return edgeDirections()[edgeI];
|
||||||
|
}
|
||||||
|
else if (ptI == e.end())
|
||||||
|
{
|
||||||
|
return -edgeDirections()[edgeI];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FatalErrorIn("Foam::featureEdgeMesh::edgedirection")
|
||||||
|
<< "Requested ptI " << ptI << " is not a point on the requested "
|
||||||
|
<< "edgeI " << edgeI << ". edgeI start and end: "
|
||||||
|
<< e.start() << " " << e.end()
|
||||||
|
<< exit(FatalError);
|
||||||
|
|
||||||
|
return vector::zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::labelListList& Foam::featureEdgeMesh::edgeNormals() const
|
||||||
|
{
|
||||||
|
return edgeNormals_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::vectorField Foam::featureEdgeMesh::edgeNormals
|
||||||
|
(
|
||||||
|
const labelList& edgeNormIs
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
vectorField norms(edgeNormIs.size());
|
||||||
|
|
||||||
|
forAll(edgeNormIs, i)
|
||||||
|
{
|
||||||
|
norms[i] = normals_[edgeNormIs[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return norms;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::vectorField Foam::featureEdgeMesh::edgeNormals(label edgeI) const
|
||||||
|
{
|
||||||
|
return edgeNormals(edgeNormals_[edgeI]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::labelListList&
|
||||||
|
Foam::featureEdgeMesh::featurePointNormals() const
|
||||||
|
{
|
||||||
|
return featurePointNormals_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::vectorField Foam::featureEdgeMesh::featurePointNormals
|
||||||
|
(
|
||||||
|
label ptI
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (!featurePoint(ptI))
|
||||||
|
{
|
||||||
|
WarningIn("vectorField featureEdgeMesh::featurePointNormals")
|
||||||
|
<< "Requesting the normals of a non-feature point. "
|
||||||
|
<< "Returned zero length vectorField."
|
||||||
|
<< endl;
|
||||||
|
|
||||||
|
return vectorField(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
labelList featPtNormIs(featurePointNormals_[ptI]);
|
||||||
|
|
||||||
|
vectorField norms(featPtNormIs.size());
|
||||||
|
|
||||||
|
forAll(featPtNormIs, i)
|
||||||
|
{
|
||||||
|
norms[i] = normals_[featPtNormIs[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return norms;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::labelList& Foam::featureEdgeMesh::regionEdges() const
|
||||||
|
{
|
||||||
|
return regionEdges_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::featureEdgeMesh::pointStatus Foam::featureEdgeMesh::getPointStatus
|
||||||
|
(
|
||||||
|
label ptI
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (ptI < concaveStart_)
|
||||||
|
{
|
||||||
|
return CONVEX;
|
||||||
|
}
|
||||||
|
else if (ptI < mixedStart_)
|
||||||
|
{
|
||||||
|
return CONCAVE;
|
||||||
|
}
|
||||||
|
else if (ptI < nonFeatureStart_)
|
||||||
|
{
|
||||||
|
return MIXED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return NONFEATURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::featureEdgeMesh::edgeStatus Foam::featureEdgeMesh::getEdgeStatus
|
||||||
|
(
|
||||||
|
label edgeI
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (edgeI < internalStart_)
|
||||||
|
{
|
||||||
|
return EXTERNAL;
|
||||||
|
}
|
||||||
|
else if (edgeI < flatStart_)
|
||||||
|
{
|
||||||
|
return INTERNAL;
|
||||||
|
}
|
||||||
|
else if (edgeI < openStart_)
|
||||||
|
{
|
||||||
|
return FLAT;
|
||||||
|
}
|
||||||
|
else if (edgeI < multipleStart_)
|
||||||
|
{
|
||||||
|
return OPEN;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MULTIPLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -27,7 +27,6 @@ Class
|
|||||||
Description
|
Description
|
||||||
Recycles the velocity and flux at a patch to this patch
|
Recycles the velocity and flux at a patch to this patch
|
||||||
|
|
||||||
mode = NEARESTCELL : sample nearest cell
|
|
||||||
mode = NEARESTPATCHFACE : sample nearest face on selected patch
|
mode = NEARESTPATCHFACE : sample nearest face on selected patch
|
||||||
mode = NEARESTFACE : sample nearest face on any patch. Note: does not
|
mode = NEARESTFACE : sample nearest face on any patch. Note: does not
|
||||||
warn if nearest actually is on internal face!
|
warn if nearest actually is on internal face!
|
||||||
|
|||||||
@ -261,17 +261,16 @@ void timeVaryingMappedFixedValueFvPatchField<Type>::readSamplePoints()
|
|||||||
|
|
||||||
for (label i = 1; i < samplePoints.size(); i++)
|
for (label i = 1; i < samplePoints.size(); i++)
|
||||||
{
|
{
|
||||||
e1 = samplePoints[i] - p0;
|
const vector d = samplePoints[i] - p0;
|
||||||
scalar magE1 = mag(e1);
|
scalar magD = mag(d);
|
||||||
|
|
||||||
if (magE1 > maxDist)
|
if (magD > maxDist)
|
||||||
{
|
{
|
||||||
e1 /= magE1;
|
e1 = d/magD;
|
||||||
index1 = i;
|
index1 = i;
|
||||||
maxDist = magE1;
|
maxDist = magD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find point that is furthest away from line p0-p1
|
// Find point that is furthest away from line p0-p1
|
||||||
const point& p1 = samplePoints[index1];
|
const point& p1 = samplePoints[index1];
|
||||||
|
|
||||||
|
|||||||
@ -211,7 +211,8 @@ void Foam::singleCellFvMesh::agglomerateMesh
|
|||||||
"singleCellFvMesh::agglomerateMesh(..)"
|
"singleCellFvMesh::agglomerateMesh(..)"
|
||||||
) << "agglomeration does not create a"
|
) << "agglomeration does not create a"
|
||||||
<< " single, non-manifold"
|
<< " single, non-manifold"
|
||||||
<< " face for agglomeration " << coarseI
|
<< " face for agglomeration " << myAgglom
|
||||||
|
<< " on patch " << patchI
|
||||||
<< exit(FatalError);
|
<< exit(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -21,8 +21,6 @@ License
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -32,7 +30,6 @@ namespace Foam
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|
||||||
// Update this with w2 if w2 nearer to pt.
|
// Update this with w2 if w2 nearer to pt.
|
||||||
inline bool wallPointYPlus::update
|
inline bool wallPointYPlus::update
|
||||||
(
|
(
|
||||||
|
|||||||
@ -84,6 +84,11 @@ Foam::Cloud<ParticleType>::Cloud
|
|||||||
nTrackingRescues_(),
|
nTrackingRescues_(),
|
||||||
cellWallFacesPtr_()
|
cellWallFacesPtr_()
|
||||||
{
|
{
|
||||||
|
// Ask for the tetBasePtIs to trigger all processors to build
|
||||||
|
// them, otherwise, if some processors have no particles then
|
||||||
|
// there is a comms mismatch.
|
||||||
|
polyMesh_.tetBasePtIs();
|
||||||
|
|
||||||
IDLList<ParticleType>::operator=(particles);
|
IDLList<ParticleType>::operator=(particles);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,6 +110,11 @@ Foam::Cloud<ParticleType>::Cloud
|
|||||||
nTrackingRescues_(),
|
nTrackingRescues_(),
|
||||||
cellWallFacesPtr_()
|
cellWallFacesPtr_()
|
||||||
{
|
{
|
||||||
|
// Ask for the tetBasePtIs to trigger all processors to build
|
||||||
|
// them, otherwise, if some processors have no particles then
|
||||||
|
// there is a comms mismatch.
|
||||||
|
polyMesh_.tetBasePtIs();
|
||||||
|
|
||||||
IDLList<ParticleType>::operator=(particles);
|
IDLList<ParticleType>::operator=(particles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -333,7 +333,7 @@ Foam::label Foam::meshRefinement::markFeatureRefinement
|
|||||||
trackedParticle::trackData td(cloud, maxFeatureLevel);
|
trackedParticle::trackData td(cloud, maxFeatureLevel);
|
||||||
|
|
||||||
// Track all particles to their end position (= starting feature point)
|
// Track all particles to their end position (= starting feature point)
|
||||||
cloud.move(td, mesh_.time().deltaTValue());
|
cloud.move(td, GREAT);
|
||||||
|
|
||||||
// Reset level
|
// Reset level
|
||||||
maxFeatureLevel = -1;
|
maxFeatureLevel = -1;
|
||||||
@ -406,7 +406,7 @@ Foam::label Foam::meshRefinement::markFeatureRefinement
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Track all particles to their end position.
|
// Track all particles to their end position.
|
||||||
cloud.move(td, mesh_.time().deltaTValue());
|
cloud.move(td, GREAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -134,7 +134,7 @@ Foam::treeBoundBox::treeBoundBox(const UList<point>& points)
|
|||||||
WarningIn
|
WarningIn
|
||||||
(
|
(
|
||||||
"treeBoundBox::treeBoundBox(const UList<point>&)"
|
"treeBoundBox::treeBoundBox(const UList<point>&)"
|
||||||
) << "cannot find bounding box for zero-sized pointField"
|
) << "cannot find bounding box for zero-sized pointField, "
|
||||||
<< "returning zero" << endl;
|
<< "returning zero" << endl;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -539,7 +539,7 @@ void Foam::fvFieldReconstructor::reconstructFvVolumeInternalFields
|
|||||||
{
|
{
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
!selectedFields.size()
|
selectedFields.empty()
|
||||||
|| selectedFields.found(fieldIter()->name())
|
|| selectedFields.found(fieldIter()->name())
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -575,7 +575,7 @@ void Foam::fvFieldReconstructor::reconstructFvVolumeFields
|
|||||||
{
|
{
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
!selectedFields.size()
|
selectedFields.empty()
|
||||||
|| selectedFields.found(fieldIter()->name())
|
|| selectedFields.found(fieldIter()->name())
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -611,7 +611,7 @@ void Foam::fvFieldReconstructor::reconstructFvSurfaceFields
|
|||||||
{
|
{
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
!selectedFields.size()
|
selectedFields.empty()
|
||||||
|| selectedFields.found(fieldIter()->name())
|
|| selectedFields.found(fieldIter()->name())
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -84,7 +84,8 @@ void reconstructLagrangianFields
|
|||||||
const word& cloudName,
|
const word& cloudName,
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const PtrList<fvMesh>& meshes,
|
const PtrList<fvMesh>& meshes,
|
||||||
const IOobjectList& objects
|
const IOobjectList& objects,
|
||||||
|
const HashSet<word>& selectedFields
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -94,7 +95,8 @@ void reconstructLagrangianFieldFields
|
|||||||
const word& cloudName,
|
const word& cloudName,
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const PtrList<fvMesh>& meshes,
|
const PtrList<fvMesh>& meshes,
|
||||||
const IOobjectList& objects
|
const IOobjectList& objects,
|
||||||
|
const HashSet<word>& selectedFields
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -155,28 +155,36 @@ void Foam::reconstructLagrangianFields
|
|||||||
const word& cloudName,
|
const word& cloudName,
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const PtrList<fvMesh>& meshes,
|
const PtrList<fvMesh>& meshes,
|
||||||
const IOobjectList& objects
|
const IOobjectList& objects,
|
||||||
|
const HashSet<word>& selectedFields
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const word fieldClassName(IOField<Type>::typeName);
|
const word fieldClassName(IOField<Type>::typeName);
|
||||||
|
|
||||||
IOobjectList fields = objects.lookupClass(fieldClassName);
|
IOobjectList fields = objects.lookupClass(fieldClassName);
|
||||||
|
|
||||||
if (fields.size())
|
if(fields.size())
|
||||||
{
|
{
|
||||||
Info<< " Reconstructing lagrangian "
|
Info<< " Reconstructing lagrangian "
|
||||||
<< fieldClassName << "s\n" << endl;
|
<< fieldClassName << "s\n" << endl;
|
||||||
|
|
||||||
forAllConstIter(IOobjectList, fields, fieldIter)
|
forAllConstIter(IOobjectList, fields, fieldIter)
|
||||||
{
|
{
|
||||||
Info<< " " << fieldIter()->name() << endl;
|
if
|
||||||
reconstructLagrangianField<Type>
|
|
||||||
(
|
(
|
||||||
cloudName,
|
selectedFields.empty()
|
||||||
mesh,
|
|| selectedFields.found(fieldIter()->name())
|
||||||
meshes,
|
)
|
||||||
fieldIter()->name()
|
{
|
||||||
)().write();
|
Info<< " " << fieldIter()->name() << endl;
|
||||||
|
reconstructLagrangianField<Type>
|
||||||
|
(
|
||||||
|
cloudName,
|
||||||
|
mesh,
|
||||||
|
meshes,
|
||||||
|
fieldIter()->name()
|
||||||
|
)().write();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Info<< endl;
|
Info<< endl;
|
||||||
@ -190,7 +198,8 @@ void Foam::reconstructLagrangianFieldFields
|
|||||||
const word& cloudName,
|
const word& cloudName,
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const PtrList<fvMesh>& meshes,
|
const PtrList<fvMesh>& meshes,
|
||||||
const IOobjectList& objects
|
const IOobjectList& objects,
|
||||||
|
const HashSet<word>& selectedFields
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -205,14 +214,21 @@ void Foam::reconstructLagrangianFieldFields
|
|||||||
|
|
||||||
forAllConstIter(IOobjectList, fields, fieldIter)
|
forAllConstIter(IOobjectList, fields, fieldIter)
|
||||||
{
|
{
|
||||||
Info<< " " << fieldIter()->name() << endl;
|
if
|
||||||
reconstructLagrangianFieldField<Type>
|
|
||||||
(
|
(
|
||||||
cloudName,
|
selectedFields.empty()
|
||||||
mesh,
|
|| selectedFields.found(fieldIter()->name())
|
||||||
meshes,
|
)
|
||||||
fieldIter()->name()
|
{
|
||||||
)().write();
|
Info<< " " << fieldIter()->name() << endl;
|
||||||
|
reconstructLagrangianFieldField<Type>
|
||||||
|
(
|
||||||
|
cloudName,
|
||||||
|
mesh,
|
||||||
|
meshes,
|
||||||
|
fieldIter()->name()
|
||||||
|
)().write();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Info<< endl;
|
Info<< endl;
|
||||||
@ -231,14 +247,21 @@ void Foam::reconstructLagrangianFieldFields
|
|||||||
|
|
||||||
forAllConstIter(IOobjectList, fields, fieldIter)
|
forAllConstIter(IOobjectList, fields, fieldIter)
|
||||||
{
|
{
|
||||||
Info<< " " << fieldIter()->name() << endl;
|
if
|
||||||
reconstructLagrangianFieldField<Type>
|
|
||||||
(
|
(
|
||||||
cloudName,
|
selectedFields.empty()
|
||||||
mesh,
|
|| selectedFields.found(fieldIter()->name())
|
||||||
meshes,
|
)
|
||||||
fieldIter()->name()
|
{
|
||||||
)().write();
|
Info<< " " << fieldIter()->name() << endl;
|
||||||
|
reconstructLagrangianFieldField<Type>
|
||||||
|
(
|
||||||
|
cloudName,
|
||||||
|
mesh,
|
||||||
|
meshes,
|
||||||
|
fieldIter()->name()
|
||||||
|
)().write();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Info<< endl;
|
Info<< endl;
|
||||||
|
|||||||
@ -25,8 +25,11 @@ Class
|
|||||||
Foam::surfaceInterpolateFields
|
Foam::surfaceInterpolateFields
|
||||||
|
|
||||||
Description
|
Description
|
||||||
Reads fields from the time folders and adds them to the mesh database
|
Linear interpolates volFields to surfaceFields
|
||||||
for further post-processing.
|
|
||||||
|
Note: gets executed every time step. Could move it to write() but then
|
||||||
|
you'd have problems if you have different write frequencies for different
|
||||||
|
function objects.
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
surfaceInterpolateFields.C
|
surfaceInterpolateFields.C
|
||||||
@ -38,7 +41,6 @@ SourceFiles
|
|||||||
#define surfaceInterpolateFields_H
|
#define surfaceInterpolateFields_H
|
||||||
|
|
||||||
#include "OFstream.H"
|
#include "OFstream.H"
|
||||||
//#include "pointFieldFwd.H"
|
|
||||||
#include "surfaceFields.H"
|
#include "surfaceFields.H"
|
||||||
#include "Tuple2.H"
|
#include "Tuple2.H"
|
||||||
|
|
||||||
|
|||||||
@ -46,13 +46,14 @@ bool triSurface::stitchTriangles
|
|||||||
pointField newPoints;
|
pointField newPoints;
|
||||||
bool hasMerged = mergePoints(rawPoints, tol, verbose, pointMap, newPoints);
|
bool hasMerged = mergePoints(rawPoints, tol, verbose, pointMap, newPoints);
|
||||||
|
|
||||||
pointField& ps = storedPoints();
|
|
||||||
|
|
||||||
// Set the coordinates to the merged ones
|
|
||||||
ps.transfer(newPoints);
|
|
||||||
|
|
||||||
if (hasMerged)
|
if (hasMerged)
|
||||||
{
|
{
|
||||||
|
pointField& ps = storedPoints();
|
||||||
|
|
||||||
|
// Set the coordinates to the merged ones
|
||||||
|
ps.transfer(newPoints);
|
||||||
|
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
{
|
{
|
||||||
Pout<< "stitchTriangles : Merged from " << rawPoints.size()
|
Pout<< "stitchTriangles : Merged from " << rawPoints.size()
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#------------------------------------------------------------------------------
|
#-------------------------------*- makefile -*---------------------------------
|
||||||
# ========= |
|
# ========= |
|
||||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
# \\ / O peration |
|
# \\ / O peration |
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#------------------------------------------------------------------------------
|
#-------------------------------*- makefile -*---------------------------------
|
||||||
# ========= |
|
# ========= |
|
||||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
# \\ / O peration |
|
# \\ / O peration |
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#------------------------------------------------------------------------------
|
#-------------------------------*- makefile -*---------------------------------
|
||||||
# ========= |
|
# ========= |
|
||||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
# \\ / O peration |
|
# \\ / O peration |
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
.SUFFIXES: .y .Y
|
.SUFFIXES: .y .Y
|
||||||
|
|
||||||
ytoo = bison -v -d -y $$SOURCE ; mv y.tab.c $*.c ; mv y.tab.h $*.h ; $(cc) $(cFLAGS) -c $*.c -o $@
|
ytoo = bison -v -d -y $$SOURCE ; mv y.tab.c $*.c ; mv y.tab.h $*.h ; $(cc) $(cFLAGS) -c $*.c -o $@
|
||||||
|
|
||||||
Ytoo = bison -v -d -y $$SOURCE ; mv y.tab.c $*.C ; mv y.tab.h $*.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
Ytoo = bison -v -d -y $$SOURCE ; mv y.tab.c $*.C ; mv y.tab.h $*.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
||||||
|
|
||||||
.y.dep:
|
.y.dep:
|
||||||
$(MAKE_DEP)
|
$(MAKE_DEP)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
.SUFFIXES: .y
|
.SUFFIXES: .y
|
||||||
|
|
||||||
ytoo = btyacc -v -d $(SKELETON) $$SOURCE ; mv y_tab.c $*.C ; mv y_tab.h $*.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
ytoo = btyacc -v -d $(SKELETON) $$SOURCE ; mv y_tab.c $*.C ; mv y_tab.h $*.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
||||||
|
|
||||||
.y.dep:
|
.y.dep:
|
||||||
$(MAKE_DEP)
|
$(MAKE_DEP)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
.SUFFIXES: .Y
|
.SUFFIXES: .Y
|
||||||
|
|
||||||
Ytoo = btyacc++ -v -d $(SKELETON) $$SOURCE ; mv y_tab.c $*.C ; mv y_tab.h $*.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
Ytoo = btyacc++ -v -d $(SKELETON) $$SOURCE ; mv y_tab.c $*.C ; mv y_tab.h $*.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
||||||
|
|
||||||
.Y.dep:
|
.Y.dep:
|
||||||
$(MAKE_DEP)
|
$(MAKE_DEP)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
.SUFFIXES: .y
|
.SUFFIXES: .y
|
||||||
|
|
||||||
ytoo = byacc -v $(YYPREFIX) -d $$SOURCE ; mv y.tab.c $*.C ; mv y.tab.h $*.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
ytoo = byacc -v $(YYPREFIX) -d $$SOURCE ; mv y.tab.c $*.C ; mv y.tab.h $*.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
||||||
|
|
||||||
.y.dep:
|
.y.dep:
|
||||||
$(MAKE_DEP)
|
$(MAKE_DEP)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
.SUFFIXES: .qt
|
.SUFFIXES: .qt
|
||||||
|
|
||||||
qttoo = $(QTDIR)/bin/moc -f $$SOURCE -o $*.C ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
qttoo = $(QTDIR)/bin/moc -f $$SOURCE -o $*.C ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
||||||
|
|
||||||
.qt.dep:
|
.qt.dep:
|
||||||
$(MAKE_DEP)
|
$(MAKE_DEP)
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
.SUFFIXES: .y .Y
|
.SUFFIXES: .y .Y
|
||||||
|
|
||||||
ytoo = yacc -v -d $$SOURCE ; mv y.tab.c $*.c ; mv y.tab.h $(@D)/parser.h ; $(CC) $(c++FLAGS) -c $*.c -o $@
|
ytoo = yacc -v -d $$SOURCE ; mv y.tab.c $*.c ; mv y.tab.h $(@D)/parser.h ; $(CC) $(c++FLAGS) -c $*.c -o $@
|
||||||
|
|
||||||
Ytoo = yacc -v -d $$SOURCE ; mv y.tab.c $*.C ; mv y.tab.h $(@D)/parser.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
Ytoo = yacc -v -d $$SOURCE ; mv y.tab.c $*.C ; mv y.tab.h $(@D)/parser.H ; $(CC) $(c++FLAGS) -c $*.C -o $@
|
||||||
|
|
||||||
.y.dep:
|
.y.dep:
|
||||||
$(MAKE_DEP)
|
$(MAKE_DEP)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
c++DBUG =
|
c++DBUG =
|
||||||
c++OPT = -O3
|
c++OPT = -O3
|
||||||
#c++OPT = -O3
|
#c++OPT = -O3
|
||||||
# -ftree-vectorize -ftree-vectorizer-verbose=3
|
# -ftree-vectorize -ftree-vectorizer-verbose=3
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG =
|
cDBUG =
|
||||||
cOPT = -O3
|
cOPT = -O3
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
c++DBUG =
|
c++DBUG =
|
||||||
c++OPT = -O3
|
c++OPT = -O3
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG =
|
cDBUG =
|
||||||
cOPT = -O3
|
cOPT = -O3
|
||||||
|
|||||||
16
wmake/rules/linux64Gcc++0x/c
Normal file
16
wmake/rules/linux64Gcc++0x/c
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
.SUFFIXES: .c .h
|
||||||
|
|
||||||
|
cWARN = -Wall
|
||||||
|
|
||||||
|
cc = gcc -m64
|
||||||
|
|
||||||
|
include $(RULES)/c$(WM_COMPILE_OPTION)
|
||||||
|
|
||||||
|
cFLAGS = $(GFLAGS) $(cWARN) $(cOPT) $(cDBUG) $(LIB_HEADER_DIRS) -fPIC
|
||||||
|
|
||||||
|
ctoo = $(WM_SCHEDULER) $(cc) $(cFLAGS) -c $$SOURCE -o $@
|
||||||
|
|
||||||
|
LINK_LIBS = $(cDBUG)
|
||||||
|
|
||||||
|
LINKLIBSO = $(cc) -shared
|
||||||
|
LINKEXE = $(cc) -Xlinker --add-needed -Xlinker -z -Xlinker nodefs
|
||||||
21
wmake/rules/linux64Gcc++0x/c++
Normal file
21
wmake/rules/linux64Gcc++0x/c++
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
.SUFFIXES: .C .cxx .cc .cpp
|
||||||
|
|
||||||
|
c++WARN = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor
|
||||||
|
|
||||||
|
CC = g++ -m64 -std=c++0x
|
||||||
|
|
||||||
|
include $(RULES)/c++$(WM_COMPILE_OPTION)
|
||||||
|
|
||||||
|
ptFLAGS = -DNoRepository -ftemplate-depth-60
|
||||||
|
|
||||||
|
c++FLAGS = $(GFLAGS) $(c++WARN) $(c++OPT) $(c++DBUG) $(ptFLAGS) $(LIB_HEADER_DIRS) -fPIC
|
||||||
|
|
||||||
|
Ctoo = $(WM_SCHEDULER) $(CC) $(c++FLAGS) -c $$SOURCE -o $@
|
||||||
|
cxxtoo = $(Ctoo)
|
||||||
|
cctoo = $(Ctoo)
|
||||||
|
cpptoo = $(Ctoo)
|
||||||
|
|
||||||
|
LINK_LIBS = $(c++DBUG)
|
||||||
|
|
||||||
|
LINKLIBSO = $(CC) $(c++FLAGS) -shared
|
||||||
|
LINKEXE = $(CC) $(c++FLAGS) -Xlinker --add-needed
|
||||||
2
wmake/rules/linux64Gcc++0x/c++Debug
Normal file
2
wmake/rules/linux64Gcc++0x/c++Debug
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
c++DBUG = -ggdb3 -DFULLDEBUG
|
||||||
|
c++OPT = -O0 -fdefault-inline
|
||||||
3
wmake/rules/linux64Gcc++0x/c++Opt
Normal file
3
wmake/rules/linux64Gcc++0x/c++Opt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#c++DBUG = -O0 -DFULLDEBUG -g
|
||||||
|
c++DBUG =
|
||||||
|
c++OPT = -O3
|
||||||
2
wmake/rules/linux64Gcc++0x/c++Prof
Normal file
2
wmake/rules/linux64Gcc++0x/c++Prof
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
c++DBUG = -pg
|
||||||
|
c++OPT = -O2
|
||||||
2
wmake/rules/linux64Gcc++0x/cDebug
Normal file
2
wmake/rules/linux64Gcc++0x/cDebug
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
cDBUG = -ggdb -DFULLDEBUG
|
||||||
|
cOPT = -O1 -fdefault-inline -finline-functions
|
||||||
2
wmake/rules/linux64Gcc++0x/cOpt
Normal file
2
wmake/rules/linux64Gcc++0x/cOpt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
cDBUG =
|
||||||
|
cOPT = -O3
|
||||||
2
wmake/rules/linux64Gcc++0x/cProf
Normal file
2
wmake/rules/linux64Gcc++0x/cProf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
cDBUG = -pg
|
||||||
|
cOPT = -O2
|
||||||
8
wmake/rules/linux64Gcc++0x/general
Normal file
8
wmake/rules/linux64Gcc++0x/general
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
CPP = cpp -traditional-cpp $(GFLAGS)
|
||||||
|
|
||||||
|
PROJECT_LIBS = -l$(WM_PROJECT) -liberty -ldl
|
||||||
|
|
||||||
|
include $(GENERAL_RULES)/standard
|
||||||
|
|
||||||
|
include $(RULES)/c
|
||||||
|
include $(RULES)/c++
|
||||||
3
wmake/rules/linux64Gcc++0x/mplibHPMPI
Normal file
3
wmake/rules/linux64Gcc++0x/mplibHPMPI
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
PFLAGS =
|
||||||
|
PINC = -I$(MPI_ARCH_PATH)/include -D_MPICC_H
|
||||||
|
PLIBS = -L$(MPI_ARCH_PATH)/lib/linux_amd64 -lmpi
|
||||||
@ -1,3 +1,3 @@
|
|||||||
#c++DBUG = -O0 -DFULLDEBUG -g
|
#c++DBUG = -O0 -DFULLDEBUG -g
|
||||||
c++DBUG =
|
c++DBUG =
|
||||||
c++OPT = -O3
|
c++OPT = -O3
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
.SUFFIXES: .c .h
|
.SUFFIXES: .c .h
|
||||||
|
|
||||||
cWARN =
|
cWARN =
|
||||||
|
|
||||||
cc = icc
|
cc = icc
|
||||||
|
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
c++DBUG = -g -DFULLDEBUG -O0
|
c++DBUG = -g -DFULLDEBUG -O0
|
||||||
c++OPT =
|
c++OPT =
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
c++DBUG =
|
c++DBUG =
|
||||||
c++OPT = -xT -O3 -no-prec-div
|
c++OPT = -xT -O3 -no-prec-div
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG = -g -DFULLDEBUG -O0
|
cDBUG = -g -DFULLDEBUG -O0
|
||||||
cOPT =
|
cOPT =
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG =
|
cDBUG =
|
||||||
cOPT = -O3 -no-prec-div
|
cOPT = -O3 -no-prec-div
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
c++DBUG =
|
c++DBUG =
|
||||||
c++OPT = -O3
|
c++OPT = -O3
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG =
|
cDBUG =
|
||||||
cOPT = -O3
|
cOPT = -O3
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
|
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
|
||||||
PINC =
|
PINC =
|
||||||
PLIBS = -lmpi
|
PLIBS = -lmpi
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
.SUFFIXES: .c .h
|
.SUFFIXES: .c .h
|
||||||
|
|
||||||
cWARN =
|
cWARN =
|
||||||
|
|
||||||
cc = icc
|
cc = icc
|
||||||
|
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
c++DBUG = -g -DFULLDEBUG -O0
|
c++DBUG = -g -DFULLDEBUG -O0
|
||||||
c++OPT =
|
c++OPT =
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
c++DBUG =
|
c++DBUG =
|
||||||
|
|
||||||
c++OPT = \
|
c++OPT = \
|
||||||
-DICC_IA64_PREFETCH \
|
-DICC_IA64_PREFETCH \
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG = -g -DFULLDEBUG -O0
|
cDBUG = -g -DFULLDEBUG -O0
|
||||||
cOPT =
|
cOPT =
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG =
|
cDBUG =
|
||||||
cOPT = -O3
|
cOPT = -O3
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
|
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
|
||||||
PINC =
|
PINC =
|
||||||
PLIBS = -lmpi
|
PLIBS = -lmpi
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
|
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
|
||||||
PINC =
|
PINC =
|
||||||
PLIBS = -lmpi
|
PLIBS = -lmpi
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
.SUFFIXES: .c .h
|
.SUFFIXES: .c .h
|
||||||
|
|
||||||
cWARN =
|
cWARN =
|
||||||
|
|
||||||
cc = icc -gcc-version=400
|
cc = icc -gcc-version=400
|
||||||
|
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
c++DBUG = -g -DFULLDEBUG -O0
|
c++DBUG = -g -DFULLDEBUG -O0
|
||||||
c++OPT =
|
c++OPT =
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
c++DBUG =
|
c++DBUG =
|
||||||
#c++OPT = -O3 -xP -no-prec-div
|
#c++OPT = -O3 -xP -no-prec-div
|
||||||
c++OPT = -ansi-alias -O3 -ftz -fno-alias \
|
c++OPT = -ansi-alias -O3 -ftz -fno-alias \
|
||||||
-fargument-noalias-global \
|
-fargument-noalias-global \
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG = -g -DFULLDEBUG -O0
|
cDBUG = -g -DFULLDEBUG -O0
|
||||||
cOPT =
|
cOPT =
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG =
|
cDBUG =
|
||||||
cOPT = -O3 -no-prec-div
|
cOPT = -O3 -no-prec-div
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
XFLAGS =
|
XFLAGS =
|
||||||
XINC =
|
XINC =
|
||||||
XLIBS =
|
XLIBS =
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
c++DBUG =
|
c++DBUG =
|
||||||
c++OPT = -O3 -DNDEBUG
|
c++OPT = -O3 -DNDEBUG
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
cDBUG =
|
cDBUG =
|
||||||
cOPT = -O3 -DNDEBUG
|
cOPT = -O3 -DNDEBUG
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
c++DBUG =
|
c++DBUG =
|
||||||
c++OPT = -O3 -fno-schedule-insns
|
c++OPT = -O3 -fno-schedule-insns
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user