54 Foam::scalar Foam::sampledSurfaces::mergeTol_ = 1
e-10;
61 const sampledSurface&
s
64 return s.getRegistrySurface
74 const sampledSurface&
s
77 return s.storeRegistrySurface
85 bool Foam::sampledSurfaces::removeRegistrySurface
87 const sampledSurface&
s
90 return s.removeRegistrySurface
98 void Foam::sampledSurfaces::countFields()
101 HashTable<wordHashSet> selected;
106 IOobjectList objects(obr_, obr_.time().timeName());
108 allFields = objects.names();
109 selected = objects.classes(fieldSelection_);
114 allFields = obr_.names();
115 selected = obr_.classes(fieldSelection_);
125 DynamicList<label> missed(fieldSelection_.size());
128 forAll(fieldSelection_, i)
130 if (
findStrings(fieldSelection_[i], allFields).empty())
141 << (loadFromFiles_ ?
"field file" :
"registered field")
143 << UIndirectList<wordRe>(fieldSelection_, missed) <<
endl;
148 label nVolumeFields = 0;
149 label nSurfaceFields = 0;
153 const word& clsName = iter.key();
154 const label
n = iter.val().size();
171 const sampledSurface&
s = (*this)[surfi];
172 surfaceWriter& outWriter = writers_[surfi];
174 outWriter.nFields() =
177 + (
s.withSurfaceFields() ? nSurfaceFields : 0)
181 !
s.interpolate() &&
s.hasFaceIds() && !outWriter.usesFaceIds()
192 const dictionary& formatOptions,
193 const dictionary& surfDict
197 surfDict.readIfPresent<word>(
"surfaceFormat", writeType);
199 dictionary options = formatOptions.subOrEmptyDict(writeType);
203 surfDict.subOrEmptyDict(
"formatOptions").subOrEmptyDict(writeType)
212 Foam::sampledSurfaces::sampledSurfaces
221 loadFromFiles_(
false),
241 Foam::sampledSurfaces::sampledSurfaces
246 const bool loadFromFiles
251 loadFromFiles_(loadFromFiles),
289 fieldSelection_.clear();
303 const word writerType =
311 if (eptr && eptr->isDict())
315 actions_.
resize(surfs.size(), ACTION_WRITE);
316 writers_.resize(surfs.size());
317 nFaces_.resize(surfs.size(),
Zero);
323 if (!dEntry.isDict())
344 surfs.set(surfi, surf);
349 actions_[surfi] |= ACTION_STORE;
353 actions_[surfi] |= ACTION_SURF_MESH;
360 newWriter(writerType, formatOptions, surfDict)
363 writers_[surfi].isPointData() = surfs[surfi].interpolate();
366 writers_[surfi].useTimeDir(
true);
367 writers_[surfi].verbose(verbose_);
373 actions_.resize(surfi);
374 writers_.resize(surfi);
375 surfaces().transfer(surfs);
392 actions_.
resize(surfs.size(), ACTION_WRITE);
393 writers_.resize(surfs.size());
394 nFaces_.resize(surfs.size(),
Zero);
410 surfs.set(surfi, surf);
415 actions_[surfi] |= ACTION_STORE;
419 actions_[surfi] |= ACTION_SURF_MESH;
426 newWriter(writerType, formatOptions, surfDict)
429 writers_[surfi].isPointData() = surfs[surfi].interpolate();
432 writers_[surfi].useTimeDir(
true);
433 writers_[surfi].verbose(verbose_);
439 actions_.resize(surfi);
440 writers_.resize(surfi);
441 surfaces().transfer(surfs);
445 const auto& surfs = surfaces();
451 nFaces_.resize(surfs.size(),
Zero);
454 fieldSelection_.uniq();
462 Info<<
"Sampled surface:" <<
nl;
465 Info<<
" " <<
s.name() <<
" -> " << writers_[surfi].type();
466 if (actions_[surfi] & ACTION_STORE)
468 Info<<
", store on registry ("
471 if (actions_[surfi] & ACTION_SURF_MESH)
473 Info<<
", store as surfMesh (deprecated)";
482 Pout<<
"sample fields:" << fieldSelection_ <<
nl
483 <<
"sample surfaces:" <<
nl <<
'(' <<
nl;
499 bool Foam::sampledSurfaces::performAction(
unsigned request)
508 if (request & actions_[surfi])
512 writers_[surfi].expire();
515 nFaces_[surfi] =
returnReduce(
s.faces().size(), sumOp<label>());
517 ok = ok || nFaces_[surfi];
524 if ((request & actions_[surfi]) & ACTION_STORE)
526 storeRegistrySurface(
s);
529 if ((request & actions_[surfi]) & ACTION_SURF_MESH)
552 const sampledSurface&
s = (*this)[surfi];
554 if (((request & actions_[surfi]) & ACTION_WRITE) && nFaces_[surfi])
556 surfaceWriter& outWriter = writers_[surfi];
558 if (outWriter.needsUpdate())
560 outWriter.setSurface(
s);
563 outWriter.open(outputPath_/
s.name());
565 outWriter.beginTime(obr_.time());
568 if (!
s.interpolate() &&
s.hasFaceIds() && !outWriter.usesFaceIds())
572 Field<label> ids(
s.faceIds());
589 writeSurface(outWriter, ids,
"Ids");
596 const IOobjectList objects(obr_, obr_.time().timeName());
598 performAction<volScalarField>(objects, request);
599 performAction<volVectorField>(objects, request);
600 performAction<volSphericalTensorField>(objects, request);
601 performAction<volSymmTensorField>(objects, request);
602 performAction<volTensorField>(objects, request);
610 [] (
const sampledSurface&
s) {
return s.withSurfaceFields(); }
614 performAction<surfaceScalarField>(objects, request);
615 performAction<surfaceVectorField>(objects, request);
616 performAction<surfaceSphericalTensorField>(objects, request);
617 performAction<surfaceSymmTensorField>(objects, request);
618 performAction<surfaceTensorField>(objects, request);
625 if (((request & actions_[surfi]) & ACTION_WRITE) && nFaces_[surfi])
630 if (!writers_[surfi].wroteData())
632 writers_[surfi].write();
635 writers_[surfi].endTime();
647 return performAction(ACTION_ALL & ~ACTION_WRITE);
656 return performAction(ACTION_ALL);
662 if (&mpm.
mesh() == &mesh_)
690 bool Foam::sampledSurfaces::needsUpdate()
const
704 bool Foam::sampledSurfaces::expire(
const bool force)
707 const scalar mergeDim = mergeTol_ * mesh_.bounds().mag();
713 sampledSurface&
s = (*this)[surfi];
715 if (
s.invariant() && !force)
725 writers_[surfi].expire();
726 writers_[surfi].mergeDim() = mergeDim;
735 bool Foam::sampledSurfaces::update()
746 sampledSurface&
s = (*this)[surfi];
751 writers_[surfi].expire();
754 nFaces_[surfi] =
returnReduce(
s.faces().size(), sumOp<label>());
769 const scalar prev(mergeTol_);