28 #include <boost/foreach.hpp> 35 {
return db_->get_label(idx_); }
40 {
return db_->get_id(idx_); }
45 {
return db_->get_dim(idx_); }
49 for(
const Region ® :
set)
50 if (reg.
idx_ == this->idx_)
return true;
65 : closed_(false), n_boundary_(0), n_bulk_(0), max_id_(0) {
79 return Region(it_id->index, *
this);
103 THROW(ExcNonuniqueLabel() << EI_Label(label) << EI_ID(
id) << EI_IDOfOtherLabel(it_label->get_id()) );
111 OLD_ASSERT(reg.
is_valid(),
"Non-existing region can't be renamed to '%s'.\n", new_label.c_str());
116 if ( reg.
id() == it_label->index ) {
120 THROW(ExcNonuniqueLabel() << EI_Label(new_label) << EI_ID(reg.
id()) << EI_IDOfOtherLabel(it_label->get_id()) );
125 unsigned int index = reg.
idx();
137 WarningOut().fmt(
"Change boundary flag of region with id {} and label {}.\n", reg.
id(), new_label);
138 if (old_boundary_flag) {
147 return Region(index, *
this);
155 return Region(it_id->index, *
this);
174 return Region(it_label->index, *
this);
185 return Region(it_id->index, *
this);
194 THROW( ExcUniqueRegionId() << EI_ID(
id ) );
198 return Region(it_id->index, *
this);
240 unsigned int index = it->index;
241 RegionItem item(index, it->get_id(), it->label, it->dim(), it->address,
true);
278 RegionSetTable::iterator
it =
sets_.find(set_name);
280 if (it ==
sets_.end()) {
282 set.push_back(region);
284 sets_.insert( std::make_pair(set_name,
set) );
287 if ( std::find(
set.begin(),
set.end(), region)==
set.end() ) {
288 set.push_back(region);
297 sets_.insert( std::make_pair(set_name,
set) );
303 RegionSetTable::iterator
it =
sets_.find(set_name);
304 OLD_ASSERT(it !=
sets_.end(),
"Region set '%s' doesn't exist.", set_name.c_str());
307 auto set_it = std::find(
set.begin(),
set.end(), region);
308 OLD_ASSERT(set_it !=
set.end(),
"Erased region was not found in set '%s'", set_name.c_str());
318 for (
string name : names) {
320 THROW( ExcUnknownSet() << EI_Label( name )
330 RegionSetTable::const_iterator
it =
sets_.find(set_name);
331 if ( it ==
sets_.end() ) {
340 ss <<
"region_" << id;
345 if (
closed_)
THROW( ExcAddingIntoClosed() << EI_Label(label) << EI_ID(
id) );
357 THROW( ExcCantAdd() << EI_Label(label) << EI_ID(
id) );
365 region_set.push_back( reg );
379 "Dimension of replaced region with id=%u must be undefined_dim, actually is: %u\n", it_undef_dim->get_id(), it_undef_dim->dim());
381 unsigned int index = it_undef_dim->index;
391 THROW(ExcInconsistentBoundary() << EI_Label(it_undef_dim->label) << EI_ID(it_undef_dim->get_id()) );
397 unsigned int index = it_id->index;
400 THROW(ExcNonuniqueID() << EI_Label(label) << EI_ID(
id) << EI_LabelOfOtherID(it_id->label) );
405 THROW(ExcInconsistentBoundary() << EI_Label(label) << EI_ID(
id) );
415 for (RegionSetTable::const_iterator
it =
sets_.begin();
it !=
sets_.end(); ++
it) {
416 string rset_label =
it->first;
419 if ( (rset_label.size() > 0) && (rset_label[0] ==
'.') ) boundaries.push_back(rset_label);
420 else bulks.push_back(rset_label);
422 sets.push_back(rset_label);
428 stream <<
"----------- Table of all regions: -----------";
429 if (boundaries.size()) {
430 stream << endl <<
" - Boundary elementary regions -" << endl;
431 stream << std::setfill(
' ') <<
"name" << setw(14) <<
"" << setw(6) <<
"id" <<
" dim" << endl;
434 stream << std::left << setw(18) << (*it) << std::right << setw(6) << label_it->get_id() << setw(4) << label_it->dim() << endl;
438 stream << endl <<
" - Bulk elementary regions -" << endl;
439 stream <<
"name" << setw(14) <<
"" << setw(6) <<
"id" <<
" dim" << endl;
442 stream << std::left << setw(18) << (*it) << std::right << setw(6) << label_it->get_id() << setw(4) << label_it->dim() << endl;
446 stream << endl <<
" - Sets of regions -" << endl;
447 stream <<
"name" << setw(14) <<
"" <<
"contains regions" << endl;
449 RegionSetTable::const_iterator set_it =
sets_.find(*
it);
450 stream << std::left << setw(18) << (*it) << std::right <<
"[";
451 for (RegionSet::const_iterator r_it = set_it->second.begin(); r_it!=set_it->second.end(); ++r_it) {
452 if (r_it != set_it->second.begin()) stream <<
", ";
453 stream <<
"\"" << r_it->label() <<
"\"";
455 stream <<
"]" << endl;
458 stream << std::setfill(
'-') << setw(45) <<
"" << std::setfill(
' ') << endl << endl;
468 ASSERT(
it->used)(
it->label)(
it->get_id()).warning(
"Region with given id and label is not used in any element.");
474 std::set<Region, bool (*)(const Region&, const Region&)>
set(
Region::comp);
476 for (
string set_name : set_names) {
478 set.insert(r_set.begin(), r_set.end());
481 return RegionSet(
set.begin(),
set.end());
unsigned int size() const
const std::string & get_label(unsigned int idx) const
RegionSet get_region_set(const std::string &set_name) 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
RegionSetTable sets_
Map of region sets.
static bool comp(const Region &a, const Region &b)
Comparative method of two regions.
static const unsigned int undefined
index for undefined region
unsigned int max_id_
Maximal value of Region::id()
void add_to_set(const std::string &set_name, Region region)
std::string create_label_from_id(unsigned int id) const
RegionSet union_set(std::vector< std::string > set_names) 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
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< std::string > get_and_check_operands(const Input::Array &operands) const
void add_set(const std::string &set_name, const RegionSet &set)
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)
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).
void erase_from_set(const std::string &set_name, Region region)
bool is_in_region_set(const RegionSet &set) const
unsigned int get_dim(unsigned int idx) const
void print_region_table(std::ostream &stream) 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.