TridiagonalCrsMatrix( const Epetra_Map & Map, double a, double diag, double c ) : Epetra_CrsMatrix(Copy,Map,3) { // global number of rows int NumGlobalElements = Map.NumGlobalElements(); // local number of rows int NumMyElements = Map.NumMyElements(); // get update list int * MyGlobalElements = new int [NumMyElements]; Map.MyGlobalElements( MyGlobalElements ); // Add rows one-at-a-time // Need some vectors to help // Off diagonal Values will always be -1 double *Values = new double[2]; Values[0] = a; Values[1] = c; int *Indices = new int[2]; int NumEntries; for( int i=0 ; i<NumMyElements; ++i ) { if (MyGlobalElements[i]==0) { Indices[0] = 1; NumEntries = 1; } else if (MyGlobalElements[i] == NumGlobalElements-1) { Indices[0] = NumGlobalElements-2; NumEntries = 1; } else { Indices[0] = MyGlobalElements[i]-1; Indices[1] = MyGlobalElements[i]+1; NumEntries = 2; } InsertGlobalValues(MyGlobalElements[i], NumEntries, Values, Indices); // Put in the diagonal entry InsertGlobalValues(MyGlobalElements[i], 1, &diag, MyGlobalElements+i); } // Finish up FillComplete(); delete [] MyGlobalElements; delete [] Values; delete [] Indices; }
int Epetra_FECrsMatrix::InsertGlobalValues(const Epetra_LongLongSerialDenseVector& indices, const Epetra_SerialDenseMatrix& values, int format) { if (indices.Length() != values.M() || indices.Length() != values.N()) { return(-1); } return( InsertGlobalValues(indices.Length(), indices.Values(), values.A(), format) ); }
int Epetra_FECrsMatrix::InsertGlobalValues(const Epetra_IntSerialDenseVector& rows, const Epetra_IntSerialDenseVector& cols, const Epetra_SerialDenseMatrix& values, int format) { if (rows.Length() != values.M() || cols.Length() != values.N()) { return(-1); } return( InsertGlobalValues(rows.Length(), rows.Values(), cols.Length(), cols.Values(), values.A(), format) ); }