FEI Package Browser (Single Doxygen Collection)  Version of the Day
fei_EqnCommMgr.hpp
Go to the documentation of this file.
1 #ifndef _fei_EqnCommMgr_hpp_
2 #define _fei_EqnCommMgr_hpp_
3 
4 /*--------------------------------------------------------------------*/
5 /* Copyright 2005 Sandia Corporation. */
6 /* Under the terms of Contract DE-AC04-94AL85000, there is a */
7 /* non-exclusive license for use of this work by or on behalf */
8 /* of the U.S. Government. Export of this program may require */
9 /* a license from the United States Government. */
10 /*--------------------------------------------------------------------*/
11 
12 #include "fei_fwd.hpp"
13 #include "fei_mpi.h"
14 
16 
17 #include <fei_CSRMat.hpp>
18 #include <fei_CSVec.hpp>
19 #include <fei_CommUtils.hpp>
20 #include "fei_ProcEqns.hpp"
21 #include "fei_EqnBuffer.hpp"
22 
104 class EqnCommMgr {
105  public:
109  EqnCommMgr(MPI_Comm comm, bool accumulate = true);
110 
112  EqnCommMgr(const EqnCommMgr& src);
113 
115  EqnCommMgr& operator=(const EqnCommMgr& src);
116 
118  virtual ~EqnCommMgr();
119 
121  EqnCommMgr* deepCopy();
122 
127  std::vector<int>& sharingProcsPtr() {return(recvProcEqns_->procsPtr());};
128 
133  std::vector<int>& ownerProcsPtr() {return(sendProcEqns_->procsPtr());};
134 
136  void addLocalEqn(int eqnNumber, int srcProc);
137 
138  void addSolnValues(int* eqnNumbers, double* values, int num);
139 
140 #ifdef FEI_HAVE_IOSFWD
141  int exchangeIndices(std::ostream* dbgOut=NULL);
142  int exchangeEqns(std::ostream* dbgOut=NULL);
143 #else
144  int exchangeIndices(ostream* dbgOut=NULL);
145  int exchangeEqns(ostream* dbgOut=NULL);
146 #endif
147 
148  void exchangeSoln();
149 
173  int mirrorProcEqns(ProcEqns& inProcEqns, ProcEqns& outProcEqns);
174 
187  int mirrorProcEqnLengths(ProcEqns& inProcEqns,
188  ProcEqns& outProcEqns);
189 
190 
191  static int exchangeEqnBuffers(MPI_Comm comm, ProcEqns* sendProcEqns,
192  EqnBuffer* sendEqns, ProcEqns* recvProcEqns,
193  EqnBuffer* recvEqns, bool accumulate);
194 
195  int getNumLocalEqns() {return(recvEqns_->getNumEqns());};
196 
197  std::vector<int>& localEqnNumbers() {return(recvEqns_->eqnNumbers());};
198  std::vector<fei::CSVec*>& localEqns(){return(recvEqns_->eqns());};
199  std::vector<std::vector<double>*>* localRHSsPtr()
200  {return(recvEqns_->rhsCoefsPtr());};
201 
202  int addRemoteEqn(int eqnNumber, int destProc, const double* coefs,
203  const int* indices, int num);
204 
205  int addRemoteEqn(int eqnNumber, const double* coefs,
206  const int* indices, int num);
207 
208  int addRemoteEqns(fei::CSRMat& mat, bool onlyIndices);
209  int addRemoteRHS(fei::CSVec& vec, int rhsIndex);
210 
211  void setNumRHSs(int numRHSs);
212 
213  int addRemoteRHS(int eqnNumber, int destProc, int rhsIndex, double value);
214 
215  int addRemoteRHS(int eqnNumber, int rhsIndex, double value);
216 
217  void addRemoteIndices(int eqnNumber, int destProc, int* indices, int num);
218 
219  int getNumRemoteEqns() {return(sendEqns_->getNumEqns());};
220 
221  std::vector<int>& sendEqnNumbersPtr() {return(sendEqns_->eqnNumbers());};
222 
223  double* sendEqnSolnPtr() {return(sendEqnSoln_.size()>0? &sendEqnSoln_[0] : NULL);};
224 
225  void resetCoefs();
226 
227  int gatherSharedBCs(EqnBuffer& bcEqns);
228 
229  int exchangeRemEssBCs(int* essEqns, int numEssEqns, double* essAlpha,
230  double* essGamma, MPI_Comm comm,
231  std::ostream* dbgOut = NULL);
232 
234  std::vector<int>& remEssBCEqnNumbersPtr() {return(essBCEqns_->eqnNumbers());};
235  std::vector<fei::CSVec*>& remEssBCEqns() {return(essBCEqns_->eqns());};
236 
237  int exchangePtToBlkInfo(snl_fei::PointBlockMap& blkEqnMapper);
238 
239  bool newCoefData() {if (recvEqns_->newCoefData_>0) return(true);
240  else return(false);}
241  bool newRHSData() {if (recvEqns_->newRHSData_>0) return(true);
242  else return(false);}
243 
245 
246  EqnBuffer* getRecvEqns() { return( recvEqns_ ); }
247  EqnBuffer* getSendEqns() { return( sendEqns_ ); }
250 
251  private:
252  void deleteEssBCs();
253  int getSendProcNumber(int eqn);
254 
255  int consistencyCheck(const char* caller,
256  std::vector<int>& recvProcs,
257  std::vector<int>& recvProcTotalLengths,
258  std::vector<int>& sendProcs,
259  std::vector<int>& sendProcTotalLengths);
260 
262 
264 
265  bool exchangeIndicesCalled_; //whether or not the exchangeIndices function
266  //has been called yet.
267 
269 
270  std::vector<double> solnValues_; //solution values we'll need to return to the
271  //processors that contribute to our equations
272 
274 
276 
277  std::vector<double> sendEqnSoln_;
278  //the solution values for the send equations. i.e.,
279  //we'll recv these solution values for the equations
280  //that we contributed to (sent) for other processors.
281 
283 
285 };
286 
287 #endif
288 
EqnCommMgr::sendEqnSolnPtr
double * sendEqnSolnPtr()
Definition: fei_EqnCommMgr.hpp:223
EqnCommMgr::exchangeIndicesCalled_
bool exchangeIndicesCalled_
Definition: fei_EqnCommMgr.hpp:265
EqnCommMgr::localEqnNumbers
std::vector< int > & localEqnNumbers()
Definition: fei_EqnCommMgr.hpp:197
EqnCommMgr::addRemoteEqns
int addRemoteEqns(fei::CSRMat &mat, bool onlyIndices)
Definition: fei_EqnCommMgr.cpp:1234
EqnBuffer::getNumEqns
int getNumEqns()
Definition: fei_EqnBuffer.hpp:40
fei_CSVec.hpp
snl_fei::PointBlockMap
Definition: snl_fei_PointBlockMap.hpp:23
fei_fwd.hpp
EqnCommMgr::sendProcEqns_
ProcEqns * sendProcEqns_
Definition: fei_EqnCommMgr.hpp:273
EqnCommMgr::gatherSharedBCs
int gatherSharedBCs(EqnBuffer &bcEqns)
Definition: fei_EqnCommMgr.cpp:954
EqnCommMgr::mirrorProcEqns
int mirrorProcEqns(ProcEqns &inProcEqns, ProcEqns &outProcEqns)
Definition: fei_EqnCommMgr.cpp:744
snl_fei_PointBlockMap.hpp
EqnCommMgr::localEqns
std::vector< fei::CSVec * > & localEqns()
Definition: fei_EqnCommMgr.hpp:198
EqnCommMgr::exchangeIndices
int exchangeIndices(std::ostream *dbgOut=NULL)
Definition: fei_EqnCommMgr.cpp:168
EqnCommMgr::operator=
EqnCommMgr & operator=(const EqnCommMgr &src)
Definition: fei_EqnCommMgr.cpp:79
EqnCommMgr
Definition: fei_EqnCommMgr.hpp:104
fei_CSRMat.hpp
EqnCommMgr::getNumRemoteEqns
int getNumRemoteEqns()
Definition: fei_EqnCommMgr.hpp:219
EqnCommMgr::EqnCommMgr
EqnCommMgr(MPI_Comm comm, bool accumulate=true)
Definition: fei_EqnCommMgr.cpp:28
dbgOut
#define dbgOut()
Definition: FEData.hpp:17
EqnCommMgr::localRHSsPtr
std::vector< std::vector< double > * > * localRHSsPtr()
Definition: fei_EqnCommMgr.hpp:199
EqnCommMgr::getRecvProcEqns
ProcEqns * getRecvProcEqns()
Definition: fei_EqnCommMgr.hpp:248
EqnBuffer::eqnNumbers
std::vector< int > & eqnNumbers()
Definition: fei_EqnBuffer.hpp:43
EqnCommMgr::remEssBCEqnNumbersPtr
std::vector< int > & remEssBCEqnNumbersPtr()
Definition: fei_EqnCommMgr.hpp:234
EqnCommMgr::addLocalEqn
void addLocalEqn(int eqnNumber, int srcProc)
Definition: fei_EqnCommMgr.cpp:131
EqnCommMgr::getNumRemEssBCEqns
int getNumRemEssBCEqns()
Definition: fei_EqnCommMgr.hpp:233
EqnBuffer::rhsCoefsPtr
std::vector< std::vector< double > * > * rhsCoefsPtr()
Definition: fei_EqnBuffer.hpp:76
EqnCommMgr::exchangePtToBlkInfo
int exchangePtToBlkInfo(snl_fei::PointBlockMap &blkEqnMapper)
Definition: fei_EqnCommMgr.cpp:1141
EqnCommMgr::recvProcEqns_
ProcEqns * recvProcEqns_
Definition: fei_EqnCommMgr.hpp:263
ProcEqns::getNumProcs
size_t getNumProcs()
Definition: fei_ProcEqns.hpp:40
EqnCommMgr::addRemoteEqn
int addRemoteEqn(int eqnNumber, int destProc, const double *coefs, const int *indices, int num)
Definition: fei_EqnCommMgr.cpp:883
EqnCommMgr::sendEqnNumbersPtr
std::vector< int > & sendEqnNumbersPtr()
Definition: fei_EqnCommMgr.hpp:221
EqnCommMgr::addRemoteIndices
void addRemoteIndices(int eqnNumber, int destProc, int *indices, int num)
Definition: fei_EqnCommMgr.cpp:923
EqnBuffer
Definition: fei_EqnBuffer.hpp:21
EqnCommMgr::solnValues_
std::vector< double > solnValues_
Definition: fei_EqnCommMgr.hpp:270
EqnCommMgr::getSendProcNumber
int getSendProcNumber(int eqn)
Definition: fei_EqnCommMgr.cpp:1280
EqnBuffer::newCoefData_
int newCoefData_
Definition: fei_EqnBuffer.hpp:149
EqnCommMgr::getNumSharingProcs
size_t getNumSharingProcs()
Definition: fei_EqnCommMgr.hpp:126
EqnCommMgr::recvEqns_
EqnBuffer * recvEqns_
Definition: fei_EqnCommMgr.hpp:268
EqnCommMgr::getNumOwnerProcs
size_t getNumOwnerProcs()
Definition: fei_EqnCommMgr.hpp:132
fei_mpi.h
EqnCommMgr::deepCopy
EqnCommMgr * deepCopy()
Definition: fei_EqnCommMgr.cpp:118
EqnCommMgr::deleteEssBCs
void deleteEssBCs()
ProcEqns
Definition: fei_ProcEqns.hpp:27
ProcEqns::procsPtr
std::vector< int > & procsPtr()
Definition: fei_ProcEqns.hpp:43
EqnCommMgr::getRecvEqns
EqnBuffer * getRecvEqns()
Definition: fei_EqnCommMgr.hpp:246
EqnBuffer::eqns
std::vector< fei::CSVec * > & eqns()
Definition: fei_EqnBuffer.hpp:48
EqnCommMgr::~EqnCommMgr
virtual ~EqnCommMgr()
Definition: fei_EqnCommMgr.cpp:68
fei_CommUtils.hpp
EqnCommMgr::getSendEqns
EqnBuffer * getSendEqns()
Definition: fei_EqnCommMgr.hpp:247
EqnCommMgr::setNumRHSs
void setNumRHSs(int numRHSs)
Definition: fei_EqnCommMgr.cpp:901
EqnCommMgr::getNumLocalEqns
int getNumLocalEqns()
Definition: fei_EqnCommMgr.hpp:195
EqnCommMgr::sendEqnSoln_
std::vector< double > sendEqnSoln_
Definition: fei_EqnCommMgr.hpp:277
EqnCommMgr::newRHSData
bool newRHSData()
Definition: fei_EqnCommMgr.hpp:241
MPI_Comm
#define MPI_Comm
Definition: fei_mpi.h:56
EqnCommMgr::addRemoteRHS
int addRemoteRHS(fei::CSVec &vec, int rhsIndex)
Definition: fei_EqnCommMgr.cpp:1263
EqnCommMgr::mirrorProcEqnLengths
int mirrorProcEqnLengths(ProcEqns &inProcEqns, ProcEqns &outProcEqns)
Definition: fei_EqnCommMgr.cpp:854
EqnCommMgr::localProc_
int localProc_
Definition: fei_EqnCommMgr.hpp:261
EqnCommMgr::exchangeRemEssBCs
int exchangeRemEssBCs(int *essEqns, int numEssEqns, double *essAlpha, double *essGamma, MPI_Comm comm, std::ostream *dbgOut=NULL)
Definition: fei_EqnCommMgr.cpp:1022
EqnCommMgr::exchangeEqnBuffers
static int exchangeEqnBuffers(MPI_Comm comm, ProcEqns *sendProcEqns, EqnBuffer *sendEqns, ProcEqns *recvProcEqns, EqnBuffer *recvEqns, bool accumulate)
Definition: fei_EqnCommMgr.cpp:466
EqnCommMgr::resetCoefs
void resetCoefs()
Definition: fei_EqnCommMgr.cpp:937
EqnCommMgr::remEssBCEqns
std::vector< fei::CSVec * > & remEssBCEqns()
Definition: fei_EqnCommMgr.hpp:235
EqnCommMgr::consistencyCheck
int consistencyCheck(const char *caller, std::vector< int > &recvProcs, std::vector< int > &recvProcTotalLengths, std::vector< int > &sendProcs, std::vector< int > &sendProcTotalLengths)
Definition: fei_EqnCommMgr.cpp:363
EqnCommMgr::essBCEqns_
EqnBuffer * essBCEqns_
Definition: fei_EqnCommMgr.hpp:282
fei::CSVec
Definition: fei_CSVec.hpp:24
EqnCommMgr::exchangeSoln
void exchangeSoln()
Definition: fei_EqnCommMgr.cpp:663
EqnCommMgr::getSendProcEqns
ProcEqns * getSendProcEqns()
Definition: fei_EqnCommMgr.hpp:249
fei::CSRMat
Definition: fei_CSRMat.hpp:21
EqnBuffer::newRHSData_
int newRHSData_
Definition: fei_EqnBuffer.hpp:149
EqnCommMgr::addSolnValues
void addSolnValues(int *eqnNumbers, double *values, int num)
Definition: fei_EqnCommMgr.cpp:147
EqnCommMgr::newCoefData
bool newCoefData()
Definition: fei_EqnCommMgr.hpp:239
fei_ProcEqns.hpp
EqnCommMgr::sendEqns_
EqnBuffer * sendEqns_
Definition: fei_EqnCommMgr.hpp:275
EqnCommMgr::ownerProcsPtr
std::vector< int > & ownerProcsPtr()
Definition: fei_EqnCommMgr.hpp:133
EqnCommMgr::exchangeEqns
int exchangeEqns(std::ostream *dbgOut=NULL)
Definition: fei_EqnCommMgr.cpp:438
EqnCommMgr::sharingProcsPtr
std::vector< int > & sharingProcsPtr()
Definition: fei_EqnCommMgr.hpp:127
fei_EqnBuffer.hpp
EqnCommMgr::comm_
MPI_Comm comm_
Definition: fei_EqnCommMgr.hpp:284
EqnCommMgr::accumulate_
bool accumulate_
Definition: fei_EqnCommMgr.hpp:244