/[escript]/branches/doubleplusgood/paso/src/SparseMatrix_getSubmatrix.cpp
ViewVC logotype

Diff of /branches/doubleplusgood/paso/src/SparseMatrix_getSubmatrix.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2658 by jfenwick, Tue Aug 18 01:25:18 2009 UTC revision 2659 by artak, Thu Sep 10 03:54:50 2009 UTC
# Line 74  Paso_SparseMatrix* Paso_SparseMatrix_get Line 74  Paso_SparseMatrix* Paso_SparseMatrix_get
74        }        }
75        return out;        return out;
76  }  }
77    
78    Paso_SparseMatrix* Paso_SparseMatrix_getBlock(Paso_SparseMatrix* A, int blockid){
79          
80          dim_t blocksize=A->row_block_size,i;
81          dim_t n=A->numRows;
82          index_t iptr;
83          
84          Paso_SparseMatrix* out=NULL;
85        
86          out=Paso_SparseMatrix_alloc(A->type,A->pattern, 1, 1, 0);
87          
88          if (blocksize==1) {
89                if (blockid==1) {
90                      for(i=0;i<n;++i) {
91                          for (iptr=A->pattern->ptr[i];iptr<A->pattern->ptr[i+1]; ++iptr) {
92                                  out->val[iptr]=A->val[iptr];
93                          }
94                      }
95                }
96                else {
97                      Paso_setError(VALUE_ERROR,"Requested and actual block sizes do not match.");
98                }
99          }
100          else if (blocksize==2) {
101                if (blockid==1) {
102                      for(i=0;i<n;i++) {
103                            for (iptr=A->pattern->ptr[i];iptr<A->pattern->ptr[i+1]; ++iptr) {
104                                  out->val[iptr]=A->val[4*iptr];
105                            }
106                      }
107                }
108                else if (blockid==2) {
109                      for(i=0;i<n;i++) {
110                            for (iptr=A->pattern->ptr[i];iptr<A->pattern->ptr[i+1]; ++iptr) {
111                                  out->val[iptr]=A->val[4*iptr+3];
112                            }
113                      }
114                }
115                else {
116                      Paso_setError(VALUE_ERROR,"Requested and actual block sizes do not match.");
117                }
118          }
119          else if (blocksize==3) {
120                if (blockid==1) {
121                      for(i=0;i<n;i++) {
122                            for (iptr=A->pattern->ptr[i];iptr<A->pattern->ptr[i+1]; ++iptr) {
123                                        out->val[iptr]=A->val[9*iptr];
124                            }
125                      }
126                }
127                else if (blockid==2) {
128                      for(i=0;i<n;i++) {
129                            for (iptr=A->pattern->ptr[i];iptr<A->pattern->ptr[i+1]; ++iptr) {
130                                        out->val[iptr]=A->val[9*iptr+4];
131                            }
132                      }
133                }
134                else if (blockid==3) {
135                      for(i=0;i<n;i++) {
136                            for (iptr=A->pattern->ptr[i];iptr<A->pattern->ptr[i+1]; ++iptr) {
137                                        out->val[iptr]=A->val[9*iptr+8];
138                            }
139                      }
140                }
141                else {
142                      Paso_setError(VALUE_ERROR,"Requested and actual block sizes do not match.");
143                }
144          }
145                
146             return  out;
147    }

Legend:
Removed from v.2658  
changed lines
  Added in v.2659

  ViewVC Help
Powered by ViewVC 1.1.26