/[escript]/branches/domexper/dudley/src/IndexList.c
ViewVC logotype

Diff of /branches/domexper/dudley/src/IndexList.c

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

trunk/finley/src/IndexList.c revision 1628 by phornby, Fri Jul 11 13:12:46 2008 UTC branches/domexper/dudley/src/IndexList.c revision 3080 by jfenwick, Tue Aug 3 04:28:03 2010 UTC
# Line 1  Line 1 
1    
 /* $Id$ */  
   
2  /*******************************************************  /*******************************************************
3   *  *
4   *           Copyright 2003-2007 by ACceSS MNRF  * Copyright (c) 2003-2010 by University of Queensland
5   *       Copyright 2007 by University of Queensland  * Earth Systems Science Computational Center (ESSCC)
6   *  * http://www.uq.edu.au/esscc
7   *                http://esscc.uq.edu.au  *
8   *        Primary Business: Queensland, Australia  * Primary Business: Queensland, Australia
9   *  Licensed under the Open Software License version 3.0  * Licensed under the Open Software License version 3.0
10   *     http://www.opensource.org/licenses/osl-3.0.php  * http://www.opensource.org/licenses/osl-3.0.php
11   *  *
12   *******************************************************/  *******************************************************/
13    
14    
15  /**************************************************************/  /**************************************************************/
16    
# Line 32  void Finley_IndexList_insertElements(Fin Line 31  void Finley_IndexList_insertElements(Fin
31                                         bool_t reduce_row_order, index_t* row_map,                                         bool_t reduce_row_order, index_t* row_map,
32                                         bool_t reduce_col_order, index_t* col_map) {                                         bool_t reduce_col_order, index_t* col_map) {
33    /* index_list is an array of linked lists. Each entry is a row (DOF) and contains the indices to the non-zero columns */    /* index_list is an array of linked lists. Each entry is a row (DOF) and contains the indices to the non-zero columns */
34    index_t color, *id=NULL;    index_t color;
35    dim_t e,kr,kc,NN_row,NN_col,i,icol,irow, NN, *row_node=NULL,*col_node=NULL;    Finley_ReferenceElement*refElement;
36      dim_t e, kr, kc, NN_row, NN_col, icol, irow, NN, *row_node=NULL, *col_node=NULL, isub, numSub;
37    if (elements!=NULL) {    if (elements!=NULL) {
38      NN=elements->numNodes;      NN=elements->numNodes;
39      id=TMPMEMALLOC(NN, index_t);      refElement= Finley_ReferenceElementSet_borrowReferenceElement(elements->referenceElementSet, FALSE);
40      if (! Finley_checkPtr(id) ) {        
41         for (i=0;i<NN;i++) id[i]=i;      if (reduce_col_order) {
42         if (reduce_col_order) {            numSub=1;
43            col_node=elements->ReferenceElement->Type->linearNodes;            col_node=refElement->Type->linearNodes;
44            NN_col=elements->LinearReferenceElement->Type->numNodes;            NN_col=(refElement->LinearBasisFunctions->Type->numShapes) * (refElement->Type->numSides) ;
45         } else {      } else {
46            col_node=id;            numSub=refElement->Type->numSubElements;
47            NN_col=elements->ReferenceElement->Type->numNodes;            col_node=refElement->Type->subElementNodes;
48         }            NN_col=(refElement->BasisFunctions->Type->numShapes) * (refElement->Type->numSides) ;
49         if (reduce_row_order) {      }
50            row_node=elements->ReferenceElement->Type->linearNodes;  
51            NN_row=elements->LinearReferenceElement->Type->numNodes;      if (reduce_row_order) {
52         } else {            numSub=1;
53            row_node=id;            row_node=refElement->Type->linearNodes;
54            NN_row=elements->ReferenceElement->Type->numNodes;            NN_row=(refElement->LinearBasisFunctions->Type->numShapes) * (refElement->Type->numSides) ;
55         }      } else {
56         for (color=elements->minColor;color<=elements->maxColor;color++) {            numSub=refElement->Type->numSubElements;
57             #pragma omp for private(e,irow,kr,kc,icol) schedule(static)            row_node=refElement->Type->subElementNodes;
58              NN_row=(refElement->BasisFunctions->Type->numShapes) * (refElement->Type->numSides) ;
59        }
60    
61        for (color=elements->minColor;color<=elements->maxColor;color++) {
62               #pragma omp for private(e,irow,kr,kc,icol,isub) schedule(static)
63             for (e=0;e<elements->numElements;e++) {             for (e=0;e<elements->numElements;e++) {
64                 if (elements->Color[e]==color) {                 if (elements->Color[e]==color) {
65                     for (kr=0;kr<NN_row;kr++) {                     for (isub=0;isub<numSub; isub++) {
66                       irow=row_map[elements->Nodes[INDEX2(row_node[kr],e,NN)]];                         for (kr=0;kr<NN_row;kr++) {
67                       for (kc=0;kc<NN_col;kc++) {                             irow=row_map[elements->Nodes[INDEX2(row_node[INDEX2(kr,isub,NN_row)],e,NN)]];
68                            icol=col_map[elements->Nodes[INDEX2(col_node[kc],e,NN)]];                             for (kc=0;kc<NN_col;kc++) {
69                            Finley_IndexList_insertIndex(&(index_list[irow]),icol);                                 icol=col_map[elements->Nodes[INDEX2(col_node[INDEX2(kc,isub,NN_col)],e,NN)]];
70                       }                                 Finley_IndexList_insertIndex(&(index_list[irow]),icol);
71                     }                             }
72                           }
73                       }
74                 }                 }
75             }             }
76         }         }
        TMPMEMFREE(id);  
     }  
77    }    }
78    return;    return;
79  }  }
80    
81    
82  void Finley_IndexList_insertElementsWithRowRange(Finley_IndexList* index_list, index_t firstRow, index_t lastRow,  void Finley_IndexList_insertElementsWithRowRange(Finley_IndexList* index_list, index_t firstRow, index_t lastRow,
83                                                   Finley_ElementFile* elements, index_t* row_map, index_t* col_map)                                                   Finley_ElementFile* elements, index_t* row_map, index_t* col_map)
84  {  {
85    index_t color;  /* this does not resolve macro elements */
86        index_t color;
87    dim_t e,kr,kc,icol,irow, NN;    dim_t e,kr,kc,icol,irow, NN;
88    if (elements!=NULL) {    if (elements!=NULL) {
89      NN=elements->numNodes;      NN=elements->numNodes;
# Line 99  void Finley_IndexList_insertElementsWith Line 106  void Finley_IndexList_insertElementsWith
106      }      }
107    }    }
108  }  }
109    void Finley_IndexList_insertElementsWithRowRangeNoMainDiagonal(Finley_IndexList* index_list, index_t firstRow, index_t lastRow,
110                                                                  Finley_ElementFile* elements, index_t* row_map, index_t* col_map)
111    {
112      /* this does not resolve macro elements */
113      index_t color;
114      dim_t e,kr,kc,icol,irow, NN,irow_loc;
115      if (elements!=NULL) {
116        NN=elements->numNodes;
117        for (color=elements->minColor;color<=elements->maxColor;color++) {
118               #pragma omp for private(e,irow,kr,kc,icol,irow_loc) schedule(static)
119               for (e=0;e<elements->numElements;e++) {
120                   if (elements->Color[e]==color) {
121                       for (kr=0;kr<NN;kr++) {
122                         irow=row_map[elements->Nodes[INDEX2(kr,e,NN)]];
123                         if ((firstRow<=irow) && (irow < lastRow)) {
124                              irow_loc=irow-firstRow;
125                              for (kc=0;kc<NN;kc++) {
126                                  icol=col_map[elements->Nodes[INDEX2(kc,e,NN)]];
127                                  if (icol != irow) Finley_IndexList_insertIndex(&(index_list[irow_loc]),icol);
128                              }
129                          }
130                      }
131                   }
132               }
133        }
134      }
135    }
136    
137  /* 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 */
138    
# Line 200  Paso_Pattern* Finley_IndexList_createPat Line 234  Paso_Pattern* Finley_IndexList_createPat
234                for(i=n0;i<n;++i) {                for(i=n0;i<n;++i) {
235                    Finley_IndexList_toArray(&index_list[i],&index[ptr[i-n0]],range_min,range_max,index_offset);                    Finley_IndexList_toArray(&index_list[i],&index[ptr[i-n0]],range_min,range_max,index_offset);
236                }                }
237                out=Paso_Pattern_alloc(PATTERN_FORMAT_DEFAULT,1,1,n-n0,ptr,index);                out=Paso_Pattern_alloc(PATTERN_FORMAT_DEFAULT,n-n0,range_max+index_offset,ptr,index);
238         }         }
239    }    }
240    if (! Finley_noError()) {    if (! Finley_noError()) {

Legend:
Removed from v.1628  
changed lines
  Added in v.3080

  ViewVC Help
Powered by ViewVC 1.1.26