Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / applications / utilities / postProcessing / dataConversion / foamToEnsightParts / ensightOutputFunctions.C
blob0cb92525974b3bbb8d3d63846eb3ae65df527d89
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 #include "ensightOutputFunctions.H"
28 #include "passiveParticle.H"
29 #include "IOField.H"
30 #include "volFields.H"
31 #include "surfaceFields.H"
33 #include "OFstream.H"
34 #include "IOmanip.H"
36 namespace Foam
39 // * * * * * * * * * * * * * * * Global Functions  * * * * * * * * * * * * * //
41 void ensightCaseEntry
43     OFstream& caseFile,
44     const string& ensightType,
45     const word& fieldName,
46     const fileName& dataMask,
47     const fileName& local,
48     const label cloudNo,
49     const label timeSet
52     caseFile.setf(ios_base::left);
54     fileName dirName(dataMask);
55     if (local.size())
56     {
57         dirName = dirName/local;
58     }
60     if (cloudNo >= 0)
61     {
62         label ts = 1;
63         if (timeSet > ts)
64         {
65             ts = timeSet;
66         }
68         // prefix variables with 'c' (cloud)
69         caseFile
70             << ensightType.c_str()
71             << " per measured node: " << ts << " "
72             << setw(15)
73             << ("c" + Foam::name(cloudNo) + fieldName).c_str()
74             << " "
75             << (dirName/fieldName).c_str()
76             << nl;
77     }
78     else
79     {
80         caseFile
81             << ensightType.c_str()
82             << " per element: "
83             << setw(15) << fieldName
84             << " "
85             << (dirName/fieldName).c_str()
86             << nl;
87     }
91 void ensightParticlePositions
93     const polyMesh& mesh,
94     const fileName& dataDir,
95     const fileName& subDir,
96     const word& cloudName,
97     IOstream::streamFormat format
100     Cloud<passiveParticle> parcels(mesh, cloudName, false);
102     fileName cloudDir = subDir/cloud::prefix/cloudName;
103     fileName postFileName = cloudDir/"positions";
105     // the ITER/lagrangian subdirectory must exist
106     mkDir(dataDir/cloudDir);
107     ensightFile os(dataDir/postFileName, format);
109     // tag binary format (just like geometry files)
110     os.writeBinaryHeader();
111     os.write(postFileName);
112     os.newline();
113     os.write("particle coordinates");
114     os.newline();
115     os.write(parcels.size(), 8);    // unusual width
116     os.newline();
118     // binary write is Ensight6 - first ids, then positions
119     if (format == IOstream::BINARY)
120     {
121         forAll (parcels, i)
122         {
123             os.write(i+1);
124         }
126         forAllIter(Cloud<passiveParticle>, parcels, elmnt)
127         {
128             const vector& p = elmnt().position();
130             os.write(p.x());
131             os.write(p.y());
132             os.write(p.z());
133         }
134     }
135     else
136     {
137         label nParcels = 0;
139         forAllIter(Cloud<passiveParticle>, parcels, elmnt)
140         {
141             const vector& p = elmnt().position();
143             os.write(++nParcels, 8);    // unusual width
144             os.write(p.x());
145             os.write(p.y());
146             os.write(p.z());
147             os.newline();
148         }
149     }
154 template<class Type>
155 void ensightLagrangianField
157     const IOobject& fieldObject,
158     const fileName& dataDir,
159     const fileName& subDir,
160     const word& cloudName,
161     IOstream::streamFormat format
164     Info<< " " << fieldObject.name() << flush;
166     fileName cloudDir = subDir/cloud::prefix/cloudName;
167     fileName postFileName = cloudDir/fieldObject.name();
169     string title =
170         postFileName + " with " + pTraits<Type>::typeName + " values";
172     ensightFile os(dataDir/postFileName, format);
173     os.write(title);
174     os.newline();
176     IOField<Type> field(fieldObject);
178     // 6 values per line
179     label count = 0;
181     forAll(field, i)
182     {
183         Type val = field[i];
185         if (mag(val) < 1.0e-90)
186         {
187             val = pTraits<Type>::zero;
188         }
190         for (direction cmpt=0; cmpt < pTraits<Type>::nComponents; cmpt++)
191         {
192             os.write( component(val, cmpt) );
193         }
195         count += pTraits<Type>::nComponents;
197         if (count % 6 == 0)
198         {
199             os.newline();
200         }
201     }
203     // add final newline if required
204     if (count % 6)
205     {
206         os.newline();
207     }
211 //- write generalized field components
212 template <class Type>
213 void ensightVolField
215     const ensightParts& partsList,
216     const IOobject& fieldObject,
217     const fvMesh& mesh,
218     const fileName& dataDir,
219     const fileName& subDir,
220     IOstream::streamFormat format
223     Info<< " " << fieldObject.name() << flush;
225     fileName postFileName = subDir/fieldObject.name();
227     ensightFile os(dataDir/postFileName, format);
228     os.write(postFileName);
229     os.newline();
231     // ie, volField<Type>
232     partsList.writeField
233     (
234         os,
235         GeometricField<Type, fvPatchField, volMesh>
236         (
237             fieldObject,
238             mesh
239         )
240     );
243 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
245 } // namespace Foam
248 // ************************************************************************* //