Skip to content
Snippets Groups Projects
arraySet.C 4.58 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henry's avatar
    Henry committed
    /*---------------------------------------------------------------------------*\
      =========                 |
      \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
       \\    /   O peration     |
    
        \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
    
         \\/     M anipulation  | Copyright (C) 2018 OpenCFD Ltd.
    
    Henry's avatar
    Henry committed
    -------------------------------------------------------------------------------
    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 "arraySet.H"
    #include "sampledSet.H"
    #include "meshSearch.H"
    #include "DynamicList.H"
    #include "polyMesh.H"
    #include "addToRunTimeSelectionTable.H"
    #include "word.H"
    
    // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
    
    namespace Foam
    {
        defineTypeNameAndDebug(arraySet, 0);
        addToRunTimeSelectionTable(sampledSet, arraySet, word);
    }
    
    
    // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
    
    void Foam::arraySet::calcSamples
    (
        DynamicList<point>& samplingPts,
        DynamicList<label>& samplingCells,
        DynamicList<label>& samplingFaces,
        DynamicList<label>& samplingSegments,
        DynamicList<scalar>& samplingCurveDist
    ) const
    {
        const meshSearch& queryMesh = searchEngine();
    
    
        const scalar dx = spanBox_.x()/(pointsDensity_.x() + 1);
        const scalar dy = spanBox_.y()/(pointsDensity_.y() + 1);
        const scalar dz = spanBox_.z()/(pointsDensity_.z() + 1);
    
    Henry's avatar
    Henry committed
    
    
    Henry's avatar
    Henry committed
    
    
        for (label k=1; k<=pointsDensity_.z(); ++k)
    
    Henry's avatar
    Henry committed
        {
    
            for (label j=1; j<=pointsDensity_.y(); ++j)
    
    Henry's avatar
    Henry committed
            {
    
                for (label i=1; i<=pointsDensity_.x(); ++i)
    
    Henry's avatar
    Henry committed
                {
    
                    point pt(i*dx, j*dy, k*dz);
    
    
                    // Global Cartesian
                    pt = csys_.globalPosition(pt);
    
                    const label celli = queryMesh.findCell(pt);
    
                    if (celli != -1)
                    {
                        samplingPts.append(pt);
                        samplingCells.append(celli);
                        samplingFaces.append(-1);
                        samplingSegments.append(0);
                        samplingCurveDist.append(1.0 * sampleI);
                    }
    
    Henry's avatar
    Henry committed
                }
            }
        }
    }
    
    
    void Foam::arraySet::genSamples()
    {
        // Storage for sample points
        DynamicList<point> samplingPts;
        DynamicList<label> samplingCells;
        DynamicList<label> samplingFaces;
        DynamicList<label> samplingSegments;
        DynamicList<scalar> samplingCurveDist;
    
        calcSamples
        (
            samplingPts,
            samplingCells,
            samplingFaces,
            samplingSegments,
            samplingCurveDist
        );
    
        samplingPts.shrink();
        samplingCells.shrink();
        samplingFaces.shrink();
        samplingSegments.shrink();
        samplingCurveDist.shrink();
    
    
    Henry's avatar
    Henry committed
        setSamples
        (
    
            std::move(samplingPts),
            std::move(samplingCells),
            std::move(samplingFaces),
            std::move(samplingSegments),
            std::move(samplingCurveDist)
    
    Henry's avatar
    Henry committed
        );
    
    Henry's avatar
    Henry committed
    }
    
    
    // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
    
    Foam::arraySet::arraySet
    (
        const word& name,
        const polyMesh& mesh,
        const meshSearch& searchEngine,
        const word& axis,
    
        const coordSystem::cartesian& csys,
    
    Henry's avatar
    Henry committed
        const Vector<label>& pointsDensity,
        const Vector<scalar>& spanBox
    )
    :
        sampledSet(name, mesh, searchEngine, axis),
    
    Henry's avatar
    Henry committed
        pointsDensity_(pointsDensity),
        spanBox_(spanBox)
    {
        genSamples();
    }
    
    
    Foam::arraySet::arraySet
    (
        const word& name,
        const polyMesh& mesh,
        const meshSearch& searchEngine,
        const dictionary& dict
    )
    :
        sampledSet(name, mesh, searchEngine, dict),
    
        csys_(dict),  // Note: no indirect cs with this constructor
    
        pointsDensity_(dict.get<labelVector>("pointsDensity")),
        spanBox_(dict.get<vector>("spanBox"))
    
    Henry's avatar
    Henry committed
    {
        genSamples();
    }
    
    
    // ************************************************************************* //