diff --git a/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.C b/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.C index f71fcbeef466598c8179ff808c3d9b7560603cf8..ad40fcf5f7f1ce77a748025c4eae1dab1e15616e 100644 --- a/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.C +++ b/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.C @@ -314,7 +314,8 @@ void Foam::functionObjects::extractEulerianParticles::collectParticles tag, time, d, - U + U, + false // not looking to set cell owner etc. ); cloud_.addParticle(ip); diff --git a/src/lagrangian/basic/Cloud/Cloud.C b/src/lagrangian/basic/Cloud/Cloud.C index 5f07b4d1f228cd90960e23606f89967644802fb8..d5da7fe151075098e5641ad04798c13253b620a2 100644 --- a/src/lagrangian/basic/Cloud/Cloud.C +++ b/src/lagrangian/basic/Cloud/Cloud.C @@ -76,10 +76,10 @@ Foam::Cloud<ParticleType>::Cloud : cloud(pMesh, cloudName), IDLList<ParticleType>(), - geometryType_(IOPosition<Cloud<ParticleType>>::geometryType::COORDINATES), polyMesh_(pMesh), labels_(), - globalPositionsPtr_() + globalPositionsPtr_(), + geometryType_(IOPosition<Cloud<ParticleType>>::geometryType::COORDINATES) { checkPatches(); diff --git a/src/lagrangian/basic/Cloud/Cloud.H b/src/lagrangian/basic/Cloud/Cloud.H index a49247d0d60099da749f49ec1555618325a136e1..33d554c977b43bcca2231736bdec3825b0518611 100644 --- a/src/lagrangian/basic/Cloud/Cloud.H +++ b/src/lagrangian/basic/Cloud/Cloud.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -75,9 +75,6 @@ class Cloud { // Private data - //- Geometry type - typename IOPosition<Cloud<ParticleType>>::geometryType geometryType_; - //- Reference to the mesh database const polyMesh& polyMesh_; @@ -109,6 +106,12 @@ class Cloud void writeCloudUniformProperties() const; +protected: + + //- Geometry type + typename IOPosition<Cloud<ParticleType>>::geometryType geometryType_; + + public: friend class particle; diff --git a/src/lagrangian/basic/Cloud/CloudIO.C b/src/lagrangian/basic/Cloud/CloudIO.C index 8678c5bde632f0f3066c5e280f54ebb5d4ebf4f3..d5fe11ace8e11c295c055daad1890d9e5cfc3740 100644 --- a/src/lagrangian/basic/Cloud/CloudIO.C +++ b/src/lagrangian/basic/Cloud/CloudIO.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -167,10 +167,10 @@ Foam::Cloud<ParticleType>::Cloud ) : cloud(pMesh, cloudName), - geometryType_(IOPosition<Cloud<ParticleType>>::geometryType::COORDINATES), polyMesh_(pMesh), labels_(), - cellWallFacesPtr_() + cellWallFacesPtr_(), + geometryType_(IOPosition<Cloud<ParticleType>>::geometryType::COORDINATES) { checkPatches(); diff --git a/src/lagrangian/basic/injectedParticle/injectedParticle.C b/src/lagrangian/basic/injectedParticle/injectedParticle.C index 4a0866e940b0d373a9ee35f713bfbdb92fafcacb..8625a420a86764d782a3652af7de416e11fe00c6 100644 --- a/src/lagrangian/basic/injectedParticle/injectedParticle.C +++ b/src/lagrangian/basic/injectedParticle/injectedParticle.C @@ -38,6 +38,7 @@ namespace Foam Foam::injectedParticle::injectedParticle(const injectedParticle& p) : particle(p), + position_(p.position_), tag_(p.tag_), soi_(p.soi_), d_(p.d_), @@ -52,6 +53,7 @@ Foam::injectedParticle::injectedParticle ) : particle(p, mesh), + position_(p.position_), tag_(p.tag_), soi_(p.soi_), d_(p.d_), diff --git a/src/lagrangian/basic/injectedParticle/injectedParticle.H b/src/lagrangian/basic/injectedParticle/injectedParticle.H index 1d8bfbf3fbee222d50b3831164017cc181ef7fa4..5c196c1b3a71c28c06195d5c1055509b7441cf7f 100644 --- a/src/lagrangian/basic/injectedParticle/injectedParticle.H +++ b/src/lagrangian/basic/injectedParticle/injectedParticle.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -25,11 +25,18 @@ Class Foam::injectedParticle Description + Primarly stores particle properties so that it can be injected at a later + time. Note that this stores its own local position as opposed to the + base particle class barycentric coordinates since the particle is not + (usually) attached to a mesh, and instead used for post-processing. SourceFiles injectedParticle.C injectedParticleIO.C +SeeAlso + Foam::functionObjects::extractEulerianParticles + \*---------------------------------------------------------------------------*/ #ifndef injectedParticle_H @@ -74,6 +81,9 @@ protected: // Particle properties + //- Position + point position_; + //- Tag label tag_; @@ -125,7 +135,8 @@ public: const label tag, const scalar soi, const scalar d, - const vector& U + const vector& U, + const bool doLocate = true ); //- Construct from Istream @@ -225,6 +236,11 @@ public: objectRegistry& obr ); + //- Write the particle position and cell + // Note: This uses the local particle position, and bypasses the + // barycentric description + virtual void writePosition(Ostream&) const; + // Ostream Operator diff --git a/src/lagrangian/basic/injectedParticle/injectedParticleCloud.C b/src/lagrangian/basic/injectedParticle/injectedParticleCloud.C index 329aff039e057bd21984088a826f95930d629958..91a4e498848501ad981fe3b143549e98339e38c8 100644 --- a/src/lagrangian/basic/injectedParticle/injectedParticleCloud.C +++ b/src/lagrangian/basic/injectedParticle/injectedParticleCloud.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -41,6 +41,9 @@ Foam::injectedParticleCloud::injectedParticleCloud : Cloud<injectedParticle>(mesh, cloudName, false) { + geometryType_ = + IOPosition<Cloud<injectedParticle>>::geometryType::POSITIONS; + if (readFields) { injectedParticle::readFields(*this); diff --git a/src/lagrangian/basic/injectedParticle/injectedParticleI.H b/src/lagrangian/basic/injectedParticle/injectedParticleI.H index 579edb16efaf56f053deab5694c9af7397b58da1..2c4c05a41386e4eb68f27937c7bd0de3f2a0f52e 100644 --- a/src/lagrangian/basic/injectedParticle/injectedParticleI.H +++ b/src/lagrangian/basic/injectedParticle/injectedParticleI.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -33,10 +33,12 @@ inline Foam::injectedParticle::injectedParticle const label tag, const scalar soi, const scalar d, - const vector& U + const vector& U, + const bool doLocate ) : - particle(mesh, position, -1), + particle(mesh, position, -1, -1, -1, doLocate), + position_(position), tag_(tag), soi_(soi), d_(d), diff --git a/src/lagrangian/basic/injectedParticle/injectedParticleIO.C b/src/lagrangian/basic/injectedParticle/injectedParticleIO.C index 711f393cd05f947eb30d57482ffd6706fe0db8db..72d6e87bcbb684cf0095acf0c999e268ecb09910 100644 --- a/src/lagrangian/basic/injectedParticle/injectedParticleIO.C +++ b/src/lagrangian/basic/injectedParticle/injectedParticleIO.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2016 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -38,6 +38,7 @@ Foam::string Foam::injectedParticle::propertyTypes_ = const std::size_t Foam::injectedParticle::sizeofFields ( + // Note: does not include position_ sizeof(label) + sizeof(scalar) + sizeof(scalar) + sizeof(vector) ); @@ -52,7 +53,8 @@ Foam::injectedParticle::injectedParticle bool newFormat ) : - particle(mesh, is, readFields, newFormat), + particle(mesh, is, readFields, false), // force to read old positions file + position_(Zero), tag_(-1), soi_(0.0), d_(0.0), @@ -60,6 +62,11 @@ Foam::injectedParticle::injectedParticle { if (readFields) { + // After the base particle class has read the fields from file and + // constructed the necessary barcentric co-ordinates we can update the + // particle position on this mesh + position_ = particle::position(); + if (is.format() == IOstream::ASCII) { tag_ = readLabel(is); @@ -84,6 +91,8 @@ void Foam::injectedParticle::readFields(Cloud<injectedParticle>& c) return; } + // Note: not reading local position_ - defer to base particle class + particle::readFields(c); IOField<label> tag(c.fieldIOobject("tag", IOobject::MUST_READ)); @@ -100,7 +109,7 @@ void Foam::injectedParticle::readFields(Cloud<injectedParticle>& c) label i = 0; - forAllIter(Cloud<injectedParticle>, c, iter) + forAllIters(c, iter) { injectedParticle& p = iter(); @@ -116,8 +125,14 @@ void Foam::injectedParticle::readFields(Cloud<injectedParticle>& c) void Foam::injectedParticle::writeFields(const Cloud<injectedParticle>& c) { + // Force writing positions instead of coordinates + particle::writeLagrangianCoordinates = false; + particle::writeLagrangianPositions = true; + particle::writeFields(c); + // Note: not writing local position_ - defer to base particle class + label np = c.size(); IOField<label> tag(c.fieldIOobject("tag", IOobject::NO_READ), np); @@ -127,7 +142,7 @@ void Foam::injectedParticle::writeFields(const Cloud<injectedParticle>& c) label i = 0; - forAllConstIter(Cloud<injectedParticle>, c, iter) + forAllConstIters(c, iter) { const injectedParticle& p = iter(); @@ -152,6 +167,10 @@ void Foam::injectedParticle::writeObjects objectRegistry& obr ) { + // Force writing positions instead of coordinates + particle::writeLagrangianCoordinates = false; + particle::writeLagrangianPositions = true; + particle::writeObjects(c, obr); label np = c.size(); @@ -163,7 +182,7 @@ void Foam::injectedParticle::writeObjects label i = 0; - forAllConstIter(Cloud<injectedParticle>, c, iter) + forAllConstIters(c, iter) { const injectedParticle& p = iter(); @@ -177,6 +196,40 @@ void Foam::injectedParticle::writeObjects } +void Foam::injectedParticle::writePosition(Ostream& os) const +{ + if (os.format() == IOstream::ASCII) + { + os << position_ << token::SPACE << cell(); + } + else + { + struct oldParticle + { + vector position; + label celli; + label facei; + scalar stepFraction; + label tetFacei; + label tetPti; + label origProc; + label origId; + } p; + + const size_t s = + offsetof(oldParticle, facei) - offsetof(oldParticle, position); + + p.position = position_; + p.celli = cell(); + + os.write(reinterpret_cast<const char*>(&p.position), s); + } + + // Check state of Ostream + os.check(FUNCTION_NAME); +} + + // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // Foam::Ostream& Foam::operator<< @@ -185,6 +238,8 @@ Foam::Ostream& Foam::operator<< const injectedParticle& p ) { + // Note: not writing local position_ - defer to base particle class + if (os.format() == IOstream::ASCII) { os << static_cast<const particle&>(p) diff --git a/src/lagrangian/basic/particle/particle.C b/src/lagrangian/basic/particle/particle.C index e81c52199150ddefebf62261a38ae435e0112fa7..d9e8ebdabbd7f742cb3fd8314ab5b393ee5669be 100644 --- a/src/lagrangian/basic/particle/particle.C +++ b/src/lagrangian/basic/particle/particle.C @@ -37,6 +37,10 @@ Foam::label Foam::particle::particleCount_ = 0; namespace Foam { defineTypeNameAndDebug(particle, 0); + bool particle::writeLagrangianCoordinates + ( + debug::infoSwitch("writeLagrangianCoordinates", 1) + ); bool particle::writeLagrangianPositions ( debug::infoSwitch("writeLagrangianPositions", 0) diff --git a/src/lagrangian/basic/particle/particle.H b/src/lagrangian/basic/particle/particle.H index 50e7e2755edded32326c4a2019b3ba92210c8afd..88dfd257c2963abe49ac35f48deec7dd32ad281d 100644 --- a/src/lagrangian/basic/particle/particle.H +++ b/src/lagrangian/basic/particle/particle.H @@ -87,9 +87,6 @@ class particle { // Private member data - //- Write particle positions file (v1706 format and earlier) - static bool writeLagrangianPositions; - //- Size in bytes of the position data static const std::size_t sizeofPosition; @@ -348,6 +345,14 @@ public: //- Cumulative particle counter - used to provide unique ID static label particleCount_; + //- Write particle coordinates file (v1712 and later) + //- Default is true + static bool writeLagrangianCoordinates; + + //- Write particle positions file (v1706 format and earlier) + //- Default is false + static bool writeLagrangianPositions; + // Constructors @@ -685,7 +690,7 @@ public: void writeCoordinates(Ostream&) const; //- Write the particle position and cell - void writePosition(Ostream&) const; + virtual void writePosition(Ostream&) const; // Friend Operators diff --git a/src/lagrangian/basic/particle/particleTemplates.C b/src/lagrangian/basic/particle/particleTemplates.C index 0748f4df3bca8cee56de4f0a9ff428ea5c4bcc3f..71472677d20d41e1ce926ebfac8315d1ea73a33c 100644 --- a/src/lagrangian/basic/particle/particleTemplates.C +++ b/src/lagrangian/basic/particle/particleTemplates.C @@ -72,6 +72,7 @@ void Foam::particle::writeFields(const TrackCloudType& c) { label np = c.size(); + if (writeLagrangianCoordinates) { IOPosition<TrackCloudType> ioP(c); ioP.write(np > 0); diff --git a/tutorials/multiphase/interFoam/laminar/vofToLagrangian/lagrangianDistributionInjection/Allrun b/tutorials/multiphase/interFoam/laminar/vofToLagrangian/lagrangianDistributionInjection/Allrun index 3dd409fe044d6488c7bf3a4a6c3fce8bd2276cf0..595da750655a7aa4ac123a09d06fae0ad0104b7e 100755 --- a/tutorials/multiphase/interFoam/laminar/vofToLagrangian/lagrangianDistributionInjection/Allrun +++ b/tutorials/multiphase/interFoam/laminar/vofToLagrangian/lagrangianDistributionInjection/Allrun @@ -27,14 +27,16 @@ copyLagrangianData() exit 1 fi - dir=$dir/${latestTime}/lagrangian + udir=$dir/${latestTime}/uniform/lagrangian + ldir=$dir/${latestTime}/lagrangian if [ -d $dir ] then - echo "Copying lagrangian data from $dir to 0 directory" - \cp -r $dir 0 + echo "Copying lagrangian data from $ldir to 0 directory" + \cp -r $ldir 0 + mkdir 0/uniform && \cp -r $udir 0/uniform else - echo "Error: unable to find Lagrangian data in case $dir" + echo "Error: unable to find Lagrangian data in case $ldir" exit 1 fi } @@ -46,10 +48,12 @@ copyLagrangianData ${eulerianCase} runApplication blockMesh -runApplication decomposePar +#runApplication decomposePar + +#runParallel $(getApplication) -runParallel $(getApplication) +#runApplication reconstructPar -runApplication reconstructPar +runApplication $(getApplication) #------------------------------------------------------------------------------ diff --git a/tutorials/multiphase/interFoam/laminar/vofToLagrangian/lagrangianParticleInjection/Allrun b/tutorials/multiphase/interFoam/laminar/vofToLagrangian/lagrangianParticleInjection/Allrun index 3dd409fe044d6488c7bf3a4a6c3fce8bd2276cf0..24fab8cccb6bdfbda334948a7ea180014905c820 100755 --- a/tutorials/multiphase/interFoam/laminar/vofToLagrangian/lagrangianParticleInjection/Allrun +++ b/tutorials/multiphase/interFoam/laminar/vofToLagrangian/lagrangianParticleInjection/Allrun @@ -27,14 +27,16 @@ copyLagrangianData() exit 1 fi - dir=$dir/${latestTime}/lagrangian + udir=$dir/${latestTime}/uniform/lagrangian + ldir=$dir/${latestTime}/lagrangian if [ -d $dir ] then - echo "Copying lagrangian data from $dir to 0 directory" - \cp -r $dir 0 + echo "Copying lagrangian data from $ldir to 0 directory" + \cp -r $ldir 0 + mkdir 0/uniform && \cp -r $udir 0/uniform else - echo "Error: unable to find Lagrangian data in case $dir" + echo "Error: unable to find Lagrangian data in case $ldir" exit 1 fi } @@ -46,10 +48,13 @@ copyLagrangianData ${eulerianCase} runApplication blockMesh -runApplication decomposePar +#runApplication decomposePar + +#runParallel $(getApplication) + +#runApplication reconstructPar -runParallel $(getApplication) +runApplication $(getApplication) -runApplication reconstructPar #------------------------------------------------------------------------------