/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2018-2022 OpenCFD Ltd. ------------------------------------------------------------------------------- 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-vector Description Some simple tests for vector \*---------------------------------------------------------------------------*/ #include "vectorField.H" #include "IOstreams.H" #include #include using namespace Foam; void printInfo(const vector& vec) { Info<< "vector : " << vec << nl << "magSqr : " << magSqr(vec) << nl; Info<< "component" << " max:" << cmptMax(vec) << " sum:" << cmptSum(vec) << " prod:" << cmptProduct(vec) << " mag:" << cmptMag(vec) << " magSqr:" << cmptMagSqr(vec) << nl << nl; } void doTest(vector& vec1, vector& vec2) { Info<<"normalised(vector1): " << normalised(vec1) << nl; Info<<"vector1: " << vec1 << nl; vec1.normalise(); Info<<"normalised: " << vec1 << nl; vector vecsmall((1e-100 * vec1)); Info<<"small: " << vecsmall << nl; Info<<"small normalised: " << normalised(vecsmall) << nl; Info<<"small diff: " << (vecsmall.normalise() - vec1) << nl; vec1 *= 4.0; Info<< "scalar mult: " << vec1 << nl; Info<< "addition : " << (vec1 + vec1) << nl; printInfo(vec1); printInfo(vec2); Info<< "min of " << vec1 << " and " << vec2 << " = " << min(vec1, vec2) << nl << nl; } template void testIterator(const VecSpace& vs) { Info<< "size: " << vs.size() << " for:"; for (const auto& val : vs) { Info<< " " << val; } Info<< nl; } template void testData(const VecSpace& vs) { Info<< "size: " << vs.size() << " for:"; const auto* data = vs.cdata(); for ( const auto* endData = data + VecSpace::nComponents; data != endData; ++data ) { Info<< " " << *data; } Info<< nl; } template void testNormalise(Field& fld) { Info<< nl << pTraits::typeName << " Field" << nl << " orig: " << fld << nl; fld.normalise(); Info<< " norm: " << fld << nl; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Main program: int main(int argc, char *argv[]) { Info<<"normalised: " << vector(1,2,3).normalise() << nl; Info<<"normalised: " << vector::uniform(VSMALL).normalise() << nl; Info<<"normalised: " << vector::uniform(ROOTVSMALL).normalise() << nl; { vector vec1(0.5, 0.5, 0.5); vector vec2(0.5, 0.51, -0.5); doTest(vec1, vec2); testIterator(vec1); testIterator(vec2); testData(vec2); // Use STL algorithm(s) std::sort(vec2.begin(), vec2.end()); Info<< "sorted: " << vec2 << nl; std::shuffle(vec2.begin(), vec2.end(), std::default_random_engine()); Info<< "shuffled: " << vec2 << nl; } // Basic tests for fields { scalarField sfld1 ({ 0.0, 1.0, 2.0 }); testNormalise(sfld1); Field vfld1 ({ floatVector(0.0, 1.0, 2.0), floatVector(0, 0, floatScalarSMALL), floatVector(0, 0, floatScalarVSMALL), floatVector(0, 2, 1), }); testNormalise(vfld1); Field vfld2 ({ doubleVector(0.0, 1.0, 2.0), doubleVector(0, 0, doubleScalarSMALL), doubleVector(0, 0, doubleScalarVSMALL), doubleVector(0, 2, 1), }); testNormalise(vfld2); } Info<< "\nEnd\n" << nl; return 0; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //