29#define fei_file "fei_Matrix_core.cpp"
61 if (matrixGraph.
get() == NULL) {
62 throw std::runtime_error(
"fei::Matrix_core constructed with NULL fei::MatrixGraph");
67 if (
vecSpace_->initCompleteAlreadyCalled()) {
68 vecSpace_->getGlobalIndexOffsets(globalOffsets_);
69 eqnComm_.reset(new fei::EqnComm(comm_, numLocalEqns, globalOffsets_));
72 eqnComm_.reset(new fei::EqnComm(comm_, numLocalEqns));
86std::map<int,fei::FillableMat*>&
95 std::map<int,FillableMat*>::iterator
98 for(; it!=it_end; ++it) {
115 std::map<int,FillableMat*>::iterator
118 for(; it!=it_end; ++it) {
133 param = paramset.
get(
"FEI_OUTPUT_LEVEL");
145 if (name == NULL)
return;
147 if (
name_ == name)
return;
157 for(
int p=len-2; p>=0; --p) {
178 std::map<int,FillableMat*>::iterator
181 for(; it!=it_end; ++it) {
183 if (it->second != NULL) {
184 if (it->second->getNumRows() == 0) {
197 std::vector<MPI_Request> mpiReqs(
recvProcs_.size());
200 std::vector<int> recv_sizes(
recvProcs_.size(), 0);
202 MPI_Irecv(&recv_sizes[i], 1, MPI_INT,
recvProcs_[i],
203 tag1,
comm_, &mpiReqs[i]);
221 MPI_Send(&bsize, 1, MPI_INT, proc, tag1,
comm_);
228 MPI_Waitany(numRecvProcs, &mpiReqs[0], &index, &status);
249 std::vector<MPI_Request> mpiReqs(
recvProcs_.size());
259 tag1,
comm_, &mpiReqs[i]);
273 for(
size_t ir=0; ir<
recvProcs_.size(); ++ir) {
276 MPI_Waitany(numRecvProcs, &mpiReqs[0], &index, &status);
281 for(
size_t ir=0; ir<
recvProcs_.size(); ++ir) {
286 if (all_zeros)
continue;
290 for(
int i=0; i<nrows; ++i) {
295 int* indices = &(recvMat.
getGraph().packedColumnIndices[rowOffset]);
306 FEI_COUT <<
"fei::Matrix_core::gatherFromOverlap ERROR storing "
307 <<
"values for row=" << row<<
", recv'd from proc " <<
recvProcs_[i]
321 const double*
const* values,
322 std::vector<double>& work_1D,
323 std::vector<const double*>& work_2D)
327 int arrayLen = numCols*numRows;
328 if ((
int)work_1D.size() != arrayLen) {
329 work_1D.resize(arrayLen);
331 if ((
int)work_2D.size() != numCols) {
332 work_2D.resize(numCols);
335 const double** dataPtr = &work_2D[0];
336 double* data1DPtr = &work_1D[0];
338 for(
int i=0; i<numCols; ++i) {
339 dataPtr[i] = data1DPtr;
341 for(
int j=0; j<numRows; ++j) {
342 data1DPtr[j] = values[j][i];
345 data1DPtr += numRows;
362 for(i=0; i<numRows; ++i) {
363 if (pointBlockMap->
getPtEqnInfo(rows[i], blkRows[i], blkRowOffsets[i])!=0){
367 for(i=0; i<numCols; ++i) {
368 if(pointBlockMap->
getPtEqnInfo(cols[i], blkCols[i], blkColOffsets[i])!=0){
378 const double*
const* ptValues,
380 const int* blkColDims,
384 for(
int blki=0; blki<numBlkCols; ++blki) {
385 int blkvalueOffset = 0;
386 double* blkvalues_i = blkValues[blki];
387 for(
int j=0; j<blkColDims[blki]; ++j) {
388 int loc = ptColOffset+j;
389 for(
int i=0; i<numPtRows; ++i) {
390 blkvalues_i[blkvalueOffset++] = ptValues[i][loc];
393 ptColOffset += blkColDims[blki];
std::vector< double > & getPackedCoefs()
unsigned getNumRows() const
SparseRowGraph & getGraph()
void setValues(double value)
void setOutputLevel(OutputLevel olevel)
static LogManager & getLogManager()
void setOutputLevel(OutputLevel olevel)
int getOwnerProc(int globalEqn) const
std::vector< int > work_ints_
std::vector< int > work_indices2_
std::vector< int > work_indices_
int convertPtToBlk(int numRows, const int *rows, int numCols, const int *cols, int *blkRows, int *blkRowOffsets, int *blkCols, int *blkColOffsets)
int copyPointRowsToBlockRow(int numPtRows, int numPtCols, const double *const *ptValues, int numBlkCols, const int *blkColDims, double **blkValues)
std::vector< std::vector< char > > send_chars_
fei::SharedPtr< fei::VectorSpace > vecSpace_
fei::SharedPtr< fei::Vector > rhsVector_
void setName(const char *name)
fei::SharedPtr< fei::MatrixGraph > matrixGraph_
Matrix_core(fei::SharedPtr< fei::MatrixGraph > matrixGraph, int numLocalEqns)
MPI_Comm getCommunicator() const
std::vector< int > recvProcs_
void putScalar_remotelyOwned(double scalar)
std::vector< std::vector< char > > recv_chars_
std::vector< double > work_data1D_
std::vector< int > globalOffsets_
int gatherFromOverlap(bool accumulate)
virtual int giveToUnderlyingMatrix(int numRows, const int *rows, int numCols, const int *cols, const double *const *values, bool sumInto, int format)=0
static void copyTransposeToWorkArrays(int numRows, int numCols, const double *const *values, std::vector< double > &work_1D, std::vector< const double * > &work_2D)
std::vector< const double * > work_data2D_
std::map< int, FillableMat * > & getRemotelyOwnedMatrices()
void parameters(const fei::ParameterSet ¶mset)
void setRHS(fei::SharedPtr< fei::Vector > rhsvector)
bool sendRecvProcsNeedUpdated_
fei::SharedPtr< fei::EqnComm > eqnComm_
std::vector< int > sendProcs_
FillableMat * remotelyOwned_last_requested_
void setEqnComm(fei::SharedPtr< fei::EqnComm > eqnComm)
std::map< int, FillableMat * > remotelyOwned_
void setMatrixGraph(fei::SharedPtr< fei::MatrixGraph > matrixGraph)
bool haveBlockMatrix() const
virtual int giveToBlockMatrix(int numRows, const int *rows, int numCols, const int *cols, const double *const *values, bool sumInto)=0
const std::string & getStringValue() const
ParamType getType() const
const Param * get(const char *name) const
std::vector< int > rowNumbers
std::vector< int > rowOffsets
int getPtEqnInfo(int ptEqn, int &blkEqn, int &blkOffset)
size_t num_bytes_FillableMat(const fei::FillableMat &mat)
bool unpack_CSRMat(const char *buffer_begin, const char *buffer_end, fei::CSRMat &mat)
void pack_FillableMat(const fei::FillableMat &mat, char *buffer)
fei::OutputLevel string_to_output_level(const std::string &str)
int localProc(MPI_Comm comm)
int mirrorProcs(MPI_Comm comm, std::vector< int > &toProcs, std::vector< int > &fromProcs)
int numProcs(MPI_Comm comm)
static int setValues(T *mat, double scalar)