Rheolef  7.2
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
see the Float page for the full documentation
abstract interface class
Definition: geo.h:401
const geo_element & dom2bgd_geo_element(const geo_element &dom_K) const
Definition: geo_domain.cc:112
size_type bgd_ie2dom_ie(size_type bgd_ie) const
Definition: geo_domain.cc:64
geo_domain_indirect_rep< T, M > _dom
Definition: geo_domain.h:86
std::map< size_type, size_type > _bgd_ie2dom_ie
Definition: geo_domain.h:87
base::size_type size_type
Definition: geo_domain.h:57
geo_domain_rep(const geo_domain_rep< T, M > &)
Definition: geo_domain.cc:30
geo_abstract_rep< T, M > * clone() const
Definition: geo_domain.cc:40
size_type dis_bgd_ie2dis_dom_ie(size_type dis_bgd_ie) const
Definition: geo_domain.cc:75
std::map< size_type, size_type > _dis_bgd_ie2dis_dom_ie
Definition: geo_domain.h:88
const geo_element & bgd2dom_geo_element(const geo_element &bgd_K) const
Definition: geo_domain.cc:93
see the geo_element page for the full documentation
Definition: geo_element.h:102
size_type dimension() const
Definition: geo_element.h:167
size_type dis_ie() const
Definition: geo_element.h:163
sequential mesh representation
Definition: geo.h:778
distributed
Definition: asr.cc:228
#define trace_macro(message)
Definition: dis_macros.h:111
check_macro(expr1.have_homogeneous_space(Xh1), "dual(expr1,expr2); expr1 should have homogeneous space. HINT: use dual(interpolate(Xh, expr1),expr2)")
This file is part of Rheolef.
_RHEOLEF_instanciation(Float, sequential, std::allocator< Float >) _RHEOLEF_instanciation(Float