From 83ec8559d60d9f3597adb4e41f670ca932dd36b0 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Tue, 8 Nov 2011 09:31:49 +0000
Subject: [PATCH] ENH: GAMGAgglomeration: test app to dump agglomeration of
 GAMG

---
 .../test/GAMGAgglomeration/Make/files         |   3 +
 .../test/GAMGAgglomeration/Make/options       |   5 +
 .../Test-GAMGAgglomeration.C                  | 115 ++++++++++++++++++
 3 files changed, 123 insertions(+)
 create mode 100644 applications/test/GAMGAgglomeration/Make/files
 create mode 100644 applications/test/GAMGAgglomeration/Make/options
 create mode 100644 applications/test/GAMGAgglomeration/Test-GAMGAgglomeration.C

diff --git a/applications/test/GAMGAgglomeration/Make/files b/applications/test/GAMGAgglomeration/Make/files
new file mode 100644
index 00000000000..e6ad2af5d22
--- /dev/null
+++ b/applications/test/GAMGAgglomeration/Make/files
@@ -0,0 +1,3 @@
+Test-GAMGAgglomeration.C
+
+EXE = $(FOAM_USER_APPBIN)/Test-GAMGAgglomeration
diff --git a/applications/test/GAMGAgglomeration/Make/options b/applications/test/GAMGAgglomeration/Make/options
new file mode 100644
index 00000000000..fa15f124528
--- /dev/null
+++ b/applications/test/GAMGAgglomeration/Make/options
@@ -0,0 +1,5 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteVolume/lnInclude
+
+EXE_LIBS = \
+    -lfiniteVolume
diff --git a/applications/test/GAMGAgglomeration/Test-GAMGAgglomeration.C b/applications/test/GAMGAgglomeration/Test-GAMGAgglomeration.C
new file mode 100644
index 00000000000..1cfe12db486
--- /dev/null
+++ b/applications/test/GAMGAgglomeration/Test-GAMGAgglomeration.C
@@ -0,0 +1,115 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+     \\/     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 <http://www.gnu.org/licenses/>.
+
+Application
+    Test-GAMGAgglomeration
+
+Description
+    Test application for GAMG agglomeration. Hardcoded to expect GAMG on p.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "GAMGAgglomeration.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
+{
+    #include "setRootCase.H"
+    #include "createTime.H"
+    #include "createMesh.H"
+
+    const fvSolution& sol = static_cast<const fvSolution&>(mesh);
+    const dictionary& pDict = sol.subDict("solvers").subDict("p");
+
+    const GAMGAgglomeration& agglom = GAMGAgglomeration::New
+    (
+        mesh,
+        pDict
+    );
+
+    labelList cellToCoarse(identity(mesh.nCells()));
+    labelListList coarseToCell(invertOneToMany(mesh.nCells(), cellToCoarse));
+
+    for (label level = 0; level < agglom.size(); level++)
+    {
+        runTime.setTime(dimensionedScalar("time", dimTime, level), level);
+
+        Info<< "Level = " << runTime.timeName() << nl << endl;
+
+        const labelList& addr = agglom.restrictAddressing(level);
+        label coarseSize = max(addr)+1;
+
+        Info<< "    current size      : "
+            << returnReduce(addr.size(), sumOp<label>()) << endl;
+        Info<< "    agglomerated size : "
+            << returnReduce(coarseSize, sumOp<label>()) << endl;
+
+        forAll(addr, fineI)
+        {
+            const labelList& cellLabels = coarseToCell[fineI];
+            forAll(cellLabels, i)
+            {
+                cellToCoarse[cellLabels[i]] = addr[fineI];
+            }
+        }
+        coarseToCell = invertOneToMany(coarseSize, cellToCoarse);
+
+        // Write agglomeration
+        {
+            volScalarField scalarAgglomeration
+            (
+                IOobject
+                (
+                    "agglomeration",
+                    runTime.timeName(),
+                    mesh,
+                    IOobject::NO_READ,
+                    IOobject::AUTO_WRITE
+                ),
+                mesh,
+                dimensionedScalar("aggomeration", dimless, 0.0)
+            );
+            scalarField& fld = scalarAgglomeration.internalField();
+            forAll(fld, cellI)
+            {
+                fld[cellI] = cellToCoarse[cellI];
+            }
+            fld /= max(fld);
+            scalarAgglomeration.correctBoundaryConditions();
+            scalarAgglomeration.write();
+        }
+
+        Info<< endl;
+    }
+
+
+    Info<< "End\n" << endl;
+
+    return 0;
+}
+
+
+// ************************************************************************* //
-- 
GitLab