1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 2004-2010 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
13 the Free Software Foundation, either version 3 of the License, or
14 (at your 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, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "sampledCuttingPlane.H"
27 #include "dictionary.H"
28 #include "volFields.H"
29 #include "volPointInterpolation.H"
30 #include "addToRunTimeSelectionTable.H"
33 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
37 defineTypeNameAndDebug(sampledCuttingPlane, 0);
38 addNamedToRunTimeSelectionTable
47 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
49 void Foam::sampledCuttingPlane::createGeometry()
53 Pout<< "sampledCuttingPlane::createGeometry :updating geometry."
57 // Clear any stored topologies
60 pointDistance_.clear();
61 cellDistancePtr_.clear();
67 if (zoneID_.index() != -1 && !subMeshPtr_.valid())
69 const polyBoundaryMesh& patches = mesh().boundaryMesh();
71 // Patch to put exposed internal faces into
72 const label exposedPatchI = patches.findPatchID(exposedPatchName_);
76 Info<< "Allocating subset of size "
77 << mesh().cellZones()[zoneID_.index()].size()
78 << " with exposed faces into patch "
79 << patches[exposedPatchI].name() << endl;
84 new fvMeshSubset(static_cast<const fvMesh&>(mesh()))
86 subMeshPtr_().setLargeCellSubset
88 labelHashSet(mesh().cellZones()[zoneID_.index()]),
94 // Select either the submesh or the underlying mesh
98 ? subMeshPtr_().subMesh()
99 : static_cast<const fvMesh&>(mesh())
103 // Distance to cell centres
104 // ~~~~~~~~~~~~~~~~~~~~~~~~
106 cellDistancePtr_.reset
113 fvm.time().timeName(),
120 dimensionedScalar("zero", dimLength, 0)
123 volScalarField& cellDistance = cellDistancePtr_();
127 const pointField& cc = fvm.cellCentres();
128 scalarField& fld = cellDistance.internalField();
133 fld[i] = (cc[i] - plane_.refPoint()) & plane_.normal();
139 forAll(cellDistance.boundaryField(), patchI)
143 isA<emptyFvPatchScalarField>
145 cellDistance.boundaryField()[patchI]
149 cellDistance.boundaryField().set
152 new calculatedFvPatchScalarField
154 fvm.boundary()[patchI],
159 const polyPatch& pp = fvm.boundary()[patchI].patch();
160 pointField::subField cc = pp.patchSlice(fvm.faceCentres());
162 fvPatchScalarField& fld = cellDistance.boundaryField()[patchI];
163 fld.setSize(pp.size());
166 fld[i] = (cc[i] - plane_.refPoint()) & plane_.normal();
171 const pointField& cc = fvm.C().boundaryField()[patchI];
172 fvPatchScalarField& fld = cellDistance.boundaryField()[patchI];
176 fld[i] = (cc[i] - plane_.refPoint()) & plane_.normal();
183 // On processor patches the mesh.C() will already be the cell centre
184 // on the opposite side so no need to swap cellDistance.
187 // Distance to points
188 pointDistance_.setSize(fvm.nPoints());
190 const pointField& pts = fvm.points();
192 forAll(pointDistance_, i)
194 pointDistance_[i] = (pts[i] - plane_.refPoint()) & plane_.normal();
201 Pout<< "Writing cell distance:" << cellDistance.objectPath() << endl;
202 cellDistance.write();
203 pointScalarField pDist
208 fvm.time().timeName(),
215 dimensionedScalar("zero", dimLength, 0)
217 pDist.internalField() = pointDistance_;
219 Pout<< "Writing point distance:" << pDist.objectPath() << endl;
224 //- Direct from cell field and point field.
252 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
254 Foam::sampledCuttingPlane::sampledCuttingPlane
257 const polyMesh& mesh,
258 const dictionary& dict
261 sampledSurface(name, mesh, dict),
263 mergeTol_(dict.lookupOrDefault("mergeTol", 1E-6)),
264 regularise_(dict.lookupOrDefault("regularise", true)),
265 average_(dict.lookupOrDefault("average", false)),
266 zoneID_(dict.lookupOrDefault("zone", word::null), mesh.cellZones()),
267 exposedPatchName_(word::null),
270 cellDistancePtr_(NULL),
274 if (zoneID_.index() != -1)
276 dict.lookup("exposedPatchName") >> exposedPatchName_;
278 if (mesh.boundaryMesh().findPatchID(exposedPatchName_) == -1)
282 "sampledCuttingPlane::sampledCuttingPlane"
283 "(const word&, const polyMesh&, const dictionary&)"
284 ) << "Cannot find patch " << exposedPatchName_
285 << " in which to put exposed faces." << endl
286 << "Valid patches are " << mesh.boundaryMesh().names()
290 if (debug && zoneID_.index() != -1)
292 Info<< "Restricting to cellZone " << zoneID_.name()
293 << " with exposed internal faces into patch "
294 << exposedPatchName_ << endl;
300 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
302 Foam::sampledCuttingPlane::~sampledCuttingPlane()
306 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
308 bool Foam::sampledCuttingPlane::needsUpdate() const
314 bool Foam::sampledCuttingPlane::expire()
318 Pout<< "sampledCuttingPlane::expire :"
319 << " have-facesPtr_:" << facesPtr_.valid()
320 << " needsUpdate_:" << needsUpdate_ << endl;
323 // Clear any stored topologies
326 // Clear derived data
329 // already marked as expired
340 bool Foam::sampledCuttingPlane::update()
344 Pout<< "sampledCuttingPlane::update :"
345 << " have-facesPtr_:" << facesPtr_.valid()
346 << " needsUpdate_:" << needsUpdate_ << endl;
356 needsUpdate_ = false;
361 Foam::tmp<Foam::scalarField>
362 Foam::sampledCuttingPlane::sample
364 const volScalarField& vField
367 return sampleField(vField);
371 Foam::tmp<Foam::vectorField>
372 Foam::sampledCuttingPlane::sample
374 const volVectorField& vField
377 return sampleField(vField);
381 Foam::tmp<Foam::sphericalTensorField>
382 Foam::sampledCuttingPlane::sample
384 const volSphericalTensorField& vField
387 return sampleField(vField);
391 Foam::tmp<Foam::symmTensorField>
392 Foam::sampledCuttingPlane::sample
394 const volSymmTensorField& vField
397 return sampleField(vField);
401 Foam::tmp<Foam::tensorField>
402 Foam::sampledCuttingPlane::sample
404 const volTensorField& vField
407 return sampleField(vField);
411 Foam::tmp<Foam::scalarField>
412 Foam::sampledCuttingPlane::interpolate
414 const interpolation<scalar>& interpolator
417 return interpolateField(interpolator);
421 Foam::tmp<Foam::vectorField>
422 Foam::sampledCuttingPlane::interpolate
424 const interpolation<vector>& interpolator
427 return interpolateField(interpolator);
430 Foam::tmp<Foam::sphericalTensorField>
431 Foam::sampledCuttingPlane::interpolate
433 const interpolation<sphericalTensor>& interpolator
436 return interpolateField(interpolator);
440 Foam::tmp<Foam::symmTensorField>
441 Foam::sampledCuttingPlane::interpolate
443 const interpolation<symmTensor>& interpolator
446 return interpolateField(interpolator);
450 Foam::tmp<Foam::tensorField>
451 Foam::sampledCuttingPlane::interpolate
453 const interpolation<tensor>& interpolator
456 return interpolateField(interpolator);
460 void Foam::sampledCuttingPlane::print(Ostream& os) const
462 os << "sampledCuttingPlane: " << name() << " :"
463 << " plane:" << plane_
464 << " faces:" << faces().size()
465 << " points:" << points().size();
469 // ************************************************************************* //