Rheolef  7.1
an efficient C++ finite element environment
geo_size.cc
Go to the documentation of this file.
1 // Manage distributed indexes for the geo class
22 //
23 // Author: Pierre Saramito
24 //
25 #include "rheolef/geo_size.h"
26 
27 namespace rheolef {
28 
29 // =========================================================================
30 // utility: convect geo_element numbering by dimension and by variant
31 // =========================================================================
35  size_type dis_ige) const
36 {
37  const distributor& ownership = ownership_by_dimension [map_dim];
38  size_type iproc = ownership.find_owner (dis_ige);
39  size_type first_dis_ige = ownership.first_index(iproc);
40  size_type ige = dis_ige - first_dis_ige;
41  size_type first_v = 0;
44  variant++) {
45  size_type size_v = ownership_by_variant [variant].size(iproc);
46  size_type last_v = first_v + size_v;
47  if (ige < last_v) return variant;
48  first_v = last_v;
49  }
50  error_macro ("dis_ie2variant: invalid dis_ige="<<dis_ige<<", ige="<<ige);
51  return reference_element::max_variant; // not reached
52 }
53 // compute dis_igev from dis_ige & variant:
58  size_type dis_ige) const
59 {
60 trace_macro("dis_ige2dis_igev (map_dim="<<map_dim<<", hat_K="<<reference_element(variant).name()<<", dis_ige="<<dis_ige<<")...");
62  size_type first_dis_v = 0;
64  prev_variant < variant;
65  prev_variant++) {
66  size_type shift = ownership_by_variant [prev_variant].last_index(iproc);
67  first_dis_v += shift;
68  }
69  for (size_type next_variant = variant+1;
71  next_variant++) {
72  size_type shift = ownership_by_variant [next_variant].first_index(iproc);
73  first_dis_v += shift;
74  }
75  assert_macro (dis_ige >= first_dis_v, "invalid index");
76  size_type dis_igev = dis_ige - first_dis_v;
77 trace_macro("dis_ige2dis_igev (map_dim="<<map_dim<<", hat_K="<<reference_element(variant).name()<<", dis_ige="<<dis_ige<<"): dis_igev="<<dis_igev<<"...");
78  return dis_igev;
79 }
83  size_type dis_ige,
84  size_type& variant) const
85 {
86  variant = dis_ige2variant (map_dim, dis_ige);
87  return _dis_ige2dis_igev (map_dim, variant, dis_ige);
88 }
92  size_type dis_ige) const
93 {
96 }
100  size_type dis_ige) const
101 {
103  return _dis_ige2dis_igev (map_dim, variant, dis_ige);
104 }
105 // =========================================================================
106 // utility: vertex ownership follows node ownership, but dis_numbering differ
107 // for high order > 1 meshes. This function converts numbering.
108 // =========================================================================
111 {
112  const distributor& vertex_ownership = ownership_by_dimension[0];
114  size_type first_dis_inod = node_ownership.first_index(iproc);
115  size_type first_dis_iv = vertex_ownership.first_index(iproc);
116  size_type inod = dis_inod - first_dis_inod;
117  size_type iv = inod;
118  size_type dis_iv = first_dis_iv + iv;
119  return dis_iv;
120 }
123 {
124  const distributor& vertex_ownership = ownership_by_dimension[0];
125  size_type iproc = vertex_ownership.find_owner(dis_iv);
126  size_type first_dis_iv = vertex_ownership.first_index(iproc);
127  size_type first_dis_inod = node_ownership.first_index(iproc);
128  size_type iv = dis_iv - first_dis_iv;
129  size_type inod = iv;
130  size_type dis_inod = first_dis_inod + inod;
131  return dis_inod;
132 }
133 
134 } // namespace
see the distributor page for the full documentation
Definition: distributor.h:62
size_type last_index(size_type iproc) const
Definition: distributor.h:157
size_type find_owner(size_type dis_i) const
find iproc associated to a global index dis_i: CPU=log(nproc)
Definition: distributor.cc:106
size_type size(size_type iproc) const
Definition: distributor.h:163
size_type first_index(size_type iproc) const
global index range and local size owned by ip-th process
Definition: distributor.h:151
see the reference_element page for the full documentation
static const variant_type max_variant
static variant_type last_variant_by_dimension(size_type dim)
static variant_type first_variant_by_dimension(size_type dim)
#define trace_macro(message)
Definition: dis_macros.h:111
#define assert_macro(ok_condition, message)
Definition: dis_macros.h:113
#define error_macro(message)
Definition: dis_macros.h:49
void dis_inod(const basis_basic< T > &b, const geo_size &gs, const geo_element &K, typename std::vector< size_type >::iterator dis_inod_tab)
This file is part of Rheolef.
size_type dis_ige2dis_igev_by_variant(size_type variant, size_type dis_ige) const
Definition: geo_size.cc:98
distributor ownership_by_variant[reference_element::max_variant]
Definition: geo_size.h:64
size_type dis_iv2dis_inod(size_type dis_iv) const
Definition: geo_size.cc:122
size_type dis_ige2variant(size_type map_dim, size_type dis_ige) const
Definition: geo_size.cc:33
size_type dis_ige2dis_igev_by_dimension(size_type map_dim, size_type dis_ige) const
Definition: geo_size.cc:90
distributor node_ownership
Definition: geo_size.h:65
size_type dis_inod2dis_iv(size_type dis_inod) const
Definition: geo_size.cc:110
distributor::size_type size_type
Definition: geo_size.h:33
distributor ownership_by_dimension[4]
Definition: geo_size.h:63
size_type _dis_ige2dis_igev(size_type map_dim, size_type variant, size_type dis_ige) const
Definition: geo_size.cc:55