Rheolef  7.2
an efficient C++ finite element environment
 
Loading...
Searching...
No Matches
geo_domain.cc
Go to the documentation of this file.
1
21
22#include "rheolef/geo_domain.h"
23
24namespace rheolef {
25
26// ------------------------------------------------------------------------
27// cstors
28// ------------------------------------------------------------------------
29template <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}
38template <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}
46template <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// ----------------------------------------------------------------------------
62template <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}
73template <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}
91template <class T, class M>
92const 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}
110template <class T, class M>
111const 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) \
127template class geo_domain_rep<T,M>;
128
130#ifdef _RHEOLEF_HAVE_MPI
131_RHEOLEF_instanciation(Float,distributed)
132#endif // _RHEOLEF_HAVE_MPI
133
134} // namespace rheolef
#define _RHEOLEF_instanciation(T, M, A)
Definition asr.cc:223
see the Float page for the full documentation
abstract interface class
Definition geo.h:401
generic mesh with rerefence counting
Definition geo.h:1089
const geo_element & dom2bgd_geo_element(const geo_element &dom_K) const
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
size_type dimension() const
size_type dis_ie() const
sequential mesh representation
Definition geo.h:778
#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.