/[escript]/branches/trilinos_from_5897/dudley/src/ElementFile_createColoring.cpp
ViewVC logotype

Diff of /branches/trilinos_from_5897/dudley/src/ElementFile_createColoring.cpp

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

revision 6008 by caltinay, Fri Feb 5 03:37:49 2016 UTC revision 6009 by caltinay, Wed Mar 2 04:13:26 2016 UTC
# Line 14  Line 14 
14  *  *
15  *****************************************************************************/  *****************************************************************************/
16    
17  /************************************************************************************/  /****************************************************************************/
18  /*                                                                                                         */  /*                                                                                                         */
19  /*   Dudley: ElementFile                                                                                   */  /*   Dudley: ElementFile                                                                                   */
20  /*                                                                                                         */  /*                                                                                                         */
21  /*   This routine tries to reduce the number of colors used to color elements in the Dudley_ElementFile in */  /*   This routine tries to reduce the number of colors used to color elements in the Dudley_ElementFile in */
22  /*                                                                                                         */  /*                                                                                                         */
23  /************************************************************************************/  /****************************************************************************/
   
 #define ESNEEDPYTHON  
 #include "esysUtils/first.h"  
24    
25  #include "ElementFile.h"  #include "ElementFile.h"
26  #include "Util.h"  #include "Util.h"
27    
28  /************************************************************************************/  namespace dudley {
29    
30  void Dudley_ElementFile_createColoring(Dudley_ElementFile * in, dim_t numNodes, index_t * degreeOfFreedom)  void Dudley_ElementFile_createColoring(Dudley_ElementFile* in, dim_t numNodes, index_t* degreeOfFreedom)
31  {  {
32      dim_t e, i, numUncoloredElements, n, len, NN;      dim_t e, i, numUncoloredElements, n, len, NN;
33      index_t *maskDOF, min_id, max_id;      index_t *maskDOF, min_id, max_id;
34      bool independent;      bool independent;
35    
36      if (in == NULL)      if (in == NULL)
37      return;          return;
38      if (in->numElements < 1)      if (in->numElements < 1)
39      return;          return;
40      NN = in->numNodes;      NN = in->numNodes;
41    
42      min_id = Dudley_Util_getMinInt(1, numNodes, degreeOfFreedom);      min_id = Dudley_Util_getMinInt(1, numNodes, degreeOfFreedom);
43      max_id = Dudley_Util_getMaxInt(1, numNodes, degreeOfFreedom);      max_id = Dudley_Util_getMaxInt(1, numNodes, degreeOfFreedom);
44      len = max_id - min_id + 1;      len = max_id - min_id + 1;
45      maskDOF = new index_t[len];      maskDOF = new index_t[len];
     if (!Dudley_checkPtr(maskDOF))  
     {  
46  #pragma omp parallel for private(e) schedule(static)  #pragma omp parallel for private(e) schedule(static)
47      for (e = 0; e < in->numElements; e++)      for (e = 0; e < in->numElements; e++)
48          in->Color[e] = -1;          in->Color[e] = -1;
49      numUncoloredElements = in->numElements;      numUncoloredElements = in->numElements;
50      in->minColor = 0;      in->minColor = 0;
51      in->maxColor = in->minColor - 1;      in->maxColor = in->minColor - 1;
52      while (numUncoloredElements > 0)      while (numUncoloredElements > 0)
53      {      {
54          /* initialize the mask marking nodes used by a color */          /* initialize the mask marking nodes used by a color */
55  #pragma omp parallel for private(n) schedule(static)  #pragma omp parallel for private(n) schedule(static)
56          for (n = 0; n < len; n++)          for (n = 0; n < len; n++)
57          maskDOF[n] = -1;              maskDOF[n] = -1;
58          numUncoloredElements = 0;          numUncoloredElements = 0;
59          /* OMP ? */          /* OMP ? */
60          for (e = 0; e < in->numElements; e++)          for (e = 0; e < in->numElements; e++)
61          {          {
62          if (in->Color[e] < 0)              if (in->Color[e] < 0)
63          {              {
64              /* find out if element e is independent from the elements already colored: */                  /* find out if element e is independent from the elements already colored: */
65              independent = TRUE;                  independent = true;
66              for (i = 0; i < NN; i++)                  for (i = 0; i < NN; i++)
67              {                  {
68  #ifdef BOUNDS_CHECK  #ifdef BOUNDS_CHECK
69              if (in->Nodes[INDEX2(i, e, NN)] < 0 || in->Nodes[INDEX2(i, e, NN)] >= numNodes)                      if (in->Nodes[INDEX2(i, e, NN)] < 0 || in->Nodes[INDEX2(i, e, NN)] >= numNodes)
70              {                      {
71                  printf("BOUNDS_CHECK %s %d i=%d e=%d NN=%d min_id=%d in->Nodes[INDEX2...]=%d\n", __FILE__,                          printf("BOUNDS_CHECK %s %d i=%d e=%d NN=%d min_id=%d in->Nodes[INDEX2...]=%d\n", __FILE__,
72                     __LINE__, i, e, NN, min_id, in->Nodes[INDEX2(i, e, NN)]);                                 __LINE__, i, e, NN, min_id, in->Nodes[INDEX2(i, e, NN)]);
73                  exit(1);                          exit(1);
74              }                      }
75              if ((degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id) >= len                      if ((degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id) >= len
76                  || (degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id) < 0)                          || (degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id) < 0)
77              {                      {
78                  printf("BOUNDS_CHECK %s %d i=%d e=%d NN=%d min_id=%d dof=%d\n", __FILE__, __LINE__, i, e,                          printf("BOUNDS_CHECK %s %d i=%d e=%d NN=%d min_id=%d dof=%d\n", __FILE__, __LINE__, i, e,
79                     NN, min_id, degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id);                                 NN, min_id, degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id);
80                  exit(1);                          exit(1);
81              }                      }
82  #endif  #endif
83              if (maskDOF[degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id] > 0)                      if (maskDOF[degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id] > 0)
84              {                      {
85                  independent = FALSE;                          independent = false;
86                  break;                          break;
87              }                      }
88              }                  }
89              /* if e is independent a new color is assigned and the nodes are marked as being used */                  /* if e is independent a new color is assigned and the nodes are marked as being used */
90              if (independent)                  if (independent)
91              {                  {
92              for (i = 0; i < NN; i++)                      for (i = 0; i < NN; i++)
93                  maskDOF[degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id] = 1;                          maskDOF[degreeOfFreedom[in->Nodes[INDEX2(i, e, NN)]] - min_id] = 1;
94              in->Color[e] = in->maxColor + 1;                      in->Color[e] = in->maxColor + 1;
95              }                  }
96              else                  else
97              {                  {
98              numUncoloredElements++;                      numUncoloredElements++;
99              }                  }
100          }              }
101    
102          }          }
103          in->maxColor++;          in->maxColor++;
104      }           /* end of while loop */      }                       /* end of while loop */
     }  
105      /* all done : */      /* all done : */
106      delete[] maskDOF;      delete[] maskDOF;
107  }  }
108    
109    } // namespace dudley
110    

Legend:
Removed from v.6008  
changed lines
  Added in v.6009

  ViewVC Help
Powered by ViewVC 1.1.26