27 #include <boost/foreach.hpp> 34 {
return db_->get_label(idx_); }
39 {
return db_->get_id(idx_); }
44 {
return db_->get_dim(idx_); }
48 for(
const Region ® :
set)
49 if (reg.
idx_ == this->idx_)
return true;
64 : closed_(false), n_boundary_(0), n_bulk_(0), max_id_(0) {
78 return Region(it_id->index, *
this);
102 THROW(ExcNonuniqueLabel() << EI_Label(label) << EI_ID(
id) << EI_IDOfOtherLabel(it_label->get_id()) );
110 OLD_ASSERT(reg.
is_valid(),
"Non-existing region can't be renamed to '%s'.\n", new_label.c_str());
115 if ( reg.
id() == it_label->index ) {
119 THROW(ExcNonuniqueLabel() << EI_Label(new_label) << EI_ID(reg.
id()) << EI_IDOfOtherLabel(it_label->get_id()) );
124 unsigned int index = reg.
idx();
136 WarningOut().fmt(
"Change boundary flag of region with id {} and label {}.\n", reg.
id(), new_label);
137 if (old_boundary_flag) {
146 return Region(index, *
this);
154 return Region(it_id->index, *
this);
173 return Region(it_label->index, *
this);
184 return Region(it_id->index, *
this);
193 THROW( ExcUniqueRegionId() << EI_ID(
id ) );
197 return Region(it_id->index, *
this);
239 unsigned int index = it->index;
240 RegionItem item(index, it->get_id(), it->label, it->dim(), it->address,
true);
277 RegionSetTable::iterator
it =
sets_.find(set_name);
279 if (it ==
sets_.end()) {
281 set.push_back(region);
283 sets_.insert( std::make_pair(set_name,
set) );
286 if ( std::find(
set.begin(),
set.end(), region)==
set.end() ) {
287 set.push_back(region);
296 sets_.insert( std::make_pair(set_name,
set) );
302 RegionSetTable::iterator
it =
sets_.find(set_name);
303 OLD_ASSERT(it !=
sets_.end(),
"Region set '%s' doesn't exist.", set_name.c_str());
306 auto set_it = std::find(
set.begin(),
set.end(), region);
307 OLD_ASSERT(set_it !=
set.end(),
"Erased region was not found in set '%s'", set_name.c_str());
317 for (
string name : names) {
319 THROW( ExcUnknownSet() << EI_Label( name )
329 RegionSetTable::const_iterator
it =
sets_.find(set_name);
330 if ( it ==
sets_.end() ) {
339 ss <<
"region_" << id;
344 if (
closed_)
THROW( ExcAddingIntoClosed() << EI_Label(label) << EI_ID(
id) );
356 THROW( ExcCantAdd() << EI_Label(label) << EI_ID(
id) );
364 region_set.push_back( reg );
378 "Dimension of replaced region with id=%u must be undefined_dim, actually is: %u\n", it_undef_dim->get_id(), it_undef_dim->dim());
380 unsigned int index = it_undef_dim->index;
390 THROW(ExcInconsistentBoundary() << EI_Label(it_undef_dim->label) << EI_ID(it_undef_dim->get_id()) );
396 unsigned int index = it_id->index;
399 THROW(ExcNonuniqueID() << EI_Label(label) << EI_ID(
id) << EI_LabelOfOtherID(it_id->label) );
404 THROW(ExcInconsistentBoundary() << EI_Label(label) << EI_ID(
id) );
414 for (RegionSetTable::const_iterator
it =
sets_.begin();
it !=
sets_.end(); ++
it) {
415 string rset_label =
it->first;
418 if ( (rset_label.size() > 0) && (rset_label[0] ==
'.') ) boundaries.push_back(rset_label);
419 else bulks.push_back(rset_label);
421 sets.push_back(rset_label);
427 stream << endl <<
"----------- Table of all regions: -----------";
428 if (boundaries.size()) {
429 stream << endl <<
" - Boundary elementary regions -" << endl;
430 stream << std::setfill(
' ') <<
"name" << setw(14) <<
"" << setw(6) <<
"id" <<
" dim" << endl;
433 stream << std::left << setw(18) << (*it) << std::right << setw(6) << label_it->get_id() << setw(4) << label_it->dim() << endl;
437 stream << endl <<
" - Bulk elementary regions -" << endl;
438 stream <<
"name" << setw(14) <<
"" << setw(6) <<
"id" <<
" dim" << endl;
441 stream << std::left << setw(18) << (*it) << std::right << setw(6) << label_it->get_id() << setw(4) << label_it->dim() << endl;
445 stream << endl <<
" - Sets of regions -" << endl;
446 stream <<
"name" << setw(14) <<
"" <<
"contains regions" << endl;
448 RegionSetTable::const_iterator set_it =
sets_.find(*
it);
449 stream << std::left << setw(18) << (*it) << std::right <<
"[";
450 for (RegionSet::const_iterator r_it = set_it->second.begin(); r_it!=set_it->second.end(); ++r_it) {
451 if (r_it != set_it->second.begin()) stream <<
", ";
452 stream <<
"\"" << r_it->label() <<
"\"";
454 stream <<
"]" << endl;
457 stream << std::setfill(
'-') << setw(45) <<
"" << std::setfill(
' ') << endl << endl;
467 ASSERT(
it->used)(
it->label)(
it->get_id()).warning(
"Region with given id and label is not used in any element.");
473 std::set<Region, bool (*)(const Region&, const Region&)>
set(
Region::comp);
475 for (
string set_name : set_names) {
477 set.insert(r_set.begin(), r_set.end());
480 return RegionSet(
set.begin(),
set.end());
unsigned int size() const
const std::string & get_label(unsigned int idx) const
bool is_boundary() const
Returns true if it is a Boundary region and false if it is a Bulk region.
Region rename_region(Region reg, const std::string &new_label)
unsigned int bulk_size() const
RegionSet union_set(std::vector< string > set_names) const
RegionSet get_region_set(const string &set_name) const
RegionSetTable sets_
Map of region sets.
static bool comp(const Region &a, const Region &b)
Comparative method of two regions.
void add_set(const string &set_name, const RegionSet &set)
static const unsigned int undefined
index for undefined region
unsigned int max_id_
Maximal value of Region::id()
string create_label_from_id(unsigned int id) const
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
Region replace_region_dim(DimIDIter it_undef_dim, unsigned int dim, bool boundary)
One item in region database.
std::vector< Region > RegionSet
void erase_from_set(const string &set_name, Region region)
Region get_region(unsigned int id, unsigned int dim)
Region find_by_dimid(DimIDIter it_id, unsigned int id, const std::string &label, bool boundary)
Region find_id(unsigned int id, unsigned int dim) const
std::vector< string > get_and_check_operands(const Input::Array &operands) const
void add_to_set(const string &set_name, Region region)
RegionTable::index< Label >::type::iterator LabelIter
bool is_boundary(const std::string &label)
Region implicit_boundary_region()
unsigned int n_bulk_
Number of bulk regions.
std::pair< unsigned int, unsigned int > DimID
RegionDB()
Default constructor.
void swap(nlohmann::json &j1, nlohmann::json &j2) noexcept(is_nothrow_move_constructible< nlohmann::json >::value andis_nothrow_move_assignable< nlohmann::json >::value)
exchanges the values of two JSON objects
RegionTable::index< OnlyID >::type::iterator OnlyIDIter
RegionTable::index< DimId >::type::iterator DimIDIter
void mark_used_region(unsigned int idx)
void print_region_table(ostream &stream) const
Region add_region(unsigned int id, const std::string &label, unsigned int dim, const std::string &address="implicit")
const std::string & get_region_address(unsigned int idx) const
Region insert_region(unsigned int id, const std::string &label, unsigned int dim, bool boundary, const std::string &address)
static const unsigned int max_n_regions
unsigned int get_id(unsigned int idx) const
unsigned int boundary_size() const
RegionTable region_table_
Database of all regions (both boundary and bulk).
bool is_in_region_set(const RegionSet &set) const
unsigned int get_dim(unsigned int idx) const
#define WarningOut()
Macro defining 'warning' record of log.
static const unsigned int undefined_dim
Region find_label(const std::string &label) const
bool is_valid() const
Returns false if the region has undefined/invalid value.
std::string label() const
Returns label of the region (using RegionDB)
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
bool closed_
flag for closed database, no regions can be added, but you can add region sets
unsigned int n_boundary_
Number of boundary regions.
unsigned int id() const
Returns id of the region (using RegionDB)
unsigned int dim() const
Returns dimension of the region.
unsigned int idx() const
Returns a global index of the region.