28 #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;
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;
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);
483 std::set<Region, bool (*)(const Region&, const Region&)>
set(
Region::comp);
485 for (
string set_name : set_names) {
487 set.insert(r_set.begin(), r_set.end());
490 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.