diff --git a/applications/solvers/combustion/PDRFoam/Make/options b/applications/solvers/combustion/PDRFoam/Make/options index 4e5b8fb9a0..a1469d0ef0 100644 --- a/applications/solvers/combustion/PDRFoam/Make/options +++ b/applications/solvers/combustion/PDRFoam/Make/options @@ -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 \ diff --git a/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C b/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C index f6794e92b2..389a065935 100644 --- a/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C +++ b/applications/solvers/lagrangian/coalChemistryFoam/coalChemistryFoam.C @@ -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" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/applications/solvers/lagrangian/coalChemistryFoam/createFields.H b/applications/solvers/lagrangian/coalChemistryFoam/createFields.H index f79e48c17b..d0a284a0e1 100644 --- a/applications/solvers/lagrangian/coalChemistryFoam/createFields.H +++ b/applications/solvers/lagrangian/coalChemistryFoam/createFields.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" ); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/UEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/UEqn.H index b408709aed..e77fe75dab 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/UEqn.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/UEqn.H @@ -7,6 +7,7 @@ == rho.dimensionedInternalField()*g + parcels.SU() + + momentumSource.Su() ); pZones.addResistance(UEqn); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H index 4e9c29815a..f54be04bb8 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/YEqn.H @@ -28,7 +28,7 @@ tmp > mvConvection == parcels.Srho(i) + kappa*chemistry.RR(i)().dimensionedInternalField() - + pointMassSources.Su(i), + + massSource.Su(i), mesh.solver("Yi") ); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createClouds.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createClouds.H index 2accb8e1c9..74a66b63e8 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createClouds.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createClouds.H @@ -1,5 +1,5 @@ Info<< "\nConstructing reacting cloud" << endl; -icoPoly8ThermoReactingCloud parcels +icoPoly8ThermoReactingMultiphaseCloud parcels ( "reactingCloud1", rho, diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createExplicitSources.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createExplicitSources.H new file mode 100644 index 0000000000..0f2b52e536 --- /dev/null +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createExplicitSources.H @@ -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" +); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createMulticomponentPointSources.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createMulticomponentPointSources.H deleted file mode 100644 index 52de65dc50..0000000000 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/createMulticomponentPointSources.H +++ /dev/null @@ -1,8 +0,0 @@ -Info<< "\nConstructing multi-component mass flow rate point sources" << endl; -timeActivatedExplicitMulticomponentPointSource pointMassSources -( - "pointMassSources", - mesh, - Y, - dimMass/dimVolume/dimTime -); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hEqn.H index 6e6b0c763a..0715989df7 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hEqn.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/hEqn.H @@ -39,6 +39,7 @@ pWork() + parcels.Sh() + radiation->Sh(thermo) + + energySource.Su() ); thermo.correct(); diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/pEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/pEqn.H index 32657588b0..9d03624e43 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/pEqn.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/pEqn.H @@ -32,7 +32,7 @@ - fvm::laplacian(rho*rAU, p) == parcels.Srho() - + pointMassSources.Su() + + massSource.SuTot() ); if (corr == nCorr-1 && nonOrth == nNonOrthCorr) diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C index bf0a16af28..b345ffe28a 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/porousExplicitSourceReactingParcelFoam.C @@ -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" diff --git a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/rhoEqn.H b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/rhoEqn.H index 5bc5e120a0..50f3beb603 100644 --- a/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/rhoEqn.H +++ b/applications/solvers/lagrangian/porousExplicitSourceReactingParcelFoam/rhoEqn.H @@ -37,7 +37,7 @@ Description + fvc::div(phi) == parcels.Srho() - + pointMassSources.Su() + + massSource.SuTot() ); rhoEqn.relax(); diff --git a/applications/test/dictionary/Allwmake b/applications/test/dictionary/Allwmake deleted file mode 100755 index fcf297dc89..0000000000 --- a/applications/test/dictionary/Allwmake +++ /dev/null @@ -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 diff --git a/applications/test/dictionary/Make/files b/applications/test/dictionary/Make/files index 148f5fb1c9..b9363efb23 100644 --- a/applications/test/dictionary/Make/files +++ b/applications/test/dictionary/Make/files @@ -1,7 +1,3 @@ dictionaryTest.C -calcEntry/calcEntry.C -calcEntry/calcEntryParser.cpp -calcEntry/calcEntryScanner.cpp - EXE = $(FOAM_USER_APPBIN)/dictionaryTest diff --git a/applications/test/dictionary/Make/options b/applications/test/dictionary/Make/options index e69de29bb2..41306609f2 100644 --- a/applications/test/dictionary/Make/options +++ b/applications/test/dictionary/Make/options @@ -0,0 +1 @@ +EXE_INC = diff --git a/applications/test/dictionary/calcEntry/calcEntry.atg b/applications/test/dictionary/calcEntry/calcEntry.atg deleted file mode 100644 index 90c0861143..0000000000 --- a/applications/test/dictionary/calcEntry/calcEntry.atg +++ /dev/null @@ -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(&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 '}' (. - 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 EOF ) -. - - -/*---------------------------------------------------------------------------*/ - -Expr (. scalar val2 = 0; - if (debug) {Info<<"Expr:"<< val<< " pos:"<< t->pos << nl;} - .) -= - Term - { - "+" Term (. if (debug) {Info<<"+Term:"<pos << nl;} - val += val2; - if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;} - .) - | "-" Term (. if (debug) {Info<<"-Term:"<pos << nl;} - val -= val2; - if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;} - .) - } -. - - -/*---------------------------------------------------------------------------*/ - -Term (. scalar val2 = 0; - if (debug) {Info<<"Term:"<< val<< " pos:"<< t->pos << nl;} - .) -= - Factor - { - "*" Factor (. if (debug) {Info<<"*Factor:"<pos << nl;} - val *= val2; - if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;} - .) - | "/" Factor (. if (debug) {Info<<"/Factor:"<pos << nl;} - val /= val2; - if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;} - .) - } -. - - -/*---------------------------------------------------------------------------*/ -Factor -= - variable (. val = getDictLookup(); - if (debug) {Info<<"lookup:"<pos << nl;} - .) - | number (. val = getScalar(); - if (debug) {Info<<"got num:"<pos << nl;} - .) - | '-' '(' Expr ')' (. val = -val; - if (debug) {Info<<"inv:"<pos << nl;} - .) - | '(' Expr ')' (. if (debug){Info<<"got Expr:"<pos << nl;} - .) -. - - -/*---------------------------------------------------------------------------*/ - -END calcEntry. - -// ************************************************************************* // diff --git a/applications/test/dictionary/calcEntry/calcEntryParser.cpp b/applications/test/dictionary/calcEntry/calcEntryParser.cpp deleted file mode 100644 index 1ff95b8ac9..0000000000 --- a/applications/test/dictionary/calcEntry/calcEntryParser.cpp +++ /dev/null @@ -1,339 +0,0 @@ - - -#include -#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:"<pos << nl;} - val += val2; - if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;} - - } else { - Get(); - Term(val2); - if (debug) {Info<<"-Term:"<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:"<pos << nl;} - val *= val2; - if (debug) {Info<<"="<< val<< " pos:"<< t->pos << nl;} - - } else { - Get(); - Factor(val2); - if (debug) {Info<<"/Factor:"<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:"<pos << nl;} - - } else if (la->kind == 4) { - Get(); - val = getScalar(); - if (debug) {Info<<"got num:"<pos << nl;} - - } else if (la->kind == 8) { - Get(); - Expect(11); - Expr(val); - Expect(12); - val = -val; - if (debug) {Info<<"inv:"<pos << nl;} - - } else if (la->kind == 11) { - Get(); - Expr(val); - Expect(12); - if (debug){Info<<"got Expr:"<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 - - -// ************************************************************************* // diff --git a/applications/test/dictionary/calcEntry/calcEntryParser.h b/applications/test/dictionary/calcEntry/calcEntryParser.h deleted file mode 100644 index de12a3961e..0000000000 --- a/applications/test/dictionary/calcEntry/calcEntryParser.h +++ /dev/null @@ -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(&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__ - diff --git a/applications/test/dictionary/calcEntry/calcEntryScanner.cpp b/applications/test/dictionary/calcEntry/calcEntryScanner.cpp deleted file mode 100644 index b070bcf3f3..0000000000 --- a/applications/test/dictionary/calcEntry/calcEntryScanner.cpp +++ /dev/null @@ -1,932 +0,0 @@ - - -#include - -#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(firstHeap); - - while (cur) { - cur = *(reinterpret_cast(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 - (reinterpret_cast(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(firstHeap); - - // release unused blocks - while - ( - (reinterpret_cast(tokens) < cur) - || (reinterpret_cast(tokens) > (cur + HEAP_BLOCK_SIZE)) - ) { - cur = *(reinterpret_cast(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 - (reinterpret_cast(newHeap) + HEAP_BLOCK_SIZE); - *heapEnd = 0; - heap = newHeap; - heapTop = heap; -} - - -Token* Scanner::CreateToken() { - const int reqMem = sizeof(Token); - if - ( - (reinterpret_cast(heapTop) + reqMem) - >= reinterpret_cast(heapEnd) - ) { - CreateHeapBlock(); - } - // token 'occupies' heap starting at heapTop - Token* tok = reinterpret_cast(heapTop); - // increment past this part of the heap, which is now used - heapTop = - reinterpret_cast - (reinterpret_cast(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(heapTop) + reqMem) - >= reinterpret_cast(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(heapTop); - - // increment past this part of the heap, which is now used - heapTop = - reinterpret_cast - (reinterpret_cast(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 - - -// ************************************************************************* // diff --git a/applications/test/dictionary/calcEntry/calcEntryScanner.h b/applications/test/dictionary/calcEntry/calcEntryScanner.h deleted file mode 100644 index fdebddeebe..0000000000 --- a/applications/test/dictionary/calcEntry/calcEntryScanner.h +++ /dev/null @@ -1,398 +0,0 @@ - - -#ifndef COCO_calcEntrySCANNER_H__ -#define COCO_calcEntrySCANNER_H__ - -#include -#include -#include -#include -#include -#include -#include -#include - -// io.h and fcntl are used to ensure binary read from streams on windows -#if _MSC_VER >= 1300 -#include -#include -#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__ - diff --git a/applications/test/dictionary/testDictCalc b/applications/test/dictionary/testDictCalc index f1d67650e8..577cbf112d 100644 --- a/applications/test/dictionary/testDictCalc +++ b/applications/test/dictionary/testDictCalc @@ -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; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/applications/test/dictionary/testDictCalcError b/applications/test/dictionary/testDictCalcError new file mode 100644 index 0000000000..95b90ce8e8 --- /dev/null +++ b/applications/test/dictionary/testDictCalcError @@ -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; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/applications/test/globalMeshData/globalMeshDataTest.C b/applications/test/globalMeshData/globalMeshDataTest.C index 75f98b1b9c..47c062433e 100644 --- a/applications/test/globalMeshData/globalMeshDataTest.C +++ b/applications/test/globalMeshData/globalMeshDataTest.C @@ -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(); diff --git a/applications/utilities/mesh/advanced/modifyMesh/Make/options b/applications/utilities/mesh/advanced/modifyMesh/Make/options index 39929ff890..70c838b774 100644 --- a/applications/utilities/mesh/advanced/modifyMesh/Make/options +++ b/applications/utilities/mesh/advanced/modifyMesh/Make/options @@ -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 diff --git a/applications/utilities/mesh/advanced/splitCells/Make/options b/applications/utilities/mesh/advanced/splitCells/Make/options index ca424359cf..7349856cab 100644 --- a/applications/utilities/mesh/advanced/splitCells/Make/options +++ b/applications/utilities/mesh/advanced/splitCells/Make/options @@ -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 diff --git a/applications/utilities/mesh/conversion/foamToSurface/Make/files b/applications/utilities/mesh/conversion/foamToSurface/Make/files new file mode 100644 index 0000000000..a5dfd1e846 --- /dev/null +++ b/applications/utilities/mesh/conversion/foamToSurface/Make/files @@ -0,0 +1,3 @@ +foamToSurface.C + +EXE = $(FOAM_APPBIN)/foamToSurface diff --git a/applications/utilities/mesh/conversion/foamToSurface/Make/options b/applications/utilities/mesh/conversion/foamToSurface/Make/options new file mode 100644 index 0000000000..a504dd8617 --- /dev/null +++ b/applications/utilities/mesh/conversion/foamToSurface/Make/options @@ -0,0 +1,5 @@ +EXE_INC = \ + -I$(LIB_SRC)/surfMesh/lnInclude + +EXE_LIBS = \ + -lsurfMesh diff --git a/applications/utilities/mesh/conversion/foamToSurface/foamToSurface.C b/applications/utilities/mesh/conversion/foamToSurface/foamToSurface.C new file mode 100644 index 0000000000..f9a255c502 --- /dev/null +++ b/applications/utilities/mesh/conversion/foamToSurface/foamToSurface.C @@ -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 \\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("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; +} + +// ************************************************************************* // diff --git a/applications/utilities/mesh/conversion/foamToSurface/getTimeIndex.H b/applications/utilities/mesh/conversion/foamToSurface/getTimeIndex.H new file mode 100644 index 0000000000..85a92405dd --- /dev/null +++ b/applications/utilities/mesh/conversion/foamToSurface/getTimeIndex.H @@ -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; + diff --git a/applications/utilities/mesh/conversion/ideasUnvToFoam/Make/options b/applications/utilities/mesh/conversion/ideasUnvToFoam/Make/options index 9f08e8d2a8..02c293ceed 100644 --- a/applications/utilities/mesh/conversion/ideasUnvToFoam/Make/options +++ b/applications/utilities/mesh/conversion/ideasUnvToFoam/Make/options @@ -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 diff --git a/applications/utilities/mesh/conversion/ideasUnvToFoam/ideasUnvToFoam.C b/applications/utilities/mesh/conversion/ideasUnvToFoam/ideasUnvToFoam.C index ba7ee39c80..259ccd2069 100644 --- a/applications/utilities/mesh/conversion/ideasUnvToFoam/ideasUnvToFoam.C +++ b/applications/utilities/mesh/conversion/ideasUnvToFoam/ideasUnvToFoam.C @@ -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 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"); } diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C index fef49a3fe6..528551eb51 100644 --- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C +++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C @@ -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