diff --git a/applications/utilities/mesh/manipulation/renumberMesh/Allwmake b/applications/utilities/mesh/manipulation/renumberMesh/Allwmake index f5f12d599330862c03001df53f09d3d1d9f86aba..250914574fa918a7f6047e9fe3f43877340e2c45 100755 --- a/applications/utilities/mesh/manipulation/renumberMesh/Allwmake +++ b/applications/utilities/mesh/manipulation/renumberMesh/Allwmake @@ -1,12 +1,20 @@ #!/bin/sh cd ${0%/*} || exit 1 # run from this directory -export SLOAN_LINK_FLAGS='' +export COMPILE_FLAGS='' +export LINK_FLAGS='' if [ -f "${FOAM_LIBBIN}/libSloanRenumber.so" ] then echo "Found libSloanRenumber.so -- enabling Sloan renumbering support." - export SLOAN_LINK_FLAGS="-lSloanRenumber" + export LINK_FLAGS="${LINK_FLAGS} -lSloanRenumber" +fi + +if [ "${ZOLTAN_ARCH_PATH}/lib/libzoltan.a" -a -f "${FOAM_LIBBIN}/libzoltanRenumber.so" ] +then + echo "Found libzoltanRenumber.so -- enabling zoltan renumbering support." + export COMPILE_FLAGS="-DFOAM_USE_ZOLTAN" + export LINK_FLAGS="${LINK_FLAGS} -lzoltanRenumber -L${ZOLTAN_ARCH_PATH}/lib -lzoltan" fi wmake diff --git a/applications/utilities/mesh/manipulation/renumberMesh/Make/options b/applications/utilities/mesh/manipulation/renumberMesh/Make/options index 23661b3e95dc3e85400080a8496345d0a6c02539..49a1c3d2e33adfe98dd2cd94d352c0a78123e836 100644 --- a/applications/utilities/mesh/manipulation/renumberMesh/Make/options +++ b/applications/utilities/mesh/manipulation/renumberMesh/Make/options @@ -1,9 +1,11 @@ EXE_INC = \ /* -DFULLDEBUG -g -O0 */ \ + ${COMPILE_FLAGS} \ -I$(LIB_SRC)/meshTools/lnInclude \ -I$(LIB_SRC)/dynamicMesh/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/renumber/renumberMethods/lnInclude \ + -I$(LIB_SRC)/renumber/zoltanRenumber/lnInclude \ -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude EXE_LIBS = \ @@ -12,5 +14,5 @@ EXE_LIBS = \ -lfiniteVolume \ -lgenericPatchFields \ -lrenumberMethods \ - $(SLOAN_LINK_FLAGS) \ + $(LINK_FLAGS) \ -ldecompositionMethods -L$(FOAM_LIBBIN)/dummy -lmetisDecomp -lscotchDecomp diff --git a/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C b/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C index 9c5d0b8de2f03afdd2dd30d85cbc059099da49fc..c0d8982880cdebb049705ad02a55495c96528f74 100644 --- a/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C +++ b/applications/utilities/mesh/manipulation/renumberMesh/renumberMesh.C @@ -47,6 +47,11 @@ Description #include "CuthillMcKeeRenumber.H" #include "fvMeshSubset.H" +#ifdef FOAM_USE_ZOLTAN +# include "zoltanRenumber.H" +#endif + + using namespace Foam; @@ -577,6 +582,15 @@ int main(int argc, char *argv[]) "calculate the rms of the frontwidth" ); + +// Force linker to include zoltan symbols. This section is only needed since +// Zoltan is a static library +#ifdef FOAM_USE_ZOLTAN + Info<< "renumberMesh built with zoltan support." << nl << endl; + (void)zoltanRenumber::typeName; +#endif + + # include "setRootCase.H" # include "createTime.H" runTime.functionObjects().off(); diff --git a/applications/utilities/mesh/manipulation/renumberMesh/renumberMeshDict b/applications/utilities/mesh/manipulation/renumberMesh/renumberMeshDict index 7430ea3441438f2df8ab123abaf7a4b84b440772..b3393b10e34756a79a184fe1a7f12e68a2eaf849 100644 --- a/applications/utilities/mesh/manipulation/renumberMesh/renumberMeshDict +++ b/applications/utilities/mesh/manipulation/renumberMesh/renumberMeshDict @@ -42,6 +42,7 @@ method CuthillMcKee; //method random; //method spring; //method boundaryFirst; +//method zoltan; // only if compiled with zoltan support //CuthillMcKeeCoeffs //{ @@ -83,4 +84,10 @@ blockCoeffs } +zoltanCoeffs +{ + ORDER_METHOD LOCAL_HSFC; +} + + // ************************************************************************* // diff --git a/src/renumber/Allwmake b/src/renumber/Allwmake index 3e28994c25c2cfbf03e9bbe9616ebee7f75c0d14..d7f72d93beb18de5c680b2e5d286a4bdda4a2a64 100755 --- a/src/renumber/Allwmake +++ b/src/renumber/Allwmake @@ -28,13 +28,13 @@ else fi -#if [ -n "$ZOLTAN_ARCH_PATH" ] -#then -# wmake $makeType zoltanRenumber -#else -# echo -# echo "Skipping zoltanRenumber" -# echo -#fi +if [ -n "$ZOLTAN_ARCH_PATH" ] +then + wmake $makeType zoltanRenumber +else + echo + echo "Skipping zoltanRenumber" + echo +fi # ----------------------------------------------------------------- end-of-file diff --git a/src/renumber/zoltanRenumber/Make/files b/src/renumber/zoltanRenumber/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..15659a52d0ff71ca05f4f1f116cfe6f74df85cae --- /dev/null +++ b/src/renumber/zoltanRenumber/Make/files @@ -0,0 +1,3 @@ +zoltanRenumber.C + +LIB = $(FOAM_LIBBIN)/libzoltanRenumber diff --git a/src/renumber/zoltanRenumber/Make/options b/src/renumber/zoltanRenumber/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..ef48897a080423a55f2e0d2bd18a3a6db3cba562 --- /dev/null +++ b/src/renumber/zoltanRenumber/Make/options @@ -0,0 +1,13 @@ +sinclude $(GENERAL_RULES)/mplib$(WM_MPLIB) +sinclude $(RULES)/mplib$(WM_MPLIB) + +EXE_INC = \ + /* -DFULLDEBUG -g -O0 */ \ + $(PFLAGS) $(PINC) \ + -I$(FOAM_SRC)/renumber/renumberMethods/lnInclude \ + -I$(ZOLTAN_ARCH_PATH)/include/ \ + -I$(LIB_SRC)/meshTools/lnInclude + +LIB_LIBS = \ + -L$(ZOLTAN_ARCH_PATH)/lib -lzoltan \ + -lmeshTools diff --git a/src/renumber/zoltanRenumber/zoltanRenumber.C b/src/renumber/zoltanRenumber/zoltanRenumber.C new file mode 100644 index 0000000000000000000000000000000000000000..5118f0b82f149b79bf444a14536c00abb593ac9d --- /dev/null +++ b/src/renumber/zoltanRenumber/zoltanRenumber.C @@ -0,0 +1,373 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2012 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/>. + +Class + Foam::zoltanRenumber + +Description + Renumber using Zoltan + + Zoltan install: + - in your ~/.bashrc: + export ZOLTAN_ARCH_DIR=\ + $WM_THIRD_PARTY_DIR/platforms/linux64Gcc/Zoltan_XXX + - unpack into $WM_THIRD_PARTY_DIR + - cd Zoltan_XXX + - mkdir build + - cd build + - export CCFLAGS="-fPIC" + - export CXXFLAGS="-fPIC" + - export CFLAGS="-fPIC" + - export LDFLAGS="-shared" + - ../configure \ + --prefix=$ZOLTAN_ARCH_DIR \ + --with-ccflags=-fPIC --with-cxxflags=-fPIC --with-ldflags=-shared + +SourceFiles + zoltanRenumber.C + +\*---------------------------------------------------------------------------*/ + +#include "zoltanRenumber.H" +#include "addToRunTimeSelectionTable.H" +#include "IFstream.H" +#include "labelIOList.H" +#include "polyMesh.H" +#include "globalMeshData.H" +#include "globalIndex.H" +#include "uint.H" + +#include "zoltan.h" +#include <mpi.h> + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(zoltanRenumber, 0); + + addToRunTimeSelectionTable + ( + renumberMethod, + zoltanRenumber, + dictionary + ); +} + + +static int get_number_of_vertices(void *data, int *ierr) +{ + const Foam::polyMesh& mesh = *static_cast<const Foam::polyMesh*>(data); + *ierr = ZOLTAN_OK; + return mesh.nCells(); +} + + +static void get_vertex_list(void *data, int sizeGID, int sizeLID, + ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID, + int wgt_dim, float *obj_wgts, int *ierr) +{ + const Foam::polyMesh& mesh = *static_cast<const Foam::polyMesh*>(data); + + *ierr = ZOLTAN_OK; + + /* In this example, return the IDs of our vertices, but no weights. + * Zoltan will assume equally weighted vertices. + */ + + wgt_dim = 0; + obj_wgts = NULL; + + for (Foam::label i=0; i<mesh.nCells(); i++) + { + globalID[i] = i; // should be global + localID[i] = i; + } +} + + +static void get_num_edges_list(void *data, int sizeGID, int sizeLID, + int num_obj, + ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID, + int *numEdges, int *ierr) +{ + const Foam::polyMesh& mesh = *static_cast<const Foam::polyMesh*>(data); + + if ((sizeGID != 1) || (sizeLID != 1) || (num_obj != mesh.nCells())) + { + *ierr = ZOLTAN_FATAL; + return; + } + + for (Foam::label i=0; i < num_obj ;i++) + { + Foam::label cellI = localID[i]; + const Foam::cell& cFaces = mesh.cells()[cellI]; + forAll(cFaces, cFaceI) + { + Foam::label n = 0; + if (mesh.isInternalFace(cFaces[cFaceI])) + { + n++; + } + numEdges[i] = n; + } + } + + *ierr = ZOLTAN_OK; +} + + +static void get_edge_list(void *data, int sizeGID, int sizeLID, + int num_obj, ZOLTAN_ID_PTR globalID, ZOLTAN_ID_PTR localID, + int *num_edges, + ZOLTAN_ID_PTR nborGID, int *nborProc, + int wgt_dim, float *ewgts, int *ierr) +{ + const Foam::polyMesh& mesh = *static_cast<const Foam::polyMesh*>(data); + + if + ( + (sizeGID != 1) + || (sizeLID != 1) + || (num_obj != mesh.nCells()) + || (wgt_dim != 1) + ) + { + *ierr = ZOLTAN_FATAL; + return; + } + + ZOLTAN_ID_TYPE* nextNbor = nborGID; + int* nextProc = nborProc; + float* nextWgt = ewgts; + + for (Foam::label i=0; i < num_obj; i++) + { + Foam::label cellI = localID[i]; + + const Foam::cell& cFaces = mesh.cells()[cellI]; + forAll(cFaces, cFaceI) + { + Foam::label n = 0; + + Foam::label faceI = cFaces[cFaceI]; + if (mesh.isInternalFace(faceI)) + { + Foam::label nbr = mesh.faceOwner()[faceI]; + if (nbr == cellI) + { + nbr = mesh.faceNeighbour()[faceI]; + } + + // Note: global index + *nextNbor++ = nbr; + *nextProc++ = 0; + *nextWgt++ = 1.0; + + n++; + } + if (n != num_edges[i]) + { + *ierr = ZOLTAN_FATAL; + return; + } + } + } + *ierr = ZOLTAN_OK; +} + + +static int get_mesh_dim(void *data, int *ierr) +{ + const Foam::polyMesh& mesh = *static_cast<const Foam::polyMesh*>(data); + + return mesh.nSolutionD(); +} + + +static void get_geom_list +( + void *data, + int num_gid_entries, + int num_lid_entries, + int num_obj, + ZOLTAN_ID_PTR global_ids, + ZOLTAN_ID_PTR local_ids, + int num_dim, + double *geom_vec, + int *ierr +) +{ + const Foam::polyMesh& mesh = *static_cast<const Foam::polyMesh*>(data); + + if + ( + (num_gid_entries != 1) + || (num_lid_entries != 1) + || (num_obj != mesh.nCells()) + || (num_dim != mesh.nSolutionD()) + ) + { + *ierr = ZOLTAN_FATAL; + return; + } + + double* p = geom_vec; + + + const Foam::Vector<Foam::label>& sol = mesh.solutionD(); + + const Foam::pointField& cc = mesh.cellCentres(); + + for (Foam::label cellI = 0; cellI < num_obj; cellI++) + { + const Foam::point& pt = cc[cellI]; + + for (Foam::direction cmpt = 0; cmpt < Foam::vector::nComponents; cmpt++) + { + if (sol[cmpt] == 1) + { + *p++ = pt[cmpt]; + } + } + } + *ierr = ZOLTAN_OK; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::zoltanRenumber::zoltanRenumber(const dictionary& renumberDict) +: + renumberMethod(renumberDict), + coeffsDict_(renumberDict.subDict(typeName+"Coeffs")) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +Foam::labelList Foam::zoltanRenumber::renumber +( + const polyMesh& pMesh, + const pointField& points +) const +{ + stringList args(1); + args[0] = "zoltanRenumber"; + + int argc = args.size(); + char* argv[argc]; + for (label i = 0; i < argc; i++) + { + argv[i] = strdup(args[i].c_str()); + } + + float ver; + int rc = Zoltan_Initialize(argc, argv, &ver); + + Foam::Pout<< "Initialised to " << ver << Foam::endl; + + if (rc != ZOLTAN_OK) + { + FatalErrorIn("zoltanRenumber::renumber(..)") + << "Failed initialising Zoltan" << exit(FatalError); + } + + struct Zoltan_Struct *zz = Zoltan_Create(MPI_COMM_WORLD); + + polyMesh& mesh = const_cast<polyMesh&>(pMesh); + + + forAllConstIter(IDLList<entry>, coeffsDict_, iter) + { + if (!iter().isDict()) + { + const word& key = iter().keyword(); + const word value(iter().stream()); + + Info<< typeName << " : setting parameter " << key + << " to " << value << endl; + + Zoltan_Set_Param(zz, key.c_str(), value.c_str()); + } + } + + + Zoltan_Set_Num_Obj_Fn(zz, get_number_of_vertices, &mesh); + Zoltan_Set_Obj_List_Fn(zz, get_vertex_list, &mesh); + + // Callbacks for geometry + Zoltan_Set_Num_Geom_Fn(zz, get_mesh_dim, &mesh); + Zoltan_Set_Geom_Multi_Fn(zz, get_geom_list, &mesh); + + // Callbacks for connectivity + Zoltan_Set_Num_Edges_Multi_Fn(zz, get_num_edges_list, &mesh); + Zoltan_Set_Edge_List_Multi_Fn(zz, get_edge_list, &mesh); + + + + //Note: !global indices + List<ZOLTAN_ID_TYPE> wantedCells(mesh.nCells()); + + globalIndex globalCells(mesh.nCells()); + forAll(wantedCells, i) + { + //wantedCells[i] = i; + wantedCells[i] = globalCells.toGlobal(i); + } + + List<ZOLTAN_ID_TYPE> oldToNew(mesh.nCells()); + + int err = Zoltan_Order + ( + zz, + 1, //int num_gid_entries, + mesh.globalData().nTotalCells(), //int num_obj, + wantedCells.begin(), + oldToNew.begin() + ); + + if (err != ZOLTAN_OK) + { + FatalErrorIn("zoltanRenumber::renumber(..)") + << "Failed Zoltan_Order" << exit(FatalError); + } + + + for (label i = 0; i < argc; i++) + { + free(argv[i]); + } + + + labelList order(oldToNew.size()); + forAll(order, i) + { + order[i] = oldToNew[i]; + } + return order; +} + + +// ************************************************************************* // diff --git a/src/renumber/zoltanRenumber/zoltanRenumber.H b/src/renumber/zoltanRenumber/zoltanRenumber.H new file mode 100644 index 0000000000000000000000000000000000000000..a4d317cef9d9389ee797da5bbf1007743a9e0479 --- /dev/null +++ b/src/renumber/zoltanRenumber/zoltanRenumber.H @@ -0,0 +1,130 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2012 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/>. + +Class + Foam::zoltanRenumber + +Description + Use Zoltan + +SourceFiles + zoltanRenumber.C + +\*---------------------------------------------------------------------------*/ + +#ifndef zoltanRenumber_H +#define zoltanRenumber_H + +#include "renumberMethod.H" + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class zoltanRenumber Declaration +\*---------------------------------------------------------------------------*/ + +class zoltanRenumber +: + public renumberMethod +{ + // Private data + + const dictionary coeffsDict_; + + + + // Private Member Functions + + //- Disallow default bitwise copy construct and assignment + void operator=(const zoltanRenumber&); + zoltanRenumber(const zoltanRenumber&); + + +public: + + //- Runtime type information + TypeName("zoltan"); + + + // Constructors + + //- Construct given the renumber dictionary + zoltanRenumber(const dictionary& renumberDict); + + + //- Destructor + virtual ~zoltanRenumber() + {} + + + // Member Functions + + //- Return the order in which cells need to be visited, i.e. + // from ordered back to original cell label. + // This is only defined for geometric renumberMethods. + virtual labelList renumber(const pointField&) const + { + notImplemented("zoltanRenumber::renumber(const pointField&)"); + return labelList(0); + } + + //- Return the order in which cells need to be visited, i.e. + // from ordered back to original cell label. + // Use the mesh connectivity (if needed) + virtual labelList renumber + ( + const polyMesh& mesh, + const pointField& cc + ) const; + + //- Return the order in which cells need to be visited, i.e. + // from ordered back to original cell label. + // The connectivity is equal to mesh.cellCells() except + // - the connections are across coupled patches + virtual labelList renumber + ( + const labelListList& cellCells, + const pointField& cc + ) const + { + notImplemented + ( + "zoltanRenumber::renumber" + "(const labelListList& cellCellsconst pointField&)" + ); + return labelList(0); + } + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //