ENH: expression versions of Function1 and PatchFunction1 (#1709)

This commit is contained in:
Mark Olesen
2020-05-22 18:11:49 +02:00
parent 51c2329f97
commit 5105154b88
13 changed files with 952 additions and 96 deletions

View File

@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -34,6 +35,7 @@ Description
#include "fvCFD.H"
#include "Function1.H"
#include "scalarIndList.H"
#include "scalarField.H"
#include "IOdictionary.H"
#include "linearInterpolationWeights.H"
#include "splineInterpolationWeights.H"
@ -42,104 +44,121 @@ Description
int main(int argc, char *argv[])
{
argList::noParallel();
const word dictName("function1Properties");
argList::addBoolOption("all", "Test all functions in function1Properties");
argList::addArgument("function1");
argList::addArgument("...");
argList::addArgument("functionN");
argList::noMandatoryArgs();
#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
{
scalarField samples(4);
samples[0] = 0;
samples[1] = 1;
samples[2] = 2;
samples[3] = 3;
scalarField values(4);
values = 1.0;
//values[0] = 0.0;
//values[1] = 1.0;
{
scalarField samples({0, 1, 2, 3});
linearInterpolationWeights interpolator
//splineInterpolationWeights interpolator
(
samples
);
labelList indices;
scalarField weights;
scalarField values(4, scalar(1));
interpolator.integrationWeights(1.1, 1.2, indices, weights);
Pout<< "indices:" << indices << endl;
Pout<< "weights:" << weights << endl;
scalar baseSum = interpolator.weightedSum
(
weights,
scalarUIndList(values, indices)
);
Pout<< "baseSum=" << baseSum << nl << nl << endl;
// interpolator.integrationWeights(-0.01, 0, indices, weights);
// scalar partialSum = interpolator.weightedSum
// (
// weights,
// scalarUIndList(values, indices)
// );
// Pout<< "partialSum=" << partialSum << nl << nl << endl;
//
//
// interpolator.integrationWeights(-0.01, 1, indices, weights);
// //Pout<< "samples:" << samples << endl;
// //Pout<< "indices:" << indices << endl;
// //Pout<< "weights:" << weights << endl;
// scalar sum = interpolator.weightedSum
// (
// weights,
// scalarUIndList(values, indices)
// );
// Pout<< "integrand=" << sum << nl << nl << endl;
return 1;
}
IOdictionary function1Properties
(
IOobject
linearInterpolationWeights interpolator
//splineInterpolationWeights interpolator
(
"function1Properties",
runTime.constant(),
mesh,
IOobject::MUST_READ_IF_MODIFIED,
IOobject::NO_WRITE
)
);
samples
);
labelList indices;
scalarField weights;
autoPtr<Function1<scalar>> function1
(
Function1<scalar>::New
interpolator.integrationWeights(1.1, 1.2, indices, weights);
Pout<< "indices:" << indices << nl
<< "weights:" << weights << nl;
scalar baseSum = interpolator.weightedSum
(
"function1",
function1Properties
)
);
weights,
scalarUIndList(values, indices)
);
Pout<< "baseSum=" << baseSum << nl << nl << endl;
scalar x0 = function1Properties.get<scalar>("x0");
scalar x1 = function1Properties.get<scalar>("x1");
// interpolator.integrationWeights(-0.01, 0, indices, weights);
// scalar partialSum = interpolator.weightedSum
// (
// weights,
// scalarUIndList(values, indices)
// );
// Pout<< "partialSum=" << partialSum << nl << nl << endl;
Info<< "Data entry type: " << function1().type() << nl << endl;
// interpolator.integrationWeights(-0.01, 1, indices, weights);
// //Pout<< "samples:" << samples << endl;
// //Pout<< "indices:" << indices << endl;
// //Pout<< "weights:" << weights << endl;
// scalar sum = interpolator.weightedSum
// (
// weights,
// scalarUIndList(values, indices)
// );
// Pout<< "integrand=" << sum << nl << nl << endl;
}
Info<< "Inputs" << nl
<< " x0 = " << x0 << nl
<< " x1 = " << x1 << nl
<< endl;
if (args.found("all") || args.size() > 1)
{
#include "setConstantRunTimeDictionaryIO.H"
Info<< "Interpolation" << nl
<< " f(x0) = " << function1().value(x0) << nl
<< " f(x1) = " << function1().value(x1) << nl
<< endl;
IOdictionary propsDict(dictIO);
Info<< "Integration" << nl
<< " int(f(x)) lim(x0->x1) = " << function1().integrate(x0, x1) << nl
<< endl;
const scalarField xvals(propsDict.lookup("x"));
Info<< "Entries" << flatOutput(propsDict.toc()) << nl << nl;
Info<< "Inputs" << nl
<< " x = " << xvals << nl
<< endl;
DynamicList<word> functionNames;
auto nameFilter = [](const word& val)
{
return !(val == "x" || val.ends_with("Coeffs"));
};
if (args.found("all"))
{
for (const word& f : propsDict.toc())
{
if (nameFilter(f))
{
functionNames.append(f);
}
}
}
else
{
for (label argi=1; argi < args.size(); ++argi)
{
functionNames.append(args[argi]);
}
}
for (const word& funName : functionNames)
{
auto function1 = Function1<scalar>::New(funName, propsDict);
// Info<< "Data entry type: " << function1().type() << nl;
Info<< "////" << nl;
function1().writeData(Info);
Info<< nl;
Info<< "Values" << nl;
for (const scalar& x : xvals)
{
Info<< " f(" << x << ") = " << function1().value(x) << nl;
}
Info<< endl;
}
}
return 0;
}

View File

@ -0,0 +1,64 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v1912 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object function1Properties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// The 'x' values for evaluation
x
(
0
0.25
0.5
0.75
1
);
function1 table
(
(0 0)(10 1)
);
function2
{
type expression;
expression #{ sqr(arg()) #};
}
function2b expression;
function2bCoeffs
{
type expression;
expression #{ sqr(arg()) #};
}
stepf1
{
type step;
start 0.24;
duration 0.5;
}
rampf1
{
type linearRamp;
start 0.24;
duration 0.5;
}
// ************************************************************************* //

View File

@ -10,16 +10,17 @@ FoamFile
version 2.0;
format ascii;
class dictionary;
location "constant";
object function1Properties;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
x0 0.5;
x1 1;
application none;
deltaT 1;
function1 table ((0 0)(10 1));
writeControl timeStep;
writeInterval 10;
// ************************************************************************* //