Flow123d  release_2.2.0-33-g759111d
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/mesh_types.hh"
22 
23 
24 
25 class Element;
26 class Edge;
27 class SideIter;
28 /**
29  * Navrh algoritmu pro hledani pruniku elementu dvou siti (libovlnych dimenzi)
30  * algoritmus postupuje od bodu pruniku pres usecky a polygony k mnohostenum
31  *
32  * Vstup: Sit1 dimenze d1 a Sit2 dimenze d2
33  * predpoladam d1<=d2
34  *
35  * 1) hladam body na hranici pruniku tj.
36  * Intersection<d> <d_e1,d_e2> .. prunik ma dimenzi d a pronikaji se simplexy dimenze d_e1, a d_e2
37  *
38  * Intersection<0><0,0> .. totozne vrcholy El<0>
39  * Intersection<0><0,1> a <1,0> .. vrchol jedne site lezi na hrane druhe site
40  * Intersection<0><0,n> a <n,0> .. vrchol lezi na El<n> druhe site
41  *
42  * Intersection<0><1,1> .. bodovy prusecik dvou usecek v rovine
43  * Intersection<0><1,2> a <2,1> ... prusecik hrany a trojuhelnika
44  * ... dalsi zvlastni pripady vcetne <0><3,3> .. tetrahedrony s vrcholem na povrchu druheho
45  *
46  * 2) liniove pruniky Intersection<1>:
47  * Intersection<1><1,1> .. usecky na spolecne primce
48  * Intersection<1><1,2> a <2,1>.. usecka v rovine trojuhelnika
49  * Intersection<1><1,3> a <3,1> .. usecka a tetrahedron
50  * Intersection<1><2,2> .. prusecik dvou trojuhelniku
51  * Intersection<1><2,3> a <3,2> .. trojuhelnik a hrana tetrahedronu
52  * ..
53  *
54  * ... doprcic je to fakt hodne moznosti a je otazka, zda je nutne je vsechny rozlisovat
55  *
56  * Algoritmus by mel probuhat takto:
57  *
58  * 1) Najdu vrchol V site 1 a element E site 2 aby V byl v E
59  * (to neni tak trivialni, pokud site nepokryvaji stejnou oblast ale snad by to slo hledat v
60  * pruniku obalovych boxu)
61  * 2) najdu pruseciky P_i hran z vrcholu V s povrchem E,
62  * konstruuju vsechny potrebne pruniky elementu majici vrchol V s elementem E
63  *
64  * Sousedni elementy spolu s hranami ktere do nich vedou ulozim do prioritni fronty.
65  *
66  * 3) Vyberu z prioritni fronty novy E, pricemz vyuzivam spositane pruseciky psislusne steny a okoli vrcholu V
67  * tj. jdu po hranach po kterych jsem do noveho lementu prisel a najdu vsechny hranove pruniky, pak konstuuju slozitejsi pruniky
68  * az mam vsechny pruniky s novym elementem ...
69  *
70  * ...
71  *
72  * Prioritni fronta by preferovala elementy do kterych jsem se nejvicekrat dostal, tim se snazim minimalizovat povrch projite oblasti.
73  * Je ale mozne, ze to algoritmus naopak zpomali, pokud je prioritni fronta log(n).
74  *
75  * Zpracovani jednoho elementu tedy zahrnuje
76  * 1) trasovani hran:
77  * pro hranu H: testuju hledam prusecik se ctyrstenem:
78  * ANO -> pamatuju si hranovy prunik a ke stene (resp. sousednimu elementu) kde hrana vychazi pridam vychozi hranu
79  * NE -> konci ve vrcholu, dalsi hrany vychazejici z vrcholu pridam na seznam hran vchazejicich do elementu
80  *
81  * 2) po nalezeni pruniku vsech hran, hledam pruniky vsech vchazejicich ploch:
82  * jedna plocha ma se vstupni stenou useckovy prunik na jehoz konci jsou:
83  * *vstupni hrana
84  * * okraj steny
85  * kazdopadne trasuju okraj plosneho pruniku pres povrch elementu, nebo po vstupnich hranach,
86  * pokud prunikova plocha obsahuje vrchol tvorim nove vstupni plochy ...
87  *
88  * 3) Podobne trasuju vchazejici objemy
89  *
90  * ?? lze nejak vyuzit pokud ma element vice vstupnich sten
91  * minimalne se da kontrolovat ...
92  *
93  *
94  * Struktura systemu pruniku do budoucna:
95  * 1) trida IntersectionManager, ma matici vektoru. Na poli A(i,j) je vektor lokalnich souradnic na elementu dimenze i
96  * pruniku dimenze j.
97  * 2) Jeden intersection objekt je pak iterator dvou elementu a dva indexy lokalnich souradnic v prislusnych vektorech
98  *
99  * Prozatim to zjednodusime tak, ze
100  *
101  *
102  * 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.
103  * 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
104  * 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
105  * a pak i hodnotu funkce f.
106  *
107  *
108  *
109  */
110 
111 
112 
113 /**
114  * Class only for VB neighbouring.
115  */
117 {
118 public:
119  Neighbour();
120 
121  void reinit(ElementIter ele, unsigned int edg_idx);
122 
123  // side of the edge in higher dim. mesh
124  inline SideIter side();
125 
126  inline unsigned int edge_idx();
127 
128  // edge of higher dimensional mesh in VB neigh.
129  inline Edge *edge();
130 
131  // element of lower dimension mesh in VB neigh.
132  inline ElementIter element();
133 
134 //private:
135  unsigned int edge_idx_; // edge
136  ElementIter element_; // neighbouring elements
137  // for VB - element[0] is element of lower dimension
138 };
139 
140 
141 
142 #endif
143 //-----------------------------------------------------------------------------
144 // vim: set cindent:
Edge * edge()
Definition: edges.h:26
unsigned int edge_idx_
Definition: neighbours.h:135
unsigned int edge_idx()
SideIter side()
ElementIter element()
void reinit(ElementIter ele, unsigned int edg_idx)
Definition: neighbours.cc:35
ElementIter element_
Definition: neighbours.h:136