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 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 #include "IPstream.H"
00037 #include "OPstream.H"
00038 #include <OpenFOAM/contiguous.H>
00039 
00040 
00041 
00042 namespace Foam
00043 {
00044 
00045 
00046 
00047 template <class T>
00048 void Pstream::gatherList
00049 (
00050     const List<Pstream::commsStruct>& comms,
00051     List<T>& Values
00052 )
00053 {
00054     if (Pstream::parRun())
00055     {
00056         if (Values.size() != Pstream::nProcs())
00057         {
00058             FatalErrorIn
00059             (
00060                 "Pstream::gatherList(const List<Pstream::commsStruct>&"
00061                 ", List<T>)"
00062             )   << "Size of list:" << Values.size()
00063                 << " does not equal the number of processors:"
00064                 << Pstream::nProcs()
00065                 << Foam::abort(FatalError);
00066         }
00067 
00068         
00069         const commsStruct& myComm = comms[Pstream::myProcNo()];
00070 
00071         
00072         forAll(myComm.below(), belowI)
00073         {
00074             label belowID = myComm.below()[belowI];
00075             const labelList& belowLeaves = comms[belowID].allBelow();
00076 
00077             if (contiguous<T>())
00078             {
00079                 List<T> receivedValues(belowLeaves.size() + 1);
00080 
00081                 IPstream::read
00082                 (
00083                     Pstream::scheduled,
00084                     belowID,
00085                     reinterpret_cast<char*>(receivedValues.begin()),
00086                     receivedValues.byteSize()
00087                 );
00088 
00089                 Values[belowID] = receivedValues[0];
00090 
00091                 forAll(belowLeaves, leafI)
00092                 {
00093                     Values[belowLeaves[leafI]] = receivedValues[leafI + 1];
00094                 }
00095             }
00096             else
00097             {
00098                 IPstream fromBelow(Pstream::scheduled, belowID);
00099                 fromBelow >> Values[belowID];
00100 
00101                 if (debug & 2)
00102                 {
00103                     Pout<< " received through "
00104                         << belowID << " data from:" << belowID
00105                         << " data:" << Values[belowID] << endl;
00106                 }
00107 
00108                 
00109                 forAll(belowLeaves, leafI)
00110                 {
00111                     label leafID = belowLeaves[leafI];
00112                     fromBelow >> Values[leafID];
00113 
00114                     if (debug & 2)
00115                     {
00116                         Pout<< " received through "
00117                             << belowID << " data from:" << leafID
00118                             << " data:" << Values[leafID] << endl;
00119                     }
00120                 }
00121             }
00122         }
00123 
00124         
00125         
00126         
00127         if (myComm.above() != -1)
00128         {
00129             const labelList& belowLeaves = myComm.allBelow();
00130 
00131             if (debug & 2)
00132             {
00133                 Pout<< " sending to " << myComm.above()
00134                     << " data from me:" << Pstream::myProcNo()
00135                     << " data:" << Values[Pstream::myProcNo()] << endl;
00136             }
00137 
00138             if (contiguous<T>())
00139             {
00140                 List<T> sendingValues(belowLeaves.size() + 1);
00141                 sendingValues[0] = Values[Pstream::myProcNo()];
00142 
00143                 forAll(belowLeaves, leafI)
00144                 {
00145                     sendingValues[leafI + 1] = Values[belowLeaves[leafI]];
00146                 }
00147 
00148                 OPstream::write
00149                 (
00150                     Pstream::scheduled,
00151                     myComm.above(),
00152                     reinterpret_cast<const char*>(sendingValues.begin()),
00153                     sendingValues.byteSize()
00154                 );
00155             }
00156             else
00157             {
00158                 OPstream toAbove(Pstream::scheduled, myComm.above());
00159                 toAbove << Values[Pstream::myProcNo()];
00160 
00161                 forAll(belowLeaves, leafI)
00162                 {
00163                     label leafID = belowLeaves[leafI];
00164 
00165                     if (debug & 2)
00166                     {
00167                         Pout<< " sending to "
00168                             << myComm.above() << " data from:" << leafID
00169                             << " data:" << Values[leafID] << endl;
00170                     }
00171                     toAbove << Values[leafID];
00172                 }
00173             }
00174         }
00175     }
00176 }
00177 
00178 
00179 template <class T>
00180 void Pstream::gatherList(List<T>& Values)
00181 {
00182     if (Pstream::nProcs() < Pstream::nProcsSimpleSum)
00183     {
00184         gatherList(Pstream::linearCommunication(), Values);
00185     }
00186     else
00187     {
00188         gatherList(Pstream::treeCommunication(), Values);
00189     }
00190 }
00191 
00192 
00193 template <class T>
00194 void Pstream::scatterList
00195 (
00196     const List<Pstream::commsStruct>& comms,
00197     List<T>& Values
00198 )
00199 {
00200     if (Pstream::parRun())
00201     {
00202         if (Values.size() != Pstream::nProcs())
00203         {
00204             FatalErrorIn
00205             (
00206                 "Pstream::scatterList(const List<Pstream::commsStruct>&"
00207                 ", List<T>)"
00208             )   << "Size of list:" << Values.size()
00209                 << " does not equal the number of processors:"
00210                 << Pstream::nProcs()
00211                 << Foam::abort(FatalError);
00212         }
00213 
00214         
00215         const commsStruct& myComm = comms[Pstream::myProcNo()];
00216 
00217         
00218         if (myComm.above() != -1)
00219         {
00220             const labelList& notBelowLeaves = myComm.allNotBelow();
00221 
00222             if (contiguous<T>())
00223             {
00224                 List<T> receivedValues(notBelowLeaves.size());
00225 
00226                 IPstream::read
00227                 (
00228                     Pstream::scheduled,
00229                     myComm.above(),
00230                     reinterpret_cast<char*>(receivedValues.begin()),
00231                     receivedValues.byteSize()
00232                 );
00233 
00234                 forAll(notBelowLeaves, leafI)
00235                 {
00236                     Values[notBelowLeaves[leafI]] = receivedValues[leafI];
00237                 }
00238             }
00239             else
00240             {
00241                 IPstream fromAbove(Pstream::scheduled, myComm.above());
00242 
00243                 forAll(notBelowLeaves, leafI)
00244                 {
00245                     label leafID = notBelowLeaves[leafI];
00246                     fromAbove >> Values[leafID];
00247 
00248                     if (debug)
00249                     {
00250                         Pout<< " received through "
00251                             << myComm.above() << " data for:" << leafID
00252                             << " data:" << Values[leafID] << endl;
00253                     }
00254                 }
00255             }
00256         }
00257 
00258         
00259         forAll(myComm.below(), belowI)
00260         {
00261             label belowID = myComm.below()[belowI];
00262             const labelList& notBelowLeaves = comms[belowID].allNotBelow();
00263 
00264             if (contiguous<T>())
00265             {
00266                 List<T> sendingValues(notBelowLeaves.size());
00267 
00268                 forAll(notBelowLeaves, leafI)
00269                 {
00270                     sendingValues[leafI] = Values[notBelowLeaves[leafI]];
00271                 }
00272 
00273                 OPstream::write
00274                 (
00275                     Pstream::scheduled,
00276                     belowID,
00277                     reinterpret_cast<const char*>(sendingValues.begin()),
00278                     sendingValues.byteSize()
00279                 );
00280             }
00281             else
00282             {
00283                 OPstream toBelow(Pstream::scheduled, belowID);
00284 
00285                 
00286                 forAll(notBelowLeaves, leafI)
00287                 {
00288                     label leafID = notBelowLeaves[leafI];
00289                     toBelow << Values[leafID];
00290 
00291                     if (debug)
00292                     {
00293                         Pout<< " sent through "
00294                             << belowID << " data for:" << leafID
00295                             << " data:" << Values[leafID] << endl;
00296                     }
00297                 }
00298             }
00299         }
00300     }
00301 }
00302 
00303 
00304 template <class T>
00305 void Pstream::scatterList(List<T>& Values)
00306 {
00307     if (Pstream::nProcs() < Pstream::nProcsSimpleSum)
00308     {
00309         scatterList(Pstream::linearCommunication(), Values);
00310     }
00311     else
00312     {
00313         scatterList(Pstream::treeCommunication(), Values);
00314     }
00315 }
00316 
00317 
00318 
00319 
00320 } 
00321 
00322