Foam::Field<T> Foam::channelIndex::collapse ( const Field<T>& cellField, const bool asymmetric ) const { // Average and order const Field<T> summedField(regionSum(cellField)); Field<T> regionField ( summedField / regionCount_, sortMap_ ); // Symmetry? if (symmetric_) { label nlb2 = cellRegion_().nRegions()/2; if (asymmetric) { for (label j=0; j<nlb2; j++) { regionField[j] = 0.5 * ( regionField[j] - regionField[cellRegion_().nRegions() - j - 1] ); } } else { for (label j=0; j<nlb2; j++) { regionField[j] = 0.5 * ( regionField[j] + regionField[cellRegion_().nRegions() - j - 1] ); } } regionField.setSize(nlb2); } return regionField; }
Foam::Field<T> Foam::channelIndex::regionSum(const Field<T>& cellField) const { Field<T> regionField(cellRegion_().nRegions(), Zero); forAll(cellRegion_(), celli) { regionField[cellRegion_()[celli]] += cellField[celli]; } // Global sum Pstream::listCombineGather(regionField, plusEqOp<T>()); Pstream::listCombineScatter(regionField); return regionField; }
Foam::Field<T> Foam::meshIndex::regionSum(const Field<T>& cellField) const { Field<T> regionField(cellRegion_().nRegions(), pTraits<T>::zero); forAll(cellRegion_(), cellI) { regionField[cellRegion_()[cellI]] += cellField[cellI]; } // Global sum Pstream::listCombineGather(regionField, plusEqOp<T>()); Pstream::listCombineScatter(regionField); return regionField; }
Foam::Field<T> Foam::meshIndex::collapse ( const Field<T>& cellField ) const { // Average and order const Field<T> summedField(regionSum(cellField)); const Field<T> regionCountField = regionSum(scalarField(cellCount_, 1.0)); Field<T> spanaveragedField(cellCount_, pTraits<T>::zero); forAll(cellRegion_(), cellI) { spanaveragedField[cellI] = summedField[cellRegion_()[cellI]] / regionCountField[cellRegion_()[cellI]]; } return spanaveragedField; }