FreeFOAM The Cross-Platform CFD Toolkit
setFields.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 | Copyright (C) 1991-2010 OpenCFD Ltd.
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 Application
25  setFields
26 
27 Description
28  Selects a cell set through a dictionary.
29 
30 Usage
31 
32  - setFields [OPTIONS]
33 
34  @param -noZero \n
35  Ignore timestep 0.
36 
37  @param -constant \n
38  Include the constant directory.
39 
40  @param -time <time>\n
41  Apply only to specific time.
42 
43  @param -latestTime \n
44  Only apply to latest time step.
45 
46  @param -case <dir>\n
47  Case directory.
48 
49  @param -parallel \n
50  Run in parallel.
51 
52  @param -help \n
53  Display help message.
54 
55  @param -doc \n
56  Display Doxygen API documentation page for this application.
57 
58  @param -srcDoc \n
59  Display Doxygen source documentation page for this application.
60 
61 \*---------------------------------------------------------------------------*/
62 
63 #include <OpenFOAM/argList.H>
64 #include <OpenFOAM/timeSelector.H>
65 #include <OpenFOAM/Time.H>
66 #include <finiteVolume/fvMesh.H>
68 #include <meshTools/cellSet.H>
69 #include <finiteVolume/volFields.H>
70 
71 using namespace Foam;
72 
73 template<class GeoField>
74 void setFieldType
75 (
76  const fvMesh& mesh,
77  const labelList& selectedCells,
78  Istream& fieldValueStream
79 )
80 {
81  word fieldName(fieldValueStream);
82 
83  IOobject fieldHeader
84  (
85  fieldName,
86  mesh.time().timeName(),
87  mesh,
89  );
90 
91  // Check field exists
92  if (fieldHeader.headerOk())
93  {
94  Info<< " Setting " << fieldHeader.headerClassName()
95  << " " << fieldName << endl;
96 
97  GeoField field(fieldHeader, mesh);
98 
99  typename GeoField::value_type value
100  (
101  static_cast<const typename GeoField::value_type&>
102  (
104  )
105  );
106 
107  if (selectedCells.size() == field.size())
108  {
109  field.internalField() = value;
110  }
111  else
112  {
113  forAll(selectedCells, celli)
114  {
115  field[selectedCells[celli]] = value;
116  }
117  }
118 
119  forAll(field.boundaryField(), patchi)
120  {
121  field.boundaryField()[patchi] =
122  field.boundaryField()[patchi].patchInternalField();
123  }
124 
125  field.write();
126  }
127  else
128  {
129  WarningIn
130  (
131  "void setFieldType"
132  "(const fvMesh& mesh, const labelList& selectedCells,"
133  "Istream& fieldValueStream)"
134  ) << "Field " << fieldName << " not found" << endl;
135  }
136 }
137 
138 
139 class setField
140 {
141 
142 public:
143 
144  setField()
145  {}
146 
147  autoPtr<setField> clone() const
148  {
149  return autoPtr<setField>(new setField());
150  }
151 
152  class iNew
153  {
154  const fvMesh& mesh_;
155  const labelList& selectedCells_;
156 
157  public:
158 
159  iNew(const fvMesh& mesh, const labelList& selectedCells)
160  :
161  mesh_(mesh),
162  selectedCells_(selectedCells)
163  {}
164 
165  autoPtr<setField> operator()(Istream& fieldValues) const
166  {
167  word fieldType(fieldValues);
168 
169  if (fieldType == "volScalarFieldValue")
170  {
171  setFieldType<volScalarField>
172  (mesh_, selectedCells_, fieldValues);
173  }
174  else if (fieldType == "volVectorFieldValue")
175  {
176  setFieldType<volVectorField>
177  (mesh_, selectedCells_, fieldValues);
178  }
179  else if (fieldType == "volSphericalTensorFieldValue")
180  {
181  setFieldType<volSphericalTensorField>
182  (mesh_, selectedCells_, fieldValues);
183  }
184  else if (fieldType == "volSymmTensorFieldValue")
185  {
186  setFieldType<volSymmTensorField>
187  (mesh_, selectedCells_, fieldValues);
188  }
189  else if (fieldType == "volTensorFieldValue")
190  {
191  setFieldType<volTensorField>
192  (mesh_, selectedCells_, fieldValues);
193  }
194  else
195  {
196  WarningIn("setField::iNew::operator()(Istream& is)")
197  << "field type " << fieldType << " not currently supported"
198  << endl;
199  }
200 
201  return autoPtr<setField>(new setField());
202  }
203  };
204 };
205 
206 
207 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
208 
209 int main(int argc, char *argv[])
210 {
212 
213 # include <OpenFOAM/setRootCase.H>
214 # include <OpenFOAM/createTime.H>
215 
216  // Get times list
218 
219 # include <OpenFOAM/createMesh.H>
220 
221  Info<< "Reading setFieldsDict\n" << endl;
222 
223  IOdictionary setFieldsDict
224  (
225  IOobject
226  (
227  "setFieldsDict",
228  runTime.system(),
229  mesh,
232  )
233  );
234 
235  if (setFieldsDict.found("defaultFieldValues"))
236  {
237  Info<< "Setting field default values" << endl;
238  PtrList<setField> defaultFieldValues
239  (
240  setFieldsDict.lookup("defaultFieldValues"),
241  setField::iNew(mesh, labelList(mesh.nCells()))
242  );
243  Info<< endl;
244  }
245 
246 
247  Info<< "Setting field region values" << endl;
248 
249  PtrList<entry> regions(setFieldsDict.lookup("regions"));
250 
251  forAll(regions, regionI)
252  {
253  const entry& region = regions[regionI];
254 
255  autoPtr<topoSetSource> cellSelector =
256  topoSetSource::New(region.keyword(), mesh, region.dict());
257 
258  cellSet selectedCellSet
259  (
260  mesh,
261  "cellSet",
262  mesh.nCells()/10+1 // Reasonable size estimate.
263  );
264 
265  cellSelector->applyToSet
266  (
268  selectedCellSet
269  );
270 
271  PtrList<setField> fieldValues
272  (
273  region.dict().lookup("fieldValues"),
274  setField::iNew(mesh, selectedCellSet.toc())
275  );
276  }
277 
278  Info<< "\nEnd" << endl;
279 
280  return 0;
281 }
282 
283 
284 // ************************ vim: set sw=4 sts=4 et: ************************ //