snl_fei_SubdMsgHandler.cpp

00001 /*--------------------------------------------------------------------*/
00002 /*    Copyright 2005 Sandia Corporation.                              */
00003 /*    Under the terms of Contract DE-AC04-94AL85000, there is a       */
00004 /*    non-exclusive license for use of this work by or on behalf      */
00005 /*    of the U.S. Government.  Export of this program may require     */
00006 /*    a license from the United States Government.                    */
00007 /*--------------------------------------------------------------------*/
00008 
00009 #include <fei_macros.hpp>
00010 
00011 #include <snl_fei_SubdMsgHandler.hpp>
00012 #include <snl_fei_RecordCollection.hpp>
00013 #include <fei_SharedIDs.hpp>
00014 #include <fei_TemplateUtils.hpp>
00015 
00016 #undef fei_file
00017 #define fei_file "snl_fei::SubdMsgHandler"
00018 #include <fei_ErrMacros.hpp>
00019 
00020 snl_fei::SubdMsgHandler::SubdMsgHandler(RecordCollection* recordCollection,
00021           fei::SharedIDs<int>* sharedIDTable,
00022           fei::SharedIDs<int>* subdomainIDTable)
00023   :sendPattern_(NULL),
00024    recvPattern_(NULL),
00025    recordCollection_(recordCollection),
00026    sharedIDTable_(sharedIDTable),
00027    subdomainIDTable_(subdomainIDTable),
00028    sendProcs_(0, 32),
00029    recvProcs_(0, 32)
00030 {
00031 }
00032 
00033 snl_fei::SubdMsgHandler::~SubdMsgHandler()
00034 {
00035 }
00036 
00037 std::vector<int>& snl_fei::SubdMsgHandler::getSendProcs()
00038 {
00039   fei::copyKeysToVector(sendPattern_->getMap(), sendProcs_);
00040   return(sendProcs_);
00041 }
00042 
00043 std::vector<int>& snl_fei::SubdMsgHandler::getRecvProcs()
00044 {
00045   fei::copyKeysToVector(recvPattern_->getMap(), recvProcs_);
00046   return(recvProcs_);
00047 }
00048 
00049 int snl_fei::SubdMsgHandler::getSendMessageLength(int destProc,
00050               int& messageLength)
00051 {
00052   fei::comm_map::row_type* list = sendPattern_->getRow(destProc);
00053   if (list == NULL) {
00054     FEI_COUT << "SubdMsdHandler: destProc: " << destProc << ", list is NULL."<<FEI_ENDL;
00055     return(-1);
00056   }
00057 
00058   messageLength = list->size();
00059 
00060   return( 0 );
00061 }
00062 
00063 int snl_fei::SubdMsgHandler::getSendMessage(int destProc,
00064             std::vector<int>& message)
00065 {
00066   int len = sendPattern_->getRow(destProc)->size();
00067   message.resize(len);
00068   int* msgPtr = &message[0];
00069 
00070   fei::comm_map::row_type* ids = sendPattern_->getRow(destProc);
00071   fei::comm_map::row_type::const_iterator
00072     id_iter = ids->begin(),
00073     id_end = ids->end();
00074 
00075   int offset = 0;
00076   for(; id_iter != id_end; ++id_iter) {
00077     int ID = *id_iter;
00078     fei::Record<int>* rec = recordCollection_->getRecordWithID(ID);
00079     if (rec == NULL) {
00080       ERReturn(-1);
00081     }
00082 
00083     if (rec->isInLocalSubdomain_) {
00084       msgPtr[offset++] = 1;
00085     }
00086     else {
00087       msgPtr[offset++] = 0;
00088     }
00089   }
00090 
00091   return(0);
00092 }
00093 
00094 int snl_fei::SubdMsgHandler::processRecvMessage(int srcProc,
00095             std::vector<int>& message)
00096 {
00097   fei::comm_map::row_type* ids = recvPattern_->getRow(srcProc);
00098   fei::comm_map::row_type::const_iterator
00099     id_iter = ids->begin(),
00100     id_end = ids->end();
00101 
00102   int* msgPtr = &message[0];
00103 
00104   if (message.size() != ids->size()) {
00105     ERReturn(-1);
00106   }
00107 
00108   int offset = 0;
00109   for(; id_iter != id_end; ++id_iter) {
00110     int ID = *id_iter;
00111 
00112     bool isInRemoteSubdomain = msgPtr[offset++] > 1 ? true : false;
00113 
00114     if (isInRemoteSubdomain) {
00115       subdomainIDTable_->addSharedID(ID, 1, &srcProc);
00116     }
00117   }
00118 
00119   return(0);
00120 }
00121 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends
Generated on Wed Apr 13 10:08:24 2011 for FEI by  doxygen 1.6.3