Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / applications / utilities / postProcessing / patch / patchAverage / patchAverage.C
blob6b5741da17c7e6801155c67f49485634550e6e4c
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  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     const word fieldName = args[1];
48     const word patchName = args[2];
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             const 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 // ************************************************************************* //