Merge branch 'master' into sixDofPatch
This commit is contained in:
@ -15,8 +15,7 @@ EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicFvMesh/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude
|
||||
-I$(LIB_SRC)/meshTools/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lengine \
|
||||
|
||||
@ -26,8 +26,13 @@ Application
|
||||
coalChemistryFoam
|
||||
|
||||
Description
|
||||
Transient solver for compressible, turbulent flow with coal and
|
||||
limestone parcel injections, and combustion.
|
||||
Transient solver for:
|
||||
- compressible,
|
||||
- turbulent flow,
|
||||
with
|
||||
- coal and limestone parcel injections,
|
||||
- energy source, and
|
||||
- combustion.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
@ -38,7 +43,7 @@ Description
|
||||
#include "CoalCloud.H"
|
||||
#include "psiChemistryModel.H"
|
||||
#include "chemistrySolver.H"
|
||||
#include "timeActivatedExplicitCellSource.H"
|
||||
#include "timeActivatedExplicitSource.H"
|
||||
#include "radiationModel.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -127,10 +127,11 @@
|
||||
fvc::DDt(surfaceScalarField("phiU", phi/fvc::interpolate(rho)), p)
|
||||
);
|
||||
|
||||
Info<< "\nConstructing explicit enthalpy cell source" << endl;
|
||||
timeActivatedExplicitCellSource enthalpySource
|
||||
Info<< "\nConstructing explicit enthalpy source" << endl;
|
||||
scalarTimeActivatedExplicitSourceList enthalpySource
|
||||
(
|
||||
"enthalpySource",
|
||||
"energy",
|
||||
mesh,
|
||||
h.dimensions()*phi.dimensions()/mesh.V().dimensions()
|
||||
dimEnergy/dimTime/dimVolume,
|
||||
"h"
|
||||
);
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
==
|
||||
rho.dimensionedInternalField()*g
|
||||
+ parcels.SU()
|
||||
+ momentumSource.Su()
|
||||
);
|
||||
|
||||
pZones.addResistance(UEqn);
|
||||
|
||||
@ -28,7 +28,7 @@ tmp<fv::convectionScheme<scalar> > mvConvection
|
||||
==
|
||||
parcels.Srho(i)
|
||||
+ kappa*chemistry.RR(i)().dimensionedInternalField()
|
||||
+ pointMassSources.Su(i),
|
||||
+ massSource.Su(i),
|
||||
mesh.solver("Yi")
|
||||
);
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
Info<< "\nConstructing reacting cloud" << endl;
|
||||
icoPoly8ThermoReactingCloud parcels
|
||||
icoPoly8ThermoReactingMultiphaseCloud parcels
|
||||
(
|
||||
"reactingCloud1",
|
||||
rho,
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
Info<< "Creating mass source\n" << endl;
|
||||
scalarTimeActivatedExplicitSourceList massSource
|
||||
(
|
||||
"mass",
|
||||
mesh,
|
||||
dimMass/dimTime/dimVolume,
|
||||
composition.species()
|
||||
);
|
||||
|
||||
|
||||
Info<< "Creating momentum source\n" << endl;
|
||||
vectorTimeActivatedExplicitSourceList momentumSource
|
||||
(
|
||||
"momentum",
|
||||
mesh,
|
||||
dimMass*dimVelocity/dimTime/dimVolume,
|
||||
"U"
|
||||
);
|
||||
|
||||
Info<< "Creating energy source\n" << endl;
|
||||
scalarTimeActivatedExplicitSourceList energySource
|
||||
(
|
||||
"energy",
|
||||
mesh,
|
||||
dimEnergy/dimTime/dimVolume,
|
||||
"h"
|
||||
);
|
||||
@ -1,8 +0,0 @@
|
||||
Info<< "\nConstructing multi-component mass flow rate point sources" << endl;
|
||||
timeActivatedExplicitMulticomponentPointSource pointMassSources
|
||||
(
|
||||
"pointMassSources",
|
||||
mesh,
|
||||
Y,
|
||||
dimMass/dimVolume/dimTime
|
||||
);
|
||||
@ -39,6 +39,7 @@
|
||||
pWork()
|
||||
+ parcels.Sh()
|
||||
+ radiation->Sh(thermo)
|
||||
+ energySource.Su()
|
||||
);
|
||||
|
||||
thermo.correct();
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
- fvm::laplacian(rho*rAU, p)
|
||||
==
|
||||
parcels.Srho()
|
||||
+ pointMassSources.Su()
|
||||
+ massSource.SuTot()
|
||||
);
|
||||
|
||||
if (corr == nCorr-1 && nonOrth == nNonOrthCorr)
|
||||
|
||||
@ -27,10 +27,11 @@ Application
|
||||
|
||||
Description
|
||||
Transient PISO solver for compressible, laminar or turbulent flow with
|
||||
reacting Lagrangian parcels for porous media, including explicit sources
|
||||
reacting multiphase Lagrangian parcels for porous media, including explicit
|
||||
sources for mass, momentum and energy
|
||||
|
||||
The solver includes:
|
||||
- reacting parcel cloud
|
||||
- reacting multiphase parcel cloud
|
||||
- porous media
|
||||
- point mass sources
|
||||
- polynomial based, incompressible thermodynamics (f(T))
|
||||
@ -43,12 +44,12 @@ Description
|
||||
#include "fvCFD.H"
|
||||
#include "hReactionThermo.H"
|
||||
#include "turbulenceModel.H"
|
||||
#include "BasicReactingCloud.H"
|
||||
#include "BasicReactingMultiphaseCloud.H"
|
||||
#include "rhoChemistryModel.H"
|
||||
#include "chemistrySolver.H"
|
||||
#include "radiationModel.H"
|
||||
#include "porousZones.H"
|
||||
#include "timeActivatedExplicitMulticomponentPointSource.H"
|
||||
#include "timeActivatedExplicitSource.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -63,7 +64,7 @@ int main(int argc, char *argv[])
|
||||
#include "createFields.H"
|
||||
#include "createRadiationModel.H"
|
||||
#include "createClouds.H"
|
||||
#include "createMulticomponentPointSources.H"
|
||||
#include "createExplicitSources.H"
|
||||
#include "createPorousZones.H"
|
||||
#include "initContinuityErrs.H"
|
||||
#include "readTimeControls.H"
|
||||
|
||||
@ -37,7 +37,7 @@ Description
|
||||
+ fvc::div(phi)
|
||||
==
|
||||
parcels.Srho()
|
||||
+ pointMassSources.Su()
|
||||
+ massSource.SuTot()
|
||||
);
|
||||
|
||||
rhoEqn.relax();
|
||||
|
||||
@ -1,15 +0,0 @@
|
||||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # run from this directory
|
||||
|
||||
# this will have to do until we have a makefile rule
|
||||
|
||||
if type Coco > /dev/null 2>&1
|
||||
then
|
||||
Coco \
|
||||
-frames $WM_THIRD_PARTY_DIR/coco-r \
|
||||
calcEntry/calcEntry.atg
|
||||
else
|
||||
echo "Coco not installed"
|
||||
fi
|
||||
|
||||
wmake
|
||||
@ -1,7 +1,3 @@
|
||||
dictionaryTest.C
|
||||
|
||||
calcEntry/calcEntry.C
|
||||
calcEntry/calcEntryParser.cpp
|
||||
calcEntry/calcEntryScanner.cpp
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/dictionaryTest
|
||||
|
||||
@ -0,0 +1 @@
|
||||
EXE_INC =
|
||||
|
||||
@ -1,252 +0,0 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
compile with:
|
||||
Coco \
|
||||
-frames $WM_THIRD_PARTY_DIR/coco-r \
|
||||
calcEntry.atg
|
||||
-------------------------------------------------------------------------*/
|
||||
|
||||
#include "dictionary.H"
|
||||
#include "scalar.H"
|
||||
#include "error.H"
|
||||
#include "wchar.H"
|
||||
|
||||
|
||||
COMPILER calcEntry
|
||||
$prefix=calcEntry
|
||||
$namespace=Foam::functionEntries::calcEntryInternal
|
||||
$eof=true // grammar handles eof itself
|
||||
|
||||
// Simple four function calculator for OpenFOAM dictionaries
|
||||
|
||||
//! with debug
|
||||
static const int debug = 0;
|
||||
|
||||
//! The parent dictionary
|
||||
mutable dictionary* dict_;
|
||||
|
||||
//! Track that parent dictionary was set
|
||||
bool hasDict_;
|
||||
|
||||
//! The calculation result
|
||||
scalar val;
|
||||
|
||||
|
||||
//! token -> scalar
|
||||
scalar getScalar() const
|
||||
{
|
||||
return coco_string_toDouble(t->val);
|
||||
}
|
||||
|
||||
//! token -> string
|
||||
std::string getString() const
|
||||
{
|
||||
char* str = coco_string_create_char(t->val);
|
||||
std::string s(str);
|
||||
coco_string_delete(str);
|
||||
return s;
|
||||
}
|
||||
|
||||
//! attach a dictionary
|
||||
void dict(const dictionary& dict)
|
||||
{
|
||||
dict_ = const_cast<dictionary*>(&dict);
|
||||
hasDict_ = true;
|
||||
}
|
||||
|
||||
|
||||
//! lookup dictionary entry
|
||||
scalar getDictLookup() const
|
||||
{
|
||||
scalar dictValue = 0;
|
||||
|
||||
if (!hasDict_)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry() const"
|
||||
) << "No dictionary attached!"
|
||||
<< exit(FatalError);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* chars = coco_string_create_char
|
||||
(
|
||||
t->val,
|
||||
1,
|
||||
(coco_string_length(t->val) - 1)
|
||||
);
|
||||
word keyword(chars);
|
||||
coco_string_delete(chars);
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Info<<"lookup: " << keyword << nl;
|
||||
}
|
||||
|
||||
entry* entryPtr = dict_->lookupEntryPtr(keyword, true, false);
|
||||
if (entryPtr && !entryPtr->isDict())
|
||||
{
|
||||
if (entryPtr->stream().size() != 1)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry() const"
|
||||
) << "keyword " << keyword << " has "
|
||||
<< entryPtr->stream().size() << " values in dictionary "
|
||||
<< exit(FatalError);
|
||||
}
|
||||
entryPtr->stream() >> dictValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry() const"
|
||||
) << "keyword " << keyword << " is undefined in dictionary "
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
|
||||
return dictValue;
|
||||
}
|
||||
|
||||
scalar Result() const
|
||||
{
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
CHARACTERS
|
||||
letter = 'A'..'Z' + 'a'..'z'.
|
||||
qualifier = '_' + ':'.
|
||||
dollar = '$'.
|
||||
digit = "0123456789".
|
||||
sign = '+' + '-'.
|
||||
cr = '\r'.
|
||||
lf = '\n'.
|
||||
tab = '\t'.
|
||||
stringCh = ANY - '"' - '\\' - cr - lf.
|
||||
printable = '\u0020' .. '\u007e'.
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * TOKENS * * * * * * * * * * * * * * * * * //
|
||||
|
||||
TOKENS
|
||||
|
||||
// identifier
|
||||
ident =
|
||||
letter { letter | digit | qualifier }.
|
||||
|
||||
// string
|
||||
string =
|
||||
'"' { stringCh | '\\' printable } '"'.
|
||||
|
||||
// dictionary lookup identifier
|
||||
// starts with '$' and otherwise limited to a normal indentifier
|
||||
variable =
|
||||
dollar letter { letter | digit | qualifier }.
|
||||
|
||||
// floating point and integer numbers
|
||||
number =
|
||||
[sign] ('.' digit { digit } ) | ( digit { digit } [ '.' { digit } ])
|
||||
[ ('E' | 'e') [sign] digit { digit } ].
|
||||
|
||||
|
||||
// * * * * * * * * * * * PRAGMAS / COMMENTS / IGNORE * * * * * * * * * * * //
|
||||
|
||||
COMMENTS FROM "/*" TO "*/" NESTED
|
||||
COMMENTS FROM "//" TO lf
|
||||
|
||||
IGNORE cr + lf + tab
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * PRODUCTIONS * * * * * * * * * * * * * * * //
|
||||
|
||||
PRODUCTIONS
|
||||
|
||||
calcEntry (. val = 0;
|
||||
if (debug){Info<<"start val pos:"<< t->pos << nl;}
|
||||
.)
|
||||
=
|
||||
'{' Expr<val> '}' (.
|
||||
if (debug){
|
||||
Info<<"end {} at pos:"<< t->pos
|
||||
<<" val:"<< t->val
|
||||
<<" len:"<< coco_string_length(t->val)
|
||||
<<" la pos:"<< la->pos << nl;
|
||||
}
|
||||
// reposition to immediately after the closing '}'
|
||||
scanner->buffer->SetPos
|
||||
(
|
||||
t->pos + coco_string_length(t->val)
|
||||
);
|
||||
.)
|
||||
| ( Expr<val> EOF )
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
Expr<scalar& val> (. scalar val2 = 0;
|
||||
if (debug) {Info<<"Expr:"<< val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
=
|
||||
Term<val>
|
||||
{
|
||||
"+" Term<val2> (. if (debug) {Info<<"+Term:"<<val2 << " pos:"<< t->pos << nl;}
|
||||
val += val2;
|
||||
if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
| "-" Term<val2> (. if (debug) {Info<<"-Term:"<<val2<< " pos:"<< t->pos << nl;}
|
||||
val -= val2;
|
||||
if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
}
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
Term<scalar& val> (. scalar val2 = 0;
|
||||
if (debug) {Info<<"Term:"<< val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
=
|
||||
Factor<val>
|
||||
{
|
||||
"*" Factor<val2> (. if (debug) {Info<<"*Factor:"<<val2<< " pos:"<< t->pos << nl;}
|
||||
val *= val2;
|
||||
if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
| "/" Factor<val2> (. if (debug) {Info<<"/Factor:"<<val2<< " pos:"<< t->pos << nl;}
|
||||
val /= val2;
|
||||
if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
}
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
Factor<scalar& val>
|
||||
=
|
||||
variable (. val = getDictLookup();
|
||||
if (debug) {Info<<"lookup:"<<val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
| number (. val = getScalar();
|
||||
if (debug) {Info<<"got num:"<<val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
| '-' '(' Expr<val> ')' (. val = -val;
|
||||
if (debug) {Info<<"inv:"<<val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
| '(' Expr<val> ')' (. if (debug){Info<<"got Expr:"<<val<< " pos:"<< t->pos << nl;}
|
||||
.)
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
END calcEntry.
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,339 +0,0 @@
|
||||
|
||||
|
||||
#include <wchar.h>
|
||||
#include "calcEntryParser.h"
|
||||
|
||||
|
||||
namespace Foam {
|
||||
namespace functionEntries {
|
||||
namespace calcEntryInternal {
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Parser Implementation
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
void Parser::SynErr(int n) {
|
||||
if (errDist >= minErrDist) errors->SynErr(la->line, la->col, n);
|
||||
errDist = 0;
|
||||
}
|
||||
|
||||
|
||||
void Parser::SemErr(const wchar_t* msg) {
|
||||
if (errDist >= minErrDist) errors->Error(t->line, t->col, msg);
|
||||
errDist = 0;
|
||||
}
|
||||
|
||||
|
||||
void Parser::Get() {
|
||||
for (;;) {
|
||||
t = la;
|
||||
la = scanner->Scan();
|
||||
if (la->kind <= maxT) {
|
||||
++errDist;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dummyToken != t) {
|
||||
dummyToken->kind = t->kind;
|
||||
dummyToken->pos = t->pos;
|
||||
dummyToken->col = t->col;
|
||||
dummyToken->line = t->line;
|
||||
dummyToken->next = NULL;
|
||||
coco_string_delete(dummyToken->val);
|
||||
dummyToken->val = coco_string_create(t->val);
|
||||
t = dummyToken;
|
||||
}
|
||||
la = t;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Parser::Expect(int n) {
|
||||
if (la->kind == n) {
|
||||
Get();
|
||||
}
|
||||
else {
|
||||
SynErr(n);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Parser::ExpectWeak(int n, int follow) {
|
||||
if (la->kind == n) {
|
||||
Get();
|
||||
}
|
||||
else {
|
||||
SynErr(n);
|
||||
while (!StartOf(follow)) {
|
||||
Get();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool Parser::WeakSeparator(int n, int syFol, int repFol) {
|
||||
if (la->kind == n) {
|
||||
Get();
|
||||
return true;
|
||||
}
|
||||
else if (StartOf(repFol)) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
SynErr(n);
|
||||
while (!(StartOf(syFol) || StartOf(repFol) || StartOf(0))) {
|
||||
Get();
|
||||
}
|
||||
return StartOf(syFol);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Parser::calcEntry() {
|
||||
val = 0;
|
||||
if (debug){Info<<"start val pos:"<< t->pos << nl;}
|
||||
|
||||
if (la->kind == 5) {
|
||||
Get();
|
||||
Expr(val);
|
||||
Expect(6);
|
||||
if (debug){
|
||||
Info<<"end {} at pos:"<< t->pos
|
||||
<<" val:"<< t->val
|
||||
<<" len:"<< coco_string_length(t->val)
|
||||
<<" la pos:"<< la->pos << nl;
|
||||
}
|
||||
// reposition to immediately after the closing '}'
|
||||
scanner->buffer->SetPos
|
||||
(
|
||||
t->pos + coco_string_length(t->val)
|
||||
);
|
||||
|
||||
} else if (StartOf(1)) {
|
||||
Expr(val);
|
||||
Expect(0);
|
||||
} else SynErr(14);
|
||||
}
|
||||
|
||||
void Parser::Expr(scalar& val) {
|
||||
scalar val2 = 0;
|
||||
if (debug) {Info<<"Expr:"<< val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
Term(val);
|
||||
while (la->kind == 7 || la->kind == 8) {
|
||||
if (la->kind == 7) {
|
||||
Get();
|
||||
Term(val2);
|
||||
if (debug) {Info<<"+Term:"<<val2 << " pos:"<< t->pos << nl;}
|
||||
val += val2;
|
||||
if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
} else {
|
||||
Get();
|
||||
Term(val2);
|
||||
if (debug) {Info<<"-Term:"<<val2<< " pos:"<< t->pos << nl;}
|
||||
val -= val2;
|
||||
if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Parser::Term(scalar& val) {
|
||||
scalar val2 = 0;
|
||||
if (debug) {Info<<"Term:"<< val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
Factor(val);
|
||||
while (la->kind == 9 || la->kind == 10) {
|
||||
if (la->kind == 9) {
|
||||
Get();
|
||||
Factor(val2);
|
||||
if (debug) {Info<<"*Factor:"<<val2<< " pos:"<< t->pos << nl;}
|
||||
val *= val2;
|
||||
if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
} else {
|
||||
Get();
|
||||
Factor(val2);
|
||||
if (debug) {Info<<"/Factor:"<<val2<< " pos:"<< t->pos << nl;}
|
||||
val /= val2;
|
||||
if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Parser::Factor(scalar& val) {
|
||||
if (la->kind == 3) {
|
||||
Get();
|
||||
val = getDictLookup();
|
||||
if (debug) {Info<<"lookup:"<<val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
} else if (la->kind == 4) {
|
||||
Get();
|
||||
val = getScalar();
|
||||
if (debug) {Info<<"got num:"<<val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
} else if (la->kind == 8) {
|
||||
Get();
|
||||
Expect(11);
|
||||
Expr(val);
|
||||
Expect(12);
|
||||
val = -val;
|
||||
if (debug) {Info<<"inv:"<<val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
} else if (la->kind == 11) {
|
||||
Get();
|
||||
Expr(val);
|
||||
Expect(12);
|
||||
if (debug){Info<<"got Expr:"<<val<< " pos:"<< t->pos << nl;}
|
||||
|
||||
} else SynErr(15);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Parser::Parse() {
|
||||
t = NULL;
|
||||
if (dummyToken) { // safety: someone might call Parse() twice
|
||||
delete dummyToken;
|
||||
}
|
||||
la = dummyToken = new Token();
|
||||
la->val = coco_string_create(L"Dummy Token");
|
||||
Get();
|
||||
calcEntry();
|
||||
// let grammar deal with end-of-file expectations
|
||||
|
||||
}
|
||||
|
||||
|
||||
Parser::Parser(Scanner* scan, Errors* err)
|
||||
:
|
||||
dummyToken(NULL),
|
||||
deleteErrorsDestruct_(!err),
|
||||
errDist(minErrDist),
|
||||
scanner(scan),
|
||||
errors(err),
|
||||
t(NULL),
|
||||
la(NULL)
|
||||
{
|
||||
|
||||
if (!errors) { // add in default error handling
|
||||
errors = new Errors();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool Parser::StartOf(int s) {
|
||||
const bool T = true;
|
||||
const bool x = false;
|
||||
|
||||
static bool set[2][15] = {
|
||||
{T,x,x,x, x,x,x,x, x,x,x,x, x,x,x},
|
||||
{x,x,x,T, T,x,x,x, T,x,x,T, x,x,x}
|
||||
};
|
||||
|
||||
|
||||
|
||||
return set[s][la->kind];
|
||||
}
|
||||
|
||||
|
||||
Parser::~Parser() {
|
||||
if (deleteErrorsDestruct_) { // delete default error handling
|
||||
delete errors;
|
||||
}
|
||||
delete dummyToken;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Errors Implementation
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
Errors::Errors()
|
||||
:
|
||||
count(0)
|
||||
{}
|
||||
|
||||
|
||||
Errors::~Errors()
|
||||
{}
|
||||
|
||||
|
||||
void Errors::clear() {
|
||||
count = 0;
|
||||
}
|
||||
|
||||
|
||||
wchar_t* Errors::strerror(int n)
|
||||
{
|
||||
wchar_t* s;
|
||||
switch (n) {
|
||||
case 0: s = coco_string_create(L"EOF expected"); break;
|
||||
case 1: s = coco_string_create(L"ident expected"); break;
|
||||
case 2: s = coco_string_create(L"string expected"); break;
|
||||
case 3: s = coco_string_create(L"variable expected"); break;
|
||||
case 4: s = coco_string_create(L"number expected"); break;
|
||||
case 5: s = coco_string_create(L"\"{\" expected"); break;
|
||||
case 6: s = coco_string_create(L"\"}\" expected"); break;
|
||||
case 7: s = coco_string_create(L"\"+\" expected"); break;
|
||||
case 8: s = coco_string_create(L"\"-\" expected"); break;
|
||||
case 9: s = coco_string_create(L"\"*\" expected"); break;
|
||||
case 10: s = coco_string_create(L"\"/\" expected"); break;
|
||||
case 11: s = coco_string_create(L"\"(\" expected"); break;
|
||||
case 12: s = coco_string_create(L"\")\" expected"); break;
|
||||
case 13: s = coco_string_create(L"??? expected"); break;
|
||||
case 14: s = coco_string_create(L"invalid calcEntry"); break;
|
||||
case 15: s = coco_string_create(L"invalid Factor"); break;
|
||||
|
||||
default:
|
||||
{
|
||||
wchar_t format[20];
|
||||
coco_swprintf(format, 20, L"error %d", n);
|
||||
s = coco_string_create(format);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
void Errors::Warning(const wchar_t* msg) {
|
||||
wprintf(L"%ls\n", msg);
|
||||
}
|
||||
|
||||
|
||||
void Errors::Warning(int line, int col, const wchar_t* msg) {
|
||||
wprintf(L"-- line %d col %d: %ls\n", line, col, msg);
|
||||
}
|
||||
|
||||
|
||||
void Errors::Error(int line, int col, const wchar_t* msg) {
|
||||
wprintf(L"-- line %d col %d: %ls\n", line, col, msg);
|
||||
count++;
|
||||
}
|
||||
|
||||
|
||||
void Errors::SynErr(int line, int col, int n) {
|
||||
wchar_t* msg = this->strerror(n);
|
||||
this->Error(line, col, msg);
|
||||
coco_string_delete(msg);
|
||||
}
|
||||
|
||||
|
||||
void Errors::Exception(const wchar_t* msg) {
|
||||
wprintf(L"%ls", msg);
|
||||
::exit(1);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,206 +0,0 @@
|
||||
|
||||
|
||||
#ifndef COCO_calcEntryPARSER_H__
|
||||
#define COCO_calcEntryPARSER_H__
|
||||
|
||||
#include "dictionary.H"
|
||||
#include "scalar.H"
|
||||
#include "error.H"
|
||||
#include "wchar.H"
|
||||
|
||||
|
||||
#include "calcEntryScanner.h"
|
||||
|
||||
namespace Foam {
|
||||
namespace functionEntries {
|
||||
namespace calcEntryInternal {
|
||||
|
||||
|
||||
//! Parser error handing
|
||||
class Errors {
|
||||
public:
|
||||
int count; //!< The number of errors detected
|
||||
|
||||
//! Allocate and return a string describing the given error code.
|
||||
/** It is the responsibility of the caller to free this string,
|
||||
* eg, with coco_string_delete()
|
||||
*/
|
||||
static wchar_t* strerror(int n);
|
||||
|
||||
Errors(); //!< Construct null - start with no errors
|
||||
virtual ~Errors(); //!< Destructor
|
||||
virtual void clear(); //!< Clear the error count
|
||||
|
||||
//! Handle a general warning 'msg'
|
||||
virtual void Warning(const wchar_t* msg);
|
||||
//! Handle a general warning 'msg'
|
||||
virtual void Warning(int line, int col, const wchar_t* msg);
|
||||
//! Handle general error 'msg' (eg, a semantic error)
|
||||
virtual void Error(int line, int col, const wchar_t* msg);
|
||||
//! Handle syntax error 'n', uses strerror for the message, calls Error()
|
||||
virtual void SynErr(int line, int col, int n);
|
||||
//! Handle a general exception 'msg'
|
||||
virtual void Exception(const wchar_t* msg);
|
||||
|
||||
}; // Errors
|
||||
|
||||
|
||||
//! A Coco/R Parser
|
||||
class Parser {
|
||||
private:
|
||||
enum {
|
||||
_EOF=0,
|
||||
_ident=1,
|
||||
_string=2,
|
||||
_variable=3,
|
||||
_number=4,
|
||||
};
|
||||
static const int maxT = 13;
|
||||
|
||||
static const int minErrDist = 2; //!< min. distance before reporting errors
|
||||
|
||||
Token *dummyToken;
|
||||
bool deleteErrorsDestruct_; //!< delete the 'errors' member in destructor
|
||||
int errDist;
|
||||
|
||||
void SynErr(int n); //!< Handle syntax error 'n'
|
||||
void Get();
|
||||
void Expect(int n);
|
||||
bool StartOf(int s);
|
||||
void ExpectWeak(int n, int follow);
|
||||
bool WeakSeparator(int n, int syFol, int repFol);
|
||||
|
||||
public:
|
||||
Scanner *scanner;
|
||||
Errors *errors;
|
||||
|
||||
Token *t; //!< last recognized token
|
||||
Token *la; //!< lookahead token
|
||||
|
||||
static const int debug = 0;
|
||||
|
||||
//! The parent dictionary
|
||||
mutable dictionary* dict_;
|
||||
|
||||
//! Track that parent dictionary was set
|
||||
bool hasDict_;
|
||||
|
||||
//! The calculation result
|
||||
scalar val;
|
||||
|
||||
|
||||
//! token -> scalar
|
||||
scalar getScalar() const
|
||||
{
|
||||
return coco_string_toDouble(t->val);
|
||||
}
|
||||
|
||||
//! token -> string
|
||||
std::string getString() const
|
||||
{
|
||||
char* str = coco_string_create_char(t->val);
|
||||
std::string s(str);
|
||||
coco_string_delete(str);
|
||||
return s;
|
||||
}
|
||||
|
||||
//! attach a dictionary
|
||||
void dict(const dictionary& dict)
|
||||
{
|
||||
dict_ = const_cast<dictionary*>(&dict);
|
||||
hasDict_ = true;
|
||||
}
|
||||
|
||||
|
||||
//! lookup dictionary entry
|
||||
scalar getDictLookup() const
|
||||
{
|
||||
scalar dictValue = 0;
|
||||
|
||||
if (!hasDict_)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry() const"
|
||||
) << "No dictionary attached!"
|
||||
<< exit(FatalError);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* chars = coco_string_create_char
|
||||
(
|
||||
t->val,
|
||||
1,
|
||||
(coco_string_length(t->val) - 1)
|
||||
);
|
||||
word keyword(chars);
|
||||
coco_string_delete(chars);
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Info<<"lookup: " << keyword << nl;
|
||||
}
|
||||
|
||||
entry* entryPtr = dict_->lookupEntryPtr(keyword, true, false);
|
||||
if (entryPtr && !entryPtr->isDict())
|
||||
{
|
||||
if (entryPtr->stream().size() != 1)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry() const"
|
||||
) << "keyword " << keyword << " has "
|
||||
<< entryPtr->stream().size() << " values in dictionary "
|
||||
<< exit(FatalError);
|
||||
}
|
||||
entryPtr->stream() >> dictValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry() const"
|
||||
) << "keyword " << keyword << " is undefined in dictionary "
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
|
||||
return dictValue;
|
||||
}
|
||||
|
||||
scalar Result() const
|
||||
{
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
//! Construct for the specified scanner
|
||||
/**
|
||||
* Use the default error handling, or optionally provide an error
|
||||
* handler, which will not be deleted upon destruction.
|
||||
*/
|
||||
Parser(Scanner* scan, Errors* err = 0);
|
||||
~Parser(); //!< Destructor - cleanup errors and dummyToken
|
||||
void SemErr(const wchar_t* msg); //!< Handle semantic error
|
||||
|
||||
void calcEntry();
|
||||
void Expr(scalar& val);
|
||||
void Term(scalar& val);
|
||||
void Factor(scalar& val);
|
||||
|
||||
void Parse(); //!< Execute the parse operation
|
||||
|
||||
}; // end Parser
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
|
||||
#endif // COCO_calcEntryPARSER_H__
|
||||
|
||||
@ -1,932 +0,0 @@
|
||||
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include "calcEntryScanner.h"
|
||||
|
||||
// values for the file stream buffering
|
||||
#define MIN_BUFFER_LENGTH 1024 // 1KB
|
||||
#define MAX_BUFFER_LENGTH (64*MIN_BUFFER_LENGTH) // 64KB
|
||||
// value for the heap management
|
||||
#define HEAP_BLOCK_SIZE (64*1024) // 64KB
|
||||
|
||||
|
||||
namespace Foam {
|
||||
namespace functionEntries {
|
||||
namespace calcEntryInternal {
|
||||
|
||||
|
||||
// * * * * * * * * * * Wide Character String Routines * * * * * * * * * * * //
|
||||
|
||||
// string handling, wide character
|
||||
|
||||
wchar_t* coco_string_create(const wchar_t* str) {
|
||||
int len = coco_string_length(str);
|
||||
wchar_t* dest = new wchar_t[len + 1];
|
||||
if (len) {
|
||||
wcsncpy(dest, str, len);
|
||||
}
|
||||
dest[len] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
wchar_t* coco_string_create(const wchar_t* str, int index, int length) {
|
||||
int len = coco_string_length(str);
|
||||
if (len) {
|
||||
len = length;
|
||||
}
|
||||
wchar_t* dest = new wchar_t[len + 1];
|
||||
if (len) {
|
||||
wcsncpy(dest, &(str[index]), len);
|
||||
}
|
||||
dest[len] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
wchar_t* coco_string_create_lower(const wchar_t* str) {
|
||||
if (!str) { return NULL; }
|
||||
return coco_string_create_lower(str, 0, wcslen(str));
|
||||
}
|
||||
|
||||
|
||||
wchar_t* coco_string_create_lower(const wchar_t* str, int index, int len) {
|
||||
if (!str) { return NULL; }
|
||||
wchar_t* dest = new wchar_t[len + 1];
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
const wchar_t ch = str[index + i];
|
||||
if ((L'A' <= ch) && (ch <= L'Z')) {
|
||||
dest[i] = ch - (L'A' - L'a');
|
||||
}
|
||||
else {
|
||||
dest[i] = ch;
|
||||
}
|
||||
}
|
||||
dest[len] = L'\0';
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
wchar_t* coco_string_create_append(const wchar_t* str1, const wchar_t* str2) {
|
||||
int str1Len = coco_string_length(str1);
|
||||
int str2Len = coco_string_length(str2);
|
||||
|
||||
wchar_t* dest = new wchar_t[str1Len + str2Len + 1];
|
||||
|
||||
if (str1Len) { wcscpy(dest, str1); }
|
||||
if (str2Len) { wcscpy(dest + str1Len, str2); }
|
||||
|
||||
dest[str1Len + str2Len] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
wchar_t* coco_string_create_append(const wchar_t* str1, const wchar_t ch) {
|
||||
int len = coco_string_length(str1);
|
||||
wchar_t* dest = new wchar_t[len + 2];
|
||||
wcsncpy(dest, str1, len); // or use if (len) { wcscpy(dest, str1); }
|
||||
dest[len] = ch;
|
||||
dest[len + 1] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
void coco_string_delete(wchar_t* &str) {
|
||||
delete [] str;
|
||||
str = NULL;
|
||||
}
|
||||
|
||||
int coco_string_length(const wchar_t* str) {
|
||||
return str ? wcslen(str) : 0;
|
||||
}
|
||||
|
||||
bool coco_string_endswith(const wchar_t* str, const wchar_t* endstr) {
|
||||
int strLen = wcslen(str);
|
||||
int endLen = wcslen(endstr);
|
||||
return (endLen <= strLen) && (wcscmp(str + strLen - endLen, endstr) == 0);
|
||||
}
|
||||
|
||||
int coco_string_indexof(const wchar_t* str, const wchar_t ch) {
|
||||
const wchar_t* fnd = wcschr(str, ch);
|
||||
return fnd ? (fnd - str) : -1;
|
||||
}
|
||||
|
||||
int coco_string_lastindexof(const wchar_t* str, const wchar_t ch) {
|
||||
const wchar_t* fnd = wcsrchr(str, ch);
|
||||
return fnd ? (fnd - str) : -1;
|
||||
}
|
||||
|
||||
void coco_string_merge(wchar_t* &dest, const wchar_t* str) {
|
||||
if (!str) { return; }
|
||||
wchar_t* newstr = coco_string_create_append(dest, str);
|
||||
delete [] dest;
|
||||
dest = newstr;
|
||||
}
|
||||
|
||||
bool coco_string_equal(const wchar_t* str1, const wchar_t* str2) {
|
||||
return wcscmp(str1, str2) == 0;
|
||||
}
|
||||
|
||||
int coco_string_compareto(const wchar_t* str1, const wchar_t* str2) {
|
||||
return wcscmp(str1, str2);
|
||||
}
|
||||
|
||||
int coco_string_hash(const wchar_t* str) {
|
||||
int h = 0;
|
||||
if (!str) { return 0; }
|
||||
while (*str != 0) {
|
||||
h = (h * 7) ^ *str;
|
||||
++str;
|
||||
}
|
||||
if (h < 0) { h = -h; }
|
||||
return h;
|
||||
}
|
||||
|
||||
|
||||
double coco_string_toDouble(const wchar_t* str)
|
||||
{
|
||||
return str ? wcstod(str, NULL) : 0;
|
||||
}
|
||||
|
||||
float coco_string_toFloat(const wchar_t* str)
|
||||
{
|
||||
return str ? wcstof(str, NULL) : 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// string handling, byte character
|
||||
//
|
||||
|
||||
wchar_t* coco_string_create(const char* str) {
|
||||
int len = str ? strlen(str) : 0;
|
||||
wchar_t* dest = new wchar_t[len + 1];
|
||||
for (int i = 0; i < len; ++i) {
|
||||
dest[i] = wchar_t(str[i]);
|
||||
}
|
||||
dest[len] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
wchar_t* coco_string_create(const char* str, int index, int length) {
|
||||
int len = str ? length : 0;
|
||||
wchar_t* dest = new wchar_t[len + 1];
|
||||
for (int i = 0; i < len; ++i) {
|
||||
dest[i] = wchar_t(str[index + i]);
|
||||
}
|
||||
dest[len] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
char* coco_string_create_char(const wchar_t* str) {
|
||||
int len = coco_string_length(str);
|
||||
char *dest = new char[len + 1];
|
||||
for (int i = 0; i < len; ++i)
|
||||
{
|
||||
dest[i] = char(str[i]);
|
||||
}
|
||||
dest[len] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
char* coco_string_create_char(const wchar_t* str, int index, int length) {
|
||||
int len = coco_string_length(str);
|
||||
if (len) {
|
||||
len = length;
|
||||
}
|
||||
char *dest = new char[len + 1];
|
||||
for (int i = 0; i < len; ++i) {
|
||||
dest[i] = char(str[index + i]);
|
||||
}
|
||||
dest[len] = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
void coco_string_delete(char* &str) {
|
||||
delete [] str;
|
||||
str = NULL;
|
||||
}
|
||||
|
||||
|
||||
double coco_string_toDouble(const char* str)
|
||||
{
|
||||
return str ? strtod(str, NULL) : 0;
|
||||
}
|
||||
|
||||
float coco_string_toFloat(const char* str)
|
||||
{
|
||||
return str ? strtof(str, NULL) : 0;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * End of Wide Character String Routines * * * * * * * * * //
|
||||
|
||||
|
||||
Token::Token()
|
||||
:
|
||||
kind(0),
|
||||
pos(0),
|
||||
col(0),
|
||||
line(0),
|
||||
val(NULL),
|
||||
next(NULL)
|
||||
{}
|
||||
|
||||
|
||||
// Note: this delete may not be correct if the token was actually
|
||||
// allocated by the internal heap mechanism
|
||||
Token::~Token() {
|
||||
coco_string_delete(val);
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Buffer Implementation
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
Buffer::Buffer(Buffer* b)
|
||||
:
|
||||
buf(b->buf),
|
||||
bufCapacity(b->bufCapacity),
|
||||
bufLen(b->bufLen),
|
||||
bufPos(b->bufPos),
|
||||
bufStart(b->bufStart),
|
||||
fileLen(b->fileLen),
|
||||
cStream(b->cStream),
|
||||
stdStream(b->stdStream),
|
||||
isUserStream_(b->isUserStream_)
|
||||
{
|
||||
// avoid accidental deletion on any of these members
|
||||
b->buf = NULL;
|
||||
b->cStream = NULL;
|
||||
b->stdStream = NULL;
|
||||
}
|
||||
|
||||
|
||||
Buffer::Buffer(FILE* istr, bool isUserStream)
|
||||
:
|
||||
buf(NULL),
|
||||
bufCapacity(0),
|
||||
bufLen(0),
|
||||
bufPos(0),
|
||||
bufStart(0),
|
||||
fileLen(0),
|
||||
cStream(istr),
|
||||
stdStream(NULL),
|
||||
isUserStream_(isUserStream)
|
||||
{
|
||||
// ensure binary read on windows
|
||||
#if _MSC_VER >= 1300
|
||||
_setmode(_fileno(cStream), _O_BINARY);
|
||||
#endif
|
||||
|
||||
if (CanSeek()) {
|
||||
fseek(cStream, 0, SEEK_END);
|
||||
fileLen = ftell(cStream);
|
||||
fseek(cStream, 0, SEEK_SET);
|
||||
bufLen = (fileLen < MAX_BUFFER_LENGTH) ? fileLen : MAX_BUFFER_LENGTH;
|
||||
bufStart = INT_MAX; // nothing in the buffer so far
|
||||
}
|
||||
|
||||
bufCapacity = (bufLen > 0) ? bufLen : MIN_BUFFER_LENGTH;
|
||||
buf = new unsigned char[bufCapacity];
|
||||
if (fileLen > 0) SetPos(0); // setup buffer to position 0 (start)
|
||||
else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid
|
||||
if (bufLen == fileLen && CanSeek()) Close();
|
||||
}
|
||||
|
||||
|
||||
Buffer::Buffer(std::istream* istr, bool isUserStream)
|
||||
:
|
||||
buf(NULL),
|
||||
bufCapacity(0),
|
||||
bufLen(0),
|
||||
bufPos(0),
|
||||
bufStart(0),
|
||||
fileLen(0),
|
||||
cStream(NULL),
|
||||
stdStream(istr),
|
||||
isUserStream_(isUserStream)
|
||||
{
|
||||
// ensure binary read on windows
|
||||
#if _MSC_VER >= 1300
|
||||
// TODO
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Buffer::Buffer(std::string& str)
|
||||
:
|
||||
buf(NULL),
|
||||
bufCapacity(0),
|
||||
bufLen(0),
|
||||
bufPos(0),
|
||||
bufStart(0),
|
||||
fileLen(0),
|
||||
cStream(NULL),
|
||||
stdStream(new std::istringstream(str)),
|
||||
isUserStream_(false)
|
||||
{}
|
||||
|
||||
|
||||
Buffer::Buffer(const unsigned char* chars, int len)
|
||||
:
|
||||
buf(new unsigned char[len]),
|
||||
bufCapacity(len),
|
||||
bufLen(len),
|
||||
bufPos(0),
|
||||
bufStart(0),
|
||||
fileLen(len),
|
||||
cStream(NULL),
|
||||
stdStream(NULL),
|
||||
isUserStream_(false)
|
||||
{
|
||||
memcpy(this->buf, chars, len*sizeof(char));
|
||||
}
|
||||
|
||||
|
||||
Buffer::Buffer(const char* chars, int len)
|
||||
:
|
||||
buf(new unsigned char[len]),
|
||||
bufCapacity(len),
|
||||
bufLen(len),
|
||||
bufPos(0),
|
||||
bufStart(0),
|
||||
fileLen(len),
|
||||
cStream(NULL),
|
||||
stdStream(NULL),
|
||||
isUserStream_(false)
|
||||
{
|
||||
memcpy(this->buf, chars, len*sizeof(char));
|
||||
}
|
||||
|
||||
|
||||
Buffer::~Buffer() {
|
||||
Close();
|
||||
if (buf) {
|
||||
delete [] buf;
|
||||
buf = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Buffer::Close() {
|
||||
if (!isUserStream_) {
|
||||
if (cStream) {
|
||||
fclose(cStream);
|
||||
cStream = NULL;
|
||||
}
|
||||
else if (stdStream) {
|
||||
delete stdStream;
|
||||
stdStream = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int Buffer::Read() {
|
||||
if (stdStream)
|
||||
{
|
||||
int ch = stdStream->get();
|
||||
if (stdStream->eof())
|
||||
{
|
||||
return EoF;
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
|
||||
if (bufPos < bufLen) {
|
||||
return buf[bufPos++];
|
||||
} else if (GetPos() < fileLen) {
|
||||
SetPos(GetPos()); // shift buffer start to Pos
|
||||
return buf[bufPos++];
|
||||
} else if (cStream && !CanSeek() && (ReadNextStreamChunk() > 0)) {
|
||||
return buf[bufPos++];
|
||||
} else {
|
||||
return EoF;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int UTF8Buffer::Read() {
|
||||
int ch;
|
||||
do {
|
||||
ch = Buffer::Read();
|
||||
// until we find a utf8 start (0xxxxxxx or 11xxxxxx)
|
||||
} while ((ch >= 128) && ((ch & 0xC0) != 0xC0) && (ch != EoF));
|
||||
if (ch < 128 || ch == EoF) {
|
||||
// nothing to do, first 127 chars are the same in ascii and utf8
|
||||
// 0xxxxxxx or end of file character
|
||||
} else if ((ch & 0xF0) == 0xF0) {
|
||||
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
||||
int c1 = ch & 0x07; ch = Buffer::Read();
|
||||
int c2 = ch & 0x3F; ch = Buffer::Read();
|
||||
int c3 = ch & 0x3F; ch = Buffer::Read();
|
||||
int c4 = ch & 0x3F;
|
||||
ch = (((((c1 << 6) | c2) << 6) | c3) << 6) | c4;
|
||||
} else if ((ch & 0xE0) == 0xE0) {
|
||||
// 1110xxxx 10xxxxxx 10xxxxxx
|
||||
int c1 = ch & 0x0F; ch = Buffer::Read();
|
||||
int c2 = ch & 0x3F; ch = Buffer::Read();
|
||||
int c3 = ch & 0x3F;
|
||||
ch = (((c1 << 6) | c2) << 6) | c3;
|
||||
} else if ((ch & 0xC0) == 0xC0) {
|
||||
// 110xxxxx 10xxxxxx
|
||||
int c1 = ch & 0x1F; ch = Buffer::Read();
|
||||
int c2 = ch & 0x3F;
|
||||
ch = (c1 << 6) | c2;
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
|
||||
|
||||
int Buffer::Peek() {
|
||||
int curPos = GetPos();
|
||||
int ch = Read();
|
||||
SetPos(curPos);
|
||||
return ch;
|
||||
}
|
||||
|
||||
|
||||
int Buffer::GetPos() const {
|
||||
if (stdStream)
|
||||
{
|
||||
return stdStream->tellg();
|
||||
}
|
||||
|
||||
return bufPos + bufStart;
|
||||
}
|
||||
|
||||
|
||||
void Buffer::SetPos(int value) {
|
||||
if (stdStream)
|
||||
{
|
||||
stdStream->seekg(value, std::ios::beg);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((value >= fileLen) && cStream && !CanSeek()) {
|
||||
// Wanted position is after buffer and the stream
|
||||
// is not seek-able e.g. network or console,
|
||||
// thus we have to read the stream manually till
|
||||
// the wanted position is in sight.
|
||||
while ((value >= fileLen) && (ReadNextStreamChunk() > 0))
|
||||
{}
|
||||
}
|
||||
|
||||
if ((value < 0) || (value > fileLen)) {
|
||||
wprintf(L"--- buffer out of bounds access, position: %d\n", value);
|
||||
::exit(1);
|
||||
}
|
||||
|
||||
if ((value >= bufStart) && (value < (bufStart + bufLen))) { // already in buffer
|
||||
bufPos = value - bufStart;
|
||||
} else if (cStream) { // must be swapped in
|
||||
fseek(cStream, value, SEEK_SET);
|
||||
bufLen = fread(buf, sizeof(char), bufCapacity, cStream);
|
||||
bufStart = value; bufPos = 0;
|
||||
} else {
|
||||
bufPos = fileLen - bufStart; // make Pos return fileLen
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Read the next chunk of bytes from the stream, increases the buffer
|
||||
// if needed and updates the fields fileLen and bufLen.
|
||||
// Returns the number of bytes read.
|
||||
int Buffer::ReadNextStreamChunk() {
|
||||
int freeLen = bufCapacity - bufLen;
|
||||
if (freeLen == 0) {
|
||||
// in the case of a growing input stream
|
||||
// we can neither seek in the stream, nor can we
|
||||
// foresee the maximum length, thus we must adapt
|
||||
// the buffer size on demand.
|
||||
bufCapacity = bufLen * 2;
|
||||
unsigned char *newBuf = new unsigned char[bufCapacity];
|
||||
memcpy(newBuf, buf, bufLen*sizeof(char));
|
||||
delete [] buf;
|
||||
buf = newBuf;
|
||||
freeLen = bufLen;
|
||||
}
|
||||
int read = fread(buf + bufLen, sizeof(char), freeLen, cStream);
|
||||
if (read > 0) {
|
||||
fileLen = bufLen = (bufLen + read);
|
||||
return read;
|
||||
}
|
||||
// end of stream reached
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool Buffer::CanSeek() const {
|
||||
return cStream && (ftell(cStream) != -1);
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Scanner Implementation
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
Scanner::Scanner(FILE* istr)
|
||||
:
|
||||
buffer(new Buffer(istr, true))
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
|
||||
Scanner::Scanner(std::istream& istr)
|
||||
:
|
||||
buffer(new Buffer(&istr, true))
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
|
||||
Scanner::Scanner(const wchar_t* fileName) {
|
||||
char *chFileName = coco_string_create_char(fileName);
|
||||
FILE* istr;
|
||||
if ((istr = fopen(chFileName, "rb")) == NULL) {
|
||||
wprintf(L"--- Cannot open file %ls\n", fileName);
|
||||
::exit(1);
|
||||
}
|
||||
coco_string_delete(chFileName);
|
||||
buffer = new Buffer(istr, false);
|
||||
Init();
|
||||
}
|
||||
|
||||
|
||||
Scanner::Scanner(const unsigned char* buf, int len)
|
||||
:
|
||||
buffer(new Buffer(buf, len))
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
|
||||
Scanner::Scanner(const char* buf, int len)
|
||||
:
|
||||
buffer(new Buffer(buf, len))
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
|
||||
Scanner::~Scanner() {
|
||||
char* cur = reinterpret_cast<char*>(firstHeap);
|
||||
|
||||
while (cur) {
|
||||
cur = *(reinterpret_cast<char**>(cur + HEAP_BLOCK_SIZE));
|
||||
free(firstHeap);
|
||||
firstHeap = cur;
|
||||
}
|
||||
delete [] tval;
|
||||
delete buffer;
|
||||
}
|
||||
|
||||
|
||||
void Scanner::Init() {
|
||||
for (int i = 65; i <= 90; ++i) start.set(i, 1);
|
||||
for (int i = 97; i <= 122; ++i) start.set(i, 1);
|
||||
for (int i = 36; i <= 36; ++i) start.set(i, 5);
|
||||
start.set(45, 20);
|
||||
for (int i = 48; i <= 57; ++i) start.set(i, 9);
|
||||
start.set(34, 2);
|
||||
start.set(46, 7);
|
||||
start.set(123, 14);
|
||||
start.set(125, 15);
|
||||
start.set(43, 21);
|
||||
start.set(42, 16);
|
||||
start.set(47, 17);
|
||||
start.set(40, 18);
|
||||
start.set(41, 19);
|
||||
start.set(Buffer::EoF, -1);
|
||||
|
||||
|
||||
|
||||
tvalLength = 128;
|
||||
tval = new wchar_t[tvalLength]; // text of current token
|
||||
|
||||
// HEAP_BLOCK_SIZE byte heap + pointer to next heap block
|
||||
heap = malloc(HEAP_BLOCK_SIZE + sizeof(void*));
|
||||
firstHeap = heap;
|
||||
heapEnd =
|
||||
reinterpret_cast<void**>
|
||||
(reinterpret_cast<char*>(heap) + HEAP_BLOCK_SIZE);
|
||||
*heapEnd = 0;
|
||||
heapTop = heap;
|
||||
if (sizeof(Token) > HEAP_BLOCK_SIZE) {
|
||||
wprintf(L"--- Too small HEAP_BLOCK_SIZE\n");
|
||||
::exit(1);
|
||||
}
|
||||
|
||||
pos = -1; line = 1; col = 0;
|
||||
oldEols = 0;
|
||||
NextCh();
|
||||
if (ch == 0xEF) { // check optional byte order mark for UTF-8
|
||||
NextCh(); int ch1 = ch;
|
||||
NextCh(); int ch2 = ch;
|
||||
if (ch1 != 0xBB || ch2 != 0xBF) {
|
||||
wprintf(L"Illegal byte order mark at start of file");
|
||||
::exit(1);
|
||||
}
|
||||
Buffer *oldBuf = buffer;
|
||||
buffer = new UTF8Buffer(buffer); col = 0;
|
||||
delete oldBuf; oldBuf = NULL;
|
||||
NextCh();
|
||||
}
|
||||
|
||||
|
||||
pt = tokens = CreateToken(); // first token is a dummy
|
||||
}
|
||||
|
||||
|
||||
void Scanner::NextCh() {
|
||||
if (oldEols > 0) {
|
||||
ch = EOL;
|
||||
oldEols--;
|
||||
}
|
||||
else {
|
||||
pos = buffer->GetPos();
|
||||
ch = buffer->Read(); col++;
|
||||
// replace isolated '\r' by '\n' in order to make
|
||||
// eol handling uniform across Windows, Unix and Mac
|
||||
if (ch == L'\r' && buffer->Peek() != L'\n') ch = EOL;
|
||||
if (ch == EOL) { line++; col = 0; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Scanner::AddCh() {
|
||||
if (tlen >= tvalLength) {
|
||||
tvalLength *= 2;
|
||||
wchar_t *newBuf = new wchar_t[tvalLength];
|
||||
memcpy(newBuf, tval, tlen*sizeof(wchar_t));
|
||||
delete [] tval;
|
||||
tval = newBuf;
|
||||
}
|
||||
if (ch != Buffer::EoF) {
|
||||
tval[tlen++] = ch;
|
||||
NextCh();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool Scanner::Comment0() {
|
||||
int level = 1, pos0 = pos, line0 = line, col0 = col;
|
||||
NextCh();
|
||||
if (ch == L'/') {
|
||||
NextCh();
|
||||
for(;;) {
|
||||
if (ch == 10) {
|
||||
level--;
|
||||
if (level == 0) { oldEols = line - line0; NextCh(); return true; }
|
||||
NextCh();
|
||||
} else if (ch == buffer->EoF) return false;
|
||||
else NextCh();
|
||||
}
|
||||
} else {
|
||||
buffer->SetPos(pos0); NextCh(); line = line0; col = col0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Scanner::Comment1() {
|
||||
int level = 1, pos0 = pos, line0 = line, col0 = col;
|
||||
NextCh();
|
||||
if (ch == L'*') {
|
||||
NextCh();
|
||||
for(;;) {
|
||||
if (ch == L'*') {
|
||||
NextCh();
|
||||
if (ch == L'/') {
|
||||
level--;
|
||||
if (level == 0) { oldEols = line - line0; NextCh(); return true; }
|
||||
NextCh();
|
||||
}
|
||||
} else if (ch == L'/') {
|
||||
NextCh();
|
||||
if (ch == L'*') {
|
||||
level++; NextCh();
|
||||
}
|
||||
} else if (ch == buffer->EoF) return false;
|
||||
else NextCh();
|
||||
}
|
||||
} else {
|
||||
buffer->SetPos(pos0); NextCh(); line = line0; col = col0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void Scanner::CreateHeapBlock() {
|
||||
char* cur = reinterpret_cast<char*>(firstHeap);
|
||||
|
||||
// release unused blocks
|
||||
while
|
||||
(
|
||||
(reinterpret_cast<char*>(tokens) < cur)
|
||||
|| (reinterpret_cast<char*>(tokens) > (cur + HEAP_BLOCK_SIZE))
|
||||
) {
|
||||
cur = *(reinterpret_cast<char**>(cur + HEAP_BLOCK_SIZE));
|
||||
free(firstHeap);
|
||||
firstHeap = cur;
|
||||
}
|
||||
|
||||
// HEAP_BLOCK_SIZE byte heap + pointer to next heap block
|
||||
void* newHeap = malloc(HEAP_BLOCK_SIZE + sizeof(void*));
|
||||
*heapEnd = newHeap;
|
||||
heapEnd =
|
||||
reinterpret_cast<void**>
|
||||
(reinterpret_cast<char*>(newHeap) + HEAP_BLOCK_SIZE);
|
||||
*heapEnd = 0;
|
||||
heap = newHeap;
|
||||
heapTop = heap;
|
||||
}
|
||||
|
||||
|
||||
Token* Scanner::CreateToken() {
|
||||
const int reqMem = sizeof(Token);
|
||||
if
|
||||
(
|
||||
(reinterpret_cast<char*>(heapTop) + reqMem)
|
||||
>= reinterpret_cast<char*>(heapEnd)
|
||||
) {
|
||||
CreateHeapBlock();
|
||||
}
|
||||
// token 'occupies' heap starting at heapTop
|
||||
Token* tok = reinterpret_cast<Token*>(heapTop);
|
||||
// increment past this part of the heap, which is now used
|
||||
heapTop =
|
||||
reinterpret_cast<void*>
|
||||
(reinterpret_cast<char*>(heapTop) + reqMem);
|
||||
tok->val = NULL;
|
||||
tok->next = NULL;
|
||||
return tok;
|
||||
}
|
||||
|
||||
|
||||
void Scanner::AppendVal(Token* tok) {
|
||||
const int reqMem = (tlen + 1) * sizeof(wchar_t);
|
||||
if
|
||||
(
|
||||
(reinterpret_cast<char*>(heapTop) + reqMem)
|
||||
>= reinterpret_cast<char*>(heapEnd)
|
||||
) {
|
||||
if (reqMem > HEAP_BLOCK_SIZE) {
|
||||
wprintf(L"--- Too long token value\n");
|
||||
::exit(1);
|
||||
}
|
||||
CreateHeapBlock();
|
||||
}
|
||||
|
||||
// add text value from heap
|
||||
tok->val = reinterpret_cast<wchar_t*>(heapTop);
|
||||
|
||||
// increment past this part of the heap, which is now used
|
||||
heapTop =
|
||||
reinterpret_cast<void*>
|
||||
(reinterpret_cast<char*>(heapTop) + reqMem);
|
||||
|
||||
// copy the currently parsed tval into the token
|
||||
wcsncpy(tok->val, tval, tlen);
|
||||
tok->val[tlen] = L'\0';
|
||||
}
|
||||
|
||||
|
||||
Token* Scanner::NextToken() {
|
||||
while (ch == ' ' ||
|
||||
(ch >= 9 && ch <= 10) || ch == 13
|
||||
) NextCh();
|
||||
if ((ch == L'/' && Comment0()) || (ch == L'/' && Comment1())) return NextToken();
|
||||
t = CreateToken();
|
||||
t->pos = pos; t->col = col; t->line = line;
|
||||
int state = start.state(ch);
|
||||
tlen = 0; AddCh();
|
||||
|
||||
switch (state) {
|
||||
case -1: { t->kind = eofSym; break; } // NextCh already done
|
||||
case 0: { t->kind = noSym; break; } // NextCh already done
|
||||
case 1:
|
||||
case_1:
|
||||
if ((ch >= L'0' && ch <= L':') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_1;}
|
||||
else {t->kind = 1; break;}
|
||||
case 2:
|
||||
case_2:
|
||||
if (ch <= 9 || (ch >= 11 && ch <= 12) || (ch >= 14 && ch <= L'!') || (ch >= L'#' && ch <= L'[') || (ch >= L']' && ch <= 65535)) {AddCh(); goto case_2;}
|
||||
else if (ch == L'"') {AddCh(); goto case_4;}
|
||||
else if (ch == 92) {AddCh(); goto case_3;}
|
||||
else {t->kind = noSym; break;}
|
||||
case 3:
|
||||
case_3:
|
||||
if ((ch >= L' ' && ch <= L'~')) {AddCh(); goto case_2;}
|
||||
else {t->kind = noSym; break;}
|
||||
case 4:
|
||||
case_4:
|
||||
{t->kind = 2; break;}
|
||||
case 5:
|
||||
if ((ch >= L'A' && ch <= L'Z') || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_6;}
|
||||
else {t->kind = noSym; break;}
|
||||
case 6:
|
||||
case_6:
|
||||
if ((ch >= L'0' && ch <= L':') || (ch >= L'A' && ch <= L'Z') || ch == L'_' || (ch >= L'a' && ch <= L'z')) {AddCh(); goto case_6;}
|
||||
else {t->kind = 3; break;}
|
||||
case 7:
|
||||
case_7:
|
||||
if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_8;}
|
||||
else {t->kind = noSym; break;}
|
||||
case 8:
|
||||
case_8:
|
||||
if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_8;}
|
||||
else {t->kind = 4; break;}
|
||||
case 9:
|
||||
case_9:
|
||||
if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_9;}
|
||||
else if (ch == L'E' || ch == L'e') {AddCh(); goto case_10;}
|
||||
else if (ch == L'.') {AddCh(); goto case_13;}
|
||||
else {t->kind = 4; break;}
|
||||
case 10:
|
||||
case_10:
|
||||
if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_12;}
|
||||
else if (ch == L'+' || ch == L'-') {AddCh(); goto case_11;}
|
||||
else {t->kind = noSym; break;}
|
||||
case 11:
|
||||
case_11:
|
||||
if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_12;}
|
||||
else {t->kind = noSym; break;}
|
||||
case 12:
|
||||
case_12:
|
||||
if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_12;}
|
||||
else {t->kind = 4; break;}
|
||||
case 13:
|
||||
case_13:
|
||||
if ((ch >= L'0' && ch <= L'9')) {AddCh(); goto case_13;}
|
||||
else if (ch == L'E' || ch == L'e') {AddCh(); goto case_10;}
|
||||
else {t->kind = 4; break;}
|
||||
case 14:
|
||||
{t->kind = 5; break;}
|
||||
case 15:
|
||||
{t->kind = 6; break;}
|
||||
case 16:
|
||||
{t->kind = 9; break;}
|
||||
case 17:
|
||||
{t->kind = 10; break;}
|
||||
case 18:
|
||||
{t->kind = 11; break;}
|
||||
case 19:
|
||||
{t->kind = 12; break;}
|
||||
case 20:
|
||||
if (ch == L'.') {AddCh(); goto case_7;}
|
||||
else {t->kind = 8; break;}
|
||||
case 21:
|
||||
if (ch == L'.') {AddCh(); goto case_7;}
|
||||
else {t->kind = 7; break;}
|
||||
|
||||
}
|
||||
AppendVal(t);
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
// get the next token (possibly a token already seen during peeking)
|
||||
Token* Scanner::Scan() {
|
||||
if (tokens->next == NULL) {
|
||||
return pt = tokens = NextToken();
|
||||
} else {
|
||||
pt = tokens = tokens->next;
|
||||
return tokens;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// peek for the next token, ignore pragmas
|
||||
Token* Scanner::Peek() {
|
||||
do {
|
||||
if (pt->next == NULL) {
|
||||
pt->next = NextToken();
|
||||
}
|
||||
pt = pt->next;
|
||||
} while (pt->kind > maxT); // skip pragmas
|
||||
|
||||
return pt;
|
||||
}
|
||||
|
||||
|
||||
// make sure that peeking starts at the current scan position
|
||||
void Scanner::ResetPeek() {
|
||||
pt = tokens;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,398 +0,0 @@
|
||||
|
||||
|
||||
#ifndef COCO_calcEntrySCANNER_H__
|
||||
#define COCO_calcEntrySCANNER_H__
|
||||
|
||||
#include <climits>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <cwchar>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
// io.h and fcntl are used to ensure binary read from streams on windows
|
||||
#if _MSC_VER >= 1300
|
||||
#include <io.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#if _MSC_VER >= 1400
|
||||
#define coco_swprintf swprintf_s
|
||||
#elif _MSC_VER >= 1300
|
||||
#define coco_swprintf _snwprintf
|
||||
#else
|
||||
// assume every other compiler knows swprintf
|
||||
#define coco_swprintf swprintf
|
||||
#endif
|
||||
|
||||
|
||||
#define COCO_WCHAR_MAX 65535
|
||||
|
||||
|
||||
namespace Foam {
|
||||
namespace functionEntries {
|
||||
namespace calcEntryInternal {
|
||||
|
||||
|
||||
|
||||
// * * * * * * * * * * Wide Character String Routines * * * * * * * * * * * //
|
||||
|
||||
//
|
||||
// string handling, wide character
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
//! Create by copying str
|
||||
wchar_t* coco_string_create(const wchar_t* str);
|
||||
|
||||
//! Create a substring of str starting at index and length characters long
|
||||
wchar_t* coco_string_create(const wchar_t* str, int index, int length);
|
||||
|
||||
//! Create a lowercase string from str
|
||||
wchar_t* coco_string_create_lower(const wchar_t* str);
|
||||
|
||||
//! Create a lowercase substring from str starting at index and length characters long
|
||||
wchar_t* coco_string_create_lower(const wchar_t* str, int index, int length);
|
||||
|
||||
//! Create a string by concatenating str1 and str2
|
||||
wchar_t* coco_string_create_append(const wchar_t* str1, const wchar_t* str2);
|
||||
|
||||
//! Create a string by concatenating a character to the end of str
|
||||
wchar_t* coco_string_create_append(const wchar_t* str, const wchar_t ch);
|
||||
|
||||
//! Free storage and nullify the argument
|
||||
void coco_string_delete(wchar_t* &str);
|
||||
|
||||
//! The length of the str, or 0 if the str is NULL
|
||||
int coco_string_length(const wchar_t* str);
|
||||
|
||||
//! Return true if the str ends with the endstr
|
||||
bool coco_string_endswith(const wchar_t* str, const wchar_t* endstr);
|
||||
|
||||
//! Return the index of the first occurrence of ch.
|
||||
// Return -1 if nothing is found.
|
||||
int coco_string_indexof(const wchar_t* str, const wchar_t ch);
|
||||
|
||||
//! Return the index of the last occurrence of ch.
|
||||
// Return -1 if nothing is found.
|
||||
int coco_string_lastindexof(const wchar_t* str, const wchar_t ch);
|
||||
|
||||
//! Append str to dest
|
||||
void coco_string_merge(wchar_t* &dest, const wchar_t* str);
|
||||
|
||||
//! Compare strings, return true if they are equal
|
||||
bool coco_string_equal(const wchar_t* str1, const wchar_t* str2);
|
||||
|
||||
//! Compare strings, return 0 if they are equal
|
||||
int coco_string_compareto(const wchar_t* str1, const wchar_t* str2);
|
||||
|
||||
//! Simple string hashing function
|
||||
int coco_string_hash(const wchar_t* str);
|
||||
|
||||
//
|
||||
// String conversions
|
||||
// ~~~~~~~~~~~~~~~~~~
|
||||
|
||||
//! Convert wide string to double
|
||||
double coco_string_toDouble(const wchar_t* str);
|
||||
|
||||
//! Convert wide string to float
|
||||
float coco_string_toFloat(const wchar_t* str);
|
||||
|
||||
//
|
||||
// String handling, byte character
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
//! Create by copying byte str
|
||||
wchar_t* coco_string_create(const char* str);
|
||||
|
||||
//! Create a substring of byte str starting at index and length characters long
|
||||
wchar_t* coco_string_create(const char* str, int index, int length);
|
||||
|
||||
//! Create a byte string by copying str
|
||||
char* coco_string_create_char(const wchar_t* str);
|
||||
|
||||
//! Create a byte substring of str starting at index and length characters long
|
||||
char* coco_string_create_char(const wchar_t* str, int index, int length);
|
||||
|
||||
//! Free storage and nullify the argument
|
||||
void coco_string_delete(char* &str);
|
||||
|
||||
|
||||
//
|
||||
// String conversions, byte character
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
//! Convert byte string to double
|
||||
double coco_string_toDouble(const char* str);
|
||||
|
||||
//! Convert byte string to float
|
||||
float coco_string_toFloat(const char* str);
|
||||
|
||||
// * * * * * * * * * End of Wide Character String Routines * * * * * * * * * //
|
||||
|
||||
|
||||
//! Scanner Token
|
||||
class Token
|
||||
{
|
||||
public:
|
||||
int kind; //!< token kind
|
||||
int pos; //!< token position in the source text (starting at 0)
|
||||
int col; //!< token column (starting at 1)
|
||||
int line; //!< token line (starting at 1)
|
||||
wchar_t* val; //!< token value
|
||||
Token *next; //!< Peek tokens are kept in linked list
|
||||
|
||||
Token(); //!< Construct null
|
||||
~Token(); //!< Destructor - cleanup allocated val??
|
||||
};
|
||||
|
||||
|
||||
//! Scanner Buffer
|
||||
//
|
||||
//! This Buffer supports the following cases:
|
||||
//! -# seekable stream (file)
|
||||
//! -# whole stream in buffer
|
||||
//! -# part of stream in buffer
|
||||
//! -# non seekable stream (network, console)
|
||||
class Buffer {
|
||||
private:
|
||||
unsigned char *buf; //!< input buffer
|
||||
int bufCapacity; //!< capacity of buf
|
||||
int bufLen; //!< length of buffer
|
||||
int bufPos; //!< current position in buffer
|
||||
int bufStart; //!< position of first byte in buffer relative to input stream
|
||||
int fileLen; //!< length of input stream (may change if the stream is no file)
|
||||
FILE* cStream; //!< input stdio stream (normally seekable)
|
||||
std::istream* stdStream; //!< STL std stream (seekable)
|
||||
bool isUserStream_; //!< was the stream opened by the user?
|
||||
|
||||
int ReadNextStreamChunk();
|
||||
bool CanSeek() const; //!< true if stream can be seeked otherwise false
|
||||
|
||||
protected:
|
||||
Buffer(Buffer*); //!< for the UTF8Buffer
|
||||
|
||||
public:
|
||||
static const int EoF = COCO_WCHAR_MAX + 1;
|
||||
|
||||
//! Attach buffer to a stdio stream.
|
||||
//! User streams are not closed in the destructor
|
||||
Buffer(FILE*, bool isUserStream = true);
|
||||
|
||||
//! Attach buffer to an STL std stream
|
||||
//! User streams are not closed in the destructor
|
||||
explicit Buffer(std::istream*, bool isUserStream = true);
|
||||
|
||||
//! Copy buffer contents from constant string
|
||||
//! Handled internally as an istringstream
|
||||
explicit Buffer(std::string&);
|
||||
|
||||
//! Copy buffer contents from constant character string
|
||||
Buffer(const unsigned char* chars, int len);
|
||||
//! Copy buffer contents from constant character string
|
||||
Buffer(const char* chars, int len);
|
||||
|
||||
//! Close stream (but not user streams) and free buf (if any)
|
||||
virtual ~Buffer();
|
||||
|
||||
virtual void Close(); //!< Close stream (but not user streams)
|
||||
virtual int Read(); //!< Get character from stream or buffer
|
||||
virtual int Peek(); //!< Peek character from stream or buffer
|
||||
|
||||
virtual int GetPos() const;
|
||||
virtual void SetPos(int value);
|
||||
};
|
||||
|
||||
|
||||
//! A Scanner buffer that handles UTF-8 characters
|
||||
class UTF8Buffer : public Buffer {
|
||||
public:
|
||||
UTF8Buffer(Buffer* b) : Buffer(b) {}
|
||||
virtual int Read();
|
||||
};
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// StartStates
|
||||
//------------------------------------------------------------------------------
|
||||
//! maps characters (integers) to start states of tokens
|
||||
class StartStates {
|
||||
private:
|
||||
class Elem {
|
||||
public:
|
||||
int key, val;
|
||||
Elem *next;
|
||||
Elem(int k, int v) :
|
||||
key(k), val(v), next(0)
|
||||
{}
|
||||
};
|
||||
|
||||
Elem **tab;
|
||||
|
||||
public:
|
||||
StartStates() :
|
||||
tab(new Elem*[128])
|
||||
{
|
||||
memset(tab, 0, 128 * sizeof(Elem*));
|
||||
}
|
||||
|
||||
virtual ~StartStates() {
|
||||
for (int i = 0; i < 128; ++i) {
|
||||
Elem *e = tab[i];
|
||||
while (e) {
|
||||
Elem *next = e->next;
|
||||
delete e;
|
||||
e = next;
|
||||
}
|
||||
}
|
||||
delete [] tab;
|
||||
}
|
||||
|
||||
void set(int key, int val) {
|
||||
Elem *e = new Elem(key, val);
|
||||
int k = unsigned(key) % 128;
|
||||
e->next = tab[k];
|
||||
tab[k] = e;
|
||||
}
|
||||
|
||||
int state(int key) {
|
||||
Elem *e = tab[unsigned(key) % 128];
|
||||
while (e && e->key != key) e = e->next;
|
||||
return e ? e->val : 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// KeywordMap
|
||||
//------------------------------------------------------------------------------
|
||||
//! maps strings to integers (identifiers to keyword kinds)
|
||||
class KeywordMap {
|
||||
private:
|
||||
class Elem {
|
||||
public:
|
||||
wchar_t *key;
|
||||
int val;
|
||||
Elem *next;
|
||||
Elem(const wchar_t *k, int v) :
|
||||
key(coco_string_create(k)), val(v), next(0)
|
||||
{}
|
||||
virtual ~Elem() {
|
||||
coco_string_delete(key);
|
||||
}
|
||||
};
|
||||
|
||||
Elem **tab;
|
||||
|
||||
public:
|
||||
KeywordMap() :
|
||||
tab(new Elem*[128])
|
||||
{
|
||||
memset(tab, 0, 128 * sizeof(Elem*));
|
||||
}
|
||||
|
||||
virtual ~KeywordMap() {
|
||||
for (int i = 0; i < 128; ++i) {
|
||||
Elem *e = tab[i];
|
||||
while (e) {
|
||||
Elem *next = e->next;
|
||||
delete e;
|
||||
e = next;
|
||||
}
|
||||
}
|
||||
delete [] tab;
|
||||
}
|
||||
|
||||
void set(const wchar_t *key, int val) {
|
||||
Elem *e = new Elem(key, val);
|
||||
const int k = coco_string_hash(key) % 128;
|
||||
e->next = tab[k];
|
||||
tab[k] = e;
|
||||
}
|
||||
|
||||
int get(const wchar_t *key, int defaultVal) {
|
||||
Elem *e = tab[coco_string_hash(key) % 128];
|
||||
while (e && !coco_string_equal(e->key, key)) e = e->next;
|
||||
return e ? e->val : defaultVal;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//! A Coco/R Scanner
|
||||
class Scanner {
|
||||
private:
|
||||
static const int maxT = 13;
|
||||
static const int noSym = 13;
|
||||
|
||||
static const int eofSym = 0; //!< end-of-file token id
|
||||
static const char EOL = '\n'; //!< end-of-line character
|
||||
|
||||
void *firstHeap; //!< the start of the heap management
|
||||
void *heap; //!< the currently active block
|
||||
void *heapTop; //!< the top of the heap
|
||||
void **heapEnd; //!< the end of the last heap block
|
||||
|
||||
StartStates start; //!< A map of start states for particular characters
|
||||
KeywordMap keywords; //!< A hash of keyword literals to token kind
|
||||
|
||||
Token *t; //!< current token
|
||||
wchar_t *tval; //!< text of current token
|
||||
int tvalLength; //!< maximum capacity (length) for tval
|
||||
int tlen; //!< length of tval
|
||||
|
||||
Token *tokens; //!< list of tokens already peeked (first token is a dummy)
|
||||
Token *pt; //!< current peek token
|
||||
|
||||
int ch; //!< current input character
|
||||
|
||||
int pos; //!< byte position of current character
|
||||
int line; //!< line number of current character
|
||||
int col; //!< column number of current character
|
||||
int oldEols; //!< the number of EOLs that appeared in a comment
|
||||
|
||||
void CreateHeapBlock(); //!< add a heap block, freeing unused ones
|
||||
Token* CreateToken(); //!< fit token on the heap
|
||||
void AppendVal(Token* tok); //!< adjust tok->val to point to the heap and copy tval into it
|
||||
|
||||
void Init(); //!< complete the initialization for the constructors
|
||||
void NextCh(); //!< get the next input character into ch
|
||||
void AddCh(); //!< append the character ch to tval
|
||||
bool Comment0();
|
||||
bool Comment1();
|
||||
|
||||
Token* NextToken(); //!< get the next token
|
||||
|
||||
public:
|
||||
//! The scanner buffer
|
||||
Buffer *buffer;
|
||||
|
||||
//! Using an existing open file handle for the scanner
|
||||
Scanner(FILE*);
|
||||
|
||||
//! Using an existing open STL std stream
|
||||
explicit Scanner(std::istream&);
|
||||
|
||||
//! Open a file for reading and attach scanner
|
||||
explicit Scanner(const wchar_t* fileName);
|
||||
|
||||
//! Attach scanner to an existing character buffer
|
||||
Scanner(const unsigned char* chars, int len);
|
||||
//! Attach scanner to an existing character buffer
|
||||
Scanner(const char* chars, int len);
|
||||
|
||||
~Scanner(); //!< free heap and allocated memory
|
||||
Token* Scan(); //!< get the next token (possibly a token already seen during peeking)
|
||||
Token* Peek(); //!< peek for the next token, ignore pragmas
|
||||
void ResetPeek(); //!< ensure that peeking starts at the current scan position
|
||||
|
||||
}; // end Scanner
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
|
||||
#endif // COCO_calcEntrySCANNER_H__
|
||||
|
||||
@ -10,7 +10,7 @@ FoamFile
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object testDictTest;
|
||||
object testDictCalc;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -19,28 +19,13 @@ flowRatePerHour 720;
|
||||
x 10;
|
||||
y 20;
|
||||
z t s v;
|
||||
// z #test{ // this
|
||||
// 123 - 456
|
||||
// // comments // are
|
||||
// /* stripped
|
||||
// * 10
|
||||
// * {}
|
||||
// */
|
||||
// + 1 /*100 */ 10
|
||||
// };
|
||||
p #calc{ 1 + 2 + 10 * 15 + $x - $y };
|
||||
|
||||
p this calculation #calc{
|
||||
1 + 2 + 10 * 15 +
|
||||
$x - $y
|
||||
// $x + $y
|
||||
}
|
||||
is done inplace;
|
||||
// this calculation is in-place, but does not work inside a string:
|
||||
flowRate "The flow rate " #calc{ $flowRatePerHour / 3600 } "kg/s";
|
||||
|
||||
// this is also okay
|
||||
x #calc{ $x * 1E-3 };
|
||||
|
||||
flowRate #calc{ $flowRatePerHour / 3600};
|
||||
|
||||
xxx yyy;
|
||||
foo 30;
|
||||
bar 15;
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
46
applications/test/dictionary/testDictCalcError
Normal file
46
applications/test/dictionary/testDictCalcError
Normal file
@ -0,0 +1,46 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: Any |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object testDictCalcError;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
flowRatePerHour 720;
|
||||
|
||||
x 10;
|
||||
y 20;
|
||||
z t s v;
|
||||
// z #test{ // this
|
||||
// 123 - 456
|
||||
// // comments // are
|
||||
// /* stripped
|
||||
// * 10
|
||||
// * {}
|
||||
// */
|
||||
// + 1 /*100 */ 10
|
||||
// };
|
||||
|
||||
p this calculation #calc{
|
||||
1xxx1 + 2 + 10 * 15 +
|
||||
$x - $y
|
||||
// $x + $y
|
||||
}
|
||||
is done inplace;
|
||||
|
||||
|
||||
flowRate #calc{ $flowRatePerHour / 3600};
|
||||
|
||||
xxx yyy;
|
||||
foo 30;
|
||||
bar 15;
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
@ -53,7 +53,7 @@ int main(int argc, char *argv[])
|
||||
const indirectPrimitivePatch& coupledPatch = globalData.coupledPatch();
|
||||
|
||||
|
||||
// Test:print shared points
|
||||
// Test:print (collocated) shared points
|
||||
{
|
||||
const labelListList& globalPointSlaves =
|
||||
globalData.globalPointSlaves();
|
||||
@ -90,7 +90,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
|
||||
|
||||
// Test: point to faces addressing
|
||||
// Test: (collocated) point to faces addressing
|
||||
{
|
||||
const labelListList& globalPointBoundaryFaces =
|
||||
globalData.globalPointBoundaryFaces();
|
||||
@ -137,7 +137,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
|
||||
|
||||
// Test:point to cells addressing
|
||||
// Test:(collocated) point to cells addressing
|
||||
{
|
||||
const labelList& boundaryCells = globalData.boundaryCells();
|
||||
const labelListList& globalPointBoundaryCells =
|
||||
@ -172,7 +172,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
|
||||
|
||||
// Test:print shared edges
|
||||
// Test:print (collocated) shared edges
|
||||
{
|
||||
const labelListList& globalEdgeSlaves =
|
||||
globalData.globalEdgeSlaves();
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-ltriSurface \
|
||||
-lmeshTools \
|
||||
-ldynamicMesh
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-ldynamicMesh \
|
||||
-ltriSurface \
|
||||
-lmeshTools
|
||||
|
||||
@ -0,0 +1,3 @@
|
||||
foamToSurface.C
|
||||
|
||||
EXE = $(FOAM_APPBIN)/foamToSurface
|
||||
@ -0,0 +1,5 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/surfMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lsurfMesh
|
||||
@ -0,0 +1,129 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 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
|
||||
|
||||
Application
|
||||
foamToSurface
|
||||
|
||||
Description
|
||||
Reads an OpenFOAM mesh and writes the boundaries in a surface format.
|
||||
|
||||
Usage
|
||||
- foamToSurface [OPTION] \n
|
||||
Reads an OpenFOAM mesh and writes the boundaries in a surface format.
|
||||
|
||||
@param -scale \<factor\>\n
|
||||
Specify an alternative geometry scaling factor.
|
||||
Eg, use @b 1000 to scale @em [m] to @em [mm].
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "argList.H"
|
||||
#include "timeSelector.H"
|
||||
#include "Time.H"
|
||||
#include "polyMesh.H"
|
||||
|
||||
#include "MeshedSurfaces.H"
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
// Main program:
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
argList::noParallel();
|
||||
argList::validArgs.append("outputFile.ext");
|
||||
timeSelector::addOptions();
|
||||
|
||||
argList::addOption
|
||||
(
|
||||
"scale",
|
||||
"scale",
|
||||
"specify geometry scaling factor"
|
||||
);
|
||||
|
||||
# include "setRootCase.H"
|
||||
|
||||
const stringList& params = args.additionalArgs();
|
||||
|
||||
scalar scaleFactor = 0;
|
||||
args.optionReadIfPresent<scalar>("scale", scaleFactor);
|
||||
|
||||
fileName exportName(params[0]);
|
||||
|
||||
fileName exportBase = exportName.lessExt();
|
||||
word exportExt = exportName.ext();
|
||||
|
||||
if (!meshedSurface::canWriteType(exportExt, true))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
# include "createTime.H"
|
||||
instantList timeDirs = timeSelector::select0(runTime, args);
|
||||
# include "createPolyMesh.H"
|
||||
|
||||
forAll(timeDirs, timeI)
|
||||
{
|
||||
runTime.setTime(timeDirs[timeI], timeI);
|
||||
# include "getTimeIndex.H"
|
||||
|
||||
polyMesh::readUpdateState state = mesh.readUpdate();
|
||||
|
||||
if (timeI == 0 || state != polyMesh::UNCHANGED)
|
||||
{
|
||||
if (state == polyMesh::UNCHANGED)
|
||||
{
|
||||
exportName = exportBase + "." + exportExt;
|
||||
}
|
||||
else
|
||||
{
|
||||
exportName =
|
||||
exportBase + '_' + runTime.timeName() + "." + exportExt;
|
||||
}
|
||||
|
||||
meshedSurface surf(mesh.boundaryMesh());
|
||||
surf.scalePoints(scaleFactor);
|
||||
|
||||
Info<< "writing " << exportName;
|
||||
if (scaleFactor <= 0)
|
||||
{
|
||||
Info<< " without scaling" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
Info<< " with scaling " << scaleFactor << endl;
|
||||
}
|
||||
surf.write(exportName);
|
||||
}
|
||||
|
||||
Info<< nl << endl;
|
||||
}
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,51 @@
|
||||
// Read time index from */uniform/time, but treat 0 and constant specially
|
||||
|
||||
word timeName = "0";
|
||||
|
||||
if
|
||||
(
|
||||
runTime.timeName() != "constant"
|
||||
&& runTime.timeName() != "0"
|
||||
)
|
||||
{
|
||||
IOobject io
|
||||
(
|
||||
"time",
|
||||
runTime.timeName(),
|
||||
"uniform",
|
||||
runTime,
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
);
|
||||
|
||||
if (io.headerOk())
|
||||
{
|
||||
IOdictionary timeObject
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"time",
|
||||
runTime.timeName(),
|
||||
"uniform",
|
||||
runTime,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
)
|
||||
);
|
||||
|
||||
label index;
|
||||
timeObject.lookup("index") >> index;
|
||||
timeName = Foam::name(index);
|
||||
}
|
||||
else
|
||||
{
|
||||
timeName = runTime.timeName();
|
||||
// Info<< "skip ... missing entry " << io.objectPath() << endl;
|
||||
// continue;
|
||||
}
|
||||
}
|
||||
|
||||
Info<< "\nTime [" << timeName << "] = " << runTime.timeName() << nl;
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude
|
||||
-I$(LIB_SRC)/surfMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lmeshTools \
|
||||
-ltriSurface
|
||||
-lsurfMesh
|
||||
|
||||
@ -41,7 +41,8 @@ Description
|
||||
#include "cellSet.H"
|
||||
#include "faceSet.H"
|
||||
#include "DynamicList.H"
|
||||
#include "triSurface.H"
|
||||
|
||||
#include "MeshedSurfaces.H"
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
@ -268,9 +269,11 @@ void readCells
|
||||
break;
|
||||
}
|
||||
|
||||
IStringStream lineStr(line);
|
||||
label cellI, feID, physProp, matProp, colour, nNodes;
|
||||
lineStr >> cellI >> feID >> physProp >> matProp >> colour >> nNodes;
|
||||
|
||||
IStringStream lineStr(line);
|
||||
lineStr
|
||||
>> cellI >> feID >> physProp >> matProp >> colour >> nNodes;
|
||||
|
||||
if (foundFeType.insert(feID))
|
||||
{
|
||||
@ -297,7 +300,8 @@ void readCells
|
||||
|
||||
face cVerts(3);
|
||||
IStringStream lineStr(line);
|
||||
lineStr >> cVerts[0] >> cVerts[1] >> cVerts[2];
|
||||
lineStr
|
||||
>> cVerts[0] >> cVerts[1] >> cVerts[2];
|
||||
boundaryFaces.append(cVerts);
|
||||
boundaryFaceIndices.append(cellI);
|
||||
}
|
||||
@ -308,7 +312,8 @@ void readCells
|
||||
|
||||
face cVerts(4);
|
||||
IStringStream lineStr(line);
|
||||
lineStr >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
|
||||
lineStr
|
||||
>> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
|
||||
boundaryFaces.append(cVerts);
|
||||
boundaryFaceIndices.append(cellI);
|
||||
}
|
||||
@ -319,14 +324,15 @@ void readCells
|
||||
|
||||
labelList cVerts(4);
|
||||
IStringStream lineStr(line);
|
||||
lineStr >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
|
||||
lineStr
|
||||
>> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
|
||||
|
||||
cellVerts.append(cellShape(tet, cVerts, true));
|
||||
cellMaterial.append(physProp);
|
||||
|
||||
if (cellVerts.last().size() != cVerts.size())
|
||||
{
|
||||
Pout<< "Line:" << is.lineNumber()
|
||||
Info<< "Line:" << is.lineNumber()
|
||||
<< " element:" << cellI
|
||||
<< " type:" << feID
|
||||
<< " collapsed from " << cVerts << nl
|
||||
@ -341,15 +347,16 @@ void readCells
|
||||
|
||||
labelList cVerts(6);
|
||||
IStringStream lineStr(line);
|
||||
lineStr >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3]
|
||||
>> cVerts[4] >> cVerts[5];
|
||||
lineStr
|
||||
>> cVerts[0] >> cVerts[1] >> cVerts[2]
|
||||
>> cVerts[3] >> cVerts[4] >> cVerts[5];
|
||||
|
||||
cellVerts.append(cellShape(prism, cVerts, true));
|
||||
cellMaterial.append(physProp);
|
||||
|
||||
if (cellVerts.last().size() != cVerts.size())
|
||||
{
|
||||
Pout<< "Line:" << is.lineNumber()
|
||||
Info<< "Line:" << is.lineNumber()
|
||||
<< " element:" << cellI
|
||||
<< " type:" << feID
|
||||
<< " collapsed from " << cVerts << nl
|
||||
@ -373,7 +380,7 @@ void readCells
|
||||
|
||||
if (cellVerts.last().size() != cVerts.size())
|
||||
{
|
||||
Pout<< "Line:" << is.lineNumber()
|
||||
Info<< "Line:" << is.lineNumber()
|
||||
<< " element:" << cellI
|
||||
<< " type:" << feID
|
||||
<< " collapsed from " << cVerts << nl
|
||||
@ -388,7 +395,7 @@ void readCells
|
||||
IOWarningIn("readCells(IFstream&, label&)", is)
|
||||
<< "Cell type " << feID << " not supported" << endl;
|
||||
}
|
||||
is.getLine(line); //Do nothing
|
||||
is.getLine(line); // Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
@ -579,7 +586,11 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
argList::noParallel();
|
||||
argList::validArgs.append(".unv file");
|
||||
argList::addBoolOption("dump");
|
||||
argList::addBoolOption
|
||||
(
|
||||
"dump",
|
||||
"dump boundary faces as boundaryFaces.obj (for debugging)"
|
||||
);
|
||||
|
||||
# include "setRootCase.H"
|
||||
# include "createTime.H"
|
||||
@ -858,40 +869,25 @@ int main(int argc, char *argv[])
|
||||
polyPoints /= lengthScale;
|
||||
|
||||
|
||||
// For debugging: dump boundary faces as triSurface
|
||||
// For debugging: dump boundary faces as OBJ surface mesh
|
||||
if (args.optionFound("dump"))
|
||||
{
|
||||
DynamicList<labelledTri> triangles(boundaryFaces.size());
|
||||
|
||||
forAll(boundaryFaces, i)
|
||||
{
|
||||
const face& f = boundaryFaces[i];
|
||||
|
||||
faceList triFaces(f.nTriangles(polyPoints));
|
||||
label nTri = 0;
|
||||
f.triangles(polyPoints, nTri, triFaces);
|
||||
|
||||
forAll(triFaces, triFaceI)
|
||||
{
|
||||
const face& f = triFaces[triFaceI];
|
||||
triangles.append(labelledTri(f[0], f[1], f[2], 0));
|
||||
}
|
||||
}
|
||||
|
||||
// Create globally numbered tri surface
|
||||
triSurface rawSurface(triangles.shrink(), polyPoints);
|
||||
|
||||
// Create locally numbered tri surface
|
||||
triSurface surface
|
||||
(
|
||||
rawSurface.localFaces(),
|
||||
rawSurface.localPoints()
|
||||
);
|
||||
|
||||
Info<< "Writing boundary faces to STL file boundaryFaces.stl"
|
||||
Info<< "Writing boundary faces to OBJ file boundaryFaces.obj"
|
||||
<< nl << endl;
|
||||
|
||||
surface.write(runTime.path()/"boundaryFaces.stl");
|
||||
// Create globally numbered surface
|
||||
meshedSurface rawSurface
|
||||
(
|
||||
xferCopy(polyPoints),
|
||||
xferCopyTo< faceList >(boundaryFaces)
|
||||
);
|
||||
|
||||
// Write locally numbered surface
|
||||
meshedSurface
|
||||
(
|
||||
xferCopy(rawSurface.localPoints()),
|
||||
xferCopy(rawSurface.localFaces())
|
||||
).write(runTime.path()/"boundaryFaces.obj");
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -56,11 +56,6 @@ scalar getMergeDistance(const polyMesh& mesh, const scalar mergeTol)
|
||||
{
|
||||
const boundBox& meshBb = mesh.bounds();
|
||||
scalar mergeDist = mergeTol * meshBb.mag();
|
||||
scalar writeTol = std::pow
|
||||
(
|
||||
scalar(10.0),
|
||||
-scalar(IOstream::defaultPrecision())
|
||||
);
|
||||
|
||||
Info<< nl
|
||||
<< "Overall mesh bounding box : " << meshBb << nl
|
||||
@ -68,17 +63,27 @@ scalar getMergeDistance(const polyMesh& mesh, const scalar mergeTol)
|
||||
<< "Absolute matching distance : " << mergeDist << nl
|
||||
<< endl;
|
||||
|
||||
if (mesh.time().writeFormat() == IOstream::ASCII && mergeTol < writeTol)
|
||||
// check writing tolerance
|
||||
if (mesh.time().writeFormat() == IOstream::ASCII)
|
||||
{
|
||||
FatalErrorIn("getMergeDistance(const polyMesh&, const scalar)")
|
||||
<< "Your current settings specify ASCII writing with "
|
||||
<< IOstream::defaultPrecision() << " digits precision." << endl
|
||||
<< "Your merging tolerance (" << mergeTol << ") is finer than this."
|
||||
<< endl
|
||||
<< "Please change your writeFormat to binary"
|
||||
<< " or increase the writePrecision" << endl
|
||||
<< "or adjust the merge tolerance (-mergeTol)."
|
||||
<< exit(FatalError);
|
||||
const scalar writeTol = std::pow
|
||||
(
|
||||
scalar(10.0),
|
||||
-scalar(IOstream::defaultPrecision())
|
||||
);
|
||||
|
||||
if (mergeTol < writeTol)
|
||||
{
|
||||
FatalErrorIn("getMergeDistance(const polyMesh&, const dictionary&)")
|
||||
<< "Your current settings specify ASCII writing with "
|
||||
<< IOstream::defaultPrecision() << " digits precision." << nl
|
||||
<< "Your merging tolerance (" << mergeTol
|
||||
<< ") is finer than this." << nl
|
||||
<< "Change to binary writeFormat, "
|
||||
<< "or increase the writePrecision" << endl
|
||||
<< "or adjust the merge tolerance (mergeTol)."
|
||||
<< exit(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
return mergeDist;
|
||||
@ -107,7 +112,7 @@ void writeMesh
|
||||
mesh.time().path()/meshRefiner.timeName()
|
||||
);
|
||||
}
|
||||
Info<< "Written mesh in = "
|
||||
Info<< "Wrote mesh in = "
|
||||
<< mesh.time().cpuTimeIncrement() << " s." << endl;
|
||||
}
|
||||
|
||||
@ -115,7 +120,11 @@ void writeMesh
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
argList::addBoolOption("overwrite");
|
||||
argList::addBoolOption
|
||||
(
|
||||
"overwrite",
|
||||
"overwrite existing mesh files"
|
||||
);
|
||||
# include "setRootCase.H"
|
||||
# include "createTime.H"
|
||||
runTime.functionObjects().off();
|
||||
@ -126,7 +135,6 @@ int main(int argc, char *argv[])
|
||||
|
||||
const bool overwrite = args.optionFound("overwrite");
|
||||
|
||||
|
||||
// Check patches and faceZones are synchronised
|
||||
mesh.boundaryMesh().checkParallelSync(true);
|
||||
meshRefinement::checkCoupledFaceZones(mesh);
|
||||
@ -173,7 +181,7 @@ int main(int argc, char *argv[])
|
||||
// layer addition parameters
|
||||
const dictionary& layerDict = meshDict.subDict("addLayersControls");
|
||||
|
||||
|
||||
// absolute merge distance
|
||||
const scalar mergeDist = getMergeDistance
|
||||
(
|
||||
mesh,
|
||||
@ -181,17 +189,16 @@ int main(int argc, char *argv[])
|
||||
);
|
||||
|
||||
|
||||
|
||||
// Debug
|
||||
// ~~~~~
|
||||
|
||||
const label debug(readLabel(meshDict.lookup("debug")));
|
||||
const label debug = meshDict.lookupOrDefault<label>("debug", 0);
|
||||
if (debug > 0)
|
||||
{
|
||||
meshRefinement::debug = debug;
|
||||
meshRefinement::debug = debug;
|
||||
autoRefineDriver::debug = debug;
|
||||
autoSnapDriver::debug = debug;
|
||||
autoLayerDriver::debug = debug;
|
||||
autoSnapDriver::debug = debug;
|
||||
autoLayerDriver::debug = debug;
|
||||
}
|
||||
|
||||
|
||||
@ -272,7 +279,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
meshRefiner.write
|
||||
(
|
||||
debug&meshRefinement::OBJINTERSECTIONS,
|
||||
debug & meshRefinement::OBJINTERSECTIONS,
|
||||
mesh.time().path()/meshRefiner.timeName()
|
||||
);
|
||||
|
||||
@ -357,9 +364,9 @@ int main(int argc, char *argv[])
|
||||
// Now do the real work -refinement -snapping -layers
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Switch wantRefine(meshDict.lookup("castellatedMesh"));
|
||||
Switch wantSnap(meshDict.lookup("snap"));
|
||||
Switch wantLayers(meshDict.lookup("addLayers"));
|
||||
const Switch wantRefine(meshDict.lookup("castellatedMesh"));
|
||||
const Switch wantSnap(meshDict.lookup("snap"));
|
||||
const Switch wantLayers(meshDict.lookup("addLayers"));
|
||||
|
||||
if (wantRefine)
|
||||
{
|
||||
@ -479,7 +486,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1,10 +1,7 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude
|
||||
|
||||
|
||||
EXE_LIBS = \
|
||||
-ltriSurface \
|
||||
-ldynamicMesh \
|
||||
-lmeshTools
|
||||
|
||||
@ -1,8 +1 @@
|
||||
/*
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lmeshTools \
|
||||
-ltriSurface
|
||||
*/
|
||||
/* */
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/dynamicMesh/lnInclude \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude
|
||||
|
||||
|
||||
EXE_LIBS = \
|
||||
-ldynamicMesh \
|
||||
-lmeshTools
|
||||
|
||||
@ -18,6 +18,7 @@ EXE_LIBS = \
|
||||
-lengine \
|
||||
-lerrorEstimation \
|
||||
-lfieldFunctionObjects \
|
||||
-lfileFormats \
|
||||
-lfiniteVolume \
|
||||
-lforces \
|
||||
-lfvMotionSolvers \
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
// ignore special fields or fields that we don't handle
|
||||
//
|
||||
bool variableGood = true;
|
||||
for (label n1=startTime; n1<endTime && variableGood; ++n1)
|
||||
for (label n1=0; n1<Times.size() && variableGood; ++n1)
|
||||
{
|
||||
// ignore _0 fields
|
||||
if (fieldName.size() > 2 && fieldName(fieldName.size() - 2, 2) == "_0")
|
||||
|
||||
@ -19,7 +19,7 @@ if (Pstream::master())
|
||||
Info<< "Correcting time values. Adding " << Tcorr << endl;
|
||||
}
|
||||
|
||||
for (int n=startTime; n<endTime; n++)
|
||||
forAll(Times, n)
|
||||
{
|
||||
ensightCaseFile << setw(12) << Times[n].value() + Tcorr << " ";
|
||||
|
||||
|
||||
@ -185,7 +185,6 @@ void writeAllFaceData
|
||||
const labelList& prims,
|
||||
const label nPrims,
|
||||
const Field<Type>& pf,
|
||||
const labelList& patchProcessors,
|
||||
OFstream& ensightFile
|
||||
)
|
||||
{
|
||||
@ -199,16 +198,12 @@ void writeAllFaceData
|
||||
{
|
||||
writeData(map(pf, prims, cmpt), ensightFile);
|
||||
|
||||
forAll(patchProcessors, i)
|
||||
for (int slave=1; slave<Pstream::nProcs(); slave++)
|
||||
{
|
||||
if (patchProcessors[i] != 0)
|
||||
{
|
||||
label slave = patchProcessors[i];
|
||||
IPstream fromSlave(Pstream::scheduled, slave);
|
||||
scalarField pf(fromSlave);
|
||||
IPstream fromSlave(Pstream::scheduled, slave);
|
||||
scalarField pf(fromSlave);
|
||||
|
||||
writeData(pf, ensightFile);
|
||||
}
|
||||
writeData(pf, ensightFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -231,7 +226,6 @@ void writeAllFaceDataBinary
|
||||
const labelList& prims,
|
||||
const label nPrims,
|
||||
const Field<Type>& pf,
|
||||
const labelList& patchProcessors,
|
||||
std::ofstream& ensightFile
|
||||
)
|
||||
{
|
||||
@ -245,16 +239,12 @@ void writeAllFaceDataBinary
|
||||
{
|
||||
writeEnsDataBinary(map(pf, prims, cmpt), ensightFile);
|
||||
|
||||
forAll(patchProcessors, i)
|
||||
for (int slave=1; slave<Pstream::nProcs(); slave++)
|
||||
{
|
||||
if (patchProcessors[i] != 0)
|
||||
{
|
||||
label slave = patchProcessors[i];
|
||||
IPstream fromSlave(Pstream::scheduled, slave);
|
||||
scalarField pf(fromSlave);
|
||||
IPstream fromSlave(Pstream::scheduled, slave);
|
||||
scalarField pf(fromSlave);
|
||||
|
||||
writeEnsDataBinary(pf, ensightFile);
|
||||
}
|
||||
writeEnsDataBinary(pf, ensightFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -278,7 +268,6 @@ bool writePatchField
|
||||
const Foam::label ensightPatchI,
|
||||
const Foam::faceSets& boundaryFaceSet,
|
||||
const Foam::ensightMesh::nFacePrimitives& nfp,
|
||||
const Foam::labelList& patchProcessors,
|
||||
Foam::OFstream& ensightFile
|
||||
)
|
||||
{
|
||||
@ -297,7 +286,6 @@ bool writePatchField
|
||||
boundaryFaceSet.tris,
|
||||
nfp.nTris,
|
||||
pf,
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
);
|
||||
|
||||
@ -307,7 +295,6 @@ bool writePatchField
|
||||
boundaryFaceSet.quads,
|
||||
nfp.nQuads,
|
||||
pf,
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
);
|
||||
|
||||
@ -317,7 +304,6 @@ bool writePatchField
|
||||
boundaryFaceSet.polys,
|
||||
nfp.nPolys,
|
||||
pf,
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
);
|
||||
|
||||
@ -338,7 +324,6 @@ bool writePatchFieldBinary
|
||||
const Foam::label ensightPatchI,
|
||||
const Foam::faceSets& boundaryFaceSet,
|
||||
const Foam::ensightMesh::nFacePrimitives& nfp,
|
||||
const Foam::labelList& patchProcessors,
|
||||
std::ofstream& ensightFile
|
||||
)
|
||||
{
|
||||
@ -356,7 +341,6 @@ bool writePatchFieldBinary
|
||||
boundaryFaceSet.tris,
|
||||
nfp.nTris,
|
||||
pf,
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
);
|
||||
|
||||
@ -366,7 +350,6 @@ bool writePatchFieldBinary
|
||||
boundaryFaceSet.quads,
|
||||
nfp.nQuads,
|
||||
pf,
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
);
|
||||
|
||||
@ -376,7 +359,6 @@ bool writePatchFieldBinary
|
||||
boundaryFaceSet.polys,
|
||||
nfp.nPolys,
|
||||
pf,
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
);
|
||||
|
||||
@ -406,7 +388,6 @@ void writePatchField
|
||||
|
||||
const List<faceSets>& boundaryFaceSets = eMesh.boundaryFaceSets();
|
||||
const wordList& allPatchNames = eMesh.allPatchNames();
|
||||
const List<labelList>& allPatchProcs = eMesh.allPatchProcs();
|
||||
const HashTable<ensightMesh::nFacePrimitives>&
|
||||
nPatchPrims = eMesh.nPatchPrims();
|
||||
|
||||
@ -425,8 +406,6 @@ void writePatchField
|
||||
}
|
||||
|
||||
|
||||
const labelList& patchProcessors = allPatchProcs[patchi];
|
||||
|
||||
word pfName = patchName + '.' + fieldName;
|
||||
|
||||
word timeFile = prepend + itoa(timeIndex);
|
||||
@ -473,7 +452,6 @@ void writePatchField
|
||||
ensightPatchI,
|
||||
boundaryFaceSets[patchi],
|
||||
nPatchPrims.find(patchName)(),
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
);
|
||||
}
|
||||
@ -488,7 +466,6 @@ void writePatchField
|
||||
ensightPatchI,
|
||||
nullFaceSets,
|
||||
nPatchPrims.find(patchName)(),
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
);
|
||||
}
|
||||
@ -521,7 +498,6 @@ void ensightFieldAscii
|
||||
const cellSets& meshCellSets = eMesh.meshCellSets();
|
||||
const List<faceSets>& boundaryFaceSets = eMesh.boundaryFaceSets();
|
||||
const wordList& allPatchNames = eMesh.allPatchNames();
|
||||
const List<labelList>& allPatchProcs = eMesh.allPatchProcs();
|
||||
const wordHashSet& patchNames = eMesh.patchNames();
|
||||
const HashTable<ensightMesh::nFacePrimitives>&
|
||||
nPatchPrims = eMesh.nPatchPrims();
|
||||
@ -619,50 +595,23 @@ void ensightFieldAscii
|
||||
forAll(allPatchNames, patchi)
|
||||
{
|
||||
const word& patchName = allPatchNames[patchi];
|
||||
const labelList& patchProcessors = allPatchProcs[patchi];
|
||||
|
||||
if (patchNames.empty() || patchNames.found(patchName))
|
||||
{
|
||||
if (mesh.boundary()[patchi].size())
|
||||
{
|
||||
if
|
||||
if
|
||||
(
|
||||
writePatchField
|
||||
(
|
||||
writePatchField
|
||||
(
|
||||
vf.boundaryField()[patchi],
|
||||
patchi,
|
||||
ensightPatchI,
|
||||
boundaryFaceSets[patchi],
|
||||
nPatchPrims.find(patchName)(),
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
)
|
||||
vf.boundaryField()[patchi],
|
||||
patchi,
|
||||
ensightPatchI,
|
||||
boundaryFaceSets[patchi],
|
||||
nPatchPrims.find(patchName)(),
|
||||
ensightFile
|
||||
)
|
||||
{
|
||||
ensightPatchI++;
|
||||
}
|
||||
|
||||
}
|
||||
else if (Pstream::master())
|
||||
)
|
||||
{
|
||||
faceSets nullFaceSet;
|
||||
|
||||
if
|
||||
(
|
||||
writePatchField
|
||||
(
|
||||
Field<Type>(),
|
||||
-1,
|
||||
ensightPatchI,
|
||||
nullFaceSet,
|
||||
nPatchPrims.find(patchName)(),
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
)
|
||||
)
|
||||
{
|
||||
ensightPatchI++;
|
||||
}
|
||||
ensightPatchI++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -695,7 +644,6 @@ void ensightFieldBinary
|
||||
const cellSets& meshCellSets = eMesh.meshCellSets();
|
||||
const List<faceSets>& boundaryFaceSets = eMesh.boundaryFaceSets();
|
||||
const wordList& allPatchNames = eMesh.allPatchNames();
|
||||
const List<labelList>& allPatchProcs = eMesh.allPatchProcs();
|
||||
const wordHashSet& patchNames = eMesh.patchNames();
|
||||
const HashTable<ensightMesh::nFacePrimitives>&
|
||||
nPatchPrims = eMesh.nPatchPrims();
|
||||
@ -819,50 +767,23 @@ void ensightFieldBinary
|
||||
forAll(allPatchNames, patchi)
|
||||
{
|
||||
const word& patchName = allPatchNames[patchi];
|
||||
const labelList& patchProcessors = allPatchProcs[patchi];
|
||||
|
||||
if (patchNames.empty() || patchNames.found(patchName))
|
||||
{
|
||||
if (mesh.boundary()[patchi].size())
|
||||
{
|
||||
if
|
||||
if
|
||||
(
|
||||
writePatchFieldBinary
|
||||
(
|
||||
writePatchFieldBinary
|
||||
(
|
||||
vf.boundaryField()[patchi],
|
||||
patchi,
|
||||
ensightPatchI,
|
||||
boundaryFaceSets[patchi],
|
||||
nPatchPrims.find(patchName)(),
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
)
|
||||
vf.boundaryField()[patchi],
|
||||
patchi,
|
||||
ensightPatchI,
|
||||
boundaryFaceSets[patchi],
|
||||
nPatchPrims.find(patchName)(),
|
||||
ensightFile
|
||||
)
|
||||
{
|
||||
ensightPatchI++;
|
||||
}
|
||||
|
||||
}
|
||||
else if (Pstream::master())
|
||||
)
|
||||
{
|
||||
faceSets nullFaceSet;
|
||||
|
||||
if
|
||||
(
|
||||
writePatchFieldBinary
|
||||
(
|
||||
Field<Type>(),
|
||||
-1,
|
||||
ensightPatchI,
|
||||
nullFaceSet,
|
||||
nPatchPrims.find(patchName)(),
|
||||
patchProcessors,
|
||||
ensightFile
|
||||
)
|
||||
)
|
||||
{
|
||||
ensightPatchI++;
|
||||
}
|
||||
ensightPatchI++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -63,14 +63,12 @@ public:
|
||||
{
|
||||
public:
|
||||
|
||||
label nPoints;
|
||||
label nTris;
|
||||
label nQuads;
|
||||
label nPolys;
|
||||
|
||||
nFacePrimitives()
|
||||
:
|
||||
nPoints(0),
|
||||
nTris(0),
|
||||
nQuads(0),
|
||||
nPolys(0)
|
||||
@ -96,8 +94,6 @@ private:
|
||||
|
||||
wordList allPatchNames_;
|
||||
|
||||
List<labelList> allPatchProcs_;
|
||||
|
||||
wordHashSet patchNames_;
|
||||
|
||||
HashTable<nFacePrimitives> nPatchPrims_;
|
||||
@ -111,16 +107,6 @@ private:
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const ensightMesh&);
|
||||
|
||||
|
||||
//- Construct map from mesh points to merged points.
|
||||
// pointToGlobal : from mesh point to global point
|
||||
// uniquePoints : my set of unique points
|
||||
globalIndex mergeMeshPoints
|
||||
(
|
||||
labelList& pointToGlobal,
|
||||
pointField& uniquePoints
|
||||
) const;
|
||||
|
||||
void writePoints
|
||||
(
|
||||
const scalarField& pointsComponent,
|
||||
@ -188,7 +174,6 @@ private:
|
||||
void writeFacePrims
|
||||
(
|
||||
const faceList& patchFaces,
|
||||
const label pointOffset,
|
||||
OFstream& ensightGeometryFile
|
||||
) const;
|
||||
|
||||
@ -198,8 +183,6 @@ private:
|
||||
const labelList& prims,
|
||||
const label nPrims,
|
||||
const faceList& patchFaces,
|
||||
const labelList& pointOffsets,
|
||||
const labelList& patchProcessors,
|
||||
OFstream& ensightGeometryFile
|
||||
) const;
|
||||
|
||||
@ -212,7 +195,6 @@ private:
|
||||
void writeNSidedPoints
|
||||
(
|
||||
const faceList& patchFaces,
|
||||
const label pointOffset,
|
||||
OFstream& ensightGeometryFile
|
||||
) const;
|
||||
|
||||
@ -221,8 +203,6 @@ private:
|
||||
const labelList& prims,
|
||||
const label nPrims,
|
||||
const faceList& patchFaces,
|
||||
const labelList& pointOffsets,
|
||||
const labelList& patchProcessors,
|
||||
OFstream& ensightGeometryFile
|
||||
) const;
|
||||
|
||||
@ -231,7 +211,10 @@ private:
|
||||
const fileName& postProcPath,
|
||||
const word& prepend,
|
||||
const label timeIndex,
|
||||
Ostream& ensightCaseFile
|
||||
Ostream& ensightCaseFile,
|
||||
const labelList& pointToGlobal,
|
||||
const pointField& uniquePoints,
|
||||
const globalIndex& globalPoints
|
||||
) const;
|
||||
|
||||
void writeBinary
|
||||
@ -239,7 +222,10 @@ private:
|
||||
const fileName& postProcPath,
|
||||
const word& prepend,
|
||||
const label timeIndex,
|
||||
Ostream& ensightCaseFile
|
||||
Ostream& ensightCaseFile,
|
||||
const labelList& pointToGlobal,
|
||||
const pointField& uniquePoints,
|
||||
const globalIndex& globalPoints
|
||||
) const;
|
||||
|
||||
void writePrimsBinary
|
||||
@ -291,22 +277,18 @@ private:
|
||||
const labelList& prims,
|
||||
const label nPrims,
|
||||
const faceList& patchFaces,
|
||||
const labelList& pointOffsets,
|
||||
const labelList& patchProcessors,
|
||||
std::ofstream& ensightGeometryFile
|
||||
) const;
|
||||
|
||||
void writeFacePrimsBinary
|
||||
(
|
||||
const faceList& patchFaces,
|
||||
const label pointOffset,
|
||||
std::ofstream& ensightGeometryFile
|
||||
) const;
|
||||
|
||||
void writeNSidedPointsBinary
|
||||
(
|
||||
const faceList& patchFaces,
|
||||
const label pointOffset,
|
||||
std::ofstream& ensightGeometryFile
|
||||
) const;
|
||||
|
||||
@ -321,8 +303,6 @@ private:
|
||||
const labelList& prims,
|
||||
const label nPrims,
|
||||
const faceList& patchFaces,
|
||||
const labelList& pointOffsets,
|
||||
const labelList& patchProcessors,
|
||||
std::ofstream& ensightGeometryFile
|
||||
) const;
|
||||
|
||||
@ -362,11 +342,6 @@ public:
|
||||
return allPatchNames_;
|
||||
}
|
||||
|
||||
const List<labelList>& allPatchProcs() const
|
||||
{
|
||||
return allPatchProcs_;
|
||||
}
|
||||
|
||||
const wordHashSet& patchNames() const
|
||||
{
|
||||
return patchNames_;
|
||||
|
||||
@ -93,6 +93,9 @@ bool inFileNameList
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
timeSelector::addOptions();
|
||||
# include "addRegionOption.H"
|
||||
|
||||
argList::addBoolOption
|
||||
(
|
||||
"ascii",
|
||||
@ -111,7 +114,6 @@ int main(int argc, char *argv[])
|
||||
"An empty list suppresses writing the internalMesh."
|
||||
);
|
||||
|
||||
# include "addTimeOptions.H"
|
||||
# include "setRootCase.H"
|
||||
|
||||
// Check options
|
||||
@ -119,12 +121,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
# include "createTime.H"
|
||||
|
||||
// get the available time-steps
|
||||
instantList Times = runTime.times();
|
||||
|
||||
# include "checkTimeOptions.H"
|
||||
|
||||
runTime.setTime(Times[startTime], startTime);
|
||||
instantList Times = timeSelector::select0(runTime, args);
|
||||
|
||||
# include "createNamedMesh.H"
|
||||
|
||||
@ -214,9 +211,9 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Identify if lagrangian data exists at each time, and add clouds
|
||||
// to the 'allCloudNames' hash set
|
||||
for (label n=startTime; n<endTime; n++)
|
||||
forAll(Times, timeI)
|
||||
{
|
||||
runTime.setTime(Times[n], n);
|
||||
runTime.setTime(Times[timeI], timeI);
|
||||
|
||||
fileNameList cloudDirs = readDir
|
||||
(
|
||||
@ -267,9 +264,9 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Loop over all times to build list of fields and field types
|
||||
// for each cloud
|
||||
for (label n=startTime; n<endTime; n++)
|
||||
forAll(Times, timeI)
|
||||
{
|
||||
runTime.setTime(Times[n], n);
|
||||
runTime.setTime(Times[timeI], timeI);
|
||||
|
||||
IOobjectList cloudObjs
|
||||
(
|
||||
@ -296,20 +293,19 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
label nTimeSteps = 0;
|
||||
for (label n=startTime; n<endTime; n++)
|
||||
forAll(Times, timeIndex)
|
||||
{
|
||||
nTimeSteps++;
|
||||
runTime.setTime(Times[n], n);
|
||||
label timeIndex = n - startTime;
|
||||
runTime.setTime(Times[timeIndex], timeIndex);
|
||||
|
||||
word timeName = itoa(timeIndex);
|
||||
word timeFile = prepend + timeName;
|
||||
|
||||
Info<< "Translating time = " << runTime.timeName() << nl;
|
||||
|
||||
# include "moveMesh.H"
|
||||
polyMesh::readUpdateState meshState = mesh.readUpdate();
|
||||
|
||||
if (timeIndex == 0 || mesh.moving())
|
||||
if (timeIndex == 0 || (meshState != polyMesh::UNCHANGED))
|
||||
{
|
||||
eMesh.write
|
||||
(
|
||||
|
||||
@ -1,28 +0,0 @@
|
||||
{
|
||||
IOobject ioPoints
|
||||
(
|
||||
"points",
|
||||
runTime.timeName(),
|
||||
polyMesh::meshSubDir,
|
||||
mesh
|
||||
);
|
||||
|
||||
if (ioPoints.headerOk())
|
||||
{
|
||||
// Reading new points
|
||||
pointIOField newPoints
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"points",
|
||||
mesh.time().timeName(),
|
||||
polyMesh::meshSubDir,
|
||||
mesh,
|
||||
IOobject::MUST_READ,
|
||||
IOobject::NO_WRITE
|
||||
)
|
||||
);
|
||||
|
||||
mesh.movePoints(newPoints);
|
||||
}
|
||||
}
|
||||
@ -2,7 +2,6 @@ EXE_INC = \
|
||||
-I$(LIB_SRC)/finiteVolume/lnInclude \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/sampling/lnInclude \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude \
|
||||
-I$(LIB_SRC)/lagrangian/basic/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
@ -10,5 +9,4 @@ EXE_LIBS = \
|
||||
-lgenericPatchFields \
|
||||
-lmeshTools \
|
||||
-lsampling \
|
||||
-ltriSurface \
|
||||
-llagrangian
|
||||
|
||||
@ -3,7 +3,6 @@ EXE_INC = \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/sampling/lnInclude \
|
||||
-I$(LIB_SRC)/surfMesh/lnInclude \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude \
|
||||
-I$(LIB_SRC)/lagrangian/basic/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
@ -12,5 +11,4 @@ EXE_LIBS = \
|
||||
-lmeshTools \
|
||||
-lsampling \
|
||||
-lsurfMesh \
|
||||
-ltriSurface \
|
||||
-llagrangian
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
EXE_INC = \
|
||||
/* -I$(LIB_SRC)/cfdTools/general/lnInclude */ \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude
|
||||
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/meshTools/lnInclude \
|
||||
-I$(LIB_SRC)/edgeMesh/lnInclude \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude
|
||||
-I$(LIB_SRC)/edgeMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lmeshTools \
|
||||
-ledgeMesh \
|
||||
-ltriSurface
|
||||
-ledgeMesh
|
||||
|
||||
@ -79,11 +79,7 @@ void deleteBox
|
||||
{
|
||||
const point eMid = surf.edges()[edgeI].centre(surf.localPoints());
|
||||
|
||||
if
|
||||
(
|
||||
(removeInside && bb.contains(eMid))
|
||||
|| (!removeInside && !bb.contains(eMid))
|
||||
)
|
||||
if (removeInside ? bb.contains(eMid) : !bb.contains(eMid))
|
||||
{
|
||||
edgeStat[edgeI] = surfaceFeatures::NONE;
|
||||
}
|
||||
@ -133,7 +129,6 @@ int main(int argc, char *argv[])
|
||||
|
||||
|
||||
|
||||
|
||||
// Either construct features from surface&featureangle or read set.
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude
|
||||
-I$(LIB_SRC)/surfMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lmeshTools \
|
||||
-ltriSurface
|
||||
-lsurfMesh
|
||||
|
||||
@ -23,18 +23,16 @@ License
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Description
|
||||
Finds nearest triangle and vertex.
|
||||
Finds nearest face and vertex.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "argList.H"
|
||||
#include "OFstream.H"
|
||||
|
||||
#ifndef namespaceFoam
|
||||
#define namespaceFoam
|
||||
using namespace Foam;
|
||||
#endif
|
||||
#include "MeshedSurfaces.H"
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
@ -44,9 +42,9 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
argList::noParallel();
|
||||
argList::validArgs.clear();
|
||||
argList::addOption("x", "X");
|
||||
argList::addOption("y", "Y");
|
||||
argList::addOption("z", "Z");
|
||||
argList::addOption("x", "X", "The point x-coordinate (if non-zero)");
|
||||
argList::addOption("y", "Y", "The point y-coordinate (if non-zero)");
|
||||
argList::addOption("z", "Z", "The point y-coordinate (if non-zero)");
|
||||
|
||||
argList::validArgs.append("surface file");
|
||||
|
||||
@ -54,15 +52,15 @@ int main(int argc, char *argv[])
|
||||
|
||||
point samplePt
|
||||
(
|
||||
args.optionRead<scalar>("x"),
|
||||
args.optionRead<scalar>("y"),
|
||||
args.optionRead<scalar>("z")
|
||||
args.optionLookupOrDefault<scalar>("x", 0),
|
||||
args.optionLookupOrDefault<scalar>("y", 0),
|
||||
args.optionLookupOrDefault<scalar>("z", 0)
|
||||
);
|
||||
Info<< "Looking for nearest face/vertex to " << samplePt << endl;
|
||||
|
||||
|
||||
Info<< "Reading surf1 ..." << endl;
|
||||
triSurface surf1(args.additionalArgs()[0]);
|
||||
Info<< "Reading surf ..." << endl;
|
||||
meshedSurface surf1(args.additionalArgs()[0]);
|
||||
|
||||
//
|
||||
// Nearest vertex
|
||||
@ -83,11 +81,11 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
Info<< "Nearest vertex:" << endl
|
||||
<< " index :" << minIndex << " (in localPoints)" << endl
|
||||
Info<< "Nearest vertex:" << nl
|
||||
<< " index :" << minIndex << " (in localPoints)" << nl
|
||||
<< " index :" << surf1.meshPoints()[minIndex]
|
||||
<< " (in points)" << endl
|
||||
<< " coordinates:" << localPoints[minIndex] << endl
|
||||
<< " (in points)" << nl
|
||||
<< " coordinates:" << localPoints[minIndex] << nl
|
||||
<< endl;
|
||||
|
||||
//
|
||||
@ -101,8 +99,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
forAll(surf1, faceI)
|
||||
{
|
||||
const labelledTri& f = surf1[faceI];
|
||||
const point centre = f.centre(points);
|
||||
const point centre = surf1[faceI].centre(points);
|
||||
|
||||
const scalar dist = mag(centre - samplePt);
|
||||
if (dist < minDist)
|
||||
@ -112,16 +109,19 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
const labelledTri& f = surf1[minIndex];
|
||||
const face& f = surf1[minIndex];
|
||||
|
||||
Info<< "Face with nearest centre:" << endl
|
||||
<< " index :" << minIndex << endl
|
||||
<< " centre :" << f.centre(points) << endl
|
||||
<< " face :" << f << endl
|
||||
<< " vertex coords:" << points[f[0]] << " "
|
||||
<< points[f[1]] << " " << points[f[2]] << endl
|
||||
<< endl;
|
||||
Info<< "Face with nearest centre:" << nl
|
||||
<< " index :" << minIndex << nl
|
||||
<< " centre :" << f.centre(points) << nl
|
||||
<< " face :" << f << nl
|
||||
<< " vertex coords:\n";
|
||||
forAll(f, fp)
|
||||
{
|
||||
Info<< " " << points[f[fp]] << "\n";
|
||||
}
|
||||
|
||||
Info<< endl;
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude
|
||||
-I$(LIB_SRC)/surfMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lmeshTools \
|
||||
-ltriSurface
|
||||
-lsurfMesh
|
||||
|
||||
@ -23,15 +23,16 @@ License
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Description
|
||||
Example of simple laplacian smoother
|
||||
Example of a simple laplacian smoother
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "argList.H"
|
||||
#include "OFstream.H"
|
||||
#include "boundBox.H"
|
||||
|
||||
#include "MeshedSurfaces.H"
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
|
||||
@ -61,23 +62,20 @@ int main(int argc, char *argv[])
|
||||
label iters(readLabel(IStringStream(args.additionalArgs()[2])()));
|
||||
fileName outFileName(args.additionalArgs()[3]);
|
||||
|
||||
Info<< "Relax:" << relax << endl;
|
||||
Info<< "Iters:" << iters << endl;
|
||||
Info<< "Relax:" << relax << nl
|
||||
<< "Iters:" << iters << nl
|
||||
<< "Reading surface from " << surfFileName << " ..." << endl;
|
||||
|
||||
meshedSurface surf1(surfFileName);
|
||||
|
||||
Info<< "Reading surface from " << surfFileName << " ..." << endl;
|
||||
|
||||
triSurface surf1(surfFileName);
|
||||
|
||||
Info<< "Triangles : " << surf1.size() << endl;
|
||||
Info<< "Vertices : " << surf1.nPoints() << endl;
|
||||
Info<< "Bounding Box : " << boundBox(surf1.localPoints()) << endl;
|
||||
Info<< "Faces : " << surf1.size() << nl
|
||||
<< "Vertices : " << surf1.nPoints() << nl
|
||||
<< "Bounding Box : " << boundBox(surf1.localPoints()) << endl;
|
||||
|
||||
pointField newPoints(surf1.localPoints());
|
||||
|
||||
const labelListList& pointEdges = surf1.pointEdges();
|
||||
|
||||
|
||||
for (label iter = 0; iter < iters; iter++)
|
||||
{
|
||||
forAll(pointEdges, vertI)
|
||||
@ -100,16 +98,14 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
triSurface surf2
|
||||
(
|
||||
surf1.localFaces(),
|
||||
surf1.patches(),
|
||||
newPoints
|
||||
);
|
||||
|
||||
Info<< "Writing surface to " << outFileName << " ..." << endl;
|
||||
|
||||
surf2.write(outFileName);
|
||||
meshedSurface
|
||||
(
|
||||
xferMove(newPoints),
|
||||
xferCopy(surf1.localFaces()),
|
||||
xferCopy(surf1.surfZones())
|
||||
).write(outFileName);
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
|
||||
@ -100,10 +100,8 @@ int main(int argc, char *argv[])
|
||||
meshSubsetDict.lookup("addFaceNeighbours")
|
||||
);
|
||||
|
||||
Switch invertSelection
|
||||
(
|
||||
meshSubsetDict.lookup("invertSelection")
|
||||
);
|
||||
const bool invertSelection =
|
||||
meshSubsetDict.lookupOrDefault<bool>("invertSelection", false);
|
||||
|
||||
// Mark the cells for the subset
|
||||
|
||||
@ -246,7 +244,7 @@ int main(int argc, char *argv[])
|
||||
// bb of surface
|
||||
treeBoundBox bb(selectSurf.localPoints());
|
||||
|
||||
// Radnom number generator
|
||||
// Random number generator
|
||||
Random rndGen(354543);
|
||||
|
||||
// search engine
|
||||
@ -269,14 +267,11 @@ int main(int argc, char *argv[])
|
||||
indexedOctree<treeDataTriSurface>::volumeType t =
|
||||
selectTree.getVolumeType(fc);
|
||||
|
||||
if (t == indexedOctree<treeDataTriSurface>::INSIDE && !outside)
|
||||
{
|
||||
facesToSubset[faceI] = true;
|
||||
}
|
||||
else if
|
||||
if
|
||||
(
|
||||
t == indexedOctree<treeDataTriSurface>::OUTSIDE
|
||||
&& outside
|
||||
outside
|
||||
? (t == indexedOctree<treeDataTriSurface>::OUTSIDE)
|
||||
: (t == indexedOctree<treeDataTriSurface>::INSIDE)
|
||||
)
|
||||
{
|
||||
facesToSubset[faceI] = true;
|
||||
@ -346,20 +341,11 @@ int main(int argc, char *argv[])
|
||||
if (invertSelection)
|
||||
{
|
||||
Info<< "Inverting selection." << endl;
|
||||
boolList newFacesToSubset(facesToSubset.size());
|
||||
|
||||
forAll(facesToSubset, i)
|
||||
{
|
||||
if (facesToSubset[i])
|
||||
{
|
||||
newFacesToSubset[i] = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
newFacesToSubset[i] = true;
|
||||
}
|
||||
facesToSubset[i] = facesToSubset[i] ? false : true;
|
||||
}
|
||||
facesToSubset.transfer(newFacesToSubset);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -36,7 +36,7 @@ zone
|
||||
surface
|
||||
{
|
||||
name "sphere.stl";
|
||||
outside yes;
|
||||
outside yes;
|
||||
}
|
||||
|
||||
// Extend selection with edge neighbours
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
EXE_INC = \
|
||||
-I$(LIB_SRC)/triSurface/lnInclude
|
||||
-I$(LIB_SRC)/surfMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lmeshTools \
|
||||
-ltriSurface
|
||||
-lsurfMesh
|
||||
|
||||
@ -35,7 +35,6 @@ Description
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "argList.H"
|
||||
#include "OFstream.H"
|
||||
#include "IFstream.H"
|
||||
@ -45,6 +44,8 @@ Description
|
||||
#include "quaternion.H"
|
||||
#include "mathematicalConstants.H"
|
||||
|
||||
#include "MeshedSurfaces.H"
|
||||
|
||||
using namespace Foam;
|
||||
using namespace Foam::constant::mathematical;
|
||||
|
||||
@ -114,7 +115,7 @@ int main(int argc, char *argv[])
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
triSurface surf1(surfFileName);
|
||||
meshedSurface surf1(surfFileName);
|
||||
|
||||
pointField points(surf1.points());
|
||||
|
||||
@ -193,9 +194,8 @@ int main(int argc, char *argv[])
|
||||
points.replace(vector::Z, scaleVector.z()*points.component(vector::Z));
|
||||
}
|
||||
|
||||
triSurface surf2(surf1, surf1.patches(), points);
|
||||
|
||||
surf2.write(outFileName);
|
||||
surf1.movePoints(points);
|
||||
surf1.write(outFileName);
|
||||
|
||||
Info<< "End\n" << endl;
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -34,7 +34,7 @@ usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} [OPTION]
|
||||
Usage: ${0##*/} [OPTION]
|
||||
options:
|
||||
-help
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -34,7 +34,7 @@ usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} <file1> ... <fileN>
|
||||
Usage: ${0##*/} <file1> ... <fileN>
|
||||
|
||||
* find all .dep files referring to any of <file1> ... <fileN>
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -41,7 +41,7 @@
|
||||
#------------------------------------------------------------------------------
|
||||
usage() {
|
||||
cat <<USAGE 1>&2
|
||||
usage: ${0##*/} [-strip] path [wildcard] .. [wildcard]
|
||||
Usage: ${0##*/} [-strip] path [wildcard] .. [wildcard]
|
||||
|
||||
Prints its argument (which should be a ':' separated list) cleansed from
|
||||
- duplicate elements
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -35,10 +35,14 @@ usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1" 1>&2; shift; done
|
||||
cat <<USAGE 1>&2
|
||||
|
||||
usage: ${0##*/} [-case dir] [-region name]
|
||||
Usage: ${0##*/} [OPTION]
|
||||
options:
|
||||
-case <dir> specify alternative case directory, default is the cwd
|
||||
-region <name> specify alternative mesh region
|
||||
-help print the usage
|
||||
|
||||
Remove the contents of the constant/polyMesh directory
|
||||
as per the Foam::polyMesh::removeFiles() method.
|
||||
Remove the contents of the constant/polyMesh directory as per the
|
||||
Foam::polyMesh::removeFiles() method.
|
||||
|
||||
USAGE
|
||||
exit 1
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -40,7 +40,7 @@ usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} [OPTION] fileName
|
||||
Usage: ${0##*/} [OPTION] fileName
|
||||
${0##*/} -list
|
||||
|
||||
options:
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -41,7 +41,7 @@ usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} [OPTION] <application> ...
|
||||
Usage: ${0##*/} [OPTION] <application> ...
|
||||
|
||||
options:
|
||||
-v ver specify OpenFOAM version
|
||||
|
||||
15
bin/foamJob
15
bin/foamJob
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -33,14 +33,13 @@ usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} [OPTION] <application> ...
|
||||
|
||||
Usage: ${0##*/} [OPTION] <application> ...
|
||||
options:
|
||||
-case dir specify case directory
|
||||
-s also sends output to screen
|
||||
-p parallel run of processors
|
||||
-v ver specify OpenFOAM version
|
||||
-help this usage
|
||||
-case <dir> specify alternative case directory, default is the cwd
|
||||
-s also sends output to screen
|
||||
-p parallel run of processors
|
||||
-v <ver> specify OpenFOAM version
|
||||
-help print the usage
|
||||
|
||||
* run an OpenFOAM job in background.
|
||||
Redirects the output to 'log' in the case directory
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -33,7 +33,7 @@
|
||||
usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
usage: ${0##*/} <type> {args}
|
||||
Usage: ${0##*/} <type> {args}
|
||||
|
||||
* create a new standard OpenFOAM source or template file
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -38,7 +38,7 @@ foamVersion=$WM_PROJECT_VERSION
|
||||
usage() {
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} [OPTION] <file1> ... <fileN>
|
||||
Usage: ${0##*/} [OPTION] <file1> ... <fileN>
|
||||
|
||||
options:
|
||||
-v VER specifies the version to be written in the header
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -39,7 +39,7 @@
|
||||
usage() {
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} <turbulenceProperties>
|
||||
Usage: ${0##*/} <turbulenceProperties>
|
||||
|
||||
Where <turbulenceProperties> is the full path to the
|
||||
turbulenceProperties dictionary
|
||||
|
||||
33
bin/paraFoam
33
bin/paraFoam
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -30,18 +30,21 @@
|
||||
# start paraview with the OpenFOAM libraries
|
||||
#
|
||||
# Note
|
||||
# combining -block and -region options yields undefined behaviour
|
||||
# combining -block or -builtin options with the -region option yields
|
||||
# undefined behaviour
|
||||
#------------------------------------------------------------------------------
|
||||
usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} [OPTION]
|
||||
Usage: ${0##*/} [OPTION]
|
||||
options:
|
||||
-case dir specify alternative case directory
|
||||
-region name specify mesh region name
|
||||
-block use blockMesh reader (and .blockMesh file)
|
||||
-touch only create the .OpenFOAM file
|
||||
-block use blockMesh reader (uses .blockMesh extension)
|
||||
-builtin use VTK builtin OpenFOAM reader (uses .foam extension)
|
||||
-case <dir> specify alternative case directory, default is the cwd
|
||||
-region <name> specify alternative mesh region
|
||||
-touch only create the file (eg, .blockMesh, .OpenFOAM, etc)
|
||||
-help print the usage
|
||||
|
||||
* start paraview $ParaView_VERSION with the OpenFOAM libraries
|
||||
|
||||
@ -52,7 +55,7 @@ USAGE
|
||||
unset regionName touchOnly
|
||||
|
||||
# reader extension
|
||||
reader=OpenFOAM
|
||||
extension=OpenFOAM
|
||||
|
||||
# parse options
|
||||
while [ "$#" -gt 0 ]
|
||||
@ -62,7 +65,11 @@ do
|
||||
usage
|
||||
;;
|
||||
-block | -blockMesh)
|
||||
reader=blockMesh
|
||||
extension=blockMesh
|
||||
shift
|
||||
;;
|
||||
-builtin)
|
||||
extension=foam
|
||||
shift
|
||||
;;
|
||||
-case)
|
||||
@ -87,12 +94,12 @@ done
|
||||
|
||||
# get a sensible caseName from the directory name
|
||||
caseName=${PWD##*/}
|
||||
caseFile="$caseName.$reader"
|
||||
caseFile="$caseName.$extension"
|
||||
fvControls="system"
|
||||
|
||||
if [ -n "$regionName" ]
|
||||
then
|
||||
caseFile="$caseName{$regionName}.$reader"
|
||||
caseFile="$caseName{$regionName}.$extension"
|
||||
fvControls="$fvControls/$regionName"
|
||||
fi
|
||||
|
||||
@ -113,7 +120,7 @@ esac
|
||||
#
|
||||
# check existence of essential files
|
||||
#
|
||||
case $reader in
|
||||
case $extension in
|
||||
blockMesh)
|
||||
for check in system/controlDict constant/polyMesh/blockMeshDict
|
||||
do
|
||||
@ -121,7 +128,7 @@ blockMesh)
|
||||
done
|
||||
;;
|
||||
|
||||
OpenFOAM)
|
||||
builtin | OpenFOAM)
|
||||
for check in system/controlDict $fvControls/fvSchemes $fvControls/fvSolution
|
||||
do
|
||||
[ -s "$parentDir/$check" ] || usage "file does not exist: '$parentDir/$check'"
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -32,7 +32,7 @@
|
||||
usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE 1>&2
|
||||
usage: ${0##*/} [file]
|
||||
Usage: ${0##*/} [file]
|
||||
|
||||
Remove all .dep files or remove .dep files referring to <file>
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#------------------------------------------------------------------------------
|
||||
# License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -36,7 +36,7 @@ Template="$WM_PROJECT_DIR/bin/templates/source/_Template"
|
||||
usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
usage: $Script <type> <class name>
|
||||
Usage: $Script <type> <class name>
|
||||
|
||||
* create a new standard OpenFOAM source file
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -37,7 +37,7 @@ usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
|
||||
usage: $Script <type> <Class name> <Template arguments...>
|
||||
Usage: $Script <type> <Class name> <Template arguments...>
|
||||
|
||||
* create a new standard OpenFOAM source file
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#-------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -36,7 +36,7 @@ usage() {
|
||||
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} [OPTIONS] file1 [.. fileN]
|
||||
Usage: ${0##*/} [OPTIONS] file1 [.. fileN]
|
||||
options:
|
||||
-html create html (default)
|
||||
-latex create LaTeX
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -46,9 +46,12 @@ do
|
||||
fi
|
||||
done
|
||||
|
||||
# set MAJOR and VERSION variables if not already set
|
||||
[ -z "$ParaView_MAJOR" ] && export ParaView_MAJOR=paraview-3.6
|
||||
|
||||
# set VERSION and MAJOR (version) variables if not already set
|
||||
# the major version is "<digits>.<digits>"
|
||||
[ -z "$ParaView_VERSION" ] && export ParaView_VERSION=3.6.1
|
||||
[ -z "$ParaView_MAJOR" ] && export ParaView_MAJOR=3.6
|
||||
|
||||
|
||||
export ParaView_INST_DIR=$WM_THIRD_PARTY_DIR/paraview-$ParaView_VERSION
|
||||
export ParaView_DIR=$ParaView_INST_DIR/platforms/$WM_ARCH$WM_COMPILER
|
||||
@ -59,9 +62,9 @@ if [ -r $ParaView_PYTHON_DIR ]
|
||||
then
|
||||
if [ "$PYTHONPATH" ]
|
||||
then
|
||||
export PYTHONPATH=$PYTHONPATH:$ParaView_PYTHON_DIR:$ParaView_DIR/lib/$ParaView_MAJOR
|
||||
export PYTHONPATH=$PYTHONPATH:$ParaView_PYTHON_DIR:$ParaView_DIR/lib/paraview-$ParaView_MAJOR
|
||||
else
|
||||
export PYTHONPATH=$ParaView_PYTHON_DIR:$ParaView_DIR/lib/$ParaView_MAJOR
|
||||
export PYTHONPATH=$ParaView_PYTHON_DIR:$ParaView_DIR/lib/paraview-$ParaView_MAJOR
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
||||
# \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
|
||||
# \\/ M anipulation |
|
||||
#------------------------------------------------------------------------------
|
||||
# License
|
||||
@ -44,8 +44,10 @@ foreach cmake ( cmake-2.6.4 cmake-2.6.2 cmake-2.4.6 )
|
||||
endif
|
||||
end
|
||||
|
||||
if ( ! $?ParaView_MAJOR ) setenv ParaView_MAJOR paraview-3.6
|
||||
# set VERSION and MAJOR (version) variables if not already set
|
||||
# the major version is "<digits>.<digits>"
|
||||
if ( ! $?ParaView_VERSION ) setenv ParaView_VERSION 3.6.1
|
||||
if ( ! $?ParaView_MAJOR ) setenv ParaView_MAJOR 3.6
|
||||
|
||||
setenv ParaView_INST_DIR $WM_THIRD_PARTY_DIR/paraview-$ParaView_VERSION
|
||||
setenv ParaView_DIR $ParaView_INST_DIR/platforms/$WM_ARCH$WM_COMPILER
|
||||
@ -54,9 +56,9 @@ setenv ParaView_DIR $ParaView_INST_DIR/platforms/$WM_ARCH$WM_COMPILER
|
||||
set paraviewPython=$ParaView_DIR/Utilities/VTKPythonWrapping
|
||||
if ( -r $paraviewPython ) then
|
||||
if ($?PYTHONPATH) then
|
||||
setenv PYTHONPATH ${PYTHONPATH}:${paraviewPython}:$ParaView_DIR/lib/${ParaView_MAJOR}
|
||||
setenv PYTHONPATH ${PYTHONPATH}:${paraviewPython}:$ParaView_DIR/lib/paraview-${ParaView_MAJOR}
|
||||
else
|
||||
setenv PYTHONPATH ${paraviewPython}:$ParaView_DIR/lib/${ParaView_MAJOR}
|
||||
setenv PYTHONPATH ${paraviewPython}:$ParaView_DIR/lib/paraview-${ParaView_MAJOR}
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@ -87,11 +87,11 @@ switch ("$compilerInstall")
|
||||
case OpenFOAM:
|
||||
switch ("$WM_COMPILER")
|
||||
case Gcc:
|
||||
setenv WM_COMPILER_DIR $WM_THIRD_PARTY_DIR/gcc-4.4.2/platforms/$WM_ARCH$WM_COMPILER_ARCH
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/mpfr-2.4.1/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/gmp-4.2.4/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
setenv WM_COMPILER_DIR $WM_THIRD_PARTY_DIR/gcc-4.4.3/platforms/$WM_ARCH$WM_COMPILER_ARCH
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/mpfr-2.4.2/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/gmp-5.0.1/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
breaksw
|
||||
case Gcc44:
|
||||
case Gcc442:
|
||||
setenv WM_COMPILER_DIR $WM_THIRD_PARTY_DIR/gcc-4.4.2/platforms/$WM_ARCH$WM_COMPILER_ARCH
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/mpfr-2.4.1/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/gmp-4.2.4/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
@ -132,7 +132,7 @@ unset MPI_ARCH_PATH
|
||||
|
||||
switch ("$WM_MPLIB")
|
||||
case OPENMPI:
|
||||
set mpi_version=openmpi-1.4
|
||||
set mpi_version=openmpi-1.4.1
|
||||
setenv MPI_HOME $WM_THIRD_PARTY_DIR/$mpi_version
|
||||
setenv MPI_ARCH_PATH $MPI_HOME/platforms/$WM_OPTIONS
|
||||
|
||||
|
||||
@ -111,6 +111,11 @@ case "${compilerInstall:-OpenFOAM}" in
|
||||
OpenFOAM)
|
||||
case "$WM_COMPILER" in
|
||||
Gcc)
|
||||
export WM_COMPILER_DIR=$WM_THIRD_PARTY_DIR/gcc-4.4.3/platforms/$WM_ARCH$WM_COMPILER_ARCH
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/mpfr-2.4.2/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/gmp-5.0.1/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
;;
|
||||
Gcc442)
|
||||
export WM_COMPILER_DIR=$WM_THIRD_PARTY_DIR/gcc-4.4.2/platforms/$WM_ARCH$WM_COMPILER_ARCH
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/mpfr-2.4.1/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
_foamAddLib $WM_THIRD_PARTY_DIR/gmp-4.2.4/platforms/$WM_ARCH$WM_COMPILER_ARCH/lib
|
||||
@ -163,7 +168,7 @@ unset MPI_ARCH_PATH
|
||||
|
||||
case "$WM_MPLIB" in
|
||||
OPENMPI)
|
||||
mpi_version=openmpi-1.4
|
||||
mpi_version=openmpi-1.4.1
|
||||
export MPI_HOME=$WM_THIRD_PARTY_DIR/$mpi_version
|
||||
export MPI_ARCH_PATH=$MPI_HOME/platforms/$WM_OPTIONS
|
||||
|
||||
|
||||
@ -22,6 +22,7 @@ wmake libso OpenFOAM
|
||||
|
||||
wmake libso lagrangian/basic
|
||||
|
||||
wmake libso fileFormats
|
||||
wmake libso edgeMesh
|
||||
wmake libso surfMesh
|
||||
wmake libso triSurface
|
||||
|
||||
@ -142,6 +142,12 @@ $(functionEntries)/includeIfPresentEntry/includeIfPresentEntry.C
|
||||
$(functionEntries)/inputModeEntry/inputModeEntry.C
|
||||
$(functionEntries)/removeEntry/removeEntry.C
|
||||
|
||||
calcEntry = $(functionEntries)/calcEntry
|
||||
$(calcEntry)/calcEntryParser.atg
|
||||
$(calcEntry)/calcEntryInternal.C
|
||||
$(calcEntry)/calcEntry.C
|
||||
|
||||
|
||||
IOdictionary = db/IOobjects/IOdictionary
|
||||
$(IOdictionary)/IOdictionary.C
|
||||
$(IOdictionary)/IOdictionaryIO.C
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
EXE_INC =
|
||||
EXE_INC = -I$(OBJECTS_DIR)
|
||||
|
||||
LIB_LIBS = \
|
||||
$(FOAM_LIBBIN)/libOSspecific.o \
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -68,17 +68,23 @@ bool Foam::functionEntries::calcEntry::execute
|
||||
myErrorHandler("calcEntryInternal::Parser");
|
||||
|
||||
calcEntryInternal::Scanner scanner(iss);
|
||||
|
||||
// set the starting line
|
||||
scanner.Line(is.lineNumber());
|
||||
|
||||
calcEntryInternal::Parser parser(&scanner, &myErrorHandler);
|
||||
|
||||
// Attach dictionary context
|
||||
parser.dict(parentDict);
|
||||
|
||||
// Attach scalar functions
|
||||
// parser.functions(parentDict);
|
||||
|
||||
parser.Parse();
|
||||
|
||||
// make a small input list to contain the answer
|
||||
// mostly have an extra newline in the lookahead token
|
||||
// so subtract 1 to keep things vaguely in sync
|
||||
// (this is still far from perfect)
|
||||
is.lineNumber() = scanner.Line() - 1;
|
||||
|
||||
// a small input list to contain the answer
|
||||
tokenList tokens(2);
|
||||
tokens[0] = parser.Result();
|
||||
tokens[1] = token::END_STATEMENT;
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -77,7 +77,6 @@ public:
|
||||
primitiveEntry& entry,
|
||||
Istream& is
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -0,0 +1,129 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 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 "calcEntryInternal.H"
|
||||
#include "addToGlobalFunctionSelectionTable.H"
|
||||
#include "unitConversion.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace functionEntries
|
||||
{
|
||||
namespace calcEntryInternal
|
||||
{
|
||||
|
||||
defineGlobalFunctionSelectionTable(dispatch,ParamList);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#define globalConstant0(Name, Constant)\
|
||||
scalar Name##_0(const UList<scalar>& param) \
|
||||
{ \
|
||||
return Constant; \
|
||||
} \
|
||||
addNamedToGlobalFunctionSelectionTable(dispatch,ParamList,Name##_0,&Name##_0)
|
||||
|
||||
|
||||
#define globalFunction0(Name, Function)\
|
||||
scalar Name##_0(const UList<scalar>& param) \
|
||||
{ \
|
||||
return Function(); \
|
||||
} \
|
||||
addNamedToGlobalFunctionSelectionTable(dispatch,ParamList,Name##_0,&Name##_0)
|
||||
|
||||
|
||||
#define globalFunction1(Name, Function)\
|
||||
scalar Name##_1(const UList<scalar>& param) \
|
||||
{ \
|
||||
return Function(param[0]); \
|
||||
} \
|
||||
addNamedToGlobalFunctionSelectionTable(dispatch,ParamList,Name##_1,&Name##_1)
|
||||
|
||||
|
||||
#define globalFunction2(Name, Function)\
|
||||
scalar Name##_2(const UList<scalar>& param) \
|
||||
{ \
|
||||
return Function(param[0], param[1]); \
|
||||
} \
|
||||
addNamedToGlobalFunctionSelectionTable(dispatch,ParamList,Name##_2,&Name##_2)
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
globalConstant0(pi, constant::mathematical::pi);
|
||||
|
||||
globalFunction1(degToRad, degToRad);
|
||||
globalFunction1(radToDeg, radToDeg);
|
||||
globalFunction1(asin, Foam::asin);
|
||||
globalFunction1(acos, Foam::acos);
|
||||
globalFunction1(atan, Foam::atan);
|
||||
globalFunction1(sin, Foam::sin);
|
||||
globalFunction1(cos, Foam::cos);
|
||||
globalFunction1(tan, Foam::tan);
|
||||
globalFunction1(log, Foam::log);
|
||||
globalFunction1(log10, Foam::log10);
|
||||
globalFunction1(mag, Foam::mag);
|
||||
|
||||
globalFunction2(atan2, Foam::atan2);
|
||||
globalFunction2(pow, Foam::pow);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
scalar dispatch(const word& name, const UList<scalar>& param)
|
||||
{
|
||||
// create lookup name with parameter count
|
||||
const word lookupName = name + '_' + Foam::name(param.size());
|
||||
|
||||
dispatchParamListMemberFunctionTable::iterator mfIter =
|
||||
dispatchParamListMemberFunctionTablePtr_->find(lookupName);
|
||||
|
||||
if (mfIter == dispatchParamListMemberFunctionTablePtr_->end())
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntryInternal::scalarFunctions::dispatch"
|
||||
"(const word&, const UList<scalar>&) : "
|
||||
) << "Unknown function " << name << nl << nl
|
||||
<< "Valid types are :" << endl
|
||||
<< dispatchParamListMemberFunctionTablePtr_->sortedToc()
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
return mfIter()(param);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace calcEntryInternal
|
||||
} // End namespace functionEntries
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,81 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 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
|
||||
|
||||
Namespace
|
||||
Foam::functionEntries::calcEntryInternal
|
||||
|
||||
Description
|
||||
Contains global functions and classes for the calcEntry.
|
||||
|
||||
SourceFiles
|
||||
calcEntryInternal.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef calcEntryInternal_H
|
||||
#define calcEntryInternal_H
|
||||
|
||||
#include "error.H"
|
||||
#include "scalar.H"
|
||||
#include "DynamicList.H"
|
||||
#include "globalFunctionSelectionTables.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
namespace functionEntries
|
||||
{
|
||||
namespace calcEntryInternal
|
||||
{
|
||||
|
||||
// Global Function Selectors
|
||||
|
||||
declareGlobalFunctionSelectionTable
|
||||
(
|
||||
scalar,
|
||||
dispatch,
|
||||
ParamList,
|
||||
(
|
||||
const UList<scalar>& param
|
||||
),
|
||||
(param)
|
||||
);
|
||||
|
||||
|
||||
//- Dispatch calculation to the named function
|
||||
scalar dispatch(const word&, const UList<scalar>&);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace calcEntryInternal
|
||||
} // End namespace functionEntries
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,258 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Attributed Grammar for Coco/R (-*- C++ -*- version)
|
||||
compile with:
|
||||
coco-cpp calcEntryParser.atg
|
||||
\*---------------------------------------------------------------------------*/
|
||||
[copy]
|
||||
/*---------------------------------*- C++ -*---------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 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
|
||||
|
||||
@file calcEntryParser.atg
|
||||
|
||||
Description
|
||||
An attributed Coco/R grammar to parse simple arithmetic expressions
|
||||
|
||||
Includes support for dictionary $variables and some scalar functions
|
||||
(eg, sin, pow, ...)
|
||||
|
||||
SourceFiles
|
||||
generated
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
[/copy]
|
||||
#include "dictionary.H"
|
||||
#include "wchar.H"
|
||||
#include "calcEntryInternal.H"
|
||||
|
||||
|
||||
COMPILER calcEntry
|
||||
// grammar pragmas:
|
||||
$prefix=calcEntry
|
||||
$namespace=Foam::functionEntries::calcEntryInternal
|
||||
$define=EXPLICIT_EOF // grammar handles eof itself
|
||||
$define=STREAMS_ONLY // only use STL streams
|
||||
$define=NO_UTF8 // disable UTF8 on input
|
||||
|
||||
private:
|
||||
//- The parent dictionary
|
||||
dictionary* dict_;
|
||||
|
||||
//- The calculation result
|
||||
scalar val;
|
||||
|
||||
//- lookup dictionary entry
|
||||
scalar getDictLookup(const word&) const;
|
||||
|
||||
public:
|
||||
|
||||
//- attach a dictionary
|
||||
void dict(const dictionary& dict)
|
||||
{
|
||||
dict_ = const_cast<dictionary*>(&dict);
|
||||
}
|
||||
|
||||
//- Return the calculated result
|
||||
scalar Result() const
|
||||
{
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
[initialize] // add to Parser constructor
|
||||
dict_ = 0;
|
||||
val = 0;
|
||||
[/initialize]
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
[code]
|
||||
Foam::scalar Parser::getDictLookup(const word& keyword) const
|
||||
{
|
||||
if (!dict_)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry(const word&) const"
|
||||
) << "No dictionary attached!"
|
||||
<< exit(FatalError);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
scalar dictValue = 0;
|
||||
|
||||
entry* entryPtr = dict_->lookupEntryPtr(keyword, true, false);
|
||||
if (entryPtr && !entryPtr->isDict())
|
||||
{
|
||||
if (entryPtr->stream().size() != 1)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry(const word&) const"
|
||||
) << "keyword " << keyword << " has "
|
||||
<< entryPtr->stream().size() << " values in dictionary "
|
||||
<< exit(FatalError);
|
||||
}
|
||||
entryPtr->stream() >> dictValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"calcEntry::getDictEntry(const word&) const"
|
||||
) << "keyword " << keyword << " is undefined in dictionary "
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
return dictValue;
|
||||
}
|
||||
[/code]
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
CHARACTERS
|
||||
letter = 'A'..'Z' + 'a'..'z' + '_'.
|
||||
digit = "0123456789".
|
||||
alphanum = letter + digit.
|
||||
sign = '+' + '-'.
|
||||
cr = '\r'.
|
||||
lf = '\n'.
|
||||
tab = '\t'.
|
||||
stringCh = ANY - '"' - '\\' - cr - lf.
|
||||
printable = '\u0020' .. '\u007e'.
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * TOKENS * * * * * * * * * * * * * * * * * //
|
||||
|
||||
TOKENS
|
||||
|
||||
// identifier
|
||||
ident =
|
||||
letter { alphanum }.
|
||||
|
||||
// string
|
||||
string =
|
||||
'"' { stringCh | '\\' printable } '"'.
|
||||
|
||||
// dictionary lookup identifier
|
||||
// starts with '$' and otherwise limited to a normal identifier
|
||||
variable =
|
||||
'$' letter { alphanum }.
|
||||
|
||||
// floating point and integer numbers
|
||||
number =
|
||||
[sign] ('.' digit { digit } ) | ( digit { digit } [ '.' { digit } ])
|
||||
[ ('E' | 'e') [sign] digit { digit } ].
|
||||
|
||||
|
||||
// * * * * * * * * * * * PRAGMAS / COMMENTS / IGNORE * * * * * * * * * * * //
|
||||
|
||||
COMMENTS FROM "/*" TO "*/" NESTED
|
||||
COMMENTS FROM "//" TO lf
|
||||
|
||||
IGNORE cr + lf + tab
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * PRODUCTIONS * * * * * * * * * * * * * * * //
|
||||
|
||||
PRODUCTIONS
|
||||
|
||||
calcEntry (. val = 0; .)
|
||||
=
|
||||
'{' Expr<val> '}' (. // reposition to immediately after the closing '}'
|
||||
scanner->buffer->SetPos(t->pos + 1);
|
||||
.)
|
||||
| ( Expr<val> EOF )
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
Expr<scalar& val> (. scalar val2 = 0; .)
|
||||
=
|
||||
Term<val>
|
||||
{
|
||||
'+' Term<val2> (. val += val2; .)
|
||||
| '-' Term<val2> (. val -= val2; .)
|
||||
}
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
Term<scalar& val> (. scalar val2 = 0; .)
|
||||
=
|
||||
Factor<val>
|
||||
{
|
||||
'*' Factor<val2> (. val *= val2; .)
|
||||
| '/' Factor<val2> (. val /= val2; .)
|
||||
}
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
// Note the treatment of the leading signs is fairly generous
|
||||
// eg, "10 + - 10" is treated like "10 + -10"
|
||||
//
|
||||
Factor<scalar& val> (. bool negative = false; .)
|
||||
=
|
||||
['+' | '-' (. negative = true; .)
|
||||
]
|
||||
(
|
||||
Func<val> | '(' Expr<val> ')'
|
||||
| variable (.
|
||||
// skip leading '$' for the keyword
|
||||
val = getDictLookup(t->toString(1, t->length()-1));
|
||||
.)
|
||||
| number (. val = coco_string_toDouble(t->val); .)
|
||||
) (. if (negative) { val = -val; } .)
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
// functions like sin(x) or pow(x, y) etc.
|
||||
Func<scalar& val>
|
||||
=
|
||||
ident (.
|
||||
word funcName(t->toString());
|
||||
DynamicList<scalar> stack(4);
|
||||
.)
|
||||
'('
|
||||
[ (. scalar x; .)
|
||||
Expr<x> (. stack.append(x); .)
|
||||
{ ',' Expr<x> (. stack.append(x); .)
|
||||
}
|
||||
]
|
||||
')' (. val = dispatch(funcName, stack); .)
|
||||
.
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
END calcEntry.
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -45,7 +45,7 @@ namespace Foam
|
||||
Class CocoParserErrors Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class BaseClass>
|
||||
template<class BaseClass, class StringClass=std::wstring>
|
||||
class CocoParserErrors
|
||||
:
|
||||
public BaseClass
|
||||
@ -90,14 +90,14 @@ public:
|
||||
// Error Handling
|
||||
|
||||
//- Handle a general warning 'msg'
|
||||
virtual void Warning(const wchar_t* msg)
|
||||
virtual void Warning(const StringClass& msg)
|
||||
{
|
||||
WarningIn(name_)
|
||||
<< msg << endl;
|
||||
}
|
||||
|
||||
//- Handle a general warning 'msg'
|
||||
virtual void Warning(int line, int col, const wchar_t* msg)
|
||||
virtual void Warning(int line, int col, const StringClass& msg)
|
||||
{
|
||||
WarningIn(name_)
|
||||
<<"line " << line << " col " << col << ": "
|
||||
@ -105,7 +105,7 @@ public:
|
||||
}
|
||||
|
||||
//- Handle general error 'msg' (eg, a semantic error)
|
||||
virtual void Error(int line, int col, const wchar_t* msg)
|
||||
virtual void Error(int line, int col, const StringClass& msg)
|
||||
{
|
||||
FatalErrorIn(name_)
|
||||
<< "line " << line << " col " << col <<": " << msg << endl
|
||||
@ -113,7 +113,7 @@ public:
|
||||
}
|
||||
|
||||
//- Handle general error 'msg' (eg, a semantic error)
|
||||
virtual void Error(const wchar_t* msg)
|
||||
virtual void Error(const StringClass& msg)
|
||||
{
|
||||
FatalErrorIn(name_)
|
||||
<< msg << endl
|
||||
@ -121,7 +121,7 @@ public:
|
||||
}
|
||||
|
||||
//- Handle a general exception 'msg'
|
||||
virtual void Exception(const wchar_t* msg)
|
||||
virtual void Exception(const StringClass& msg)
|
||||
{
|
||||
this->Error(msg);
|
||||
}
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 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
|
||||
|
||||
@file Foam::addToGlobalFunctionSelectionTable
|
||||
|
||||
Description
|
||||
Macros for easy insertion into global function selection tables
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef addToGlobalFunctionSelectionTable_H
|
||||
#define addToGlobalFunctionSelectionTable_H
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// add to hash-table of functions with 'lookup' as the key
|
||||
#define addNamedToGlobalFunctionSelectionTable\
|
||||
(memberFunction,argNames,lookup,functionPtr) \
|
||||
\
|
||||
/* Add to the table, find by lookup name */ \
|
||||
add##memberFunction##argNames##GlobalMemberFunctionToTable \
|
||||
add_##lookup##_##memberFunction##argNames##GlobalMemberFunctionTo##Table_\
|
||||
(#lookup, functionPtr)
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,145 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 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
|
||||
|
||||
@file Foam::globalFunctionSelectionTables
|
||||
|
||||
Description
|
||||
Macros to enable the easy declaration of global function selection tables.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef globalMemberFunctionSelectionTables_H
|
||||
#define globalMemberFunctionSelectionTables_H
|
||||
|
||||
#include "memberFunctionSelectionTables.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
// external use:
|
||||
// ~~~~~~~~~~~~~
|
||||
// declare a run-time selection:
|
||||
#define declareGlobalFunctionSelectionTable\
|
||||
(returnType,memberFunction,argNames,argList,parList) \
|
||||
\
|
||||
/* Construct from argList function pointer type */ \
|
||||
typedef returnType (*memberFunction##argNames##MemberFunctionPtr)argList; \
|
||||
\
|
||||
/* Construct from argList function table type */ \
|
||||
typedef HashTable \
|
||||
<memberFunction##argNames##MemberFunctionPtr, word, string::hash> \
|
||||
memberFunction##argNames##MemberFunctionTable; \
|
||||
\
|
||||
/* Construct from argList function pointer table pointer */ \
|
||||
extern memberFunction##argNames##MemberFunctionTable* \
|
||||
memberFunction##argNames##MemberFunctionTablePtr_; \
|
||||
\
|
||||
/* Table memberFunction called from the table add function */ \
|
||||
void construct##memberFunction##argNames##MemberFunctionTables(); \
|
||||
\
|
||||
/* Table destructor called from the table add function destructor */ \
|
||||
void destroy##memberFunction##argNames##MemberFunctionTables(); \
|
||||
\
|
||||
/* Class to add constructor from argList to table */ \
|
||||
class add##memberFunction##argNames##GlobalMemberFunctionToTable \
|
||||
{ \
|
||||
public: \
|
||||
\
|
||||
add##memberFunction##argNames##GlobalMemberFunctionToTable \
|
||||
( \
|
||||
const word& lookup, \
|
||||
memberFunction##argNames##MemberFunctionPtr function \
|
||||
) \
|
||||
{ \
|
||||
construct##memberFunction##argNames##MemberFunctionTables(); \
|
||||
memberFunction##argNames##MemberFunctionTablePtr_->insert \
|
||||
( \
|
||||
lookup, \
|
||||
function \
|
||||
); \
|
||||
} \
|
||||
\
|
||||
~add##memberFunction##argNames##GlobalMemberFunctionToTable() \
|
||||
{ \
|
||||
destroy##memberFunction##argNames##MemberFunctionTables(); \
|
||||
} \
|
||||
}
|
||||
|
||||
// internal use:
|
||||
// constructor/destructor aid
|
||||
#define defineGlobalFunctionSelectionTableConstructDestruct\
|
||||
(memberFunction,argNames) \
|
||||
\
|
||||
/* Table constructor called from the table add function */ \
|
||||
void construct##memberFunction##argNames##MemberFunctionTables()\
|
||||
{ \
|
||||
static bool constructed = false; \
|
||||
if (!constructed) \
|
||||
{ \
|
||||
constructed = true; \
|
||||
memberFunction##argNames##MemberFunctionTablePtr_ \
|
||||
= new memberFunction##argNames##MemberFunctionTable; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
/* Table destructor called from the table add function destructor */ \
|
||||
void destroy##memberFunction##argNames##MemberFunctionTables()\
|
||||
{ \
|
||||
if (memberFunction##argNames##MemberFunctionTablePtr_) \
|
||||
{ \
|
||||
delete memberFunction##argNames##MemberFunctionTablePtr_; \
|
||||
memberFunction##argNames##MemberFunctionTablePtr_ = NULL; \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
// internal use:
|
||||
// create pointer to hash-table of functions
|
||||
#define defineGlobalFunctionSelectionTablePtr\
|
||||
(memberFunction,argNames) \
|
||||
\
|
||||
/* Define the memberFunction table */ \
|
||||
memberFunction##argNames##MemberFunctionTable* \
|
||||
memberFunction##argNames##MemberFunctionTablePtr_ = NULL
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
// external use:
|
||||
// ~~~~~~~~~~~~~
|
||||
// define run-time selection table
|
||||
#define defineGlobalFunctionSelectionTable\
|
||||
(memberFunction,argNames) \
|
||||
\
|
||||
defineGlobalFunctionSelectionTablePtr \
|
||||
(memberFunction,argNames); \
|
||||
defineGlobalFunctionSelectionTableConstructDestruct \
|
||||
(memberFunction,argNames)
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user