foamToEnsight.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9  Copyright (C) 2016-2021 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 Application
28  foamToEnsight
29 
30 Group
31  grpPostProcessingUtilitie
32 
33 Description
34  Translate OpenFOAM data to EnSight format.
35  An Ensight part is created for cellZones (unzoned cells are "internalMesh")
36  and patches.
37 
38  - Handles volume fields, dimensioned fields, point fields
39  - Handles mesh topology changes.
40 
41 Usage
42  \b foamToEnsight [OPTION]
43 
44  Options:
45  - \par -ascii
46  Write Ensight data in ASCII format instead of "C Binary"
47 
48  - \par -fields <fields>
49  Specify single or multiple fields to write (all by default)
50  For example,
51  \verbatim
52  -fields T
53  -fields '(p T U \"alpha.*\")'
54  \endverbatim
55  The quoting is required to avoid shell expansions and to pass the
56  information as a single argument.
57 
58  - \par -nearCellValue
59  Use zero-gradient cell values on patches
60 
61  - \par -nodeValues
62  Force interpolation of values to nodes
63 
64  - \par -no-boundary
65  Suppress output for all boundary patches
66 
67  - \par -no-internal
68  Suppress output for internal (volume) mesh
69 
70  - \par -no-cellZones
71  Suppress cellZone handling
72 
73  - \par -no-lagrangian
74  Suppress writing lagrangian positions and fields.
75 
76  - \par -no-mesh
77  Suppress writing the geometry. Can be useful for converting partial
78  results for a static geometry.
79 
80  - \par -no-point-data
81  Suppress conversion of pointFields. No interpolated PointData.
82 
83  - \par -noZero
84  Exclude the often incomplete initial conditions.
85 
86  - \par -index <start>
87  Use consecutive indexing for \c data/######## files with the
88  specified start index.
89  Ignore the time index contained in the uniform/time file.
90 
91  - \par -name <subdir>
92  Define sub-directory name to use for Ensight data (default: "EnSight")
93 
94  - \par -width <n>
95  Width of Ensight data subdir (default: 8)
96 
97  - \par -cellZones NAME | LIST
98  Specify single zone or multiple cell zones (name or regex) to write
99 
100  - \par -faceZones NAME | LIST
101  Specify single zone or multiple face zones (name or regex) to write
102 
103  - \par -patches NAME | LIST
104  Specify single patch or multiple patches (name or regex) to write
105  For example,
106  \verbatim
107  -patches top
108  -patches '( front \".*back\" )'
109  \endverbatim
110 
111  - \par -excludePatches NAME | LIST
112  Exclude single or multiple patches (name or regex) from writing.
113  For example,
114  \verbatim
115  -excludePatches '( inlet_1 inlet_2 "proc.*" )'
116  \endverbatim
117 
118 \*---------------------------------------------------------------------------*/
119 
120 #include "argList.H"
121 #include "timeSelector.H"
122 #include "IOobjectList.H"
123 #include "IOmanip.H"
124 #include "OFstream.H"
125 #include "PstreamCombineReduceOps.H"
126 #include "HashOps.H"
127 #include "regionProperties.H"
128 
129 #include "fvc.H"
130 #include "fvMesh.H"
131 #include "fieldTypes.H"
132 #include "volFields.H"
133 #include "scalarIOField.H"
134 #include "vectorIOField.H"
135 
136 // file-format/conversion
137 #include "ensightCase.H"
138 #include "ensightGeoFile.H"
139 #include "ensightFaMesh.H"
140 #include "ensightMesh.H"
141 #include "ensightOutputCloud.H"
142 #include "ensightOutputAreaField.H"
143 #include "ensightOutputVolField.H"
144 
145 // local files
146 #include "readFields.H"
147 #include "writeVolFields.H"
148 #include "writeDimFields.H"
149 #include "writePointFields.H"
150 #include "writeAreaFields.H"
151 
152 #include "memInfo.H"
153 
154 #undef foamToEnsight_useTimeIndex
155 
156 using namespace Foam;
157 
158 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
159 
160 int main(int argc, char *argv[])
161 {
163  (
164  "Translate OpenFOAM data to Ensight format with individual parts"
165  " for cellZones, unzoned cells and patches"
166  );
168 
169  // Less frequently used - reduce some clutter
170  argList::setAdvanced("decomposeParDict");
171  argList::setAdvanced("noFunctionObjects");
172 
173  #include "addAllRegionOptions.H"
174 
176  (
177  "ascii",
178  "Write in ASCII format instead of 'C Binary'"
179  );
181  (
182  "index",
183  "start",
184  "Starting index for consecutive number of Ensight data/ files."
185  " Ignore the time index contained in the uniform/time file."
186  , true // mark as an advanced option
187  );
189  (
190  "name",
191  "subdir",
192  "Sub-directory name for Ensight output (default: 'EnSight')"
193  );
195  (
196  "no-overwrite",
197  "Suppress removal of existing EnSight output directory"
198  );
200  (
201  "width",
202  "n",
203  "Width of Ensight data subdir"
204  );
206  (
207  "nearCellValue",
208  "Use zero-gradient cell values on patches"
209  , true // mark as an advanced option
210  );
212  (
213  "nodeValues",
214  "Force interpolation of values to nodes"
215  , true // mark as an advanced option
216  );
218  (
219  "no-boundary", // noPatches
220  "Suppress writing any patches"
221  );
222  argList::addOptionCompat("no-boundary", {"noPatches", 1806});
223 
225  (
226  "no-internal",
227  "Suppress writing the internal mesh"
228  );
230  (
231  "no-cellZones",
232  "Suppress writing any cellZones"
233  );
235  (
236  "no-lagrangian", // noLagrangian
237  "Suppress writing lagrangian positions and fields"
238  );
239  argList::addOptionCompat("no-lagrangian", {"noLagrangian", 1806});
240 
242  (
243  "no-point-data",
244  "Suppress conversion of pointFields, disable -nodeValues"
245  );
247  (
248  "no-mesh", // noMesh
249  "Suppress writing the geometry."
250  " Can be useful for converting partial results for a static geometry"
251  , true // mark as an advanced option
252  );
253 
254  // Future?
255  // argList::addBoolOption
256  // (
257  // "one-boundary", // allPatches
258  // "Combine all patches into a single part"
259  // );
261  (
262  "finite-area",
263  "Write finite area fields",
264  true // mark as an advanced option
265  );
266 
268  (
269  "patches",
270  "wordRes",
271  "Specify single patch or multiple patches to write\n"
272  "Eg, 'inlet' or '(outlet \"inlet.*\")'"
273  );
275  (
276  "excludePatches",
277  "wordRes",
278  "Exclude single or multiple patches from writing\n"
279  "Eg, 'outlet' or '( inlet \".*Wall\" )'"
280  , true // mark as an advanced option
281  );
283  (
284  "faceZones",
285  "wordRes",
286  "Specify single or multiple faceZones to write\n"
287  "Eg, 'cells' or '( slice \"mfp-.*\" )'."
288  );
290  (
291  "fields",
292  "wordRes",
293  "Specify single or multiple fields to write (all by default)\n"
294  "Eg, 'T' or '( \"U.*\" )'"
295  );
297  (
298  "cellZones",
299  "wordRes",
300  "Specify single or multiple cellZones to write\n"
301  "Eg, 'cells' or '( slice \"mfp-.*\" )'."
302  );
303  argList::addOptionCompat("cellZones", {"cellZone", 1912});
304 
305  #include "setRootCase.H"
306 
307  // ------------------------------------------------------------------------
308  // Configuration
309 
310  // Default to binary output, unless otherwise specified
312  (
313  args.found("ascii")
316  );
317 
318  const bool doBoundary = !args.found("no-boundary");
319  const bool doInternal = !args.found("no-internal");
320  const bool doCellZones = !args.found("no-cellZones");
321  const bool doLagrangian = !args.found("no-lagrangian");
322  const bool doFiniteArea = args.found("finite-area");
323  const bool doPointValues = !args.found("no-point-data");
324  const bool nearCellValue = args.found("nearCellValue") && doBoundary;
325 
326  // Control for numbering iterations
327  label indexingNumber(0);
328  const bool doConsecutive = args.readIfPresent("index", indexingNumber);
329 
330  // Write the geometry, unless otherwise specified
331  bool doGeometry = !args.found("no-mesh");
332 
333  if (nearCellValue)
334  {
335  Info<< "Using neighbouring cell value instead of patch value"
336  << nl << endl;
337  }
338  if (!doPointValues)
339  {
340  Info<< "Point fields and interpolated point data"
341  << " disabled with the '-no-point-data' option"
342  << nl;
343  }
344 
345  //
346  // General (case) output options
347  //
348  ensightCase::options caseOpts(format);
349 
350  // Forced point interpolation?
351  caseOpts.nodeValues(doPointValues && args.found("nodeValues"));
352  caseOpts.width(args.getOrDefault<label>("width", 8));
353  caseOpts.overwrite(!args.found("no-overwrite")); // Remove existing?
354 
355  // Can also have separate directory for lagrangian
356  // caseOpts.separateCloud(true);
357 
358  ensightMesh::options writeOpts;
359  writeOpts.useBoundaryMesh(doBoundary);
360  writeOpts.useInternalMesh(doInternal);
361  writeOpts.useCellZones(doCellZones);
362 
363  if (args.found("patches"))
364  {
365  writeOpts.patchSelection(args.getList<wordRe>("patches"));
366  }
367  if (args.found("excludePatches"))
368  {
369  writeOpts.patchExclude(args.getList<wordRe>("excludePatches"));
370  }
371 
372  if (args.found("faceZones"))
373  {
374  writeOpts.faceZoneSelection(args.getList<wordRe>("faceZones"));
375  }
376  if (args.found("cellZones"))
377  {
378  writeOpts.cellZoneSelection(args.getList<wordRe>("cellZones"));
379  }
380 
381  // Report the setup
382  writeOpts.print(Info);
383 
384  wordRes fieldPatterns;
385  args.readListIfPresent<wordRe>("fields", fieldPatterns);
386 
387  // ------------------------------------------------------------------------
388 
389  #include "createTime.H"
390 
392 
393  // Handle -allRegions, -regions, -region
394  #include "getAllRegionOptions.H"
395 
396  // ------------------------------------------------------------------------
397  // Directory management
398 
399  // Define sub-directory name to use for EnSight data.
400  // The path to the ensight directory is at case level only
401  // - For parallel cases, data only written from master
402 
403  // Sub-directory for output
404  const word ensDirName = args.getOrDefault<word>("name", "EnSight");
405 
406  fileName outputDir(args.globalPath()/ensDirName);
407 
408  if (!outputDir.isAbsolute())
409  {
410  outputDir = args.globalPath()/outputDir;
411  }
412 
413 
414  // ------------------------------------------------------------------------
415  cpuTime timer;
416  memInfo mem;
417  Info<< "Initial memory " << mem.update().size() << " kB" << endl;
418 
419  #include "createNamedMeshes.H"
420  #include "createMeshAccounting.H"
421 
422  if (Pstream::master())
423  {
424  Info<< "Converting " << timeDirs.size() << " time steps" << nl;
425  // ensCase.printInfo(Info) << endl;
426  }
427 
428  // Check mesh motion
429  #include "checkMeshMoving.H"
430  if (hasMovingMesh && !doGeometry)
431  {
432  Info<< "has moving mesh: ignoring '-no-mesh' option" << endl;
433  doGeometry = true;
434  }
435 
436  // Check lagrangian
437  #include "findCloudFields.H"
438 
439  // Check field availability
440  #include "checkFieldAvailability.H"
441 
442  // test the pre-check variable if there is a moving mesh
443  // time-set for geometries
444  // TODO: split off into separate time-set,
445  // but need to verify ensight spec
446 
447  Info<< "Startup in "
448  << timer.cpuTimeIncrement() << " s, "
449  << mem.update().size() << " kB" << nl << endl;
450 
451 
452  forAll(timeDirs, timei)
453  {
454  runTime.setTime(timeDirs[timei], timei);
455 
456  // Index for the Ensight case(s). Continues if not possible
457  #include "getTimeIndex.H"
458 
459  Info<< "Time [" << timeIndex << "] = " << runTime.timeName() << nl;
460 
461  forAll(regionNames, regioni)
462  {
463  const word& regionName = regionNames[regioni];
464  const word& regionDir =
465  (
467  ? regionName
468  : word::null
469  );
470 
471  if (regionNames.size() > 1)
472  {
473  Info<< "region=" << regionName << nl;
474  }
475 
476  auto& mesh = meshes[regioni];
477 
479  const bool moving = (meshState != polyMesh::UNCHANGED);
480 
481  // Ensight
482  auto& ensCase = ensightCases[regioni];
483  auto& ensMesh = ensightMeshes[regioni];
484 
485  // Finite-area (can be missing)
486  auto* ensFaCasePtr = ensightCasesFa.get(regioni);
487  auto* ensFaMeshPtr = ensightMeshesFa.get(regioni);
488 
489  ensCase.setTime(timeDirs[timei], timeIndex);
490  if (ensFaCasePtr)
491  {
492  ensFaCasePtr->setTime(timeDirs[timei], timeIndex);
493  }
494 
495  if (moving)
496  {
497  ensMesh.expire();
498  ensMesh.correct();
499 
500  if (ensFaMeshPtr)
501  {
502  ensFaMeshPtr->expire();
503  ensFaMeshPtr->correct();
504  }
505  }
506 
507  if ((timei == 0 || moving) && doGeometry)
508  {
509  // finite-volume
510  {
512  ensCase.newGeometry(hasMovingMesh);
513  ensMesh.write(os);
514  }
515 
516  // finite-area
517  if (ensFaCasePtr && ensFaMeshPtr)
518  {
520  ensFaCasePtr->newGeometry(hasMovingMesh);
521  ensFaMeshPtr->write(os);
522  }
523  }
524 
525  // Objects at this time
526  IOobjectList objects(mesh, runTime.timeName());
527 
528  // Restrict to objects that are available for all times
529  objects.filterObjects
530  (
532  );
533 
534  // Volume, internal, point fields
535  #include "convertVolumeFields.H"
536 
537  // The finiteArea fields
538  #include "convertAreaFields.H"
539 
540  // Lagrangian fields
541  #include "convertLagrangian.H"
542  }
543 
544  Info<< "Wrote in "
545  << timer.cpuTimeIncrement() << " s, "
546  << mem.update().size() << " kB" << nl << nl;
547  }
548 
549  // Write cases
550  forAll(ensightCases, regioni)
551  {
552  ensightCases[regioni].write();
553  }
554 
555  forAll(ensightCasesFa, regioni)
556  {
557  if (ensightCasesFa.set(regioni))
558  {
559  ensightCasesFa[regioni].write();
560  }
561  }
562 
563  Info<< "\nEnd: "
564  << timer.elapsedCpuTime() << " s, "
565  << mem.update().peak() << " kB (peak)" << nl << endl;
566 
567  return 0;
568 }
569 
570 
571 // ************************************************************************* //
volFields.H
runTime
engineTime & runTime
Definition: createEngineTime.H:13
checkFieldAvailability.H
Requires.
ensightCase.H
Foam::word
A class for handling words, derived from Foam::string.
Definition: word.H:65
regionProperties.H
Foam::fileName
A class for handling file names.
Definition: fileName.H:73
Foam::polyMesh::defaultRegion
static word defaultRegion
Return the default region name.
Definition: polyMesh.H:318
Foam::argList::getOrDefault
T getOrDefault(const word &optName, const T &deflt) const
Get a value from the named option if present, or return default.
Definition: argListI.H:307
Foam::ensightMesh::options::patchExclude
const wordRes & patchExclude() const noexcept
Selection of black listed patches. Empty if unspecified.
Definition: ensightMesh.H:291
Foam::ensightMesh::options::useInternalMesh
bool useInternalMesh() const noexcept
Using internal?
Definition: ensightMeshOptions.C:81
Foam::ensightMesh::options::faceZoneSelection
const wordRes & faceZoneSelection() const noexcept
Selection of faceZones. Empty if unspecified.
Definition: ensightMesh.H:297
Foam::Time::timeName
static word timeName(const scalar t, const int precision=precision_)
Definition: Time.C:780
Foam::argList::addNote
static void addNote(const string &note)
Add extra notes for the usage information.
Definition: argList.C:412
Foam::UPstream::master
static bool master(const label communicator=worldComm)
Am I the master process.
Definition: UPstream.H:457
Foam::argList::addOptionCompat
static void addOptionCompat(const word &optName, std::pair< const char *, int > compat)
Specify an alias for the option name.
Definition: argList.C:368
Foam::memInfo::peak
int peak() const
Peak memory (VmPeak in /proc/PID/status) at last update()
Definition: memInfo.H:103
Foam::argList::readListIfPresent
bool readListIfPresent(const word &optName, List< T > &list) const
Definition: argListI.H:394
IOobjectList.H
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:369
scalarIOField.H
Foam::OBJstream::write
virtual Ostream & write(const char c)
Write character.
Definition: OBJstream.C:78
Foam::argList::readIfPresent
bool readIfPresent(const word &optName, T &val) const
Read a value from the named option if present.
Definition: argListI.H:323
ensightOutputAreaField.H
A collection of functions for writing areaField content in ensight format.
Foam::wordRe
A wordRe is a Foam::word, but can contain a regular expression for matching words or strings.
Definition: wordRe.H:80
regionNames
wordList regionNames
Definition: getAllRegionOptions.H:37
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:296
Foam::IOobjectList::filterObjects
label filterObjects(const UnaryPredicate &pred, const bool pruning=false)
Filter to retain or prune given object names.
OFstream.H
ensightMeshes
PtrList< ensightMesh > ensightMeshes(regionNames.size())
Foam::fvMesh::readUpdate
virtual readUpdateState readUpdate()
Update the mesh based on the mesh files saved in time.
Definition: fvMesh.C:648
PstreamCombineReduceOps.H
Combination-Reduction operation for a parallel run. The information from all nodes is collected on th...
format
word format(conversionProperties.get< word >("format"))
regionName
Foam::word regionName
Definition: createNamedDynamicFvMesh.H:1
Foam::memInfo::update
const memInfo & update()
Update according to /proc/PID/status and /proc/memory contents.
Definition: memInfo.C:64
availableRegionObjectNames
List< wordHashSet > availableRegionObjectNames(meshes.size())
ensightMesh.H
Foam::Info
messageStream Info
Information stream (stdout output on master, null elsewhere)
argList.H
meshes
Foam::PtrList< Foam::fvMesh > meshes(regionNames.size())
Foam::ensightMesh::options::useCellZones
bool useCellZones() const noexcept
Using cellZones?
Definition: ensightMeshOptions.C:93
IOmanip.H
Istream and Ostream manipulators taking arguments.
Foam::polyMesh::UNCHANGED
Definition: polyMesh.H:92
Foam::argList::setAdvanced
static void setAdvanced(const word &optName, bool advanced=true)
Set an existing option as being 'advanced' or normal.
Definition: argList.C:354
Foam::cpuTimeCxx
Starts timing CPU usage and return elapsed time from start.
Definition: cpuTimeCxx.H:53
Foam::IOstreamOption::streamFormat
streamFormat
Data format (ascii | binary)
Definition: IOstreamOption.H:70
os
OBJstream os(runTime.globalPath()/outputName)
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:6
ensightOutputVolField.H
A collection of functions for writing volField content in ensight format.
Foam::memInfo
Memory usage information for the current process, and the system memory that is free.
Definition: memInfo.H:62
fvMesh.H
Foam
Namespace for OpenFOAM.
Definition: atmBoundaryLayer.C:33
Foam::IOobjectList
List of IOobjects with searching and retrieving facilities.
Definition: IOobjectList.H:55
Foam::ensightMesh::options::patchSelection
const wordRes & patchSelection() const noexcept
Selection of patches. Empty if unspecified.
Definition: ensightMesh.H:285
Foam::polyMesh::readUpdateState
readUpdateState
Enumeration defining the state of the mesh after a read update.
Definition: polyMesh.H:90
getAllRegionOptions.H
Priority.
vectorIOField.H
Foam::argList::addBoolOption
static void addBoolOption(const word &optName, const string &usage="", bool advanced=false)
Add a bool option to validOptions with usage information.
Definition: argList.C:324
Foam::autoPtr
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
Definition: HashPtrTable.H:53
setRootCase.H
Foam::IOstreamOption::BINARY
"binary"
Definition: IOstreamOption.H:73
ensightGeoFile.H
Foam::IOstreamOption::ASCII
"ascii" (normal default)
Definition: IOstreamOption.H:72
ensightMeshesFa
PtrList< ensightFaMesh > ensightMeshesFa(regionNames.size())
checkMeshMoving.H
addAllRegionOptions.H
Foam::nl
constexpr char nl
Definition: Ostream.H:404
Foam::ensightMesh::options
Configuration options for the ensightMesh.
Definition: ensightMesh.H:228
Foam::timeSelector::addOptions
static void addOptions(const bool constant=true, const bool withZero=false)
Add timeSelector options to argList::validOptions.
Definition: timeSelector.C:102
Foam::List< instant >
Foam::Time::setTime
virtual void setTime(const Time &t)
Reset the time and time-index to those of the given time.
Definition: Time.C:1003
Foam::ensightMesh::options::cellZoneSelection
const wordRes & cellZoneSelection() const noexcept
Selection of faceZones. Empty if unspecified.
Definition: ensightMesh.H:303
Foam::timer
Implements a timeout mechanism via sigalarm.
Definition: timer.H:83
Foam::wordRes
A List of wordRe with additional matching capabilities.
Definition: wordRes.H:51
Foam::argList::globalPath
fileName globalPath() const
Return the full path to the global case.
Definition: argListI.H:87
Foam::word::null
static const word null
An empty word.
Definition: word.H:80
timeSelector.H
ensightOutputCloud.H
A collection of functions for writing clouds as ensight file content.
createTime.H
hasMovingMesh
bool hasMovingMesh(false)
ensightCases
PtrList< ensightCase > ensightCases(regionNames.size())
Foam::ensightCase::options
Configuration options for the ensightCase.
Definition: ensightCase.H:328
Foam::argList::getList
List< T > getList(const label index) const
Get a List of values from the argument at index.
fvc.H
Foam::ensightMesh::options::print
void print(Ostream &os) const
Report values.
Definition: ensightMeshOptions.C:280
timeIndex
label timeIndex
Definition: getTimeIndex.H:30
regionDir
const word & regionDir
Definition: findMeshDefinitionDict.H:34
Foam::memInfo::size
int size() const
Memory size (VmSize in /proc/PID/status) at last update()
Definition: memInfo.H:109
Foam::timeSelector::select0
static instantList select0(Time &runTime, const argList &args)
Definition: timeSelector.C:235
Foam::argList::addOption
static void addOption(const word &optName, const string &param="", const string &usage="", bool advanced=false)
Add an option to validOptions with usage information.
Definition: argList.C:335
args
Foam::argList args(argc, argv)
fieldTypes.H
Header files for all the primitive types that Fields are instantiated for.
findCloudFields.H
createNamedMeshes.H
Required Variables.
Foam::ensightMesh::options::useBoundaryMesh
bool useBoundaryMesh() const noexcept
Using boundary?
Definition: ensightMeshOptions.C:87
HashOps.H
ensightCasesFa
PtrList< ensightCase > ensightCasesFa(regionNames.size())
Foam::argList::found
bool found(const word &optName) const
Return true if the named option is found.
Definition: argListI.H:178
ensightFaMesh.H