Files
OpenFOAM-12/test/dictionary/testCalcNewton

117 lines
2.4 KiB
C++

/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: dev
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
object testCalcNewton;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Find the root of f(x) = x + B*x/sqrt(1 + sqr(x)) - A
// using Newton-Raphson iteration
A 1;
B 1;
x #calc
#{
// Lookup the coefficients
const scalar A = $A;
const scalar B = $B;
// Initial guess for x
scalar x = 0;
scalar x0 = x;
do
{
// Store the previous iteration x for the convergence check
x0 = x;
// Temporary sub-function evaluations
const scalar f1 = 1 + sqr(x);
const scalar f2 = sqrt(f1);
// Evaluate the function
const scalar f = x + B*x/f2 - A;
// Evaluate the derivative
const scalar df = 1 + B/(f1*f2);
// Update x
x = x0 - f/df;
// Test for convergence
} while (mag(x - x0) > 1e-6);
os << x;
#};
// Write a x-y data for plotting with
// gnuplot -e 'plot "fx.xy" us 1:2 title "f(x)" with lines; pause mouse close'
x0 -2; // Start x
xn 2; // End x
n 101; // Number of x increments
y #codeStream
{
code
#{
// Lookup the coefficients
const scalar A = $A;
const scalar B = $B;
const scalar x0 = $x0;
const scalar xn = $xn;
const int n = $n;
const scalar deltax = (xn - x0)/(n - 1);
Field<scalar> x(n);
Field<scalar> fx(n);
forAll(x, i)
{
x[i] = x0 + i*deltax;
fx[i] = x[i] + B*x[i]/sqrt(1 + sqr(x[i])) - A;
}
// Write the x-y data
setWriter::New("raw")->write
(
".",
"fx",
coordSet(true,"x", x),
"f(x)",
fx
);
#};
codeInclude
#{
#include "setWriter.H"
#};
codeOptions
#{
-I$(LIB_SRC)/sampling/lnInclude
#};
codeLibs
#{
-lsampling
#};
};
#remove y
// ************************************************************************* //