From 25bf6b6ce82ad82ba95f2853343688c986f5cd38 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 22 Dec 2009 10:06:37 +0000 Subject: [PATCH 01/38] Minor code style corrections --- .../utilities/surface/surfaceInertia/surfaceInertia.C | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/applications/utilities/surface/surfaceInertia/surfaceInertia.C b/applications/utilities/surface/surfaceInertia/surfaceInertia.C index 12785fec9b..f3bcb4599b 100644 --- a/applications/utilities/surface/surfaceInertia/surfaceInertia.C +++ b/applications/utilities/surface/surfaceInertia/surfaceInertia.C @@ -202,6 +202,7 @@ void massPropertiesSolid J *= density; } + void massPropertiesShell ( const pointField& pts, @@ -272,7 +273,7 @@ tensor applyParallelAxisTheorem vector d = (refPt - cM); - return (J + m*((d & d)*I - d*d)); + return J + m*((d & d)*I - d*d); } @@ -389,7 +390,7 @@ int main(int argc, char *argv[]) << eVec.x() << ' ' << eVec.y() << ' ' << eVec.z() << endl; - if(calcAroundRefPt) + if (calcAroundRefPt) { Info << "Inertia tensor relative to " << refPt << " = " << applyParallelAxisTheorem(m, cM, J, refPt) From 6fa46f7bdc3a4361bb8422ac6973752a94c95668 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 5 Jan 2010 10:58:40 +0000 Subject: [PATCH 02/38] Tutorial updates --- .../verticalChannel/0.org/U | 7 ++++--- .../verticalChannel/0.org/k | 11 ++++++----- .../verticalChannel/0.org/omega | 11 ++++++----- .../verticalChannel/0/U | 3 ++- .../verticalChannel/0/k | 11 ++++++----- .../verticalChannel/0/omega | 11 ++++++----- .../verticalChannel/Allrun | 4 ++++ .../verticalChannel/constant/g | 2 +- .../verticalChannel/constant/polyMesh/boundary | 2 +- .../verticalChannel/constant/reactingCloud1Properties | 2 +- 10 files changed, 37 insertions(+), 27 deletions(-) diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/U b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/U index d692d79623..be47ccdfa5 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/U +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/U @@ -33,17 +33,18 @@ boundaryField { type flowRateInletVelocity; flowRate 0.00379; - value uniform (-0 10.82857143 -0); + value uniform (0 14.68 0); } inletSides { type flowRateInletVelocity; flowRate 0.00832; - value uniform (-0 11.88571429 -0); + value uniform (0 17.79 0); } outlet { - type zeroGradient; + type inletOutlet; + inletValue uniform (0 0 0); } walls { diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/k b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/k index 59479eef3a..d31f55adb4 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/k +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/k @@ -17,7 +17,7 @@ FoamFile dimensions [0 2 -2 0 0 0 0]; -internalField uniform 3.75e-11; +internalField uniform 3.75e-9; boundaryField { @@ -33,22 +33,23 @@ boundaryField { type turbulentIntensityKineticEnergyInlet; intensity 0.15; - value uniform 3.75e-11; + value uniform 3.75e-9; } inletSides { type turbulentIntensityKineticEnergyInlet; intensity 0.16; - value uniform 3.75e-11; + value uniform 3.75e-9; } outlet { - type zeroGradient; + type inletOutlet; + inletValue uniform 3.75e-9; } walls { type compressible::kqRWallFunction; - value uniform 3.75e-11; + value uniform 0; } } diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/omega b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/omega index f7c68ea1c4..0538e96fb7 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/omega +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0.org/omega @@ -17,7 +17,7 @@ FoamFile dimensions [0 0 -1 0 0 0 0]; -internalField uniform 0.0016; +internalField uniform 4.5e-3; boundaryField { @@ -34,18 +34,19 @@ boundaryField type compressible::turbulentMixingLengthFrequencyInlet; mixingLength 0.007; k k; - value uniform 0.0016; + value uniform 4.5e-3; } inletSides { type compressible::turbulentMixingLengthFrequencyInlet; mixingLength 0.007; k k; - value uniform 0.0016; + value uniform 4.5e-3; } outlet { - type zeroGradient; + type inletOutlet; + inletValue uniform 4.5e-3; } walls { @@ -53,7 +54,7 @@ boundaryField Cmu 0.09; kappa 0.41; E 9.8; - value uniform 0.0016; + value uniform 0; } } diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/U b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/U index d692d79623..b2ed1ea6d7 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/U +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/U @@ -43,7 +43,8 @@ boundaryField } outlet { - type zeroGradient; + type inletOutlet; + inletValue uniform (0 0 0); } walls { diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/k b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/k index 59479eef3a..d31f55adb4 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/k +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/k @@ -17,7 +17,7 @@ FoamFile dimensions [0 2 -2 0 0 0 0]; -internalField uniform 3.75e-11; +internalField uniform 3.75e-9; boundaryField { @@ -33,22 +33,23 @@ boundaryField { type turbulentIntensityKineticEnergyInlet; intensity 0.15; - value uniform 3.75e-11; + value uniform 3.75e-9; } inletSides { type turbulentIntensityKineticEnergyInlet; intensity 0.16; - value uniform 3.75e-11; + value uniform 3.75e-9; } outlet { - type zeroGradient; + type inletOutlet; + inletValue uniform 3.75e-9; } walls { type compressible::kqRWallFunction; - value uniform 3.75e-11; + value uniform 0; } } diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/omega b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/omega index f7c68ea1c4..f9b551e72b 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/omega +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/omega @@ -17,7 +17,7 @@ FoamFile dimensions [0 0 -1 0 0 0 0]; -internalField uniform 0.0016; +internalField uniform 4.5e-3; boundaryField { @@ -34,18 +34,19 @@ boundaryField type compressible::turbulentMixingLengthFrequencyInlet; mixingLength 0.007; k k; - value uniform 0.0016; + value uniform 4.5e-3; } inletSides { type compressible::turbulentMixingLengthFrequencyInlet; mixingLength 0.007; k k; - value uniform 0.0016; + value uniform 4.5-3; } outlet { - type zeroGradient; + type inletOutlet; + inletValue uniform 4.5e-3; } walls { @@ -53,7 +54,7 @@ boundaryField Cmu 0.09; kappa 0.41; E 9.8; - value uniform 0.0016; + value uniform 0; } } diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/Allrun b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/Allrun index 7aca4e2d34..6eb3715e65 100755 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/Allrun +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/Allrun @@ -5,5 +5,9 @@ # create mesh runApplication blockMesh +# initialise with potentialFoam solution +runApplication potentialFoam +rm -f 0/phi + # run the solver runApplication porousExplicitSourceReactingParcelFoam diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/g b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/g index 51944e7abd..27d4d32488 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/g +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/g @@ -16,7 +16,7 @@ FoamFile // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // dimensions [0 1 -2 0 0 0 0]; -value ( 0 0 0 ); +value ( 0 -9.81 0 ); // ************************************************************************* // diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/polyMesh/boundary b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/polyMesh/boundary index f62411e787..e8088bf7bd 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/polyMesh/boundary +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/polyMesh/boundary @@ -1,7 +1,7 @@ /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | -| \\ / O peration | Version: 1.6 | +| \\ / O peration | Version: dev | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/reactingCloud1Properties b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/reactingCloud1Properties index d9e40ac14d..ddb7eaf3a9 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/reactingCloud1Properties +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/constant/reactingCloud1Properties @@ -129,7 +129,7 @@ StandardWallInteractionCoeffs RanzMarshallCoeffs { - BirdCorrection on; // off; + BirdCorrection off; } SinglePhaseMixtureCoeffs From aa217c28678d84cedad3544054f42bc9c257b4e5 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 5 Jan 2010 22:13:45 +0000 Subject: [PATCH 03/38] Added combine function to combine two pointConstraints --- .../pointConstraint/pointConstraint.H | 3 ++ .../pointConstraint/pointConstraintI.H | 41 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraint.H b/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraint.H index 5e28ac1e14..10aa63f2c9 100644 --- a/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraint.H +++ b/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraint.H @@ -77,6 +77,9 @@ public: //- Apply and accumulate the effect of the given constraint direction inline void applyConstraint(const vector& cd); + //- Combine constraints + inline void combine(const pointConstraint&); + //- Return the accumulated constraint transformation tensor inline tensor constraintTransformation() const; }; diff --git a/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraintI.H b/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraintI.H index a0af05b5af..c488bf603e 100644 --- a/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraintI.H +++ b/src/OpenFOAM/fields/pointPatchFields/pointPatchField/pointConstraint/pointConstraintI.H @@ -69,6 +69,47 @@ void Foam::pointConstraint::applyConstraint(const vector& cd) } +void Foam::pointConstraint::combine(const pointConstraint& pc) +{ + if (first() == 0) + { + operator=(pc); + } + else if (first() == 1) + { + // Save single normal + vector n = second(); + // Apply to supplied point constaint + operator=(pc); + applyConstraint(n); + } + else if (first() == 2) + { + if (pc.first() == 0) + {} + else if (pc.first() == 1) + { + applyConstraint(pc.second()); + } + else if (pc.first() == 2) + { + // Both constrained to line. Same (+-)direction? + if (mag(second() & pc.second()) <= (1.0-1e-3)) + { + // Different directions + first() = 3; + second() = vector::zero; + } + } + else + { + first() = 3; + second() = vector::zero; + } + } +} + + Foam::tensor Foam::pointConstraint::constraintTransformation() const { if (first() == 0) From 711e0a42dd1a2615249e8ae8f65960b7c0dbd4dc Mon Sep 17 00:00:00 2001 From: andy Date: Fri, 8 Jan 2010 12:16:01 +0000 Subject: [PATCH 04/38] Updated function object example usage --- .../functionObjects/field/fieldAverage/controlDict | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/postProcessing/functionObjects/field/fieldAverage/controlDict b/src/postProcessing/functionObjects/field/fieldAverage/controlDict index 0132aa91dd..3e186c89e2 100644 --- a/src/postProcessing/functionObjects/field/fieldAverage/controlDict +++ b/src/postProcessing/functionObjects/field/fieldAverage/controlDict @@ -14,7 +14,7 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -application oodles; +application XXX; startFrom latestTime; @@ -54,6 +54,12 @@ functions // Where to load it from (if not already in solver) functionObjectLibs ("libfieldAverage.so"); + // Function object enabled flag + enabled true; + + // When to output the average fields + outputControl outputTime; + // Fields to be averaged - runTime modifiable fields ( From 1812773b2518942bcd6e7178d0121b103f90fba8 Mon Sep 17 00:00:00 2001 From: andy Date: Fri, 8 Jan 2010 17:14:53 +0000 Subject: [PATCH 05/38] Updates to the fieldValues function object - Updates to enable correct operation in parallel - Added weighted average operation for cell sources --- .../field/fieldValues/cellSource/cellSource.C | 52 ++++-- .../field/fieldValues/cellSource/cellSource.H | 35 +++- .../cellSource/cellSourceTemplates.C | 69 ++++---- .../field/fieldValues/faceSource/faceSource.C | 19 ++- .../field/fieldValues/faceSource/faceSource.H | 19 ++- .../faceSource/faceSourceTemplates.C | 150 +++++------------- .../field/fieldValues/fieldValue/fieldValue.H | 13 ++ .../fieldValue/fieldValueTemplates.C | 66 ++++++++ 8 files changed, 249 insertions(+), 174 deletions(-) create mode 100644 src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueTemplates.C diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C index b94b687ba1..239aa4342d 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C +++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.C @@ -46,10 +46,13 @@ namespace Foam fieldValues::cellSource::sourceTypeNames_; template<> - const char* NamedEnum:: - names[] = {"none", "sum", "volAverage", "volIntegrate"}; + const char* NamedEnum:: + names[] = + { + "none", "sum", "volAverage", "volIntegrate", "weightedAverage" + }; - const NamedEnum + const NamedEnum fieldValues::cellSource::operationTypeNames_; } @@ -93,7 +96,7 @@ void Foam::fieldValues::cellSource::setCellZoneCells() // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // -void Foam::fieldValues::cellSource::initialise() +void Foam::fieldValues::cellSource::initialise(const dictionary& dict) { switch (source_) { @@ -104,7 +107,7 @@ void Foam::fieldValues::cellSource::initialise() } default: { - FatalErrorIn("cellSource::constructCellAddressing()") + FatalErrorIn("cellSource::initialise()") << "Unknown source type. Valid source types are:" << sourceTypeNames_ << nl << exit(FatalError); } @@ -114,6 +117,29 @@ void Foam::fieldValues::cellSource::initialise() << " total cells = " << cellId_.size() << nl << " total volume = " << sum(filterField(mesh().V())) << nl << endl; + + if (operation_ == opWeightedAverage) + { + dict.lookup("weightField") >> weightFieldName_; + if + ( + obr().foundObject(weightFieldName_) + ) + { + Info<< " weight field = " << weightFieldName_; + } + else + { + FatalErrorIn("cellSource::initialise()") + << type() << " " << name_ << ": " + << sourceTypeNames_[source_] << "(" << sourceName_ << "):" + << nl << " Weight field " << weightFieldName_ + << " must be a " << volScalarField::typeName + << nl << exit(FatalError); + } + } + + Info<< nl << endl; } @@ -172,7 +198,7 @@ void Foam::fieldValues::cellSource::read(const dictionary& dict) if (active_) { // no additional info to read - initialise(); + initialise(dict); } } @@ -183,9 +209,12 @@ void Foam::fieldValues::cellSource::write() if (active_) { - outputFilePtr_() - << obr_.time().value() << tab - << sum(filterField(mesh().V())); + if (Pstream::master()) + { + outputFilePtr_() + << obr_.time().value() << tab + << sum(filterField(mesh().V())); + } forAll(fields_, i) { @@ -196,7 +225,10 @@ void Foam::fieldValues::cellSource::write() writeValues(fields_[i]); } - outputFilePtr_()<< endl; + if (Pstream::master()) + { + outputFilePtr_()<< endl; + } if (log_) { diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H index 89cc9ad010..a8d04f7d9a 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H +++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSource.H @@ -39,7 +39,7 @@ Description valueOutput true; // Write values at run-time output times? source cellZone; // Type of cell source sourceName c0; - operation volAverage; // none, sum, volAverage, volIntegrate + operation volAverage; fields ( p @@ -47,6 +47,13 @@ Description ); } + where operation is one of: + - none + - sum + - volAverage + - volIntegrate + - weightedAverage + SourceFiles cellSource.C @@ -96,11 +103,12 @@ public: opNone, opSum, opVolAverage, - opVolIntegrate + opVolIntegrate, + opWeightedAverage }; //- Operation type names - static const NamedEnum operationTypeNames_; + static const NamedEnum operationTypeNames_; private: @@ -127,23 +135,34 @@ protected: //- Local list of cell IDs labelList cellId_; + //- Weight field name - only used for opWeightedAverage mode + word weightFieldName_; + // Protected member functions //- Initialise, e.g. cell addressing - void initialise(); + void initialise(const dictionary& dict); + + //- Return true if the field name is valid + template + bool validField(const word& fieldName) const; //- Insert field values into values list template - bool setFieldValues + tmp > setFieldValues ( - const word& fieldName, - List& values + const word& fieldName ) const; //- Apply the 'operation' to the values template - Type processValues(const List& values) const; + Type processValues + ( + const Field& values, + const scalarField& V, + const scalarField& weightField + ) const; //- Output file header information virtual void writeFileHeader(); diff --git a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C index fe495fcca6..41c5e70d26 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C +++ b/src/postProcessing/functionObjects/field/fieldValues/cellSource/cellSourceTemplates.C @@ -27,27 +27,16 @@ License #include "cellSource.H" #include "volFields.H" #include "IOList.H" -#include "ListListOps.H" // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // template -bool Foam::fieldValues::cellSource::setFieldValues -( - const word& fieldName, - List& values -) const +bool Foam::fieldValues::cellSource::validField(const word& fieldName) const { - values.setSize(cellId_.size(), pTraits::zero); - typedef GeometricField vf; if (obr_.foundObject(fieldName)) { - const vf& field = obr_.lookupObject(fieldName); - - values = UIndirectList(field, cellId_); - return true; } @@ -55,10 +44,29 @@ bool Foam::fieldValues::cellSource::setFieldValues } +template +Foam::tmp > Foam::fieldValues::cellSource::setFieldValues +( + const word& fieldName +) const +{ + typedef GeometricField vf; + + if (obr_.foundObject(fieldName)) + { + return filterField(obr_.lookupObject(fieldName)); + } + + return tmp >(new Field(0.0)); +} + + template Type Foam::fieldValues::cellSource::processValues ( - const List& values + const Field& values, + const scalarField& V, + const scalarField& weightField ) const { Type result = pTraits::zero; @@ -71,13 +79,17 @@ Type Foam::fieldValues::cellSource::processValues } case opVolAverage: { - tmp V = filterField(mesh().V()); - result = sum(values*V())/sum(V()); + result = sum(values*V)/sum(V); break; } case opVolIntegrate: { - result = sum(values*filterField(mesh().V())); + result = sum(values*V); + break; + } + case opWeightedAverage: + { + result = sum(values*weightField)/sum(weightField); break; } default: @@ -95,25 +107,20 @@ Type Foam::fieldValues::cellSource::processValues template bool Foam::fieldValues::cellSource::writeValues(const word& fieldName) { - List > allValues(Pstream::nProcs()); + const bool ok = validField(fieldName); - bool validField = - setFieldValues(fieldName, allValues[Pstream::myProcNo()]); - - if (validField) + if (ok) { - Pstream::gatherList(allValues); + Field values = combineFields(setFieldValues(fieldName)); + + scalarField V = combineFields(filterField(mesh().V())); + + scalarField weightField = + combineFields(setFieldValues(weightFieldName_)); if (Pstream::master()) { - List values = - ListListOps::combine > - ( - allValues, - accessOp >() - ); - - Type result = processValues(values); + Type result = processValues(values, V, weightField); if (valueOutput_) { @@ -144,7 +151,7 @@ bool Foam::fieldValues::cellSource::writeValues(const word& fieldName) } } - return validField; + return ok; } diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C index b609f4310a..e84fe07402 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C +++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.C @@ -220,7 +220,7 @@ void Foam::fieldValues::faceSource::initialise(const dictionary& dict) } default: { - FatalErrorIn("faceSource::constructFaceAddressing()") + FatalErrorIn("faceSource::initiliase()") << type() << " " << name_ << ": " << sourceTypeNames_[source_] << "(" << sourceName_ << "):" << nl << " Unknown source type. Valid source types are:" @@ -245,7 +245,7 @@ void Foam::fieldValues::faceSource::initialise(const dictionary& dict) } else { - FatalErrorIn("faceSource::constructFaceAddressing()") + FatalErrorIn("faceSource::initialise()") << type() << " " << name_ << ": " << sourceTypeNames_[source_] << "(" << sourceName_ << "):" << nl << " Weight field " << weightFieldName_ @@ -326,9 +326,12 @@ void Foam::fieldValues::faceSource::write() if (active_) { - outputFilePtr_() - << obr_.time().value() << tab - << sum(filterField(mesh().magSf())); + if (Pstream::master()) + { + outputFilePtr_() + << obr_.time().value() << tab + << sum(filterField(mesh().magSf())); + } forAll(fields_, i) { @@ -339,7 +342,10 @@ void Foam::fieldValues::faceSource::write() writeValues(fields_[i]); } - outputFilePtr_()<< endl; + if (Pstream::master()) + { + outputFilePtr_()<< endl; + } if (log_) { @@ -350,4 +356,3 @@ void Foam::fieldValues::faceSource::write() // ************************************************************************* // - diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H index e8e2634b12..8ef65d870b 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H +++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSource.H @@ -153,17 +153,22 @@ protected: //- Initialise, e.g. face addressing void initialise(const dictionary& dict); - //- Insert field values into values list + //- Return true if the field name is valid template - bool setFieldValues - ( - const word& fieldName, - List& values - ) const; + bool validField(const word& fieldName) const; + + //- Return field values by looking up field name + template + tmp > setFieldValues(const word& fieldName) const; //- Apply the 'operation' to the values template - Type processValues(const List& values) const; + Type processValues + ( + const Field& values, + const scalarField& magSf, + const scalarField& weightField + ) const; //- Output file header information virtual void writeFileHeader(); diff --git a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C index d7609573a7..a257384a50 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C +++ b/src/postProcessing/functionObjects/field/fieldValues/faceSource/faceSourceTemplates.C @@ -33,70 +33,17 @@ License // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // template -bool Foam::fieldValues::faceSource::setFieldValues -( - const word& fieldName, - List& values -) const +bool Foam::fieldValues::faceSource::validField(const word& fieldName) const { - values.setSize(faceId_.size(), pTraits::zero); - typedef GeometricField sf; typedef GeometricField vf; if (obr_.foundObject(fieldName)) { - const sf& field = obr_.lookupObject(fieldName); - - forAll(values, i) - { - label faceI = faceId_[i]; - label patchI = facePatchId_[i]; - if (patchI >= 0) - { - values[i] = field.boundaryField()[patchI][faceI]; - } - else - { - values[i] = field[faceI]; - } - - values[i] *= flipMap_[i]; - } - return true; } else if (obr_.foundObject(fieldName)) { - const vf& field = obr_.lookupObject(fieldName); - - forAll(values, i) - { - label faceI = faceId_[i]; - label patchI = facePatchId_[i]; - if (patchI >= 0) - { - values[i] = field.boundaryField()[patchI][faceI]; - } - else - { - FatalErrorIn - ( - "fieldValues::faceSource::setFieldValues" - "(" - "const word&, " - "List&" - ") const" - ) << type() << " " << name_ << ": " - << sourceTypeNames_[source_] << "(" << sourceName_ << "):" - << nl - << " Unable to process internal faces for volume field " - << fieldName << nl << abort(FatalError); - } - - values[i] *= flipMap_[i]; - } - return true; } @@ -104,10 +51,34 @@ bool Foam::fieldValues::faceSource::setFieldValues } +template +Foam::tmp > Foam::fieldValues::faceSource::setFieldValues +( + const word& fieldName +) const +{ + typedef GeometricField sf; + typedef GeometricField vf; + + if (obr_.foundObject(fieldName)) + { + return filterField(obr_.lookupObject(fieldName)); + } + else if (obr_.foundObject(fieldName)) + { + return filterField(obr_.lookupObject(fieldName)); + } + + return tmp >(new Field(0.0)); +} + + template Type Foam::fieldValues::faceSource::processValues ( - const List& values + const Field& values, + const scalarField& magSf, + const scalarField& weightField ) const { Type result = pTraits::zero; @@ -120,54 +91,17 @@ Type Foam::fieldValues::faceSource::processValues } case opAreaAverage: { - tmp magSf = filterField(mesh().magSf()); - result = sum(values*magSf())/sum(magSf()); + result = sum(values*magSf)/sum(magSf); break; } case opAreaIntegrate: { - result = sum(values*filterField(mesh().magSf())); + result = sum(values*magSf); break; } case opWeightedAverage: { - if (mesh().foundObject(weightFieldName_)) - { - tmp wField = - filterField - ( - mesh().lookupObject(weightFieldName_) - ); - result = sum(values*wField())/sum(wField()); - } - else if (mesh().foundObject(weightFieldName_)) - { - tmp wField = - filterField - ( - mesh().lookupObject - ( - weightFieldName_ - ) - ); - result = sum(values*wField())/sum(wField()); - } - else - { - FatalErrorIn - ( - "fieldValues::faceSource::processValues" - "(" - "List&" - ") const" - ) << type() << " " << name_ << ": " - << sourceTypeNames_[source_] << "(" << sourceName_ << "):" - << nl - << " Weight field " << weightFieldName_ - << " must be either a " << volScalarField::typeName - << " or " << surfaceScalarField::typeName << nl - << abort(FatalError); - } + result = sum(values*weightField)/sum(weightField); break; } default: @@ -185,25 +119,20 @@ Type Foam::fieldValues::faceSource::processValues template bool Foam::fieldValues::faceSource::writeValues(const word& fieldName) { - List > allValues(Pstream::nProcs()); + const bool ok = validField(fieldName); - bool validField = - setFieldValues(fieldName, allValues[Pstream::myProcNo()]); - - if (validField) + if (ok) { - Pstream::gatherList(allValues); + Field values = combineFields(setFieldValues(fieldName)); + + scalarField magSf = combineFields(filterField(mesh().magSf())); + + scalarField weightField = + combineFields(setFieldValues(weightFieldName_)); if (Pstream::master()) { - List values = - ListListOps::combine > - ( - allValues, - accessOp >() - ); - - Type result = processValues(values); + Type result = processValues(values, magSf, weightField); if (valueOutput_) { @@ -222,7 +151,6 @@ bool Foam::fieldValues::faceSource::writeValues(const word& fieldName) ).write(); } - outputFilePtr_()<< tab << result; if (log_) @@ -234,7 +162,7 @@ bool Foam::fieldValues::faceSource::writeValues(const word& fieldName) } } - return validField; + return ok; } diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.H b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.H index 1b96bb8e41..4aa6f41bd7 100644 --- a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.H +++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValue.H @@ -164,6 +164,13 @@ public: //- Execute the at the final time-loop, currently does nothing virtual void end(); + + //- Comnbine fields from all processor domains into single field + template + tmp > combineFields + ( + const tmp >& field + ) const; }; @@ -177,6 +184,12 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#ifdef NoRepository + #include "fieldValueTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueTemplates.C b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueTemplates.C new file mode 100644 index 0000000000..23c700134f --- /dev/null +++ b/src/postProcessing/functionObjects/field/fieldValues/fieldValue/fieldValueTemplates.C @@ -0,0 +1,66 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2009-2009 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 "fieldValue.H" +#include "ListListOps.H" +#include "Pstream.H" + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +Foam::tmp > Foam::fieldValue::combineFields +( + const tmp >& field +) const +{ + List > allValues(Pstream::nProcs()); + + allValues[Pstream::myProcNo()] = field(); + + Pstream::gatherList(allValues); + + if (Pstream::master()) + { + return tmp > + ( + new Field + ( + ListListOps::combine > + ( + allValues, + accessOp >() + ) + ) + ); + } + else + { + return field(); + } +} + + +// ************************************************************************* // From b441bb1f993655244b52564bceaa2de5c3edfdb2 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 10:46:57 +0000 Subject: [PATCH 06/38] Removed unused code-template code --- src/dynamicMesh/meshCut/directions/directions.C | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/dynamicMesh/meshCut/directions/directions.C b/src/dynamicMesh/meshCut/directions/directions.C index b50069d606..b77d2cefa4 100644 --- a/src/dynamicMesh/meshCut/directions/directions.C +++ b/src/dynamicMesh/meshCut/directions/directions.C @@ -446,19 +446,4 @@ Foam::directions::directions } -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // - - // ************************************************************************* // From 96ce5ae412f5d1a3b4f1f5a0ccec800107612488 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 12:05:39 +0000 Subject: [PATCH 07/38] Corrections and updates to turbulent heat flux temperature BC - Corrected calculation of temperature gradient - Option to specify the heat source in terms of a power [W] or flux [W/m2] --- ...entHeatFluxTemperatureFvPatchScalarField.C | 78 +++++++++++++------ ...entHeatFluxTemperatureFvPatchScalarField.H | 30 +++++-- 2 files changed, 79 insertions(+), 29 deletions(-) diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C index 2f54baf7c2..1832566586 100644 --- a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C @@ -37,6 +37,22 @@ namespace Foam namespace compressible { +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +template<> +const char* +NamedEnum:: +names[] = + { + "power", + "flux" + }; + +const +NamedEnum + turbulentHeatFluxTemperatureFvPatchScalarField::heatSourceTypeNames_; + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // turbulentHeatFluxTemperatureFvPatchScalarField:: @@ -47,8 +63,8 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(p, iF), - q_(p.size(), 0.0), - rhoName_("rho") + heatSource_(hsPower), + q_(p.size(), 0.0) {} @@ -62,8 +78,8 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(ptf, p, iF, mapper), - q_(ptf.q_, mapper), - rhoName_(ptf.rhoName_) + heatSource_(ptf.heatSource_), + q_(ptf.q_, mapper) {} @@ -76,8 +92,8 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(p, iF), - q_("q", dict, p.size()), - rhoName_(dict.lookupOrDefault("rho", "rho")) + heatSource_(heatSourceTypeNames_.read(dict.lookup("heatSource"))), + q_("q", dict, p.size()) { fvPatchField::operator=(patchInternalField()); gradient() = 0.0; @@ -91,8 +107,8 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(thftpsf), - q_(thftpsf.q_), - rhoName_(thftpsf.rhoName_) + heatSource_(thftpsf.heatSource_), + q_(thftpsf.q_) {} @@ -104,8 +120,8 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(thftpsf, iF), - q_(thftpsf.q_), - rhoName_(thftpsf.rhoName_) + heatSource_(thftpsf.heatSource_), + q_(thftpsf.q_) {} @@ -150,22 +166,39 @@ void turbulentHeatFluxTemperatureFvPatchScalarField::updateCoeffs() const RASModel& rasModel = db().lookupObject("RASProperties"); - const scalarField alphaEffp = rasModel.alphaEff()().boundaryField()[patchI]; + const scalarField alphaEffp = rasModel.alphaEff(patchI); - const basicThermo& thermo = - db().lookupObject("thermophysicalProperties"); - -// const scalarField& Tp = thermo.T().boundaryField()[patchI]; const scalarField& Tp = *this; - const scalarField Cpp = thermo.Cp(Tp, patchI); + const scalarField Cpp = rasModel.thermo().Cp(Tp, patchI); - const scalarField& rhop = - patch().lookupPatchField(rhoName_); - - const scalar Ap = gSum(patch().magSf()); - - gradient() = q_/(Ap*rhop*Cpp*alphaEffp); + switch (heatSource_) + { + case hsPower: + { + const scalar Ap = gSum(patch().magSf()); + gradient() = q_/(Ap*Cpp*alphaEffp); + break; + } + case hsFlux: + { + gradient() = q_/(Cpp*alphaEffp); + break; + } + default: + { + FatalErrorIn + ( + "turbulentHeatFluxTemperatureFvPatchScalarField" + "(" + "const fvPatch&, " + "const DimensionedField&, " + "const dictionary&" + ")" + ) << "Unknown heat source type. Valid types are: " + << heatSourceTypeNames_ << nl << exit(FatalError); + } + } fixedGradientFvPatchScalarField::updateCoeffs(); } @@ -178,7 +211,6 @@ void turbulentHeatFluxTemperatureFvPatchScalarField::write { fvPatchScalarField::write(os); q_.writeEntry("q", os); - os.writeKeyword("rho") << rhoName_ << token::END_STATEMENT << nl; gradient().writeEntry("gradient", os); writeEntry("value", os); } diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H index f7581102df..f32894a130 100644 --- a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H @@ -38,6 +38,7 @@ SourceFiles #include "fvPatchFields.H" #include "fixedGradientFvPatchFields.H" +#include "NamedEnum.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -47,20 +48,37 @@ namespace compressible { /*---------------------------------------------------------------------------*\ - Class turbulentHeatFluxTemperatureFvPatchScalarField Declaration + Class turbulentHeatFluxTemperatureFvPatchScalarField Declaration \*---------------------------------------------------------------------------*/ class turbulentHeatFluxTemperatureFvPatchScalarField : public fixedGradientFvPatchScalarField { -// Private data +public: - //- Heat flux [W] - scalarField q_; + // Data types - //- Name of density field - word rhoName_; + //- Enumeration listing the possible hest source input modes + enum heatSourceType + { + hsPower, + hsFlux + }; + + + private: + + // Private data + + //- Heat source type names + static const NamedEnum heatSourceTypeNames_; + + //- Heat source type + heatSourceType heatSource_; + + //- Heat flux [W/m2] + scalarField q_; public: From 3b2c4abd574b49077e9ff95ff340769c1ec6db2c Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 12:07:15 +0000 Subject: [PATCH 08/38] Updates to the compressible LES/RAS api - removed repeated declaration of pure abstract functions - added function to return the turbulence effective thermal diffusivity for a patch --- .../LES/GenEddyVisc/GenEddyVisc.H | 9 ----- .../LES/GenSGSStress/GenSGSStress.H | 9 ----- .../compressible/LES/LESModel/LESModel.H | 28 +++++++++------ .../LES/SpalartAllmaras/SpalartAllmaras.H | 9 ----- .../compressible/RAS/LRR/LRR.H | 9 ++--- .../RAS/LaunderGibsonRSTM/LaunderGibsonRSTM.H | 9 ++--- .../RAS/LaunderSharmaKE/LaunderSharmaKE.H | 9 ++--- .../compressible/RAS/RASModel/RASModel.H | 36 +++++++++---------- .../RAS/RNGkEpsilon/RNGkEpsilon.H | 9 ++--- .../RAS/SpalartAllmaras/SpalartAllmaras.H | 9 ++--- .../compressible/RAS/kEpsilon/kEpsilon.H | 9 ++--- .../compressible/RAS/kOmegaSST/kOmegaSST.H | 9 ++--- .../compressible/RAS/laminar/laminar.C | 21 +++++++++++ .../compressible/RAS/laminar/laminar.H | 3 ++ .../RAS/realizableKE/realizableKE.H | 9 ++--- .../turbulenceModel/laminar/laminar.H | 10 ++++++ .../turbulenceModel/turbulenceModel.H | 8 ++++- 17 files changed, 99 insertions(+), 106 deletions(-) diff --git a/src/turbulenceModels/compressible/LES/GenEddyVisc/GenEddyVisc.H b/src/turbulenceModels/compressible/LES/GenEddyVisc/GenEddyVisc.H index 440ec71c5c..7f2d3f1f85 100644 --- a/src/turbulenceModels/compressible/LES/GenEddyVisc/GenEddyVisc.H +++ b/src/turbulenceModels/compressible/LES/GenEddyVisc/GenEddyVisc.H @@ -126,15 +126,6 @@ public: return alphaSgs_; } - //- Return thermal diffusivity - virtual tmp alphaEff() const - { - return tmp - ( - new volScalarField("alphaEff", alphaSgs_ + alpha()) - ); - } - //- Return the sub-grid stress tensor. virtual tmp B() const; diff --git a/src/turbulenceModels/compressible/LES/GenSGSStress/GenSGSStress.H b/src/turbulenceModels/compressible/LES/GenSGSStress/GenSGSStress.H index ff71c80b79..e65495225c 100644 --- a/src/turbulenceModels/compressible/LES/GenSGSStress/GenSGSStress.H +++ b/src/turbulenceModels/compressible/LES/GenSGSStress/GenSGSStress.H @@ -127,15 +127,6 @@ public: return alphaSgs_; } - //- Return thermal conductivity - virtual tmp alphaEff() const - { - return tmp - ( - new volScalarField("alphaEff", alphaSgs_ + alpha()) - ); - } - //- Return the sub-grid stress tensor virtual tmp B() const { diff --git a/src/turbulenceModels/compressible/LES/LESModel/LESModel.H b/src/turbulenceModels/compressible/LES/LESModel/LESModel.H index cf019ea9a8..2cdde6c61e 100644 --- a/src/turbulenceModels/compressible/LES/LESModel/LESModel.H +++ b/src/turbulenceModels/compressible/LES/LESModel/LESModel.H @@ -189,12 +189,6 @@ public: } - //- Return the SGS turbulent kinetic energy. - virtual tmp k() const = 0; - - //- Return the SGS turbulent dissipation. - virtual tmp epsilon() const = 0; - //- Return the SGS turbulent viscosity virtual tmp muSgs() const = 0; @@ -210,8 +204,22 @@ public: //- Return the SGS turbulent thermal diffusivity virtual tmp alphaSgs() const = 0; - //- Return the SGS thermal conductivity. - virtual tmp alphaEff() const = 0; + //- Return the effective thermal diffusivity + virtual tmp alphaEff() const + { + return tmp + ( + new volScalarField("alphaEff", alphaSgs() + alpha()) + ); + } + + //- Return the effective turbulence thermal diffusivity for a patch + virtual tmp alphaEff(const label patchI) const + { + return + alphaSgs()().boundaryField()[patchI] + + alpha().boundaryField()[patchI]; + } //- Return the sub-grid stress tensor. virtual tmp B() const = 0; @@ -261,13 +269,13 @@ public: //- Correct Eddy-Viscosity and related properties. // This calls correct(const tmp& gradU) by supplying // gradU calculated locally. - void correct(); + virtual void correct(); //- Correct Eddy-Viscosity and related properties virtual void correct(const tmp& gradU); //- Read LESProperties dictionary - virtual bool read() = 0; + virtual bool read(); }; diff --git a/src/turbulenceModels/compressible/LES/SpalartAllmaras/SpalartAllmaras.H b/src/turbulenceModels/compressible/LES/SpalartAllmaras/SpalartAllmaras.H index e6239ec91b..29d53267a2 100644 --- a/src/turbulenceModels/compressible/LES/SpalartAllmaras/SpalartAllmaras.H +++ b/src/turbulenceModels/compressible/LES/SpalartAllmaras/SpalartAllmaras.H @@ -149,15 +149,6 @@ public: return alphaSgs_; } - //- Return thermal conductivity - virtual tmp alphaEff() const - { - return tmp - ( - new volScalarField("alphaEff", alphaSgs_ + alpha()) - ); - } - //- Return the sub-grid stress tensor. virtual tmp B() const; diff --git a/src/turbulenceModels/compressible/RAS/LRR/LRR.H b/src/turbulenceModels/compressible/RAS/LRR/LRR.H index 445faebd39..9ce0eef7bb 100644 --- a/src/turbulenceModels/compressible/RAS/LRR/LRR.H +++ b/src/turbulenceModels/compressible/RAS/LRR/LRR.H @@ -153,13 +153,10 @@ public: return mut_; } - //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return alphat_; } //- Return the turbulence kinetic energy diff --git a/src/turbulenceModels/compressible/RAS/LaunderGibsonRSTM/LaunderGibsonRSTM.H b/src/turbulenceModels/compressible/RAS/LaunderGibsonRSTM/LaunderGibsonRSTM.H index 00db2c304f..e8c5a331b2 100644 --- a/src/turbulenceModels/compressible/RAS/LaunderGibsonRSTM/LaunderGibsonRSTM.H +++ b/src/turbulenceModels/compressible/RAS/LaunderGibsonRSTM/LaunderGibsonRSTM.H @@ -162,13 +162,10 @@ public: return mut_; } - //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return alphat_; } //- Return the turbulence kinetic energy diff --git a/src/turbulenceModels/compressible/RAS/LaunderSharmaKE/LaunderSharmaKE.H b/src/turbulenceModels/compressible/RAS/LaunderSharmaKE/LaunderSharmaKE.H index b7c972a662..f9c878607d 100644 --- a/src/turbulenceModels/compressible/RAS/LaunderSharmaKE/LaunderSharmaKE.H +++ b/src/turbulenceModels/compressible/RAS/LaunderSharmaKE/LaunderSharmaKE.H @@ -146,13 +146,10 @@ public: return mut_; } - //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return alphat_; } //- Return the turbulence kinetic energy diff --git a/src/turbulenceModels/compressible/RAS/RASModel/RASModel.H b/src/turbulenceModels/compressible/RAS/RASModel/RASModel.H index cc189f24c8..883fa0825a 100644 --- a/src/turbulenceModels/compressible/RAS/RASModel/RASModel.H +++ b/src/turbulenceModels/compressible/RAS/RASModel/RASModel.H @@ -265,9 +265,6 @@ public: } - //- Return the turbulence viscosity - virtual tmp mut() const = 0; - //- Return the effective viscosity virtual tmp muEff() const { @@ -278,22 +275,21 @@ public: } //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const = 0; + virtual tmp alphaEff() const + { + return tmp + ( + new volScalarField("alphaEff", alphat() + alpha()) + ); + } - //- Return the turbulence kinetic energy - virtual tmp k() const = 0; - - //- Return the turbulence kinetic energy dissipation rate - virtual tmp epsilon() const = 0; - - //- Return the Reynolds stress tensor - virtual tmp R() const = 0; - - //- Return the effective stress tensor including the laminar stress - virtual tmp devRhoReff() const = 0; - - //- Return the source term for the momentum equation - virtual tmp divDevRhoReff(volVectorField& U) const = 0; + //- Return the effective turbulent thermal diffusivity for a patch + virtual tmp alphaEff(const label patchI) const + { + return + alphat()().boundaryField()[patchI] + + alpha().boundaryField()[patchI]; + } //- Return yPlus for the given patch virtual tmp yPlus @@ -303,10 +299,10 @@ public: ) const; //- Solve the turbulence equations and correct the turbulence viscosity - virtual void correct() = 0; + virtual void correct(); //- Read RASProperties dictionary - virtual bool read() = 0; + virtual bool read(); }; diff --git a/src/turbulenceModels/compressible/RAS/RNGkEpsilon/RNGkEpsilon.H b/src/turbulenceModels/compressible/RAS/RNGkEpsilon/RNGkEpsilon.H index 1e4301adcd..9d9601eee7 100644 --- a/src/turbulenceModels/compressible/RAS/RNGkEpsilon/RNGkEpsilon.H +++ b/src/turbulenceModels/compressible/RAS/RNGkEpsilon/RNGkEpsilon.H @@ -142,13 +142,10 @@ public: return mut_; } - //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return alphat_; } //- Return the turbulence kinetic energy diff --git a/src/turbulenceModels/compressible/RAS/SpalartAllmaras/SpalartAllmaras.H b/src/turbulenceModels/compressible/RAS/SpalartAllmaras/SpalartAllmaras.H index 94e736b9f8..fdb0c675ee 100644 --- a/src/turbulenceModels/compressible/RAS/SpalartAllmaras/SpalartAllmaras.H +++ b/src/turbulenceModels/compressible/RAS/SpalartAllmaras/SpalartAllmaras.H @@ -178,13 +178,10 @@ public: return mut_; } - //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return alphat_; } //- Return the turbulence kinetic energy diff --git a/src/turbulenceModels/compressible/RAS/kEpsilon/kEpsilon.H b/src/turbulenceModels/compressible/RAS/kEpsilon/kEpsilon.H index 865120d8c6..11d8f75a05 100644 --- a/src/turbulenceModels/compressible/RAS/kEpsilon/kEpsilon.H +++ b/src/turbulenceModels/compressible/RAS/kEpsilon/kEpsilon.H @@ -138,13 +138,10 @@ public: return mut_; } - //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return alphat_; } //- Return the turbulence kinetic energy diff --git a/src/turbulenceModels/compressible/RAS/kOmegaSST/kOmegaSST.H b/src/turbulenceModels/compressible/RAS/kOmegaSST/kOmegaSST.H index a563557f76..9806d32493 100644 --- a/src/turbulenceModels/compressible/RAS/kOmegaSST/kOmegaSST.H +++ b/src/turbulenceModels/compressible/RAS/kOmegaSST/kOmegaSST.H @@ -222,13 +222,10 @@ public: return mut_; } - //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return alphat_; } //- Return the turbulence kinetic energy diff --git a/src/turbulenceModels/compressible/RAS/laminar/laminar.C b/src/turbulenceModels/compressible/RAS/laminar/laminar.C index 415dedee72..cc5666eb6c 100644 --- a/src/turbulenceModels/compressible/RAS/laminar/laminar.C +++ b/src/turbulenceModels/compressible/RAS/laminar/laminar.C @@ -78,6 +78,27 @@ tmp laminar::mut() const } +tmp laminar::alphat() const +{ + return tmp + ( + new volScalarField + ( + IOobject + ( + "alphat", + runTime_.timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("alphat", alpha().dimensions(), 0.0) + ) + ); +} + + tmp laminar::k() const { return tmp diff --git a/src/turbulenceModels/compressible/RAS/laminar/laminar.H b/src/turbulenceModels/compressible/RAS/laminar/laminar.H index af1f5e2bb2..506799ec98 100644 --- a/src/turbulenceModels/compressible/RAS/laminar/laminar.H +++ b/src/turbulenceModels/compressible/RAS/laminar/laminar.H @@ -89,6 +89,9 @@ public: return tmp(new volScalarField("muEff", mu())); } + //- Return the turbulence thermal diffusivity, i.e. 0 for laminar flow + virtual tmp alphat() const; + //- Return the effective turbulent thermal diffusivity, // i.e. the laminar thermal diffusivity virtual tmp alphaEff() const diff --git a/src/turbulenceModels/compressible/RAS/realizableKE/realizableKE.H b/src/turbulenceModels/compressible/RAS/realizableKE/realizableKE.H index 222ee733a3..1b7d51a9a9 100644 --- a/src/turbulenceModels/compressible/RAS/realizableKE/realizableKE.H +++ b/src/turbulenceModels/compressible/RAS/realizableKE/realizableKE.H @@ -159,13 +159,10 @@ public: return mut_; } - //- Return the effective turbulent thermal diffusivity - virtual tmp alphaEff() const + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return alphat_; } //- Return the turbulence kinetic energy diff --git a/src/turbulenceModels/compressible/turbulenceModel/laminar/laminar.H b/src/turbulenceModels/compressible/turbulenceModel/laminar/laminar.H index d4379bfb2e..7645e67379 100644 --- a/src/turbulenceModels/compressible/turbulenceModel/laminar/laminar.H +++ b/src/turbulenceModels/compressible/turbulenceModel/laminar/laminar.H @@ -99,6 +99,9 @@ public: return tmp(new volScalarField("muEff", mu())); } + //- Return the turbulence thermal diffusivity, i.e. 0 for laminar flow + virtual tmp alphat() const; + //- Return the effective turbulent thermal diffusivity, // i.e. the laminar thermal diffusivity virtual tmp alphaEff() const @@ -106,6 +109,13 @@ public: return tmp(new volScalarField("alphaEff", alpha())); } + //- Return the effective turbulent thermal diffusivity for a patch, + // i.e. the laminar thermal diffusivity + virtual tmp alphaEff(const label patchI) const + { + return alpha().boundaryField()[patchI]; + } + //- Return the turbulence kinetic energy, i.e. 0 for laminar flow virtual tmp k() const; diff --git a/src/turbulenceModels/compressible/turbulenceModel/turbulenceModel.H b/src/turbulenceModels/compressible/turbulenceModel/turbulenceModel.H index 97638e5e49..9a84c01bb8 100644 --- a/src/turbulenceModels/compressible/turbulenceModel/turbulenceModel.H +++ b/src/turbulenceModels/compressible/turbulenceModel/turbulenceModel.H @@ -192,9 +192,15 @@ public: //- Return the effective viscosity virtual tmp muEff() const = 0; - //- Return the effective turbulent thermal diffusivity + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const = 0; + + //- Return the effective turbulence thermal diffusivity virtual tmp alphaEff() const = 0; + //- Return the effective turbulence thermal diffusivity for a patch + virtual tmp alphaEff(const label patchI) const = 0; + //- Return the turbulence kinetic energy virtual tmp k() const = 0; From e39f498186f1ca6295869ccaa336ab68505e4423 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 12:19:59 +0000 Subject: [PATCH 09/38] Thermal wall function update - Retrieve h directly from thermo package instead of using look-up --- .../alphatJayatillekeWallFunctionFvPatchScalarField.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.C b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.C index 5c73b8b146..cab530edac 100644 --- a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.C +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/wallFunctions/alphatWallFunctions/alphatJayatillekeWallFunction/alphatJayatillekeWallFunctionFvPatchScalarField.C @@ -222,7 +222,7 @@ void alphatJayatillekeWallFunctionFvPatchScalarField::updateCoeffs() const scalarField& rhow = rasModel.rho().boundaryField()[patchI]; const fvPatchScalarField& hw = - patch().lookupPatchField("h"); + rasModel.thermo().h().boundaryField()[patchI]; // Heat flux [W/m2] - lagging alphatw const scalarField qDot = (alphaw + alphatw)*hw.snGrad(); From 4727d16ffaadb40004485120d332243159838e1c Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 12:58:39 +0000 Subject: [PATCH 10/38] File missed during commit of 3b2c4abd574b49077e9ff95ff340769c1ec6db2c --- .../turbulenceModel/laminar/laminar.C | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/turbulenceModels/compressible/turbulenceModel/laminar/laminar.C b/src/turbulenceModels/compressible/turbulenceModel/laminar/laminar.C index 4a391c3db5..87d450d12d 100644 --- a/src/turbulenceModels/compressible/turbulenceModel/laminar/laminar.C +++ b/src/turbulenceModels/compressible/turbulenceModel/laminar/laminar.C @@ -96,6 +96,27 @@ tmp laminar::mut() const } +tmp laminar::alphat() const +{ + return tmp + ( + new volScalarField + ( + IOobject + ( + "alphat", + runTime_.timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedScalar("alphat", alpha().dimensions(), 0.0) + ) + ); +} + + tmp laminar::k() const { return tmp From 19f8fa236a4b583d44c2d682686882422c404d57 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 12:59:32 +0000 Subject: [PATCH 11/38] Update PDR turbulence model to conform to updated turbulence model api --- .../turbulence/PDRkEpsilon/PDRkEpsilon.H | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/applications/solvers/combustion/PDRFoam/PDRModels/turbulence/PDRkEpsilon/PDRkEpsilon.H b/applications/solvers/combustion/PDRFoam/PDRModels/turbulence/PDRkEpsilon/PDRkEpsilon.H index 5e919efcc4..5cd98cd9d6 100644 --- a/applications/solvers/combustion/PDRFoam/PDRModels/turbulence/PDRkEpsilon/PDRkEpsilon.H +++ b/applications/solvers/combustion/PDRFoam/PDRModels/turbulence/PDRkEpsilon/PDRkEpsilon.H @@ -124,11 +124,6 @@ public: // Member Functions - tmp mut() const - { - return mut_; - } - //- Return the effective diffusivity for k tmp DkEff() const { @@ -147,41 +142,44 @@ public: ); } - //- Return the effective turbulent thermal diffusivity - tmp alphaEff() const + //- Return the turbulence viscosity + virtual tmp mut() const { - return tmp - ( - new volScalarField("alphaEff", alphat_ + alpha()) - ); + return mut_; + } + + //- Return the turbulence thermal diffusivity + virtual tmp alphat() const + { + return alphat_; } //- Return the turbulence kinetic energy - tmp k() const + virtual tmp k() const { return k_; } //- Return the turbulence kinetic energy dissipation rate - tmp epsilon() const + virtual tmp epsilon() const { return epsilon_; } //- Return the Reynolds stress tensor - tmp R() const; + virtual tmp R() const; //- Return the effective stress tensor including the laminar stress - tmp devRhoReff() const; + virtual tmp devRhoReff() const; //- Return the source term for the momentum equation - tmp divDevRhoReff(volVectorField& U) const; + virtual tmp divDevRhoReff(volVectorField& U) const; //- Solve the turbulence equations and correct the turbulence viscosity - void correct(); + virtual void correct(); //- Read turbulenceProperties dictionary - bool read(); + virtual bool read(); }; From e5ef0607341791ef88dd8fb030eb9a72103cf04a Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 13:07:32 +0000 Subject: [PATCH 12/38] Update to heat transfer tutorial case - Re-setting initial T fields to unitialised values prior to running setFields utility --- .../buoyantBoussinesqSimpleFoam/hotRoom/0/T | 406 +----------------- .../hotRoom/0/T.org | 406 +----------------- 2 files changed, 2 insertions(+), 810 deletions(-) diff --git a/tutorials/heatTransfer/buoyantBoussinesqSimpleFoam/hotRoom/0/T b/tutorials/heatTransfer/buoyantBoussinesqSimpleFoam/hotRoom/0/T index 76b8877c7e..18610a300b 100644 --- a/tutorials/heatTransfer/buoyantBoussinesqSimpleFoam/hotRoom/0/T +++ b/tutorials/heatTransfer/buoyantBoussinesqSimpleFoam/hotRoom/0/T @@ -23,411 +23,7 @@ boundaryField floor { type fixedValue; - value nonuniform List -400 -( -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -600 -600 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -600 -600 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -) -; + value uniform 300; } ceiling { diff --git a/tutorials/heatTransfer/buoyantBoussinesqSimpleFoam/hotRoom/0/T.org b/tutorials/heatTransfer/buoyantBoussinesqSimpleFoam/hotRoom/0/T.org index 76b8877c7e..18610a300b 100644 --- a/tutorials/heatTransfer/buoyantBoussinesqSimpleFoam/hotRoom/0/T.org +++ b/tutorials/heatTransfer/buoyantBoussinesqSimpleFoam/hotRoom/0/T.org @@ -23,411 +23,7 @@ boundaryField floor { type fixedValue; - value nonuniform List -400 -( -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -600 -600 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -600 -600 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -300 -) -; + value uniform 300; } ceiling { From a813b9dc710f090810a8af948da462a69b267add Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 13:34:27 +0000 Subject: [PATCH 13/38] Further updates to turbulent heat flux BCs --- ...entHeatFluxTemperatureFvPatchScalarField.C | 2 + ...entHeatFluxTemperatureFvPatchScalarField.H | 31 +++++++---- ...entHeatFluxTemperatureFvPatchScalarField.C | 51 +++++++++++++++++- ...entHeatFluxTemperatureFvPatchScalarField.H | 53 ++++++++++++++++--- 4 files changed, 119 insertions(+), 18 deletions(-) diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C index 1832566586..e8e6234c32 100644 --- a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C @@ -210,6 +210,8 @@ void turbulentHeatFluxTemperatureFvPatchScalarField::write ) const { fvPatchScalarField::write(os); + os.writeKeyword("heatSource") << heatSourceTypeNames_[heatSource_] + << token::END_STATEMENT << nl; q_.writeEntry("q", os); gradient().writeEntry("gradient", os); writeEntry("value", os); diff --git a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H index f32894a130..7d9e5b7a40 100644 --- a/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H +++ b/src/turbulenceModels/compressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H @@ -26,7 +26,20 @@ Class Foam::turbulentHeatFluxTemperatureFvPatchScalarField Description - Fixed heat flux boundary condition for temperature. + Fixed heat boundary condition to specify temperature gradient. Input + heat source either specified in terms of an absolute power [W], or as a + flux [W/m2]. + + Example usage: + + hotWall + { + type compressible::turbulentHeatFluxTemperature; + heatSource flux; // power [W]; flux [W/m2] + q uniform 10; // heat power or flux + value uniform 300; // initial temperature value + } + SourceFiles turbulentHeatFluxTemperatureFvPatchScalarField.C @@ -67,18 +80,18 @@ public: }; - private: +private: - // Private data + // Private data - //- Heat source type names - static const NamedEnum heatSourceTypeNames_; + //- Heat source type names + static const NamedEnum heatSourceTypeNames_; - //- Heat source type - heatSourceType heatSource_; + //- Heat source type + heatSourceType heatSource_; - //- Heat flux [W/m2] - scalarField q_; + //- Heat power [W] or flux [W/m2] + scalarField q_; public: diff --git a/src/turbulenceModels/incompressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C b/src/turbulenceModels/incompressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C index 3ca461698a..76639637ba 100644 --- a/src/turbulenceModels/incompressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C +++ b/src/turbulenceModels/incompressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.C @@ -36,6 +36,22 @@ namespace Foam namespace incompressible { +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +template<> +const char* +NamedEnum:: +names[] = + { + "power", + "flux" + }; + +const +NamedEnum + turbulentHeatFluxTemperatureFvPatchScalarField::heatSourceTypeNames_; + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // turbulentHeatFluxTemperatureFvPatchScalarField:: @@ -46,6 +62,7 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(p, iF), + heatSource_(hsPower), q_(p.size(), 0.0), alphaEffName_("undefinedAlphaEff"), CpName_("undefinedCp") @@ -62,6 +79,7 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(ptf, p, iF, mapper), + heatSource_(ptf.heatSource_), q_(ptf.q_, mapper), alphaEffName_(ptf.alphaEffName_), CpName_(ptf.CpName_) @@ -77,6 +95,7 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(p, iF), + heatSource_(heatSourceTypeNames_.read(dict.lookup("heatSource"))), q_("q", dict, p.size()), alphaEffName_(dict.lookup("alphaEff")), CpName_(dict.lookup("Cp")) @@ -93,6 +112,7 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(thftpsf), + heatSource_(thftpsf.heatSource_), q_(thftpsf.q_), alphaEffName_(thftpsf.alphaEffName_), CpName_(thftpsf.CpName_) @@ -107,6 +127,7 @@ turbulentHeatFluxTemperatureFvPatchScalarField ) : fixedGradientFvPatchScalarField(thftpsf, iF), + heatSource_(thftpsf.heatSource_), q_(thftpsf.q_), alphaEffName_(thftpsf.alphaEffName_), CpName_(thftpsf.CpName_) @@ -156,7 +177,33 @@ void turbulentHeatFluxTemperatureFvPatchScalarField::updateCoeffs() const scalarField& Cpp = patch().lookupPatchField(CpName_); - gradient() = q_/(Cpp*alphaEffp); + switch (heatSource_) + { + case hsPower: + { + const scalar Ap = gSum(patch().magSf()); + gradient() = q_/(Ap*Cpp*alphaEffp); + break; + } + case hsFlux: + { + gradient() = q_/(Cpp*alphaEffp); + break; + } + default: + { + FatalErrorIn + ( + "turbulentHeatFluxTemperatureFvPatchScalarField" + "(" + "const fvPatch&, " + "const DimensionedField&, " + "const dictionary&" + ")" + ) << "Unknown heat source type. Valid types are: " + << heatSourceTypeNames_ << nl << exit(FatalError); + } + } fixedGradientFvPatchScalarField::updateCoeffs(); } @@ -165,6 +212,8 @@ void turbulentHeatFluxTemperatureFvPatchScalarField::updateCoeffs() void turbulentHeatFluxTemperatureFvPatchScalarField::write(Ostream& os) const { fixedGradientFvPatchScalarField::write(os); + os.writeKeyword("heatSource") << heatSourceTypeNames_[heatSource_] + << token::END_STATEMENT << nl; q_.writeEntry("q", os); os.writeKeyword("alphaEff") << alphaEffName_ << token::END_STATEMENT << nl; os.writeKeyword("Cp") << CpName_ << token::END_STATEMENT << nl; diff --git a/src/turbulenceModels/incompressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H b/src/turbulenceModels/incompressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H index 848c9ca403..1ba9a77253 100644 --- a/src/turbulenceModels/incompressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H +++ b/src/turbulenceModels/incompressible/RAS/derivedFvPatchFields/turbulentHeatFluxTemperature/turbulentHeatFluxTemperatureFvPatchScalarField.H @@ -26,7 +26,22 @@ Class Foam::turbulentHeatFluxTemperatureFvPatchScalarField Description - Fixed heat flux boundary condition for temperature. + Fixed heat boundary condition to specify temperature gradient. Input + heat source either specified in terms of an absolute power [W], or as a + flux [W/m2]. + + Example usage: + + hotWall + { + type turbulentHeatFluxTemperature; + heatSource flux; // power [W]; flux [W/m2] + q uniform 10; // heat power or flux + alphaEff alphaEff; // alphaEff field name; + // alphaEff in [kg/m/s] + Cp Cp; // Cp field name; Cp in [J/kg/K] + value uniform 300; // initial temperature value + } SourceFiles turbulentHeatFluxTemperatureFvPatchScalarField.C @@ -38,6 +53,7 @@ SourceFiles #include "fvPatchFields.H" #include "fixedGradientFvPatchFields.H" +#include "NamedEnum.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -54,16 +70,37 @@ class turbulentHeatFluxTemperatureFvPatchScalarField : public fixedGradientFvPatchScalarField { -// Private data +public: - //- Heat flux [W/m2] - scalarField q_; + // Data types - //- Name of effective thermal diffusivity field - word alphaEffName_; + //- Enumeration listing the possible hest source input modes + enum heatSourceType + { + hsPower, + hsFlux + }; - //- Name of specific heat capacity field - word CpName_; + +private: + + // Private data + + //- Heat source type names + static const NamedEnum heatSourceTypeNames_; + + //- Heat source type + heatSourceType heatSource_; + + //- Heat power [W] or flux [W/m2] + // NOTE: to be divided by density, rho, if used in kinematic form + scalarField q_; + + //- Name of effective thermal diffusivity field + word alphaEffName_; + + //- Name of specific heat capacity field + word CpName_; public: From 521837fc0f49b77ccf33996cda609d3a9753575b Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 16:22:23 +0000 Subject: [PATCH 14/38] Corrected template argument for cloud typedefs --- .../BasicReactingMultiphaseCloud.H | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/lagrangian/intermediate/clouds/derived/BasicReactingMultiphaseCloud/BasicReactingMultiphaseCloud.H b/src/lagrangian/intermediate/clouds/derived/BasicReactingMultiphaseCloud/BasicReactingMultiphaseCloud.H index f02475a316..3a8d69c2ef 100644 --- a/src/lagrangian/intermediate/clouds/derived/BasicReactingMultiphaseCloud/BasicReactingMultiphaseCloud.H +++ b/src/lagrangian/intermediate/clouds/derived/BasicReactingMultiphaseCloud/BasicReactingMultiphaseCloud.H @@ -42,13 +42,31 @@ Description namespace Foam { - typedef ReactingMultiphaseCloud > + typedef ReactingMultiphaseCloud + < + BasicReactingMultiphaseParcel + < + constGasThermoPhysics + > + > constThermoReactingMultiphaseCloud; - typedef ReactingMultiphaseCloud > + typedef ReactingMultiphaseCloud + < + BasicReactingMultiphaseParcel + < + gasThermoPhysics + > + > thermoReactingMultiphaseCloud; - typedef ReactingMultiphaseCloud > + typedef ReactingMultiphaseCloud + < + BasicReactingMultiphaseParcel + < + icoPoly8ThermoPhysics + > + > icoPoly8ThermoReactingMultiphaseCloud; } From ebfd516f88b2a8fdec8df60e6488e6cb2a07164d Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 16:23:21 +0000 Subject: [PATCH 15/38] Lagrangian multiphase cloud enthalpy coupling update - using chemical enthalpy instead of total enthalpy --- .../ReactingMultiphaseParcel/ReactingMultiphaseParcel.C | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C index 5c3d3d0685..c1914e5ed5 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C @@ -401,7 +401,7 @@ void Foam::ReactingMultiphaseParcel::calc td.cloud().hcTrans()[cellI] += np0 *dMassGas[i] - *td.cloud().mcCarrierThermo().speciesData()[gid].H(T0); + *td.cloud().mcCarrierThermo().speciesData()[gid].Hc(); } forAll(YLiquid_, i) { @@ -410,7 +410,7 @@ void Foam::ReactingMultiphaseParcel::calc td.cloud().hcTrans()[cellI] += np0 *dMassLiquid[i] - *td.cloud().mcCarrierThermo().speciesData()[gid].H(T0); + *td.cloud().mcCarrierThermo().speciesData()[gid].Hc(); } /* // No mapping between solid components and carrier phase @@ -421,7 +421,7 @@ void Foam::ReactingMultiphaseParcel::calc td.cloud().hcTrans()[cellI] += np0 *dMassSolid[i] - *td.cloud().mcCarrierThermo().speciesData()[gid].H(T0); + *td.cloud().mcCarrierThermo().speciesData()[gid].Hc(); } */ forAll(dMassSRCarrier, i) @@ -430,7 +430,7 @@ void Foam::ReactingMultiphaseParcel::calc td.cloud().hcTrans()[cellI] += np0 *dMassSRCarrier[i] - *td.cloud().mcCarrierThermo().speciesData()[i].H(T0); + *td.cloud().mcCarrierThermo().speciesData()[i].Hc(); } // Update momentum transfer From 550d754650378c9cedd33fb9347f3a77907d2b1d Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 16:24:51 +0000 Subject: [PATCH 16/38] Bugfix: Xinf was incorrectly sized --- .../parcels/Templates/ReactingParcel/ReactingParcel.C | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C index 524b4d00d5..92525ea2b1 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C @@ -122,7 +122,7 @@ void Foam::ReactingParcel::correctSurfaceValues } // Far field carrier molar fractions - scalarField Xinf(Y_.size()); + scalarField Xinf(td.cloud().mcCarrierThermo().speciesData().size()); forAll(Xinf, i) { From 90032a8c02cc26f01756cba5ce9757067b6a1b24 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 11 Jan 2010 16:32:28 +0000 Subject: [PATCH 17/38] Correcting typo in omega initial field in tutorial --- .../verticalChannel/0/omega | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/omega b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/omega index f9b551e72b..0538e96fb7 100644 --- a/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/omega +++ b/tutorials/lagrangian/porousExplicitSourceReactingParcelFoam/verticalChannel/0/omega @@ -41,7 +41,7 @@ boundaryField type compressible::turbulentMixingLengthFrequencyInlet; mixingLength 0.007; k k; - value uniform 4.5-3; + value uniform 4.5e-3; } outlet { From dc507b8c7d39229e850c6355c4f6f8ba350c425b Mon Sep 17 00:00:00 2001 From: andy Date: Wed, 13 Jan 2010 10:50:32 +0000 Subject: [PATCH 18/38] Relocated paraview PV_PLUGIN_PATH environment variable - moved to $FOAM_LIBBIN/paraview so that built libraries sit in their own folder - avoids PV error msgs on start-up when it tries to load all libs under the $PV_PLUGIN_PATH --- etc/apps/paraview3/bashrc | 2 +- etc/apps/paraview3/cshrc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/apps/paraview3/bashrc b/etc/apps/paraview3/bashrc index 7209dc0da8..bbeb6c0ebd 100644 --- a/etc/apps/paraview3/bashrc +++ b/etc/apps/paraview3/bashrc @@ -68,7 +68,7 @@ fi if [ -r $ParaView_DIR ] then export PATH=$ParaView_DIR/bin:$PATH - export PV_PLUGIN_PATH=$FOAM_LIBBIN + export PV_PLUGIN_PATH=$FOAM_LIBBIN/paraview fi unset cmake ParaView_PYTHON_DIR diff --git a/etc/apps/paraview3/cshrc b/etc/apps/paraview3/cshrc index 9160edf0f8..33c863215e 100644 --- a/etc/apps/paraview3/cshrc +++ b/etc/apps/paraview3/cshrc @@ -62,7 +62,7 @@ endif if ( -r $ParaView_INST_DIR ) then set path=($ParaView_DIR/bin $path) - setenv PV_PLUGIN_PATH $FOAM_LIBBIN + setenv PV_PLUGIN_PATH $FOAM_LIBBIN/paraview endif unset cmake paraviewMajor paraviewPython From 210f2305b6085906d6a4ce80b152ac2412bee92c Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 13 Jan 2010 19:06:11 +0000 Subject: [PATCH 19/38] Moved dumping of graph up to ease debugging --- .../scotchDecomp/scotchDecomp.C | 90 +++++++++---------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/src/parallel/decompositionMethods/scotchDecomp/scotchDecomp.C b/src/parallel/decompositionMethods/scotchDecomp/scotchDecomp.C index 5375fb529b..c14e7e39f1 100644 --- a/src/parallel/decompositionMethods/scotchDecomp/scotchDecomp.C +++ b/src/parallel/decompositionMethods/scotchDecomp/scotchDecomp.C @@ -126,6 +126,51 @@ Foam::label Foam::scotchDecomp::decompose List& finalDecomp ) { + // Dump graph + if (decompositionDict_.found("scotchCoeffs")) + { + const dictionary& scotchCoeffs = + decompositionDict_.subDict("scotchCoeffs"); + + if (scotchCoeffs.found("writeGraph")) + { + Switch writeGraph(scotchCoeffs.lookup("writeGraph")); + + if (writeGraph) + { + OFstream str(mesh_.time().path() / mesh_.name() + ".grf"); + + Info<< "Dumping Scotch graph file to " << str.name() << endl + << "Use this in combination with gpart." << endl; + + label version = 0; + str << version << nl; + // Numer of vertices + str << xadj.size()-1 << ' ' << adjncy.size() << nl; + // Numbering starts from 0 + label baseval = 0; + // Has weights? + label hasEdgeWeights = 0; + label hasVertexWeights = 0; + label numericflag = 10*hasEdgeWeights+hasVertexWeights; + str << baseval << ' ' << numericflag << nl; + for (label cellI = 0; cellI < xadj.size()-1; cellI++) + { + label start = xadj[cellI]; + label end = xadj[cellI+1]; + str << end-start; + + for (label i = start; i < end; i++) + { + str << ' ' << adjncy[i]; + } + str << nl; + } + } + } + } + + // Strategy // ~~~~~~~~ @@ -206,51 +251,6 @@ Foam::label Foam::scotchDecomp::decompose check(SCOTCH_graphCheck(&grafdat), "SCOTCH_graphCheck"); - // Dump graph - if (decompositionDict_.found("scotchCoeffs")) - { - const dictionary& scotchCoeffs = - decompositionDict_.subDict("scotchCoeffs"); - - if (scotchCoeffs.found("writeGraph")) - { - Switch writeGraph(scotchCoeffs.lookup("writeGraph")); - - if (writeGraph) - { - OFstream str(mesh_.time().path() / mesh_.name() + ".grf"); - - Info<< "Dumping Scotch graph file to " << str.name() << endl - << "Use this in combination with gpart." << endl; - - label version = 0; - str << version << nl; - // Numer of vertices - str << xadj.size()-1 << ' ' << adjncy.size() << nl; - // Numbering starts from 0 - label baseval = 0; - // Has weights? - label hasEdgeWeights = 0; - label hasVertexWeights = 0; - label numericflag = 10*hasEdgeWeights+hasVertexWeights; - str << baseval << ' ' << numericflag << nl; - for (label cellI = 0; cellI < xadj.size()-1; cellI++) - { - label start = xadj[cellI]; - label end = xadj[cellI+1]; - str << end-start; - - for (label i = start; i < end; i++) - { - str << ' ' << adjncy[i]; - } - str << nl; - } - } - } - } - - // Architecture // ~~~~~~~~~~~~ // (fully connected network topology since using switch) From 735de0c758c6a4be4831a418a2d223dae769a144 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 13 Jan 2010 19:07:04 +0000 Subject: [PATCH 20/38] Assign points even when no merging; remove points used by illegal triangles --- src/triSurface/triSurface/stitchTriangles.C | 93 ++++++++++++++++----- 1 file changed, 72 insertions(+), 21 deletions(-) diff --git a/src/triSurface/triSurface/stitchTriangles.C b/src/triSurface/triSurface/stitchTriangles.C index 7a441ac679..70fe304808 100644 --- a/src/triSurface/triSurface/stitchTriangles.C +++ b/src/triSurface/triSurface/stitchTriangles.C @@ -26,6 +26,7 @@ License #include "triSurface.H" #include "mergePoints.H" +#include "PackedBoolList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -46,46 +47,44 @@ bool triSurface::stitchTriangles pointField newPoints; bool hasMerged = mergePoints(rawPoints, tol, verbose, pointMap, newPoints); + pointField& ps = storedPoints(); + // Set the coordinates to the merged ones + ps.transfer(newPoints); if (hasMerged) { if (verbose) { Pout<< "stitchTriangles : Merged from " << rawPoints.size() - << " points down to " << newPoints.size() << endl; + << " points down to " << ps.size() << endl; } - pointField& ps = storedPoints(); - - // Set the coordinates to the merged ones - ps = newPoints; - // Reset the triangle point labels to the unique points array label newTriangleI = 0; forAll(*this, i) { - label newA = pointMap[operator[](i)[0]]; - label newB = pointMap[operator[](i)[1]]; - label newC = pointMap[operator[](i)[2]]; + const labelledTri& tri = operator[](i); + labelledTri newTri + ( + pointMap[tri[0]], + pointMap[tri[1]], + pointMap[tri[2]], + tri.region() + ); - if ((newA != newB) && (newA != newC) && (newB != newC)) + if ((newTri[0] != newTri[1]) && (newTri[0] != newTri[2]) && (newTri[1] != newTri[2])) { - operator[](newTriangleI)[0] = newA; - operator[](newTriangleI)[1] = newB; - operator[](newTriangleI)[2] = newC; - operator[](newTriangleI).region() = operator[](i).region(); - newTriangleI++; + operator[](newTriangleI++) = newTri; } else if (verbose) { Pout<< "stitchTriangles : " - << "Removing triangle " << i << " with non-unique vertices." - << endl - << " vertices :" << newA << ' ' << newB << ' ' << newC - << endl - << " coordinates:" << ps[newA] << ' ' << ps[newB] - << ' ' << ps[newC] << endl; + << "Removing triangle " << i + << " with non-unique vertices." << endl + << " vertices :" << newTri << endl + << " coordinates:" << newTri.points(ps) + << endl; } } @@ -98,6 +97,58 @@ bool triSurface::stitchTriangles << " triangles" << endl; } setSize(newTriangleI); + + // And possibly compact out any unused points (since used only + // by triangles that have just been deleted) + // Done in two passes to save memory (pointField) + + // 1. Detect only + PackedBoolList pointIsUsed(ps.size()); + + label nPoints = 0; + + forAll(*this, i) + { + const labelledTri& tri = operator[](i); + + forAll(tri, fp) + { + label pointI = tri[fp]; + if (pointIsUsed.set(pointI, 1)) + { + nPoints++; + } + } + } + + if (nPoints != ps.size()) + { + // 2. Compact. + pointMap.setSize(ps.size()); + label newPointI = 0; + forAll(pointIsUsed, pointI) + { + if (pointIsUsed[pointI]) + { + ps[newPointI] = ps[pointI]; + pointMap[pointI] = newPointI++; + } + } + ps.setSize(newPointI); + + newTriangleI = 0; + forAll(*this, i) + { + const labelledTri& tri = operator[](i); + operator[](newTriangleI++) = labelledTri + ( + pointMap[tri[0]], + pointMap[tri[1]], + pointMap[tri[2]], + tri.region() + ); + } + } } } From 1e78a1486552d9ab5e6c83de2fa4cc2878985038 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 13 Jan 2010 19:08:01 +0000 Subject: [PATCH 21/38] Handle tracking on face or edge --- src/meshTools/indexedOctree/indexedOctree.C | 54 +++++++++++---------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/src/meshTools/indexedOctree/indexedOctree.C b/src/meshTools/indexedOctree/indexedOctree.C index 128e6bf600..1d444eff3d 100644 --- a/src/meshTools/indexedOctree/indexedOctree.C +++ b/src/meshTools/indexedOctree/indexedOctree.C @@ -957,6 +957,7 @@ Foam::point Foam::indexedOctree::pushPointIntoFace } else if (nFaces == 1) { + // Point is on a single face keepFaceID = faceIndices[0]; } else @@ -1782,16 +1783,6 @@ Foam::pointIndexHit Foam::indexedOctree::findLine label i = 0; for (; i < 100000; i++) { - if (verbose) - { - Pout<< "iter:" << i - << " at startPoint:" << hitInfo.rawPoint() << endl - << " node:" << nodeI - << " octant:" << octant - << " bb:" << subBbox(nodeI, octant) << endl; - } - - // Ray-trace to end of current node. Updates point (either on triangle // in case of hit or on node bounding box in case of miss) @@ -1808,6 +1799,19 @@ Foam::pointIndexHit Foam::indexedOctree::findLine ) ); + if (verbose) + { + Pout<< "iter:" << i + << " at current:" << hitInfo.rawPoint() + << " (perturbed:" << startPoint << ")" << endl + << " node:" << nodeI + << " octant:" << octant + << " bb:" << subBbox(nodeI, octant) << endl; + } + + + + // Faces of current bounding box current point is on direction hitFaceID = 0; @@ -1833,12 +1837,23 @@ Foam::pointIndexHit Foam::indexedOctree::findLine break; } - if (hitFaceID == 0) + if (hitFaceID == 0 || hitInfo.rawPoint() == treeEnd) { // endpoint inside the tree. Return miss. break; } + // Create a point on other side of face. + point perturbedPoint + ( + pushPoint + ( + octantBb, + hitFaceID, + hitInfo.rawPoint(), + false // push outside of octantBb + ) + ); if (verbose) { @@ -1848,14 +1863,7 @@ Foam::pointIndexHit Foam::indexedOctree::findLine << " node:" << nodeI << " octant:" << octant << " bb:" << subBbox(nodeI, octant) << nl - << " walking to neighbour containing:" - << pushPoint - ( - octantBb, - hitFaceID, - hitInfo.rawPoint(), - false // push outside of octantBb - ) + << " walking to neighbour containing:" << perturbedPoint << endl; } @@ -1866,13 +1874,7 @@ Foam::pointIndexHit Foam::indexedOctree::findLine bool ok = walkToNeighbour ( - pushPoint - ( - octantBb, - hitFaceID, - hitInfo.rawPoint(), - false // push outside of octantBb - ), + perturbedPoint, hitFaceID, // face(s) that hitInfo is on nodeI, From 0496e181236503bd21f8121bf0dbced60177a514 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 13 Jan 2010 19:08:47 +0000 Subject: [PATCH 22/38] Modified tolerances to take truncation error into account --- .../polyPatches/basic/coupled/coupledPolyPatch.C | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C index ee2d966836..8e18f68c77 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C +++ b/src/OpenFOAM/meshes/polyMesh/polyPatches/basic/coupled/coupledPolyPatch.C @@ -199,13 +199,20 @@ Foam::scalarField Foam::coupledPolyPatch::calcFaceTol const face& f = faces[faceI]; + // 1. calculate a typical size of the face. Use maximum distance + // to face centre scalar maxLenSqr = -GREAT; + // 2. as measure of truncation error when comparing two coordinates + // use SMALL * maximum component + scalar maxCmpt = -GREAT; forAll(f, fp) { - maxLenSqr = max(maxLenSqr, magSqr(points[f[fp]] - cc)); + const point& pt = points[f[fp]]; + maxLenSqr = max(maxLenSqr, magSqr(pt - cc)); + maxCmpt = max(maxCmpt, cmptMax(cmptMag(pt))); } - tols[faceI] = matchTol * Foam::sqrt(maxLenSqr); + tols[faceI] = max(SMALL*maxCmpt, matchTol*Foam::sqrt(maxLenSqr)); } return tols; } From 21048d96005bb8371806eaa2ccc93a222a184d78 Mon Sep 17 00:00:00 2001 From: mattijs Date: Wed, 13 Jan 2010 19:10:54 +0000 Subject: [PATCH 23/38] Disabled writing zero-sized faceZones since upset tecio library --- .../foamToTecplot360/foamToTecplot360.C | 145 ++++++++++-------- 1 file changed, 77 insertions(+), 68 deletions(-) diff --git a/applications/utilities/postProcessing/dataConversion/foamToTecplot360/foamToTecplot360.C b/applications/utilities/postProcessing/dataConversion/foamToTecplot360/foamToTecplot360.C index 6c1065a489..44384b7efe 100644 --- a/applications/utilities/postProcessing/dataConversion/foamToTecplot360/foamToTecplot360.C +++ b/applications/utilities/postProcessing/dataConversion/foamToTecplot360/foamToTecplot360.C @@ -1077,83 +1077,92 @@ int main(int argc, char *argv[]) { const faceZone& pp = zones[zoneI]; - const indirectPrimitivePatch ipp - ( - IndirectList(mesh.faces(), pp), - mesh.points() - ); + if (pp.size() > 0) + { + const indirectPrimitivePatch ipp + ( + IndirectList(mesh.faces(), pp), + mesh.points() + ); - writer.writePolygonalZone - ( - pp.name(), - strandID++, //1+patchIDs.size()+zoneI, //strandID, - ipp, - allVarLocation - ); + writer.writePolygonalZone + ( + pp.name(), + strandID++, //1+patchIDs.size()+zoneI, //strandID, + ipp, + allVarLocation + ); - // Write coordinates - writer.writeField(ipp.localPoints().component(0)()); - writer.writeField(ipp.localPoints().component(1)()); - writer.writeField(ipp.localPoints().component(2)()); + // Write coordinates + writer.writeField(ipp.localPoints().component(0)()); + writer.writeField(ipp.localPoints().component(1)()); + writer.writeField(ipp.localPoints().component(2)()); - // Write all volfields - forAll(vsf, i) - { - writer.writeField - ( - writer.getFaceField + // Write all volfields + forAll(vsf, i) + { + writer.writeField ( - linearInterpolate(vsf[i])(), - pp - )() - ); - } - forAll(vvf, i) - { - writer.writeField - ( - writer.getFaceField + writer.getFaceField + ( + linearInterpolate(vsf[i])(), + pp + )() + ); + } + forAll(vvf, i) + { + writer.writeField ( - linearInterpolate(vvf[i])(), - pp - )() - ); - } - forAll(vSpheretf, i) - { - writer.writeField - ( - writer.getFaceField + writer.getFaceField + ( + linearInterpolate(vvf[i])(), + pp + )() + ); + } + forAll(vSpheretf, i) + { + writer.writeField ( - linearInterpolate(vSpheretf[i])(), - pp - )() - ); - } - forAll(vSymmtf, i) - { - writer.writeField - ( - writer.getFaceField + writer.getFaceField + ( + linearInterpolate(vSpheretf[i])(), + pp + )() + ); + } + forAll(vSymmtf, i) + { + writer.writeField ( - linearInterpolate(vSymmtf[i])(), - pp - )() - ); - } - forAll(vtf, i) - { - writer.writeField - ( - writer.getFaceField + writer.getFaceField + ( + linearInterpolate(vSymmtf[i])(), + pp + )() + ); + } + forAll(vtf, i) + { + writer.writeField ( - linearInterpolate(vtf[i])(), - pp - )() - ); - } + writer.getFaceField + ( + linearInterpolate(vtf[i])(), + pp + )() + ); + } - writer.writeConnectivity(ipp); + writer.writeConnectivity(ipp); + } + else + { + Info<< " Skipping zero sized faceZone " << zoneI + << "\t" << pp.name() + << nl << endl; + } } } From c9033fc36fc2a8474b0e7dccb85fee933e775700 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:14:06 +0000 Subject: [PATCH 24/38] Added optional settings at comment --- .../utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict index c7f2d5b6f3..783469ee7d 100644 --- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict +++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMeshDict @@ -40,6 +40,10 @@ geometry { type triSurfaceMesh; + //tolerance 1E-6; // optional:non-default tolerance on intersections + //maxTreeDepth 10; // optional:depth of octree. Decrease only in case + // of memory limitations. + // Per region the patchname. If not provided will be _. regions { From 7f64e0271d9aeafaab4ad482be508fedb9532cd2 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:14:42 +0000 Subject: [PATCH 25/38] Changed comment in header --- .../scotchDecomp/scotchDecomp.C | 111 +++++++++++++----- 1 file changed, 79 insertions(+), 32 deletions(-) diff --git a/src/parallel/decompositionMethods/scotchDecomp/scotchDecomp.C b/src/parallel/decompositionMethods/scotchDecomp/scotchDecomp.C index c14e7e39f1..53931689cb 100644 --- a/src/parallel/decompositionMethods/scotchDecomp/scotchDecomp.C +++ b/src/parallel/decompositionMethods/scotchDecomp/scotchDecomp.C @@ -22,40 +22,87 @@ License along with OpenFOAM; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Default strategy: - Strat=b - { - job=t, - map=t, - poli=S, - sep= - ( - m + From scotch forum: + + By: Francois PELLEGRINI RE: Graph mapping 'strategy' string [ reply ] + 2008-08-22 10:09 Strategy handling in Scotch is a bit tricky. In order + not to be confused, you must have a clear view of how they are built. + Here are some rules: + + 1- Strategies are made up of "methods" which are combined by means of + "operators". + + 2- A method is of the form "m{param=value,param=value,...}", where "m" + is a single character (this is your first error: "f" is a method name, + not a parameter name). + + 3- There exist different sort of strategies : bipartitioning strategies, + mapping strategies, ordering strategies, which cannot be mixed. For + instance, you cannot build a bipartitioning strategy and feed it to a + mapping method (this is your second error). + + To use the "mapCompute" routine, you must create a mapping strategy, not + a bipartitioning one, and so use stratGraphMap() and not + stratGraphBipart(). Your mapping strategy should however be based on the + "recursive bipartitioning" method ("b"). For instance, a simple (and + hence not very efficient) mapping strategy can be : + + "b{sep=f}" + + which computes mappings with the recursive bipartitioning method "b", + this latter using the Fiduccia-Mattheyses method "f" to compute its + separators. + + If you want an exact partition (see your previous post), try + "b{sep=fx}". + + However, these strategies are not the most efficient, as they do not + make use of the multi-level framework. + + To use the multi-level framework, try for instance: + + "b{sep=m{vert=100,low=h,asc=f}x}" + + The current default mapping strategy in Scotch can be seen by using the + "-vs" option of program gmap. It is, to date: + + b + { + job=t, + map=t, + poli=S, + sep= + ( + m + { + asc=b { - asc=b - { - bnd=d{pass=40,dif=1,rem=1}f{move=80,pass=-1,bal=0.005}, - org=f{move=80,pass=-1,bal=0.005},width=3 - }, - low=h{pass=10}f{move=80,pass=-1,bal=0.0005}, - type=h, - vert=80, - rat=0.8 - } - | m + bnd=d{pass=40,dif=1,rem=1}f{move=80,pass=-1,bal=0.005}, + org=f{move=80,pass=-1,bal=0.005}, + width=3 + }, + low=h{pass=10}f{move=80,pass=-1,bal=0.0005}, + type=h, + vert=80, + rat=0.8 + } + | m + { + asc=b { - asc=b - { - bnd=d{pass=40,dif=1,rem=1}f{move=80,pass=-1,bal=0.005}, - org=f{move=80,pass=-1,bal=0.005}, - width=3}, - low=h{pass=10}f{move=80,pass=-1,bal=0.0005}, - type=h, - vert=80, - rat=0.8 - } - ) - } + bnd=d{pass=40,dif=1,rem=1}f{move=80,pass=-1,bal=0.005}, + org=f{move=80,pass=-1,bal=0.005}, + width=3 + }, + low=h{pass=10}f{move=80,pass=-1,bal=0.0005}, + type=h, + vert=80, + rat=0.8 + } + ) + } + + \*---------------------------------------------------------------------------*/ #include "scotchDecomp.H" From b7ba2d273a0464895dc4b9f1b7c721199169a200 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:15:42 +0000 Subject: [PATCH 26/38] Corrected printing to be on master only --- .../mesh/manipulation/setSet/setSet.C | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/applications/utilities/mesh/manipulation/setSet/setSet.C b/applications/utilities/mesh/manipulation/setSet/setSet.C index 7833b4ec24..cf24a1c447 100644 --- a/applications/utilities/mesh/manipulation/setSet/setSet.C +++ b/applications/utilities/mesh/manipulation/setSet/setSet.C @@ -94,7 +94,7 @@ void backup { if (fromSet.size()) { - Pout<< " Backing up " << fromName << " into " << toName << endl; + Info<< " Backing up " << fromName << " into " << toName << endl; topoSet::New(setType, mesh, toName, fromSet)().write(); } @@ -525,7 +525,7 @@ bool doCommand { topoSet& currentSet = currentSetPtr(); - Pout<< " Set:" << currentSet.name() + Info<< " Set:" << currentSet.name() << " Size:" << currentSet.size() << " Action:" << actionName << endl; @@ -622,7 +622,7 @@ bool doCommand + ".vtk" ); - Pout<< " Writing " << currentSet.name() + Info<< " Writing " << currentSet.name() << " (size " << currentSet.size() << ") to " << currentSet.instance()/currentSet.local() /currentSet.name() @@ -634,7 +634,7 @@ bool doCommand } else { - Pout<< " Writing " << currentSet.name() + Info<< " Writing " << currentSet.name() << " (size " << currentSet.size() << ") to " << currentSet.instance()/currentSet.local() /currentSet.name() << endl << endl; @@ -683,7 +683,7 @@ enum commandStatus void printMesh(const Time& runTime, const polyMesh& mesh) { - Pout<< "Time:" << runTime.timeName() + Info<< "Time:" << runTime.timeName() << " cells:" << mesh.nCells() << " faces:" << mesh.nFaces() << " points:" << mesh.nPoints() @@ -703,19 +703,19 @@ commandStatus parseType { if (setType.empty()) { - Pout<< "Type 'help' for usage information" << endl; + Info<< "Type 'help' for usage information" << endl; return INVALID; } else if (setType == "help") { - printHelp(Pout); + printHelp(Info); return INVALID; } else if (setType == "list") { - printAllSets(mesh, Pout); + printAllSets(mesh, Info); return INVALID; } @@ -726,7 +726,7 @@ commandStatus parseType label nearestIndex = Time::findClosestTimeIndex(Times, requestedTime); - Pout<< "Changing time from " << runTime.timeName() + Info<< "Changing time from " << runTime.timeName() << " to " << Times[nearestIndex].name() << endl; @@ -737,24 +737,24 @@ commandStatus parseType { case polyMesh::UNCHANGED: { - Pout<< " mesh not changed." << endl; + Info<< " mesh not changed." << endl; break; } case polyMesh::POINTS_MOVED: { - Pout<< " points moved; topology unchanged." << endl; + Info<< " points moved; topology unchanged." << endl; break; } case polyMesh::TOPO_CHANGE: { - Pout<< " topology changed; patches unchanged." << nl + Info<< " topology changed; patches unchanged." << nl << " "; printMesh(runTime, mesh); break; } case polyMesh::TOPO_PATCH_CHANGE: { - Pout<< " topology changed and patches changed." << nl + Info<< " topology changed and patches changed." << nl << " "; printMesh(runTime, mesh); @@ -773,7 +773,7 @@ commandStatus parseType } else if (setType == "quit") { - Pout<< "Quitting ..." << endl; + Info<< "Quitting ..." << endl; return QUIT; } @@ -864,7 +864,7 @@ int main(int argc, char *argv[]) printMesh(runTime, mesh); // Print current sets - printAllSets(mesh, Pout); + printAllSets(mesh, Info); @@ -874,7 +874,7 @@ int main(int argc, char *argv[]) { fileName batchFile(args.option("batch")); - Pout<< "Reading commands from file " << batchFile << endl; + Info<< "Reading commands from file " << batchFile << endl; // we cannot handle .gz files if (!isFile(batchFile, false)) @@ -888,11 +888,11 @@ int main(int argc, char *argv[]) #if READLINE != 0 else if (!read_history(historyFile)) { - Pout<< "Successfully read history from " << historyFile << endl; + Info<< "Successfully read history from " << historyFile << endl; } #endif - Pout<< "Please type 'help', 'quit' or a set command after prompt." << endl; + Info<< "Please type 'help', 'quit' or a set command after prompt." << endl; bool ok = true; @@ -916,7 +916,7 @@ int main(int argc, char *argv[]) { if (!fileStreamPtr->good()) { - Pout<< "End of batch file" << endl; + Info<< "End of batch file" << endl; break; } @@ -924,7 +924,7 @@ int main(int argc, char *argv[]) if (rawLine.size()) { - Pout<< "Doing:" << rawLine << endl; + Info<< "Doing:" << rawLine << endl; } } else @@ -945,7 +945,7 @@ int main(int argc, char *argv[]) } # else { - Pout<< "Command>" << flush; + Info<< "Command>" << flush; std::getline(std::cin, rawLine); } # endif @@ -992,7 +992,7 @@ int main(int argc, char *argv[]) delete fileStreamPtr; } - Pout<< "\nEnd\n" << endl; + Info<< "\nEnd\n" << endl; return 0; } From d0b95d6949990ba8040b8e18565e0580526d2e0a Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:16:07 +0000 Subject: [PATCH 27/38] Added mesh region option --- .../utilities/mesh/manipulation/stitchMesh/stitchMesh.C | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C b/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C index 70927ca8f3..553ea07138 100644 --- a/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C +++ b/applications/utilities/mesh/manipulation/stitchMesh/stitchMesh.C @@ -96,6 +96,7 @@ void checkPatch(const polyBoundaryMesh& bMesh, const word& name) int main(int argc, char *argv[]) { argList::noParallel(); +# include "addRegionOption.H" argList::validArgs.append("masterPatch"); argList::validArgs.append("slavePatch"); @@ -109,7 +110,7 @@ int main(int argc, char *argv[]) # include "setRootCase.H" # include "createTime.H" runTime.functionObjects().off(); -# include "createMesh.H" +# include "createNamedMesh.H" const word oldInstance = mesh.pointsInstance(); From 06b1695962e6f0c3dc0619226f3ef006e7673741 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:17:05 +0000 Subject: [PATCH 28/38] Added conversion of zero-sized zones --- .../foamFormatConvert/foamFormatConvert.C | 100 +++++++++++++++++- 1 file changed, 97 insertions(+), 3 deletions(-) diff --git a/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C b/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C index 7e4363ffb0..cd51599ca1 100644 --- a/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C +++ b/applications/utilities/miscellaneous/foamFormatConvert/foamFormatConvert.C @@ -31,6 +31,14 @@ Description Mainly used to convert binary mesh/field files to ASCII. + Problem: any zero-size List written binary gets written as '0'. When + reading the file as a dictionary this is interpreted as a label. This + is (usually) not a problem when doing patch fields since these get the + 'uniform', 'nonuniform' prefix. However zone contents are labelLists + not labelFields and these go wrong. For now hacked a solution where + we detect the keywords in zones and redo the dictionary entries + to be labelLists. + \*---------------------------------------------------------------------------*/ #include "argList.H" @@ -56,6 +64,82 @@ namespace Foam } +// Hack to do zones which have Lists in them. See above. +bool writeZones(const word& name, Time& runTime) +{ + IOobject io + ( + name, + runTime.timeName(), + polyMesh::meshSubDir, + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ); + + bool writeOk = false; + + if (io.headerOk()) + { + Info<< " Reading " << io.headerClassName() + << " : " << name << endl; + + // Switch off type checking (for reading e.g. faceZones as + // generic list of dictionaries). + const word oldTypeName = IOPtrList::typeName; + const_cast(IOPtrList::typeName) = word::null; + + IOPtrList meshObject(io); + + forAll(meshObject, i) + { + if (meshObject[i].isDict()) + { + dictionary& d = meshObject[i].dict(); + + if (d.found("faceLabels")) + { + d.set("faceLabels", labelList(d.lookup("faceLabels"))); + } + + if (d.found("flipMap")) + { + d.set("flipMap", boolList(d.lookup("flipMap"))); + } + + if (d.found("cellLabels")) + { + d.set("cellLabels", labelList(d.lookup("cellLabels"))); + } + + if (d.found("pointLabels")) + { + d.set("pointLabels", labelList(d.lookup("pointLabels"))); + } + } + } + + const_cast(IOPtrList::typeName) = oldTypeName; + // Fake type back to what was in field + const_cast(meshObject.type()) = io.headerClassName(); + + Info<< " Writing " << name << endl; + + // Force writing as ascii + writeOk = meshObject.regIOobject::writeObject + ( + IOstream::ASCII, + IOstream::currentVersion, + runTime.writeCompression() + ); + } + + return writeOk; +} + + + // Main program: int main(int argc, char *argv[]) @@ -76,9 +160,19 @@ int main(int argc, char *argv[]) writeMeshObject("neighbour", runTime); writeMeshObject("faces", runTime); writeMeshObject("points", runTime); - writeMeshObject >("cellZones", runTime); - writeMeshObject >("faceZones", runTime); - writeMeshObject >("pointZones", runTime); + writeMeshObject("pointProcAddressing", runTime); + writeMeshObject("faceProcAddressing", runTime); + writeMeshObject("cellProcAddressing", runTime); + writeMeshObject("boundaryProcAddressing", runTime); + + if (runTime.writeFormat() == IOstream::ASCII) + { + // Only do zones when converting from binary to ascii + // The other way gives problems since working on dictionary level. + writeZones("cellZones", runTime); + writeZones("faceZones", runTime); + writeZones("pointZones", runTime); + } // Get list of objects from the database IOobjectList objects(runTime, runTime.timeName()); From 86743ace66941c73a8595f3fbc266fa7268a78f1 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:17:33 +0000 Subject: [PATCH 29/38] Corrected spelling in comment --- .../pointPatches/derived/coupled/coupledFacePointPatch.H | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenFOAM/meshes/pointMesh/pointPatches/derived/coupled/coupledFacePointPatch.H b/src/OpenFOAM/meshes/pointMesh/pointPatches/derived/coupled/coupledFacePointPatch.H index a77af7af30..ec5ae840e4 100644 --- a/src/OpenFOAM/meshes/pointMesh/pointPatches/derived/coupled/coupledFacePointPatch.H +++ b/src/OpenFOAM/meshes/pointMesh/pointPatches/derived/coupled/coupledFacePointPatch.H @@ -132,7 +132,7 @@ public: // associated with any faces virtual const labelList& loneMeshPoints() const; - //- Return point unit normals. Not impelemented. + //- Return point unit normals. Not implemented. virtual const vectorField& pointNormals() const; }; From bca38c7fde143c2c6d30067e28a4a82de1401744 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:17:58 +0000 Subject: [PATCH 30/38] Removed unused comment --- src/dynamicMesh/meshCut/directions/directions.C | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/dynamicMesh/meshCut/directions/directions.C b/src/dynamicMesh/meshCut/directions/directions.C index b50069d606..b77d2cefa4 100644 --- a/src/dynamicMesh/meshCut/directions/directions.C +++ b/src/dynamicMesh/meshCut/directions/directions.C @@ -446,19 +446,4 @@ Foam::directions::directions } -// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Friend Functions * * * * * * * * * * * * * // - - -// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // - - // ************************************************************************* // From 5a87a542d06eebdd1b52620956ffb4f5368595d6 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:18:29 +0000 Subject: [PATCH 31/38] Loosened tolerances for single precision running --- .../motionSmoother/polyMeshGeometry/polyMeshGeometry.C | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dynamicMesh/motionSmoother/polyMeshGeometry/polyMeshGeometry.C b/src/dynamicMesh/motionSmoother/polyMeshGeometry/polyMeshGeometry.C index f42f2a4ef4..f777081d03 100644 --- a/src/dynamicMesh/motionSmoother/polyMeshGeometry/polyMeshGeometry.C +++ b/src/dynamicMesh/motionSmoother/polyMeshGeometry/polyMeshGeometry.C @@ -824,7 +824,7 @@ bool Foam::polyMeshGeometry::checkFaceSkewness // (i.e. treat as if mirror cell on other side) vector faceNormal = faceAreas[faceI]; - faceNormal /= mag(faceNormal) + VSMALL; + faceNormal /= mag(faceNormal) + ROOTVSMALL; vector dOwn = faceCentres[faceI] - cellCentres[own[faceI]]; @@ -834,7 +834,7 @@ bool Foam::polyMeshGeometry::checkFaceSkewness scalar skewness = mag(faceCentres[faceI] - faceIntersection) - /(2*mag(dWall) + VSMALL); + /(2*mag(dWall) + ROOTVSMALL); // Check if the skewness vector is greater than the PN vector. // This does not cause trouble but is a good indication of a poor From 00b4267a07b985f2979c7958912232ffa28df0ff Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:18:54 +0000 Subject: [PATCH 32/38] Corrected comment --- .../fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H index 062ffa1d86..5e179da0f9 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/cyclic/cyclicFvPatchField.H @@ -142,7 +142,7 @@ public: // Access - //- Retirn local reference cast into the cyclic patch + //- Return local reference cast into the cyclic patch const cyclicFvPatch& cyclicPatch() const { return cyclicPatch_; From 09aba41a1989ee5b31e686a143b5dc3e0f4dea80 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:19:14 +0000 Subject: [PATCH 33/38] Corrected indentation --- .../extendedStencil/cellToCell/fullStencils/cellToCellStencil.H | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/cellToCellStencil.H b/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/cellToCellStencil.H index 7fa48ccecb..f8b94c8d5f 100644 --- a/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/cellToCellStencil.H +++ b/src/finiteVolume/fvMesh/extendedStencil/cellToCell/fullStencils/cellToCellStencil.H @@ -95,7 +95,7 @@ protected: class unionEqOp { public: - void operator()( labelList& x, const labelList& y ) const; + void operator()(labelList& x, const labelList& y) const; }; //- Collect cell neighbours of faces in global numbering From 15d0becbb15fc471d8e98a5fe17b047c3087c49b Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:20:42 +0000 Subject: [PATCH 34/38] Changed field writing to have zeroGradient bc for ease of postprocessing --- src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C index 909cf3e683..c4ea71f434 100644 --- a/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C +++ b/src/mesh/autoMesh/autoHexMesh/meshRefinement/meshRefinement.C @@ -54,6 +54,7 @@ License #include "Random.H" #include "searchableSurfaces.H" #include "treeBoundBox.H" +#include "zeroGradientFvPatchFields.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -2128,7 +2129,8 @@ void Foam::meshRefinement::dumpRefinementLevel() const false ), mesh_, - dimensionedScalar("zero", dimless, 0) + dimensionedScalar("zero", dimless, 0), + zeroGradientFvPatchScalarField::typeName ); const labelList& cellLevel = meshCutter_.cellLevel(); From c182daf90ac8007ffdaf0a857e084fd75dec7a7e Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:21:20 +0000 Subject: [PATCH 35/38] Corrected usage of treeBoundBox::extend --- src/meshTools/meshSearch/meshSearch.C | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/meshTools/meshSearch/meshSearch.C b/src/meshTools/meshSearch/meshSearch.C index eb5ec14d8f..d634603649 100644 --- a/src/meshTools/meshSearch/meshSearch.C +++ b/src/meshTools/meshSearch/meshSearch.C @@ -463,7 +463,7 @@ const Foam::indexedOctree& Foam::meshSearch::boundaryTree() treeBoundBox overallBb(mesh_.points()); Random rndGen(123456); - overallBb.extend(rndGen, 1E-4); + overallBb = overallBb.extend(rndGen, 1E-4); overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); @@ -497,7 +497,7 @@ const Foam::indexedOctree& Foam::meshSearch::cellTree() treeBoundBox overallBb(mesh_.points()); Random rndGen(123456); - overallBb.extend(rndGen, 1E-4); + overallBb = overallBb.extend(rndGen, 1E-4); overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); @@ -531,7 +531,7 @@ const Foam::indexedOctree& treeBoundBox overallBb(mesh_.cellCentres()); Random rndGen(123456); - overallBb.extend(rndGen, 1E-4); + overallBb = overallBb.extend(rndGen, 1E-4); overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); From c5a5079582e57399767459e2f52621566baad477 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:21:42 +0000 Subject: [PATCH 36/38] Changed printing --- .../autoHexMeshDriver/autoLayerDriver.C | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C index cc49e48939..acd1673392 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C @@ -2490,13 +2490,18 @@ void Foam::autoLayerDriver::mergePatchFacesUndo << "---------------------------" << nl << " - which are on the same patch" << nl << " - which make an angle < " << layerParams.featureAngle() + << "- which are on the same patch" << nl + << "- which make an angle < " << layerParams.featureAngle() << " degrees" << nl << " (cos:" << minCos << ')' << nl << " - as long as the resulting face doesn't become concave" + << " (cos:" << minCos << ')' << nl + << "- as long as the resulting face doesn't become concave" << " by more than " << layerParams.concaveAngle() << " degrees" << nl << " (0=straight, 180=fully concave)" << nl + << " (0=straight, 180=fully concave)" << nl << endl; label nChanged = mergePatchFacesUndo(minCos, concaveCos, motionDict); @@ -2546,11 +2551,6 @@ void Foam::autoLayerDriver::addLayers ); - // Undistorted edge length - const scalar edge0Len = meshRefiner_.meshCutter().level0EdgeLength(); - const labelList& cellLevel = meshRefiner_.meshCutter().cellLevel(); - - // Point-wise extrusion data // ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -2612,6 +2612,10 @@ void Foam::autoLayerDriver::addLayers // Disable extrusion on warped faces // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // Undistorted edge length + const scalar edge0Len = meshRefiner_.meshCutter().level0EdgeLength(); + const labelList& cellLevel = meshRefiner_.meshCutter().cellLevel(); + handleWarpedFaces ( pp, @@ -2651,6 +2655,10 @@ void Foam::autoLayerDriver::addLayers } + // Undistorted edge length + const scalar edge0Len = meshRefiner_.meshCutter().level0EdgeLength(); + const labelList& cellLevel = meshRefiner_.meshCutter().cellLevel(); + // Determine (wanted) point-wise layer thickness and expansion ratio scalarField thickness(pp().nPoints()); scalarField minThickness(pp().nPoints()); From 4d4276fd6d9430fe7a14e67addc80ed77dc4db0e Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 15 Jan 2010 17:33:12 +0000 Subject: [PATCH 37/38] Adapted for new api of searchableSurface --- .../refinementSurfaces/refinementSurfaces.C | 251 ++++++++++++------ .../refinementSurfaces/refinementSurfaces.H | 4 +- 2 files changed, 168 insertions(+), 87 deletions(-) diff --git a/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.C b/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.C index c910b4c1b5..0f81dff2f5 100644 --- a/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.C +++ b/src/mesh/autoMesh/autoHexMesh/refinementSurfaces/refinementSurfaces.C @@ -496,23 +496,63 @@ Foam::labelList Foam::refinementSurfaces::getClosedNamedSurfaces() const } -// Count number of triangles per surface region -Foam::labelList Foam::refinementSurfaces::countRegions(const triSurface& s) -{ - const geometricSurfacePatchList& regions = s.patches(); +// // Count number of triangles per surface region +// Foam::labelList Foam::refinementSurfaces::countRegions(const triSurface& s) +// { +// const geometricSurfacePatchList& regions = s.patches(); +// +// labelList nTris(regions.size(), 0); +// +// forAll(s, triI) +// { +// nTris[s[triI].region()]++; +// } +// return nTris; +// } - labelList nTris(regions.size(), 0); - forAll(s, triI) - { - nTris[s[triI].region()]++; - } - return nTris; -} +// // Pre-calculate the refinement level for every element +// void Foam::refinementSurfaces::wantedRefinementLevel +// ( +// const shellSurfaces& shells, +// const label surfI, +// const List& info, // Indices +// const pointField& ctrs, // Representative coordinate +// labelList& minLevelField +// ) const +// { +// const searchableSurface& geom = allGeometry_[surfaces_[surfI]]; +// +// // Get per element the region +// labelList region; +// geom.getRegion(info, region); +// +// // Initialise fields to region wise minLevel +// minLevelField.setSize(ctrs.size()); +// minLevelField = -1; +// +// forAll(minLevelField, i) +// { +// if (info[i].hit()) +// { +// minLevelField[i] = minLevel(surfI, region[i]); +// } +// } +// +// // Find out if triangle inside shell with higher level +// // What level does shell want to refine fc to? +// labelList shellLevel; +// shells.findHigherLevel(ctrs, minLevelField, shellLevel); +// +// forAll(minLevelField, i) +// { +// minLevelField[i] = max(minLevelField[i], shellLevel[i]); +// } +// } // Precalculate the refinement level for every element of the searchable -// surface. This is currently hardcoded for triSurfaceMesh only. +// surface. void Foam::refinementSurfaces::setMinLevelFields ( const shellSurfaces& shells @@ -522,58 +562,55 @@ void Foam::refinementSurfaces::setMinLevelFields { const searchableSurface& geom = allGeometry_[surfaces_[surfI]]; - if (isA(geom)) + // Precalculation only makes sense if there are different regions + // (so different refinement levels possible) and there are some + // elements. Possibly should have 'enough' elements to have fine + // enough resolution but for now just make sure we don't catch e.g. + // searchableBox (size=6) + if (geom.regions().size() > 1 && geom.globalSize() > 10) { - const triSurfaceMesh& triMesh = refCast(geom); + // Representative local coordinates + const pointField ctrs = geom.coordinates(); - autoPtr minLevelFieldPtr - ( - new triSurfaceLabelField - ( - IOobject - ( - "minLevel", - triMesh.objectRegistry::time().timeName(), // instance - "triSurface", // local - triMesh, - IOobject::NO_READ, - IOobject::AUTO_WRITE - ), - triMesh, - dimless - ) - ); - triSurfaceLabelField& minLevelField = minLevelFieldPtr(); - - const triSurface& s = static_cast(triMesh); - - // Initialise fields to region wise minLevel - forAll(s, triI) + labelList minLevelField(ctrs.size(), -1); { - minLevelField[triI] = minLevel(surfI, s[triI].region()); + // Get the element index in a roundabout way. Problem is e.g. + // distributed surface where local indices differ from global + // ones (needed for getRegion call) + List info; + geom.findNearest + ( + ctrs, + scalarField(ctrs.size(), sqr(GREAT)), + info + ); + + // Get per element the region + labelList region; + geom.getRegion(info, region); + + // From the region get the surface-wise refinement level + forAll(minLevelField, i) + { + if (info[i].hit()) + { + minLevelField[i] = minLevel(surfI, region[i]); + } + } } // Find out if triangle inside shell with higher level - pointField fc(s.size()); - forAll(s, triI) - { - fc[triI] = s[triI].centre(s.points()); - } // What level does shell want to refine fc to? labelList shellLevel; - shells.findHigherLevel(fc, minLevelField, shellLevel); + shells.findHigherLevel(ctrs, minLevelField, shellLevel); - forAll(minLevelField, triI) + forAll(minLevelField, i) { - minLevelField[triI] = max - ( - minLevelField[triI], - shellLevel[triI] - ); + minLevelField[i] = max(minLevelField[i], shellLevel[i]); } - // Store field on triMesh - minLevelFieldPtr.ptr()->store(); + // Store minLevelField on surface + const_cast(geom).setField(minLevelField); } } } @@ -601,44 +638,89 @@ void Foam::refinementSurfaces::findHigherIntersection return; } + if (surfaces_.size() == 1) + { + // Optimisation: single segmented surface. No need to duplicate + // point storage. + + label surfI = 0; + + const searchableSurface& geom = allGeometry_[surfaces_[surfI]]; + + // Do intersection test + List intersectionInfo(start.size()); + geom.findLineAny(start, end, intersectionInfo); + + // See if a cached level field available + labelList minLevelField; + geom.getField(intersectionInfo, minLevelField); + bool haveLevelField = + ( + returnReduce(minLevelField.size(), sumOp