|
cgma
|
#include <CubitMatrix.hpp>
Public Member Functions | |
| CubitMatrix () | |
| CubitMatrix (const int num_rows, const int num_cols) | |
| CubitMatrix (const CubitVector &vec1, const CubitVector &vec2, const CubitVector &vec3) | |
| CubitMatrix (const CubitVector &vec1, const CubitVector &vec2, const CubitVector &vec3, const CubitVector &vec4) | |
| CubitMatrix (const CubitVector &vec1, const CubitVector &vec2) | |
| CubitMatrix (const int n) | |
| CubitMatrix (std::vector< int > &is, std::vector< int > &js, std::vector< double > &es, int n, int m) | |
| CubitMatrix (const CubitMatrix &matrix) | |
| virtual | ~CubitMatrix () |
| void | reset_size (const int n, const int m, double default_value=0.0) |
| int | num_rows () const |
| int | num_cols () const |
| void | print_matrix () const |
| void | print_matrix (char *filename) const |
| void | set_to_identity () |
| bool | is_identity (double tol=1e-8) const |
| bool | is_equal (const CubitMatrix &other, double tol=1e-8) const |
| void | plus_identity () |
| void | set (const int n, const int m, const double val) |
| void | add (const int n, const int m, const double val) |
| double | get (int n, int m) const |
| CubitMatrix | operator= (const CubitMatrix &matrix) |
| CubitMatrix | operator* (const CubitMatrix &matrix) const |
| CubitVector | operator* (const CubitVector &vector) const |
| std::vector< double > | operator* (const std::vector< double > &vector) const |
| CubitMatrix | operator* (double val) const |
| CubitMatrix | operator/ (double val) const |
| CubitMatrix | operator+ (const CubitMatrix &matrix) const |
| CubitMatrix | operator- (const CubitMatrix &matrix) const |
| CubitMatrix & | operator+= (const CubitMatrix &matrix) |
| CubitMatrix & | operator*= (const double multiplier) |
| CubitMatrix | inverse () |
| CubitMatrix | symm () const |
| CubitBoolean | positive_definite () const |
| double | determinant () const |
| double | inf_norm () const |
| double | frobenius_norm_squared () const |
| double | frobenius_norm_squared_symm () const |
| double | frobenius_norm_squared_adj () const |
| double | frobenius_norm_squared_inv () const |
| double | condition () const |
| int | rank (void) const |
| double | cofactor (const int row, const int col) const |
| CubitMatrix | adjoint () const |
| CubitMatrix | transpose () const |
| CubitMatrix | sub_matrix (const int row, const int col) const |
| void | sub_matrix (const std::vector< bool > &rows_to_include, const std::vector< bool > &cols_to_include, CubitMatrix &submatrix) |
| int | gauss_elim (CubitVector &b) |
| int | factor (CubitVector &pivot) |
| void | solve (CubitVector &b, const CubitVector &pivot) |
| CubitStatus | solveNxN (CubitMatrix &rhs, CubitMatrix &coef) |
| CubitStatus | solveNxN (const std::vector< double > &rhs, std::vector< double > &coef) |
| CubitStatus | ludcmp (double *indx, double &d) |
| CubitStatus | lubksb (double *indx, double *b) |
| bool | vector_outer_product (const CubitVector &vec1, const CubitVector &vec2) |
Private Attributes | |
| double ** | matrixPtr |
| double * | matrixMem |
| int | numRows |
| int | numCols |
Definition at line 20 of file CubitMatrix.hpp.
Definition at line 14 of file CubitMatrix.cpp.
{
matrixMem = NULL;
matrixPtr = NULL;
reset_size( 3, 3 );
}
| CubitMatrix::CubitMatrix | ( | const int | num_rows, |
| const int | num_cols | ||
| ) |
Definition at line 21 of file CubitMatrix.cpp.
{
matrixMem = NULL;
matrixPtr = NULL;
reset_size( n, m );
}
| CubitMatrix::CubitMatrix | ( | const CubitVector & | vec1, |
| const CubitVector & | vec2, | ||
| const CubitVector & | vec3 | ||
| ) |
Definition at line 39 of file CubitMatrix.cpp.
{
matrixMem = NULL;
matrixPtr = NULL;
reset_size( 3, 3 );
// Initialize the matrix columns to the three vectors
matrixPtr[0][0] = vec1.x();
matrixPtr[1][0] = vec1.y();
matrixPtr[2][0] = vec1.z();
matrixPtr[0][1] = vec2.x();
matrixPtr[1][1] = vec2.y();
matrixPtr[2][1] = vec2.z();
matrixPtr[0][2] = vec3.x();
matrixPtr[1][2] = vec3.y();
matrixPtr[2][2] = vec3.z();
}
| CubitMatrix::CubitMatrix | ( | const CubitVector & | vec1, |
| const CubitVector & | vec2, | ||
| const CubitVector & | vec3, | ||
| const CubitVector & | vec4 | ||
| ) |
Definition at line 59 of file CubitMatrix.cpp.
{
matrixMem = NULL;
matrixPtr = NULL;
reset_size( 3, 4 );
// Initialize the matrix columns to the four vectors
matrixPtr[0][0] = vec1.x();
matrixPtr[1][0] = vec1.y();
matrixPtr[2][0] = vec1.z();
matrixPtr[0][1] = vec2.x();
matrixPtr[1][1] = vec2.y();
matrixPtr[2][1] = vec2.z();
matrixPtr[0][2] = vec3.x();
matrixPtr[1][2] = vec3.y();
matrixPtr[2][2] = vec3.z();
matrixPtr[0][3] = vec4.x();
matrixPtr[1][3] = vec4.y();
matrixPtr[2][3] = vec4.z();
}
| CubitMatrix::CubitMatrix | ( | const CubitVector & | vec1, |
| const CubitVector & | vec2 | ||
| ) |
Definition at line 83 of file CubitMatrix.cpp.
{
matrixMem = NULL;
matrixPtr = NULL;
reset_size( 3, 3 );
this->vector_outer_product(vec1, vec2);
}
| CubitMatrix::CubitMatrix | ( | const int | n | ) |
Definition at line 29 of file CubitMatrix.cpp.
{
matrixMem = NULL;
matrixPtr = NULL;
reset_size( n, n );
// Initialize matrix to identity.
set_to_identity();
}
| CubitMatrix::CubitMatrix | ( | std::vector< int > & | is, |
| std::vector< int > & | js, | ||
| std::vector< double > & | es, | ||
| int | n, | ||
| int | m | ||
| ) |
Definition at line 94 of file CubitMatrix.cpp.
{
matrixMem = NULL;
matrixPtr = NULL;
reset_size( n, m );
int length = is.size();
for ( int k = 0; k < length; k++ )
{
int i = is[k];
int j = js[k];
matrixPtr[i][j] += es[k];
}
}
| CubitMatrix::CubitMatrix | ( | const CubitMatrix & | matrix | ) |
| CubitMatrix::~CubitMatrix | ( | ) | [virtual] |
Definition at line 130 of file CubitMatrix.cpp.
| void CubitMatrix::add | ( | const int | n, |
| const int | m, | ||
| const double | val | ||
| ) | [inline] |
Definition at line 91 of file CubitMatrix.hpp.
{
matrixPtr[n][m] += val;
}
| CubitMatrix CubitMatrix::adjoint | ( | ) | const |
Definition at line 566 of file CubitMatrix.cpp.
| double CubitMatrix::cofactor | ( | const int | row, |
| const int | col | ||
| ) | const |
Definition at line 553 of file CubitMatrix.cpp.
{
double c = 0.0;
CubitMatrix matrix_sub( numRows - 1, numCols -1 );
matrix_sub = sub_matrix( row, col );
c = matrix_sub.determinant();
c = (row+col)%2 ? -1*c : c;
return c;
}
| double CubitMatrix::condition | ( | ) | const |
Definition at line 756 of file CubitMatrix.cpp.
{
// condition number of A using frobenius norm
double norm = ( this->frobenius_norm_squared() ) * (this->frobenius_norm_squared_inv() );
return sqrt( norm );
}
| double CubitMatrix::determinant | ( | ) | const |
Definition at line 527 of file CubitMatrix.cpp.
{
double det = 0.0;
if( numRows == 1 )
det = matrixPtr[0][0];
else if( numRows == 2 )
det = matrixPtr[0][0] * matrixPtr[1][1] - matrixPtr[0][1]
* matrixPtr[1][0];
else if (numRows == 3)
det = matrixPtr[0][0] * matrixPtr[1][1] * matrixPtr[2][2] +
matrixPtr[0][1] * matrixPtr[1][2] * matrixPtr[2][0] +
matrixPtr[0][2] * matrixPtr[1][0] * matrixPtr[2][1] -
matrixPtr[2][0] * matrixPtr[1][1] * matrixPtr[0][2] -
matrixPtr[2][1] * matrixPtr[1][2] * matrixPtr[0][0] -
matrixPtr[2][2] * matrixPtr[1][0] * matrixPtr[0][1];
else
{
for( int jj = 0; jj < numRows; jj++ )
{
det += ( matrixPtr[0][jj] * cofactor( 0, jj ) );
}
}
return det;
}
| int CubitMatrix::factor | ( | CubitVector & | pivot | ) |
Definition at line 835 of file CubitMatrix.cpp.
{
double pvt[3];
const int n=3;
double s[3], tmp;
int i,j;
for ( i=0; i<n; i++ )
{
s[i] = 0.0;
for ( j=0; j<n; j++ )
{
tmp = fabs( matrixPtr[i][j] );
if ( tmp > s[i] )
{
s[i] = tmp;
}
}
if ( s[i] == 0.0 )
{
return(1);
}
}
for ( int k=0; k<n-1; k++ )
{
double ck = 0.0;
int i0 = -1;
for ( i=k; i<n; i++ )
{
tmp = fabs( matrixPtr[i][k] / s[i] );
if ( tmp > ck )
{
ck = tmp;
i0 = i;
}
}
pvt[k] = i0;
if ( ck == 0.0 ) { return(1); }
if ( i0 != k )
{
for ( j=k; j<n; j++ )
{
double swap = matrixPtr[i0][j];
matrixPtr[i0][j] = matrixPtr[k][j];
matrixPtr[k][j] = swap;
}
}
for ( i=k+1; i<n; i++ )
{
double r = matrixPtr[i][k] / matrixPtr[k][k];
matrixPtr[i][k] = r;
for ( j=k+1; j<n; j++ )
{
matrixPtr[i][j] -= r * matrixPtr[k][j];
}
}
}
pivot.set( pvt[0], pvt[1], pvt[2] );
return(0);
}
| double CubitMatrix::frobenius_norm_squared | ( | ) | const |
| double CubitMatrix::frobenius_norm_squared_adj | ( | ) | const |
Definition at line 715 of file CubitMatrix.cpp.
{
// square of frobenius norm of adjoint
double norm=0;
if ( numRows == 1 ) { norm=1; }
if ( numRows == 2 ) {
norm = this->frobenius_norm_squared();
}
if ( numRows == 3 ) {
norm = 0.5 * ( pow( this->frobenius_norm_squared(), 2 ) - this->frobenius_norm_squared_symm() );
}
if ( numRows > 3 ) {
CubitMatrix adj = this->adjoint();
norm = adj.frobenius_norm_squared();
}
return norm;
}
| double CubitMatrix::frobenius_norm_squared_inv | ( | ) | const |
Definition at line 740 of file CubitMatrix.cpp.
{
// square of frobenius norm of A-inverse
double det = this->determinant();
if(det==0)
throw std::invalid_argument ("Determinant cannot be 0");
//assert( det != 0 );
double norm=this->frobenius_norm_squared_adj()/pow(det,2);
return norm;
}
| double CubitMatrix::frobenius_norm_squared_symm | ( | ) | const |
Definition at line 692 of file CubitMatrix.cpp.
{
// frobenius norm-squared 2 = trace[( M^T M )( M^T M )]
double matrix_norm=0;
for ( int ii = 0; ii < numRows; ii++ )
{
for( int jj = 0; jj < numCols; jj++ )
{
double b=0;
for ( int kk = 0; kk < numRows; kk++ )
{
b += matrixPtr[kk][ii] * matrixPtr[kk][jj];
}
matrix_norm += b*b;
}
}
return matrix_norm;
}
| int CubitMatrix::gauss_elim | ( | CubitVector & | b | ) |
Definition at line 827 of file CubitMatrix.cpp.
{
CubitVector pivot;
int ierr = factor( pivot );
if ( ierr == 0 ) { solve( b, pivot ); }
return ierr;
}
| double CubitMatrix::get | ( | int | n, |
| int | m | ||
| ) | const [inline] |
Definition at line 97 of file CubitMatrix.hpp.
| double CubitMatrix::inf_norm | ( | ) | const |
Definition at line 657 of file CubitMatrix.cpp.
Reimplemented in CubitTransformMatrix.
Definition at line 429 of file CubitMatrix.cpp.
{
// can't invert a non-square matrix
if(numRows!=numCols)
throw std::invalid_argument ("Cannot invert a non-Square matrix");
//assert(numRows == numCols);
CubitMatrix matrix_inverse( numRows, numCols );
if (numRows <4)
{
double det;
det = determinant();
if(fabs(det) <= CUBIT_DBL_MIN)
throw std::invalid_argument ("Determinants Absolute value must be greater that CUBIT_DBL_MIN");
//assert( fabs(det) > CUBIT_DBL_MIN );
double det_inv = 1./det;
if ( numRows == 1 ) {
det = determinant();
if(fabs(det) <= CUBIT_DBL_MIN)
throw std::invalid_argument ("Determinants Absolute value must be greater that CUBIT_DBL_MIN");
//assert( fabs(det) > CUBIT_DBL_MIN );
matrix_inverse.set(0,0, matrixPtr[0][0]);
}
if ( numRows == 2 ) {
matrix_inverse.set(0,0, matrixPtr[1][1]);
matrix_inverse.set(1,0,-matrixPtr[1][0]);
matrix_inverse.set(0,1,-matrixPtr[0][1]);
matrix_inverse.set(1,1, matrixPtr[0][0]);
}
if ( numRows == 3 ) {
matrix_inverse.set(0,0, matrixPtr[1][1] * matrixPtr[2][2] - matrixPtr[1][2] * matrixPtr[2][1] );
matrix_inverse.set(1,0, matrixPtr[2][0] * matrixPtr[1][2] - matrixPtr[1][0] * matrixPtr[2][2] );
matrix_inverse.set(2,0, matrixPtr[1][0] * matrixPtr[2][1] - matrixPtr[1][1] * matrixPtr[2][0] );
matrix_inverse.set(0,1, matrixPtr[2][1] * matrixPtr[0][2] - matrixPtr[0][1] * matrixPtr[2][2] );
matrix_inverse.set(1,1, matrixPtr[0][0] * matrixPtr[2][2] - matrixPtr[0][2] * matrixPtr[2][0] );
matrix_inverse.set(2,1, matrixPtr[0][1] * matrixPtr[2][0] - matrixPtr[0][0] * matrixPtr[2][1] );
matrix_inverse.set(0,2, matrixPtr[0][1] * matrixPtr[1][2] - matrixPtr[0][2] * matrixPtr[1][1] );
matrix_inverse.set(1,2, matrixPtr[1][0] * matrixPtr[0][2] - matrixPtr[0][0] * matrixPtr[1][2] );
matrix_inverse.set(2,2, matrixPtr[0][0] * matrixPtr[1][1] - matrixPtr[1][0] * matrixPtr[0][1] );
}
matrix_inverse *= det_inv;
}
else
{
// use numerical recipes Inverse of a Matrix
int i, j;
double d;
std::vector<double> indx(numRows);
std::vector<double> col(numRows);
CubitMatrix save_matrix = *this;
CubitStatus rv = ludcmp(&indx[0], d);
if(rv != CUBIT_SUCCESS)
throw std::invalid_argument ("rv must equal CUBIT_SUCCESS");
//assert(rv == CUBIT_SUCCESS);
for (j=0; j<numRows; j++)
{
for(i=0; i<numRows; i++)
{
col[i] = 0.0;
}
col[j] = 1.0;
rv = lubksb(&indx[0], &col[0]);
if(rv != CUBIT_SUCCESS)
throw std::invalid_argument ("rv must equal CUBIT_SUCCESS");
//assert(rv == CUBIT_SUCCESS);
for (i=0; i<numRows; i++)
{
matrix_inverse.set(i,j,col[i]);
}
}
*this = save_matrix;
}
return matrix_inverse;
}
| bool CubitMatrix::is_equal | ( | const CubitMatrix & | other, |
| double | tol = 1e-8 |
||
| ) | const |
Definition at line 1207 of file CubitMatrix.cpp.
| bool CubitMatrix::is_identity | ( | double | tol = 1e-8 | ) | const |
| CubitStatus CubitMatrix::lubksb | ( | double * | indx, |
| double * | b | ||
| ) |
Definition at line 1152 of file CubitMatrix.cpp.
{
int i, j, ii, ip;
double sum;
// do the forward substitution
ii = -1;
for (i=0; i<numRows; ++i){
ip = (int)indx[i];
sum = b[ip];
b[ip] = b[i];
if (ii >= 0)
for (j=ii; j<=i-1; ++j)
sum -= matrixPtr[i][j]*b[j];
else if (sum)
ii = i;
b[i] = sum;
}
// do the back substitution
for (i=numRows-1; i>=0; --i){
sum = b[i];
for (j=i+1; j<numRows; ++j)
sum -= matrixPtr[i][j]*b[j];
b[i] = sum/matrixPtr[i][i]; // store a component of solution
}
return CUBIT_SUCCESS;
}
| CubitStatus CubitMatrix::ludcmp | ( | double * | indx, |
| double & | d | ||
| ) |
Definition at line 1078 of file CubitMatrix.cpp.
{
int i, j, k, imax = -1;
double big, tmp, sum;
double *vv = new double [numRows];
if (!vv) {
return CUBIT_FAILURE;
}
d = 1.0; // no row interchanges yet
// loop over rows to get implicit scale info
for (i=0; i<numRows; ++i){
big = 0.0;
for (j=0; j<numRows; ++j)
if ((tmp = fabs(matrixPtr[i][j])) > big)
big = tmp;
if (big == 0.0) {
// note (vvyas, 3/2006): corrected array deletion
// delete vv;
delete [] vv;
return CUBIT_FAILURE;
}
vv[i] = 1.0/big;
}
// loop over columns-Crout's method
for (j=0; j<numRows; ++j){
for (i=0; i<j; ++i){
sum = matrixPtr[i][j];
for (k=0; k<i; ++k)
sum -= matrixPtr[i][k]*matrixPtr[k][j];
matrixPtr[i][j] = sum;
}
big = 0.0; // initialize pivot search
for (i=j; i<numRows; ++i){
sum = matrixPtr[i][j];
for (k=0; k<j; ++k)
sum -= matrixPtr[i][k]*matrixPtr[k][j];
matrixPtr[i][j] = sum;
if ((tmp = vv[i]*fabs(sum)) > big) {
big = tmp;
imax = i;
}
}
if (j != imax) { // do we need to change rows
for (k=0; k<numRows; ++k) {
tmp = matrixPtr[imax][k];
matrixPtr[imax][k] = matrixPtr[j][k];
matrixPtr[j][k] = tmp;
}
d = -d;
vv[imax] = vv[j];
}
indx[j] = imax;
if (matrixPtr[j][j] == 0.0) matrixPtr[0][0] = 1.0e-20;
if (j != numRows-1) { // divide by the pivot element
tmp = 1.0/matrixPtr[j][j];
for (i=j+1; i<numRows; ++i)
matrixPtr[i][j] *= tmp;
}
} // go back for next column
// note (vvyas 3/2006): corrected array deletion
// delete vv;
delete [] vv;
return CUBIT_SUCCESS;
}
| int CubitMatrix::num_cols | ( | ) | const [inline] |
Definition at line 66 of file CubitMatrix.hpp.
{ return numCols; }
| int CubitMatrix::num_rows | ( | ) | const [inline] |
Definition at line 65 of file CubitMatrix.hpp.
{ return numRows; }
| CubitMatrix CubitMatrix::operator* | ( | const CubitMatrix & | matrix | ) | const |
Reimplemented in CubitTransformMatrix.
Definition at line 217 of file CubitMatrix.cpp.
{
// Check that we can multiply them.
if(numCols != matrix.num_rows())
throw std::invalid_argument ("# of columns in first MUST match # of rows of second");
//assert( numCols == matrix.num_rows() );
CubitMatrix return_matrix( numRows, matrix.num_cols() );
for( int ii = 0; ii < numRows; ii++ )
{
for( int jj = 0; jj < matrix.num_cols(); jj++ )
{
double temp = 0.0;
for( int kk = 0; kk < numCols; kk++ )
{
//temp += get( ii, kk ) * matrix.get( kk, jj );
temp += matrixPtr[ii][kk] * matrix.matrixPtr[kk][jj];
}
return_matrix.set( ii, jj, temp );
}
}
return return_matrix;
}
| CubitVector CubitMatrix::operator* | ( | const CubitVector & | vector | ) | const |
Reimplemented in CubitTransformMatrix.
Definition at line 245 of file CubitMatrix.cpp.
{
// Check that we can multiply them.
if(numCols!=3)
{
throw std::invalid_argument("Matrix must have 3 columns");
}
//assert( numCols == 3 );
double vec1[3];
double vec2[3];
vec2[0] = vector.x();
vec2[1] = vector.y();
vec2[2] = vector.z();
for( int row = 0; row < numRows; row++ )
{
vec1[row] = 0.0;
for( int col = 0; col < numCols; col++ )
{
vec1[row] += ( matrixPtr[row][col] * vec2[col] );
}
}
return CubitVector( vec1[0], vec1[1], vec1[2] );
}
| std::vector< double > CubitMatrix::operator* | ( | const std::vector< double > & | vector | ) | const |
Definition at line 274 of file CubitMatrix.cpp.
{
// Check that we can multiply them.
if(numCols != (int) vector.size())
throw std::invalid_argument ("Columns of Matrix do not match vector size");
//assert( numCols == vector.size() );
std::vector<double> return_vec( numRows );
for( int row = 0; row < numRows; row++ )
{
return_vec[row] = 0.0;
for( int col = 0; col < numCols; col++ )
{
return_vec[row] += ( matrixPtr[row][col] * vector[col] );
}
}
return return_vec;
}
| CubitMatrix CubitMatrix::operator* | ( | double | val | ) | const |
Reimplemented in CubitTransformMatrix.
Definition at line 296 of file CubitMatrix.cpp.
| CubitMatrix & CubitMatrix::operator*= | ( | const double | multiplier | ) |
Definition at line 378 of file CubitMatrix.cpp.
| CubitMatrix CubitMatrix::operator+ | ( | const CubitMatrix & | matrix | ) | const |
Definition at line 349 of file CubitMatrix.cpp.
| CubitMatrix & CubitMatrix::operator+= | ( | const CubitMatrix & | matrix | ) |
| CubitMatrix CubitMatrix::operator- | ( | const CubitMatrix & | matrix | ) | const |
Definition at line 331 of file CubitMatrix.cpp.
| CubitMatrix CubitMatrix::operator/ | ( | double | val | ) | const |
Definition at line 311 of file CubitMatrix.cpp.
| CubitMatrix CubitMatrix::operator= | ( | const CubitMatrix & | matrix | ) |
Definition at line 189 of file CubitMatrix.cpp.
{
int i, j;
if (numRows != matrix.num_rows() ||
numCols != matrix.num_cols())
{
delete [] matrixPtr;
delete [] matrixMem;
numRows = matrix.num_rows();
numCols = matrix.num_cols();
matrixPtr = new double*[numRows];
matrixMem = new double[numRows*numCols];
for (i = 0; i < numRows; i++)
matrixPtr[i] = &matrixMem[i*numCols];
}
for(i = 0; i < numRows; i++ )
for(j = 0; j < numCols; j++)
matrixPtr[i][j] = matrix.get(i, j);
return *this;
}
| void CubitMatrix::plus_identity | ( | ) |
Definition at line 1224 of file CubitMatrix.cpp.
| CubitBoolean CubitMatrix::positive_definite | ( | ) | const |
Definition at line 514 of file CubitMatrix.cpp.
{
if ( matrixPtr[0][0] <= 0. ) { return CUBIT_FALSE; }
double det2x2 = matrixPtr[0][0] * matrixPtr[1][1] - matrixPtr[1][0] * matrixPtr[0][1];
if ( det2x2 <= 0. ) { return CUBIT_FALSE; }
if ( determinant() <= 0. ) { return CUBIT_FALSE; }
return CUBIT_TRUE;
}
| void CubitMatrix::print_matrix | ( | ) | const |
Definition at line 159 of file CubitMatrix.cpp.
{
printf( "\n\n" );
for( int row = 0; row < numRows; row++ )
{
for( int col = 0; col < numCols; col++ )
PRINT_INFO("%25.15f", matrixPtr[row][col]);
PRINT_INFO("\n");
}
}
| void CubitMatrix::print_matrix | ( | char * | filename | ) | const |
Definition at line 169 of file CubitMatrix.cpp.
{
CubitFile fp( filename, "w" );
if ( !fp )
{
printf( "CubitMatrix::print_matrix - Unable to open %s for writing\n",
filename );
return;
}
for( int row = 0; row < numRows; row++ )
{
for( int col = 0; col < numCols; col++ )
fprintf( fp.file(), "%20.15f", matrixPtr[row][col] );
fprintf( fp.file(), "\n" );
}
}
| int CubitMatrix::rank | ( | void | ) | const |
Definition at line 766 of file CubitMatrix.cpp.
{
const double tol = 1E-12;
int rank = 0;
CubitMatrix tmp = *this;
int irow;
for ( irow = 0; irow < numRows; irow++ )
{
// make sure tmp[irow][irow] is non-zero. If it isn't, swap a row to
// make it so.
double val = tmp.get(irow,irow);
if ( fabs(val) < tol )
{
bool found = false;
for ( int i = irow+1; i < numRows; i++ )
{
if ( fabs(tmp.get(i,irow)) > 1E-4 )
{
// swap row (irow) with row (irow+i).
for ( int icol = 0; icol < numCols; icol++ )
{
double tmp1 = tmp.get(irow, icol);
double tmp2 = tmp.get(i, icol);
tmp.set(irow, icol, tmp2 );
tmp.set(i, icol, tmp1 );
found = true;
}
}
if ( found ) break;
}
val = tmp.get(irow,irow);
}
if ( fabs(val) < tol )
continue;
rank++;
for ( int icol = 0; icol < numCols; icol++ )
{
double col_val = tmp.get(irow, icol);
tmp.set(irow,icol, col_val/val );
}
for ( int jrow = irow+1; jrow < numRows; jrow++ )
{
val = tmp.get(jrow,irow);
if ( fabs(val) < tol )
continue;
for ( int icol = 0; icol < numCols; icol++ )
{
double tmp1 = tmp.get(jrow,icol) / val;
tmp1 -= tmp.get(irow, icol);
tmp.set(jrow,icol,tmp1 );
}
}
}
return rank;
}
| void CubitMatrix::reset_size | ( | const int | n, |
| const int | m, | ||
| double | default_value = 0.0 |
||
| ) |
Definition at line 136 of file CubitMatrix.cpp.
{
if ( matrixPtr ) delete [] matrixPtr;
if ( matrixMem ) delete [] matrixMem;
numRows = n;
numCols = m;
matrixMem = new double[numRows*numCols];
matrixPtr = new double *[n];
int ii;
for( ii = 0; ii < n; ii++ )
{
matrixPtr[ii] = &matrixMem[ii*numCols];
}
// Initialize matrix to zeros.
for( ii = 0; ii < n; ii++ )
for( int jj = 0 ; jj < m; jj++ )
matrixPtr[ii][jj] = default_value;
}
| void CubitMatrix::set | ( | const int | n, |
| const int | m, | ||
| const double | val | ||
| ) | [inline] |
Definition at line 81 of file CubitMatrix.hpp.
| void CubitMatrix::set_to_identity | ( | ) |
| void CubitMatrix::solve | ( | CubitVector & | b, |
| const CubitVector & | pivot | ||
| ) |
Definition at line 903 of file CubitMatrix.cpp.
{
double rhs[3];
rhs[0] = b.x();
rhs[1] = b.y();
rhs[2] = b.z();
double pvt[3];
pvt[0] = pivot.x();
pvt[1] = pivot.y();
pvt[2] = pivot.z();
int j;
const int n=3;
for ( int k=0; k<n-1; k++ )
{
j=(int)pvt[k];
if ( j != k )
{
double swap = rhs[k];
rhs[k] = rhs[j];
rhs[j] = swap;
}
for ( int i=k+1; i<n; i++ )
{
rhs[i] -= matrixPtr[i][k] * rhs[k];
}
}
rhs[n-1] /= matrixPtr[n-1][n-1];
for ( int i=n-2; i>-1; i-- )
{
double sum=0.;
for ( j=i+1; j<n; j++ )
{
sum += matrixPtr[i][j] * rhs[j];
}
rhs[i] = ( rhs[i] - sum ) / matrixPtr[i][i];
}
b.set( rhs[0], rhs[1], rhs[2] );
}
| CubitStatus CubitMatrix::solveNxN | ( | CubitMatrix & | rhs, |
| CubitMatrix & | coef | ||
| ) |
Definition at line 1013 of file CubitMatrix.cpp.
{
if (numRows != rhs.num_rows() ||
numRows != numCols) {
return CUBIT_FAILURE;
}
int i,j;
double d;
double *indx = new double [numRows];
double *b = new double [numRows];
CubitStatus status = ludcmp(indx, d);
if (status == CUBIT_SUCCESS)
{
coef.reset_size( rhs.num_rows(), rhs.num_cols(), 0.0 );
for ( j = 0; j < rhs.num_cols(); j++ )
{
for(i=0; i<numRows; i++)
{
b[i] = rhs.get(i,j);
}
status = lubksb(indx, b);
for (i=0; i<numRows; i++)
{
coef.set(i,j,b[i]);
}
}
}
delete [] indx;
delete [] b;
return status;
}
| CubitStatus CubitMatrix::solveNxN | ( | const std::vector< double > & | rhs, |
| std::vector< double > & | coef | ||
| ) |
Definition at line 1046 of file CubitMatrix.cpp.
{
if (numRows != (int) rhs.size() ||
numRows != numCols) {
return CUBIT_FAILURE;
}
int i;
double d;
double *indx = new double [numRows];
double *b = new double [numRows];
CubitStatus status = ludcmp(indx, d);
if (status == CUBIT_SUCCESS)
{
coef.clear();
for(i=0; i<numRows; i++)
{
b[i] = rhs[i];
}
status = lubksb(indx, b);
for (i=0; i<numRows; i++)
{
coef.push_back( b[i] );
}
}
delete [] indx;
delete [] b;
return status;
}
| CubitMatrix CubitMatrix::sub_matrix | ( | const int | row, |
| const int | col | ||
| ) | const |
Definition at line 597 of file CubitMatrix.cpp.
{
CubitMatrix matrix (numRows - 1, numCols - 1);
int copy_row = 0;
for (int source_row = 0; source_row < numRows; source_row++)
{
if (source_row != row)
{
int copy_col = 0;
for (int source_col = 0; source_col < numCols; source_col++)
{
if (source_col != col)
{
matrix.set (copy_row, copy_col, matrixPtr[source_row][source_col]);
copy_col++;
}
}
copy_row++;
}
}
return matrix;
}
| void CubitMatrix::sub_matrix | ( | const std::vector< bool > & | rows_to_include, |
| const std::vector< bool > & | cols_to_include, | ||
| CubitMatrix & | submatrix | ||
| ) |
Definition at line 625 of file CubitMatrix.cpp.
{
if(numRows != (int) rows_to_include.size())
throw std::invalid_argument ("rows_to_include size must match numRows");
//assert( numRows == rows_to_include.size() );
if(numCols != (int) cols_to_include.size())
throw std::invalid_argument ("cols_to_include size must match numCols");
//assert( numCols == cols_to_include.size() );
int i;
int nrow = 0, ncol = 0;
for ( i = 0; i < numRows; i++ ) if ( rows_to_include[i] ) nrow++;
for ( i = 0; i < numCols; i++ ) if ( cols_to_include[i] ) ncol++;
submatrix.reset_size( nrow, ncol, 0.0 );
for ( int r = 0, new_r = 0; r < numRows; r++ )
{
if ( !rows_to_include[r] ) continue;
for ( int c = 0, new_c = 0; c < numCols; c++ )
{
if ( !cols_to_include[c] ) continue;
submatrix.set( new_r, new_c, get(r,c) );
new_c++;
}
new_r++;
}
}
| CubitMatrix CubitMatrix::symm | ( | ) | const |
| CubitMatrix CubitMatrix::transpose | ( | ) | const |
Definition at line 580 of file CubitMatrix.cpp.
| bool CubitMatrix::vector_outer_product | ( | const CubitVector & | vec1, |
| const CubitVector & | vec2 | ||
| ) |
Definition at line 1233 of file CubitMatrix.cpp.
{
if ( numRows != 3 || numCols != 3 )
return false;
// Initialize the matrix elements using otimes (outer product)
matrixPtr[0][0] = vec1.x() * vec2.x();
matrixPtr[1][0] = vec1.y() * vec2.x();
matrixPtr[2][0] = vec1.z() * vec2.x();
matrixPtr[0][1] = vec1.x() * vec2.y();
matrixPtr[1][1] = vec1.y() * vec2.y();
matrixPtr[2][1] = vec1.z() * vec2.y();
matrixPtr[0][2] = vec1.x() * vec2.z();
matrixPtr[1][2] = vec1.y() * vec2.z();
matrixPtr[2][2] = vec1.z() * vec2.z();
return true;
}
double* CubitMatrix::matrixMem [private] |
Definition at line 171 of file CubitMatrix.hpp.
double** CubitMatrix::matrixPtr [private] |
Definition at line 170 of file CubitMatrix.hpp.
int CubitMatrix::numCols [private] |
Definition at line 173 of file CubitMatrix.hpp.
int CubitMatrix::numRows [private] |
Definition at line 172 of file CubitMatrix.hpp.