Foam::tmp<Foam::scalarField> Foam::GAMGInterface::agglomerateCoeffs ( const scalarField& fineCoeffs ) const { tmp<scalarField> tcoarseCoeffs(new scalarField(size(), 0.0)); scalarField& coarseCoeffs = tcoarseCoeffs(); // Added weights to account for non-integral matching forAll(restrictAddressing_, ffi) { coarseCoeffs[restrictAddressing_[ffi]] += restrictWeights_[ffi]*fineCoeffs[fineAddressing_[ffi]]; }
Foam::tmp<Foam::scalarField> Foam::GAMGInterface::agglomerateCoeffs ( const scalarField& fineCoeffs ) const { tmp<scalarField> tcoarseCoeffs(new scalarField(size(), 0.0)); scalarField& coarseCoeffs = tcoarseCoeffs(); forAll(faceRestrictAddressing_, ffi) { coarseCoeffs[faceRestrictAddressing_[ffi]] += fineCoeffs[ffi]; } return tcoarseCoeffs; }
Foam::tmp<Foam::scalargpuField> Foam::GAMGInterface::agglomerateCoeffs ( const scalargpuField& fineCoeffs ) const { tmp<scalargpuField> tcoarseCoeffs(new scalargpuField(size(), 0.0)); scalargpuField& coarseCoeffs = tcoarseCoeffs(); if (fineCoeffs.size() != faceRestrictAddressing_.size()) { FatalErrorIn ( "GAMGInterface::agglomerateCoeffs(const scalarField&) const" ) << "Size of coefficients " << fineCoeffs.size() << " does not correspond to the size of the restriction " << faceRestrictAddressing_.size() << abort(FatalError); } if (debug && max(faceRestrictAddressing_) > size()) { FatalErrorIn ( "GAMGInterface::agglomerateCoeffs(const scalargpuField&) const" ) << "Face restrict addressing addresses outside of coarse interface" << " size. Max addressing:" << max(faceRestrictAddressing_) << " coarse size:" << size() << abort(FatalError); } thrust::transform ( faceRestrictTargetStartAddressing_.begin(), faceRestrictTargetStartAddressing_.end()-1, faceRestrictTargetStartAddressing_.begin()+1, thrust::make_permutation_iterator ( coarseCoeffs.begin(), faceRestrictTargetAddressing_.begin() ), GAMGInterfaceAgglomerateCoeffs ( fineCoeffs.data(), faceRestrictSortAddressing_.data() ) ); return tcoarseCoeffs; }
Foam::tmp<Foam::scalarField> Foam::GAMGInterface::agglomerateCoeffs ( const scalarField& fineCoeffs ) const { tmp<scalarField> tcoarseCoeffs(new scalarField(size(), Zero)); scalarField& coarseCoeffs = tcoarseCoeffs.ref(); if (fineCoeffs.size() != faceRestrictAddressing_.size()) { FatalErrorInFunction << "Size of coefficients " << fineCoeffs.size() << " does not correspond to the size of the restriction " << faceRestrictAddressing_.size() << abort(FatalError); } if (debug && max(faceRestrictAddressing_) > size()) { FatalErrorInFunction << "Face restrict addressing addresses outside of coarse interface" << " size. Max addressing:" << max(faceRestrictAddressing_) << " coarse size:" << size() << abort(FatalError); } forAll(faceRestrictAddressing_, ffi) { coarseCoeffs[faceRestrictAddressing_[ffi]] += fineCoeffs[ffi]; } return tcoarseCoeffs; }