mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: patchAverage,patchIntegrate: generalise
This commit is contained in:
@ -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,17 +32,59 @@ Description
|
|||||||
#include "fvCFD.H"
|
#include "fvCFD.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class FieldType>
|
||||||
|
void printAverage
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const IOobject& fieldHeader,
|
||||||
|
const scalar area,
|
||||||
|
const label patchI,
|
||||||
|
bool& done
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!done && fieldHeader.headerClassName() == FieldType::typeName)
|
||||||
|
{
|
||||||
|
Info<< " Reading " << fieldHeader.headerClassName() << " "
|
||||||
|
<< fieldHeader.name() << endl;
|
||||||
|
|
||||||
|
FieldType field(fieldHeader, mesh);
|
||||||
|
|
||||||
|
typename FieldType::value_type sumField =
|
||||||
|
pTraits<typename FieldType::value_type>::zero;
|
||||||
|
|
||||||
|
if (area > 0)
|
||||||
|
{
|
||||||
|
sumField = gSum
|
||||||
|
(
|
||||||
|
mesh.magSf().boundaryField()[patchI]
|
||||||
|
* field.boundaryField()[patchI]
|
||||||
|
) / area;
|
||||||
|
}
|
||||||
|
|
||||||
|
Info<< " Average of " << fieldHeader.headerClassName()
|
||||||
|
<< " over patch "
|
||||||
|
<< mesh.boundary()[patchI].name()
|
||||||
|
<< '[' << patchI << ']' << " = "
|
||||||
|
<< sumField << endl;
|
||||||
|
|
||||||
|
done = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Main program:
|
// Main program:
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
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"
|
||||||
# include "createTime.H"
|
# include "createTime.H"
|
||||||
instantList timeDirs = timeSelector::select0(runTime, args);
|
instantList timeDirs = timeSelector::select0(runTime, args);
|
||||||
# include "createMesh.H"
|
# include "createNamedMesh.H"
|
||||||
|
|
||||||
const word fieldName = args[1];
|
const word fieldName = args[1];
|
||||||
const word patchName = args[2];
|
const word patchName = args[2];
|
||||||
@ -52,7 +94,7 @@ int main(int argc, char *argv[])
|
|||||||
runTime.setTime(timeDirs[timeI], timeI);
|
runTime.setTime(timeDirs[timeI], timeI);
|
||||||
Info<< "Time = " << runTime.timeName() << endl;
|
Info<< "Time = " << runTime.timeName() << endl;
|
||||||
|
|
||||||
IOobject fieldHeader
|
IOobject io
|
||||||
(
|
(
|
||||||
fieldName,
|
fieldName,
|
||||||
runTime.timeName(),
|
runTime.timeName(),
|
||||||
@ -61,7 +103,7 @@ int main(int argc, char *argv[])
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Check field exists
|
// Check field exists
|
||||||
if (fieldHeader.headerOk())
|
if (io.headerOk())
|
||||||
{
|
{
|
||||||
mesh.readUpdate();
|
mesh.readUpdate();
|
||||||
|
|
||||||
@ -72,32 +114,21 @@ int main(int argc, char *argv[])
|
|||||||
<< "Unable to find patch " << patchName << nl
|
<< "Unable to find patch " << patchName << nl
|
||||||
<< exit(FatalError);
|
<< exit(FatalError);
|
||||||
}
|
}
|
||||||
|
scalar area = gSum(mesh.magSf().boundaryField()[patchI]);
|
||||||
|
|
||||||
if (fieldHeader.headerClassName() == "volScalarField")
|
bool done = false;
|
||||||
{
|
printAverage<volScalarField>(mesh, io, area, patchI, done);
|
||||||
Info<< " Reading volScalarField " << fieldName << endl;
|
printAverage<volVectorField>(mesh, io, area, patchI, done);
|
||||||
volScalarField field(fieldHeader, mesh);
|
printAverage<volSphericalTensorField>(mesh, io, area, patchI, done);
|
||||||
|
printAverage<volSymmTensorField>(mesh, io, area, patchI, done);
|
||||||
|
printAverage<volTensorField>(mesh, io, area, patchI, done);
|
||||||
|
|
||||||
scalar area = gSum(mesh.magSf().boundaryField()[patchI]);
|
if (!done)
|
||||||
scalar sumField = 0;
|
|
||||||
|
|
||||||
if (area > 0)
|
|
||||||
{
|
|
||||||
sumField = gSum
|
|
||||||
(
|
|
||||||
mesh.magSf().boundaryField()[patchI]
|
|
||||||
* field.boundaryField()[patchI]
|
|
||||||
) / area;
|
|
||||||
}
|
|
||||||
|
|
||||||
Info<< " Average of " << fieldName << " over patch "
|
|
||||||
<< patchName << '[' << patchI << ']' << " = "
|
|
||||||
<< sumField << endl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
FatalError
|
FatalError
|
||||||
<< "Only possible to average volScalarFields "
|
<< "Only possible to average volFields."
|
||||||
|
<< " Field " << fieldName << " is of type "
|
||||||
|
<< io.headerClassName()
|
||||||
<< nl << exit(FatalError);
|
<< nl << exit(FatalError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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]
|
|
||||||
*field.boundaryField()[patchI]
|
|
||||||
)
|
|
||||||
<< nl;
|
|
||||||
|
|
||||||
Info<< " Integral of " << fieldName
|
|
||||||
<< " over area magnitude of patch "
|
|
||||||
<< patchName << '[' << patchI << ']' << " = "
|
|
||||||
<< gSum
|
|
||||||
(
|
|
||||||
mesh.magSf().boundaryField()[patchI]
|
|
||||||
*field.boundaryField()[patchI]
|
|
||||||
)
|
|
||||||
<< nl;
|
|
||||||
}
|
|
||||||
else if
|
|
||||||
(
|
(
|
||||||
fieldHeader.headerClassName() == surfaceScalarField::typeName
|
mesh,
|
||||||
)
|
fieldHeader,
|
||||||
{
|
patchI,
|
||||||
Info<< " Reading " << surfaceScalarField::typeName << " "
|
done
|
||||||
<< fieldName << endl;
|
);
|
||||||
|
printIntegrate<volVectorField>
|
||||||
|
(
|
||||||
|
mesh,
|
||||||
|
fieldHeader,
|
||||||
|
patchI,
|
||||||
|
done
|
||||||
|
);
|
||||||
|
|
||||||
surfaceScalarField field(fieldHeader, mesh);
|
//- No tensor integrations
|
||||||
scalar sumField = gSum(field.boundaryField()[patchI]);
|
//printIntegrate<volSphericalTensorField>
|
||||||
|
//(
|
||||||
|
// mesh,
|
||||||
|
// fieldHeader,
|
||||||
|
// patchI,
|
||||||
|
// done
|
||||||
|
//);
|
||||||
|
//printIntegrate<volSymmTensorField>
|
||||||
|
//(
|
||||||
|
// mesh,
|
||||||
|
// fieldHeader,
|
||||||
|
// patchI,
|
||||||
|
// done
|
||||||
|
//);
|
||||||
|
//printIntegrate<volTensorField>
|
||||||
|
//(
|
||||||
|
// mesh,
|
||||||
|
// fieldHeader,
|
||||||
|
// patchI,
|
||||||
|
// done
|
||||||
|
//);
|
||||||
|
|
||||||
Info<< " Integral of " << fieldName << " over patch "
|
printSum<surfaceScalarField>
|
||||||
<< patchName << '[' << patchI << ']' << " = "
|
(
|
||||||
<< sumField << nl;
|
mesh,
|
||||||
}
|
fieldHeader,
|
||||||
else
|
patchI,
|
||||||
|
done
|
||||||
|
);
|
||||||
|
printSum<surfaceVectorField>
|
||||||
|
(
|
||||||
|
mesh,
|
||||||
|
fieldHeader,
|
||||||
|
patchI,
|
||||||
|
done
|
||||||
|
);
|
||||||
|
printSum<volSphericalTensorField>
|
||||||
|
(
|
||||||
|
mesh,
|
||||||
|
fieldHeader,
|
||||||
|
patchI,
|
||||||
|
done
|
||||||
|
);
|
||||||
|
printSum<volSymmTensorField>
|
||||||
|
(
|
||||||
|
mesh,
|
||||||
|
fieldHeader,
|
||||||
|
patchI,
|
||||||
|
done
|
||||||
|
);
|
||||||
|
printSum<volTensorField>
|
||||||
|
(
|
||||||
|
mesh,
|
||||||
|
fieldHeader,
|
||||||
|
patchI,
|
||||||
|
done
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!done)
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user