/[escript]/trunk/finley/src/IndexList.c
ViewVC logotype

Diff of /trunk/finley/src/IndexList.c

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

trunk/esys2/finley/src/finleyC/IndexList.c revision 100 by jgs, Wed Dec 15 03:48:48 2004 UTC trunk/finley/src/IndexList.c revision 616 by elspeth, Wed Mar 22 02:46:56 2006 UTC
# Line 1  Line 1 
1  /* $Id$ */  /*
2     ************************************************************
3     *          Copyright 2006 by ACcESS MNRF                   *
4     *                                                          *
5     *              http://www.access.edu.au                    *
6     *       Primary Business: Queensland, Australia            *
7     *  Licensed under the Open Software License version 3.0    *
8     *     http://www.opensource.org/licenses/osl-3.0.php       *
9     *                                                          *
10     ************************************************************
11    */
12    
13  /**************************************************************/  /**************************************************************/
14    
# Line 6  Line 16 
16    
17  /**************************************************************/  /**************************************************************/
18    
19  /* Copyrights by ACcESS Australia 2003,2004 */  /*  Author: gross@access.edu.au */
20  /* Author: gross@access.edu.au */  /*  Version: $Id$ */
21    
22  /**************************************************************/  /**************************************************************/
23    
 #include "Finley.h"  
 #include "ElementFile.h"  
 #include "System.h"  
24  #include "IndexList.h"  #include "IndexList.h"
25    
26  /**************************************************************/  /**************************************************************/
# Line 22  Line 29 
29     triangle of the matrix is stored. */     triangle of the matrix is stored. */
30    
31  void Finley_IndexList_insertElements(Finley_IndexList* index_list, Finley_ElementFile* elements,  void Finley_IndexList_insertElements(Finley_IndexList* index_list, Finley_ElementFile* elements,
32                                         int reduce_row_order, int packed_row_block_size, maybelong* row_Label,                                         bool_t reduce_row_order, index_t* row_Label,
33                                         int reduce_col_order, int packed_col_block_size, maybelong* col_Label,                                         bool_t reduce_col_order, index_t* col_Label) {
34                                         int symmetric, Finley_SystemMatrixType matType) {    index_t color;
35    maybelong e,kr,ir,kc,ic,NN_row,NN_col,i;    dim_t e,kr,kc,NN_row,NN_col,i,icol,irow;
   Finley_IndexList * tmp_list;  
   maybelong jr,jc,icol,irow,color;  
   
36    
37    if (elements!=NULL) {    if (elements!=NULL) {
38      maybelong NN=elements->ReferenceElement->Type->numNodes;      dim_t NN=elements->ReferenceElement->Type->numNodes;
39      maybelong id[NN],*row_node,*col_node;      index_t id[NN],*row_node,*col_node;
40      for (i=0;i<NN;i++) id[i]=i;      for (i=0;i<NN;i++) id[i]=i;
41      if (reduce_col_order) {      if (reduce_col_order) {
42         col_node=elements->ReferenceElement->Type->linearNodes;         col_node=elements->ReferenceElement->Type->linearNodes;
# Line 48  void Finley_IndexList_insertElements(Fin Line 52  void Finley_IndexList_insertElements(Fin
52         row_node=id;         row_node=id;
53         NN_row=elements->ReferenceElement->Type->numNodes;         NN_row=elements->ReferenceElement->Type->numNodes;
54      }      }
55        for (color=elements->minColor;color<=elements->maxColor;color++) {
56      #pragma omp parallel private(color)          #pragma omp for private(e,irow,kr,kc,icol) schedule(static)
57      {          for (e=0;e<elements->numElements;e++) {
58         switch(matType) {              if (elements->Color[e]==color) {
59         case CSR:                  for (kr=0;kr<NN_row;kr++) {
60           if (symmetric) {                    irow=row_Label[elements->Nodes[INDEX2(row_node[kr],e,NN)]];
61              for (color=0;color<elements->numColors;color++) {                    for (kc=0;kc<NN_col;kc++) {
62                 #pragma omp for private(e,kr,jr,kc,jc,ir,irow,ic,icol,tmp_list) schedule(static)                         icol=col_Label[elements->Nodes[INDEX2(col_node[kc],e,NN)]];
63                 for (e=0;e<elements->numElements;e++) {                         Finley_IndexList_insertIndex(&(index_list[irow]),icol);
                   if (elements->Color[e]==color) {  
                      for (kr=0;kr<NN_row;kr++) {  
                         jr=row_Label[elements->Nodes[INDEX2(row_node[kr],e,NN)]];  
                         for (ir=0;ir<packed_row_block_size;ir++) {  
                            irow=ir+packed_row_block_size*jr;  
                            tmp_list=&(index_list[irow]);  
                            for (kc=0;kc<NN_col;kc++) {  
                               jc=col_Label[elements->Nodes[INDEX2(col_node[kc],e,NN)]];  
                               for (ic=0;ic<packed_col_block_size;ic++) {  
                                  icol=ic+packed_col_block_size*jc;  
                                  if (irow<=icol) Finley_IndexList_insertIndex(tmp_list,icol);  
                               }  
                            }  
                         }  
                      }  
                   }  
                }  
             }  
          } else {  
             for (color=0;color<elements->numColors;color++) {  
                #pragma omp for private(e,kr,jr,kc,jc,ir,irow,ic,icol,tmp_list) schedule(static)  
                for (e=0;e<elements->numElements;e++) {  
                   if (elements->Color[e]==color) {  
                      for (kr=0;kr<NN_row;kr++) {  
                         jr=row_Label[elements->Nodes[INDEX2(row_node[kr],e,NN)]];  
                         for (ir=0;ir<packed_row_block_size;ir++) {  
                            irow=ir+packed_row_block_size*jr;  
                            tmp_list=&(index_list[irow]);  
                            for (kc=0;kc<NN_col;kc++) {  
                               jc=col_Label[elements->Nodes[INDEX2(col_node[kc],e,NN)]];  
                               for (ic=0;ic<packed_col_block_size;ic++) {                                  icol=ic+packed_col_block_size*jc;  
                                  Finley_IndexList_insertIndex(tmp_list,icol);  
                               }  
                            }  
                         }  
                      }  
                   }  
                }  
             }  
          } /* if else */  
          break;  
        case CSC:  
          if (symmetric) {  
             for (color=0;color<elements->numColors;color++) {  
                #pragma omp for private (e,kr,jr,kc,jc,ir,irow,ic,icol,tmp_list) schedule(static)  
                for (e=0;e<elements->numElements;e++) {  
                   if (elements->Color[e]==color) {  
                      for (kc=0;kc<NN_col;kc++) {  
                         jc=col_Label[elements->Nodes[INDEX2(col_node[kc],e,NN)]];  
                         for (ic=0;ic<packed_col_block_size;ic++) {  
                            icol=ic+packed_col_block_size*jc;  
                            tmp_list=&(index_list[icol]);  
                            for (kr=0;kr<NN_row;kr++) {  
                               jr=row_Label[elements->Nodes[INDEX2(row_node[kr],e,NN)]];  
                               for (ir=0;ir<packed_row_block_size;ir++) {  
                                  irow=ir+packed_row_block_size*jr;  
                                  if (irow<=icol) Finley_IndexList_insertIndex(tmp_list,irow);  
                               }  
                            }  
                         }  
                      }  
64                    }                    }
65                 }                  }
66              }              }
67           } else {          }
68             for (color=0;color<elements->numColors;color++) {        }
                #pragma omp for private (e,kr,jr,kc,jc,ir,irow,ic,icol,tmp_list) schedule(static)  
                for (e=0;e<elements->numElements;e++) {  
                   if (elements->Color[e]==color) {  
                      for (kc=0;kc<NN_col;kc++) {  
                         jc=col_Label[elements->Nodes[INDEX2(col_node[kc],e,NN)]];  
                         for (ic=0;ic<packed_col_block_size;ic++) {  
                            icol=ic+packed_col_block_size*jc;  
                            tmp_list=&(index_list[icol]);  
                            for (kr=0;kr<NN_row;kr++) {  
                               jr=row_Label[elements->Nodes[INDEX2(row_node[kr],e,NN)]];  
                               for (ir=0;ir<packed_row_block_size;ir++) {  
                                  irow=ir+packed_row_block_size*jr;  
                                  Finley_IndexList_insertIndex(tmp_list,irow);  
                               }  
                            }  
                         }  
                      }  
                   }  
                }  
             }  
          } /* if else */  
        } /* switch matType */  
     }  
69    }    }
70    return;    return;
71  }  }
72    
73  /* inserts row index row into the Finley_IndexList in if it does not exist */  /* inserts row index row into the Finley_IndexList in if it does not exist */
74    
75  void Finley_IndexList_insertIndex(Finley_IndexList* in, maybelong index) {  void Finley_IndexList_insertIndex(Finley_IndexList* in, index_t index) {
76    int i;    dim_t i;
77    /* is index in in? */    /* is index in in? */
78    for (i=0;i<in->n;i++) {    for (i=0;i<in->n;i++) {
79      if (in->index[i]==index) return;      if (in->index[i]==index)  return;
80    }    }
81    /* index could not be found */    /* index could not be found */
82    if (in->n==INDEXLIST_LENGTH) {    if (in->n==INDEXLIST_LENGTH) {
83       /* if in->index is full check the extension */       /* if in->index is full check the extension */
84       if (in->extension==NULL) {       if (in->extension==NULL) {
85          in->extension=(Finley_IndexList*) TMPMEMALLOC(sizeof(Finley_IndexList));          in->extension=TMPMEMALLOC(1,Finley_IndexList);
86          if (Finley_checkPtr(in->extension)) return;          if (Finley_checkPtr(in->extension)) return;
87          in->extension->n=0;          in->extension->n=0;
88          in->extension->extension=NULL;          in->extension->extension=NULL;
# Line 177  void Finley_IndexList_insertIndex(Finley Line 97  void Finley_IndexList_insertIndex(Finley
97    
98  /* counts the number of row indices in the Finley_IndexList in */  /* counts the number of row indices in the Finley_IndexList in */
99    
100  int Finley_IndexList_count(Finley_IndexList* in) {  dim_t Finley_IndexList_count(Finley_IndexList* in) {
101    if (in==NULL) {    if (in==NULL) {
102       return 0;       return 0;
103    } else {    } else {
# Line 187  int Finley_IndexList_count(Finley_IndexL Line 107  int Finley_IndexList_count(Finley_IndexL
107    
108  /* count the number of row indices in the Finley_IndexList in */  /* count the number of row indices in the Finley_IndexList in */
109    
110  void Finley_IndexList_toArray(Finley_IndexList* in, maybelong* array) {  void Finley_IndexList_toArray(Finley_IndexList* in, index_t* array) {
111    int i;    dim_t i;
112    if (in!=NULL) {    if (in!=NULL) {
113      for (i=0;i<in->n;i++) array[i]=in->index[i]+INDEX_OFFSET;      for (i=0;i<in->n;i++) array[i]=in->index[i];
114      Finley_IndexList_toArray(in->extension,&(array[in->n]));      Finley_IndexList_toArray(in->extension,&(array[in->n]));
115    }    }
116  }  }
# Line 206  void Finley_IndexList_free(Finley_IndexL Line 126  void Finley_IndexList_free(Finley_IndexL
126    
127  /*  /*
128   * $Log$   * $Log$
129   * Revision 1.3  2004/12/15 03:48:45  jgs   * Revision 1.6  2005/09/15 03:44:22  jgs
130   * *** empty log message ***   * Merge of development branch dev-02 back to main trunk on 2005-09-15
131     *
132     * Revision 1.5.2.1  2005/09/07 06:26:18  gross
133     * the solver from finley are put into the standalone package paso now
134   *   *
135   * Revision 1.1.1.1  2004/10/26 06:53:57  jgs   * Revision 1.5  2005/07/08 04:07:51  jgs
136   * initial import of project esys2   * Merge of development branch back to main trunk on 2005-07-08
137   *   *
138   * Revision 1.1.2.2  2004/10/26 06:36:39  jgs   * Revision 1.4  2004/12/15 07:08:32  jgs
139   * committing Lutz's changes to branch jgs   * *** empty log message ***
140     * Revision 1.1.1.1.2.3  2005/06/29 02:34:50  gross
141     * some changes towards 64 integers in finley
142   *   *
143   * Revision 1.2  2004/10/13 01:53:42  gross   * Revision 1.1.1.1.2.2  2004/11/24 01:37:13  gross
144   * bug in CSC assembling fixed   * some changes dealing with the integer overflow in memory allocation. Finley solves 4M unknowns now
145   *   *
  * Revision 1.1  2004/07/02 04:21:13  gross  
  * Finley C code has been included  
146   *   *
147   *   *
148   */   */

Legend:
Removed from v.100  
changed lines
  Added in v.616

  ViewVC Help
Powered by ViewVC 1.1.26