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

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

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

revision 751 by bcumming, Mon Jun 26 01:46:34 2006 UTC revision 1028 by gross, Wed Mar 14 00:15:24 2007 UTC
# Line 30  Line 30 
30    
31  void Finley_ElementFile_markNodes(index_t* mask,index_t offset,Finley_ElementFile* in,bool_t useLinear) {  void Finley_ElementFile_markNodes(index_t* mask,index_t offset,Finley_ElementFile* in,bool_t useLinear) {
32     dim_t i,NN,NN2,e;     dim_t i,NN,NN2,e;
33     index_t color,*lin_node;     index_t color,*lin_node,*id=NULL;
34     if (in!=NULL) {     if (in!=NULL) {
35       index_t id[in->ReferenceElement->Type->numNodes];       id=TMPMEMALLOC(in->ReferenceElement->Type->numNodes, index_t);
36       for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;       if (! Finley_checkPtr(id) ){
37       if (useLinear) {          for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;
38          NN=in->LinearReferenceElement->Type->numNodes;          if (useLinear) {
39          lin_node=in->ReferenceElement->Type->linearNodes;             NN=in->LinearReferenceElement->Type->numNodes;
40       } else {             lin_node=in->ReferenceElement->Type->linearNodes;
41          NN=in->ReferenceElement->Type->numNodes;          } else {
42          lin_node=id;             NN=in->ReferenceElement->Type->numNodes;
43       }             lin_node=id;
      NN2=in->ReferenceElement->Type->numNodes;  
 /* knock out the OpenMP directives for the MPI version, get the OpenMP running  
    after the MPI is working satisfactorily */  
 #ifndef PASO_MPI  
      if ((in->maxColor-in->minColor+1)*NN<in->numElements) {  
         #pragma omp parallel private(color)  
         {  
            for (color=in->minColor;color<=in->maxColor;color++) {  
              #pragma omp for private(e,i) schedule(static)  
              for (e=0;e<in->numElements;e++) {  
                if (in->Color[e]==color) {  
                   for (i=0;i<NN;i++)  
                     mask[in->Nodes[INDEX2(lin_node[i],e,NN2)]-offset]=1;  
                }  
              }  
            }  
            #pragma omp barrier  
44          }          }
45        } else {          NN2=in->ReferenceElement->Type->numNodes;
46          #pragma omp parallel for private(e,i) schedule(static)          if ((in->maxColor-in->minColor+1)*NN<in->numElements) {
47  #endif             #pragma omp parallel private(color)
48          for (e=0;e<in->numElements;e++) {             {
49             for (i=0;i<NN;i++)                for (color=in->minColor;color<=in->maxColor;color++) {
50               mask[in->Nodes[INDEX2(lin_node[i],e,NN2)]-offset]=1;                  #pragma omp for private(e,i) schedule(static)
51                    for (e=0;e<in->numElements;e++) {
52                      if (in->Color[e]==color) {
53                         for (i=0;i<NN;i++)
54                           mask[in->Nodes[INDEX2(lin_node[i],e,NN2)]-offset]=1;
55                      }
56                    }
57                  }
58                  #pragma omp barrier
59               }
60            } else {
61               #pragma omp parallel for private(e,i) schedule(static)
62               for (e=0;e<in->numElements;e++) {
63                  for (i=0;i<NN;i++)
64                    mask[in->Nodes[INDEX2(lin_node[i],e,NN2)]-offset]=1;
65               }
66          }          }
67  #ifndef PASO_MPI          TMPMEMFREE(id);
       }  
 #endif  
    }  
 }  
   
 #ifdef PASO_MPI  
   
 /* these have been trimmed down from the colors-based scheme for simplicity of testing  
    in the MPI scheme. */  
 void Finley_ElementFile_markBoundaryElementNodes(index_t* mask,index_t offset,Finley_ElementFile* in,bool_t useLinear) {  
    dim_t i,NN,NN2,e;  
    index_t color,*lin_node;  
    if (in!=NULL&& in->numElements>0) {  
      index_t id[in->ReferenceElement->Type->numNodes];  
      for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;  
      if (useLinear) {  
         NN=in->LinearReferenceElement->Type->numNodes;  
         lin_node=in->ReferenceElement->Type->linearNodes;  
      } else {  
         NN=in->ReferenceElement->Type->numNodes;  
         lin_node=id;  
      }  
      NN2=in->ReferenceElement->Type->numNodes;  
      for (e=0;e<in->elementDistribution->numBoundary;e++)  
        for (i=0;i<NN;i++)  
          mask[in->Nodes[INDEX2(lin_node[i],e+in->elementDistribution->numInternal,NN2)]-offset]=1;  
    }  
 }  
   
 void Finley_ElementFile_markInternalElementNodes(index_t* mask,index_t offset,Finley_ElementFile* in,bool_t useLinear) {  
    dim_t i,NN,NN2,e;  
    index_t color,*lin_node;  
    if (in!=NULL && in->numElements>0) {  
      index_t id[in->ReferenceElement->Type->numNodes];  
      for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;  
      if (useLinear) {  
         NN=in->LinearReferenceElement->Type->numNodes;  
         lin_node=in->ReferenceElement->Type->linearNodes;  
      } else {  
         NN=in->ReferenceElement->Type->numNodes;  
         lin_node=id;  
      }  
      NN2=in->ReferenceElement->Type->numNodes;  
   
      for (e=0;e<in->elementDistribution->numInternal;e++)  
        for (i=0;i<NN;i++)  
          mask[in->Nodes[INDEX2(lin_node[i],e,NN2)]-offset]=1;  
    }  
 }  
   
 void Finley_ElementFile_markBoundaryElementDOF(index_t* mask,index_t offset,index_t *degreeOfFreedom,Finley_ElementFile* in,bool_t useLinear) {  
    dim_t i,NN,NN2,e;  
    index_t color,*lin_node;  
    if (in!=NULL&& in->numElements>0) {  
      index_t id[in->ReferenceElement->Type->numNodes];  
      for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;  
      if (useLinear) {  
         NN=in->LinearReferenceElement->Type->numNodes;  
         lin_node=in->ReferenceElement->Type->linearNodes;  
      } else {  
         NN=in->ReferenceElement->Type->numNodes;  
         lin_node=id;  
68       }       }
      NN2=in->ReferenceElement->Type->numNodes;  
      for (e=0;e<in->elementDistribution->numBoundary;e++)  
        for (i=0;i<NN;i++)  
          mask[degreeOfFreedom[in->Nodes[INDEX2(lin_node[i],e+in->elementDistribution->numInternal,NN2)]]-offset]=1;  
    }  
 }  
   
 void Finley_ElementFile_markInternalElementDOF(index_t* mask,index_t offset,index_t *degreeOfFreedom, Finley_ElementFile* in,bool_t useLinear) {  
    dim_t i,NN,NN2,e;  
    index_t color,*lin_node;  
    if (in!=NULL && in->numElements>0) {  
      index_t id[in->ReferenceElement->Type->numNodes];  
      for (i=0;i<in->ReferenceElement->Type->numNodes;i++) id[i]=i;  
      if (useLinear) {  
         NN=in->LinearReferenceElement->Type->numNodes;  
         lin_node=in->ReferenceElement->Type->linearNodes;  
      } else {  
         NN=in->ReferenceElement->Type->numNodes;  
         lin_node=id;  
      }  
      NN2=in->ReferenceElement->Type->numNodes;  
   
      for (e=0;e<in->elementDistribution->numInternal;e++)  
        for (i=0;i<NN;i++)  
          mask[degreeOfFreedom[in->Nodes[INDEX2(lin_node[i],e,NN2)]]-offset]=1;  
69     }     }
70  }  }
 #endif  
71    
72  /*  /*
73  * $Log$  * $Log$

Legend:
Removed from v.751  
changed lines
  Added in v.1028

  ViewVC Help
Powered by ViewVC 1.1.26