The FOAM file format has not changed from version 2.0 in many years and so there is no longer a need for the 'version' entry in the FoamFile header to be required and to reduce unnecessary clutter it is now optional, defaulting to the current file format 2.0.
144 lines
3.6 KiB
C++
144 lines
3.6 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;
|
|
location "system";
|
|
object controlDict;
|
|
}
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
application potentialFoam;
|
|
|
|
startFrom latestTime;
|
|
|
|
startTime 0;
|
|
|
|
stopAt nextWrite;
|
|
|
|
endTime 1;
|
|
|
|
deltaT 1;
|
|
|
|
writeControl timeStep;
|
|
|
|
writeInterval 1;
|
|
|
|
purgeWrite 0;
|
|
|
|
writeFormat ascii;
|
|
|
|
writePrecision 6;
|
|
|
|
writeCompression off;
|
|
|
|
timeFormat general;
|
|
|
|
timePrecision 6;
|
|
|
|
runTimeModifiable true;
|
|
|
|
functions
|
|
{
|
|
error
|
|
{
|
|
// Load the library containing the 'coded' functionObject
|
|
libs ("libutilityFunctionObjects.so");
|
|
|
|
type coded;
|
|
|
|
codeEnd
|
|
#{
|
|
// Lookup U
|
|
Info<< "Looking up field U\n" << endl;
|
|
const volVectorField& U = mesh().lookupObject<volVectorField>("U");
|
|
|
|
Info<< "Reading inlet velocity uInfX\n" << endl;
|
|
|
|
scalar ULeft = 0.0;
|
|
label leftI = mesh().boundaryMesh().findPatchID("left");
|
|
const fvPatchVectorField& fvp = U.boundaryField()[leftI];
|
|
if (fvp.size())
|
|
{
|
|
ULeft = fvp[0].x();
|
|
}
|
|
reduce(ULeft, maxOp<scalar>());
|
|
|
|
dimensionedScalar uInfX
|
|
(
|
|
"uInfx",
|
|
dimensionSet(0, 1, -1, 0, 0),
|
|
ULeft
|
|
);
|
|
|
|
Info << "U at inlet = " << uInfX.value() << " m/s" << endl;
|
|
|
|
|
|
scalar magCylinder = 0.0;
|
|
label cylI = mesh().boundaryMesh().findPatchID("cylinder");
|
|
const fvPatchVectorField& cylFvp = mesh().C().boundaryField()[cylI];
|
|
if (cylFvp.size())
|
|
{
|
|
magCylinder = mag(cylFvp[0]);
|
|
}
|
|
reduce(magCylinder, maxOp<scalar>());
|
|
|
|
dimensionedScalar radius
|
|
(
|
|
"radius",
|
|
dimensionSet(0, 1, 0, 0, 0),
|
|
magCylinder
|
|
);
|
|
|
|
Info << "Cylinder radius = " << radius.value() << " m" << endl;
|
|
|
|
volVectorField UA
|
|
(
|
|
IOobject
|
|
(
|
|
"UA",
|
|
mesh().time().timeName(),
|
|
U.mesh(),
|
|
IOobject::NO_READ,
|
|
IOobject::AUTO_WRITE
|
|
),
|
|
U
|
|
);
|
|
|
|
Info<< "\nEvaluating analytical solution" << endl;
|
|
|
|
const volVectorField& centres = UA.mesh().C();
|
|
volScalarField magCentres(mag(centres));
|
|
volScalarField theta(acos((centres & vector(1,0,0))/magCentres));
|
|
|
|
volVectorField cs2theta
|
|
(
|
|
cos(2*theta)*vector(1,0,0)
|
|
+ sin(2*theta)*vector(0,1,0)
|
|
);
|
|
|
|
UA = uInfX*(dimensionedVector(vector(1,0,0))
|
|
- pow((radius/magCentres),2)*cs2theta);
|
|
|
|
// Force writing of UA (since time has not changed)
|
|
UA.write();
|
|
|
|
volScalarField error("error", mag(U-UA)/mag(UA));
|
|
|
|
Info<<"Writing relative error in U to " << error.objectPath()
|
|
<< endl;
|
|
|
|
error.write();
|
|
#};
|
|
}
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|