Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "channelIndex.H"
00027
00028
00029
00030 template<class T>
00031 Foam::Field<T> Foam::channelIndex::regionSum(const Field<T>& cellField) const
00032 {
00033 Field<T> regionField(cellRegion_().nRegions(), pTraits<T>::zero);
00034
00035 forAll(cellRegion_(), cellI)
00036 {
00037 regionField[cellRegion_()[cellI]] += cellField[cellI];
00038 }
00039
00040
00041 Pstream::listCombineGather(regionField, plusEqOp<T>());
00042 Pstream::listCombineScatter(regionField);
00043
00044 return regionField;
00045 }
00046
00047
00048 template<class T>
00049 Foam::Field<T> Foam::channelIndex::collapse
00050 (
00051 const Field<T>& cellField,
00052 const bool asymmetric
00053 ) const
00054 {
00055
00056 const Field<T> summedField(regionSum(cellField));
00057
00058 Field<T> regionField
00059 (
00060 summedField
00061 / regionCount_,
00062 sortMap_
00063 );
00064
00065
00066 if (symmetric_)
00067 {
00068 label nlb2 = cellRegion_().nRegions()/2;
00069
00070 if (asymmetric)
00071 {
00072 for (label j=0; j<nlb2; j++)
00073 {
00074 regionField[j] =
00075 0.5
00076 * (
00077 regionField[j]
00078 - regionField[cellRegion_().nRegions() - j - 1]
00079 );
00080 }
00081 }
00082 else
00083 {
00084 for (label j=0; j<nlb2; j++)
00085 {
00086 regionField[j] =
00087 0.5
00088 * (
00089 regionField[j]
00090 + regionField[cellRegion_().nRegions() - j - 1]
00091 );
00092 }
00093 }
00094
00095 regionField.setSize(nlb2);
00096 }
00097
00098 return regionField;
00099 }
00100
00101
00102