Skip to content
Snippets Groups Projects
CloudIO.C 6.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*---------------------------------------------------------------------------*\
      =========                 |
      \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
       \\    /   O peration     |
    
        \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
    
         \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
    
    -------------------------------------------------------------------------------
    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 <http://www.gnu.org/licenses/>.
    
    
    \*---------------------------------------------------------------------------*/
    
    #include "Cloud.H"
    #include "Time.H"
    #include "IOPosition.H"
    
    // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
    
    template<class ParticleType>
    Foam::word Foam::Cloud<ParticleType>::cloudPropertiesName("cloudProperties");
    
    
    
    // * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
    
    
    template<class ParticleType>
    void Foam::Cloud<ParticleType>::readCloudUniformProperties()
    {
    
        (
            cloudPropertiesName,
            time().timeName(),
            "uniform"/cloud::prefix/name(),
            db(),
    
            IOobject::MUST_READ_IF_MODIFIED,
    
        if (dictObj.typeHeaderOk<IOdictionary>(true))
    
            const IOdictionary uniformPropsDict(dictObj);
    
            // Fall back to positions mode if the entry is not present for
            // backwards compatibility
            geometryType_ =
    
                cloud::geometryTypeNames.lookupOrDefault
    
                    cloud::geometryType::POSITIONS
    
            const word procName("processor" + Foam::name(Pstream::myProcNo()));
    
            if (uniformPropsDict.found(procName))
            {
                uniformPropsDict.subDict(procName).lookup("particleCount")
    
    andy's avatar
    andy committed
                    >> ParticleType::particleCount_;
    
    andy's avatar
    andy committed
            ParticleType::particleCount_ = 0;
    
        }
    }
    
    
    template<class ParticleType>
    void Foam::Cloud<ParticleType>::writeCloudUniformProperties() const
    {
        IOdictionary uniformPropsDict
        (
            IOobject
            (
                cloudPropertiesName,
                time().timeName(),
                "uniform"/cloud::prefix/name(),
                db(),
                IOobject::NO_READ,
                IOobject::NO_WRITE,
                false
            )
        );
    
        labelList np(Pstream::nProcs(), 0);
    
    andy's avatar
    andy committed
        np[Pstream::myProcNo()] = ParticleType::particleCount_;
    
    
        Pstream::listCombineGather(np, maxEqOp<label>());
        Pstream::listCombineScatter(np);
    
    
            cloud::geometryTypeNames[geometryType_]
    
        forAll(np, i)
        {
            word procName("processor" + Foam::name(i));
            uniformPropsDict.add(procName, dictionary());
            uniformPropsDict.subDict(procName).add("particleCount", np[i]);
        }
    
    
        uniformPropsDict.writeObject
        (
            IOstream::ASCII,
            IOstream::currentVersion,
    
    template<class ParticleType>
    void Foam::Cloud<ParticleType>::initCloud(const bool checkClass)
    {
    
        IOPosition<Cloud<ParticleType>> ioP(*this, geometryType_);
    
        bool valid = ioP.headerOk();
        Istream& is = ioP.readStream(checkClass ? typeName : "", valid);
        if (valid)
    
            Pout<< "Cannot read particle positions file:" << nl
                << "    " << ioP.objectPath() << nl
                << "Assuming the initial cloud contains 0 particles." << endl;
    
        // Always operate in coordinates mode after reading
        geometryType_ = cloud::geometryType::COORDINATES;
    
        // Ask for the tetBasePtIs to trigger all processors to build
        // them, otherwise, if some processors have no particles then
        // there is a comms mismatch.
        polyMesh_.tetBasePtIs();
    
    }
    
    
    // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
    
    template<class ParticleType>
    Foam::Cloud<ParticleType>::Cloud
    (
        const polyMesh& pMesh,
        const word& cloudName,
    
    )
    :
        cloud(pMesh, cloudName),
        polyMesh_(pMesh),
    
        labels_(),
    
        geometryType_(cloud::geometryType::COORDINATES)
    
        initCloud(checkClass);
    }
    
    
    // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
    
    template<class ParticleType>
    Foam::IOobject Foam::Cloud<ParticleType>::fieldIOobject
    (
    
        const word& fieldName,
        const IOobject::readOption r
    
    ) const
    {
        return IOobject
        (
            fieldName,
            time().timeName(),
            *this,
    
            IOobject::NO_WRITE,
            false
        );
    }
    
    
    template<class ParticleType>
    
    template<class DataType>
    void Foam::Cloud<ParticleType>::checkFieldIOobject
    
        const Cloud<ParticleType>& c,
        const IOField<DataType>& data
    
        if (data.size() != c.size())
        {
    
            FatalErrorInFunction
                << "Size of " << data.name()
    
                << " field " << data.size()
                << " does not match the number of particles " << c.size()
                << abort(FatalError);
        }
    
    template<class ParticleType>
    template<class DataType>
    void Foam::Cloud<ParticleType>::checkFieldFieldIOobject
    (
        const Cloud<ParticleType>& c,
    
        const CompactIOField<Field<DataType>, DataType>& data
    
    ) const
    {
        if (data.size() != c.size())
        {
    
            FatalErrorInFunction
                << "Size of " << data.name()
    
                << " field " << data.size()
                << " does not match the number of particles " << c.size()
                << abort(FatalError);
        }
    }
    
    
    
    template<class ParticleType>
    void Foam::Cloud<ParticleType>::writeFields() const
    
        ParticleType::writeFields(*this);
    
    
    
    template<class ParticleType>
    bool Foam::Cloud<ParticleType>::writeObject
    (
        IOstream::streamFormat fmt,
        IOstream::versionNumber ver,
    
        IOstream::compressionType cmp,
        const bool
    
        writeFields();
        return cloud::writeObject(fmt, ver, cmp, this->size());
    
    }
    
    
    // * * * * * * * * * * * * * * * Ostream Operators * * * * * * * * * * * * * //
    
    template<class ParticleType>
    Foam::Ostream& Foam::operator<<(Ostream& os, const Cloud<ParticleType>& pc)
    {
        pc.writeData(os);
    
    
        return os;
    }
    
    
    // ************************************************************************* //