Rheolef  7.1
an efficient C++ finite element environment
geo_domain.cc
Go to the documentation of this file.
1 
22 #include "rheolef/geo_domain.h"
23 
24 namespace rheolef {
25 
26 // ------------------------------------------------------------------------
27 // cstors
28 // ------------------------------------------------------------------------
29 template <class T, class M>
31  : base(x),
32  _dom (x._dom),
33  _bgd_ie2dom_ie(x._bgd_ie2dom_ie),
34  _dis_bgd_ie2dis_dom_ie(x._dis_bgd_ie2dis_dom_ie)
35 {
36  trace_macro ("*** PHYSICAL COPY OF GEO_DOMAIN ***");
37 }
38 template <class T, class M>
41 {
42  trace_macro ("*** CLONE GEO_DOMAIN ***");
43  typedef geo_domain_rep<T,M> rep;
44  return new_macro(rep(*this));
45 }
46 template <class T, class M>
48  : base(),
49  _dom (dom),
50  _bgd_ie2dom_ie(),
51  _dis_bgd_ie2dis_dom_ie()
52 {
54  _dom.get_indirect().data(),
55  _dom.get_background_geo().data(),
58 }
59 // ----------------------------------------------------------------------------
60 // geo_element: goes from bgd to domain element
61 // ----------------------------------------------------------------------------
62 template <class T, class M>
65 {
66  typename std::map<size_type,size_type>::const_iterator iter = _bgd_ie2dom_ie.find (bgd_ie);
67  if (iter != _bgd_ie2dom_ie.end()) {
68  return (*iter).second;
69  } else {
70  return std::numeric_limits<size_type>::max();
71  }
72 }
73 template <class T, class M>
76 {
77  size_type map_d = base::map_dimension();
78  size_type first_dis_bgd_ie = get_background_geo().sizes().ownership_by_dimension[map_d].first_index();
79  size_type last_dis_bgd_ie = get_background_geo().sizes().ownership_by_dimension[map_d]. last_index();
80  if (dis_bgd_ie >= first_dis_bgd_ie && dis_bgd_ie < last_dis_bgd_ie) {
81  size_type bgd_ie = dis_bgd_ie - first_dis_bgd_ie;
82  return bgd_ie2dom_ie (bgd_ie);
83  }
84  typename std::map<size_type,size_type>::const_iterator iter = _dis_bgd_ie2dis_dom_ie.find (dis_bgd_ie);
85  if (iter != _dis_bgd_ie2dis_dom_ie.end()) {
86  return (*iter).second;
87  } else {
88  return std::numeric_limits<size_type>::max();
89  }
90 }
91 template <class T, class M>
92 const geo_element&
94 {
95  size_type map_d = bgd_K.dimension();
96  size_type dis_bgd_ie = bgd_K.dis_ie();
97  size_type first_dis_bgd_ie = get_background_geo().sizes().ownership_by_dimension[map_d].first_index();
98  size_type last_dis_bgd_ie = get_background_geo().sizes().ownership_by_dimension[map_d]. last_index();
99  if (dis_bgd_ie >= first_dis_bgd_ie && dis_bgd_ie < last_dis_bgd_ie) {
100  size_type bgd_ie = dis_bgd_ie - first_dis_bgd_ie;
101  size_type dom_ie = bgd_ie2dom_ie (bgd_ie);
102  const geo_element& dom_K = base::get_geo_element (map_d, dom_ie);
103  return dom_K;
104  } else {
105  size_type dis_dom_ie = dis_bgd_ie2dis_dom_ie (dis_bgd_ie);
106  const geo_element& dom_K = base::dis_get_geo_element (map_d, dis_dom_ie);
107  return dom_K;
108  }
109 }
110 template <class T, class M>
111 const geo_element&
113 {
114  size_type map_d = dom_K.dimension();
115  size_type dom_dis_ie = dom_K.dis_ie();
116  size_type first_dom_dis_ie = base::sizes().ownership_by_dimension[map_d].first_index();
117  check_macro (dom_dis_ie >= first_dom_dis_ie, "unexpected dis_index "<<dom_dis_ie<<": out of local range");
118  size_type dom_ie = dom_dis_ie - first_dom_dis_ie;
119  const geo_basic<T,M>& dom = get_background_domain();
120  const geo_element& bgd_K = dom[dom_ie];
121  return bgd_K;
122 }
123 // ----------------------------------------------------------------------------
124 // instanciation in library
125 // ----------------------------------------------------------------------------
126 #define _RHEOLEF_instanciation(T,M) \
127 template class geo_domain_rep<T,M>;
128 
129 _RHEOLEF_instanciation(Float,sequential)
130 #ifdef _RHEOLEF_HAVE_MPI
132 #endif // _RHEOLEF_HAVE_MPI
133 
134 } // namespace rheolef
rheolef::geo_domain_indirect_rep
Definition: geo.h:187
rheolef::geo_domain_rep::_bgd_ie2dom_ie
std::map< size_type, size_type > _bgd_ie2dom_ie
Definition: geo_domain.h:87
rheolef::geo_domain_rep::size_type
base::size_type size_type
Definition: geo_domain.h:57
rheolef::geo_basic
generic mesh with rerefence counting
Definition: domain_indirect.h:64
rheolef::geo_domain_rep
Definition: geo_domain.h:53
check_macro
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
rheolef::_RHEOLEF_instanciation
_RHEOLEF_instanciation(Float, sequential, std::allocator< Float >) _RHEOLEF_instanciation(Float
rheolef::geo_element
see the geo_element page for the full documentation
Definition: geo_element.h:102
rheolef::geo_rep
sequential mesh representation
Definition: domain_indirect.h:63
rheolef::geo_element::dis_ie
size_type dis_ie() const
Definition: geo_element.h:163
rheolef::geo_domain_rep::_dis_bgd_ie2dis_dom_ie
std::map< size_type, size_type > _dis_bgd_ie2dis_dom_ie
Definition: geo_domain.h:87
rheolef::geo_element::dimension
size_type dimension() const
Definition: geo_element.h:167
rheolef::geo_domain_rep::geo_domain_rep
geo_domain_rep(const geo_domain_rep< T, M > &)
Definition: geo_domain.cc:30
rheolef::geo_abstract_rep
abstract interface class
Definition: domain_indirect.h:62
rheolef::geo_domain_rep::bgd2dom_geo_element
const geo_element & bgd2dom_geo_element(const geo_element &bgd_K) const
Definition: geo_domain.cc:93
rheolef::geo_domain_rep::bgd_ie2dom_ie
size_type bgd_ie2dom_ie(size_type bgd_ie) const
Definition: geo_domain.cc:64
rheolef
This file is part of Rheolef.
Definition: compiler_eigen.h:37
Float
see the Float page for the full documentation
rheolef::geo_domain_rep::_dom
geo_domain_indirect_rep< T, M > _dom
Definition: geo_domain.h:86
rheolef::distributed
distributed
Definition: asr.cc:228
rheolef::geo_domain_rep::dom2bgd_geo_element
const geo_element & dom2bgd_geo_element(const geo_element &dom_K) const
Definition: geo_domain.cc:112
trace_macro
#define trace_macro(message)
Definition: dis_macros.h:111
rheolef::geo_domain_rep::clone
geo_abstract_rep< T, M > * clone() const
Definition: geo_domain.cc:40
rheolef::geo_domain_rep::dis_bgd_ie2dis_dom_ie
size_type dis_bgd_ie2dis_dom_ie(size_type dis_bgd_ie) const
Definition: geo_domain.cc:75