Flow123d  master-1fea4ce
neighbours.h
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file neighbours.h
15  * @brief
16  */
17 
18 #ifndef MAKE_NEIGHBOURS_H
19 #define MAKE_NEIGHBOURS_H
20 
21 #include "mesh/elements.h"
22 #include "mesh/mesh.h"
23 #include "mesh/accessors.hh"
24 
25 
26 
27 class Edge;
28 class SideIter;
29 /**
30  * Navrh algoritmu pro hledani pruniku elementu dvou siti (libovlnych dimenzi)
31  * algoritmus postupuje od bodu pruniku pres usecky a polygony k mnohostenum
32  *
33  * Vstup: Sit1 dimenze d1 a Sit2 dimenze d2
34  * predpoladam d1<=d2
35  *
36  * 1) hladam body na hranici pruniku tj.
37  * Intersection<d> <d_e1,d_e2> .. prunik ma dimenzi d a pronikaji se simplexy dimenze d_e1, a d_e2
38  *
39  * Intersection<0><0,0> .. totozne vrcholy El<0>
40  * Intersection<0><0,1> a <1,0> .. vrchol jedne site lezi na hrane druhe site
41  * Intersection<0><0,n> a <n,0> .. vrchol lezi na El<n> druhe site
42  *
43  * Intersection<0><1,1> .. bodovy prusecik dvou usecek v rovine
44  * Intersection<0><1,2> a <2,1> ... prusecik hrany a trojuhelnika
45  * ... dalsi zvlastni pripady vcetne <0><3,3> .. tetrahedrony s vrcholem na povrchu druheho
46  *
47  * 2) liniove pruniky Intersection<1>:
48  * Intersection<1><1,1> .. usecky na spolecne primce
49  * Intersection<1><1,2> a <2,1>.. usecka v rovine trojuhelnika
50  * Intersection<1><1,3> a <3,1> .. usecka a tetrahedron
51  * Intersection<1><2,2> .. prusecik dvou trojuhelniku
52  * Intersection<1><2,3> a <3,2> .. trojuhelnik a hrana tetrahedronu
53  * ..
54  *
55  * ... doprcic je to fakt hodne moznosti a je otazka, zda je nutne je vsechny rozlisovat
56  *
57  * Algoritmus by mel probuhat takto:
58  *
59  * 1) Najdu vrchol V site 1 a element E site 2 aby V byl v E
60  * (to neni tak trivialni, pokud site nepokryvaji stejnou oblast ale snad by to slo hledat v
61  * pruniku obalovych boxu)
62  * 2) najdu pruseciky P_i hran z vrcholu V s povrchem E,
63  * konstruuju vsechny potrebne pruniky elementu majici vrchol V s elementem E
64  *
65  * Sousedni elementy spolu s hranami ktere do nich vedou ulozim do prioritni fronty.
66  *
67  * 3) Vyberu z prioritni fronty novy E, pricemz vyuzivam spositane pruseciky psislusne steny a okoli vrcholu V
68  * tj. jdu po hranach po kterych jsem do noveho lementu prisel a najdu vsechny hranove pruniky, pak konstuuju slozitejsi pruniky
69  * az mam vsechny pruniky s novym elementem ...
70  *
71  * ...
72  *
73  * Prioritni fronta by preferovala elementy do kterych jsem se nejvicekrat dostal, tim se snazim minimalizovat povrch projite oblasti.
74  * Je ale mozne, ze to algoritmus naopak zpomali, pokud je prioritni fronta log(n).
75  *
76  * Zpracovani jednoho elementu tedy zahrnuje
77  * 1) trasovani hran:
78  * pro hranu H: testuju hledam prusecik se ctyrstenem:
79  * ANO -> pamatuju si hranovy prunik a ke stene (resp. sousednimu elementu) kde hrana vychazi pridam vychozi hranu
80  * NE -> konci ve vrcholu, dalsi hrany vychazejici z vrcholu pridam na seznam hran vchazejicich do elementu
81  *
82  * 2) po nalezeni pruniku vsech hran, hledam pruniky vsech vchazejicich ploch:
83  * jedna plocha ma se vstupni stenou useckovy prunik na jehoz konci jsou:
84  * *vstupni hrana
85  * * okraj steny
86  * kazdopadne trasuju okraj plosneho pruniku pres povrch elementu, nebo po vstupnich hranach,
87  * pokud prunikova plocha obsahuje vrchol tvorim nove vstupni plochy ...
88  *
89  * 3) Podobne trasuju vchazejici objemy
90  *
91  * ?? lze nejak vyuzit pokud ma element vice vstupnich sten
92  * minimalne se da kontrolovat ...
93  *
94  *
95  * Struktura systemu pruniku do budoucna:
96  * 1) trida IntersectionManager, ma matici vektoru. Na poli A(i,j) je vektor lokalnich souradnic na elementu dimenze i
97  * pruniku dimenze j.
98  * 2) Jeden intersection objekt je pak iterator dvou elementu a dva indexy lokalnich souradnic v prislusnych vektorech
99  *
100  * Prozatim to zjednodusime tak, ze
101  *
102  *
103  * Nakonec potrebuju pocitat integral pres prunik z nejake funkce f(phi_a(x), phi_b(x)), kde phi_a je bazova funkce na jednom elementu a phi_b na druhem.
104  * To budu delat numerickou kvadraturou, takze potrebuji zobrazit prunik na jednotkovy simplex. Pro uzel kvardatury x_i musim najit body a_i a b_i na
105  * referencnich elementech A a B. Tj potrebuju lokalni souradnice (to jsou souradnice na referencnich elementech) kvadraturnich bodu. V nic pak umim spocitat hodnotu bazovych funkci
106  * a pak i hodnotu funkce f.
107  *
108  *
109  *
110  */
111 
112 
113 
114 /**
115  * Class only for VB neighbouring.
116  */
118 {
119 public:
120  Neighbour();
121 
122  void reinit(MeshBase *mesh, unsigned int elem_idx, unsigned int edge_idx);
123 
124  // side of the edge in higher dim. mesh
125  inline SideIter side() const;
126 
127  inline unsigned int edge_idx() const;
128 
129  // edge of higher dimensional mesh in VB neigh.
130  inline Edge edge() const;
131 
132  // element of lower dimension mesh in VB neigh.
133  inline ElementAccessor<3> element() const;
134 
135 private:
136  MeshBase * mesh_; ///< Pointer to Mesh to which belonged
137  unsigned int elem_idx_; ///< Index of element in Mesh::element_vec_
138  unsigned int edge_idx_; ///< Index of Edge in Mesh
139 
140  friend class MeshBase;
141  friend class Mesh;
142  friend class BCMesh;
143 };
144 
145 
146 // side of the edge in higher dim. mesh
147 inline SideIter Neighbour::side() const {
148  ASSERT_EQ( edge().n_sides(), 1 ).error("VB neighbouring must be with 1 side.\n");
149  //DebugOut().fmt("VB neighbouring with {} sides.\n", edge_->n_sides);
150  return edge().side(0);
151 }
152 
153 inline unsigned int Neighbour::edge_idx() const {
154  return edge_idx_;
155 }
156 
157 // edge of lower dimensional mesh in VB neigh.
158 inline Edge Neighbour::edge() const {
159  return mesh_->edge(edge_idx_);
160 }
161 
162 // element of higher dimension mesh in VB neigh.
165 }
166 
167 
168 #endif
169 //-----------------------------------------------------------------------------
170 // vim: set cindent:
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual) only for debug mode.
Definition: asserts.hh:333
Class represents boundary part of mesh.
Definition: bc_mesh.hh:37
SideIter side(const unsigned int i) const
Gets side iterator of the i -th side.
Base class for Mesh and BCMesh.
Definition: mesh.h:96
Edge edge(uint edge_idx) const
Return edge with given index.
Definition: mesh.cc:131
ElementAccessor< 3 > element_accessor(unsigned int idx) const
Create and return ElementAccessor to element of given idx.
Definition: mesh.cc:866
Definition: mesh.h:362
MeshBase * mesh_
Pointer to Mesh to which belonged.
Definition: neighbours.h:136
unsigned int elem_idx_
Index of element in Mesh::element_vec_.
Definition: neighbours.h:137
Edge edge() const
Definition: neighbours.h:158
ElementAccessor< 3 > element() const
Definition: neighbours.h:163
unsigned int edge_idx_
Index of Edge in Mesh.
Definition: neighbours.h:138
unsigned int edge_idx() const
Definition: neighbours.h:153
void reinit(MeshBase *mesh, unsigned int elem_idx, unsigned int edge_idx)
Definition: neighbours.cc:30
SideIter side() const
Definition: neighbours.h:147