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

/export/development/ViennaGrid/release/ViennaGrid-1.0.0/viennagrid/domain.hpp

Go to the documentation of this file.
00001 #ifndef VIENNAGRID_DOMAIN_HPP
00002 #define VIENNAGRID_DOMAIN_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 <iostream>
00023 #include <vector>
00024 #include <deque>
00025 #include <list>
00026 #include <set>
00027 #include <map>
00028 #include <stack>
00029 #include <algorithm>
00030 #include "viennagrid/forwards.h"
00031 #include "viennagrid/traits/container.hpp"
00032 #include "viennagrid/detail/domain_iterators.hpp"
00033 #include "viennagrid/detail/domain_layers.hpp"
00034 
00039 namespace viennagrid
00040 {
00041 
00042 
00043 /***************************** Domain Type ***********************/
00044 
00045   namespace result_of
00046   {
00053     template <typename ConfigType,
00054               long dim,
00055               long cell_level /* see forwards.h for default argument */>
00056     struct element_container< domain_t<ConfigType>, dim, cell_level >
00057     {
00058       typedef typename result_of::ncell<ConfigType, dim>::type            element_type;
00059       
00060       typedef std::map< element_key<ConfigType, element_type>, element_type >      type;
00061     };
00062 
00063     //at point level:
00065     template <typename ConfigType, long cell_level>
00066     struct element_container< domain_t<ConfigType>, 0, cell_level>
00067     {
00068       typedef typename result_of::ncell<ConfigType, 0>::type              element_type;
00069       
00070       //typedef std::vector< element_type >      type;
00071       typedef std::deque< element_type >      type;
00072     };
00073 
00074     //at cell level:
00076     template <typename ConfigType, long cell_level>
00077     struct element_container< domain_t<ConfigType>, cell_level, cell_level>
00078     {
00079       typedef typename result_of::ncell<ConfigType, cell_level>::type     element_type;
00080       
00081       //typedef std::vector< element_type >      type;
00082       typedef std::deque< element_type >      type;
00083     };
00084     
00086     template <typename ConfigType>
00087     struct domain
00088     {
00089       typedef domain_t<ConfigType>     type; 
00090     };
00091     
00092   }
00093   
00094   
00095 
00096   
00102   template <typename Config>
00103   class domain_t : public detail::domain_layers<Config,
00104                                                 Config::cell_tag::dim,
00105                                                 true,
00106                                                 full_handling_tag>  //we start with cells
00107   {
00108       typedef detail::domain_layers<Config, Config::cell_tag::dim, true>           base_type;
00109       typedef domain_t<Config>                                                          self_type;
00110     
00111     public:
00113       typedef Config                                    config_type;
00115       typedef std::size_t                               size_type;
00117       typedef segment_t<Config>                         segment_type;
00118       
00119       typedef detail::domain_segment_container<self_type, segment_type>    segment_container;
00120       
00125       domain_t() : segments_(this) {}
00126 
00128       template <typename OtherDomainType, typename RefinementTag>
00129       domain_t(refinement_proxy<OtherDomainType, RefinementTag> const & proxy) : segments_(this)
00130       {
00131         detail::refine_impl(proxy.get(), *this, proxy.tag());
00132       }
00133 
00135       ~domain_t() { viennadata::erase<viennadata::all, viennadata::all>()(*this); }
00136 
00137       using base_type::push_back;
00138       
00140       template <typename OtherDomainType, typename RefinementTag>
00141       self_type & operator=(refinement_proxy<OtherDomainType, RefinementTag> const & proxy)
00142       {
00143         detail::refine_impl(proxy.get(), *this, proxy.tag());
00144         return *this;
00145       }
00146       
00148       segment_container & segments() { return segments_; }
00150       segment_container const & segments() const { return segments_; }
00151     
00152     private:
00153       segment_container segments_;
00154   };
00155 
00157   template <typename ConfigType>
00158   typename domain_t<ConfigType>::segment_container &
00159   segments(domain_t<ConfigType> & domain)
00160   {
00161     return domain.segments(); 
00162   }
00163   
00165   template <typename ConfigType>
00166   typename domain_t<ConfigType>::segment_container const &
00167   segments(domain_t<ConfigType> const & domain)
00168   {
00169     return domain.segments(); 
00170   }
00171   
00172 }
00173 #endif

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