- when constructing dimensioned fields that are to be zero-initialized, it is preferrable to use a form such as dimensionedScalar(dims, Zero) dimensionedVector(dims, Zero) rather than dimensionedScalar("0", dims, 0) dimensionedVector("zero", dims, vector::zero) This reduces clutter and also avoids any suggestion that the name of the dimensioned quantity has any influence on the field's name. An even shorter version is possible. Eg, dimensionedScalar(dims) but reduces the clarity of meaning. - NB: UniformDimensionedField is an exception to these style changes since it does use the name of the dimensioned type (instead of the regIOobject).
124 lines
2.5 KiB
C
124 lines
2.5 KiB
C
Info<< "Reading velocity field U\n" << endl;
|
|
volVectorField U
|
|
(
|
|
IOobject
|
|
(
|
|
"U",
|
|
runTime.timeName(),
|
|
mesh,
|
|
IOobject::MUST_READ,
|
|
IOobject::AUTO_WRITE
|
|
),
|
|
mesh
|
|
);
|
|
|
|
// Initialise the velocity internal field to zero
|
|
U = dimensionedVector(U.dimensions(), Zero);
|
|
|
|
surfaceScalarField phi
|
|
(
|
|
IOobject
|
|
(
|
|
"phi",
|
|
runTime.timeName(),
|
|
mesh,
|
|
IOobject::NO_READ,
|
|
IOobject::AUTO_WRITE
|
|
),
|
|
fvc::flux(U)
|
|
);
|
|
|
|
if (args.found("initialiseUBCs"))
|
|
{
|
|
U.correctBoundaryConditions();
|
|
phi = fvc::flux(U);
|
|
}
|
|
|
|
|
|
// Construct a pressure field
|
|
// If it is available read it otherwise construct from the velocity BCs
|
|
// converting fixed-value BCs to zero-gradient and vice versa.
|
|
word pName("p");
|
|
|
|
// Update name of the pressure field from the command-line option
|
|
args.readIfPresent("pName", pName);
|
|
|
|
// Infer the pressure BCs from the velocity
|
|
wordList pBCTypes
|
|
(
|
|
U.boundaryField().size(),
|
|
fixedValueFvPatchScalarField::typeName
|
|
);
|
|
|
|
forAll(U.boundaryField(), patchi)
|
|
{
|
|
if (U.boundaryField()[patchi].fixesValue())
|
|
{
|
|
pBCTypes[patchi] = zeroGradientFvPatchScalarField::typeName;
|
|
}
|
|
}
|
|
|
|
// Note that registerObject is false for the pressure field. The pressure
|
|
// field in this solver doesn't have a physical value during the solution.
|
|
// It shouldn't be looked up and used by sub models or boundary conditions.
|
|
Info<< "Constructing pressure field " << pName << nl << endl;
|
|
volScalarField p
|
|
(
|
|
IOobject
|
|
(
|
|
pName,
|
|
runTime.timeName(),
|
|
mesh,
|
|
IOobject::READ_IF_PRESENT,
|
|
IOobject::NO_WRITE,
|
|
false
|
|
),
|
|
mesh,
|
|
dimensionedScalar(sqr(dimVelocity), Zero),
|
|
pBCTypes
|
|
);
|
|
|
|
// Infer the velocity potential BCs from the pressure
|
|
wordList PhiBCTypes
|
|
(
|
|
p.boundaryField().size(),
|
|
zeroGradientFvPatchScalarField::typeName
|
|
);
|
|
|
|
forAll(p.boundaryField(), patchi)
|
|
{
|
|
if (p.boundaryField()[patchi].fixesValue())
|
|
{
|
|
PhiBCTypes[patchi] = fixedValueFvPatchScalarField::typeName;
|
|
}
|
|
}
|
|
|
|
Info<< "Constructing velocity potential field Phi\n" << endl;
|
|
volScalarField Phi
|
|
(
|
|
IOobject
|
|
(
|
|
"Phi",
|
|
runTime.timeName(),
|
|
mesh,
|
|
IOobject::READ_IF_PRESENT,
|
|
IOobject::NO_WRITE
|
|
),
|
|
mesh,
|
|
dimensionedScalar(dimLength*dimVelocity, Zero),
|
|
PhiBCTypes
|
|
);
|
|
|
|
label PhiRefCell = 0;
|
|
scalar PhiRefValue = 0;
|
|
setRefCell
|
|
(
|
|
Phi,
|
|
potentialFlow.dict(),
|
|
PhiRefCell,
|
|
PhiRefValue
|
|
);
|
|
mesh.setFluxRequired(Phi.name());
|
|
|
|
#include "createMRF.H"
|