diff --git a/applications/solvers/heatTransfer/buoyantBaffleSimpleFoam/Make/options b/applications/solvers/heatTransfer/buoyantBaffleSimpleFoam/Make/options index d3a5f0beb2..0c40e89430 100644 --- a/applications/solvers/heatTransfer/buoyantBaffleSimpleFoam/Make/options +++ b/applications/solvers/heatTransfer/buoyantBaffleSimpleFoam/Make/options @@ -1,5 +1,7 @@ EXE_INC = \ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/basicSolidThermo/lnInclude \ + -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude \ -I$(LIB_SRC)/turbulenceModels \ -I$(LIB_SRC)/turbulenceModels/compressible/RAS/lnInclude \ diff --git a/applications/utilities/mesh/conversion/gmshToFoam/gmshToFoam.C b/applications/utilities/mesh/conversion/gmshToFoam/gmshToFoam.C index 650393d5ec..205dc6fc5c 100644 --- a/applications/utilities/mesh/conversion/gmshToFoam/gmshToFoam.C +++ b/applications/utilities/mesh/conversion/gmshToFoam/gmshToFoam.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -757,9 +757,23 @@ int main(int argc, char *argv[]) "retain raw orientation for prisms/hexs" ); +# include "addRegionOption.H" + # include "setRootCase.H" # include "createTime.H" + Foam::word regionName; + + if (args.optionReadIfPresent("region", regionName)) + { + Foam::Info + << "Creating polyMesh for region " << regionName << endl; + } + else + { + regionName = Foam::polyMesh::defaultRegion; + } + const bool keepOrientation = args.optionFound("keepOrientation"); IFstream inFile(args[1]); @@ -894,7 +908,7 @@ int main(int argc, char *argv[]) ( IOobject ( - polyMesh::defaultRegion, + regionName, runTime.constant(), runTime ), @@ -984,6 +998,7 @@ int main(int argc, char *argv[]) //Get polyMesh to write to constant + runTime.setTime(instant(runTime.constant()), 0); repatcher.repatch(); @@ -1079,6 +1094,32 @@ int main(int argc, char *argv[]) mesh.addZones(List(0), fz, cz); } + // Remove empty defaultFaces + label defaultPatchID = mesh.boundaryMesh().findPatchID(defaultFacesName); + if (mesh.boundaryMesh()[defaultPatchID].size() == 0) + { + List newPatchPtrList((mesh.boundaryMesh().size() - 1)); + label newPatchI = 0; + forAll(mesh.boundaryMesh(), patchI) + { + if (patchI != defaultPatchID) + { + const polyPatch& patch = mesh.boundaryMesh()[patchI]; + + newPatchPtrList[newPatchI] = patch.clone + ( + mesh.boundaryMesh(), + newPatchI, + patch.size(), + patch.start() + ).ptr(); + + newPatchI++; + } + } + repatcher.changePatches(newPatchPtrList); + } + mesh.write(); Info<< "End\n" << endl; diff --git a/applications/utilities/postProcessing/sampling/sample/sampleDict b/applications/utilities/postProcessing/sampling/sample/sampleDict index becaae12f7..ca79e6aa47 100644 --- a/applications/utilities/postProcessing/sampling/sample/sampleDict +++ b/applications/utilities/postProcessing/sampling/sample/sampleDict @@ -49,6 +49,9 @@ formatOptions // cell : use cell-centre value only; constant over cells (default) // cellPoint : use cell-centre and vertex values // cellPointFace : use cell-centre, vertex and face values. +// pointMVC : use point values only (Mean Value Coordinates) +// cellPatchConstrained : use cell-centre except on boundary faces where +// it uses the boundary value. For use with e.g. patchCloudSet. // 1] vertex values determined from neighbouring cell-centre values // 2] face values determined using the current face interpolation scheme // for the field (linear, gamma, etc.) @@ -83,6 +86,7 @@ fields // uniform, face, midPoint, midPointAndFace : start and end coordinate // uniform: extra number of sampling points // polyLine, cloud: list of coordinates +// patchCloud: list of coordinates and set of patches to look for nearest sets ( lineX1 @@ -113,8 +117,21 @@ sets points ((0.049 0.049 0.00501)(0.051 0.049 0.00501)); } + somePatchPoints + { + // Sample nearest points on selected patches. Use with + // interpolations: + // - cell (cell value) + // - cellPatchConstrained (boundary value) + // - cellPoint (interpolated boundary value) + type patchCloud; + axis xyz; + points ((0.049 0.099 0.005)(0.051 0.054 0.005)); + patches (".*Wall.*"); + } ); + // Surface sampling definition // // 1] patches are not triangulated by default @@ -241,4 +258,5 @@ surfaces } ); + // *********************************************************************** // diff --git a/src/OpenFOAM/db/dictionary/entry/entry.C b/src/OpenFOAM/db/dictionary/entry/entry.C index 3bba611dee..d933585265 100644 --- a/src/OpenFOAM/db/dictionary/entry/entry.C +++ b/src/OpenFOAM/db/dictionary/entry/entry.C @@ -39,12 +39,14 @@ int Foam::entry::disableFunctionEntries Foam::entry::entry(const keyType& keyword) : + IDLList::link(), keyword_(keyword) {} Foam::entry::entry(const entry& e) : + IDLList::link(), keyword_(e.keyword_) {} diff --git a/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C b/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C index 9321959b2d..d49d26d9f2 100644 --- a/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C +++ b/src/OpenFOAM/meshes/polyMesh/syncTools/syncToolsTemplates.C @@ -1352,10 +1352,10 @@ void Foam::syncTools::syncBoundaryFaceList label sz = cycPatch.size(); // Transform (copy of) data on both sides - Field ownVals(SubField(faceValues, sz, ownStart)); + Field ownVals = SubField(faceValues, sz, ownStart); top(nbrPatch, ownVals); - Field nbrVals(SubField(faceValues, sz, nbrStart)); + Field nbrVals = SubField(faceValues, sz, nbrStart); top(cycPatch, nbrVals); label i0 = ownStart; diff --git a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H index 741416c426..020cf25bbb 100644 --- a/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H +++ b/src/OpenFOAM/primitives/globalIndexAndTransform/globalIndexAndTransformI.H @@ -512,7 +512,7 @@ Foam::labelList Foam::globalIndexAndTransform::transformIndicesForPatches } } - label nUsedTrans = sum(mag(permutation)); + label nUsedTrans = round(sum(mag(permutation))); if (nUsedTrans == 0) { diff --git a/src/edgeMesh/edgeMesh.C b/src/edgeMesh/edgeMesh.C index 04f3d15da6..5958e1feb1 100644 --- a/src/edgeMesh/edgeMesh.C +++ b/src/edgeMesh/edgeMesh.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -148,6 +148,7 @@ void Foam::edgeMesh::calcPointEdges() const Foam::edgeMesh::edgeMesh() : + fileFormats::edgeFormatsCore(), points_(0), edges_(0), pointEdgesPtr_(NULL) @@ -160,6 +161,7 @@ Foam::edgeMesh::edgeMesh const edgeList& edges ) : + fileFormats::edgeFormatsCore(), points_(points), edges_(edges), pointEdgesPtr_(NULL) @@ -172,6 +174,7 @@ Foam::edgeMesh::edgeMesh const Xfer& edgeLst ) : + fileFormats::edgeFormatsCore(), points_(0), edges_(0), pointEdgesPtr_(NULL) diff --git a/src/edgeMesh/edgeMeshI.H b/src/edgeMesh/edgeMeshI.H index 50cf9047a3..9badb7d5b0 100644 --- a/src/edgeMesh/edgeMeshI.H +++ b/src/edgeMesh/edgeMeshI.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -27,6 +27,7 @@ License inline Foam::edgeMesh::edgeMesh(const edgeMesh& em) : + fileFormats::edgeFormatsCore(), points_(em.points_), edges_(em.edges_), pointEdgesPtr_(NULL) diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index 360ecc6b07..a66495843b 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -201,6 +201,7 @@ interpolation = interpolation/interpolation $(interpolation)/interpolation/interpolations.C $(interpolation)/interpolationCell/makeInterpolationCell.C +$(interpolation)/interpolationCellPatchConstrained/makeInterpolationCellPatchConstrained.C $(interpolation)/interpolationCellPoint/cellPointWeight/cellPointWeight.C $(interpolation)/interpolationCellPoint/makeInterpolationCellPoint.C $(interpolation)/interpolationCellPointFace/makeInterpolationCellPointFace.C diff --git a/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/interpolationCellPatchConstrained.C b/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/interpolationCellPatchConstrained.C new file mode 100644 index 0000000000..cdc2c38aeb --- /dev/null +++ b/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/interpolationCellPatchConstrained.C @@ -0,0 +1,76 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 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 3 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, see . + +\*---------------------------------------------------------------------------*/ + +#include "interpolationCellPatchConstrained.H" +#include "volFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * // + +template +interpolationCellPatchConstrained::interpolationCellPatchConstrained +( + const GeometricField& psi +) +: + interpolation(psi) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +Type interpolationCellPatchConstrained::interpolate +( + const vector& pt, + const label cellI, + const label faceI +) const +{ + if (faceI >= 0 && faceI >= this->psi_.mesh().nInternalFaces()) + { + // Use boundary value + const polyBoundaryMesh& pbm = this->psi_.mesh().boundaryMesh(); + label patchI = pbm.patchID()[faceI-this->psi_.mesh().nInternalFaces()]; + label patchFaceI = pbm[patchI].whichFace(faceI); + + return this->psi_.boundaryField()[patchI][patchFaceI]; + } + else + { + return this->psi_[cellI]; + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/interpolationCellPatchConstrained.H b/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/interpolationCellPatchConstrained.H new file mode 100644 index 0000000000..814988a9f3 --- /dev/null +++ b/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/interpolationCellPatchConstrained.H @@ -0,0 +1,97 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 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 3 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, see . + +Class + Foam::interpolationCellPatchConstrained + +Description + Uses the cell value for any point in the cell apart from a boundary face + where it uses the boundary value directly. + Note: will not work on an empty patch. + +\*---------------------------------------------------------------------------*/ + +#ifndef interpolationCellPatchConstrained_H +#define interpolationCellPatchConstrained_H + +#include "interpolation.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class fvMesh; + +/*---------------------------------------------------------------------------*\ + Class interpolationCellPatchConstrained Declaration +\*---------------------------------------------------------------------------*/ + +template +class interpolationCellPatchConstrained +: + public interpolation +{ + +public: + + //- Runtime type information + TypeName("cellPatchConstrained"); + + + // Constructors + + //- Construct from components + interpolationCellPatchConstrained + ( + const GeometricField& psi + ); + + + // Member Functions + + //- Interpolate field to the given point in the given cell + Type interpolate + ( + const vector& position, + const label cellI, + const label faceI = -1 + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "interpolationCellPatchConstrained.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/makeInterpolationCellPatchConstrained.C b/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/makeInterpolationCellPatchConstrained.C new file mode 100644 index 0000000000..adae604e0e --- /dev/null +++ b/src/finiteVolume/interpolation/interpolation/interpolationCellPatchConstrained/makeInterpolationCellPatchConstrained.C @@ -0,0 +1,41 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 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 3 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, see . + +\*---------------------------------------------------------------------------*/ + +#include "interpolationCellPatchConstrained.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makeInterpolation(interpolationCellPatchConstrained); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/lagrangian/basic/Cloud/Cloud.H b/src/lagrangian/basic/Cloud/Cloud.H index e11905b266..e55232a2f4 100644 --- a/src/lagrangian/basic/Cloud/Cloud.H +++ b/src/lagrangian/basic/Cloud/Cloud.H @@ -193,7 +193,7 @@ public: void trackingRescue() const { nTrackingRescues_++; - if (cloud::debug && nTrackingRescues_ % size() == 0) + if (cloud::debug && size() && (nTrackingRescues_ % size() == 0)) { Pout<< " " << nTrackingRescues_ << " tracking rescues " << endl; diff --git a/src/lagrangian/intermediate/parcels/include/makeParcelPatchInteractionModels.H b/src/lagrangian/intermediate/parcels/include/makeParcelPatchInteractionModels.H index 13697f2092..9c0e8d2ec5 100644 --- a/src/lagrangian/intermediate/parcels/include/makeParcelPatchInteractionModels.H +++ b/src/lagrangian/intermediate/parcels/include/makeParcelPatchInteractionModels.H @@ -32,6 +32,7 @@ License #include "NoInteraction.H" #include "Rebound.H" #include "StandardWallInteraction.H" +#include "MultiInteraction.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -42,7 +43,8 @@ License makePatchInteractionModelType(LocalInteraction, CloudType); \ makePatchInteractionModelType(NoInteraction, CloudType); \ makePatchInteractionModelType(Rebound, CloudType); \ - makePatchInteractionModelType(StandardWallInteraction, CloudType); + makePatchInteractionModelType(StandardWallInteraction, CloudType); \ + makePatchInteractionModelType(MultiInteraction, CloudType); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/MultiInteraction/MultiInteraction.C b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/MultiInteraction/MultiInteraction.C new file mode 100644 index 0000000000..9a18036797 --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/MultiInteraction/MultiInteraction.C @@ -0,0 +1,188 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 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 3 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, see . + +\*---------------------------------------------------------------------------*/ + +#include "MultiInteraction.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template +bool Foam::MultiInteraction::read(const dictionary& dict) +{ + // Count dictionaries + + Info<< "Patch interaction model " << typeName << nl + << "Executing in turn " << endl; + + label nModels = 0; + forAllConstIter(dictionary, dict, iter) + { + if (iter().isDict()) + { + Info<< " " << iter().name() << endl; + + nModels++; + } + } + + models_.setSize(nModels); + nModels = 0; + forAllConstIter(dictionary, dict, iter) + { + if (iter().isDict()) + { + models_.set + ( + nModels++, + PatchInteractionModel::New + ( + iter().dict(), + this->owner() + ) + ); + } + } + + oneInteractionOnly_ = Switch(dict.lookup("oneInteractionOnly")); + + if (oneInteractionOnly_) + { + Info<< "Stopping upon first model that interacts with particle." + << nl << endl; + } + else + { + Info<< "Allowing multiple models to interact." + << nl << endl; + } + + return true; +} + + +// * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * // + +template +Foam::MultiInteraction::MultiInteraction +( + const dictionary& dict, + CloudType& cloud +) +: + PatchInteractionModel(dict, cloud, typeName) +{ + read(this->coeffDict()); +} + + +template +Foam::MultiInteraction::MultiInteraction +( + const MultiInteraction& pim +) +: + PatchInteractionModel(pim), + oneInteractionOnly_(pim.oneInteractionOnly_), + models_(pim.models_) +{} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +template +Foam::MultiInteraction::~MultiInteraction() +{} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +template +bool Foam::MultiInteraction::active() const +{ + forAll(models_, i) + { + if (models_[i].active()) + { + return true; + } + } + return false; +} + + +template +bool Foam::MultiInteraction::correct +( + typename CloudType::parcelType& p, + const polyPatch& pp, + bool& keepParticle, + const scalar trackFraction, + const tetIndices& tetIs +) +{ + label origFacei = p.face(); + label patchi = pp.index(); + + bool interacted = false; + + forAll(models_, i) + { + bool myInteracted = models_[i].correct + ( + p, + this->owner().pMesh().boundaryMesh()[patchi], + keepParticle, + trackFraction, + tetIs + ); + + if (myInteracted && oneInteractionOnly_) + { + break; + } + + interacted = (interacted || myInteracted); + + + // Check if perhaps the interaction model has changed patches + // (CoincidentBaffleInteraction can do this) + + if (p.face() != origFacei) + { + origFacei = p.face(); + patchi = p.patch(p.face()); + + // Interaction model has moved particle off wall? + if (patchi == -1) + { + break; + } + } + } + + return interacted; +} + + +// ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/MultiInteraction/MultiInteraction.H b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/MultiInteraction/MultiInteraction.H new file mode 100644 index 0000000000..b5d8f00a47 --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Kinematic/PatchInteractionModel/MultiInteraction/MultiInteraction.H @@ -0,0 +1,165 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 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 3 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, see . + +Class + Foam::MultiInteraction + +Description + Runs multiple patch interaction models in turn. Takes dictionary + where all the subdictionaries are the interaction models. + + // Exit upon first successful interaction or continue doing other + // models. Returned nteraction status will be true if there has been any + // interaction (so logical or) + oneInteractionOnly true; + + model1 + { + patchInteractionModel coincidentBaffleInteraction; + coincidentBaffleInteractionCoeffs + { + coincidentPatches + ( + (pipetteWall_A pipetteCyclic_half0) + (pipetteWall_B pipetteCyclic_half1) + ); + } + } + model2 + { + patchInteractionModel localInteraction; + localInteractionCoeffs + { + patches + ( + cWall + { + type rebound; + } + pipetteWall_A + { + type rebound; + } + pipetteWall_B + { + type rebound; + } + ); + } + } + + +\*---------------------------------------------------------------------------*/ + +#ifndef MultiInteraction_H +#define MultiInteraction_H + +#include "PatchInteractionModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +/*---------------------------------------------------------------------------*\ + Class MultiInteraction Declaration +\*---------------------------------------------------------------------------*/ + +template +class MultiInteraction +: + public PatchInteractionModel +{ + // Private data + + Switch oneInteractionOnly_; + + //- Submodels + PtrList > models_; + + + // Private Member Functions + + //- Read settings + bool read(const dictionary&); + +public: + + //- Runtime type information + TypeName("multiInteraction"); + + + // Constructors + + //- Construct from dictionary + MultiInteraction(const dictionary& dict, CloudType& cloud); + + //- Construct copy from owner cloud and patch interaction model + MultiInteraction(const MultiInteraction& pim); + + //- Construct and return a clone using supplied owner cloud + virtual autoPtr > clone() const + { + return autoPtr > + ( + new MultiInteraction(*this) + ); + } + + + //- Destructor + virtual ~MultiInteraction(); + + + // Member Functions + + //- Flag to indicate whether model activates patch interaction model + virtual bool active() const; + + //- Apply velocity correction + // Returns true if particle remains in same cell + virtual bool correct + ( + typename CloudType::parcelType& p, + const polyPatch& pp, + bool& keepParticle, + const scalar trackFraction, + const tetIndices& tetIs + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "MultiInteraction.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/postProcessing/functionObjects/IO/controlDict b/src/postProcessing/functionObjects/IO/controlDict index 11ecd9b106..d0fa908273 100644 --- a/src/postProcessing/functionObjects/IO/controlDict +++ b/src/postProcessing/functionObjects/IO/controlDict @@ -14,6 +14,10 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// So we get a decent warning if we have multiple functionObject entries +// with the same name. +#inputMode error; + application icoFoam; startFrom startTime; @@ -56,11 +60,16 @@ functions // Where to load it from functionObjectLibs ("libIOFunctionObjects.so"); + // Optional mesh region to operate on. Only one partialWrite per + // region allowed. + region wallFilmRegion; + // Execute upon outputTime outputControl outputTime; - // Objects to write every outputTime - objectNames (p); + // Objects (fields or lagrangian fields in any of the clouds) + // to write every outputTime + objectNames (p positions nParticle); // Write as normal every writeInterval'th outputTime. writeInterval 3; } diff --git a/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C index 1ea7ae253d..431c1febd9 100644 --- a/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C +++ b/src/postProcessing/functionObjects/IO/partialWrite/partialWrite.C @@ -28,6 +28,7 @@ License #include "Time.H" #include "IOobjectList.H" #include "polyMesh.H" +#include "cloud.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -132,7 +133,12 @@ void Foam::partialWrite::write() IOobjectList objects(obr_, obr_.time().timeName()); - forAllConstIter(HashPtrTable, objects, iter) + if (debug) + { + Pout<< "For region:" << obr_.name() << endl; + } + + forAllConstIter(IOobjectList, objects, iter) { if (!objectNames_.found(iter()->name())) { @@ -147,6 +153,47 @@ void Foam::partialWrite::write() rm(f); } } + + // Do the lagrangian files as well. + fileNameList cloudDirs + ( + readDir + ( + obr_.time().timePath()/dbDir/cloud::prefix, + fileName::DIRECTORY + ) + ); + forAll(cloudDirs, i) + { + if (debug) + { + Pout<< "For cloud:" << cloudDirs[i] << endl; + } + + IOobjectList sprayObjs + ( + obr_, + obr_.time().timeName(), + cloud::prefix/cloudDirs[i] + ); + forAllConstIter(IOobjectList, sprayObjs, iter) + { + if (!objectNames_.found(iter()->name())) + { + const fileName f = + obr_.time().timePath() + /dbDir + /cloud::prefix + /cloudDirs[i] + /iter()->name(); + if (debug) + { + Pout<< " rm " << f << endl; + } + rm(f); + } + } + } } } } diff --git a/src/sampling/Make/files b/src/sampling/Make/files index ddf46a17e8..0c679f52d8 100644 --- a/src/sampling/Make/files +++ b/src/sampling/Make/files @@ -5,6 +5,7 @@ probes/probesFunctionObject/probesFunctionObject.C sampledSet/cloud/cloudSet.C sampledSet/coordSet/coordSet.C +sampledSet/patchCloud/patchCloudSet.C sampledSet/polyLine/polyLineSet.C sampledSet/face/faceOnlySet.C sampledSet/midPoint/midPointSet.C diff --git a/src/sampling/sampledSet/patchCloud/patchCloudSet.C b/src/sampling/sampledSet/patchCloud/patchCloudSet.C new file mode 100644 index 0000000000..85877da3b8 --- /dev/null +++ b/src/sampling/sampledSet/patchCloud/patchCloudSet.C @@ -0,0 +1,322 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 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 3 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, see . + +\*---------------------------------------------------------------------------*/ + +#include "patchCloudSet.H" +#include "polyMesh.H" +#include "addToRunTimeSelectionTable.H" +#include "pointIndexHit.H" +#include "Tuple2.H" +#include "treeBoundBox.H" +#include "indexedOctree.H" +#include "treeDataFace.H" +#include "Time.H" +#include "meshTools.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(patchCloudSet, 0); + addToRunTimeSelectionTable(sampledSet, patchCloudSet, word); + + + //- Helper class for finding nearest + // Nearest: + // - point+local index + // - sqr(distance) + // - processor + typedef Tuple2 > nearInfo; + + class nearestEqOp + { + + public: + + void operator()(nearInfo& x, const nearInfo& y) const + { + if (y.first().hit()) + { + if (!x.first().hit()) + { + x = y; + } + else if (y.second().first() < x.second().first()) + { + x = y; + } + } + } + }; +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::patchCloudSet::calcSamples +( + DynamicList& samplingPts, + DynamicList