decomposeFaFields.H
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) 2021 OpenCFD Ltd.
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
12 
13 Description
14  Write proc addressing and decompose area fields (parallel only).
15 
16 \*---------------------------------------------------------------------------*/
17 
18 if (doDecompose && Pstream::parRun())
19 {
20  faMeshReconstructor reconstructor(aMesh);
21  reconstructor.writeAddressing();
22 
23  Info<< "Wrote proc-addressing" << nl << endl;
24 
25  // Handle area fields
26  // ------------------
27 
28  PtrList<areaScalarField> areaScalarFields;
29  PtrList<areaVectorField> areaVectorFields;
30  PtrList<areaSphericalTensorField> areaSphTensorFields;
31  PtrList<areaSymmTensorField> areaSymmTensorFields;
32  PtrList<areaTensorField> areaTensorFields;
33 
34  const faMesh& fullMesh = reconstructor.mesh();
35 
36  {
37  // Use uncollated (or master uncollated) file handler here.
38  // - each processor is reading in the identical serial fields.
39  // - nothing should be parallel-coordinated.
40 
41  // Similarly, if we write the serial finite-area mesh, this is only
42  // done from one processor!
43 
44  reconstructor.writeMesh();
45 
46  if (doDecompFields)
47  {
48  const bool oldDistributed = fileHandler().distributed();
49  auto oldHandler = fileHandler(fileOperation::NewUncollated());
50  fileHandler().distributed(true);
51 
52  IOobjectList objects(fullMesh.time(), runTime.timeName());
53 
55  (
56  fullMesh, objects, areaScalarFields
57  );
59  (
60  fullMesh, objects, areaVectorFields
61  );
63  (
64  fullMesh, objects, areaSphTensorFields
65  );
67  (
68  fullMesh, objects, areaSymmTensorFields
69  );
71  (
72  fullMesh, objects, areaTensorFields
73  );
74 
75  // Restore old settings
76  if (oldHandler)
77  {
78  fileHandler(std::move(oldHandler));
79  }
80  fileHandler().distributed(oldDistributed);
81  }
82  }
83 
84  const label nAreaFields =
85  (
86  areaScalarFields.size()
87  + areaVectorFields.size()
88  + areaSphTensorFields.size()
89  + areaSymmTensorFields.size()
90  + areaTensorFields.size()
91  );
92 
93  if (nAreaFields)
94  {
95  Info<< "Decomposing " << nAreaFields << " area fields" << nl;
96 
97  faFieldDecomposer fieldDecomposer
98  (
99  fullMesh,
100  aMesh,
101  reconstructor.edgeProcAddressing(),
102  reconstructor.faceProcAddressing(),
103  reconstructor.boundaryProcAddressing()
104  );
105 
106  if (areaScalarFields.size())
107  {
108  Info<< " scalars: "
109  << flatOutput(PtrListOps::names(areaScalarFields)) << nl;
110  fieldDecomposer.decomposeFields(areaScalarFields);
111  }
112 
113  if (areaVectorFields.size())
114  {
115  Info<< " vectors: "
116  << flatOutput(PtrListOps::names(areaVectorFields)) << nl;
117  fieldDecomposer.decomposeFields(areaVectorFields);
118  }
119 
120  if (areaSphTensorFields.size())
121  {
122  Info<< " sphTensors: "
123  << flatOutput(PtrListOps::names(areaSphTensorFields)) << nl;
124  fieldDecomposer.decomposeFields(areaSphTensorFields);
125  }
126 
127  if (areaSymmTensorFields.size())
128  {
129  Info<< " symmTensors: "
130  << flatOutput(PtrListOps::names(areaSymmTensorFields)) << nl;
131  fieldDecomposer.decomposeFields(areaSymmTensorFields);
132  }
133 
134  if (areaTensorFields.size())
135  {
136  Info<< " tensors: "
137  << flatOutput(PtrListOps::names(areaTensorFields)) << nl;
138  fieldDecomposer.decomposeFields(areaTensorFields);
139  }
140 
141  Info<< endl;
142  }
143 }
144 
145 
146 // ************************************************************************* //
runTime
engineTime & runTime
Definition: createEngineTime.H:13
Foam::fileHandler
const fileOperation & fileHandler()
Get current file handler.
Definition: fileOperation.C:1485
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:369
aMesh
faMesh aMesh(mesh)
Foam::Info
messageStream Info
Information stream (stdout output on master, null elsewhere)
Foam::flatOutput
FlatOutput::OutputAdaptor< Container, Delimiters > flatOutput(const Container &obj, Delimiters delim)
Global flatOutput() function with specified output delimiters.
Definition: FlatOutput.H:216
Foam::readFields
void readFields(const typename GeoFieldType::Mesh &mesh, const IOobjectList &objects, const wordHashSet &selectedFields, LIFOStack< regIOobject * > &storedObjects)
Read the selected GeometricFields of the templated type.
Definition: ReadFieldsTemplates.C:312
Foam::nl
constexpr char nl
Definition: Ostream.H:404
Foam::PtrListOps::names
List< word > names(const UPtrList< T > &list, const UnaryMatchPredicate &matcher)
Foam::fileOperation::distributed
bool distributed() const noexcept
Distributed roots (parallel run)
Definition: fileOperation.H:239