22 : region_db_(mesh->region_db_),
23 el_to_reg_map_(mesh->region_db_.el_to_reg_map_) {}
26 return IT::Abstract(
"Region",
"Abstract record for Region.")
40 string region_label = rec.
val<
string>(
"name");
41 unsigned int region_id = rec.
val<
unsigned int>(
"id");
45 }
catch(RegionDB::ExcUniqueRegionId &e) {
51 }
catch (RegionDB::ExcNonuniqueLabel &e) {
59 }
catch (RegionDB::ExcNonuniqueLabel &e) {
62 }
catch (RegionDB::ExcAddingIntoClosed &e) {
65 }
catch (RegionDB::ExcCantAdd &e) {
76 return IT::Record(
"From_Id",
"Elementary region declared by its id.\n" 77 "It allows to create a new region with given id and name, " 78 "or to rename an existing region of given id.")
81 "Name (label) of the region. It has to be unique per single mesh.")
83 "Id of the region to which you assign the name.")
85 "Dimension of the region to which you assign the name.\n" 86 "The value is taken into account only if a new region is created.")
93 Input::register_class< RegionSetFromId, const Input::Record &, Mesh * >(
"From_Id") +
105 string new_name = rec.
val<
string>(
"name");
106 string mesh_label = rec.
val<
string>(
"mesh_label");
109 if ( reg.is_valid() ) {
112 }
catch (RegionDB::ExcNonuniqueLabel &e) {
117 WarningOut().fmt(
"Unknown region in mesh with label '%s'\n", mesh_label);
125 return IT::Record(
"From_Label",
"Elementary region declared by its name (label).\n" 126 "It gives a new name to an elementary region " 127 "with the original name (in the mesh file) given by the ```mesh_label.```")
130 "New name (label) of the region. It has to be unique per single mesh.")
132 "The original region name in the input file, e.g. a physical volume name in the GMSH format.")
139 Input::register_class< RegionSetFromLabel, const Input::Record &, Mesh * >(
"From_Label") +
151 unsigned int region_id;
152 string region_label = rec.
val<
string>(
"name");
163 }
catch (RegionDB::ExcNonuniqueLabel &e) {
166 }
catch (RegionDB::ExcAddingIntoClosed &e) {
169 }
catch (RegionDB::ExcCantAdd &e) {
177 it_element != element_list.
end();
181 WarningOut().fmt(
"Region assigned to element with id {} will be rewritten.\n", (*it_element));
183 el_to_reg_map_.insert( std::make_pair((*it_element), region_id) );
192 return IT::Record(
"From_Elements",
"Elementary region declared by a list of elements.\n" 193 "The new region is assigned to the list of elements specified by the key " 194 "```element_list```.")
197 "Name (label) of the region. It has to be unique per single mesh.")
200 "If unset, a unique id will be generated automatically.")
202 "List of ids of elements.")
209 Input::register_class< RegionSetFromElements, const Input::Record &, Mesh * >(
"From_Elements") +
236 string name_of_set = rec.
val<
string>(
"name");
246 it_ids != region_ids->end();
251 }
catch(RegionDB::ExcUniqueRegionId &e) {
252 e << region_ids->ei_address();
259 set_names.push_back( reg.
label() );
265 if (region_set.size() == 0) {
266 THROW( ExcEmptyRegionSetResult() << EI_Operation_Type(
"Union") << rec.
ei_address() );
275 return IT::Record(
"Union",
"Defines a new region (set) as a union of two or more regions. " 276 "The regions can be given by their names or ids or both.")
279 "Name (label) of the new region. It has to be unique per single mesh.")
281 "List of region ids to be added to the new region set.")
283 "List of region names (labels) to be added to the new region set.")
290 Input::register_class< RegionSetUnion, const Input::Record &, Mesh * >(
"Union") +
302 string name_of_set = rec.
val<
string>(
"name");
306 OLD_ASSERT( set_names.size() == 2,
"Wrong number of operands. Expect 2.\n" );
312 std::stable_sort(set_1.begin(), set_1.end(),
Region::comp);
313 std::stable_sort(set_2.begin(), set_2.end(),
Region::comp);
314 set_diff.resize(set_1.size() + set_2.size());
316 RegionSet::iterator
it = std::set_difference(set_1.begin(), set_1.end(), set_2.begin(), set_2.end(), set_diff.begin(),
Region::comp);
317 set_diff.resize(it - set_diff.begin());
319 if (set_diff.size() == 0) {
320 THROW( ExcEmptyRegionSetResult() << EI_Operation_Type(
"Difference") << rec.
ei_address() );
329 return IT::Record(
"Difference",
"Defines a new region (set) as a difference of two regions (sets), given by their names.")
332 "Name (label) of the new region. It has to be unique per single mesh.")
334 "List of exactly two region (set) names.\n" 335 "Supposing region sets r1, r2, the result includes all regions of r1 that are not in r2.")
342 Input::register_class< RegionSetDifference, const Input::Record &, Mesh * >(
"Difference") +
354 string name_of_set = rec.
val<
string>(
"name");
359 for (
unsigned int i=1; i<set_names.size(); i++) {
360 region_set = this->
intersection( region_set, set_names[i] );
363 if (region_set.size() == 0) {
364 THROW( ExcEmptyRegionSetResult() << EI_Operation_Type(
"Intersection") << rec.
ei_address() );
373 return IT::Record(
"Intersection",
"Defines a new region (set) as an intersection of two or more regions (sets)" 374 ", given by their names.")
377 "Name (label) of the new region. It has to be unique per single mesh.")
379 "List of two or more region (set) names.")
385 Input::register_class< RegionSetIntersection, const Input::Record &, Mesh * >(
"Intersection") +
392 RegionSet::iterator
it;
394 std::stable_sort(target_set.begin(), target_set.end(),
Region::comp);
395 std::stable_sort(source_set.begin(), source_set.end(),
Region::comp);
397 set_insec.resize(target_set.size() + source_set.size());
398 it = std::set_intersection(target_set.begin(), target_set.end(), source_set.begin(), source_set.end(), set_insec.begin(),
Region::comp);
399 set_insec.resize(it - set_insec.begin());
RegionDB & region_db_
Reference to region_db_ of Mesh.
static const int registrar
Registrar of class to factory.
Region rename_region(Region reg, const std::string &new_label)
static const Input::Type::Record & get_region_input_type()
RegionSetIntersection(const Input::Record &rec, Mesh *mesh)
Constructor.
RegionSet union_set(std::vector< string > set_names) const
RegionSetFromLabel(const Input::Record &rec, Mesh *mesh)
Constructor.
RegionSet intersection(RegionSet target_set, const string &source_set_name) const
RegionSetFromId(const Input::Record &rec, Mesh *mesh)
Constructor.
RegionSet get_region_set(const string &set_name) const
static bool comp(const Region &a, const Region &b)
Comparative method of two regions.
void add_set(const string &set_name, const RegionSet &set)
string create_label_from_id(unsigned int id) const
const RegionDB & region_db() const
static const int registrar
Registrar of class to factory.
static const int registrar
Registrar of class to factory.
static const Input::Type::Record & get_region_input_type()
RegionSetBase(Mesh *mesh)
Constructor.
RegionDB::MapElementIDToRegionID & el_to_reg_map_
Reference to map stored relevance of elements to regions.
static const int registrar
Registrar of class to factory.
static const Input::Type::Record & get_region_input_type()
static const Input::Type::Record & get_region_input_type()
static const Input::Type::Record & get_region_input_type()
static const Input::Type::Record & get_region_input_type()
static const int registrar
Registrar of class to factory.
Region find_id(unsigned int id, unsigned int dim) const
std::vector< string > get_and_check_operands(const Input::Array &operands) const
static const int registrar
Registrar of class to factory.
Region add_region(unsigned int id, const std::string &label, unsigned int dim, const std::string &address="implicit")
RegionSetUnion(const Input::Record &rec, Mesh *mesh)
Constructor.
#define WarningOut()
Macro defining 'warning' record of log.
static Input::Type::Abstract & get_input_type()
RegionSetDifference(const Input::Record &rec, Mesh *mesh)
Constructor.
static const unsigned int undefined_dim
Region find_label(const std::string &label) const
RegionSetFromElements(const Input::Record &rec, Mesh *mesh)
Constructor.
bool is_valid() const
Returns false if the region has undefined/invalid value.
std::string label() const
Returns label of the region (using RegionDB)
unsigned int get_max_region_id()
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.