Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / applications / utilities / postProcessing / patch / patchAverage / patchAverage.C
blob0f85bc71d34e28375417962d3d76594e739e4980
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Application
25     patchAverage
27 Description
28     Calculates the average of the specified field over the specified patch.
30 \*---------------------------------------------------------------------------*/
32 #include "fvCFD.H"
34 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
35 // Main program:
37 int main(int argc, char *argv[])
39     timeSelector::addOptions();
40     argList::validArgs.append("fieldName");
41     argList::validArgs.append("patchName");
42 #   include "setRootCase.H"
43 #   include "createTime.H"
44     instantList timeDirs = timeSelector::select0(runTime, args);
45 #   include "createMesh.H"
47     word fieldName(args.additionalArgs()[0]);
48     word patchName(args.additionalArgs()[1]);
50     forAll(timeDirs, timeI)
51     {
52         runTime.setTime(timeDirs[timeI], timeI);
53         Info<< "Time = " << runTime.timeName() << endl;
55         IOobject fieldHeader
56         (
57             fieldName,
58             runTime.timeName(),
59             mesh,
60             IOobject::MUST_READ
61         );
63         // Check field exists
64         if (fieldHeader.headerOk())
65         {
66             mesh.readUpdate();
68             label patchi = mesh.boundaryMesh().findPatchID(patchName);
69             if (patchi < 0)
70             {
71                 FatalError
72                     << "Unable to find patch " << patchName << nl
73                     << exit(FatalError);
74             }
76             if (fieldHeader.headerClassName() == "volScalarField")
77             {
78                 Info<< "    Reading volScalarField " << fieldName << endl;
79                 volScalarField field(fieldHeader, mesh);
81                 scalar area = gSum(mesh.magSf().boundaryField()[patchi]);
82                 scalar sumField = 0;
84                 if (area > 0)
85                 {
86                     sumField = gSum
87                     (
88                         mesh.magSf().boundaryField()[patchi]
89                       * field.boundaryField()[patchi]
90                     ) / area;
91                 }
93                 Info<< "    Average of " << fieldName << " over patch "
94                     << patchName << '[' << patchi << ']' << " = "
95                     << sumField << endl;
96             }
97             else
98             {
99                 FatalError
100                     << "Only possible to average volScalarFields "
101                     << nl << exit(FatalError);
102             }
103         }
104         else
105         {
106             Info<< "    No field " << fieldName << endl;
107         }
109         Info<< endl;
110     }
112     Info<< "End\n" << endl;
114     return 0;
117 // ************************************************************************* //