FEI Package Browser (Single Doxygen Collection) Version of the Day
Loading...
Searching...
No Matches
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
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
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
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
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
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
250
251 private:
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
#define dbgOut()
Definition FEData.hpp:17
std::vector< std::vector< double > * > * rhsCoefsPtr()
std::vector< int > & eqnNumbers()
std::vector< fei::CSVec * > & eqns()
std::vector< int > & sendEqnNumbersPtr()
EqnCommMgr(MPI_Comm comm, bool accumulate=true)
int exchangeIndices(std::ostream *dbgOut=NULL)
std::vector< fei::CSVec * > & remEssBCEqns()
int exchangeRemEssBCs(int *essEqns, int numEssEqns, double *essAlpha, double *essGamma, MPI_Comm comm, std::ostream *dbgOut=NULL)
static int exchangeEqnBuffers(MPI_Comm comm, ProcEqns *sendProcEqns, EqnBuffer *sendEqns, ProcEqns *recvProcEqns, EqnBuffer *recvEqns, bool accumulate)
void deleteEssBCs()
int exchangeEqns(std::ostream *dbgOut=NULL)
std::vector< double > solnValues_
EqnBuffer * getSendEqns()
int addRemoteRHS(fei::CSVec &vec, int rhsIndex)
std::vector< fei::CSVec * > & localEqns()
std::vector< int > & sharingProcsPtr()
EqnBuffer * getRecvEqns()
EqnBuffer * essBCEqns_
void setNumRHSs(int numRHSs)
size_t getNumOwnerProcs()
void addLocalEqn(int eqnNumber, int srcProc)
int exchangePtToBlkInfo(snl_fei::PointBlockMap &blkEqnMapper)
EqnBuffer * recvEqns_
std::vector< int > & remEssBCEqnNumbersPtr()
EqnBuffer * sendEqns_
int addRemoteEqns(fei::CSRMat &mat, bool onlyIndices)
int getNumRemEssBCEqns()
void addSolnValues(int *eqnNumbers, double *values, int num)
EqnCommMgr * deepCopy()
std::vector< int > & ownerProcsPtr()
bool exchangeIndicesCalled_
int mirrorProcEqns(ProcEqns &inProcEqns, ProcEqns &outProcEqns)
int mirrorProcEqnLengths(ProcEqns &inProcEqns, ProcEqns &outProcEqns)
ProcEqns * recvProcEqns_
int consistencyCheck(const char *caller, std::vector< int > &recvProcs, std::vector< int > &recvProcTotalLengths, std::vector< int > &sendProcs, std::vector< int > &sendProcTotalLengths)
std::vector< int > & localEqnNumbers()
EqnCommMgr & operator=(const EqnCommMgr &src)
double * sendEqnSolnPtr()
int addRemoteEqn(int eqnNumber, int destProc, const double *coefs, const int *indices, int num)
int gatherSharedBCs(EqnBuffer &bcEqns)
void addRemoteIndices(int eqnNumber, int destProc, int *indices, int num)
virtual ~EqnCommMgr()
size_t getNumSharingProcs()
ProcEqns * getRecvProcEqns()
ProcEqns * getSendProcEqns()
ProcEqns * sendProcEqns_
std::vector< double > sendEqnSoln_
int getSendProcNumber(int eqn)
std::vector< std::vector< double > * > * localRHSsPtr()
std::vector< int > & procsPtr()
size_t getNumProcs()
#define MPI_Comm
Definition fei_mpi.h:56