Flow123d  jenkins-Flow123d-linux-release-multijob-282
neighbours.h
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2007 Technical University of Liberec. All rights reserved.
4  *
5  * Please make a following refer to Flow123d on your project site if you use the program for any purpose,
6  * especially for academic research:
7  * Flow123d, Research Centre: Advanced Remedial Technologies, Technical University of Liberec, Czech Republic
8  *
9  * This program is free software; you can redistribute it and/or modify it under the terms
10  * of the GNU General Public License version 3 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along with this program; if not,
17  * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
18  *
19  *
20  * $Id$
21  * $Revision$
22  * $LastChangedBy$
23  * $LastChangedDate$
24  *
25  * @file
26  * @brief ???
27  *
28  */
29 
30 #ifndef MAKE_NEIGHBOURS_H
31 #define MAKE_NEIGHBOURS_H
32 
33 #include "mesh/mesh_types.hh"
34 
35 
36 
37 class Element;
38 class Edge;
39 class SideIter;
40 /**
41  * Navrh algoritmu pro hledani pruniku elementu dvou siti (libovlnych dimenzi)
42  * algoritmus postupuje od bodu pruniku pres usecky a polygony k mnohostenum
43  *
44  * Vstup: Sit1 dimenze d1 a Sit2 dimenze d2
45  * predpoladam d1<=d2
46  *
47  * 1) hladam body na hranici pruniku tj.
48  * Intersection<d> <d_e1,d_e2> .. prunik ma dimenzi d a pronikaji se simplexy dimenze d_e1, a d_e2
49  *
50  * Intersection<0><0,0> .. totozne vrcholy El<0>
51  * Intersection<0><0,1> a <1,0> .. vrchol jedne site lezi na hrane druhe site
52  * Intersection<0><0,n> a <n,0> .. vrchol lezi na El<n> druhe site
53  *
54  * Intersection<0><1,1> .. bodovy prusecik dvou usecek v rovine
55  * Intersection<0><1,2> a <2,1> ... prusecik hrany a trojuhelnika
56  * ... dalsi zvlastni pripady vcetne <0><3,3> .. tetrahedrony s vrcholem na povrchu druheho
57  *
58  * 2) liniove pruniky Intersection<1>:
59  * Intersection<1><1,1> .. usecky na spolecne primce
60  * Intersection<1><1,2> a <2,1>.. usecka v rovine trojuhelnika
61  * Intersection<1><1,3> a <3,1> .. usecka a tetrahedron
62  * Intersection<1><2,2> .. prusecik dvou trojuhelniku
63  * Intersection<1><2,3> a <3,2> .. trojuhelnik a hrana tetrahedronu
64  * ..
65  *
66  * ... doprcic je to fakt hodne moznosti a je otazka, zda je nutne je vsechny rozlisovat
67  *
68  * Algoritmus by mel probuhat takto:
69  *
70  * 1) Najdu vrchol V site 1 a element E site 2 aby V byl v E
71  * (to neni tak trivialni, pokud site nepokryvaji stejnou oblast ale snad by to slo hledat v
72  * pruniku obalovych boxu)
73  * 2) najdu pruseciky P_i hran z vrcholu V s povrchem E,
74  * konstruuju vsechny potrebne pruniky elementu majici vrchol V s elementem E
75  *
76  * Sousedni elementy spolu s hranami ktere do nich vedou ulozim do prioritni fronty.
77  *
78  * 3) Vyberu z prioritni fronty novy E, pricemz vyuzivam spositane pruseciky psislusne steny a okoli vrcholu V
79  * tj. jdu po hranach po kterych jsem do noveho lementu prisel a najdu vsechny hranove pruniky, pak konstuuju slozitejsi pruniky
80  * az mam vsechny pruniky s novym elementem ...
81  *
82  * ...
83  *
84  * Prioritni fronta by preferovala elementy do kterych jsem se nejvicekrat dostal, tim se snazim minimalizovat povrch projite oblasti.
85  * Je ale mozne, ze to algoritmus naopak zpomali, pokud je prioritni fronta log(n).
86  *
87  * Zpracovani jednoho elementu tedy zahrnuje
88  * 1) trasovani hran:
89  * pro hranu H: testuju hledam prusecik se ctyrstenem:
90  * ANO -> pamatuju si hranovy prunik a ke stene (resp. sousednimu elementu) kde hrana vychazi pridam vychozi hranu
91  * NE -> konci ve vrcholu, dalsi hrany vychazejici z vrcholu pridam na seznam hran vchazejicich do elementu
92  *
93  * 2) po nalezeni pruniku vsech hran, hledam pruniky vsech vchazejicich ploch:
94  * jedna plocha ma se vstupni stenou useckovy prunik na jehoz konci jsou:
95  * *vstupni hrana
96  * * okraj steny
97  * kazdopadne trasuju okraj plosneho pruniku pres povrch elementu, nebo po vstupnich hranach,
98  * pokud prunikova plocha obsahuje vrchol tvorim nove vstupni plochy ...
99  *
100  * 3) Podobne trasuju vchazejici objemy
101  *
102  * ?? lze nejak vyuzit pokud ma element vice vstupnich sten
103  * minimalne se da kontrolovat ...
104  *
105  *
106  * Struktura systemu pruniku do budoucna:
107  * 1) trida IntersectionManager, ma matici vektoru. Na poli A(i,j) je vektor lokalnich souradnic na elementu dimenze i
108  * pruniku dimenze j.
109  * 2) Jeden intersection objekt je pak iterator dvou elementu a dva indexy lokalnich souradnic v prislusnych vektorech
110  *
111  * Prozatim to zjednodusime tak, ze
112  *
113  *
114  * 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.
115  * 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
116  * 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
117  * a pak i hodnotu funkce f.
118  *
119  *
120  *
121  */
122 
123 
124 
125 /**
126  * Class only for VB neighbouring.
127  */
129 {
130 public:
131  Neighbour();
132 
133  void reinit(ElementIter ele, unsigned int edg_idx);
134 
135  // side of the edge in higher dim. mesh
136  inline SideIter side();
137 
138  inline unsigned int edge_idx();
139 
140  // edge of higher dimensional mesh in VB neigh.
141  inline Edge *edge();
142 
143  // element of lower dimension mesh in VB neigh.
144  inline ElementIter element();
145 
146 //private:
147  unsigned int edge_idx_; // edge
148  ElementIter element_; // neighbouring elements
149  // for VB - element[0] is element of lower dimension
150 };
151 
152 
153 
154 #endif
155 //-----------------------------------------------------------------------------
156 // vim: set cindent:
Edge * edge()
Definition: edges.h:38
unsigned int edge_idx_
Definition: neighbours.h:147
unsigned int edge_idx()
SideIter side()
ElementIter element()
void reinit(ElementIter ele, unsigned int edg_idx)
Definition: neighbours.cc:48
ElementIter element_
Definition: neighbours.h:148