Flow123d  JS_before_hm-1755-g6249b9fc1
Classes | Public Types | Public Member Functions | Static Public Attributes | Private Types | Private Member Functions | Private Attributes | Friends | List of all members
RegionDB Class Reference

#include <region.hh>

Collaboration diagram for RegionDB:
Collaboration graph
[legend]

Classes

struct  DimId
 
struct  Index
 
struct  Label
 
struct  OnlyID
 
struct  RegionItem
 One item in region database. More...
 

Public Types

typedef std::map< unsigned int, unsigned int > MapElementIDToRegionID
 

Public Member Functions

 TYPEDEF_ERR_INFO (EI_Label, const std::string)
 
 TYPEDEF_ERR_INFO (EI_ID, unsigned int)
 
 TYPEDEF_ERR_INFO (EI_IDOfOtherLabel, unsigned int)
 
 TYPEDEF_ERR_INFO (EI_LabelOfOtherID, const std::string)
 
 DECLARE_INPUT_EXCEPTION (ExcAddingIntoClosed,<< "Can not add label="<< EI_Label::qval<< " into closed MaterialDispatch.\n")
 
 DECLARE_EXCEPTION (ExcNonuniqueID,<< "Non-unique ID during add of elementary region id: "<< EI_ID::val<< ", label: "<< EI_Label::qval<< "\n"<< "other elementary region with same ID but different label: "<< EI_LabelOfOtherID::qval<< " already exists\n")
 
 DECLARE_INPUT_EXCEPTION (ExcNonuniqueLabel,<< "Non-unique label during add of elementary region id: "<< EI_ID::val<< ", label: "<< EI_Label::qval<< "\n"<< "other elementary region with same label but different ID: "<< EI_IDOfOtherLabel::val<< " already exists\n")
 
 DECLARE_EXCEPTION (ExcInconsistentBoundary,<< "Inconsistent add of elementary region with id: "<< EI_ID::val<< ", label: "<< EI_Label::qval<< "\n"<< "both ID and label match an existing elementary region with different boundary flag.")
 
 DECLARE_INPUT_EXCEPTION (ExcCantAdd,<< "Can not add new elementary region into DB, id: "<< EI_ID::val<<", label: "<< EI_Label::qval)
 
 DECLARE_INPUT_EXCEPTION (ExcUnknownRegion,<< "Unknown region with id: "<< EI_ID::val)
 
 DECLARE_INPUT_EXCEPTION (ExcUnknownSet,<< "Operation with unknown region set: "<< EI_Label::qval)
 
 DECLARE_INPUT_EXCEPTION (ExcUnknownSetOperand,<< "Operation with unknown region set: "<< EI_Label::qval)
 
 DECLARE_INPUT_EXCEPTION (ExcUniqueRegionId,<< "Id of elementary region must be unique, id: "<< EI_ID::val)
 
 RegionDB ()
 Default constructor. More...
 
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)
 
Region get_region (unsigned int id, unsigned int dim)
 
Region find_label (const std::string &label) const
 
Region find_id (unsigned int id, unsigned int dim) const
 
Region find_id (unsigned int id) const
 
const std::string & get_label (unsigned int idx) const
 
unsigned int get_id (unsigned int idx) const
 
unsigned int get_dim (unsigned int idx) const
 
void close ()
 
unsigned int size () const
 
unsigned int boundary_size () const
 
unsigned int bulk_size () const
 
Region implicit_boundary_region ()
 
void add_to_set (const std::string &set_name, Region region)
 
void add_set (const std::string &set_name, const RegionSet &set)
 
RegionSet get_region_set (const std::string &set_name) const
 
std::vector< std::string > get_and_check_operands (const Input::Array &operands) const
 
void print_region_table (std::ostream &stream) const
 
std::string create_label_from_id (unsigned int id) const
 
const std::string & get_region_address (unsigned int idx) const
 
void mark_used_region (unsigned int idx)
 
RegionSet union_set (std::vector< std::string > set_names) const
 

Static Public Attributes

static const unsigned int max_n_regions = 10000
 
static const unsigned int undefined_dim = 10
 

Private Types

typedef std::pair< unsigned int, unsigned int > DimID
 
typedef BMI::multi_index_container< RegionItem, BMI::indexed_by< BMI::ordered_unique< BMI::tag< Index >, BMI::member< RegionItem, unsigned int, &RegionItem::index > >, BMI::hashed_unique< BMI::tag< DimId >, BMI::member< RegionItem, DimID, &RegionItem::id > >, BMI::hashed_non_unique< BMI::tag< OnlyID >, BMI::const_mem_fun< RegionItem, unsigned int, &RegionItem::get_id > >, BMI::ordered_unique< BMI::tag< Label >, BMI::member< RegionItem, std::string, &RegionItem::label > > > > RegionTable
 Region database. More...
 
typedef RegionTable::index< Label >::type::iterator LabelIter
 
typedef RegionTable::index< DimId >::type::iterator DimIDIter
 
typedef RegionTable::index< OnlyID >::type::iterator OnlyIDIter
 

Private Member Functions

Region insert_region (unsigned int id, const std::string &label, unsigned int dim, bool boundary, const std::string &address)
 
Region replace_region_dim (DimIDIter it_undef_dim, unsigned int dim, bool boundary)
 
Region find_by_dimid (DimIDIter it_id, unsigned int id, const std::string &label, bool boundary)
 
void erase_from_set (const std::string &set_name, Region region)
 
void check_regions ()
 
bool is_boundary (const std::string &label)
 

Private Attributes

RegionTable region_table_
 Database of all regions (both boundary and bulk). More...
 
bool closed_
 flag for closed database, no regions can be added, but you can add region sets More...
 
unsigned int n_boundary_
 Number of boundary regions. More...
 
unsigned int n_bulk_
 Number of bulk regions. More...
 
unsigned int max_id_
 Maximal value of Region::id() More...
 
RegionSetTable sets_
 Map of region sets. More...
 
RegionSet all
 Make part of general RegionSet table. More...
 
RegionSet bulk
 
RegionSet boundary
 
Region implicit_bulk_
 
Region implicit_boundary_
 
MapElementIDToRegionID el_to_reg_map_
 

Friends

class Mesh
 
class RegionSetBase
 

Detailed Description

Class for conversion between an index and string label of an material. Class contains only static members in order to provide globally consistent indexing of materials across various meshes and functions.

The conversion should be performed only through the input and output so that the lookup overhead could be shadowed by IO operations.

Taking sizes and creating region sets should be possible only after the database is closed. We assume that all regions are known at beginning of the program (typically after reading all meshes) however they need not be used through the whole computation.

TODO: In order to support more meshes , possibly changing during the time we need better policy for RegionDB closing. Currently we close RegionDB at first call to any of size methods. We need size information for initialization of RegionFields. However, every RegionField should be used for assembly over just one mesh (or set of meshes - supermesh?), surly this mesh has to be initialized before assembly so it could be initialized before initialization of RegionField which lives on this mesh. So the solution can be: RegionDB keeps list of meshes that has their regions registered in RegionDB. RegionField has signature of its mesh and check if the mesh is registered in the RegionDB before initialization of REgionField.

Update TODO:

/ map set name to lists of indices of its regions typedef std::vector<RegionIdx> RegionSet; std::map<std::string, RegionSet > sets_;

/ Add region to given set. Creat the set if it does not exist. add_to_set( const string& set_name, RegionIdx region); / Add a set into map, delete possible previous value, do not worry about slow copies of / the set array. add_set( const string& set_name, const RegionSet & set); RegionSet union( const string & set_name_1, const string & set_name_2); // sort + std::set_union RegionSet intersection( const string & set_name_1, const string & set_name_2); RegionSet difference( const string & set_name_1, const string & set_name_2); const RegionSet & get_set(const string & set_name); void read_sets_from_input(Input::Record rec); // see structure of RegionDB::get_region_set_input_type()

region_sets = [ { name="set name", region_ids=[ int ...], region_labels= ["..."], // these are merger together

union=["set_1", "set_2"], // later overwrites previous intersection= difference= } ]

else put it into Mesh::element

5) Setup topology - we has to connect Boundary with existing boundary elements, and add the remaining elements, after we remove support for old bCD files we may skip creation of remaining boundary elements since there will be no way how to set BC on them.

Definition at line 292 of file region.hh.

Member Typedef Documentation

◆ DimID

typedef std::pair<unsigned int, unsigned int> RegionDB::DimID
private

Definition at line 492 of file region.hh.

◆ DimIDIter

typedef RegionTable::index<DimId>::type::iterator RegionDB::DimIDIter
private

Definition at line 540 of file region.hh.

◆ LabelIter

typedef RegionTable::index<Label>::type::iterator RegionDB::LabelIter
private

Definition at line 539 of file region.hh.

◆ MapElementIDToRegionID

typedef std::map<unsigned int, unsigned int> RegionDB::MapElementIDToRegionID

Map representing the relevance of elements to regions

Definition at line 297 of file region.hh.

◆ OnlyIDIter

typedef RegionTable::index<OnlyID>::type::iterator RegionDB::OnlyIDIter
private

Definition at line 541 of file region.hh.

◆ RegionTable

typedef BMI::multi_index_container< RegionItem, BMI::indexed_by< BMI::ordered_unique< BMI::tag<Index>, BMI::member<RegionItem, unsigned int, &RegionItem::index > >, BMI::hashed_unique< BMI::tag<DimId>, BMI::member<RegionItem, DimID, &RegionItem::id> >, BMI::hashed_non_unique< BMI::tag<OnlyID>, BMI::const_mem_fun<RegionItem, unsigned int, &RegionItem::get_id> >, BMI::ordered_unique< BMI::tag<Label>, BMI::member<RegionItem, std::string, &RegionItem::label> > > > RegionDB::RegionTable
private

Region database.

Definition at line 536 of file region.hh.

Constructor & Destructor Documentation

◆ RegionDB()

RegionDB::RegionDB ( )

Default constructor.

Definition at line 63 of file region.cc.

Member Function Documentation

◆ add_region()

Region RegionDB::add_region ( unsigned int  id,
const std::string &  label,
unsigned int  dim,
const std::string &  address = "implicit" 
)

This method adds new region into the database and returns its index. This requires full specification of the region that is given in PhysicalNames section of the GMSH MSH format or in Mesh input record.

If ID or label are found in the DB, we distinguish following cases: 1) ID is found, label is not found : warning ID has already assigned label 2) ID is not found, label is found : report error - assigning same label to different IDs 3) both ID and label are found, in same region : check remaining data, return existing region 4) , in different : warning ID has already assigned label

Parameter id is any unique non-negative integer, parameter label is unique string identifier of the region, dim is dimension of reference elements in the region, boundary is true if the region consist of boundary elements (where one can apply boundary condition) and address contains source of region (address in input file or section in mesh file).

When called from GMSH reader the default region name have a form "region_ID".

Definition at line 85 of file region.cc.

Here is the caller graph for this function:

◆ add_set()

void RegionDB::add_set ( const std::string &  set_name,
const RegionSet set 
)

Add a set into map, delete possible previous value.

Parameters
set_nameName of added set
setAdded RegionSet

Definition at line 293 of file region.cc.

Here is the caller graph for this function:

◆ add_to_set()

void RegionDB::add_to_set ( const std::string &  set_name,
Region  region 
)

Definition at line 276 of file region.cc.

Here is the caller graph for this function:

◆ boundary_size()

unsigned int RegionDB::boundary_size ( ) const

Returns total number boundary regions.

Definition at line 261 of file region.cc.

Here is the caller graph for this function:

◆ bulk_size()

unsigned int RegionDB::bulk_size ( ) const

Returns total number bulk regions.

Definition at line 268 of file region.cc.

Here is the caller graph for this function:

◆ check_regions()

void RegionDB::check_regions ( )
private

Iterate all stored regions and check if regions are assigned to element(s).

Unused region throws exception.

Definition at line 461 of file region.cc.

Here is the caller graph for this function:

◆ close()

void RegionDB::close ( )

Close this class for adding labels. This is necessary to return correct size for material indexed arrays and vectors. After calling this method you can call method size and method idx_of_label rise an exception for any unknown label.

Definition at line 249 of file region.cc.

Here is the caller graph for this function:

◆ create_label_from_id()

string RegionDB::create_label_from_id ( unsigned int  id) const

Create label of region in format: "region_"+id

Use if label is not set.

Definition at line 337 of file region.cc.

Here is the caller graph for this function:

◆ DECLARE_EXCEPTION() [1/2]

RegionDB::DECLARE_EXCEPTION ( ExcInconsistentBoundary  ,
<< "Inconsistent add of elementary region with id: "<< EI_ID::val<< "  ,
label:"<< EI_Label::qval<< "\n"<< "both ID and label match an existing elementary region with different boundary flag."   
)

◆ DECLARE_EXCEPTION() [2/2]

RegionDB::DECLARE_EXCEPTION ( ExcNonuniqueID  ,
<< "Non-unique ID during add of elementary region id: "<< EI_ID::val<< "  ,
label:"<< EI_Label::qval<< "\n"<< "other elementary region with same ID but different label:"<< EI_LabelOfOtherID::qval<< " already exists\n"   
)

◆ DECLARE_INPUT_EXCEPTION() [1/7]

RegionDB::DECLARE_INPUT_EXCEPTION ( ExcAddingIntoClosed  )

◆ DECLARE_INPUT_EXCEPTION() [2/7]

RegionDB::DECLARE_INPUT_EXCEPTION ( ExcCantAdd  ,
<< "Can not add new elementary region into  DB,
id:"<< EI_ID::val<<"  ,
label:"<< EI_Label::qval   
)

◆ DECLARE_INPUT_EXCEPTION() [3/7]

RegionDB::DECLARE_INPUT_EXCEPTION ( ExcNonuniqueLabel  ,
<< "Non-unique label during add of elementary region id: "<< EI_ID::val<< "  ,
label:"<< EI_Label::qval<< "\n"<< "other elementary region with same label but different ID:"<< EI_IDOfOtherLabel::val<< " already exists\n"   
)

◆ DECLARE_INPUT_EXCEPTION() [4/7]

RegionDB::DECLARE_INPUT_EXCEPTION ( ExcUniqueRegionId  ,
<< "Id of elementary region must be  unique,
id:"<< EI_ID::val   
)

◆ DECLARE_INPUT_EXCEPTION() [5/7]

RegionDB::DECLARE_INPUT_EXCEPTION ( ExcUnknownRegion  ,
<< "Unknown region with id: "<< EI_ID::val   
)

◆ DECLARE_INPUT_EXCEPTION() [6/7]

RegionDB::DECLARE_INPUT_EXCEPTION ( ExcUnknownSet  ,
<< "Operation with unknown region set: "<< EI_Label::qval   
)

◆ DECLARE_INPUT_EXCEPTION() [7/7]

RegionDB::DECLARE_INPUT_EXCEPTION ( ExcUnknownSetOperand  ,
<< "Operation with unknown region set: "<< EI_Label::qval   
)

◆ erase_from_set()

void RegionDB::erase_from_set ( const std::string &  set_name,
Region  region 
)
private

Definition at line 301 of file region.cc.

Here is the caller graph for this function:

◆ find_by_dimid()

Region RegionDB::find_by_dimid ( DimIDIter  it_id,
unsigned int  id,
const std::string &  label,
bool  boundary 
)
private

Find existing region given by pair (dim, id).

Definition at line 395 of file region.cc.

Here is the caller graph for this function:

◆ find_id() [1/2]

Region RegionDB::find_id ( unsigned int  id) const

Slower version that tries to find region for given ID. If it is not unique it throws.

Definition at line 190 of file region.cc.

◆ find_id() [2/2]

Region RegionDB::find_id ( unsigned int  id,
unsigned int  dim 
) const

Returns a Region with given id. If it is not found it returns undefined Region. Gmsh ID numbers are unique only over one dimension, so dimension dim must be provided as well.

Definition at line 180 of file region.cc.

Here is the caller graph for this function:

◆ find_label()

Region RegionDB::find_label ( const std::string &  label) const

Returns a Region with given label. If it is not found it returns undefined Region.

Definition at line 169 of file region.cc.

Here is the caller graph for this function:

◆ get_and_check_operands()

std::vector< string > RegionDB::get_and_check_operands ( const Input::Array operands) const

Read two operands from input array of strings and check if given names are existing sets. Return pair of checked set names.

Definition at line 312 of file region.cc.

Here is the caller graph for this function:

◆ get_dim()

unsigned int RegionDB::get_dim ( unsigned int  idx) const

Return dimension of region with given index idx.

Definition at line 219 of file region.cc.

◆ get_id()

unsigned int RegionDB::get_id ( unsigned int  idx) const

Return original ID for given index idx.

Definition at line 211 of file region.cc.

◆ get_label()

const std::string & RegionDB::get_label ( unsigned int  idx) const

Return original label for given index idx.

Definition at line 203 of file region.cc.

◆ get_region()

Region RegionDB::get_region ( unsigned int  id,
unsigned int  dim 
)

Returns region given the pair of id - dim. If region doesn't exist, checks if exists region with given id and undefined_dim, replaces its dimension and returns its. In other cases throws exception.

Definition at line 150 of file region.cc.

Here is the caller graph for this function:

◆ get_region_address()

const std::string & RegionDB::get_region_address ( unsigned int  idx) const

Return address for given index idx.

Definition at line 227 of file region.cc.

◆ get_region_set()

RegionSet RegionDB::get_region_set ( const std::string &  set_name) const

Get region set of specified name. Three sets are defined by default: "ALL" - set of all regions both bulk and boundary. "BULK" - set of all bulk regions ".BOUNDARY" - set of all boundary regions

Parameters
set_nameName of set
Returns
RegionSet of specified name. Returns Empty vector if the set of given name doesn't exist.

Definition at line 328 of file region.cc.

Here is the caller graph for this function:

◆ implicit_boundary_region()

Region RegionDB::implicit_boundary_region ( )

Returns implicit boundary region. Is used for boundary elements created by Flow123d itself. This region has label ".IMPLICIT_BOUNDARY".

Definition at line 75 of file region.cc.

Here is the caller graph for this function:

◆ insert_region()

Region RegionDB::insert_region ( unsigned int  id,
const std::string &  label,
unsigned int  dim,
bool  boundary,
const std::string &  address 
)
private

Insert new region into database.

Definition at line 343 of file region.cc.

Here is the caller graph for this function:

◆ is_boundary()

bool RegionDB::is_boundary ( const std::string &  label)
inlineprivate

Return boundary flag for given label. Label of boundary region must start by '.' symbol.

Definition at line 606 of file region.hh.

Here is the caller graph for this function:

◆ mark_used_region()

void RegionDB::mark_used_region ( unsigned int  idx)

Mark region with given index idx as used.

Use if region is assigned to element.

Definition at line 235 of file region.cc.

Here is the caller graph for this function:

◆ print_region_table()

void RegionDB::print_region_table ( std::ostream &  stream) const

Print table with base information of all regions stored in RegionDB.

Definition at line 409 of file region.cc.

Here is the caller graph for this function:

◆ rename_region()

Region RegionDB::rename_region ( Region  reg,
const std::string &  new_label 
)

Change label of given Region.

Definition at line 109 of file region.cc.

Here is the caller graph for this function:

◆ replace_region_dim()

Region RegionDB::replace_region_dim ( DimIDIter  it_undef_dim,
unsigned int  dim,
bool  boundary 
)
private

Replace dimension of existing region with undefined_dim.

Definition at line 376 of file region.cc.

Here is the caller graph for this function:

◆ size()

unsigned int RegionDB::size ( ) const

Returns maximal index + 1

Definition at line 254 of file region.cc.

◆ TYPEDEF_ERR_INFO() [1/4]

RegionDB::TYPEDEF_ERR_INFO ( EI_ID  ,
unsigned int   
)

◆ TYPEDEF_ERR_INFO() [2/4]

RegionDB::TYPEDEF_ERR_INFO ( EI_IDOfOtherLabel  ,
unsigned int   
)

◆ TYPEDEF_ERR_INFO() [3/4]

RegionDB::TYPEDEF_ERR_INFO ( EI_Label  ,
const std::string   
)

◆ TYPEDEF_ERR_INFO() [4/4]

RegionDB::TYPEDEF_ERR_INFO ( EI_LabelOfOtherID  ,
const std::string   
)

◆ union_set()

RegionSet RegionDB::union_set ( std::vector< std::string >  set_names) const

Create union of RegionSets of given names defined in set_names.

Definition at line 481 of file region.cc.

Here is the caller graph for this function:

Friends And Related Function Documentation

◆ Mesh

friend class Mesh
friend

Definition at line 610 of file region.hh.

◆ RegionSetBase

friend class RegionSetBase
friend

Definition at line 611 of file region.hh.

Member Data Documentation

◆ all

RegionSet RegionDB::all
private

Make part of general RegionSet table.

Definition at line 560 of file region.hh.

◆ boundary

RegionSet RegionDB::boundary
private

Definition at line 560 of file region.hh.

◆ bulk

RegionSet RegionDB::bulk
private

Definition at line 560 of file region.hh.

◆ closed_

bool RegionDB::closed_
private

flag for closed database, no regions can be added, but you can add region sets

Definition at line 548 of file region.hh.

◆ el_to_reg_map_

MapElementIDToRegionID RegionDB::el_to_reg_map_
private

Represents the relevance of elements to regions. Defined by user in input file.

Definition at line 571 of file region.hh.

◆ implicit_boundary_

Region RegionDB::implicit_boundary_
private

Definition at line 566 of file region.hh.

◆ implicit_bulk_

Region RegionDB::implicit_bulk_
private

Implicit bulk and boundary regions. For GMSH mesh format only implicit_boundary is used for boundary elements that are not explicitly in the mesh file.

Definition at line 566 of file region.hh.

◆ max_id_

unsigned int RegionDB::max_id_
private

Maximal value of Region::id()

Definition at line 554 of file region.hh.

◆ max_n_regions

const unsigned int RegionDB::max_n_regions = 10000
static

Introduce an artificial limit to keep all material indexed arrays of reasonable size.

Definition at line 328 of file region.hh.

◆ n_boundary_

unsigned int RegionDB::n_boundary_
private

Number of boundary regions.

Definition at line 550 of file region.hh.

◆ n_bulk_

unsigned int RegionDB::n_bulk_
private

Number of bulk regions.

Definition at line 552 of file region.hh.

◆ region_table_

RegionTable RegionDB::region_table_
private

Database of all regions (both boundary and bulk).

Definition at line 545 of file region.hh.

◆ sets_

RegionSetTable RegionDB::sets_
private

Map of region sets.

Definition at line 557 of file region.hh.

◆ undefined_dim

const unsigned int RegionDB::undefined_dim = 10
static

Undefined dimension for regions introduced from mesh input record. Dimensions 0,1,2,3 are valid.

Definition at line 332 of file region.hh.


The documentation for this class was generated from the following files: