1326
1400
#endif // _RHEOLEF_HAVE_MPI
1328
1402
// ==============================================================================
1329
// hack : modifier members of smart_pointers on pure virtual base class
1403
// geo fat interface: members are specific to geo_rep
1404
// => check that pointer to geo_abstract_rep points to a geo_rep
1330
1405
// ==============================================================================
1331
// TODO: do it better with a smart_pointer_clone<T>
1406
#define _RHEOLEF_save(M) \
1407
template <class T> \
1409
geo_basic<T,M>::save (std::string filename) const \
1411
if (filename == "") filename = name(); \
1412
odiststream out (filename, "geo"); \
1332
1415
#define _RHEOLEF_set_nodes(M) \
1333
1416
template <class T> \
1335
1418
geo_basic<T,M>::set_nodes (const array<node_type,M>& x) \
1337
const geo_basic<T,M>& const_self = *this; \
1338
check_macro (const_self.data().variant() == geo_abstract_base_rep<T>::geo, \
1339
"cannot set_nodes on geo_domains"); \
1340
const geo_rep<T,M>& geo_data = dynamic_cast<const geo_rep<T,M>&>(const_self.data()); \
1341
typedef geo_rep<T,M> georep; \
1342
geo_rep<T,M>* ptr = new_macro(georep(geo_data)); \
1343
ptr->set_nodes(x); \
1344
base::operator= (ptr); \
1420
geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1421
check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1422
ptr->set_nodes(x); \
1346
1424
#define _RHEOLEF_reset_order(M) \
1347
1425
template <class T> \
1349
1427
geo_basic<T,M>::reset_order (size_type order) \
1351
const geo_basic<T,M>& const_self = *this; \
1352
check_macro (const_self.data().variant() == geo_abstract_base_rep<T>::geo, \
1353
"cannot set_nodes on geo_domains"); \
1354
const geo_rep<T,M>& geo_data = dynamic_cast<const geo_rep<T,M>&>(const_self.data()); \
1355
typedef geo_rep<T,M> georep; \
1356
geo_rep<T,M>* ptr = new_macro(georep(geo_data)); \
1357
ptr->reset_order(order); \
1358
base::operator= (ptr); \
1429
geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1430
check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1431
ptr->reset_order(order); \
1360
1433
#define _RHEOLEF_set_coordinate_system(M) \
1361
1434
template <class T> \
1363
1436
geo_basic<T,M>::set_coordinate_system (coordinate_type sys_coord) \
1365
const geo_basic<T,M>& const_self = *this; \
1366
check_macro (const_self.data().variant() == geo_abstract_base_rep<T>::geo, \
1367
"cannot set_coordinate_system on geo_domains"); \
1368
const geo_rep<T,M>& geo_data = dynamic_cast<const geo_rep<T,M>&>(const_self.data()); \
1369
typedef geo_rep<T,M> georep; \
1370
geo_rep<T,M>* ptr = new_macro(georep(geo_data)); \
1371
ptr->set_coordinate_system(sys_coord); \
1372
base::operator= (ptr); \
1438
geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1439
check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1440
ptr->set_coordinate_system(sys_coord); \
1374
1442
#define _RHEOLEF_set_dimension(M) \
1375
1443
template <class T> \
1377
1445
geo_basic<T,M>::set_dimension (size_type dim) \
1379
const geo_basic<T,M>& const_self = *this; \
1380
check_macro (const_self.data().variant() == geo_abstract_base_rep<T>::geo, \
1381
"cannot set_dimension on geo_domains"); \
1382
const geo_rep<T,M>& geo_data = dynamic_cast<const geo_rep<T,M>&>(const_self.data()); \
1383
typedef geo_rep<T,M> georep; \
1384
geo_rep<T,M>* ptr = new_macro(georep(geo_data)); \
1385
ptr->set_dimension(dim); \
1386
base::operator= (ptr); \
1447
geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1448
check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1449
ptr->set_dimension(dim); \
1388
1451
#define _RHEOLEF_set_serial_number(M) \
1389
1452
template <class T> \
1391
1454
geo_basic<T,M>::set_serial_number (size_type i) \
1393
const geo_basic<T,M>& const_self = *this; \
1394
check_macro (const_self.data().variant() == geo_abstract_base_rep<T>::geo, \
1395
"cannot set_serial_number on geo_domains"); \
1396
const geo_rep<T,M>& geo_data = dynamic_cast<const geo_rep<T,M>&>(const_self.data()); \
1397
typedef geo_rep<T,M> georep; \
1398
geo_rep<T,M>* ptr = new_macro(georep(geo_data)); \
1399
ptr->set_serial_number(i); \
1400
base::operator= (ptr); \
1456
geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1457
check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1458
ptr->set_serial_number(i); \
1402
1460
#define _RHEOLEF_set_name(M) \
1403
1461
template <class T> \
1405
1463
geo_basic<T,M>::set_name (std::string name) \
1407
const geo_basic<T,M>& const_self = *this; \
1408
check_macro (const_self.data().variant() == geo_abstract_base_rep<T>::geo, \
1409
"cannot set_name on geo_domains"); \
1410
const geo_rep<T,M>& geo_data = dynamic_cast<const geo_rep<T,M>&>(const_self.data()); \
1411
typedef geo_rep<T,M> georep; \
1412
geo_rep<T,M>* ptr = new_macro(georep(geo_data)); \
1413
ptr->set_name(name); \
1414
base::operator= (ptr); \
1465
geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1466
check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1467
ptr->set_name(name); \
1416
1469
#define _RHEOLEF_build_from_data(M) \
1417
1470
template <class T> \
1422
1475
boost::array<array<geo_element_auto<heap_allocator<size_type> >,sequential, heap_allocator<size_type> >, reference_element::max_variant>& tmp_geo_element, \
1423
1476
bool do_upgrade) \
1425
const geo_basic<T,M>& const_self = *this; \
1426
check_macro (const_self.data().variant() == geo_abstract_base_rep<T>::geo, \
1427
"cannot build_from_data on geo_domains"); \
1428
const geo_rep<T,M>& geo_data = dynamic_cast<const geo_rep<T,M>&>(const_self.data()); \
1429
typedef geo_rep<T,M> georep; \
1430
geo_rep<T,M>* ptr = new_macro(georep(geo_data)); \
1431
ptr->build_from_data (hdr, node, tmp_geo_element, do_upgrade); \
1432
base::operator= (ptr); \
1478
geo_rep<T,M>* ptr = dynamic_cast<geo_rep<T,M>*>(base::pointer()); \
1479
check_macro (ptr != 0, "cannot set_name on geo_domains"); \
1480
ptr->build_from_data (hdr, node, tmp_geo_element, do_upgrade); \
1483
_RHEOLEF_save(sequential)
1435
1484
_RHEOLEF_set_nodes(sequential)
1436
1485
_RHEOLEF_reset_order(sequential)
1437
1486
_RHEOLEF_set_coordinate_system(sequential)