entrymatrix.h

Go to the documentation of this file.
00001 #ifndef  __entrymatrix_h
00002 #define  __entrymatrix_h
00003 
00004 #include  "gascoigne.h"
00005 #include  "gostream.h"
00006 
00007 /*-------------------------------------------------------------*/
00008 
00009 namespace Gascoigne
00010 {
00011 class EntryMatrix
00012 {
00013   protected :
00014 
00015   typedef   DoubleVector::const_iterator  const_iterator;
00016   typedef   DoubleVector::iterator        iterator;
00017   typedef   std::vector<DoubleVector>     Vector;
00018 
00019   int              ndof, mdof, ncomp, mcomp, nmdof, nmcomp;
00020   int              ind;
00021   //  iterator         pind;
00022   DoubleVector  val;
00023 
00024   int dofindex (int i, int j) const {return nmcomp*(mdof*i+j);}
00025   int compindex(int c, int d) const {return mcomp*c+d;}
00026   int index(int i, int j,int c, int d) const {return dofindex(i,j)+compindex(c,d);}
00027 
00028   public :
00029     
00030     EntryMatrix() {}
00031   EntryMatrix(int nd, int nc)
00032     {
00033       SetDimensionDof(nd,nd);
00034       SetDimensionComp(nc,nc);
00035       resize();
00036     }
00037   EntryMatrix(int nd, int md, int nc, int mc)
00038     {
00039       SetDimensionDof(nd,md);
00040       SetDimensionComp(nc,mc);
00041       resize();
00042     }
00043   ~EntryMatrix()
00044     {
00045       val.clear();
00046       
00047     }
00048 
00049   const_iterator begin(int i, int j) const {return val.begin()+dofindex(i,j);}
00050   iterator       begin(int i, int j)       {return val.begin()+dofindex(i,j);}
00051   const_iterator end(int i, int j) const {return val.begin()+dofindex(i,j+1);}
00052   iterator       end(int i, int j)       {return val.begin()+dofindex(i,j+1);}
00053 
00054   void    SetDofIndex(int i, int j) { ind = dofindex(i,j);}
00055   double  operator()(int c, int d) const { return val[ind+compindex(c,d)];}
00056   double&  operator()(int c, int d) { return val[ind+compindex(c,d)];}
00057 
00058   void SetDimensionDof (int n, int m) {ndof =n; mdof =m; nmdof =n*m;}
00059   void SetDimensionComp(int n, int m) {ncomp=n; mcomp=m; nmcomp=n*m;}
00060   void resize() {val.reservesize(nmdof*nmcomp);}
00061   
00062   int Ncomp() const {return ncomp;}
00063   int Mcomp() const {return mcomp;}
00064   int Ndof() const {return ndof;}
00065   int Mdof() const {return mdof;}
00066   
00067   double   operator()(int i, int j, int c, int d) const { return val[index(i,j,c,d)];}
00068   double&  operator()(int i, int j, int c, int d)       { return val[index(i,j,c,d)];}
00069   double   operator()(int i, int j, int p) const { return val[dofindex(i,j)+p];}
00070   
00071   void zero() {val.zero();}
00072   
00073   friend std::ostream& operator<<(std::ostream& s, const EntryMatrix& A)
00074     {
00075     s << A.Ndof()  << "\t" << A.Mdof() << std::endl;
00076     s << A.Ncomp()  << "\t" << A.Mcomp() << std::endl;
00077     for(int i=0;i<A.Ndof();i++)
00078       {
00079       for(int j=0;j<A.Mdof();j++)
00080         {
00081         s << "\n[" << i << "," << j << "] ";
00082         for(int c=0;c<A.Ncomp();c++)
00083           {
00084           for(int d=0;d<A.Mcomp();d++)
00085             {
00086             s << A(i,j,c,d) << " ";
00087             }
00088           }
00089         }
00090       }
00091     return s;
00092     }
00093   
00094   
00095     void add(int il, int jl, int i, int j, const EntryMatrix& E)
00096     {
00097       iterator        p = begin(il,jl);
00098       const_iterator  q = end  (il,jl);
00099       const_iterator pE = E.begin(i,j);
00100       while(p!=q) *p++ += *pE++;
00101   }
00102 
00103     void zero_row(int i1)    
00104     {
00105       for(int j=0;j<mdof;j++)
00106         {
00107           iterator       p1 = begin(i1,j);
00108           const_iterator q1 = end(i1,j);
00109           while(p1!=q1) *p1++ = 0.;
00110         }
00111     }
00112     void zero_column(int j1)
00113     {
00114       for(int i=0;i<ndof;i++)
00115         {
00116           iterator p1 = begin(i,j1);
00117           const_iterator q1 = end(i,j1);
00118           while(p1!=q1) *p1++ = 0.;
00119         }
00120     }
00121 
00122     void add_row(int i1, int i2, double s=1.) 
00123     {
00124       for(int j=0;j<mdof;j++)
00125         {
00126           iterator       p1 = begin(i1,j);
00127           const_iterator p2 = begin(i2,j);
00128           const_iterator q1 = end(i1,j);
00129           while(p1!=q1) *p1++ += s * *p2++;
00130         }
00131     }
00132 
00133     void add_column(int j1, int j2, double s=1.)
00134     {
00135       for(int i=0;i<ndof;i++)
00136         {
00137           iterator p1 = begin(i,j1);
00138           const_iterator p2 = begin(i,j2);
00139           const_iterator q1 = end(i,j1);
00140           while(p1!=q1) *p1++ += s * *p2++;
00141         }
00142     }
00143 
00144     void add_column_row(int i1, int i2)    
00145     {
00146       add_column(i1,i2);
00147       add_row   (i1,i2);
00148     }
00149 
00150     void multiply_row(int i, double s=1.)    
00151       {
00152         for(int j=0;j<mdof;j++)
00153           {
00154             iterator p = begin(i,j);
00155             const_iterator q = end(i,j);
00156             while(p!=q) *p++ *= s;
00157           }
00158       }
00159     void multiply_column(int j, double s=1.)    
00160     {
00161       for(int i=0;i<ndof;i++)
00162         {
00163           iterator p = begin(i,j);
00164           const_iterator q = end(i,j);
00165           while(p!=q) *p++ *= s;
00166         }
00167     }
00168 
00169     void multiply_column_row(int j, double s=1.)    
00170     {
00171       multiply_column(j,s);
00172       multiply_row   (j,s);
00173     }
00174 
00175     void distribute_row(int s, int t1, int t2)    
00176     {
00177       add_column(t1, s, 0.5);
00178       add_column(t2, s, 0.5);
00179       multiply_column(s,0.);
00180     }
00181 
00182     void distribute_column(int s, int t1, int t2)    
00183     {
00184       add_row(t1, s, 0.5);
00185       add_row(t2, s, 0.5);
00186       multiply_row(s,0.);
00187     }
00188     void transpose(EntryMatrix& E)    
00189     {
00190       for(int i=0; i<ndof; i++)
00191         {
00192           for(int j=0; j<mdof; j++)
00193             {
00194               SetDofIndex(i,j);
00195               E.SetDofIndex(j,i);
00196               for(int c=0; c<ncomp; c++)
00197                 {
00198                   for(int d=0; d<mcomp; d++)
00199                     {
00200                       (*this)(c,d) = E(d,c);
00201                     }
00202                 }
00203             }
00204         }
00205     }
00206     void equ(double d)    
00207     {
00208       for(iterator p = val.begin(); p!=val.end(); p++)
00209         {
00210           *p *= d;
00211         }
00212     }
00213     void mult(Vector& y, const Vector& x)
00214     {
00215       for(int i=0; i<ndof; i++)
00216         {
00217           for(int j=0; j<mdof; j++)
00218             {
00219               SetDofIndex(i,j);
00220               for(int c=0; c<ncomp; c++)
00221                 {
00222                   for(int d=0; d<mcomp; d++)
00223                     {
00224                       y[i][c] += (*this)(c,d) * x[j][d];
00225                     }
00226                 }
00227             }
00228         }
00229     }
00230 };
00231 }
00232 #endif

Generated on Thu Sep 14 10:34:34 2006 for Gascoigne by  doxygen 1.4.7