potentialFoam: Upgrade to version in OpenFOAM-dev:
commit e593fef659bcd71028e0e66a70510de2c34888e2
Author: Henry <Henry>
Date: Thu Feb 19 19:05:17 2015 +0000
potentialFoam: Added new method to estimate the static pressure field from the velocity
Uses a form of the Euler equation in which only variation along the streamlines is considered
commit cdadf4865de4808d6fe5c2a7eb5f5deaefe83b66
Author: Henry <Henry>
Date: Sat Feb 14 11:03:37 2015 +0000
potentialFoam: Solve for velocity potential named Phi rather than using the pressure field for this purpose
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.
This commit is contained in:
parent
b24313ff16
commit
1f28b87185
19 changed files with 225 additions and 89 deletions
|
|
@ -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,
|
||||
Phi,
|
||||
potentialFlow,
|
||||
pRefCell,
|
||||
pRefValue
|
||||
PhiRefCell,
|
||||
PhiRefValue
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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,8 +25,12 @@ 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.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
|
|
@ -37,11 +41,35 @@ Description
|
|||
|
||||
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"
|
||||
);
|
||||
|
||||
argList::addBoolOption
|
||||
(
|
||||
"writep",
|
||||
"Calculate and write the pressure field"
|
||||
);
|
||||
|
||||
argList::addBoolOption
|
||||
(
|
||||
"withFunctionObjects",
|
||||
"execute functionObjects"
|
||||
);
|
||||
|
||||
#include "setRootCase.H"
|
||||
|
|
@ -63,54 +91,93 @@ int main(int argc, char *argv[])
|
|||
|
||||
adjustPhi(phi, U, p);
|
||||
|
||||
|
||||
// Non-orthogonal velocity potential corrector loop
|
||||
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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();
|
||||
|
||||
// Optionally write Phi
|
||||
if (args.optionFound("writePhi"))
|
||||
{
|
||||
Phi.write();
|
||||
}
|
||||
|
||||
// Calculate the pressure field
|
||||
if (args.optionFound("writep"))
|
||||
{
|
||||
Info<< nl << "Calculating approximate pressure field" << endl;
|
||||
|
||||
label pRefCell = 0;
|
||||
scalar pRefValue = 0.0;
|
||||
setRefCell
|
||||
(
|
||||
p,
|
||||
potentialFlow,
|
||||
pRefCell,
|
||||
pRefValue
|
||||
);
|
||||
|
||||
// Calculate the flow-direction filter tensor
|
||||
volScalarField magSqrU(magSqr(U));
|
||||
volSymmTensorField F(sqr(U)/(magSqrU + SMALL*average(magSqrU)));
|
||||
|
||||
// Calculate the divergence of the flow-direction filtered div(U*U)
|
||||
// Filtering with the flow-direction generates a more reasonable
|
||||
// pressure distribution in regions of high velocity gradient in the
|
||||
// direction of the flow
|
||||
volScalarField divDivUU
|
||||
(
|
||||
fvc::div
|
||||
(
|
||||
F & fvc::div(phi, U),
|
||||
"div(div(phi,U))"
|
||||
)
|
||||
);
|
||||
|
||||
// Solve a Poisson equation for the approximate pressure
|
||||
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
|
||||
{
|
||||
fvScalarMatrix pEqn
|
||||
(
|
||||
fvm::laplacian(p) + divDivUU
|
||||
);
|
||||
|
||||
pEqn.setReference(pRefCell, pRefValue);
|
||||
pEqn.solve();
|
||||
}
|
||||
|
||||
p.write();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -433,7 +433,13 @@ Foam::Time::Time
|
|||
graphFormat_("raw"),
|
||||
runTimeModifiable_(false),
|
||||
|
||||
functionObjects_(*this, !args.optionFound("noFunctionObjects"))
|
||||
functionObjects_
|
||||
(
|
||||
*this,
|
||||
argList::validOptions.found("withFunctionObjects")
|
||||
? args.optionFound("withFunctionObjects")
|
||||
: !args.optionFound("noFunctionObjects")
|
||||
)
|
||||
{
|
||||
libs_.open(controlDict_, "libs");
|
||||
|
||||
|
|
|
|||
|
|
@ -1,34 +1,14 @@
|
|||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # run from this directory
|
||||
cd ${0%/*} || exit 1 # Run from this directory
|
||||
|
||||
# Source tutorial run functions
|
||||
. $WM_PROJECT_DIR/bin/tools/RunFunctions
|
||||
|
||||
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
|
||||
runApplication $application -withFunctionObjects -writePhi -writep
|
||||
runApplication streamFunction
|
||||
|
||||
# ----------------------------------------------------------------- end-of-file
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: 2.3.0 |
|
||||
| \\ / O peration | Version: 2.3.x |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
|
@ -28,6 +28,8 @@ gradSchemes
|
|||
divSchemes
|
||||
{
|
||||
default none;
|
||||
div(phi,U) bounded Gauss linear;
|
||||
div(div(phi,U)) Gauss linear;
|
||||
}
|
||||
|
||||
laplacianSchemes
|
||||
|
|
@ -48,7 +50,7 @@ snGradSchemes
|
|||
fluxRequired
|
||||
{
|
||||
default no;
|
||||
p ;
|
||||
Phi ;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: 2.3.0 |
|
||||
| \\ / O peration | Version: 2.3.x |
|
||||
| \\ / A nd | Web: www.OpenFOAM.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
|
@ -17,12 +17,22 @@ FoamFile
|
|||
|
||||
solvers
|
||||
{
|
||||
Phi
|
||||
{
|
||||
solver GAMG;
|
||||
smoother DIC;
|
||||
cacheAgglomeration on;
|
||||
agglomerator faceAreaPair;
|
||||
nCellsInCoarsestLevel 10;
|
||||
mergeLevels 1;
|
||||
|
||||
tolerance 1e-06;
|
||||
relTol 0.01;
|
||||
}
|
||||
|
||||
p
|
||||
{
|
||||
solver PCG;
|
||||
preconditioner DIC;
|
||||
tolerance 1e-06;
|
||||
relTol 0;
|
||||
$Phi;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
#!/bin/sh
|
||||
cd ${0%/*} || exit 1 # run from this directory
|
||||
cd ${0%/*} || exit 1 # Run from this directory
|
||||
|
||||
# Source tutorial run functions
|
||||
. $WM_PROJECT_DIR/bin/tools/RunFunctions
|
||||
|
|
@ -8,7 +8,7 @@ application=`getApplication`
|
|||
|
||||
cp -r 0.org 0 > /dev/null 2>&1
|
||||
runApplication blockMesh
|
||||
runApplication $application
|
||||
runApplication $application -writePhi -writep
|
||||
runApplication streamFunction
|
||||
|
||||
# ----------------------------------------------------------------- end-of-file
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@ gradSchemes
|
|||
divSchemes
|
||||
{
|
||||
default none;
|
||||
div(phi,U) bounded Gauss linear;
|
||||
div(div(phi,U)) Gauss linear;
|
||||
}
|
||||
|
||||
laplacianSchemes
|
||||
|
|
@ -48,7 +50,7 @@ snGradSchemes
|
|||
fluxRequired
|
||||
{
|
||||
default no;
|
||||
p ;
|
||||
Phi ;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -17,18 +17,28 @@ FoamFile
|
|||
|
||||
solvers
|
||||
{
|
||||
Phi
|
||||
{
|
||||
solver GAMG;
|
||||
smoother DIC;
|
||||
cacheAgglomeration on;
|
||||
agglomerator faceAreaPair;
|
||||
nCellsInCoarsestLevel 10;
|
||||
mergeLevels 1;
|
||||
|
||||
tolerance 1e-06;
|
||||
relTol 0.01;
|
||||
}
|
||||
|
||||
p
|
||||
{
|
||||
solver PCG;
|
||||
preconditioner DIC;
|
||||
tolerance 1e-06;
|
||||
relTol 0;
|
||||
$Phi;
|
||||
}
|
||||
}
|
||||
|
||||
potentialFlow
|
||||
{
|
||||
nNonOrthogonalCorrectors 0;
|
||||
nNonOrthogonalCorrectors 3;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ ls -d processor* | xargs -I {} cp -r 0.org ./{}/0 $1
|
|||
|
||||
runParallel renumberMesh 8 -overwrite
|
||||
|
||||
runParallel potentialFoam 8 -initialiseUBCs -noFunctionObjects
|
||||
runParallel potentialFoam 8 -initialiseUBCs
|
||||
|
||||
runParallel `getApplication` 8
|
||||
|
||||
|
|
|
|||
|
|
@ -55,7 +55,8 @@ snGradSchemes
|
|||
fluxRequired
|
||||
{
|
||||
default no;
|
||||
p ;
|
||||
p;
|
||||
Phi;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,11 @@ solvers
|
|||
relTol 0;
|
||||
};
|
||||
|
||||
Phi
|
||||
{
|
||||
$p;
|
||||
}
|
||||
|
||||
"(U|nuTilda)"
|
||||
{
|
||||
solver smoothSolver;
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ ls -d processor* | xargs -I {} rm -rf ./{}/0
|
|||
ls -d processor* | xargs -I {} cp -r 0.org ./{}/0
|
||||
|
||||
runParallel patchSummary 6
|
||||
runParallel potentialFoam 6 -noFunctionObjects
|
||||
runParallel potentialFoam 6
|
||||
runParallel $(getApplication) 6
|
||||
|
||||
runApplication reconstructParMesh -constant
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ fluxRequired
|
|||
{
|
||||
default no;
|
||||
p;
|
||||
Phi;
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
|
|
|
|||
|
|
@ -30,6 +30,11 @@ solvers
|
|||
mergeLevels 1;
|
||||
}
|
||||
|
||||
Phi
|
||||
{
|
||||
$p;
|
||||
}
|
||||
|
||||
U
|
||||
{
|
||||
solver smoothSolver;
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ fluxRequired
|
|||
{
|
||||
default no;
|
||||
p;
|
||||
Phi;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ ddtSchemes
|
|||
gradSchemes
|
||||
{
|
||||
default Gauss linear;
|
||||
grad(p) Gauss linear;
|
||||
}
|
||||
|
||||
divSchemes
|
||||
|
|
@ -59,6 +58,7 @@ fluxRequired
|
|||
{
|
||||
default no;
|
||||
p;
|
||||
Phi;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,11 @@ solvers
|
|||
maxIter 50;
|
||||
};
|
||||
|
||||
Phi
|
||||
{
|
||||
$p;
|
||||
}
|
||||
|
||||
"(U|Yi|h|k|omega)"
|
||||
{
|
||||
solver smoothSolver;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue