readBoundary.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2020 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
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.
15 
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.
20 
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/>.
23 
24 Description
25  Create intermediate mesh files from SAMM files
26 
27 \*---------------------------------------------------------------------------*/
28 
29 #include "sammMesh.H"
30 #include "Time.H"
31 #include "wallPolyPatch.H"
32 #include "mergedCyclicPolyPatch.H"
33 #include "symmetryPolyPatch.H"
34 #include "preservePatchTypes.H"
35 #include "IFstream.H"
36 
37 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
38 
39 void Foam::sammMesh::readBoundary()
40 {
41  label nPatches=0, nFaces=0;
42  labelList nPatchFaces(1000);
43 
44  label lineIndex, sammLabel;
45  label sammRegion, configNumber;
46 
48  labelList pointLabelsTri(3);
49 
50  labelList patchLabels(1000, label(-1));
51 
52  word patchType;
53  patchTypes_.setSize(1000);
54  patchNames_.setSize(1000);
55 
56  fileName boundaryFileName(casePrefix_ + ".bnd");
57 
58  {
59  IFstream boundaryFile(boundaryFileName);
60 
61  // Collect no. of faces (nFaces),
62  // no. of patches (nPatches)
63  // and for each of these patches the number of faces
64  // (nPatchFaces[patchLabel])
65  // and a conversion table from Samm regions to (Foam) patchLabels
66 
67  if (boundaryFile.good())
68  {
69  forAll(nPatchFaces, faceLabel)
70  {
71  nPatchFaces[faceLabel] = 0;
72  }
73 
74  while ((boundaryFile >> lineIndex).good())
75  {
76  nFaces++;
77 
78  // Skip point numbers
79  for (int i=0; i<4; i++)
80  {
81  boundaryFile >> sammLabel;
82  }
83 
84  boundaryFile >> sammRegion;
85  boundaryFile >> configNumber;
86  boundaryFile >> patchType;
87 
88  // Build translation table to convert samm patch to foam patch
89  label patchLabel = patchLabels[sammRegion];
90  if (patchLabel == -1)
91  {
92  patchLabel = nPatches;
93  patchLabels[sammRegion] = patchLabel;
94  patchTypes_[patchLabel] = patchType;
95  patchNames_[patchLabel] = patchType + name(sammRegion);
96 
97  nPatches++;
98 
99  Info<< "Samm region " << sammRegion
100  << " with type " << patchType
101  << " is now Foam patch " << patchLabel << endl;
102 
103  }
104 
105  nPatchFaces[patchLabel]++;
106  }
107 
108 
109  Info<< nl
110  << "Setting size of shapePatchList to " << nPatches
111  << nl << endl;
112 
113  nPatchFaces.setSize(nPatches);
114  patchTypes_.setSize(nPatches);
115  patchNames_.setSize(nPatches);
116  }
117  else
118  {
120  << "Cannot read file "
121  << boundaryFileName
122  << abort(FatalError);
123  }
124  }
125 
126  if (nPatches > 0)
127  {
128  boundary_.setSize(nPatchFaces.size());
129  patchTypes_.setSize(nPatchFaces.size());
130  patchNames_.setSize(nPatchFaces.size());
131 
132  // size the lists and reset the counters to be used again
133  forAll(boundary_, patchLabel)
134  {
135  boundary_[patchLabel].setSize(nPatchFaces[patchLabel]);
136 
137  nPatchFaces[patchLabel] = 0;
138  }
139 
140  IFstream boundaryFile(boundaryFileName);
141 
142  for (label facei=0; facei<nFaces; facei++)
143  {
144  boundaryFile >> lineIndex;
145 
146  for (int i = 0; i < 4; i++)
147  {
148  boundaryFile >> sammLabel;
149 
150  // convert Samm label to Foam point label
151  // through lookup-list starPointLabelLookup_
152  pointLabels[i] = starPointLabelLookup_[sammLabel];
153 
154  if (pointLabels[i] < 0)
155  {
156  Info<< "Boundary file not consistent with vertex file\n"
157  << "Samm vertex number " << sammLabel
158  << " does not exist\n";
159  }
160 
161  }
162 
163  boundaryFile >> sammRegion;
164  label patchLabel = patchLabels[sammRegion];
165 
166  boundaryFile >> configNumber;
167  boundaryFile >> patchType;
168 
169  if // Triangle
170  (
171  pointLabels[2] == pointLabels[3]
172  )
173  {
174  // Info<< "Converting collapsed quad into triangle"
175  // << " for face " << facei
176  // << " in Samm boundary " << lineIndex << endl;
177 
178  pointLabelsTri[0] = pointLabels[0];
179  pointLabelsTri[1] = pointLabels[1];
180  pointLabelsTri[2] = pointLabels[2];
181 
182  boundary_[patchLabel][nPatchFaces[patchLabel]]
183  = face(pointLabelsTri);
184  }
185  else
186  {
187  boundary_[patchLabel][nPatchFaces[patchLabel]]
188  = face(pointLabels);
189  }
190 
191  // increment counter of faces in current patch
192  nPatchFaces[patchLabel]++;
193  }
194 
195  forAll(boundary_, patchLabel)
196  {
197  word patchType = patchTypes_[patchLabel];
198 
199  if (patchType == "SYMP")
200  {
201  patchTypes_[patchLabel] = symmetryPolyPatch::typeName;
202  }
203  else if (patchType == "WALL")
204  {
205  patchTypes_[patchLabel] = wallPolyPatch::typeName;
206  }
207  else if (patchType == "CYCL")
208  {
209  patchTypes_[patchLabel] = mergedCyclicPolyPatch::typeName;
210  }
211  else
212  {
213  patchTypes_[patchLabel] = polyPatch::typeName;
214  }
215 
216  Info<< "Foam patch " << patchLabel
217  << " is of type " << patchTypes_[patchLabel]
218  << " with name " << patchNames_[patchLabel] << endl;
219  }
220  }
221  else
222  {
224  << "No boundary faces in file "
225  << boundaryFileName
226  << endl;
227  }
228 
229  patchPhysicalTypes_.setSize(patchTypes_.size());
230 
231  PtrList<dictionary> patchDicts;
232 
234  (
235  runTime_,
236  runTime_.constant(),
238  patchNames_,
239  patchDicts,
240  defaultFacesName_,
241  defaultFacesType_
242  );
243 
244  forAll(patchDicts, patchi)
245  {
246  if (patchDicts.set(patchi))
247  {
248  const dictionary& dict = patchDicts[patchi];
249  dict.readIfPresent("type", patchTypes_[patchi]);
250  dict.readIfPresent("physicalType", patchPhysicalTypes_[patchi]);
251  }
252  }
253 }
254 
255 
256 // ************************************************************************* //
label nPatches
Definition: readKivaGrid.H:402
dictionary dict
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
FvWallInfoData< WallInfo, label > label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
labelList pointLabels(nPoints, -1)
error FatalError
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:306
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
Definition: polyMesh.H:328
void size(const label)
Override size to be inconsistent with allocated storage.
Definition: ListI.H:164
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
const word & constant() const
Return constant name.
Definition: TimePaths.H:123
List< label > labelList
A List of labels.
Definition: labelList.H:56
errorManip< error > abort(error &err)
Definition: errorManip.H:131
preservePatchTypes
static const char nl
Definition: Ostream.H:260
word name(const complex &)
Return a string representation of a complex.
Definition: complex.C:47
void preservePatchTypes(const objectRegistry &obr, const word &meshInstance, const fileName &meshDir, const wordList &patchNames, PtrList< dictionary > &patchDicts, const word &defaultFacesName, word &defaultFacesType)
Preserve patch types.
void setSize(const label)
Reset size of List.
Definition: List.C:281
label patchi
messageStream Info
PtrList< dictionary > patchDicts
Definition: readKivaGrid.H:537