void Foam::sampledIsoSurface::getIsoFields() const { const fvMesh& fvm = static_cast<const fvMesh&>(mesh()); // Get volField // ~~~~~~~~~~~~ if (fvm.foundObject<volScalarField>(isoField_)) { if (debug) { Info<< "sampledIsoSurface::getIsoField() : lookup volField " << isoField_ << endl; } storedVolFieldPtr_.clear(); volFieldPtr_ = &fvm.lookupObject<volScalarField>(isoField_); } else { // Bit of a hack. Read field and store. if (debug) { Info<< "sampledIsoSurface::getIsoField() : checking " << isoField_ << " for same time " << fvm.time().timeName() << endl; } if ( storedVolFieldPtr_.empty() || (fvm.time().timeName() != storedVolFieldPtr_().instance()) ) { if (debug) { Info<< "sampledIsoSurface::getIsoField() : reading volField " << isoField_ << " from time " << fvm.time().timeName() << endl; } storedVolFieldPtr_.reset ( new volScalarField ( IOobject ( isoField_, fvm.time().timeName(), fvm, IOobject::MUST_READ, IOobject::NO_WRITE, false ), fvm ) ); volFieldPtr_ = storedVolFieldPtr_.operator->(); } } // Get pointField // ~~~~~~~~~~~~~~ if (!subMeshPtr_.valid()) { word pointFldName = "volPointInterpolate(" + isoField_ + ')'; if (fvm.foundObject<pointScalarField>(pointFldName)) { if (debug) { Info<< "sampledIsoSurface::getIsoField() : lookup pointField " << pointFldName << endl; } pointFieldPtr_ = &fvm.lookupObject<pointScalarField>(pointFldName); } else { // Not in registry. Interpolate. if (debug) { Info<< "sampledIsoSurface::getIsoField() : checking pointField " << pointFldName << " for same time " << fvm.time().timeName() << endl; } if ( storedPointFieldPtr_.empty() || (fvm.time().timeName() != storedPointFieldPtr_().instance()) ) { if (debug) { Info<< "sampledIsoSurface::getIsoField() :" << " interpolating volField " << volFieldPtr_->name() << " to get pointField " << pointFldName << endl; } storedPointFieldPtr_.reset ( volPointInterpolation::New(fvm) .interpolate(*volFieldPtr_).ptr() ); storedPointFieldPtr_->checkOut(); pointFieldPtr_ = storedPointFieldPtr_.operator->(); } } // If averaging redo the volField. Can only be done now since needs the // point field. if (average_) { storedVolFieldPtr_.reset(average(fvm, *pointFieldPtr_).ptr()); volFieldPtr_ = storedVolFieldPtr_.operator->(); } if (debug) { Info<< "sampledIsoSurface::getIsoField() : volField " << volFieldPtr_->name() << " min:" << min(*volFieldPtr_).value() << " max:" << max(*volFieldPtr_).value() << endl; Info<< "sampledIsoSurface::getIsoField() : pointField " << pointFieldPtr_->name() << " min:" << gMin(pointFieldPtr_->internalField()) << " max:" << gMax(pointFieldPtr_->internalField()) << endl; } } else { // Get subMesh variants const fvMesh& subFvm = subMeshPtr_().subMesh(); // Either lookup on the submesh or subset the whole-mesh volField if (subFvm.foundObject<volScalarField>(isoField_)) { if (debug) { Info<< "sampledIsoSurface::getIsoField() :" << " submesh lookup volField " << isoField_ << endl; } storedVolSubFieldPtr_.clear(); volSubFieldPtr_ = &subFvm.lookupObject<volScalarField>(isoField_); } else { if (debug) { Info<< "sampledIsoSurface::getIsoField() : subsetting volField " << isoField_ << endl; } storedVolSubFieldPtr_.reset ( subMeshPtr_().interpolate ( *volFieldPtr_ ).ptr() ); storedVolSubFieldPtr_->checkOut(); volSubFieldPtr_ = storedVolSubFieldPtr_.operator->(); } // Pointfield on submesh word pointFldName = "volPointInterpolate(" + volSubFieldPtr_->name() + ')'; if (subFvm.foundObject<pointScalarField>(pointFldName)) { if (debug) { Info<< "sampledIsoSurface::getIsoField() :" << " submesh lookup pointField " << pointFldName << endl; } storedPointSubFieldPtr_.clear(); pointSubFieldPtr_ = &subFvm.lookupObject<pointScalarField> ( pointFldName ); } else { if (debug) { Info<< "sampledIsoSurface::getIsoField() :" << " interpolating submesh volField " << volSubFieldPtr_->name() << " to get submesh pointField " << pointFldName << endl; } storedPointSubFieldPtr_.reset ( volPointInterpolation::New ( subFvm ).interpolate(*volSubFieldPtr_).ptr() ); storedPointSubFieldPtr_->checkOut(); pointSubFieldPtr_ = storedPointSubFieldPtr_.operator->(); } // If averaging redo the volField. Can only be done now since needs the // point field. if (average_) { storedVolSubFieldPtr_.reset ( average(subFvm, *pointSubFieldPtr_).ptr() ); volSubFieldPtr_ = storedVolSubFieldPtr_.operator->(); } if (debug) { Info<< "sampledIsoSurface::getIsoField() : volSubField " << volSubFieldPtr_->name() << " min:" << min(*volSubFieldPtr_).value() << " max:" << max(*volSubFieldPtr_).value() << endl; Info<< "sampledIsoSurface::getIsoField() : pointSubField " << pointSubFieldPtr_->name() << " min:" << gMin(pointSubFieldPtr_->internalField()) << " max:" << gMax(pointSubFieldPtr_->internalField()) << endl; } } }
void Foam::sampledIsoSurface::getIsoFields() const { const fvMesh& fvm = static_cast<const fvMesh&>(mesh()); // Get volField // ~~~~~~~~~~~~ if (fvm.foundObject<volScalarField>(isoField_)) { if (debug) { InfoInFunction << "Lookup volField " << isoField_ << endl; } storedVolFieldPtr_.clear(); volFieldPtr_ = &fvm.lookupObject<volScalarField>(isoField_); } else { // Bit of a hack. Read field and store. if (debug) { InfoInFunction << "Checking " << isoField_ << " for same time " << fvm.time().timeName() << endl; } if ( storedVolFieldPtr_.empty() || (fvm.time().timeName() != storedVolFieldPtr_().instance()) ) { if (debug) { InfoInFunction << "Reading volField " << isoField_ << " from time " << fvm.time().timeName() << endl; } IOobject vfHeader ( isoField_, fvm.time().timeName(), fvm, IOobject::MUST_READ, IOobject::NO_WRITE, false ); if (vfHeader.typeHeaderOk<volScalarField>(true)) { storedVolFieldPtr_.reset ( new volScalarField ( vfHeader, fvm ) ); volFieldPtr_ = storedVolFieldPtr_.operator->(); } else { FatalErrorInFunction << "Cannot find isosurface field " << isoField_ << " in database or directory " << vfHeader.path() << exit(FatalError); } } } // Get pointField // ~~~~~~~~~~~~~~ // In case of multiple iso values we don't want to calculate multiple e.g. // "volPointInterpolate(p)" so register it and re-use it. This is the // same as the 'cache' functionality from volPointInterpolate but // unfortunately that one does not guarantee that the field pointer // remain: e.g. some other functionObject might delete the cached version. // (volPointInterpolation::interpolate with cache=false deletes any // registered one or if mesh.changing()) if (!subMeshPtr_.valid()) { const word pointFldName = "volPointInterpolate_" + type() + "(" + isoField_ + ')'; if (fvm.foundObject<pointScalarField>(pointFldName)) { if (debug) { InfoInFunction << "lookup pointField " << pointFldName << endl; } const pointScalarField& pfld = fvm.lookupObject<pointScalarField> ( pointFldName ); if (!pfld.upToDate(*volFieldPtr_)) { if (debug) { InfoInFunction << "updating pointField " << pointFldName << endl; } // Update the interpolated value volPointInterpolation::New(fvm).interpolate ( *volFieldPtr_, const_cast<pointScalarField&>(pfld) ); } pointFieldPtr_ = &pfld; } else { // Not in registry. Interpolate. if (debug) { InfoInFunction << "Checking pointField " << pointFldName << " for same time " << fvm.time().timeName() << endl; } // Interpolate without cache. Note that we're registering it // below so next time round it goes into the condition // above. tmp<pointScalarField> tpfld ( volPointInterpolation::New(fvm).interpolate ( *volFieldPtr_, pointFldName, false ) ); pointFieldPtr_ = tpfld.ptr(); const_cast<pointScalarField*>(pointFieldPtr_)->store(); } // If averaging redo the volField. Can only be done now since needs the // point field. if (average_) { storedVolFieldPtr_.reset ( pointAverage(*pointFieldPtr_).ptr() ); volFieldPtr_ = storedVolFieldPtr_.operator->(); } if (debug) { InfoInFunction << "volField " << volFieldPtr_->name() << " min:" << min(*volFieldPtr_).value() << " max:" << max(*volFieldPtr_).value() << endl; InfoInFunction << "pointField " << pointFieldPtr_->name() << " min:" << gMin(pointFieldPtr_->primitiveField()) << " max:" << gMax(pointFieldPtr_->primitiveField()) << endl; } } else { // Get subMesh variants const fvMesh& subFvm = subMeshPtr_().subMesh(); // Either lookup on the submesh or subset the whole-mesh volField if (subFvm.foundObject<volScalarField>(isoField_)) { if (debug) { InfoInFunction << "Sub-mesh lookup volField " << isoField_ << endl; } storedVolSubFieldPtr_.clear(); volSubFieldPtr_ = &subFvm.lookupObject<volScalarField>(isoField_); } else { if (debug) { InfoInFunction << "Sub-setting volField " << isoField_ << endl; } storedVolSubFieldPtr_.reset ( subMeshPtr_().interpolate ( *volFieldPtr_ ).ptr() ); storedVolSubFieldPtr_->checkOut(); volSubFieldPtr_ = storedVolSubFieldPtr_.operator->(); } // Pointfield on submesh word pointFldName = "volPointInterpolate(" + volSubFieldPtr_->name() + ')'; if (subFvm.foundObject<pointScalarField>(pointFldName)) { if (debug) { InfoInFunction << "Sub-mesh lookup pointField " << pointFldName << endl; } storedPointSubFieldPtr_.clear(); pointSubFieldPtr_ = &subFvm.lookupObject<pointScalarField> ( pointFldName ); } else { if (debug) { InfoInFunction << "Interpolating submesh volField " << volSubFieldPtr_->name() << " to get submesh pointField " << pointFldName << endl; } storedPointSubFieldPtr_.reset ( volPointInterpolation::New ( subFvm ).interpolate(*volSubFieldPtr_).ptr() ); storedPointSubFieldPtr_->checkOut(); pointSubFieldPtr_ = storedPointSubFieldPtr_.operator->(); } // If averaging redo the volField. Can only be done now since needs the // point field. if (average_) { storedVolSubFieldPtr_.reset ( pointAverage(*pointSubFieldPtr_).ptr() ); volSubFieldPtr_ = storedVolSubFieldPtr_.operator->(); } if (debug) { InfoInFunction << "volSubField " << volSubFieldPtr_->name() << " min:" << min(*volSubFieldPtr_).value() << " max:" << max(*volSubFieldPtr_).value() << endl; InfoInFunction << "pointSubField " << pointSubFieldPtr_->name() << " min:" << gMin(pointSubFieldPtr_->primitiveField()) << " max:" << gMax(pointSubFieldPtr_->primitiveField()) << endl; } } }