resolving merge conflict

This commit is contained in:
andy
2008-06-17 12:09:22 +01:00
55 changed files with 858 additions and 871 deletions

View File

@ -1,10 +1,13 @@
#!/bin/sh #!/bin/sh
set -x set -x
# run from this directory only
cd ${0%/*} || exit 1
# wmake is required for subsequent targets # wmake is required for subsequent targets
(cd wmake/src && make) (cd wmake/src && make)
(cd $WM_PROJECT_INST_DIR/ThirdParty && ./Allwmake) (cd $WM_THIRD_PARTY_DIR && ./Allwmake)
(cd src && ./Allwmake) (cd src && ./Allwmake)

63
README
View File

@ -29,8 +29,8 @@
2. System requirements 2. System requirements
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~
OpenFOAM is developed and tested on Linux, but should work with other OpenFOAM is developed and tested on Linux, but should work with other
Unix style system. To check your system setup, execute the foamSystemCheck Unix style systems. To check your system setup, execute the foamSystemCheck
script in the bin directory of the OpenFOAM installation. If no problems script in the bin/ directory of the OpenFOAM installation. If no problems
are reported, proceed to "3. Installation"; otherwise contact your are reported, proceed to "3. Installation"; otherwise contact your
system administrator. system administrator.
@ -40,7 +40,6 @@
3. Installation 3. Installation
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
Download and unpack the files in the $HOME/OpenFOAM directory as described Download and unpack the files in the $HOME/OpenFOAM directory as described
in: http://www.OpenFOAM.org/download.html in: http://www.OpenFOAM.org/download.html
@ -77,10 +76,9 @@
3.1. Installation in alternative locations 3.1. Installation in alternative locations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OpenFOAM may also be installed in alternative locations. However, the
OpenFOAM may also be installed in an alternative location. installation directory should be network available (e.g., NFS) if
However, the installation directory must be network available parallel calculations are planned.
(eg, NFS) if parallel calculations are planned.
The environment variable 'FOAM_INST_DIR' can be used to find and source The environment variable 'FOAM_INST_DIR' can be used to find and source
the appropriate resource file. Here is a bash/ksh/sh example: the appropriate resource file. Here is a bash/ksh/sh example:
@ -89,7 +87,7 @@
foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc
[ -f $foamDotFile ] && . $foamDotFile [ -f $foamDotFile ] && . $foamDotFile
and a csh example: and a csh/tcsh example:
setenv FOAM_INST_DIR /data/app/OpenFOAM setenv FOAM_INST_DIR /data/app/OpenFOAM
foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc foamDotFile=$FOAM_INST_DIR/OpenFOAM-<VERSION>/etc/bashrc
@ -102,9 +100,8 @@
4. Building from Sources (Optional) 4. Building from Sources (Optional)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you cannot find an appropriate binary pack for your platform, you can If you cannot find an appropriate binary pack for your platform, you can
build the complete OpenFOAM from the source-pack. First you will need to build the complete OpenFOAM from the source-pack. You will first need to
compile or obtain a recent version of gcc (we recomend gcc-4.2.?) for compile or obtain a recent version of gcc (we recomend gcc-4.2.?) for
your platform, which may be obtained from http://gcc.gnu.org/. your platform, which may be obtained from http://gcc.gnu.org/.
@ -114,29 +111,27 @@
$WM_PROJECT_DIR/etc/settings.csh appropriately and finally update the $WM_PROJECT_DIR/etc/settings.csh appropriately and finally update the
environment variables as in section 3. environment variables as in section 3.
Now go to the top-level source directory $WM_PROJECT_DIR and type Now go to the top-level source directory $WM_PROJECT_DIR and execute the
./Allwmake, which is the name of the top-level build script for building top-level build script './Allwmake'. In principle this will build
the whole of OpenFOAM. In principle this will build everything, but everything, but if problems occur with the build order it may be necessary
sometimes problems occur with the build order and it is necessary to to update the environment variables and re-execute 'Allwmake'. If you
update the environment variables and re-execute Allwmake. If you experience difficulties with building the source-pack, or your platform is
experience difficulties with building the source-pack or your platform is not currently supported, please contact <enquiries@OpenCFD.co.uk> to
not currently supported please contact <enquiries@OpenCFD.co.uk> to negotiate a support contract and we will do the port and maintain it for
negotiate a support contract and we will do the port and maintain it in
future releases. future releases.
5. Testing the installation 5. Testing the installation
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
To check your installation setup, execute the 'foamInstallationTest' To check your installation setup, execute the 'foamInstallationTest'
script (in the bin directory of the OpenFOAM installation). If no problems script (in the bin/ directory of the OpenFOAM installation). If no
are reported, proceed to getting started with OpenFOAM; otherwise, go back problems are reported, proceed to getting started with OpenFOAM;
and check you have installed the software correctly and/or contact your otherwise, go back and check you have installed the software correctly
system administrator. and/or contact your system administrator.
6. Getting Started 6. Getting Started
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
Create a project directory within the $HOME/OpenFOAM directory named Create a project directory within the $HOME/OpenFOAM directory named
<USER>-<VERSION> (e.g. 'chris-1.5' for user chris and OpenFOAM version 1.5) <USER>-<VERSION> (e.g. 'chris-1.5' for user chris and OpenFOAM version 1.5)
and create a directory named 'run' within it, e.g. by typing: and create a directory named 'run' within it, e.g. by typing:
@ -144,7 +139,7 @@
mkdir -p $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run mkdir -p $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
Copy the 'tutorial' examples directory in the OpenFOAM distribution to the Copy the 'tutorial' examples directory in the OpenFOAM distribution to the
'run' directory. If OpenFOAM environment variables are set correctly, 'run' directory. If the OpenFOAM environment variables are set correctly,
then the following command will be correct: then the following command will be correct:
cp -r $WM_PROJECT_DIR/tutorials $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run cp -r $WM_PROJECT_DIR/tutorials $HOME/OpenFOAM/${USER}-${WM_PROJECT_VERSION}/run
@ -158,27 +153,27 @@
7. Documentation 7. Documentation
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
http://www.OpenFOAM.org/doc http://www.OpenFOAM.org/doc
8. Help 8. Help
~~~~~~~ ~~~~~~~
http://www.OpenFOAM.org http://www.OpenFOAM.org
http://www.OpenFOAM.org/discussion.html http://www.OpenFOAM.org/discussion.html
9. Reporting Bugs in OpenFOAM 9. Reporting Bugs in OpenFOAM
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
http://www.OpenFOAM.org/bugs.html http://www.OpenFOAM.org/bugs.html
A. Running OpenFOAM in 32-bit mode on 64-bit machines A. Running OpenFOAM in 32-bit mode on 64-bit machines
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Those users with an installation of Linux on a 64-bit machine may install Linux users with a 64-bit machine may install either the OpenFOAM 32-bit
either or both of the 32-bit version of OpenFOAM (linux) or the 64-bit version (linux) or the OpenFOAM 64-bit version (linux64), or both.
version of FOAM (linux64) with 64-bit being the default mode. In order to The 64-bit is the default mode on a 64-bit machine. To use an installed
set up the user to run in 32-bit mode, the user must set the environment 32-bit version, the user must set the environment variable $WM_32 (to
variable $WM_32 (to anything, e.g. "on") before sourcing the etc/bashrc anything, e.g. "on") before sourcing the etc/bashrc (or etc/cshrc) file.
(or etc/cshrc) file. Unsetting $WM_32 and sourcing the bashrc file will Unsetting WM_32 and re-sourcing the etc/bashrc (or etc/cshrc) file will
set up the user to run in 64-bit mode. set up the user to run in 64-bit mode.

View File

@ -42,24 +42,17 @@ namespace functionEntries
( (
functionEntry, functionEntry,
calcEntry, calcEntry,
insert, execute,
primitiveEntryIstream primitiveEntryIstream
); );
addToMemberFunctionSelectionTable
(
functionEntry,
calcEntry,
insert,
dictionaryIstream
);
} }
} }
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionEntries::calcEntry::insert bool Foam::functionEntries::calcEntry::execute
( (
const dictionary& parentDict, const dictionary& parentDict,
primitiveEntry& entry, primitiveEntry& entry,
@ -75,14 +68,4 @@ bool Foam::functionEntries::calcEntry::insert
} }
bool Foam::functionEntries::calcEntry::insert
(
dictionary& parentDict,
Istream& is
)
{
return true;
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -69,18 +69,13 @@ public:
// Member Functions // Member Functions
static bool insert static bool execute
( (
const dictionary& parentDict, const dictionary& parentDict,
primitiveEntry& entry, primitiveEntry& entry,
Istream& is Istream& is
); );
static bool insert
(
dictionary& parentDict,
Istream& is
);
}; };

View File

@ -1,17 +1,19 @@
/*-------------------------------*- C++ -*---------------------------------*\
| ========= |
| \\ / OpenFOAM |
| \\ / |
| \\ / The Open Source CFD Toolbox |
| \\/ http://www.OpenFOAM.org |
\*-------------------------------------------------------------------------*/
FoamFile FoamFile
{ {
version 2.0; version 2.0;
format ascii; format ascii;
root "";
case "";
instance "";
local "";
class dictionary; class dictionary;
object testDict; object testDict;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#inputMode merge
dimensions [ 0 2 -2 0 0 0 0 ]; dimensions [ 0 2 -2 0 0 0 0 ];
internalField uniform 1; internalField uniform 1;
@ -29,7 +31,6 @@ inactive
type zeroGradient; type zeroGradient;
} }
boundaryField boundaryField
{ {
Default_Boundary_Region Default_Boundary_Region
@ -40,6 +41,12 @@ boundaryField
inlet_1 { $active } inlet_1 { $active }
inlet_2 { $inactive } inlet_2 { $inactive }
inlet_3 { $inactive } inlet_3 { $inactive }
inlet_4 { $inactive }
inlet_5 "a primitiveEntry is squashed by a directory entry";
inlet_5 { $inactive }
inlet_6 { $inactive }
inlet_7 { $inactive }
inlet_8 { $inactive }
#include "testDictInc" #include "testDictInc"
@ -48,8 +55,44 @@ boundaryField
type inletOutlet; type inletOutlet;
inletValue $internalField; inletValue $internalField;
value #include "value"; value #include "value";
// error #remove self;
x 5; x 5;
y 6; y 6;
another #calc{x $x; y $y;}; another #calc{x $x; y $y;};
} }
// this should have no effect
#remove inactive
inlet_7 { $active }
#inputMode overwrite
inlet_8 { $active }
} }
// NB: the inputMode has a global scope
#inputMode merge
#include "testDict2"
foo
{
$active
}
bar
{
$active
}
baz
{
$active
}
// this should work
#remove active
// this should work too
#remove ( bar baz )
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -0,0 +1,30 @@
/*-------------------------------*- C++ -*---------------------------------*\
| ========= |
| \\ / OpenFOAM |
| \\ / |
| \\ / The Open Source CFD Toolbox |
| \\/ http://www.OpenFOAM.org |
\*-------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object testDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
boundaryField
{
Default_Boundary_Region
{
value $internalField;
note "actually a noslip wall";
}
inlet_3 "a primitiveEntry squashes directory entry";
}
#inputMode overwrite
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -1 +1,2 @@
uniform 2 // the trailing ';' shouldn't actually be there, but shouldn't cause problems
uniform 2;

View File

@ -2,6 +2,9 @@
# Build optional components (eg, may depend on third-party libraries) # Build optional components (eg, may depend on third-party libraries)
set -x set -x
# run from this directory only
cd ${0%/*} || exit 1
# build libccmio if required # build libccmio if required
if [ ! -e $FOAM_LIBBIN/libccmio.so ] if [ ! -e $FOAM_LIBBIN/libccmio.so ]
then then

View File

@ -90,17 +90,15 @@ if [ "$spawn" -ne 1 -a "$spawn" -ne 2 ]; then
exit 1 exit 1
fi fi
# check ~/.OpenFOAM-VERSION # check ~/.$WM_PROJECT/$WM_PROJECT_VERSION/
# check <site>/etc # check ~/.$WM_PROJECT/
# check <site>/.OpenFOAM-VERSION # check <installedProject>/etc/
if [ "$WM_PROJECT" ]; then if [ "$WM_PROJECT" ]; then
: ${FOAM_DOT_DIR:=.$WM_PROJECT-$WM_PROJECT_VERSION}
for i in \ for i in \
$HOME/$FOAM_DOT_DIR \ $HOME/.WM_PROJECT/$WM_PROJECT_VERSION \
$HOME/.WM_PROJECT \
$WM_PROJECT_DIR/etc \ $WM_PROJECT_DIR/etc \
$WM_PROJECT_DIR/$FOAM_DOT_DIR \
; ;
do do
if [ -f "$i/bashrc" ]; then if [ -f "$i/bashrc" ]; then
@ -112,7 +110,12 @@ fi
# Construct test string for remote execution. # Construct test string for remote execution.
# Source OpenFOAM settings if OpenFOAM environment not set. # Source OpenFOAM settings if OpenFOAM environment not set.
sourceFoam='[ "$WM_PROJECT" ] || . '"$sourceFoam" # attempt to preserve the installation directory 'FOAM_INST_DIR'
if [ "$FOAM_INST_DIR" ]; then
sourceFoam='[ "$WM_PROJECT" ] || '"FOAM_INST_DIR=$FOAM_INST_DIR . $sourceFoam"
else
sourceFoam='[ "$WM_PROJECT" ] || '". $sourceFoam"
fi
echo "**sourceFoam:$sourceFoam" echo "**sourceFoam:$sourceFoam"

View File

@ -1,5 +1,4 @@
#!/bin/sh #---------------------------------*- sh -*-------------------------------------
#------------------------------------------------------------------------------
# ========= | # ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration | # \\ / O peration |

View File

@ -1,5 +1,4 @@
#!/bin/sh #---------------------------------*- sh -*-------------------------------------
#------------------------------------------------------------------------------
# ========= | # ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration | # \\ / O peration |

View File

@ -1,5 +1,4 @@
#!/bin/sh #---------------------------------*- sh -*-------------------------------------
#------------------------------------------------------------------------------
# ========= | # ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration | # \\ / O peration |
@ -48,6 +47,7 @@ initialiseVariables ()
if [ "$VERBOSE" = ON ]; then if [ "$VERBOSE" = ON ]; then
addCMakeVariable "CMAKE_VERBOSE_MAKEFILE=TRUE" addCMakeVariable "CMAKE_VERBOSE_MAKEFILE=TRUE"
fi fi
addCMakeVariable "VTK_USE_TK=FALSE"
} }

View File

@ -1,5 +1,4 @@
#!/bin/sh #---------------------------------*- sh -*-------------------------------------
#------------------------------------------------------------------------------
# ========= | # ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration | # \\ / O peration |

View File

@ -38,6 +38,12 @@ alias wm32 'setenv WM_ARCH_OPTION 32; source $WM_PROJECT_DIR/etc/cshrc'
alias wmSP 'setenv WM_PRECISION_OPTION SP; source $WM_PROJECT_DIR/etc/cshrc' alias wmSP 'setenv WM_PRECISION_OPTION SP; source $WM_PROJECT_DIR/etc/cshrc'
alias wmDP 'setenv WM_PRECISION_OPTION DP; source $WM_PROJECT_DIR/etc/cshrc' alias wmDP 'setenv WM_PRECISION_OPTION DP; source $WM_PROJECT_DIR/etc/cshrc'
# Toggle wmakeScheduler on/off
# - also need to set WM_HOSTS
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias wmSchedON 'setenv WM_SCHEDULER $WM_PROJECT_DIR/wmake/wmakeScheduler'
alias wmSchedOFF 'unsetenv WM_SCHEDULER'
# Change directory aliases # Change directory aliases
# ~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~
alias src 'cd $FOAM_SRC' alias src 'cd $FOAM_SRC'

View File

@ -38,6 +38,12 @@ alias wm32='export WM_ARCH_OPTION=32; . $WM_PROJECT_DIR/etc/bashrc'
alias wmSP='export WM_PRECISION_OPTION=SP; . $WM_PROJECT_DIR/etc/bashrc' alias wmSP='export WM_PRECISION_OPTION=SP; . $WM_PROJECT_DIR/etc/bashrc'
alias wmDP='export WM_PRECISION_OPTION=DP; . $WM_PROJECT_DIR/etc/bashrc' alias wmDP='export WM_PRECISION_OPTION=DP; . $WM_PROJECT_DIR/etc/bashrc'
# Toggle wmakeScheduler on/off
# - also need to set WM_HOSTS
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias wmSchedON='export WM_SCHEDULER=$WM_PROJECT_DIR/wmake/wmakeScheduler'
alias wmSchedOFF='unset WM_SCHEDULER'
# Change directory aliases # Change directory aliases
# ~~~~~~~~~~~~~~~~~~~~~~~~ # ~~~~~~~~~~~~~~~~~~~~~~~~
alias src='cd $FOAM_SRC' alias src='cd $FOAM_SRC'

View File

@ -213,25 +213,13 @@ bool Foam::chDir(const fileName& dir)
Foam::fileName Foam::dotFoam(const fileName& name) Foam::fileName Foam::dotFoam(const fileName& name)
{ {
// Search for file 'name' in:
// 1) ~/.OpenFOAM-VERSION/, ~/.OpenFOAM/VERSION/ or ~/.OpenFOAM/
// 2) $WM_PROJECT_INST_DIR/site/VERSION or $WM_PROJECT_INST_DIR/site/
// 3) $WM_PROJECT_DIR/etc/
// Search user files: // Search user files:
// ~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~
// Check for user file in ~/.OpenFOAM-VERSION/
fileName fullName = home()/(word(".OpenFOAM-") + FOAMversion)/name;
if (exists(fullName))
{
return fullName;
}
fileName searchDir = home()/".OpenFOAM"; fileName searchDir = home()/".OpenFOAM";
if (dir(searchDir)) if (dir(searchDir))
{ {
// Check for user file in ~/.OpenFOAM/VERSION // Check for user file in ~/.OpenFOAM/VERSION
fullName = searchDir/FOAMversion/name; fileName fullName = searchDir/FOAMversion/name;
if (exists(fullName)) if (exists(fullName))
{ {
return fullName; return fullName;
@ -252,7 +240,7 @@ Foam::fileName Foam::dotFoam(const fileName& name)
if (dir(searchDir)) if (dir(searchDir))
{ {
// Check for site file in $WM_PROJECT_INST_DIR/site/VERSION // Check for site file in $WM_PROJECT_INST_DIR/site/VERSION
fullName = searchDir/"site"/FOAMversion/name; fileName fullName = searchDir/"site"/FOAMversion/name;
if (exists(fullName)) if (exists(fullName))
{ {
return fullName; return fullName;
@ -272,14 +260,14 @@ Foam::fileName Foam::dotFoam(const fileName& name)
if (dir(searchDir)) if (dir(searchDir))
{ {
// Check for shipped OpenFOAM file in $WM_PROJECT_DIR/etc // Check for shipped OpenFOAM file in $WM_PROJECT_DIR/etc
fullName = searchDir/"etc"/name; fileName fullName = searchDir/"etc"/name;
if (exists(fullName)) if (exists(fullName))
{ {
return fullName; return fullName;
} }
} }
// Nothing found // Not found
return fileName::null; return fileName::null;
} }

View File

@ -122,6 +122,7 @@ functionEntries = $(dictionary)/functionEntries
$(functionEntries)/functionEntry/functionEntry.C $(functionEntries)/functionEntry/functionEntry.C
$(functionEntries)/includeEntry/includeEntry.C $(functionEntries)/includeEntry/includeEntry.C
$(functionEntries)/inputModeEntry/inputModeEntry.C $(functionEntries)/inputModeEntry/inputModeEntry.C
$(functionEntries)/removeEntry/removeEntry.C
IOdictionary = db/IOobjects/IOdictionary IOdictionary = db/IOobjects/IOdictionary
$(IOdictionary)/IOdictionary.C $(IOdictionary)/IOdictionary.C

View File

@ -1,5 +1,5 @@
EXE_INC = \ EXE_INC = \
-I$(LIB_SRC)/zlib-1.2.3 -I$(WM_THIRD_PARTY_DIR)/zlib-1.2.3
LIB_LIBS = \ LIB_LIBS = \
$(FOAM_LIBBIN)/libOSspecific.o \ $(FOAM_LIBBIN)/libOSspecific.o \

View File

@ -329,12 +329,9 @@ public:
// Writing // Writing
//- Write the standard OpenFOAM file/dictionary banner //- Write the standard OpenFOAM file/dictionary banner
// Optionally without -*- C++ -*- editor hint (eg, for logs)
template<class Stream> template<class Stream>
static inline void writeBanner(Stream& os); static inline void writeBanner(Stream& os, bool noHint=false);
//- Write the standard OpenFOAM log banner
template<class Stream>
static inline void writeLogBanner(Stream& os);
//- Write the standard file section divider //- Write the standard file section divider
template<class Stream> template<class Stream>

View File

@ -29,48 +29,34 @@ License
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class Stream> template<class Stream>
inline void Foam::IOobject::writeBanner(Stream& os) inline void Foam::IOobject::writeBanner(Stream& os, bool noHint)
{ {
static bool spacesSet = false; static bool spacesSet = false;
static char spaces[80]; static char spaces[40];
if (!spacesSet) if (!spacesSet)
{ {
memset(spaces, ' ', 80); memset(spaces, ' ', 40);
spaces[38 - strlen(Foam::FOAMversion)] = '\0'; spaces[38 - strlen(Foam::FOAMversion)] = '\0';
spacesSet = true; spacesSet = true;
} }
os << if (noHint)
"/*--------------------------------*- C++ -*----------------------------------*\\\n"
"| ========= | |\n"
"| \\\\ / F ield | OpenFOAM: The Open Source CFD Toolbox |\n"
"| \\\\ / O peration | Version: " << FOAMversion << spaces << "|\n"
"| \\\\ / A nd | Web: http://www.openfoam.org |\n"
"| \\\\/ M anipulation | |\n"
"\\*---------------------------------------------------------------------------*/\n";
}
template<class Stream>
inline void Foam::IOobject::writeLogBanner(Stream& os)
{
static bool spacesSet = false;
static char spaces[80];
if (!spacesSet)
{ {
memset(spaces, ' ', 80); os <<
spaces[38 - strlen(Foam::FOAMversion)] = '\0'; "/*---------------------------------------------------------------------------*\\\n";
spacesSet = true; }
else
{
os <<
"/*--------------------------------*- C++ -*----------------------------------*\\\n";
} }
os << os <<
"/*---------------------------------------------------------------------------*\\\n"
"| ========= | |\n" "| ========= | |\n"
"| \\\\ / F ield | OpenFOAM: The Open Source CFD Toolbox |\n" "| \\\\ / F ield | OpenFOAM: The Open Source CFD Toolbox |\n"
"| \\\\ / O peration | Version: " << FOAMversion << spaces << "|\n" "| \\\\ / O peration | Version: " << FOAMversion << spaces << "|\n"
"| \\\\ / A nd | Web: http://www.openfoam.org |\n" "| \\\\ / A nd | Web: http://www.OpenFOAM.org |\n"
"| \\\\/ M anipulation | |\n" "| \\\\/ M anipulation | |\n"
"\\*---------------------------------------------------------------------------*/\n"; "\\*---------------------------------------------------------------------------*/\n";
} }

View File

@ -37,8 +37,8 @@ bool Foam::IOobject::writeHeader(Ostream& os) const
if (!os.good()) if (!os.good())
{ {
Info<< "IOobject::writeHeader(Ostream&) : " Info<< "IOobject::writeHeader(Ostream&) : "
<< "no stream open for write" << "no stream open for write" << nl
<< endl << os.info() << endl; << os.info() << endl;
return false; return false;
} }
@ -49,16 +49,14 @@ bool Foam::IOobject::writeHeader(Ostream& os) const
<< " format " << os.format() << ";\n" << " format " << os.format() << ";\n"
<< " class " << type() << ";\n"; << " class " << type() << ";\n";
// outdent for visibility and more space
if (note().size()) if (note().size())
{ {
os << " note " << note() << ";\n"; os << " note " << note() << ";\n";
} }
// writing without quotes would look nicer os << " location " << instance()/local() << ";\n"
os << " object " << name() << ";\n" << " object " << name() << ";\n"
//<< " instance " << instance()/local() << ";\n"
//<< " local " << local() << ";\n"
<< " location " << instance()/local() << ";\n"
<< "}" << nl; << "}" << nl;
writeDivider(os); writeDivider(os);

View File

@ -34,74 +34,6 @@ defineTypeNameAndDebug(Foam::dictionary, 0);
const Foam::dictionary Foam::dictionary::null; const Foam::dictionary Foam::dictionary::null;
#define DICTIONARY_INPLACE_MERGE
// * * * * * * * * * * * * * Private member functions * * * * * * * * * * * //
bool Foam::dictionary::add(entry* ePtr, bool mergeEntry)
{
HashTable<entry*>::iterator iter = hashedEntries_.find(ePtr->keyword());
if (mergeEntry && iter != hashedEntries_.end())
{
// merge dictionary with dictionary
if (iter()->isDict() && ePtr->isDict())
{
iter()->dict().merge(ePtr->dict());
delete ePtr;
return true;
}
else
{
// replace existing dictionary with entry or vice versa
#ifdef DICTIONARY_INPLACE_MERGE
IDLList<entry>::replace(iter(), ePtr);
delete iter();
hashedEntries_.erase(iter);
if (hashedEntries_.insert(ePtr->keyword(), ePtr))
{
ePtr->name() = name_ + "::" + ePtr->keyword();
return true;
}
else
{
IOWarningIn("dictionary::add(entry* ePtr)", (*this))
<< "problem replacing entry "<< ePtr->keyword()
<< " in dictionary " << name()
<< endl;
IDLList<entry>::remove(ePtr);
delete ePtr;
return false;
}
#else
remove(ePtr->keyword());
#endif
}
}
if (hashedEntries_.insert(ePtr->keyword(), ePtr))
{
ePtr->name() = name_ + "::" + ePtr->keyword();
IDLList<entry>::append(ePtr);
return true;
}
else
{
IOWarningIn("dictionary::add(entry* ePtr)", (*this))
<< "attempt to add entry "<< ePtr->keyword()
<< " which already exists in dictionary " << name()
<< endl;
delete ePtr;
return false;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::dictionary::dictionary() Foam::dictionary::dictionary()
@ -195,15 +127,15 @@ Foam::label Foam::dictionary::endLineNumber() const
} }
bool Foam::dictionary::found(const word& keyword, bool recusive) const bool Foam::dictionary::found(const word& keyword, bool recursive) const
{ {
if (hashedEntries_.found(keyword)) if (hashedEntries_.found(keyword))
{ {
return true; return true;
} }
else if (recusive && &parent_ != &dictionary::null) else if (recursive && &parent_ != &dictionary::null)
{ {
return parent_.found(keyword, recusive); return parent_.found(keyword, recursive);
} }
else else
{ {
@ -215,16 +147,16 @@ bool Foam::dictionary::found(const word& keyword, bool recusive) const
const Foam::entry* Foam::dictionary::lookupEntryPtr const Foam::entry* Foam::dictionary::lookupEntryPtr
( (
const word& keyword, const word& keyword,
bool recusive bool recursive
) const ) const
{ {
HashTable<entry*>::const_iterator iter = hashedEntries_.find(keyword); HashTable<entry*>::const_iterator iter = hashedEntries_.find(keyword);
if (iter == hashedEntries_.end()) if (iter == hashedEntries_.end())
{ {
if (recusive && &parent_ != &dictionary::null) if (recursive && &parent_ != &dictionary::null)
{ {
return parent_.lookupEntryPtr(keyword, recusive); return parent_.lookupEntryPtr(keyword, recursive);
} }
else else
{ {
@ -239,19 +171,19 @@ const Foam::entry* Foam::dictionary::lookupEntryPtr
Foam::entry* Foam::dictionary::lookupEntryPtr Foam::entry* Foam::dictionary::lookupEntryPtr
( (
const word& keyword, const word& keyword,
bool recusive bool recursive
) )
{ {
HashTable<entry*>::iterator iter = hashedEntries_.find(keyword); HashTable<entry*>::iterator iter = hashedEntries_.find(keyword);
if (iter == hashedEntries_.end()) if (iter == hashedEntries_.end())
{ {
if (recusive && &parent_ != &dictionary::null) if (recursive && &parent_ != &dictionary::null)
{ {
return const_cast<dictionary&>(parent_).lookupEntryPtr return const_cast<dictionary&>(parent_).lookupEntryPtr
( (
keyword, keyword,
recusive recursive
); );
} }
else else
@ -267,14 +199,13 @@ Foam::entry* Foam::dictionary::lookupEntryPtr
const Foam::entry& Foam::dictionary::lookupEntry const Foam::entry& Foam::dictionary::lookupEntry
( (
const word& keyword, const word& keyword,
bool recusive bool recursive
) const ) const
{ {
const entry* ePtr = lookupEntryPtr(keyword, recusive); const entry* entryPtr = lookupEntryPtr(keyword, recursive);
if (ePtr == NULL) if (entryPtr == NULL)
{ {
// If keyword not found print error message ...
FatalIOErrorIn FatalIOErrorIn
( (
"dictionary::lookupEntry(const word& keyword) const", "dictionary::lookupEntry(const word& keyword) const",
@ -284,23 +215,25 @@ const Foam::entry& Foam::dictionary::lookupEntry
<< exit(FatalIOError); << exit(FatalIOError);
} }
return *ePtr; return *entryPtr;
} }
Foam::ITstream& Foam::dictionary::lookup Foam::ITstream& Foam::dictionary::lookup
( (
const word& keyword, const word& keyword,
bool recusive bool recursive
) const ) const
{ {
return lookupEntry(keyword, recusive).stream(); return lookupEntry(keyword, recursive).stream();
} }
bool Foam::dictionary::isDict(const word& keyword) const bool Foam::dictionary::isDict(const word& keyword) const
{ {
if (const entry* entryPtr = lookupEntryPtr(keyword)) const entry* entryPtr = lookupEntryPtr(keyword);
if (entryPtr)
{ {
return entryPtr->isDict(); return entryPtr->isDict();
} }
@ -313,7 +246,9 @@ bool Foam::dictionary::isDict(const word& keyword) const
const Foam::dictionary* Foam::dictionary::subDictPtr(const word& keyword) const const Foam::dictionary* Foam::dictionary::subDictPtr(const word& keyword) const
{ {
if (const entry* entryPtr = lookupEntryPtr(keyword)) const entry* entryPtr = lookupEntryPtr(keyword);
if (entryPtr)
{ {
return &entryPtr->dict(); return &entryPtr->dict();
} }
@ -326,13 +261,9 @@ const Foam::dictionary* Foam::dictionary::subDictPtr(const word& keyword) const
const Foam::dictionary& Foam::dictionary::subDict(const word& keyword) const const Foam::dictionary& Foam::dictionary::subDict(const word& keyword) const
{ {
if (const entry* entryPtr = lookupEntryPtr(keyword)) const entry* entryPtr = lookupEntryPtr(keyword);
if (entryPtr == NULL)
{ {
return entryPtr->dict();
}
else
{
// If keyword not found print error message ...
FatalIOErrorIn FatalIOErrorIn
( (
"dictionary::subDict(const word& keyword) const", "dictionary::subDict(const word& keyword) const",
@ -340,37 +271,31 @@ const Foam::dictionary& Foam::dictionary::subDict(const word& keyword) const
) << " keyword " << keyword << " is undefined in dictionary " ) << " keyword " << keyword << " is undefined in dictionary "
<< name() << name()
<< exit(FatalIOError); << exit(FatalIOError);
return entryPtr->dict();
} }
return entryPtr->dict();
} }
Foam::dictionary& Foam::dictionary::subDict(const word& keyword) Foam::dictionary& Foam::dictionary::subDict(const word& keyword)
{ {
if (entry* entryPtr = lookupEntryPtr(keyword)) entry* entryPtr = lookupEntryPtr(keyword);
if (entryPtr == NULL)
{ {
return entryPtr->dict();
}
else
{
// If keyword not found print error message ...
FatalIOErrorIn FatalIOErrorIn
( (
"dictionary::subDict(const word& keyword) const", "dictionary::subDict(const word& keyword)",
*this *this
) << " keyword " << keyword << " is undefined in dictionary " ) << " keyword " << keyword << " is undefined in dictionary "
<< name() << name()
<< exit(FatalIOError); << exit(FatalIOError);
return entryPtr->dict();
} }
return entryPtr->dict();
} }
Foam::wordList Foam::dictionary::toc() const Foam::wordList Foam::dictionary::toc() const
{ {
wordList keywords(size()); wordList keys(size());
label i = 0; label i = 0;
for for
@ -380,56 +305,124 @@ Foam::wordList Foam::dictionary::toc() const
++iter ++iter
) )
{ {
keywords[i++] = iter().keyword(); keys[i++] = iter().keyword();
} }
return keywords; return keys;
} }
void Foam::dictionary::add(const entry& e) bool Foam::dictionary::add(entry* entryPtr, bool mergeEntry)
{ {
add(e.clone(*this).ptr()); HashTable<entry*>::iterator iter = hashedEntries_.find(entryPtr->keyword());
if (mergeEntry && iter != hashedEntries_.end())
{
// merge dictionary with dictionary
if (iter()->isDict() && entryPtr->isDict())
{
iter()->dict().merge(entryPtr->dict());
delete entryPtr;
return true;
}
else
{
// replace existing dictionary with entry or vice versa
IDLList<entry>::replace(iter(), entryPtr);
delete iter();
hashedEntries_.erase(iter);
if (hashedEntries_.insert(entryPtr->keyword(), entryPtr))
{
entryPtr->name() = name_ + "::" + entryPtr->keyword();
return true;
}
else
{
IOWarningIn("dictionary::add(entry*)", (*this))
<< "problem replacing entry "<< entryPtr->keyword()
<< " in dictionary " << name() << endl;
IDLList<entry>::remove(entryPtr);
delete entryPtr;
return false;
}
}
}
if (hashedEntries_.insert(entryPtr->keyword(), entryPtr))
{
entryPtr->name() = name_ + "::" + entryPtr->keyword();
IDLList<entry>::append(entryPtr);
return true;
}
else
{
IOWarningIn("dictionary::add(entry* entryPtr)", (*this))
<< "attempt to add entry "<< entryPtr->keyword()
<< " which already exists in dictionary " << name()
<< endl;
delete entryPtr;
return false;
}
} }
void Foam::dictionary::add(const word& keyword, const token& t)
void Foam::dictionary::add(const entry& e, bool mergeEntry)
{ {
add(new primitiveEntry(keyword, t)); add(e.clone(*this).ptr(), mergeEntry);
} }
void Foam::dictionary::add(const word& keyword, const word& w) void Foam::dictionary::add(const word& k, const word& w, bool overwrite)
{ {
add(new primitiveEntry(keyword, token(w))); add(new primitiveEntry(k, token(w)), overwrite);
} }
void Foam::dictionary::add(const word& keyword, const Foam::string& s) void Foam::dictionary::add(const word& k, const Foam::string& s, bool overwrite)
{ {
add(new primitiveEntry(keyword, token(s))); add(new primitiveEntry(k, token(s)), overwrite);
} }
void Foam::dictionary::add(const word& keyword, const label l) void Foam::dictionary::add(const word& k, const label l, bool overwrite)
{ {
add(new primitiveEntry(keyword, token(l))); add(new primitiveEntry(k, token(l)), overwrite);
} }
void Foam::dictionary::add(const word& keyword, const scalar s) void Foam::dictionary::add(const word& k, const scalar s, bool overwrite)
{ {
add(new primitiveEntry(keyword, token(s))); add(new primitiveEntry(k, token(s)), overwrite);
} }
void Foam::dictionary::add(const word& keyword, const ITstream& tokens) void Foam::dictionary::add(const word& k, const dictionary& d, bool mergeEntry)
{ {
add(new primitiveEntry(keyword, tokens)); add(new dictionaryEntry(k, *this, d), mergeEntry);
} }
void Foam::dictionary::add(const word& keyword, const tokenList& tokens)
void Foam::dictionary::set(entry* entryPtr)
{ {
add(new primitiveEntry(keyword, tokens)); entry* existingPtr = lookupEntryPtr(entryPtr->keyword());
// clear dictionary so merge acts like overwrite
if (existingPtr && existingPtr->isDict())
{
existingPtr->dict().clear();
}
add(entryPtr, true);
} }
void Foam::dictionary::add(const word& keyword, const dictionary& dict)
void Foam::dictionary::set(const entry& e)
{ {
add(new dictionaryEntry(keyword, *this, dict)); set(e.clone(*this).ptr());
}
void Foam::dictionary::set(const word& k, const dictionary& d)
{
set(new dictionaryEntry(k, *this, d));
} }
@ -486,7 +479,10 @@ bool Foam::dictionary::changeKeyword
} }
else else
{ {
// could issue warning if desired WarningIn("dictionary::changeKeyword(const word& old, const word& new)")
<< "cannot rename keyword "<< oldKeyword
<< " to existing keyword " << newKeyword
<< " in dictionary " << name() << endl;
return false; return false;
} }
} }
@ -527,34 +523,24 @@ bool Foam::dictionary::merge(const dictionary& dict)
if (iter2 != hashedEntries_.end()) if (iter2 != hashedEntries_.end())
{ {
// Recursively merge sub-dictionaries // Recursively merge sub-dictionaries
// TODO: merge without copying
if (iter2()->isDict() && iter().isDict()) if (iter2()->isDict() && iter().isDict())
{ {
// without copying and without remove/add? if (iter2()->dict().merge(iter().dict()))
// this certainly looks ugly and doesn't necessarily
// retain the original sort order (perhaps nice to have)
if
(
iter2()->dict().merge(iter().dict())
)
{ {
changed = true; changed = true;
} }
} }
else else
{ {
#ifdef DICTIONARY_INPLACE_MERGE
add(iter().clone(*this).ptr(), true); add(iter().clone(*this).ptr(), true);
#else
remove(keyword);
add(iter().clone(*this)());
#endif
changed = true; changed = true;
} }
} }
else else
{ {
// not found - just add // not found - just add
add(iter().clone(*this)()); add(iter().clone(*this).ptr());
changed = true; changed = true;
} }
} }
@ -588,8 +574,8 @@ void Foam::dictionary::operator=(const dictionary& dict)
<< abort(FatalError); << abort(FatalError);
} }
// Clear the current entries name_ = dict.name();
IDLList<entry>::clear(); clear();
// Create clones of the entries in the given dictionary // Create clones of the entries in the given dictionary
// resetting the parentDict to this dictionary // resetting the parentDict to this dictionary
@ -603,10 +589,6 @@ void Foam::dictionary::operator=(const dictionary& dict)
IDLList<entry>::append(iter().clone(*this).ptr()); IDLList<entry>::append(iter().clone(*this).ptr());
} }
name_ = dict.name();
hashedEntries_.clear();
for for
( (
IDLList<entry>::iterator iter = begin(); IDLList<entry>::iterator iter = begin();
@ -636,7 +618,7 @@ void Foam::dictionary::operator+=(const dictionary& dict)
++iter ++iter
) )
{ {
add(iter().clone(*this)()); add(iter().clone(*this).ptr());
} }
} }
@ -660,7 +642,7 @@ void Foam::dictionary::operator|=(const dictionary& dict)
{ {
if (!found(iter().keyword())) if (!found(iter().keyword()))
{ {
add(iter().clone(*this)()); add(iter().clone(*this).ptr());
} }
} }
} }
@ -683,8 +665,7 @@ void Foam::dictionary::operator<<=(const dictionary& dict)
++iter ++iter
) )
{ {
remove(iter().keyword()); set(iter().clone(*this).ptr());
add(iter().clone(*this)());
} }
} }

View File

@ -31,8 +31,12 @@ Description
The dictionary class is the base class for IOdictionary. The dictionary class is the base class for IOdictionary.
It serves the purpose of a bootstrap dictionary for the objectRegistry It serves the purpose of a bootstrap dictionary for the objectRegistry
data dictionaries, since unlike the IOdictionary class, it does not use a data dictionaries, since unlike the IOdictionary class, it does not use
objectRegistry itself to work. a objectRegistry itself to work.
ToDo
A merge() member function with a non-const dictionary parameter.
This would avoid unnecessary cloning in the add(entry*,bool) method
SourceFiles SourceFiles
dictionary.C dictionary.C
@ -171,31 +175,31 @@ public:
// Search and lookup // Search and lookup
//- Search dictionary for given keyword //- Search dictionary for given keyword
// If recusive search parent dictionaries // If recursive search parent dictionaries
bool found(const word& keyword, bool recusive=false) const; bool found(const word& keyword, bool recursive=false) const;
//- Find and return an entry data stream pointer if present //- Find and return an entry data stream pointer if present
// otherwise return NULL. // otherwise return NULL.
// If recusive search parent dictionaries // If recursive search parent dictionaries
const entry* lookupEntryPtr(const word&, bool recusive=false) const; const entry* lookupEntryPtr(const word&, bool recursive=false) const;
//- Find and return an entry data stream pointer for manipulation //- Find and return an entry data stream pointer for manipulation
// if present otherwise return NULL. // if present otherwise return NULL.
// If recusive search parent dictionaries // If recursive search parent dictionaries
entry* lookupEntryPtr(const word&, bool recusive=false); entry* lookupEntryPtr(const word&, bool recursive=false);
//- Find and return an entry data stream if present otherwise error. //- Find and return an entry data stream if present otherwise error.
// If recusive search parent dictionaries // If recursive search parent dictionaries
const entry& lookupEntry(const word&, bool recusive=false) const; const entry& lookupEntry(const word&, bool recursive=false) const;
//- Find and return an entry data stream //- Find and return an entry data stream
// If recusive search parent dictionaries // If recursive search parent dictionaries
ITstream& lookup(const word&, bool recusive=false) const; ITstream& lookup(const word&, bool recursive=false) const;
//- Find and return a T, if not found return the given default value //- Find and return a T, if not found return the given default value
// If recusive search parent dictionaries // If recursive search parent dictionaries
template<class T> template<class T>
T lookupOrDefault(const word&, const T&, bool recusive=false) const; T lookupOrDefault(const word&, const T&, bool recursive=false) const;
//- Find and return a T, if not found return the given default value, //- Find and return a T, if not found return the given default value,
// and add to dictionary. If recusive search parent dictionaries // and add to dictionary. If recusive search parent dictionaries
@ -236,38 +240,57 @@ public:
// Editing // Editing
//- Add a new entry //- Add a new entry
bool add(entry*, bool mergeEntry = false); // With the merge option, dictionaries are interwoven and
// primitive entries are overwritten
bool add(entry*, bool mergeEntry=false);
//- Add an entry //- Add an entry
void add(const entry&); // With the merge option, dictionaries are interwoven and
// primitive entries are overwritten
//- Add a token entry void add(const entry&, bool mergeEntry=false);
void add(const word& keyword, const token&);
//- Add a word entry //- Add a word entry
void add(const word& keyword, const word&); // optionally overwrite an existing entry
void add(const word& keyword, const word&, bool overwrite=false);
//- Add a string entry //- Add a string entry
void add(const word& keyword, const string&); // optionally overwrite an existing entry
void add(const word& keyword, const string&, bool overwrite=false);
//- Add a label entry //- Add a label entry
void add(const word& keyword, const label); // optionally overwrite an existing entry
void add(const word& keyword, const label, bool overwrite=false);
//- Add a scalar entry //- Add a scalar entry
void add(const word& keyword, const scalar); // optionally overwrite an existing entry
void add (const word& keyword, const scalar, bool overwrite=false);
//- Add an entry constructed from a ITstream
void add(const word& keyword, const ITstream&);
//- Add an entry constructed from a tokenList
void add(const word& keyword, const tokenList& tokens);
//- Add a T entry
template<class T>
void add(const word& keyword, const T&);
//- Add a dictionary entry //- Add a dictionary entry
void add(const word& keyword, const dictionary&); // optionally merge with an existing sub-dictionary
void add
(
const word& keyword,
const dictionary&,
bool mergeEntry=false
);
//- Add a T entry
// optionally overwrite an existing entry
template<class T>
void add(const word& keyword, const T&, bool overwrite=false);
//- Assign a new entry, overwrite any existing entry
void set(entry*);
//- Assign a new entry, overwrite any existing entry
void set(const entry&);
//- Assign a dictionary entry, overwrite any existing entry
void set(const word& keyword, const dictionary&);
//- Assign a T entry, overwrite any existing entry
template<class T>
void set(const word& keyword, const T&);
//- Remove an entry specified by keyword //- Remove an entry specified by keyword
bool remove(const word& keyword); bool remove(const word& keyword);
@ -326,14 +349,12 @@ public:
// Global Operators // Global Operators
// Combine dictionaries starting from the entries in dict one and then including //- Combine dictionaries starting from the entries in dict1 and then including those from dict2.
// those from dict2. // Warn, but do not overwrite the entries from dict1.
// Warn, but do not overwrite the entries from dict1.
dictionary operator+(const dictionary& dict1, const dictionary& dict2); dictionary operator+(const dictionary& dict1, const dictionary& dict2);
// Combine dictionaries starting from the entries in dict one and then including //- Combine dictionaries starting from the entries in dict1 and then including those from dict2.
// those from dict2. // Do not overwrite the entries from dict1.
// Do not overwrite the entries from dict1.
dictionary operator|(const dictionary& dict1, const dictionary& dict2); dictionary operator|(const dictionary& dict1, const dictionary& dict2);

View File

@ -33,19 +33,19 @@ template<class T>
T Foam::dictionary::lookupOrDefault T Foam::dictionary::lookupOrDefault
( (
const word& keyword, const word& keyword,
const T& deft, const T& deflt,
bool recusive bool recursive
) const ) const
{ {
const entry* ePtr = lookupEntryPtr(keyword, recusive); const entry* entryPtr = lookupEntryPtr(keyword, recursive);
if (ePtr == NULL) if (entryPtr == NULL)
{ {
return deft; return deflt;
} }
else else
{ {
return pTraits<T>(ePtr->stream()); return pTraits<T>(entryPtr->stream());
} }
} }
@ -93,12 +93,16 @@ void Foam::dictionary::readIfPresent
template<class T> template<class T>
void Foam::dictionary::add(const word& keyword, const T& t) void Foam::dictionary::add(const word& k, const T& t, bool overwrite)
{ {
entry* ePtr = new primitiveEntry(keyword, t); add(new primitiveEntry(k, t), overwrite);
append(ePtr);
hashedEntries_.insert(ePtr->keyword(), ePtr);
} }
template<class T>
void Foam::dictionary::set(const word& k, const T& t)
{
set(new primitiveEntry(k, t));
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -96,7 +96,7 @@ bool Foam::entry::New(dictionary& parentDict, Istream& is)
if (keyword[0] == '#') // ... Function entry if (keyword[0] == '#') // ... Function entry
{ {
word functionName = keyword(1, keyword.size()-1); word functionName = keyword(1, keyword.size()-1);
return functionEntry::insert(functionName, parentDict, is); return functionEntry::execute(functionName, parentDict, is);
} }
else if (keyword[0] == '$') // ... Substitution entry else if (keyword[0] == '$') // ... Substitution entry
{ {
@ -105,7 +105,7 @@ bool Foam::entry::New(dictionary& parentDict, Istream& is)
} }
else if (keyword == "include") // ... For backward compatibility else if (keyword == "include") // ... For backward compatibility
{ {
return functionEntries::includeEntry::insert(parentDict, is); return functionEntries::includeEntry::execute(parentDict, is);
} }
else // ... Data entries else // ... Data entries
{ {
@ -114,12 +114,18 @@ bool Foam::entry::New(dictionary& parentDict, Istream& is)
// Deal with duplicate entries // Deal with duplicate entries
bool mergeEntry = false; bool mergeEntry = false;
if (parentDict.found(keyword))
entry* existingPtr = parentDict.lookupEntryPtr(keyword);
if (existingPtr)
{ {
if (functionEntries::inputModeEntry::overwrite()) if (functionEntries::inputModeEntry::overwrite())
{ {
// silently drop previous entries // clear dictionary so merge acts like overwrite
parentDict.remove(keyword); if (existingPtr->isDict())
{
existingPtr->dict().clear();
}
mergeEntry = true;
} }
else if (functionEntries::inputModeEntry::merge()) else if (functionEntries::inputModeEntry::merge())
{ {

View File

@ -33,22 +33,66 @@ namespace Foam
defineMemberFunctionSelectionTable defineMemberFunctionSelectionTable
( (
functionEntry, functionEntry,
insert, execute,
primitiveEntryIstream dictionaryIstream
); );
defineMemberFunctionSelectionTable defineMemberFunctionSelectionTable
( (
functionEntry, functionEntry,
insert, execute,
dictionaryIstream primitiveEntryIstream
); );
} }
// * * * * * * * * * * * * Member Function Selectors * * * * * * * * * * * * // // * * * * * * * * * * * * Member Function Selectors * * * * * * * * * * * * //
bool Foam::functionEntry::insert bool Foam::functionEntry::execute
(
const word& functionName,
dictionary& parentDict,
Istream& is
)
{
is.fatalCheck
(
"functionEntry::execute"
"(const word& functionName, dictionary& parentDict, Istream& is)"
);
if (!executedictionaryIstreamMemberFunctionTablePtr_)
{
cerr<<"functionEntry::execute"
<< "(const word&, dictionary&, Istream&)"
<< " not yet initialized, function = "
<< functionName.c_str() << std::endl;
// Return true to keep reading
return true;
}
executedictionaryIstreamMemberFunctionTable::iterator mfIter =
executedictionaryIstreamMemberFunctionTablePtr_->find(functionName);
if (mfIter == executedictionaryIstreamMemberFunctionTablePtr_->end())
{
FatalErrorIn
(
"functionEntry::execute"
"(const word& functionName, dictionary& parentDict, Istream&)"
) << "Unknown functionEntry " << functionName
<< endl << endl
<< "Valid functionEntries are :" << endl
<< executedictionaryIstreamMemberFunctionTablePtr_->toc()
<< exit(FatalError);
}
return mfIter()(parentDict, is);
}
bool Foam::functionEntry::execute
( (
const word& functionName, const word& functionName,
const dictionary& parentDict, const dictionary& parentDict,
@ -58,14 +102,14 @@ bool Foam::functionEntry::insert
{ {
is.fatalCheck is.fatalCheck
( (
"functionEntry::insert" "functionEntry::execute"
"(const word& functionName, const dictionary& parentDict, " "(const word& functionName, const dictionary& parentDict, "
"primitiveEntry& entry, Istream& is)" "primitiveEntry&, Istream&)"
); );
if (!insertprimitiveEntryIstreamMemberFunctionTablePtr_) if (!executeprimitiveEntryIstreamMemberFunctionTablePtr_)
{ {
cerr<<"functionEntry::insert" cerr<<"functionEntry::execute"
<< "(const word&, dictionary&, primitiveEntry&, Istream&)" << "(const word&, dictionary&, primitiveEntry&, Istream&)"
<< " not yet initialized, function = " << " not yet initialized, function = "
<< functionName.c_str() << std::endl; << functionName.c_str() << std::endl;
@ -74,69 +118,24 @@ bool Foam::functionEntry::insert
return true; return true;
} }
insertprimitiveEntryIstreamMemberFunctionTable::iterator mfIter = executeprimitiveEntryIstreamMemberFunctionTable::iterator mfIter =
insertprimitiveEntryIstreamMemberFunctionTablePtr_->find(functionName); executeprimitiveEntryIstreamMemberFunctionTablePtr_->find(functionName);
if (mfIter == insertprimitiveEntryIstreamMemberFunctionTablePtr_->end()) if (mfIter == executeprimitiveEntryIstreamMemberFunctionTablePtr_->end())
{ {
FatalErrorIn FatalErrorIn
( (
"functionEntry::insert" "functionEntry::execute"
"(const word& functionName, const dictionary& parentDict, " "(const word& functionName, const dictionary& parentDict, "
"primitiveEntry& entry, Istream& is)" "primitiveEntry&, Istream&)"
) << "Unknown functionEntry " << functionName ) << "Unknown functionEntry " << functionName
<< endl << endl << endl << endl
<< "Valid functionEntries are :" << endl << "Valid functionEntries are :" << endl
<< insertprimitiveEntryIstreamMemberFunctionTablePtr_->toc() << executeprimitiveEntryIstreamMemberFunctionTablePtr_->toc()
<< exit(FatalError); << exit(FatalError);
} }
return mfIter()(parentDict, entry, is); return mfIter()(parentDict, entry, is);
} }
bool Foam::functionEntry::insert
(
const word& functionName,
dictionary& parentDict,
Istream& is
)
{
is.fatalCheck
(
"functionEntry::insert"
"(const word& functionName, dictionary& parentDict, Istream& is)"
);
if (!insertdictionaryIstreamMemberFunctionTablePtr_)
{
cerr<<"functionEntry::insert"
<< "(const word&, dictionary&, Istream&)"
<< " not yet initialized, function = "
<< functionName.c_str() << std::endl;
// Return true to keep reading
return true;
}
insertdictionaryIstreamMemberFunctionTable::iterator mfIter =
insertdictionaryIstreamMemberFunctionTablePtr_->find(functionName);
if (mfIter == insertdictionaryIstreamMemberFunctionTablePtr_->end())
{
FatalErrorIn
(
"functionEntry::insert"
"(const word& functionName, dictionary& parentDict, Istream& is)"
) << "Unknown functionEntry " << functionName
<< endl << endl
<< "Valid functionEntries are :" << endl
<< insertdictionaryIstreamMemberFunctionTablePtr_->toc()
<< exit(FatalError);
}
return mfIter()(parentDict, is);
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -33,13 +33,10 @@ Class
Foam::functionEntry Foam::functionEntry
Description Description
A function entry causes entries to be added/manipulated on the specified A functionEntry causes entries to be added/manipulated on the specified
dictionary given an input stream. dictionary given an input stream.
In dictionaries, a @c \# sigil is typically used for a functionEntry. In dictionaries, a @c '\#' sigil is typically used for a functionEntry.
See Also
functionEntries::includeEntry and functionEntries::inputModeEntry
SourceFiles SourceFiles
functionEntry.C functionEntry.C
@ -84,7 +81,28 @@ public:
( (
bool, bool,
functionEntry, functionEntry,
insert, execute,
dictionaryIstream,
(
dictionary& parentDict,
Istream& is
),
(parentDict, is)
);
//- Execute the functionEntry in a sub-dict context
static bool execute
(
const word& functionName,
dictionary& parentDict,
Istream& is
);
declareMemberFunctionSelectionTable
(
bool,
functionEntry,
execute,
primitiveEntryIstream, primitiveEntryIstream,
( (
const dictionary& parentDict, const dictionary& parentDict,
@ -94,7 +112,8 @@ public:
(parentDict, entry, is) (parentDict, entry, is)
); );
static bool insert //- Execute the functionEntry in a primitiveEntry context
static bool execute
( (
const word& functionName, const word& functionName,
const dictionary& parentDict, const dictionary& parentDict,
@ -103,25 +122,6 @@ public:
); );
declareMemberFunctionSelectionTable
(
bool,
functionEntry,
insert,
dictionaryIstream,
(
dictionary& parentDict,
Istream& is
),
(parentDict, is)
);
static bool insert
(
const word& functionName,
dictionary& parentDict,
Istream& is
);
}; };

View File

@ -48,16 +48,16 @@ namespace functionEntries
( (
functionEntry, functionEntry,
includeEntry, includeEntry,
insert, execute,
primitiveEntryIstream dictionaryIstream
); );
addToMemberFunctionSelectionTable addToMemberFunctionSelectionTable
( (
functionEntry, functionEntry,
includeEntry, includeEntry,
insert, execute,
dictionaryIstream primitiveEntryIstream
); );
} }
} }
@ -82,7 +82,35 @@ Foam::fileName Foam::functionEntries::includeEntry::includeFileName
} }
bool Foam::functionEntries::includeEntry::insert bool Foam::functionEntries::includeEntry::execute
(
dictionary& parentDict,
Istream& is
)
{
IFstream fileStream(includeFileName(is));
if (fileStream)
{
parentDict.read(fileStream);
return true;
}
else
{
FatalIOErrorIn
(
"functionEntries::includeEntry::includeEntry"
"(dictionary& parentDict,Istream& is)",
is
) << "Cannot open include file " << fileStream.name()
<< " while reading dictionary " << parentDict.name()
<< exit(FatalIOError);
return false;
}
}
bool Foam::functionEntries::includeEntry::execute
( (
const dictionary& parentDict, const dictionary& parentDict,
primitiveEntry& entry, primitiveEntry& entry,
@ -111,34 +139,4 @@ bool Foam::functionEntries::includeEntry::insert
} }
} }
bool Foam::functionEntries::includeEntry::insert
(
dictionary& parentDict,
Istream& is
)
{
IFstream fileStream(includeFileName(is));
if (fileStream)
{
parentDict.read(fileStream);
return true;
}
else
{
FatalIOErrorIn
(
"functionEntries::includeEntry::includeEntry"
"(dictionary& parentDict,Istream& is)",
is
) << "Cannot open include file " << fileStream.name()
<< " while reading dictionary " << parentDict.name()
<< exit(FatalIOError);
return false;
}
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -29,9 +29,9 @@ Description
Specify an include file when reading dictionaries, expects a Specify an include file when reading dictionaries, expects a
single string to follow. single string to follow.
An example of @c \#include directive: An example of the @c \#include directive:
@verbatim @verbatim
\#include "includefile" #include "includeFile"
@endverbatim @endverbatim
The usual expansion of environment variables and other constructs (eg, The usual expansion of environment variables and other constructs (eg,
@ -85,18 +85,21 @@ public:
// Member Functions // Member Functions
static bool insert //- Execute the functionEntry in a sub-dict context
static bool execute
(
dictionary& parentDict,
Istream& is
);
//- Execute the functionEntry in a primitiveEntry context
static bool execute
( (
const dictionary& parentDict, const dictionary& parentDict,
primitiveEntry& entry, primitiveEntry& entry,
Istream& is Istream& is
); );
static bool insert
(
dictionary& parentDict,
Istream& is
);
}; };

View File

@ -47,15 +47,7 @@ namespace functionEntries
( (
functionEntry, functionEntry,
inputModeEntry, inputModeEntry,
insert, execute,
primitiveEntryIstream
);
addToMemberFunctionSelectionTable
(
functionEntry,
inputModeEntry,
insert,
dictionaryIstream dictionaryIstream
); );
} }
@ -63,10 +55,11 @@ namespace functionEntries
// * * * * * * * * * * * * * * * * Private Data * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Private Data * * * * * * * * * * * * * * //
Foam::label Foam::functionEntries::inputModeEntry::inputMode_ = imError; Foam::label Foam::functionEntries::inputModeEntry::mode_ = imError;
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// we could combine this into execute() directly, but leave it here for now
void Foam::functionEntries::inputModeEntry::setMode(Istream& is) void Foam::functionEntries::inputModeEntry::setMode(Istream& is)
{ {
clear(); clear();
@ -74,15 +67,15 @@ void Foam::functionEntries::inputModeEntry::setMode(Istream& is)
word mode(is); word mode(is);
if (mode == "merge") if (mode == "merge")
{ {
inputMode_ = imMerge; mode_ = imMerge;
} }
else if (mode == "overwrite") else if (mode == "overwrite")
{ {
inputMode_ = imOverwrite; mode_ = imOverwrite;
} }
else if (mode == "error" || mode == "default") else if (mode == "error" || mode == "default")
{ {
inputMode_ = imError; mode_ = imError;
} }
else else
{ {
@ -95,19 +88,7 @@ void Foam::functionEntries::inputModeEntry::setMode(Istream& is)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionEntries::inputModeEntry::insert bool Foam::functionEntries::inputModeEntry::execute
(
const dictionary& parentDict,
primitiveEntry& entry,
Istream& is
)
{
setMode(is);
return true;
}
bool Foam::functionEntries::inputModeEntry::insert
( (
dictionary& parentDict, dictionary& parentDict,
Istream& is Istream& is
@ -120,13 +101,13 @@ bool Foam::functionEntries::inputModeEntry::insert
void Foam::functionEntries::inputModeEntry::clear() void Foam::functionEntries::inputModeEntry::clear()
{ {
inputMode_ = imError; mode_ = imError;
} }
bool Foam::functionEntries::inputModeEntry::merge() bool Foam::functionEntries::inputModeEntry::merge()
{ {
if (inputMode_ & imMerge) if (mode_ & imMerge)
{ {
return true; return true;
} }
@ -139,7 +120,7 @@ bool Foam::functionEntries::inputModeEntry::merge()
bool Foam::functionEntries::inputModeEntry::overwrite() bool Foam::functionEntries::inputModeEntry::overwrite()
{ {
if (inputMode_ & imOverwrite) if (mode_ & imOverwrite)
{ {
return true; return true;
} }

View File

@ -74,11 +74,12 @@ class inputModeEntry
}; };
//- current input mode //- current input mode
static label inputMode_; static label mode_;
// Private Member Functions // Private Member Functions
//- Read the mode as a word and set enum appropriately
static void setMode(Istream&); static void setMode(Istream&);
//- Disallow default bitwise copy construct //- Disallow default bitwise copy construct
@ -96,23 +97,20 @@ public:
// Member Functions // Member Functions
static bool insert //- Execute the functionEntry in a sub-dict context
( static bool execute
const dictionary& parentDict,
primitiveEntry&,
Istream&
);
static bool insert
( (
dictionary& parentDict, dictionary& parentDict,
Istream& Istream&
); );
//- Reset the inputMode to 'default'
static void clear(); static void clear();
//- Return true if the inputMode is 'merge'
static bool merge(); static bool merge();
//- Return true if the inputMode is 'overwrite'
static bool overwrite(); static bool overwrite();
}; };

View File

@ -0,0 +1,88 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "removeEntry.H"
#include "dictionary.H"
#include "IStringStream.H"
#include "OStringStream.H"
#include "addToMemberFunctionSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
const Foam::word Foam::functionEntries::removeEntry::typeName
(
Foam::functionEntries::removeEntry::typeName_()
);
// Don't lookup the debug switch here as the debug switch dictionary
// might include removeEntry
int Foam::functionEntries::removeEntry::debug(0);
namespace Foam
{
namespace functionEntries
{
addToMemberFunctionSelectionTable
(
functionEntry,
removeEntry,
execute,
dictionaryIstream
);
}
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionEntries::removeEntry::execute
(
dictionary& parentDict,
Istream& is
)
{
token currToken(is);
is.putBack(currToken);
if (currToken == token::BEGIN_LIST)
{
wordList keys(is);
forAll(keys, keyI)
{
parentDict.remove(keys[keyI]);
}
}
else
{
word key(is);
parentDict.remove(key);
}
return true;
}
// ************************************************************************* //

View File

@ -0,0 +1,100 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class
Foam::functionEntries::removeEntry
Description
Remove a dictionary entry.
The @c \#remove directive takes a word or a list of words. For example,
@verbatim
#remove entry0
#remove ( entry1 entry2 entry3 )
@endverbatim
The removable only occurs in the current context.
Removing sub-entries or parent entries is not supported.
SourceFiles
removeEntry.C
\*---------------------------------------------------------------------------*/
#ifndef removeEntry_H
#define removeEntry_H
#include "functionEntry.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace functionEntries
{
/*---------------------------------------------------------------------------*\
Class removeEntry Declaration
\*---------------------------------------------------------------------------*/
class removeEntry
:
public functionEntry
{
// Private Member Functions
//- Disallow default bitwise copy construct
removeEntry(const removeEntry&);
//- Disallow default bitwise assignment
void operator=(const removeEntry&);
public:
//- Runtime type information
TypeName("remove");
// Member Functions
//- Execute the functionEntry in a sub-dict context
static bool execute
(
dictionary& parentDict,
Istream& is
);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace functionEntries
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -115,7 +115,7 @@ bool Foam::primitiveEntry::expandFunction
) )
{ {
word functionName = keyword(1, keyword.size()-1); word functionName = keyword(1, keyword.size()-1);
return functionEntry::insert(functionName, parentDict, *this, is); return functionEntry::execute(functionName, parentDict, *this, is);
} }

View File

@ -186,7 +186,7 @@ Foam::argList::argList
// Print the banner once only for parallel runs // Print the banner once only for parallel runs
if (Pstream::master()) if (Pstream::master())
{ {
IOobject::writeLogBanner(Info); IOobject::writeBanner(Info, true);
} }
// convert argv -> args_ and capture ( ... ) lists // convert argv -> args_ and capture ( ... ) lists
@ -252,19 +252,30 @@ Foam::argList::argList
args_.setSize(nArgs); args_.setSize(nArgs);
// Help options: // Help/documentation options:
// -doc display the documentation in browser // -help print the usage
// -help print the usage // -doc display application documentation in browser
if (options_.found("doc") || options_.found("help")) // -srcDoc display source code in browser
if
(
options_.found("help")
|| options_.found("doc")
|| options_.found("srcDoc")
)
{ {
if (options_.found("help")) if (options_.found("help"))
{ {
printUsage(); printUsage();
} }
if (options_.found("doc")) // only display one or the other
if (options_.found("srcDoc"))
{ {
displayDoc(); displayDoc(true);
}
else if (options_.found("doc"))
{
displayDoc(false);
} }
::exit(0); ::exit(0);
@ -578,12 +589,9 @@ void Foam::argList::printUsage() const
++iter ++iter
) )
{ {
Info<< ' ' << '<' << iter().c_str() << '>'; Info<< " <" << iter().c_str() << '>';
} }
// place -doc and -help up front
Info<< " [-doc] [-help]";
for for
( (
HashTable<string>::iterator iter = validOptions.begin(); HashTable<string>::iterator iter = validOptions.begin();
@ -601,16 +609,27 @@ void Foam::argList::printUsage() const
Info<< ']'; Info<< ']';
} }
Info<< endl; // place help/doc options of the way at the end,
// but with an extra space to separate it a little
Info<< " [-help] [-doc] [-srcDoc]" << endl;
} }
void Foam::argList::displayDoc() const void Foam::argList::displayDoc(bool source) const
{ {
const dictionary& docDict = debug::controlDict().subDict("Documentation"); const dictionary& docDict = debug::controlDict().subDict("Documentation");
List<fileName> docDirs(docDict.lookup("doxyDocDirs")); List<fileName> docDirs(docDict.lookup("doxyDocDirs"));
List<fileName> docExts(docDict.lookup("doxySourceFileExts")); List<fileName> docExts(docDict.lookup("doxySourceFileExts"));
// for source code: change foo_8C.html to foo_8C-source.html
if (source)
{
forAll(docExts, extI)
{
docExts[extI].replace(".", "-source.");
}
}
fileName docFile; fileName docFile;
bool found = false; bool found = false;
@ -618,7 +637,7 @@ void Foam::argList::displayDoc() const
{ {
forAll(docExts, extI) forAll(docExts, extI)
{ {
docFile = docDirs[dirI]/executable() + docExts[extI]; docFile = docDirs[dirI]/executable_ + docExts[extI];
docFile.expand(); docFile.expand();
if (exists(docFile)) if (exists(docFile))

View File

@ -27,18 +27,18 @@ Class
Description Description
Extract command arguments and options from the supplied Extract command arguments and options from the supplied
@a argc and @a argv. @a argc and @a argv parameters.
Sequences with "(" ... ")" are transformed into a stringList. Sequences with "(" ... ")" are transformed into a stringList.
For example, For example,
@verbatim @verbatim
program -listFiles \( *.txt \) program -listFiles \( *.txt \)
@endverbatim @endverbatim
in which the backslash-escaping has been used to avoid shell expansions,
would create a stringList: would create a stringList:
@verbatim @verbatim
( "file1.txt" "file2.txt" ... "fileN.txt" ) ( "file1.txt" "file2.txt" ... "fileN.txt" )
@endverbatim @endverbatim
The backslash-escaping has been used to avoid shell expansions.
@par Default command-line options @par Default command-line options
@param -case \<dir\> \n @param -case \<dir\> \n
@ -47,6 +47,8 @@ Description
specify case as a parallel job specify case as a parallel job
@param -doc \n @param -doc \n
display the documentation in browser display the documentation in browser
@param -srcDoc \n
display the source documentation in browser
@param -help \n @param -help \n
print the usage print the usage
@ -130,14 +132,14 @@ public:
//- A list of valid parallel options //- A list of valid parallel options
static HashTable<string> validParOptions; static HashTable<string> validParOptions;
//! @cond ignore documentation for this class //! @cond ignoreDocumentation
class initValidTables class initValidTables
{ {
public: public:
initValidTables(); initValidTables();
}; };
//! @endcond //! @endcond ignoreDocumentation
// Constructors // Constructors
@ -148,8 +150,8 @@ public:
( (
int& argc, int& argc,
char**& argv, char**& argv,
bool checkArgs = true, bool checkArgs=true,
bool checkOpts = true bool checkOpts=true
); );
@ -196,8 +198,7 @@ public:
return globalCase_; return globalCase_;
} }
//- Return case name for parallel run //- Return case name for parallel run or the global case for a serial run
// or the global case for a serial run
const fileName& caseName() const const fileName& caseName() const
{ {
return case_; return case_;
@ -222,13 +223,14 @@ public:
void printUsage() const; void printUsage() const;
//- Display documentation in browser //- Display documentation in browser
void displayDoc() const; // Optionally display the application source code
void displayDoc(bool source=false) const;
// Check // Check
//- Check argument list //- Check argument list
bool check(bool checkArgs = true, bool checkOpts = true) const; bool check(bool checkArgs=true, bool checkOpts=true) const;
//- Check root path and case path //- Check root path and case path
bool checkRootCase() const; bool checkRootCase() const;

View File

@ -89,8 +89,6 @@ bool chDir(const fileName& dir);
//- Search for @em name in the following hierarchy: //- Search for @em name in the following hierarchy:
// -# personal settings: // -# personal settings:
// - ~/.OpenFOAM-\<VERSION\>
// <em>(old style)</em>
// - ~/.OpenFOAM/\<VERSION\>/ // - ~/.OpenFOAM/\<VERSION\>/
// <em>for version-specific files</em> // <em>for version-specific files</em>
// - ~/.OpenFOAM/ // - ~/.OpenFOAM/

View File

@ -73,8 +73,7 @@ void Foam::processorLduInterface::send
else else
{ {
FatalErrorIn("processorLduInterface::send") FatalErrorIn("processorLduInterface::send")
<< "Unsuported communications type " << "Unsupported communications type " << commsType
<< Pstream::commsTypeNames[commsType]
<< exit(FatalError); << exit(FatalError);
} }
} }
@ -104,8 +103,7 @@ void Foam::processorLduInterface::receive
else else
{ {
FatalErrorIn("processorLduInterface::receive") FatalErrorIn("processorLduInterface::receive")
<< "Unsuported communications type " << "Unsupported communications type " << commsType
<< Pstream::commsTypeNames[commsType]
<< exit(FatalError); << exit(FatalError);
} }
} }
@ -184,8 +182,7 @@ void Foam::processorLduInterface::compressedSend
else else
{ {
FatalErrorIn("processorLduInterface::compressedSend") FatalErrorIn("processorLduInterface::compressedSend")
<< "Unsuported communications type " << "Unsupported communications type " << commsType
<< Pstream::commsTypeNames[commsType]
<< exit(FatalError); << exit(FatalError);
} }
} }
@ -225,8 +222,7 @@ void Foam::processorLduInterface::compressedReceive
else if (commsType != Pstream::nonBlocking) else if (commsType != Pstream::nonBlocking)
{ {
FatalErrorIn("processorLduInterface::compressedReceive") FatalErrorIn("processorLduInterface::compressedReceive")
<< "Unsuported communications type " << "Unsupported communications type " << commsType
<< Pstream::commsTypeNames[commsType]
<< exit(FatalError); << exit(FatalError);
} }

View File

@ -6,6 +6,10 @@ wmake libso dummy
case "$WM_MPLIB" in case "$WM_MPLIB" in
LAM | OPENMPI | MPI | MPICH | MPICH-GM | MPIGAMMA ) LAM | OPENMPI | MPI | MPICH | MPICH-GM | MPIGAMMA )
export WM_OPTIONS=${WM_OPTIONS}$WM_MPLIB export WM_OPTIONS=${WM_OPTIONS}$WM_MPLIB
set +x
echo
echo "Note: ignore spurious warnings about missing mpicxx.h headers"
set -x
wmake libso mpi wmake libso mpi
;; ;;

View File

@ -32,12 +32,9 @@ Description
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
IPstream::IPstream Foam::IPstream::IPstream
( (
const commsTypes commsType, const commsTypes commsType,
const int fromProcNo, const int fromProcNo,
@ -53,13 +50,12 @@ IPstream::IPstream
{ {
notImplemented notImplemented
( (
"IPstream::IPstream" "IPsream::IPstream"
"(" "("
"const commsTypes commsType," "const commsTypes,"
"const int fromProcNo," "const int fromProcNo,"
"const label bufSize," "const label bufSize,"
"streamFormat format," "streamFormat, versionNumber"
"versionNumber version"
")" ")"
); );
} }
@ -67,7 +63,7 @@ IPstream::IPstream
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
int IPstream::read int Foam::IPstream::read
( (
const commsTypes commsType, const commsTypes commsType,
const int fromProcNo, const int fromProcNo,
@ -75,33 +71,32 @@ int IPstream::read
const std::streamsize bufSize const std::streamsize bufSize
) )
{ {
notImplemented notImplemented
( (
"IPstream::read" "IPstream::read"
"(" "("
"const commsTypes commsType," "const commsTypes,"
"const int fromProcNo," "const int fromProcNo,"
"char* buf," "char* buf,"
"const label bufSize" "const label bufSize"
")" ")"
); );
return 0; return 0;
} }
void IPstream::waitRequests() void Foam::IPstream::waitRequests()
{} {}
bool IPstream::finishedRequest(const label) bool Foam::IPstream::finishedRequest(const label)
{ {
notImplemented("IPstream::finishedRequest()"); notImplemented("IPstream::finishedRequest()");
return false;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -32,12 +32,9 @@ Description
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
OPstream::~OPstream() Foam::OPstream::~OPstream()
{ {
notImplemented("OPstream::~OPstream()"); notImplemented("OPstream::~OPstream()");
} }
@ -45,7 +42,7 @@ OPstream::~OPstream()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool OPstream::write bool Foam::OPstream::write
( (
const commsTypes commsType, const commsTypes commsType,
const int toProcNo, const int toProcNo,
@ -68,11 +65,11 @@ bool OPstream::write
} }
void OPstream::waitRequests() void Foam::OPstream::waitRequests()
{} {}
bool OPstream::finishedRequest(const label) bool Foam::OPstream::finishedRequest(const label)
{ {
notImplemented("OPstream::finishedRequest()"); notImplemented("OPstream::finishedRequest()");
return false; return false;
@ -81,6 +78,4 @@ bool OPstream::finishedRequest(const label)
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -29,16 +29,13 @@ License
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void Pstream::addValidParOptions(HashTable<string>& validParOptions) void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{} {}
bool Pstream::init(int& argc, char**& argv) bool Foam::Pstream::init(int& argc, char**& argv)
{ {
FatalErrorIn("Pstream::init(int& argc, char**& argv)") FatalErrorIn("Pstream::init(int& argc, char**& argv)")
<< "Trying to use the dummy Pstream library." << nl << "Trying to use the dummy Pstream library." << nl
@ -49,24 +46,21 @@ bool Pstream::init(int& argc, char**& argv)
} }
void Pstream::exit(int errnum) void Foam::Pstream::exit(int errnum)
{ {
notImplemented("Pstream::exit(int errnum)"); notImplemented("Pstream::exit(int errnum)");
} }
void Pstream::abort() void Foam::Pstream::abort()
{ {
notImplemented("Pstream::abort()"); notImplemented("Pstream::abort()");
} }
void reduce(scalar&, const sumOp<scalar>&) void Foam::reduce(scalar&, const sumOp<scalar>&)
{} {}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -23,7 +23,7 @@ License
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description Description
Write primitive and binary block from OPstream Write primitive and binary block from OPstream gamma-mpi
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -46,8 +46,10 @@ namespace Foam
// Largest message sent so far. This tracks the size of the receive // Largest message sent so far. This tracks the size of the receive
// buffer on the receiving end. Done so we only send out resize messages // buffer on the receiving end. Done so we only send out resize messages
// if nessecary // if necessary
//! @cond fileScope
labelList maxSendSize; labelList maxSendSize;
//! @endcond fileScope
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //

View File

@ -26,7 +26,8 @@ Namespace
Foam::PstreamGlobals Foam::PstreamGlobals
Description Description
Global functions and variables for working with parallel streams. Global functions and variables for working with parallel streams,
but principally for gamma/mpi
SourceFiles SourceFiles
PstreamGlobals.C PstreamGlobals.C

View File

@ -33,18 +33,16 @@ Description
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
// Outstanding non-blocking operations. // Outstanding non-blocking operations.
DynamicList<MPI_Request> IPstream_outstandingRequests_; //! @cond fileScope
Foam::DynamicList<MPI_Request> IPstream_outstandingRequests_;
//! @endcond fileScope
// * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
IPstream::IPstream Foam::IPstream::IPstream
( (
const commsTypes commsType, const commsTypes commsType,
const int fromProcNo, const int fromProcNo,
@ -89,7 +87,7 @@ IPstream::IPstream
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
label IPstream::read Foam::label Foam::IPstream::read
( (
const commsTypes commsType, const commsTypes commsType,
const int fromProcNo, const int fromProcNo,
@ -192,7 +190,7 @@ label IPstream::read
} }
void IPstream::waitRequests() void Foam::IPstream::waitRequests()
{ {
if (IPstream_outstandingRequests_.size() > 0) if (IPstream_outstandingRequests_.size() > 0)
{ {
@ -219,7 +217,7 @@ void IPstream::waitRequests()
} }
bool IPstream::finishedRequest(const label i) bool Foam::IPstream::finishedRequest(const label i)
{ {
if (i >= IPstream_outstandingRequests_.size()) if (i >= IPstream_outstandingRequests_.size())
{ {
@ -244,6 +242,4 @@ bool IPstream::finishedRequest(const label i)
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -31,20 +31,16 @@ Description
#include "OPstream.H" #include "OPstream.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
// Outstanding non-blocking operations. // Outstanding non-blocking operations.
DynamicList<MPI_Request> OPstream_outstandingRequests_; //! @cond fileScope
Foam::DynamicList<MPI_Request> OPstream_outstandingRequests_;
//! @endcond fileScope
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
OPstream::~OPstream() Foam::OPstream::~OPstream()
{ {
if if
( (
@ -66,7 +62,7 @@ OPstream::~OPstream()
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool OPstream::write bool Foam::OPstream::write
( (
const commsTypes commsType, const commsTypes commsType,
const int toProcNo, const int toProcNo,
@ -80,7 +76,7 @@ bool OPstream::write
{ {
transferFailed = MPI_Bsend transferFailed = MPI_Bsend
( (
(char*)buf, const_cast<char*>(buf),
bufSize, bufSize,
MPI_PACKED, MPI_PACKED,
procID(toProcNo), procID(toProcNo),
@ -92,7 +88,7 @@ bool OPstream::write
{ {
transferFailed = MPI_Send transferFailed = MPI_Send
( (
(char*)buf, const_cast<char*>(buf),
bufSize, bufSize,
MPI_PACKED, MPI_PACKED,
procID(toProcNo), procID(toProcNo),
@ -106,7 +102,7 @@ bool OPstream::write
transferFailed = MPI_Isend transferFailed = MPI_Isend
( (
(char*)buf, const_cast<char*>(buf),
bufSize, bufSize,
MPI_PACKED, MPI_PACKED,
procID(toProcNo), procID(toProcNo),
@ -132,7 +128,7 @@ bool OPstream::write
} }
void OPstream::waitRequests() void Foam::OPstream::waitRequests()
{ {
if (OPstream_outstandingRequests_.size() > 0) if (OPstream_outstandingRequests_.size() > 0)
{ {
@ -159,7 +155,7 @@ void OPstream::waitRequests()
} }
bool OPstream::finishedRequest(const label i) bool Foam::OPstream::finishedRequest(const label i)
{ {
if (i >= OPstream_outstandingRequests_.size()) if (i >= OPstream_outstandingRequests_.size())
{ {
@ -184,6 +180,4 @@ bool OPstream::finishedRequest(const label i)
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -42,12 +42,14 @@ License
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void Pstream::addValidParOptions(HashTable<string>& validParOptions) // NOTE:
// valid parallel options vary between implementations, but flag common ones.
// if they are not removed by MPI_Init(), the subsequent argument processing
// will notice that they are wrong
void Foam::Pstream::addValidParOptions(HashTable<string>& validParOptions)
{ {
validParOptions.insert("np", ""); validParOptions.insert("np", "");
validParOptions.insert("p4pg", "PI file"); validParOptions.insert("p4pg", "PI file");
@ -59,7 +61,7 @@ void Pstream::addValidParOptions(HashTable<string>& validParOptions)
} }
bool Pstream::init(int& argc, char**& argv) bool Foam::Pstream::init(int& argc, char**& argv)
{ {
MPI_Init(&argc, &argv); MPI_Init(&argc, &argv);
@ -119,7 +121,7 @@ bool Pstream::init(int& argc, char**& argv)
} }
void Pstream::exit(int errnum) void Foam::Pstream::exit(int errnum)
{ {
# ifndef SGIMPI # ifndef SGIMPI
int size; int size;
@ -140,13 +142,13 @@ void Pstream::exit(int errnum)
} }
void Pstream::abort() void Foam::Pstream::abort()
{ {
MPI_Abort(MPI_COMM_WORLD, 1); MPI_Abort(MPI_COMM_WORLD, 1);
} }
void reduce(scalar& Value, const sumOp<scalar>& bop) void Foam::reduce(scalar& Value, const sumOp<scalar>& bop)
{ {
if (!Pstream::parRun()) if (!Pstream::parRun())
{ {
@ -426,6 +428,4 @@ void reduce(scalar& Value, const sumOp<scalar>& bop)
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View File

@ -653,7 +653,7 @@ void Foam::meshCutAndRemove::setRefinement
const edge& e = mesh().edges()[edgeI]; const edge& e = mesh().edges()[edgeI];
// Check if there is any cell using this edge. // Check if there is any cell using this edge.
if (debug & findCutCell(cuts, mesh().edgeCells()[edgeI]) == -1) if (debug && findCutCell(cuts, mesh().edgeCells()[edgeI]) == -1)
{ {
FatalErrorIn FatalErrorIn
( (

View File

@ -601,7 +601,7 @@ void Foam::meshCutter::setRefinement
const edge& e = mesh().edges()[edgeI]; const edge& e = mesh().edges()[edgeI];
// Check if there is any cell using this edge. // Check if there is any cell using this edge.
if (debug & findCutCell(cuts, mesh().edgeCells()[edgeI]) == -1) if (debug && findCutCell(cuts, mesh().edgeCells()[edgeI]) == -1)
{ {
FatalErrorIn FatalErrorIn
( (

View File

@ -140,7 +140,7 @@ Foam::sampledPatch::sampledPatch
patchFaceLabels_(0) patchFaceLabels_(0)
{ {
// default: non-triangulated // default: non-triangulated
triangulate() = getBool(dict, "triangulate", false); triangulate() = dict.lookupOrDefault("triangulate", false);
createGeometry(); createGeometry();
} }

View File

@ -151,25 +151,6 @@ Foam::sampledSurface::New
); );
} }
bool Foam::sampledSurface::getBool
(
const dictionary& dict,
const word& key,
const bool defaultVal
)
{
if (dict.found(key))
{
return readBool(dict.lookup(key));
}
else
{
return defaultVal;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::sampledSurface::sampledSurface Foam::sampledSurface::sampledSurface
@ -200,8 +181,8 @@ Foam::sampledSurface::sampledSurface
: :
name_(name), name_(name),
mesh_(mesh), mesh_(mesh),
triangulate_(getBool(dict, "triangulate", true)), triangulate_(dict.lookupOrDefault("triangulate", true)),
interpolate_(getBool(dict, "interpolate", false)), interpolate_(dict.lookupOrDefault("interpolate", false)),
SfPtr_(NULL), SfPtr_(NULL),
magSfPtr_(NULL), magSfPtr_(NULL),
CfPtr_(NULL), CfPtr_(NULL),

View File

@ -128,11 +128,6 @@ class sampledSurface
protected: protected:
// Protected static functions
//- Read bool from dictionary. Return provided value if not found
static bool getBool(const dictionary&, const word&, const bool);
// Protected Member functions // Protected Member functions
virtual void clearGeom() const; virtual void clearGeom() const;

View File

@ -89,9 +89,16 @@ done
make="make" make="make"
# set WM_NCOMPPROCS automatically when both WM_HOSTS and WM_SCHEDULER are set
if [ -z "$WM_NCOMPPROCS" -a -n "$WM_HOSTS" -a -n "$WM_SCHEDULER" ]
then
WM_NCOMPPROCS=$(wmakeScheduler -count)
[ $? -eq 0 ] || unset WM_NCOMPPROCS
fi
if [ "$WM_NCOMPPROCS" ] if [ "$WM_NCOMPPROCS" ]
then then
if [ "$WM_NCOMPPROCS" -ne 1 -a ! "$MAKEFLAGS" ] if [ "$WM_NCOMPPROCS" -gt 1 -a ! "$MAKEFLAGS" ]
then then
lockDir=$HOME/.wmakeScheduler lockDir=$HOME/.wmakeScheduler

View File

@ -1,201 +0,0 @@
#!/bin/bash
#------------------------------------------------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
# \\/ M anipulation |
#-------------------------------------------------------------------------------
# License
# This file is part of OpenFOAM.
#
# OpenFOAM is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenFOAM; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# Script
# wmakeScheduler
#
# Description
# Scheduler for network distributed compilations using wmake.
# - WM_HOSTS contains a list of hosts and number of concurrent processes
# eg,
# export WM_HOSTS="hostA:1 hostB:2 hostC:1"
# - WM_COLOURS contains a list of colours to cycle through
# export WM_COLOURS="black blue green cyan red magenta yellow"
#
# Sources the relevant cshrc/bashrc if not set.
#
# WM_PROJECT_DIR, WM_PROJECT and WM_PROJECT_VERSION will have been set
# before calling this routine
#
# Usage
# wmakeScheduler COMMAND
# run 'COMMAND' on one of the slots listed in WM_HOSTS
#
# wmakeScheduler -count
# count the total number of slots available in WM_HOSTS
# eg, WM_NCOMPPROCS=$(wmakeScheduler -count)
#
#-------------------------------------------------------------------------------
lockDir=$HOME/.wmakeScheduler
# fallback - 1 core on current host
: ${WM_HOSTS:=$HOST:1}
# count the total number of slots available and exit
if [ "$1" = "-count" ]
then
expr $(
for slotGroup in $WM_HOSTS
do
n=${slotGroup##*:}
if [ "$n" = "${slotGroup%%:*}" ]; then n=1; fi # missing ':'
echo "+ ${n:-1}"
done)
exit 0
fi
# where to source WM_PROJECT settings in a remote shell
# This code tries to figure out which cshrc or bashrc to execute.
# !! Assumes remote computer running same shell and startup files
# in same location
sourceFoam=false # fallback command
case $SHELL in
*/csh | */tcsh ) # [t]csh vs bash|ksh|sh
shellRc=cshrc
;;
*)
shellRc=bashrc
;;
esac
# check ~/.$WM_PROJECT-$WM_PROJECT_VERSION/
# check ~/.$WM_PROJECT/$WM_PROJECT_VERSION/
# check ~/.$WM_PROJECT/
# check <installedProject>/etc/
# check <installedProject/.$WM_PROJECT-$WM_PROJECT_VERSION/
if [ "$WM_PROJECT" ]; then
: ${FOAM_DOT_DIR:=.$WM_PROJECT-$WM_PROJECT_VERSION}
for i in \
$HOME/$FOAM_DOT_DIR \
$HOME/.$WM_PROJECT/$WM_PROJECT_VERSION \
$HOME/.$WM_PROJECT \
$WM_PROJECT_DIR/etc \
$WM_PROJECT_DIR/$FOAM_DOT_DIR \
;
do
if [ -f "$i/$shellRc" ]; then
sourceFoam="$i/$shellRc"
break
fi
done
fi
# Construct test string for remote execution.
# Source WM_PROJECT settings if WM_PROJECT environment not set.
case $sourceFoam in
*/cshrc) sourceFoam='if ( ! $?WM_PROJECT ) source '"$sourceFoam";;
*/bashrc) sourceFoam='[ "$WM_PROJECT" ] || . '"$sourceFoam";;
esac
# quote double-quotes for remote command line
rcmd=$(echo $* | sed -e s/\"/\'\"\'/g)
## the same, without forking (not ksh, maybe not /bin/sh either)
# rcmd=$(while [ "$#" -gt 0 ]; do echo "${1//\"/'\"'}"; shift; done)
# Convert WM_COLOURS into an array
declare colours
nColours=0
for col in $WM_COLOURS
do
colours[$nColours]=$col
((nColours = $nColours + 1))
done
# Bashism: make pipe fail early. This make sure return value of compilation
# is returned and not of colouring pipe.
set -o pipefail
# Define function to colour output by argument 1
colourPipe(){
if [ "$1" ]; then
(while read line; do setterm -foreground $1; echo "$line" ; done; setterm -foreground default)
else
cat
fi
}
colourIndex=0
while :
do
for slotGroup in $WM_HOSTS
do
# split 'host:N', but catch 'host:' and 'host' too
host=${slotGroup%%:*}
n=${slotGroup##*:}
if [ "$n" = "$host" ]; then n=1; fi # missing ':'
: ${n:=1}
i=0
while [ "$i" -lt "$n" ]
do
lockFile="$lockDir/$host:$i"
if lockfile -r0 "$lockFile" 2>/dev/null; then
# Set colour
colour=${colours[$colourIndex]}
#echo "** host=$host colourIndex=$colourIndex colour=$colour"
if [ "$host" = "$HOST" ]; then
if [ "$colour" ]; then
eval $* 2>&1 | colourPipe $colour
else
eval $*
fi
elif [ -n "$JOB_ID" ]; then
qrsh -inherit -v PWD $host "$rcmd"
else
if [ "$colour" ]; then
ssh $host "$sourceFoam 2>/dev/null; cd $PWD && $rcmd" 2>&1 | colourPipe $colour
else
ssh $host "$sourceFoam 2>/dev/null; cd $PWD && $rcmd"
fi
fi
retval=$?
# Release lock
rm -f "$lockFile" 2>/dev/null
exit $retval
fi
i=$(expr $i + 1)
# Cycle through colours
colourIndex=$(expr $colourIndex + 1)
if (( $colourIndex >= $nColours )); then
colourIndex=0
fi
done
done
done
if [ "$WM_COLOURS" ]; then
setterm -foreground default
fi
#------------------------------------------------------------------------------

View File

@ -37,7 +37,8 @@
# Sources the relevant cshrc/bashrc if not set. # Sources the relevant cshrc/bashrc if not set.
# #
# WM_PROJECT_DIR, WM_PROJECT and WM_PROJECT_VERSION will have been set # WM_PROJECT_DIR, WM_PROJECT and WM_PROJECT_VERSION will have been set
# before calling this routine # before calling this routine.
# FOAM_INST_DIR may possibly have been set (to find installation)
# #
# Usage # Usage
# wmakeScheduler COMMAND # wmakeScheduler COMMAND
@ -45,7 +46,7 @@
# #
# wmakeScheduler -count # wmakeScheduler -count
# count the total number of slots available in WM_HOSTS # count the total number of slots available in WM_HOSTS
# eg, WM_NCOMPPROCS=$(wmakeScheduler -count) # eg, export WM_NCOMPPROCS=$(wmakeScheduler -count)
# #
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
lockDir=$HOME/.wmakeScheduler lockDir=$HOME/.wmakeScheduler
@ -81,21 +82,15 @@ case $SHELL in
;; ;;
esac esac
# check ~/.$WM_PROJECT-$WM_PROJECT_VERSION/
# check ~/.$WM_PROJECT/$WM_PROJECT_VERSION/ # check ~/.$WM_PROJECT/$WM_PROJECT_VERSION/
# check ~/.$WM_PROJECT/ # check ~/.$WM_PROJECT/
# check <installedProject>/etc/ # check <installedProject>/etc/
# check <installedProject/.$WM_PROJECT-$WM_PROJECT_VERSION/
if [ "$WM_PROJECT" ]; then if [ "$WM_PROJECT" ]; then
: ${FOAM_DOT_DIR:=.$WM_PROJECT-$WM_PROJECT_VERSION}
for i in \ for i in \
$HOME/$FOAM_DOT_DIR \
$HOME/.$WM_PROJECT/$WM_PROJECT_VERSION \ $HOME/.$WM_PROJECT/$WM_PROJECT_VERSION \
$HOME/.$WM_PROJECT \ $HOME/.$WM_PROJECT \
$WM_PROJECT_DIR/etc \ $WM_PROJECT_DIR/etc \
$WM_PROJECT_DIR/$FOAM_DOT_DIR \
; ;
do do
if [ -f "$i/$shellRc" ]; then if [ -f "$i/$shellRc" ]; then
@ -203,7 +198,7 @@ do
fi fi
done done
done done
# Not found any free slots. Rest a bit. # Did not find any free slots. Rest a bit.
sleep 1 sleep 1
done done