#include "precompiled.h" #include "0ad_warning_disable.h" # include # include # include "sr_random.h" # include "sr_output.h" # include "sr_matn.h" //# define SR_USE_TRACE1 // const/dest # include "sr_trace.h" # define MAT(m,n) _data[_col*m+n] SrMatn::SrMatn () : _lin(0), _col(0), _data(0) { SR_TRACE1 ("Default Constructor"); } SrMatn::SrMatn ( const SrMatn &m ) : _lin(m._lin), _col(m._col) { _data = new double[_lin*_col]; // reminder: memcpy does not work with overlap, but memmove yes. memcpy ( _data, m._data, sizeof(double)*_lin*_col ); SR_TRACE1 ("Copy Constructor\n"); } SrMatn::SrMatn ( int m, int n ) : _lin(m), _col(n) { _data = new double[_lin*_col]; SR_TRACE1 ("Size Constructor\n"); } SrMatn::SrMatn ( double *data, int m, int n ) : _lin(m), _col(n) { _data = data; SR_TRACE1 ("Take Data Constructor\n"); } SrMatn::~SrMatn () { delete [] _data; SR_TRACE1 ("Destructor\n"); } void SrMatn::size ( int m, int n ) { SR_POS(m); SR_POS(n); int s = m*n; if ( s==0 ) { delete [] _data; _data=0; m = n = 0; } else if ( !_data ) { _data = new double[s]; } else if ( s!=_lin*_col ) { delete [] _data; _data = new double[s]; } _lin=m; _col=n; } void SrMatn::resize ( int m, int n ) { SrMatn mat ( m, n ); int lin = SR_MIN(m,_lin); int col = SR_MIN(n,_col); for ( int i=0; isize(l,c); klast = SR_MIN(m1._col,m2._lin); for ( i=0; iset(i,j,sum); } if ( m!=this ) { *this=*m; delete m; } } void SrMatn::leave_data ( double*& m ) { m = _data; _data = 0; _lin = _col = 0; } void SrMatn::take_data ( SrMatn &m ) { if ( this==&m ) return; if ( _data ) delete []_data; _data = m._data; m._data=0; _lin = m._lin; m._lin=0; _col = m._col; m._col=0; } //============================ Operators ========================================= SrMatn& SrMatn::operator = ( const SrMatn& m ) { if ( this != &m ) { size ( m._lin, m._col ); memcpy ( _data, m._data, sizeof(double)*_lin*_col ); } return *this; } SrMatn& SrMatn::operator += ( const SrMatn& m ) { int s = size(); for ( int i=0; ibig ) big=tmp; } if ( big==0.0 ) { sr_out.warning("Singular matrix in routine ludcmp"); return 0; } vv[i]=1.0/big; // save the scaling } for ( j=0; j=big) { big=tmp; imax=i; } } if ( pivoting ) { if ( j!=imax ) // interchange rows if needed { for ( k=0; kj ) { l(i,j)=u(i,j); u(i,j)=0.0; } else { l(i,j) = i==j? 1.0:0.0; } } return true; } void lubksb ( const SrMatn &a, SrMatn &b, const int *indx ) { int i, ii=-1, ip, j; double sum; int n=a.lin(); for ( i=0; i=0) { for ( j=ii; j<=i-1; j++ ) sum -= a.get(i,j)*b[j]; } else if (sum) ii=i; b[i]=sum; } for ( i=n-1; i>=0; i-- ) { sum = b[i]; for ( j=i+1; j=big) { big=tmp; irow=j; icol=k; } } else if ( ipiv[k]>0 ) { sr_out.warning("gaussj: Singular Matrix-1"); return false; } } ++(ipiv[icol]); if ( irow!=icol ) { for ( l=0; l=0; l-- ) { if ( indxr[l]==indxc[l] ) continue; for ( k=0; kpiv_val ) { piv_lin=k; piv_val=tmp; } } if ( i!=piv_lin ) m.swap_lines(i,piv_lin); tmp = m(i,i); if ( tmp==0.0 ) { sr_out.warning("singular matrix in gauss\n"); return false; } for ( k=i+1; k=i; j-- ) m(k,j) = m(k,j)-m(i,j)*m(k,i)/tmp; } for ( i=n-1; i>=0; i-- ) { tmp = 0.0; for ( k=i+1; k=0; j-- ) u[j] -= gam[j+1]*u[j+1]; } */ /* From my old libraries, should work. static void gauss_band ( SrMatn& A, SrMatn& B ) { int i, j, k, c; int band=(A.col()-2)/2; int diag=band+1; // diagonal int last=col-1; // last column of band TMatrix real fact, div; if (col%2!=0 || col>lin || pointer==null) return gaBadSize; if ( !v.setSize(lin,1) ) return gaNoMemory; for ( i=1; i<=lin; i++ ) { c=col; div = MAT(i,band+1); if ( div==0.0 ) return gaZeroDivision; for ( j=i-band; j<=i+band && j<=lin; j++ ) { c--; if (j<=i || j<1) continue; fact = MAT(j,c)/div; MAT(j,col) = MAT(j,col)-MAT(i,col)*fact; for ( k=last; k>=1; k-- ) { if (k+j-i>last) continue; MAT(j,k) = MAT(j,k)-MAT(i,k+j-i)*fact; } } } for ( j=lin; j>=1; j-- ) { fact = 0.0; c=diag; for ( k=j+1; k<=j+band && k<=lin; k++ ) { ++c; fact += MAT(j,c)*v.get(k); } if ( MAT(j,diag)==0.0 ) return gaZeroDivision; v(j) = ( (MAT(j,col)-fact) / MAT(j,diag) ); } return gaOk; } */ //================================= End Of File ==================================