Merge branch 'master' of ssh://noisy/home/noisy3/OpenFOAM/OpenFOAM-dev

This commit is contained in:
andy
2010-11-19 18:32:08 +00:00
102 changed files with 1640 additions and 541 deletions

View File

@ -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));

View File

@ -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;
}

View File

@ -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);

View File

@ -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)
{ {

View File

@ -0,0 +1,3 @@
memInfo.C
EXE = $(FOAM_USER_APPBIN)/memInfo

View File

View 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;
}

View File

@ -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
); );
} }
} }

View File

@ -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 \

View File

@ -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)

View File

@ -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' ' '

View File

@ -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' ' '

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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
// ************************************************************************* // // ************************************************************************* //

View File

@ -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;
}; };

View File

@ -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
// ************************************************************************* // // ************************************************************************* //

View File

@ -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;
}; };

View File

@ -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]);
}
} }

View File

@ -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);

View 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;
}
// ************************************************************************* //

View 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
// ************************************************************************* //

View File

@ -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;
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -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

View File

@ -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
{ {

View File

@ -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");

View File

@ -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);
} }
} }

View File

@ -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.

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;
} }

View File

@ -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

View File

@ -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();

View 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;
}
}
// ************************************************************************* //

View File

@ -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!

View File

@ -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];

View File

@ -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);
} }

View File

@ -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
( (

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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;

View File

@ -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())
) )
{ {

View File

@ -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
); );

View File

@ -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;

View File

@ -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"

View File

@ -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()

View File

@ -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 |

View File

@ -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 |

View File

@ -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 |

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -1,2 +1,2 @@
cDBUG = cDBUG =
cOPT = -O3 cOPT = -O3

View File

@ -1,2 +1,2 @@
c++DBUG = c++DBUG =
c++OPT = -O3 c++OPT = -O3

View File

@ -1,2 +1,2 @@
cDBUG = cDBUG =
cOPT = -O3 cOPT = -O3

View 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

View 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

View File

@ -0,0 +1,2 @@
c++DBUG = -ggdb3 -DFULLDEBUG
c++OPT = -O0 -fdefault-inline

View File

@ -0,0 +1,3 @@
#c++DBUG = -O0 -DFULLDEBUG -g
c++DBUG =
c++OPT = -O3

View File

@ -0,0 +1,2 @@
c++DBUG = -pg
c++OPT = -O2

View File

@ -0,0 +1,2 @@
cDBUG = -ggdb -DFULLDEBUG
cOPT = -O1 -fdefault-inline -finline-functions

View File

@ -0,0 +1,2 @@
cDBUG =
cOPT = -O3

View File

@ -0,0 +1,2 @@
cDBUG = -pg
cOPT = -O2

View 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++

View File

@ -0,0 +1,3 @@
PFLAGS =
PINC = -I$(MPI_ARCH_PATH)/include -D_MPICC_H
PLIBS = -L$(MPI_ARCH_PATH)/lib/linux_amd64 -lmpi

View File

@ -1,3 +1,3 @@
#c++DBUG = -O0 -DFULLDEBUG -g #c++DBUG = -O0 -DFULLDEBUG -g
c++DBUG = c++DBUG =
c++OPT = -O3 c++OPT = -O3

View File

@ -1,6 +1,6 @@
.SUFFIXES: .c .h .SUFFIXES: .c .h
cWARN = cWARN =
cc = icc cc = icc

View File

@ -1,2 +1,2 @@
c++DBUG = -g -DFULLDEBUG -O0 c++DBUG = -g -DFULLDEBUG -O0
c++OPT = c++OPT =

View File

@ -1,2 +1,2 @@
c++DBUG = c++DBUG =
c++OPT = -xT -O3 -no-prec-div c++OPT = -xT -O3 -no-prec-div

View File

@ -1,2 +1,2 @@
cDBUG = -g -DFULLDEBUG -O0 cDBUG = -g -DFULLDEBUG -O0
cOPT = cOPT =

View File

@ -1,2 +1,2 @@
cDBUG = cDBUG =
cOPT = -O3 -no-prec-div cOPT = -O3 -no-prec-div

View File

@ -1,2 +1,2 @@
c++DBUG = c++DBUG =
c++OPT = -O3 c++OPT = -O3

View File

@ -1,2 +1,2 @@
cDBUG = cDBUG =
cOPT = -O3 cOPT = -O3

View File

@ -1,3 +1,3 @@
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
PINC = PINC =
PLIBS = -lmpi PLIBS = -lmpi

View File

@ -1,6 +1,6 @@
.SUFFIXES: .c .h .SUFFIXES: .c .h
cWARN = cWARN =
cc = icc cc = icc

View File

@ -1,2 +1,2 @@
c++DBUG = -g -DFULLDEBUG -O0 c++DBUG = -g -DFULLDEBUG -O0
c++OPT = c++OPT =

View File

@ -1,4 +1,4 @@
c++DBUG = c++DBUG =
c++OPT = \ c++OPT = \
-DICC_IA64_PREFETCH \ -DICC_IA64_PREFETCH \

View File

@ -1,2 +1,2 @@
cDBUG = -g -DFULLDEBUG -O0 cDBUG = -g -DFULLDEBUG -O0
cOPT = cOPT =

View File

@ -1,2 +1,2 @@
cDBUG = cDBUG =
cOPT = -O3 cOPT = -O3

View File

@ -1,3 +1,3 @@
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
PINC = PINC =
PLIBS = -lmpi PLIBS = -lmpi

View File

@ -1,3 +1,3 @@
PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND PFLAGS = -DSGIMPI -DMPI_NO_CPPBIND
PINC = PINC =
PLIBS = -lmpi PLIBS = -lmpi

View File

@ -1,6 +1,6 @@
.SUFFIXES: .c .h .SUFFIXES: .c .h
cWARN = cWARN =
cc = icc -gcc-version=400 cc = icc -gcc-version=400

View File

@ -1,2 +1,2 @@
c++DBUG = -g -DFULLDEBUG -O0 c++DBUG = -g -DFULLDEBUG -O0
c++OPT = c++OPT =

View File

@ -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 \

View File

@ -1,2 +1,2 @@
cDBUG = -g -DFULLDEBUG -O0 cDBUG = -g -DFULLDEBUG -O0
cOPT = cOPT =

View File

@ -1,2 +1,2 @@
cDBUG = cDBUG =
cOPT = -O3 -no-prec-div cOPT = -O3 -no-prec-div

View File

@ -1,3 +1,3 @@
XFLAGS = XFLAGS =
XINC = XINC =
XLIBS = XLIBS =

View File

@ -1,2 +1,2 @@
c++DBUG = c++DBUG =
c++OPT = -O3 -DNDEBUG c++OPT = -O3 -DNDEBUG

View File

@ -1,2 +1,2 @@
cDBUG = cDBUG =
cOPT = -O3 -DNDEBUG cOPT = -O3 -DNDEBUG

View File

@ -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