3#ifndef DUNE_COMMUNICATOR 
    4#define DUNE_COMMUNICATOR 
  169  template<
class K, 
class A, 
int n>
 
  197    static const IndexedType& gather(
const T& vec, std::size_t i);
 
  199    static void scatter(T& vec, 
const IndexedType& v, std::size_t i);
 
  247    DatatypeCommunicator();
 
  252    ~DatatypeCommunicator();
 
  280    template<
class T1, 
class T2, 
class V>
 
  281    void build(
const RemoteIndices& remoteIndices, 
const T1& sourceFlags, V& sendData, 
const T2& destFlags, V& receiveData);
 
  310    typedef std::map<int,std::pair<MPI_Datatype,MPI_Datatype> >
 
  316    MessageTypeMap messageTypes;
 
  323    MPI_Request* requests_[2];
 
  333    template<
class V, 
bool FORWARD>
 
  334    void createRequests(V& sendData, V& receiveData);
 
  339    template<
class T1, 
class T2, 
class V, 
bool send>
 
  340    void createDataTypes(
const T1& source, 
const T2& destination, V& data);
 
  345    void sendRecv(MPI_Request* req);
 
  350    struct IndexedTypeInformation
 
  360        displ  = 
new MPI_Aint[i];
 
  394    struct MPIDatatypeInformation
 
  400      MPIDatatypeInformation(
const V& data) : data_(data)
 
  408      void reserve(
int proc, 
int size)
 
  410        information_[proc].build(size);
 
  418      void add(
int proc, 
int local)
 
  420        IndexedTypeInformation& info=information_[proc];
 
  421        assert((info.elements)<info.size);
 
  423                         info.displ+info.elements);
 
  432      std::map<int,IndexedTypeInformation> information_;
 
  466    template<
class Data, 
class Interface>
 
  467    typename enable_if<is_same<SizeOne,typename CommPolicy<Data>::IndexedTypeFlag>::value, 
void>::type
 
  477    template<
class Data, 
class Interface>
 
  508    template<
class GatherScatter, 
class Data>
 
  539    template<
class GatherScatter, 
class Data>
 
  567    template<
class GatherScatter, 
class Data>
 
  595    template<
class GatherScatter, 
class Data>
 
  613    typedef std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
 
  620    template<
class Data, 
typename IndexedTypeFlag>
 
  621    struct MessageSizeCalculator
 
  629    struct MessageSizeCalculator<Data,
SizeOne>
 
  654    struct MessageSizeCalculator<Data,VariableSize>
 
  664      inline int operator()(
const Data& data, 
const InterfaceInformation& info) 
const;
 
  670    template<
class Data, 
class GatherScatter, 
bool send, 
typename IndexedTypeFlag>
 
  671    struct MessageGatherer
 
  678    template<
class Data, 
class GatherScatter, 
bool send>
 
  679    struct MessageGatherer<Data,GatherScatter,send,SizeOne>
 
  688      typedef GatherScatter Gatherer;
 
  706      inline void operator()(
const InterfaceMap& interface, 
const Data& data, Type* buffer, 
size_t bufferSize) 
const;
 
  713    template<
class Data, 
class GatherScatter, 
bool send>
 
  714    struct MessageGatherer<Data,GatherScatter,send,VariableSize>
 
  723      typedef GatherScatter Gatherer;
 
  741      inline void operator()(
const InterfaceMap& interface, 
const Data& data, Type* buffer, 
size_t bufferSize) 
const;
 
  747    template<
class Data, 
class GatherScatter, 
bool send, 
typename IndexedTypeFlag>
 
  748    struct MessageScatterer
 
  755    template<
class Data, 
class GatherScatter, 
bool send>
 
  756    struct MessageScatterer<Data,GatherScatter,send,SizeOne>
 
  765      typedef GatherScatter Scatterer;
 
  783      inline void operator()(
const InterfaceMap& interface, Data& data, Type* buffer, 
const int& proc) 
const;
 
  789    template<
class Data, 
class GatherScatter, 
bool send>
 
  790    struct MessageScatterer<Data,GatherScatter,send,VariableSize>
 
  799      typedef GatherScatter Scatterer;
 
  817      inline void operator()(
const InterfaceMap& interface, Data& data, Type* buffer, 
const int& proc) 
const;
 
  823    struct MessageInformation
 
  827        : start_(0), size_(0)
 
  837      MessageInformation(
size_t start, 
size_t size)
 
  838        : start_(start), size_(size)
 
  856    typedef std::map<int,std::pair<MessageInformation,MessageInformation> >
 
  861    InformationMap messageInformation_;
 
  869    size_t bufferSize_[2];
 
  881    std::map<int,std::pair<InterfaceInformation,InterfaceInformation> > interfaces_;
 
  883    MPI_Comm communicator_;
 
  888    template<
class GatherScatter, 
bool FORWARD, 
class Data>
 
  889    void sendRecv(
const Data& source, Data& target);
 
  909  template<
class K, 
class A, 
int n>
 
  910  inline const void* CommPolicy<VariableBlockVector<FieldVector<K, n>, A> >::getAddress(
const Type& v, 
int index)
 
  912    return &(v[index][0]);
 
  915  template<
class K, 
class A, 
int n>
 
  916  inline int CommPolicy<VariableBlockVector<FieldVector<K, n>, A> >::getSize(
const Type& v, 
int index)
 
  918    return v[index].getsize();
 
  922  inline const typename CopyGatherScatter<T>::IndexedType& CopyGatherScatter<T>::gather(
const T & vec, std::size_t i)
 
  928  inline void CopyGatherScatter<T>::scatter(T& vec, 
const IndexedType& v, std::size_t i)
 
  934  DatatypeCommunicator<T>::DatatypeCommunicator()
 
  935    : remoteIndices_(0), created_(false)
 
  944  DatatypeCommunicator<T>::~DatatypeCommunicator()
 
  950  template<
class T1, 
class T2, 
class V>
 
  951  inline void DatatypeCommunicator<T>::build(
const RemoteIndices& remoteIndices,
 
  952                                             const T1& source, V& sendData,
 
  953                                             const T2& destination, V& receiveData)
 
  955    remoteIndices_ = &remoteIndices;
 
  957    createDataTypes<T1,T2,V,false>(source,destination, receiveData);
 
  958    createDataTypes<T1,T2,V,true>(source,destination, sendData);
 
  959    createRequests<V,true>(sendData, receiveData);
 
  960    createRequests<V,false>(receiveData, sendData);
 
  965  void DatatypeCommunicator<T>::free()
 
  968      delete[] requests_[0];
 
  969      delete[] requests_[1];
 
  970      typedef MessageTypeMap::iterator iterator;
 
  971      typedef MessageTypeMap::const_iterator const_iterator;
 
  973      const const_iterator end=messageTypes.end();
 
  975      for(iterator process = messageTypes.begin(); process != end; ++process) {
 
  976        MPI_Datatype *type = &(process->second.first);
 
  978        MPI_Finalized(&finalized);
 
  979        if(*type!=MPI_DATATYPE_NULL && !finalized)
 
  981        type = &(process->second.second);
 
  982        if(*type!=MPI_DATATYPE_NULL && !finalized)
 
  985      messageTypes.clear();
 
  992  template<
class T1, 
class T2, 
class V, 
bool send>
 
  993  void DatatypeCommunicator<T>::createDataTypes(
const T1& sourceFlags, 
const T2& destFlags, V& data)
 
  996    MPIDatatypeInformation<V>  dataInfo(data);
 
  997    this->
template buildInterface<RemoteIndices,T1,T2,MPIDatatypeInformation<V>,send>(*remoteIndices_,sourceFlags, destFlags, dataInfo);
 
  999    typedef typename RemoteIndices::RemoteIndexMap::const_iterator const_iterator;
 
 1000    const const_iterator end=this->remoteIndices_->end();
 
 1003    for(const_iterator process=this->remoteIndices_->begin(); process != end; ++process) {
 
 1004      IndexedTypeInformation& info=dataInfo.information_[process->first];
 
 1009      for(
int i=0; i< info.elements; i++) {
 
 1010        info.displ[i]-=base;
 
 1014      MPI_Datatype* type = &( send ? messageTypes[process->first].first : messageTypes[process->first].second);
 
 1016      MPI_Type_create_hindexed(info.elements, info.length, info.displ,
 
 1019      MPI_Type_hindexed(info.elements, info.length, info.displ,
 
 1023      MPI_Type_commit(type);
 
 1029  template<
typename T>
 
 1030  template<
class V, 
bool createForward>
 
 1031  void DatatypeCommunicator<T>::createRequests(V& sendData, V& receiveData)
 
 1033    typedef std::map<int,std::pair<MPI_Datatype,MPI_Datatype> >::const_iterator MapIterator;
 
 1035    static int index = createForward ? 1 : 0;
 
 1036    int noMessages = messageTypes.size();
 
 1038    requests_[index] = 
new MPI_Request[2*noMessages];
 
 1039    const MapIterator end = messageTypes.end();
 
 1041    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
 1044    for(MapIterator process = messageTypes.begin(); process != end;
 
 1045        ++process, ++request) {
 
 1046      MPI_Datatype type = createForward ? process->second.second : process->second.first;
 
 1048      MPI_Recv_init(address, 1, type, process->first, commTag_, this->remoteIndices_->communicator(), requests_[index]+request);
 
 1053    for(MapIterator process = messageTypes.begin(); process != end;
 
 1054        ++process, ++request) {
 
 1055      MPI_Datatype type = createForward ? process->second.first : process->second.second;
 
 1057      MPI_Ssend_init(address, 1, type, process->first, commTag_, this->remoteIndices_->communicator(), requests_[index]+request);
 
 1061  template<
typename T>
 
 1062  void DatatypeCommunicator<T>::forward()
 
 1064    sendRecv(requests_[1]);
 
 1067  template<
typename T>
 
 1068  void DatatypeCommunicator<T>::backward()
 
 1070    sendRecv(requests_[0]);
 
 1073  template<
typename T>
 
 1074  void DatatypeCommunicator<T>::sendRecv(MPI_Request* requests)
 
 1076    int noMessages = messageTypes.size();
 
 1078    MPI_Startall(noMessages, requests);
 
 1080    MPI_Startall(noMessages, requests+noMessages);
 
 1083    MPI_Status* status=
new MPI_Status[2*noMessages];
 
 1084    for(
int i=0; i<2*noMessages; i++)
 
 1085      status[i].MPI_ERROR=MPI_SUCCESS;
 
 1087    int send = MPI_Waitall(noMessages, requests+noMessages, status+noMessages);
 
 1088    int receive = MPI_Waitall(noMessages, requests, status);
 
 1091    int success=1, globalSuccess=0;
 
 1092    if(send==MPI_ERR_IN_STATUS) {
 
 1094      MPI_Comm_rank(this->remoteIndices_->communicator(), &rank);
 
 1095      std::cerr<<rank<<
": Error in sending :"<<std::endl;
 
 1097      for(
int i=noMessages; i< 2*noMessages; i++)
 
 1098        if(status[i].MPI_ERROR!=MPI_SUCCESS) {
 
 1101          MPI_Error_string(status[i].MPI_ERROR, message, &messageLength);
 
 1102          std::cerr<<
" source="<<status[i].MPI_SOURCE<<
" message: ";
 
 1103          for(
int j = 0; j < messageLength; j++)
 
 1104            std::cout << message[j];
 
 1106      std::cerr<<std::endl;
 
 1110    if(receive==MPI_ERR_IN_STATUS) {
 
 1112      MPI_Comm_rank(this->remoteIndices_->communicator(), &rank);
 
 1113      std::cerr<<rank<<
": Error in receiving!"<<std::endl;
 
 1115      for(
int i=0; i< noMessages; i++)
 
 1116        if(status[i].MPI_ERROR!=MPI_SUCCESS) {
 
 1119          MPI_Error_string(status[i].MPI_ERROR, message, &messageLength);
 
 1120          std::cerr<<
" source="<<status[i].MPI_SOURCE<<
" message: ";
 
 1121          for(
int j = 0; j < messageLength; j++)
 
 1122            std::cerr << message[j];
 
 1124      std::cerr<<std::endl;
 
 1128    MPI_Allreduce(&success, &globalSuccess, 1, MPI_INT, MPI_MIN, this->remoteIndices_->communicator());
 
 1133      DUNE_THROW(CommunicationError, 
"A communication error occurred!");
 
 1145  template<
class Data, 
class Interface>
 
 1146  typename enable_if<is_same<SizeOne, typename CommPolicy<Data>::IndexedTypeFlag>::value, 
void>::type
 
 1149    interfaces_=interface.interfaces();
 
 1150    communicator_=interface.communicator();
 
 1151    typedef typename std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
 
 1152    ::const_iterator const_iterator;
 
 1154    const const_iterator end = interfaces_.end();
 
 1156    MPI_Comm_rank(communicator_, &lrank);
 
 1161    for(const_iterator interfacePair = interfaces_.begin();
 
 1162        interfacePair != end; ++interfacePair) {
 
 1163      int noSend = MessageSizeCalculator<Data,Flag>() (interfacePair->second.first);
 
 1164      int noRecv = MessageSizeCalculator<Data,Flag>() (interfacePair->second.second);
 
 1165      if (noSend + noRecv > 0)
 
 1166        messageInformation_.insert(std::make_pair(interfacePair->first,
 
 1167                                                std::make_pair(MessageInformation(bufferSize_[0],
 
 1169                                                               MessageInformation(bufferSize_[1],
 
 1171      bufferSize_[0] += noSend;
 
 1172      bufferSize_[1] += noRecv;
 
 1179    buffers_[0] = 
new char[bufferSize_[0]];
 
 1180    buffers_[1] = 
new char[bufferSize_[1]];
 
 1183  template<
class Data, 
class Interface>
 
 1187    interfaces_=interface.interfaces();
 
 1188    communicator_=interface.communicator();
 
 1189    typedef typename std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
 
 1190    ::const_iterator const_iterator;
 
 1192    const const_iterator end = interfaces_.end();
 
 1197    for(const_iterator interfacePair = interfaces_.begin();
 
 1198        interfacePair != end; ++interfacePair) {
 
 1199      int noSend = MessageSizeCalculator<Data,Flag>() (source, interfacePair->second.first);
 
 1200      int noRecv = MessageSizeCalculator<Data,Flag>() (dest, interfacePair->second.second);
 
 1201      if (noSend + noRecv > 0)
 
 1202        messageInformation_.insert(std::make_pair(interfacePair->first,
 
 1203                                                std::make_pair(MessageInformation(bufferSize_[0],
 
 1205                                                               MessageInformation(bufferSize_[1],
 
 1207      bufferSize_[0] += noSend;
 
 1208      bufferSize_[1] += noRecv;
 
 1214    buffers_[0] = 
new char[bufferSize_[0]];
 
 1215    buffers_[1] = 
new char[bufferSize_[1]];
 
 1220    messageInformation_.clear();
 
 1222      delete[] buffers_[0];
 
 1225      delete[] buffers_[1];
 
 1226    buffers_[0]=buffers_[1]=0;
 
 1234  template<
class Data>
 
 1235  inline int BufferedCommunicator::MessageSizeCalculator<Data,SizeOne>::operator()
 
 1236    (
const InterfaceInformation& info) 
const 
 1242  template<
class Data>
 
 1243  inline int BufferedCommunicator::MessageSizeCalculator<Data,SizeOne>::operator()
 
 1244    (
const Data&, 
const InterfaceInformation& info) 
const 
 1246    return operator()(info);
 
 1250  template<
class Data>
 
 1251  inline int BufferedCommunicator::MessageSizeCalculator<Data, VariableSize>::operator()
 
 1252    (
const Data& data, 
const InterfaceInformation& info) 
const 
 1256    for(
size_t i=0; i < info.size(); i++)
 
 1263  template<
class Data, 
class GatherScatter, 
bool FORWARD>
 
 1264  inline void BufferedCommunicator::MessageGatherer<Data,GatherScatter,FORWARD,VariableSize>::operator()(
const InterfaceMap& interfaces,
const Data& data, Type* buffer, 
size_t bufferSize)
 const 
 1267    typedef typename InterfaceMap::const_iterator
 
 1271    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
 1272    const const_iterator end = interfaces.end();
 
 1275    for(const_iterator interfacePair = interfaces.begin();
 
 1276        interfacePair != end; ++interfacePair) {
 
 1277      int size = forward ? interfacePair->second.first.size() :
 
 1278                 interfacePair->second.second.size();
 
 1280      for(
int i=0; i < size; i++) {
 
 1281        int local = forward ? interfacePair->second.first[i] :
 
 1282                    interfacePair->second.second[i];
 
 1283        for(std::size_t j=0; j < CommPolicy<Data>::getSize(data, local); j++, index++) {
 
 1285#ifdef DUNE_ISTL_WITH_CHECKING 
 1288          buffer[index]=GatherScatter::gather(data, local, j);
 
 1297  template<
class Data, 
class GatherScatter, 
bool FORWARD>
 
 1298  inline void BufferedCommunicator::MessageGatherer<Data,GatherScatter,FORWARD,SizeOne>::operator()(
const InterfaceMap& interfaces, 
const Data& data, Type* buffer, 
size_t bufferSize)
 const 
 1301    typedef typename InterfaceMap::const_iterator
 
 1303    const const_iterator end = interfaces.end();
 
 1307    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
 1309    for(const_iterator interfacePair = interfaces.begin();
 
 1310        interfacePair != end; ++interfacePair) {
 
 1311      size_t size = FORWARD ? interfacePair->second.first.size() :
 
 1312                    interfacePair->second.second.size();
 
 1314      for(
size_t i=0; i < size; i++) {
 
 1316#ifdef DUNE_ISTL_WITH_CHECKING 
 1320        buffer[index++] = GatherScatter::gather(data, FORWARD ? interfacePair->second.first[i] :
 
 1321                                                interfacePair->second.second[i]);
 
 1328  template<
class Data, 
class GatherScatter, 
bool FORWARD>
 
 1329  inline void BufferedCommunicator::MessageScatterer<Data,GatherScatter,FORWARD,VariableSize>::operator()(
const InterfaceMap& interfaces, Data& data, Type* buffer, 
const int& proc)
 const 
 1331    typedef typename InterfaceMap::value_type::second_type::first_type Information;
 
 1332    const typename InterfaceMap::const_iterator infoPair = interfaces.find(proc);
 
 1334    assert(infoPair!=interfaces.end());
 
 1336    const Information& info = FORWARD ? infoPair->second.second :
 
 1337                              infoPair->second.first;
 
 1339    for(
size_t i=0, index=0; i < info.size(); i++) {
 
 1340      for(
size_t j=0; j < CommPolicy<Data>::getSize(data, info[i]); j++)
 
 1341        GatherScatter::scatter(data, buffer[index++], info[i], j);
 
 1346  template<
class Data, 
class GatherScatter, 
bool FORWARD>
 
 1347  inline void BufferedCommunicator::MessageScatterer<Data,GatherScatter,FORWARD,SizeOne>::operator()(
const InterfaceMap& interfaces, Data& data, Type* buffer, 
const int& proc)
 const 
 1349    typedef typename InterfaceMap::value_type::second_type::first_type Information;
 
 1350    const typename InterfaceMap::const_iterator infoPair = interfaces.find(proc);
 
 1352    assert(infoPair!=interfaces.end());
 
 1354    const Information& info = FORWARD ? infoPair->second.second :
 
 1355                              infoPair->second.first;
 
 1357    for(
size_t i=0; i < info.size(); i++) {
 
 1358      GatherScatter::scatter(data, buffer[i], info[i]);
 
 1363  template<
class GatherScatter,
class Data>
 
 1366    this->
template sendRecv<GatherScatter,true>(data, data);
 
 1370  template<
class GatherScatter, 
class Data>
 
 1373    this->
template sendRecv<GatherScatter,false>(data, data);
 
 1377  template<
class GatherScatter, 
class Data>
 
 1380    this->
template sendRecv<GatherScatter,true>(source, dest);
 
 1384  template<
class GatherScatter, 
class Data>
 
 1387    this->
template sendRecv<GatherScatter,false>(dest, source);
 
 1391  template<
class GatherScatter, 
bool FORWARD, 
class Data>
 
 1392  void BufferedCommunicator::sendRecv(
const Data& source, Data& dest)
 
 1396    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
 
 1397    MPI_Comm_rank(MPI_COMM_WORLD,&lrank);
 
 1400    Type *sendBuffer, *recvBuffer;
 
 1401    size_t sendBufferSize;
 
 1403    size_t recvBufferSize;
 
 1407      sendBuffer = 
reinterpret_cast<Type*
>(buffers_[0]);
 
 1408      sendBufferSize = bufferSize_[0];
 
 1409      recvBuffer = 
reinterpret_cast<Type*
>(buffers_[1]);
 
 1411      recvBufferSize = bufferSize_[1];
 
 1414      sendBuffer = 
reinterpret_cast<Type*
>(buffers_[1]);
 
 1415      sendBufferSize = bufferSize_[1];
 
 1416      recvBuffer = 
reinterpret_cast<Type*
>(buffers_[0]);
 
 1418      recvBufferSize = bufferSize_[0];
 
 1423    MessageGatherer<Data,GatherScatter,FORWARD,Flag>() (interfaces_, source, sendBuffer, sendBufferSize);
 
 1425    MPI_Request* sendRequests = 
new MPI_Request[messageInformation_.size()];
 
 1426    MPI_Request* recvRequests = 
new MPI_Request[messageInformation_.size()];
 
 1428    size_t numberOfRealRecvRequests = 0;
 
 1431    typedef typename InformationMap::const_iterator const_iterator;
 
 1433    const const_iterator end = messageInformation_.end();
 
 1435    int* processMap = 
new int[messageInformation_.size()];
 
 1437    for(const_iterator info = messageInformation_.begin(); info != end; ++info, ++i) {
 
 1438      processMap[i]=info->first;
 
 1441        Dune::dvverb<<rank<<
": receiving "<<info->second.second.size_<<
" from "<<info->first<<std::endl;
 
 1442        if(info->second.second.size_) {
 
 1443          MPI_Irecv(recvBuffer+info->second.second.start_, info->second.second.size_,
 
 1444                    MPI_BYTE, info->first, commTag_, communicator_,
 
 1446          numberOfRealRecvRequests += 1;
 
 1449          recvRequests[i]=MPI_REQUEST_NULL;
 
 1453        Dune::dvverb<<rank<<
": receiving "<<info->second.first.size_<<
" to "<<info->first<<std::endl;
 
 1454        if(info->second.first.size_) {
 
 1455          MPI_Irecv(recvBuffer+info->second.first.start_, info->second.first.size_,
 
 1456                    MPI_BYTE, info->first, commTag_, communicator_,
 
 1458          numberOfRealRecvRequests += 1;
 
 1461          recvRequests[i]=MPI_REQUEST_NULL;
 
 1468    for(const_iterator info = messageInformation_.begin(); info != end; ++info, ++i)
 
 1471        Dune::dvverb<<rank<<
": sending "<<info->second.first.size_<<
" to "<<info->first<<std::endl;
 
 1473        if(info->second.first.size_)
 
 1474          MPI_Issend(sendBuffer+info->second.first.start_, info->second.first.size_,
 
 1475                     MPI_BYTE, info->first, commTag_, communicator_,
 
 1479          sendRequests[i]=MPI_REQUEST_NULL;
 
 1482        Dune::dvverb<<rank<<
": sending "<<info->second.second.size_<<
" to "<<info->first<<std::endl;
 
 1483        if(info->second.second.size_)
 
 1484          MPI_Issend(sendBuffer+info->second.second.start_, info->second.second.size_,
 
 1485                     MPI_BYTE, info->first, commTag_, communicator_,
 
 1489          sendRequests[i]=MPI_REQUEST_NULL;
 
 1495    int finished = MPI_UNDEFINED;
 
 1499    for(i=0; i< numberOfRealRecvRequests; i++) {
 
 1500      status.MPI_ERROR=MPI_SUCCESS;
 
 1501      MPI_Waitany(messageInformation_.size(), recvRequests, &finished, &status);
 
 1502      assert(finished != MPI_UNDEFINED);
 
 1504      if(status.MPI_ERROR==MPI_SUCCESS) {
 
 1505        int& proc = processMap[finished];
 
 1506        typename InformationMap::const_iterator infoIter = messageInformation_.find(proc);
 
 1507        assert(infoIter != messageInformation_.end());
 
 1509        MessageInformation info = (FORWARD) ? infoIter->second.second : infoIter->second.first;
 
 1510        assert(info.start_+info.size_ <= recvBufferSize);
 
 1512        MessageScatterer<Data,GatherScatter,FORWARD,Flag>() (interfaces_, dest, recvBuffer+info.start_, proc);
 
 1514        std::cerr<<rank<<
": MPI_Error occurred while receiving message from "<<processMap[finished]<<std::endl;
 
 1519    MPI_Status recvStatus;
 
 1522    for(i=0; i< messageInformation_.size(); i++)
 
 1523      if(MPI_SUCCESS!=MPI_Wait(sendRequests+i, &recvStatus)) {
 
 1524        std::cerr<<rank<<
": MPI_Error occurred while sending message to "<<processMap[finished]<<std::endl;
 
 1534    delete[] processMap;
 
 1535    delete[] sendRequests;
 
 1536    delete[] recvRequests;
 
A communicator that uses buffers to gather and scatter the data to be send or received.
Definition: communicator.hh:452
 
void backward(Data &data)
Backward send where target and source are the same.
 
BufferedCommunicator()
Constructor.
 
~BufferedCommunicator()
Destructor.
 
void forward(const Data &source, Data &dest)
Send from source to target.
 
void free()
Free the allocated memory (i.e. buffers and message information.
 
void backward(Data &source, const Data &dest)
Communicate in the reverse direction, i.e. send from target to source.
 
void build(const Data &source, const Data &target, const Interface &interface)
Build the buffers and information for the communication process.
 
void forward(Data &data)
Forward send where target and source are the same.
 
enable_if< is_same< SizeOne, typenameCommPolicy< Data >::IndexedTypeFlag >::value, void >::type build(const Interface &interface)
Build the buffers and information for the communication process.
 
Error thrown if there was a problem with the communication.
Definition: communicator.hh:187
 
vector space out of a tensor product of fields.
Definition: fvector.hh:94
 
Default exception class for I/O errors.
Definition: exceptions.hh:256
 
Base class of all classes representing a communication interface.
Definition: interface.hh:33
 
Communication interface between remote and local indices.
Definition: interface.hh:207
 
An index present on the local process.
Definition: localindex.hh:33
 
Manager class for the mapping between local indices and globally unique indices.
Definition: indexset.hh:217
 
The indices present on remote processes.
Definition: remoteindices.hh:181
 
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition: remoteindices.hh:207
 
LocalIndex::Attribute Attribute
The type of the attribute.
Definition: remoteindices.hh:218
 
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition: remoteindices.hh:213
 
A Vector of blocks with different blocksizes.
Definition: vbvector.hh:40
 
A few common exception classes.
 
#define DUNE_THROW(E, m)
Definition: exceptions.hh:243
 
DVVerbType dvverb(std::cout)
stream for very verbose output.
Definition: stdstreams.hh:93
 
Provides classes for building the communication interface between remote indices.
 
Dune namespace.
Definition: alignment.hh:10
 
Classes describing a distributed indexset.
 
Standard Dune debug streams.
 
GatherScatter default implementation that just copies data.
Definition: communicator.hh:194
 
Default policy used for communicating an indexed type.
Definition: communicator.hh:120
 
V::value_type IndexedType
The type we get at each index with operator[].
Definition: communicator.hh:139
 
static int getSize(const V &, int index)
Get the number of primitve elements at that index.
 
SizeOne IndexedTypeFlag
Whether the indexed type has variable size or there is always one value at each index.
Definition: communicator.hh:145
 
static const void * getAddress(const V &v, int index)
Get the address of entry at an index.
 
V Type
The type the policy is for.
Definition: communicator.hh:132
 
Flag for marking indexed data structures where data at each index is of the same size.
Definition: communicator.hh:102
 
Flag for marking indexed data structures where the data at each index may be a variable multiple of a...
Definition: communicator.hh:110
 
Traits for type conversions and type information.
 
#define DUNE_UNUSED_PARAMETER(parm)
A macro to mark intentional unused function parameters with.
Definition: unused.hh:18