diff --git a/applications/test/incGamma/Make/files b/applications/test/incGamma/Make/files new file mode 100644 index 0000000000..48f0678e7f --- /dev/null +++ b/applications/test/incGamma/Make/files @@ -0,0 +1,3 @@ +Test-incGamma.C + +EXE = $(FOAM_USER_APPBIN)/Test-incGamma diff --git a/applications/test/incGamma/Make/options b/applications/test/incGamma/Make/options new file mode 100644 index 0000000000..83bf5ebcf2 --- /dev/null +++ b/applications/test/incGamma/Make/options @@ -0,0 +1,5 @@ +EXE_INC = \ + -I$(LIB_SRC)/sampling/lnInclude + +EXE_LIBS = \ + -lsampling diff --git a/applications/test/incGamma/Test-incGamma.C b/applications/test/incGamma/Test-incGamma.C new file mode 100644 index 0000000000..ebaf50bfd9 --- /dev/null +++ b/applications/test/incGamma/Test-incGamma.C @@ -0,0 +1,146 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2023 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-incGamma + +Description + This checks the consistency of incGamma and invIncGamma. It writes files + with columns containing values for different 'a' parameters. The + incGammaRatio_P.xy and invIncGammaRatio_P.xy files should generate the same + lines when the plot axis order is reversed. E.g., in gnuplot: + + plot "incGammaRatio_P.xy" us 1:5 w l, \ + "invIncGammaRatio_P.xy" us 5:1 w p + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "mathematicalConstants.H" +#include "rawSetWriter.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +using namespace Foam; +using namespace Foam::constant::mathematical; + +scalar grade(const scalar f) +{ + return (Foam::cos(pi*(1 - f)) + 1)/2; +} + +int main(int argc, char *argv[]) +{ + const scalarField as({0.25, 0.5, 1, 2, 4}); + + static const scalar nXs = 10000; + static const scalar xMax = 10; + static const scalar nPs = 100; + + wordList aNames(as.size()); + forAll(as, ai) + { + aNames[ai] = name(as[ai]); + } + + scalarField xs(nXs); + forAll(xs, xi) + { + const scalar f = grade(grade(scalar(xi)/(nXs - 1))); + xs[xi] = (1 - f)*small + f*xMax; + } + + scalarField Ps(nPs); + forAll(Ps, Pi) + { + const scalar f = grade(grade(scalar(Pi)/(nPs - 1))); + Ps[Pi] = (1 - f)*rootVSmall + f*(1 - 1e-4); + } + + #define DeclareTypePXs(Type, nullArg) \ + PtrList> Type##Ps(as.size()); \ + PtrList> Type##PErrors(as.size()); \ + PtrList> Type##Xs(as.size()); + FOR_ALL_FIELD_TYPES(DeclareTypePXs); + #undef DeclareTypePXs + + forAll(as, ai) + { + scalarPs.set(ai, new scalarField(nXs)); + scalarPErrors.set(ai, new scalarField(nXs)); + forAll(xs, xi) + { + const scalar P = incGammaRatio_P(as[ai], xs[xi]); + const scalar PStar = + incGammaRatio_P(as[ai], invIncGammaRatio_P(as[ai], P)); + scalarPs[ai][xi] = P; + scalarPErrors[ai][xi] = mag(P - PStar); + } + } + forAll(as, ai) + { + scalarXs.set(ai, new scalarField(nPs)); + forAll(Ps, Pi) + { + scalarXs[ai][Pi] = invIncGammaRatio_P(as[ai], Ps[Pi]); + } + } + + rawSetWriter(IOstream::ASCII, IOstream::UNCOMPRESSED).write + ( + ".", + "incGammaRatio_P", + coordSet(true, "x", xs), + aNames + #define TypePsParameter(Type, nullArg) , Type##Ps + FOR_ALL_FIELD_TYPES(TypePsParameter) + #undef TypePsParameter + ); + rawSetWriter(IOstream::ASCII, IOstream::UNCOMPRESSED).write + ( + ".", + "incGammaRatio_PError", + coordSet(true, "x", xs), + aNames + #define TypePErrorsParameter(Type, nullArg) , Type##PErrors + FOR_ALL_FIELD_TYPES(TypePErrorsParameter) + #undef TypePErrorsParameter + ); + rawSetWriter(IOstream::ASCII, IOstream::UNCOMPRESSED).write + ( + ".", + "invIncGammaRatio_P", + coordSet(true, "P", Ps), + aNames + #define TypeXsParameter(Type, nullArg) , Type##Xs + FOR_ALL_FIELD_TYPES(TypeXsParameter) + #undef TypeXsParameter + ); + + Info<< nl << "End" << nl << endl; + + return 0; +} + + +// ************************************************************************* //