Department of Scientific Computing   
Institute for Numerical Simulation   
University of Bonn   
Documentation
Download
Programming References
Bug Reports / Suggestions
FAQ
Authors
Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

Matrix2D.cc

00001 # include "Matrix2D.hpp"
00002 
00003 //extern int debugRefine ;
00004 
00005 Matrix2D::Matrix2D() {
00006   size[0]=size[1]=0 ; 
00007   a=NULL ;
00008 }
00009 
00010 Matrix2D::Matrix2D(const int s0,const int s1) {
00011   Init(s0,s1) ;
00012 }
00013 
00014 void Matrix2D::Init(const int s0,const int s1) {
00015   size[0]=s0;size[1]=s1 ; 
00016   if (s0*s1<=0) return ;
00017   a=(double **)malloc(sizeof(double *)*s0); assert(a);
00018   for (int i=0; i<s0; i++) { a[i]=(double *)calloc(s1,sizeof(double)); assert(a[i]) ; }
00019 }
00020 
00021 Matrix2D::~Matrix2D()
00022 { 
00023   if (a) for (int i=0; i<size[0]; i++) free(a[i]) ;
00024   free(a) ;
00025   a=NULL  ;
00026   size[0]=size[1]=0 ;
00027 }
00028 
00029 void Matrix2D::Print() const
00030 {
00031   std::cout <<"size: "<<size[0]<<' '<<size[1]<<' '<<a<<'\n' ;
00032   for (int i=0; i<size[0]; i++) {
00033     for (int j=0; j<size[1]; j++) std::cout <<a[i][j]<<' '  ;
00034     std::cout << '\n' ;
00035   } 
00036 }
00037 
00038 void Matrix2D::Copy(Matrix2D *B) 
00039 {
00040   assert(a==NULL) ;
00041   Init(B->size[0],B->size[1]) ;
00042   
00043   for (int i=0; i<size[0]; i++)
00044     for (int j=0; j<size[1]; j++) a[i][j]=B->a[i][j] ;
00045 }
00046 
00047 void Matrix2D::Mirror(Matrix2D *B) 
00048 {
00049   assert(a==NULL) ;
00050   Init(B->size[0],B->size[1]) ;
00051   
00052   for (int i=0; i<size[0]; i++)
00053     for (int j=0; j<size[1]; j++) a[size[0]-1-i][size[1]-1-j]=B->a[i][j] ;
00054 }
00055 
00056 
00057 void Matrix2D::Read(FILE *fid)
00058 {
00059   fscanf(fid,"%d %d",&size[0],&size[1]) ;
00060   if (size[0]*size[1]<=0) { 
00061     size[0]=size[1]=0 ;
00062   }
00063   Init(size[0],size[1]) ;
00064   
00065   for (int i=0;i<size[0];i++)
00066     for (int j=0;j<size[1];j++) fscanf(fid,"%le",&a[i][j]) ;
00067 } 
00068 
00069 /********************************************************************
00070   Matrix Multiplications, which allow for calculations in place,    *
00071   i.e. V and W may be the same                                      */
00072 
00073 void Matrix2D::MatVec(double *const V,double *const W) const
00074 {
00075   double s,t[100] ;
00076   int i ; 
00077   
00078   assert(size[1]<100) ;
00079   for (i=0;i<size[1];i++) t[i]=V[i] ;
00080   
00081   for (i=0;i<size[0];i++)
00082     {s=0; for (int j=0;j<size[1];j++) s+=a[i][j]*t[j] ; W[i]=s ;}
00083 }
00084 
00085 
00086 void Matrix2D::MatTVec(double *const V,double *const W) const 
00087 {
00088   double s,t[100] ;
00089   int i ;
00090   
00091   assert(size[1]<100) ;
00092   for (i=0;i<size[0];i++) t[i]=V[i] ;
00093   
00094   for (i=0;i<size[1];i++)
00095     {s=0; for (int j=0;j<size[0];j++) s+=a[j][i]*t[j] ; W[i]=s ;}
00096 }
00097 
00098 void Matrix2D::APlusBMatVec(const double al,const double bl,double *const V,double *const W) const 
00099 {
00100   double s,t[100] ;
00101   int i ;
00102   
00103   assert(size[1]<100) ;
00104   for (i=0;i<size[1];i++) t[i]=V[i] ; 
00105   
00106   for (i=0;i<size[0];i++)
00107     {s=0.0; for (int j=0;j<size[1];j++) s+=a[i][j]*t[j] ; W[i] =al*W[i]+bl*s ;}
00108 }
00109 
00110 void Matrix2D::APlusBMatTVec(const double al,const double bl,double *const V,double *const W) const 
00111 {
00112   double s,t[100] ;
00113   int i ;
00114   
00115   assert(size[1]<100) ;
00116   for (i=0;i<size[0];i++) t[i]=V[i] ;
00117   
00118   for (i=0;i<size[1];i++)
00119     {s=0.0; for (int j=0;j<size[0];j++) s+=a[j][i]*t[j] ; W[i] =al*W[i]+bl*s ;}
00120 }
00121 
00122 void Matrix2D::AdaptiveAPlusBMatVec(const double al,const double bl,double *const V,double *const W,int j0,int j1) const 
00123 {
00124   double s,t[100] ;
00125   int i,j ;
00126   
00127   assert(size[1]<100) ;
00128   for (i=0;i<size[1];i++) t[i]=V[i] ; 
00129   
00130   for(i=0;i<size[0];i++) W[i]*=al ;
00131   
00132   for (j=j0;j<=min(j1,size[1]-1);j++) {
00133     s=t[j]*bl ;
00134     for (i=0;i<size[0];i++) W[i] += a[i][j]*s ;
00135   }
00136 }
00137 
00138 void Matrix2D::AdaptiveAPlusBMatTVec(const double al,const double bl,double *const V,double *const W,int j0,int j1) const 
00139 {
00140   double s,t[100] ;
00141   int i,j ;
00142   
00143   assert(size[0]<100) ;
00144   for (i=0;i<size[0];i++) t[i]=V[i] ; 
00145   
00146   for(i=0;i<size[1];i++) W[i]*=al ;
00147   
00148   for (j=j0;j<=min(j1,size[0]-1);j++) {
00149     s=t[j]*bl ;
00150     for (i=0;i<size[1];i++) W[i] += a[j][i]*s ;
00151   }
00152 }

Generated at Mon Aug 19 10:02:31 2002 for AWFD by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001