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 ASSERT(reg.
is_valid())(new_label).error(
"Non-existing region can't be renamed.\n");
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();
130 RegionItem item(index, reg.
id(), new_label, reg.
dim(), this->get_region_address(index));
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;
277 RegionSetTable::iterator
it =
sets_.find(set_name);
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);
306 auto set_it = std::find(set.begin(), set.end(), region);
307 ASSERT_PERMANENT(set_it != set.end())(set_name).error(
"Erased region was not found in set.");
317 for (
string name : names) {
319 THROW( ExcUnknownSet() << EI_Label( name )
329 RegionSetTable::const_iterator
it =
sets_.find(set_name);
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 );
377 unsigned int reg_id = it_undef_dim->get_id();
379 .error(
"Dimension of replaced region with 'reg_id' must be undefined_dim\n");
381 unsigned int index = it_undef_dim->index;
383 RegionItem item(index, reg_id, it_undef_dim->label, dim, this->get_region_address(index));
391 THROW(ExcInconsistentBoundary() << EI_Label(it_undef_dim->label) << EI_ID(reg_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;
466 WarningOut().fmt(
"Too many regions are defined (bulk {} + boundary {} >= {}). This may have negative impact on performace.\n"
467 "The user is adviced to simplify the input data and to decrease the number of regions (e.g. using FieldFE input).\n",
475 WarningOut().fmt(
"Region [id = {}, label = '{}'] is not used in any element.",
476 it->get_id(),
it->label);
485 for (
string set_name : set_names) {
487 set.insert(r_set.begin(), r_set.end());
490 return RegionSet(set.begin(), set.end());
#define ASSERT_PERMANENT(expr)
Allow use shorter versions of macro names if these names is not used with external library.
#define ASSERT_PERMANENT_EQ(a, b)
Definition of comparative assert macro (EQual)
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")
Region rename_region(Region reg, const std::string &new_label)
RegionTable::index< Label >::type::iterator LabelIter
unsigned int boundary_size() const
std::string create_label_from_id(unsigned int id) const
Region get_region(unsigned int id, unsigned int dim)
Region find_label(const std::string &label) const
void print_region_table(std::ostream &stream) const
Region replace_region_dim(DimIDIter it_undef_dim, unsigned int dim, bool boundary)
unsigned int n_bulk_
Number of bulk regions.
Region find_id(unsigned int id, unsigned int dim) const
RegionSet get_region_set(const std::string &set_name) const
unsigned int bulk_size() const
RegionSetTable sets_
Map of region sets.
RegionDB()
Default constructor.
Region insert_region(unsigned int id, const std::string &label, unsigned int dim, bool boundary, const std::string &address)
Region find_by_dimid(DimIDIter it_id, unsigned int id, const std::string &label, bool boundary)
unsigned int size() const
bool is_boundary(const std::string &label)
void add_set(const std::string &set_name, const RegionSet &set)
std::pair< unsigned int, unsigned int > DimID
void add_to_set(const std::string &set_name, Region region)
void erase_from_set(const std::string &set_name, Region region)
const std::string & get_region_address(unsigned int idx) const
RegionTable region_table_
Database of all regions (both boundary and bulk).
Region implicit_boundary_region()
static const unsigned int undefined_dim
std::vector< std::string > get_and_check_operands(const Input::Array &operands) const
unsigned int n_boundary_
Number of boundary regions.
unsigned int get_dim(unsigned int idx) const
unsigned int max_id_
Maximal value of Region::id()
static const unsigned int max_n_regions
bool closed_
flag for closed database, no regions can be added, but you can add region sets
RegionSet union_set(std::vector< std::string > set_names) const
const std::string & get_label(unsigned int idx) const
RegionTable::index< OnlyID >::type::iterator OnlyIDIter
unsigned int get_id(unsigned int idx) const
unsigned int idx() const
Returns a global index of the region.
bool is_boundary() const
Returns true if it is a Boundary region and false if it is a Bulk region.
bool is_valid() const
Returns false if the region has undefined/invalid value.
static const unsigned int undefined
index for undefined region
bool is_in_region_set(const RegionSet &set) const
static bool comp(const Region &a, const Region &b)
Comparative method of two regions.
unsigned int id() const
Returns id of the region (using RegionDB)
std::string label() const
Returns label of the region (using RegionDB)
unsigned int dim() const
Returns dimension of the region.
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
#define WarningOut()
Macro defining 'warning' record of log.
void swap(nlohmann::json &j1, nlohmann::json &j2) noexcept(is_nothrow_move_constructible< nlohmann::json >::value and is_nothrow_move_assignable< nlohmann::json >::value)
exchanges the values of two JSON objects
std::vector< Region > RegionSet
One item in region database.