9 #include <fei_macros.hpp>
11 #include <fei_EqnBuffer.hpp>
12 #include <fei_CSVec.hpp>
14 #include <fei_TemplateUtils.hpp>
25 setNumRHSsCalled_(false),
26 rhsCoefsAllocated_(false),
40 setNumRHSsCalled_(false),
41 rhsCoefsAllocated_(false),
50 int i, len = src.eqnNumbers_.size();
52 eqnNumbers_ = src.eqnNumbers_;
53 eqns_.resize(src.eqns_.size());
55 numRHSs_ = src.numRHSs_;
57 for(i=0; i<len; i++) {
69 std::vector<double>* rhsCoefs = src.rhsCoefs_[i];
71 rhsCoefs_.push_back(
new std::vector<double>(*rhsCoefs) );
93 void EqnBuffer::deleteMemory() {
114 if (n <= 0) {
return;}
121 std::vector<double>* rhsCoefs = rhsCoefs_[i];
122 rhsCoefs->assign(numRHSs_, 0.0);
133 fei::console_out() <<
"(deep in FEI) EqnBuffer::addRHS: ERROR, eqnNumber " << eqnNumber
134 <<
" not found in send eqns." << FEI_ENDL;
138 std::vector<double>* rhsCoefs = rhsCoefs_[index];
140 if ( (
int)rhsCoefs->size() <= rhsIndex)
setNumRHSs(rhsIndex+1);
142 if (accumulate==
true) (*rhsCoefs)[rhsIndex] += value;
143 else (*rhsCoefs)[rhsIndex] = value;
155 if (indices_union_.size() > 0) {
157 if (index < 0)
return(-1);
162 for(
int i=0; i<numEqns; i++) {
163 std::vector<int>& indices = eqnsPtr[i]->indices();
165 if (index > -1)
return(i);
173 int len,
bool accumulate,
bool create_indices_union)
175 if (len <= 0)
return(0);
177 int err, insertPoint = -1;
183 err = insertNewEqn(eqnNumber, insertPoint);
184 if (err) {
return(err);}
189 err = internalAddEqn(index, coefs, indices, len, accumulate);
191 if (create_indices_union) {
192 for(
int i=0; i<len; ++i) {
204 if (eqnLoc < 0)
return(-1);
207 if (colLoc < 0)
return(-1);
209 coef = eqns_[eqnLoc]->coefs()[colLoc];
217 if (eqnLoc < 0)
return(-1);
220 if (colLoc < 0)
return(0);
222 std::vector<int>& indices = eqns_[eqnLoc]->indices();
223 std::vector<double>& coefs= eqns_[eqnLoc]->coefs();
225 int len = indices.size();
227 int* indPtr = &indices[0];
228 double* coefPtr = &coefs[0];
230 for(
int i=len-1; i>colLoc; --i) {
231 indPtr[i-1] = indPtr[i];
232 coefPtr[i-1] = coefPtr[i];
235 indices.resize(len-1);
245 if (eqnLoc < 0)
return(-1);
248 if (colLoc < 0)
return(-1);
250 std::vector<int>& indices = eqns_[eqnLoc]->indices();
251 std::vector<double>& coefs= eqns_[eqnLoc]->coefs();
253 coef = coefs[colLoc];
254 int len = indices.size();
256 int* indPtr = &indices[0];
257 double* coefPtr = &coefs[0];
259 for(
int i=len-1; i>colLoc; --i) {
260 indPtr[i-1] = indPtr[i];
261 coefPtr[i-1] = coefPtr[i];
264 indices.resize(len-1);
281 std::vector<double>** rhsCoefs = &((*(inputEqns.
rhsCoefsPtr()))[0]);
284 std::vector<int>& indices_i = eqs[i]->indices();
285 std::vector<double>& coefs_i = eqs[i]->coefs();
287 int err =
addEqn(eqnNums[i], &coefs_i[0], &indices_i[0],
288 eqs[i]->size(), accumulate);
289 if (err)
return(err);
292 for(
int j=0; j<numRHSs; ++j) {
293 addRHS(eqnNums[i], j, (*(rhsCoefs[i]))[j], accumulate);
302 int EqnBuffer::insertNewEqn(
int eqn,
int insertPoint)
307 eqnNumbers_.insert(eqnNumbers_.begin()+insertPoint, eqn);
310 eqns_.insert(eqns_.begin()+insertPoint, newEqn);
312 if (numRHSs_ <= 0)
return(-1);
314 std::vector<double>* newRhsCoefRow =
new std::vector<double>(numRHSs_, 0.0);
315 rhsCoefs_.insert(rhsCoefs_.begin()+insertPoint, newRhsCoefRow);
317 catch (std::runtime_error& exc) {
326 int EqnBuffer::internalAddEqn(
int index,
const double* coefs,
327 const int* indices,
int len,
bool accumulate)
337 for(
int i=0; i<len; ++i) {
338 fei::add_entry(eqn, indices[i], coefs[i]);
342 for(
int i=0; i<len; ++i) {
343 fei::put_entry(eqn, indices[i], coefs[i]);
354 fei::set_values(*eqns_[i], 0.0);
361 int err = 0, insertPoint = -1;
367 if ((
int)dummyCoefs_.size() < len) {
368 dummyCoefs_.assign(len, 0.0);
374 err = insertNewEqn(eqnNumber, insertPoint);
375 if (err) {
return(err);}
380 err = internalAddEqn(index, &dummyCoefs_[0], indices, len,
true);
388 std::vector<std::vector<double>*>& rhsCoefs = *(eq.
rhsCoefsPtr());
390 os <<
"#ereb num-eqns: " << eqnNums.size() << FEI_ENDL;
391 for(
size_t i=0; i<eqnNums.size(); i++) {
392 os <<
"#ereb eqn " << eqnNums[i] <<
": ";
394 std::vector<int>& inds = eq.
eqns()[i]->indices();
395 std::vector<double>& cfs = eq.
eqns()[i]->coefs();
397 for(
size_t j=0; j<inds.size(); j++) {
398 os <<
"("<<inds[j] <<
"," << cfs[j] <<
") ";
402 std::vector<double>& rhs = *(rhsCoefs[i]);
403 for(
size_t k=0; k<rhs.size(); k++) {
404 os << rhs[k] <<
", ";
int sortedListInsert(const T &item, std::vector< T > &list)
int addEqn(int eqnNumber, const double *coefs, const int *indices, int len, bool accumulate, bool create_indices_union=false)
std::vector< fei::CSVec * > & eqns()
EqnBuffer & operator=(const EqnBuffer &src)
std::vector< int > & eqnNumbers()
int addRHS(int eqnNumber, int rhsIndex, double value, bool accumulate=true)
std::vector< std::vector< double > * > * rhsCoefsPtr()
int binarySearch(const T &item, const T *list, int len)
int getCoefAndRemoveIndex(int eqnNumber, int colIndex, double &coef)
int addEqns(EqnBuffer &inputEqns, bool accumulate)
int addIndices(int eqnNumber, const int *indices, int len)
std::ostream & console_out()
int removeIndex(int eqnNumber, int colIndex)
int getCoef(int eqnNumber, int colIndex, double &coef)
std::ostream & operator<<(std::ostream &out, const SerialBandDenseMatrixPrinter< OrdinalType, ScalarType > printer)