mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-12-28 03:37:59 +00:00
The Phi field is read if available otherwise created automatically with boundary conditions obtained automatically from the pressure field if available (with optional name) otherwise inferred from the velocity field. Phi Laplacian scheme and solver specification are required. See tutorials for examples.
141 lines
3.8 KiB
C
141 lines
3.8 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM.
|
|
|
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
Application
|
|
potentialFoam
|
|
|
|
Description
|
|
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::addOption
|
|
(
|
|
"pName",
|
|
"pName",
|
|
"Name of the pressure field"
|
|
);
|
|
|
|
argList::addBoolOption
|
|
(
|
|
"initialiseUBCs",
|
|
"Initialise U boundary conditions"
|
|
);
|
|
|
|
argList::addBoolOption
|
|
(
|
|
"writePhi",
|
|
"Write the velocity potential field"
|
|
);
|
|
|
|
#include "setRootCase.H"
|
|
#include "createTime.H"
|
|
#include "createMesh.H"
|
|
|
|
pisoControl potentialFlow(mesh, "potentialFlow");
|
|
|
|
#include "createFields.H"
|
|
#include "createFvOptions.H"
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
Info<< nl << "Calculating potential flow" << endl;
|
|
|
|
// Since solver contains no time loop it would never execute
|
|
// function objects so do it ourselves
|
|
runTime.functionObjects().start();
|
|
|
|
fvOptions.makeRelative(phi);
|
|
|
|
adjustPhi(phi, U, p);
|
|
|
|
// Non-orthogonal velocity potential corrector loop
|
|
while (potentialFlow.correctNonOrthogonal())
|
|
{
|
|
fvScalarMatrix PhiEqn
|
|
(
|
|
fvm::laplacian(dimensionedScalar("1", dimless, 1), Phi)
|
|
==
|
|
fvc::div(phi)
|
|
);
|
|
|
|
PhiEqn.setReference(PhiRefCell, PhiRefValue);
|
|
PhiEqn.solve();
|
|
|
|
if (potentialFlow.finalNonOrthogonalIter())
|
|
{
|
|
phi -= PhiEqn.flux();
|
|
}
|
|
}
|
|
|
|
fvOptions.makeAbsolute(phi);
|
|
|
|
Info<< "Continuity error = "
|
|
<< mag(fvc::div(phi))().weightedAverage(mesh.V()).value()
|
|
<< endl;
|
|
|
|
U = fvc::reconstruct(phi);
|
|
U.correctBoundaryConditions();
|
|
|
|
Info<< "Interpolated velocity error = "
|
|
<< (sqrt(sum(sqr((fvc::interpolate(U) & mesh.Sf()) - phi)))
|
|
/sum(mesh.magSf())).value()
|
|
<< endl;
|
|
|
|
// Write U and phi
|
|
U.write();
|
|
phi.write();
|
|
|
|
// Optionally write Phi
|
|
if (args.optionFound("writePhi"))
|
|
{
|
|
Phi.write();
|
|
}
|
|
|
|
runTime.functionObjects().end();
|
|
|
|
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
|
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
|
<< nl << endl;
|
|
|
|
Info<< "End\n" << endl;
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|