4 #include "rheolef/geo_element.h"
5 #include "rheolef/array.h"
6 #include "rheolef/hack_array.h"
7 #include "rheolef/geo_size.h"
8 #include "rheolef/point.h"
9 #include "rheolef/domain_indirect.h"
10 #include "rheolef/geo_header.h"
11 #include "rheolef/numbering.h"
12 #include "rheolef/space_constant.h"
13 #include "rheolef/geo_locate.h"
14 #include "rheolef/geo_trace_ray_boundary.h"
33 template <
class T,
class M>
class geo_basic;
34 template <
class T,
class M>
class geo_domain_indirect_rep;
36 template <
class T>
class geo_abstract_base_rep;
38 template<
class T,
class Ref,
class Ptr,
class IteratorByVariant>
119 virtual std::string
name()
const = 0;
171 virtual bool check(
bool verbose)
const = 0;
177 template<
class T,
class Ref,
class Ptr,
class IteratorByVariant>
182 IteratorByVariant iter,
184 : _variant (variant),
193 _last_by_var [variant] = omega. end_by_variant (variant);
197 template<
class T,
class Ref,
class Ptr,
class IteratorByVariant>
199 : _variant (y._variant),
200 _variant_max (y._variant_max),
201 _iter_by_var (y._iter_by_var),
208 template <
class T,
class M>
237 virtual const array<node_type,sequential>& get_nodes()
const = 0;
238 virtual void set_nodes (
const array<node_type,sequential>&) = 0;
240 virtual void locate (
242 array<size_type, sequential>& dis_ie,
243 bool do_check =
false)
const = 0;
244 virtual void trace_ray_boundary (
247 array<size_type, sequential>& dis_ie,
249 bool do_check =
false)
const = 0;
250 virtual void trace_move (
253 array<size_type, sequential>& dis_ie,
257 #ifdef _RHEOLEF_HAVE_MPI
267 typedef std::map <size_type, node_type, std::less<size_type>,
277 virtual const_reference dis_get_geo_element (
size_type dim,
size_type dis_ige)
const = 0;
286 virtual const array<node_type,distributed>& get_nodes()
const = 0;
287 virtual void set_nodes (
const array<node_type,distributed>&) = 0;
289 virtual void locate (
291 array<size_type, distributed>& dis_ie,
292 bool do_check =
true)
const = 0;
293 virtual void trace_ray_boundary (
296 array<size_type, distributed>& dis_ie,
298 bool do_check =
false)
const = 0;
299 virtual void trace_move (
302 array<size_type, distributed>& dis_ie,
306 virtual void set_ios_permutation (
307 boost::array<size_type,reference_element::max_variant>& loc_ndof_by_variant,
308 array<size_type,distributed>& idof2ios_dis_idof)
const = 0;
310 #endif // _RHEOLEF_HAVE_MPI
314 template <
class T,
class M>
345 std::string
name()
const;
449 mutable std::vector<domain_indirect_basic<M> >
_domains;
461 template <
class T,
class M>
472 _have_connectivity(false),
473 _have_neighbour(false),
481 _tracer_ray_boundary()
484 template <
class T,
class M>
489 _version (o._version),
490 _serial_number (o._serial_number),
491 _geo_element (o._geo_element),
492 _map_dimension (o._map_dimension),
494 _domains (o._domains),
495 _have_connectivity (o._have_connectivity),
496 _have_neighbour (o._have_neighbour),
498 _dimension (o._dimension),
499 _sys_coord (o._sys_coord),
502 _numbering (o._numbering),
503 _locator (o._locator),
504 _tracer_ray_boundary(o._tracer_ray_boundary)
508 template <
class T,
class M>
513 if (_have_neighbour)
return;
514 _have_neighbour =
true;
517 template <
class T,
class M>
521 return _geo_element [variant].begin();
523 template <
class T,
class M>
527 return _geo_element [variant].begin();
529 template <
class T,
class M>
533 return _geo_element [variant].end();
535 template <
class T,
class M>
539 return _geo_element [variant].end();
541 template <
class T,
class M>
551 template <
class T,
class M>
608 void build_from_domain (
611 std::map<size_type,size_type>& bgd_ie2dom_ie);
616 array<size_type, sequential>& dis_ie,
617 bool do_check =
false)
const;
618 void trace_ray_boundary (
621 array<size_type, sequential>& dis_ie,
623 bool do_check =
false)
const;
627 array<size_type, sequential>& dis_ie,
654 idiststream&
get (idiststream&);
655 odiststream& put_geo (odiststream&)
const;
658 void dump (std::string name)
const;
659 void load (std::string name,
const communicator& = communicator());
660 bool check(
bool verbose)
const;
664 void build_from_data (
666 const array<node_type, sequential>& node,
672 idiststream& get_standard (idiststream&,
const geo_header&);
673 idiststream& get_upgrade (idiststream&,
const geo_header&);
674 void build_connectivity (
677 void build_connectivity_sides (
680 void set_element_side_index (
size_type side_dim);
681 void domain_set_side_part1 (
685 array<size_type,sequential>& bgd_isid2dom_dis_isid,
686 array<size_type,sequential>& dom_isid2bgd_isid,
687 array<size_type,sequential>& dom_isid2dom_ios_dis_isid,
689 void domain_set_side_part2 (
692 array<size_type,sequential>& bgd_iv2dom_dis_iv,
694 array<size_type,sequential>& bgd_isid2dom_dis_isid,
695 array<size_type,sequential>& dom_isid2bgd_isid,
696 array<size_type,sequential>& dom_isid2dom_ios_dis_isid,
721 #ifdef _RHEOLEF_HAVE_MPI
744 void build_from_domain (
747 std::map<size_type,size_type>& bgd_ie2dom_ie);
764 array<size_type, distributed>& dis_ie,
765 bool do_check =
false)
const;
766 void trace_ray_boundary (
769 array<size_type, distributed>& dis_ie,
771 bool do_check =
false)
const;
775 array<size_type, distributed>& dis_ie,
798 reference operator[] (
size_type ie) {
return get_geo_element (map_dimension(), ie); }
806 idiststream&
get (idiststream&);
807 odiststream&
put (odiststream&)
const;
808 void dump (std::string name)
const;
809 void load (std::string name,
const communicator& comm);
810 bool check(
bool verbose)
const;
813 void set_ios_permutation (
814 boost::array<size_type,reference_element::max_variant>& loc_ndof_by_variant,
815 array<size_type,distributed>& idof2ios_dis_idof)
const;
818 void build_external_entities ();
819 void set_element_side_index (
size_type side_dim);
820 void domain_set_side_part1 (
821 const domain_indirect_rep<distributed>& indirect,
824 array<size_type>& bgd_isid2dom_dis_isid,
825 array<size_type>& dom_isid2bgd_isid,
826 array<size_type>& dom_isid2dom_ios_dis_isid,
828 void domain_set_side_part2 (
829 const domain_indirect_rep<distributed>& indirect,
831 array<size_type>& bgd_iv2dom_dis_iv,
833 array<size_type>& bgd_isid2dom_dis_isid,
834 array<size_type>& dom_isid2bgd_isid,
835 array<size_type>& dom_isid2dom_ios_dis_isid,
838 void node_renumbering (
const distributor& ios_node_ownership);
842 array<size_type> _ios_ige2dis_ige[4];
851 _inod2ios_dis_inod(),
852 _ios_inod2dis_inod(),
855 _igev2ios_dis_igev(),
863 _inod2ios_dis_inod(o._inod2ios_dis_inod),
864 _ios_inod2dis_inod(o._ios_inod2dis_inod),
865 _ios_ige2dis_ige (o._ios_ige2dis_ige),
867 _igev2ios_dis_igev(o._igev2ios_dis_igev),
868 _ios_igev2dis_igev(o._ios_igev2dis_igev)
879 #endif // _RHEOLEF_HAVE_MPI
881 template <
class T,
class M = rheo_default_memory_model>
919 geo_basic (std::string name,
const communicator& comm = communicator());
920 void load (std::string name,
const communicator& comm = communicator());
931 std::string
name()
const {
return base::data().name(); }
932 std::string
familyname()
const {
return base::data().familyname(); }
948 {
return get_geo_element (dim, dis_ige); }
950 return base::data().neighbour (ie, loc_isid); }
956 return base::data().dis_inod(K,dis_inod); }
958 const array<node_type,sequential>&
get_nodes()
const {
return base::data().get_nodes(); }
964 return base::data().get_domain_indirect (i); }
966 return base::data().get_domain_indirect (name); }
968 base::data().insert_domain_indirect (dom); }
977 {
return base::data().seq_locate (x, dis_ie_guest); }
981 {
return base::data().dis_locate (x, dis_ie_guest); }
984 array<size_type, sequential>& dis_ie)
const
985 {
return base::data().locate (x, dis_ie); }
990 {
return base::data().seq_trace_move (x,v,y); }
995 {
return base::data().dis_trace_move (x,v,y); }
996 void trace_ray_boundary (
999 array<size_type, sequential>& dis_ie,
1001 {
return base::data().trace_ray_boundary (x,v,dis_ie,y); }
1005 array<size_type, sequential>& dis_ie,
1007 {
return base::data().trace_move (x,v,dis_ie,y); }
1010 void set_name (std::string name);
1016 void set_nodes (
const array<node_type,sequential>& x);
1017 void build_from_data (
1019 const array<node_type, sequential>& node,
1025 const communicator&
comm()
const {
return geo_element_ownership (0).comm(); }
1040 {
return base::data().begin_by_variant (variant); }
1057 idiststream&
get (idiststream& ips);
1059 void save (std::string filename =
"")
const;
1060 void dump (std::string name)
const { base::data().dump (name); }
1061 bool check (
bool verbose =
true)
const {
return base::data().check(verbose); }
1079 base::operator= (ptr);
1081 base::operator= (geo_load<T,sequential>(name));
1092 base::operator= (ptr);
1094 base::operator= (geo_load<T,sequential>(name));
1104 base::operator= (ptr);
1108 #ifdef _RHEOLEF_HAVE_MPI
1133 geo_basic (std::string name,
const communicator& comm = communicator());
1134 void load (std::string name,
const communicator& comm = communicator());
1145 std::string
name()
const {
return base::data().name(); }
1146 std::string
familyname()
const {
return base::data().familyname(); }
1157 {
return base::data().geo_element_ownership (dim); }
1161 {
return base::data().get_geo_element (dim, ige); }
1163 {
return base::data().dis_get_geo_element (dim, dis_ige); }
1165 return base::data().neighbour (ie, loc_isid); }
1168 return base::data().geo_element_ios_ownership (dim); }
1170 return base::data().ige2ios_dis_ige (dim,ige); }
1172 return base::data().dis_ige2ios_dis_ige (dim,dis_ige); }
1174 return base::data().ios_ige2dis_ige (dim, ios_ige); }
1179 return base::data().dis_inod(K,dis_inod); }
1181 const array<node_type,distributed>&
get_nodes()
const {
return base::data().get_nodes(); }
1182 void set_nodes (
const array<node_type,distributed>& x);
1189 void set_name (std::string name);
1194 return base::data().get_domain_indirect (i); }
1196 return base::data().get_domain_indirect (name); }
1198 base::data().insert_domain_indirect (dom); }
1207 {
return base::data().seq_locate (x, dis_ie_guest); }
1211 {
return base::data().dis_locate (x, dis_ie_guest); }
1213 {
return base::data().locate (x, dis_ie); }
1218 {
return base::data().seq_trace_move (x,v,y); }
1223 {
return base::data().dis_trace_move (x,v,y); }
1224 void trace_ray_boundary (
1227 array<size_type, distributed>& dis_ie,
1229 {
return base::data().trace_ray_boundary (x,v,dis_ie,y); }
1233 array<size_type, distributed>& dis_ie,
1235 {
return base::data().trace_move (x,v,dis_ie,y); }
1240 const communicator&
comm()
const {
return geo_element_ownership (0).comm(); }
1245 {
return get_geo_element (map_dimension(), ie); }
1253 {
return base::data().begin_by_variant (variant); }
1266 idiststream&
get (idiststream& ips);
1267 void save (std::string filename =
"")
const;
1268 bool check (
bool verbose =
true)
const {
return base::data().check(verbose); }
1271 void set_ios_permutation (
1272 boost::array<size_type,reference_element::max_variant>& loc_ndof_by_variant,
1273 array<size_type,distributed>& idof2ios_dis_idof)
const
1274 { base::data().set_ios_permutation (loc_ndof_by_variant, idof2ios_dis_idof); }
1277 #endif // _RHEOLEF_HAVE_MPI
1283 #ifdef _RHEOLEF_HAVE_MPI
1298 ptr->
load (name, comm);
1299 base::operator= (ptr);
1301 base::operator= (geo_load<T,distributed>(name));
1311 ptr->
load (name, comm);
1312 base::operator= (ptr);
1314 base::operator= (geo_load<T,distributed>(name));
1323 base::operator= (ptr);
1326 #endif // _RHEOLEF_HAVE_MPI
1330 #define _RHEOLEF_save(M) \
1331 template <class T> \
1333 geo_basic<T,M>::save (std::string filename) const \
1335 if (filename == "") filename = name(); \
1336 odiststream out (filename, "geo"); \
1339 #define _RHEOLEF_set_nodes(M) \
1340 template <class T> \
1342 geo_basic<T,M>::set_nodes (const array<node_type,M>& x) \
1344 geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1345 check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1346 ptr->set_nodes(x); \
1348 #define _RHEOLEF_reset_order(M) \
1349 template <class T> \
1351 geo_basic<T,M>::reset_order (size_type order) \
1353 geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1354 check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1355 ptr->reset_order(order); \
1357 #define _RHEOLEF_set_coordinate_system(M) \
1358 template <class T> \
1360 geo_basic<T,M>::set_coordinate_system (coordinate_type sys_coord) \
1362 geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1363 check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1364 ptr->set_coordinate_system(sys_coord); \
1366 #define _RHEOLEF_set_dimension(M) \
1367 template <class T> \
1369 geo_basic<T,M>::set_dimension (size_type dim) \
1371 geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1372 check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1373 ptr->set_dimension(dim); \
1375 #define _RHEOLEF_set_serial_number(M) \
1376 template <class T> \
1378 geo_basic<T,M>::set_serial_number (size_type i) \
1380 geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1381 check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1382 ptr->set_serial_number(i); \
1384 #define _RHEOLEF_set_name(M) \
1385 template <class T> \
1387 geo_basic<T,M>::set_name (std::string name) \
1389 geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1390 check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1391 ptr->set_name(name); \
1393 #define _RHEOLEF_build_from_data(M) \
1394 template <class T> \
1396 geo_basic<T,M>::build_from_data ( \
1397 const geo_header& hdr, \
1398 const array<node_type, sequential>& node, \
1399 boost::array<array<geo_element_auto<heap_allocator<size_type> >,sequential, heap_allocator<size_type> >, reference_element::max_variant>& tmp_geo_element, \
1402 geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1403 check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1404 ptr->build_from_data (hdr, node, tmp_geo_element, do_upgrade); \
1415 #ifdef _RHEOLEF_HAVE_MPI
1423 #endif // _RHEOLEF_HAVE_MPI
1424 #undef _RHEOLEF_set_nodes
1425 #undef _RHEOLEF_reset_order
1426 #undef _RHEOLEF_set_coordinate_system
1427 #undef _RHEOLEF_set_dimension
1428 #undef _RHEOLEF_set_name
1429 #undef _RHEOLEF_build_from_data
1431 template <
class T,
class M>
1436 return omega.get (ips);
1438 template <
class T,
class M>
1441 operator<< (odiststream& ops, const geo_basic<T,M>& omega)
1443 return omega.put (ops);
1447 #endif // _RHEOLEF_GEO_H