/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v2012 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; 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 { name error; type coded; libs (utilityFunctionObjects); 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", dimVelocity, 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", dimLength, 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(); #}; } } // ************************************************************************* //