mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
codedFunctionObject: Added the "codeWrite" entry
for the "write" function for consistency.
The previous method of using the "code" entry for the "write"
function was inconsistent and very confusing.
148 lines
3.9 KiB
C++
148 lines
3.9 KiB
C++
/*--------------------------------*- C++ -*----------------------------------*\
|
|
| ========= | |
|
|
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
|
| \\ / O peration | Version: dev |
|
|
| \\ / A nd | Web: www.OpenFOAM.org |
|
|
| \\/ M anipulation | |
|
|
\*---------------------------------------------------------------------------*/
|
|
FoamFile
|
|
{
|
|
version 2.0;
|
|
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
|
|
{
|
|
difference
|
|
{
|
|
// Load the library containing the 'coded' functionObject
|
|
libs ("libutilityFunctionObjects.so");
|
|
|
|
type coded;
|
|
|
|
// Name of on-the-fly generated functionObject
|
|
redirectType error;
|
|
|
|
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();
|
|
#};
|
|
}
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|