/*--------------------------------*- C++ -*----------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org \\ / A nd | Version: 7 \\/ 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 { error { // Load the library containing the 'coded' functionObject libs ("libutilityFunctionObjects.so"); type coded; // Name of on-the-fly generated functionObject name error; codeEnd #{ // Lookup U Info<< "Looking up field U\n" << endl; const volVectorField& U = mesh().lookupObject("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()); 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()); 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(); #}; } } // ************************************************************************* //