diff --git a/applications/test/Circulator/Make/files b/applications/test/Circulator/Make/files new file mode 100644 index 0000000000..b6a4e63dc2 --- /dev/null +++ b/applications/test/Circulator/Make/files @@ -0,0 +1,3 @@ +Test-Circulator.C + +EXE = $(FOAM_USER_APPBIN)/Test-Circulator diff --git a/applications/test/Circulator/Make/options b/applications/test/Circulator/Make/options new file mode 100644 index 0000000000..e69de29bb2 diff --git a/applications/test/Circulator/Test-Circulator.C b/applications/test/Circulator/Test-Circulator.C new file mode 100644 index 0000000000..19a21f6b79 --- /dev/null +++ b/applications/test/Circulator/Test-Circulator.C @@ -0,0 +1,268 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 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 . + +Application + Test-circulator + +Description + +\*---------------------------------------------------------------------------*/ + +#include "List.H" +#include "ListOps.H" +#include "face.H" +#include "circulator.H" +#include "const_circulator.H" + + +using namespace Foam; + + +// return +// 0: no match +// +1: identical +// -1: same face, but different orientation +label compare(const face& a, const face& b) +{ + // Basic rule: we assume that the sequence of labels in each list + // will be circular in the same order (but not necessarily in the + // same direction or from the same starting point). + + // Trivial reject: faces are different size + label sizeA = a.size(); + label sizeB = b.size(); + + if (sizeA != sizeB || sizeA == 0) + { + return 0; + } + + const_circulator aCirc(a); + const_circulator bCirc(b); + + // Rotate face b until its element matches the starting element of face a. + do + { + if (aCirc() == bCirc()) + { + // Set bCirc fulcrum to its iterator and increment the iterators + bCirc.setFulcrumToIterator(); + ++aCirc; + ++bCirc; + + break; + } + } while (bCirc.circulate(CirculatorBase::CLOCKWISE)); + + // Look forwards around the faces for a match + do + { + if (aCirc() != bCirc()) + { + break; + } + } + while + ( + aCirc.circulate(CirculatorBase::CLOCKWISE), + bCirc.circulate(CirculatorBase::CLOCKWISE) + ); + + // If the circulator has stopped then faces a and b matched. + if (!aCirc.circulate()) + { + return 1; + } + else + { + // Reset the circulators back to their fulcrum + aCirc.setIteratorToFulcrum(); + bCirc.setIteratorToFulcrum(); + ++aCirc; + --bCirc; + } + + // Look backwards around the faces for a match + do + { + if (aCirc() != bCirc()) + { + break; + } + } + while + ( + aCirc.circulate(CirculatorBase::CLOCKWISE), + bCirc.circulate(CirculatorBase::ANTICLOCKWISE) + ); + + // If the circulator has stopped then faces a and b matched. + if (!aCirc.circulate()) + { + return -1; + } + + return 0; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + Info<< "Test the implementation of a circular iterator" << nl << endl; + + Info<< "Test const circulator. First go forwards, then backwards." + << nl << endl; + + face f(identity(4)); + + const_circulator cStart(f); + + if (cStart.size()) do + { + Info<< "Iterate forwards over face (prev/curr/next) : " + << cStart.prev() << " / " << cStart() << " / " << cStart.next() + << endl; + + } while (cStart.circulate(CirculatorBase::CLOCKWISE)); + + if (cStart.size()) do + { + Info<< "Iterate backwards over face : " << cStart() << endl; + + } while (cStart.circulate(CirculatorBase::ANTICLOCKWISE)); + + + Info<< nl << nl << "Test non-const circulator" << nl << endl; + + circulator cStart2(f); + + Info<< "Face before : " << f << endl; + + if (cStart2.size()) do + { + Info<< "Iterate forwards over face (prev/curr/next) : " + << cStart2.prev() << " / " << cStart2() << " / " << cStart2.next() + << endl; + + } while (cStart2.circulate(CirculatorBase::CLOCKWISE)); + + if (cStart2.size()) do + { + Info<< "Iterate forwards over face, adding 1 to each element : " + << cStart2(); + + cStart2() += 1; + + Info<< " -> " << cStart2() << endl; + } while (cStart2.circulate(CirculatorBase::CLOCKWISE)); + + Info<< "Face after : " << f << endl; + + + Info<< nl << nl << "Compare two faces: " << endl; + face a(identity(5)); + Info<< "Compare " << a << " and " << a << " Match = " << compare(a, a) + << endl; + + face b(reverseList(a)); + Info<< "Compare " << a << " and " << b << " Match = " << compare(a, b) + << endl; + + face c(a); + c[4] = 3; + Info<< "Compare " << a << " and " << c << " Match = " << compare(a, c) + << endl; + + face d(rotateList(a, 2)); + Info<< "Compare " << a << " and " << d << " Match = " << compare(a, d) + << endl; + + face g(labelList(5, 1)); + face h(g); + Info<< "Compare " << g << " and " << h << " Match = " << compare(g, h) + << endl; + + g[0] = 2; + h[3] = 2; + Info<< "Compare " << g << " and " << h << " Match = " << compare(g, h) + << endl; + + g[4] = 3; + h[4] = 3; + Info<< "Compare " << g << " and " << h << " Match = " << compare(g, h) + << endl; + + face face1(identity(1)); + Info<< "Compare " << face1 << " and " << face1 + << " Match = " << compare(face1, face1) << endl; + + Info<< nl << nl << "Zero face" << nl << endl; + + face fZero; + circulator cZero(fZero); + + if (cZero.size()) do + { + Info<< "Iterate forwards over face : " << cZero() << endl; + + } while (cZero.circulate(CirculatorBase::CLOCKWISE)); + + fZero = face(identity(5)); + + // circulator was invalidated so reset + cZero = circulator(fZero); + + do + { + Info<< "Iterate forwards over face : " << cZero() << endl; + + } while (cZero.circulate(CirculatorBase::CLOCKWISE)); + + + Info<< nl << nl << "Simultaneously go forwards/backwards over face " << f + << nl << endl; + + const_circulator circForward(f); + const_circulator circBackward(f); + + if (circForward.size() && circBackward.size()) do + { + Info<< "Iterate over face forwards : " << circForward() + << ", backwards : " << circBackward() << endl; + } + while + ( + circForward.circulate(CirculatorBase::CLOCKWISE), + circBackward.circulate(CirculatorBase::ANTICLOCKWISE) + ); + + Info<< "\nEnd\n" << endl; + + return 0; +} + + +// ************************************************************************* // diff --git a/applications/test/ListOps/Make/files b/applications/test/ListOps/Make/files new file mode 100644 index 0000000000..645600a709 --- /dev/null +++ b/applications/test/ListOps/Make/files @@ -0,0 +1,2 @@ +Test-ListOps.C +EXE = $(FOAM_USER_APPBIN)/Test-ListOps diff --git a/applications/test/ListOps/Make/options b/applications/test/ListOps/Make/options new file mode 100644 index 0000000000..9e79e9d733 --- /dev/null +++ b/applications/test/ListOps/Make/options @@ -0,0 +1,3 @@ +EXE_INC = /*-DFULLDEBUG -O0 -g*/ \ + +EXE_LIBS = \ diff --git a/applications/test/ListOps/Test-ListOps.C b/applications/test/ListOps/Test-ListOps.C new file mode 100644 index 0000000000..f6e5695164 --- /dev/null +++ b/applications/test/ListOps/Test-ListOps.C @@ -0,0 +1,120 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 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 . + +Application + Test-ListOps + +Description + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "List.H" +#include "SubList.H" +#include "ListOps.H" +#include "face.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + Info<< "Test Rotations:" << nl << endl; + + List