Skip to content
Snippets Groups Projects
surfaceAdd.C 7.97 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*---------------------------------------------------------------------------*\
      =========                 |
      \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
       \\    /   O peration     |
    
    Mark Olesen's avatar
    Mark Olesen committed
        \\  /    A nd           | Copyright (C) 1991-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
    
    Description
        Add two surfaces. Does geometric merge on points. Does not check for
        overlapping/intersecting triangles.
    
        Keeps patches separate by renumbering.
    
    \*---------------------------------------------------------------------------*/
    
    #include "argList.H"
    #include "fileName.H"
    #include "triSurface.H"
    #include "OFstream.H"
    #include "IFstream.H"
    #include "triFace.H"
    #include "triFaceList.H"
    
    using namespace Foam;
    
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    // Main program:
    
    int main(int argc, char *argv[])
    {
        argList::noParallel();
        argList::validArgs.clear();
        argList::validArgs.append("Foam surface file");
        argList::validArgs.append("Foam surface file");
        argList::validArgs.append("Foam output file");
        argList::validOptions.insert("points", "pointsFile");
        argList::validOptions.insert("mergeRegions", "");
        argList args(argc, argv);
    
        fileName inFileName1(args.additionalArgs()[0]);
        fileName inFileName2(args.additionalArgs()[1]);
        fileName outFileName(args.additionalArgs()[2]);
    
    
        bool addPoint     = args.optionFound("points");
        bool mergeRegions = args.optionFound("mergeRegions");
    
    
        if (addPoint)
        {
            Info<< "Reading a surface and adding points from a file"
                << "; merging the points and writing the surface to another file"
                << nl << endl;
    
            Info<< "Surface  : " << inFileName1<< nl
    
                << "Points   : " << args.option("points") << nl
    
                << "Writing  : " << outFileName << nl << endl;
        }
        else
        {
            Info<< "Reading two surfaces"
                << "; merging points and writing the surface to another file"
                << nl << endl;
    
            if (mergeRegions)
            {
                Info<< "Regions from the two files will get merged" << nl
                    << "Do not use this option if you want to keep the regions"
                    << " separate" << nl << endl;
            }
            else
            {
                Info<< "Regions from the two files will not get merged" << nl
                    << "Regions from " << inFileName2 << " will get offset so"
                    << " as not to overlap with the regions in " << inFileName1
                    << nl << endl;
            }
    
    
            Info<< "Surface1 : " << inFileName1<< nl
                << "Surface2 : " << inFileName2<< nl
                << "Writing  : " << outFileName << nl << endl;
        }
    
        const triSurface surface1(inFileName1);
    
        Info<< "Surface1:" << endl;
        surface1.writeStats(Info);
        Info<< endl;
    
        const pointField& points1 = surface1.points();
    
        // Final surface
        triSurface combinedSurf;
    
        if (addPoint)
        {
    
            IFstream pointsFile(args.option("points"));
            pointField extraPoints(pointsFile);
    
    
            Info<< "Additional Points:" << extraPoints.size() << endl;
    
            vectorField pointsAll(points1);
            label pointI = pointsAll.size();
            pointsAll.setSize(pointsAll.size() + extraPoints.size());
    
            forAll(extraPoints, i)
            {
                pointsAll[pointI++] = extraPoints[i];
            }
    
            combinedSurf = triSurface(surface1, surface1.patches(), pointsAll);
        }
        else
        {
            const triSurface surface2(inFileName2);
    
            Info<< "Surface2:" << endl;
            surface2.writeStats(Info);
            Info<< endl;
    
    
            // Make new storage
            List<labelledTri> facesAll(surface1.size() + surface2.size());
    
            const pointField& points2 = surface2.points();
    
            vectorField pointsAll(points1.size() + points2.size());
    
    
            label pointi = 0;
            // Copy points1 into pointsAll
            forAll(points1, point1i)
            {
                pointsAll[pointi++] = points1[point1i];
            }
            // Add surface2 points
            forAll(points2, point2i)
            {
                pointsAll[pointi++] = points2[point2i];
            }
    
    
            label trianglei = 0;
    
            // Copy triangles1 into trianglesAll
            forAll(surface1, faceI)
            {
    
                facesAll[trianglei++] = surface1[faceI];
    
            label nRegions1 = surface1.patches().size();
    
                Info<< "Surface " << inFileName1 << " has " << nRegions1
                    << " regions"
    
                    << nl
                    << "All region numbers in " << inFileName2 << " will be offset"
                    << " by this amount" << nl << endl;
            }
    
            // Add (renumbered) surface2 triangles
            forAll(surface2, faceI)
            {
                const labelledTri& tri = surface2[faceI];
    
                labelledTri& destTri = facesAll[trianglei++];
                destTri[0] = tri[0] + points1.size();
                destTri[1] = tri[1] + points1.size();
                destTri[2] = tri[2] + points1.size();
                if (mergeRegions)
                {
                    destTri.region() = tri.region();
                }
                else
                {
                    destTri.region() = tri.region() + nRegions1;
                }
            }
    
    
            label nRegions2 = surface2.patches().size();
    
    
            geometricSurfacePatchList newPatches;
    
            if (mergeRegions)
            {
                // Overwrite
                newPatches.setSize(max(nRegions1, nRegions2));
    
                forAll(surface1.patches(), patchI)
                {
    
                    newPatches[patchI] = surface1.patches()[patchI];
    
                }
                forAll(surface2.patches(), patchI)
                {
    
                    newPatches[patchI] = surface2.patches()[patchI];
    
                }
            }
            else
            {
                Info<< "Regions from " << inFileName2 << " have been renumbered:"
                    << nl
                    << "    old\tnew" << nl;
    
                for (label regionI = 0; regionI < nRegions2; regionI++)
                {
                    Info<< "    " << regionI << '\t' << regionI+nRegions1
                        << nl;
                }
                Info<< nl;
    
                newPatches.setSize(nRegions1 + nRegions2);
    
                label newPatchI = 0;
    
                forAll(surface1.patches(), patchI)
                {
    
                    newPatches[newPatchI++] = surface1.patches()[patchI];
    
                }
    
                forAll(surface2.patches(), patchI)
                {
    
                    newPatches[newPatchI++] = surface2.patches()[patchI];
    
    
            Info<< "New patches:" << nl;
            forAll(newPatches, patchI)
            {
                Info<< "    " << patchI << '\t' << newPatches[patchI].name() << nl;
            }
            Info<< endl;
    
    
            // Construct new surface mesh
            combinedSurf = triSurface(facesAll, newPatches, pointsAll);
        }
    
        // Merge all common points and do some checks
        combinedSurf.cleanup(true);
    
        Info<< "Merged surface:" << endl;
    
        combinedSurf.writeStats(Info);
    
        Info<< endl;
    
        Info << "Writing : " << outFileName << endl;
    
        // No need to 'group' while writing since all in correct order anyway.
        combinedSurf.write(outFileName);
    
        Info << "End\n" << endl;
    
        return 0;
    }
    
    
    // ************************************************************************* //