00001 
00002 
00003 
00004 
00005 #ifndef SUNDANCE_VERTEX_SORT_H
00006 #define SUNDANCE_VERTEX_SORT_H
00007 
00008 
00009 #include "SundanceDefs.hpp"
00010 #include "Teuchos_Array.hpp"
00011 
00012 
00013 namespace Sundance
00014 {
00015 using Teuchos::Array;
00016 
00017 
00018 template <class T> inline
00019 void insertionSort(Teuchos::Array<T>& A)
00020 {
00021   int N = A.size();
00022   for (int i=1; i<N; i++)
00023   {
00024     T val = A[i];
00025     int j = i-1;
00026     bool done = false;
00027     while ( !done )
00028     {
00029       if (A[j] > val)
00030       {
00031         A[j+1]=A[j];
00032         j=j-1;
00033         if ( j<0 ) done = true;
00034       }
00035       else done = true;
00036       A[j+1]=val;
00037     }
00038   }
00039 }
00040  
00041 
00042 void vertexSort(Array<int>& verts, int* key);
00043 
00044 
00045 void getKeyedPerm(int key, Array<int>& digits);
00046 
00047 
00048 int iPow(int base, int n);
00049 
00050 
00051 int exFacetIndexToUFCFacetIndex(int meshDim, int permKey,
00052   int exFacetID);
00053 
00054 
00055 int ufcFacetIndexToExFacetIndex(int meshDim, int ufcFacetID);
00056 
00057 
00058 int exVertPosToUFCVertPos(int meshDim, int permKey, int exVertPos);
00059 
00060 
00061 int mapExSideToMissingVertex(int dim, int exFaceID);
00062 
00063 
00064 Array<int> exSideVertPos(int dim, int f);
00065 
00066 Array<int> ufcSideVertPos(int dim, int f);
00067 
00068 
00069 Array<int> ufcSide(int f, const Array<int>& verts);
00070 
00071 
00072 Array<int> exSide(int f, const Array<int>& verts);
00073 
00074 
00075 }
00076 
00077 
00078 #endif