47 localUnreducedEqns_(),
54 firstLocalReducedEqn_(0),
55 lastLocalReducedEqn_(0),
56 lowestGlobalSlaveEqn_(0),
57 highestGlobalSlaveEqn_(0),
61 dbgprefix_(
"Reducer: "),
71 csrD_ = *globalSlaveDependencyMatrix;
72 if (g_vector.
get() != NULL) {
89 for(
size_t i=0; i<
csg_.
size(); ++i) {
105 int nonslave_counter = 0;
107 int num_consecutive = 0;
127 for(
int i=1; i<nonslave_counter; ++i) {
144 throw std::runtime_error(
"ERROR: don't use fei::Reducer when numGlobalSlaves==0. Report to Alan Williams.");
163 localUnreducedEqns_(),
170 firstLocalReducedEqn_(0),
171 lastLocalReducedEqn_(0),
172 lowestGlobalSlaveEqn_(0),
173 highestGlobalSlaveEqn_(0),
177 dbgprefix_(
"Reducer: "),
189 std::vector<int> indices;
208 os <<
dbgprefix_<<
"setLocalUnreducedEqns, numLocalEqns="
209 <<localUnreducedEqns.size() <<
FEI_ENDL;
240 for(
int j=0; j<rowlen; ++j) {
241 os << indices[j] <<
" ";
249 int num_slaves_on_lower_procs = 0;
255 std::vector<int> procNumLocalSlaves(
numProcs_);
261 num_slaves_on_lower_procs += procNumLocalSlaves[p];
267 unsigned first_non_slave_offset = 0;
270 ++first_non_slave_offset;
274 - num_slaves_on_lower_procs - first_non_slave_offset;
315 std::vector<int>& rowNumbers = matrixGraph->
rowNumbers;
316 std::vector<int>& rowOffsets = matrixGraph->
rowOffsets;
319 for(
unsigned i=0; i<rowNumbers.size(); ++i) {
320 int row = rowNumbers[i];
324 int rowLength = rowOffsets[i+1]-rowOffsets[i];
325 int* cols = &packedCols[rowOffsets[i]];
331 for(
int j=0; j<rowLength; ++j) {
349 for(
int j=0; j<rowLength; ++j) {
380 int numCols,
const int* cols,
385 bool no_slave_cols =
true;
386 for(
int i=0; i<numCols; ++i) {
391 for(
int i=0; i<numRows; ++i) {
398 for(
int j=0; j<numCols; ++j) {
414 unsigned num_non_slave_cols = 0;
416 for(
int j=0; j<numCols; ++j) {
426 if (num_non_slave_cols > 0) {
444 for(
int i=0; i<numIndices; ++i) {
613 std::vector<int>::iterator iter =
614 std::lower_bound(rows.begin(), rows.end(), slaveEqn);
616 if (iter == rows.end() || *iter != slaveEqn) {
620 size_t offset = iter - rows.begin();
626 for(
int j=rowBegin; j<rowEnd; ++j) {
627 masterEqns.push_back(cols[j]);
655 if (foundOffset >= 0) {
656 throw std::runtime_error(
"Reducer::translateToReducedEqn ERROR, input is slave eqn.");
676 int adjustment = reduced_eqn -
reverse_[index-1];
683 int numCols,
const int* cols,
684 const double*
const* values,
696 const double** myvalues = const_cast<const double**>(values);
699 throw std::runtime_error(
"fei::Reducer::addMatrixValues ERROR, submatrix format must be either FEI_DENSE_ROW or FEI_DENSE_COL. Other formats not supported with slave constraints.");
707 bool no_slave_cols =
true;
708 unsigned num_non_slave_cols = 0;
709 for(
int j=0; j<numCols; ++j) {
715 bool no_slave_rows =
true;
716 for(
int i=0; i<numRows; ++i) {
722 if (no_slave_rows && no_slave_cols) {
735 for(
int i=0; i<numRows; ++i) {
742 for(
int j=0; j<numCols; ++j) {
744 add_entry(*Kdd_row, cols[j], myvalues[i][j]);
747 add_entry(*Kdi_row, cols[j], myvalues[i][j]);
755 const double* rowvals = myvalues[i];
772 for(
int j=0; j<numCols; ++j) {
774 add_entry(*Kid_row, cols[j], myvalues[i][j]);
782 if (num_non_slave_cols > 0) {
805 const int* globalIndices,
806 const double* values,
817 for(
int i=0; i<numValues; ++i) {
820 if (!soln_vector)
add_entry(
fd_, globalIndices[i], values[i]);
823 if (!soln_vector)
put_entry(
fd_, globalIndices[i], values[i]);
831 feivec.
sumIn(1, &reduced_index, &values[i], vectorIndex);
834 feivec.
copyIn(1, &reduced_index, &values[i], vectorIndex);
861 if (vec.
size() > 0) {
870 int which_vector = 0;
877 if (vec_i.
size() > 0) {
881 int which_vector = 0;
893 const int* globalIndices,
906 std::vector<int> reduced_indices;
907 std::vector<int> offsets;
909 for(
int i=0; i<numValues; ++i) {
912 offsets.push_back(i);
916 feivec.
copyOut(1, &reduced_idx, &values[i], vectorIndex);
928 int* reduced_indices_ptr = reduced_indices.empty() ? NULL : &reduced_indices[0];
936 for(
size_t ii=0; ii<
csg_.
size(); ++ii) {
945 for(
unsigned ii=0; ii<offsets.size(); ++ii) {
946 int index = globalIndices[offsets[ii]];
952 values[offsets[ii]] = coefs[idx];