1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
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 the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
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
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 Selects a section of mesh based on a cellSet.
28 The utility sub-sets the mesh to choose only a part of interest. Check
29 the setSet/cellSet utilities to see how to select cells based on various.
31 The mesh will subset all points, faces and cells needed to make a sub-mesh
32 but will not preserve attached boundary types.
34 \*---------------------------------------------------------------------------*/
36 #include "fvMeshSubset.H"
39 #include "IOobjectList.H"
40 #include "volFields.H"
44 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
50 const fvMeshSubset& subsetter,
51 const wordList& fieldNames,
52 PtrList<GeometricField<Type, fvPatchField, volMesh> >& subFields
55 const fvMesh& baseMesh = subsetter.baseMesh();
59 const word& fieldName = fieldNames[i];
61 Info<< "Subsetting field " << fieldName << endl;
63 GeometricField<Type, fvPatchField, volMesh> fld
68 baseMesh.time().timeName(),
76 subFields.set(i, subsetter.interpolate(fld));
82 void subsetSurfaceFields
84 const fvMeshSubset& subsetter,
85 const wordList& fieldNames,
86 PtrList<GeometricField<Type, fvsPatchField, surfaceMesh> >& subFields
89 const fvMesh& baseMesh = subsetter.baseMesh();
93 const word& fieldName = fieldNames[i];
95 Info<< "Subsetting field " << fieldName << endl;
97 GeometricField<Type, fvsPatchField, surfaceMesh> fld
102 baseMesh.time().timeName(),
110 subFields.set(i, subsetter.interpolate(fld));
116 void subsetPointFields
118 const fvMeshSubset& subsetter,
119 const pointMesh& pMesh,
120 const wordList& fieldNames,
121 PtrList<GeometricField<Type, pointPatchField, pointMesh> >& subFields
124 const fvMesh& baseMesh = subsetter.baseMesh();
126 forAll(fieldNames, i)
128 const word& fieldName = fieldNames[i];
130 Info<< "Subsetting field " << fieldName << endl;
132 GeometricField<Type, pointPatchField, pointMesh> fld
137 baseMesh.time().timeName(),
145 subFields.set(i, subsetter.interpolate(fld));
152 int main(int argc, char *argv[])
154 argList::validArgs.append("set");
155 argList::validOptions.insert("patch", "patch name");
156 argList::validOptions.insert("overwrite", "");
158 # include "setRootCase.H"
159 # include "createTime.H"
160 # include "createMesh.H"
162 word setName(args.additionalArgs()[0]);
163 bool overwrite = args.options().found("overwrite");
166 Info<< "Reading cell set from " << setName << endl << endl;
168 // Create mesh subsetting engine
169 fvMeshSubset subsetter(mesh);
173 if (args.options().found("patch"))
175 word patchName(args.options()["patch"]);
177 patchI = mesh.boundaryMesh().findPatchID(patchName);
181 FatalErrorIn(args.executable()) << "Illegal patch " << patchName
182 << nl << "Valid patches are " << mesh.boundaryMesh().names()
186 Info<< "Adding exposed internal faces to patch " << patchName << endl
191 Info<< "Adding exposed internal faces to a patch called"
192 << " \"oldInternalFaces\" (created if nessecary)" << endl
197 cellSet currentSet(mesh, setName);
199 subsetter.setLargeCellSubset(currentSet, patchI, true);
201 IOobjectList objects(mesh, runTime.timeName());
204 // Read vol fields and subset
205 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
207 wordList scalarNames(objects.names(volScalarField::typeName));
208 PtrList<volScalarField> scalarFlds(scalarNames.size());
209 subsetVolFields(subsetter, scalarNames, scalarFlds);
211 wordList vectorNames(objects.names(volVectorField::typeName));
212 PtrList<volVectorField> vectorFlds(vectorNames.size());
213 subsetVolFields(subsetter, vectorNames, vectorFlds);
215 wordList sphericalTensorNames
217 objects.names(volSphericalTensorField::typeName)
219 PtrList<volSphericalTensorField> sphericalTensorFlds
221 sphericalTensorNames.size()
223 subsetVolFields(subsetter, sphericalTensorNames, sphericalTensorFlds);
225 wordList symmTensorNames(objects.names(volSymmTensorField::typeName));
226 PtrList<volSymmTensorField> symmTensorFlds(symmTensorNames.size());
227 subsetVolFields(subsetter, symmTensorNames, symmTensorFlds);
229 wordList tensorNames(objects.names(volTensorField::typeName));
230 PtrList<volTensorField> tensorFlds(tensorNames.size());
231 subsetVolFields(subsetter, tensorNames, tensorFlds);
234 // Read surface fields and subset
235 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
237 wordList surfScalarNames(objects.names(surfaceScalarField::typeName));
238 PtrList<surfaceScalarField> surfScalarFlds(surfScalarNames.size());
239 subsetSurfaceFields(subsetter, surfScalarNames, surfScalarFlds);
241 wordList surfVectorNames(objects.names(surfaceVectorField::typeName));
242 PtrList<surfaceVectorField> surfVectorFlds(surfVectorNames.size());
243 subsetSurfaceFields(subsetter, surfVectorNames, surfVectorFlds);
245 wordList surfSphericalTensorNames
247 objects.names(surfaceSphericalTensorField::typeName)
249 PtrList<surfaceSphericalTensorField> surfSphericalTensorFlds
251 surfSphericalTensorNames.size()
256 surfSphericalTensorNames,
257 surfSphericalTensorFlds
260 wordList surfSymmTensorNames
262 objects.names(surfaceSymmTensorField::typeName)
264 PtrList<surfaceSymmTensorField> surfSymmTensorFlds
266 surfSymmTensorNames.size()
268 subsetSurfaceFields(subsetter, surfSymmTensorNames, surfSymmTensorFlds);
270 wordList surfTensorNames(objects.names(surfaceTensorField::typeName));
271 PtrList<surfaceTensorField> surfTensorFlds(surfTensorNames.size());
272 subsetSurfaceFields(subsetter, surfTensorNames, surfTensorFlds);
275 // Read point fields and subset
276 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
278 pointMesh pMesh(mesh);
280 wordList pointScalarNames(objects.names(pointScalarField::typeName));
281 PtrList<pointScalarField> pointScalarFlds(pointScalarNames.size());
282 subsetPointFields(subsetter, pMesh, pointScalarNames, pointScalarFlds);
284 wordList pointVectorNames(objects.names(pointVectorField::typeName));
285 PtrList<pointVectorField> pointVectorFlds(pointVectorNames.size());
286 subsetPointFields(subsetter, pMesh, pointVectorNames, pointVectorFlds);
288 wordList pointSphericalTensorNames
290 objects.names(pointSphericalTensorField::typeName)
292 PtrList<pointSphericalTensorField> pointSphericalTensorFlds
294 pointSphericalTensorNames.size()
300 pointSphericalTensorNames,
301 pointSphericalTensorFlds
304 wordList pointSymmTensorNames
306 objects.names(pointSymmTensorField::typeName)
308 PtrList<pointSymmTensorField> pointSymmTensorFlds
310 pointSymmTensorNames.size()
316 pointSymmTensorNames,
320 wordList pointTensorNames(objects.names(pointTensorField::typeName));
321 PtrList<pointTensorField> pointTensorFlds(pointTensorNames.size());
322 subsetPointFields(subsetter, pMesh, pointTensorNames, pointTensorFlds);
326 // Write mesh and fields to new time
327 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
334 Info<< "Writing subsetted mesh and fields to time " << runTime.value()
336 subsetter.subMesh().write();
339 // Subsetting adds 'subset' prefix. Rename field to be like original.
340 forAll(scalarFlds, i)
342 scalarFlds[i].rename(scalarNames[i]);
344 scalarFlds[i].write();
346 forAll(vectorFlds, i)
348 vectorFlds[i].rename(vectorNames[i]);
350 vectorFlds[i].write();
352 forAll(sphericalTensorFlds, i)
354 sphericalTensorFlds[i].rename(sphericalTensorNames[i]);
356 sphericalTensorFlds[i].write();
358 forAll(symmTensorFlds, i)
360 symmTensorFlds[i].rename(symmTensorNames[i]);
362 symmTensorFlds[i].write();
364 forAll(tensorFlds, i)
366 tensorFlds[i].rename(tensorNames[i]);
368 tensorFlds[i].write();
372 forAll(surfScalarFlds, i)
374 surfScalarFlds[i].rename(surfScalarNames[i]);
376 surfScalarFlds[i].write();
378 forAll(surfVectorFlds, i)
380 surfVectorFlds[i].rename(surfVectorNames[i]);
382 surfVectorFlds[i].write();
384 forAll(surfSphericalTensorFlds, i)
386 surfSphericalTensorFlds[i].rename(surfSphericalTensorNames[i]);
388 surfSphericalTensorFlds[i].write();
390 forAll(surfSymmTensorFlds, i)
392 surfSymmTensorFlds[i].rename(surfSymmTensorNames[i]);
394 surfSymmTensorFlds[i].write();
396 forAll(surfTensorNames, i)
398 surfTensorFlds[i].rename(surfTensorNames[i]);
400 surfTensorFlds[i].write();
404 forAll(pointScalarFlds, i)
406 pointScalarFlds[i].rename(pointScalarNames[i]);
408 pointScalarFlds[i].write();
410 forAll(pointVectorFlds, i)
412 pointVectorFlds[i].rename(pointVectorNames[i]);
414 pointVectorFlds[i].write();
416 forAll(pointSphericalTensorFlds, i)
418 pointSphericalTensorFlds[i].rename(pointSphericalTensorNames[i]);
420 pointSphericalTensorFlds[i].write();
422 forAll(pointSymmTensorFlds, i)
424 pointSymmTensorFlds[i].rename(pointSymmTensorNames[i]);
426 pointSymmTensorFlds[i].write();
428 forAll(pointTensorNames, i)
430 pointTensorFlds[i].rename(pointTensorNames[i]);
432 pointTensorFlds[i].write();
436 Info << nl << "End" << endl;
442 // ************************************************************************* //