76 mtrx(std::move(mtrx1)),
82std::unique_ptr<SparseMtrx> Skyline :: clone()
const
84 return std::make_unique<Skyline>(*
this);
89Skyline :: at(
int i,
int j)
94 OOFEM_ERROR(
"dimension mismatch - accessing value at (%d,%d)", i, j);
103 int d1 = this->
adr.at(j);
104 int ind = d1 + ( j - i );
106 if ( (
adr.at(j + 1) -
adr.at(j) ) <= ( j - i ) ) {
107 OOFEM_ERROR(
"request for element which is not in sparse mtrx (%d,%d)", i, j);
122Skyline :: at(
int i,
int j)
const
127 OOFEM_ERROR(
"dimension mismatch, when accessing value at (%d,%d)", i, j);
136 int d1 = this->
adr.at(j);
137 int ind = d1 + ( j - i );
139 if ( (
adr.at(j + 1) -
adr.at(j) ) <= ( j - i ) ) {
148Skyline :: isAllocatedAt(
int i,
int j)
const
154 if ( (
adr.at(j + 1) -
adr.at(j) ) <= ( j - i ) ) {
168 if ( size != this->
adr.giveSize() - 1 ) {
169 OOFEM_ERROR(
"Internal error in skyline matrix: num columns != size(adr)-1: %d != %d", size, this->
adr.giveSize() - 1);
173 answer.
resize(size, size);
176 for (
int j = 1; j <= size; j++ ) {
178 int d2 =
adr.at(j + 1);
180 for (
int i = d1; i < d2; i++ ) {
181 answer.
at(pk, j) =
mtrx [ i ];
194 OOFEM_ERROR(
"dimension of 'mat' and 'loc' mismatch");
201 for (
int i = 1; i <= ndofe; i++ ) {
207 for (
int j = 1; j <= ndofe; j++ ) {
217 mtrx [
adr.at(ac2) + ac2 - ac1 ] += mat.
at(i, j);
230 for (
int i = 1; i <= dim1; i++ ) {
233 for (
int j = 1; j <= dim2; j++ ) {
235 if ( jj && ii <= jj ) {
236 this->
at(ii, jj) += mat.
at(i, j);
257 for (
int k = 2; k <= n; k++ ) {
259 int ack1 =
adr.at(k + 1);
261 int acs = k - ( ack1 - ack ) + 1;
262 for (
int i = ack1 - 1; i > ack; i-- ) {
263 s +=
mtrx [ i ] * y.
at(acs);
273 for (
int k = 1; k <= n; k++ ) {
277 for (
int k = n; k > 0; k-- ) {
279 int ack1 =
adr.at(k + 1);
280 solution.
at(k) = y.
at(k);
281 int acs = k - ( ack1 - ack ) + 1;
282 for (
int i = ack1 - 1; i > ack; i-- ) {
283 y.
at(acs) -=
mtrx [ i ] * solution.
at(k);
295 int n =
adr.giveSize();
297 this->
mtrx.resize(nwk);
330 for (
int j = 1; j <= neq; j++ ) {
336 elem->giveLocationArray(loc, s);
338 for (
int ieq : loc ) {
340 maxle =
min(maxle, ieq);
344 for (
int ieq : loc ) {
346 mht.
at(ieq) =
min( maxle, mht.
at(ieq) );
352 std :: vector< IntArray >r_locs;
353 std :: vector< IntArray >c_locs;
355 for (
auto &gbc : domain->
giveBcs() ) {
359 for ( std :: size_t k = 0; k < r_locs.size(); k++ ) {
363 for (
int ii : krloc ) {
365 maxle =
min(maxle, ii);
368 for (
int jj : kcloc ) {
370 mht.
at(jj) =
min( maxle, mht.
at(jj) );
380 for (
auto &in: eModel->giveIntegralList()) {
382 for (
auto &elem: in->set->giveElementList()) {
384 in->getElementTermCodeNumbers (locr, locc, domain->
giveElement(elem), *in->term, s) ;
386 for (
int ii : locr ) {
388 maxle =
min(maxle, ii);
391 for (
int jj : locc ) {
393 mht.
at(jj) =
min( maxle, mht.
at(jj) );
414 for (
int i = 1; i <= neq; i++ ) {
416 ac1 += ( i - mht.
at(i) + 1 );
419 adr.at(neq + 1) = ac1;
446 for (
int k = 2; k <= n; k++ ) {
449 int ack1 =
adr.at(k + 1);
450 int acrk = k - ( ack1 - ack ) + 1;
451 for (
int i = acrk + 1; i < k; i++ ) {
454 int aci1 =
adr.at(i + 1);
455 int acri = i - ( aci1 - aci ) + 1;
463 int acj = k - ac + ack;
464 int acj1 = k - i + ack;
465 int acs = i - ac + aci;
467 for (
int j = acj; j > acj1; j-- ) {
477 for (
int i = ack1 - 1; i > ack; i-- ) {
478 double g =
mtrx [ i ];
479 int acs =
adr.at(acrk);
518 for (
int i = 1; i <= n; i++ ) {
520 int aci1 =
adr.at(i + 1);
521 int ac = i - ( aci1 - aci ) + 1;
524 for (
int k = aci1 - 1; k >= aci; k-- ) {
525 s +=
mtrx [ k ] * x.
at(acb);
532 for (
int j = ac; j < i; j++ ) {
534 answer.
at(j) +=
mtrx [ aci1 ] * x.
at(i);
541void Skyline :: times(
double x)
560void Skyline :: printYourself()
const
569void Skyline :: writeToFile(
const char *fname)
const
571 FILE *file = fopen(fname,
"w");
574 for (
int i = 1; i <=
nRows; ++i ) {
575 for (
int j = 1; j <=
nColumns; ++j ) {
576 fprintf( file,
"%10.3e ", copy.
at(i, j) );
584void Skyline :: zero()
593std::unique_ptr<SparseMtrx> Skyline :: giveSubMatrix(
const IntArray &rows,
const IntArray &cols)
601 for (
int j = 1; j <= cols.
giveSize(); j++ ) {
602 for (
int i = rows.
giveSize(); i >= 1; i-- ) {
609 if ( hasValue && i == j ) {
610 values.
at(++nnz) = this->
at( rows.
at(i), cols.
at(j) );
611 positions.
at(diagPos++) = nnz;
612 }
else if ( i == j ) {
613 values.
at(++nnz) = 0.0;
614 positions.
at(diagPos++) = nnz;
615 }
else if ( hasValue ) {
616 values.
at(++nnz) = this->
at( rows.
at(i), cols.
at(j) );
621 positions.
at(diagPos++) = ++nnz;
625 for (
int i = 0; i < nnz-1; i++ ) {
626 mtrxValues [ i + 1] = values [ i ];
630 return std::make_unique<Skyline>(neq, mtrxValues, positions);
635 double limit,
int tc)
652 if ( tc == 1 || tc == 3 ) {
660 for (
int i = 2; i <= neq; i++ ) {
662 int uj =
adr.at(i + 1) - 2;
665 int mi = i - ( uj - lj ) - 1;
669 for (
int jj = uj; jj > lj; jj-- ) {
671 int ui =
adr.at(j + 1) - 1;
672 int k = j - ( ui - li );
686 for (
int kk = uk; kk > jj; kk-- ) {
698 for (
int jj = uj + 1; jj > lj; jj-- ) {
699 double g =
mtrx [ jj ];
701 s +=
mtrx [ jj ] * g;
708 if ( fabs(
mtrx [ lj ]) < limit ) {
714 for (
int jj = uj + 1; jj > lj; jj-- ) {
725 for (
int jj = i + 1; jj <= neq; jj++ ) {
726 if ( jj - (
adr.at(jj + 1) -
adr.at(jj) ) < i ) {
727 mtrx [
adr.at(jj) + jj - i ] = 0.0;
736 if ( tc == 2 || tc == 3 ) {
739 for (
int i = 1; i <= ise; i++ ) {
740 int uj =
adr.at(se.
at(i) + 1) - 1;
741 int lj =
adr.at( se.
at(i) );
743 for (
int jj = uj; jj > lj; jj-- ) {
757 for (
int i = 1; i <= ise; i++ ) {
758 for (
int j = neq; j > 0; j-- ) {
759 r.
at(se.
at(i), i) = 1.0;
760 int uk =
adr.at(j + 1) - 1;
762 int k = j - ( uk - lk );
763 for (
int kk = uk; kk > lk; kk-- ) {
764 r.
at(k, i) -=
mtrx [ kk ] * r.
at(j, i);
776 int nse,
double limit,
IntArray &se)
805 for (
int i = 1; i <= neq; i++ ) {
807 int uj =
adr.at(i + 1) - 1;
808 int ii = i - uj + lj;
810 for (
int j = uj; j > lj; j-- ) {
811 s +=
mtrx [ j ] * y.
at(ii);
852 for (
int i = 1; i <= neq; i++ ) {
861 for (
int i = neq; i > 0; i-- ) {
863 int uj =
adr.at(i + 1);
865 if ( se.
at(k) == i ) {
874 for (
int j = lj + 1; j < uj; j++ ) {
875 y.
at(ii) -= s *
mtrx [ j ];
#define REGISTER_SparseMtrx(class, type)
virtual void giveLocationArrays(std ::vector< IntArray > &rows, std ::vector< IntArray > &cols, CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s)
std ::vector< std ::unique_ptr< GeneralBoundaryCondition > > & giveBcs()
Element * giveElement(int n)
std ::vector< std ::unique_ptr< Element > > & giveElements()
virtual int giveNumberOfDomainEquations(int di, const UnknownNumberingScheme &num)
Domain * giveDomain(int n)
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void resize(Index rows, Index cols)
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
int giveNumberOfColumns() const
Returns number of columns of receiver.
void zero()
Zeroes all coefficient of receiver.
*Prints matrix to stdout Useful for debugging void printYourself() const
int giveNumberOfRows() const
Returns number of rows of receiver.
double at(std::size_t i, std::size_t j) const
void toFloatMatrix(FloatMatrix &answer) const override
Converts receiving sparse matrix to a dense float matrix.
IntArray adr
Integer array holding addresses of diagonal members.
bool isAllocatedAt(int i, int j) const override
Checks whether memory is allocated at position (i,j).
int giveNumberOfNonZeros() const
FloatArray mtrx
Vector of stored coefficients.
double & at(int, int) override
Returns coefficient at position (i,j).
int isFactorized
Flag indicating whether factorized.
int nColumns
Number of columns.
SparseMtrxVersionType version
int giveNumberOfRows() const
Returns number of rows of receiver.
int giveNumberOfColumns() const
Returns number of columns of receiver.
SparseMtrx(int n=0, int m=0)
double getUtime()
Returns total user time elapsed in seconds.
virtual int giveRequiredNumberOfDomainEquation() const
virtual bool isDefault() const
#define OOFEM_LOG_INFO(...)
#define OOFEM_LOG_DEBUG(...)
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ SMT_Skyline
Symmetric skyline.