• Main Page
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

/export/development/ViennaGrid/release/ViennaGrid-1.0.0/viennagrid/detail/element_key.hpp

Go to the documentation of this file.
00001 #ifndef VIENNAGRID_ELEMENT_KEY_HPP
00002 #define VIENNAGRID_ELEMENT_KEY_HPP
00003 
00004 /* =======================================================================
00005    Copyright (c) 2011, Institute for Microelectronics,
00006                        Institute for Analysis and Scientific Computing,
00007                        TU Wien.
00008 
00009                             -----------------
00010                      ViennaGrid - The Vienna Grid Library
00011                             -----------------
00012 
00013    Authors:      Karl Rupp                           rupp@iue.tuwien.ac.at
00014                  Josef Weinbub                    weinbub@iue.tuwien.ac.at
00015                
00016    (A list of additional contributors can be found in the PDF manual)
00017 
00018    License:      MIT (X11), see file LICENSE in the base directory
00019 ======================================================================= */
00020 
00021 
00022 #include <map>
00023 #include <iostream>
00024 #include <algorithm>
00025 
00026 #include "viennagrid/forwards.h"
00027 #include "viennagrid/element.hpp"
00028 #include "viennagrid/topology/point.hpp"
00029 
00034 namespace viennagrid
00035 {
00036   
00038 
00040   template <typename ConfigType, 
00041             typename ElementType,
00042             typename IDHandler = typename result_of::element_id_handler<ConfigType, point_tag>::type>
00043   struct ElementKeyStorageType
00044   {
00045     typedef ElementType *           result_type;
00046   };
00047 
00048   template <typename ConfigType, typename ElementType>
00049   struct ElementKeyStorageType<ConfigType, ElementType, integral_id>
00050   {
00051     typedef long          result_type;
00052   };
00053 
00054   
00055   
00057   template <typename ConfigType, typename ElementType>
00058   class element_key
00059   {
00060       typedef typename ElementType::tag            ElementTag;
00061       typedef typename ElementKeyStorageType<ConfigType, ElementType>::result_type  StorageType;
00062     public:
00063       element_key( ElementType & el2) : vertexIDs(topology::bndcells<ElementTag, 0>::num)
00064       {
00065         typedef typename result_of::ncell_range<ElementType, 0>::type       VertexRange;
00066         typedef typename result_of::iterator<ElementType, 0>::type          VertexIterator;
00067         long i = 0;
00068         VertexRange vertices_el2 = ncells<0>(el2);
00069         for (VertexIterator vit = vertices_el2.begin();
00070              vit != vertices_el2.end();
00071              ++vit, ++i)
00072           vertexIDs[i] = static_cast<StorageType>(vit->id());
00073         //sort it:
00074         std::sort(vertexIDs.begin(), vertexIDs.end());
00075       }
00076 
00077       element_key( const element_key & ek2) : vertexIDs(ek2.vertexIDs.size())
00078       {
00079         //std::cout << "Copy constructor ElementKey " << this << std::endl;
00080         for (typename std::vector<StorageType>::size_type i=0; i<ek2.vertexIDs.size(); ++i)
00081           vertexIDs[i] = ek2.vertexIDs[i];
00082       }
00083 
00084       bool operator < (element_key const & epc2) const
00085       {
00086         for (long i=0; i<topology::bndcells<ElementTag, 0>::num; ++i)
00087         {
00088           if ( vertexIDs[i] > epc2.vertexIDs[i] )
00089             return false;
00090           else if ( vertexIDs[i] < epc2.vertexIDs[i] )
00091             return true;
00092         }
00093         return false;
00094       }
00095 
00096       void print() const
00097       { 
00098         for (typename std::vector<StorageType>::const_iterator vit = vertexIDs.begin();
00099               vit != vertexIDs.end();
00100               ++vit)
00101           std::cout << *vit << " ";
00102         std::cout << std::endl;
00103       }
00104 
00105     private:
00106       std::vector< StorageType > vertexIDs;
00107   };
00108 
00109 
00110   
00111   
00112   
00113 }
00114 #endif

Generated on Wed Sep 14 2011 19:21:30 for ViennaGrid by  doxygen 1.7.1