diff --git a/applications/solvers/basic/potentialFoam/createFields.H b/applications/solvers/basic/potentialFoam/createFields.H index ef3b220257fbc7864f1fd2b9eb6481d09fa6af5c..dd6d1db04a0a7fcf60f49cb8afa93b87f1512135 100644 --- a/applications/solvers/basic/potentialFoam/createFields.H +++ b/applications/solvers/basic/potentialFoam/createFields.H @@ -1,21 +1,4 @@ - Info<< "Reading field p\n" << endl; - volScalarField p - ( - IOobject - ( - "p", - runTime.timeName(), - mesh, - IOobject::MUST_READ, - IOobject::NO_WRITE - ), - mesh - ); - - p = dimensionedScalar("zero", p.dimensions(), 0.0); - - - Info<< "Reading field U\n" << endl; + Info<< "Reading velocity field U\n" << endl; volVectorField U ( IOobject @@ -51,12 +34,65 @@ } - label pRefCell = 0; - scalar pRefValue = 0.0; + // Default name for the pressure field + word pName("p"); + + // Update name of the pressure field from the command-line option + args.optionReadIfPresent("pName", pName); + + // Infer the pressure BCs from the velocity BCs + wordList pBCTypes + ( + U.boundaryField().size(), + fixedValueFvPatchScalarField::typeName + ); + + forAll(U.boundaryField(), patchi) + { + if (U.boundaryField()[patchi].fixesValue()) + { + pBCTypes[patchi] = zeroGradientFvPatchScalarField::typeName; + } + } + + Info<< "Constructing pressure field " << pName << nl << endl; + volScalarField p + ( + IOobject + ( + pName, + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + mesh, + dimensionedScalar(pName, sqr(dimVelocity), 0), + pBCTypes + ); + + Info<< "Constructing velocity potential field Phi\n" << endl; + volScalarField Phi + ( + IOobject + ( + "Phi", + runTime.timeName(), + mesh, + IOobject::READ_IF_PRESENT, + IOobject::NO_WRITE + ), + mesh, + dimensionedScalar("Phi", dimLength*dimVelocity, 0), + p.boundaryField().types() + ); + + label PhiRefCell = 0; + scalar PhiRefValue = 0; setRefCell ( - p, - potentialFlow, - pRefCell, - pRefValue + Phi, + potentialFlow.dict(), + PhiRefCell, + PhiRefValue ); diff --git a/applications/solvers/basic/potentialFoam/potentialFoam.C b/applications/solvers/basic/potentialFoam/potentialFoam.C index b4951e5b0c96ecc3f7005706431f0914c5dc84e4..37e613b7e2b57a83803b07dbe1f3be74153e326d 100644 --- a/applications/solvers/basic/potentialFoam/potentialFoam.C +++ b/applications/solvers/basic/potentialFoam/potentialFoam.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -25,29 +25,48 @@ Application potentialFoam Description - Simple potential flow solver which can be used to generate starting fields - for full Navier-Stokes codes. + Potential flow solver which solves for the velocity potential + from which the flux-field is obtained and velocity field by reconstructing + the flux. + + This application is particularly useful to generate starting fields for + Navier-Stokes codes. \*---------------------------------------------------------------------------*/ #include "fvCFD.H" #include "fvIOoptionList.H" +#include "pisoControl.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { - argList::addBoolOption("writep", "write the final pressure field"); + argList::addOption + ( + "pName", + "pName", + "Name of the pressure field" + ); + argList::addBoolOption ( "initialiseUBCs", - "initialise U boundary conditions" + "Initialise U boundary conditions" + ); + + argList::addBoolOption + ( + "writePhi", + "Write the velocity potential field" ); #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" - #include "readControls.H" + + pisoControl potentialFlow(mesh, "potentialFlow"); + #include "createFields.H" #include "createFvOptions.H" @@ -63,55 +82,47 @@ int main(int argc, char *argv[]) adjustPhi(phi, U, p); - - for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++) + // Non-orthogonal velocity potential corrector loop + while (potentialFlow.correctNonOrthogonal()) { - fvScalarMatrix pEqn + fvScalarMatrix PhiEqn ( - fvm::laplacian - ( - dimensionedScalar - ( - "1", - dimTime/p.dimensions()*dimensionSet(0, 2, -2, 0, 0), - 1 - ), - p - ) + fvm::laplacian(dimensionedScalar("1", dimless, 1), Phi) == fvc::div(phi) ); - pEqn.setReference(pRefCell, pRefValue); - pEqn.solve(); + PhiEqn.setReference(PhiRefCell, PhiRefValue); + PhiEqn.solve(); - if (nonOrth == nNonOrthCorr) + if (potentialFlow.finalNonOrthogonalIter()) { - phi -= pEqn.flux(); + phi -= PhiEqn.flux(); } } fvOptions.makeAbsolute(phi); - Info<< "continuity error = " + Info<< "Continuity error = " << mag(fvc::div(phi))().weightedAverage(mesh.V()).value() << endl; U = fvc::reconstruct(phi); U.correctBoundaryConditions(); - Info<< "Interpolated U error = " + Info<< "Interpolated velocity error = " << (sqrt(sum(sqr((fvc::interpolate(U) & mesh.Sf()) - phi))) /sum(mesh.magSf())).value() << endl; - // Force the write + // Write U and phi U.write(); phi.write(); - if (args.optionFound("writep")) + // Optionally write Phi + if (args.optionFound("writePhi")) { - p.write(); + Phi.write(); } runTime.functionObjects().end(); diff --git a/tutorials/basic/potentialFoam/cylinder/Allrun b/tutorials/basic/potentialFoam/cylinder/Allrun index c306dd0ef61dda77095e8828a2aa078f3959a4c4..74a2fc93fb5c534cce3635408579acc8830712a3 100755 --- a/tutorials/basic/potentialFoam/cylinder/Allrun +++ b/tutorials/basic/potentialFoam/cylinder/Allrun @@ -6,26 +6,6 @@ cd ${0%/*} || exit 1 # Run from this directory application=`getApplication` - -# This case uses the #codeStream which is disabled by default. Enable for -# just this case. -MAIN_CONTROL_DICT=`foamEtcFile controlDict` -if [ -f "$MAIN_CONTROL_DICT" ] -then - echo "Modifying ${MAIN_CONTROL_DICT} to enable allowSystemOperations" - - # Clean up on termination and on Ctrl-C - trap 'mv ${MAIN_CONTROL_DICT}.$$ ${MAIN_CONTROL_DICT} 2>/dev/null; exit 0' \ - EXIT TERM INT - cp ${MAIN_CONTROL_DICT} ${MAIN_CONTROL_DICT}.$$ - - echo "Enabling allowSystemOperations in ${MAIN_CONTROL_DICT}." - - sed \ - -e s/"\(allowSystemOperations[ \t]*\)\([0-9]\);"/"\1 1;"/g \ - ${MAIN_CONTROL_DICT}.$$ > ${MAIN_CONTROL_DICT} -fi - cp -r 0.org 0 > /dev/null 2>&1 runApplication blockMesh runApplication $application diff --git a/tutorials/basic/potentialFoam/cylinder/system/fvSchemes b/tutorials/basic/potentialFoam/cylinder/system/fvSchemes index ed633c033c5861d60411a916f291e2eb1282f35e..b3b176d949a83c4486c52bd54c0781b403504c3a 100644 --- a/tutorials/basic/potentialFoam/cylinder/system/fvSchemes +++ b/tutorials/basic/potentialFoam/cylinder/system/fvSchemes @@ -48,7 +48,7 @@ snGradSchemes fluxRequired { default no; - p ; + Phi ; } diff --git a/tutorials/basic/potentialFoam/cylinder/system/fvSolution b/tutorials/basic/potentialFoam/cylinder/system/fvSolution index a5d2d6481d89d02da1f18c1032f6d0baa6fbc2fa..9e1ab1b2b403b7c51b3416da3e814d7dc8b55dac 100644 --- a/tutorials/basic/potentialFoam/cylinder/system/fvSolution +++ b/tutorials/basic/potentialFoam/cylinder/system/fvSolution @@ -17,7 +17,7 @@ FoamFile solvers { - p + Phi { solver PCG; preconditioner DIC; diff --git a/tutorials/basic/potentialFoam/pitzDaily/system/fvSchemes b/tutorials/basic/potentialFoam/pitzDaily/system/fvSchemes index 076bce55b71f8d5797b4bb4d79cad9398b908181..b2334a206c9c7c0e385ee73e73fa1b619362d78d 100644 --- a/tutorials/basic/potentialFoam/pitzDaily/system/fvSchemes +++ b/tutorials/basic/potentialFoam/pitzDaily/system/fvSchemes @@ -48,7 +48,7 @@ snGradSchemes fluxRequired { default no; - p ; + Phi ; } diff --git a/tutorials/basic/potentialFoam/pitzDaily/system/fvSolution b/tutorials/basic/potentialFoam/pitzDaily/system/fvSolution index 329a6d2eecba46dc927fff788dc34f63113ff38d..3565bddf3718b5e45146bf27370edffbe42a1832 100644 --- a/tutorials/basic/potentialFoam/pitzDaily/system/fvSolution +++ b/tutorials/basic/potentialFoam/pitzDaily/system/fvSolution @@ -17,7 +17,7 @@ FoamFile solvers { - p + Phi { solver PCG; preconditioner DIC; diff --git a/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSchemes b/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSchemes index c6c8fbf6f8d2f4b4630c8e4cf2ff9ee24c94e8ed..33a55391e4a81037f55ee389c2d95a8ae284319a 100644 --- a/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSchemes +++ b/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSchemes @@ -55,7 +55,8 @@ snGradSchemes fluxRequired { default no; - p ; + p; + Phi; } wallDist diff --git a/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSolution b/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSolution index de4bd756b96b610cd4fdaed26887a6ccb1266c1a..5eeddfb8fd02b449c8b05f680a55a9e6d4fe30de 100644 --- a/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSolution +++ b/tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system/fvSolution @@ -38,6 +38,11 @@ solvers relTol 0; }; + Phi + { + $p; + } + "(U|nuTilda)" { solver smoothSolver; diff --git a/tutorials/incompressible/simpleFoam/motorBike/system/fvSchemes b/tutorials/incompressible/simpleFoam/motorBike/system/fvSchemes index cf8155eeaaa014761b76d7401dae31b0746db221..81136adfaa3a2befb6a79a30787d2fe40f184a6d 100644 --- a/tutorials/incompressible/simpleFoam/motorBike/system/fvSchemes +++ b/tutorials/incompressible/simpleFoam/motorBike/system/fvSchemes @@ -53,6 +53,7 @@ fluxRequired { default no; p; + Phi; } wallDist diff --git a/tutorials/incompressible/simpleFoam/motorBike/system/fvSolution b/tutorials/incompressible/simpleFoam/motorBike/system/fvSolution index 55c9820427db82757efd4a3df9fb7909bdc31cb7..4f0f515acac7065c1e4e0040bff3ec3e042d6b4b 100644 --- a/tutorials/incompressible/simpleFoam/motorBike/system/fvSolution +++ b/tutorials/incompressible/simpleFoam/motorBike/system/fvSolution @@ -30,6 +30,11 @@ solvers mergeLevels 1; } + Phi + { + $p; + } + U { solver smoothSolver; diff --git a/tutorials/incompressible/simpleFoam/pipeCyclic/Allrun b/tutorials/incompressible/simpleFoam/pipeCyclic/Allrun index 0dc5142f92c853c426acfa9c1022b1502cc3b2b7..28f5ac16f87f4c5f7e6247cd14e2952ea2630f85 100755 --- a/tutorials/incompressible/simpleFoam/pipeCyclic/Allrun +++ b/tutorials/incompressible/simpleFoam/pipeCyclic/Allrun @@ -7,26 +7,6 @@ cd ${0%/*} || exit 1 # Run from this directory # Get application directory application=`getApplication` -# This case uses the #codeStream which is disabled by default. Enable for -# just this case. -MAIN_CONTROL_DICT=`foamEtcFile controlDict` -if [ -f "$MAIN_CONTROL_DICT" ] -then - echo "Modifying ${MAIN_CONTROL_DICT} to enable allowSystemOperations" - - # Clean up on termination and on Ctrl-C - trap 'mv ${MAIN_CONTROL_DICT}.$$ ${MAIN_CONTROL_DICT} 2>/dev/null; exit 0' \ - EXIT TERM INT - cp ${MAIN_CONTROL_DICT} ${MAIN_CONTROL_DICT}.$$ - - echo "Enabling allowSystemOperations in ${MAIN_CONTROL_DICT}." - - sed \ - -e s/"\(allowSystemOperations[ \t]*\)\([0-9]\);"/"\1 1;"/g \ - ${MAIN_CONTROL_DICT}.$$ > ${MAIN_CONTROL_DICT} -fi - - runApplication blockMesh runApplication topoSet runApplication refineHexMesh c0 -overwrite diff --git a/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSchemes b/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSchemes index fb6d354d17ea27b960b4c50944dc60e1b44b0e43..082adfea4bcb4e86238a05e08a81903b1d92bf7b 100644 --- a/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSchemes +++ b/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSchemes @@ -58,6 +58,7 @@ fluxRequired { default no; p; + Phi; } wallDist diff --git a/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSolution b/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSolution index be9c35449c077f7313f807b84432e32fc3c28950..9ef58598dd7359930477f82d628b9644aff6d14c 100644 --- a/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSolution +++ b/tutorials/lagrangian/reactingParcelFoam/verticalChannel/system/fvSolution @@ -68,6 +68,11 @@ solvers relTol 0; } + Phi + { + $p; + } + "(Yi|O2|N2|H2O)" { solver PBiCG; @@ -88,7 +93,7 @@ solvers potentialFlow { - // used for potentialFoam initialisation + // Used for potentialFoam initialisation nNonOrthogonalCorrectors 5; } diff --git a/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSchemes b/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSchemes index 2091a6975945faddd7b7661b7aaad1ebac1bc354..1e024443b85abb83834733748968c17cadf591ab 100644 --- a/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSchemes +++ b/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSchemes @@ -59,6 +59,7 @@ fluxRequired { default no; p; + Phi; } wallDist diff --git a/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSolution b/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSolution index a1c90c36c68a11d7c95089c81110e04e06f3cda0..f442d38a5827e77d970e2a269da197048c50181d 100644 --- a/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSolution +++ b/tutorials/lagrangian/simpleReactingParcelFoam/verticalChannel/system/fvSolution @@ -37,6 +37,11 @@ solvers maxIter 50; }; + Phi + { + $p; + } + "(U|Yi|h|k|omega)" { solver smoothSolver;