ENH: patchAverage,patchIntegrate: generalise

This commit is contained in:
mattijs
2012-01-25 15:32:30 +00:00
parent 242143be1b
commit 40f4146ce2
2 changed files with 206 additions and 70 deletions

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -32,54 +32,26 @@ Description
#include "fvCFD.H" #include "fvCFD.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[]) template<class FieldType>
{ void printAverage
timeSelector::addOptions();
argList::validArgs.append("fieldName");
argList::validArgs.append("patchName");
# include "setRootCase.H"
# include "createTime.H"
instantList timeDirs = timeSelector::select0(runTime, args);
# include "createMesh.H"
const word fieldName = args[1];
const word patchName = args[2];
forAll(timeDirs, timeI)
{
runTime.setTime(timeDirs[timeI], timeI);
Info<< "Time = " << runTime.timeName() << endl;
IOobject fieldHeader
( (
fieldName, const fvMesh& mesh,
runTime.timeName(), const IOobject& fieldHeader,
mesh, const scalar area,
IOobject::MUST_READ const label patchI,
); bool& done
)
// Check field exists
if (fieldHeader.headerOk())
{ {
mesh.readUpdate(); if (!done && fieldHeader.headerClassName() == FieldType::typeName)
const label patchI = mesh.boundaryMesh().findPatchID(patchName);
if (patchI < 0)
{ {
FatalError Info<< " Reading " << fieldHeader.headerClassName() << " "
<< "Unable to find patch " << patchName << nl << fieldHeader.name() << endl;
<< exit(FatalError);
}
if (fieldHeader.headerClassName() == "volScalarField") FieldType field(fieldHeader, mesh);
{
Info<< " Reading volScalarField " << fieldName << endl;
volScalarField field(fieldHeader, mesh);
scalar area = gSum(mesh.magSf().boundaryField()[patchI]); typename FieldType::value_type sumField =
scalar sumField = 0; pTraits<typename FieldType::value_type>::zero;
if (area > 0) if (area > 0)
{ {
@ -90,14 +62,73 @@ int main(int argc, char *argv[])
) / area; ) / area;
} }
Info<< " Average of " << fieldName << " over patch " Info<< " Average of " << fieldHeader.headerClassName()
<< patchName << '[' << patchI << ']' << " = " << " over patch "
<< mesh.boundary()[patchI].name()
<< '[' << patchI << ']' << " = "
<< sumField << endl; << sumField << endl;
done = true;
} }
else }
// Main program:
int main(int argc, char *argv[])
{
timeSelector::addOptions();
#include "addRegionOption.H"
argList::validArgs.append("fieldName");
argList::validArgs.append("patchName");
# include "setRootCase.H"
# include "createTime.H"
instantList timeDirs = timeSelector::select0(runTime, args);
# include "createNamedMesh.H"
const word fieldName = args[1];
const word patchName = args[2];
forAll(timeDirs, timeI)
{
runTime.setTime(timeDirs[timeI], timeI);
Info<< "Time = " << runTime.timeName() << endl;
IOobject io
(
fieldName,
runTime.timeName(),
mesh,
IOobject::MUST_READ
);
// Check field exists
if (io.headerOk())
{
mesh.readUpdate();
const label patchI = mesh.boundaryMesh().findPatchID(patchName);
if (patchI < 0)
{ {
FatalError FatalError
<< "Only possible to average volScalarFields " << "Unable to find patch " << patchName << nl
<< exit(FatalError);
}
scalar area = gSum(mesh.magSf().boundaryField()[patchI]);
bool done = false;
printAverage<volScalarField>(mesh, io, area, patchI, done);
printAverage<volVectorField>(mesh, io, area, patchI, done);
printAverage<volSphericalTensorField>(mesh, io, area, patchI, done);
printAverage<volSymmTensorField>(mesh, io, area, patchI, done);
printAverage<volTensorField>(mesh, io, area, patchI, done);
if (!done)
{
FatalError
<< "Only possible to average volFields."
<< " Field " << fieldName << " is of type "
<< io.headerClassName()
<< nl << exit(FatalError); << nl << exit(FatalError);
} }
} }

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -32,12 +32,83 @@ Description
#include "fvCFD.H" #include "fvCFD.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
template<class FieldType>
void printIntegrate
(
const fvMesh& mesh,
const IOobject& fieldHeader,
const label patchI,
bool& done
)
{
if (!done && fieldHeader.headerClassName() == FieldType::typeName)
{
Info<< " Reading " << fieldHeader.headerClassName() << " "
<< fieldHeader.name() << endl;
FieldType field(fieldHeader, mesh);
Info<< " Integral of " << fieldHeader.name()
<< " over vector area of patch "
<< mesh.boundary()[patchI].name() << '[' << patchI << ']' << " = "
<< gSum
(
mesh.Sf().boundaryField()[patchI]
*field.boundaryField()[patchI]
)
<< nl;
Info<< " Integral of " << fieldHeader.name()
<< " over area magnitude of patch "
<< mesh.boundary()[patchI].name() << '[' << patchI << ']' << " = "
<< gSum
(
mesh.magSf().boundaryField()[patchI]
*field.boundaryField()[patchI]
)
<< nl;
done = true;
}
}
template<class FieldType>
void printSum
(
const fvMesh& mesh,
const IOobject& fieldHeader,
const label patchI,
bool& done
)
{
if (!done && fieldHeader.headerClassName() == FieldType::typeName)
{
Info<< " Reading " << FieldType::typeName << " "
<< fieldHeader.name() << endl;
FieldType field(fieldHeader, mesh);
typename FieldType::value_type sumField = gSum
(
field.boundaryField()[patchI]
);
Info<< " Integral of " << fieldHeader.name() << " over patch "
<< mesh.boundary()[patchI].name() << '[' << patchI << ']' << " = "
<< sumField << nl;
done = true;
}
}
// Main program: // Main program:
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
# include "addRegionOption.H"
timeSelector::addOptions(); timeSelector::addOptions();
# include "addRegionOption.H"
argList::validArgs.append("fieldName"); argList::validArgs.append("fieldName");
argList::validArgs.append("patchName"); argList::validArgs.append("patchName");
# include "setRootCase.H" # include "setRootCase.H"
@ -83,54 +154,88 @@ int main(int argc, char *argv[])
<< gSum(mesh.magSf().boundaryField()[patchI]) << endl; << gSum(mesh.magSf().boundaryField()[patchI]) << endl;
// Read field and calc integral // Read field and calc integral
if (fieldHeader.headerClassName() == volScalarField::typeName) bool done = false;
{ printIntegrate<volScalarField>
Info<< " Reading " << volScalarField::typeName << " "
<< fieldName << endl;
volScalarField field(fieldHeader, mesh);
Info<< " Integral of " << fieldName
<< " over vector area of patch "
<< patchName << '[' << patchI << ']' << " = "
<< gSum
( (
mesh.Sf().boundaryField()[patchI] mesh,
*field.boundaryField()[patchI] fieldHeader,
) patchI,
<< nl; done
);
Info<< " Integral of " << fieldName printIntegrate<volVectorField>
<< " over area magnitude of patch "
<< patchName << '[' << patchI << ']' << " = "
<< gSum
( (
mesh.magSf().boundaryField()[patchI] mesh,
*field.boundaryField()[patchI] fieldHeader,
) patchI,
<< nl; done
} );
else if
//- No tensor integrations
//printIntegrate<volSphericalTensorField>
//(
// mesh,
// fieldHeader,
// patchI,
// done
//);
//printIntegrate<volSymmTensorField>
//(
// mesh,
// fieldHeader,
// patchI,
// done
//);
//printIntegrate<volTensorField>
//(
// mesh,
// fieldHeader,
// patchI,
// done
//);
printSum<surfaceScalarField>
( (
fieldHeader.headerClassName() == surfaceScalarField::typeName mesh,
) fieldHeader,
{ patchI,
Info<< " Reading " << surfaceScalarField::typeName << " " done
<< fieldName << endl; );
printSum<surfaceVectorField>
(
mesh,
fieldHeader,
patchI,
done
);
printSum<volSphericalTensorField>
(
mesh,
fieldHeader,
patchI,
done
);
printSum<volSymmTensorField>
(
mesh,
fieldHeader,
patchI,
done
);
printSum<volTensorField>
(
mesh,
fieldHeader,
patchI,
done
);
surfaceScalarField field(fieldHeader, mesh); if (!done)
scalar sumField = gSum(field.boundaryField()[patchI]);
Info<< " Integral of " << fieldName << " over patch "
<< patchName << '[' << patchI << ']' << " = "
<< sumField << nl;
}
else
{ {
FatalError FatalError
<< "Only possible to integrate " << "Only possible to integrate "
<< volScalarField::typeName << "s " << "volFields and surfaceFields."
<< "and " << surfaceScalarField::typeName << "s" << " Field " << fieldName << " is of type "
<< fieldHeader.headerClassName()
<< nl << exit(FatalError); << nl << exit(FatalError);
} }
} }