33 {
return db_->get_label(idx_); }
38 {
return db_->get_id(idx_); }
43 {
return db_->get_dim(idx_); }
47 for(
const Region ® :
set)
48 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 <<
"----------- 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;
465 WarningOut().fmt(
"Too many regions are defined (bulk {} + boundary {} >= {}). This may have negative impact on performace.\n" 466 "The user is adviced to simplify the input data and to decrease the number of regions (e.g. using FieldFE input).\n",
474 WarningOut().fmt(
"Region [id = {}, label = '{}'] is not used in any element.",
475 it->get_id(),
it->label);
482 std::set<Region, bool (*)(const Region&, const Region&)>
set(
Region::comp);
484 for (
string set_name : set_names) {
486 set.insert(r_set.begin(), r_set.end());
489 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.