controlSwitches: - We are now completely free from the global controlDict file.

This file is no longer necessary.
                 - If necessary, one can still use a global controlDict file
                   using the environment variable FOAM_GLOBAL_CONTROLDICT
                 - Case specific global control switches values can now be
                   supplied in the case's system/controlDict file.
                 - Renaming $WM_PROJECT_DIR/etc/controlDict to
                   $WM_PROJECT_DIR/etc/controlDict-EXAMPLE
                 - Some code cleanup.
This commit is contained in:
Martin Beaudoin 2015-05-05 08:45:24 -04:00
parent 4706995f5f
commit 473f85c949
6 changed files with 278 additions and 111 deletions

View file

@ -33,8 +33,6 @@ License
#include "JobInfo.H"
#include "labelList.H"
#include "SortableList.H"
//#include "dimensionedConstants.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -44,29 +42,6 @@ Foam::HashTable<Foam::string> Foam::argList::validParOptions;
Foam::word Foam::argList::appDictName_("");
bool Foam::argList::bannerEnabled(true);
template<>
const char*
Foam::NamedEnum
<
Foam::debug::globalControlDictSwitchSet,
5
>::names[] =
{
"DebugSwitches",
"InfoSwitches",
"OptimisationSwitches",
"Tolerances",
"DimensionedConstants"
};
const Foam::NamedEnum
<
Foam::debug::globalControlDictSwitchSet,
5
>
Foam::argList::globalControlDictSwitchSetNames_;
Foam::argList::initValidTables::initValidTables()
{
@ -74,11 +49,24 @@ Foam::argList::initValidTables::initValidTables()
validOptions.set("parallel", "");
validParOptions.set("parallel", "");
validOptions.set("noFunctionObjects", "");
validOptions.set("DebugSwitches", "key1=val1,key2=val2,...");
validOptions.set("InfoSwitches", "key1=val1,key2=val2,...");
validOptions.set("OptimisationSwitches", "key1=val1,key2=val2,...");
validOptions.set("Tolerances", "key1=val1,key2=val2,...");
validOptions.set("DimensionedConstants", "key1=val1,key2=val2,...");
// Add the parameters for modifying the controlDict
// switches from the command-line
// Instantiate a NamedEnum for the controlDict switches names
const Foam::NamedEnum
<
Foam::debug::globalControlDictSwitchSet,
DIM_GLOBALCONTROLDICTSWITCHSET
>
globalControlDictSwitchSetNames;
forAll(globalControlDictSwitchSetNames, gI)
{
word switchSetName = globalControlDictSwitchSetNames.names[gI];
validOptions.set(switchSetName, "key1=val1,key2=val2,...");
}
Pstream::addValidParOptions(validParOptions);
}
@ -354,24 +342,10 @@ Foam::argList::argList
<< "Date : " << dateString.c_str() << nl
<< "Time : " << timeString.c_str() << nl
<< "Host : " << hostName() << nl
<< "PID : " << pid() << nl
<< "CtrlDict : " << ctrlDictString.c_str()
<< "PID : " << pid()
<< endl;
}
// Command-line override for central controlDict's variables
forAll(globalControlDictSwitchSetNames_, cI)
{
word switchSetName = globalControlDictSwitchSetNames_.names[cI];
if( optionFound(switchSetName) )
Foam::debug::updateCentralDictVars
(
globalControlDictSwitchSetNames_[switchSetName],
option(switchSetName)
);
}
jobInfo.add("startDate", dateString);
jobInfo.add("startTime", timeString);
jobInfo.add("userName", userName());
@ -540,6 +514,62 @@ Foam::argList::argList
case_ = globalCase_;
}
// Managing the overrides for the global control switches:
//
// Here is the order of precedence for the definition/overriding of the
// control switches, from lowest to highest:
// - source code definitions from the various libraries/solvers
// - file specified by the env. variable FOAM_GLOBAL_CONTROLDICT
// - case's system/controlDict file
// - command-line parameters
//
// First, we allow the users to specify the location of a centralized
// global controlDict dictionary using the environment variable
// FOAM_GLOBAL_CONTROLDICT.
fileName optionalGlobControlDictFileName =
getEnv("FOAM_GLOBAL_CONTROLDICT");
if (optionalGlobControlDictFileName.size() )
{
debug::updateCentralDictVars
(
optionalGlobControlDictFileName,
Pstream::master() && bannerEnabled
);
}
// Now that the rootPath_/globalCase_ directory is known (following the call
// to getRootCase()), we grab any global control switches overrides from the
// current case's controlDict.
debug::updateCentralDictVars
(
rootPath_/globalCase_/"system/controlDict",
Pstream::master() && bannerEnabled
);
// Finally, a command-line override for central controlDict's variables.
// This is the ultimate override for the global control switches.
// Instantiate a NamedEnum for the controlDict switches names
const Foam::NamedEnum
<
Foam::debug::globalControlDictSwitchSet,
DIM_GLOBALCONTROLDICTSWITCHSET
>
globalControlDictSwitchSetNames;
forAll(globalControlDictSwitchSetNames, gI)
{
word switchSetName = globalControlDictSwitchSetNames.names[gI];
if( optionFound(switchSetName) )
Foam::debug::updateCentralDictVars
(
globalControlDictSwitchSetNames[switchSetName],
option(switchSetName)
);
}
wordList slaveProcs;

View file

@ -126,9 +126,6 @@ public:
// Static data members
//- Central dictionary switchSet names
static const NamedEnum<Foam::debug::globalControlDictSwitchSet, 5> globalControlDictSwitchSetNames_;
//- A list of valid (mandatory) arguments
static SLList<string> validArgs;

View file

@ -37,6 +37,8 @@ Description
#include "optimisationSwitch.H"
#include "tolerancesSwitch.H"
#include "constantsSwitch.H"
#include "fileName.H"
#include "NamedEnum.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -45,6 +47,22 @@ namespace Foam
namespace debug
{
template<>
const char*
Foam::NamedEnum
<
Foam::debug::globalControlDictSwitchSet,
5
>::names[] =
{
"DebugSwitches",
"InfoSwitches",
"OptimisationSwitches",
"Tolerances",
"DimensionedConstants"
};
//! @cond ignoreDocumentation - local scope
dictionary* controlDictPtr_(NULL);
dictionary* debugSwitchesPtr_(NULL);
@ -95,19 +113,46 @@ Foam::dictionary& Foam::debug::controlDict()
{
if (!controlDictPtr_)
{
// Allow users to override the location of the global controlDict
// dictionary using an environment variable. Using this environment
// variable, one can assign a different global controlDict for each
// case, without having to modify the "default" ones.
fileName globControlDictFileName = getEnv("FOAM_GLOBAL_CONTROLDICT");
// We are totally getting rid of the central controlDict file located
// under $WM_PROJECT_DIR/etc/controlDict.
// But we still need to create a central dictionary for the global control
// switches.
// At first, all the different subdicts will be empty, like this:
// DebugSwitches{}
// InfoSwitches{}
// OptimisationSwitches{}
// Tolerances{}
// DimensionedConstants{}
//
// We will also merge with other predefined dictionaries as we go along.
// Then, as the libraries will instantiate the various control switches,
// the corresponding subdicts will get populated.
// MB 05/2015
// Fallback to default locations if filename is empty or not valid
if( ! isFile(globControlDictFileName) )
globControlDictFileName = findEtcFile("controlDict", true);
const string dictEmptySectionStr("{}\n");
string emptyGlobalDictStr;
controlDictPtr_ = new dictionary
// This is a bit less readable than explicitely reusing the hard-coded
// string values, but we then get the added flexibility to change the
// name of the subDicts without too much impact to the rest of source
// code.
const Foam::NamedEnum
<
Foam::debug::globalControlDictSwitchSet,
DIM_GLOBALCONTROLDICTSWITCHSET
>
globalControlDictSwitchSetNames;
forAll(globalControlDictSwitchSetNames, gI)
{
emptyGlobalDictStr +=
globalControlDictSwitchSetNames.names[gI] +
dictEmptySectionStr;
}
controlDictPtr_ = new dictionary
(
IFstream(globControlDictFileName)()
IStringStream(emptyGlobalDictStr)()
);
}
@ -117,12 +162,21 @@ Foam::dictionary& Foam::debug::controlDict()
Foam::dictionary& Foam::debug::switchSet
(
const char* subDictName,
const globalControlDictSwitchSet globalControlDictSwitchSetName,
dictionary*& subDictPtr
)
{
if (!subDictPtr)
{
const Foam::NamedEnum
<
Foam::debug::globalControlDictSwitchSet,
DIM_GLOBALCONTROLDICTSWITCHSET
>
globalControlDictSwitchSetNames;
word subDictName = globalControlDictSwitchSetNames[globalControlDictSwitchSetName];
entry* ePtr = controlDict().lookupEntryPtr
(
subDictName, false, false
@ -130,7 +184,7 @@ Foam::dictionary& Foam::debug::switchSet
if (!ePtr || !ePtr->isDict())
{
cerr<< "debug::switchSet(const char*, dictionary*&):\n"
cerr<< "debug::switchSet(const globalControlDictSwitchSet, dictionary*&):\n"
<< " Cannot find " << subDictName << " in dictionary "
<< controlDict().name().c_str()
<< std::endl << std::endl;
@ -147,30 +201,30 @@ Foam::dictionary& Foam::debug::switchSet
Foam::dictionary& Foam::debug::debugSwitches()
{
return switchSet("DebugSwitches", debugSwitchesPtr_);
return switchSet(debug::DEBUGSWITCHES, debugSwitchesPtr_);
}
Foam::dictionary& Foam::debug::infoSwitches()
{
return switchSet("InfoSwitches", infoSwitchesPtr_);
return switchSet(debug::INFOSWITCHES, infoSwitchesPtr_);
}
Foam::dictionary& Foam::debug::optimisationSwitches()
{
return switchSet("OptimisationSwitches", optimisationSwitchesPtr_);
return switchSet(debug::OPTIMISATIONSWITCHES, optimisationSwitchesPtr_);
}
Foam::dictionary& Foam::debug::tolerances()
{
return switchSet("Tolerances", tolerancesPtr_);
return switchSet(debug::TOLERANCES, tolerancesPtr_);
}
Foam::dictionary& Foam::debug::constants()
{
return switchSet("DimensionedConstants", constantsPtr_);
return switchSet(debug::DIMENSIONEDCONSTANTS, constantsPtr_);
}
@ -258,8 +312,9 @@ double Foam::debug::constantsFromDict
void Foam::debug::updateCentralDictVars
(
Foam::debug::globalControlDictSwitchSet globalControlDictSwitchSetName,
Foam::string keyValues
const Foam::debug::globalControlDictSwitchSet globalControlDictSwitchSetName,
const Foam::string& keyValues,
const bool verbose
)
{
Foam::word token;
@ -298,12 +353,14 @@ void Foam::debug::updateCentralDictVars
)
)
{
Info << endl
<< "Warning: Modification of DebugSwitches: "
<< key << endl
<< " Old value: " << oldDebugValue << endl
<< " New value: " << newDebugValue << endl
<< endl;
if (verbose)
{
Info << "CtrlDict : Modification of DebugSwitches: "
<< key
<< ": old value: " << oldDebugValue
<< ", new value: " << newDebugValue
<< endl;
}
Foam::debug::debugSwitches().set
(
@ -382,12 +439,14 @@ void Foam::debug::updateCentralDictVars
)
)
{
Info << endl
<< "Warning: Modification of InfoSwitches: "
<< key << endl
<< " Old value: " << oldInfoValue << endl
<< " New value: " << newInfoValue << endl
<< endl;
if (verbose)
{
Info << "CtrlDict : Modification of InfoSwitches: "
<< key
<< ": old value: " << oldInfoValue
<< ", new value: " << newInfoValue
<< endl;
}
Foam::debug::infoSwitches().set(key, newInfoValue);
@ -498,15 +557,17 @@ void Foam::debug::updateCentralDictVars
if(keyIsPresent)
{
Info << endl
<< "Warning: Modification of "
<< "OptimisationSwitches: "
<< key << endl
<< " Old value: "
<< oldOptimisationValueStr << endl
<< " New value: "
<< newOptimisationValueStr << endl
<< endl;
if (verbose)
{
Info << "CtrlDict : Modification of "
<< "OptimisationSwitches: "
<< key
<< ": old value: "
<< oldOptimisationValueStr
<< ", new value: "
<< newOptimisationValueStr
<< endl;
}
Foam::debug::optimisationSwitches().set
(
@ -517,7 +578,6 @@ void Foam::debug::updateCentralDictVars
std::list<controlSwitches<int> *> curList =
optimisationSwitchValues[key];
std::cout << "curList.size(): " << curList.size() << std::endl;
// Modify all entries for this key
forAllIter
(
@ -586,14 +646,14 @@ void Foam::debug::updateCentralDictVars
)
)
{
Info << endl
<< "Warning: Modification of Tolerances: "
<< key << endl
<< " Old value: "
<< oldTolerancesValue << endl
<< " New value: "
<< newTolerancesValue << endl
<< endl;
if (verbose)
{
Info << "CtrlDict : Modification of Tolerances: "
<< key
<< ": old value: " << oldTolerancesValue
<< ", new value: " << newTolerancesValue
<< endl;
}
Foam::debug::tolerances().set
(
@ -672,14 +732,16 @@ void Foam::debug::updateCentralDictVars
)
)
{
Info << endl
<< "Warning: Modification of DimensionedConstants: "
<< key << endl
<< " Old value: "
<< oldDimensionedConstantsValue << endl
<< " New value: "
<< newDimensionedConstantsValue << endl
<< endl;
if (verbose)
{
Info << "CtrlDict : Modification of DimensionedConstants: "
<< key
<< ": old value: "
<< oldDimensionedConstantsValue
<< ", new value: "
<< newDimensionedConstantsValue
<< endl;
}
Foam::dimensionedConstants().set
(
@ -748,4 +810,65 @@ void Foam::debug::updateCentralDictVars
}
}
void Foam::debug::updateCentralDictVars
(
const Foam::fileName& fName,
const bool verbose
)
{
// Add a trace to the banner
if (verbose)
{
Info << "CtrlDict : " << fName << endl;
}
if(fName.size() && isFile(fName))
{
const dictionary* optionalGlobControlDictPtr_ = new dictionary
(
IFstream(fName)()
);
const dictionary& optionalGlobControlDict = *optionalGlobControlDictPtr_;
const Foam::NamedEnum
<
Foam::debug::globalControlDictSwitchSet,
DIM_GLOBALCONTROLDICTSWITCHSET
>
globalControlDictSwitchSetNames;
// We merge the content of each subdicts
forAll(globalControlDictSwitchSetNames, gI)
{
string subDictName(globalControlDictSwitchSetNames.names[gI]);
if (optionalGlobControlDict.isDict(subDictName))
{
const dictionary& subD = optionalGlobControlDict.subDict(subDictName);
const wordList toc = subD.toc();
OStringStream keyValuePairs;
forAll(toc, tocI)
{
token value;
subD.lookup(toc[tocI]).read(value);
keyValuePairs << toc[tocI] << "=" << value << ", ";
}
// Update global dictionary
updateCentralDictVars
(
globalControlDictSwitchSetNames[subDictName],
keyValuePairs.str(),
false // keep quiet when using files...
);
}
}
// Cleaning up
delete optionalGlobControlDictPtr_;
}
}
// ************************************************************************* //

View file

@ -40,8 +40,15 @@ SourceFiles
namespace Foam
{
// Number of global controlDict switches sets
// Currently, we have:
// DebugSwitches, InfoSwitches, OptimisationSwitches, Tolerances,
// and DimensionedConstants
#define DIM_GLOBALCONTROLDICTSWITCHSET 5
// Forward declaration of classes
class dictionary;
class fileName;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -58,8 +65,6 @@ namespace debug
};
//- The central control dictionary.
// Located in $WM_PROJECT_DIR/etc
// @sa Foam::findEtcFile()
dictionary& controlDict();
//- The DebugSwitches sub-dictionary in the central controlDict.
@ -94,14 +99,26 @@ namespace debug
double constantsFromDict(const char* name, const double defaultValue = 0);
//- Internal function to lookup a sub-dictionary from controlDict.
dictionary& switchSet(const char* subDictName, dictionary*& subDictPtr);
dictionary& switchSet
(
const globalControlDictSwitchSet globalControlDictSwitchSetName,
dictionary*& subDictPtr
);
//- Update central controlDict variables
// supported keyValues format: key1=value1,key2=value2
void updateCentralDictVars
(
globalControlDictSwitchSet centralDictSwitchSetName,
Foam::string keyValues
const globalControlDictSwitchSet centralDictSwitchSetName,
const Foam::string& keyValues,
const bool verbose=true
);
//- Update central controlDict variables from a file
void updateCentralDictVars
(
const Foam::fileName& file,
const bool verbose=true
);
} // End namespace debug

View file

@ -38,7 +38,7 @@ dictionary& dimensionedConstants()
{
return debug::switchSet
(
"DimensionedConstants",
debug::DIMENSIONEDCONSTANTS,
dimensionedConstantsPtr_
);
}