53 Foam::scalar Foam::sampledSurfaces::mergeTol_ = 1
e-10;
60 const sampledSurface&
s
63 return s.getRegistrySurface
73 const sampledSurface&
s
76 return s.storeRegistrySurface
84 bool Foam::sampledSurfaces::removeRegistrySurface
86 const sampledSurface&
s
89 return s.removeRegistrySurface
97 void Foam::sampledSurfaces::countFields()
100 HashTable<wordHashSet> selected;
105 IOobjectList objects(obr_, obr_.time().timeName());
107 allFields = objects.names();
108 selected = objects.classes(fieldSelection_);
113 allFields = obr_.names();
114 selected = obr_.classes(fieldSelection_);
124 DynamicList<label> missed(fieldSelection_.size());
127 forAll(fieldSelection_, i)
129 if (
findStrings(fieldSelection_[i], allFields).empty())
140 << (loadFromFiles_ ?
"field file" :
"registered field")
142 << UIndirectList<wordRe>(fieldSelection_, missed) <<
endl;
147 label nVolumeFields = 0;
148 label nSurfaceFields = 0;
152 const word& clsName = iter.key();
153 const label
n = iter.val().size();
170 const sampledSurface&
s = (*this)[surfi];
172 writers_[surfi].nFields() =
175 + (
s.withSurfaceFields() ? nSurfaceFields : 0)
176 + ((
s.hasFaceIds() && !
s.interpolate()) ? 1 : 0)
185 const dictionary& formatOptions,
186 const dictionary& surfDict
190 surfDict.readIfPresent<word>(
"surfaceFormat", writeType);
192 dictionary options = formatOptions.subOrEmptyDict(writeType);
196 surfDict.subOrEmptyDict(
"formatOptions").subOrEmptyDict(writeType)
205 Foam::sampledSurfaces::sampledSurfaces
214 loadFromFiles_(
false),
234 Foam::sampledSurfaces::sampledSurfaces
239 const bool loadFromFiles
244 loadFromFiles_(loadFromFiles),
268 verbose_ = verbosity;
280 fieldSelection_.clear();
294 const word writerType =
302 if (eptr && eptr->isDict())
306 actions_.
resize(surfs.size(), ACTION_WRITE);
307 writers_.resize(surfs.size());
308 nFaces_.resize(surfs.size(),
Zero);
314 if (!dEntry.isDict())
335 surfs.set(surfi, surf);
340 actions_[surfi] |= ACTION_STORE;
344 actions_[surfi] |= ACTION_SURF_MESH;
351 newWriter(writerType, formatOptions, surfDict)
354 writers_[surfi].isPointData() = surfs[surfi].interpolate();
357 writers_[surfi].useTimeDir() =
true;
358 writers_[surfi].verbose() = verbose_;
364 actions_.resize(surfi);
365 writers_.resize(surfi);
366 surfaces().transfer(surfs);
383 actions_.
resize(surfs.size(), ACTION_WRITE);
384 writers_.resize(surfs.size());
385 nFaces_.resize(surfs.size(),
Zero);
401 surfs.set(surfi, surf);
406 actions_[surfi] |= ACTION_STORE;
410 actions_[surfi] |= ACTION_SURF_MESH;
417 newWriter(writerType, formatOptions, surfDict)
420 writers_[surfi].isPointData() = surfs[surfi].interpolate();
423 writers_[surfi].useTimeDir() =
true;
424 writers_[surfi].verbose() = verbose_;
430 actions_.resize(surfi);
431 writers_.resize(surfi);
432 surfaces().transfer(surfs);
436 const auto& surfs = surfaces();
442 nFaces_.resize(surfs.size(),
Zero);
445 fieldSelection_.uniq();
453 Info<<
"Sampled surface:" <<
nl;
456 Info<<
" " <<
s.name() <<
" -> " << writers_[surfi].type();
457 if (actions_[surfi] & ACTION_STORE)
459 Info<<
", store on registry ("
462 if (actions_[surfi] & ACTION_SURF_MESH)
464 Info<<
", store as surfMesh (deprecated)";
473 Pout<<
"sample fields:" << fieldSelection_ <<
nl
474 <<
"sample surfaces:" <<
nl <<
'(' <<
nl;
490 bool Foam::sampledSurfaces::performAction(
unsigned request)
499 if (request & actions_[surfi])
503 writers_[surfi].expire();
506 nFaces_[surfi] =
returnReduce(
s.faces().size(), sumOp<label>());
508 ok = ok || nFaces_[surfi];
515 if ((request & actions_[surfi]) & ACTION_STORE)
517 storeRegistrySurface(
s);
520 if ((request & actions_[surfi]) & ACTION_SURF_MESH)
543 const sampledSurface&
s = (*this)[surfi];
545 if (((request & actions_[surfi]) & ACTION_WRITE) && nFaces_[surfi])
547 surfaceWriter& outWriter = writers_[surfi];
549 if (outWriter.needsUpdate())
551 outWriter.setSurface(
s);
554 outWriter.open(outputPath_/
s.name());
556 outWriter.beginTime(obr_.time());
559 if (
s.hasFaceIds() && !
s.interpolate())
563 Field<label> ids(
s.faceIds());
578 const IOobjectList objects(obr_, obr_.time().timeName());
580 performAction<volScalarField>(objects, request);
581 performAction<volVectorField>(objects, request);
582 performAction<volSphericalTensorField>(objects, request);
583 performAction<volSymmTensorField>(objects, request);
584 performAction<volTensorField>(objects, request);
592 [] (
const sampledSurface&
s) {
return s.withSurfaceFields(); }
596 performAction<surfaceScalarField>(objects, request);
597 performAction<surfaceVectorField>(objects, request);
598 performAction<surfaceSphericalTensorField>(objects, request);
599 performAction<surfaceSymmTensorField>(objects, request);
600 performAction<surfaceTensorField>(objects, request);
607 if (((request & actions_[surfi]) & ACTION_WRITE) && nFaces_[surfi])
612 if (!writers_[surfi].wroteData())
614 writers_[surfi].write();
617 writers_[surfi].endTime();
629 return performAction(ACTION_ALL & ~ACTION_WRITE);
638 return performAction(ACTION_ALL);
644 if (&mpm.
mesh() == &mesh_)
672 bool Foam::sampledSurfaces::needsUpdate()
const
686 bool Foam::sampledSurfaces::expire(
const bool force)
689 const scalar mergeDim = mergeTol_ * mesh_.bounds().mag();
695 sampledSurface&
s = (*this)[surfi];
697 if (
s.invariant() && !force)
707 writers_[surfi].expire();
708 writers_[surfi].mergeDim() = mergeDim;
717 bool Foam::sampledSurfaces::update()
728 sampledSurface&
s = (*this)[surfi];
733 writers_[surfi].expire();
736 nFaces_[surfi] =
returnReduce(
s.faces().size(), sumOp<label>());
751 const scalar prev(mergeTol_);