mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: additional #word and #message dictionary directives (#2276)
- use `#word` to concatenate, expand content with the resulting string
being treated as a word token. Can be used in dictionary or
primitive context.
In dictionary context, it fills the gap for constructing dictionary
names on-the-fly. For example,
```
#word "some_prefix_solverInfo_${application}"
{
type solverInfo;
libs (utilityFunctionObjects);
...
}
```
The '#word' directive will automatically squeeze out non-word
characters. In the block content form, it will also strip out
comments. This means that this type of content should also work:
```
#word {
some_prefix_solverInfo
/* Appended with application name (if defined) */
${application:+_} // Use '_' separator
${application} // The application
}
{
type solverInfo;
libs (utilityFunctionObjects);
...
}
```
This is admittedly quite ugly, but illustrates its capabilities.
- use `#message` to report expanded string content to stderr.
For example,
```
T
{
solver PBiCG;
preconditioner DILU;
tolerance 1e-10;
relTol 0;
#message "using solver: $solver"
}
```
Only reports on the master node.
This commit is contained in:
@ -18,6 +18,8 @@ FoamFile
|
||||
#sinclude "$FOAM_CASE/someUnknownFile"
|
||||
#includeIfPresent "$FOAM_CASE/someUnknownFile-$FOAM_CASENAME"
|
||||
|
||||
zeroVelocity uniform (0 0 0);
|
||||
|
||||
internalField uniform 1;
|
||||
|
||||
// supply defaults
|
||||
@ -48,7 +50,7 @@ x 5;
|
||||
varName x;
|
||||
|
||||
|
||||
//Indirection for keys
|
||||
// Indirection for keys
|
||||
key inlet_9;
|
||||
|
||||
|
||||
@ -67,13 +69,17 @@ boundaryField
|
||||
inlet_5 { $inactive }
|
||||
inlet_6a { $...inactive } // Relative scoping - fairly horrible to use
|
||||
inlet_6b { $^inactive } // Absolute scoping
|
||||
inlet_6c { key ${/key}; } // Absolute scoping
|
||||
|
||||
inlet_7 { ${inactive}} // Test variable expansion
|
||||
inlet_8 { $inactive }
|
||||
|
||||
// Variable expansion for a keyword
|
||||
${key} { $inactive }
|
||||
|
||||
#include "testDictInc"
|
||||
|
||||
outlet
|
||||
outletBase
|
||||
{
|
||||
type inletOutlet;
|
||||
inletValue $internalField;
|
||||
@ -83,16 +89,36 @@ boundaryField
|
||||
y 6;
|
||||
}
|
||||
|
||||
// this should have no effect
|
||||
outlet
|
||||
{
|
||||
$outletBase
|
||||
}
|
||||
|
||||
Default_Boundary_Region
|
||||
{
|
||||
valueOut $zeroVelocity;
|
||||
}
|
||||
|
||||
// this should have no effect (not in scope)
|
||||
#remove inactive
|
||||
|
||||
inlet_7 { ${${varType}}} // Test indirection/recursive expansion
|
||||
inlet_8 { $active }
|
||||
// But this should work to remove things in different scopes
|
||||
#remove "/zeroVelocity"
|
||||
|
||||
inlet_7 { ${inactive} } // Test variable expansion
|
||||
inlet_8 { $inactive }
|
||||
|
||||
inlet_7a { ${${varType}} } // Test indirection/recursive expansion
|
||||
inlet_7b { ${${varType}} } // Test indirection/recursive expansion
|
||||
|
||||
#overwrite inlet_8 { type none; }
|
||||
}
|
||||
|
||||
|
||||
// No patterns with scoped removal
|
||||
// #remove "/boundaryField/outletB.*"
|
||||
#remove "/boundaryField/outletBase"
|
||||
|
||||
#include "testDict2"
|
||||
|
||||
verbatim #{
|
||||
@ -123,10 +149,25 @@ baz
|
||||
$active
|
||||
}
|
||||
|
||||
// this should work
|
||||
#remove active
|
||||
// This should work
|
||||
#remove x
|
||||
|
||||
// this should work too
|
||||
// This should work too
|
||||
#remove ( bar baz )
|
||||
|
||||
// Remove a sub-dictionary entry
|
||||
#remove "/anynumber.*/value"
|
||||
|
||||
// Removal does not auto-vivify
|
||||
#remove "/nonExistentDict/value"
|
||||
|
||||
// Add into existing dictionary
|
||||
"/anynumber.*/someValue" 100;
|
||||
|
||||
// Auto-vivify
|
||||
// - but currently cannot auto-vivify entries with dictionary patterns
|
||||
"/abd/someValue" 100;
|
||||
"/def/'someValue.*" 100;
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
Reference in New Issue
Block a user