Forward compatibility: flex
[foam-extend-3.2.git] / src / postProcessing / foamCalcFunctions / field / componentsTurbo / writeComponentTurboFields.C
blob7695a65414950d923c7e9877eed8eb9398315119
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 \*---------------------------------------------------------------------------*/
26 template <class Type>
27 void Foam::calcTypes::componentsTurbo::writeComponentFields
29     const IOobject& header,
30     const fvMesh& mesh,
31     bool& processed
34     typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
36     if (header.headerClassName() == fieldType::typeName)
37     {
38         const char* turboComponentNames[] = {"radial", "tangential", "z"};
40         Info<< "    Reading " << header.name() << endl;
41         fieldType field(header, mesh);
42         fieldType turboField(field);
44         vectorField cellCentres(mesh.cellCentres());
45         cellCentres.replace(vector::Z, scalar(0));
47         const scalarField r = mag(cellCentres);
49         forAll(turboField, fI)
50         {
51             turboField[fI].replace(vector::X,
52                 (
53                     cellCentres[fI].component(vector::X)*field[fI].component(vector::X) +
54                     cellCentres[fI].component(vector::Y)*field[fI].component(vector::Y)
55                 ) / r[fI]
56             );
58             turboField[fI].replace(vector::Y,
59                 (
60                     -cellCentres[fI].component(vector::Y)*field[fI].component(vector::X) +
61                      cellCentres[fI].component(vector::X)*field[fI].component(vector::Y)
62                 ) / r[fI]
63             );
64         }
66         // Convert boundary fields
67         forAll(turboField.boundaryField(), patchI)
68         {
69             fvPatchField<Type>& bf  = field.boundaryField()[patchI];
70             fvPatchField<Type>& tbf = turboField.boundaryField()[patchI];
72             vectorField faceCentres(tbf.patch().Cf());
74             faceCentres.replace(vector::Z, scalar(0));
76             const scalarField r = mag(faceCentres);
78             forAll(tbf, tbfI)
79             {
80                 tbf[tbfI].replace(vector::X,
81                     (
82                         faceCentres[tbfI].component(vector::X)*bf[tbfI].component(vector::X) +
83                         faceCentres[tbfI].component(vector::Y)*bf[tbfI].component(vector::Y)
84                     ) / r[tbfI]
85                 );
87                 tbf[tbfI].replace(vector::Y,
88                     (
89                         -faceCentres[tbfI].component(vector::Y)*bf[tbfI].component(vector::X) +
90                          faceCentres[tbfI].component(vector::X)*bf[tbfI].component(vector::Y)
91                     ) / r[tbfI]
92                 );
93             }
94         }
96         for (direction i=0; i<Type::nComponents; i++)
97         {
98             Info<< "    Calculating " << header.name()
99                 << turboComponentNames[i] << endl;
101             volScalarField componentField
102             (
103                 IOobject
104                 (
105                     header.name() + word(turboComponentNames[i]),
106                     mesh.time().timeName(),
107                     mesh,
108                     IOobject::NO_READ
109                 ),
110                 turboField.component(i)
111             );
112             componentField.write();
113         }
115         processed = true;
116     }
120 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //