Rheolef  7.2
an efficient C++ finite element environment
 
Loading...
Searching...
No Matches
geo_size.cc
Go to the documentation of this file.
1
21// Manage distributed indexes for the geo class
22//
23// Author: Pierre Saramito
24//
25#include "rheolef/geo_size.h"
26
27namespace rheolef {
28
29// =========================================================================
30// utility: convect geo_element numbering by dimension and by variant
31// =========================================================================
34 size_type map_dim,
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:
56 size_type map_dim,
57 size_type variant,
58 size_type dis_ige) const
59{
60trace_macro("dis_ige2dis_igev (map_dim="<<map_dim<<", hat_K="<<reference_element(variant).name()<<", dis_ige="<<dis_ige<<")...");
61 size_type iproc = ownership_by_dimension [map_dim].find_owner (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;
77trace_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}
82 size_type map_dim,
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}
91 size_type map_dim,
92 size_type dis_ige) const
93{
94 size_type variant;
95 return dis_ige2dis_igev_by_dimension (map_dim, dis_ige, variant);
96}
99 size_type variant,
100 size_type dis_ige) const
101{
102 size_type map_dim = reference_element::dimension (variant);
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];
113 size_type iproc = node_ownership.find_owner(dis_inod);
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:69
size_type last_index(size_type iproc) const
size_type find_owner(size_type dis_i) const
find iproc associated to a global index dis_i: CPU=log(nproc)
size_type size(size_type iproc) const
size_type first_index(size_type iproc) const
global index range and local size owned by ip-th process
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
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